package com.alttd.cometskyblock.island; import com.alttd.cometskyblock.CometSkyBlockPlugin; import lombok.Getter; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.util.*; import java.util.stream.Collectors; public class Island extends YamlConfiguration { private static final Map configs = new HashMap<>(); public static final UUID NILL_UUID = new UUID(0L, 0L); public static Island getIsland(UUID uuid) { synchronized (configs) { return configs.computeIfAbsent(uuid, k -> new Island(uuid)); } } public static void remove(UUID uuid) { synchronized (configs) { configs.remove(uuid); } } public static void removeAll() { synchronized (configs) { configs.clear(); } } private final File file; private final Object saveLock = new Object(); @Getter private final UUID islandUUID; private Island(UUID uuid) { super(); this.islandUUID = uuid; this.file = new File(CometSkyBlockPlugin.instance().getDataFolder(), "IslandData" + File.separator + uuid + ".yml"); reload(); } private void reload() { synchronized (saveLock) { try { load(file); } catch (Exception ignore) { } } } private void save() { synchronized (saveLock) { try { save(file); } catch (Exception ignore) { } } } public int islandId() { return getInt("island.id", 0); } public void islandId(int id) { set("island.id", id); save(); } public String worldName() { return getString("island.worldname"); } public void worldName(String worldName) { set("island.worldname", worldName); save(); } public String islandName() { return getString("island.islandname"); } public void islandName(String islandName) { set("island.islandname", islandName); save(); } public int level() { return getInt("island.id", 0); } public void level(int id) { set("island.level", id); save(); } public UUID owner() { String string = getString("island.owner"); if (string == null || string.isEmpty()) return NILL_UUID; return UUID.fromString(string); } public void owner(UUID uuid) { set("island.owner", uuid.toString()); save(); } public List members() { List members = getStringList("island.members"); return members.stream() .map(this::stringToUUID) .collect(Collectors.toList()); } public void members(List members) { set("island.members", members.stream() .map(uuid -> uuid == null ? "null" : uuid.toString()) .collect(Collectors.toList())); } private String uuidToString(UUID uuid) { return (uuid == null ? NILL_UUID : uuid).toString(); } private UUID stringToUUID(String s) { return s == null || s.isEmpty() ? NILL_UUID : UUID.fromString(s); } public boolean canBuild(UUID uuid) { return owner().equals(uuid) || members().contains(uuid); } public void addMember(UUID uuid) { List list = members(); list.add(uuid); members(list); } public void removeMember(UUID uuid) { List list = members(); list.remove(uuid); members(list); } // TODO - Island settings public boolean visitNeedsRequest() { return true; } public int cobblegenLevel() { return getInt("island.generator.level", 0); } public void cobblegenLevel(int id) { set("island.generator.level", id); save(); } }