aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/unapplied/server/0589-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/unapplied/server/0589-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch')
-rw-r--r--patches/unapplied/server/0589-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch68
1 files changed, 68 insertions, 0 deletions
diff --git a/patches/unapplied/server/0589-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch b/patches/unapplied/server/0589-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch
new file mode 100644
index 0000000000..e2742c73ce
--- /dev/null
+++ b/patches/unapplied/server/0589-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch
@@ -0,0 +1,68 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Thu, 11 Mar 2021 03:03:32 -0800
+Subject: [PATCH] Do not run close logic for inventories on chunk unload
+
+Still call the event and change the active container though. We
+want to avoid close logic because it's possible to load the
+chunk through it. This should also be OK from a leak prevention/
+state desync POV because the TE is getting unloaded anyways.
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
+index 50d4bd6223eb92c640a61ee61af862e794fbb519..a870349f1de975e46fe831ff32394d6dd80d388b 100644
+--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
+@@ -1244,9 +1244,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+ // Spigot Start
+ for (net.minecraft.world.level.block.entity.BlockEntity tileentity : chunk.getBlockEntities().values()) {
+ if (tileentity instanceof net.minecraft.world.Container) {
++ // Paper start - this area looks like it can load chunks, change the behavior
++ // chests for example can apply physics to the world
++ // so instead we just change the active container and call the event
+ for (org.bukkit.entity.HumanEntity h : Lists.newArrayList(((net.minecraft.world.Container) tileentity).getViewers())) {
+- h.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper - Inventory close reason
++ ((org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeUnloadedInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper - Inventory close reason
+ }
++ // Paper end - this area looks like it can load chunks, change the behavior
+ }
+ }
+ // Spigot End
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 0cd75ffc8952baacb391ea8ee67fd1e8d0a42264..430a7269852c8f03542382aafad989977be96197 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -1983,6 +1983,18 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
+ this.connection.send(new ClientboundContainerClosePacket(this.containerMenu.containerId));
+ this.doCloseContainer();
+ }
++ // Paper start - special close for unloaded inventory
++ @Override
++ public void closeUnloadedInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
++ // copied from above
++ CraftEventFactory.handleInventoryCloseEvent(this, reason); // CraftBukkit
++ // Paper end
++ // copied from below
++ this.connection.send(new ClientboundContainerClosePacket(this.containerMenu.containerId));
++ this.containerMenu = this.inventoryMenu;
++ // do not run close logic
++ }
++ // Paper end - special close for unloaded inventory
+
+ @Override
+ public void doCloseContainer() {
+diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
+index 68a6b1508ce4544fe8b18746d440944d41a2fe5b..b8edbd23d547d7189ec64c5d3a8cd1d51859ce23 100644
+--- a/src/main/java/net/minecraft/world/entity/player/Player.java
++++ b/src/main/java/net/minecraft/world/entity/player/Player.java
+@@ -544,6 +544,11 @@ public abstract class Player extends LivingEntity {
+ this.containerMenu = this.inventoryMenu;
+ }
+ // Paper end - Inventory close reason
++ // Paper start - special close for unloaded inventory
++ public void closeUnloadedInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
++ this.containerMenu = this.inventoryMenu;
++ }
++ // Paper end - special close for unloaded inventory
+
+ public void closeContainer() {
+ this.containerMenu = this.inventoryMenu;