Small optimizations

This commit is contained in:
AJ Ferguson 2024-07-09 19:45:01 -04:00
parent 3a18ca9d16
commit 4c95d52bd0
3 changed files with 36 additions and 15 deletions

View file

@ -824,12 +824,17 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
protected class VehicleContext {
private Vector3d centerPos;
private Vector3d cachePos;
private BlockState centerBlock;
private Vector3i supportingBlockPos;
private BlockPositionIterator blockIter;
private int[] blocks;
protected void loadSurroundingBlocks() {
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);
@ -838,7 +843,9 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
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();
this.cachePos = this.centerPos;
}
this.centerBlock = getBlock(this.centerPos.toInt());
this.supportingBlockPos = null;
}

View file

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

View file

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