From 4c95d52bd080288a27d9ab5bd6dd018d1b47134c Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Tue, 9 Jul 2024 19:45:01 -0400 Subject: [PATCH] Small optimizations --- .../entity/vehicle/VehicleComponent.java | 23 ++++++++++++------- .../geyser/level/physics/BoundingBox.java | 16 +++++++++++++ .../geyser/session/cache/WorldBorder.java | 12 ++++------ 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java b/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java index 1d5e3d46f..2819617e6 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java +++ b/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java @@ -824,21 +824,28 @@ public class VehicleComponent { protected class VehicleContext { private Vector3d centerPos; + private Vector3d cachePos; private BlockState centerBlock; private Vector3i supportingBlockPos; private BlockPositionIterator blockIter; private int[] blocks; protected void loadSurroundingBlocks() { - BoundingBox box = boundingBox.clone(); - box.expand(2); - - Vector3i min = box.getMin().toInt(); - Vector3i max = box.getMax().toInt(); - this.blockIter = BlockPositionIterator.fromMinMax(min.getX(), min.getY(), min.getZ(), max.getX(), max.getY(), max.getZ()); - this.blocks = vehicle.getSession().getGeyser().getWorldManager().getBlocksAt(vehicle.getSession(), this.blockIter); - this.centerPos = boundingBox.getBottomCenter(); + + // Reuse block cache if vehicle moved less than 1 block + if (this.cachePos == null || this.cachePos.distanceSquared(this.centerPos) > 1) { + BoundingBox box = boundingBox.clone(); + box.expand(2); + + Vector3i min = box.getMin().toInt(); + Vector3i max = box.getMax().toInt(); + this.blockIter = BlockPositionIterator.fromMinMax(min.getX(), min.getY(), min.getZ(), max.getX(), max.getY(), max.getZ()); + this.blocks = vehicle.getSession().getGeyser().getWorldManager().getBlocksAt(vehicle.getSession(), this.blockIter); + + this.cachePos = this.centerPos; + } + this.centerBlock = getBlock(this.centerPos.toInt()); this.supportingBlockPos = null; } diff --git a/core/src/main/java/org/geysermc/geyser/level/physics/BoundingBox.java b/core/src/main/java/org/geysermc/geyser/level/physics/BoundingBox.java index c4245964b..395467c02 100644 --- a/core/src/main/java/org/geysermc/geyser/level/physics/BoundingBox.java +++ b/core/src/main/java/org/geysermc/geyser/level/physics/BoundingBox.java @@ -94,6 +94,14 @@ public class BoundingBox implements Cloneable { return Vector3d.from(x, y, z); } + public double getMin(Axis axis) { + return switch (axis) { + case X -> middleX - sizeX / 2; + case Y -> middleY - sizeY / 2; + case Z -> middleZ - sizeZ / 2; + }; + } + public Vector3d getMax() { double x = middleX + sizeX / 2; double y = middleY + sizeY / 2; @@ -101,6 +109,14 @@ public class BoundingBox implements Cloneable { return Vector3d.from(x, y, z); } + public double getMax(Axis axis) { + return switch (axis) { + case X -> middleX + sizeX / 2; + case Y -> middleY + sizeY / 2; + case Z -> middleZ + sizeZ / 2; + }; + } + public Vector3d getBottomCenter() { return Vector3d.from(middleX, middleY - sizeY / 2, middleZ); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java b/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java index 0d16ae211..35579db13 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java @@ -37,6 +37,7 @@ import lombok.Getter; import lombok.Setter; import org.geysermc.geyser.entity.EntityDefinitions; import org.geysermc.geyser.entity.type.player.PlayerEntity; +import org.geysermc.geyser.level.physics.Axis; import org.geysermc.geyser.level.physics.BoundingBox; import org.geysermc.geyser.session.GeyserSession; @@ -202,14 +203,11 @@ public class WorldBorder { * @return the corrected movement */ public Vector3d correctMovement(BoundingBox boundingBox, Vector3d movement) { - Vector3d bbMin = boundingBox.getMin(); - Vector3d bbMax = boundingBox.getMax(); - double correctedX; if (movement.getX() < 0) { - correctedX = -limitMovement(-movement.getX(), bbMin.getX() - GenericMath.floor(minX)); + correctedX = -limitMovement(-movement.getX(), boundingBox.getMin(Axis.X) - GenericMath.floor(minX)); } else { - correctedX = limitMovement(movement.getX(), GenericMath.ceil(maxX) - bbMax.getX()); + correctedX = limitMovement(movement.getX(), GenericMath.ceil(maxX) - boundingBox.getMax(Axis.X)); } // Outside of border, don't adjust movement @@ -219,9 +217,9 @@ public class WorldBorder { double correctedZ; if (movement.getZ() < 0) { - correctedZ = -limitMovement(-movement.getZ(), bbMin.getZ() - GenericMath.floor(minZ)); + correctedZ = -limitMovement(-movement.getZ(), boundingBox.getMin(Axis.Z) - GenericMath.floor(minZ)); } else { - correctedZ = limitMovement(movement.getZ(), GenericMath.ceil(maxZ) - bbMax.getZ()); + correctedZ = limitMovement(movement.getZ(), GenericMath.ceil(maxZ) - boundingBox.getMax(Axis.Z)); } if (Double.isNaN(correctedZ)) {