229 lines
13 KiB
Diff
229 lines
13 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
Date: Tue, 3 Jul 2018 21:56:23 -0400
|
||
|
Subject: [PATCH] InventoryCloseEvent Reason API
|
||
|
|
||
|
Allows you to determine why an inventory was closed, enabling plugin developers
|
||
|
to "confirm" things based on if it was player triggered close or not.
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
index 5110f2c70d96284e8e7592b3d89266b867b9a466..ea1b15495481157912140bf5de9bf4a949c16910 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
@@ -1119,7 +1119,7 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl
|
||
|
for (BlockEntity tileentity : chunk.getBlockEntities().values()) {
|
||
|
if (tileentity instanceof net.minecraft.world.Container) {
|
||
|
for (org.bukkit.entity.HumanEntity h : Lists.newArrayList(((net.minecraft.world.Container) tileentity).getViewers())) {
|
||
|
- h.closeInventory();
|
||
|
+ h.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
@@ -1177,7 +1177,7 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl
|
||
|
// Spigot Start
|
||
|
if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder) {
|
||
|
for (org.bukkit.entity.HumanEntity h : Lists.newArrayList(((org.bukkit.inventory.InventoryHolder) entity.getBukkitEntity()).getInventory().getViewers())) {
|
||
|
- h.closeInventory();
|
||
|
+ h.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper
|
||
|
}
|
||
|
}
|
||
|
// 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 0fa977a31cf945b74f3a046b6be302b10f494ad1..1441a461e749dbfa303095f6b51d655c45f68ce0 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
|
@@ -544,7 +544,7 @@ public class ServerPlayer extends Player implements ContainerListener {
|
||
|
}
|
||
|
// Paper end
|
||
|
if (!this.level.isClientSide && !this.containerMenu.stillValid(this)) {
|
||
|
- this.closeContainer();
|
||
|
+ this.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.CANT_USE); // Paper
|
||
|
this.containerMenu = this.inventoryMenu;
|
||
|
}
|
||
|
|
||
|
@@ -717,7 +717,7 @@ public class ServerPlayer extends Player implements ContainerListener {
|
||
|
|
||
|
// SPIGOT-943 - only call if they have an inventory open
|
||
|
if (this.containerMenu != this.inventoryMenu) {
|
||
|
- this.closeContainer();
|
||
|
+ this.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.DEATH); // Paper
|
||
|
}
|
||
|
|
||
|
net.kyori.adventure.text.Component deathMessage = event.deathMessage() != null ? event.deathMessage() : net.kyori.adventure.text.Component.empty(); // Paper - Adventure
|
||
|
@@ -1290,7 +1290,7 @@ public class ServerPlayer extends Player implements ContainerListener {
|
||
|
return OptionalInt.empty();
|
||
|
} else {
|
||
|
if (this.containerMenu != this.inventoryMenu) {
|
||
|
- this.closeContainer();
|
||
|
+ this.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper
|
||
|
}
|
||
|
|
||
|
this.nextContainerCounter();
|
||
|
@@ -1350,7 +1350,7 @@ public class ServerPlayer extends Player implements ContainerListener {
|
||
|
}
|
||
|
// CraftBukkit end
|
||
|
if (this.containerMenu != this.inventoryMenu) {
|
||
|
- this.closeContainer();
|
||
|
+ this.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper
|
||
|
}
|
||
|
|
||
|
// this.nextContainerCounter(); // CraftBukkit - moved up
|
||
|
@@ -1414,7 +1414,12 @@ public class ServerPlayer extends Player implements ContainerListener {
|
||
|
|
||
|
@Override
|
||
|
public void closeContainer() {
|
||
|
- CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit
|
||
|
+ // Paper start
|
||
|
+ closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNKNOWN);
|
||
|
+ }
|
||
|
+ public void closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||
|
+ CraftEventFactory.handleInventoryCloseEvent(this, reason); // CraftBukkit
|
||
|
+ // Paper end
|
||
|
this.connection.send(new ClientboundContainerClosePacket(this.containerMenu.containerId));
|
||
|
this.doCloseContainer();
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||
|
index fb36aa08cd2fbe3f7262dccb8cf0f7cae55aea9c..d322e99170b3cb6594efc824a879ab9a538ea1eb 100644
|
||
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||
|
@@ -188,6 +188,7 @@ import org.bukkit.event.inventory.ClickType;
|
||
|
import org.bukkit.event.inventory.CraftItemEvent;
|
||
|
import org.bukkit.event.inventory.InventoryAction;
|
||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||
|
+import org.bukkit.event.inventory.InventoryCloseEvent; // Paper
|
||
|
import org.bukkit.event.inventory.InventoryCreativeEvent;
|
||
|
import org.bukkit.event.inventory.InventoryType.SlotType;
|
||
|
import org.bukkit.event.inventory.SmithItemEvent;
|
||
|
@@ -2309,10 +2310,15 @@ public class ServerGamePacketListenerImpl implements ServerGamePacketListener {
|
||
|
|
||
|
@Override
|
||
|
public void handleContainerClose(ServerboundContainerClosePacket packet) {
|
||
|
- PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel());
|
||
|
+ // Paper start
|
||
|
+ handleContainerClose(packet, InventoryCloseEvent.Reason.PLAYER);
|
||
|
+ }
|
||
|
+ public void handleContainerClose(ServerboundContainerClosePacket packetplayinclosewindow, InventoryCloseEvent.Reason reason) {
|
||
|
+ // Paper end
|
||
|
+ PacketUtils.ensureRunningOnSameThread(packetplayinclosewindow, this, this.player.getLevel());
|
||
|
|
||
|
if (this.player.isImmobile()) return; // CraftBukkit
|
||
|
- CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit
|
||
|
+ CraftEventFactory.handleInventoryCloseEvent(this.player, reason); // CraftBukkit // Paper
|
||
|
|
||
|
this.player.doCloseContainer();
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
|
||
|
index ae60b233c4d56a4964b388f96e9cc66410774e8d..51b1ce465d23b971f7e08a3175319a33183d0398 100644
|
||
|
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
|
||
|
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
|
||
|
@@ -490,7 +490,7 @@ public abstract class PlayerList {
|
||
|
// CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it
|
||
|
// See SPIGOT-5799, SPIGOT-6145
|
||
|
if (entityplayer.containerMenu != entityplayer.inventoryMenu) {
|
||
|
- entityplayer.closeContainer();
|
||
|
+ entityplayer.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.DISCONNECT); // Paper
|
||
|
}
|
||
|
|
||
|
PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(cserver.getPlayer(entityplayer), net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, com.destroystokyo.paper.PaperConfig.useDisplayNameInQuit ? entityplayer.getBukkitEntity().displayName() : net.kyori.adventure.text.Component.text(entityplayer.getScoreboardName())));
|
||
|
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 5e6a86b0b8999a5c47d2f9bdd9857ab5f0772033..709e930eef7bae5694238ed8c4d0ef59316bb715 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
|
@@ -249,7 +249,7 @@ public abstract class Player extends LivingEntity {
|
||
|
this.updateIsUnderwater();
|
||
|
super.tick();
|
||
|
if (!this.level.isClientSide && this.containerMenu != null && !this.containerMenu.stillValid(this)) {
|
||
|
- this.closeContainer();
|
||
|
+ this.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.CANT_USE); // Paper
|
||
|
this.containerMenu = this.inventoryMenu;
|
||
|
}
|
||
|
|
||
|
@@ -444,6 +444,13 @@ public abstract class Player extends LivingEntity {
|
||
|
return 20;
|
||
|
}
|
||
|
|
||
|
+ // Paper start - unused code, but to keep signatures aligned
|
||
|
+ public void closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||
|
+ closeContainer();
|
||
|
+ this.containerMenu = this.inventoryMenu;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
+
|
||
|
public void closeContainer() {
|
||
|
this.containerMenu = this.inventoryMenu;
|
||
|
}
|
||
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
|
||
|
index 4aec1c2b26d48cb5bea3dfb9e183526763bdb98f..a73c6ddd6bf66cc21ae5b25daacdece8cbfeeeac 100644
|
||
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
|
||
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
|
||
|
@@ -374,7 +374,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
|
||
|
if (((ServerPlayer) getHandle()).connection == null) return;
|
||
|
if (getHandle().containerMenu != getHandle().inventoryMenu) {
|
||
|
// fire INVENTORY_CLOSE if one already open
|
||
|
- ((ServerPlayer) getHandle()).connection.handleContainerClose(new ServerboundContainerClosePacket(getHandle().containerMenu.containerId));
|
||
|
+ ((ServerPlayer) getHandle()).connection.handleContainerClose(new ServerboundContainerClosePacket(getHandle().containerMenu.containerId), org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper
|
||
|
}
|
||
|
ServerPlayer player = (ServerPlayer) getHandle();
|
||
|
AbstractContainerMenu container;
|
||
|
@@ -444,8 +444,13 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
|
||
|
|
||
|
@Override
|
||
|
public void closeInventory() {
|
||
|
- getHandle().closeContainer();
|
||
|
+ // Paper start
|
||
|
+ getHandle().closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.PLUGIN);
|
||
|
}
|
||
|
+ public void closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||
|
+ getHandle().closeContainer(reason);
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
@Override
|
||
|
public boolean isBlocking() {
|
||
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
|
index 46338fe5693003698de9c7b37a860c3481e06233..c7f66dddf0a0850ca4048dd47cd2ded114caa07e 100644
|
||
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
|
@@ -895,7 +895,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||
|
|
||
|
// Close any foreign inventory
|
||
|
if (getHandle().containerMenu != getHandle().inventoryMenu) {
|
||
|
- getHandle().closeContainer();
|
||
|
+ getHandle().closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.TELEPORT); // Paper
|
||
|
}
|
||
|
|
||
|
// Check if the fromWorld and toWorld are the same.
|
||
|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
||
|
index 5e8ff18f98b03741ccbb927f87499ae36d775a86..c2f58b95db41b2205fbf2728c6a99419c6a63dfa 100644
|
||
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
||
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
||
|
@@ -1175,7 +1175,7 @@ public class CraftEventFactory {
|
||
|
|
||
|
public static AbstractContainerMenu callInventoryOpenEvent(ServerPlayer player, AbstractContainerMenu container, boolean cancelled) {
|
||
|
if (player.containerMenu != player.inventoryMenu) { // fire INVENTORY_CLOSE if one already open
|
||
|
- player.connection.handleContainerClose(new ServerboundContainerClosePacket(player.containerMenu.containerId));
|
||
|
+ player.connection.handleContainerClose(new ServerboundContainerClosePacket(player.containerMenu.containerId), InventoryCloseEvent.Reason.OPEN_NEW); // Paper
|
||
|
}
|
||
|
|
||
|
CraftServer server = player.level.getCraftServer();
|
||
|
@@ -1341,8 +1341,18 @@ public class CraftEventFactory {
|
||
|
return event;
|
||
|
}
|
||
|
|
||
|
+ // Paper start
|
||
|
+ /**
|
||
|
+ * Incase plugins hooked into this or Spigot adds a new inventory close event. Prefer to pass a reason
|
||
|
+ * @param human
|
||
|
+ */
|
||
|
+ @Deprecated
|
||
|
public static void handleInventoryCloseEvent(net.minecraft.world.entity.player.Player human) {
|
||
|
- InventoryCloseEvent event = new InventoryCloseEvent(human.containerMenu.getBukkitView());
|
||
|
+ handleInventoryCloseEvent(human, org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNKNOWN);
|
||
|
+ }
|
||
|
+ public static void handleInventoryCloseEvent(net.minecraft.world.entity.player.Player human, org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||
|
+ // Paper end
|
||
|
+ InventoryCloseEvent event = new InventoryCloseEvent(human.containerMenu.getBukkitView(), reason); // Paper
|
||
|
human.level.getCraftServer().getPluginManager().callEvent(event);
|
||
|
human.containerMenu.transferTo(human.inventoryMenu, human.getBukkitEntity());
|
||
|
}
|