9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-28 11:19:08 +00:00

Add pre 1.21.10 stuckSpeed behaviour to mechanic version

This commit is contained in:
Samsuik
2025-10-12 18:21:26 +01:00
parent 89dc3207b0
commit 5df3ceb9a1
3 changed files with 91 additions and 16 deletions

View File

@@ -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<AABB> 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

View File

@@ -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 {

View File

@@ -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)