diff --git a/src/main/java/com/iridium/iridiumskyblock/placeholders/IslandPlaceholderBuilder.java b/src/main/java/com/iridium/iridiumskyblock/placeholders/IslandPlaceholderBuilder.java index 074d7072c..3e5e8f997 100644 --- a/src/main/java/com/iridium/iridiumskyblock/placeholders/IslandPlaceholderBuilder.java +++ b/src/main/java/com/iridium/iridiumskyblock/placeholders/IslandPlaceholderBuilder.java @@ -9,14 +9,16 @@ import com.iridium.iridiumteams.Rank; import com.iridium.iridiumteams.TemporaryCache; import com.iridium.iridiumteams.bank.BankItem; +import com.iridium.iridiumteams.database.TeamEnhancement; +import com.iridium.iridiumteams.enhancements.Enhancement; +import com.iridium.iridiumteams.enhancements.EnhancementType; +import org.bukkit.Bukkit; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import java.time.Duration; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; public class IslandPlaceholderBuilder implements PlaceholderBuilder { @@ -28,49 +30,79 @@ public class IslandPlaceholderBuilder implements PlaceholderBuilder { public List getPlaceholders(Island island) { return cache.get(island, Duration.ofSeconds(1), () -> { List users = IridiumSkyblock.getInstance().getTeamManager().getTeamMembers(island); - List onlineUsers = users.stream() - .filter(u -> u.getPlayer() != null) - .map(User::getName) - .collect(Collectors.toList()); - List offlineUsers = users.stream() - .filter(u -> u.getPlayer() == null) - .map(User::getName) - .collect(Collectors.toList()); + + List onlineUsers = new ArrayList<>(Collections.emptyList()); + List offlineUsers = new ArrayList<>(Collections.emptyList()); + + for (User user : users) { + if (user.getPlayer() != null) { + onlineUsers.add(user.getName()); + } else { + offlineUsers.add(user.getName()); + } + } List placeholderList = new ArrayList<>(Arrays.asList( - new Placeholder("island_name", island.getName()), - new Placeholder("island_owner", IridiumSkyblock.getInstance().getTeamManager().getTeamMembers(island).stream() + new Placeholder("island_name", island::getName), + new Placeholder("island_owner", () -> IridiumSkyblock.getInstance().getTeamManager().getTeamMembers(island).stream() .filter(user -> user.getUserRank() == Rank.OWNER.getId()) .findFirst() .map(User::getName) .orElse(IridiumSkyblock.getInstance().getMessages().nullPlaceholder)), - new Placeholder("island_create", island.getCreateTime().format(DateTimeFormatter.ofPattern(IridiumSkyblock.getInstance().getConfiguration().dateTimeFormat))), - new Placeholder("island_description", island.getDescription()), - new Placeholder("island_value", String.valueOf(IridiumSkyblock.getInstance().getTeamManager().getTeamValue(island))), - new Placeholder("island_level", String.valueOf(island.getLevel())), - new Placeholder("island_experience", String.valueOf(island.getExperience())), - new Placeholder("island_value_rank", String.valueOf(IridiumSkyblock.getInstance().getTop().valueTeamSort.getRank(island, IridiumSkyblock.getInstance()))), - new Placeholder("island_experience_rank", String.valueOf(IridiumSkyblock.getInstance().getTop().experienceTeamSort.getRank(island, IridiumSkyblock.getInstance()))), - new Placeholder("island_members_online", String.join(", ", onlineUsers)), - new Placeholder("island_members_online_count", String.valueOf(onlineUsers.size())), - new Placeholder("island_members_offline", String.join(", ", offlineUsers)), - new Placeholder("island_members_offline_count", String.valueOf(offlineUsers.size())), - new Placeholder("island_members_count", String.valueOf(users.size())) + new Placeholder("island_create", () -> island.getCreateTime().format(DateTimeFormatter.ofPattern(IridiumSkyblock.getInstance().getConfiguration().dateTimeFormat))), + new Placeholder("island_description", island::getDescription), + new Placeholder("island_value", () -> String.valueOf(IridiumSkyblock.getInstance().getTeamManager().getTeamValue(island))), + new Placeholder("island_level", () -> String.valueOf(island.getLevel())), + new Placeholder("island_experience", () -> String.valueOf(island.getExperience())), + new Placeholder("island_value_rank", () -> String.valueOf(IridiumSkyblock.getInstance().getTop().valueTeamSort.getRank(island, IridiumSkyblock.getInstance()))), + new Placeholder("island_experience_rank", () -> String.valueOf(IridiumSkyblock.getInstance().getTop().experienceTeamSort.getRank(island, IridiumSkyblock.getInstance()))), + new Placeholder("island_members_online", () -> String.join(", ", onlineUsers)), + new Placeholder("island_members_online_count", () -> String.valueOf(onlineUsers.size())), + new Placeholder("island_members_offline", () -> String.join(", ", offlineUsers)), + new Placeholder("island_members_offline_count", () -> String.valueOf(offlineUsers.size())), + new Placeholder("island_members_count", () -> String.valueOf(users.size())) )); + + List visitingPlayers = Bukkit.getOnlinePlayers().stream() + .map(Player::getPlayer) + .filter(Objects::nonNull) + .filter(player -> island.isInIsland(player.getLocation())) + .collect(Collectors.toList()); + + visitingPlayers.removeIf(player -> onlineUsers.contains(player.getName())); + + placeholderList.add(new Placeholder("island_visitors", () -> visitingPlayers.stream().map(Player::getName).collect(Collectors.joining(", ")))); + placeholderList.add(new Placeholder("island_visitors_amount", () -> String.valueOf(visitingPlayers.size()))); + + placeholderList.add(new Placeholder("island_visitors", () -> visitingPlayers.stream().map(Player::getName).collect(Collectors.joining(", ")))); + placeholderList.add(new Placeholder("island_visitors_amount", () -> String.valueOf(visitingPlayers.size()))); + + for (Map.Entry> enhancement : IridiumSkyblock.getInstance().getEnhancementList().entrySet()) { + if (!enhancement.getValue().enabled) continue; + TeamEnhancement teamEnhancement = IridiumSkyblock.getInstance().getIslandManager().getTeamEnhancement(island, enhancement.getKey()); + + placeholderList.add(new Placeholder("island_enhancement_" + enhancement.getKey() + "_active", () -> String.valueOf(teamEnhancement.isActive()))); + placeholderList.add(new Placeholder("island_enhancement_" + enhancement.getKey() + "_level", () -> String.valueOf(teamEnhancement.getLevel()))); + placeholderList.add(new Placeholder("island_enhancement_" + enhancement.getKey() + "_time_hours", () -> String.valueOf(Math.max((int) (teamEnhancement.getRemainingTime() % 60), 0)))); + placeholderList.add(new Placeholder("island_enhancement_" + enhancement.getKey() + "_time_minutes", () -> String.valueOf(Math.max((int) ((teamEnhancement.getRemainingTime() % 3600) / 60), 0)))); + placeholderList.add(new Placeholder("island_enhancement_" + enhancement.getKey() + "_time_seconds", () -> String.valueOf(Math.max((int) (teamEnhancement.getRemainingTime() / 3600), 0)))); + } + for (BankItem bankItem : IridiumSkyblock.getInstance().getBankItemList()) { - placeholderList.add(new Placeholder("island_bank_" + bankItem.getName().toLowerCase(), String.valueOf(IridiumSkyblock.getInstance().getTeamManager().getTeamBank(island, bankItem.getName()).getNumber()))); + placeholderList.add(new Placeholder("island_bank_" + bankItem.getName().toLowerCase(), () -> String.valueOf(IridiumSkyblock.getInstance().getTeamManager().getTeamBank(island, bankItem.getName()).getNumber()))); } for (XMaterial xMaterial : XMaterial.values()) { - placeholderList.add(new Placeholder("island_" + xMaterial.name().toLowerCase() + "_amount", String.valueOf(IridiumSkyblock.getInstance().getTeamManager().getTeamBlock(island, xMaterial).getAmount()))); + placeholderList.add(new Placeholder("island_" + xMaterial.name().toLowerCase() + "_amount", () -> String.valueOf(IridiumSkyblock.getInstance().getTeamManager().getTeamBlock(island, xMaterial).getAmount()))); } for (EntityType entityType : EntityType.values()) { - placeholderList.add(new Placeholder("island_" + entityType.name().toLowerCase() + "_amount", String.valueOf(IridiumSkyblock.getInstance().getTeamManager().getTeamSpawners(island, entityType).getAmount()))); + placeholderList.add(new Placeholder("island_" + entityType.name().toLowerCase() + "_amount", () -> String.valueOf(IridiumSkyblock.getInstance().getTeamManager().getTeamSpawners(island, entityType).getAmount()))); } return placeholderList; }); } private List initializeDefaultPlaceholders() { + List placeholderList = new ArrayList<>(Arrays.asList( new Placeholder("island_name", IridiumSkyblock.getInstance().getMessages().nullPlaceholder), new Placeholder("island_owner", IridiumSkyblock.getInstance().getMessages().nullPlaceholder), @@ -85,8 +117,29 @@ private List initializeDefaultPlaceholders() { new Placeholder("island_members_online_count", IridiumSkyblock.getInstance().getMessages().nullPlaceholder), new Placeholder("island_members_offline", IridiumSkyblock.getInstance().getMessages().nullPlaceholder), new Placeholder("island_members_offline_count", IridiumSkyblock.getInstance().getMessages().nullPlaceholder), - new Placeholder("island_members_count", IridiumSkyblock.getInstance().getMessages().nullPlaceholder) + new Placeholder("island_members_count", IridiumSkyblock.getInstance().getMessages().nullPlaceholder), + new Placeholder("island_visitors", IridiumSkyblock.getInstance().getMessages().nullPlaceholder), + new Placeholder("island_visitors_amount", IridiumSkyblock.getInstance().getMessages().nullPlaceholder) )); + + for (Map.Entry> enhancement : IridiumSkyblock.getInstance().getEnhancementList().entrySet()) { + if (enhancement.getValue().type == EnhancementType.BOOSTER) { + placeholderList.add(new Placeholder("island_booster_" + enhancement.getKey() + "_active", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + placeholderList.add(new Placeholder("island_booster_" + enhancement.getKey() + "_level", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + placeholderList.add(new Placeholder("island_booster_" + enhancement.getKey() + "_time_hours", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + placeholderList.add(new Placeholder("island_booster_" + enhancement.getKey() + "_time_minutes", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + placeholderList.add(new Placeholder("island_booster_" + enhancement.getKey() + "_time_seconds", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + } + + if (enhancement.getValue().type == EnhancementType.UPGRADE) { + placeholderList.add(new Placeholder("island_upgrade_" + enhancement.getKey() + "_active", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + placeholderList.add(new Placeholder("island_upgrade_" + enhancement.getKey() + "_level", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + placeholderList.add(new Placeholder("island_upgrade_" + enhancement.getKey() + "_time_hours", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + placeholderList.add(new Placeholder("island_upgrade_" + enhancement.getKey() + "_time_minutes", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + placeholderList.add(new Placeholder("island_upgrade_" + enhancement.getKey() + "_time_seconds", IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); + } + } + for (BankItem bankItem : IridiumSkyblock.getInstance().getBankItemList()) { placeholderList.add(new Placeholder("island_bank_" + bankItem.getName().toLowerCase(), IridiumSkyblock.getInstance().getMessages().nullPlaceholder)); }