Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-16 03:20:07 +01:00
228 Zeilen
13 KiB
Diff
228 Zeilen
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/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
|
||
|
index de7167ddf7b36ef266e511187789f99244401c21..b581a6d3ec06498a4c6db92eb50c5d2b28038131 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
|
||
|
@@ -547,7 +547,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||
|
}
|
||
|
// Paper end
|
||
|
if (!this.world.isClientSide && !this.activeContainer.canUse(this)) {
|
||
|
- this.closeInventory();
|
||
|
+ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.CANT_USE); // Paper
|
||
|
this.activeContainer = this.defaultContainer;
|
||
|
}
|
||
|
|
||
|
@@ -720,7 +720,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||
|
|
||
|
// SPIGOT-943 - only call if they have an inventory open
|
||
|
if (this.activeContainer != this.defaultContainer) {
|
||
|
- this.closeInventory();
|
||
|
+ this.closeInventory(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
|
||
|
@@ -1293,7 +1293,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||
|
return OptionalInt.empty();
|
||
|
} else {
|
||
|
if (this.activeContainer != this.defaultContainer) {
|
||
|
- this.closeInventory();
|
||
|
+ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper
|
||
|
}
|
||
|
|
||
|
this.nextContainerCounter();
|
||
|
@@ -1353,7 +1353,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||
|
}
|
||
|
// CraftBukkit end
|
||
|
if (this.activeContainer != this.defaultContainer) {
|
||
|
- this.closeInventory();
|
||
|
+ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper
|
||
|
}
|
||
|
|
||
|
// this.nextContainerCounter(); // CraftBukkit - moved up
|
||
|
@@ -1417,7 +1417,12 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||
|
|
||
|
@Override
|
||
|
public void closeInventory() {
|
||
|
- CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit
|
||
|
+ // Paper start
|
||
|
+ closeInventory(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.playerConnection.sendPacket(new PacketPlayOutCloseWindow(this.activeContainer.windowId));
|
||
|
this.o();
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
|
||
|
index b73315df7dae243dd76e44d586dfc1d8f9017a56..eb19b6fc87bfd4e500ea7836c1010a80b36abab2 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
|
||
|
@@ -1125,7 +1125,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
|
||
|
for (TileEntity tileentity : chunk.getTileEntities().values()) {
|
||
|
if (tileentity instanceof net.minecraft.world.IInventory) {
|
||
|
for (org.bukkit.entity.HumanEntity h : Lists.newArrayList(((net.minecraft.world.IInventory) tileentity).getViewers())) {
|
||
|
- h.closeInventory();
|
||
|
+ h.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
@@ -1183,7 +1183,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
|
||
|
// 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/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
|
||
|
index 6c5966901ffdc3c7f9950ff8b40fbf2489acbd4b..2a1ad096515247382da741fbcdc84f6d5b1001c5 100644
|
||
|
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
|
||
|
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
|
||
|
@@ -190,6 +190,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;
|
||
|
@@ -2311,10 +2312,15 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
||
|
|
||
|
@Override
|
||
|
public void a(PacketPlayInCloseWindow packetplayinclosewindow) {
|
||
|
+ // Paper start
|
||
|
+ handleContainerClose(packetplayinclosewindow, InventoryCloseEvent.Reason.PLAYER);
|
||
|
+ }
|
||
|
+ public void handleContainerClose(PacketPlayInCloseWindow packetplayinclosewindow, InventoryCloseEvent.Reason reason) {
|
||
|
+ // Paper end
|
||
|
PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.getWorldServer());
|
||
|
|
||
|
if (this.player.isFrozen()) return; // CraftBukkit
|
||
|
- CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit
|
||
|
+ CraftEventFactory.handleInventoryCloseEvent(this.player, reason); // CraftBukkit // Paper
|
||
|
|
||
|
this.player.o();
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
|
||
|
index bd8bcc3891b29d31742bcfd6080a3972e4a9bee7..80934fc662b33b1c88dd7a3033792d612a7c7930 100644
|
||
|
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
|
||
|
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
|
||
|
@@ -494,7 +494,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.activeContainer != entityplayer.defaultContainer) {
|
||
|
- entityplayer.closeInventory();
|
||
|
+ entityplayer.closeInventory(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.getName())));
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
|
||
|
index 3c49d7acd4ad0717886adf6c469e8a49a58e859b..b6effe1037f3ae59e6faa5f5d039b6ad54bca5d4 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
|
||
|
@@ -252,7 +252,7 @@ public abstract class EntityHuman extends EntityLiving {
|
||
|
this.et();
|
||
|
super.tick();
|
||
|
if (!this.world.isClientSide && this.activeContainer != null && !this.activeContainer.canUse(this)) {
|
||
|
- this.closeInventory();
|
||
|
+ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.CANT_USE); // Paper
|
||
|
this.activeContainer = this.defaultContainer;
|
||
|
}
|
||
|
|
||
|
@@ -447,6 +447,13 @@ public abstract class EntityHuman extends EntityLiving {
|
||
|
return 20;
|
||
|
}
|
||
|
|
||
|
+ // Paper start - unused code, but to keep signatures aligned
|
||
|
+ public void closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||
|
+ closeInventory();
|
||
|
+ this.activeContainer = this.defaultContainer;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
+
|
||
|
public void closeInventory() {
|
||
|
this.activeContainer = this.defaultContainer;
|
||
|
}
|
||
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
|
||
|
index 1333d425147e6dc7f21f755a9b25ead9723d4a28..3b3e6076f2565e02fa6f13e369094f8b6cac5382 100644
|
||
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
|
||
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
|
||
|
@@ -375,7 +375,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
|
||
|
if (((EntityPlayer) getHandle()).playerConnection == null) return;
|
||
|
if (getHandle().activeContainer != getHandle().defaultContainer) {
|
||
|
// fire INVENTORY_CLOSE if one already open
|
||
|
- ((EntityPlayer) getHandle()).playerConnection.a(new PacketPlayInCloseWindow(getHandle().activeContainer.windowId));
|
||
|
+ ((EntityPlayer) getHandle()).playerConnection.handleContainerClose(new PacketPlayInCloseWindow(getHandle().activeContainer.windowId), org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper
|
||
|
}
|
||
|
EntityPlayer player = (EntityPlayer) getHandle();
|
||
|
Container container;
|
||
|
@@ -445,8 +445,13 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
|
||
|
|
||
|
@Override
|
||
|
public void closeInventory() {
|
||
|
- getHandle().closeInventory();
|
||
|
+ // Paper start
|
||
|
+ getHandle().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.PLUGIN);
|
||
|
}
|
||
|
+ public void closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||
|
+ getHandle().closeInventory(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 2abd5157b0964fc02994ca7a9317d2fb5539dc1c..ee3fbf0789b4841a113727397ba6809b2600ff83 100644
|
||
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
|
@@ -898,7 +898,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||
|
|
||
|
// Close any foreign inventory
|
||
|
if (getHandle().activeContainer != getHandle().defaultContainer) {
|
||
|
- getHandle().closeInventory();
|
||
|
+ getHandle().closeInventory(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 69b5c76b312d055603ce62ad7b0c88cd01272ba9..7a245a0bc67ba7aaa986d20443d23e1a8a831dce 100644
|
||
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
||
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
||
|
@@ -1187,7 +1187,7 @@ public class CraftEventFactory {
|
||
|
|
||
|
public static Container callInventoryOpenEvent(EntityPlayer player, Container container, boolean cancelled) {
|
||
|
if (player.activeContainer != player.defaultContainer) { // fire INVENTORY_CLOSE if one already open
|
||
|
- player.playerConnection.a(new PacketPlayInCloseWindow(player.activeContainer.windowId));
|
||
|
+ player.playerConnection.handleContainerClose(new PacketPlayInCloseWindow(player.activeContainer.windowId), InventoryCloseEvent.Reason.OPEN_NEW); // Paper
|
||
|
}
|
||
|
|
||
|
CraftServer server = player.world.getServer();
|
||
|
@@ -1353,8 +1353,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(EntityHuman human) {
|
||
|
- InventoryCloseEvent event = new InventoryCloseEvent(human.activeContainer.getBukkitView());
|
||
|
+ handleInventoryCloseEvent(human, org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNKNOWN);
|
||
|
+ }
|
||
|
+ public static void handleInventoryCloseEvent(EntityHuman human, org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||
|
+ // Paper end
|
||
|
+ InventoryCloseEvent event = new InventoryCloseEvent(human.activeContainer.getBukkitView(), reason); // Paper
|
||
|
human.world.getServer().getPluginManager().callEvent(event);
|
||
|
human.activeContainer.transferTo(human.defaultContainer, human.getBukkitEntity());
|
||
|
}
|