Fixed upgrading enchantments

This commit is contained in:
Teriuihi 2023-09-24 05:07:34 +02:00
parent a904e0cfa5
commit 6de8d07e34
3 changed files with 55 additions and 22 deletions

View File

@ -170,21 +170,25 @@ public class Config extends AbstractConfig {
Int2ObjectOpenHashMap<EnchantmentData> enchantmentDataMap = new Int2ObjectOpenHashMap<>();
String enchantPrefix = npcPrefix + "enchants." + trackKey + ".";
ConfigurationSection secSection = config.getConfigurationSection(enchantPrefix + "enchants");
if (secSection == null) {
ConfigurationSection trackSection = config.getConfigurationSection(enchantPrefix + "track-enchants");
if (trackSection == null) {
config.logger.warning("Invalid section for enchant track [%]", trackKey);
continue;
}
for (String enchantmentKey : secSection.getKeys(false)) {
String enchantString = config.getString(enchantPrefix + enchantmentKey + ".", "type", Enchantment.LUCK.getName());
for (String enchantmentKey : trackSection.getKeys(false)) {
String trackPrefix = enchantPrefix + "track-enchants." + enchantmentKey + ".";
String enchantString = config.getString(trackPrefix, "type", Enchantment.LUCK.getName());
Enchantment enchantment = Enchantment.getByName(enchantString);
if (enchantment == null) {
config.logger.warning("Found invalid enchant [%]", enchantString);
continue;
}
new EnchantmentData(enchantment,
config.getInt(enchantPrefix + enchantmentKey + ".", "level", 1),
config.getInt(enchantPrefix + enchantmentKey + ".", "price", 1));
enchantmentDataMap.put(
config.getInt(trackPrefix, "position", 1),
new EnchantmentData(enchantment,
config.getInt(trackPrefix, "level", 1),
config.getInt(trackPrefix, "price", 1))
);
}
enchantmentTracks.add(new EnchantmentTrack(config.getString(enchantPrefix, "internal-name", "ex1"),
MiniMessage.miniMessage().deserialize(config.getString(enchantPrefix, "display-name", "<red>Ex1</red>")),
@ -236,8 +240,8 @@ public class Config extends AbstractConfig {
itemStack,
config.getString(prefix, "command", "example command for <player>"),
config.getString(prefix, "permission", "example.permission"),
config.getString(prefix, "prize-name", "Prize Name"),
config.getInt(prefix, "prize-price", 1))
config.getString(prefix, "name", "Prize Name"),
config.getInt(prefix, "price", 1))
);
}
return Optional.of(prizes);

View File

@ -57,7 +57,8 @@ public class Messages extends AbstractConfig {
public static String EARNED_POINTS = "<green>You earned <gold><earned_points></gold> points from this sale, you are now at <gold><total_points></gold> points!";
public static String NOT_ENOUGH_POINTS = "<red>You do not have enough points to purchase this, it costs <gold><price></gold> and you only have <gold><points></gold> points</red>";
public static String PURCHASED = "<green>You purchased the <prize> prize. You have <remaining_points> points remaining.";
public static String ALREADY_PURCHASED = "<red>You already purchased the <prize> prize.</red>";
public static String ALREADY_PURCHASED_PRIZE = "<red>You already purchased the <prize> prize.</red>";
public static String MAX_UPGRADED = "<red>You fully upgraded the <track> track</red>";
@SuppressWarnings("unused")
private static void load() {
@ -69,7 +70,8 @@ public class Messages extends AbstractConfig {
EARNED_POINTS = config.getString(prefix, "earned-points", EARNED_POINTS);
NOT_ENOUGH_POINTS = config.getString(prefix, "not-enough-points", NOT_ENOUGH_POINTS);
PURCHASED = config.getString(prefix, "purchased", PURCHASED);
ALREADY_PURCHASED = config.getString(prefix, "already-purchased", ALREADY_PURCHASED);
ALREADY_PURCHASED_PRIZE = config.getString(prefix, "already-purchased-prize", ALREADY_PURCHASED_PRIZE);
MAX_UPGRADED = config.getString(prefix, "max-upgraded", MAX_UPGRADED);
}
}
@ -113,11 +115,13 @@ public class Messages extends AbstractConfig {
private static final String prefix = "other-errors.";
public static String UNABLE_TO_CREATE_FISH = "<red>Unable to create fish, please contact a staff member</red>";
public static String UNABLE_TO_SELL_ITEMS = "<red>Unable to sell items, please contact a staff member</red>";
public static String UNABLE_TO_UPDATE_ENCHANTMENT = "<red>Unable to update the enchantments, your points have been refunded, please contact a staff member</red>";
@SuppressWarnings("unused")
private static void load() {
UNABLE_TO_CREATE_FISH = config.getString(prefix, "unable-to-create-fish", UNABLE_TO_CREATE_FISH);
UNABLE_TO_SELL_ITEMS = config.getString(prefix, "unable-to-sell-items", UNABLE_TO_SELL_ITEMS);
UNABLE_TO_UPDATE_ENCHANTMENT = config.getString(prefix, "unable-to-update-enchantment", UNABLE_TO_UPDATE_ENCHANTMENT);
}
}
}

View File

@ -8,6 +8,8 @@ import com.alttd.fishingevent.objects.EnchantmentTrack;
import com.alttd.fishingevent.points.PointsManagement;
import com.alttd.fishingevent.util.Logger;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
@ -29,27 +31,40 @@ public class UpgradeWindow extends GUI {
private final Logger logger;
private boolean canOpen = false;
private final FishingEvent fishingEvent;
private final ItemStack maxUpgraded = new ItemStack(Material.BARRIER, 1); //TODO itemlore/name
private final Player player;
private final List<EnchantmentTrack> enchantmentTracks;
public UpgradeWindow(FishingEvent fishingEvent, Player player, Logger logger, List<EnchantmentTrack> enchantmentTracks) {
super(InventoryType.CHEST, MiniMessage.miniMessage().deserialize(Messages.GUI.UPGRADE_GUI_NAME));
this.fishingEvent = fishingEvent;
this.logger = logger;
int i = 0;
this.player = player;
this.enchantmentTracks = enchantmentTracks;
updateGUI();
canOpen = true;
}
private void updateGUI() {
Optional<ItemStack> optionalFishingRod = getFishingRod(player);
if (optionalFishingRod.isEmpty()) {
player.sendMiniMessage(Messages.GUI.NO_FISHING_ROD, null);
return;
}
ItemStack fishingRod = optionalFishingRod.get();
int i = 0;
for (EnchantmentTrack enchantmentTrack : enchantmentTracks) {
int trackLevel = getTrackLevel(enchantmentTrack, fishingRod);
Optional<ItemStack> optionalEnchantmentItem = getEnchantmentItem(enchantmentTrack, trackLevel);
if (optionalEnchantmentItem.isEmpty())
continue;
setItem(i, optionalEnchantmentItem.get(), clickingPlayer -> upgrade(clickingPlayer, enchantmentTrack, trackLevel));
setItem(i, maxUpgraded, clickingPlayer -> {
clickingPlayer.sendMiniMessage(Messages.GUI.MAX_UPGRADED, TagResolver.resolver(
Placeholder.parsed("track", enchantmentTrack.getInternalName())));
});
else
setItem(i, optionalEnchantmentItem.get(), clickingPlayer -> upgrade(clickingPlayer, enchantmentTrack, trackLevel));
i++;
}
canOpen = true;
}
private int getTrackLevel(EnchantmentTrack enchantmentTrack, ItemStack fishingRod) {
@ -71,15 +86,18 @@ public class UpgradeWindow extends GUI {
}
private Optional<ItemStack> getEnchantmentItem(EnchantmentTrack enchantmentTrack, int trackLevel) {
if (enchantmentTrack.getMaxLevel() == trackLevel) {
if (enchantmentTrack.getMaxLevel() == trackLevel) { //TODO fix this won't work if there are 2+ enchantments in a track and the second has more levels
logger.debug("Player got maxed out track");
return Optional.empty();
}
ItemStack itemStack = new ItemStack(Material.ENCHANTED_BOOK, 1);
Optional<EnchantmentData> optionalEnchantmentData = enchantmentTrack.nextEnchantment(trackLevel);
if (optionalEnchantmentData.isEmpty())
if (optionalEnchantmentData.isEmpty()) {
logger.debug("Player was unable to get next enchant");
return Optional.empty();
}
EnchantmentData enchantmentData = optionalEnchantmentData.get();
itemStack.addEnchantment(enchantmentData.enchantment(), enchantmentData.level());
itemStack.addUnsafeEnchantment(enchantmentData.enchantment(), enchantmentData.level());
return Optional.of(itemStack);
}
@ -106,7 +124,10 @@ public class UpgradeWindow extends GUI {
EnchantmentData enchantmentData = optionalEnchantmentData.get();
if (playerPoints < enchantmentData.price()) {
//TODO tell player not enough points
player.sendMiniMessage(Messages.GUI.NOT_ENOUGH_POINTS, TagResolver.resolver(
Placeholder.parsed("price", String.valueOf(enchantmentData.price())),
Placeholder.parsed("points", String.valueOf(playerPoints))
));
return;
}
@ -121,22 +142,26 @@ public class UpgradeWindow extends GUI {
try {
PointsManagement.getInstance().removePoints(player.getUniqueId(), enchantmentData.price());
} catch (IllegalArgumentException e) {
//TODO tell player not enough points
player.sendMiniMessage(Messages.GUI.NOT_ENOUGH_POINTS, TagResolver.resolver(
Placeholder.parsed("price", String.valueOf(enchantmentData.price())),
Placeholder.parsed("points", String.valueOf(playerPoints))
));
return;
}
if (!updateEnchantment(fishingRod, enchantmentData, enchantmentTrack, trackLevel + 1)) {
PointsManagement.getInstance().addPoints(player.getUniqueId(), enchantmentData.price());
//TODO error
player.sendMiniMessage(Messages.OTHER_ERRORS.UNABLE_TO_UPDATE_ENCHANTMENT, null);
return;
}
inventory.setItem(fishingRodSlot, fishingRod);
updateGUI();
player.updateInventory();
}
private boolean updateEnchantment(ItemStack fishingRod, EnchantmentData enchantmentData, EnchantmentTrack enchantmentTrack, int newTrackLevel) {
fishingRod.addEnchantment(enchantmentData.enchantment(), enchantmentData.level());
fishingRod.addUnsafeEnchantment(enchantmentData.enchantment(), enchantmentData.level());
ItemMeta itemMeta = fishingRod.getItemMeta();
PersistentDataContainer persistentDataContainer = itemMeta.getPersistentDataContainer();
Optional<NamespacedKey> namespacedKey = getNamespacedKey(fishingEvent, enchantmentTrack.getInternalName());