diff --git a/pom.xml b/pom.xml index 9828609c..85a875df 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.songoda skyblock - 2.3.29 + 2.3.30 jar @@ -218,19 +218,6 @@ provided - - be.maximvdw - MVdWPlaceholderAPI - 2.1.1-SNAPSHOT - - - - org.spigotmc - spigot - - - - me.clip placeholderapi diff --git a/src/main/java/com/songoda/skyblock/SkyBlock.java b/src/main/java/com/songoda/skyblock/SkyBlock.java index ab617ea7..bdf4b38f 100644 --- a/src/main/java/com/songoda/skyblock/SkyBlock.java +++ b/src/main/java/com/songoda/skyblock/SkyBlock.java @@ -65,7 +65,7 @@ public class SkyBlock extends SongodaPlugin { private static SkyBlock INSTANCE; private FileManager fileManager; - private WorldManager worldManager; + private final WorldManager worldManager = new WorldManager(this); private UserCacheManager userCacheManager; private VisitManager visitManager; private BanManager banManager; @@ -166,7 +166,7 @@ public class SkyBlock extends SongodaPlugin { permissionManager = new PermissionManager(this); localizationManager = new LocalizationManager(); - worldManager = new WorldManager(this); + worldManager.loadWorlds(); userCacheManager = new UserCacheManager(this); visitManager = new VisitManager(this); banManager = new BanManager(this); @@ -184,7 +184,6 @@ public class SkyBlock extends SongodaPlugin { structureManager = new StructureManager(this); soundManager = new SoundManager(this); - if (this.config.getBoolean("Island.Generator.Enable")) { generatorManager = new GeneratorManager(this); } @@ -206,7 +205,6 @@ public class SkyBlock extends SongodaPlugin { bankManager = new BankManager(this); - if (this.config.getBoolean("Island.Task.PlaytimeTask")) { new PlaytimeTask(playerDataManager, islandManager).runTaskTimerAsynchronously(this, 0L, 20L); } @@ -323,7 +321,6 @@ public class SkyBlock extends SongodaPlugin { return null; } - private boolean loadConfigs() { try { biomes = this.getFileManager().getConfig(new File(this.getDataFolder(), "biomes.yml")).getFileConfiguration(); @@ -500,7 +497,6 @@ public class SkyBlock extends SongodaPlugin { return economyManager; } - public FileConfiguration getBiomes() { return biomes; } @@ -556,5 +552,4 @@ public class SkyBlock extends SongodaPlugin { public FileConfiguration getScoreboard() { return scoreboard; } - } diff --git a/src/main/java/com/songoda/skyblock/blockscanner/ChunkLoader.java b/src/main/java/com/songoda/skyblock/blockscanner/ChunkLoader.java index 4933a2b9..1bb96aae 100644 --- a/src/main/java/com/songoda/skyblock/blockscanner/ChunkLoader.java +++ b/src/main/java/com/songoda/skyblock/blockscanner/ChunkLoader.java @@ -4,14 +4,12 @@ import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.island.Island; import com.songoda.skyblock.island.IslandEnvironment; import com.songoda.skyblock.island.IslandWorld; -import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.scheduler.BukkitRunnable; import java.util.LinkedList; import java.util.List; -import java.util.concurrent.CompletableFuture; public class ChunkLoader extends BukkitRunnable { public final List positions = new LinkedList<>(); @@ -116,14 +114,14 @@ public class ChunkLoader extends BukkitRunnable { @Override public void run() { // TODO New algorithm that start from the center of the island - for (int i = 0; i < chunkPerTick || paper; i++) { + for (int i = 0; i < chunkPerTick || paper; ++i) { if (x <= maxX) { if (z <= maxZ) { if (!chunkForChunk) { - positions.add(new CachedChunk(world, x >> 4, z >> 4)); + positions.add(new CachedChunk(world, x, z)); } else { if (chunkTask != null) { - chunkTask.onChunkComplete(new CachedChunk(world, x >> 4, z >> 4)); + chunkTask.onChunkComplete(new CachedChunk(world, x, z)); } } diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/SetBiomeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/SetBiomeCommand.java index 613f51b3..b59d9571 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/SetBiomeCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/SetBiomeCommand.java @@ -45,24 +45,24 @@ public class SetBiomeCommand extends SubCommand { Config config = fileManager.getConfig(new File(plugin.getDataFolder(), "language.yml")); FileConfiguration configLoad = config.getFileConfiguration(); - + if (args.length >= 2) { String biomeName = args[1].toUpperCase().trim(); - + IslandWorld world = null; - if(args[2] != null) { + if (args.length > 2) { String worldName = args[2].toUpperCase().trim(); - for(IslandWorld islandWorld : IslandWorld.values()) { - if(islandWorld.name().equalsIgnoreCase(worldName)) { + for (IslandWorld islandWorld : IslandWorld.values()) { + if (islandWorld.name().equalsIgnoreCase(worldName)) { world = islandWorld; } } } - - if(world == null) { + + if (world == null) { world = IslandWorld.Normal; } - + CompatibleBiome biome = null; for (CompatibleBiome cbiome : CompatibleBiome.values()) { if (cbiome.isCompatible() && cbiome.name().equals(biomeName)) { @@ -88,12 +88,12 @@ public class SetBiomeCommand extends SubCommand { if (islandOwnerUUID == null) { messageManager.sendMessage(sender, configLoad.getString("Command.Island.Admin.SetBiome.Island.Owner.Message")); - soundManager.playSound(sender, CompatibleSound.ENTITY_VILLAGER_NO.getSound(), 1.0F, 1.0F); + soundManager.playSound(sender, CompatibleSound.ENTITY_VILLAGER_NO.getSound(), 1.0F, 1.0F); } else { if (islandManager.containsIsland(islandOwnerUUID)) { Island island = islandManager.getIsland(Bukkit.getServer().getOfflinePlayer(islandOwnerUUID)); biomeManager.setBiome(island, world, biome, null); - if(world.equals(IslandWorld.Normal)) { + if (world.equals(IslandWorld.Normal)) { island.setBiome(biome.getBiome()); } } else { @@ -107,7 +107,7 @@ public class SetBiomeCommand extends SubCommand { CompatibleBiome finalBiome = biome; IslandWorld finalWorld = world; biomeManager.setBiome(island, world, biome, () -> { - if(finalWorld.equals(IslandWorld.Normal)) { + if (finalWorld.equals(IslandWorld.Normal)) { island.setBiome(finalBiome.getBiome()); } }); diff --git a/src/main/java/com/songoda/skyblock/command/commands/island/BanCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/BanCommand.java index c107ec90..23fc5699 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/island/BanCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/island/BanCommand.java @@ -53,7 +53,6 @@ public class BanCommand extends SubCommand { OfflinePlayer targetPlayerOffline = new OfflinePlayer(args[0]); targetPlayerUUID = targetPlayerOffline.getUniqueId(); targetPlayerName = targetPlayerOffline.getName(); - } else { targetPlayerUUID = targetPlayer.getUniqueId(); targetPlayerName = targetPlayer.getName(); @@ -62,7 +61,7 @@ public class BanCommand extends SubCommand { if (targetPlayerUUID == null) { messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Found.Message")); soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); - } else if((targetPlayer.hasPermission("fabledskyblock.bypass.ban") || targetPlayer.isOp())){ + } else if (targetPlayer != null && (targetPlayer.hasPermission("fabledskyblock.bypass.ban") || targetPlayer.isOp())) { messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Exempt")); soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); } else if (targetPlayerUUID.equals(player.getUniqueId())) { @@ -70,36 +69,37 @@ public class BanCommand extends SubCommand { soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); } else if (island.hasRole(IslandRole.Member, targetPlayerUUID) || island.hasRole(IslandRole.Operator, targetPlayerUUID) || island.hasRole(IslandRole.Owner, targetPlayerUUID)) { - messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Member.Message")); - soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); - } else - if (island.getBan().isBanned(targetPlayerUUID)) { - messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Already.Message")); - soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); - } else { - messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Banned.Sender.Message").replace("%player", targetPlayerName)); - soundManager.playSound(player, CompatibleSound.ENTITY_IRON_GOLEM_ATTACK.getSound(), 1.0F, 1.0F); + messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Member.Message")); + soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); + } else if (island.getBan().isBanned(targetPlayerUUID)) { + messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Already.Message")); + soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); + } else { + messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Banned.Sender.Message") + .replace("%player", targetPlayerName)); + soundManager.playSound(player, CompatibleSound.ENTITY_IRON_GOLEM_ATTACK.getSound(), 1.0F, 1.0F); - if (island.isCoopPlayer(targetPlayerUUID)) { - island.removeCoopPlayer(targetPlayerUUID); - } + if (island.isCoopPlayer(targetPlayerUUID)) { + island.removeCoopPlayer(targetPlayerUUID); + } - Ban ban = island.getBan(); - ban.addBan(player.getUniqueId(), targetPlayerUUID); - ban.save(); + Ban ban = island.getBan(); + ban.addBan(player.getUniqueId(), targetPlayerUUID); + ban.save(); - if (targetPlayer != null) { - if (islandManager.isPlayerAtIsland(island, targetPlayer)) { - messageManager.sendMessage(targetPlayer, configLoad.getString("Command.Island.Ban.Banned.Target.Message").replace("%player", player.getName())); - soundManager.playSound(targetPlayer, CompatibleSound.ENTITY_IRON_GOLEM_ATTACK.getSound(), 1.0F, 1.0F); + if (targetPlayer != null) { + if (islandManager.isPlayerAtIsland(island, targetPlayer)) { + messageManager.sendMessage(targetPlayer, configLoad.getString("Command.Island.Ban.Banned.Target.Message") + .replace("%player", player.getName())); + soundManager.playSound(targetPlayer, CompatibleSound.ENTITY_IRON_GOLEM_ATTACK.getSound(), 1.0F, 1.0F); - LocationUtil.teleportPlayerToSpawn(targetPlayer); - } + LocationUtil.teleportPlayerToSpawn(targetPlayer); } } + } } else { messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Permission.Message")); - soundManager.playSound(player, CompatibleSound.ENTITY_VILLAGER_NO.getSound(), 1.0F, 1.0F); + soundManager.playSound(player, CompatibleSound.ENTITY_VILLAGER_NO.getSound(), 1.0F, 1.0F); } } else { messageManager.sendMessage(player, configLoad.getString("Command.Island.Ban.Disabled.Message")); diff --git a/src/main/java/com/songoda/skyblock/command/commands/island/UnbanCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/UnbanCommand.java index 61628b41..9371590c 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/island/UnbanCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/island/UnbanCommand.java @@ -41,11 +41,11 @@ public class UnbanCommand extends SubCommand { .getBoolean("Island.Visitor.Banning")) { if (island.hasRole(IslandRole.Owner, player.getUniqueId()) || (island.hasRole(IslandRole.Operator, player.getUniqueId()) - && plugin.getPermissionManager().hasPermission(island,"Unban", IslandRole.Operator))) { + && plugin.getPermissionManager().hasPermission(island, "Unban", IslandRole.Operator))) { Player targetPlayer = Bukkit.getServer().getPlayer(args[0]); - UUID targetPlayerUUID = null; - String targetPlayerName = null; + UUID targetPlayerUUID; + String targetPlayerName; if (targetPlayer == null) { OfflinePlayer targetPlayerOffline = new OfflinePlayer(args[0]); @@ -82,7 +82,7 @@ public class UnbanCommand extends SubCommand { } } else { messageManager.sendMessage(player, configLoad.getString("Command.Island.Unban.Permission.Message")); - soundManager.playSound(player, CompatibleSound.ENTITY_VILLAGER_NO.getSound(), 1.0F, 1.0F); + soundManager.playSound(player, CompatibleSound.ENTITY_VILLAGER_NO.getSound(), 1.0F, 1.0F); } } else { messageManager.sendMessage(player, configLoad.getString("Command.Island.Unban.Disabled.Message")); diff --git a/src/main/java/com/songoda/skyblock/gui/biome/GuiBiome.java b/src/main/java/com/songoda/skyblock/gui/biome/GuiBiome.java index 5e8e38ce..59323e07 100644 --- a/src/main/java/com/songoda/skyblock/gui/biome/GuiBiome.java +++ b/src/main/java/com/songoda/skyblock/gui/biome/GuiBiome.java @@ -74,15 +74,15 @@ public class GuiBiome extends Gui { soundManager.playSound(event.player, CompatibleSound.BLOCK_CHEST_CLOSE.getSound(), 1f, 1f); event.player.closeInventory(); }); - + List lore = languageLoad.getStringList("Menu.Biome.Item.Info.Lore"); for (ListIterator i = lore.listIterator(); i.hasNext(); ) { i.set(TextUtils.formatText(i.next().replace("%biome_type", island.getBiomeName()))); } - + setItem(4, GuiUtils.createButtonItem(CompatibleMaterial.PAINTING, // Info TextUtils.formatText(languageLoad.getString("Menu.Biome.Item.Info.Displayname")), lore)); - + for(int i=9; i<18; i++){ setItem(i, CompatibleMaterial.BLACK_STAINED_GLASS_PANE.getItem()); } @@ -122,9 +122,9 @@ public class GuiBiome extends Gui { if(biomes.size() > 0){ biomes.sort(Comparator.comparing(m -> m.biome.name())); - + this.pages = (int) Math.max(1, Math.ceil((double) biomes.size() / 27d)); - + if (page != 1) setButton(5, 2, GuiUtils.createButtonItem(CompatibleMaterial.ARROW, TextUtils.formatText(languageLoad.getString("Menu.Biome.Item.Last.Displayname"))), @@ -132,7 +132,7 @@ public class GuiBiome extends Gui { page--; paint(); }); - + if (page != pages) setButton(5, 6, GuiUtils.createButtonItem(CompatibleMaterial.ARROW, TextUtils.formatText(languageLoad.getString("Menu.Biome.Item.Next.Displayname"))), @@ -157,7 +157,7 @@ public class GuiBiome extends Gui { if(icon.biome.getBiome().equals(island.getBiome())){ icon.enchant(); } - + setButton(i, icon.displayItem, event -> { if (cooldownManager.hasPlayer(CooldownType.Biome, player) && !player.hasPermission("fabledskyblock.bypass.cooldown")) { CooldownPlayer cooldownPlayer = cooldownManager.getCooldownPlayer(CooldownType.Biome, player); @@ -191,7 +191,7 @@ public class GuiBiome extends Gui { soundManager.playSound(player, CompatibleSound.ENTITY_VILLAGER_YES.getSound(), 1.0F, 1.0F); } }); - island.setBiome(icon.biome.getBiome()); + island.setBiome(icon.biome.getBiome()); // FIXME: A event is fired with has a setBiome method... island.save(); }); diff --git a/src/main/java/com/songoda/skyblock/island/IslandManager.java b/src/main/java/com/songoda/skyblock/island/IslandManager.java index 8c030747..9344ed84 100644 --- a/src/main/java/com/songoda/skyblock/island/IslandManager.java +++ b/src/main/java/com/songoda/skyblock/island/IslandManager.java @@ -61,7 +61,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class IslandManager { - private final SkyBlock plugin; private final List islandPositions = new ArrayList<>(); @@ -169,7 +168,7 @@ public class IslandManager { posY = (int) (r - (a % en)); break; default: - System.err.println("[FabledSkyblock][prepareNextAvailableLocation] Erreur dans la spirale, valeur : " + loc); + plugin.getLogger().warning("[FabledSkyblock][prepareNextAvailableLocation] Error in the spiral value: " + loc); return null; } posX = posX * offset; diff --git a/src/main/java/com/songoda/skyblock/listeners/BlockListeners.java b/src/main/java/com/songoda/skyblock/listeners/BlockListeners.java index 51349092..763b97a5 100644 --- a/src/main/java/com/songoda/skyblock/listeners/BlockListeners.java +++ b/src/main/java/com/songoda/skyblock/listeners/BlockListeners.java @@ -5,6 +5,7 @@ import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.CompatibleSound; import com.songoda.core.compatibility.ServerVersion; import com.songoda.core.hooks.LogManager; +import com.songoda.core.utils.NumberUtils; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.generator.Generator; import com.songoda.skyblock.generator.GeneratorManager; @@ -19,7 +20,6 @@ import com.songoda.skyblock.limit.impl.BlockLimitation; import com.songoda.skyblock.permission.PermissionManager; import com.songoda.skyblock.stackable.Stackable; import com.songoda.skyblock.stackable.StackableManager; -import com.songoda.core.utils.NumberUtils; import com.songoda.skyblock.utils.version.CompatibleSpawners; import com.songoda.skyblock.utils.world.LocationUtil; import com.songoda.skyblock.world.WorldManager; @@ -187,7 +187,6 @@ public class BlockListeners implements Listener { if (CompatibleMaterial.getMaterial(belowBlock).isTall()) { block = belowBlock; } - } if (block.getType() == CompatibleMaterial.SPAWNER.getBlockMaterial()) { @@ -513,7 +512,6 @@ public class BlockListeners implements Listener { event.setCancelled(true); } } - } private boolean performStackCheck(org.bukkit.block.Block block, List list, BlockFace blockFace) { @@ -715,7 +713,6 @@ public class BlockListeners implements Listener { BlockFace dispenserDirection = ((org.bukkit.material.Dispenser) event.getBlock().getState().getData()).getFacing(); org.bukkit.block.Block placeLocation = event.getBlock().getRelative(dispenserDirection); - if (CompatibleMaterial.getMaterial(event.getItem()) == CompatibleMaterial.WATER_BUCKET && this.plugin.getConfiguration().getBoolean("Island.Nether.AllowNetherWater", false)) placeLocation.setType(Material.WATER); @@ -762,7 +759,7 @@ public class BlockListeners implements Listener { return; IslandLevel level = island.getLevel(); - if (level.hasMaterial(destmaterial.name())) { + if (destmaterial != null && level.hasMaterial(destmaterial.name())) { long materialAmount = level.getMaterialAmount(destmaterial.name()); if (materialAmount - 1 <= 0) { diff --git a/src/main/java/com/songoda/skyblock/menus/Leaderboard.java b/src/main/java/com/songoda/skyblock/menus/Leaderboard.java index 8182e5ab..d0ec8a60 100644 --- a/src/main/java/com/songoda/skyblock/menus/Leaderboard.java +++ b/src/main/java/com/songoda/skyblock/menus/Leaderboard.java @@ -3,11 +3,11 @@ package com.songoda.skyblock.menus; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.CompatibleSound; import com.songoda.core.utils.ItemUtils; +import com.songoda.core.utils.NumberUtils; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.placeholder.Placeholder; import com.songoda.skyblock.playerdata.PlayerDataManager; import com.songoda.skyblock.sound.SoundManager; -import com.songoda.core.utils.NumberUtils; import com.songoda.skyblock.utils.item.nInventoryUtil; import com.songoda.skyblock.utils.player.OfflinePlayer; import com.songoda.skyblock.visit.Visit; @@ -23,9 +23,21 @@ import java.util.ArrayList; import java.util.List; public class Leaderboard { - private static Leaderboard instance; + private static final String[] steveSkinTexture = new String[] { + "otpbxDm9B+opW7jEzZF8BVDeZSqaqdF0dyLlnlyMh7Q5ysJFDL48/9J/IOHp8JqNm1oarmVdvxrroy9dlNI2Mz4BVuJM2pcCOJwk2h+aZ4dzNZGxst+MYNPSw+i4sMoYu7OV07UVHrQffolFF7MiaBUst1hFwM07IpTE6UtIQz4rqWisXe9Iz5+ooqX4wj0IB3dPntsh6u5nVlL8acWCBDAW4YqcPt2Y4CKK+KtskjzusjqGAdEO+4lRcW1S0ldo2RNtUHEzZADWQcADjg9KKiKq9QIpIpYURIoIAA+pDGb5Q8L5O6CGI+i1+FxqXbgdBvcm1EG0OPdw9WpSqAxGGeXSwlzjILvlvBzYbd6gnHFBhFO+X7iwRJYNd+qQakjUa6ZwR8NbkpbN3ABb9+6YqVkabaEmgfky3HdORE+bTp/AT6LHqEMQo0xdNkvF9gtFci7RWhFwuTLDvQ1esby1IhlgT+X32CPuVHuxEvPCjN7+lmRz2OyOZ4REo2tAIFUKakqu3nZ0NcF98b87wAdA9B9Qyd2H/rEtUToQhpBjP732Sov6TlJkb8echGYiLL5bu/Q7hum72y4+j2GNnuRiOJtJidPgDqrYMg81GfenfPyS6Ynw6KhdEhnwmJ1FJlJhYvXZyqZwLAV1c26DNYkrTMcFcv3VXmcd5/2Zn9FnZtw=", + "ewogICJ0aW1lc3RhbXAiIDogMTYyMTcxNTMxMjI5MCwKICAicHJvZmlsZUlkIiA6ICJiNTM5NTkyMjMwY2I0MmE0OWY5YTRlYmYxNmRlOTYwYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJtYXJpYW5hZmFnIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzFhNGFmNzE4NDU1ZDRhYWI1MjhlN2E2MWY4NmZhMjVlNmEzNjlkMTc2OGRjYjEzZjdkZjMxOWE3MTNlYjgxMGIiCiAgICB9CiAgfQp9" + }; + private static final String[] alexSkinTexture = new String[] { + "rZvLQoZsgLYaoKqEuASopYAs7IAlZlsGkwagoM8ZX38cP9kalseZrWY5OHZVfoiftdQJ+lGOzkiFfyx6kNJDTZniLrnRa8sd3X6D65ZihT1sOm/RInCwxpS1K0zGCM2h9ErkWswfwaviIf7hJtrwk8/zL0bfzDk2IgX/IBvIZpVoYTfmQsVY9jgSwORrS9ObePGIfFgmThMoZnCYWQMVpS2+yTFA2wnw9hmisQK9UWBU+iBZv55bMmkMcyEuXw1w14DaEu+/M0UGD91LU4GmJLPA9T4GCuIV8GxOcraSVIajki1cMlOBQwIaibB2NE6KAwq1Zh6NnsNYucy6qFM+136lXfBchQ1Nx4FDRZQgt8VRqTMy/OQFpr2nTbWWbRU4gRFpKC3R0518DqUH0Qm612kPWniKku/QzUUBSe1PSVljBaZCyyRx0OB1a1/8MexboKRnPXuTDnmPa9UPfuH4VO0q+qYkjV2KUzP6e5vIP5aQ6USPrMie7MmAHFJzwAMIbLjgkTVx91GWtYqg/t7qBlvrdBRLIPPsy/DSOqa+2+4hABouVCPZrBMCMLzstPPQoqZAyiCqcKb2HqWSU0h9Bhx19yoIcbHCeI3zsQs8PqIBjUL4mO6VQT4lzHy0e3M61Xsdd8S1GtsakSetTvEtMdUwCEDfBA5PRRTLOVYTY+g=", + "ewogICJ0aW1lc3RhbXAiIDogMTYyMTcxNTQ5ODM0MywKICAicHJvZmlsZUlkIiA6ICIxYTc1ZTNiYmI1NTk0MTc2OTVjMmY4NTY1YzNlMDAzZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJUZXJvZmFyIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzNiNjBhMWY2ZDU2MmY1MmFhZWJiZjE0MzRmMWRlMTQ3OTMzYTNhZmZlMGU3NjRmYTQ5ZWEwNTc1MzY2MjNjZDMiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==" + }; + private static final String[] questionMarkSkinTexture = new String[] { + "gi+wnQt/y4Z6E9rn65iDWmt8vUOM2WXY66XvtydqDJZTzwgFrjVcx2c5YwdzvtOIRtiX2nZt4n2uWesUFKb59xS24YWbxCDXnalHhCpPFcIP58SQbCm9AYp3UPzkcRNWzuV4BddrS608QQZGyIFOUaLPOPasGITZu51VLcOKcTyFOCKu1QE2yRo1orTH8bWfdpE769BB/VYGdny0qJtm1amc12wGiVifMJRutZmYo2ZdA0APhIJVaNsPppNESVcbeBCvk60l4QK43C/p98/QEe5U6UJ6Z6N01pBQcswubMu8lCuPLasep+vX3v2K+Ui9jnTQNreGNIZPWVjf6V1GH4xMbbUVQJsoPdcaXG855VdzyoW+kyHdWYEojSn0qAY/moH6JCLnx6PLCv9mITSvOIUHq8ITet0M7Z9KALY5s6eg6VdA8TvClRy2TTm9tIRt//TJo5JxBoTYujawGNSR7ryODj2UEDQ2xOyWSagxAXZpispdrO5jHxRmBZUwX9vxnAp+CNWxifpu9sINJTlqYsT/KlGOJQC483gv5B6Nm5VBB1DRFmQkohzO6Wc2eDixgEbaU795GlLxrNaFfNjVH6Bwr1e7df2H3nE0P0bexs4wYdWplijn4gPyHwjT2LDBPGFQK3Vo2SlaXfPYbkIHX21c9qaz3eWHpLEXUBQfnWc=", + "eyJ0aW1lc3RhbXAiOjE1MzE3MTcxNjY3MDAsInByb2ZpbGVJZCI6IjYwNmUyZmYwZWQ3NzQ4NDI5ZDZjZTFkMzMyMWM3ODM4IiwicHJvZmlsZU5hbWUiOiJNSEZfUXVlc3Rpb24iLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2QzNGUwNjNjYWZiNDY3YTVjOGRlNDNlYzc4NjE5Mzk5ZjM2OWY0YTUyNDM0ZGE4MDE3YTk4M2NkZDkyNTE2YTAifX19" + }; + public static Leaderboard getInstance() { if (instance == null) { instance = new Leaderboard(); @@ -100,11 +112,11 @@ public class Leaderboard { .replace("%leaderboard", Viewer.Type.Level.name()), configLoad.getStringList( "Menu.Leaderboard." + viewer.getType().name() + ".Item.Leaderboard.Lore"), - new Placeholder[]{new Placeholder("%leaderboard", Viewer.Type.Level.name())}, null, + new Placeholder[] {new Placeholder("%leaderboard", Viewer.Type.Level.name())}, null, null), 1); - if(plugin.getConfiguration().getBoolean("Island.Bank.Enable")){ + if (plugin.getConfiguration().getBoolean("Island.Bank.Enable")) { nInv.addItem( nInv.createItem(new ItemStack(Material.GOLD_INGOT), configLoad .getString( @@ -112,7 +124,7 @@ public class Leaderboard { .replace("%leaderboard", Viewer.Type.Bank.name()), configLoad.getStringList( "Menu.Leaderboard." + viewer.getType().name() + ".Item.Leaderboard.Lore"), - new Placeholder[]{new Placeholder("%leaderboard", Viewer.Type.Bank.name())}, null, + new Placeholder[] {new Placeholder("%leaderboard", Viewer.Type.Bank.name())}, null, null), 2); } else { @@ -126,7 +138,7 @@ public class Leaderboard { .replace("%leaderboard", Viewer.Type.Votes.name()), configLoad.getStringList( "Menu.Leaderboard." + viewer.getType().name() + ".Item.Leaderboard.Lore"), - new Placeholder[]{new Placeholder("%leaderboard", Viewer.Type.Votes.name())}, null, + new Placeholder[] {new Placeholder("%leaderboard", Viewer.Type.Votes.name())}, null, null), 3); @@ -246,7 +258,7 @@ public class Leaderboard { if (playerDataManager.hasPlayerData(targetPlayer)) { playerTexture = playerDataManager.getPlayerData(targetPlayer).getTexture(); } else { - playerTexture = new String[]{null, null}; + playerTexture = new String[] {null, null}; } } @@ -288,14 +300,21 @@ public class Leaderboard { } } + if (playerTexture[0] == null || playerTexture[1] == null) { + if ((visit.getOwnerUUID().hashCode() & 1) != 0) { + playerTexture = alexSkinTexture; + } else { + playerTexture = steveSkinTexture; + } + } + nInv.addItem( nInv.createItem(ItemUtils.getCustomHead(playerTexture[0], playerTexture[1]), configLoad.getString("Menu.Leaderboard.Leaderboard.Item.Island.Displayname") - .replace( - "%owner", playerName) + .replace("%owner", playerName) .replace("%position", "" + (leaderboard.getPosition() + 1)), itemLore, - new Placeholder[]{ + new Placeholder[] { new Placeholder("%position", "" + (leaderboard.getPosition() + 1)), new Placeholder("%owner", playerName), new Placeholder("%level", "" + visit.getLevel().getLevel()), @@ -306,17 +325,15 @@ public class Leaderboard { itemSlot); } - int[] itemSlots = new int[]{13, 21, 22, 23, 29, 31, 33, 37, 40, 43}; + int[] itemSlots = new int[] {13, 21, 22, 23, 29, 31, 33, 37, 40, 43}; for (int i = 0; i < itemSlots.length; i++) { if (!nInv.getItems().containsKey(itemSlots[i])) { - nInv.addItem(nInv.createItem(ItemUtils.getCustomHead( - "gi+wnQt/y4Z6E9rn65iDWmt8vUOM2WXY66XvtydqDJZTzwgFrjVcx2c5YwdzvtOIRtiX2nZt4n2uWesUFKb59xS24YWbxCDXnalHhCpPFcIP58SQbCm9AYp3UPzkcRNWzuV4BddrS608QQZGyIFOUaLPOPasGITZu51VLcOKcTyFOCKu1QE2yRo1orTH8bWfdpE769BB/VYGdny0qJtm1amc12wGiVifMJRutZmYo2ZdA0APhIJVaNsPppNESVcbeBCvk60l4QK43C/p98/QEe5U6UJ6Z6N01pBQcswubMu8lCuPLasep+vX3v2K+Ui9jnTQNreGNIZPWVjf6V1GH4xMbbUVQJsoPdcaXG855VdzyoW+kyHdWYEojSn0qAY/moH6JCLnx6PLCv9mITSvOIUHq8ITet0M7Z9KALY5s6eg6VdA8TvClRy2TTm9tIRt//TJo5JxBoTYujawGNSR7ryODj2UEDQ2xOyWSagxAXZpispdrO5jHxRmBZUwX9vxnAp+CNWxifpu9sINJTlqYsT/KlGOJQC483gv5B6Nm5VBB1DRFmQkohzO6Wc2eDixgEbaU795GlLxrNaFfNjVH6Bwr1e7df2H3nE0P0bexs4wYdWplijn4gPyHwjT2LDBPGFQK3Vo2SlaXfPYbkIHX21c9qaz3eWHpLEXUBQfnWc=", - "eyJ0aW1lc3RhbXAiOjE1MzE3MTcxNjY3MDAsInByb2ZpbGVJZCI6IjYwNmUyZmYwZWQ3NzQ4NDI5ZDZjZTFkMzMyMWM3ODM4IiwicHJvZmlsZU5hbWUiOiJNSEZfUXVlc3Rpb24iLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2QzNGUwNjNjYWZiNDY3YTVjOGRlNDNlYzc4NjE5Mzk5ZjM2OWY0YTUyNDM0ZGE4MDE3YTk4M2NkZDkyNTE2YTAifX19"), - configLoad.getString("Menu.Leaderboard.Leaderboard.Item.Empty.Displayname") - .replace("%position", "" + (i + 1)), - configLoad.getStringList("Menu.Leaderboard.Leaderboard.Item.Empty.Lore"), - new Placeholder[]{new Placeholder("%position", "" + (i + 1))}, null, null), + nInv.addItem(nInv.createItem(ItemUtils.getCustomHead(questionMarkSkinTexture[0], questionMarkSkinTexture[1]), + configLoad.getString("Menu.Leaderboard.Leaderboard.Item.Empty.Displayname") + .replace("%position", "" + (i + 1)), + configLoad.getStringList("Menu.Leaderboard.Leaderboard.Item.Empty.Lore"), + new Placeholder[] {new Placeholder("%position", "" + (i + 1))}, null, null), itemSlots[i]); } } diff --git a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java index 172951dc..a2912353 100644 --- a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java +++ b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java @@ -4,9 +4,13 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.ban.BanManager; -import com.songoda.skyblock.config.FileManager; import com.songoda.skyblock.config.FileManager.Config; -import com.songoda.skyblock.island.*; +import com.songoda.skyblock.island.Island; +import com.songoda.skyblock.island.IslandLocation; +import com.songoda.skyblock.island.IslandManager; +import com.songoda.skyblock.island.IslandRole; +import com.songoda.skyblock.island.IslandStatus; +import com.songoda.skyblock.island.IslandWorld; import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.scoreboard.ScoreboardManager; import com.songoda.skyblock.utils.player.OfflinePlayer; @@ -25,7 +29,6 @@ import java.util.Map; import java.util.UUID; public class PlayerDataManager { - private final SkyBlock plugin; private final Map playerDataStorage = new HashMap<>(); @@ -61,9 +64,9 @@ public class PlayerDataManager { Method getProfileMethod = entityPlayer.getClass().getMethod("getProfile"); GameProfile gameProfile = (GameProfile) getProfileMethod.invoke(entityPlayer); Property property = gameProfile.getProperties().get("textures").iterator().next(); - playerTexture = new String[]{property.getSignature(), property.getValue()}; + playerTexture = new String[] {property.getSignature(), property.getValue()}; } catch (Exception e) { - playerTexture = new String[]{ + playerTexture = new String[] { "K9P4tCIENYbNpDuEuuY0shs1x7iIvwXi4jUUVsATJfwsAIZGS+9OZ5T2HB0tWBoxRvZNi73Vr+syRdvTLUWPusVXIg+2fhXmQoaNEtnQvQVGQpjdQP0TkZtYG8PbvRxE6Z75ddq+DVx/65OSNHLWIB/D+Rg4vINh4ukXNYttn9QvauDHh1aW7/IkIb1Bc0tLcQyqxZQ3mdglxJfgIerqnlA++Lt7TxaLdag4y1NhdZyd3OhklF5B0+B9zw/qP8QCzsZU7VzJIcds1+wDWKiMUO7+60OSrIwgE9FPamxOQDFoDvz5BOULQEeNx7iFMB+eBYsapCXpZx0zf1bduppBUbbVC9wVhto/J4tc0iNyUq06/esHUUB5MHzdJ0Y6IZJAD/xIw15OLCUH2ntvs8V9/cy5/n8u3JqPUM2zhUGeQ2p9FubUGk4Q928L56l3omRpKV+5QYTrvF+AxFkuj2hcfGQG3VE2iYZO6omXe7nRPpbJlHkMKhE8Xvd1HP4PKpgivSkHBoZ92QEUAmRzZydJkp8CNomQrZJf+MtPiNsl/Q5RQM+8CQThg3+4uWptUfP5dDFWOgTnMdA0nIODyrjpp+bvIJnsohraIKJ7ZDnj4tIp4ObTNKDFC/8j8JHz4VCrtr45mbnzvB2DcK8EIB3JYT7ElJTHnc5BKMyLy5SKzuw=", "eyJ0aW1lc3RhbXAiOjE1MjkyNTg0MTE4NDksInByb2ZpbGVJZCI6Ijg2NjdiYTcxYjg1YTQwMDRhZjU0NDU3YTk3MzRlZWQ3IiwicHJvZmlsZU5hbWUiOiJTdGV2ZSIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGMxYzc3Y2U4ZTU0OTI1YWI1ODEyNTQ0NmVjNTNiMGNkZDNkMGNhM2RiMjczZWI5MDhkNTQ4Mjc4N2VmNDAxNiJ9LCJDQVBFIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjc2N2Q0ODMyNWVhNTMyNDU2MTQwNmI4YzgyYWJiZDRlMjc1NWYxMTE1M2NkODVhYjA1NDVjYzIifX19"}; } @@ -128,7 +131,7 @@ public class PlayerDataManager { public void storeIsland(Player player) { MessageManager messageManager = plugin.getMessageManager(); IslandManager islandManager = plugin.getIslandManager(); - WorldManager worldManager = plugin.getWorldManager();; + WorldManager worldManager = plugin.getWorldManager(); BanManager banManager = plugin.getBanManager(); FileConfiguration configLoad = plugin.getLanguage(); @@ -187,16 +190,22 @@ public class PlayerDataManager { islandManager.updateFlight(player); ScoreboardManager scoreboardManager = plugin.getScoreboardManager(); + if (scoreboardManager != null) { + Island finalIsland = island; + Bukkit.getScheduler().runTask(plugin, () -> { - for (Player loopPlayer : Bukkit.getOnlinePlayers()) { - PlayerData targetPlayerData = getPlayerData(loopPlayer); - if (targetPlayerData == null) - continue; - - if (targetPlayerData.getOwner() != null && - targetPlayerData.getOwner().equals(island.getOwnerUUID())) { - scoreboardManager.updatePlayerScoreboardType(loopPlayer); - } + for (Player loopPlayer : Bukkit.getOnlinePlayers()) { + PlayerData targetPlayerData = getPlayerData(loopPlayer); + if (targetPlayerData == null) { + continue; + } + + if (targetPlayerData.getOwner() != null && + targetPlayerData.getOwner().equals(finalIsland.getOwnerUUID())) { + scoreboardManager.updatePlayerScoreboardType(loopPlayer); + } + } + }); } return; diff --git a/src/main/java/com/songoda/skyblock/scoreboard/Driver.java b/src/main/java/com/songoda/skyblock/scoreboard/Driver.java index 976ab4a8..0964c0fb 100644 --- a/src/main/java/com/songoda/skyblock/scoreboard/Driver.java +++ b/src/main/java/com/songoda/skyblock/scoreboard/Driver.java @@ -30,14 +30,14 @@ class Driver extends BukkitRunnable { ConfigurationSection config = scoreboardLoad.getConfigurationSection(boardType.getConfigSection()); - if(config != null) { + if (config != null) { List lines = config.getStringList("Title.Content"); int interval = config.getInt("Title.Interval"); title = new Row(lines, interval); - for(int i = 1; i<16; i++) { + for (int i = 1; i < 16; i++) { List rowLines = config.getStringList("Rows." + i + ".Content"); - if(!rowLines.isEmpty()) { + if (!rowLines.isEmpty()) { Row row = new Row(rowLines, config.getInt("Rows." + i + ".Interval")); rows.add(row); } @@ -56,33 +56,41 @@ class Driver extends BukkitRunnable { } void registerHolder(Holder holder) { - holders.add(holder); + synchronized (this.holders) { + this.holders.add(holder); + } } void unregisterHolder(Holder holder) { - holders.remove(holder); + synchronized (this.holders) { + this.holders.remove(holder); + } } void unregisterHolder(Player player) { - Iterator it = holders.iterator(); - while(it.hasNext()) { - Holder holder = it.next(); - if(holder.getPlayer().equals(player)) { - it.remove(); - break; + synchronized (this.holders) { + Iterator it = this.holders.iterator(); + while (it.hasNext()) { + Holder holder = it.next(); + if (holder.getPlayer().equals(player)) { + it.remove(); + break; + } } } } - + @Override public void run() { title.update(); - for(Row row : rows) { + for (Row row : rows) { row.update(); } - for(Holder holder : holders) { - holder.update(); + synchronized (this.holders) { + for (Holder holder : holders) { + holder.update(); + } } } diff --git a/src/main/java/com/songoda/skyblock/world/WorldManager.java b/src/main/java/com/songoda/skyblock/world/WorldManager.java index a08d7754..85604e56 100644 --- a/src/main/java/com/songoda/skyblock/world/WorldManager.java +++ b/src/main/java/com/songoda/skyblock/world/WorldManager.java @@ -25,8 +25,6 @@ public class WorldManager { public WorldManager(SkyBlock plugin) { this.plugin = plugin; - - loadWorlds(); } public void loadWorlds() { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6aec3a34..37fed9e1 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,7 +5,7 @@ api-version: 1.13 description: A unique SkyBlock plugin author: Songoda authors: [ Fabrimat ] -softdepend: [ HolographicDisplays, Holograms, PlaceholderAPI, MVdWPlaceholderAPI, Vault, Reserve, PlayerPoints, +softdepend: [ HolographicDisplays, Holograms, PlaceholderAPI, Vault, Reserve, PlayerPoints, LeaderHeads, EpicSpawners, UltimateStacker, WorldEdit, Residence, CoreProtect, CMIEInjector ] loadbefore: [Multiverse-Core, ProtocolLib] commands: @@ -13,4 +13,4 @@ commands: description: Island command aliases: [ is ] skyblock: - description: Skyblock info command. \ No newline at end of file + description: Skyblock info command.