package fr.maxlego08.items.sell; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Chest; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.java.JavaPlugin; import com.massivecraft.factions.FPlayers; import com.massivecraft.factions.Faction; import fr.maxlego08.items.ItemAdapter; import fr.maxlego08.items.save.Config; import fr.maxlego08.items.zcore.enums.Message; import fr.maxlego08.items.zcore.logger.Logger; import fr.maxlego08.items.zcore.utils.loader.ItemStackLoader; import fr.maxlego08.items.zcore.utils.loader.Loader; import fr.maxlego08.items.zcore.utils.storage.Persist; import fr.maxlego08.shop.api.IEconomy; import fr.maxlego08.shop.api.ShopManager; import fr.maxlego08.shop.api.button.buttons.ItemButton; import fr.maxlego08.shop.api.enums.Economy; public class SellManager extends ItemAdapter { private final ShopManager manager; private final String key = "sellKey"; private final String keyBoost = "keyBoost"; private final String duraKey = "sellDura"; private List messages = new ArrayList(); private List breakMessages = new ArrayList(); private List error = new ArrayList(); private Map items = new HashMap(); /** * @param plugin * @param fileName * @param manager */ public SellManager(JavaPlugin plugin, ShopManager manager) { super(plugin, "sellstick"); this.manager = manager; } @Override public void load(Persist persist) { if (fileName == null) return; YamlConfiguration configuration = getConfig(fileName + ".yml"); if (configuration == null) return; Loader loader = new ItemStackLoader(); ConfigurationSection configurationSection = configuration.getConfigurationSection("items."); for (String key : configurationSection.getKeys(false)) { String path = "items." + key + "."; int dura = configuration.getInt(path + "dura"); ItemStack itemStack = loader.load(configuration, path + "item."); String name = configuration.getString(path + "name"); double boost = configuration.getDouble(path + "boost"); SellItem item = new SellItem(itemStack, dura, boost); this.items.put(name, item); } Logger.info("Chargement de " + items.size() + " sellstick"); this.postLoad(configuration, loader); } @Override protected void postLoad(YamlConfiguration configuration, Loader loader) { messages = configuration.getStringList("messages"); if (messages != null) messages = color(messages); error = configuration.getStringList("error"); if (error != null) error = color(error); breakMessages = configuration.getStringList("breakMessages"); if (breakMessages != null) breakMessages = color(breakMessages); } public ItemStack getItemStack(boolean keepInventory, String name, int dura) { if (!this.items.containsKey(name)) return null; SellItem sellItem = this.items.get(name); ItemStack itemStack = sellItem.getItemStack().clone(); if (keepInventory) itemStack = setBoolean(itemStack, keepInventoryKey, true); itemStack = setInteger(itemStack, duraKey, dura == 0 ? sellItem.getDurability() : dura); itemStack = setString(itemStack, key, name); itemStack = setDouble(itemStack, keyBoost, sellItem.getBoost()); ItemMeta itemMeta = itemStack.getItemMeta(); if (itemMeta.hasDisplayName()) itemMeta.setDisplayName(itemMeta.getDisplayName().replace("%keepInventory%", keepInventory ? Config.isKeepInventory : Config.isNotKeepInventory)); if (itemMeta.hasLore()) itemMeta.setLore(itemMeta.getLore().stream().map(e -> { e = e.replace("%dura%", String.valueOf(dura == 0 ? sellItem.getDurability() : dura)); e = e.replace("%maxDura%", String.valueOf(sellItem.getDurability())); return e.replace("%keepInventory%", keepInventory ? Config.isKeepInventory : Config.isNotKeepInventory); }).collect(Collectors.toList())); itemStack.setItemMeta(itemMeta); return itemStack; } @SuppressWarnings("deprecation") @Override protected void onInteract(PlayerInteractEvent event, Player player) { if (event.getAction().equals(Action.LEFT_CLICK_AIR) || event.getAction().equals(Action.RIGHT_CLICK_AIR)) return; Block block = event.getClickedBlock(); Faction faction = FPlayers.getInstance().getByPlayer(player).getFaction(); if (!canBreak(block, faction, player)) return; ItemStack itemStack = player.getItemInHand(); if (isKey(itemStack, key) && (block.getType().equals(Material.CHEST) || block.getType().equals(Material.TRAPPED_CHEST))) { event.setCancelled(true); Chest chest = (Chest) block.getState(); Inventory inventory = chest.getInventory(); if (!sellContenst(inventory, player, getDouble(itemStack, keyBoost))) return; int dura = getInteger(itemStack, duraKey) - 1; if (dura <= 0) { if (breakMessages != null) breakMessages.forEach(message -> message(player, message)); player.setItemInHand(new ItemStack(Material.AIR)); player.updateInventory(); return; } boolean keepInventory = isKey(itemStack, keepInventoryKey); itemStack = getItemStack(keepInventory, getString(itemStack, key), dura); if (itemStack != null) { player.setItemInHand(itemStack); player.updateInventory(); } } } /** * * @param inventory * @param player * @return */ private boolean sellContenst(Inventory inventory, Player player, double boost) { double price = 0; long amount = 0; Economy economy = null; for (int a = 0; a != inventory.getContents().length; a++) { ItemStack itemStack = inventory.getContents()[a]; if (itemStack == null) continue; Optional optional = manager.getItemButton(itemStack); if (optional.isPresent()) { ItemButton button = optional.get(); if (!button.canSell()) continue; economy = button.getEconomy(); IEconomy iEconomy = button.getIEconomy(); double sellPrice = button.getSellPrice() * itemStack.getAmount() * boost; amount += itemStack.getAmount(); price += sellPrice; iEconomy.depositMoney(button.getEconomy(), player, sellPrice); inventory.setItem(a, new ItemStack(Material.AIR)); } } if (economy == null) { for (String e : error) message(player, e); return false; } else { for (String e : messages) { e = e.replace("%price%", format(price)); e = e.replace("%amount%", format(amount)); e = e.replace("%currency%", economy.getCurrenry()); message(player, e); } return true; } } public void setBreakMessages(List breakMessages) { this.breakMessages = breakMessages; } public void give(CommandSender sender, Player player, boolean keepInventory, String name) { ItemStack itemStack = getItemStack(keepInventory, name, 0); if (itemStack == null) { message(sender, "cImpossible de trouver l'item: f%s", name); return; } super.give(player, itemStack); message(sender, Message.ITEM_GIVE.getMessage().replace("%item%", name(itemStack.getType().name())) .replace("%player%", player.getName())); } public List names() { return new ArrayList<>(items.keySet()); } }