mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Optimize world border check
This commit is contained in:
parent
264b925990
commit
3a18ca9d16
2 changed files with 31 additions and 35 deletions
|
@ -555,12 +555,11 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
|
||||||
motion = motion.mul(movementMultiplier);
|
motion = motion.mul(movementMultiplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3d correctedMovement = vehicle.getSession().getCollisionManager().correctMovement(
|
Vector3d correctedMovement = vehicle.getSession().getWorldBorder().correctMovement(boundingBox, motion.toDouble());
|
||||||
motion.toDouble(), boundingBox, vehicle.isOnGround(), this.stepHeight, true, vehicle.canWalkOnLava()
|
correctedMovement = vehicle.getSession().getCollisionManager().correctMovement(
|
||||||
|
correctedMovement, boundingBox, vehicle.isOnGround(), this.stepHeight, true, vehicle.canWalkOnLava()
|
||||||
);
|
);
|
||||||
|
|
||||||
correctedMovement = vehicle.getSession().getWorldBorder().correctMovement(boundingBox, correctedMovement);
|
|
||||||
|
|
||||||
boundingBox.translate(correctedMovement);
|
boundingBox.translate(correctedMovement);
|
||||||
ctx.loadSurroundingBlocks();
|
ctx.loadSurroundingBlocks();
|
||||||
|
|
||||||
|
|
|
@ -205,48 +205,45 @@ public class WorldBorder {
|
||||||
Vector3d bbMin = boundingBox.getMin();
|
Vector3d bbMin = boundingBox.getMin();
|
||||||
Vector3d bbMax = boundingBox.getMax();
|
Vector3d bbMax = boundingBox.getMax();
|
||||||
|
|
||||||
// If outside border, don't adjust movement
|
double correctedX;
|
||||||
if (bbMin.getX() + COLLISION_TOLERANCE < GenericMath.floor(minX)
|
if (movement.getX() < 0) {
|
||||||
|| bbMin.getZ() + COLLISION_TOLERANCE < GenericMath.floor(minZ)
|
correctedX = -limitMovement(-movement.getX(), bbMin.getX() - GenericMath.floor(minX));
|
||||||
|| bbMax.getX() - COLLISION_TOLERANCE > GenericMath.ceil(maxX)
|
} else {
|
||||||
|| bbMax.getZ() - COLLISION_TOLERANCE > GenericMath.ceil(maxZ)) {
|
correctedX = limitMovement(movement.getX(), GenericMath.ceil(maxX) - bbMax.getX());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Outside of border, don't adjust movement
|
||||||
|
if (Double.isNaN(correctedX)) {
|
||||||
return movement;
|
return movement;
|
||||||
}
|
}
|
||||||
|
|
||||||
double diff; // Difference between edge of bounding box and world border
|
double correctedZ;
|
||||||
double correctedX = movement.getX();
|
if (movement.getZ() < 0) {
|
||||||
diff = GenericMath.floor(minX) - (bbMin.getX() + movement.getX());
|
correctedZ = -limitMovement(-movement.getZ(), bbMin.getZ() - GenericMath.floor(minZ));
|
||||||
if (diff > 0) {
|
|
||||||
correctedX += diff;
|
|
||||||
} else {
|
} else {
|
||||||
diff = (bbMax.getX() + movement.getX()) - GenericMath.ceil(maxX);
|
correctedZ = limitMovement(movement.getZ(), GenericMath.ceil(maxZ) - bbMax.getZ());
|
||||||
if (diff > 0) {
|
|
||||||
correctedX -= diff;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.abs(correctedX) < COLLISION_TOLERANCE) {
|
if (Double.isNaN(correctedZ)) {
|
||||||
correctedX = 0;
|
return movement;
|
||||||
}
|
|
||||||
|
|
||||||
double correctedZ = movement.getZ();
|
|
||||||
diff = GenericMath.floor(minZ) - (bbMin.getZ() + movement.getZ());
|
|
||||||
if (diff > 0) {
|
|
||||||
correctedZ += diff;
|
|
||||||
} else {
|
|
||||||
diff = (bbMax.getZ() + movement.getZ()) - GenericMath.ceil(maxZ);
|
|
||||||
if (diff > 0) {
|
|
||||||
correctedZ -= diff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Math.abs(correctedZ) < COLLISION_TOLERANCE) {
|
|
||||||
correctedZ = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Vector3d.from(correctedX, movement.getY(), correctedZ);
|
return Vector3d.from(correctedX, movement.getY(), correctedZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private double limitMovement(double movement, double limit) {
|
||||||
|
if (limit < 0) {
|
||||||
|
// Return NaN to indicate outside of border
|
||||||
|
return Double.NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (limit < COLLISION_TOLERANCE) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Math.min(movement, limit);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the world border's minimum and maximum properties
|
* Updates the world border's minimum and maximum properties
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue