From 69aecad8ffaaa88760f8c3b0b152cc80ec669eb0 Mon Sep 17 00:00:00 2001 From: Aikar Date: Wed, 26 Jul 2017 21:12:15 -0400 Subject: [PATCH] Fix Recipe Books diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java index 682211cdd..034081cbe 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -2027,12 +2027,6 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { public void a(PacketPlayInAutoRecipe packetplayinautorecipe) { PlayerConnectionUtils.ensureMainThread(packetplayinautorecipe, this, this.player.x()); this.player.resetIdleTimer(); - // CraftBukkit start - if (!player.getBukkitEntity().hasPermission("minecraft.autocraft")) { - player.getBukkitEntity().updateInventory(); - return; - } - // CraftBukkit end if (this.player.activeContainer.windowId == packetplayinautorecipe.a() && this.player.activeContainer.c(this.player)) { this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinautorecipe.a(), packetplayinautorecipe.b(), true)); Iterator iterator; @@ -2046,10 +2040,19 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { while (iterator.hasNext()) { packetplayinautorecipe_a = (PacketPlayInAutoRecipe.a) iterator.next(); itemstack = this.player.activeContainer.getSlot(packetplayinautorecipe_a.b).getItem(); - if (this.a(packetplayinautorecipe_a.a, itemstack)) { + // Paper start - improve validation + int toSlot = packetplayinautorecipe_a.c; + ItemStack to = toSlot != -1 ? this.player.inventory.getItem(toSlot) : ItemStack.a; + ItemStack ref = packetplayinautorecipe_a.a; + if (this.a(ref, itemstack) && (to.isEmpty() || this.a(ref, to)) && (ref.getCount() + to.getCount() <= ref.getMaxStackSize())) { + // Paper end i = packetplayinautorecipe_a.a.getCount(); if (packetplayinautorecipe_a.c == -1) { - this.player.drop(packetplayinautorecipe_a.a, true); + // Paper start + this.player.drop(itemstack, true); + this.player.activeContainer.setItem(packetplayinautorecipe_a.b, ItemStack.a); + continue; + // Paper end } else { ItemStack itemstack1 = this.player.inventory.getItem(packetplayinautorecipe_a.c); @@ -2066,6 +2069,12 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { itemstack.subtract(i); } } + // Paper start + else { + this.player.getBukkitEntity().updateInventory(); + return; + } + // Paper end } } @@ -2075,7 +2084,11 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { while (iterator.hasNext()) { packetplayinautorecipe_a = (PacketPlayInAutoRecipe.a) iterator.next(); itemstack = this.player.inventory.getItem(packetplayinautorecipe_a.c); - if (this.a(packetplayinautorecipe_a.a, itemstack)) { + // Paper start + ItemStack ref = packetplayinautorecipe_a.a; + ItemStack to = this.player.activeContainer.getSlot(packetplayinautorecipe_a.b).getItem(); + if (this.a(ref, itemstack) && (to.isEmpty() || this.a(ref, to)) && (ref.getCount() + to.getCount() <= ref.getMaxStackSize())) { + // Paper end i = packetplayinautorecipe_a.a.getCount(); if (itemstack.getCount() == i) { this.player.inventory.splitWithoutUpdate(packetplayinautorecipe_a.c); @@ -2083,8 +2096,17 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { itemstack.subtract(i); } - this.player.activeContainer.b(packetplayinautorecipe_a.b, packetplayinautorecipe_a.a); + // Paper start + if (to.isEmpty()) { + this.player.activeContainer.b(packetplayinautorecipe_a.b, packetplayinautorecipe_a.a); + } else { + to.add(i); + } + } else { + this.player.getBukkitEntity().updateInventory(); + return; } + // Paper end } } -- 2.13.0