Fix some recipe book bugs introduced in 1.7. The full PR can be seen at Bukkit/CraftBukkit#1270

This commit is contained in:
md_5 2013-12-02 17:26:11 +11:00
parent 6a02ab857b
commit b388fe0ca1

View file

@ -0,0 +1,104 @@
From d764f77e317568fcf35a17d8b90135635b98e874 Mon Sep 17 00:00:00 2001
From: toastedtruth <brammero@gmail.com>
Date: Sun, 1 Dec 2013 23:18:16 +0000
Subject: [PATCH] Fix some recipe book bugs
Fix written books crashing the server. Fixes BUKKIT-4945
Fix BlockCanBuildEvent returning null. Fixes BUKKIT-4972
Due to obfuscation changes in 1.7.2, "l" is now the Material ID.
i j and k became the x y z coordinates, resulting in no ID being matched
for the Material.
This is corrected by swapping the values into the correct order.
diff --git a/src/main/java/net/minecraft/server/RecipeBookClone.java b/src/main/java/net/minecraft/server/RecipeBookClone.java
new file mode 100644
index 0000000..8182a5f
--- /dev/null
+++ b/src/main/java/net/minecraft/server/RecipeBookClone.java
@@ -0,0 +1,68 @@
+package net.minecraft.server;
+
+public class RecipeBookClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
+
+ // CraftBukkit start - Delegate to new parent class
+ public RecipeBookClone() {
+ super(new ItemStack(Items.WRITTEN_BOOK, 0, -1), java.util.Arrays.asList(new ItemStack(Items.BOOK_AND_QUILL, 0, 0)));
+ }
+ // CraftBukkit end
+
+ public boolean a(InventoryCrafting inventoryCrafting, World paramWorld) {
+ int i = 0;
+ ItemStack itemStack = null;
+ for (int j = 0; j < inventoryCrafting.getSize(); j++) {
+ ItemStack itemStack1 = inventoryCrafting.getItem(j);
+ if (itemStack1 != null) {
+ if (itemStack1.getItem() == Items.WRITTEN_BOOK) {
+ if (itemStack != null) {
+ return false;
+ }
+ itemStack = itemStack1;
+ } else if (itemStack1.getItem() == Items.BOOK_AND_QUILL) {
+ i++;
+ } else {
+ return false;
+ }
+ }
+ }
+ return (itemStack != null) && (i > 0);
+ }
+
+ public ItemStack a(InventoryCrafting inventoryCrafting) {
+ int i = 0;
+ ItemStack itemStack = null;
+ for (int j = 0; j < inventoryCrafting.getSize(); j++) {
+ ItemStack itemStack2 = inventoryCrafting.getItem(j);
+ if (itemStack2 != null) {
+ if (itemStack2.getItem() == Items.WRITTEN_BOOK) {
+ if (itemStack != null) {
+ return null;
+ }
+ itemStack = itemStack2;
+ } else if (itemStack2.getItem() == Items.BOOK_AND_QUILL) {
+ i++;
+ } else {
+ return null;
+ }
+ }
+ }
+ if ((itemStack == null) || (i < 1)) {
+ return null;
+ }
+ ItemStack itemStack1 = new ItemStack(Items.WRITTEN_BOOK, i + 1);
+ itemStack1.setTag((NBTTagCompound) itemStack.getTag().clone());
+ if (itemStack.hasName()) {
+ itemStack1.c(itemStack.getName());
+ }
+ return itemStack1;
+ }
+
+ public int a() {
+ return 9;
+ }
+
+ public ItemStack b() {
+ return null;
+ }
+}
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 81534e3..858004e 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -2483,7 +2483,7 @@ public abstract class World implements IBlockAccess {
boolean defaultReturn = axisalignedbb != null && !this.a(axisalignedbb, entity) ? false : (block1.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : block1.getMaterial().isReplaceable() && block.canPlace(this, i, j, k, l, itemstack));
// CraftBukkit start
- BlockCanBuildEvent event = new BlockCanBuildEvent(this.getWorld().getBlockAt(j, k, l), i, defaultReturn);
+ BlockCanBuildEvent event = new BlockCanBuildEvent(this.getWorld().getBlockAt(i, j, k), l, defaultReturn);
this.getServer().getPluginManager().callEvent(event);
return event.isBuildable();
--
1.8.3.2