Added the ability for upgrade npc to repair as well
This commit is contained in:
parent
4e2d82a0aa
commit
54556d3ea5
|
|
@ -146,11 +146,17 @@ public class Config extends AbstractConfig {
|
|||
config.logger.warning("Unable to create valid upgrades for Upgrade npc: [%]", key);
|
||||
return;
|
||||
}
|
||||
Optional<List<RepairData>> repairDataList = getRepairData(npcPrefix);
|
||||
if (repairDataList.isEmpty()) {
|
||||
config.logger.warning("Unable to create valid repair data for Upgrade npc: [%]", key);
|
||||
return;
|
||||
}
|
||||
npc = new UpgradeNPC(
|
||||
config.fishingEvent,
|
||||
config.logger,
|
||||
npcCreateData,
|
||||
upgrades.get()
|
||||
upgrades.get(),
|
||||
repairDataList.get()
|
||||
);
|
||||
}
|
||||
case TUTORIAL -> {
|
||||
|
|
@ -189,6 +195,27 @@ public class Config extends AbstractConfig {
|
|||
NPC_MAP.put(key, npc);
|
||||
}
|
||||
|
||||
private static Optional<List<RepairData>> getRepairData(String npcPrefix) {
|
||||
ArrayList<RepairData> repairDataList = new ArrayList<>();
|
||||
ConfigurationSection primSection = config.getConfigurationSection(npcPrefix + "repair-data");
|
||||
if (primSection == null)
|
||||
return Optional.empty();
|
||||
for (String repairDataKey : primSection.getKeys(false)) {
|
||||
String repairPrefix = npcPrefix + "repair-data." + repairDataKey + ".";
|
||||
String materialString = config.getString(repairPrefix, "material", Material.ANVIL.toString());
|
||||
Material material = Material.getMaterial(materialString);
|
||||
if (material == null) {
|
||||
config.logger.warning("Received invalid material [%] for repair data [%]", materialString, repairDataKey);
|
||||
continue;
|
||||
}
|
||||
int percentage = config.getInt(repairPrefix, "percentage", 1);
|
||||
int cost = config.getInt(repairPrefix, "cost", 1);
|
||||
|
||||
repairDataList.add(new RepairData(material, percentage, cost));
|
||||
}
|
||||
return Optional.of(repairDataList);
|
||||
}
|
||||
|
||||
private static Optional<List<EnchantmentTrack>> getUpgrades(String npcPrefix) {
|
||||
ArrayList<EnchantmentTrack> enchantmentTracks = new ArrayList<>();
|
||||
ConfigurationSection primSection = config.getConfigurationSection(npcPrefix + "enchants");
|
||||
|
|
|
|||
|
|
@ -69,12 +69,10 @@ public class Fishes extends AbstractConfig {
|
|||
loadFish(fishSection);
|
||||
}
|
||||
for (Fish fish : WATER_FISH) {
|
||||
config.logger.debug("Adding water fish [%] with rarity [%]", fish.normalFishName(), fish.getRarity().toString());
|
||||
RARITY_WATER_FISH_MAP.computeIfAbsent(fish.getRarity(), list -> new ArrayList<>()).add(fish);
|
||||
}
|
||||
|
||||
for (Fish fish : LAVA_FISH) {
|
||||
config.logger.debug("Adding lava fish [%] with rarity [%]", fish.normalFishName(), fish.getRarity().toString());
|
||||
RARITY_LAVA_FISH_MAP.computeIfAbsent(fish.getRarity(), list -> new ArrayList<>()).add(fish);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import com.alttd.fishingevent.config.Messages;
|
|||
import com.alttd.fishingevent.gui.GUI;
|
||||
import com.alttd.fishingevent.objects.EnchantmentData;
|
||||
import com.alttd.fishingevent.objects.EnchantmentTrack;
|
||||
import com.alttd.fishingevent.objects.RepairData;
|
||||
import com.alttd.fishingevent.points.PointsManagement;
|
||||
import com.alttd.fishingevent.util.Logger;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
|
|
@ -17,6 +18,7 @@ import org.bukkit.event.inventory.InventoryType;
|
|||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
import org.bukkit.inventory.meta.Damageable;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
|
@ -35,13 +37,15 @@ public class UpgradeWindow extends GUI {
|
|||
private final ItemStack maxUpgraded = new ItemStack(Material.BARRIER, 1); //TODO itemlore/name
|
||||
private final Player player;
|
||||
private final List<EnchantmentTrack> enchantmentTracks;
|
||||
private final List<RepairData> repairDataList;
|
||||
|
||||
public UpgradeWindow(FishingEvent fishingEvent, Player player, Logger logger, List<EnchantmentTrack> enchantmentTracks) {
|
||||
public UpgradeWindow(FishingEvent fishingEvent, Player player, Logger logger, List<EnchantmentTrack> enchantmentTracks, List<RepairData> repairDataList) {
|
||||
super(InventoryType.CHEST, MiniMessage.miniMessage().deserialize(Messages.GUI.UPGRADE_GUI_NAME));
|
||||
this.fishingEvent = fishingEvent;
|
||||
this.logger = logger;
|
||||
this.player = player;
|
||||
this.enchantmentTracks = enchantmentTracks;
|
||||
this.repairDataList = repairDataList;
|
||||
updateGUI();
|
||||
canOpen = true;
|
||||
}
|
||||
|
|
@ -66,6 +70,49 @@ public class UpgradeWindow extends GUI {
|
|||
setItem(i, optionalEnchantmentItem.get(), clickingPlayer -> upgrade(clickingPlayer, enchantmentTrack, trackLevel));
|
||||
i++;
|
||||
}
|
||||
for (RepairData repairData : repairDataList) {
|
||||
ItemStack itemStack = new ItemStack(repairData.material(), 1);
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.displayName(MiniMessage.miniMessage().deserialize("<green>Repair <percent>% for <points> points</green>", TagResolver.resolver(
|
||||
Placeholder.parsed("percent", String.valueOf(repairData.percentage())),
|
||||
Placeholder.parsed("points", String.valueOf(repairData.cost()))
|
||||
)));
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
setItem(i, itemStack, clickingPlayer -> repair(clickingPlayer, repairData));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
private void repair(Player clickingPlayer, RepairData repairData) {
|
||||
PlayerInventory inventory = clickingPlayer.getInventory();
|
||||
|
||||
int playerPoints = PointsManagement.getInstance().getPoints(player.getUniqueId());
|
||||
if (playerPoints < repairData.cost()) {
|
||||
player.sendMiniMessage(Messages.GUI.NOT_ENOUGH_POINTS, TagResolver.resolver(
|
||||
Placeholder.parsed("price", String.valueOf(repairData.cost())),
|
||||
Placeholder.parsed("points", String.valueOf(playerPoints))
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
int fishingRodSlot = findFishingRodSlot(inventory);
|
||||
ItemStack fishingRod = inventory.getItem(fishingRodSlot);
|
||||
if (fishingRod == null) {
|
||||
logger.warning("Fishing rod became null");
|
||||
return;
|
||||
}
|
||||
if (!(fishingRod.getItemMeta() instanceof Damageable damageable)) {
|
||||
logger.warning("Fishing rod is not repairable");
|
||||
return;
|
||||
}
|
||||
int maxDurability = Material.FISHING_ROD.getMaxDurability();
|
||||
int newDurability = Math.min((int) (maxDurability * (repairData.percentage() / 100.0)), maxDurability);
|
||||
if (damageable.getDamage() < newDurability) {
|
||||
clickingPlayer.sendMiniMessage("<red>Your fishing rod is already more than <percentage>% repaired", //TODO move to config
|
||||
Placeholder.parsed("percentage", String.valueOf(repairData.percentage())));
|
||||
return;
|
||||
}
|
||||
damageable.setDamage(newDurability);
|
||||
}
|
||||
|
||||
private int getTrackLevel(EnchantmentTrack enchantmentTrack, ItemStack fishingRod) {
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import com.alttd.fishingevent.gui.windows.UpgradeWindow;
|
|||
import com.alttd.fishingevent.npc.LibNPC;
|
||||
import com.alttd.fishingevent.npc.NPC;
|
||||
import com.alttd.fishingevent.objects.EnchantmentTrack;
|
||||
import com.alttd.fishingevent.objects.RepairData;
|
||||
import com.alttd.fishingevent.util.Logger;
|
||||
import com.alttd.fishingevent.util.NPCCreateData;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
|
|
@ -20,13 +21,15 @@ public class UpgradeNPC extends LibNPC implements NPC {
|
|||
private final Logger logger;
|
||||
private boolean isSpawned = false;
|
||||
private final List<EnchantmentTrack> enchantmentTracks;
|
||||
private final List<RepairData> repairDataList;
|
||||
private final FishingEvent fishingEvent;
|
||||
|
||||
public UpgradeNPC(FishingEvent fishingEvent, Logger logger, NPCCreateData npcCreateData, List<EnchantmentTrack> enchantmentTracks) {
|
||||
public UpgradeNPC(FishingEvent fishingEvent, Logger logger, NPCCreateData npcCreateData, List<EnchantmentTrack> enchantmentTracks, List<RepairData> repairDataList) {
|
||||
this.fishingEvent = fishingEvent;
|
||||
this.npcCreateData = npcCreateData;
|
||||
this.logger = logger;
|
||||
this.enchantmentTracks = enchantmentTracks;
|
||||
this.repairDataList = repairDataList;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -47,7 +50,7 @@ public class UpgradeNPC extends LibNPC implements NPC {
|
|||
|
||||
@Override
|
||||
public void rightClick(Player player) {
|
||||
UpgradeWindow upgradeWindow = new UpgradeWindow(fishingEvent, player, logger, enchantmentTracks);
|
||||
UpgradeWindow upgradeWindow = new UpgradeWindow(fishingEvent, player, logger, enchantmentTracks, repairDataList);
|
||||
if (!upgradeWindow.canOpen()) {
|
||||
player.sendMiniMessage(Messages.GUI.NO_FISHING_ROD, null);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
package com.alttd.fishingevent.objects;
|
||||
|
||||
import org.bukkit.Material;
|
||||
|
||||
public record RepairData(Material material, int percentage, int cost) {
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user