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<String> messages = new ArrayList<String>();
private List<String> breakMessages = new ArrayList<String>();
private List<String> error = new ArrayList<String>();
private Map<String, SellItem> items = new HashMap<String, SellItem>();
/**
* @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<ItemStack> 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<ItemStack> 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<ItemButton> 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<String> 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<String> names() {
return new ArrayList<>(items.keySet());
}
}
Comments