From 401a6809be71112f35f811fedb79e1210c87a656 Mon Sep 17 00:00:00 2001 From: Travis Watkins Date: Thu, 2 May 2013 06:05:54 -0500 Subject: [PATCH] Improve InventoryCloseEvent handling. Fixes BUKKIT-3286 Currently there are several cases where a player will have their inventory screen closed client side but we will not call an event. To correct this we call the event when the server is the cause of the inventory closing instead of just when the client is the cause. We also ensure the server is closing the inventory reliably so we get the events. Additionally this commit also calls the event when a player disconnects which will handle kicks, quits, and server shutdown. --- .../net/minecraft/server/EntityMinecartContainer.java | 6 ------ src/main/java/net/minecraft/server/EntityPlayer.java | 8 ++++++++ src/main/java/net/minecraft/server/PlayerConnection.java | 7 +------ src/main/java/net/minecraft/server/PlayerList.java | 2 ++ .../org/bukkit/craftbukkit/event/CraftEventFactory.java | 7 +++++++ 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityMinecartContainer.java b/src/main/java/net/minecraft/server/EntityMinecartContainer.java index 16a4745436..c207076d77 100644 --- a/src/main/java/net/minecraft/server/EntityMinecartContainer.java +++ b/src/main/java/net/minecraft/server/EntityMinecartContainer.java @@ -149,12 +149,6 @@ public abstract class EntityMinecartContainer extends EntityMinecartAbstract imp } public void c(int i) { - // CraftBukkit start - for (HumanEntity human : transaction) { - ((org.bukkit.craftbukkit.entity.CraftHumanEntity) human).getHandle().closeInventory(); - } - // CraftBukkit end - this.b = false; super.c(i); } diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java index 3b08937ac0..7de5b48b45 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java @@ -153,6 +153,13 @@ public class EntityPlayer extends EntityHuman implements ICrafting { --this.invulnerableTicks; this.activeContainer.b(); + // CraftBukkit start - Check inventory status every tick + if (!this.activeContainer.a(this)) { // Should be stillValid + this.closeInventory(); + this.activeContainer = this.defaultContainer; + } + // CraftBukkit end + while (!this.removeQueue.isEmpty()) { int i = Math.min(this.removeQueue.size(), 127); int[] aint = new int[i]; @@ -651,6 +658,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } public void closeInventory() { + CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit this.playerConnection.sendPacket(new Packet101CloseWindow(this.activeContainer.windowId)); this.j(); } diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java index 55873f591c..5d103824c8 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -27,7 +27,6 @@ import org.bukkit.event.Event; import org.bukkit.event.block.Action; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryType.SlotType; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerAnimationEvent; @@ -1144,11 +1143,7 @@ public class PlayerConnection extends Connection { public void handleContainerClose(Packet101CloseWindow packet101closewindow) { if (this.player.dead) return; // CraftBukkit - // CraftBukkit start - InventoryCloseEvent event = new InventoryCloseEvent(this.player.activeContainer.getBukkitView()); - server.getPluginManager().callEvent(event); - this.player.activeContainer.transferTo(this.player.defaultContainer, getPlayer()); - // CraftBukkit end + CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit this.player.j(); } diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java index 9e574becae..b7e327bc0f 100644 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ b/src/main/java/net/minecraft/server/PlayerList.java @@ -250,6 +250,8 @@ public abstract class PlayerList { if (entityplayer.playerConnection.disconnected) return null; // CraftBukkit - exploitsies fix // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it + org.bukkit.craftbukkit.event.CraftEventFactory.handleInventoryCloseEvent(entityplayer); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(this.cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.name + " left the game."); this.cserver.getPluginManager().callEvent(playerQuitEvent); entityplayer.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 07970c00d4..56582bc5ee 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -58,6 +58,7 @@ import org.bukkit.event.block.BlockIgniteEvent.IgniteCause; import org.bukkit.event.entity.*; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.PrepareItemCraftEvent; import org.bukkit.event.player.*; @@ -665,4 +666,10 @@ public class CraftEventFactory { world.getServer().getPluginManager().callEvent(event); return event; } + + public static void handleInventoryCloseEvent(EntityHuman human) { + InventoryCloseEvent event = new InventoryCloseEvent(human.activeContainer.getBukkitView()); + human.world.getServer().getPluginManager().callEvent(event); + human.activeContainer.transferTo(human.defaultContainer, human.getBukkitEntity()); + } }