From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 19 Apr 2020 00:17:56 -0500 Subject: [PATCH] Anvil API diff --git a/src/main/java/net/minecraft/server/ContainerAnvil.java b/src/main/java/net/minecraft/server/ContainerAnvil.java index fc2038df89..4aa6b035a6 100644 --- a/src/main/java/net/minecraft/server/ContainerAnvil.java +++ b/src/main/java/net/minecraft/server/ContainerAnvil.java @@ -20,6 +20,8 @@ public class ContainerAnvil extends ContainerAnvilAbstract { public int maximumRepairCost = 40; private CraftInventoryView bukkitEntity; // CraftBukkit end + public boolean bypassCost = false; // Purpur + public boolean canDoUnsafeEnchants = false; // Purpur public ContainerAnvil(int i, PlayerInventory playerinventory) { this(i, playerinventory, ContainerAccess.a); @@ -38,12 +40,14 @@ public class ContainerAnvil extends ContainerAnvilAbstract { @Override protected boolean b(EntityHuman entityhuman, boolean flag) { - return (entityhuman.abilities.canInstantlyBuild || entityhuman.expLevel >= this.levelCost.get()) && this.levelCost.get() > 0; + return (entityhuman.abilities.canInstantlyBuild || entityhuman.expLevel >= this.levelCost.get()) && (bypassCost || this.levelCost.get() > 0); // Purpur } @Override protected ItemStack a(EntityHuman entityhuman, ItemStack itemstack) { + if (net.pl3x.purpur.event.inventory.AnvilTakeResultEvent.getHandlerList().getRegisteredListeners().length > 0) new net.pl3x.purpur.event.inventory.AnvilTakeResultEvent(entityhuman.getBukkitEntity(), getBukkitView(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack)).callEvent(); // Purpur if (!entityhuman.abilities.canInstantlyBuild) { + if (bypassCost) ((EntityPlayer) entityhuman).lastSentExp = -1; else // Purpur entityhuman.levelDown(-this.levelCost.get()); } @@ -94,6 +98,12 @@ public class ContainerAnvil extends ContainerAnvilAbstract { @Override public void e() { + // Purpur start + bypassCost = false; + canDoUnsafeEnchants = false; + if (net.pl3x.purpur.event.inventory.AnvilUpdateResultEvent.getHandlerList().getRegisteredListeners().length > 0) new net.pl3x.purpur.event.inventory.AnvilUpdateResultEvent(getBukkitView()).callEvent(); + // Purpur end + ItemStack itemstack = this.repairInventory.getItem(0); this.levelCost.set(1); @@ -170,7 +180,7 @@ public class ContainerAnvil extends ContainerAnvilAbstract { int i2 = (Integer) map1.get(enchantment); i2 = l1 == i2 ? i2 + 1 : Math.max(i2, l1); - boolean flag3 = enchantment.canEnchant(itemstack); + boolean flag3 = canDoUnsafeEnchants || enchantment.canEnchant(itemstack); // Purpur if (this.player.abilities.canInstantlyBuild || itemstack.getItem() == Items.ENCHANTED_BOOK) { flag3 = true; @@ -182,7 +192,7 @@ public class ContainerAnvil extends ContainerAnvilAbstract { Enchantment enchantment1 = (Enchantment) iterator1.next(); if (enchantment1 != enchantment && !enchantment.isCompatible(enchantment1)) { - flag3 = false; + flag3 = canDoUnsafeEnchants; // Purpur ++i; } } @@ -253,6 +263,13 @@ public class ContainerAnvil extends ContainerAnvilAbstract { this.levelCost.set(maximumRepairCost - 1); // CraftBukkit } + // Purpur start + if (bypassCost && levelCost.get() >= maximumRepairCost) { + itemstack.getOrCreateTagAndSet("Purpur.realCost", NBTTagInt.a(levelCost.get())); + levelCost.set(maximumRepairCost - 1); + } + // Purpur end + if (this.levelCost.get() >= maximumRepairCost && !this.player.abilities.canInstantlyBuild) { // CraftBukkit itemstack1 = ItemStack.b; } @@ -274,6 +291,12 @@ public class ContainerAnvil extends ContainerAnvilAbstract { org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareAnvilEvent(getBukkitView(), itemstack1); // CraftBukkit this.c(); + // Purpur start + if (canDoUnsafeEnchants && itemstack1 != ItemStack.NULL_ITEM) { + ((EntityPlayer) player).playerConnection.sendPacket(new PacketPlayOutSetSlot(windowId, 2, itemstack1)); + ((EntityPlayer) player).playerConnection.sendPacket(new PacketPlayOutWindowData(windowId, 0, levelCost.get())); + } + // Purpur end } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java index 9374c27061..d45f356be3 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java @@ -9,7 +9,7 @@ import org.bukkit.inventory.AnvilInventory; public class CraftInventoryAnvil extends CraftResultInventory implements AnvilInventory { private final Location location; - private final ContainerAnvil container; + public final ContainerAnvil container; // Purpur - private -> public public CraftInventoryAnvil(Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) { super(inventory, resultInventory); @@ -47,4 +47,26 @@ public class CraftInventoryAnvil extends CraftResultInventory implements AnvilIn Preconditions.checkArgument(levels >= 0, "Maximum repair cost must be positive (or 0)"); container.maximumRepairCost = levels; } + + // Purpur start + @Override + public boolean canBypassCost() { + return container.bypassCost; + } + + @Override + public void setBypassCost(boolean bypassCost) { + container.bypassCost = bypassCost; + } + + @Override + public boolean canDoUnsafeEnchants() { + return container.canDoUnsafeEnchants; + } + + @Override + public void setDoUnsafeEnchants(boolean canDoUnsafeEnchants) { + container.canDoUnsafeEnchants = canDoUnsafeEnchants; + } + // Purpur end }