From e50d09b67b83ea6ca1451d329dd9694cf155c64d Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Thu, 28 Mar 2024 18:33:46 -0700 Subject: [PATCH] Use redstone time in a few appropriate areas 1. Moving piston last tick 2. Living entity last damage stamp 3. Entity piston deltas This should resolve primarily timing problems using pistons. --- patches/server/0003-Threaded-Regions.patch | 162 +++++++++++++++--- ...-getHandle-and-overrides-perform-thr.patch | 10 +- ...access-when-waking-players-up-during.patch | 4 +- 3 files changed, 142 insertions(+), 34 deletions(-) diff --git a/patches/server/0003-Threaded-Regions.patch b/patches/server/0003-Threaded-Regions.patch index c02b159..f41000d 100644 --- a/patches/server/0003-Threaded-Regions.patch +++ b/patches/server/0003-Threaded-Regions.patch @@ -16402,7 +16402,7 @@ index ea27b46eec01bda427653335f922ccd068cffcb5..e551d3b875eab6851b75041f418c9a08 return blockToFallLocation(blockState); } else { diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f2191176347e25 100644 +index b2eff51f1ad1e702525ef298807ea7d2083f6218..79e9039d77a993d8f1e02942f87fac2a0bd9e8a8 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -170,7 +170,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S @@ -16423,6 +16423,15 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 public @org.jetbrains.annotations.Nullable net.minecraft.server.level.ChunkMap.TrackedEntity tracker; // Paper public CraftEntity getBukkitEntity() { +@@ -378,7 +378,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S + private boolean hasGlowingTag; + private final Set tags; + private final double[] pistonDeltas; +- private long pistonDeltasGameTime; ++ private long pistonDeltasGameTime = Long.MIN_VALUE; // Folia - region threading + private EntityDimensions dimensions; + private float eyeHeight; + public boolean isInPowderSnow; @@ -479,28 +479,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.isLegacyTrackingEntity = isLegacyTrackingEntity; } @@ -16453,7 +16462,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 // Paper end - optimise entity tracking public float getBukkitYaw() { return this.yRot; -@@ -567,6 +546,16 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -567,6 +546,19 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public boolean updatingSectionStatus = false; // Paper end @@ -16465,12 +16474,15 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 + if (this.activatedImmunityTick != Integer.MIN_VALUE) { + this.activatedImmunityTick += fromTickOffset; + } ++ if (this.pistonDeltasGameTime != Long.MIN_VALUE) { ++ this.pistonDeltasGameTime += fromRedstoneTimeOffset; ++ } + } + // Folia end - region ticking public Entity(EntityType type, Level world) { this.id = Entity.ENTITY_COUNTER.incrementAndGet(); -@@ -825,6 +814,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -825,6 +817,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S // CraftBukkit start public void postTick() { @@ -16483,7 +16495,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 // No clean way to break out of ticking once the entity has been copied to a new world, so instead we move the portalling later in the tick cycle if (!(this instanceof ServerPlayer) && this.isAlive()) { // Paper - don't attempt to teleport dead entities this.handleNetherPortal(); -@@ -847,7 +842,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -847,7 +845,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.walkDistO = this.walkDist; this.xRotO = this.getXRot(); this.yRotO = this.getYRot(); @@ -16492,7 +16504,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 if (this.canSpawnSprintParticle()) { this.spawnSprintParticle(); } -@@ -1105,8 +1100,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1105,8 +1103,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } else { this.wasOnFire = this.isOnFire(); if (movementType == MoverType.PISTON) { @@ -16503,7 +16515,16 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 movement = this.limitPistonMovement(movement); if (movement.equals(Vec3.ZERO)) { return; -@@ -3018,7 +3013,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1433,7 +1431,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S + if (movement.lengthSqr() <= 1.0E-7D) { + return movement; + } else { +- long i = this.level().getGameTime(); ++ long i = this.level().getRedstoneGameTime(); // Folia - region threading + + if (i != this.pistonDeltasGameTime) { + Arrays.fill(this.pistonDeltas, 0.0D); +@@ -3018,7 +3016,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.passengers = ImmutableList.copyOf(list); } @@ -16512,7 +16533,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 } } -@@ -3066,7 +3061,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3066,7 +3064,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } entity.boardingCooldown = 60; @@ -16521,7 +16542,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 } return true; // CraftBukkit } -@@ -3346,6 +3341,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3346,6 +3344,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S @Nullable public PlayerTeam getTeam() { @@ -16533,7 +16554,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 if (!this.level().paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof Player)) { return null; } // Paper - Perf: Disable Scoreboards for non players by default return this.level().getScoreboard().getPlayersTeam(this.getScoreboardName()); } -@@ -3635,6 +3635,775 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3635,6 +3638,775 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.portalEntrancePos = original.portalEntrancePos; } @@ -17309,7 +17330,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 @Nullable public Entity changeDimension(ServerLevel destination) { // CraftBukkit start -@@ -3643,6 +4412,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3643,6 +4415,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S @Nullable public Entity teleportTo(ServerLevel worldserver, Vec3 location) { @@ -17321,7 +17342,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 // CraftBukkit end // Paper start - Fix item duplication and teleport issues if (!this.isAlive() || !this.valid) { -@@ -3735,6 +4509,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3735,6 +4512,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } } @@ -17334,7 +17355,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 protected void removeAfterChangingDimensions() { this.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION, null); // CraftBukkit - add Bukkit remove cause } -@@ -4669,7 +5449,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4669,7 +5452,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } } // Paper end - Fix MC-4 @@ -17344,7 +17365,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 synchronized (this.posLock) { // Paper this.position = new Vec3(x, y, z); } // Paper -@@ -4690,7 +5471,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4690,7 +5474,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S // Paper start - Block invalid positions and bounding box; don't allow desync of pos and AABB // hanging has its own special logic @@ -17353,7 +17374,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 this.setBoundingBox(this.makeBoundingBox()); } // Paper end - Block invalid positions and bounding box -@@ -4777,6 +5558,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4777,6 +5561,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return this.removalReason != null; } @@ -17366,7 +17387,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 @Nullable public Entity.RemovalReason getRemovalReason() { return this.removalReason; -@@ -4800,6 +5587,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4800,6 +5590,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S CraftEventFactory.callEntityRemoveEvent(this, cause); // CraftBukkit end final boolean alreadyRemoved = this.removalReason != null; // Paper - Folia schedulers @@ -17376,7 +17397,7 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 if (this.removalReason == null) { this.removalReason = entity_removalreason; } -@@ -4822,6 +5612,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4822,6 +5615,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.removalReason = null; } @@ -17388,15 +17409,32 @@ index b2eff51f1ad1e702525ef298807ea7d2083f6218..39434804e84418e44d595012e8f21911 /** * Invoked only when the entity is truly removed from the server, never to be added to any world. diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..206e662c8a43604d5a7563868348d501c135017c 100644 +index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..a8b47867f05af2a1a4409be5ff49ad0d95bebcae 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -276,6 +276,13 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -246,7 +246,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + private Optional lastClimbablePos; + @Nullable + private DamageSource lastDamageSource; +- private long lastDamageStamp; ++ private long lastDamageStamp = Long.MIN_VALUE; // Folia - region threading + protected int autoSpinAttackTicks; + private float swimAmount; + private float swimAmountO; +@@ -276,6 +276,21 @@ public abstract class LivingEntity extends Entity implements Attackable { ++this.noActionTime; // Above all the floats } // Spigot end + // Folia start - region threading + @Override ++ public void updateTicks(long fromTickOffset, long fromRedstoneTimeOffset) { ++ super.updateTicks(fromTickOffset, fromRedstoneTimeOffset); ++ if (this.lastDamageStamp != Long.MIN_VALUE) { ++ this.lastDamageStamp += fromRedstoneTimeOffset; ++ } ++ } ++ ++ @Override + protected void resetStoredPositions() { + super.resetStoredPositions(); + this.lastClimbablePos = Optional.empty(); @@ -17405,7 +17443,7 @@ index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..206e662c8a43604d5a7563868348d501 protected LivingEntity(EntityType type, Level world) { super(type, world); -@@ -481,7 +488,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -481,7 +496,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (this.isDeadOrDying() && this.level().shouldTickDeath(this)) { this.tickDeath(); @@ -17414,7 +17452,7 @@ index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..206e662c8a43604d5a7563868348d501 if (this.lastHurtByPlayerTime > 0) { --this.lastHurtByPlayerTime; -@@ -627,11 +634,14 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -627,11 +642,14 @@ public abstract class LivingEntity extends Entity implements Attackable { return true; } @@ -17431,7 +17469,7 @@ index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..206e662c8a43604d5a7563868348d501 } } -@@ -860,9 +870,9 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -860,9 +878,9 @@ public abstract class LivingEntity extends Entity implements Attackable { } this.hurtTime = nbt.getShort("HurtTime"); @@ -17443,7 +17481,7 @@ index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..206e662c8a43604d5a7563868348d501 String s = nbt.getString("Team"); PlayerTeam scoreboardteam = this.level().getScoreboard().getPlayerTeam(s); if (!this.level().paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof net.minecraft.world.entity.player.Player)) { scoreboardteam = null; } // Paper - Perf: Disable Scoreboards for non players by default -@@ -1149,6 +1159,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1149,6 +1167,7 @@ public abstract class LivingEntity extends Entity implements Attackable { public boolean addEffect(MobEffectInstance mobeffect, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause, boolean fireEvent) { // Paper end - Don't fire sync event during generation // org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot // Paper - move to API @@ -17451,7 +17489,25 @@ index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..206e662c8a43604d5a7563868348d501 if (this.isTickingEffects) { this.effectsToProcess.add(new ProcessableEffect(mobeffect, cause)); return true; -@@ -2359,7 +2370,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1573,7 +1592,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + + if (flag2) { + this.lastDamageSource = source; +- this.lastDamageStamp = this.level().getGameTime(); ++ this.lastDamageStamp = this.level().getRedstoneGameTime(); // Folia - region threading + } + + if (this instanceof ServerPlayer) { +@@ -1656,7 +1675,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + + @Nullable + public DamageSource getLastDamageSource() { +- if (this.level().getGameTime() - this.lastDamageStamp > 40L) { ++ if (this.level().getRedstoneGameTime() - this.lastDamageStamp > 40L || this.lastDamageStamp == Long.MIN_VALUE) { // Folia - region threading + this.lastDamageSource = null; + } + +@@ -2359,7 +2378,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @Nullable public LivingEntity getKillCredit() { @@ -17460,7 +17516,16 @@ index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..206e662c8a43604d5a7563868348d501 } public final float getMaxHealth() { -@@ -3502,7 +3513,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2437,7 +2456,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + + this.hurt(this.damageSources().generic(), 0.0F); + this.lastDamageSource = damageSource; +- this.lastDamageStamp = this.level().getGameTime(); ++ this.lastDamageStamp = this.level().getRedstoneGameTime(); // Folia - region threading + } + + @Override +@@ -3502,7 +3521,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.pushEntities(); this.level().getProfiler().pop(); // Paper start - Add EntityMoveEvent @@ -17469,7 +17534,7 @@ index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..206e662c8a43604d5a7563868348d501 if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); Location to = new Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); -@@ -4195,7 +4206,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -4195,7 +4214,7 @@ public abstract class LivingEntity extends Entity implements Attackable { BlockPos blockposition = BlockPos.containing(d0, d1, d2); Level world = this.level(); @@ -20869,11 +20934,45 @@ index 8cb822fed0cda4268f288feae1079a3dc4dc103e..3f53d51960ded5df3b8be12362110f22 } // CraftBukkit end +diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java b/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java +index be74adc86f0ca467f3b59e7b57fd47a8f381d86e..363a712d6b9e717b075aa52643c6cf91497e7c3b 100644 +--- a/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java +@@ -152,7 +152,7 @@ public class PistonBaseBlock extends DirectionalBlock { + if (tileentity instanceof PistonMovingBlockEntity) { + PistonMovingBlockEntity tileentitypiston = (PistonMovingBlockEntity) tileentity; + +- if (tileentitypiston.isExtending() && (tileentitypiston.getProgress(0.0F) < 0.5F || world.getGameTime() == tileentitypiston.getLastTicked() || ((ServerLevel) world).isHandlingTick())) { ++ if (tileentitypiston.isExtending() && (tileentitypiston.getProgress(0.0F) < 0.5F || world.getRedstoneGameTime() == tileentitypiston.getLastTicked() || ((ServerLevel) world).isHandlingTick())) { // Folia - region threading + b0 = 2; + } + } diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java b/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -index c71690dbc3dc52803945f1608f0ee3ba94146354..1c23597f172f46eec714b510acfedb415bb01bff 100644 +index c71690dbc3dc52803945f1608f0ee3ba94146354..1955b660907c5d6b5ca4bf7741f8d568b9255347 100644 --- a/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -@@ -144,8 +144,8 @@ public class PistonMovingBlockEntity extends BlockEntity { +@@ -41,9 +41,19 @@ public class PistonMovingBlockEntity extends BlockEntity { + }); + private float progress; + private float progressO; +- private long lastTicked; ++ private long lastTicked = Long.MIN_VALUE; // Folia - region threading + private int deathTicks; + ++ // Folia start - region threading ++ @Override ++ public void updateTicks(long fromTickOffset, long fromRedstoneTimeOffset) { ++ super.updateTicks(fromTickOffset, fromRedstoneTimeOffset); ++ if (this.lastTicked != Long.MIN_VALUE) { ++ this.lastTicked += fromRedstoneTimeOffset; ++ } ++ } ++ // Folia end - region threading ++ + public PistonMovingBlockEntity(BlockPos pos, BlockState state) { + super(BlockEntityType.PISTON, pos, state); + } +@@ -144,8 +154,8 @@ public class PistonMovingBlockEntity extends BlockEntity { entity.setDeltaMovement(e, g, h); // Paper - EAR items stuck in in slime pushed by a piston @@ -20884,6 +20983,15 @@ index c71690dbc3dc52803945f1608f0ee3ba94146354..1c23597f172f46eec714b510acfedb41 // Paper end break; } +@@ -277,7 +287,7 @@ public class PistonMovingBlockEntity extends BlockEntity { + } + + public static void tick(Level world, BlockPos pos, BlockState state, PistonMovingBlockEntity blockEntity) { +- blockEntity.lastTicked = world.getGameTime(); ++ blockEntity.lastTicked = world.getRedstoneGameTime(); // Folia - region threading + blockEntity.progressO = blockEntity.progress; + if (blockEntity.progressO >= 1.0F) { + if (world.isClientSide && blockEntity.deathTicks < 5) { diff --git a/src/main/java/net/minecraft/world/level/border/WorldBorder.java b/src/main/java/net/minecraft/world/level/border/WorldBorder.java index 350aabd20329f429248c84d73ab8b5eb145943a7..bdb864f5e7a1bacde88be632442c9de000ce7729 100644 --- a/src/main/java/net/minecraft/world/level/border/WorldBorder.java diff --git a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch index 5cefec7..b0e19f6 100644 --- a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch +++ b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch @@ -29,10 +29,10 @@ index 41bf71d116ffc5431586ce54abba7f8def6c1dcf..519da6886613b8460e989767b1a21e31 } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 39434804e84418e44d595012e8f2191176347e25..edb4ffe78e28755e061c46c6834bbc9b7a23ff16 100644 +index 79e9039d77a993d8f1e02942f87fac2a0bd9e8a8..1d77bc6bdb87de1ad6c8740376391dedcaa73089 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2927,6 +2927,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2930,6 +2930,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S if (!force && (!this.canRide(entity) || !entity.canAddPassenger(this))) { return false; } else { @@ -40,7 +40,7 @@ index 39434804e84418e44d595012e8f2191176347e25..edb4ffe78e28755e061c46c6834bbc9b // CraftBukkit start if (entity.getBukkitEntity() instanceof Vehicle && this.getBukkitEntity() instanceof LivingEntity) { VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.getBukkitEntity()); -@@ -2948,6 +2949,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2951,6 +2952,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } // CraftBukkit end @@ -48,7 +48,7 @@ index 39434804e84418e44d595012e8f2191176347e25..edb4ffe78e28755e061c46c6834bbc9b if (this.isPassenger()) { this.stopRiding(); } -@@ -3025,6 +3027,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3028,6 +3030,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)"); } else { // CraftBukkit start @@ -56,7 +56,7 @@ index 39434804e84418e44d595012e8f2191176347e25..edb4ffe78e28755e061c46c6834bbc9b CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle(); Entity orig = craft == null ? null : craft.getHandle(); if (this.getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) { -@@ -3052,6 +3055,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3055,6 +3058,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } // CraftBukkit end diff --git a/patches/server/0013-Skip-worldstate-access-when-waking-players-up-during.patch b/patches/server/0013-Skip-worldstate-access-when-waking-players-up-during.patch index 8ef9266..299d521 100644 --- a/patches/server/0013-Skip-worldstate-access-when-waking-players-up-during.patch +++ b/patches/server/0013-Skip-worldstate-access-when-waking-players-up-during.patch @@ -22,10 +22,10 @@ index add6fc106d3c38d97b48ec0df3ac2515c8c0486e..cbc89b8898f9243776af88c2b04ad3c2 // CraftBukkit start diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 206e662c8a43604d5a7563868348d501c135017c..cced2d25936eed5360716c8c25e4ca87f9150017 100644 +index a8b47867f05af2a1a4409be5ff49ad0d95bebcae..fdb5ef574c14fafa1af50f4f656763119695f00e 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -4382,6 +4382,11 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -4390,6 +4390,11 @@ public abstract class LivingEntity extends Entity implements Attackable { } });