Files
Purpur/patches/server/0112-More-anvil-controls.patch
William Blake Galbreath c0c212bf48 Updated Upstream (Paper)
Upstream has released updates that appears to apply and compile correctly

Paper Changes:
b75eeca0 Boost light task priority to ensure it doesnt hold up chunk loads
3d2bc848 Ensure VillagerTrades doesn't load async - fixes #3495
e470f1ef Add more information to Timing Reports
f4a47db6 Improve Thread Pool usage to allow single threads for single cpu servers
a4fe910f Fix sounds when using worldedit regen command
70ad51a8 Updated Upstream (Bukkit/CraftBukkit)
d7cfa4fa Improve legacy format serialization more
2020-06-05 21:42:48 -05:00

133 lines
6.1 KiB
Diff

From ce8a02f259fb4f0a02d036c03f84af8fe2334399 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sun, 19 Apr 2020 00:17:56 -0500
Subject: [PATCH] More anvil controls
---
.../net/minecraft/server/ContainerAnvil.java | 25 ++++++++++++++++---
.../inventory/CraftInventoryAnvil.java | 22 ++++++++++++++++
2 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/src/main/java/net/minecraft/server/ContainerAnvil.java b/src/main/java/net/minecraft/server/ContainerAnvil.java
index 286b930ddb..c34f1e02cb 100644
--- a/src/main/java/net/minecraft/server/ContainerAnvil.java
+++ b/src/main/java/net/minecraft/server/ContainerAnvil.java
@@ -8,6 +8,7 @@ import org.apache.logging.log4j.Logger;
// CraftBukkit start
import org.bukkit.craftbukkit.inventory.CraftInventoryView;
+import org.bukkit.inventory.AnvilInventory;
// CraftBukkit end
public class ContainerAnvil extends Container {
@@ -25,6 +26,8 @@ public class ContainerAnvil extends Container {
private int lastLevelCost;
private CraftInventoryView bukkitEntity;
private PlayerInventory playerInventory;
+ public boolean bypassCost = false; // Purpur
+ public boolean canDoUnsafeEnchants = false; // Purpur
// CraftBukkit end
public ContainerAnvil(int i, PlayerInventory playerinventory) {
@@ -56,12 +59,14 @@ public class ContainerAnvil extends Container {
@Override
public boolean isAllowed(EntityHuman entityhuman) {
- return (entityhuman.abilities.canInstantlyBuild || entityhuman.expLevel >= ContainerAnvil.this.levelCost.get()) && ContainerAnvil.this.levelCost.get() > 0 && this.hasItem();
+ return (entityhuman.abilities.canInstantlyBuild || entityhuman.expLevel >= ContainerAnvil.this.levelCost.get()) && (bypassCost || ContainerAnvil.this.levelCost.get() > 0) && this.hasItem(); // Purpur
}
@Override
public 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(-ContainerAnvil.this.levelCost.get());
}
@@ -136,6 +141,12 @@ public class ContainerAnvil extends Container {
}
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);
@@ -212,7 +223,7 @@ public class ContainerAnvil extends Container {
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;
@@ -224,7 +235,7 @@ public class ContainerAnvil extends Container {
Enchantment enchantment1 = (Enchantment) iterator1.next();
if (enchantment1 != enchantment && !enchantment.isCompatible(enchantment1)) {
- flag3 = false;
+ flag3 = canDoUnsafeEnchants; // Purpur
++i;
}
}
@@ -310,12 +321,18 @@ public class ContainerAnvil extends Container {
k2 = d(k2);
}
- itemstack1.setRepairCost(k2);
+ if (!bypassCost) itemstack1.setRepairCost(k2); // Purpur
EnchantmentManager.a(map, itemstack1);
}
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..db5e4f2bd1 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java
@@ -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
}
--
2.24.0