/*
* This file is part of Kenshins Hide and Seek
*
* Copyright (c) 2021 Tyler Murphy.
*
* Kenshins Hide and Seek free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* he Free Software Foundation version 3.
*
* Kenshins Hide and Seek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
package net.tylermurphy.hideAndSeek.configuration;
import com.cryptomorin.xseries.XEnchantment;
import com.cryptomorin.xseries.XMaterial;
import com.cryptomorin.xseries.XPotion;
import net.tylermurphy.hideAndSeek.util.Version;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class Items {
public static List HIDER_ITEMS, SEEKER_ITEMS;
public static List HIDER_EFFECTS, SEEKER_EFFECTS;
public static void loadItems() {
ConfigManager manager = new ConfigManager("items.yml");
SEEKER_ITEMS = new ArrayList<>();
ConfigurationSection SeekerItems = manager.getConfigurationSection("items.seeker");
int i = 1;
while (true) {
ConfigurationSection section = SeekerItems.getConfigurationSection(String.valueOf(i));
if(section == null) break;
ItemStack item = createItem(section);
if(item != null) SEEKER_ITEMS.add(item);
i++;
}
HIDER_ITEMS = new ArrayList<>();
ConfigurationSection HiderItems = manager.getConfigurationSection("items.hider");
i = 1;
while (true) {
ConfigurationSection section = HiderItems.getConfigurationSection(String.valueOf(i));
if(section == null) break;
ItemStack item = createItem(section);
if(item != null) HIDER_ITEMS.add(item);
i++;
}
SEEKER_EFFECTS = new ArrayList<>();
ConfigurationSection SeekerEffects = manager.getConfigurationSection("effects.seeker");
i = 1;
while (true) {
ConfigurationSection section = SeekerEffects.getConfigurationSection(String.valueOf(i));
if(section == null) break;
PotionEffect effect = getPotionEffect(section);
if(effect != null) SEEKER_EFFECTS.add(effect);
i++;
}
HIDER_EFFECTS = new ArrayList<>();
ConfigurationSection HiderEffects = manager.getConfigurationSection("effects.hider");
i = 1;
while (true) {
ConfigurationSection section = HiderEffects.getConfigurationSection(String.valueOf(i));
if(section == null) break;
PotionEffect effect = getPotionEffect(section);
if(effect != null) HIDER_EFFECTS.add(effect);
i++;
}
}
private static ItemStack createItem(ConfigurationSection item) {
String material_string = item.getString("material");
if(material_string == null) return null;
if(!XMaterial.matchXMaterial(material_string.toUpperCase()).isPresent()) return null;
Material material = XMaterial.matchXMaterial(material_string.toUpperCase()).get().parseMaterial();
int amount = item.getInt("amount");
if(material == null) return null;
ItemStack stack = new ItemStack(material, amount);
if(material == XMaterial.POTION.parseMaterial() || material == XMaterial.SPLASH_POTION.parseMaterial() || material == XMaterial.LINGERING_POTION.parseMaterial()){
PotionMeta meta = getPotionMeta(stack, item);
if(meta == null) return null;
stack.setItemMeta(meta);
} else {
ConfigurationSection enchantments = item.getConfigurationSection("enchantments");
if (enchantments != null)
for (String enchantment_string : enchantments.getKeys(false)) {
if(!XEnchantment.matchXEnchantment(enchantment_string).isPresent()) continue;
Enchantment enchantment = XEnchantment.matchXEnchantment(enchantment_string).get().getEnchant();
if (enchantment == null) continue;
stack.addUnsafeEnchantment(
enchantment,
enchantments.getInt(enchantment_string)
);
}
ItemMeta meta = getItemMeta(stack,item);
stack.setItemMeta(meta);
}
return stack;
}
private static ItemMeta getItemMeta(ItemStack stack, ConfigurationSection item){
ItemMeta meta = stack.getItemMeta();
assert meta != null;
String name = item.getString("name");
if(name != null)
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
if(Version.atLeast("1.11")){
meta.setUnbreakable(item.getBoolean("unbreakable"));
} else {
meta.spigot().setUnbreakable(true);
}
meta.setLore(item.getStringList("lore"));
return meta;
}
private static PotionMeta getPotionMeta(ItemStack stack, ConfigurationSection item) {
String type = item.getString("type");
PotionMeta meta = (PotionMeta) stack.getItemMeta();
if(type==null) return meta;
assert meta != null;
XPotion.Effect potionEffect = XPotion.parseEffect(type.toUpperCase());
if(potionEffect == null) return null;
XPotion xpotion = potionEffect.getXPotion();
if(xpotion == null) return null;
PotionEffectType potionType = xpotion.getPotionEffectType();
if(potionType == null) return null;
if(Version.atLeast("1.9")) {
meta.setBasePotionData(new PotionData(xpotion.getPotionType()));
} else {
meta.setMainEffect(potionType);
}
return meta;
}
private static PotionEffect getPotionEffect(ConfigurationSection item){
String type = item.getString("type");
if(type == null) return null;
if(PotionEffectType.getByName(type.toUpperCase()) == null) return null;
return new PotionEffect(
Objects.requireNonNull(PotionEffectType.getByName(type.toUpperCase())),
item.getInt("duration"),
item.getInt("amplifier"),
item.getBoolean("ambient"),
item.getBoolean("particles")
);
}
}