 c5a10665b8
			
		
	
	
	
	
	c5a10665b8Spigot still maintains some partial implementation of "tick skipping", a practice in which the MinecraftServer.currentTick field is updated not by an increment of one per actual tick, but instead set to System.currentTimeMillis() / 50. This behaviour means that the tracked tick may "skip" a tick value in case a previous tick took more than the expected 50ms. To compensate for this in important paths, spigot/craftbukkit implements "wall-time". Instead of incrementing/decrementing ticks on block entities/entities by one for each call to their tick() method, they instead increment/decrement important values, like an ItemEntity's age or pickupDelay, by the difference of `currentTick - lastTick`, where `lastTick` is the value of `currentTick` during the last tick() call. These "fixes" however do not play nicely with minecraft's simulation distance as entities/block entities implementing the above behaviour would "catch up" their values when moving from a non-ticking chunk to a ticking one as their `lastTick` value remains stuck on the last tick in a ticking chunk and hence lead to a large "catch up" once ticked again. Paper completely removes the "tick skipping" behaviour (See patch "Further-improve-server-tick-loop"), making the above precautions completely unnecessary, which also rids paper of the previous described incompatibility with non-ticking chunks.
		
			
				
	
	
		
			65 lines
		
	
	
	
		
			3.4 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
	
		
			3.4 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | |
| From: HexedHero <6012891+HexedHero@users.noreply.github.com>
 | |
| Date: Thu, 6 May 2021 14:56:43 +0100
 | |
| Subject: [PATCH] Add more WanderingTrader API
 | |
| 
 | |
| 
 | |
| diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
 | |
| index e51cb9c96e1bd13c00bf938436f4fc26d80055a1..856a93324f5ac411713851ccfb38dba52fb0af5e 100644
 | |
| --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
 | |
| +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
 | |
| @@ -61,6 +61,10 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
 | |
|      @Nullable
 | |
|      private BlockPos wanderTarget;
 | |
|      private int despawnDelay;
 | |
| +    // Paper start - Add more WanderingTrader API
 | |
| +    public boolean canDrinkPotion = true;
 | |
| +    public boolean canDrinkMilk = true;
 | |
| +    // Paper end - Add more WanderingTrader API
 | |
|  
 | |
|      public WanderingTrader(EntityType<? extends WanderingTrader> type, Level world) {
 | |
|          super(type, world);
 | |
| @@ -71,10 +75,10 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
 | |
|      protected void registerGoals() {
 | |
|          this.goalSelector.addGoal(0, new FloatGoal(this));
 | |
|          this.goalSelector.addGoal(0, new UseItemGoal<>(this, PotionContents.createItemStack(Items.POTION, Potions.INVISIBILITY), SoundEvents.WANDERING_TRADER_DISAPPEARED, (entityvillagertrader) -> {
 | |
| -            return this.level().isNight() && !entityvillagertrader.isInvisible();
 | |
| +            return this.canDrinkPotion && this.level().isNight() && !entityvillagertrader.isInvisible(); // Paper - Add more WanderingTrader API
 | |
|          }));
 | |
|          this.goalSelector.addGoal(0, new UseItemGoal<>(this, new ItemStack(Items.MILK_BUCKET), SoundEvents.WANDERING_TRADER_REAPPEARED, (entityvillagertrader) -> {
 | |
| -            return this.level().isDay() && entityvillagertrader.isInvisible();
 | |
| +            return this.canDrinkMilk && this.level().isDay() && entityvillagertrader.isInvisible(); // Paper - Add more WanderingTrader API
 | |
|          }));
 | |
|          this.goalSelector.addGoal(1, new TradeWithPlayerGoal(this));
 | |
|          this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Zombie.class, 8.0F, 0.5D, 0.5D));
 | |
| diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java
 | |
| index 08194a78c2170e971ee8ff440b276ed3590e8c4a..0e597394a3dd08f022614fc9777302fea581eb55 100644
 | |
| --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java
 | |
| +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java
 | |
| @@ -28,4 +28,26 @@ public class CraftWanderingTrader extends CraftAbstractVillager implements Wande
 | |
|      public void setDespawnDelay(int despawnDelay) {
 | |
|          this.getHandle().setDespawnDelay(despawnDelay);
 | |
|      }
 | |
| +
 | |
| +    // Paper start - Add more WanderingTrader API
 | |
| +    @Override
 | |
| +    public void setCanDrinkPotion(boolean bool) {
 | |
| +        getHandle().canDrinkPotion = bool;
 | |
| +    }
 | |
| +
 | |
| +    @Override
 | |
| +    public boolean canDrinkPotion() {
 | |
| +        return getHandle().canDrinkPotion;
 | |
| +    }
 | |
| +
 | |
| +    @Override
 | |
| +    public void setCanDrinkMilk(boolean bool) {
 | |
| +        getHandle().canDrinkMilk = bool;
 | |
| +    }
 | |
| +
 | |
| +    @Override
 | |
| +    public boolean canDrinkMilk() {
 | |
| +        return getHandle().canDrinkMilk;
 | |
| +    }
 | |
| +    // Paper end
 | |
|  }
 |