2019-02-19 14:23:20 +01:00
|
|
|
package com.songoda.epicenchants.menus;
|
|
|
|
|
2022-03-18 20:35:14 +01:00
|
|
|
import com.songoda.core.third_party.de.tr7zw.nbtapi.NBTCompound;
|
|
|
|
import com.songoda.core.third_party.de.tr7zw.nbtapi.NBTItem;
|
2019-02-19 14:23:20 +01:00
|
|
|
import com.songoda.epicenchants.EpicEnchants;
|
|
|
|
import com.songoda.epicenchants.enums.ItemType;
|
|
|
|
import com.songoda.epicenchants.objects.Enchant;
|
|
|
|
import com.songoda.epicenchants.utils.objects.FastInv;
|
|
|
|
import com.songoda.epicenchants.utils.objects.ItemBuilder;
|
|
|
|
import org.bukkit.Material;
|
|
|
|
import org.bukkit.configuration.ConfigurationSection;
|
|
|
|
import org.bukkit.configuration.file.FileConfiguration;
|
|
|
|
import org.bukkit.event.inventory.InventoryType;
|
|
|
|
import org.bukkit.inventory.Inventory;
|
|
|
|
import org.bukkit.inventory.ItemStack;
|
|
|
|
|
2019-08-04 23:49:57 +02:00
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Objects;
|
|
|
|
import java.util.Optional;
|
2019-03-21 15:35:12 +01:00
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
2019-02-19 14:23:20 +01:00
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
2020-09-30 23:05:18 +02:00
|
|
|
import static com.songoda.epicenchants.enums.ItemType.BOOK;
|
|
|
|
import static com.songoda.epicenchants.enums.ItemType.ENCHANTED;
|
|
|
|
import static com.songoda.epicenchants.enums.ItemType.NONE;
|
2019-08-04 23:49:57 +02:00
|
|
|
import static com.songoda.epicenchants.utils.single.GeneralUtils.color;
|
|
|
|
import static com.songoda.epicenchants.utils.single.GeneralUtils.getSlots;
|
2019-02-19 14:23:20 +01:00
|
|
|
import static java.util.Arrays.stream;
|
|
|
|
|
|
|
|
public class TinkererMenu extends FastInv {
|
|
|
|
private final Map<Integer, Integer> slotMap;
|
|
|
|
private final EpicEnchants instance;
|
|
|
|
private final FileConfiguration config;
|
|
|
|
|
|
|
|
public TinkererMenu(EpicEnchants instance, FileConfiguration config) {
|
|
|
|
super(config.getInt("rows") * 9, color(config.getString("title")));
|
|
|
|
|
|
|
|
this.slotMap = getSlotMap(config);
|
|
|
|
this.instance = instance;
|
|
|
|
this.config = config;
|
|
|
|
|
2019-03-21 15:35:12 +01:00
|
|
|
AtomicBoolean accepted = new AtomicBoolean(false);
|
|
|
|
|
2019-02-19 14:23:20 +01:00
|
|
|
if (config.isConfigurationSection("fill")) {
|
|
|
|
fill(new ItemBuilder(config.getConfigurationSection("fill")).build());
|
|
|
|
}
|
|
|
|
|
|
|
|
config.getConfigurationSection("contents").getKeys(false)
|
|
|
|
.stream()
|
|
|
|
.map(s -> "contents." + s)
|
|
|
|
.map(config::getConfigurationSection)
|
|
|
|
.forEach(section -> {
|
|
|
|
addItem(getSlots(section.getString("slot")), new ItemBuilder(section).build(), event -> {
|
|
|
|
if (section.getName().equalsIgnoreCase("accept-left") || section.getName().equalsIgnoreCase("accept-right")) {
|
|
|
|
slotMap.values().stream().map(slot -> getInventory().getItem(slot)).filter(Objects::nonNull).forEach(event.getPlayer().getInventory()::addItem);
|
|
|
|
slotMap.keySet().forEach(slot -> getInventory().clear(slot));
|
2019-04-03 15:58:13 +02:00
|
|
|
accepted.set(true);
|
2019-02-19 14:23:20 +01:00
|
|
|
event.getPlayer().closeInventory();
|
2019-08-04 23:49:57 +02:00
|
|
|
instance.getLocale().getMessage("tinkerer.accepted").sendPrefixedMessage(event.getPlayer());
|
2019-02-19 14:23:20 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (section.getName().equalsIgnoreCase("deposit-all")) {
|
|
|
|
int count = (int) stream(event.getPlayer().getInventory().getContents()).filter(i -> isTinkerable(i) != NONE).count();
|
|
|
|
|
|
|
|
if (count == 0) {
|
2019-08-04 23:49:57 +02:00
|
|
|
instance.getLocale().getMessage("tinkerer.noitems").sendPrefixedMessage(event.getPlayer());
|
2019-02-19 14:23:20 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Inventory inventory = event.getPlayer().getInventory();
|
|
|
|
|
|
|
|
int amount = 0;
|
|
|
|
|
2019-03-05 16:59:00 +01:00
|
|
|
outer:
|
2019-02-19 14:23:20 +01:00
|
|
|
for (int i = 0; i < inventory.getSize(); i++) {
|
|
|
|
ItemStack itemStack = inventory.getItem(i);
|
|
|
|
ItemType itemType = isTinkerable(itemStack);
|
|
|
|
|
|
|
|
if (itemType == NONE) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2019-03-05 16:59:00 +01:00
|
|
|
int toSet = itemStack.getAmount();
|
|
|
|
|
2019-02-19 14:23:20 +01:00
|
|
|
for (int j = 0; j < itemStack.getAmount(); j++) {
|
|
|
|
if (!handleItem(itemStack, itemType)) {
|
2019-03-05 16:59:00 +01:00
|
|
|
continue outer;
|
2019-02-19 14:23:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
amount++;
|
2019-03-05 16:59:00 +01:00
|
|
|
toSet--;
|
|
|
|
}
|
2019-02-19 14:23:20 +01:00
|
|
|
|
2019-03-05 16:59:00 +01:00
|
|
|
if (toSet < 1) {
|
2019-02-19 14:23:20 +01:00
|
|
|
inventory.clear(i);
|
2019-03-05 16:59:00 +01:00
|
|
|
continue;
|
2019-02-19 14:23:20 +01:00
|
|
|
}
|
2019-03-05 16:59:00 +01:00
|
|
|
|
|
|
|
itemStack.setAmount(toSet);
|
|
|
|
inventory.setItem(i, itemStack);
|
2019-02-19 14:23:20 +01:00
|
|
|
}
|
|
|
|
|
2019-08-04 23:49:57 +02:00
|
|
|
instance.getLocale().getMessage("tinkerer.depositedall")
|
|
|
|
.processPlaceholder("amount", amount)
|
|
|
|
.sendPrefixedMessage(event.getPlayer());
|
2019-02-19 14:23:20 +01:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
// Player clicked an item in tinkerer
|
|
|
|
onClick(event -> {
|
2019-04-03 15:58:13 +02:00
|
|
|
if (event.getEvent().getClickedInventory() == null && event.getInventory().equals(this)) {
|
2019-02-19 14:23:20 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int slot = event.getSlot();
|
|
|
|
|
|
|
|
if (!slotMap.keySet().contains(slot)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (getInventory().getItem(slot) != null && getInventory().getItem(slot).getType() != Material.AIR) {
|
|
|
|
event.getPlayer().getInventory().addItem(getInventory().getItem(slot));
|
|
|
|
getInventory().clear(slot);
|
|
|
|
getInventory().clear(slotMap.get(slot));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Player clicked his own inv
|
|
|
|
onClick(event -> {
|
|
|
|
if (event.getEvent().getClickedInventory() == null || event.getEvent().getClickedInventory().getType() != InventoryType.PLAYER) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ItemStack itemStack = event.getItem();
|
|
|
|
ItemType itemType = isTinkerable(itemStack);
|
|
|
|
|
|
|
|
if (itemType == NONE) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (handleItem(itemStack, itemType)) {
|
|
|
|
if (itemStack.getAmount() > 1) {
|
|
|
|
itemStack.setAmount(itemStack.getAmount() - 1);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
event.getEvent().getClickedInventory().clear(event.getEvent().getSlot());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2019-03-21 15:35:12 +01:00
|
|
|
// Player closed inventory
|
2019-03-05 16:59:00 +01:00
|
|
|
onClose(event -> {
|
|
|
|
slotMap.keySet().stream().filter(s -> getInventory().getItem(s) != null).forEach(s -> {
|
|
|
|
event.getPlayer().getInventory().addItem(getInventory().getItem(s));
|
|
|
|
});
|
|
|
|
|
2019-03-21 15:35:12 +01:00
|
|
|
if (!accepted.get())
|
2019-08-04 23:49:57 +02:00
|
|
|
instance.getLocale().getMessage("tinkerer.cancelled").sendPrefixedMessage(event.getPlayer());
|
2019-03-05 16:59:00 +01:00
|
|
|
});
|
2019-02-19 14:23:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private ItemType isTinkerable(ItemStack itemStack) {
|
|
|
|
if (itemStack == null || itemStack.getType() == Material.AIR) {
|
|
|
|
return NONE;
|
|
|
|
}
|
|
|
|
|
2022-03-18 20:35:14 +01:00
|
|
|
NBTItem nbtItem = new NBTItem(itemStack);
|
2019-02-19 14:23:20 +01:00
|
|
|
|
2022-03-18 20:35:14 +01:00
|
|
|
if (nbtItem.hasKey("book-item")) {
|
2019-02-19 14:23:20 +01:00
|
|
|
return BOOK;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!instance.getHookManager().getUltimateBottles().isPresent()) {
|
|
|
|
return NONE;
|
|
|
|
}
|
|
|
|
|
2019-08-05 04:24:48 +02:00
|
|
|
if (!itemStack.getEnchantments().isEmpty() || (nbtItem.getCompound("enchants") != null && !nbtItem.getCompound("enchants").getKeys().isEmpty())) {
|
2019-02-19 14:23:20 +01:00
|
|
|
if (getExpAmount(itemStack) == 0) {
|
|
|
|
return NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ENCHANTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean handleItem(ItemStack itemStack, ItemType itemType) {
|
2019-03-05 16:59:00 +01:00
|
|
|
Optional<Map.Entry<Integer, Integer>> emptySlot = slotMap.entrySet().stream()
|
|
|
|
.filter(slot -> getInventory().getItem(slot.getKey()) == null || getInventory().getItem(slot.getKey()).getType() == Material.AIR)
|
|
|
|
.findFirst();
|
2019-02-19 14:23:20 +01:00
|
|
|
|
|
|
|
if (!emptySlot.isPresent()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
ItemStack finalItemStack = itemStack.clone();
|
|
|
|
finalItemStack.setAmount(1);
|
|
|
|
|
|
|
|
addItem(emptySlot.get().getKey(), finalItemStack);
|
|
|
|
|
|
|
|
switch (itemType) {
|
|
|
|
case BOOK:
|
2022-03-18 20:35:14 +01:00
|
|
|
getInventory().setItem(emptySlot.get().getValue(), instance.getSpecialItems().getSecretDust(new NBTItem(finalItemStack)));
|
2019-02-19 14:23:20 +01:00
|
|
|
break;
|
|
|
|
case ENCHANTED:
|
|
|
|
getInventory().setItem(emptySlot.get().getValue(), instance.getHookManager().getUltimateBottles().get().createBottle("Tinkerer", getExpAmount(finalItemStack)));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
private LinkedHashMap<Integer, Integer> getSlotMap(FileConfiguration config) {
|
|
|
|
return stream(config.getString("slots").split(" ")).map(s -> s.replace(")", "").replace("(", ""))
|
|
|
|
.collect(Collectors.toMap(
|
|
|
|
s -> Integer.parseInt(s.split(",")[0]),
|
|
|
|
s -> Integer.parseInt(s.split(",")[1]),
|
|
|
|
(u, v) -> {
|
|
|
|
throw new IllegalStateException(String.format("Duplicate key %s", u));
|
|
|
|
},
|
|
|
|
LinkedHashMap::new)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
private int getExpAmount(ItemStack itemStack) {
|
|
|
|
AtomicInteger total = new AtomicInteger();
|
|
|
|
ConfigurationSection section = config.getConfigurationSection("exp-table-per-level");
|
|
|
|
|
|
|
|
itemStack.getEnchantments().forEach((enchantment, level) -> {
|
|
|
|
total.addAndGet(section.getInt(enchantment.getName(), section.getInt("DEFAULT")) * level);
|
|
|
|
});
|
|
|
|
|
2022-03-18 20:35:14 +01:00
|
|
|
NBTItem nbtItem = new NBTItem(itemStack);
|
2019-02-19 14:23:20 +01:00
|
|
|
|
2022-03-18 20:35:14 +01:00
|
|
|
if (!nbtItem.hasKey("enchants")) {
|
2019-02-19 14:23:20 +01:00
|
|
|
return total.get();
|
|
|
|
}
|
|
|
|
|
2019-08-05 04:24:48 +02:00
|
|
|
NBTCompound enchantments = nbtItem.getCompound("enchants");
|
2019-02-19 14:23:20 +01:00
|
|
|
|
|
|
|
if (enchantments == null) {
|
|
|
|
return total.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
enchantments.getKeys().forEach(key -> {
|
|
|
|
Enchant enchant = instance.getEnchantManager().getValueUnsafe(key);
|
2022-03-18 20:35:14 +01:00
|
|
|
total.addAndGet(section.getInt(enchant.getIdentifier(), enchant.getGroup().getTinkererExp()) * enchantments.getInteger(key));
|
2019-02-19 14:23:20 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
return total.get();
|
|
|
|
}
|
|
|
|
}
|