From c5b789ce6d547a6be90b438d16c413819f1ec467 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 30 Nov 2018 23:00:20 +0000 Subject: [PATCH] Build 33 # Added a Hologram System that can display leaderboards of top 10 level or votes. # Added the command '/island admin sethologram' to set the location of a hologram. # Added the command '/island admin removehologram' to remove an existing hologram. # Added the alias '/island teleport ' to the command '/island visit []'. # Added the placeholder 'skyblock_leaderboard_level_<1-10>'. # Added the placeholder 'skyblock_leaderboard_votes_<1-10>'. # Fixed invalid unicode character when adding color codes to signs when saving a structure. # Fixed NSME when sending a World Border to a player on servers using 1.9 & 1.10. # Fixed NSFE when buying 'Spawner Boost' upgrade on servers using paperclip 1.12. # Fixed Placeholders not working for Upgrade messages. # The command '/island admin reload' will also reload the holograms. --- .../me/goodandevil/skyblock/SkyBlock.java | 26 +- .../skyblock/command/CommandManager.java | 4 + .../command/commands/admin/ReloadCommand.java | 20 ++ .../commands/admin/RemoveHologramCommand.java | 123 ++++++++ .../commands/admin/SetHologramCommand.java | 112 +++++++ .../skyblock/hologram/Hologram.java | 75 +++++ .../skyblock/hologram/HologramManager.java | 260 ++++++++++++++++ .../skyblock/hologram/HologramType.java | 8 + .../skyblock/leaderboard/LeaderboardTask.java | 2 + .../goodandevil/skyblock/listeners/Block.java | 7 + .../skyblock/placeholder/EZPlaceholder.java | 294 ++++++++++-------- .../skyblock/placeholder/MVdWPlaceholder.java | 64 ++++ .../skyblock/utils/world/block/BlockUtil.java | 22 +- src/main/resources/language.yml | 42 +++ src/main/resources/plugin.yml | 2 +- 15 files changed, 922 insertions(+), 139 deletions(-) create mode 100644 src/main/java/me/goodandevil/skyblock/command/commands/admin/RemoveHologramCommand.java create mode 100644 src/main/java/me/goodandevil/skyblock/command/commands/admin/SetHologramCommand.java create mode 100644 src/main/java/me/goodandevil/skyblock/hologram/Hologram.java create mode 100644 src/main/java/me/goodandevil/skyblock/hologram/HologramManager.java create mode 100644 src/main/java/me/goodandevil/skyblock/hologram/HologramType.java diff --git a/src/main/java/me/goodandevil/skyblock/SkyBlock.java b/src/main/java/me/goodandevil/skyblock/SkyBlock.java index 6e40ea32..69bb5290 100644 --- a/src/main/java/me/goodandevil/skyblock/SkyBlock.java +++ b/src/main/java/me/goodandevil/skyblock/SkyBlock.java @@ -14,6 +14,7 @@ import me.goodandevil.skyblock.confirmation.ConfirmationTask; import me.goodandevil.skyblock.creation.CreationManager; import me.goodandevil.skyblock.economy.EconomyManager; import me.goodandevil.skyblock.generator.GeneratorManager; +import me.goodandevil.skyblock.hologram.HologramManager; import me.goodandevil.skyblock.invite.InviteManager; import me.goodandevil.skyblock.island.IslandManager; import me.goodandevil.skyblock.leaderboard.LeaderboardManager; @@ -69,10 +70,11 @@ public class SkyBlock extends JavaPlugin { private StructureManager structureManager; private SoundManager soundManager; private GeneratorManager generatorManager; - private PlaceholderManager placeholderManager; private LeaderboardManager leaderboardManager; + private PlaceholderManager placeholderManager; private MessageManager messageManager; private EconomyManager economyManager; + private HologramManager hologramManager; @Override public void onEnable() { @@ -102,12 +104,14 @@ public class SkyBlock extends JavaPlugin { generatorManager = new GeneratorManager(this); } + leaderboardManager = new LeaderboardManager(this); + placeholderManager = new PlaceholderManager(this); placeholderManager.registerPlaceholders(); - - leaderboardManager = new LeaderboardManager(this); + messageManager = new MessageManager(this); economyManager = new EconomyManager(); + hologramManager = new HologramManager(this); new PlaytimeTask(playerDataManager, islandManager).runTaskTimerAsynchronously(this, 0L, 20L); new VisitTask(playerDataManager).runTaskTimerAsynchronously(this, 0L, 20L); @@ -168,6 +172,10 @@ public class SkyBlock extends JavaPlugin { if (this.playerDataManager != null) { this.playerDataManager.onDisable(); } + + if (this.hologramManager != null) { + this.hologramManager.onDisable(); + } } public static SkyBlock getInstance() { @@ -238,13 +246,13 @@ public class SkyBlock extends JavaPlugin { return generatorManager; } - public PlaceholderManager getPlaceholderManager() { - return placeholderManager; - } - public LeaderboardManager getLeaderboardManager() { return leaderboardManager; } + + public PlaceholderManager getPlaceholderManager() { + return placeholderManager; + } public MessageManager getMessageManager() { return messageManager; @@ -253,6 +261,10 @@ public class SkyBlock extends JavaPlugin { public EconomyManager getEconomyManager() { return economyManager; } + + public HologramManager getHologramManager() { + return hologramManager; + } @Override public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { diff --git a/src/main/java/me/goodandevil/skyblock/command/CommandManager.java b/src/main/java/me/goodandevil/skyblock/command/CommandManager.java index f74c61a0..1caa8ade 100644 --- a/src/main/java/me/goodandevil/skyblock/command/CommandManager.java +++ b/src/main/java/me/goodandevil/skyblock/command/CommandManager.java @@ -54,6 +54,8 @@ import me.goodandevil.skyblock.command.commands.VoteCommand; import me.goodandevil.skyblock.command.commands.WeatherCommand; import me.goodandevil.skyblock.command.commands.admin.GeneratorCommand; import me.goodandevil.skyblock.command.commands.admin.ReloadCommand; +import me.goodandevil.skyblock.command.commands.admin.RemoveHologramCommand; +import me.goodandevil.skyblock.command.commands.admin.SetHologramCommand; import me.goodandevil.skyblock.command.commands.admin.SetSizeCommand; import me.goodandevil.skyblock.command.commands.admin.StructureCommand; import me.goodandevil.skyblock.config.FileManager; @@ -128,6 +130,8 @@ public class CommandManager implements CommandExecutor, TabCompleter { subCommands = new ArrayList<>(); subCommands.add(new me.goodandevil.skyblock.command.commands.admin.SetSpawnCommand(skyblock).setInfo(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Command.Island.Admin.SetSpawn.Info.Message")))); + subCommands.add(new SetHologramCommand(skyblock).setInfo(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Command.Island.Admin.SetHologram.Info.Message")))); + subCommands.add(new RemoveHologramCommand(skyblock).setInfo(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Command.Island.Admin.RemoveHologram.Info.Message")))); subCommands.add(new SetSizeCommand(skyblock).setInfo(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Command.Island.Admin.SetSize.Info.Message")))); subCommands.add(new me.goodandevil.skyblock.command.commands.admin.CreateCommand(skyblock).setInfo(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Command.Island.Admin.Create.Info.Message")))); subCommands.add(new me.goodandevil.skyblock.command.commands.admin.UpgradeCommand(skyblock).setInfo(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Command.Island.Admin.Upgrade.Info.Message")))); diff --git a/src/main/java/me/goodandevil/skyblock/command/commands/admin/ReloadCommand.java b/src/main/java/me/goodandevil/skyblock/command/commands/admin/ReloadCommand.java index b6b6a212..7569a167 100644 --- a/src/main/java/me/goodandevil/skyblock/command/commands/admin/ReloadCommand.java +++ b/src/main/java/me/goodandevil/skyblock/command/commands/admin/ReloadCommand.java @@ -3,6 +3,7 @@ package me.goodandevil.skyblock.command.commands.admin; import java.io.File; import java.util.Map; +import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; @@ -12,6 +13,9 @@ import me.goodandevil.skyblock.command.SubCommand; import me.goodandevil.skyblock.command.CommandManager.Type; import me.goodandevil.skyblock.config.FileManager; import me.goodandevil.skyblock.config.FileManager.Config; +import me.goodandevil.skyblock.hologram.Hologram; +import me.goodandevil.skyblock.hologram.HologramManager; +import me.goodandevil.skyblock.hologram.HologramType; import me.goodandevil.skyblock.message.MessageManager; import me.goodandevil.skyblock.sound.SoundManager; import me.goodandevil.skyblock.utils.version.Sounds; @@ -27,6 +31,7 @@ public class ReloadCommand extends SubCommand { @Override public void onCommand(Player player, String[] args) { + HologramManager hologramManager = skyblock.getHologramManager(); MessageManager messageManager = skyblock.getMessageManager(); SoundManager soundManager = skyblock.getSoundManager(); FileManager fileManager = skyblock.getFileManager(); @@ -51,6 +56,21 @@ public class ReloadCommand extends SubCommand { skyblock.getScoreboardManager().resendScoreboard(); } + Bukkit.getServer().getScheduler().runTask(skyblock, new Runnable() { + @Override + public void run() { + for (HologramType hologramTypeList : HologramType.values()) { + Hologram hologram = hologramManager.getHologram(hologramTypeList); + + if (hologram != null) { + hologramManager.removeHologram(hologram); + } + + hologramManager.spawnHologram(hologramTypeList); + } + } + }); + messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.Reload.Reloaded.Message")); soundManager.playSound(player, Sounds.ANVIL_USE.bukkitSound(), 1.0F, 1.0F); } else { diff --git a/src/main/java/me/goodandevil/skyblock/command/commands/admin/RemoveHologramCommand.java b/src/main/java/me/goodandevil/skyblock/command/commands/admin/RemoveHologramCommand.java new file mode 100644 index 00000000..b14b9984 --- /dev/null +++ b/src/main/java/me/goodandevil/skyblock/command/commands/admin/RemoveHologramCommand.java @@ -0,0 +1,123 @@ +package me.goodandevil.skyblock.command.commands.admin; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.lang3.text.WordUtils; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; + +import me.goodandevil.skyblock.SkyBlock; +import me.goodandevil.skyblock.command.CommandManager; +import me.goodandevil.skyblock.command.SubCommand; +import me.goodandevil.skyblock.command.CommandManager.Type; +import me.goodandevil.skyblock.config.FileManager; +import me.goodandevil.skyblock.config.FileManager.Config; +import me.goodandevil.skyblock.hologram.Hologram; +import me.goodandevil.skyblock.hologram.HologramManager; +import me.goodandevil.skyblock.hologram.HologramType; +import me.goodandevil.skyblock.message.MessageManager; +import me.goodandevil.skyblock.sound.SoundManager; +import me.goodandevil.skyblock.utils.version.Sounds; + +public class RemoveHologramCommand extends SubCommand { + + private final SkyBlock skyblock; + private String info; + + public RemoveHologramCommand(SkyBlock skyblock) { + this.skyblock = skyblock; + } + + @Override + public void onCommand(Player player, String[] args) { + HologramManager hologramManager = skyblock.getHologramManager(); + MessageManager messageManager = skyblock.getMessageManager(); + SoundManager soundManager = skyblock.getSoundManager(); + FileManager fileManager = skyblock.getFileManager(); + + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (player.hasPermission("skyblock.admin.removehologram") || player.hasPermission("skyblock.admin.*") || player.hasPermission("skyblock.*")) { + if (args.length == 1) { + HologramType hologramType = null; + + if (args[0].equalsIgnoreCase("Level")) { + hologramType = HologramType.Level; + } else if (args[0].equalsIgnoreCase("Votes")) { + hologramType = HologramType.Votes; + } + + if (hologramType != null) { + Config locationsConfig = fileManager.getConfig(new File(skyblock.getDataFolder(), "locations.yml")); + FileConfiguration locationsConfigLoad = locationsConfig.getFileConfiguration(); + + if (locationsConfigLoad.getString("Location.Hologram.Leaderboard." + hologramType.name()) == null) { + messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.RemoveHologram.Set.Message")); + soundManager.playSound(player, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); + } else { + locationsConfigLoad.set("Location.Hologram.Leaderboard." + hologramType.name(), null); + + try { + locationsConfigLoad.save(locationsConfig.getFile()); + } catch (IOException e) { + e.printStackTrace(); + } + + Bukkit.getServer().getScheduler().runTask(skyblock, new Runnable() { + @Override + public void run() { + HologramType hologramType = HologramType.valueOf(WordUtils.capitalize(args[0].toLowerCase())); + Hologram hologram = hologramManager.getHologram(hologramType); + + if (hologram != null) { + hologramManager.removeHologram(hologram); + } + } + }); + + messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.RemoveHologram.Removed.Message").replace("%type", hologramType.name())); + soundManager.playSound(player, Sounds.NOTE_PLING.bukkitSound(), 1.0F, 1.0F); + } + + return; + } + } + + messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.RemoveHologram.Invalid.Message")); + soundManager.playSound(player, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); + } else { + messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.RemoveHologram.Permission.Message")); + soundManager.playSound(player, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); + } + } + + @Override + public String getName() { + return "removehologram"; + } + + @Override + public String getInfo() { + return info; + } + + @Override + public SubCommand setInfo(String info) { + this.info = info; + + return this; + } + + @Override + public String[] getAliases() { + return new String[0]; + } + + @Override + public Type getType() { + return CommandManager.Type.Admin; + } +} diff --git a/src/main/java/me/goodandevil/skyblock/command/commands/admin/SetHologramCommand.java b/src/main/java/me/goodandevil/skyblock/command/commands/admin/SetHologramCommand.java new file mode 100644 index 00000000..f5a3e1d1 --- /dev/null +++ b/src/main/java/me/goodandevil/skyblock/command/commands/admin/SetHologramCommand.java @@ -0,0 +1,112 @@ +package me.goodandevil.skyblock.command.commands.admin; + +import java.io.File; + +import org.apache.commons.lang3.text.WordUtils; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; + +import me.goodandevil.skyblock.SkyBlock; +import me.goodandevil.skyblock.command.CommandManager; +import me.goodandevil.skyblock.command.SubCommand; +import me.goodandevil.skyblock.command.CommandManager.Type; +import me.goodandevil.skyblock.config.FileManager; +import me.goodandevil.skyblock.config.FileManager.Config; +import me.goodandevil.skyblock.hologram.Hologram; +import me.goodandevil.skyblock.hologram.HologramManager; +import me.goodandevil.skyblock.hologram.HologramType; +import me.goodandevil.skyblock.message.MessageManager; +import me.goodandevil.skyblock.sound.SoundManager; +import me.goodandevil.skyblock.utils.version.Sounds; + +public class SetHologramCommand extends SubCommand { + + private final SkyBlock skyblock; + private String info; + + public SetHologramCommand(SkyBlock skyblock) { + this.skyblock = skyblock; + } + + @Override + public void onCommand(Player player, String[] args) { + HologramManager hologramManager = skyblock.getHologramManager(); + MessageManager messageManager = skyblock.getMessageManager(); + SoundManager soundManager = skyblock.getSoundManager(); + FileManager fileManager = skyblock.getFileManager(); + + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (player.hasPermission("skyblock.admin.sethologram") || player.hasPermission("skyblock.admin.*") || player.hasPermission("skyblock.*")) { + if (args.length == 1) { + HologramType hologramType = null; + + if (args[0].equalsIgnoreCase("Level")) { + hologramType = HologramType.Level; + } else if (args[0].equalsIgnoreCase("Votes")) { + hologramType = HologramType.Votes; + } + + if (hologramType != null) { + if (hologramType == HologramType.Level || hologramType == HologramType.Votes) { + fileManager.setLocation(fileManager.getConfig(new File(skyblock.getDataFolder(), "locations.yml")), "Location.Hologram.Leaderboard." + hologramType.name(), player.getLocation(), true); + } + + Bukkit.getServer().getScheduler().runTask(skyblock, new Runnable() { + @Override + public void run() { + HologramType hologramType = HologramType.valueOf(WordUtils.capitalize(args[0].toLowerCase())); + Hologram hologram = hologramManager.getHologram(hologramType); + + if (hologram != null) { + hologramManager.removeHologram(hologram); + } + + hologramManager.spawnHologram(hologramType); + } + }); + + messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.SetHologram.Set.Message").replace("%type", hologramType.name())); + soundManager.playSound(player, Sounds.NOTE_PLING.bukkitSound(), 1.0F, 1.0F); + + return; + } + } + + messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.SetHologram.Invalid.Message")); + soundManager.playSound(player, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); + } else { + messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.SetHologram.Permission.Message")); + soundManager.playSound(player, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); + } + } + + @Override + public String getName() { + return "sethologram"; + } + + @Override + public String getInfo() { + return info; + } + + @Override + public SubCommand setInfo(String info) { + this.info = info; + + return this; + } + + @Override + public String[] getAliases() { + return new String[0]; + } + + @Override + public Type getType() { + return CommandManager.Type.Admin; + } +} diff --git a/src/main/java/me/goodandevil/skyblock/hologram/Hologram.java b/src/main/java/me/goodandevil/skyblock/hologram/Hologram.java new file mode 100644 index 00000000..f92ba895 --- /dev/null +++ b/src/main/java/me/goodandevil/skyblock/hologram/Hologram.java @@ -0,0 +1,75 @@ +package me.goodandevil.skyblock.hologram; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.EntityType; + +public class Hologram { + + private List holograms = new ArrayList<>(); + + private HologramType type; + private Location location; + + public Hologram(HologramType type, Location location, List lines) { + this.type = type; + this.location = location; + + for (String lineList : lines) { + addLine(lineList); + } + } + + public void addLine(String text) { + ArmorStand as = (ArmorStand) location.getWorld().spawnEntity(location.clone().add(0.0D, getHeight() + getHeightIncrement(), 0.0D), EntityType.ARMOR_STAND); + as.setVisible(false); + as.setGravity(false); + as.setCustomName(ChatColor.translateAlternateColorCodes('&', text)); + as.setCustomNameVisible(true); + + holograms.add(as); + } + + public void setLine(int index, String text) { + if (index < holograms.size()) { + ArmorStand as = holograms.get(index); + + if (!as.isDead()) { + as.setCustomName(ChatColor.translateAlternateColorCodes('&', text)); + as.setCustomNameVisible(true); + } + } + } + + public void removeLine(int index) { + if (index < holograms.size()) { + ArmorStand as = holograms.get(index); + + if (!as.isDead()) { + as.remove(); + } + + holograms.remove(index); + } + } + + public double getHeight() { + return -2.0D + (holograms.size() * getHeightIncrement()); + } + + public double getHeightIncrement() { + return 0.35; + } + + public HologramType getType() { + return type; + } + + public List getHolograms() { + return holograms; + } +} diff --git a/src/main/java/me/goodandevil/skyblock/hologram/HologramManager.java b/src/main/java/me/goodandevil/skyblock/hologram/HologramManager.java new file mode 100644 index 00000000..a5477a4d --- /dev/null +++ b/src/main/java/me/goodandevil/skyblock/hologram/HologramManager.java @@ -0,0 +1,260 @@ +package me.goodandevil.skyblock.hologram; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import me.goodandevil.skyblock.SkyBlock; +import me.goodandevil.skyblock.config.FileManager; +import me.goodandevil.skyblock.config.FileManager.Config; +import me.goodandevil.skyblock.island.Level; +import me.goodandevil.skyblock.leaderboard.Leaderboard; +import me.goodandevil.skyblock.leaderboard.LeaderboardManager; +import me.goodandevil.skyblock.message.MessageManager; +import me.goodandevil.skyblock.utils.NumberUtil; +import me.goodandevil.skyblock.utils.OfflinePlayer; +import me.goodandevil.skyblock.utils.world.LocationUtil; +import me.goodandevil.skyblock.visit.Visit; + +public class HologramManager { + + private final SkyBlock skyblock; + private List hologramStorage = new ArrayList<>(); + + public HologramManager(SkyBlock skyblock) { + this.skyblock = skyblock; + + FileManager fileManager = skyblock.getFileManager(); + + Bukkit.getServer().getScheduler().runTaskLater(skyblock, new Runnable() { + @Override + public void run() { + removeWorldHolograms(); + + for (HologramType hologramTypeList : HologramType.values()) { + if (hologramTypeList == HologramType.Level || hologramTypeList == HologramType.Votes) { + if (hologramTypeList == HologramType.Votes) { + if (!fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Visitor.Vote")) { + continue; + } + } + + spawnHologram(hologramTypeList); + } + } + } + }, 200L); + } + + public void onDisable() { + removeHolograms(); + } + + public void spawnHologram(HologramType type, Location location, List lines) { + hologramStorage.add(new Hologram(type, location, lines)); + } + + public void spawnHologram(HologramType type) { + LeaderboardManager leaderboardManager = skyblock.getLeaderboardManager(); + MessageManager messageManager = skyblock.getMessageManager(); + FileManager fileManager = skyblock.getFileManager(); + + Config locationsConfig = fileManager.getConfig(new File(skyblock.getDataFolder(), "locations.yml")); + FileConfiguration locationsConfigLoad = locationsConfig.getFileConfiguration(); + FileConfiguration languageConfigLoad = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration(); + + if (locationsConfigLoad.getString("Location.Hologram.Leaderboard." + type) != null) { + List leaderboardPlayers = new ArrayList<>(); + List hologramLines = new ArrayList<>(); + + if (type == HologramType.Level) { + leaderboardPlayers.addAll(leaderboardManager.getLeaderboard(Leaderboard.Type.Level)); + } else if (type == HologramType.Votes) { + leaderboardPlayers.addAll(leaderboardManager.getLeaderboard(Leaderboard.Type.Votes)); + } + + hologramLines.add(messageManager.replaceMessage(null, languageConfigLoad.getString("Hologram.Leaderboard." + type.name() + ".Header"))); + + for (int i = 0; i < 10; i++) { + if (i < leaderboardPlayers.size()) { + Leaderboard leaderboard = leaderboardPlayers.get(i); + Visit visit = leaderboard.getVisit(); + + Player targetPlayer = Bukkit.getServer().getPlayer(visit.getOwnerUUID()); + String islandOwnerName; + + if (targetPlayer == null) { + islandOwnerName = new OfflinePlayer(visit.getOwnerUUID()).getName(); + } else { + islandOwnerName = targetPlayer.getName(); + } + + if (type == HologramType.Level) { + Level level = visit.getLevel(); + hologramLines.add(messageManager.replaceMessage(null, languageConfigLoad.getString("Hologram.Leaderboard." + type.name() + ".Claimed").replace("%position", "" + (i+1)).replace("%player", islandOwnerName).replace("%level", NumberUtil.formatNumber(level.getLevel())).replace("%points", NumberUtil.formatNumber(level.getPoints())))); + } else if (type == HologramType.Votes) { + hologramLines.add(messageManager.replaceMessage(null, languageConfigLoad.getString("Hologram.Leaderboard." + type.name() + ".Claimed").replace("%position", "" + (i+1)).replace("%player", islandOwnerName).replace("%votes", "" + NumberUtil.formatNumber(visit.getVoters().size())))); + } + } else { + hologramLines.add(messageManager.replaceMessage(null, languageConfigLoad.getString("Hologram.Leaderboard." + type.name() + ".Unclaimed").replace("%position", "" + (i+1)))); + } + } + + String hologramFooter = languageConfigLoad.getString("Hologram.Leaderboard." + type.name() + ".Footer"); + + if (!hologramFooter.isEmpty()) { + hologramLines.add(messageManager.replaceMessage(null, hologramFooter)); + } + + Collections.reverse(hologramLines); + + spawnHologram(type, skyblock.getFileManager().getLocation(locationsConfig, "Location.Hologram.Leaderboard." + type, true), hologramLines); + } + } + + public void removeHologram(Hologram hologram) { + if (hologramStorage.contains(hologram)) { + List holograms = hologram.getHolograms(); + + for (Iterator it = holograms.iterator(); it.hasNext(); ) { + it.next().remove(); + } + + hologramStorage.remove(hologram); + } + } + + public void removeHolograms() { + for (Hologram hologramList : hologramStorage) { + List holograms = hologramList.getHolograms(); + + for (Iterator it = holograms.iterator(); it.hasNext(); ) { + it.next().remove(); + } + } + } + + public void removeWorldHolograms() { + FileManager fileManager = skyblock.getFileManager(); + + List locations = new ArrayList<>(); + + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "locations.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + for (HologramType hologramTypeList : HologramType.values()) { + if (hologramTypeList == HologramType.Level || hologramTypeList == HologramType.Votes) { + if (configLoad.getString("Location.Hologram.Leaderboard." + hologramTypeList.name()) != null) { + locations.add(fileManager.getLocation(config, "Location.Hologram.Leaderboard." + hologramTypeList.name(), true)); + } + } + } + + for (World worldList : Bukkit.getWorlds()) { + List entities = worldList.getEntities(); + + for (Iterator it = entities.iterator(); it.hasNext(); ) { + Entity entity = it.next(); + + if (entity instanceof ArmorStand) { + for (Location locationList : locations) { + if (LocationUtil.isLocationAtLocationRadius(entity.getLocation(), locationList, 1)) { + entity.remove(); + } + } + } + } + } + } + + public Hologram getHologram(HologramType type) { + for (Hologram hologramList : hologramStorage) { + if (hologramList.getType() == type) { + return hologramList; + } + } + + return null; + } + + public boolean hasHologram(HologramType type) { + for (Hologram hologramList : hologramStorage) { + if (hologramList.getType() == type) { + return true; + } + } + + return false; + } + + public void resetHologram() { + LeaderboardManager leaderboardManager = skyblock.getLeaderboardManager(); + MessageManager messageManager = skyblock.getMessageManager(); + FileManager fileManager = skyblock.getFileManager(); + + FileConfiguration configLoad = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration(); + + for (HologramType hologramTypeList : HologramType.values()) { + if (hologramTypeList == HologramType.Level || hologramTypeList == HologramType.Votes) { + if (hologramTypeList == HologramType.Votes) { + if (!fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Visitor.Vote")) { + continue; + } + } + + Hologram hologram; + + if (hasHologram(hologramTypeList)) { + hologram = getHologram(hologramTypeList); + } else { + continue; + } + + List leaderboardPlayers = new ArrayList<>(); + + if (hologramTypeList == HologramType.Level) { + leaderboardPlayers.addAll(leaderboardManager.getLeaderboard(Leaderboard.Type.Level)); + } else if (hologramTypeList == HologramType.Votes) { + leaderboardPlayers.addAll(leaderboardManager.getLeaderboard(Leaderboard.Type.Votes)); + } + + for (int i = 0; i < 10; i++) { + int hologramLine = 10 - i; + + if (i < leaderboardPlayers.size()) { + Leaderboard leaderboard = leaderboardPlayers.get(i); + Visit visit = leaderboard.getVisit(); + + Player targetPlayer = Bukkit.getServer().getPlayer(visit.getOwnerUUID()); + String islandOwnerName; + + if (targetPlayer == null) { + islandOwnerName = new OfflinePlayer(visit.getOwnerUUID()).getName(); + } else { + islandOwnerName = targetPlayer.getName(); + } + + if (hologramTypeList == HologramType.Level) { + Level level = visit.getLevel(); + hologram.setLine(hologramLine, messageManager.replaceMessage(null, configLoad.getString("Hologram.Leaderboard." + hologramTypeList.name() + ".Claimed").replace("%position", "" + (i+1)).replace("%player", islandOwnerName).replace("%level", NumberUtil.formatNumber(level.getLevel())).replace("%points", NumberUtil.formatNumber(level.getPoints())))); + } else if (hologramTypeList == HologramType.Votes) { + hologram.setLine(hologramLine, messageManager.replaceMessage(null, configLoad.getString("Hologram.Leaderboard." + hologramTypeList.name() + ".Claimed").replace("%position", "" + (i+1)).replace("%player", islandOwnerName).replace("%votes", "" + NumberUtil.formatNumber(visit.getVoters().size())))); + } + } else { + hologram.setLine(hologramLine, messageManager.replaceMessage(null, configLoad.getString("Hologram.Leaderboard." + hologramTypeList.name() + ".Unclaimed").replace("%position", "" + (i+1)))); + } + } + } + } + } +} diff --git a/src/main/java/me/goodandevil/skyblock/hologram/HologramType.java b/src/main/java/me/goodandevil/skyblock/hologram/HologramType.java new file mode 100644 index 00000000..a8c5274e --- /dev/null +++ b/src/main/java/me/goodandevil/skyblock/hologram/HologramType.java @@ -0,0 +1,8 @@ +package me.goodandevil.skyblock.hologram; + +public enum HologramType { + + Level, + Votes; + +} diff --git a/src/main/java/me/goodandevil/skyblock/leaderboard/LeaderboardTask.java b/src/main/java/me/goodandevil/skyblock/leaderboard/LeaderboardTask.java index 2a41c8f8..13b40950 100644 --- a/src/main/java/me/goodandevil/skyblock/leaderboard/LeaderboardTask.java +++ b/src/main/java/me/goodandevil/skyblock/leaderboard/LeaderboardTask.java @@ -17,5 +17,7 @@ public class LeaderboardTask extends BukkitRunnable { LeaderboardManager leaderboardManager = skyblock.getLeaderboardManager(); leaderboardManager.clearLeaderboard(); leaderboardManager.resetLeaderboard(); + + skyblock.getHologramManager().resetHologram(); } } diff --git a/src/main/java/me/goodandevil/skyblock/listeners/Block.java b/src/main/java/me/goodandevil/skyblock/listeners/Block.java index 8adcee73..43e97052 100644 --- a/src/main/java/me/goodandevil/skyblock/listeners/Block.java +++ b/src/main/java/me/goodandevil/skyblock/listeners/Block.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.UUID; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.configuration.file.FileConfiguration; @@ -22,6 +23,7 @@ import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockSpreadEvent; import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.block.SignChangeEvent; import org.bukkit.material.Crops; import me.goodandevil.skyblock.SkyBlock; @@ -47,6 +49,11 @@ public class Block implements Listener { public Block(SkyBlock skyblock) { this.skyblock = skyblock; } + + @EventHandler + public void onSignChange(SignChangeEvent event) { + event.setLine(0, ChatColor.RED + "test"); + } @EventHandler public void onBlockBreak(BlockBreakEvent event) { diff --git a/src/main/java/me/goodandevil/skyblock/placeholder/EZPlaceholder.java b/src/main/java/me/goodandevil/skyblock/placeholder/EZPlaceholder.java index 1383befe..ea11931d 100644 --- a/src/main/java/me/goodandevil/skyblock/placeholder/EZPlaceholder.java +++ b/src/main/java/me/goodandevil/skyblock/placeholder/EZPlaceholder.java @@ -1,6 +1,7 @@ package me.goodandevil.skyblock.placeholder; import java.io.File; +import java.util.List; import java.util.UUID; import org.bukkit.Bukkit; @@ -14,144 +15,179 @@ import me.goodandevil.skyblock.SkyBlock; import me.goodandevil.skyblock.config.FileManager.Config; import me.goodandevil.skyblock.island.Island; import me.goodandevil.skyblock.island.IslandManager; +import me.goodandevil.skyblock.island.Level; import me.goodandevil.skyblock.island.Role; +import me.goodandevil.skyblock.leaderboard.Leaderboard; +import me.goodandevil.skyblock.leaderboard.LeaderboardManager; +import me.goodandevil.skyblock.utils.NumberUtil; +import me.goodandevil.skyblock.utils.OfflinePlayer; +import me.goodandevil.skyblock.visit.Visit; public class EZPlaceholder extends PlaceholderExpansion { - private final SkyBlock skyblock; - - public EZPlaceholder(SkyBlock skyblock) { - this.skyblock = skyblock; + private final SkyBlock skyblock; + + public EZPlaceholder(SkyBlock skyblock) { + this.skyblock = skyblock; + } + + public String getIdentifier() { + return "skyblock"; } - - @Override - public String getIdentifier() { - return "skyblock"; - } - - @Override + public String getPlugin() { - return null; + return null; } - - @Override - public String getAuthor() { - return skyblock.getDescription().getAuthors().get(0); - } - - @Override - public String getVersion() { - return skyblock.getDescription().getVersion(); - } - - public String onPlaceholderRequest(Player player, String identifier) { - if (identifier.equalsIgnoreCase("islands")) { - return "" + skyblock.getVisitManager().getIslands().size(); - } - - if (player == null) { - return ""; - } - - IslandManager islandManager = skyblock.getIslandManager(); - - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (islandManager.hasIsland(player)) { - Island island = islandManager.getIsland(skyblock.getPlayerDataManager().getPlayerData(player).getOwner()); - - switch (identifier) { - case "island_size": - return value(configLoad, "Placeholder.skyblock_island_size.Non-empty.Message", island.getSize()); - case "island_radius": - return value(configLoad, "Placeholder.skyblock_island_radius.Non-empty.Message", island.getSize()); - case "island_level": - return value(configLoad, "Placeholder.skyblock_island_level.Non-empty.Message", island.getLevel().getLevel()); - case "island_points": - return value(configLoad, "Placeholder.skyblock_island_points.Non-empty.Message", island.getLevel().getPoints()); - case "island_biome": - return value(configLoad, "Placeholder.skyblock_island_biome.Non-empty.Message", island.getBiomeName()); - case "island_time": - return value(configLoad, "Placeholder.skyblock_island_time.Non-empty.Message", island.getTime()); - case "island_weather": - return value(configLoad, "Placeholder.skyblock_island_weather.Non-empty.Message", island.getWeatherName()); - case "island_bans": - return value(configLoad, "Placeholder.skyblock_island_bans.Non-empty.Message", island.getBan().getBans().size()); - case "island_members_total": - return value(configLoad, "Placeholder.skyblock_island_members_total.Non-empty.Message", (island.getRole(Role.Member).size() + island.getRole(Role.Operator).size() + 1)); - case "island_members": - return value(configLoad, "Placeholder.skyblock_island_members.Non-empty.Message", island.getRole(Role.Member).size()); - case "island_operators": - return value(configLoad, "Placeholder.skyblock_island_operators.Non-empty.Message", island.getRole(Role.Operator).size()); - case "island_visitors": - return value(configLoad, "Placeholder.skyblock_island_visitors.Non-empty.Message", island.getVisitors().size()); - case "island_role": - for (Role roleList : Role.values()) { - if (island.isRole(roleList, player.getUniqueId())) { - return value(configLoad, "Placeholder.skyblock_island_role.Non-empty.Message", roleList.name()); - } - } - case "island_owner": - UUID owner = island.getOwnerUUID(); - Player target = Bukkit.getServer().getPlayer(owner); - - if (target == null) { - return value(configLoad, "Placeholder.skyblock_island_owner.Non-empty.Other.Message", Bukkit.getServer().getOfflinePlayer(owner).getName()); - } - if (target.getName().equals(player.getName())) { - return value(configLoad, "Placeholder.skyblock_island_owner.Non-empty.Yourself.Message", target.getName()); - } else { - return value(configLoad, "Placeholder.skyblock_island_owner.Non-empty.Other.Message", target.getName()); - } - } - - return null; - } - switch (identifier) { - case "island_size": - return value(configLoad, "Placeholder.skyblock_island_size.Empty.Message"); - case "island_radius": - return value(configLoad, "Placeholder.skyblock_island_radius.Empty.Message"); - case "island_level": - return value(configLoad, "Placeholder.skyblock_island_level.Empty.Message"); - case "island_points": - return value(configLoad, "Placeholder.skyblock_island_points.Empty.Message"); - case "island_role": - return value(configLoad, "Placeholder.skyblock_island_role.Empty.Message"); - case "island_owner": - return value(configLoad, "Placeholder.skyblock_island_owner.Empty.Message"); - case "island_biome": - return value(configLoad, "Placeholder.skyblock_island_biome.Empty.Message"); - case "island_time": - return value(configLoad, "Placeholder.skyblock_island_time.Empty.Message"); - case "island_weather": - return value(configLoad, "Placeholder.skyblock_island_weather.Empty.Message"); - case "island_bans": - return value(configLoad, "Placeholder.skyblock_island_bans.Empty.Message"); - case "island_members_total": - return value(configLoad, "Placeholder.skyblock_island_members_total.Empty.Message"); - case "island_members": - return value(configLoad, "Placeholder.skyblock_island_members.Empty.Message"); - case "island_operators": - return value(configLoad, "Placeholder.skyblock_island_operators.Empty.Message"); - case "island_visitors": - return value(configLoad, "Placeholder.skyblock_island_visitors.Empty.Message"); + public String getAuthor() { + return skyblock.getDescription().getAuthors().get(0); + } + + public String getVersion() { + return skyblock.getDescription().getVersion(); + } + + public String onPlaceholderRequest(Player player, String identifier) { + LeaderboardManager leaderboardManager = skyblock.getLeaderboardManager(); + IslandManager islandManager = skyblock.getIslandManager(); + + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + List leaderboardLevelPlayers = leaderboardManager.getLeaderboard(Leaderboard.Type.Level); + List leaderboardVotesPlayers = leaderboardManager.getLeaderboard(Leaderboard.Type.Votes); + + if (identifier.equalsIgnoreCase("islands")) { + return "" + skyblock.getVisitManager().getIslands().size(); + } else { + for (int i = 0; i < 10; i++) { + if (identifier.equalsIgnoreCase("skyblock_leaderboard_votes_" + (i+1))) { + if (i < leaderboardVotesPlayers.size()) { + Leaderboard leaderboard = leaderboardVotesPlayers.get(i); + Visit visit = leaderboard.getVisit(); + + Player targetPlayer = Bukkit.getServer().getPlayer(visit.getOwnerUUID()); + String islandOwnerName; + + if (targetPlayer == null) { + islandOwnerName = new OfflinePlayer(visit.getOwnerUUID()).getName(); + } else { + islandOwnerName = targetPlayer.getName(); + } + + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_leaderboard_votes.Non-empty.Message").replace("%position", "" + (i+1)).replace("%player", islandOwnerName).replace("%votes", NumberUtil.formatNumber(visit.getVoters().size()))); + } + + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_leaderboard_votes.Empty.Message")); + } else if (identifier.equalsIgnoreCase("skyblock_leaderboard_level_" + (i+1))) { + if (i < leaderboardLevelPlayers.size()) { + Leaderboard leaderboard = leaderboardLevelPlayers.get(i); + Visit visit = leaderboard.getVisit(); + Level level = visit.getLevel(); + + Player targetPlayer = Bukkit.getServer().getPlayer(visit.getOwnerUUID()); + String islandOwnerName; + + if (targetPlayer == null) { + islandOwnerName = new OfflinePlayer(visit.getOwnerUUID()).getName(); + } else { + islandOwnerName = targetPlayer.getName(); + } + + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_leaderboard_level.Non-empty.Message").replace("%position", "" + (i+1)).replace("%player", islandOwnerName).replace("%level", NumberUtil.formatNumber(level.getLevel())).replace("%points", NumberUtil.formatNumber(level.getPoints()))); + } + + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_leaderboard_level.Empty.Message")); + } + } + } + + if(player == null){ + return ""; } - + + if (islandManager.hasIsland(player)) { + Island island = islandManager.getIsland(skyblock.getPlayerDataManager().getPlayerData(player).getOwner()); + + if (identifier.equalsIgnoreCase("island_size")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_size.Non-empty.Message").replace("%placeholder", "" + island.getSize())); + } else if (identifier.equalsIgnoreCase("island_radius")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_radius.Non-empty.Message").replace("%placeholder", "" + island.getRadius())); + } else if (identifier.equalsIgnoreCase("island_level")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_level.Non-empty.Message").replace("%placeholder", "" + island.getLevel().getLevel())); + } else if (identifier.equalsIgnoreCase("island_points")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_points.Non-empty.Message").replace("%placeholder", "" + island.getLevel().getPoints())); + } else if (identifier.equalsIgnoreCase("island_role")) { + for (Role roleList : Role.values()) { + if (island.isRole(roleList, player.getUniqueId())) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_role.Non-empty.Message").replace("%placeholder", roleList.name())); + } + } + } else if (identifier.equalsIgnoreCase("island_owner")) { + UUID islandOwnerUUID = island.getOwnerUUID(); + Player targetPlayer = Bukkit.getServer().getPlayer(islandOwnerUUID); + + if (targetPlayer == null) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_owner.Non-empty.Other.Message").replace("%placeholder", Bukkit.getServer().getOfflinePlayer(islandOwnerUUID).getName())); + } else { + if (targetPlayer.getName().equals(player.getName())) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_owner.Non-empty.Yourself.Message").replace("%placeholder", targetPlayer.getName())); + } else { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_owner.Non-empty.Other.Message").replace("%placeholder", targetPlayer.getName())); + } + } + } else if (identifier.equalsIgnoreCase("island_biome")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_biome.Non-empty.Message").replace("%placeholder", island.getBiomeName())); + } else if (identifier.equalsIgnoreCase("island_time")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_time.Non-empty.Message").replace("%placeholder", "" + island.getTime())); + } else if (identifier.equalsIgnoreCase("island_weather")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_weather.Non-empty.Message").replace("%placeholder", "" + island.getWeatherName())); + } else if (identifier.equalsIgnoreCase("island_bans")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_bans.Non-empty.Message").replace("%placeholder", "" + island.getBan().getBans().size())); + } else if (identifier.equalsIgnoreCase("island_members_total")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_members_total.Non-empty.Message").replace("%placeholder", "" + (island.getRole(Role.Member).size() + island.getRole(Role.Operator).size() + 1))); + } else if (identifier.equalsIgnoreCase("island_members")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_members.Non-empty.Message").replace("%placeholder", "" + island.getRole(Role.Member).size())); + } else if (identifier.equalsIgnoreCase("island_operators")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_operators.Non-empty.Message").replace("%placeholder", "" + island.getRole(Role.Operator).size())); + } else if (identifier.equalsIgnoreCase("island_visitors")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_visitors.Non-empty.Message").replace("%placeholder", "" + island.getVisitors().size())); + } + + return null; + } + + if (identifier.equalsIgnoreCase("island_size")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_size.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_radius")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_radius.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_level")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_level.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_points")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_points.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_role")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_role.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_owner")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_owner.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_biome")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_biome.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_time")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_time.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_weather")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_weather.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_bans")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_bans.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_members_total")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_members_total.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_members")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_members.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_operators")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_operators.Empty.Message")); + } else if (identifier.equalsIgnoreCase("island_visitors")) { + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_island_visitors.Empty.Message")); + } + return null; } - - private String color(String msg) { - return ChatColor.translateAlternateColorCodes('&', msg); - } - - private String value(FileConfiguration configLoad, String string, Object value) { - return color(configLoad.getString(string).replace("%placeholder", (CharSequence) value)); - } - - private String value(FileConfiguration configLoad, String string) { - return color(configLoad.getString(string)); - } } + diff --git a/src/main/java/me/goodandevil/skyblock/placeholder/MVdWPlaceholder.java b/src/main/java/me/goodandevil/skyblock/placeholder/MVdWPlaceholder.java index 079c4eb9..15e71f5c 100644 --- a/src/main/java/me/goodandevil/skyblock/placeholder/MVdWPlaceholder.java +++ b/src/main/java/me/goodandevil/skyblock/placeholder/MVdWPlaceholder.java @@ -1,6 +1,7 @@ package me.goodandevil.skyblock.placeholder; import java.io.File; +import java.util.List; import java.util.UUID; import org.bukkit.Bukkit; @@ -16,7 +17,13 @@ import me.goodandevil.skyblock.SkyBlock; import me.goodandevil.skyblock.config.FileManager.Config; import me.goodandevil.skyblock.island.Island; import me.goodandevil.skyblock.island.IslandManager; +import me.goodandevil.skyblock.island.Level; import me.goodandevil.skyblock.island.Role; +import me.goodandevil.skyblock.leaderboard.Leaderboard; +import me.goodandevil.skyblock.leaderboard.LeaderboardManager; +import me.goodandevil.skyblock.utils.NumberUtil; +import me.goodandevil.skyblock.utils.OfflinePlayer; +import me.goodandevil.skyblock.visit.Visit; public class MVdWPlaceholder { @@ -27,17 +34,74 @@ public class MVdWPlaceholder { } public void register() { + LeaderboardManager leaderboardManager = skyblock.getLeaderboardManager(); IslandManager islandManager = skyblock.getIslandManager(); Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")); FileConfiguration configLoad = config.getFileConfiguration(); + List leaderboardLevelPlayers = leaderboardManager.getLeaderboard(Leaderboard.Type.Level); + List leaderboardVotesPlayers = leaderboardManager.getLeaderboard(Leaderboard.Type.Votes); + PlaceholderAPI.registerPlaceholder(skyblock, "skyblock_islands", new PlaceholderReplacer() { @Override public String onPlaceholderReplace(PlaceholderReplaceEvent event) { return "" + skyblock.getVisitManager().getIslands().size(); } }); + + for (int i = 0; i < 10; i++) { + PlaceholderAPI.registerPlaceholder(skyblock, "skyblock_leaderboard_votes_" + (i+1), new PlaceholderReplacer() { + @Override + public String onPlaceholderReplace(PlaceholderReplaceEvent event) { + int index = Integer.valueOf(event.getPlaceholder().replace("skyblock_leaderboard_votes_", "")); + + if (index < leaderboardVotesPlayers.size()) { + Leaderboard leaderboard = leaderboardVotesPlayers.get(index); + Visit visit = leaderboard.getVisit(); + + Player targetPlayer = Bukkit.getServer().getPlayer(visit.getOwnerUUID()); + String islandOwnerName; + + if (targetPlayer == null) { + islandOwnerName = new OfflinePlayer(visit.getOwnerUUID()).getName(); + } else { + islandOwnerName = targetPlayer.getName(); + } + + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_leaderboard_votes.Non-empty.Message").replace("%position", "" + (index+1)).replace("%player", islandOwnerName).replace("%votes", NumberUtil.formatNumber(visit.getVoters().size()))); + } + + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_leaderboard_votes.Empty.Message")); + } + }); + + PlaceholderAPI.registerPlaceholder(skyblock, "skyblock_leaderboard_level_" + (i+1), new PlaceholderReplacer() { + @Override + public String onPlaceholderReplace(PlaceholderReplaceEvent event) { + int index = Integer.valueOf(event.getPlaceholder().replace("skyblock_leaderboard_level_", "")); + + if (index < leaderboardLevelPlayers.size()) { + Leaderboard leaderboard = leaderboardLevelPlayers.get(index); + Visit visit = leaderboard.getVisit(); + Level level = visit.getLevel(); + + Player targetPlayer = Bukkit.getServer().getPlayer(visit.getOwnerUUID()); + String islandOwnerName; + + if (targetPlayer == null) { + islandOwnerName = new OfflinePlayer(visit.getOwnerUUID()).getName(); + } else { + islandOwnerName = targetPlayer.getName(); + } + + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_leaderboard_level.Non-empty.Message").replace("%position", "" + (index+1)).replace("%player", islandOwnerName).replace("%level", NumberUtil.formatNumber(level.getLevel())).replace("%points", NumberUtil.formatNumber(level.getPoints()))); + } + + return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.skyblock_leaderboard_level.Empty.Message")); + } + }); + } PlaceholderAPI.registerPlaceholder(skyblock, "skyblock_island_size", new PlaceholderReplacer() { @Override diff --git a/src/main/java/me/goodandevil/skyblock/utils/world/block/BlockUtil.java b/src/main/java/me/goodandevil/skyblock/utils/world/block/BlockUtil.java index ac3fa6c4..b13f3792 100644 --- a/src/main/java/me/goodandevil/skyblock/utils/world/block/BlockUtil.java +++ b/src/main/java/me/goodandevil/skyblock/utils/world/block/BlockUtil.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.Material; @@ -147,7 +148,24 @@ public final class BlockUtil { blockData.setStateType(BlockStateType.JUKEBOX.toString()); } else if (blockState instanceof Sign) { Sign sign = (Sign) blockState; - blockData.setSignLines(sign.getLines()); + + String[] signLines = sign.getLines(); + + if (signLines != null) { + List correctedSignLines = new ArrayList<>(); + + for (String signLineList : signLines) { + for (ChatColor chatColorList : ChatColor.values()) { + signLineList = signLineList.replace(chatColorList + "", "&" + chatColorList.toString().substring(chatColorList.toString().length() -1)); + } + + correctedSignLines.add(signLineList); + } + + signLines = correctedSignLines.toArray(new String[correctedSignLines.size()]); + } + + blockData.setSignLines(signLines); blockData.setStateType(BlockStateType.SIGN.toString()); } else if (blockState instanceof Skull) { Skull skull = (Skull) blockState; @@ -306,7 +324,7 @@ public final class BlockUtil { Sign sign = (Sign) block.getState(); for (int i = 0; i < blockData.getSignLines().length; i++) { - sign.setLine(i, blockData.getSignLines()[i]); + sign.setLine(i, ChatColor.translateAlternateColorCodes('&', blockData.getSignLines()[i])); } sign.update(); diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index b36af91d..9273f6de 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -652,6 +652,26 @@ Command: Message: "&bSkyBlock &8| &cError&8: &eYou cannot set the spawn point in an Island world." Set: Message: "&bSkyBlock &8| &aInfo&8: &eThe spawn point has been set to your location." + SetHologram: + Info: + Message: "&f&oSets the location of a hologram." + Permission: + Message: "&bSkyBlock &8| &cError&8: &eYou don't have permission to perform that command." + Invalid: + Message: "&bSkyBlock &8| &cError&8: &eInvalid: /island admin sethologram " + Set: + Message: "&bSkyBlock &8| &aInfo&8: &eThe '&b%type&e' hologram has been set to your location." + RemoveHologram: + Info: + Message: "&f&oRemoves an existing hologram." + Permission: + Message: "&bSkyBlock &8| &cError&8: &eYou don't have permission to perform that command." + Invalid: + Message: "&bSkyBlock &8| &cError&8: &eInvalid: /island admin removehologram " + Set: + Message: "&bSkyBlock &8| &cError&8: &eA location for that hologram has not been set." + Removed: + Message: "&bSkyBlock &8| &aInfo&8: &eYou have removed the '&b%type&e' hologram." SetSize: Info: Message: "&f&oSets the size of a players Island." @@ -900,6 +920,16 @@ Island: Division: Message: "&bSkyBlock &8| &aInfo&8: &eYou have set the points division to '&f%division&e'." Placeholder: + skyblock_leaderboard_level: + Empty: + Message: "&f&oUnclaimed" + Non-empty: + Message: "&f[%position] %player [%level]" + skyblock_leaderboard_votes: + Empty: + Message: "&f&oUnclaimed" + Non-empty: + Message: "&f[%position] %player [%votes]" skyblock_island_size: Empty: Message: "&c0" @@ -973,6 +1003,18 @@ Placeholder: Message: "&c0" Non-empty: Message: "&f%placeholder" +Hologram: + Leaderboard: + Level: + Header: "&b&lSkyBlock &8&l| &e&lTop 10 Level" + Claimed: "&8* &f&o[%position] &a%player &7- &6%level" + Unclaimed: "&8* &f&o[%position] &7&oUnclaimed Position" + Footer: "&ewww.example.net" + Votes: + Header: "&b&lSkyBlock &8&l| &e&lTop 10 Votes" + Claimed: "&8* &f&o[%position] &a%player &7- &6%votes" + Unclaimed: "&8* &f&o[%position] &7&oUnclaimed Position" + Footer: "&ewww.example.net" Scoreboard: Tutorial: Displayname: "&b&lSkyBlock" diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0c75f21d..abae3fe6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: SkyBlock main: me.goodandevil.skyblock.SkyBlock -version: 32 +version: 33 api-version: 1.13 description: A unique SkyBlock plugin author: GoodAndEvil