mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-27 09:42:05 +01:00
fc917d1687
Removed streams from hoppers and also fixed a mistake in the logic. When this patch was ported to 1.14/1.15, a line of code was put in the wrong place which disabled a significant portion of the improvement. Replaced usages of streams in isEmpty and itemstack checks Replaced usage of streams in pulling loop Replaced usage of streams in Lootable Inventory isEmpty() check Only check for refilling Lootable Inventory when accessing first slot, not all All of these in general were pretty significant hits, so this single commit is going to cause tacos to magically appear in front of you every day. 🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮🌮 Nom Nom Nom If you hate taco's, you're not allowed to use this improvement. Also ignore the renames, pulled a lot of PR's.
61 lines
4.8 KiB
Diff
61 lines
4.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Sun, 10 May 2020 22:49:05 -0400
|
|
Subject: [PATCH] Optimize WorldBorder collision checks and air
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 149c22e6d5c5974250b04a20dd2a8c8379a8f7c3..182b08677728f1bbd19e415d4b434604ef7a0638 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -844,7 +844,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
|
VoxelShapeCollision voxelshapecollision = VoxelShapeCollision.a(this);
|
|
VoxelShape voxelshape = this.world.getWorldBorder().a();
|
|
- Stream<VoxelShape> stream = VoxelShapes.c(voxelshape, VoxelShapes.a(axisalignedbb.shrink(1.0E-7D)), OperatorBoolean.AND) ? Stream.empty() : Stream.of(voxelshape);
|
|
+ Stream<VoxelShape> stream = !this.world.getWorldBorder().isInBounds(axisalignedbb) ? Stream.empty() : Stream.of(this.world.getWorldBorder().a()); // Paper
|
|
Stream<VoxelShape> stream1 = this.world.b(this, axisalignedbb.a(vec3d), (Set) ImmutableSet.of());
|
|
StreamAccumulator<VoxelShape> streamaccumulator = new StreamAccumulator<>(Stream.concat(stream1, stream));
|
|
Vec3D vec3d1 = vec3d.g() == 0.0D ? vec3d : a(this, vec3d, axisalignedbb, this.world, voxelshapecollision, streamaccumulator);
|
|
diff --git a/src/main/java/net/minecraft/server/ICollisionAccess.java b/src/main/java/net/minecraft/server/ICollisionAccess.java
|
|
index b98037a1af4cce52fb85867ed778c4e9aadced0b..72d0840c4f8ca85645fb659a7ec642a9af2bbf15 100644
|
|
--- a/src/main/java/net/minecraft/server/ICollisionAccess.java
|
|
+++ b/src/main/java/net/minecraft/server/ICollisionAccess.java
|
|
@@ -93,12 +93,12 @@ public interface ICollisionAccess extends IBlockAccess {
|
|
if (true) { //public boolean tryAdvance(Consumer<? super VoxelShape> consumer) {*/ // Paper
|
|
if (entity != null) {
|
|
// Paper end
|
|
- VoxelShape voxelshape1 = ICollisionAccess.this.getWorldBorder().a();
|
|
- boolean flag = VoxelShapes.c(voxelshape1, VoxelShapes.a(entity.getBoundingBox().shrink(1.0E-7D)), OperatorBoolean.AND);
|
|
- boolean flag1 = VoxelShapes.c(voxelshape1, VoxelShapes.a(entity.getBoundingBox().g(1.0E-7D)), OperatorBoolean.AND);
|
|
+ //VoxelShape voxelshape1 = ICollisionAccess.this.getWorldBorder().a(); // Paper - only make if collides
|
|
+ boolean flag = !ICollisionAccess.this.getWorldBorder().isInBounds(entity.getBoundingBox().shrink(1.0E-7D)); // Paper
|
|
+ boolean flag1 = !ICollisionAccess.this.getWorldBorder().isInBounds(entity.getBoundingBox().g(1.0E-7D)); // Paper
|
|
|
|
if (!flag && flag1) {
|
|
- collisions.add(voxelshape1);// Paper
|
|
+ collisions.add(ICollisionAccess.this.getWorldBorder().a());// Paper
|
|
if (returnFast) return collisions;
|
|
}
|
|
}
|
|
@@ -131,7 +131,7 @@ public interface ICollisionAccess extends IBlockAccess {
|
|
//IBlockData iblockdata = iblockaccess.getType(blockposition_mutableblockposition); // moved up
|
|
// Paper end
|
|
|
|
- if ((j2 != 1 || iblockdata.f()) && (j2 != 2 || iblockdata.getBlock() == Blocks.MOVING_PISTON)) {
|
|
+ if (!iblockdata.isAir() && (j2 != 1 || iblockdata.f()) && (j2 != 2 || iblockdata.getBlock() == Blocks.MOVING_PISTON)) { // Paper - fast track air
|
|
VoxelShape voxelshape2 = iblockdata.b((IBlockAccess) ICollisionAccess.this, blockposition_mutableblockposition, voxelshapecollision);
|
|
|
|
// Paper start - Lithium Collision Optimizations
|
|
diff --git a/src/main/java/net/minecraft/server/WorldBorder.java b/src/main/java/net/minecraft/server/WorldBorder.java
|
|
index 4c20db5a3f9e159997a9851691aca421241d6d95..535d08ffb1d20570b19307c8619cfd39b4541356 100644
|
|
--- a/src/main/java/net/minecraft/server/WorldBorder.java
|
|
+++ b/src/main/java/net/minecraft/server/WorldBorder.java
|
|
@@ -40,6 +40,7 @@ public class WorldBorder {
|
|
return (double) chunkcoordintpair.f() > this.c() && (double) chunkcoordintpair.d() < this.e() && (double) chunkcoordintpair.g() > this.d() && (double) chunkcoordintpair.e() < this.f();
|
|
}
|
|
|
|
+ public final boolean isInBounds(AxisAlignedBB aabb) { return this.a(aabb); } // Paper - OBFHELPER
|
|
public boolean a(AxisAlignedBB axisalignedbb) {
|
|
return axisalignedbb.maxX > this.c() && axisalignedbb.minX < this.e() && axisalignedbb.maxZ > this.d() && axisalignedbb.minZ < this.f();
|
|
}
|