From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: tr7zw Date: Fri, 26 Jun 2020 01:11:47 +0200 Subject: [PATCH] Optimize Hopper logic diff --git a/src/main/java/net/minecraft/server/BlockDropper.java b/src/main/java/net/minecraft/server/BlockDropper.java index 1ce89c28c2b54278dc8f1c17f2d0ccb743a27b34..1b360140b6161e9cae96752943d574200b5ced4e 100644 --- a/src/main/java/net/minecraft/server/BlockDropper.java +++ b/src/main/java/net/minecraft/server/BlockDropper.java @@ -36,7 +36,7 @@ public class BlockDropper extends BlockDispenser { if (!itemstack.isEmpty()) { EnumDirection enumdirection = (EnumDirection) world.getType(blockposition).get(BlockDropper.FACING); - IInventory iinventory = TileEntityHopper.b(world, blockposition.shift(enumdirection)); + IInventory iinventory = TileEntityHopper.b(world, blockposition.shift(enumdirection), false); ItemStack itemstack1; if (iinventory == null) { diff --git a/src/main/java/net/minecraft/server/BlockHopper.java b/src/main/java/net/minecraft/server/BlockHopper.java index a29294fbc7cd6fcfff0df9eadd11de3bd7f1405e..3a07fb76ebeddaf6b3676e04a995638cc43cf2f2 100644 --- a/src/main/java/net/minecraft/server/BlockHopper.java +++ b/src/main/java/net/minecraft/server/BlockHopper.java @@ -110,6 +110,12 @@ public class BlockHopper extends BlockTileEntity { @Override public void doPhysics(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1, boolean flag) { this.a(world, blockposition, iblockdata); + //YAPFA start + TileEntity tileEntity = world.getTileEntity(blockposition); + if (tileEntity instanceof TileEntityHopper) { + ((TileEntityHopper)tileEntity).flushCaches(); + } + // YAPFA end } private void a(World world, BlockPosition blockposition, IBlockData iblockdata) { diff --git a/src/main/java/net/minecraft/server/TileEntityHopper.java b/src/main/java/net/minecraft/server/TileEntityHopper.java index 20df9bd21d0e4d2579d05d79672da2eb26478044..a7f9d3e5ec1d582eb7101d5b6a969281b15be028 100644 --- a/src/main/java/net/minecraft/server/TileEntityHopper.java +++ b/src/main/java/net/minecraft/server/TileEntityHopper.java @@ -2,6 +2,7 @@ package net.minecraft.server; import java.util.Iterator; import java.util.List; +import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -611,14 +612,44 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi @Nullable private IInventory l() { + if(this.cachedPush != null) { + return this.cachedPush; + } EnumDirection enumdirection = (EnumDirection) this.getBlock().get(BlockHopper.FACING); - return b(this.getWorld(), this.position.shift(enumdirection)); + IInventory tmp = b(this.getWorld(), this.position.shift(enumdirection), this.cachedPushAir); + if(tmp != null && !(tmp instanceof IWorldInventory) && !(tmp instanceof Entity)) { + this.cachedPush = tmp; + }else { + if(tmp == null) { + this.cachedPushAir = true; + } + return tmp; + } + if(this.cachedPush == null) { + this.cachedPushAir = true; + } + return this.cachedPush; } @Nullable public static IInventory b(IHopper ihopper) { - return a(ihopper.getWorld(), ihopper.x(), ihopper.z() + 1.0D, ihopper.A()); + //YAPFA start + if(ihopper instanceof TileEntityHopper) { + TileEntityHopper hopper = (TileEntityHopper) ihopper; + if(hopper.cachedAbove != null) { + return hopper.cachedAbove; + } + IInventory inv = a(ihopper.getWorld(), ihopper.x(), ihopper.z() + 1.0D, ihopper.A(), hopper.cachedPullAir); + hopper.cachedAbove = inv; + if(hopper.cachedAbove == null) { + hopper.cachedPullAir = true; + } + return inv; + } else { + return a(ihopper.getWorld(), ihopper.x(), ihopper.z() + 1.0D, ihopper.A(), false); + } + //YAPFA end } public static List c(IHopper ihopper) { @@ -633,14 +664,15 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi } @Nullable - public static IInventory b(World world, BlockPosition blockposition) { - return a(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, true); // Paper + public static IInventory b(World world, BlockPosition blockposition, boolean skipBlockCheck) { + return a(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, true, skipBlockCheck); // YAPFA // Paper } @Nullable - public static IInventory a(World world, double d0, double d1, double d2) { return a(world, d0, d1, d2, false); } // Paper - overload to default false - public static IInventory a(World world, double d0, double d1, double d2, boolean optimizeEntities) { // Paper - Object object = null; + public static IInventory a(World world, double d0, double d1, double d2, boolean skipBlockCheck) { return a(world, d0, d1, d2, false, skipBlockCheck); } // YAPFA // Paper - overload to default false + public static IInventory a(World world, double d0, double d1, double d2, boolean optimizeEntities, boolean skipBlockCheck) { // YAPFA // Paper + Object object = null; + if(!skipBlockCheck) { // YAPFA BlockPosition blockposition = new BlockPosition(d0, d1, d2); if ( !world.isLoaded( blockposition ) ) return null; // Spigot IBlockData iblockdata = world.getType(blockposition); @@ -658,15 +690,16 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi } } } - - if (object == null && (!optimizeEntities || !org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(block).isOccluding())) { // Paper + } + + if (object == null && (!optimizeEntities || true/*!org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(block).isOccluding()*/)) { // YAPFA // Paper List list = world.getEntities((Entity) null, new AxisAlignedBB(d0 - 0.5D, d1 - 0.5D, d2 - 0.5D, d0 + 0.5D, d1 + 0.5D, d2 + 0.5D), IEntitySelector.d); if (!list.isEmpty()) { object = (IInventory) list.get(world.random.nextInt(list.size())); } } - + return (IInventory) object; } @@ -728,4 +761,21 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi protected Container createContainer(int i, PlayerInventory playerinventory) { return new ContainerHopper(i, playerinventory, this); } + + // YAPFA start + + private IInventory cachedAbove = null; + private IInventory cachedPush = null; + private boolean cachedPushAir = false; + private boolean cachedPullAir = false; + + public void flushCaches() { + cachedAbove = null; + cachedPush = null; + cachedPushAir = false; + cachedPullAir = false; + } + + // YAPFA end + }