* Add IslandTop command with refresh cooldown The "IslandTop" command has been added. This provides a sorted list of top-performing islands. A configuration for refresh cooldown was also added. The sorted island list is updated once the specified minutes in the configuration have passed to improve performance. The ranking display for the player's island is highlighted in green text. * Update IslandTop command On plugin startup the IslandData is now loaded in. IslandData was moved to its own file and gets updated when a new island is created or when one levels up. The IslandData gets deleted when the owner leaves the island, destroying it. * Update island name formatting in IslandData The method which formats island name in IslandData class has been updated. If the island name is null, it now defaults to "Unnamed Island". This adjustment makes the information clearer when the island name is not defined. * Set default name for islands during creation Ensured that the 'owner' method in the 'Island' class set's the island name when an owner is set/changed. This will only happen if the island name is either null or blank. This is done to ensure island's always have a name when created.
254 lines
7.3 KiB
Java
254 lines
7.3 KiB
Java
package com.alttd.cometskyblock.island;
|
|
|
|
import com.alttd.cometskyblock.CometSkyBlockPlugin;
|
|
import com.alttd.cometskyblock.records.IslandRecord;
|
|
import com.alttd.cometskyblock.request.Request;
|
|
import lombok.Getter;
|
|
import lombok.Setter;
|
|
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.Location;
|
|
import org.bukkit.World;
|
|
import org.bukkit.configuration.file.YamlConfiguration;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.potion.PotionEffect;
|
|
import org.bukkit.potion.PotionEffectType;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import java.io.File;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
|
|
public class Island extends YamlConfiguration {
|
|
|
|
private static final Map<UUID, Island> 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 Island loadIslandFromFile(File file) {
|
|
return new Island(file);
|
|
}
|
|
|
|
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;
|
|
@Getter @Setter private Request request;
|
|
|
|
private Island(UUID uuid) {
|
|
super();
|
|
this.islandUUID = uuid;
|
|
this.file = new File(CometSkyBlockPlugin.instance().getDataFolder(), "IslandData" + File.separator + uuid + ".yml");
|
|
reload();
|
|
}
|
|
|
|
private Island(File file) {
|
|
this.islandUUID = Island.NILL_UUID;
|
|
this.file = file;
|
|
reload();
|
|
}
|
|
|
|
public static Collection<Island> getIslands() {
|
|
return configs.values();
|
|
}
|
|
|
|
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.level", 0);
|
|
}
|
|
|
|
public void level(int level) {
|
|
IslandData.updateIsland(new IslandData(islandId(), islandName(), level));
|
|
set("island.level", level);
|
|
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());
|
|
String islandName = islandName();
|
|
if ((islandName == null || islandName.isBlank()) && !uuid.equals(NILL_UUID)) {
|
|
islandName(Bukkit.getOfflinePlayer(uuid).getName() + "'s island");
|
|
}
|
|
save();
|
|
}
|
|
|
|
public List<UUID> members() {
|
|
List<String> members = getStringList("island.members");
|
|
return members.stream()
|
|
.map(this::stringToUUID)
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
public void members(List<UUID> members) {
|
|
set("island.members", members.stream()
|
|
.map(uuid -> uuid == null ? "null" : uuid.toString())
|
|
.collect(Collectors.toList()));
|
|
save();
|
|
}
|
|
|
|
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) {
|
|
IslandPlayer islandPlayer = IslandPlayer.getIslandPlayer(uuid);
|
|
islandPlayer.islandId(islandId());
|
|
islandPlayer.islandUUID(islandUUID());
|
|
List<UUID> list = members();
|
|
list.add(uuid);
|
|
members(list);
|
|
}
|
|
|
|
public void removeMember(UUID uuid) {
|
|
List<UUID> 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 level) {
|
|
set("island.generator.level", level);
|
|
save();
|
|
}
|
|
|
|
public int worldBorderLevel() {
|
|
return getInt("island.worldborder.level", 0);
|
|
}
|
|
|
|
public void worldBorderLevel(int level) {
|
|
set("island.worldborder.level", level);
|
|
save();
|
|
}
|
|
|
|
public void teleport(Player player) {
|
|
World islandWorld = CometSkyBlockPlugin.instance().worldGenerator().loadIslandWorld(worldName());
|
|
if (islandWorld == null) {
|
|
player.sendRichMessage("<red>Could not load islandWorld. Contact an administrator");
|
|
return;
|
|
}
|
|
teleport(player, islandWorld.getSpawnLocation());
|
|
}
|
|
|
|
public void teleport(Player player, Location location) {
|
|
PotionEffect potionEffectBlindness = new PotionEffect(PotionEffectType.BLINDNESS, 600, 1);
|
|
PotionEffect potionEffectNightVision = new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 1);
|
|
player.addPotionEffect(potionEffectBlindness);
|
|
player.addPotionEffect(potionEffectNightVision);
|
|
World islandWorld = CometSkyBlockPlugin.instance().worldGenerator().loadIslandWorld(location.getWorld().getName());
|
|
if (islandWorld == null) {
|
|
player.sendRichMessage("<red>Could not load islandWorld. Contact an administrator");
|
|
player.removePotionEffect(PotionEffectType.BLINDNESS);
|
|
player.removePotionEffect(PotionEffectType.NIGHT_VISION);
|
|
return;
|
|
}
|
|
|
|
player.teleportAsync(location).whenComplete((b, e) -> {
|
|
player.removePotionEffect(PotionEffectType.BLINDNESS);
|
|
player.removePotionEffect(PotionEffectType.NIGHT_VISION);
|
|
});
|
|
}
|
|
|
|
public void broadCast(String message, TagResolver placeholder) {
|
|
Player islandOwner = Bukkit.getPlayer(owner());
|
|
if (islandOwner != null)
|
|
islandOwner.sendMiniMessage(message, placeholder);
|
|
|
|
for (UUID uuid : members()) {
|
|
Player islandMember = Bukkit.getPlayer(uuid);
|
|
if (islandMember == null)
|
|
continue;
|
|
|
|
islandMember.sendMiniMessage(message, placeholder);
|
|
}
|
|
}
|
|
|
|
public IslandRecord toRecord() {
|
|
return new IslandRecord(islandId(), islandName(), level());
|
|
}
|
|
}
|