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

Paper Changes:
8ce3dd5f [CI-SKIP] Fix Mojang API Brigadier dep - THIS IS NOT A NEW BUILD
00d760a5 Fix build due to spigot changing the build timestamp process
842e040c Updated Upstream (Bukkit/CraftBukkit/Spigot)
c03260a2 Add getter and setter for villager's numberOfRestocksToday (#3231)
fe366fbe null check tracker for entity metadata update - Fixes #3070
fdf41b74 Implement Brigadier Mojang API
e0ea2e0e Entity Activation Range 2.0! Major improvements to restoring behavior
10396d28 Fix Tracking Range mismatch on Vehicle/Passenger checks
2020-04-28 20:14:57 -05:00

133 lines
6.1 KiB
Diff

From fd938ddd4e59b2a4be5cecddf376911cc7e6656b 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 286b930dd..c34f1e02c 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 9374c2706..db5e4f2bd 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