mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: 9a129fa99 Add #getEligibleHumans to SkeletonHorseTrapEvent b5e23c7a6 Fix merging spawning values a932e8ad7 Turn off spigot verbose world by default 8ced89f65 Fix Delegation to vanilla chunk gen
134 lines
6.4 KiB
Diff
134 lines
6.4 KiB
Diff
From 0000000000000000000000000000000000000000 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] 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
|
|
}
|