mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-01 17:01:56 +01:00
ea4b94d62e
In 1.12, Spigot improved their blockstate implementation to take a full copy of the TE, this allows for a much better snapshot in that it will actually retain all of the TE's state, it is a much more expensive implementation. This is also implicated with their backwards compat for inventories meaning that accessing of a snapshots inventory of a placed block will actually access the inventory of the live TE, making creation of a snapshot redundant if the only intent is to interact with the TEs inventory. Hoppers are a horrible hit, every attempt to transfer an ItemStack will result in two TileEntity snapshots, with two hoppers and a double chest ontop, I managed to log 380 cases per second where a snapshot would have been taken in cases where the snapshot is redundant.
65 lines
No EOL
4.1 KiB
Diff
65 lines
No EOL
4.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Shane Freeder <theboyetronic@gmail.com>
|
|
Date: Sat, 25 Nov 2017 17:02:33 +0000
|
|
Subject: [PATCH] Do not use a snapshot for hoppers
|
|
|
|
In 1.12, Spigot improved their blockstate implementation to take a full
|
|
copy of the TE, this allows for a much better snapshot in that it will
|
|
actually retain all of the TE's state, it is a much more expensive
|
|
implementation. This is also implicated with their backwards compat
|
|
for inventories meaning that accessing of a snapshots inventory of a
|
|
placed block will actually access the inventory of the live TE, making
|
|
creation of a snapshot redundant if the only intent is to interact with
|
|
the TEs inventory.
|
|
|
|
Hoppers are a horrible hit, every attempt to transfer an ItemStack will
|
|
result in two TileEntity state snapshots, with two hoppers and a double chest
|
|
ontop, I managed to log 380 cases per second where a snapshot would have been
|
|
taken in cases where the snapshot is redundant.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/TileEntityHopper.java b/src/main/java/net/minecraft/server/TileEntityHopper.java
|
|
index 8ad081316..ebbe5d326 100644
|
|
--- a/src/main/java/net/minecraft/server/TileEntityHopper.java
|
|
+++ b/src/main/java/net/minecraft/server/TileEntityHopper.java
|
|
@@ -0,0 +0,0 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi
|
|
// Have to special case large chests as they work oddly
|
|
if (iinventory instanceof InventoryLargeChest) {
|
|
destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory);
|
|
+ // Paper start - avoid redundant snapshot creation of a TE
|
|
+ } else if (iinventory instanceof TileEntity) {
|
|
+ destinationInventory = ((TileEntity) iinventory).getOwner(false).getInventory();
|
|
} else {
|
|
destinationInventory = iinventory.getOwner().getInventory();
|
|
}
|
|
|
|
- InventoryMoveItemEvent event = new InventoryMoveItemEvent(this.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true);
|
|
+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(this.getOwner(false).getInventory(), oitemstack.clone(), destinationInventory, true);
|
|
+ // Paper end - avoid redundant snapshot creation of a TE
|
|
this.getWorld().getServer().getPluginManager().callEvent(event);
|
|
if (event.isCancelled()) {
|
|
this.setItem(i, itemstack);
|
|
@@ -0,0 +0,0 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi
|
|
// Have to special case large chests as they work oddly
|
|
if (iinventory instanceof InventoryLargeChest) {
|
|
sourceInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory);
|
|
+ // Paper start - avoid redundant snapshot creation of a TE
|
|
+ } else if (iinventory instanceof TileEntity){
|
|
+ sourceInventory = ((TileEntity) iinventory).getOwner(false).getInventory();
|
|
} else {
|
|
sourceInventory = iinventory.getOwner().getInventory();
|
|
}
|
|
|
|
- InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false);
|
|
+ Inventory destination;
|
|
+ if (ihopper instanceof TileEntity) {
|
|
+ destination = ((TileEntity) ihopper).getOwner(false).getInventory();
|
|
+ } else {
|
|
+ destination = ihopper.getOwner().getInventory();
|
|
+ }
|
|
|
|
+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), destination, false);
|
|
+ // Paper end - avoid redundant snapshot creation of a TE
|
|
ihopper.getWorld().getServer().getPluginManager().callEvent(event);
|
|
if (event.isCancelled()) {
|
|
iinventory.setItem(i, itemstack1);
|
|
--
|