mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-19 17:37:42 +01:00
More anvil controls
This commit is contained in:
134
patches/api/0033-More-anvil-controls.patch
Normal file
134
patches/api/0033-More-anvil-controls.patch
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
From b1ef79818f5336bb401f9a43c0c388a1670bf434 Mon Sep 17 00:00:00 2001
|
||||||
|
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
||||||
|
Date: Sun, 19 Apr 2020 00:25:09 -0500
|
||||||
|
Subject: [PATCH] More anvil controls
|
||||||
|
|
||||||
|
---
|
||||||
|
.../event/inventory/AnvilTakeResultEvent.java | 52 +++++++++++++++++++
|
||||||
|
.../inventory/AnvilUpdateResultEvent.java | 35 +++++++++++++
|
||||||
|
.../org/bukkit/inventory/AnvilInventory.java | 10 ++++
|
||||||
|
3 files changed, 97 insertions(+)
|
||||||
|
create mode 100644 src/main/java/net/pl3x/purpur/event/inventory/AnvilTakeResultEvent.java
|
||||||
|
create mode 100644 src/main/java/net/pl3x/purpur/event/inventory/AnvilUpdateResultEvent.java
|
||||||
|
|
||||||
|
diff --git a/src/main/java/net/pl3x/purpur/event/inventory/AnvilTakeResultEvent.java b/src/main/java/net/pl3x/purpur/event/inventory/AnvilTakeResultEvent.java
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..85663c0a4
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src/main/java/net/pl3x/purpur/event/inventory/AnvilTakeResultEvent.java
|
||||||
|
@@ -0,0 +1,52 @@
|
||||||
|
+package net.pl3x.purpur.event.inventory;
|
||||||
|
+
|
||||||
|
+import org.bukkit.entity.HumanEntity;
|
||||||
|
+import org.bukkit.entity.Player;
|
||||||
|
+import org.bukkit.event.HandlerList;
|
||||||
|
+import org.bukkit.event.inventory.InventoryEvent;
|
||||||
|
+import org.bukkit.inventory.AnvilInventory;
|
||||||
|
+import org.bukkit.inventory.InventoryView;
|
||||||
|
+import org.bukkit.inventory.ItemStack;
|
||||||
|
+import org.jetbrains.annotations.NotNull;
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Called when a player takes the result item out of an anvil
|
||||||
|
+ */
|
||||||
|
+public class AnvilTakeResultEvent extends InventoryEvent {
|
||||||
|
+ private static final HandlerList handlers = new HandlerList();
|
||||||
|
+ private final Player player;
|
||||||
|
+ private final ItemStack result;
|
||||||
|
+
|
||||||
|
+ public AnvilTakeResultEvent(@NotNull HumanEntity player, @NotNull InventoryView view, @NotNull ItemStack result) {
|
||||||
|
+ super(view);
|
||||||
|
+ this.player = (Player) player;
|
||||||
|
+ this.result = result;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @NotNull
|
||||||
|
+ public Player getPlayer() {
|
||||||
|
+ return player;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @NotNull
|
||||||
|
+ public ItemStack getResult() {
|
||||||
|
+ return result;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @NotNull
|
||||||
|
+ @Override
|
||||||
|
+ public AnvilInventory getInventory() {
|
||||||
|
+ return (AnvilInventory) super.getInventory();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @NotNull
|
||||||
|
+ @Override
|
||||||
|
+ public HandlerList getHandlers() {
|
||||||
|
+ return handlers;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @NotNull
|
||||||
|
+ public static HandlerList getHandlerList() {
|
||||||
|
+ return handlers;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
diff --git a/src/main/java/net/pl3x/purpur/event/inventory/AnvilUpdateResultEvent.java b/src/main/java/net/pl3x/purpur/event/inventory/AnvilUpdateResultEvent.java
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..2717ad82c
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src/main/java/net/pl3x/purpur/event/inventory/AnvilUpdateResultEvent.java
|
||||||
|
@@ -0,0 +1,35 @@
|
||||||
|
+package net.pl3x.purpur.event.inventory;
|
||||||
|
+
|
||||||
|
+import org.bukkit.event.HandlerList;
|
||||||
|
+import org.bukkit.event.inventory.InventoryEvent;
|
||||||
|
+import org.bukkit.inventory.AnvilInventory;
|
||||||
|
+import org.bukkit.inventory.InventoryView;
|
||||||
|
+import org.jetbrains.annotations.NotNull;
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Called when anvil slots change, triggering the result slot to be updated
|
||||||
|
+ */
|
||||||
|
+public class AnvilUpdateResultEvent extends InventoryEvent {
|
||||||
|
+ private static final HandlerList handlers = new HandlerList();
|
||||||
|
+
|
||||||
|
+ public AnvilUpdateResultEvent(@NotNull InventoryView view) {
|
||||||
|
+ super(view);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @NotNull
|
||||||
|
+ @Override
|
||||||
|
+ public AnvilInventory getInventory() {
|
||||||
|
+ return (AnvilInventory) super.getInventory();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @NotNull
|
||||||
|
+ @Override
|
||||||
|
+ public HandlerList getHandlers() {
|
||||||
|
+ return handlers;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @NotNull
|
||||||
|
+ public static HandlerList getHandlerList() {
|
||||||
|
+ return handlers;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
diff --git a/src/main/java/org/bukkit/inventory/AnvilInventory.java b/src/main/java/org/bukkit/inventory/AnvilInventory.java
|
||||||
|
index 4af562426..086d4b022 100644
|
||||||
|
--- a/src/main/java/org/bukkit/inventory/AnvilInventory.java
|
||||||
|
+++ b/src/main/java/org/bukkit/inventory/AnvilInventory.java
|
||||||
|
@@ -49,4 +49,14 @@ public interface AnvilInventory extends Inventory {
|
||||||
|
* @param levels the maximum experience cost
|
||||||
|
*/
|
||||||
|
void setMaximumRepairCost(int levels);
|
||||||
|
+
|
||||||
|
+ // Purpur start
|
||||||
|
+ boolean canBypassCost();
|
||||||
|
+
|
||||||
|
+ void setBypassCost(boolean bypassCost);
|
||||||
|
+
|
||||||
|
+ boolean canDoUnsafeEnchants();
|
||||||
|
+
|
||||||
|
+ void setDoUnsafeEnchants(boolean canDoUnsafeEnchants);
|
||||||
|
+ // Purpur end
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.24.0
|
||||||
|
|
||||||
132
patches/server/0122-More-anvil-controls.patch
Normal file
132
patches/server/0122-More-anvil-controls.patch
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
From aa6795c81c388dea7f26303c9082f3a31c5ce830 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
|
||||||
|
|
||||||
Reference in New Issue
Block a user