EpicBosses/plugin-modules/Core/src/com/songoda/epicbosses/panel/ShopPanel.java

134 lines
4.9 KiB
Java

package com.songoda.epicbosses.panel;
import com.songoda.core.hooks.EconomyManager;
import com.songoda.epicbosses.EpicBosses;
import com.songoda.epicbosses.entity.BossEntity;
import com.songoda.epicbosses.managers.BossEntityManager;
import com.songoda.epicbosses.managers.BossPanelManager;
import com.songoda.epicbosses.managers.files.BossesFileManager;
import com.songoda.epicbosses.utils.Debug;
import com.songoda.epicbosses.utils.Message;
import com.songoda.epicbosses.utils.NumberUtils;
import com.songoda.epicbosses.utils.ServerUtils;
import com.songoda.epicbosses.utils.itemstack.ItemStackUtils;
import com.songoda.epicbosses.utils.panel.Panel;
import com.songoda.epicbosses.utils.panel.base.PanelHandler;
import com.songoda.epicbosses.utils.panel.builder.PanelBuilder;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 17-Nov-18
*/
public class ShopPanel extends PanelHandler {
private BossEntityManager bossEntityManager;
private BossesFileManager bossesFileManager;
private EpicBosses plugin;
public ShopPanel(BossPanelManager bossPanelManager, PanelBuilder panelBuilder, EpicBosses plugin) {
super(bossPanelManager, panelBuilder);
this.plugin = plugin;
this.bossEntityManager = plugin.getBossEntityManager();
this.bossesFileManager = plugin.getBossesFileManager();
}
@Override
public void fillPanel(Panel panel) {
Map<String, BossEntity> currentEntities = this.bossesFileManager.getBossEntitiesMap();
Map<String, BossEntity> filteredMap = getFilteredMap(currentEntities);
List<String> entryList = new ArrayList<>(filteredMap.keySet());
int maxPage = panel.getMaxPage(filteredMap);
panel.setOnPageChange(((player, currentPage, requestedPage) -> {
if (requestedPage < 0 || requestedPage > maxPage) return false;
loadPage(panel, requestedPage, entryList, filteredMap);
return true;
}));
loadPage(panel, 0, entryList, filteredMap);
}
@Override
public void openFor(Player player) {
Panel panel = getPanelBuilder().getPanel();
ServerUtils.get().runTaskAsync(() -> fillPanel(panel));
panel.openFor(player);
}
private void loadPage(Panel panel, int page, List<String> entryList, Map<String, BossEntity> filteredMap) {
panel.loadPage(page, ((slot, realisticSlot) -> {
if (slot >= filteredMap.size()) {
panel.setItem(realisticSlot, new ItemStack(Material.AIR), e -> {
});
} else {
String name = entryList.get(slot);
BossEntity bossEntity = filteredMap.get(name);
ItemStack itemStack = this.bossEntityManager.getDisplaySpawnItem(bossEntity);
double price = bossEntity.getPrice();
if (itemStack == null) {
itemStack = new ItemStack(Material.BARRIER);
}
Map<String, String> replaceMap = new HashMap<>();
replaceMap.put("{name}", name);
replaceMap.put("{price}", NumberUtils.get().formatDouble(price));
ItemStackUtils.applyDisplayName(itemStack, this.plugin.getDisplay().getString("Display.Shop.name"), replaceMap);
ItemStackUtils.applyDisplayLore(itemStack, this.plugin.getDisplay().getStringList("Display.Shop.lore"), replaceMap);
panel.setItem(realisticSlot, itemStack, e -> {
ItemStack spawnItem = this.bossEntityManager.getSpawnItem(bossEntity);
Player player = (Player) e.getWhoClicked();
if (spawnItem == null) {
Debug.FAILED_TO_GIVE_SPAWN_EGG.debug(e.getWhoClicked().getName(), name);
return;
}
if (!player.isOp() && !EconomyManager.hasBalance(player, price)) {
Message.Boss_Shop_NotEnoughBalance.msg(player, NumberUtils.get().formatDouble(price));
return;
}
if (!player.isOp())
EconomyManager.withdrawBalance(player, price);
player.getInventory().addItem(spawnItem);
Message.Boss_Shop_Purchased.msg(player, spawnItem.getItemMeta().getDisplayName());
});
}
}));
}
private Map<String, BossEntity> getFilteredMap(Map<String, BossEntity> originalMap) {
Map<String, BossEntity> newMap = new HashMap<>();
originalMap.forEach((s, bossEntity) -> {
if (bossEntity.canBeBought()) {
newMap.put(s, bossEntity);
}
});
return newMap;
}
@Override
public void initializePanel(PanelBuilder panelBuilder) {
}
}