diff options
Diffstat (limited to 'Spigot-Server-Patches/0511-Implement-JellySquid-s-Entity-Collision-optimisation.patch')
-rw-r--r-- | Spigot-Server-Patches/0511-Implement-JellySquid-s-Entity-Collision-optimisation.patch | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0511-Implement-JellySquid-s-Entity-Collision-optimisation.patch b/Spigot-Server-Patches/0511-Implement-JellySquid-s-Entity-Collision-optimisation.patch new file mode 100644 index 0000000000..d1d02e180f --- /dev/null +++ b/Spigot-Server-Patches/0511-Implement-JellySquid-s-Entity-Collision-optimisation.patch @@ -0,0 +1,101 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: JellySquid <[email protected]> +Date: Sat, 9 May 2020 16:25:21 -0400 +Subject: [PATCH] Implement JellySquid's Entity Collision optimisations patch + +Optimizes Full Block voxel collisions, and removes streams from Entity collisions + +Original code by JellySquid, licensed under GNU Lesser General Public License v3.0 +you can find the original code on https://github.com/jellysquid3/lithium-fabric/tree/1.15.x/fabric (Yarn mappings) + +diff --git a/src/main/java/net/minecraft/server/ICollisionAccess.java b/src/main/java/net/minecraft/server/ICollisionAccess.java +index 3eefbf4d5f10b53f930759a0afa5661253b92c60..5e20dba0d011d20b714d784cb4a545a05bbf6f9c 100644 +--- a/src/main/java/net/minecraft/server/ICollisionAccess.java ++++ b/src/main/java/net/minecraft/server/ICollisionAccess.java +@@ -115,11 +115,24 @@ public interface ICollisionAccess extends IBlockAccess { + + if ((j2 != 1 || iblockdata.f()) && (j2 != 2 || iblockdata.getBlock() == Blocks.MOVING_PISTON)) { + VoxelShape voxelshape2 = iblockdata.b((IBlockAccess) ICollisionAccess.this, blockposition_mutableblockposition, voxelshapecollision); +- VoxelShape voxelshape3 = voxelshape2.a((double) k1, (double) l1, (double) i2); + +- if (VoxelShapes.c(voxelshape, voxelshape3, OperatorBoolean.AND)) { +- consumer.accept(voxelshape3); +- return true; ++ // Paper start - Lithium Collision Optimizations ++ if (voxelshape2 == VoxelShapes.empty()) { ++ continue; ++ } ++ ++ if (voxelshape2 == VoxelShapes.fullCube()) { ++ if (axisalignedbb.intersects(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D)) { ++ consumer.accept(voxelshape2.offset(x, y, z)); ++ return true; ++ } ++ } else { ++ VoxelShape shape = voxelshape2.offset(x, y, z); ++ if (VoxelShapes.applyOperation(shape, voxelshape, OperatorBoolean.AND)) { ++ consumer.accept(shape); ++ return true; ++ } ++ // Paper end + } + } + } +diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java +index 5135308fb6137a34ed6fd061f0a210de6de4e81c..d434aaaaf0ab6a18ab0fe5ad0bf8ed4662f49120 100644 +--- a/src/main/java/net/minecraft/server/IEntityAccess.java ++++ b/src/main/java/net/minecraft/server/IEntityAccess.java +@@ -52,20 +52,41 @@ public interface IEntityAccess { + // Paper end - optimise hard collision + + default Stream<VoxelShape> b(@Nullable Entity entity, AxisAlignedBB axisalignedbb, Set<Entity> set) { +- if (axisalignedbb.a() < 1.0E-7D) { ++ // Paper start - remove streams from entity collision ++ if (axisalignedbb.getAverageSideLength() < 1.0E-7D) { + return Stream.empty(); +- } else { +- AxisAlignedBB axisalignedbb1 = axisalignedbb.g(1.0E-7D); +- Stream<AxisAlignedBB> stream = ((entity != null && entity.hardCollides()) ? this.getEntities(entity, axisalignedbb) : this.getHardCollidingEntities(entity, axisalignedbb1)).stream().filter((entity1) -> { // Paper - decompile fix // Paper - optimise hard collision +- return !set.contains(entity1); +- }).filter((entity1) -> { +- return entity == null || !entity.isSameVehicle(entity1); +- }).flatMap((entity1) -> { +- return Stream.of(entity1.au(), entity == null ? null : entity.j(entity1)); // Paper - optimise hard collision - diff on change, these are the methods that only hard colliding entities override +- }).filter(Objects::nonNull); +- +- return stream.filter(axisalignedbb1::c).map(VoxelShapes::a); ++ + } ++ AxisAlignedBB selection = axisalignedbb.grow(1.0E-7D); ++ List<Entity> entities = entity != null && entity.hardCollides() ? getEntities(entity, selection) : getHardCollidingEntities(entity, selection); ++ List<VoxelShape> shapes = new java.util.ArrayList<>(); ++ ++ for (Entity otherEntity : entities) { ++ if (!set.isEmpty() && set.contains(otherEntity)) { ++ continue; ++ } ++ ++ if (entity != null && entity.isSameVehicle(otherEntity)) { ++ continue; ++ } ++ ++ AxisAlignedBB otherEntityBox = otherEntity.getCollisionBox(); ++ ++ if (otherEntityBox != null && selection.intersects(otherEntityBox)) { ++ shapes.add(VoxelShapes.of(otherEntityBox)); ++ } ++ ++ if (entity != null) { ++ AxisAlignedBB otherEntityHardBox = entity.getHardCollisionBox(otherEntity); ++ ++ if (otherEntityHardBox != null && selection.intersects(otherEntityHardBox)) { ++ shapes.add(VoxelShapes.of(otherEntityHardBox)); ++ } ++ } ++ } ++ ++ return shapes.stream(); ++ // Paper end + } + + @Nullable |