1717
1818package lol .hyper .toolstats .events ;
1919
20+ import io .papermc .paper .threadedregions .scheduler .ScheduledTask ;
2021import lol .hyper .toolstats .ToolStats ;
2122import lol .hyper .toolstats .tools .UUIDDataType ;
2223import net .kyori .adventure .text .Component ;
24+ import org .bukkit .Bukkit ;
2325import org .bukkit .GameMode ;
2426import org .bukkit .Material ;
2527import org .bukkit .entity .Player ;
2628import org .bukkit .event .EventHandler ;
2729import org .bukkit .event .EventPriority ;
2830import org .bukkit .event .Listener ;
2931import org .bukkit .event .inventory .CraftItemEvent ;
32+ import org .bukkit .inventory .Inventory ;
3033import org .bukkit .inventory .ItemStack ;
34+ import org .bukkit .inventory .PlayerInventory ;
3135import org .bukkit .inventory .meta .ItemMeta ;
3236import org .bukkit .persistence .PersistentDataContainer ;
3337import org .bukkit .persistence .PersistentDataType ;
3438
3539import java .util .ArrayList ;
3640import java .util .Date ;
3741import java .util .List ;
42+ import java .util .function .Consumer ;
3843
3944public class CraftItem implements Listener {
4045
@@ -53,25 +58,51 @@ public void onCraft(CraftItemEvent event) {
5358 if (player .getGameMode () == GameMode .CREATIVE || player .getGameMode () == GameMode .SPECTATOR ) {
5459 return ;
5560 }
56- ItemStack itemStack = event .getCurrentItem ();
57- if (itemStack == null || itemStack .getType () == Material .AIR ) {
61+ ItemStack craftedItem = event .getCurrentItem ();
62+ if (craftedItem == null || craftedItem .getType () == Material .AIR ) {
5863 return ;
5964 }
65+ Material craftedMaterial = craftedItem .getType ();
6066 // only check certain items
61- if (!toolStats .itemChecker .isValidItem (itemStack . getType () )) {
67+ if (!toolStats .itemChecker .isValidItem (craftedMaterial )) {
6268 return ;
6369 }
6470
65- // if the player shift clicks, send them this warning
71+ // if the player shift clicks
6672 if (event .isShiftClick ()) {
67- Component component = toolStats .configTools .formatLore ("shift-click-warning.crafting" , null , null );
68- if (component != null ) {
69- event .getWhoClicked ().sendMessage (component );
70- }
73+ // store the player inventory before they craft the items
74+ ItemStack [] beforeCraft = player .getInventory ().getContents ();
75+ // run a tick after to see the changes
76+ player .getScheduler ().runDelayed (toolStats , scheduledTask -> {
77+ // get their inventory after the craft
78+ ItemStack [] afterCraft = player .getInventory ().getContents ();
79+ for (int i = 0 ; i < afterCraft .length ; i ++) {
80+ ItemStack newSlotItem = afterCraft [i ];
81+ ItemStack oldSlotItem = beforeCraft [i ];
82+
83+ // if this slot is empty after crafting, skip it
84+ if (newSlotItem == null ) {
85+ continue ;
86+ }
87+
88+ // if the item matches what we crafted
89+ if (newSlotItem .getType () == craftedMaterial ) {
90+ // if the slot was empty before we crafted, this means we just made it
91+ if (oldSlotItem == null ) {
92+ // add the lore
93+ ItemStack newItem = addLore (newSlotItem , player );
94+ if (newItem != null ) {
95+ player .getInventory ().setItem (i , newItem );
96+ }
97+ }
98+ }
99+ }
100+ }, null , 1 );
101+ return ;
71102 }
72103
73- // test the item before setting it
74- ItemStack newItem = addLore (itemStack , player );
104+ // the player did not shift click
105+ ItemStack newItem = addLore (craftedItem , player );
75106 if (newItem != null ) {
76107 // set the result
77108 event .setCurrentItem (newItem );
0 commit comments