EpicFurnaces/src/main/java/com/craftaro/epicfurnaces/gui/GUIOverview.java

252 lines
13 KiB
Java

package com.craftaro.epicfurnaces.gui;
import com.craftaro.core.compatibility.CompatibleMaterial;
import com.craftaro.core.gui.CustomizableGui;
import com.craftaro.core.gui.GuiUtils;
import com.craftaro.core.input.ChatPrompt;
import com.craftaro.third_party.com.cryptomorin.xseries.XMaterial;
import com.craftaro.core.utils.NumberUtils;
import com.craftaro.core.utils.TextUtils;
import com.craftaro.core.utils.TimeUtils;
import com.craftaro.epicfurnaces.EpicFurnaces;
import com.craftaro.epicfurnaces.boost.BoostData;
import com.craftaro.epicfurnaces.furnace.Furnace;
import com.craftaro.epicfurnaces.level.Level;
import com.craftaro.epicfurnaces.settings.Settings;
import com.craftaro.epicfurnaces.utils.CostType;
import com.craftaro.epicfurnaces.utils.Methods;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class GUIOverview extends CustomizableGui {
private final EpicFurnaces plugin;
private final Furnace furnace;
private final Player player;
static int[][] infoIconOrder = new int[][]{{22}, {21, 23}, {21, 22, 23}, {20, 21, 23, 24}, {20, 21, 22, 23, 24}};
private int task;
public GUIOverview(EpicFurnaces plugin, Furnace furnace, Player player) {
super(plugin, "overview");
this.plugin = plugin;
this.furnace = furnace;
this.player = player;
setRows(3);
setTitle(Methods.formatName(furnace.getLevel().getLevel()));
runTask();
constructGUI();
this.setOnClose(action -> Bukkit.getScheduler().cancelTask(this.task));
}
private void constructGUI() {
ItemStack glass1 = GuiUtils.getBorderItem(Settings.GLASS_TYPE_1.getMaterial());
ItemStack glass2 = GuiUtils.getBorderItem(Settings.GLASS_TYPE_2.getMaterial());
ItemStack glass3 = GuiUtils.getBorderItem(Settings.GLASS_TYPE_3.getMaterial());
setDefaultItem(glass1);
mirrorFill("mirrorfill_1", 0, 0, true, true, glass2);
mirrorFill("mirrorfill_2", 0, 1, true, true, glass2);
mirrorFill("mirrorfill_3", 0, 2, true, true, glass3);
mirrorFill("mirrorfill_4", 1, 0, false, true, glass2);
mirrorFill("mirrorfill_5", 1, 1, false, true, glass3);
Level level = this.furnace.getLevel();
Level nextLevel = this.plugin.getLevelManager().getHighestLevel().getLevel() > level.getLevel() ? this.plugin.getLevelManager().getLevel(level.getLevel() + 1) : null;
// main furnace information icon
setItem("information", 1, 4, GuiUtils.createButtonItem(
CompatibleMaterial.getMaterial(this.furnace.getLocation().getBlock().getType()).get(),
this.plugin.getLocale().getMessage("interface.furnace.currentlevel")
.processPlaceholder("level", level.getLevel()).getMessage(),
getFurnaceDescription(this.furnace, level, nextLevel)));
// check how many info icons we have to show
int num = -1;
if (level.getPerformance() != 0)
num++;
if (level.hasReward())
num++;
if (level.getFuelDuration() != 0)
num++;
if (level.getFuelShare() != 0)
num++;
if (level.getOverheat() != 0)
num++;
int current = 0;
if (level.getPerformance() != 0) {
setItem("performance", infoIconOrder[num][current++], GuiUtils.createButtonItem(
Settings.PERFORMANCE_ICON.getMaterial(XMaterial.REDSTONE),
this.plugin.getLocale().getMessage("interface.furnace.performancetitle").getMessage(),
this.plugin.getLocale().getMessage("interface.furnace.performanceinfo")
.processPlaceholder("amount", level.getPerformance()).getMessage().split("\\|")));
}
if (level.hasReward()) {
setItem("reward", infoIconOrder[num][current++], GuiUtils.createButtonItem(
Settings.REWARD_ICON.getMaterial(XMaterial.GOLDEN_APPLE),
this.plugin.getLocale().getMessage("interface.furnace.rewardtitle").getMessage(),
this.plugin.getLocale().getMessage("interface.furnace.rewardinfo")
.processPlaceholder("amount", level.getRewardPercent())
.getMessage().split("\\|")));
}
if (level.getFuelDuration() != 0) {
setItem("fuel", infoIconOrder[num][current++], GuiUtils.createButtonItem(
Settings.FUEL_DURATION_ICON.getMaterial(XMaterial.COAL),
this.plugin.getLocale().getMessage("interface.furnace.fueldurationtitle").getMessage(),
this.plugin.getLocale().getMessage("interface.furnace.fueldurationinfo")
.processPlaceholder("amount", level.getFuelDuration())
.getMessage().split("\\|")));
}
if (level.getFuelShare() != 0) {
setItem("fuel_share", infoIconOrder[num][current++], GuiUtils.createButtonItem(
Settings.FUEL_SHARE_ICON.getMaterial(XMaterial.COAL_BLOCK),
this.plugin.getLocale().getMessage("interface.furnace.fuelsharetitle").getMessage(),
this.plugin.getLocale().getMessage("interface.furnace.fuelshareinfo")
.processPlaceholder("amount", level.getOverheat() * 3)
.getMessage().split("\\|")));
}
if (level.getOverheat() != 0) {
setItem("overheat", infoIconOrder[num][current++], GuiUtils.createButtonItem(
Settings.OVERHEAT_ICON.getMaterial(XMaterial.FIRE_CHARGE),
this.plugin.getLocale().getMessage("interface.furnace.overheattitle").getMessage(),
this.plugin.getLocale().getMessage("interface.furnace.overheatinfo")
.processPlaceholder("amount", level.getOverheat() * 3)
.getMessage().split("\\|")));
}
// remote control
if (Settings.REMOTE.getBoolean() && this.player.hasPermission("EpicFurnaces.Remote")) {
setButton("remote", 4, GuiUtils.createButtonItem(
XMaterial.TRIPWIRE_HOOK,
this.plugin.getLocale().getMessage("interface.furnace.remotefurnace").getMessage(),
getFurnaceRemoteLore(this.furnace)),
ClickType.LEFT, (event) -> {
ChatPrompt.showPrompt(this.plugin, event.player, this.plugin.getLocale().getMessage("event.remote.enter").getMessage(),
promptEvent -> {
for (Furnace other : this.plugin.getFurnaceManager().getFurnaces().values()) {
if (other.getNickname() == null) {
continue;
}
if (other.getNickname().equalsIgnoreCase(promptEvent.getMessage())) {
this.plugin.getLocale().getMessage("event.remote.nicknameinuse").sendPrefixedMessage(this.player);
return;
}
}
this.plugin.getDataHelper().queueFurnaceForUpdate(this.furnace);
this.furnace.setNickname(promptEvent.getMessage());
this.plugin.getLocale().getMessage("event.remote.nicknamesuccess").sendPrefixedMessage(this.player);
}).setOnClose(() -> this.guiManager.showGUI(this.player, new GUIOverview(this.plugin, this.furnace, this.player)));
}).setAction(4, ClickType.RIGHT, (event) -> {
this.guiManager.showGUI(this.player, new GUIRemoteAccess(this.plugin, this.furnace, this.player));
});
}
if (Settings.UPGRADE_WITH_XP.getBoolean()
&& level.getCostExperience() != -1
&& this.player.hasPermission("EpicFurnaces.Upgrade.XP")) {
setButton("upgrade_xp", 1, 2, GuiUtils.createButtonItem(
Settings.XP_ICON.getMaterial(XMaterial.EXPERIENCE_BOTTLE),
this.plugin.getLocale().getMessage("interface.furnace.upgradewithxp").getMessage(),
nextLevel != null
? this.plugin.getLocale().getMessage("interface.furnace.upgradewithxplore")
.processPlaceholder("cost", nextLevel.getCostExperience()).getMessage()
: this.plugin.getLocale().getMessage("interface.furnace.alreadymaxed").getMessage()),
(event) -> {
this.furnace.upgrade(this.player, CostType.EXPERIENCE);
this.furnace.overview(this.guiManager, this.player);
});
}
if (Settings.UPGRADE_WITH_ECONOMY.getBoolean()
&& level.getCostEconomy() != -1
&& this.player.hasPermission("EpicFurnaces.Upgrade.ECO")) {
setButton("upgrade_economy", 1, 6, GuiUtils.createButtonItem(
Settings.ECO_ICON.getMaterial(XMaterial.SUNFLOWER),
this.plugin.getLocale().getMessage("interface.furnace.upgradewitheconomy").getMessage(),
nextLevel != null
? this.plugin.getLocale().getMessage("interface.furnace.upgradewitheconomylore")
.processPlaceholder("cost", NumberUtils.formatNumber(nextLevel.getCostEconomy())).getMessage()
: this.plugin.getLocale().getMessage("interface.furnace.alreadymaxed").getMessage()),
(event) -> {
this.furnace.upgrade(this.player, CostType.ECONOMY);
this.furnace.overview(this.guiManager, this.player);
});
}
}
private void runTask() {
this.task = Bukkit.getScheduler().scheduleSyncRepeatingTask(this.plugin, () -> {
if (this.inventory.getViewers().size() != 0) {
this.constructGUI();
}
}, 5L, 5L);
}
List<String> getFurnaceDescription(Furnace furnace, Level level, Level nextLevel) {
ArrayList<String> lore = new ArrayList<>();
lore.add(this.plugin.getLocale().getMessage("interface.furnace.smeltedx")
.processPlaceholder("amount", furnace.getUses()).getMessage());
lore.addAll(level.getDescription());
lore.add("");
if (nextLevel == null) {
lore.add(this.plugin.getLocale().getMessage("interface.furnace.alreadymaxed").getMessage());
} else {
lore.add(this.plugin.getLocale().getMessage("interface.furnace.level")
.processPlaceholder("level", nextLevel.getLevel()).getMessage());
lore.addAll(nextLevel.getDescription());
if (Settings.UPGRADE_BY_SMELTING.getBoolean()) {
lore.add(this.plugin.getLocale().getMessage("interface.furnace.itemsneeded").getMessage());
for (Map.Entry<XMaterial, Integer> entry : level.getMaterials().entrySet()) {
lore.add(this.plugin.getLocale().getMessage("interface.furnace.neededitem")
.processPlaceholder("amount", entry.getValue() - furnace.getToLevel(entry.getKey()))
.processPlaceholder("type", Methods.cleanString(entry.getKey().name()))
.getMessage());
}
}
}
BoostData boostData = this.plugin.getBoostManager().getBoost(furnace.getPlacedBy());
if (boostData != null) {
lore.addAll(Arrays.asList(this.plugin.getLocale().getMessage("interface.button.boostedstats")
.processPlaceholder("amount", Integer.toString(boostData.getMultiplier()))
.processPlaceholder("time", TimeUtils.makeReadable(boostData.getEndTime() - System.currentTimeMillis()))
.getMessage().split("\\|")));
}
return lore;
}
List<String> getFurnaceRemoteLore(Furnace furnace) {
String nickname = furnace.getNickname();
ArrayList<String> loreHook = new ArrayList<>(Arrays.asList(this.plugin.getLocale().getMessage("interface.furnace.remotefurnacelore")
.processPlaceholder("nickname", nickname == null ? "Unset" : nickname).getMessage().split("\\|")));
if (nickname != null) {
loreHook.addAll(Arrays.asList(this.plugin.getLocale().getMessage("interface.furnace.utilize")
.processPlaceholder("nickname", nickname).getMessage().split("\\|")));
}
loreHook.add("");
loreHook.add(this.plugin.getLocale().getMessage("interface.furnace.remotelist").getMessage());
for (UUID uuid : furnace.getAccessList()) {
OfflinePlayer remotePlayer = Bukkit.getOfflinePlayer(uuid);
loreHook.add(TextUtils.formatText("&6" + remotePlayer.getName()));
}
return loreHook;
}
}