Make entities look for hoppers
Cherry-pick of PR GH-319
Dieser Commit ist enthalten in:
Ursprung
fab2a52fe1
Commit
bf40dd5557
@ -1,15 +1,27 @@
|
|||||||
From 7da21dbfe05ab9e7d89f7e1f9a5d1cc422205569 Mon Sep 17 00:00:00 2001
|
From 545d8cf103f27528e091883c29b100eaaf686986 Mon Sep 17 00:00:00 2001
|
||||||
From: Aikar <aikar@aikar.co>
|
From: Aikar <aikar@aikar.co>
|
||||||
Date: Mon, 28 Mar 2016 20:55:47 -0400
|
Date: Mon, 28 Mar 2016 20:55:47 -0400
|
||||||
Subject: [PATCH] MC Utils
|
Subject: [PATCH] MC Utils
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
|
index 9343615..f3d845d 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
|
@@ -673,6 +673,7 @@ public class Chunk {
|
||||||
|
return !block.isTileEntity() ? null : ((ITileEntity) block).a(this.world, iblockdata.getBlock().toLegacyData(iblockdata));
|
||||||
|
}
|
||||||
|
|
||||||
|
+ @Nullable public final TileEntity getTileEntityImmediately(BlockPosition pos) { return this.a(pos, EnumTileEntityState.IMMEDIATE); } // Paper - OBFHELPER
|
||||||
|
@Nullable
|
||||||
|
public TileEntity a(BlockPosition blockposition, Chunk.EnumTileEntityState chunk_enumtileentitystate) {
|
||||||
|
// CraftBukkit start
|
||||||
diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java
|
diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..f059bc2
|
index 0000000..fe7b476
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/main/java/net/minecraft/server/MCUtil.java
|
+++ b/src/main/java/net/minecraft/server/MCUtil.java
|
||||||
@@ -0,0 +1,185 @@
|
@@ -0,0 +1,199 @@
|
||||||
+package net.minecraft.server;
|
+package net.minecraft.server;
|
||||||
+
|
+
|
||||||
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||||
@ -172,7 +184,8 @@ index 0000000..f059bc2
|
|||||||
+ * @param z
|
+ * @param z
|
||||||
+ * @return
|
+ * @return
|
||||||
+ */
|
+ */
|
||||||
+ @Nullable public static Chunk getLoadedChunkWithoutMarkingActive(World world, int x, int z) {
|
+ @Nullable
|
||||||
|
+ public static Chunk getLoadedChunkWithoutMarkingActive(World world, int x, int z) {
|
||||||
+ return ((ChunkProviderServer) world.chunkProvider).chunks.get(ChunkCoordIntPair.a(x, z));
|
+ return ((ChunkProviderServer) world.chunkProvider).chunks.get(ChunkCoordIntPair.a(x, z));
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
@ -183,7 +196,8 @@ index 0000000..f059bc2
|
|||||||
+ * @param z
|
+ * @param z
|
||||||
+ * @return
|
+ * @return
|
||||||
+ */
|
+ */
|
||||||
+ @Nullable public static Chunk getLoadedChunkWithoutMarkingActive(IChunkProvider provider, int x, int z) {
|
+ @Nullable
|
||||||
|
+ public static Chunk getLoadedChunkWithoutMarkingActive(IChunkProvider provider, int x, int z) {
|
||||||
+ return ((ChunkProviderServer)provider).chunks.get(ChunkCoordIntPair.a(x, z));
|
+ return ((ChunkProviderServer)provider).chunks.get(ChunkCoordIntPair.a(x, z));
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
@ -194,6 +208,18 @@ index 0000000..f059bc2
|
|||||||
+ public static void scheduleAsyncTask(Runnable run) {
|
+ public static void scheduleAsyncTask(Runnable run) {
|
||||||
+ asyncExecutor.execute(run);
|
+ asyncExecutor.execute(run);
|
||||||
+ }
|
+ }
|
||||||
|
+
|
||||||
|
+ @Nullable
|
||||||
|
+ public static TileEntityHopper getHopper(World world, BlockPosition pos) {
|
||||||
|
+ Chunk chunk = world.getChunkIfLoaded(pos.getX() >> 4, pos.getZ() >> 4);
|
||||||
|
+ if (chunk != null && chunk.getBlockData(pos).getBlock() == Blocks.HOPPER) {
|
||||||
|
+ TileEntity tileEntity = chunk.getTileEntityImmediately(pos);
|
||||||
|
+ if (tileEntity instanceof TileEntityHopper) {
|
||||||
|
+ return (TileEntityHopper) tileEntity;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return null;
|
||||||
|
+ }
|
||||||
+}
|
+}
|
||||||
diff --git a/src/main/java/net/minecraft/server/NBTTagCompound.java b/src/main/java/net/minecraft/server/NBTTagCompound.java
|
diff --git a/src/main/java/net/minecraft/server/NBTTagCompound.java b/src/main/java/net/minecraft/server/NBTTagCompound.java
|
||||||
index 154a2d5..f8a624e 100644
|
index 154a2d5..f8a624e 100644
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
From d0d31b0118bde005c6a3e08555ebe0e0a4fd58cd Mon Sep 17 00:00:00 2001
|
From 5dd5701010a85eee8f0fc1e934e55ef4277c881b Mon Sep 17 00:00:00 2001
|
||||||
From: Byteflux <byte@byteflux.net>
|
From: Byteflux <byte@byteflux.net>
|
||||||
Date: Tue, 1 Mar 2016 15:08:03 -0600
|
Date: Tue, 1 Mar 2016 15:08:03 -0600
|
||||||
Subject: [PATCH] Remove invalid mob spawner tile entities
|
Subject: [PATCH] Remove invalid mob spawner tile entities
|
||||||
|
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
index 9343615..c051c77 100644
|
index f3d845d..2488902 100644
|
||||||
--- a/src/main/java/net/minecraft/server/Chunk.java
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
||||||
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
@@ -719,6 +719,10 @@ public class Chunk {
|
@@ -720,6 +720,10 @@ public class Chunk {
|
||||||
tileentity.z();
|
tileentity.z();
|
||||||
this.tileEntities.put(blockposition, tileentity);
|
this.tileEntities.put(blockposition, tileentity);
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
From 3ae2bd2580b26f6349a3cd0e52b59af253169654 Mon Sep 17 00:00:00 2001
|
From 811cc7c1702c42e9f23da17dfcfa503392b8df67 Mon Sep 17 00:00:00 2001
|
||||||
From: CullanP <cullanpage@gmail.com>
|
From: CullanP <cullanpage@gmail.com>
|
||||||
Date: Thu, 3 Mar 2016 02:13:38 -0600
|
Date: Thu, 3 Mar 2016 02:13:38 -0600
|
||||||
Subject: [PATCH] Avoid hopper searches if there are no items
|
Subject: [PATCH] Avoid hopper searches if there are no items
|
||||||
@ -14,7 +14,7 @@ And since minecart hoppers are used _very_ rarely near we can avoid alot of sear
|
|||||||
Combined, this adds up a lot.
|
Combined, this adds up a lot.
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
index 9b0b98b..51a1d85 100644
|
index bd7cbd2..407bbd8 100644
|
||||||
--- a/src/main/java/net/minecraft/server/Chunk.java
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
||||||
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
@@ -47,6 +47,13 @@ public class Chunk {
|
@@ -47,6 +47,13 @@ public class Chunk {
|
||||||
@ -59,7 +59,7 @@ index 9b0b98b..51a1d85 100644
|
|||||||
// Spigot start - decrement creature type count
|
// Spigot start - decrement creature type count
|
||||||
// Keep this synced up with World.a(Class)
|
// Keep this synced up with World.a(Class)
|
||||||
if (entity instanceof EntityInsentient) {
|
if (entity instanceof EntityInsentient) {
|
||||||
@@ -845,6 +866,15 @@ public class Chunk {
|
@@ -846,6 +867,15 @@ public class Chunk {
|
||||||
if (!this.entitySlices[k].isEmpty()) {
|
if (!this.entitySlices[k].isEmpty()) {
|
||||||
Iterator iterator = this.entitySlices[k].iterator();
|
Iterator iterator = this.entitySlices[k].iterator();
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ index 9b0b98b..51a1d85 100644
|
|||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
Entity entity1 = (Entity) iterator.next();
|
Entity entity1 = (Entity) iterator.next();
|
||||||
|
|
||||||
@@ -881,7 +911,18 @@ public class Chunk {
|
@@ -882,7 +912,18 @@ public class Chunk {
|
||||||
i = MathHelper.clamp(i, 0, this.entitySlices.length - 1);
|
i = MathHelper.clamp(i, 0, this.entitySlices.length - 1);
|
||||||
j = MathHelper.clamp(j, 0, this.entitySlices.length - 1);
|
j = MathHelper.clamp(j, 0, this.entitySlices.length - 1);
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
From a01d836fc14857d7c4fd3dc5e69285107316b9bb Mon Sep 17 00:00:00 2001
|
From 3af3b015b5891d9a2130ce49ea26835fdcab3fe4 Mon Sep 17 00:00:00 2001
|
||||||
From: Joseph Hirschfeld <joe@ibj.io>
|
From: Joseph Hirschfeld <joe@ibj.io>
|
||||||
Date: Thu, 3 Mar 2016 03:15:41 -0600
|
Date: Thu, 3 Mar 2016 03:15:41 -0600
|
||||||
Subject: [PATCH] Add exception reporting event
|
Subject: [PATCH] Add exception reporting event
|
||||||
@ -50,7 +50,7 @@ index 0000000..9339718
|
|||||||
+}
|
+}
|
||||||
\ No newline at end of file
|
\ No newline at end of file
|
||||||
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
index 51a1d85..bc6e190 100644
|
index 407bbd8..8b78a7c 100644
|
||||||
--- a/src/main/java/net/minecraft/server/Chunk.java
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
||||||
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
@@ -1,5 +1,6 @@
|
@@ -1,5 +1,6 @@
|
||||||
@ -68,7 +68,7 @@ index 51a1d85..bc6e190 100644
|
|||||||
|
|
||||||
public class Chunk {
|
public class Chunk {
|
||||||
|
|
||||||
@@ -761,10 +763,15 @@ public class Chunk {
|
@@ -762,10 +764,15 @@ public class Chunk {
|
||||||
this.tileEntities.remove(blockposition);
|
this.tileEntities.remove(blockposition);
|
||||||
// Paper end
|
// Paper end
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
From 0eec3c902eea1be2619aa7da710f94fc49f898d7 Mon Sep 17 00:00:00 2001
|
From 91b181b60c817b2bf5ae68f47b61d5ea130d20df Mon Sep 17 00:00:00 2001
|
||||||
From: Aikar <aikar@aikar.co>
|
From: Aikar <aikar@aikar.co>
|
||||||
Date: Mon, 28 Mar 2016 20:46:14 -0400
|
Date: Mon, 28 Mar 2016 20:46:14 -0400
|
||||||
Subject: [PATCH] Configurable Chunk Inhabited Timer
|
Subject: [PATCH] Configurable Chunk Inhabited Timer
|
||||||
@ -23,10 +23,10 @@ index a97eee7..8966b4a 100644
|
|||||||
+ }
|
+ }
|
||||||
}
|
}
|
||||||
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
index 770d7ed..c994dc0 100644
|
index 8327394..12edcfe 100644
|
||||||
--- a/src/main/java/net/minecraft/server/Chunk.java
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
||||||
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
@@ -1366,7 +1366,7 @@ public class Chunk {
|
@@ -1367,7 +1367,7 @@ public class Chunk {
|
||||||
}
|
}
|
||||||
|
|
||||||
public long x() {
|
public long x() {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
From 5cbbd2df9293bded0d27bb098766478e27edb75a Mon Sep 17 00:00:00 2001
|
From a658b34af1b7798fd438ce4b56698a26b48d2e62 Mon Sep 17 00:00:00 2001
|
||||||
From: Aikar <aikar@aikar.co>
|
From: Aikar <aikar@aikar.co>
|
||||||
Date: Thu, 12 May 2016 01:55:17 -0400
|
Date: Thu, 12 May 2016 01:55:17 -0400
|
||||||
Subject: [PATCH] Do not mark chunks as active for neighbor updates
|
Subject: [PATCH] Do not mark chunks as active for neighbor updates
|
||||||
@ -6,10 +6,10 @@ Subject: [PATCH] Do not mark chunks as active for neighbor updates
|
|||||||
Fixes chunk unload issues
|
Fixes chunk unload issues
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
index ffd2a26..bb8fe9c 100644
|
index 8a51478..8bbea48 100644
|
||||||
--- a/src/main/java/net/minecraft/server/Chunk.java
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
||||||
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
||||||
@@ -967,25 +967,25 @@ public class Chunk {
|
@@ -968,25 +968,25 @@ public class Chunk {
|
||||||
|
|
||||||
public void loadNearby(IChunkProvider ichunkprovider, ChunkGenerator chunkgenerator) {
|
public void loadNearby(IChunkProvider ichunkprovider, ChunkGenerator chunkgenerator) {
|
||||||
world.timings.syncChunkLoadPostTimer.startTiming(); // Spigot
|
world.timings.syncChunkLoadPostTimer.startTiming(); // Spigot
|
||||||
|
362
Spigot-Server-Patches/0163-Make-entities-look-for-hoppers.patch
Normale Datei
362
Spigot-Server-Patches/0163-Make-entities-look-for-hoppers.patch
Normale Datei
@ -0,0 +1,362 @@
|
|||||||
|
From 31d6804e83b8c5f6100c0d1c3625f296ae721ee0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Techcable <Techcable@outlook.com>
|
||||||
|
Date: Sat, 18 Jun 2016 01:01:37 -0500
|
||||||
|
Subject: [PATCH] Make entities look for hoppers
|
||||||
|
|
||||||
|
Every tick hoppers try and find an block-inventory to extract from.
|
||||||
|
If no tile entity is above the hopper (which there often isn't) it will do a bounding box search for minecart chests and minecart hoppers.
|
||||||
|
If it can't find an inventory, it will then look for a dropped item, which is another bounding box search.
|
||||||
|
This patch eliminates that expensive check by having dropped items and minecart hoppers/chests look for hoppers instead.
|
||||||
|
Hoppers are tile entities meaning you can do a simple tile entity lookup to find the nearest hopper in range.
|
||||||
|
Pushing out of hoppers causes a bouding box lookup, which this patch replaces with a tile entity lookup.
|
||||||
|
|
||||||
|
This patch may causes a decrease in the performance of dropped items, which is why it can be disabled in the configuration.
|
||||||
|
|
||||||
|
diff --git a/src/main/java/com/destroystokyo/paper/HopperPusher.java b/src/main/java/com/destroystokyo/paper/HopperPusher.java
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..5ff43e2
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src/main/java/com/destroystokyo/paper/HopperPusher.java
|
||||||
|
@@ -0,0 +1,59 @@
|
||||||
|
+package com.destroystokyo.paper;
|
||||||
|
+
|
||||||
|
+import net.minecraft.server.AxisAlignedBB;
|
||||||
|
+import net.minecraft.server.BlockPosition;
|
||||||
|
+import net.minecraft.server.MCUtil;
|
||||||
|
+import net.minecraft.server.TileEntityHopper;
|
||||||
|
+import net.minecraft.server.World;
|
||||||
|
+
|
||||||
|
+public interface HopperPusher {
|
||||||
|
+
|
||||||
|
+ default TileEntityHopper findHopper() {
|
||||||
|
+ BlockPosition pos = new BlockPosition(getX(), getY(), getZ());
|
||||||
|
+ int startX = pos.getX() - 1;
|
||||||
|
+ int endX = pos.getX() + 1;
|
||||||
|
+ int startY = Math.max(0, pos.getY() - 1);
|
||||||
|
+ int endY = Math.min(255, pos.getY() + 1);
|
||||||
|
+ int startZ = pos.getZ() - 1;
|
||||||
|
+ int endZ = pos.getZ() + 1;
|
||||||
|
+ BlockPosition.PooledBlockPosition adjacentPos = BlockPosition.PooledBlockPosition.aquire();
|
||||||
|
+ for (int x = startX; x <= endX; x++) {
|
||||||
|
+ for (int y = startY; y <= endY; y++) {
|
||||||
|
+ for (int z = startZ; z <= endZ; z++) {
|
||||||
|
+ adjacentPos.setValues(x, y, z);
|
||||||
|
+ TileEntityHopper hopper = MCUtil.getHopper(getWorld(), adjacentPos);
|
||||||
|
+ if (hopper == null) continue; // Avoid playing with the bounding boxes, if at all possible
|
||||||
|
+ AxisAlignedBB hopperBoundingBox = hopper.getHopperLookupBoundingBox();
|
||||||
|
+ /*
|
||||||
|
+ * Check if the entity's bounding box intersects with the hopper's lookup box.
|
||||||
|
+ * This operation doesn't work both ways!
|
||||||
|
+ * Make sure you check if the entity's box intersects the hopper's box, not vice versa!
|
||||||
|
+ */
|
||||||
|
+ if (this.getBoundingBox().b(hopperBoundingBox)) {
|
||||||
|
+ return hopper;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ adjacentPos.free();
|
||||||
|
+ return null;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ boolean acceptItem(TileEntityHopper hopper);
|
||||||
|
+
|
||||||
|
+ default boolean tryPutInHopper() {
|
||||||
|
+ if (!getWorld().paperConfig.isHopperPushBased) return false;
|
||||||
|
+ TileEntityHopper hopper = findHopper();
|
||||||
|
+ return hopper != null && hopper.canAcceptItems() && acceptItem(hopper);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ AxisAlignedBB getBoundingBox();
|
||||||
|
+
|
||||||
|
+ World getWorld();
|
||||||
|
+
|
||||||
|
+ double getX();
|
||||||
|
+
|
||||||
|
+ double getY();
|
||||||
|
+
|
||||||
|
+ double getZ();
|
||||||
|
+}
|
||||||
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
||||||
|
index 40ede20..0d2af96 100644
|
||||||
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
||||||
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
||||||
|
@@ -363,4 +363,9 @@ public class PaperWorldConfig {
|
||||||
|
log("Old Cannon Behaviors: This feature may not be working entirely properly at the moment");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ public boolean isHopperPushBased;
|
||||||
|
+ private void isHopperPushBased() {
|
||||||
|
+ isHopperPushBased = getBoolean("hopper.push-based", true);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java
|
||||||
|
index 557fa3a..a2ffbda 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/BlockPosition.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/BlockPosition.java
|
||||||
|
@@ -265,6 +265,7 @@ public class BlockPosition extends BaseBlockPosition {
|
||||||
|
super(i, j, k);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ public static BlockPosition.PooledBlockPosition aquire() { return s(); } // Paper - OBFHELPER
|
||||||
|
public static BlockPosition.PooledBlockPosition s() {
|
||||||
|
return e(0, 0, 0);
|
||||||
|
}
|
||||||
|
@@ -291,6 +292,7 @@ public class BlockPosition extends BaseBlockPosition {
|
||||||
|
return new BlockPosition.PooledBlockPosition(i, j, k);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ public void free() { t(); } // Paper - OBFHELPER
|
||||||
|
public void t() {
|
||||||
|
List list = BlockPosition.PooledBlockPosition.g;
|
||||||
|
|
||||||
|
@@ -388,6 +390,7 @@ public class BlockPosition extends BaseBlockPosition {
|
||||||
|
return this.d;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ public void setValues(int x, int y, int z) { c(x, y, z); } // Paper - OBFHELPER
|
||||||
|
public BlockPosition.MutableBlockPosition c(int i, int j, int k) {
|
||||||
|
this.b = i;
|
||||||
|
this.c = j;
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
||||||
|
index e21769f..93f9eab 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
||||||
|
@@ -77,6 +77,19 @@ public abstract class Entity implements ICommandListener {
|
||||||
|
public double locX;
|
||||||
|
public double locY;
|
||||||
|
public double locZ;
|
||||||
|
+ // Paper start - getters to implement HopperPusher
|
||||||
|
+ public double getX() {
|
||||||
|
+ return locX;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public double getY() {
|
||||||
|
+ return locY;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public double getZ() {
|
||||||
|
+ return locZ;
|
||||||
|
+ }
|
||||||
|
+ // Paper end
|
||||||
|
public double motX;
|
||||||
|
public double motY;
|
||||||
|
public double motZ;
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java
|
||||||
|
index 691a78b..6f474b4 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/EntityItem.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/EntityItem.java
|
||||||
|
@@ -6,8 +6,15 @@ import javax.annotation.Nullable;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.bukkit.event.player.PlayerPickupItemEvent; // CraftBukkit
|
||||||
|
+import com.destroystokyo.paper.HopperPusher; // Paper
|
||||||
|
|
||||||
|
-public class EntityItem extends Entity {
|
||||||
|
+// Paper start - implement HopperPusher
|
||||||
|
+public class EntityItem extends Entity implements HopperPusher {
|
||||||
|
+ @Override
|
||||||
|
+ public boolean acceptItem(TileEntityHopper hopper) {
|
||||||
|
+ return TileEntityHopper.a(hopper, this);
|
||||||
|
+ }
|
||||||
|
+// Paper end
|
||||||
|
|
||||||
|
private static final Logger b = LogManager.getLogger();
|
||||||
|
private static final DataWatcherObject<Optional<ItemStack>> c = DataWatcher.a(EntityItem.class, DataWatcherRegistry.f);
|
||||||
|
@@ -63,6 +70,7 @@ public class EntityItem extends Entity {
|
||||||
|
this.die();
|
||||||
|
} else {
|
||||||
|
super.m();
|
||||||
|
+ if (tryPutInHopper()) return; // Paper
|
||||||
|
// CraftBukkit start - Use wall time for pickup and despawn timers
|
||||||
|
int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
|
||||||
|
if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
|
||||||
|
@@ -130,6 +138,7 @@ public class EntityItem extends Entity {
|
||||||
|
// Spigot start - copied from above
|
||||||
|
@Override
|
||||||
|
public void inactiveTick() {
|
||||||
|
+ if (tryPutInHopper()) return; // Paper
|
||||||
|
// CraftBukkit start - Use wall time for pickup and despawn timers
|
||||||
|
int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
|
||||||
|
if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/EntityMinecartContainer.java b/src/main/java/net/minecraft/server/EntityMinecartContainer.java
|
||||||
|
index b808716..035db5e 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/EntityMinecartContainer.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/EntityMinecartContainer.java
|
||||||
|
@@ -6,6 +6,7 @@ import javax.annotation.Nullable;
|
||||||
|
import java.util.List;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
+import com.destroystokyo.paper.HopperPusher; // Paper
|
||||||
|
import com.destroystokyo.paper.loottable.CraftLootableInventoryData; // Paper
|
||||||
|
import com.destroystokyo.paper.loottable.CraftLootableInventory; // Paper
|
||||||
|
import com.destroystokyo.paper.loottable.LootableInventory; // Paper
|
||||||
|
@@ -14,7 +15,25 @@ import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
// CraftBukkit end
|
||||||
|
|
||||||
|
-public abstract class EntityMinecartContainer extends EntityMinecartAbstract implements ITileInventory, ILootable, CraftLootableInventory { // Paper
|
||||||
|
+// Paper start - push into hoppers
|
||||||
|
+public abstract class EntityMinecartContainer extends EntityMinecartAbstract implements ITileInventory, ILootable, CraftLootableInventory, HopperPusher { // Paper - CraftLootableInventory
|
||||||
|
+ @Override
|
||||||
|
+ public boolean acceptItem(TileEntityHopper hopper) {
|
||||||
|
+ return TileEntityHopper.acceptItem(hopper, this);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void m() {
|
||||||
|
+ super.m();
|
||||||
|
+ tryPutInHopper();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void inactiveTick() {
|
||||||
|
+ super.inactiveTick();
|
||||||
|
+ tryPutInHopper();
|
||||||
|
+ }
|
||||||
|
+ // Paper end
|
||||||
|
|
||||||
|
private ItemStack[] items = new ItemStack[27]; // CraftBukkit - 36 -> 27
|
||||||
|
private boolean b = true;
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/IHopper.java b/src/main/java/net/minecraft/server/IHopper.java
|
||||||
|
index 804215a..e830d83 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/IHopper.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/IHopper.java
|
||||||
|
@@ -4,9 +4,9 @@ public interface IHopper extends IInventory {
|
||||||
|
|
||||||
|
World getWorld();
|
||||||
|
|
||||||
|
- double E();
|
||||||
|
+ double E(); default double getX() { return E(); } // Paper - OBFHELPER
|
||||||
|
|
||||||
|
- double F();
|
||||||
|
+ double F(); default double getY() { return F(); } // Paper - OBFHELPER
|
||||||
|
|
||||||
|
- double G();
|
||||||
|
+ double G(); default double getZ() { return G(); } // Paper - OBFHELPER
|
||||||
|
}
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/TileEntityHopper.java b/src/main/java/net/minecraft/server/TileEntityHopper.java
|
||||||
|
index 8717ae1..cefd659 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/TileEntityHopper.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/TileEntityHopper.java
|
||||||
|
@@ -170,6 +170,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean m() {
|
||||||
|
+ mayAcceptItems = false; // Paper - at the beginning of a tick, assume we can't accept items
|
||||||
|
if (this.world != null && !this.world.isClientSide) {
|
||||||
|
if (!this.o() && BlockHopper.f(this.u())) {
|
||||||
|
boolean flag = false;
|
||||||
|
@@ -179,6 +180,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.r()) {
|
||||||
|
+ mayAcceptItems = true; // Paper - flag this hopper to be able to accept items
|
||||||
|
flag = a((IHopper) this) || flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -201,6 +203,14 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Paper start
|
||||||
|
+ private boolean mayAcceptItems = true;
|
||||||
|
+
|
||||||
|
+ public boolean canAcceptItems() {
|
||||||
|
+ return mayAcceptItems;
|
||||||
|
+ }
|
||||||
|
+ // Paper end
|
||||||
|
+
|
||||||
|
private boolean q() {
|
||||||
|
ItemStack[] aitemstack = this.items;
|
||||||
|
int i = aitemstack.length;
|
||||||
|
@@ -344,8 +354,15 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Paper start - split methods, and only do entity lookup if in pull mode
|
||||||
|
public static boolean a(IHopper ihopper) {
|
||||||
|
- IInventory iinventory = b(ihopper);
|
||||||
|
+ IInventory iinventory = getInventory(ihopper, !(ihopper instanceof TileEntityHopper) || !ihopper.getWorld().paperConfig.isHopperPushBased);
|
||||||
|
+
|
||||||
|
+ return acceptItem(ihopper, iinventory);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public static boolean acceptItem(IHopper ihopper, IInventory iinventory) {
|
||||||
|
+ // Paper end
|
||||||
|
|
||||||
|
if (iinventory != null) {
|
||||||
|
EnumDirection enumdirection = EnumDirection.DOWN;
|
||||||
|
@@ -376,8 +393,8 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- } else {
|
||||||
|
- Iterator iterator = a(ihopper.getWorld(), ihopper.E(), ihopper.F(), ihopper.G()).iterator();
|
||||||
|
+ } else if (!ihopper.getWorld().paperConfig.isHopperPushBased || !(ihopper instanceof TileEntityHopper)) { // Paper - only search for entities in 'pull mode'
|
||||||
|
+ Iterator iterator = a(ihopper.getWorld(), ihopper.E(), ihopper.F(), ihopper.G()).iterator(); // Change getHopperLookupBoundingBox() if this ever changes
|
||||||
|
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
EntityItem entityitem = (EntityItem) iterator.next();
|
||||||
|
@@ -541,18 +558,44 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi
|
||||||
|
private IInventory I() {
|
||||||
|
EnumDirection enumdirection = BlockHopper.e(this.u());
|
||||||
|
|
||||||
|
- return b(this.getWorld(), this.E() + (double) enumdirection.getAdjacentX(), this.F() + (double) enumdirection.getAdjacentY(), this.G() + (double) enumdirection.getAdjacentZ());
|
||||||
|
+ // Paper start - don't search for entities in push mode
|
||||||
|
+ World world = getWorld();
|
||||||
|
+ return getInventory(world, this.E() + (double) enumdirection.getAdjacentX(), this.F() + (double) enumdirection.getAdjacentY(), this.G() + (double) enumdirection.getAdjacentZ(), !world.paperConfig.isHopperPushBased);
|
||||||
|
+ // Paper endtcon
|
||||||
|
}
|
||||||
|
|
||||||
|
- public static IInventory b(IHopper ihopper) {
|
||||||
|
- return b(ihopper.getWorld(), ihopper.E(), ihopper.F() + 1.0D, ihopper.G());
|
||||||
|
+ // Paper start - add option to search for entities
|
||||||
|
+ public static IInventory b(IHopper hopper) {
|
||||||
|
+ return getInventory(hopper, true);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public static IInventory getInventory(IHopper ihopper, boolean searchForEntities) {
|
||||||
|
+ return getInventory(ihopper.getWorld(), ihopper.E(), ihopper.F() + 1.0D, ihopper.G(), searchForEntities);
|
||||||
|
+ // Paper end
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<EntityItem> a(World world, double d0, double d1, double d2) {
|
||||||
|
- return world.a(EntityItem.class, new AxisAlignedBB(d0 - 0.5D, d1, d2 - 0.5D, d0 + 0.5D, d1 + 1.5D, d2 + 0.5D), IEntitySelector.a);
|
||||||
|
+ return world.a(EntityItem.class, new AxisAlignedBB(d0 - 0.5D, d1, d2 - 0.5D, d0 + 0.5D, d1 + 1.5D, d2 + 0.5D), IEntitySelector.a); // Change getHopperLookupBoundingBox(double, double, double) if the bounding box calculation is ever changed
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // Paper start
|
||||||
|
+ public AxisAlignedBB getHopperLookupBoundingBox() {
|
||||||
|
+ return getHopperLookupBoundingBox(this.getX(), this.getY(), this.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
+ private static AxisAlignedBB getHopperLookupBoundingBox(double d0, double d1, double d2) {
|
||||||
|
+ // Change this if a(World, double, double, double) above ever changes
|
||||||
|
+ return new AxisAlignedBB(d0 - 0.5D, d1, d2 - 0.5D, d0 + 0.5D, d1 + 1.5D, d2 + 0.5D);
|
||||||
|
+ }
|
||||||
|
+ // Paper end
|
||||||
|
+
|
||||||
|
+ // Paper start - add option to searchForEntities
|
||||||
|
public static IInventory b(World world, double d0, double d1, double d2) {
|
||||||
|
+ return getInventory(world, d0, d1, d2, true);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public static IInventory getInventory(World world, double d0, double d1, double d2, boolean searchForEntities) {
|
||||||
|
+ // Paper end
|
||||||
|
Object object = null;
|
||||||
|
int i = MathHelper.floor(d0);
|
||||||
|
int j = MathHelper.floor(d1);
|
||||||
|
@@ -572,7 +615,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (object == null) {
|
||||||
|
+ if (object == null && searchForEntities) { // Paper - only if searchForEntities
|
||||||
|
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.c);
|
||||||
|
|
||||||
|
if (!list.isEmpty()) {
|
||||||
|
--
|
||||||
|
2.8.3
|
||||||
|
|
@ -57,6 +57,7 @@ import EULA
|
|||||||
import EntitySquid
|
import EntitySquid
|
||||||
import EntityWaterAnimal
|
import EntityWaterAnimal
|
||||||
import FileIOThread
|
import FileIOThread
|
||||||
|
import IHopper
|
||||||
import ItemBlock
|
import ItemBlock
|
||||||
import NavigationAbstract
|
import NavigationAbstract
|
||||||
import NBTTagCompound
|
import NBTTagCompound
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren