package com.alttd.fishingevent.config;
import com.alttd.fishingevent.FishingEvent;
import com.alttd.fishingevent.fish.Fish;
import com.alttd.fishingevent.objects.FishType;
import com.alttd.fishingevent.objects.Rarity;
import com.alttd.fishingevent.util.FishConfigHelper;
import com.alttd.fishingevent.util.Logger;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack;
import java.util.*;
public class Fishes extends AbstractConfig {
static Fishes config;
private final Logger logger;
private final FishingEvent fishingEvent;
Fishes(FishingEvent fishingEvent, Logger logger) {
super(fishingEvent, "fishes.yml", logger);
this.fishingEvent = fishingEvent;
this.logger = logger;
}
public static void reload(FishingEvent fishingEvent, Logger logger) {
logger.debug("Reloading config [fishes.yml]");
config = new Fishes(fishingEvent, logger);
config.readConfig(Fishes.class, null);
}
public static class FORMAT {
private static final String prefix = "format.";
public static String DISPLAY_NAME = "";
public static List LORE = List.of(
"Length: cm",
"Caught by: "
);
@SuppressWarnings("unused")
private static void load() {
DISPLAY_NAME = config.getString(prefix, "display-name", DISPLAY_NAME);
LORE = config.getStringList(prefix, "lore", LORE);
}
}
public static class FISH {
public static List WATER_FISH = new ArrayList<>();
public static List LAVA_FISH = new ArrayList<>();
public static HashMap> RARITY_WATER_FISH_MAP = new HashMap<>();
public static HashMap> RARITY_LAVA_FISH_MAP = new HashMap<>();
@SuppressWarnings("unused")
private static void load() {
WATER_FISH.clear();
RARITY_WATER_FISH_MAP.clear();
ConfigurationSection configurationSection = config.getConfigurationSection("water-fish");
if (configurationSection == null) {
return;
}
for (String key : configurationSection.getKeys(false)) {
ConfigurationSection fishSection = configurationSection.getConfigurationSection(key);
if (fishSection == null) {
config.logger.warning("Invalid water fish section: " + configurationSection.getCurrentPath() + "." + key);
continue;
}
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);
}
}
private static void loadFish(ConfigurationSection fishSection) {
Optional rarity = FishConfigHelper.getRarity(config.logger, fishSection);
if (rarity.isEmpty())
return;
Optional optionalItemStack = FishConfigHelper.loadFishItem(config.logger, fishSection);
if (optionalItemStack.isEmpty()) {
config.logger.warning("Invalid water fish item for " + fishSection.getCurrentPath());
return;
}
Set fishTypes = getFishTypes(fishSection);
for (FishType fishType : fishTypes) {
Fish fish = new Fish(
config.fishingEvent,
config.logger,
(float) fishSection.getDouble("min-length", 0),
(float) fishSection.getDouble("max-length", 0),
fishSection.getString("fish-name", "default name"),
rarity.get(),
optionalItemStack.get());
switch (fishType) {
case WATER -> WATER_FISH.add(fish);
case LAVA -> LAVA_FISH.add(fish);
}
}
}
private static Set getFishTypes(ConfigurationSection fishSection) {
Set fishTypes = new HashSet<>();
List typeList = fishSection.getStringList("fish-type");
for (String fishType : typeList) {
try {
fishTypes.add(FishType.valueOf(fishType));
} catch (IllegalArgumentException ignored) {
config.logger.warning("Invalid fish type: %", fishType);
}
}
return fishTypes;
}
}
}