SPIGOT-3272: Fix duplicate creative inventory

This change properly identifies the creative inventory as one with 5 crafting slots (as that's the default set in ContainerPlayer, and handled properly in other containers), instead of having the same inventory twice (which breaks slot identification).

By: Pokechu22 <Pokechu022@gmail.com>
This commit is contained in:
CraftBukkit/Spigot 2017-05-26 20:20:59 -07:00
parent 07fc30bf6d
commit a6491eb83e
2 changed files with 16 additions and 17 deletions

View file

@ -1421,7 +1421,7 @@
this.player.resetIdleTimer();
if (this.player.activeContainer.windowId == packetplayinenchantitem.a() && this.player.activeContainer.c(this.player) && !this.player.isSpectator()) {
this.player.activeContainer.a(this.player, packetplayinenchantitem.b());
@@ -993,7 +2001,46 @@
@@ -993,7 +2001,45 @@
}
boolean flag1 = packetplayinsetcreativeslot.a() >= 1 && packetplayinsetcreativeslot.a() <= 45;
@ -1430,8 +1430,7 @@
+ boolean flag2 = itemstack.isEmpty() || itemstack.getData() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty() && !invalidItems.contains(Item.getId(itemstack.getItem()));
+ if (flag || (flag1 && !ItemStack.matches(this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.a()).getItem(), packetplayinsetcreativeslot.getItemStack()))) { // Insist on valid slot
+ // CraftBukkit start - Call click event
+ org.bukkit.entity.HumanEntity player = this.player.getBukkitEntity();
+ InventoryView inventory = new CraftInventoryView(player, player.getInventory(), this.player.defaultContainer);
+ InventoryView inventory = this.player.defaultContainer.getBukkitView();
+ org.bukkit.inventory.ItemStack item = CraftItemStack.asBukkitCopy(packetplayinsetcreativeslot.getItemStack());
+
+ SlotType type = SlotType.QUICKBAR;
@ -1469,7 +1468,7 @@
if (flag1 && flag2) {
if (itemstack.isEmpty()) {
@@ -1017,6 +2064,7 @@
@@ -1017,6 +2063,7 @@
public void a(PacketPlayInTransaction packetplayintransaction) {
PlayerConnectionUtils.ensureMainThread(packetplayintransaction, this, this.player.x());
@ -1477,7 +1476,7 @@
Short oshort = (Short) this.k.get(this.player.activeContainer.windowId);
if (oshort != null && packetplayintransaction.b() == oshort.shortValue() && this.player.activeContainer.windowId == packetplayintransaction.a() && !this.player.activeContainer.c(this.player) && !this.player.isSpectator()) {
@@ -1027,6 +2075,7 @@
@@ -1027,6 +2074,7 @@
public void a(PacketPlayInUpdateSign packetplayinupdatesign) {
PlayerConnectionUtils.ensureMainThread(packetplayinupdatesign, this, this.player.x());
@ -1485,7 +1484,7 @@
this.player.resetIdleTimer();
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
BlockPosition blockposition = packetplayinupdatesign.a();
@@ -1043,14 +2092,30 @@
@@ -1043,14 +2091,30 @@
if (!tileentitysign.a() || tileentitysign.e() != this.player) {
this.minecraftServer.warning("Player " + this.player.getName() + " just tried to change non-editable sign");
@ -1517,7 +1516,7 @@
tileentitysign.update();
worldserver.notify(blockposition, iblockdata, iblockdata, 3);
@@ -1073,11 +2138,27 @@
@@ -1073,11 +2137,27 @@
public void a(PacketPlayInAbilities packetplayinabilities) {
PlayerConnectionUtils.ensureMainThread(packetplayinabilities, this, this.player.x());
@ -1546,7 +1545,7 @@
ArrayList arraylist = Lists.newArrayList();
Iterator iterator = this.minecraftServer.tabCompleteCommand(this.player, packetplayintabcomplete.a(), packetplayintabcomplete.b(), packetplayintabcomplete.c()).iterator();
@@ -1103,6 +2184,13 @@
@@ -1103,6 +2183,13 @@
ItemStack itemstack1;
if ("MC|BEdit".equals(s)) {
@ -1560,7 +1559,7 @@
packetdataserializer = packetplayincustompayload.b();
try {
@@ -1121,15 +2209,25 @@
@@ -1121,15 +2208,25 @@
}
if (itemstack.getItem() == Items.WRITABLE_BOOK && itemstack.getItem() == itemstack1.getItem()) {
@ -1586,7 +1585,7 @@
packetdataserializer = packetplayincustompayload.b();
try {
@@ -1163,10 +2261,11 @@
@@ -1163,10 +2260,11 @@
}
itemstack2.a("pages", (NBTBase) nbttaglist);
@ -1599,7 +1598,7 @@
}
} else if ("MC|TrSel".equals(s)) {
try {
@@ -1178,6 +2277,7 @@
@@ -1178,6 +2276,7 @@
}
} catch (Exception exception2) {
PlayerConnection.LOGGER.error("Couldn\'t select trade", exception2);
@ -1607,7 +1606,7 @@
}
} else {
TileEntity tileentity;
@@ -1227,6 +2327,7 @@
@@ -1227,6 +2326,7 @@
}
} catch (Exception exception3) {
PlayerConnection.LOGGER.error("Couldn\'t set command block", exception3);
@ -1615,7 +1614,7 @@
}
} else if ("MC|AutoCmd".equals(s)) {
if (!this.minecraftServer.getEnableCommandBlock()) {
@@ -1294,6 +2395,7 @@
@@ -1294,6 +2394,7 @@
}
} catch (Exception exception4) {
PlayerConnection.LOGGER.error("Couldn\'t set command block", exception4);
@ -1623,7 +1622,7 @@
}
} else {
int k;
@@ -1317,6 +2419,7 @@
@@ -1317,6 +2418,7 @@
}
} catch (Exception exception5) {
PlayerConnection.LOGGER.error("Couldn\'t set beacon", exception5);
@ -1631,7 +1630,7 @@
}
}
} else if ("MC|ItemName".equals(s)) {
@@ -1403,6 +2506,7 @@
@@ -1403,6 +2505,7 @@
}
} catch (Exception exception6) {
PlayerConnection.LOGGER.error("Couldn\'t set structure block", exception6);
@ -1639,7 +1638,7 @@
}
} else if ("MC|PickItem".equals(s)) {
packetdataserializer = packetplayincustompayload.b();
@@ -1415,11 +2519,49 @@
@@ -1415,11 +2518,49 @@
this.player.playerConnection.sendPacket(new PacketPlayOutHeldItemSlot(this.player.inventory.itemInHandIndex));
} catch (Exception exception7) {
PlayerConnection.LOGGER.error("Couldn\'t pick item", exception7);

View file

@ -127,7 +127,7 @@ public class CraftInventoryView extends InventoryView {
} else {
if (slot == -999 || slot == -1) {
type = SlotType.OUTSIDE;
} else if (inventory.getType() == InventoryType.CRAFTING) {
} else if (inventory.getType() == InventoryType.CRAFTING) { // Also includes creative inventory
if (slot < 9) {
type = SlotType.ARMOR;
} else if (slot > 35) {