package com.walrusone.skywars.controllers;
import com.walrusone.skywars.SkyWarsReloaded;
import org.bukkit.GameMode;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class InventoryController {
private Map<String, pInventory> inventories = new HashMap<String, pInventory>();
public InventoryController() {
load();
}
@SuppressWarnings("unchecked")
public void load() {
inventories = new HashMap<String, pInventory>();
try {
File dataDirectory = SkyWarsReloaded.get().getDataFolder();
File playerDataDirectory = new File(dataDirectory, "player_data");
if (!playerDataDirectory.exists() && !playerDataDirectory.mkdirs()) {
System.out.println("Could not get Inventories File");
return;
}
File playerInventories = new File(playerDataDirectory, "inventories.yml");
if (playerInventories.exists()) {
FileConfiguration storage = YamlConfiguration.loadConfiguration(playerInventories);
if (storage.isSet("inventories")) {
for (String uuid : storage.getConfigurationSection("inventories.").getKeys(false)) {
ItemStack[] content = ((List<ItemStack>) storage.get("inventories." + uuid + ".contents")).toArray(new ItemStack[0]);
ItemStack[] armor = ((List<ItemStack>) storage.get("inventories." + uuid + ".armor")).toArray(new ItemStack[0]);
int level = storage.getInt("inventories." + uuid + ".level");
float exp = (float) storage.getDouble("inventories." + uuid + ".exp");
String gameMode = storage.getString("inventories." + uuid + ".gameMode");
GameMode gamemode = GameMode.valueOf(gameMode);
inventories.put(uuid, new pInventory(content, armor, level, exp, gamemode));
}
}
playerInventories.delete();
} else {
File playerInventoriesNew = new File(dataDirectory, "inventories.yml");
if (!playerInventoriesNew.exists() && !playerInventoriesNew.createNewFile()) {
System.out.println("Could not get Inventories File");
return;
}
if (playerInventoriesNew.exists()) {
FileConfiguration storage = YamlConfiguration.loadConfiguration(playerInventoriesNew);
if (storage.isSet("inventories")) {
for (String uuid : storage.getConfigurationSection("inventories.").getKeys(false)) {
ItemStack[] content = ((List<ItemStack>) storage.get("inventories." + uuid + ".contents")).toArray(new ItemStack[0]);
ItemStack[] armor = ((List<ItemStack>) storage.get("inventories." + uuid + ".armor")).toArray(new ItemStack[0]);
int level = storage.getInt("inventories." + uuid + ".level");
float exp = (float) storage.getDouble("inventories." + uuid + ".exp");
String gameMode = storage.getString("inventories." + uuid + ".gameMode");
GameMode gamemode = GameMode.valueOf(gameMode);
inventories.put(uuid, new pInventory(content, armor, level, exp, gamemode));
}
}
}
}
} catch (IOException ioException) {
System.out.println("Failed to load inventories file: " + ioException.getMessage());
}
}
public void save() {
try {
File dataDirectory = SkyWarsReloaded.get().getDataFolder();
File playerInventories = new File(dataDirectory, "inventories.yml");
if (!playerInventories.exists() && !playerInventories.createNewFile()) {
System.out.println("Could not get Inventories File");
return;
}
if (playerInventories.exists()) {
FileConfiguration storage = YamlConfiguration.loadConfiguration(playerInventories);
storage.set("inventories", null);
for (String uuid: inventories.keySet()) {
storage.set("inventories." + uuid + ".contents", inventories.get(uuid).getContent());
storage.set("inventories." + uuid + ".armor", inventories.get(uuid).getArmor());
storage.set("inventories." + uuid + ".level", inventories.get(uuid).getLevel());
storage.set("inventories." + uuid + ".exp", inventories.get(uuid).getExp());
storage.set("inventories." + uuid + ".gameMode", inventories.get(uuid).getGameMode().toString());
}
storage.save(playerInventories);
}
} catch (IOException ioException) {
System.out.println("Failed to load inventories file: " + ioException.getMessage());
}
}
public void add(Player p) {
inventories.put(p.getUniqueId().toString(), new pInventory(p.getInventory().getContents(), p.getInventory().getArmorContents(), p.getLevel(), p.getExp(), p.getGameMode()));
}
public boolean playerExists(String uuid) {
if (inventories.containsKey(uuid)) {
return true;
}
return false;
}
public void restoreInventory(Player player) {
if (player != null) {
if (playerExists(player.getUniqueId().toString())) {
player.getInventory().clear();
player.getInventory().setHelmet(null);
player.getInventory().setChestplate(null);
player.getInventory().setLeggings(null);
player.getInventory().setBoots(null);
for (PotionEffect effect : player.getActivePotionEffects()) {
player.removePotionEffect(effect.getType());
}
player.getInventory().setContents(inventories.get(player.getUniqueId().toString()).getContent());
player.getInventory().setArmorContents(inventories.get(player.getUniqueId().toString()).getArmor());
player.setLevel(inventories.get(player.getUniqueId().toString()).getLevel());
player.setExp(inventories.get(player.getUniqueId().toString()).getExp());
player.setGameMode(inventories.get(player.getUniqueId().toString()).getGameMode());
inventories.remove(player.getUniqueId().toString());
}
}
}
private class pInventory {
private ItemStack[] content;
private ItemStack[] armor;
private float exp;
private GameMode gameMode;
private int level;
public pInventory(ItemStack[] content, ItemStack[] armor, int l, float f, GameMode gameMode) {
this.content = content;
this.armor = armor;
level = l;
exp = f;
this.gameMode = gameMode;
}
public ItemStack[] getContent() {
return content;
}
public ItemStack[] getArmor() {
return armor;
}
public int getLevel() {
return level;
}
public float getExp() {
return exp;
}
public GameMode getGameMode() {
return gameMode;
}
}
}