mirror of
https://hub.spigotmc.org/stash/scm/spigot/spigot.git
synced 2025-09-18 21:33:01 +00:00

Instead of doing an unsafe cast, actually check if the HumanEntity supplied is a CraftHumanEntity. Plugins adding custom HumanEntities to the viewers of an inventory will end up crashing the server when the Chunk containing the block which contains the inventory unloads, since the original cast is unchecked here. I'm not sure if there was a reason for casting to CraftHumanEntity, so I kept it, but HumanEntity, as I'm sure you know, has a closeInventory() method you could call instead of getting the CraftBukkit handle. There's probably a reason behind it, though. I tried to follow the formatting conventions, but I may have missed something. Tested the easily reproducible issue using this patch compiled, and it works fine; no crashes in sight.
69 lines
2.9 KiB
Diff
69 lines
2.9 KiB
Diff
From 13bf7c59fcc316dd8adecba24c0dcbdc5b4ee654 Mon Sep 17 00:00:00 2001
|
|
From: md_5 <md_5@live.com.au>
|
|
Date: Thu, 27 Jun 2013 17:26:09 +1000
|
|
Subject: [PATCH] Properly Close Inventories
|
|
|
|
Properly close inventories when unloading and switching worlds.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index 40c878b..ab0af12 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -783,6 +783,18 @@ public class Chunk {
|
|
|
|
while (iterator.hasNext()) {
|
|
TileEntity tileentity = (TileEntity) iterator.next();
|
|
+ // Spigot Start
|
|
+ if ( tileentity instanceof IInventory )
|
|
+ {
|
|
+ for ( org.bukkit.entity.HumanEntity h : new ArrayList<org.bukkit.entity.HumanEntity>( (List) ( (IInventory) tileentity ).getViewers() ) )
|
|
+ {
|
|
+ if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity )
|
|
+ {
|
|
+ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory();
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ // Spigot End
|
|
|
|
this.world.a(tileentity);
|
|
}
|
|
@@ -792,6 +804,18 @@ public class Chunk {
|
|
java.util.Iterator<Object> iter = this.entitySlices[i].iterator();
|
|
while (iter.hasNext()) {
|
|
Entity entity = (Entity) iter.next();
|
|
+ // Spigot Start
|
|
+ if ( entity instanceof IInventory )
|
|
+ {
|
|
+ for ( org.bukkit.entity.HumanEntity h : new ArrayList<org.bukkit.entity.HumanEntity>( (List) ( (IInventory) entity ).getViewers() ) )
|
|
+ {
|
|
+ if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity )
|
|
+ {
|
|
+ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory();
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ // Spigot End
|
|
|
|
// Do not pass along players, as doing so can get them stuck outside of time.
|
|
// (which for example disables inventory icon updates and prevents block breaking)
|
|
diff --git a/src/main/java/net/minecraft/server/EntityMinecartContainer.java b/src/main/java/net/minecraft/server/EntityMinecartContainer.java
|
|
index 13b75ff..bf8e745 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityMinecartContainer.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityMinecartContainer.java
|
|
@@ -149,6 +149,12 @@ public abstract class EntityMinecartContainer extends EntityMinecartAbstract imp
|
|
}
|
|
|
|
public void b(int i) {
|
|
+ // Spigot Start
|
|
+ for ( HumanEntity human : new java.util.ArrayList<HumanEntity>( transaction ) )
|
|
+ {
|
|
+ human.closeInventory();
|
|
+ }
|
|
+ // Spigot End
|
|
this.b = false;
|
|
super.b(i);
|
|
}
|
|
--
|
|
1.9.1
|
|
|