11package com .github .jikoo .enchantableblocks .enchanting ;
22
33import com .github .jikoo .enchantableblocks .EnchantableBlocksPlugin ;
4-
54import 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 ;
610import org .bukkit .Material ;
711import org .bukkit .enchantments .Enchantment ;
812import org .bukkit .enchantments .EnchantmentOffer ;
1115import org .bukkit .event .Listener ;
1216import org .bukkit .event .enchantment .EnchantItemEvent ;
1317import 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