69 lines
4.0 KiB
Diff
69 lines
4.0 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
||
|
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 f1b9affe2e971203f9a72d3abbf902559e0b04e5..34497bf24046225108c47f1faf52bb1830f56d14 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
@@ -1206,9 +1206,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||
|
// 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
|
||
|
+ ((org.bukkit.craftbukkit.entity.CraftHumanEntity)h).getHandle().closeUnloadedInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper
|
||
|
}
|
||
|
+ // Tuiniy end
|
||
|
}
|
||
|
}
|
||
|
// 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 8565aa3698a4febe21cb3aae0af51ae3479ec743..718649f1ffa20e618063a17e62d4b00c01c7c8eb 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
|
@@ -1564,6 +1564,18 @@ public class ServerPlayer extends 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
|
||
|
|
||
|
public void doCloseContainer() {
|
||
|
this.containerMenu.removed((Player) this);
|
||
|
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 d8780f06efc261a42389e466573a0bcf10c333f6..cea92f1dc663bf0648b2bd877d86ca380a517bc9 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
|
@@ -498,6 +498,11 @@ public abstract class Player extends LivingEntity {
|
||
|
this.containerMenu = this.inventoryMenu;
|
||
|
}
|
||
|
// Paper end
|
||
|
+ // 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;
|