From 5df3ceb9a161f58063c97ae499c050fe72f398cf Mon Sep 17 00:00:00 2001 From: Samsuik Date: Sun, 12 Oct 2025 18:21:26 +0100 Subject: [PATCH] Add pre 1.21.10 stuckSpeed behaviour to mechanic version --- .../0017-Configure-cannon-physics.patch | 75 +++++++++++++++++-- ...ck-inside-blocks-and-traverse-blocks.patch | 22 +++--- .../sakura/mechanics/EntityBehaviour.java | 10 +++ 3 files changed, 91 insertions(+), 16 deletions(-) diff --git a/sakura-server/minecraft-patches/features/0017-Configure-cannon-physics.patch b/sakura-server/minecraft-patches/features/0017-Configure-cannon-physics.patch index 48d12c4..2eb6f68 100644 --- a/sakura-server/minecraft-patches/features/0017-Configure-cannon-physics.patch +++ b/sakura-server/minecraft-patches/features/0017-Configure-cannon-physics.patch @@ -83,7 +83,7 @@ index 703a75c7c6cd05a95afb630973250898dbc7223d..1531f0c275814e1346fef34dc06ea976 // CraftBukkit end serverLevel.addFreshEntity(primedTnt); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 128f62186d18186b7ba3a0c40a2723b8a933e8fb..c9f5accf384bae21b0a177526e77429f9795d975 100644 +index 128f62186d18186b7ba3a0c40a2723b8a933e8fb..c7f1cbd6aa044a434b193e7e0b1f34bf11b6c4e6 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -588,6 +588,13 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name @@ -121,6 +121,15 @@ index 128f62186d18186b7ba3a0c40a2723b8a933e8fb..c9f5accf384bae21b0a177526e77429f // Paper start - EAR 2 this.activatedTick = Math.max(this.activatedTick, net.minecraft.server.MinecraftServer.currentTick + 20); this.activatedImmunityTick = Math.max(this.activatedImmunityTick, net.minecraft.server.MinecraftServer.currentTick + 20); +@@ -1184,7 +1194,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name + ProfilerFiller profilerFiller = Profiler.get(); + profilerFiller.push("move"); + if (this.stuckSpeedMultiplier.lengthSqr() > 1.0E-7) { +- if (type != MoverType.PISTON) { ++ if (type != MoverType.PISTON || mechanicsTarget.before(me.samsuik.sakura.mechanics.MechanicVersion.v1_21_10)) { // Sakura - configure server mechanics + movement = movement.multiply(this.stuckSpeedMultiplier); + } + @@ -1202,10 +1212,17 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name movement = this.maybeBackOffFromEdge(movement, type); Vec3 vec3 = this.collide(movement); @@ -174,6 +183,15 @@ index 128f62186d18186b7ba3a0c40a2723b8a933e8fb..c9f5accf384bae21b0a177526e77429f this.setDeltaMovement(flag ? 0.0 : deltaMovement.x, deltaMovement.y, flag1 ? 0.0 : deltaMovement.z); } +@@ -1336,7 +1364,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name + this.finalMovementsThisTick.clear(); + this.finalMovementsThisTick.addAll(this.movementThisTick); + this.movementThisTick.clear(); +- if (this.finalMovementsThisTick.isEmpty()) { ++ if (this.finalMovementsThisTick.isEmpty() || this.mechanicsTarget.before(me.samsuik.sakura.mechanics.MechanicVersion.v1_21_5)) { + this.finalMovementsThisTick.add(new Entity.Movement(this.oldPosition(), this.position())); + } else if (this.finalMovementsThisTick.getLast().to.distanceToSqr(this.position()) > 9.9999994E-11F) { + this.finalMovementsThisTick.add(new Entity.Movement(this.finalMovementsThisTick.getLast().to, this.position())); @@ -1588,7 +1616,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name } @@ -275,6 +293,23 @@ index 128f62186d18186b7ba3a0c40a2723b8a933e8fb..c9f5accf384bae21b0a177526e77429f (pos, index) -> { if (!this.isAlive()) { return false; +@@ -1897,7 +1950,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name + boolean flag2 = entityInsideCollisionShape == Shapes.block() + || this.collidedWithShapeMovingFrom(from, to, entityInsideCollisionShape.move(new Vec3(pos)).toAabbs()); + boolean flag3 = this.collidedWithFluid(blockState.getFluidState(), pos, from, to); +- if ((flag2 || flag3) && visited.add(pos.asLong())) { ++ if (me.samsuik.sakura.mechanics.EntityBehaviour.canCheckInsideBlock(pos, flag2 || flag3, visited, mechanicsTarget)) { // Sakura - configure server mechanics + if (flag2) { + try { + boolean flag4 = flag || aabb.intersects(pos); +@@ -1953,6 +2006,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name + } + + public boolean collidedWithShapeMovingFrom(Vec3 from, Vec3 to, List boxes) { ++ // Sakura - configure server mechanics; this was changed in 1.21.4 + AABB aabb = this.makeBoundingBox(from); + Vec3 vec3 = to.subtract(from); + return aabb.collidedAlongVector(vec3, boxes); diff --git a/net/minecraft/world/entity/item/FallingBlockEntity.java b/net/minecraft/world/entity/item/FallingBlockEntity.java index 0344ba2a6d063a4ee5d6f9a8985ae8ca8c5816ce..02dc6c5965354047fc05ad3d3293c7f6277f50cd 100644 --- a/net/minecraft/world/entity/item/FallingBlockEntity.java @@ -509,7 +544,7 @@ index 05003798585d98406cd1affb89403b9f955bacdc..cb2241e99f4b3bee099ff1eea566beb9 // Paper end - Option to prevent TNT from moving in water } diff --git a/net/minecraft/world/level/BlockGetter.java b/net/minecraft/world/level/BlockGetter.java -index 41c036324499d4e408030d1e19f78468b6b3d8a6..ba2e7efe147b26bea5d73eac1f4b2fe6ee4bd5c2 100644 +index 41c036324499d4e408030d1e19f78468b6b3d8a6..3c2f5d40bccaf6582a41079d1c47eb228c72a6ff 100644 --- a/net/minecraft/world/level/BlockGetter.java +++ b/net/minecraft/world/level/BlockGetter.java @@ -8,6 +8,8 @@ import java.util.function.Function; @@ -526,26 +561,54 @@ index 41c036324499d4e408030d1e19f78468b6b3d8a6..ba2e7efe147b26bea5d73eac1f4b2fe6 static boolean forEachBlockIntersectedBetween(Vec3 from, Vec3 to, AABB boundingBox, BlockGetter.BlockStepVisitor visitor) { + // Sakura start - configure server mechanics -+ return forEachBlockIntersectedBetween(from, to, boundingBox, null, visitor); ++ return forEachBlockIntersectedBetween(from, to, boundingBox, me.samsuik.sakura.mechanics.MinecraftMechanicsTarget.latest(), visitor); + } + + static boolean forEachBlockIntersectedBetween( + final Vec3 from, + final Vec3 to, + final AABB boundingBox, -+ final @Nullable me.samsuik.sakura.mechanics.MinecraftMechanicsTarget mechanicsTarget, ++ final me.samsuik.sakura.mechanics.MinecraftMechanicsTarget mechanicsTarget, + final BlockGetter.BlockStepVisitor visitor + ) { Vec3 vec3 = to.subtract(from); - if (vec3.lengthSqr() < Mth.square(1.0E-5F)) { -+ final double margin = mechanicsTarget != null && mechanicsTarget.atLeast(MechanicVersion.v1_21_9) ++ final double movedThreshold = mechanicsTarget.atLeast(MechanicVersion.v1_21_9) + ? 1.0E-5F + : 0.99999F; -+ if (vec3.lengthSqr() < Mth.square(margin) || mechanicsTarget != null && mechanicsTarget.before(me.samsuik.sakura.mechanics.MechanicVersion.v1_21_2)) { ++ if (vec3.lengthSqr() < Mth.square(movedThreshold) || mechanicsTarget.before(me.samsuik.sakura.mechanics.MechanicVersion.v1_21_2)) { + // Sakura end - configure server mechanics for (BlockPos blockPos : BlockPos.betweenClosed(boundingBox)) { if (!visitor.visit(blockPos, 0)) { return false; +@@ -224,15 +241,22 @@ public interface BlockGetter extends LevelHeightAccessor { + } else { + LongSet set = new LongOpenHashSet(); + +- for (BlockPos blockPos1 : BlockPos.betweenCornersInDirection(boundingBox.move(vec3.scale(-1.0)), vec3)) { +- if (!visitor.visit(blockPos1, 0)) { +- return false; +- } ++ // Sakura start - configure server mechanics ++ if (mechanicsTarget.atLeast(me.samsuik.sakura.mechanics.MechanicVersion.v1_21_9)) { ++ for (BlockPos blockPos1 : BlockPos.betweenCornersInDirection(boundingBox.move(vec3.scale(-1.0)), vec3)) { ++ if (!visitor.visit(blockPos1, 0)) { ++ return false; ++ } + +- set.add(blockPos1.asLong()); ++ set.add(blockPos1.asLong()); ++ } + } + + int i = addCollisionsAlongTravel(set, vec3, boundingBox, visitor); ++ if (mechanicsTarget.before(me.samsuik.sakura.mechanics.MechanicVersion.v1_21_5)) { ++ i = 0; ++ } ++ // Sakura end - configure server mechanics + if (i < 0) { + return false; + } else { diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java index b13aae809e974b42bc1b17f4f4455999adca6f5f..0a279388e965a8d059189a8dfdbec3ff951af876 100644 --- a/net/minecraft/world/level/ServerExplosion.java diff --git a/sakura-server/minecraft-patches/features/0026-Optimise-check-inside-blocks-and-traverse-blocks.patch b/sakura-server/minecraft-patches/features/0026-Optimise-check-inside-blocks-and-traverse-blocks.patch index f3fbbaa..0aed5f1 100644 --- a/sakura-server/minecraft-patches/features/0026-Optimise-check-inside-blocks-and-traverse-blocks.patch +++ b/sakura-server/minecraft-patches/features/0026-Optimise-check-inside-blocks-and-traverse-blocks.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Optimise check inside blocks and traverse blocks diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 679a377f068ce4f37b2a3e6f446cccc51fb29bf9..d2bd693934b27815e388387b9b9a707d75999cad 100644 +index 5aa283ac6eb9f3690f9df1938ac08da77d29142e..438013200908d3cdb0677b551c3890c7f87b5dc1 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -1938,6 +1938,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name @@ -81,19 +81,19 @@ index 679a377f068ce4f37b2a3e6f446cccc51fb29bf9..d2bd693934b27815e388387b9b9a707d if (flag1) { this.debugBlockIntersection((ServerLevel)this.level(), pos.immutable(), false, false); diff --git a/net/minecraft/world/level/BlockGetter.java b/net/minecraft/world/level/BlockGetter.java -index ba2e7efe147b26bea5d73eac1f4b2fe6ee4bd5c2..b9ed6671edc98fe7a4bb30fdd25a6629e852da4f 100644 +index 3c2f5d40bccaf6582a41079d1c47eb228c72a6ff..01cb853c06a669511f26081f9447756f1f8ad549 100644 --- a/net/minecraft/world/level/BlockGetter.java +++ b/net/minecraft/world/level/BlockGetter.java @@ -231,7 +231,7 @@ public interface BlockGetter extends LevelHeightAccessor { : 0.99999F; - if (vec3.lengthSqr() < Mth.square(margin) || mechanicsTarget != null && mechanicsTarget.before(me.samsuik.sakura.mechanics.MechanicVersion.v1_21_2)) { + if (vec3.lengthSqr() < Mth.square(movedThreshold) || mechanicsTarget.before(me.samsuik.sakura.mechanics.MechanicVersion.v1_21_2)) { // Sakura end - configure server mechanics - for (BlockPos blockPos : BlockPos.betweenClosed(boundingBox)) { + for (final BlockPos blockPos : me.samsuik.sakura.utils.BlockPosIterator.iterable(boundingBox)) { // Sakura - optimise check inside blocks if (!visitor.visit(blockPos, 0)) { return false; } -@@ -239,9 +239,22 @@ public interface BlockGetter extends LevelHeightAccessor { +@@ -239,11 +239,24 @@ public interface BlockGetter extends LevelHeightAccessor { return true; } else { @@ -112,12 +112,14 @@ index ba2e7efe147b26bea5d73eac1f4b2fe6ee4bd5c2..b9ed6671edc98fe7a4bb30fdd25a6629 + // Sakura end - optimise check inside blocks LongSet set = new LongOpenHashSet(); -- for (BlockPos blockPos1 : BlockPos.betweenCornersInDirection(boundingBox.move(vec3.scale(-1.0)), vec3)) { -+ for (final BlockPos blockPos1 : me.samsuik.sakura.utils.BlockPosIterator.iterable(boundingBox.move(vec3.scale(-1.0)))) { // Sakura - optimise check inside blocks - if (!visitor.visit(blockPos1, 0)) { - return false; - } -@@ -253,7 +266,7 @@ public interface BlockGetter extends LevelHeightAccessor { + // Sakura start - configure server mechanics + if (mechanicsTarget.atLeast(me.samsuik.sakura.mechanics.MechanicVersion.v1_21_9)) { +- for (BlockPos blockPos1 : BlockPos.betweenCornersInDirection(boundingBox.move(vec3.scale(-1.0)), vec3)) { ++ for (BlockPos blockPos1 : me.samsuik.sakura.utils.BlockPosIterator.iterable(boundingBox.move(vec3.scale(-1.0)))) { // Sakura - optimise check inside blocks + if (!visitor.visit(blockPos1, 0)) { + return false; + } +@@ -260,7 +273,7 @@ public interface BlockGetter extends LevelHeightAccessor { if (i < 0) { return false; } else { diff --git a/sakura-server/src/main/java/me/samsuik/sakura/mechanics/EntityBehaviour.java b/sakura-server/src/main/java/me/samsuik/sakura/mechanics/EntityBehaviour.java index 8bfb3da..43a9bae 100644 --- a/sakura-server/src/main/java/me/samsuik/sakura/mechanics/EntityBehaviour.java +++ b/sakura-server/src/main/java/me/samsuik/sakura/mechanics/EntityBehaviour.java @@ -1,6 +1,8 @@ package me.samsuik.sakura.mechanics; import ca.spottedleaf.moonrise.patches.collisions.CollisionUtil; +import it.unimi.dsi.fastutil.longs.LongSet; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.AABB; @@ -49,6 +51,14 @@ public final class EntityBehaviour { || mechanicsTarget.before(MechanicVersion.v1_14); } + public static boolean canCheckInsideBlock(final BlockPos pos, final boolean canCollide, final LongSet visited, final MinecraftMechanicsTarget mechanicsTarget) { + final boolean before1_21_9 = mechanicsTarget.before(MechanicVersion.v1_21_9); + if (before1_21_9 && !visited.add(pos.asLong())) { + return false; + } + return (mechanicsTarget.before(MechanicVersion.v1_21_2) || canCollide) && (before1_21_9 || visited.add(pos.asLong())); + } + public static boolean prioritiseXFirst(final double x, final double z, final @Nullable MinecraftMechanicsTarget mechanicsTarget) { return mechanicsTarget == null || mechanicsTarget.atLeast(MechanicVersion.v1_14) ? Math.abs(x) < Math.abs(z)