Skip to content

Commit 4d294b7

Browse files
committed
Always update window properties
Instead of relying on Spigot to update or maintain window properties that the client disagrees with, manually update them to prevent desync. Closes #6
1 parent dbf8d32 commit 4d294b7

3 files changed

Lines changed: 49 additions & 9 deletions

File tree

pom.xml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@
77
<groupId>com.github.jikoo</groupId>
88
<artifactId>enchantableblocks</artifactId>
99
<name>EnchantableBlocks</name>
10-
<version>2.0.4</version>
10+
<version>2.0.5</version>
1111
<packaging>jar</packaging>
1212

13+
<properties>
14+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15+
</properties>
16+
1317
<repositories>
1418
<repository>
1519
<id>spigot-repo</id>
@@ -26,7 +30,7 @@
2630
<dependency>
2731
<groupId>org.spigotmc</groupId>
2832
<artifactId>spigot-api</artifactId>
29-
<version>1.14-R0.1-SNAPSHOT</version>
33+
<version>1.15.2-R0.1-SNAPSHOT</version>
3034
<scope>provided</scope>
3135
</dependency>
3236
<dependency>
@@ -52,7 +56,7 @@
5256
<plugin>
5357
<groupId>org.apache.maven.plugins</groupId>
5458
<artifactId>maven-shade-plugin</artifactId>
55-
<version>3.1.0</version>
59+
<version>3.2.2</version>
5660
<configuration>
5761
<minimizeJar>true</minimizeJar>
5862
</configuration>

src/main/java/com/github/jikoo/enchantableblocks/enchanting/AnvilEnchanter.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.bukkit.event.Listener;
1111
import org.bukkit.event.inventory.PrepareAnvilEvent;
1212
import org.bukkit.inventory.AnvilInventory;
13+
import org.bukkit.inventory.InventoryView;
1314
import org.bukkit.inventory.ItemStack;
1415
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
1516
import org.bukkit.inventory.meta.ItemMeta;
@@ -140,7 +141,10 @@ public void onPrepareAnvil(PrepareAnvilEvent event) {
140141

141142
event.setResult(result);
142143
final int repairCost = cost;
143-
plugin.getServer().getScheduler().runTask(plugin, () -> inventory.setRepairCost(repairCost));
144+
plugin.getServer().getScheduler().runTask(plugin, () -> {
145+
inventory.setRepairCost(repairCost);
146+
clicker.setWindowProperty(InventoryView.Property.REPAIR_COST, repairCost);
147+
});
144148
}
145149

146150
private int getEnchantmentMultiplier(final Enchantment enchantment, final boolean book) {

src/main/java/com/github/jikoo/enchantableblocks/enchanting/TableEnchanter.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.github.jikoo.enchantableblocks.enchanting;
22

33
import com.github.jikoo.enchantableblocks.EnchantableBlocksPlugin;
4-
54
import com.github.jikoo.enchantableblocks.block.EnchantableFurnace;
5+
import java.lang.reflect.Method;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
import java.util.UUID;
9+
import org.bukkit.Bukkit;
610
import org.bukkit.Material;
711
import org.bukkit.enchantments.Enchantment;
812
import org.bukkit.enchantments.EnchantmentOffer;
@@ -11,10 +15,7 @@
1115
import org.bukkit.event.Listener;
1216
import org.bukkit.event.enchantment.EnchantItemEvent;
1317
import org.bukkit.event.enchantment.PrepareItemEnchantEvent;
14-
15-
import java.util.HashMap;
16-
import java.util.Map;
17-
import java.util.UUID;
18+
import org.bukkit.inventory.InventoryView;
1819

1920
/**
2021
* Listener for handling enchanting in an enchantment table.
@@ -113,6 +114,19 @@ public void onPrepareItemEnchant(final PrepareItemEnchantEvent event) {
113114
return materialOffers;
114115
});
115116

117+
// Force button refresh
118+
Bukkit.getScheduler().runTaskLater(plugin, () -> {
119+
event.getEnchanter().setWindowProperty(InventoryView.Property.ENCHANT_BUTTON1, event.getOffers()[0].getCost());
120+
event.getEnchanter().setWindowProperty(InventoryView.Property.ENCHANT_BUTTON2, event.getOffers()[1].getCost());
121+
event.getEnchanter().setWindowProperty(InventoryView.Property.ENCHANT_BUTTON3, event.getOffers()[2].getCost());
122+
event.getEnchanter().setWindowProperty(InventoryView.Property.ENCHANT_LEVEL1, event.getOffers()[0].getEnchantmentLevel());
123+
event.getEnchanter().setWindowProperty(InventoryView.Property.ENCHANT_LEVEL2, event.getOffers()[1].getEnchantmentLevel());
124+
event.getEnchanter().setWindowProperty(InventoryView.Property.ENCHANT_LEVEL3, event.getOffers()[2].getEnchantmentLevel());
125+
event.getEnchanter().setWindowProperty(InventoryView.Property.ENCHANT_ID1, getEnchantmentId(event.getOffers()[0].getEnchantment()));
126+
event.getEnchanter().setWindowProperty(InventoryView.Property.ENCHANT_ID2, getEnchantmentId(event.getOffers()[1].getEnchantment()));
127+
event.getEnchanter().setWindowProperty(InventoryView.Property.ENCHANT_ID3, getEnchantmentId(event.getOffers()[2].getEnchantment()));
128+
}, 1L);
129+
116130
}
117131

118132

@@ -139,4 +153,22 @@ public void onEnchantItemSucceed(final EnchantItemEvent event) {
139153
this.enchantmentOffers.remove(uuid);
140154
}
141155

156+
private int getEnchantmentId(Enchantment enchantment) {
157+
String[] split = Bukkit.getServer().getClass().getPackage().getName().split("\\.");
158+
String nmsVersion = split[split.length - 1];
159+
160+
try {
161+
Class<?> clazzIRegistry = Class.forName("net.minecraft.server." + nmsVersion + ".IRegistry");
162+
Object enchantmentRegistry = clazzIRegistry.getDeclaredField("ENCHANTMENT").get(null);
163+
Method methodIRegistry_a = clazzIRegistry.getDeclaredMethod("a", Object.class);
164+
165+
Class<?> clazzCraftEnchant = Class.forName("org.bukkit.craftbukkit." + nmsVersion + ".enchantments.CraftEnchantment");
166+
Method methodCraftEnchant_getRaw = clazzCraftEnchant.getDeclaredMethod("getRaw", Enchantment.class);
167+
168+
return (int) methodIRegistry_a.invoke(enchantmentRegistry, methodCraftEnchant_getRaw.invoke(null, enchantment));
169+
} catch (ReflectiveOperationException e) {
170+
return 0;
171+
}
172+
}
173+
142174
}

0 commit comments

Comments
 (0)