Skip to content

Commit f9fa15d

Browse files
committed
finally handle shift clicking
closes #89
1 parent 1a15fb9 commit f9fa15d

File tree

2 files changed

+89
-29
lines changed

2 files changed

+89
-29
lines changed

src/main/java/lol/hyper/toolstats/events/CraftItem.java

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,29 @@
1717

1818
package lol.hyper.toolstats.events;
1919

20+
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
2021
import lol.hyper.toolstats.ToolStats;
2122
import lol.hyper.toolstats.tools.UUIDDataType;
2223
import net.kyori.adventure.text.Component;
24+
import org.bukkit.Bukkit;
2325
import org.bukkit.GameMode;
2426
import org.bukkit.Material;
2527
import org.bukkit.entity.Player;
2628
import org.bukkit.event.EventHandler;
2729
import org.bukkit.event.EventPriority;
2830
import org.bukkit.event.Listener;
2931
import org.bukkit.event.inventory.CraftItemEvent;
32+
import org.bukkit.inventory.Inventory;
3033
import org.bukkit.inventory.ItemStack;
34+
import org.bukkit.inventory.PlayerInventory;
3135
import org.bukkit.inventory.meta.ItemMeta;
3236
import org.bukkit.persistence.PersistentDataContainer;
3337
import org.bukkit.persistence.PersistentDataType;
3438

3539
import java.util.ArrayList;
3640
import java.util.Date;
3741
import java.util.List;
42+
import java.util.function.Consumer;
3843

3944
public 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);

src/main/java/lol/hyper/toolstats/events/VillagerTrade.java

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import lol.hyper.toolstats.tools.UUIDDataType;
2222
import net.kyori.adventure.text.Component;
2323
import org.bukkit.GameMode;
24+
import org.bukkit.Material;
2425
import org.bukkit.entity.Player;
2526
import org.bukkit.event.EventHandler;
2627
import org.bukkit.event.EventPriority;
@@ -58,27 +59,55 @@ public void onTrade(InventoryClickEvent event) {
5859
return;
5960
}
6061
// only check villager inventories
61-
if (inventory instanceof MerchantInventory) {
62-
// only check the result slot (the item you receive)
63-
if (event.getSlotType() == InventoryType.SlotType.RESULT) {
64-
ItemStack item = event.getCurrentItem();
65-
// only check items we want
66-
if (!toolStats.itemChecker.isValidItem(item.getType())) {
67-
return;
68-
}
69-
// if the player shift clicks, show the warning
70-
if (event.isShiftClick()) {
71-
Component component = toolStats.configTools.formatLore("shift-click-warning.trading", null, null);
72-
if (component != null) {
73-
event.getWhoClicked().sendMessage(component);
62+
if (!(inventory instanceof MerchantInventory)) {
63+
return;
64+
}
65+
// only check the result slot (the item you receive)
66+
if (event.getSlotType() != InventoryType.SlotType.RESULT) {
67+
return;
68+
}
69+
ItemStack tradedItem = event.getCurrentItem();
70+
Material tradedMaterial = tradedItem.getType();
71+
// only check items we want
72+
if (!toolStats.itemChecker.isValidItem(tradedMaterial)) {
73+
return;
74+
}
75+
// if the player shift clicks
76+
if (event.isShiftClick()) {
77+
// store the player inventory before they trade the items
78+
ItemStack[] beforeTrade = player.getInventory().getContents();
79+
// run a tick after to see the changes
80+
player.getScheduler().runDelayed(toolStats, scheduledTask -> {
81+
// get their inventory after the trade
82+
ItemStack[] afterTrade = player.getInventory().getContents();
83+
for (int i = 0; i < afterTrade.length; i++) {
84+
ItemStack newSlotItem = afterTrade[i];
85+
ItemStack oldSlotItem = beforeTrade[i];
86+
87+
// if this slot is empty after trading, skip it
88+
if (newSlotItem == null) {
89+
continue;
90+
}
91+
92+
// if the item matches what we traded
93+
if (newSlotItem.getType() == tradedMaterial) {
94+
// if the slot was empty before we traded, this means we just traded it
95+
if (oldSlotItem == null) {
96+
// add the lore
97+
ItemStack newItem = addLore(newSlotItem, player);
98+
if (newItem != null) {
99+
player.getInventory().setItem(i, newItem);
100+
}
101+
}
74102
}
75103
}
76-
ItemStack newItem = addLore(item, player);
77-
if (newItem != null) {
78-
// set the new item
79-
inventory.setItem(event.getSlot(), newItem);
80-
}
81-
}
104+
}, null, 1);
105+
return;
106+
}
107+
ItemStack newItem = addLore(tradedItem, player);
108+
if (newItem != null) {
109+
// set the new item
110+
inventory.setItem(event.getSlot(), newItem);
82111
}
83112
}
84113

0 commit comments

Comments
 (0)