From c61f7ea46f0fa26e19647ad4f908533cb94c1be5 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Sun, 1 Aug 2021 11:33:53 +0200 Subject: [PATCH 001/127] Updated sonarcloud badge --- .github/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index e2a56078..4dce1c5a 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,6 +1,6 @@ ![](https://images.plugily.xyz/banner/display.php?id=MurderMystery) -# Murder Mystery [![](https://img.shields.io/badge/javadocs-latest-red.svg)](https://jd.plugily.xyz/apidocs/minecraft/murdermystery/) [![](https://img.shields.io/badge/wiki-click-blue.svg)](https://wiki.plajer.xyz/minecraft/murdermystery/index.php) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=Plajer-Lair_MurderMystery&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=Plajer-Lair_MurderMystery) [![Discord](https://img.shields.io/discord/345628548716822530.svg?color=7289DA&label=discord)](https://discord.gg/UXzUdTP) +# Murder Mystery [![](https://img.shields.io/badge/javadocs-latest-red.svg)](https://jd.plugily.xyz/apidocs/minecraft/murdermystery/) [![](https://img.shields.io/badge/wiki-click-blue.svg)](https://wiki.plajer.xyz/minecraft/murdermystery/index.php) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=Plugily-Projects_MurderMystery&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=Plugily-Projects_MurderMystery) [![Discord](https://img.shields.io/discord/345628548716822530.svg?color=7289DA&label=discord)](https://discord.gg/UXzUdTP) Murder Mystery is a Minecraft minigame designed for small and big servers. This minigame is unique and very configurable, 100% free and open source! Be the murderer and kill everyone in the game! Beware of the detective and armored innocents! As a detective you must kill the murderer and protect as much innocents as you can! From cfe0ad7d631d0807a90bbc7d772c6a46d85e9e86 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 1 Aug 2021 09:34:25 +0000 Subject: [PATCH 002/127] Bump pom.xml from 1.7.9 to 1.7.9-dev0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6c18fb2b..94d25b36 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9 + 1.7.9-dev0 MurderMystery From d8f3fffc45f23ad9db1eb7f2c508359b52b693f1 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Thu, 5 Aug 2021 14:12:26 +0200 Subject: [PATCH 003/127] Improved leaderboard command --- CHANGELOG.md | 3 ++ .../murdermystery/api/StatsStorage.java | 11 ++++- .../arguments/game/LeaderboardArgument.java | 44 ++++++------------- .../murdermystery/user/data/FileStats.java | 7 +++ .../murdermystery/user/data/MysqlManager.java | 10 +++++ .../murdermystery/user/data/UserDatabase.java | 13 ++++++ 6 files changed, 55 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3c8c664..9d16511c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### 1.8.0 Release (05.08.2021 - xx.xx.202x) +* Improved leaderboard command + ### 1.7.9 Release (30.05.2021 - 01.08.2021) * Added forcestart item * Added murderer and detective pass (Command and Item to activate) diff --git a/src/main/java/plugily/projects/murdermystery/api/StatsStorage.java b/src/main/java/plugily/projects/murdermystery/api/StatsStorage.java index 3f677630..5ddbdaff 100644 --- a/src/main/java/plugily/projects/murdermystery/api/StatsStorage.java +++ b/src/main/java/plugily/projects/murdermystery/api/StatsStorage.java @@ -68,7 +68,10 @@ public static Map getStats(StatisticType stat) { ResultSet set = statement.executeQuery("SELECT UUID, " + stat.getName() + " FROM " + ((MysqlManager) plugin.getUserManager().getDatabase()).getTableName() + " ORDER BY " + stat.getName()); Map column = new LinkedHashMap<>(); while(set.next()) { - column.put(UUID.fromString(set.getString("UUID")), set.getInt(stat.getName())); + try { + column.put(UUID.fromString(set.getString("UUID")), set.getInt(stat.getName())); + } catch (IllegalArgumentException e) { + } } return column; } catch(SQLException e) { @@ -85,7 +88,11 @@ public static Map getStats(StatisticType stat) { if(string.equals("data-version")) { continue; } - stats.put(UUID.fromString(string), config.getInt(string + "." + stat.getName())); + + try { + stats.put(UUID.fromString(string), config.getInt(string + "." + stat.getName())); + } catch (IllegalArgumentException e) { + } } return SortUtils.sortByValue(stats); } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaderboardArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaderboardArgument.java index af953b87..dc8377f7 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaderboardArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaderboardArgument.java @@ -19,22 +19,14 @@ package plugily.projects.murdermystery.commands.arguments.game; import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; -import plugily.projects.murdermystery.ConfigPreferences; import plugily.projects.murdermystery.api.StatsStorage; import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; import plugily.projects.murdermystery.commands.completion.CompletableArgument; import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.user.data.MysqlManager; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.UUID; @@ -87,33 +79,23 @@ public void execute(CommandSender sender, String[] args) { } private void printLeaderboard(CommandSender sender, StatsStorage.StatisticType statisticType) { - java.util.Map stats = (LinkedHashMap) StatsStorage.getStats(statisticType); + java.util.Map stats = StatsStorage.getStats(statisticType); sender.sendMessage(chatManager.colorMessage("Commands.Statistics.Header")); - String statistic = StringUtils.capitalize(statisticType.toString().toLowerCase().replace("_", " ")); - Object[] array = stats.keySet().toArray(); - UUID current = (UUID) array[array.length - 1]; - - for(int i = 0; i < 10; i++) { - try { - sender.sendMessage(formatMessage(statistic, Bukkit.getOfflinePlayer(current).getName(), i + 1, stats.remove(current))); - } catch(IndexOutOfBoundsException ex) { - sender.sendMessage(formatMessage(statistic, "Empty", i + 1, 0)); - } catch(NullPointerException ex) { - if(registry.getPlugin().getConfigPreferences().getOption(ConfigPreferences.Option.DATABASE_ENABLED)) { - try(Connection connection = registry.getPlugin().getMysqlDatabase().getConnection()) { - Statement statement = connection.createStatement(); - ResultSet set = statement.executeQuery("SELECT name FROM " + ((MysqlManager) registry.getPlugin().getUserManager().getDatabase()).getTableName() + " WHERE UUID='" + current.toString() + "'"); - if(set.next()) { - sender.sendMessage(formatMessage(statistic, set.getString(1), i + 1, stats.get(current))); - continue; - } - } catch(SQLException ignored) { - //it has failed second time, cannot continue - } + String statistic = StringUtils.capitalize(statisticType.toString().toLowerCase().replace('_', ' ')); + UUID[] array = stats.keySet().toArray(new UUID[0]); + + for(int i = 1; i <= 10; i++) { + if (array.length - i < 0) { + sender.sendMessage(formatMessage(statistic, "Empty", i, 0)); + } else { + UUID current = array[array.length - i]; + String name = registry.getPlugin().getUserManager().getDatabase().getPlayerName(current); + if (name == null) { + name = "Unknown Player"; } - sender.sendMessage(formatMessage(statistic, "Unknown Player", i + 1, stats.get(current))); + sender.sendMessage(formatMessage(statistic, name, i, stats.get(current))); } } } diff --git a/src/main/java/plugily/projects/murdermystery/user/data/FileStats.java b/src/main/java/plugily/projects/murdermystery/user/data/FileStats.java index 3f901000..f9497812 100644 --- a/src/main/java/plugily/projects/murdermystery/user/data/FileStats.java +++ b/src/main/java/plugily/projects/murdermystery/user/data/FileStats.java @@ -18,6 +18,8 @@ package plugily.projects.murdermystery.user.data; +import java.util.UUID; + import org.bukkit.configuration.file.FileConfiguration; import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; import plugily.projects.murdermystery.Main; @@ -61,4 +63,9 @@ public void loadStatistics(User user) { } } + @Override + public String getPlayerName(UUID uuid) { + return plugin.getServer().getOfflinePlayer(uuid).getName(); + } + } diff --git a/src/main/java/plugily/projects/murdermystery/user/data/MysqlManager.java b/src/main/java/plugily/projects/murdermystery/user/data/MysqlManager.java index dd2c2375..d27f417f 100644 --- a/src/main/java/plugily/projects/murdermystery/user/data/MysqlManager.java +++ b/src/main/java/plugily/projects/murdermystery/user/data/MysqlManager.java @@ -32,6 +32,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.UUID; import java.util.logging.Level; /** @@ -131,6 +132,15 @@ public void loadStatistics(User user) { }); } + @Override + public String getPlayerName(UUID uuid) { + try(Connection connection = database.getConnection(); Statement statement = connection.createStatement()) { + return statement.executeQuery("Select `name` FROM " + getTableName() + " WHERE UUID='" + uuid.toString() + "'").toString(); + } catch(SQLException | NullPointerException e) { + return null; + } + } + public String getTableName() { return ConfigUtils.getConfig(plugin, "mysql").getString("table", "playerstats"); } diff --git a/src/main/java/plugily/projects/murdermystery/user/data/UserDatabase.java b/src/main/java/plugily/projects/murdermystery/user/data/UserDatabase.java index 4459cc4f..e3a736fe 100644 --- a/src/main/java/plugily/projects/murdermystery/user/data/UserDatabase.java +++ b/src/main/java/plugily/projects/murdermystery/user/data/UserDatabase.java @@ -18,6 +18,10 @@ package plugily.projects.murdermystery.user.data; +import java.util.UUID; + +import org.jetbrains.annotations.Nullable; + import plugily.projects.murdermystery.api.StatsStorage; import plugily.projects.murdermystery.user.User; @@ -50,4 +54,13 @@ public interface UserDatabase { */ void loadStatistics(User user); + /** + * Get the name of the player providing the UUID + * + * @param uuid the UUID + * @return the player's name + */ + @Nullable + String getPlayerName(UUID uuid); + } From 8cae1f50f331a489c5aebbc25e0811d9bfdba358 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Aug 2021 12:13:01 +0000 Subject: [PATCH 004/127] Bump pom.xml from 1.7.9-dev0 to 1.7.9-dev1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 94d25b36..322010be 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev0 + 1.7.9-dev1 MurderMystery From b9e745a17de4f33b292c2e7f79d57ccfeac6be26 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Thu, 5 Aug 2021 21:57:28 +0200 Subject: [PATCH 005/127] Some fixes - Giving passes to detectives does not displays the corresponding value --- .../plugily/projects/murdermystery/Main.java | 2 +- .../projects/murdermystery/arena/Arena.java | 56 +++++++++++-------- .../murdermystery/arena/ArenaEvents.java | 4 +- .../arguments/admin/RolePassArgument.java | 2 +- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/Main.java b/src/main/java/plugily/projects/murdermystery/Main.java index ab2faad1..d9cc70b4 100644 --- a/src/main/java/plugily/projects/murdermystery/Main.java +++ b/src/main/java/plugily/projects/murdermystery/Main.java @@ -183,13 +183,13 @@ public void onDisable() { arena.getScoreboardManager().stopAllScoreboards(); for(Player player : arena.getPlayers()) { arena.doBarAction(Arena.BarAction.REMOVE, player); - arena.teleportToEndLocation(player); player.setFlySpeed(0.1f); player.getInventory().clear(); player.getInventory().setArmorContents(null); player.getActivePotionEffects().forEach(pe -> player.removePotionEffect(pe.getType())); player.setWalkSpeed(0.2f); player.setGameMode(GameMode.SURVIVAL); + arena.teleportToEndLocation(player); if(configPreferences.getOption(ConfigPreferences.Option.INVENTORY_MANAGER_ENABLED)) { InventorySerializer.loadInventory(this, player); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index 79be513f..f9c8bee9 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -152,8 +152,6 @@ public void run() { Debugger.performance("ArenaTask", "[PerformanceMonitor] [{0}] Running game task", getId()); long start = System.currentTimeMillis(); - boolean bossBarEnabled = ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_9_R1) && plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BOSSBAR_ENABLED); - switch(arenaState) { case WAITING_FOR_PLAYERS: if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { @@ -167,7 +165,7 @@ public void run() { break; } } else { - if(bossBarEnabled) { + if(gameBar != null) { gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players")); } chatManager.broadcast(this, chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Enough-Players-To-Start")); @@ -188,20 +186,22 @@ public void run() { int timer = getTimer(); double startWaitingTime = plugin.getConfig().getDouble("Starting-Waiting-Time", 60); - if(bossBarEnabled) { + if(gameBar != null) { gameBar.setTitle(chatManager.colorMessage("Bossbar.Starting-In").replace("%time%", Integer.toString(timer))); gameBar.setProgress(timer / startWaitingTime); } + float exp = (float) (timer / startWaitingTime); + for(Player player : players) { - player.setExp((float) (timer / startWaitingTime)); + player.setExp(exp); player.setLevel(timer); } int minimumPlayers = getMinimumPlayers(); if(!forceStart && players.size() < minimumPlayers) { - if(bossBarEnabled) { + if(gameBar != null) { gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players")); gameBar.setProgress(1.0); } @@ -242,7 +242,7 @@ public void run() { Bukkit.getPluginManager().callEvent(new MMGameStartEvent(this)); setArenaState(ArenaState.IN_GAME); - if(bossBarEnabled) { + if(gameBar != null) { gameBar.setProgress(1.0); } @@ -319,14 +319,19 @@ public void run() { if (i >= sortedMurdererArray.length) break; - Player murderer = ((User) sortedMurdererArray[i]).getPlayer(); - setCharacter(CharacterType.MURDERER, murderer); - allMurderer.add(murderer); - plugin.getUserManager().getUser(murderer).setStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, 1); - playersToSet.remove(murderer); - VersionUtils.sendTitles(murderer, chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Title"), - chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Subtitle"), 5, 40, 5); - detectiveChances.remove(sortedMurdererArray[i]); + User user = (User) sortedMurdererArray[i]; + Player murderer = user.getPlayer(); + + if (murderer != null) { + setCharacter(CharacterType.MURDERER, murderer); + allMurderer.add(murderer); + user.setStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, 1); + playersToSet.remove(murderer); + VersionUtils.sendTitles(murderer, chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Title"), + chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Subtitle"), 5, 40, 5); + } + + detectiveChances.remove(user); } //shuffling map to avoid the same detectives on the next round @@ -342,10 +347,15 @@ public void run() { if (i >= sortedDetArray.length) break; - Player detective = ((User) sortedDetArray[i]).getPlayer(); + User user = (User) sortedDetArray[i]; + + Player detective = user.getPlayer(); + if (detective == null) + continue; + setCharacter(CharacterType.DETECTIVE, detective); allDetectives.add(detective); - plugin.getUserManager().getUser(detective).setStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, 1); + user.setStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, 1); VersionUtils.sendTitles(detective, chatManager.colorMessage("In-Game.Messages.Role-Set.Detective-Title"), chatManager.colorMessage("In-Game.Messages.Role-Set.Detective-Subtitle"), 5, 40, 5); playersToSet.remove(detective); @@ -356,11 +366,13 @@ public void run() { Debugger.debug("Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Players: Detectives = {4}, Murders = {5}", getId(), maxdetectives, maxmurderer, playersSize, allDetectives, allMurderer); + String innocentTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Title"); + String innocentSubTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Subtitle"); for(Player p : playersToSet) { - VersionUtils.sendTitles(p, chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Title"), - chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Subtitle"), 5, 40, 5); + VersionUtils.sendTitles(p, innocentTitle, innocentSubTitle, 5, 40, 5); } - if(bossBarEnabled) { + + if(gameBar != null) { gameBar.setTitle(chatManager.colorMessage("Bossbar.In-Game-Info")); } @@ -481,7 +493,7 @@ public void run() { plugin.getServer().setWhitelist(false); } if(getTimer() <= 0) { - if(bossBarEnabled) { + if(gameBar != null) { gameBar.setTitle(chatManager.colorMessage("Bossbar.Game-Ended")); } @@ -546,7 +558,7 @@ public void run() { ArenaManager.joinAttempt(player, ArenaRegistry.getArenas().get(ArenaRegistry.getBungeeArena())); } } - if(bossBarEnabled) { + if(gameBar != null) { gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players")); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index b4430b51..c91ecc95 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -176,7 +176,7 @@ public void onItemPickup(CBEntityPickupItemEvent e) { return; } - if(Role.isRole(Role.INNOCENT, player)) { + if(Role.isRole(Role.INNOCENT, player, arena)) { XSound.BLOCK_LAVA_POP.play(player.getLocation(), 1F, 2F); arena.removeBowHolo(); e.getItem().remove(); @@ -227,7 +227,7 @@ public void onItemPickup(CBEntityPickupItemEvent e) { player.sendMessage(chatManager.colorMessage("In-Game.Messages.Picked-Up-Gold", player)); plugin.getRewardsHandler().performReward(player, Reward.RewardType.GOLD_PICKUP); - if(Role.isRole(Role.ANY_DETECTIVE, player)) { + if(Role.isRole(Role.ANY_DETECTIVE, player, arena)) { ItemPosition.addItem(player, ItemPosition.ARROWS, new ItemStack(Material.ARROW, e.getItem().getItemStack().getAmount() * plugin.getConfig().getInt("Detective-Gold-Pick-Up-Arrows", 3))); return; } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java index 8909596b..afc92fbb 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java @@ -89,7 +89,7 @@ public void execute(CommandSender sender, String[] args) { if(role == Role.MURDERER) { sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Role-Pass.Change").replace("%amount%", Integer.toString(user.getStat(StatsStorage.StatisticType.MURDERER_PASS))).replace("%role%", Role.MURDERER.name())); } else { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Role-Pass.Change").replace("%amount%", Integer.toString(user.getStat(StatsStorage.StatisticType.MURDERER_PASS))).replace("%role%", Role.DETECTIVE.name())); + sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Role-Pass.Change").replace("%amount%", Integer.toString(user.getStat(StatsStorage.StatisticType.DETECTIVE_PASS))).replace("%role%", Role.DETECTIVE.name())); } } }); From 033d58c2eea3d57f6838fc51927af51ff7ec90d6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Aug 2021 19:57:52 +0000 Subject: [PATCH 006/127] Bump pom.xml from 1.7.9-dev1 to 1.7.9-dev2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 322010be..118f1dd4 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev1 + 1.7.9-dev2 MurderMystery From 9ef7b2a39a0c180b53c87e4eebf7ad8971e2b638 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Thu, 19 Aug 2021 13:24:04 +0200 Subject: [PATCH 007/127] Small optimizations --- .../murdermystery/arena/ArenaEvents.java | 11 ++++++----- .../murdermystery/arena/ArenaRegistry.java | 5 ++++- .../arguments/game/ArenaSelectorArgument.java | 7 ++++++- .../projects/murdermystery/events/Events.java | 7 ++++--- .../events/spectator/SpectatorEvents.java | 19 ++++++++++++++----- 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index c91ecc95..080a238f 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -23,6 +23,7 @@ import org.bukkit.Material; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Arrow; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; @@ -78,7 +79,7 @@ public ArenaEvents(Main plugin) { @EventHandler public void onArmorStandEject(EntityDismountEvent e) { - if(!(e.getEntity() instanceof ArmorStand) || !"MurderMysteryArmorStand".equals(e.getEntity().getCustomName())) { + if(e.getEntityType() != EntityType.ARMOR_STAND || !"MurderMysteryArmorStand".equals(e.getEntity().getCustomName())) { return; } if(!(e.getDismounted() instanceof Player)) { @@ -93,7 +94,7 @@ public void onArmorStandEject(EntityDismountEvent e) { @EventHandler public void onEntityDamage(EntityDamageEvent e) { - if(!(e.getEntity() instanceof Player)) { + if(e.getEntityType() != EntityType.PLAYER) { return; } Player victim = (Player) e.getEntity(); @@ -133,7 +134,7 @@ public void onEntityDamage(EntityDamageEvent e) { @EventHandler public void onBowShot(EntityShootBowEvent e) { - if(!(e.getEntity() instanceof Player)) { + if(e.getEntityType() != EntityType.PLAYER) { return; } Player player = (Player) e.getEntity(); @@ -244,7 +245,7 @@ public void onItemPickup(CBEntityPickupItemEvent e) { @EventHandler public void onMurdererDamage(EntityDamageByEntityEvent e) { - if(!(e.getDamager() instanceof Player) || !(e.getEntity() instanceof Player)) { + if(!(e.getDamager() instanceof Player) || e.getEntityType() != EntityType.PLAYER) { return; } Player attacker = (Player) e.getDamager(); @@ -319,7 +320,7 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { e.setCancelled(true); e.getDamager().remove(); } - if(!(e.getEntity() instanceof Player)) { + if(e.getEntityType() != EntityType.PLAYER) { return; } Player victim = (Player) e.getEntity(); diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java index 254ca3b8..81943814 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java @@ -62,9 +62,12 @@ public static Arena getArena(Player p) { if(p == null) { return null; } + + java.util.UUID playerId = p.getUniqueId(); + for(Arena arena : arenas) { for(Player player : arena.getPlayers()) { - if(player.getUniqueId().equals(p.getUniqueId())) { + if(player.getUniqueId().equals(playerId)) { return arena; } } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/ArenaSelectorArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/ArenaSelectorArgument.java index 1089c821..a1de1833 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/ArenaSelectorArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/ArenaSelectorArgument.java @@ -114,9 +114,14 @@ private String formatItem(String string, Arena arena) { return formatted; } + private String invTitle; + @EventHandler public void onArenaSelectorMenuClick(InventoryClickEvent e) { - if(!ComplementAccessor.getComplement().getTitle(e.getView()).equals(chatManager.colorMessage("Arena-Selector.Inv-Title"))) { + if (invTitle == null) + invTitle = chatManager.colorMessage("Arena-Selector.Inv-Title"); + + if(!ComplementAccessor.getComplement().getTitle(e.getView()).equals(invTitle)) { return; } ItemStack currentItem = e.getCurrentItem(); diff --git a/src/main/java/plugily/projects/murdermystery/events/Events.java b/src/main/java/plugily/projects/murdermystery/events/Events.java index 3f8117df..964943ba 100644 --- a/src/main/java/plugily/projects/murdermystery/events/Events.java +++ b/src/main/java/plugily/projects/murdermystery/events/Events.java @@ -257,8 +257,11 @@ public void onSpecialItem(CBPlayerInteractEvent event) { return; } Arena arena = ArenaRegistry.getArena(event.getPlayer()); + if (arena == null) + return; + ItemStack itemStack = VersionUtils.getItemInHand(event.getPlayer()); - if(arena == null || !Utils.isNamed(itemStack)) { + if(!Utils.isNamed(itemStack)) { return; } String key = plugin.getSpecialItemManager().getRelatedSpecialItem(itemStack).getName(); @@ -285,8 +288,6 @@ public void onSpecialItem(CBPlayerInteractEvent event) { } } - - @EventHandler(priority = EventPriority.HIGH) public void onFoodLevelChange(FoodLevelChangeEvent event) { if(event.getEntity().getType() == EntityType.PLAYER && ArenaRegistry.isInArena((Player) event.getEntity())) { diff --git a/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorEvents.java b/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorEvents.java index 8bf2aceb..032bdafc 100644 --- a/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorEvents.java +++ b/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorEvents.java @@ -18,6 +18,7 @@ package plugily.projects.murdermystery.events.spectator; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -39,6 +40,7 @@ import plugily.projects.commonsbox.minecraft.compat.events.api.CBEntityPickupItemEvent; import plugily.projects.murdermystery.Main; +import plugily.projects.murdermystery.arena.Arena; import plugily.projects.murdermystery.arena.ArenaRegistry; /** @@ -128,22 +130,29 @@ public void onConsume(PlayerItemConsumeEvent event) { @EventHandler(priority = EventPriority.HIGH) public void onFoodLevelChange(FoodLevelChangeEvent event) { - if(event.getEntity() instanceof Player && plugin.getUserManager().getUser((Player) event.getEntity()).isSpectator()) { + if(event.getEntityType() == EntityType.PLAYER && plugin.getUserManager().getUser((Player) event.getEntity()).isSpectator()) { event.setCancelled(true); } } @EventHandler(priority = EventPriority.HIGH) public void onDamage(EntityDamageEvent event) { - if(!(event.getEntity() instanceof Player)) { + if(event.getEntityType() != EntityType.PLAYER) { return; } + Player player = (Player) event.getEntity(); - if(!plugin.getUserManager().getUser(player).isSpectator() || !ArenaRegistry.isInArena(player)) { + + if(!plugin.getUserManager().getUser(player).isSpectator()) { return; } + + Arena playerArena = ArenaRegistry.getArena(player); + if (playerArena == null) + return; + if(player.getLocation().getY() < 1) { - player.teleport(ArenaRegistry.getArena(player).getPlayerSpawnPoints().get(0)); + player.teleport(playerArena.getPlayerSpawnPoints().get(0)); event.setDamage(0); } event.setCancelled(true); @@ -151,7 +160,7 @@ public void onDamage(EntityDamageEvent event) { @EventHandler(priority = EventPriority.HIGH) public void onDamageByBlock(EntityDamageByBlockEvent event) { - if(event.getEntity() instanceof Player && plugin.getUserManager().getUser((Player) event.getEntity()).isSpectator()) { + if(event.getEntityType() == EntityType.PLAYER && plugin.getUserManager().getUser((Player) event.getEntity()).isSpectator()) { event.setCancelled(true); } } From 0082897856366ec29c525cf6826a7f59ef0f19c5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 19 Aug 2021 11:24:44 +0000 Subject: [PATCH 008/127] Bump pom.xml from 1.7.9-dev2 to 1.7.9-dev3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 118f1dd4..14a61b30 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev2 + 1.7.9-dev3 MurderMystery From 1738027896cae973fc3f8ee3c19ab437a9947998 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Thu, 9 Sep 2021 15:12:28 +0200 Subject: [PATCH 009/127] Small changes --- .../projects/murdermystery/ConfigPreferences.java | 3 +-- .../projects/murdermystery/arena/Arena.java | 3 +-- .../projects/murdermystery/arena/ArenaEvents.java | 7 ++----- .../arena/special/SpecialBlockEvents.java | 15 ++++++++++----- .../arena/special/pray/PrayerRegistry.java | 10 +++++++--- .../murdermystery/handlers/CorpseHandler.java | 4 ++-- .../projects/murdermystery/utils/Utils.java | 11 ++++++++--- 7 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/ConfigPreferences.java b/src/main/java/plugily/projects/murdermystery/ConfigPreferences.java index 95cab014..fd512064 100644 --- a/src/main/java/plugily/projects/murdermystery/ConfigPreferences.java +++ b/src/main/java/plugily/projects/murdermystery/ConfigPreferences.java @@ -24,7 +24,6 @@ import plugily.projects.murdermystery.utils.Debugger; import plugily.projects.murdermystery.utils.MessageUtils; -import java.util.HashMap; import java.util.Map; /** @@ -36,7 +35,7 @@ public class ConfigPreferences { private final Main plugin; private ItemStack murdererSword; - private final Map options = new HashMap<>(); + private final Map options = new java.util.EnumMap<>(Option.class); public ConfigPreferences(Main plugin) { this.plugin = plugin; diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index f9c8bee9..241ffc58 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -851,8 +851,7 @@ public void teleportToLobby(Player player) { * @param p player */ public void doBarAction(BarAction action, Player p) { - if(!ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_9_R1) - || !plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BOSSBAR_ENABLED)) { + if(gameBar == null) { return; } switch(action) { diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index 080a238f..61deae19 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -173,12 +173,9 @@ public void onItemPickup(CBEntityPickupItemEvent e) { } e.setCancelled(true); if(arena.getBowHologram() != null && e.getItem().equals(arena.getBowHologram().getEntityItem())) { - if(plugin.getUserManager().getUser(player).isSpectator()) { - return; - } - - if(Role.isRole(Role.INNOCENT, player, arena)) { + if(!plugin.getUserManager().getUser(player).isSpectator() && Role.isRole(Role.INNOCENT, player, arena)) { XSound.BLOCK_LAVA_POP.play(player.getLocation(), 1F, 2F); + arena.removeBowHolo(); e.getItem().remove(); diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java index 7cf9f850..a60566f9 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java @@ -121,8 +121,10 @@ private void onCauldronClick(PlayerInteractEvent e) { return; } - VersionUtils.sendParticles("FIREWORKS_SPARK", e.getPlayer(), e.getClickedBlock().getLocation(), 10); - Item item = e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation().clone().add(0, 1, 0), new ItemStack(Material.POTION, 1)); + org.bukkit.Location blockLoc = e.getClickedBlock().getLocation(); + + VersionUtils.sendParticles("FIREWORKS_SPARK", e.getPlayer(), blockLoc, 10); + Item item = blockLoc.getWorld().dropItemNaturally(blockLoc.clone().add(0, 1, 0), new ItemStack(Material.POTION, 1)); item.setPickupDelay(10000); Bukkit.getScheduler().runTaskLater(plugin, item::remove, 20); user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, localGold - 1); @@ -168,12 +170,15 @@ public void onMysteryPotionDrink(PlayerItemConsumeEvent e) { if(item.getType() != XMaterial.POTION.parseMaterial() || !ItemUtils.isItemStackNamed(item)) { return; } - Arena arena = ArenaRegistry.getArena(e.getPlayer()); - if(arena == null) { + + if(ArenaRegistry.getArena(e.getPlayer()) == null) { return; } + + String itemDisplayName = ComplementAccessor.getComplement().getDisplayName(item.getItemMeta()); + for(MysteryPotion potion : MysteryPotionRegistry.getMysteryPotions()) { - if(ComplementAccessor.getComplement().getDisplayName(item.getItemMeta()).equals(potion.getName())) { + if(itemDisplayName.equals(potion.getName())) { e.setCancelled(true); e.getPlayer().sendMessage(potion.getSubtitle()); VersionUtils.sendTitles(e.getPlayer(), "", potion.getSubtitle(), 5, 40, 5); diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java b/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java index f8e4645f..466ac2e9 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java @@ -107,10 +107,14 @@ public static void applyRandomPrayer(User user) { ItemPosition.setItem(player, ItemPosition.ARROWS, new ItemStack(Material.ARROW, plugin.getConfig().getInt("Detective-Prayer-Arrows", 2))); break; case DETECTIVE_REVELATION: - Player characterType = arena.getCharacter(Arena.CharacterType.DETECTIVE); + Player characterType = null; - if (characterType == null) { - characterType = arena.getCharacter(Arena.CharacterType.FAKE_DETECTIVE); + if (arena != null) { + characterType = arena.getCharacter(Arena.CharacterType.DETECTIVE); + + if (characterType == null) { + characterType = arena.getCharacter(Arena.CharacterType.FAKE_DETECTIVE); + } } String charName = characterType == null ? "????" : characterType.getName(); diff --git a/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java b/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java index 583aed62..1aa601c3 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java @@ -123,10 +123,10 @@ private ArmorStandHologram getLastWordsHologram(Player player) { @EventHandler public void onCorpseSpawn(CorpseSpawnEvent e) { - if(!plugin.getConfig().getBoolean("Override-Corpses-Spawn", true) || lastSpawnedCorpse == null) { + if(lastSpawnedCorpse == null) { return; } - if(!lastSpawnedCorpse.equals(e.getCorpse())) { + if(plugin.getConfig().getBoolean("Override-Corpses-Spawn", true) && !lastSpawnedCorpse.equals(e.getCorpse())) { e.setCancelled(true); } } diff --git a/src/main/java/plugily/projects/murdermystery/utils/Utils.java b/src/main/java/plugily/projects/murdermystery/utils/Utils.java index 90d8ed15..74ef5ca5 100644 --- a/src/main/java/plugily/projects/murdermystery/utils/Utils.java +++ b/src/main/java/plugily/projects/murdermystery/utils/Utils.java @@ -68,21 +68,26 @@ public static int serializeInt(int i) { } public static void applyActionBarCooldown(Player p, int seconds) { + final int s = seconds * 20; + new BukkitRunnable() { int ticks = 0; @Override public void run() { Arena arena = ArenaRegistry.getArena(p); + if(arena == null || arena.getArenaState() != ArenaState.IN_GAME) { cancel(); } - if(ticks >= seconds * 20) { + + if(ticks >= s) { cancel(); } - String progress = StringFormatUtils.getProgressBar(ticks, seconds * 20, 10, "■", ChatColor.COLOR_CHAR + "a", ChatColor.COLOR_CHAR + "c"); + + String progress = StringFormatUtils.getProgressBar(ticks, s, 10, "■", ChatColor.COLOR_CHAR + "a", ChatColor.COLOR_CHAR + "c"); VersionUtils.sendActionBar(p, plugin.getChatManager().colorMessage("In-Game.Cooldown-Format", p) - .replace("%progress%", progress).replace("%time%", Double.toString((double) ((seconds * 20) - ticks) / 20))); + .replace("%progress%", progress).replace("%time%", Double.toString((double) (s - ticks) / 20))); ticks += 10; } }.runTaskTimer(plugin, 0, 10); From d362b3e90aa18c7933fd6006da9262382cafc56d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Sep 2021 13:13:03 +0000 Subject: [PATCH 010/127] Bump pom.xml from 1.7.9-dev3 to 1.7.9-dev4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 14a61b30..c1c476e6 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev3 + 1.7.9-dev4 MurderMystery From aa4984c94b02bfbbcc2c9682e9414d7657bc4d19 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Thu, 9 Sep 2021 15:33:15 +0200 Subject: [PATCH 011/127] Added murderer and detective chance placeholders to scoreboard --- CHANGELOG.md | 1 + .../plugily/projects/murdermystery/arena/Arena.java | 11 ++++++++--- .../arena/managers/ScoreboardManager.java | 13 +++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d16511c..c9b76ae1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### 1.8.0 Release (05.08.2021 - xx.xx.202x) * Improved leaderboard command +* Added murderer and detective chance placeholders to scoreboard ### 1.7.9 Release (30.05.2021 - 01.08.2021) * Added forcestart item diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index 241ffc58..1d5722f7 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -233,8 +233,10 @@ public void run() { } if(!hideChances) { + String message = chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Role-Chances-Action-Bar"); + for(Player p : players) { - VersionUtils.sendActionBar(p, formatRoleChance(plugin.getUserManager().getUser(p), totalMurderer, totalDetective)); + VersionUtils.sendActionBar(p, formatRoleChance(message, plugin.getUserManager().getUser(p), totalMurderer, totalDetective)); } } @@ -577,8 +579,7 @@ public void run() { currentTimeMillis() - start); } - private String formatRoleChance(User user, int murdererPts, int detectivePts) throws NumberFormatException { - String message = chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Role-Chances-Action-Bar"); + public String formatRoleChance(String message, User user, int murdererPts, int detectivePts) { message = StringUtils.replace(message, "%murderer_chance%", NumberUtils.round(((double) user.getStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER) / (double) murdererPts) * 100.0, 2) + "%"); message = StringUtils.replace(message, "%detective_chance%", NumberUtils.round(((double) user.getStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE) / (double) detectivePts) * 100.0, 2) + "%"); return message; @@ -645,6 +646,10 @@ public void setForceStart(boolean forceStart) { this.forceStart = forceStart; } + public boolean isHideChances() { + return hideChances; + } + public ScoreboardManager getScoreboardManager() { return scoreboardManager; } diff --git a/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java b/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java index 3ad9d9de..01a0fe78 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java @@ -171,6 +171,19 @@ private String formatScoreboardLine(String line, User user) { formattedLine = StringUtils.replace(formattedLine, "%MAX_PLAYERS%", Integer.toString(arena.getMaximumPlayers())); formattedLine = StringUtils.replace(formattedLine, "%MIN_PLAYERS%", Integer.toString(arena.getMinimumPlayers())); + if (!arena.isHideChances()) { + int totalMurderer = 0; + int totalDetective = 0; + + for(Player p : arena.getPlayers()) { + User us = plugin.getUserManager().getUser(p); + totalMurderer += us.getStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER); + totalDetective += us.getStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE); + } + + formattedLine = arena.formatRoleChance(formattedLine, user, totalMurderer, totalDetective); + } + if (arena.isDetectiveDead()) { if(!arena.isCharacterSet(Arena.CharacterType.FAKE_DETECTIVE)) { formattedLine = StringUtils.replace(formattedLine, "%DETECTIVE_STATUS%", chatManager.colorMessage("Scoreboard.Detective-Died-No-Bow")); From 455ead5f7cccb89354ea95d81a46879e9bc6a927 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Sep 2021 13:33:53 +0000 Subject: [PATCH 012/127] Bump pom.xml from 1.7.9-dev4 to 1.7.9-dev5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c1c476e6..1926d721 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev4 + 1.7.9-dev5 MurderMystery From d23c2b506de17271aaabfecf3f7f45fc7869a699 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Thu, 9 Sep 2021 16:05:03 +0200 Subject: [PATCH 013/127] Now weather changing will be cancelled when a game is running --- CHANGELOG.md | 1 + .../projects/murdermystery/events/Events.java | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9b76ae1..b28394fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ### 1.8.0 Release (05.08.2021 - xx.xx.202x) * Improved leaderboard command * Added murderer and detective chance placeholders to scoreboard +* Now weather changing will be cancelled when a game is running ### 1.7.9 Release (30.05.2021 - 01.08.2021) * Added forcestart item diff --git a/src/main/java/plugily/projects/murdermystery/events/Events.java b/src/main/java/plugily/projects/murdermystery/events/Events.java index 964943ba..937e3618 100644 --- a/src/main/java/plugily/projects/murdermystery/events/Events.java +++ b/src/main/java/plugily/projects/murdermystery/events/Events.java @@ -40,6 +40,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.weather.WeatherChangeEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.EulerAngle; @@ -58,6 +59,7 @@ import plugily.projects.murdermystery.arena.Arena; import plugily.projects.murdermystery.arena.ArenaManager; import plugily.projects.murdermystery.arena.ArenaRegistry; +import plugily.projects.murdermystery.arena.ArenaState; import plugily.projects.murdermystery.arena.ArenaUtils; import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.commands.arguments.game.RoleSelectorArgument; @@ -235,15 +237,28 @@ public void onCommandExecute(PlayerCommandPreprocessEvent event) { @EventHandler public void onInGameInteract(PlayerInteractEvent event) { - Arena arena = ArenaRegistry.getArena(event.getPlayer()); - if(arena == null || event.getClickedBlock() == null) { + if (event.getClickedBlock() == null || ArenaRegistry.getArena(event.getPlayer()) == null) { return; } - if(event.getClickedBlock().getType() == XMaterial.PAINTING.parseMaterial() || event.getClickedBlock().getType() == XMaterial.FLOWER_POT.parseMaterial()) { + + org.bukkit.Material type = event.getClickedBlock().getType(); + + if(type == XMaterial.PAINTING.parseMaterial() || type == XMaterial.FLOWER_POT.parseMaterial()) { event.setCancelled(true); } } + @EventHandler + public void onWeatherChange(WeatherChangeEvent event) { + for (Arena arena : ArenaRegistry.getArenas()) { + if (arena.getArenaState() != ArenaState.WAITING_FOR_PLAYERS && !arena.getPlayerSpawnPoints().isEmpty() + && arena.getPlayerSpawnPoints().get(0).getWorld() == event.getWorld()) { + event.setCancelled(true); + break; + } + } + } + @EventHandler public void onInGameBedEnter(PlayerBedEnterEvent event) { if(ArenaRegistry.isInArena(event.getPlayer())) { From 30564d1c7d73eab9b69a72fcb5b57dac7099d202 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Sep 2021 14:05:38 +0000 Subject: [PATCH 014/127] Bump pom.xml from 1.7.9-dev5 to 1.7.9-dev6 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1926d721..dd6038cd 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev5 + 1.7.9-dev6 MurderMystery From 446b53dfa8d3b9a20dbd4e27358686b7f9abd505 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Fri, 10 Sep 2021 21:57:28 +0200 Subject: [PATCH 015/127] Now users can use placeholderapi placeholders in bossbar, titles, without player specified --- CHANGELOG.md | 1 + .../projects/murdermystery/HookManager.java | 4 +- .../plugily/projects/murdermystery/Main.java | 2 +- .../projects/murdermystery/arena/Arena.java | 49 +++++++++++-------- .../murdermystery/arena/role/Role.java | 6 +-- .../arguments/game/RoleSelectorArgument.java | 7 ++- .../murdermystery/events/LobbyEvent.java | 11 +++-- .../murdermystery/handlers/ChatManager.java | 6 ++- .../murdermystery/handlers/CorpseHandler.java | 4 +- .../handlers/setup/SetupUtilities.java | 25 +++++++--- .../handlers/trails/BowTrailsHandler.java | 11 +++-- 11 files changed, 74 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b28394fe..f03b865b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * Improved leaderboard command * Added murderer and detective chance placeholders to scoreboard * Now weather changing will be cancelled when a game is running +* Now users can use placeholderapi placeholders in bossbar, titles, without player specified ### 1.7.9 Release (30.05.2021 - 01.08.2021) * Added forcestart item diff --git a/src/main/java/plugily/projects/murdermystery/HookManager.java b/src/main/java/plugily/projects/murdermystery/HookManager.java index 879a951c..3c641cc7 100644 --- a/src/main/java/plugily/projects/murdermystery/HookManager.java +++ b/src/main/java/plugily/projects/murdermystery/HookManager.java @@ -57,12 +57,10 @@ private void enableHooks() { } public boolean isFeatureEnabled(HookFeature feature) { - Boolean b = hooks.get(feature); - return b != null && b; + return hooks.getOrDefault(feature, false); } public enum HookFeature { - //todo hidden name tags hook CORPSES(Hook.CORPSE_REBORN); private final Hook[] requiredHooks; diff --git a/src/main/java/plugily/projects/murdermystery/Main.java b/src/main/java/plugily/projects/murdermystery/Main.java index d9cc70b4..b19ec16e 100644 --- a/src/main/java/plugily/projects/murdermystery/Main.java +++ b/src/main/java/plugily/projects/murdermystery/Main.java @@ -293,7 +293,7 @@ private void checkUpdate() { private void setupFiles() { for(String fileName : Arrays.asList("arenas", "bungee", "rewards", "stats", "special_items", "mysql", "specialblocks")) { - File file = new File(getDataFolder() + File.separator + fileName + ".yml"); + File file = new File(getDataFolder(), fileName + ".yml"); if(!file.exists()) { saveResource(fileName + ".yml", false); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index 1d5722f7..b002fdbf 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -116,7 +116,7 @@ public Arena(String id) { arenaOptions.put(option, option.getDefaultValue()); } if(ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_9_R1) && plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BOSSBAR_ENABLED)) { - gameBar = Bukkit.createBossBar(chatManager.colorMessage("Bossbar.Main-Title"), BarColor.BLUE, BarStyle.SOLID); + gameBar = Bukkit.createBossBar(chatManager.colorMessage("Bossbar.Main-Title", null), BarColor.BLUE, BarStyle.SOLID); } scoreboardManager = new ScoreboardManager(this); } @@ -166,7 +166,7 @@ public void run() { } } else { if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players")); + gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players", null)); } chatManager.broadcast(this, chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Enough-Players-To-Start")); setArenaState(ArenaState.STARTING); @@ -187,7 +187,7 @@ public void run() { double startWaitingTime = plugin.getConfig().getDouble("Starting-Waiting-Time", 60); if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Starting-In").replace("%time%", Integer.toString(timer))); + gameBar.setTitle(chatManager.colorMessage("Bossbar.Starting-In", null).replace("%time%", Integer.toString(timer))); gameBar.setProgress(timer / startWaitingTime); } @@ -202,7 +202,7 @@ public void run() { if(!forceStart && players.size() < minimumPlayers) { if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players")); + gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players", null)); gameBar.setProgress(1.0); } @@ -233,7 +233,7 @@ public void run() { } if(!hideChances) { - String message = chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Role-Chances-Action-Bar"); + String message = chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Role-Chances-Action-Bar", null); for(Player p : players) { VersionUtils.sendActionBar(p, formatRoleChance(message, plugin.getUserManager().getUser(p), totalMurderer, totalDetective)); @@ -317,6 +317,9 @@ public void run() { Object[] sortedMurdererArray = sortedMurderer.keySet().toArray(); + String murdererTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Title", null); + String murdererSubTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Subtitle", null); + for(int i = 0; i < maxmurderer; i++) { if (i >= sortedMurdererArray.length) break; @@ -329,8 +332,7 @@ public void run() { allMurderer.add(murderer); user.setStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, 1); playersToSet.remove(murderer); - VersionUtils.sendTitles(murderer, chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Title"), - chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Subtitle"), 5, 40, 5); + VersionUtils.sendTitles(murderer, murdererTitle, murdererSubTitle, 5, 40, 5); } detectiveChances.remove(user); @@ -345,6 +347,9 @@ public void run() { Object[] sortedDetArray = sortedDetective.keySet().toArray(); + String detectiveTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Detective-Title", null); + String detectiveSubTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Detective-Subtitle", null); + for(int i = 0; i < maxdetectives; i++) { if (i >= sortedDetArray.length) break; @@ -358,8 +363,9 @@ public void run() { setCharacter(CharacterType.DETECTIVE, detective); allDetectives.add(detective); user.setStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, 1); - VersionUtils.sendTitles(detective, chatManager.colorMessage("In-Game.Messages.Role-Set.Detective-Title"), - chatManager.colorMessage("In-Game.Messages.Role-Set.Detective-Subtitle"), 5, 40, 5); + + VersionUtils.sendTitles(detective, detectiveTitle, detectiveSubTitle, 5, 40, 5); + playersToSet.remove(detective); detective.getInventory().setHeldItemSlot(0); ItemPosition.setItem(detective, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); @@ -368,14 +374,14 @@ public void run() { Debugger.debug("Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Players: Detectives = {4}, Murders = {5}", getId(), maxdetectives, maxmurderer, playersSize, allDetectives, allMurderer); - String innocentTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Title"); - String innocentSubTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Subtitle"); + String innocentTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Title", null); + String innocentSubTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Subtitle", null); for(Player p : playersToSet) { VersionUtils.sendTitles(p, innocentTitle, innocentSubTitle, 5, 40, 5); } if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.In-Game-Info")); + gameBar.setTitle(chatManager.colorMessage("Bossbar.In-Game-Info", null)); } // Load and append special blocks hologram @@ -435,8 +441,9 @@ public void run() { if(currentTimer == 30 || currentTimer == 60) { String strTimer = Integer.toString(currentTimer); - String title = chatManager.colorMessage("In-Game.Messages.Seconds-Left-Title").replace("%time%", strTimer); - String subtitle = chatManager.colorMessage("In-Game.Messages.Seconds-Left-Subtitle").replace("%time%", strTimer); + String title = chatManager.colorMessage("In-Game.Messages.Seconds-Left-Title", null).replace("%time%", strTimer); + String subtitle = chatManager.colorMessage("In-Game.Messages.Seconds-Left-Subtitle", null).replace("%time%", strTimer); + for(Player p : players) { VersionUtils.sendTitles(p, title, subtitle, 5, 40, 5); } @@ -453,9 +460,9 @@ public void run() { } else { //winner check if(playersLeft.size() == aliveMurderer()) { - String loseTitle = chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Lose"); - String murdererKill = chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Subtitles.Murderer-Kill-Everyone"); - String titleWin = chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Win"); + String loseTitle = chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Lose", null); + String murdererKill = chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Subtitles.Murderer-Kill-Everyone", null); + String titleWin = chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Win", null); for(Player p : players) { VersionUtils.sendTitles(p, loseTitle, murdererKill, 5, 40, 5); @@ -496,7 +503,7 @@ public void run() { } if(getTimer() <= 0) { if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Game-Ended")); + gameBar.setTitle(chatManager.colorMessage("Bossbar.Game-Ended", null)); } for(Player player : new ArrayList<>(players)) { @@ -561,7 +568,7 @@ public void run() { } } if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players")); + gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players", null)); } if(goldVisuals) { @@ -967,11 +974,11 @@ public void loadSpecialBlock(SpecialBlock block) { switch(block.getSpecialBlockType()) { case MYSTERY_CAULDRON: - block.setArmorStandHologram(new ArmorStandHologram(Utils.getBlockCenter(block.getLocation()), chatManager.colorMessage("In-Game.Messages.Special-Blocks.Cauldron-Hologram"))); + block.setArmorStandHologram(new ArmorStandHologram(Utils.getBlockCenter(block.getLocation()), chatManager.colorMessage("In-Game.Messages.Special-Blocks.Cauldron-Hologram", null))); break; case PRAISE_DEVELOPER: ArmorStandHologram prayer = new ArmorStandHologram(Utils.getBlockCenter(block.getLocation())); - for(String str : chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praise-Hologram").split(";")) { + for(String str : chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praise-Hologram", null).split(";")) { prayer.appendLine(str); } block.setArmorStandHologram(prayer); diff --git a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java index dcc603ed..1f1f1529 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java +++ b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java @@ -22,8 +22,6 @@ import plugily.projects.murdermystery.arena.Arena; import plugily.projects.murdermystery.arena.ArenaRegistry; -import java.util.Arrays; - /** * @author Plajer *

@@ -114,6 +112,8 @@ public static boolean isAnyRole(Player player) { return isAnyRole(player, ArenaRegistry.getArena(player)); } + private static final java.util.stream.Stream roles = java.util.Arrays.stream(Role.values()); + /** * Checks whether player is playing a role or not * @@ -122,6 +122,6 @@ public static boolean isAnyRole(Player player) { * @return true if is playing one role, false otherwise */ public static boolean isAnyRole(Player player, Arena arena) { - return arena != null && Arrays.stream(Role.values()).anyMatch(role -> isRole(role, player, arena)); + return arena != null && roles.anyMatch(role -> isRole(role, player, arena)); } } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java index 3426f69b..b770b564 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java @@ -23,17 +23,16 @@ public class RoleSelectorArgument implements Listener { - public RoleSelectorArgument(ArgumentsRegistry registry) { registry.mapArgument("murdermystery", new LabeledCommandArgument("roleselector", "murdermystery.roleselector", CommandArgument.ExecutorType.PLAYER, new LabelData("/mm roleselector", "/mm roleselector", "&7Select a role\n&6Permission: &7murdermystery.roleselector")) { @Override public void execute(CommandSender sender, String[] args) { Player player = (Player) sender; - if(!Utils.checkIsInGameInstance(player)) { - return; + + if(Utils.checkIsInGameInstance(player)) { + openRolePassMenu(player, registry.getPlugin()); } - openRolePassMenu((Player) sender, registry.getPlugin()); } }); } diff --git a/src/main/java/plugily/projects/murdermystery/events/LobbyEvent.java b/src/main/java/plugily/projects/murdermystery/events/LobbyEvent.java index 33adc9be..bcfff911 100644 --- a/src/main/java/plugily/projects/murdermystery/events/LobbyEvent.java +++ b/src/main/java/plugily/projects/murdermystery/events/LobbyEvent.java @@ -75,12 +75,12 @@ public void onLobbyDamage(EntityDamageEvent event) { @EventHandler public void onItemFrameRotate(PlayerInteractEntityEvent event) { - Player player = event.getPlayer(); - Arena arena = ArenaRegistry.getArena(player); + Arena arena = ArenaRegistry.getArena(event.getPlayer()); if(arena == null || arena.getArenaState() == ArenaState.IN_GAME) { return; } - if(event.getRightClicked() instanceof ItemFrame && !((ItemFrame) event.getRightClicked()).getItem().getType().equals(Material.AIR)) { + + if(event.getRightClicked() instanceof ItemFrame && ((ItemFrame) event.getRightClicked()).getItem().getType() != Material.AIR) { event.setCancelled(true); } } @@ -90,11 +90,12 @@ public void onHangingBreak(HangingBreakByEntityEvent event) { if(event.getEntity().getType() != EntityType.PLAYER) { return; } - Player player = (Player) event.getEntity(); - Arena arena = ArenaRegistry.getArena(player); + + Arena arena = ArenaRegistry.getArena((Player) event.getEntity()); if(arena == null || arena.getArenaState() == ArenaState.IN_GAME) { return; } + event.setCancelled(true); } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/ChatManager.java b/src/main/java/plugily/projects/murdermystery/handlers/ChatManager.java index 824d6eee..82884ed6 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/ChatManager.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/ChatManager.java @@ -69,11 +69,13 @@ public String colorRawMessage(String message) { return ChatColor.translateAlternateColorCodes('&', message); } - public String colorMessage(String message, Player player) { - String returnString = LanguageManager.getLanguageMessage(message); + public String colorMessage(String path, Player player) { + String returnString = LanguageManager.getLanguageMessage(path); + if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { returnString = PlaceholderAPI.setPlaceholders(player, returnString); } + return colorRawMessage(returnString); } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java b/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java index 1aa601c3..de52dc06 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java @@ -54,7 +54,6 @@ public class CorpseHandler implements Listener { private final Main plugin; - private final ChatManager chatManager; private Corpses.CorpseData lastSpawnedCorpse; private final Map registeredLastWords = new HashMap<>(); @@ -62,7 +61,6 @@ public class CorpseHandler implements Listener { public CorpseHandler(Main plugin) { this.plugin = plugin; - chatManager = plugin.getChatManager(); //run bit later than hook manager to ensure it's not null Bukkit.getScheduler().runTaskLater(plugin, () -> { if(plugin.getHookManager().isFeatureEnabled(HookManager.HookFeature.CORPSES)) { @@ -116,7 +114,7 @@ public void spawnCorpse(Player p, Arena arena) { private ArmorStandHologram getLastWordsHologram(Player player) { ArmorStandHologram hologram = new ArmorStandHologram(player.getLocation()); - hologram.appendLine(chatManager.colorMessage("In-Game.Messages.Corpse-Last-Words", player).replace("%player%", player.getName())); + hologram.appendLine(plugin.getChatManager().colorMessage("In-Game.Messages.Corpse-Last-Words", player).replace("%player%", player.getName())); hologram.appendLine(plugin.getLastWordsManager().getRandomLastWord(player)); return hologram; } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupUtilities.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupUtilities.java index 3b827995..a77aed3d 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupUtilities.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupUtilities.java @@ -43,29 +43,40 @@ public class SetupUtilities { } public String isOptionDone(String path) { - if(config.isSet(path)) { - return chatManager.colorRawMessage("&a&l✔ Completed &7(value: &8" + config.getString(path) + "&7)"); + String option = config.getString(path); + + if(option != null) { + return chatManager.colorRawMessage("&a&l✔ Completed &7(value: &8" + option + "&7)"); } + return chatManager.colorRawMessage("&c&l✘ Not Completed"); } public String isOptionDoneList(String path, int minimum) { - if(config.isSet(path)) { - if(config.getStringList(path).size() < minimum) { + int listSize = config.getStringList(path).size(); + + if(listSize != 0) { + if(listSize < minimum) { return chatManager.colorRawMessage("&c&l✘ Not Completed | &cPlease add more spawns"); } - return chatManager.colorRawMessage("&a&l✔ Completed &7(value: &8" + config.getStringList(path).size() + "&7)"); + + return chatManager.colorRawMessage("&a&l✔ Completed &7(value: &8" + listSize + "&7)"); } + return chatManager.colorRawMessage("&c&l✘ Not Completed"); } public String isOptionDoneBool(String path) { - if(config.isSet(path)) { - if(Bukkit.getServer().getWorlds().get(0).getSpawnLocation().equals(LocationSerializer.getLocation(config.getString(path)))) { + String option = config.getString(path); + + if(option != null) { + if(Bukkit.getServer().getWorlds().get(0).getSpawnLocation().equals(LocationSerializer.getLocation(option))) { return chatManager.colorRawMessage("&c&l✘ Not Completed"); } + return chatManager.colorRawMessage("&a&l✔ Completed"); } + return chatManager.colorRawMessage("&c&l✘ Not Completed"); } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/trails/BowTrailsHandler.java b/src/main/java/plugily/projects/murdermystery/handlers/trails/BowTrailsHandler.java index 998e005f..45fdfb61 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/trails/BowTrailsHandler.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/trails/BowTrailsHandler.java @@ -50,14 +50,19 @@ public void onArrowShoot(EntityShootBowEvent event) { if(!(event.getEntity() instanceof Player && event.getProjectile() instanceof Arrow)) { return; } - Player player = (Player) event.getEntity(); + Entity projectile = event.getProjectile(); - if(!ArenaRegistry.isInArena(player) || projectile.isDead() || projectile.isOnGround()) { + + if(projectile.isDead() || projectile.isOnGround()) { return; } - if(!plugin.getTrailsManager().gotAnyTrails(player)) { + + Player player = (Player) event.getEntity(); + + if(!ArenaRegistry.isInArena(player) || !plugin.getTrailsManager().gotAnyTrails(player)) { return; } + Trail trail = plugin.getTrailsManager().getRandomTrail(player); Debugger.debug("Spawning particle with perm {0} for player {1}", trail.getPermission(), player.getName()); new BukkitRunnable() { From 38ba1ba4870ecdc912233ddd9cf281af94a946f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Sep 2021 19:58:02 +0000 Subject: [PATCH 016/127] Bump pom.xml from 1.7.9-dev6 to 1.7.9-dev7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dd6038cd..2109fc84 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev6 + 1.7.9-dev7 MurderMystery From 4b1c05f8f562a33ee4f4ee247a9b170c9b6c1457 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Fri, 10 Sep 2021 22:15:37 +0200 Subject: [PATCH 017/127] Added option to determine if the deletion of arena needs confirmation or not --- CHANGELOG.md | 1 + .../arguments/admin/arena/DeleteArgument.java | 23 +++++++++++++------ .../handlers/language/LanguageMigrator.java | 7 +++++- src/main/resources/config.yml | 5 +++- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f03b865b..fa4bbc6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ * Added murderer and detective chance placeholders to scoreboard * Now weather changing will be cancelled when a game is running * Now users can use placeholderapi placeholders in bossbar, titles, without player specified +* Added option to determine if the deletion of arena needs confirmation or not ### 1.7.9 Release (30.05.2021 - 01.08.2021) * Added forcestart item diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/DeleteArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/DeleteArgument.java index fd47dcd2..86f3d379 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/DeleteArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/DeleteArgument.java @@ -41,7 +41,7 @@ */ public class DeleteArgument { - private final Set confirmations = new HashSet<>(); + private Set confirmations; public DeleteArgument(ArgumentsRegistry registry, ChatManager chatManager) { registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("delete", "murdermystery.admin.delete", CommandArgument.ExecutorType.PLAYER, @@ -53,22 +53,31 @@ public void execute(CommandSender sender, String[] args) { sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Type-Arena-Name")); return; } + Arena arena = ArenaRegistry.getArena(args[1]); if(arena == null) { sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.No-Arena-Like-That")); return; } - if(!confirmations.contains(sender)) { - confirmations.add(sender); - Bukkit.getScheduler().runTaskLater(registry.getPlugin(), () -> confirmations.remove(sender), 20 * 10); - sender.sendMessage(chatManager.getPrefix() + chatManager.colorRawMessage("&cAre you sure you want to do this action? Type the command again &6within 10 seconds &cto confirm!")); - return; + + if (registry.getPlugin().getConfig().getBoolean("Deleting-Arena-Needs-Confirmation", true)) { + if (confirmations == null) + confirmations = new HashSet<>(); + + if(!confirmations.remove(sender)) { + confirmations.add(sender); + Bukkit.getScheduler().runTaskLater(registry.getPlugin(), () -> confirmations.remove(sender), 20 * 10); + sender.sendMessage(chatManager.getPrefix() + chatManager.colorRawMessage("&cAre you sure you want to do this action? Type the command again &6within 10 seconds &cto confirm!")); + return; + } } - confirmations.remove(sender); + ArenaManager.stopGame(true, arena); + FileConfiguration config = ConfigUtils.getConfig(registry.getPlugin(), "arenas"); config.set("instances." + args[1], null); ConfigUtils.saveConfig(registry.getPlugin(), config, "arenas"); + ArenaRegistry.unregisterArena(arena); sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Removed-Game-Instance")); } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageMigrator.java b/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageMigrator.java index b6778b31..dda9cf1b 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageMigrator.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageMigrator.java @@ -34,7 +34,7 @@ @SuppressWarnings("deprecation") public class LanguageMigrator { - public static final int CONFIG_FILE_VERSION = 23; + public static final int CONFIG_FILE_VERSION = 24; public static final int LANGUAGE_FILE_VERSION = 8; private final Main plugin; @@ -210,6 +210,11 @@ private void configUpdate() { " - \"block_crack\"\r\n" + " - \"item_crack\"\r\n" + " - \"block_dust\"\r\n"); + break; + case 23: + MigratorUtils.addNewLines(file, "\r\n# Should the /mma delete command awaits the confirmation to delete the arena?\r\n" + + "Deleting-Arena-Needs-Confirmation: true\r\n"); + break; default: break; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 56944520..58120c36 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -145,6 +145,9 @@ Enable-Short-Commands: false # Should /mm leave command be blocked? Disable-Leave-Command: false +# Should the /mma delete command awaits the confirmation to delete the arena? +Deleting-Arena-Needs-Confirmation: true + # Should players get no fall damage? Disable-Fall-Damage: false @@ -203,6 +206,6 @@ Blacklisted-Trails: - "block_dust" # Don't modify. -Version: 23 +Version: 24 # No way! You've reached the end! But... where's the dragon!? \ No newline at end of file From 86c2a3fffa33498806365b4e50d9e810cd056630 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:16:06 +0000 Subject: [PATCH 018/127] Bump pom.xml from 1.7.9-dev7 to 1.7.9-dev8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2109fc84..a97bea7a 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev7 + 1.7.9-dev8 MurderMystery From bfe8f7af043d83526b94f1de28419acdde1723f6 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Fri, 17 Sep 2021 21:33:49 +0200 Subject: [PATCH 019/127] Fixed nullPointer issue when party member is not found so the elements of List contained some unwanted null keys --- .../murdermystery/arena/ArenaManager.java | 7 +++-- .../handlers/party/PAFBPartyHandlerImpl.java | 27 ++++++++--------- .../handlers/party/PAFSPartyHandlerImpl.java | 29 ++++++++---------- .../party/PartiesPartyHandlerImpl.java | 30 ++++++++----------- .../handlers/party/PartyHandler.java | 2 -- .../party/PartySupportInitializer.java | 5 ---- 6 files changed, 44 insertions(+), 56 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java index 53761010..78360ad8 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java @@ -97,11 +97,14 @@ public static void joinAttempt(Player player, Arena arena) { } //check if player is in party and send party members to the game - if(plugin.getPartyHandler().isPlayerInParty(player)) { + GameParty party = plugin.getPartyHandler().getParty(player); + + if(party != null) { Debugger.debug("{0} is in a party", player.getName()); - GameParty party = plugin.getPartyHandler().getParty(player); + if(party.getLeader().equals(player)) { Debugger.debug("{0} is partyleader", player.getName()); + if(arena.getMaximumPlayers() - arena.getPlayers().size() >= party.getPlayers().size()) { for(Player partyPlayer : party.getPlayers()) { if(player.equals(partyPlayer)) { diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PAFBPartyHandlerImpl.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PAFBPartyHandlerImpl.java index daddeb27..2b5da0a5 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PAFBPartyHandlerImpl.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/party/PAFBPartyHandlerImpl.java @@ -22,6 +22,7 @@ import de.simonsator.partyandfriends.spigot.api.pafplayers.PAFPlayerManager; import de.simonsator.partyandfriends.spigot.api.party.PartyManager; import de.simonsator.partyandfriends.spigot.api.party.PlayerParty; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -32,27 +33,25 @@ */ public class PAFBPartyHandlerImpl implements PartyHandler { - @Override - public boolean isPlayerInParty(Player player) { - return PartyManager.getInstance().getParty(PAFPlayerManager.getInstance().getPlayer(player.getUniqueId())) != null; - } - @Override public GameParty getParty(Player player) { - PartyManager api = PartyManager.getInstance(); PAFPlayer partyPlayer = PAFPlayerManager.getInstance().getPlayer(player.getUniqueId()); - PlayerParty party = api.getParty(partyPlayer); + if (partyPlayer == null) + return null; - java.util.List players = new java.util.ArrayList<>(); + PlayerParty party = PartyManager.getInstance().getParty(partyPlayer); + if (party == null) + return null; - for (PAFPlayer localPlayer : party.getAllPlayers()) { - Player pl = Bukkit.getPlayer(localPlayer.getUniqueId()); + Player leader = Bukkit.getPlayer(party.getLeader().getUniqueId()); + if (leader == null) + return null; - if (pl != null) - players.add(pl); - } + java.util.List allMembers = party.getAllPlayers().stream() + .map(localPlayer -> Bukkit.getPlayer(localPlayer.getUniqueId())) + .filter(java.util.Objects::nonNull).collect(java.util.stream.Collectors.toList()); - return new GameParty(players, Bukkit.getPlayer(party.getLeader().getUniqueId())); + return new GameParty(allMembers, leader); } @Override diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PAFSPartyHandlerImpl.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PAFSPartyHandlerImpl.java index f962b714..3f9df35e 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PAFSPartyHandlerImpl.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/party/PAFSPartyHandlerImpl.java @@ -18,9 +18,11 @@ package plugily.projects.murdermystery.handlers.party; -import de.simonsator.partyandfriends.api.pafplayers.OnlinePAFPlayer; import de.simonsator.partyandfriends.api.party.PartyManager; import de.simonsator.partyandfriends.api.party.PlayerParty; + +import java.util.stream.Collectors; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -31,26 +33,21 @@ */ public class PAFSPartyHandlerImpl implements PartyHandler { - @Override - public boolean isPlayerInParty(Player player) { - return PartyManager.getInstance().getParty(player.getUniqueId()) != null; - } - @Override public GameParty getParty(Player player) { - PartyManager api = PartyManager.getInstance(); - PlayerParty party = api.getParty(player.getUniqueId()); - - java.util.List players = new java.util.ArrayList<>(); + PlayerParty party = PartyManager.getInstance().getParty(player.getUniqueId()); + if (party == null) + return null; - for (OnlinePAFPlayer localPlayer : party.getAllPlayers()) { - Player pl = Bukkit.getPlayer(localPlayer.getUniqueId()); + Player leader = Bukkit.getPlayer(party.getLeader().getUniqueId()); + if (leader == null) + return null; - if (pl != null) - players.add(pl); - } + java.util.List allMembers = party.getAllPlayers().stream() + .map(localPlayer -> Bukkit.getPlayer(localPlayer.getUniqueId())) + .filter(java.util.Objects::nonNull).collect(Collectors.toList()); - return new GameParty(players, Bukkit.getPlayer(party.getLeader().getUniqueId())); + return new GameParty(allMembers, leader); } @Override diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PartiesPartyHandlerImpl.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PartiesPartyHandlerImpl.java index 067005b7..90031664 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PartiesPartyHandlerImpl.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/party/PartiesPartyHandlerImpl.java @@ -22,6 +22,7 @@ import com.alessiodp.parties.api.interfaces.PartiesAPI; import com.alessiodp.parties.api.interfaces.Party; import com.alessiodp.parties.api.interfaces.PartyPlayer; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -33,31 +34,26 @@ public class PartiesPartyHandlerImpl implements PartyHandler { @Override - public boolean isPlayerInParty(Player player) { + public GameParty getParty(Player player) { PartiesAPI api = Parties.getApi(); PartyPlayer partyPlayer = api.getPartyPlayer(player.getUniqueId()); - if(partyPlayer == null) return false; - Party party = api.getParty(partyPlayer.getPartyId()); - return party != null && party.getMembers().size() > 1; - } + if (partyPlayer == null) + return null; - @Override - public GameParty getParty(Player player) { - PartiesAPI api = Parties.getApi(); - PartyPlayer partyPlayer = api.getPartyPlayer(player.getUniqueId()); Party party = api.getParty(partyPlayer.getPartyId()); + if (party == null || party.getMembers().size() <= 1) + return null; - java.util.List players = new java.util.ArrayList<>(); - - for (PartyPlayer localPlayer : party.getOnlineMembers(true)) { - Player pl = Bukkit.getPlayer(localPlayer.getPlayerUUID()); + Player leader = Bukkit.getPlayer(party.getLeader()); + if (leader == null) + return null; - if (pl != null) - players.add(pl); - } + java.util.List members = party.getOnlineMembers(true).stream() + .map(localPlayer -> Bukkit.getPlayer(localPlayer.getPlayerUUID())) + .filter(java.util.Objects::nonNull).collect(java.util.stream.Collectors.toList()); - return new GameParty(players, Bukkit.getPlayer(party.getLeader())); + return new GameParty(members, leader); } @Override diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PartyHandler.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PartyHandler.java index d12359a3..8de280c2 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PartyHandler.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/party/PartyHandler.java @@ -27,8 +27,6 @@ */ public interface PartyHandler { - boolean isPlayerInParty(Player player); - GameParty getParty(Player player); boolean partiesSupported(); diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java index 7e283f8c..6ca7f87c 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java @@ -42,11 +42,6 @@ public PartyHandler initialize(Main plugin) { } } partyHandler = new PartyHandler() { - @Override - public boolean isPlayerInParty(Player player) { - return false; - } - @Override public GameParty getParty(Player player) { return null; From b8bb80ef8294a0a194163ecd583159e9d86212f3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Sep 2021 19:34:27 +0000 Subject: [PATCH 020/127] Bump pom.xml from 1.7.9-dev8 to 1.7.9-dev9 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a97bea7a..ce342f3a 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev8 + 1.7.9-dev9 MurderMystery From a1e21231e356ff729f8dd3f1499f87191a03b04f Mon Sep 17 00:00:00 2001 From: montlikadani Date: Thu, 23 Sep 2021 19:35:35 +0200 Subject: [PATCH 021/127] Stream will be closed automatically, so we need to create a new one on each invokation --- .../java/plugily/projects/murdermystery/arena/role/Role.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java index 1f1f1529..3ea133cf 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java +++ b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java @@ -112,7 +112,7 @@ public static boolean isAnyRole(Player player) { return isAnyRole(player, ArenaRegistry.getArena(player)); } - private static final java.util.stream.Stream roles = java.util.Arrays.stream(Role.values()); + private static final Role[] roles = Role.values(); /** * Checks whether player is playing a role or not @@ -122,6 +122,6 @@ public static boolean isAnyRole(Player player) { * @return true if is playing one role, false otherwise */ public static boolean isAnyRole(Player player, Arena arena) { - return arena != null && roles.anyMatch(role -> isRole(role, player, arena)); + return arena != null && java.util.Arrays.stream(roles).anyMatch(role -> isRole(role, player, arena)); } } From 83becdc93a031543da241b83426de13056172bda Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Sep 2021 17:36:12 +0000 Subject: [PATCH 022/127] Bump pom.xml from 1.7.9-dev9 to 1.7.9-dev10 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ce342f3a..f701aec2 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev9 + 1.7.9-dev10 MurderMystery From 3e845d755fbc2dc402809b4f021e2b2a616c4ee2 Mon Sep 17 00:00:00 2001 From: montlikadani Date: Tue, 2 Nov 2021 15:50:08 +0100 Subject: [PATCH 023/127] Fix when setCooldown method is not existed in 1.9 or later versions - Also fixed initialization issue for partyHandler --- .../projects/murdermystery/events/Events.java | 2 +- .../party/PartySupportInitializer.java | 31 +++++++++---------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/events/Events.java b/src/main/java/plugily/projects/murdermystery/events/Events.java index 937e3618..5f8e38fe 100644 --- a/src/main/java/plugily/projects/murdermystery/events/Events.java +++ b/src/main/java/plugily/projects/murdermystery/events/Events.java @@ -120,7 +120,7 @@ public void onSwordThrow(PlayerInteractEvent e) { attackerUser.setCooldown("sword_shoot", swordFlyCooldown); - if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_9_R1)) { + if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_10_R1)) { attackerUser.setCooldown("sword_attack", (plugin.getConfig().getInt("Murderer-Sword-Attack-Cooldown", 1))); } else { attacker.setCooldown(plugin.getConfigPreferences().getMurdererSword().getType(), 20 * (plugin.getConfig().getInt("Murderer-Sword-Attack-Cooldown", 1))); diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java index 6ca7f87c..bf81cb38 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java @@ -31,7 +31,6 @@ public class PartySupportInitializer { public PartyHandler initialize(Main plugin) { - PartyHandler partyHandler; if(!plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DISABLE_PARTIES)) { if(Bukkit.getServer().getPluginManager().getPlugin("Parties") != null) { return new PartiesPartyHandlerImpl(); @@ -41,23 +40,23 @@ public PartyHandler initialize(Main plugin) { return new PAFSPartyHandlerImpl(); } } - partyHandler = new PartyHandler() { - @Override - public GameParty getParty(Player player) { - return null; - } - @Override - public boolean partiesSupported() { - return false; - } + return new PartyHandler() { + @Override + public GameParty getParty(Player player) { + return null; + } - @Override - public PartyPluginType getPartyPluginType() { - return PartyPluginType.NONE; - } - }; - return partyHandler; + @Override + public boolean partiesSupported() { + return false; + } + + @Override + public PartyPluginType getPartyPluginType() { + return PartyPluginType.NONE; + } + }; } } From 3befdcd3185f7c3d67025086e7e648db1379e472 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 2 Nov 2021 14:50:35 +0000 Subject: [PATCH 024/127] Bump pom.xml from 1.7.9-dev10 to 1.7.9-dev11 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f701aec2..082b9449 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev10 + 1.7.9-dev11 MurderMystery From 04997b3c1252825c173dda28e1226cea3c645803 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Tue, 7 Dec 2021 21:38:55 +0100 Subject: [PATCH 025/127] Updated repo links to https --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 082b9449..42b3cb39 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ papi-repo - http://repo.extendedclip.com/content/repositories/placeholderapi/ + https://repo.extendedclip.com/content/repositories/placeholderapi/ plugilyprojects @@ -61,7 +61,7 @@ simonsators-repo - http://simonsator.de/repo/ + https://simonsator.de/repo/ alessiodp-repo From 860b6ebb3a21ed4eb25eaed94e5ee71caaa7743a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Dec 2021 20:39:26 +0000 Subject: [PATCH 026/127] Bump pom.xml from 1.7.9-dev11 to 1.7.9-dev12 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 42b3cb39..700dd802 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev11 + 1.7.9-dev12 MurderMystery From d873dd38746159859618ff7ff92e10fe5c30678d Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Tue, 5 Apr 2022 23:23:39 +0200 Subject: [PATCH 027/127] Implementation core update (1/2) --- pom.xml | 134 +- .../murdermystery/ConfigPreferences.java | 104 -- .../projects/murdermystery/HookManager.java | 12 +- .../plugily/projects/murdermystery/Main.java | 1183 ++++++++++++----- .../murdermystery/api/StatsStorage.java | 150 --- .../api/events/MurderMysteryEvent.java | 43 - .../events/game/MMGameJoinAttemptEvent.java | 68 - .../events/game/MMGameLeaveAttemptEvent.java | 55 - .../api/events/game/MMGameStartEvent.java | 48 - .../events/game/MMGameStateChangeEvent.java | 54 - .../api/events/game/MMGameStopEvent.java | 48 - .../player/MMPlayerStatisticChangeEvent.java | 99 -- .../projects/murdermystery/arena/Arena.java | 1054 ++------------- .../murdermystery/arena/ArenaEvents.java | 384 +++--- .../murdermystery/arena/ArenaManager.java | 639 +++------ .../murdermystery/arena/ArenaRegistry.java | 232 ++-- .../murdermystery/arena/ArenaState.java | 48 - .../murdermystery/arena/ArenaUtils.java | 325 ++--- .../murdermystery/arena/corpse/Corpse.java | 1 + .../murdermystery/arena/corpse/Stand.java | 1 + .../arena/managers/MapRestorerManager.java | 73 + .../arena/managers/ScoreboardManager.java | 210 +-- .../arena/options/ArenaOption.java | 49 - .../murdermystery/arena/role/Role.java | 38 +- .../arena/special/SpecialBlock.java | 1 + .../arena/special/SpecialBlockEvents.java | 22 +- .../mysterypotion/MysteryPotionRegistry.java | 4 +- .../arena/special/pray/PrayerRegistry.java | 17 +- .../arena/states/InGameState.java | 166 +++ .../arena/states/RestartingState.java | 46 + .../arena/states/StartingState.java | 233 ++++ .../commands/arguments/ArgumentsRegistry.java | 207 +-- .../arguments/admin/ListArenasArgument.java | 57 - .../arguments/admin/RolePassArgument.java | 43 +- .../arguments/admin/SpectateArgument.java | 30 - .../arguments/admin/TeleportArgument.java | 108 -- .../arguments/admin/arena/DeleteArgument.java | 87 -- .../admin/arena/ForceStartArgument.java | 46 - .../arguments/admin/arena/ReloadArgument.java | 93 -- .../arena/SpecialBlockRemoverArgument.java | 127 +- .../arguments/admin/arena/StopArgument.java | 58 - .../arguments/data/CommandArgument.java | 68 - .../commands/arguments/data/LabelData.java | 62 - .../data/LabeledCommandArgument.java | 48 - .../arguments/game/ArenaSelectorArgument.java | 142 -- .../arguments/game/CreateArgument.java | 11 +- .../arguments/game/JoinArguments.java | 118 -- .../arguments/game/LeaderboardArgument.java | 112 -- .../arguments/game/LeaveArgument.java | 63 - .../arguments/game/RoleSelectorArgument.java | 70 +- .../arguments/game/StatsArgument.java | 64 - .../completion/CompletableArgument.java | 60 - .../commands/completion/TabCompletion.java | 87 -- .../murdermystery/events/ChatEvents.java | 106 -- .../projects/murdermystery/events/Events.java | 393 ------ .../murdermystery/events/JoinEvent.java | 108 -- .../murdermystery/events/LobbyEvent.java | 102 -- .../murdermystery/events/PluginEvents.java | 238 ++++ .../murdermystery/events/QuitEvent.java | 63 - .../events/spectator/SpectatorEvents.java | 189 --- .../events/spectator/SpectatorItemEvents.java | 130 -- .../spectator/SpectatorSettingsMenu.java | 118 -- .../murdermystery/handlers/BungeeManager.java | 114 -- .../murdermystery/handlers/ChatManager.java | 149 --- .../murdermystery/handlers/CorpseHandler.java | 23 +- .../handlers/PermissionsManager.java | 64 - .../handlers/PlaceholderManager.java | 105 -- .../handlers/items/SpecialItem.java | 67 - .../handlers/items/SpecialItemManager.java | 127 -- .../handlers/language/LanguageManager.java | 224 ---- .../handlers/language/LanguageMigrator.java | 327 ----- .../handlers/lastwords/LastWordsManager.java | 28 +- .../handlers/party/PAFBPartyHandlerImpl.java | 66 - .../handlers/party/PAFSPartyHandlerImpl.java | 62 - .../party/PartiesPartyHandlerImpl.java | 68 - .../handlers/party/PartyHandler.java | 40 - .../party/PartySupportInitializer.java | 62 - .../handlers/rewards/Reward.java | 108 -- .../handlers/rewards/RewardsFactory.java | 130 -- .../handlers/setup/SetupInventory.java | 429 ++++-- .../handlers/setup/SetupUtilities.java | 88 -- .../components/ArenaRegisterComponent.java | 158 --- .../setup/components/MiscComponents.java | 218 --- .../components/PlayerAmountComponents.java | 161 --- .../setup/components/SetupComponent.java | 35 - .../setup/components/SpawnComponents.java | 124 -- .../components/SpecialBlocksComponents.java | 121 -- .../handlers/sign/ArenaSign.java | 89 -- .../handlers/sign/SignManager.java | 274 ---- .../sword/SwordSkin.java} | 36 +- .../skins/sword/SwordSkinManager.java | 106 ++ .../handlers/trails/BowTrailsHandler.java | 12 +- .../handlers/trails/TrailsManager.java | 25 +- .../projects/murdermystery/old/Main.java | 357 +++++ .../projects/murdermystery/user/User.java | 144 -- .../murdermystery/user/UserManager.java | 120 -- .../murdermystery/user/data/FileStats.java | 71 - .../murdermystery/user/data/MysqlManager.java | 151 --- .../murdermystery/user/data/UserDatabase.java | 66 - .../murdermystery/utils/Debugger.java | 113 -- .../utils/ExceptionLogHandler.java | 85 -- .../murdermystery/utils/ItemPosition.java | 28 +- .../murdermystery/utils/MessageUtils.java | 67 - .../murdermystery/utils/UpdateChecker.java | 327 ----- .../projects/murdermystery/utils/Utils.java | 173 --- .../SimpleConversationBuilder.java | 62 - .../utils/services/ServiceRegistry.java | 92 -- .../services/exception/ReportedException.java | 62 - .../services/exception/ReporterService.java | 71 - .../utils/services/locale/Locale.java | 87 -- .../utils/services/locale/LocaleRegistry.java | 70 - .../utils/services/locale/LocaleService.java | 186 --- .../services/metrics/MetricsService.java | 107 -- src/main/resources/arena_selector.yml | 6 + src/main/resources/arenas.yml | 14 +- src/main/resources/bungee.yml | 15 +- src/main/resources/config.yml | 342 +++-- src/main/resources/internal/data.yml | 29 + .../resources/internal/leaderboards_data.yml | 1 + src/main/resources/language.yml | 653 +++++---- src/main/resources/lastwords.yml | 18 + src/main/resources/leaderboards.yml | 6 + .../resources/locales/language_default.yml | 511 ++++--- src/main/resources/mysql.yml | 13 +- src/main/resources/permissions.yml | 53 + src/main/resources/plugin.yml | 20 +- src/main/resources/rewards.yml | 46 +- src/main/resources/signs.yml | 6 + src/main/resources/skins.yml | 7 + src/main/resources/special_items.yml | 132 +- src/main/resources/spectator.yml | 97 ++ src/main/resources/stats.yml | 1 + src/main/resources/trails.yml | 6 + 133 files changed, 4650 insertions(+), 12154 deletions(-) delete mode 100644 src/main/java/plugily/projects/murdermystery/ConfigPreferences.java delete mode 100644 src/main/java/plugily/projects/murdermystery/api/StatsStorage.java delete mode 100644 src/main/java/plugily/projects/murdermystery/api/events/MurderMysteryEvent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/api/events/game/MMGameJoinAttemptEvent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/api/events/game/MMGameLeaveAttemptEvent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStartEvent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStateChangeEvent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStopEvent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/api/events/player/MMPlayerStatisticChangeEvent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/arena/ArenaState.java create mode 100644 src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/arena/options/ArenaOption.java create mode 100644 src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java create mode 100644 src/main/java/plugily/projects/murdermystery/arena/states/RestartingState.java create mode 100644 src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/admin/ListArenasArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/admin/SpectateArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/admin/TeleportArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/DeleteArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/ForceStartArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/ReloadArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/StopArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/data/CommandArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/data/LabelData.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/data/LabeledCommandArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/game/ArenaSelectorArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/game/JoinArguments.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaderboardArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaveArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/game/StatsArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/completion/CompletableArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/completion/TabCompletion.java delete mode 100644 src/main/java/plugily/projects/murdermystery/events/ChatEvents.java delete mode 100644 src/main/java/plugily/projects/murdermystery/events/Events.java delete mode 100644 src/main/java/plugily/projects/murdermystery/events/JoinEvent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/events/LobbyEvent.java create mode 100644 src/main/java/plugily/projects/murdermystery/events/PluginEvents.java delete mode 100644 src/main/java/plugily/projects/murdermystery/events/QuitEvent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorEvents.java delete mode 100644 src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorItemEvents.java delete mode 100644 src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorSettingsMenu.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/BungeeManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/ChatManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/PermissionsManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/PlaceholderManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/items/SpecialItem.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/items/SpecialItemManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/language/LanguageManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/language/LanguageMigrator.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/party/PAFBPartyHandlerImpl.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/party/PAFSPartyHandlerImpl.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/party/PartiesPartyHandlerImpl.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/party/PartyHandler.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/rewards/Reward.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/rewards/RewardsFactory.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/SetupUtilities.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/components/ArenaRegisterComponent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/components/MiscComponents.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/components/PlayerAmountComponents.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/components/SetupComponent.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/components/SpawnComponents.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/components/SpecialBlocksComponents.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/sign/ArenaSign.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/sign/SignManager.java rename src/main/java/plugily/projects/murdermystery/handlers/{party/GameParty.java => skins/sword/SwordSkin.java} (60%) create mode 100644 src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkinManager.java create mode 100644 src/main/java/plugily/projects/murdermystery/old/Main.java delete mode 100644 src/main/java/plugily/projects/murdermystery/user/User.java delete mode 100644 src/main/java/plugily/projects/murdermystery/user/UserManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/user/data/FileStats.java delete mode 100644 src/main/java/plugily/projects/murdermystery/user/data/MysqlManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/user/data/UserDatabase.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/Debugger.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/ExceptionLogHandler.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/MessageUtils.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/UpdateChecker.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/Utils.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/conversation/SimpleConversationBuilder.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/services/ServiceRegistry.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/services/exception/ReportedException.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/services/exception/ReporterService.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/services/locale/Locale.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/services/locale/LocaleRegistry.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/services/locale/LocaleService.java delete mode 100644 src/main/java/plugily/projects/murdermystery/utils/services/metrics/MetricsService.java create mode 100644 src/main/resources/arena_selector.yml create mode 100644 src/main/resources/internal/data.yml create mode 100644 src/main/resources/internal/leaderboards_data.yml create mode 100644 src/main/resources/lastwords.yml create mode 100644 src/main/resources/leaderboards.yml create mode 100644 src/main/resources/permissions.yml create mode 100644 src/main/resources/signs.yml create mode 100644 src/main/resources/skins.yml create mode 100644 src/main/resources/spectator.yml create mode 100644 src/main/resources/trails.yml diff --git a/pom.xml b/pom.xml index 700dd802..b4046290 100644 --- a/pom.xml +++ b/pom.xml @@ -47,26 +47,14 @@ papermc https://papermc.io/repo/repository/maven-public/ - - papi-repo - https://repo.extendedclip.com/content/repositories/placeholderapi/ - plugilyprojects - https://maven.plugily.xyz/ + https://maven.plugily.xyz/releases codemc-repo https://repo.codemc.org/repository/maven-public/ - - simonsators-repo - https://simonsator.de/repo/ - - - alessiodp-repo - https://repo.alessiodp.com/releases/ - spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -80,55 +68,6 @@ 1.17.1-R0.1-SNAPSHOT provided - - plugily.projects - commons-box-classic - 1.3.3 - compile - - - plugily.projects - commons-box-database - 1.3.3 - compile - - - plugily.projects - commons-box-minecraft - 1.3.3 - compile - - - me.tigerhix.lib - scoreboard - 1.0.9 - compile - - - plugily.projects.inventoryframework - IF - 0.10.0 - compile - legacy-jar-with-dependencies - - - me.clip - placeholderapi - 2.10.9 - provided - - - com.alessiodp.parties - parties-api - 3.1.0 - provided - - - - org.bstats - bstats-bukkit - 2.2.1 - org.jetbrains @@ -144,48 +83,11 @@ ${project.basedir}/lib/CorpseReborn.jar - com.google.code.findbugs - jsr305 - 3.0.2 - provided - - - - commons-io - commons-io - 2.10.0 + plugily.projects + MiniGamesBox-Classic + 1.0.0-SNAPSHOT compile - - - de.simonsator - partyandfriends - 1.0.52 - system - ${project.basedir}/lib/PAFSpigot.jar - - - de.simonsator - Party-and-Friends-MySQL-Edition-Spigot-API - 1.3.2 - provided - - - be.maximvdw - MVdWPlaceholderAPI - - - - - de.simonsator - Spigot-Party-API-For-RedisBungee - 1.0-SNAPSHOT - provided - - - redis.clients - jedis - - + true @@ -244,27 +146,18 @@ - - plugily.projects.inventoryframework - plugily.projects.murdermystery.utils.inventoryframework - - com.zaxxer.hikari plugily.projects.murdermystery.database.hikari - me.tigerhix.lib.scoreboard - plugily.projects.murdermystery.utils.scoreboard + plugily.projects.minigamesbox + plugily.projects.murdermystery.minigamesbox plugily.projects.commonsbox plugily.projects.murdermystery.commonsbox - - org.bstats - plugily.projects.murdermystery.utils.bstats - false @@ -286,21 +179,20 @@ org.apache.maven.wagon - wagon-ftp - 3.4.3 + wagon-ssh + 3.5.1 - - plugily-projects-repo - ftp://81.19.211.8 + plugily-projects-releases-repository + https://maven.plugily.xyz/releases plugily-projects-java-docs - murdermystery - ftp://81.19.211.8 + MurderMystery + sftp://91.229.245.16/var/www/jd diff --git a/src/main/java/plugily/projects/murdermystery/ConfigPreferences.java b/src/main/java/plugily/projects/murdermystery/ConfigPreferences.java deleted file mode 100644 index fd512064..00000000 --- a/src/main/java/plugily/projects/murdermystery/ConfigPreferences.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery; - -import org.bukkit.inventory.ItemStack; - -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.murdermystery.utils.Debugger; -import plugily.projects.murdermystery.utils.MessageUtils; - -import java.util.Map; - -/** - * @author Plajer - *

- * Created at 22.12.2018 - */ -public class ConfigPreferences { - - private final Main plugin; - private ItemStack murdererSword; - private final Map options = new java.util.EnumMap<>(Option.class); - - public ConfigPreferences(Main plugin) { - this.plugin = plugin; - loadOptions(); - loadMurdererSword(); - } - - private void loadMurdererSword() { - try { - murdererSword = XMaterial.matchXMaterial(plugin.getConfig().getString("Murderer-Sword-Material", "IRON_SWORD").toUpperCase()).get().parseItem(); - } catch(Exception ex) { - MessageUtils.errorOccurred(); - Debugger.sendConsoleMsg("Can not found Material " + plugin.getConfig().getString("Murderer-Sword-Material")); - //Set the murdererSword to avoid errors - murdererSword = XMaterial.IRON_SWORD.parseItem(); - } - } - - /** - * Returns whether option value is true or false - * - * @param option option to get value from - * @return true or false based on user configuration - */ - public boolean getOption(Option option) { - return options.get(option); - } - - private void loadOptions() { - for(Option option : Option.values()) { - options.put(option, plugin.getConfig().getBoolean(option.getPath(), option.getDefault())); - } - } - - public ItemStack getMurdererSword() { - return murdererSword; - } - - public enum Option { - BOSSBAR_ENABLED("Bossbar-Enabled", true), BUNGEE_ENABLED("BungeeActivated", false), CHAT_FORMAT_ENABLED("ChatFormat-Enabled", true), - DATABASE_ENABLED("DatabaseActivated", false), INVENTORY_MANAGER_ENABLED("InventoryManager", true), NAMETAGS_HIDDEN("Nametags-Hidden", true), - DISABLE_FALL_DAMAGE("Disable-Fall-Damage", false), ENABLE_SHORT_COMMANDS("Enable-Short-Commands", false), ENABLE_KILL_DETECTIVE_IF_INNOCENT_KILLED("Enable-Kill-Detective-If-Innocent-Killed", true), - MURDERER_SPEED_ENABLED("Speed-Effect-Murderer.Enabled", true), SPAWN_GOLD_EVERY_SPAWNER_MODE("Change-Gold-Spawner-Mode-To-All", false), DISABLE_GOLD_LIMITER("Disable-Gold-Limiter", false), - DISABLE_SEPARATE_CHAT("Disable-Separate-Chat", false), DISABLE_PARTIES("Disable-Parties", true), INNOCENT_LOCATOR("Enable-Innocent-Locator", true), - DISABLE_DEATH_MESSAGE("Hide-Death", false); - - private final String path; - private final boolean def; - - Option(String path, boolean def) { - this.path = path; - this.def = def; - } - - public String getPath() { - return path; - } - - /** - * @return default value of option if absent in config - */ - public boolean getDefault() { - return def; - } - } -} diff --git a/src/main/java/plugily/projects/murdermystery/HookManager.java b/src/main/java/plugily/projects/murdermystery/HookManager.java index 3c641cc7..4ca7310b 100644 --- a/src/main/java/plugily/projects/murdermystery/HookManager.java +++ b/src/main/java/plugily/projects/murdermystery/HookManager.java @@ -19,7 +19,8 @@ package plugily.projects.murdermystery; import org.bukkit.Bukkit; -import plugily.projects.murdermystery.utils.Debugger; +import org.bukkit.plugin.java.JavaPlugin; +import plugily.projects.murdermystery.Main; import java.util.EnumMap; import java.util.Map; @@ -32,8 +33,9 @@ public class HookManager { private final Map hooks = new EnumMap<>(HookFeature.class); - - public HookManager() { + private final Main plugin; + public HookManager(Main plugin) { + this.plugin = plugin; enableHooks(); } @@ -43,7 +45,7 @@ private void enableHooks() { for(Hook requiredHook : feature.getRequiredHooks()) { if(!Bukkit.getPluginManager().isPluginEnabled(requiredHook.pluginName)) { hooks.put(feature, false); - Debugger.debug("[HookManager] Feature {0} won't be enabled because {1} is not installed! Please install it in order to enable this feature in-game!", + plugin.getDebugger().debug("[HookManager] Feature {0} won't be enabled because {1} is not installed! Please install it in order to enable this feature in-game!", feature.name(), requiredHook.pluginName); hooked = false; break; @@ -51,7 +53,7 @@ private void enableHooks() { } if(hooked) { hooks.put(feature, true); - Debugger.debug("[HookManager] Feature {0} enabled!", feature.name()); + plugin.getDebugger().debug("[HookManager] Feature {0} enabled!", feature.name()); } } } diff --git a/src/main/java/plugily/projects/murdermystery/Main.java b/src/main/java/plugily/projects/murdermystery/Main.java index b19ec16e..22429aeb 100644 --- a/src/main/java/plugily/projects/murdermystery/Main.java +++ b/src/main/java/plugily/projects/murdermystery/Main.java @@ -1,347 +1,917 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package plugily.projects.murdermystery; -import me.tigerhix.lib.scoreboard.ScoreboardLib; -import org.bstats.bukkit.Metrics; -import org.bukkit.GameMode; +import org.apache.commons.lang.StringUtils; +import org.bukkit.ChatColor; import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; - -import plugily.projects.commonsbox.database.MysqlDatabase; -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.compat.events.EventsInitializer; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.hologram.HologramManager; -import plugily.projects.commonsbox.minecraft.misc.MiscUtils; -import plugily.projects.commonsbox.minecraft.serialization.InventorySerializer; -import plugily.projects.murdermystery.api.StatsStorage; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.java.JavaPluginLoader; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; +import plugily.projects.minigamesbox.classic.PluginMain; +import plugily.projects.minigamesbox.classic.api.StatisticType; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.options.ArenaOption; +import plugily.projects.minigamesbox.classic.commonsbox.number.NumberUtils; +import plugily.projects.minigamesbox.classic.handlers.language.Message; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.handlers.permissions.PermissionCategory; +import plugily.projects.minigamesbox.classic.handlers.placeholder.Placeholder; +import plugily.projects.minigamesbox.classic.handlers.reward.RewardType; +import plugily.projects.minigamesbox.classic.handlers.setup.PluginSetupInventory; +import plugily.projects.minigamesbox.classic.handlers.setup.SetupUtilities; +import plugily.projects.minigamesbox.classic.preferences.ConfigOption; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.services.locale.Locale; +import plugily.projects.minigamesbox.classic.utils.services.locale.LocaleRegistry; +import plugily.projects.minigamesbox.classic.utils.services.metrics.Metrics; import plugily.projects.murdermystery.arena.Arena; import plugily.projects.murdermystery.arena.ArenaEvents; +import plugily.projects.murdermystery.arena.ArenaManager; import plugily.projects.murdermystery.arena.ArenaRegistry; import plugily.projects.murdermystery.arena.ArenaUtils; +import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.arena.special.SpecialBlockEvents; import plugily.projects.murdermystery.arena.special.mysterypotion.MysteryPotionRegistry; import plugily.projects.murdermystery.arena.special.pray.PrayerRegistry; import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.events.ChatEvents; -import plugily.projects.murdermystery.events.Events; -import plugily.projects.murdermystery.events.JoinEvent; -import plugily.projects.murdermystery.events.LobbyEvent; -import plugily.projects.murdermystery.events.QuitEvent; -import plugily.projects.murdermystery.events.spectator.SpectatorEvents; -import plugily.projects.murdermystery.events.spectator.SpectatorItemEvents; -import plugily.projects.murdermystery.handlers.BungeeManager; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.CorpseHandler; -import plugily.projects.murdermystery.handlers.PermissionsManager; -import plugily.projects.murdermystery.handlers.PlaceholderManager; -import plugily.projects.murdermystery.handlers.items.SpecialItemManager; -import plugily.projects.murdermystery.handlers.language.LanguageManager; import plugily.projects.murdermystery.handlers.lastwords.LastWordsManager; -import plugily.projects.murdermystery.handlers.party.PartyHandler; -import plugily.projects.murdermystery.handlers.party.PartySupportInitializer; -import plugily.projects.murdermystery.handlers.rewards.RewardsFactory; -import plugily.projects.murdermystery.handlers.sign.SignManager; +import plugily.projects.murdermystery.handlers.skins.sword.SwordSkinManager; import plugily.projects.murdermystery.handlers.trails.BowTrailsHandler; import plugily.projects.murdermystery.handlers.trails.TrailsManager; -import plugily.projects.murdermystery.user.User; -import plugily.projects.murdermystery.user.UserManager; -import plugily.projects.murdermystery.user.data.MysqlManager; -import plugily.projects.murdermystery.utils.Debugger; -import plugily.projects.murdermystery.utils.ExceptionLogHandler; -import plugily.projects.murdermystery.utils.MessageUtils; -import plugily.projects.murdermystery.utils.UpdateChecker; -import plugily.projects.murdermystery.utils.Utils; -import plugily.projects.murdermystery.utils.services.ServiceRegistry; import java.io.File; import java.util.Arrays; -import java.util.logging.Level; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class Main extends JavaPlugin { - - private ExceptionLogHandler exceptionLogHandler; - private boolean forceDisable = false; - private BungeeManager bungeeManager; - private RewardsFactory rewardsHandler; - private MysqlDatabase database; - private SignManager signManager; - private CorpseHandler corpseHandler; - private PartyHandler partyHandler; - private ConfigPreferences configPreferences; + +/** Created by Tigerpanzer_02 on 13.03.2022 */ +public class Main extends PluginMain { + private FileConfiguration entityUpgradesConfig; + private ArenaRegistry arenaRegistry; + private ArenaManager arenaManager; private ArgumentsRegistry argumentsRegistry; - private HookManager hookManager; - private UserManager userManager; - private ChatManager chatManager; private LastWordsManager lastWordsManager; private TrailsManager trailsManager; - private SpecialItemManager specialItemManager; - - @Override - public void onEnable() { - if(!validateIfPluginShouldStart()) { - return; - } - - long start = System.currentTimeMillis(); + private SwordSkinManager swordSkinManager; + private HookManager hookManager; - ServiceRegistry.registerService(this); - exceptionLogHandler = new ExceptionLogHandler(this); - LanguageManager.init(this); - saveDefaultConfig(); - - Debugger.setEnabled(getDescription().getVersion().contains("debug") || getConfig().getBoolean("Debug")); - - Debugger.debug("[System] Initialization start"); - if(getConfig().getBoolean("Developer-Mode")) { - Debugger.deepDebug(true); - Debugger.debug(Level.FINE, "Deep debug enabled"); - for(String listenable : getConfig().getStringList("Performance-Listenable")) { - Debugger.monitorPerformance(listenable); - } - } - - configPreferences = new ConfigPreferences(this); - setupFiles(); - initializeClasses(); - checkUpdate(); - Debugger.debug("[System] Initialization finished took {0}ms", System.currentTimeMillis() - start); - - Debugger.debug("Plugin loaded!"); - - if(configPreferences.getOption(ConfigPreferences.Option.NAMETAGS_HIDDEN)) { - getServer().getScheduler().scheduleSyncRepeatingTask(this, () -> - getServer().getOnlinePlayers().forEach(ArenaUtils::updateNameTagsVisibility), 60, 140); - } + @TestOnly + public Main() { + super(); } - private boolean validateIfPluginShouldStart() { - if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_8_R1)) { - MessageUtils.thisVersionIsNotSupported(); - Debugger.sendConsoleMsg("&cYour server version is not supported by Murder Mystery!"); - Debugger.sendConsoleMsg("&cSadly, we must shut off. Maybe you consider changing your server version?"); - forceDisable = true; - getServer().getPluginManager().disablePlugin(this); - return false; - } - try { - Class.forName("org.spigotmc.SpigotConfig"); - } catch(Exception e) { - MessageUtils.thisVersionIsNotSupported(); - Debugger.sendConsoleMsg("&cYour server software is not supported by Murder Mystery!"); - Debugger.sendConsoleMsg("&cWe support only Spigot and Spigot forks only! Shutting off..."); - forceDisable = true; - getServer().getPluginManager().disablePlugin(this); - return false; - } - return true; + @TestOnly + protected Main( + JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { + super(loader, description, dataFolder, file); } @Override - public void onDisable() { - if(forceDisable) { - return; - } - Debugger.debug("System disable initialized"); + public void onEnable() { long start = System.currentTimeMillis(); - - getLogger().removeHandler(exceptionLogHandler); - saveAllUserStatistics(); - if(configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)) { - getMysqlDatabase().shutdownConnPool(); - } - for(ArmorStand armorStand : HologramManager.getArmorStands()) { - armorStand.remove(); - armorStand.setCustomNameVisible(false); - } - HologramManager.getArmorStands().clear(); - for(Arena arena : ArenaRegistry.getArenas()) { - arena.getScoreboardManager().stopAllScoreboards(); - for(Player player : arena.getPlayers()) { - arena.doBarAction(Arena.BarAction.REMOVE, player); - player.setFlySpeed(0.1f); - player.getInventory().clear(); - player.getInventory().setArmorContents(null); - player.getActivePotionEffects().forEach(pe -> player.removePotionEffect(pe.getType())); - player.setWalkSpeed(0.2f); - player.setGameMode(GameMode.SURVIVAL); - arena.teleportToEndLocation(player); - if(configPreferences.getOption(ConfigPreferences.Option.INVENTORY_MANAGER_ENABLED)) { - InventorySerializer.loadInventory(this, player); - } - } - arena.cleanUpArena(); - } - Debugger.debug("System disable finished took {0}ms", System.currentTimeMillis() - start); + registerLocales(); + super.onEnable(); + getDebugger().debug("[System] [Plugin] Initialization start"); + registerPlaceholders(); + addMessages(); + addAdditionalValues(); + initializePluginClasses(); + getDebugger().debug("Full {0} plugin enabled", getName()); + getDebugger() + .debug( + "[System] [Plugin] Initialization finished took {0}ms", + System.currentTimeMillis() - start); } - private void initializeClasses() { - chatManager = new ChatManager(this); - ScoreboardLib.setPluginInstance(this); - if(getConfig().getBoolean("BungeeActivated")) { - bungeeManager = new BungeeManager(this); - } - if(configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)) { - FileConfiguration config = ConfigUtils.getConfig(this, "mysql"); - database = new MysqlDatabase(config.getString("user"), config.getString("password"), config.getString("address"), config.getLong("maxLifeTime", 1800000)); - } - argumentsRegistry = new ArgumentsRegistry(this); - userManager = new UserManager(this); - hookManager = new HookManager(); - Utils.init(this); - PermissionsManager.init(); + public void initializePluginClasses() { + addFileName("lastwords"); + addArenaOptions(); + Arena.init(this); + ArenaUtils.init(this); new ArenaEvents(this); - new SpectatorEvents(this); - new QuitEvent(this); - new JoinEvent(this); - new ChatEvents(this); - registerSoftDependenciesAndServices(); - User.cooldownHandlerTask(); - signManager = new SignManager(this); - ArenaRegistry.registerArenas(); - signManager.loadSigns(); - signManager.updateSigns(); - new Events(this); - new LobbyEvent(this); - new SpectatorItemEvents(this); - rewardsHandler = new RewardsFactory(this); - specialItemManager = new SpecialItemManager(this); - corpseHandler = new CorpseHandler(this); - partyHandler = new PartySupportInitializer().initialize(this); + arenaManager = new ArenaManager(this); + arenaRegistry = new ArenaRegistry(this); + arenaRegistry.registerArenas(); + getSignManager().loadSigns(); + getSignManager().updateSigns(); + argumentsRegistry = new ArgumentsRegistry(this); + + lastWordsManager = new LastWordsManager(this); new BowTrailsHandler(this); MysteryPotionRegistry.init(this); PrayerRegistry.init(this); new SpecialBlockEvents(this); - new EventsInitializer().initialize(this); - lastWordsManager = new LastWordsManager(this); trailsManager = new TrailsManager(this); - MiscUtils.sendStartUpMessage(this, "MurderMystery", getDescription(), true, true); + hookManager = new HookManager(this); + swordSkinManager = new SwordSkinManager(this); + new PluginEvents(this); + addPluginMetrics(); } - private void registerSoftDependenciesAndServices() { - Debugger.debug("Hooking into soft dependencies"); - long start = System.currentTimeMillis(); - - startPluginMetrics(); - if(getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { - Debugger.debug("Hooking into PlaceholderAPI"); - new PlaceholderManager().register(); - } - Debugger.debug("Hooked into soft dependencies took {0}ms", System.currentTimeMillis() - start); + public void registerLocales() { + Arrays.asList( + new Locale( + "Chinese (Traditional)", + "简体中文", + "zh_HK", + "POEditor contributors", + Arrays.asList("中文(傳統)", "中國傳統", "chinese_traditional", "zh")), + new Locale( + "Chinese (Simplified)", + "简体中文", + "zh_CN", + "POEditor contributors", + Arrays.asList("简体中文", "中文", "chinese", "chinese_simplified", "cn")), + new Locale( + "Czech", + "Český", + "cs_CZ", + "POEditor contributors", + Arrays.asList("czech", "cesky", "český", "cs")), + new Locale( + "Dutch", + "Nederlands", + "nl_NL", + "POEditor contributors", + Arrays.asList("dutch", "nederlands", "nl")), + new Locale( + "English", + "English", + "en_GB", + "Tigerpanzer_02", + Arrays.asList("default", "english", "en")), + new Locale( + "French", + "Français", + "fr_FR", + "POEditor contributors", + Arrays.asList("french", "francais", "français", "fr")), + new Locale( + "German", + "Deutsch", + "de_DE", + "Tigerkatze and POEditor contributors", + Arrays.asList("deutsch", "german", "de")), + new Locale( + "Hungarian", + "Magyar", + "hu_HU", + "POEditor contributors", + Arrays.asList("hungarian", "magyar", "hu")), + new Locale( + "Indonesian", + "Indonesia", + "id_ID", + "POEditor contributors", + Arrays.asList("indonesian", "indonesia", "id")), + new Locale( + "Italian", + "Italiano", + "it_IT", + "POEditor contributors", + Arrays.asList("italian", "italiano", "it")), + new Locale( + "Korean", + "한국의", + "ko_KR", + "POEditor contributors", + Arrays.asList("korean", "한국의", "kr")), + new Locale( + "Lithuanian", + "Lietuviešu", + "lt_LT", + "POEditor contributors", + Arrays.asList("lithuanian", "lietuviešu", "lietuviesu", "lt")), + new Locale( + "Polish", "Polski", "pl_PL", "Plajer", Arrays.asList("polish", "polski", "pl")), + new Locale( + "Portuguese (BR)", + "Português Brasileiro", + "pt_BR", + "POEditor contributors", + Arrays.asList("brazilian", "brasil", "brasileiro", "pt-br", "pt_br")), + new Locale( + "Romanian", + "Românesc", + "ro_RO", + "POEditor contributors", + Arrays.asList("romanian", "romanesc", "românesc", "ro")), + new Locale( + "Russian", + "Pусский", + "ru_RU", + "POEditor contributors", + Arrays.asList("russian", "pусский", "pyccknn", "russkiy", "ru")), + new Locale( + "Spanish", + "Español", + "es_ES", + "POEditor contributors", + Arrays.asList("spanish", "espanol", "español", "es")), + new Locale( + "Thai", "Thai", "th_TH", "POEditor contributors", Arrays.asList("thai", "th")), + new Locale( + "Turkish", + "Türk", + "tr_TR", + "POEditor contributors", + Arrays.asList("turkish", "turk", "türk", "tr")), + new Locale( + "Vietnamese", + "Việt", + "vn_VN", + "POEditor contributors", + Arrays.asList("vietnamese", "viet", "việt", "vn"))) + .forEach(LocaleRegistry::registerLocale); } - private void startPluginMetrics() { - Metrics metrics = new Metrics(this, 3038); - - metrics.addCustomChart(new org.bstats.charts.SimplePie("database_enabled", () -> String.valueOf(configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)))); - metrics.addCustomChart(new org.bstats.charts.SimplePie("bungeecord_hooked", () -> String.valueOf(configPreferences.getOption(ConfigPreferences.Option.BUNGEE_ENABLED)))); - metrics.addCustomChart(new org.bstats.charts.SimplePie("locale_used", () -> LanguageManager.getPluginLocale().getPrefix())); - metrics.addCustomChart(new org.bstats.charts.SimplePie("update_notifier", () -> { - if(getConfig().getBoolean("Update-Notifier.Enabled", true)) { - return getConfig().getBoolean("Update-Notifier.Notify-Beta-Versions", true) ? "Enabled with beta notifier" : "Enabled"; - } - return getConfig().getBoolean("Update-Notifier.Notify-Beta-Versions", true) ? "Beta notifier only" : "Disabled"; - })); + public void addAdditionalValues() { + getConfigPreferences() + .registerOption( + "CORPSES_INTEGRATION_OVERWRITE", + new ConfigOption("Corpses.Integration-Overwrite", true)); + getConfigPreferences() + .registerOption("GOLD_SPAWNER_MODE", new ConfigOption("Gold.Spawner-Mode", false)); + getConfigPreferences().registerOption("GOLD_LIMITER", new ConfigOption("Gold.Limiter", false)); + getConfigPreferences() + .registerOption("BOW_KILL_DETECTIVE", new ConfigOption("Bow.Kill-Detective", true)); + getConfigPreferences().registerOption("HIDE_DEATH", new ConfigOption("Hide.Death", false)); + getConfigPreferences() + .registerOption("HIDE_NAMETAGS", new ConfigOption("Hide.Nametags", false)); + + getStatsStorage() + .registerStatistic("WINS", new StatisticType("wins", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "LOSES", new StatisticType("loses", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "KILLS", new StatisticType("kills", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "DEATHS", new StatisticType("deaths", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "HIGHEST_SCORE", + new StatisticType("highest_score", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "CONTRIBUTION_DETECTIVE", + new StatisticType("contribution_detective", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "CONTRIBUTION_MURDERER", + new StatisticType("contribution_murderer", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "PASS_MURDERER", + new StatisticType("pass_murderer", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "PASS_DETECTIVE", + new StatisticType("pass_detective", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "LOCAL_PRAISES", + new StatisticType("local_praises", false, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "LOCAL_SCORE", new StatisticType("local_score", false, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "LOCAL_PRAY", new StatisticType("local_pray", false, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "LOCAL_GOLD", new StatisticType("local_gold", false, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage() + .registerStatistic( + "LOCAL_KILLS", new StatisticType("local_kills", false, "int(11) NOT NULL DEFAULT '0'")); + + getPermissionsManager() + .registerPermissionCategory( + "CHANCES_BOOSTER", new PermissionCategory("Chances-Boost", null)); + getPermissionsManager() + .registerPermissionCategory( + "MURDERER_BOOSTER", new PermissionCategory("Murderer-Boost", null)); + getPermissionsManager() + .registerPermissionCategory( + "DETECTIVE_BOOSTER", new PermissionCategory("Detective-Boost", null)); + + getRewardsHandler().registerRewardType("KILL_DETECTIVE", new RewardType("detective-kill")); + getRewardsHandler().registerRewardType("KILL_MURDERER", new RewardType("murderer-kill")); + getRewardsHandler().registerRewardType("WIN", new RewardType("win")); + getRewardsHandler().registerRewardType("LOSE", new RewardType("lose")); + getRewardsHandler().registerRewardType("PLAYER_DEATH", new RewardType("player-death")); + getRewardsHandler().registerRewardType("GOLD_PICKUP", new RewardType("gold-pickup")); + + getSpecialItemManager().registerSpecialItem("ROLE_PASS", "Role-Pass"); } - private void checkUpdate() { - if(!getConfig().getBoolean("Update-Notifier.Enabled", true)) { - return; - } - UpdateChecker.init(this, 66614).requestUpdateCheck().whenComplete((result, exception) -> { - if(!result.requiresUpdate()) { - return; - } - if(result.getNewestVersion().contains("b")) { - if(getConfig().getBoolean("Update-Notifier.Notify-Beta-Versions", true)) { - Debugger.sendConsoleMsg("&c[Murder Mystery] Your software is ready for update! However it's a BETA VERSION. Proceed with caution."); - Debugger.sendConsoleMsg("&c[Murder Mystery] Current version %old%, latest version %new%".replace("%old%", getDescription().getVersion()).replace("%new%", - result.getNewestVersion())); - } - return; - } - MessageUtils.updateIsHere(); - Debugger.sendConsoleMsg("&aYour MurderMystery plugin is outdated! Download it to keep with latest changes and fixes."); - Debugger.sendConsoleMsg("&aDisable this option in config.yml if you wish."); - Debugger.sendConsoleMsg("&eCurrent version: &c" + getDescription().getVersion() + "&e Latest version: &a" + result.getNewestVersion()); - }); + public void addMessages() { + getMessageManager().registerMessage("", new Message("", "")); + getMessageManager() + .registerMessage( + "SCOREBOARD_ROLES_DETECTIVE", new Message("Scoreboard.Roles.Detective", "")); + getMessageManager() + .registerMessage("SCOREBOARD_ROLES_MURDERER", new Message("Scoreboard.Roles.Murderer", "")); + getMessageManager() + .registerMessage("SCOREBOARD_ROLES_INNOCENT", new Message("Scoreboard.Roles.Innocent", "")); + getMessageManager() + .registerMessage("SCOREBOARD_ROLES_DEAD", new Message("Scoreboard.Roles.Dead", "")); + getMessageManager() + .registerMessage( + "SCOREBOARD_DETECTIVE_ALIVE", new Message("Scoreboard.Detective.Alive", "")); + getMessageManager() + .registerMessage( + "SCOREBOARD_DETECTIVE_BOW_DROPPED", + new Message("Scoreboard.Detective.Bow.Dropped", "")); + getMessageManager() + .registerMessage( + "SCOREBOARD_DETECTIVE_BOW_PICKED", new Message("Scoreboard.Detective.Bow.Picked", "")); + + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_STOPPED", + new Message("In-Game.Messages.Game-End.Placeholders.Murderer.Stopped", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_YOU", + new Message("In-Game.Messages.Game-End.Placeholders.Murderer.Killed.You", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL", + new Message("In-Game.Messages.Game-End.Placeholders.Murderer.Killed.All", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_YOU", + new Message("In-Game.Messages.Game-End.Placeholders.Innocent.Killed.You", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_WRONGLY", + new Message("In-Game.Messages.Game-End.Placeholders.Innocent.Killed.All", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_NOBODY", + new Message("In-Game.Messages.Game-End.Placeholders.Nobody", "")); + + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_ROLE_CHANCES_ACTION_BAR", + new Message("In-Game.Messages.Arena.Chances.Action-Bar", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_COOLDOWN", new Message("In-Game.Messages.Arena.Cooldown", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_LOCATOR_BOW", + new Message("In-Game.Messages.Arena.Locator.Bow", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_LOCATOR_INNOCENT", + new Message("In-Game.Messages.Arena.Locator.Innocent", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_LOCATOR_WATCH_OUT", + new Message("In-Game.Messages.Arena.Locator.Watch-Out", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PASS_NAME", + new Message("In-Game.Messages.Arena.Pass.Name", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_NAME", + new Message("In-Game.Messages.Arena.Pass.Role.Murderer.Name", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_LORE", + new Message("In-Game.Messages.Arena.Pass.Role.Murderer.Lore", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_NAME", + new Message("In-Game.Messages.Arena.Pass.Role.Detective.Name", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_LORE", + new Message("In-Game.Messages.Arena.Pass.Role.Detective.Lore", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PASS_FAIL", + new Message("In-Game.Messages.Arena.Pass.Fail", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PASS_SUCCESS", + new Message("In-Game.Messages.Arena.Pass.Success", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PASS_CHANGE", + new Message("In-Game.Messages.Arena.Pass.Change", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_TIME_LEFT", + new Message("In-Game.Messages.Arena.Playing.Time-Left", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_CHANGE", + new Message("In-Game.Messages.Arena.Playing.Role.Change", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_MURDERER", + new Message("In-Game.Messages.Arena.Playing.Role.Murderer", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_DETECTIVE", + new Message("In-Game.Messages.Arena.Playing.Role.Detective", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_INNOCENT", + new Message("In-Game.Messages.Arena.Playing.Role.Innocent", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_BONUS", + new Message("In-Game.Messages.Arena.Playing.Score.Bonus", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_GOLD", + new Message("In-Game.Messages.Arena.Playing.Score.Gold", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_PLAYER", + new Message("In-Game.Messages.Arena.Playing.Score.Action.Kill.Player", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_MURDERER", + new Message("In-Game.Messages.Arena.Playing.Score.Action.Kill.Murderer", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_INNOCENT", + new Message("In-Game.Messages.Arena.Playing.Score.Action.Kill.Innocent", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_PICKUP_GOLD", + new Message("In-Game.Messages.Arena.Playing.Score.Action.Pickup.Gold", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_SURVIVING_TIME", + new Message("In-Game.Messages.Arena.Playing.Score.Action.Surviving.Time", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_SURVIVING_END", + new Message("In-Game.Messages.Arena.Playing.Score.Action.Surviving.End", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_WIN", + new Message("In-Game.Messages.Arena.Playing.Score.Action.Win", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_DETECTIVE", + new Message("In-Game.Messages.Arena.Playing.Score.Action.Detective", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SWORD_SOON", + new Message("In-Game.Messages.Arena.Playing.Sword.Soon", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_CAULDRON_POTION", + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Potion", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_CAULDRON_HOLOGRAM", + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Hologram", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_NOT_ENOUGH_GOLD", + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Not-Enough-Gold", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_HOLOGRAM", + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Hologram", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_CHAT", + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Chat", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PAY", + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Pay", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_HEARD", + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Heard", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_FEELING_BLESSED", + new Message( + "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Feeling.Blessed", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_FEELING_CURSED", + new Message( + "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Feeling.Cursed", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_DETECTIVE_REVELATION", + new Message( + "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Detective-Revelation", + "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_GOLD_RUSH", + new Message( + "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Gold-Rush", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_SINGLE_COMPENSATION", + new Message( + "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Single-Compensation", + "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_BOW", + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Bow", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_SLOWNESS", + new Message( + "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Slowness", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_BLINDNESS", + new Message( + "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Blindness", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_GOLD", + new Message( + "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Gold", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_DEATH", + new Message( + "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Death", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_BOW_DROPPED", + new Message("In-Game.Messages.Arena.Playing.Bow.Dropped", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_BOW_PICKUP", + new Message("In-Game.Messages.Arena.Playing.Bow.Pickup", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_BOW_SHOT_GOLD", + new Message("In-Game.Messages.Arena.Playing.Bow.Shot.Gold", "")); + getMessageManager() + .registerMessage( + "IN_GAME_MESSAGES_ARENA_PLAYING_BOW_SHOT_TITLE", + new Message("In-Game.Messages.Arena.Playing.Bow.Shot.Title", "")); } - private void setupFiles() { - for(String fileName : Arrays.asList("arenas", "bungee", "rewards", "stats", "special_items", "mysql", "specialblocks")) { - File file = new File(getDataFolder(), fileName + ".yml"); - if(!file.exists()) { - saveResource(fileName + ".yml", false); - } - } + public void registerPlaceholders() { + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "detective_list", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + + StringBuilder detectives = new StringBuilder(); + for (Player p : pluginArena.getDetectiveList()) { + detectives.append(p.getName()).append(", "); + } + + int index = detectives.length() - 2; + if (index > 0 && index < detectives.length()) { + detectives.deleteCharAt(index); + } + + return (pluginArena.isDetectiveDead() ? ChatColor.STRIKETHROUGH : "") + + detectives.toString(); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "murderer_list", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + + StringBuilder murders = new StringBuilder(); + for (Player p : pluginArena.getMurdererList()) { + User user = getUserManager().getUser(p); + int localKills = user.getStatistic("LOCAL_KILLS"); + murders.append(p.getName()); + if (pluginArena.getMurdererList().size() > 1) { + murders.append(" (").append(localKills).append("), "); + } + } + if (pluginArena.getMurdererList().size() > 1) { + murders.deleteCharAt(murders.length() - 2); + } + + return (pluginArena.aliveMurderer() == 1 ? "" : ChatColor.STRIKETHROUGH) + + murders.toString(); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "murderer_kills", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + int murdererKills = 0; + for (Player p : pluginArena.getMurdererList()) { + User user = getUserManager().getUser(p); + int localKills = user.getStatistic("LOCAL_KILLS"); + murdererKills += localKills; + } + return Integer.toString(murdererKills); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "hero", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + Player hero = pluginArena.getCharacter(Arena.CharacterType.HERO); + return hero != null + ? hero.getName() + : new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_NOBODY") + .asKey() + .build(); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "murderer_chance", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + + int totalMurderer = 0; + + for (Player p : arena.getPlayers()) { + User user = getUserManager().getUser(p); + totalMurderer += user.getStatistic("CONTRIBUTION_MURDERER"); + } + User user = getUserManager().getUser(player); + return NumberUtils.round( + ((double) user.getStatistic("CONTRIBUTION_MURDERER") + / (double) totalMurderer) + * 100.0, + 2) + + "%"; + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "detective_chance", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + + int totalDetectives = 0; + + for (Player p : arena.getPlayers()) { + User user = getUserManager().getUser(p); + totalDetectives += user.getStatistic("CONTRIBUTION_DETECTIVE"); + } + User user = getUserManager().getUser(player); + return NumberUtils.round( + ((double) user.getStatistic("CONTRIBUTION_DETECTIVE") + / (double) totalDetectives) + * 100.0, + 2) + + "%"; + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "detective_status", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + + if (pluginArena.isDetectiveDead()) { + if (!pluginArena.isCharacterSet(Arena.CharacterType.FAKE_DETECTIVE)) { + return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_DROPPED").build(); + } else { + return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_PICKED").build(); + } + } else { + return new MessageBuilder("SCOREBOARD_DETECTIVE_ALIVE").build(); + } + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "innocent_size", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + int innocents = 0; + for (Player p : arena.getPlayersLeft()) { + if (!Role.isRole(Role.MURDERER, getUserManager().getUser(p))) { + innocents++; + } + } + return Integer.toString(innocents); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "role", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + User user = getUserManager().getUser(player); + String role; + if (pluginArena.isDeathPlayer(player)) { + role = new MessageBuilder("SCOREBOARD_ROLES_DEAD").asKey().build(); + } else if (Role.isRole(Role.MURDERER, user, arena)) { + role = new MessageBuilder("SCOREBOARD_ROLES_DETECTIVE").asKey().build(); + } else if (Role.isRole(Role.ANY_DETECTIVE, user, arena)) { + role = new MessageBuilder("SCOREBOARD_ROLES_MURDERER").asKey().build(); + } else { + role = new MessageBuilder("SCOREBOARD_ROLES_INNOCENT").asKey().build(); + } + return role; + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "summary_player", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + return getSummary(player, arena); + } + + @Nullable + private String getSummary(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + String summaryEnding; + + if (pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) + && pluginArena.getMurdererList().contains(player)) { + summaryEnding = + new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") + .asKey() + .arena(pluginArena) + .build(); + } else if (!pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) + && !pluginArena.getMurdererList().contains(player)) { + summaryEnding = + new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") + .asKey() + .arena(pluginArena) + .build(); + } else { + summaryEnding = + new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_LOSE") + .asKey() + .arena(pluginArena) + .build(); + } + return summaryEnding; + } + }); + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "summary", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + return getSummary(arena); + } + + @Override + public String getValue(PluginArena arena) { + return getSummary(arena); + } + + @Nullable + private String getSummary(PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return null; + } + String summaryEnding; + + if (pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft())) { + summaryEnding = + new MessageBuilder( + "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL") + .asKey() + .arena(pluginArena) + .build(); + } else { + summaryEnding = + new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_STOPPED") + .asKey() + .arena(pluginArena) + .build(); + } + return summaryEnding; + } + }); } - public RewardsFactory getRewardsHandler() { - return rewardsHandler; + private void addPluginMetrics() { + getMetrics() + .addCustomChart( + new Metrics.SimplePie( + "hooked_addons", + () -> { + if (getServer().getPluginManager().getPlugin("MurderMystery-Extension") != null) { + return "Extension"; + } + return "None"; + })); } - public BungeeManager getBungeeManager() { - return bungeeManager; + private void addArenaOptions() { + getArenaOptionManager().registerArenaOption("DETECTIVE_DIVIDER", new ArenaOption("null", 1)); + getArenaOptionManager().registerArenaOption("MURDERER_DIVIDER", new ArenaOption("null", 1)); } - public PartyHandler getPartyHandler() { - return partyHandler; - } - - public ChatManager getChatManager() { - return chatManager; - } - - public ConfigPreferences getConfigPreferences() { - return configPreferences; - } - - public MysqlDatabase getMysqlDatabase() { - return database; - } - - public SignManager getSignManager() { - return signManager; - } - - public CorpseHandler getCorpseHandler() { - return corpseHandler; + @Override + public ArenaRegistry getArenaRegistry() { + return arenaRegistry; } + @Override public ArgumentsRegistry getArgumentsRegistry() { return argumentsRegistry; } - public HookManager getHookManager() { - return hookManager; - } - - public UserManager getUserManager() { - return userManager; + @Override + public ArenaManager getArenaManager() { + return arenaManager; } public LastWordsManager getLastWordsManager() { @@ -352,33 +922,22 @@ public TrailsManager getTrailsManager() { return trailsManager; } - public SpecialItemManager getSpecialItemManager() { - return specialItemManager; + public SwordSkinManager getSwordSkinManager() { + return swordSkinManager; } - private void saveAllUserStatistics() { - for(Player player : getServer().getOnlinePlayers()) { - User user = userManager.getUser(player); - if(userManager.getDatabase() instanceof MysqlManager) { - StringBuilder update = new StringBuilder(" SET "); - for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { - if(!stat.isPersistent()) continue; - if(update.toString().equalsIgnoreCase(" SET ")) { - update.append(stat.getName()).append('=').append(user.getStat(stat)); - } - update.append(", ").append(stat.getName()).append('=').append(user.getStat(stat)); - } - String finalUpdate = update.toString(); - //copy of userManager#saveStatistic but without async database call that's not allowed in onDisable method. - ((MysqlManager) userManager.getDatabase()).getDatabase().executeUpdate("UPDATE " + ((MysqlManager) getUserManager().getDatabase()).getTableName() - + finalUpdate + " WHERE UUID='" + user.getUniqueId().toString() + "';"); - continue; - } - for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { - userManager.getDatabase().saveStatistic(user, stat); - } - } + public HookManager getHookManager() { + return hookManager; } + @Override + public PluginSetupInventory openSetupInventory(PluginArena arena, Player player) { + return new SetupInventory(this, arena, player); + } + @Override + public PluginSetupInventory openSetupInventory( + PluginArena arena, Player player, SetupUtilities.InventoryStage inventoryStage) { + return new SetupInventory(this, arena, player, inventoryStage); + } } diff --git a/src/main/java/plugily/projects/murdermystery/api/StatsStorage.java b/src/main/java/plugily/projects/murdermystery/api/StatsStorage.java deleted file mode 100644 index 5ddbdaff..00000000 --- a/src/main/java/plugily/projects/murdermystery/api/StatsStorage.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.api; - -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.sorter.SortUtils; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.user.data.MysqlManager; -import plugily.projects.murdermystery.utils.MessageUtils; - -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.TreeMap; -import java.util.UUID; -import java.util.logging.Level; - -/** - * @author Plajer - * @since 0.0.1-alpha - *

- * Class for accessing users statistics. - */ -public class StatsStorage { - - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - - /** - * Get all UUID's sorted ascending by Statistic Type - * - * @param stat Statistic type to get (kills, deaths etc.) - * @return Map of UUID keys and Integer values sorted in ascending order of requested statistic type - */ - @NotNull - @Contract("null -> fail") - public static Map getStats(StatisticType stat) { - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DATABASE_ENABLED)) { - try(Connection connection = plugin.getMysqlDatabase().getConnection()) { - Statement statement = connection.createStatement(); - ResultSet set = statement.executeQuery("SELECT UUID, " + stat.getName() + " FROM " + ((MysqlManager) plugin.getUserManager().getDatabase()).getTableName() + " ORDER BY " + stat.getName()); - Map column = new LinkedHashMap<>(); - while(set.next()) { - try { - column.put(UUID.fromString(set.getString("UUID")), set.getInt(stat.getName())); - } catch (IllegalArgumentException e) { - } - } - return column; - } catch(SQLException e) { - plugin.getLogger().log(Level.WARNING, "SQLException occurred! " + e.getSQLState() + " (" + e.getErrorCode() + ")"); - MessageUtils.errorOccurred(); - Bukkit.getConsoleSender().sendMessage("Cannot get contents from MySQL database!"); - Bukkit.getConsoleSender().sendMessage("Check configuration of mysql.yml file or disable mysql option in config.yml"); - return Collections.emptyMap(); - } - } - FileConfiguration config = ConfigUtils.getConfig(plugin, "stats"); - Map stats = new TreeMap<>(); - for(String string : config.getKeys(false)) { - if(string.equals("data-version")) { - continue; - } - - try { - stats.put(UUID.fromString(string), config.getInt(string + "." + stat.getName())); - } catch (IllegalArgumentException e) { - } - } - return SortUtils.sortByValue(stats); - } - - /** - * Get user statistic based on StatisticType - * - * @param player Online player to get data from - * @param statisticType Statistic type to get (kills, deaths etc.) - * @return int of statistic - * @see StatisticType - */ - public static int getUserStats(Player player, StatisticType statisticType) { - return plugin.getUserManager().getUser(player).getStat(statisticType); - } - - /** - * Set user statistic based on StatisticType - * - * @param player Online player to get data from - * @param statisticType Statistic type to get (kills, deaths etc.) - * @param value int of statistic - * @see StatisticType - */ - public static void setUserStat(Player player, StatisticType statisticType, int value) { - plugin.getUserManager().getUser(player).setStat(statisticType, value); - } - - /** - * Available statistics to get. - */ - public enum StatisticType { - CONTRIBUTION_DETECTIVE("contribdetective", true), - CONTRIBUTION_MURDERER("contribmurderer", true), DEATHS("deaths", true), GAMES_PLAYED("gamesplayed", true), HIGHEST_SCORE("highestscore", true), - KILLS("kills", true), LOSES("loses", true), WINS("wins", true), LOCAL_CURRENT_PRAY("local_pray", false), LOCAL_GOLD("gold", false), LOCAL_KILLS("local_kills", false), - LOCAL_PRAISES("local_praises", false), LOCAL_SCORE("local_score", false), MURDERER_PASS("murderer_pass", true), DETECTIVE_PASS("murderer_pass", true); - - private final String name; - private final boolean persistent; - - StatisticType(String name, boolean persistent) { - this.name = name; - this.persistent = persistent; - } - - public String getName() { - return name; - } - - public boolean isPersistent() { - return persistent; - } - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/api/events/MurderMysteryEvent.java b/src/main/java/plugily/projects/murdermystery/api/events/MurderMysteryEvent.java deleted file mode 100644 index f81c32f0..00000000 --- a/src/main/java/plugily/projects/murdermystery/api/events/MurderMysteryEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.api.events; - -import org.bukkit.event.Event; -import plugily.projects.murdermystery.arena.Arena; - -/** - * Represents Murder Mystery game related events. - */ -public abstract class MurderMysteryEvent extends Event { - - protected Arena arena; - - public MurderMysteryEvent(Arena eventArena) { - arena = eventArena; - } - - /** - * Returns event arena - * - * @return event arena - */ - public Arena getArena() { - return arena; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameJoinAttemptEvent.java b/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameJoinAttemptEvent.java deleted file mode 100644 index 3582c4e5..00000000 --- a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameJoinAttemptEvent.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.api.events.game; - -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; -import plugily.projects.murdermystery.api.events.MurderMysteryEvent; -import plugily.projects.murdermystery.arena.Arena; - -/** - * @author Plajer - * @since 0.0.1-alpha - *

- * Called when player is attempting to join arena. - */ -public class MMGameJoinAttemptEvent extends MurderMysteryEvent implements Cancellable { - - private static final HandlerList HANDLERS = new HandlerList(); - private final Player player; - private boolean isCancelled; - - public MMGameJoinAttemptEvent(Player player, Arena targetArena) { - super(targetArena); - this.player = player; - this.isCancelled = false; - } - - public static HandlerList getHandlerList() { - return HANDLERS; - } - - @Override - public boolean isCancelled() { - return this.isCancelled; - } - - @Override - public void setCancelled(boolean isCancelled) { - this.isCancelled = isCancelled; - } - - public Player getPlayer() { - return player; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameLeaveAttemptEvent.java b/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameLeaveAttemptEvent.java deleted file mode 100644 index 27ad8dab..00000000 --- a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameLeaveAttemptEvent.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.api.events.game; - -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import plugily.projects.murdermystery.api.events.MurderMysteryEvent; -import plugily.projects.murdermystery.arena.Arena; - -/** - * @author Plajer - * @since 0.0.3b - *

- * Called when player is attempting to leave arena. - */ -public class MMGameLeaveAttemptEvent extends MurderMysteryEvent { - - private static final HandlerList HANDLERS = new HandlerList(); - private final Player player; - - public MMGameLeaveAttemptEvent(Player player, Arena targetArena) { - super(targetArena); - this.player = player; - } - - public static HandlerList getHandlerList() { - return HANDLERS; - } - - public Player getPlayer() { - return player; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStartEvent.java b/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStartEvent.java deleted file mode 100644 index b1b895d6..00000000 --- a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStartEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.api.events.game; - -import org.bukkit.event.HandlerList; -import plugily.projects.murdermystery.api.events.MurderMysteryEvent; -import plugily.projects.murdermystery.arena.Arena; - -/** - * @author Plajer - * @since 0.0.1-alpha - *

- * Called when arena has started. - */ -public class MMGameStartEvent extends MurderMysteryEvent { - - private static final HandlerList HANDLERS = new HandlerList(); - - public MMGameStartEvent(Arena arena) { - super(arena); - } - - public static HandlerList getHandlerList() { - return HANDLERS; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStateChangeEvent.java b/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStateChangeEvent.java deleted file mode 100644 index d2c478e4..00000000 --- a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStateChangeEvent.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.api.events.game; - -import org.bukkit.event.HandlerList; -import plugily.projects.murdermystery.api.events.MurderMysteryEvent; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaState; - -/** - * @author Plajer - * @since 0.0.1-alpha - *

- * Called when arena game state has changed. - */ -public class MMGameStateChangeEvent extends MurderMysteryEvent { - - private static final HandlerList HANDLERS = new HandlerList(); - private final ArenaState arenaState; - - public MMGameStateChangeEvent(Arena eventArena, ArenaState arenaState) { - super(eventArena); - this.arenaState = arenaState; - } - - public static HandlerList getHandlerList() { - return HANDLERS; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS; - } - - public ArenaState getArenaState() { - return arenaState; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStopEvent.java b/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStopEvent.java deleted file mode 100644 index 98a3d2e1..00000000 --- a/src/main/java/plugily/projects/murdermystery/api/events/game/MMGameStopEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.api.events.game; - -import org.bukkit.event.HandlerList; -import plugily.projects.murdermystery.api.events.MurderMysteryEvent; -import plugily.projects.murdermystery.arena.Arena; - -/** - * @author Plajer - * @since 0.0.3b - *

- * Called when arena is stopped. - */ -public class MMGameStopEvent extends MurderMysteryEvent { - - private static final HandlerList HANDLERS = new HandlerList(); - - public MMGameStopEvent(Arena arena) { - super(arena); - } - - public static HandlerList getHandlerList() { - return HANDLERS; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/api/events/player/MMPlayerStatisticChangeEvent.java b/src/main/java/plugily/projects/murdermystery/api/events/player/MMPlayerStatisticChangeEvent.java deleted file mode 100644 index 917f4223..00000000 --- a/src/main/java/plugily/projects/murdermystery/api/events/player/MMPlayerStatisticChangeEvent.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * Murder Mystery is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Murder Mystery is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Murder Mystery. If not, see . - */ - -/* - * Murder Mystery is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Murder Mystery is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Murder Mystery. If not, see . - */ - -package plugily.projects.murdermystery.api.events.player; - -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.api.events.MurderMysteryEvent; -import plugily.projects.murdermystery.arena.Arena; - -/** - * @author Plajer - * @see StatsStorage.StatisticType - * @since 0.0.3b - *

- * Called when player receive new statistic. - */ -public class MMPlayerStatisticChangeEvent extends MurderMysteryEvent { - - private static final HandlerList HANDLERS = new HandlerList(); - private final Player player; - private final StatsStorage.StatisticType statisticType; - private final int number; - - public MMPlayerStatisticChangeEvent(Arena eventArena, Player player, StatsStorage.StatisticType statisticType, int number) { - super(eventArena); - this.player = player; - this.statisticType = statisticType; - this.number = number; - } - - public static HandlerList getHandlerList() { - return HANDLERS; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS; - } - - public Player getPlayer() { - return player; - } - - public StatsStorage.StatisticType getStatisticType() { - return statisticType; - } - - public int getNumber() { - return number; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index b002fdbf..0590a568 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -1,6 +1,6 @@ /* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * Village Defense - Protect villagers from hordes of zombies + * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,117 +18,97 @@ package plugily.projects.murdermystery.arena; -import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; -import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.boss.BarColor; -import org.bukkit.boss.BarStyle; -import org.bukkit.boss.BossBar; import org.bukkit.entity.Item; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; -import org.golde.bukkit.corpsereborn.CorpseAPI.CorpseAPI; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - -import plugily.projects.commonsbox.number.NumberUtils; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.minecraft.compat.xseries.XSound; -import plugily.projects.commonsbox.minecraft.hologram.ArmorStandHologram; -import plugily.projects.commonsbox.minecraft.serialization.InventorySerializer; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.HookManager; +import plugily.projects.minigamesbox.classic.arena.ArenaState; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.managers.PluginMapRestorerManager; +import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.api.events.game.MMGameStartEvent; -import plugily.projects.murdermystery.api.events.game.MMGameStateChangeEvent; import plugily.projects.murdermystery.arena.corpse.Corpse; import plugily.projects.murdermystery.arena.corpse.Stand; +import plugily.projects.murdermystery.arena.managers.MapRestorerManager; import plugily.projects.murdermystery.arena.managers.ScoreboardManager; -import plugily.projects.murdermystery.arena.options.ArenaOption; import plugily.projects.murdermystery.arena.role.Role; +import plugily.projects.murdermystery.arena.states.InGameState; +import plugily.projects.murdermystery.arena.states.RestartingState; +import plugily.projects.murdermystery.arena.states.StartingState; +import plugily.projects.murdermystery.HookManager; import plugily.projects.murdermystery.arena.special.SpecialBlock; -import plugily.projects.murdermystery.arena.special.pray.PrayerRegistry; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.rewards.Reward; -import plugily.projects.murdermystery.user.User; -import plugily.projects.murdermystery.utils.Debugger; -import plugily.projects.murdermystery.utils.ItemPosition; -import plugily.projects.murdermystery.utils.Utils; import java.util.ArrayList; -import java.util.Collections; import java.util.EnumMap; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Random; -import java.util.Set; -import java.util.logging.Level; -import java.util.stream.Collectors; -public class Arena extends BukkitRunnable { +/** + * @author Tigerpanzer_02 + *

+ * Created at 17.12.2021 + */ +public class Arena extends PluginArena { - private static final Random random = new Random(); - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - private final ChatManager chatManager = plugin.getChatManager(); - private final String id; + private static Main plugin; - private final Set players = new HashSet<>(); + private final List spectators = new ArrayList<>(); + private final List deaths = new ArrayList<>(); + private final List detectives = new ArrayList<>(); + private final List murderers = new ArrayList<>(); private final List goldSpawned = new ArrayList<>(); private final List corpses = new ArrayList<>(); private final List stands = new ArrayList<>(); private final List specialBlocks = new ArrayList<>(); - private final List allMurderer = new ArrayList<>(), allDetectives = new ArrayList<>(), - spectators = new ArrayList<>(), deaths = new ArrayList<>(); - - //contains murderer, detective, fake detective and hero + private List goldSpawnPoints = new ArrayList<>(); + private List playerSpawnPoints = new ArrayList<>(); + private int spawnGoldTimer = 0; + private int spawnGoldTime = 0; + private boolean detectiveDead; + private boolean murdererLocatorReceived; + private boolean hideChances; + private boolean ready = true; + private boolean forceStart = false; + private boolean goldVisuals = false; private final Map gameCharacters = new EnumMap<>(CharacterType.class); - //all arena values that are integers, contains constant and floating values - private final Map arenaOptions = new EnumMap<>(ArenaOption.class); - //instead of 3 location fields we use map with GameLocation enum - private final Map gameLocations = new EnumMap<>(GameLocation.class); + private MapRestorerManager mapRestorerManager; + private ArmorStandHologram bowHologram; + private static final Random random = new Random(); - private final ScoreboardManager scoreboardManager; + public Arena(String id) { + super(id); + setPluginValues(); + setScoreboardManager(new ScoreboardManager(this)); + mapRestorerManager = new MapRestorerManager(this); + setMapRestorerManager(mapRestorerManager); + addGameStateHandler(ArenaState.IN_GAME, new InGameState()); + addGameStateHandler(ArenaState.RESTARTING, new RestartingState()); + addGameStateHandler(ArenaState.STARTING, new StartingState()); + } - private List goldSpawnPoints = new ArrayList<>(), playerSpawnPoints = new ArrayList<>(); + public static void init(Main plugin) { + Arena.plugin = plugin; + } - private int murderers = 0, detectives = 0, spawnGoldTimer = 0, spawnGoldTime = 0; + @Override + public Main getPlugin() { + return plugin; + } - private boolean detectiveDead, murdererLocatorReceived, hideChances, ready = true, forceStart = false, goldVisuals = false; - private ArenaState arenaState = ArenaState.WAITING_FOR_PLAYERS; - private BossBar gameBar; - private String mapName = ""; - public Arena(String id) { - this.id = id; - for(ArenaOption option : ArenaOption.values()) { - arenaOptions.put(option, option.getDefaultValue()); - } - if(ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_9_R1) && plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BOSSBAR_ENABLED)) { - gameBar = Bukkit.createBossBar(chatManager.colorMessage("Bossbar.Main-Title", null), BarColor.BLUE, BarStyle.SOLID); - } - scoreboardManager = new ScoreboardManager(this); + @Override + public PluginMapRestorerManager getMapRestorerManager() { + return mapRestorerManager; } - public boolean isReady() { - return ready; - } - public void setReady(boolean ready) { - this.ready = ready; + private void setPluginValues() { } - public void addCorpse(Corpse corpse) { if(plugin.getHookManager().isFeatureEnabled(HookManager.HookFeature.CORPSES)) { corpses.add(corpse); @@ -143,484 +123,6 @@ public void addHead(Stand stand) { stands.add(stand); } - @Override - public void run() { - //idle task - if(arenaState == ArenaState.WAITING_FOR_PLAYERS && players.isEmpty()) { - return; - } - Debugger.performance("ArenaTask", "[PerformanceMonitor] [{0}] Running game task", getId()); - long start = System.currentTimeMillis(); - - switch(arenaState) { - case WAITING_FOR_PLAYERS: - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - plugin.getServer().setWhitelist(false); - } - int minPlayers = getMinimumPlayers(); - if(players.size() < minPlayers) { - if(getTimer() <= 0) { - setTimer(45); - chatManager.broadcast(this, chatManager.formatMessage(this, chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Waiting-For-Players"), minPlayers)); - break; - } - } else { - if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players", null)); - } - chatManager.broadcast(this, chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Enough-Players-To-Start")); - setArenaState(ArenaState.STARTING); - setTimer(plugin.getConfig().getInt("Starting-Waiting-Time", 60)); - showPlayers(); - } - setTimer(getTimer() - 1); - break; - case STARTING: - int startTimeFull = plugin.getConfig().getInt("Start-Time-On-Full-Lobby", 15); - - if(!forceStart && players.size() == getMaximumPlayers() && getTimer() >= startTimeFull) { - setTimer(startTimeFull); - chatManager.broadcast(this, chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Start-In").replace("%TIME%", Integer.toString(getTimer()))); - } - - int timer = getTimer(); - double startWaitingTime = plugin.getConfig().getDouble("Starting-Waiting-Time", 60); - - if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Starting-In", null).replace("%time%", Integer.toString(timer))); - gameBar.setProgress(timer / startWaitingTime); - } - - float exp = (float) (timer / startWaitingTime); - - for(Player player : players) { - player.setExp(exp); - player.setLevel(timer); - } - - int minimumPlayers = getMinimumPlayers(); - - if(!forceStart && players.size() < minimumPlayers) { - if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players", null)); - gameBar.setProgress(1.0); - } - - chatManager.broadcast(this, chatManager.formatMessage(this, chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Waiting-For-Players"), minimumPlayers)); - setArenaState(ArenaState.WAITING_FOR_PLAYERS); - Bukkit.getPluginManager().callEvent(new MMGameStartEvent(this)); - setTimer(15); - - for(Player player : players) { - player.setExp(1); - player.setLevel(0); - } - - if(forceStart) { - forceStart = false; - } - - break; - } - - int totalMurderer = 0; - int totalDetective = 0; - - for(Player p : players) { - User user = plugin.getUserManager().getUser(p); - totalMurderer += user.getStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER); - totalDetective += user.getStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE); - } - - if(!hideChances) { - String message = chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Role-Chances-Action-Bar", null); - - for(Player p : players) { - VersionUtils.sendActionBar(p, formatRoleChance(message, plugin.getUserManager().getUser(p), totalMurderer, totalDetective)); - } - } - - if(forceStart || getTimer() == 0) { - Bukkit.getPluginManager().callEvent(new MMGameStartEvent(this)); - setArenaState(ArenaState.IN_GAME); - - if(gameBar != null) { - gameBar.setProgress(1.0); - } - - setTimer(5); - - if(players.isEmpty()) { - break; - } - - for(Player player : players) { - teleportToStartLocation(player); - - //reset local variables to be 100% sure - User user = plugin.getUserManager().getUser(player); - user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, 0); - user.setStat(StatsStorage.StatisticType.LOCAL_CURRENT_PRAY, 0); - user.setStat(StatsStorage.StatisticType.LOCAL_KILLS, 0); - user.setStat(StatsStorage.StatisticType.LOCAL_PRAISES, 0); - user.setStat(StatsStorage.StatisticType.LOCAL_SCORE, 0); - - ArenaUtils.updateNameTagsVisibility(player); - player.getInventory().clear(); - player.setGameMode(GameMode.ADVENTURE); - ArenaUtils.hidePlayersOutsideTheGame(player, this); - player.updateInventory(); - user.addStat(StatsStorage.StatisticType.GAMES_PLAYED, 1); - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Game-Started")); - } - - setTimer(plugin.getConfig().getInt("Classic-Gameplay-Time", 270)); - - Map murdererChances = new HashMap<>(), detectiveChances = new HashMap<>(); - for(Player p : players) { - User user = plugin.getUserManager().getUser(p); - murdererChances.put(user, ((double) user.getStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER) / (double) totalMurderer) * 100.0); - detectiveChances.put(user, ((double) user.getStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE) / (double) totalDetective) * 100.0); - } - //shuffling map to avoid the same murders on the next round - List> shuffledMurderer = new ArrayList<>(murdererChances.entrySet()); - Collections.shuffle(shuffledMurderer); - // - Map sortedMurderer = shuffledMurderer.stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).collect( - Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new)); - - Set playersToSet = new HashSet<>(players); - int maxmurderer = 1; - int maxdetectives = 1; - int playersSize = players.size(); - - Debugger.debug("Before: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Configured: Detectives = {4}, Murders = {5}", - getId(), maxdetectives, maxmurderer, playersSize, detectives, murderers); - if(murderers > 1 && playersSize > murderers) { - maxmurderer = (playersSize / murderers); - } - if(detectives > 1 && playersSize > detectives) { - maxdetectives = (playersSize / detectives); - } - if(playersSize - (maxmurderer + maxdetectives) < 1) { - Debugger.debug("{0} Murderers and detectives amount was reduced because there are not enough players", getId()); - //Make sure to have one innocent! - if(maxdetectives > 1) { - maxdetectives--; - } else if(maxmurderer > 1) { - maxmurderer--; - } - } - - Debugger.debug("After: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Configured: Detectives = {4}, Murders = {5}", - getId(), maxdetectives, maxmurderer, playersSize, detectives, murderers); - - Object[] sortedMurdererArray = sortedMurderer.keySet().toArray(); - - String murdererTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Title", null); - String murdererSubTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Subtitle", null); - - for(int i = 0; i < maxmurderer; i++) { - if (i >= sortedMurdererArray.length) - break; - - User user = (User) sortedMurdererArray[i]; - Player murderer = user.getPlayer(); - - if (murderer != null) { - setCharacter(CharacterType.MURDERER, murderer); - allMurderer.add(murderer); - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, 1); - playersToSet.remove(murderer); - VersionUtils.sendTitles(murderer, murdererTitle, murdererSubTitle, 5, 40, 5); - } - - detectiveChances.remove(user); - } - - //shuffling map to avoid the same detectives on the next round - List> shuffledDetectives = new ArrayList<>(detectiveChances.entrySet()); - Collections.shuffle(shuffledDetectives); - - Map sortedDetective = shuffledDetectives.stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).collect( - Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new)); - - Object[] sortedDetArray = sortedDetective.keySet().toArray(); - - String detectiveTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Detective-Title", null); - String detectiveSubTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Detective-Subtitle", null); - - for(int i = 0; i < maxdetectives; i++) { - if (i >= sortedDetArray.length) - break; - - User user = (User) sortedDetArray[i]; - - Player detective = user.getPlayer(); - if (detective == null) - continue; - - setCharacter(CharacterType.DETECTIVE, detective); - allDetectives.add(detective); - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, 1); - - VersionUtils.sendTitles(detective, detectiveTitle, detectiveSubTitle, 5, 40, 5); - - playersToSet.remove(detective); - detective.getInventory().setHeldItemSlot(0); - ItemPosition.setItem(detective, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); - ItemPosition.setItem(detective, ItemPosition.INFINITE_ARROWS, new ItemStack(Material.ARROW, plugin.getConfig().getInt("Detective-Default-Arrows", 3))); - } - Debugger.debug("Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Players: Detectives = {4}, Murders = {5}", - getId(), maxdetectives, maxmurderer, playersSize, allDetectives, allMurderer); - - String innocentTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Title", null); - String innocentSubTitle = chatManager.colorMessage("In-Game.Messages.Role-Set.Innocent-Subtitle", null); - for(Player p : playersToSet) { - VersionUtils.sendTitles(p, innocentTitle, innocentSubTitle, 5, 40, 5); - } - - if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.In-Game-Info", null)); - } - - // Load and append special blocks hologram - specialBlocks.forEach(this::loadSpecialBlock); - } - if(forceStart) { - forceStart = false; - } - setTimer(getTimer() - 1); - break; - case IN_GAME: - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - plugin.getServer().setWhitelist(getMaximumPlayers() <= players.size()); - } - if(getTimer() <= 0) { - ArenaManager.stopGame(false, this); - } - - int currentTimer = getTimer(); - int classicGameplayTime = plugin.getConfig().getInt("Classic-Gameplay-Time", 270); - - if(currentTimer <= (classicGameplayTime - 10) && currentTimer > (classicGameplayTime - 15)) { - String murdererGetSword = chatManager.colorMessage("In-Game.Messages.Murderer-Get-Sword") - .replace("%time%", Integer.toString(currentTimer - (classicGameplayTime - 15))); - - for(Player p : players) { - p.sendMessage(murdererGetSword); - XSound.UI_BUTTON_CLICK.play(p.getLocation(), 1, 1); - } - - if(currentTimer == (classicGameplayTime - 14)) { - if(allMurderer.isEmpty()) ArenaManager.stopGame(false, this); - - for(Player p : allMurderer) { - User murderer = plugin.getUserManager().getUser(p); - - if(murderer.isSpectator() || !p.isOnline() || ArenaRegistry.getArena(p) != this) - continue; - - p.getInventory().setHeldItemSlot(0); - ItemPosition.setItem(p, ItemPosition.MURDERER_SWORD, plugin.getConfigPreferences().getMurdererSword()); - } - } - } - - // Cache at least once for fast processing - List playersLeft = getPlayersLeft(); - - //every 30 secs survive reward - if(currentTimer % 30 == 0) { - for(Player p : playersLeft) { - if(Role.isRole(Role.INNOCENT, p, this)) { - ArenaUtils.addScore(plugin.getUserManager().getUser(p), ArenaUtils.ScoreAction.SURVIVE_TIME, 0); - } - } - } - - if(currentTimer == 30 || currentTimer == 60) { - String strTimer = Integer.toString(currentTimer); - String title = chatManager.colorMessage("In-Game.Messages.Seconds-Left-Title", null).replace("%time%", strTimer); - String subtitle = chatManager.colorMessage("In-Game.Messages.Seconds-Left-Subtitle", null).replace("%time%", strTimer); - - for(Player p : players) { - VersionUtils.sendTitles(p, title, subtitle, 5, 40, 5); - } - } - - if(currentTimer <= 30 || playersLeft.size() == aliveMurderer() + 1) { - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.INNOCENT_LOCATOR)) { - ArenaUtils.updateInnocentLocator(this); - } - } - //no players - stop game - if(playersLeft.isEmpty()) { - ArenaManager.stopGame(false, this); - } else { - //winner check - if(playersLeft.size() == aliveMurderer()) { - String loseTitle = chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Lose", null); - String murdererKill = chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Subtitles.Murderer-Kill-Everyone", null); - String titleWin = chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Win", null); - - for(Player p : players) { - VersionUtils.sendTitles(p, loseTitle, murdererKill, 5, 40, 5); - - if(allMurderer.contains(p)) { - VersionUtils.sendTitles(p, titleWin, null, 5, 40, 5); - } - } - - ArenaManager.stopGame(false, this); - //murderer speed add - } else if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.MURDERER_SPEED_ENABLED) && playersLeft.size() == aliveMurderer() + 1) { - int multiplier = plugin.getConfig().getInt("Speed-Effect-Murderer.Speed", 3); - - if(multiplier > 1 && multiplier <= 10) { - for(Player p : allMurderer) { - if(isMurderAlive(p)) { - //no potion because it adds particles which can be identified - p.setWalkSpeed(0.1f * multiplier); - } - } - } - } - } - //don't spawn it every time - if(spawnGoldTimer == spawnGoldTime) { - spawnSomeGold(); - spawnGoldTimer = 0; - } else { - spawnGoldTimer++; - } - setTimer(getTimer() - 1); - break; - case ENDING: - scoreboardManager.stopAllScoreboards(); - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - plugin.getServer().setWhitelist(false); - } - if(getTimer() <= 0) { - if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Game-Ended", null)); - } - - for(Player player : new ArrayList<>(players)) { - plugin.getUserManager().getUser(player).removeScoreboard(this); - player.setGameMode(GameMode.SURVIVAL); - for(Player players : Bukkit.getOnlinePlayers()) { - VersionUtils.showPlayer(plugin, player, players); - if(!ArenaRegistry.isInArena(players)) { - VersionUtils.showPlayer(plugin, players, player); - } - } - player.getActivePotionEffects().forEach(effect -> player.removePotionEffect(effect.getType())); - player.setWalkSpeed(0.2f); - player.setFlying(false); - player.setAllowFlight(false); - player.getInventory().clear(); - - player.getInventory().setArmorContents(null); - doBarAction(BarAction.REMOVE, player); - player.setFireTicks(0); - player.setFoodLevel(20); - PrayerRegistry.getRush().remove(player); - PrayerRegistry.getBan().remove(player); - teleportToEndLocation(player); - } - - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.INVENTORY_MANAGER_ENABLED)) { - for(Player player : players) { - InventorySerializer.loadInventory(plugin, player); - } - } - - chatManager.broadcast(this, chatManager.colorMessage("Commands.Teleported-To-The-Lobby")); - - for(User user : plugin.getUserManager().getUsers(this)) { - user.setSpectator(false); - VersionUtils.setCollidable(user.getPlayer(), true); - plugin.getUserManager().saveAllStatistic(user); - } - plugin.getRewardsHandler().performReward(this, Reward.RewardType.END_GAME); - players.clear(); - - deaths.clear(); - spectators.clear(); - - cleanUpArena(); - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED) - && ConfigUtils.getConfig(plugin, "bungee").getBoolean("Shutdown-When-Game-Ends")) { - plugin.getServer().shutdown(); - } - setArenaState(ArenaState.RESTARTING); - } - setTimer(getTimer() - 1); - break; - case RESTARTING: - players.clear(); - setArenaState(ArenaState.WAITING_FOR_PLAYERS); - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - ArenaRegistry.shuffleBungeeArena(); - for(Player player : Bukkit.getOnlinePlayers()) { - ArenaManager.joinAttempt(player, ArenaRegistry.getArenas().get(ArenaRegistry.getBungeeArena())); - } - } - if(gameBar != null) { - gameBar.setTitle(chatManager.colorMessage("Bossbar.Waiting-For-Players", null)); - } - - if(goldVisuals) { - startGoldVisuals(); - } - - break; - default: - break; //o.o? - } - Debugger.performance("ArenaTask", "[PerformanceMonitor] [{0}] Game task finished took {1}ms", - - getId(), System. - - currentTimeMillis() - start); - } - - public String formatRoleChance(String message, User user, int murdererPts, int detectivePts) { - message = StringUtils.replace(message, "%murderer_chance%", NumberUtils.round(((double) user.getStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER) / (double) murdererPts) * 100.0, 2) + "%"); - message = StringUtils.replace(message, "%detective_chance%", NumberUtils.round(((double) user.getStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE) / (double) detectivePts) * 100.0, 2) + "%"); - return message; - } - - private void spawnSomeGold() { - int spawnPointsSize = goldSpawnPoints.size(); - - if(spawnPointsSize == 0) { - return; - } - - //may users want to disable it and want much gold on there map xD - if(!plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DISABLE_GOLD_LIMITER)) { - //do not exceed amount of gold per spawn - if(goldSpawned.size() >= spawnPointsSize) { - return; - } - } - - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.SPAWN_GOLD_EVERY_SPAWNER_MODE)) { - for(Location location : goldSpawnPoints) { - goldSpawned.add(location.getWorld().dropItem(location, new ItemStack(Material.GOLD_INGOT, 1))); - } - } else { - Location loc = goldSpawnPoints.get(spawnPointsSize == 1 ? 0 : random.nextInt(spawnPointsSize)); - goldSpawned.add(loc.getWorld().dropItem(loc, new ItemStack(Material.GOLD_INGOT, 1))); - } - } - - public void setMurderers(int murderers) { - this.murderers = murderers; - } - public void setSpawnGoldTime(int spawnGoldTime) { this.spawnGoldTime = spawnGoldTime; } @@ -637,10 +139,6 @@ public void setDetectiveDead(boolean detectiveDead) { this.detectiveDead = detectiveDead; } - public void setDetectives(int detectives) { - this.detectives = detectives; - } - public boolean isMurdererLocatorReceived() { return murdererLocatorReceived; } @@ -649,18 +147,14 @@ public void setMurdererLocatorReceived(boolean murdererLocatorReceived) { this.murdererLocatorReceived = murdererLocatorReceived; } - public void setForceStart(boolean forceStart) { - this.forceStart = forceStart; + public Map getGameCharacters() { + return gameCharacters; } public boolean isHideChances() { return hideChances; } - public ScoreboardManager getScoreboardManager() { - return scoreboardManager; - } - @NotNull public List getGoldSpawned() { return goldSpawned; @@ -685,12 +179,12 @@ public void toggleGoldVisuals() { private BukkitTask visualTask; - private void startGoldVisuals() { + public void startGoldVisuals() { if(visualTask != null) { return; } visualTask = Bukkit.getScheduler().runTaskTimer(plugin, () -> { - if(!goldVisuals || !plugin.isEnabled() || goldSpawnPoints.isEmpty() || arenaState != ArenaState.WAITING_FOR_PLAYERS) { + if(!goldVisuals || !plugin.isEnabled() || goldSpawnPoints.isEmpty() || getArenaState() != ArenaState.WAITING_FOR_PLAYERS) { //we need to cancel it that way as the arena class is an task visualTask.cancel(); return; @@ -717,256 +211,6 @@ public void setGoldVisuals(boolean goldVisuals) { startGoldVisuals(); } } - - /** - * Get arena identifier used to get arenas by string. - * - * @return arena name - * @see ArenaRegistry#getArena(String) - */ - public String getId() { - return id; - } - - /** - * Get minimum players needed. - * - * @return minimum players needed to start arena - */ - public int getMinimumPlayers() { - return getOption(ArenaOption.MINIMUM_PLAYERS); - } - - /** - * Set minimum players needed. - * - * @param minimumPlayers players needed to start arena - */ - public void setMinimumPlayers(int minimumPlayers) { - if(minimumPlayers < 2) { - Debugger.debug(Level.WARNING, "Minimum players amount for arena cannot be less than 2! Got {0}", minimumPlayers); - minimumPlayers = 2; - } - - setOptionValue(ArenaOption.MINIMUM_PLAYERS, minimumPlayers); - } - - /** - * Get arena map name. - * - * @return arena map name, it's not arena id - * @see #getId() - */ - @NotNull - public String getMapName() { - return mapName; - } - - /** - * Set arena map name. - * - * @param mapname new map name, it's not arena id - */ - public void setMapName(@NotNull String mapname) { - this.mapName = mapname; - } - - /** - * Get timer of arena. - * - * @return timer of lobby time / time to next wave - */ - public int getTimer() { - return getOption(ArenaOption.TIMER); - } - - /** - * Modify game timer. - * - * @param timer timer of lobby / time to next wave - */ - public void setTimer(int timer) { - setOptionValue(ArenaOption.TIMER, timer); - } - - /** - * Return maximum players arena can handle. - * - * @return maximum players arena can handle - */ - public int getMaximumPlayers() { - return getOption(ArenaOption.MAXIMUM_PLAYERS); - } - - /** - * Set maximum players arena can handle. - * - * @param maximumPlayers how many players arena can handle - */ - public void setMaximumPlayers(int maximumPlayers) { - setOptionValue(ArenaOption.MAXIMUM_PLAYERS, maximumPlayers); - } - - /** - * Return game state of arena. - * - * @return game state of arena - * @see ArenaState - */ - @NotNull - public ArenaState getArenaState() { - return arenaState; - } - - /** - * Set game state of arena. - * - * @param arenaState new game state of arena - * @see ArenaState - */ - public void setArenaState(@NotNull ArenaState arenaState) { - this.arenaState = arenaState; - - Bukkit.getPluginManager().callEvent(new MMGameStateChangeEvent(this, arenaState)); - - plugin.getSignManager().updateSigns(); - } - - /** - * Get all players in arena. - * - * @return set of players in arena - */ - @NotNull - public Set getPlayers() { - return players; - } - - public void teleportToLobby(Player player) { - player.setFoodLevel(20); - player.setFlying(false); - player.setAllowFlight(false); - player.getActivePotionEffects().forEach(effect -> player.removePotionEffect(effect.getType())); - player.setWalkSpeed(0.2f); - Location location = getLobbyLocation(); - if(location == null) { - System.out.print("LobbyLocation isn't intialized for arena " + getId()); - return; - } - player.teleport(location); - } - - /** - * Executes boss bar action for arena - * - * @param action add or remove a player from boss bar - * @param p player - */ - public void doBarAction(BarAction action, Player p) { - if(gameBar == null) { - return; - } - switch(action) { - case ADD: - gameBar.addPlayer(p); - break; - case REMOVE: - gameBar.removePlayer(p); - break; - default: - break; - } - } - - /** - * Get lobby location of arena. - * - * @return lobby location of arena - */ - @Nullable - public Location getLobbyLocation() { - return gameLocations.get(GameLocation.LOBBY); - } - - /** - * Set lobby location of arena. - * - * @param loc new lobby location of arena - */ - public void setLobbyLocation(Location loc) { - gameLocations.put(GameLocation.LOBBY, loc); - } - - public void teleportToStartLocation(Player player) { - int size = playerSpawnPoints.size(); - player.teleport(playerSpawnPoints.get(size == 1 ? 0 : random.nextInt(size))); - } - - public void teleportAllToEndLocation() { - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED) - && ConfigUtils.getConfig(plugin, "bungee").getBoolean("End-Location-Hub", true)) { - players.forEach(plugin.getBungeeManager()::connectToHub); - return; - } - - Location location = getEndLocation(); - if(location == null) { - location = getLobbyLocation(); - System.out.print("EndLocation for arena " + getId() + " isn't intialized!"); - } - - if(location != null) { - for(Player player : players) { - player.teleport(location); - } - } - } - - public void teleportToEndLocation(Player player) { - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED) - && ConfigUtils.getConfig(plugin, "bungee").getBoolean("End-Location-Hub", true)) { - plugin.getBungeeManager().connectToHub(player); - return; - } - - Location location = getEndLocation(); - if(location == null) { - System.out.print("EndLocation for arena " + getId() + " isn't intialized!"); - location = getLobbyLocation(); - } - - if(location != null) { - player.teleport(location); - } - } - - public List getPlayerSpawnPoints() { - return playerSpawnPoints; - } - - public void setPlayerSpawnPoints(@NotNull List playerSpawnPoints) { - this.playerSpawnPoints = playerSpawnPoints; - } - - /** - * Get end location of arena. - * - * @return end location of arena - */ - @Nullable - public Location getEndLocation() { - return gameLocations.get(GameLocation.END); - } - - /** - * Set end location of arena. - * - * @param endLoc new end location of arena - */ - public void setEndLocation(Location endLoc) { - gameLocations.put(GameLocation.END, endLoc); - } - public void loadSpecialBlock(SpecialBlock block) { if (!specialBlocks.contains(block)) { specialBlocks.add(block); @@ -974,11 +218,11 @@ public void loadSpecialBlock(SpecialBlock block) { switch(block.getSpecialBlockType()) { case MYSTERY_CAULDRON: - block.setArmorStandHologram(new ArmorStandHologram(Utils.getBlockCenter(block.getLocation()), chatManager.colorMessage("In-Game.Messages.Special-Blocks.Cauldron-Hologram", null))); + block.setArmorStandHologram(new ArmorStandHologram(plugin.getBukkitHelper().getBlockCenter(block.getLocation()), plugin.getLanguageManager().getLanguageMessage("In-Game.Messages.Arena.Playing.Special-Blocks.Cauldron.Hologram"))); break; case PRAISE_DEVELOPER: - ArmorStandHologram prayer = new ArmorStandHologram(Utils.getBlockCenter(block.getLocation())); - for(String str : chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praise-Hologram", null).split(";")) { + ArmorStandHologram prayer = new ArmorStandHologram(plugin.getBukkitHelper().getBlockCenter(block.getLocation())); + for(String str : plugin.getLanguageManager().getLanguageMessage("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Hologram").split(";")) { prayer.appendLine(str); } block.setArmorStandHologram(prayer); @@ -994,102 +238,21 @@ public void loadSpecialBlock(SpecialBlock block) { public List getSpecialBlocks() { return specialBlocks; } - - public void start() { - Debugger.debug("[{0}] Game instance started", getId()); - runTaskTimer(plugin, 20L, 20L); - setArenaState(ArenaState.RESTARTING); - } - - void addPlayer(Player player) { - players.add(player); - } - - void removePlayer(Player player) { - if(player != null) { - players.remove(player); - } - } - - public List getPlayersLeft() { - List list = new ArrayList<>(); - - for (Player player : players) { - User user = plugin.getUserManager().getUser(player); - if (!user.isSpectator()) { - list.add(user.getPlayer()); - } - } - - return list; - } - - void showPlayers() { - for(Player player : players) { - for(Player p : players) { - VersionUtils.showPlayer(plugin, player, p); - VersionUtils.showPlayer(plugin, p, player); - } - } - } - - public void cleanUpArena() { - removeBowHolo(); - - murdererLocatorReceived = false; - gameCharacters.clear(); - allMurderer.clear(); - allDetectives.clear(); - setDetectiveDead(false); - clearCorpses(); - clearGold(); - } - - public void clearGold() { - goldSpawned.stream().filter(Objects::nonNull).forEach(Item::remove); - goldSpawned.clear(); - } - - public void clearCorpses() { - if(!plugin.getHookManager().isFeatureEnabled(HookManager.HookFeature.CORPSES)) { - for(Stand stand : stands) { - if(!stand.getHologram().isDeleted()) { - stand.getHologram().delete(); - } - if(stand.getStand() != null) { - stand.getStand().remove(); - } - } - stands.clear(); - return; - } - for(Corpse corpse : corpses) { - if(!corpse.getHologram().isDeleted()) { - corpse.getHologram().delete(); - } - if(corpse.getCorpseData() != null) { - corpse.getCorpseData().destroyCorpseFromEveryone(); - CorpseAPI.removeCorpse(corpse.getCorpseData()); - } - } - corpses.clear(); - } - - public boolean isCharacterSet(CharacterType type) { + public boolean isCharacterSet(Arena.CharacterType type) { return gameCharacters.containsKey(type); } - public void setCharacter(CharacterType type, Player player) { + public void setCharacter(Arena.CharacterType type, Player player) { gameCharacters.put(type, player); } @Nullable - public Player getCharacter(CharacterType type) { + public Player getCharacter(Arena.CharacterType type) { return gameCharacters.get(type); } public void addToDetectiveList(Player player) { - allDetectives.add(player); + detectives.add(player); } public boolean lastAliveDetective() { @@ -1098,8 +261,9 @@ public boolean lastAliveDetective() { public int aliveDetective() { int alive = 0; - for(Player p : getPlayersLeft()) { - if(Role.isRole(Role.ANY_DETECTIVE, p, this) && isDetectiveAlive(p)) { + for(Player player : getPlayersLeft()) { + if (Role.isRole(Role.ANY_DETECTIVE, plugin.getUserManager().getUser(player), this) + && isDetectiveAlive(player)) { alive++; } } @@ -1108,7 +272,7 @@ public int aliveDetective() { public boolean isDetectiveAlive(Player player) { for(Player p : getPlayersLeft()) { - if(p == player && allDetectives.contains(p)) { + if(p == player && detectives.contains(p)) { return true; } } @@ -1116,15 +280,15 @@ public boolean isDetectiveAlive(Player player) { } public List getDetectiveList() { - return allDetectives; + return detectives; } public void addToMurdererList(Player player) { - allMurderer.add(player); + murderers.add(player); } public void removeFromMurdererList(Player player) { - allMurderer.remove(player); + murderers.remove(player); } @@ -1134,8 +298,8 @@ public boolean lastAliveMurderer() { public int aliveMurderer() { int alive = 0; - for(Player p : getPlayersLeft()) { - if(Role.isRole(Role.MURDERER, p, this) && isMurderAlive(p)) { + for(Player player : getPlayersLeft()) { + if (Role.isRole(Role.MURDERER, plugin.getUserManager().getUser(player), this) && isMurderAlive(player)) { alive++; } } @@ -1144,7 +308,7 @@ public int aliveMurderer() { public boolean isMurderAlive(Player player) { for(Player p : getPlayersLeft()) { - if(p == player && allMurderer.contains(p)) { + if(p == player && murderers.contains(p)) { return true; } } @@ -1152,42 +316,7 @@ public boolean isMurderAlive(Player player) { } public List getMurdererList() { - return allMurderer; - } - - public int getOption(@NotNull ArenaOption option) { - return arenaOptions.getOrDefault(option, 0); - } - - public void setOptionValue(ArenaOption option, int value) { - arenaOptions.put(option, value); - } - - public void addOptionValue(ArenaOption option, int value) { - arenaOptions.put(option, getOption(option) + value); - } - - public enum BarAction { - ADD, REMOVE - } - - public enum GameLocation { - LOBBY, END - } - - public enum CharacterType { - MURDERER, DETECTIVE, FAKE_DETECTIVE, HERO - } - - - private ArmorStandHologram bowHologram; - - public void removeBowHolo() { - if(bowHologram != null && !bowHologram.isDeleted()) { - bowHologram.delete(); - } - - bowHologram = null; + return murderers; } public void setBowHologram(ArmorStandHologram bowHologram) { @@ -1226,5 +355,28 @@ public void removeSpectatorPlayer(Player player) { public boolean isSpectatorPlayer(Player player) { return spectators.contains(player); } + public List getPlayerSpawnPoints() { + return playerSpawnPoints; + } + + public int getSpawnGoldTime() { + return spawnGoldTime; + } + + public int getSpawnGoldTimer() { + return spawnGoldTimer; + } + + public void setSpawnGoldTimer(int spawnGoldTimer) { + this.spawnGoldTimer = spawnGoldTimer; + } + + -} + public void setPlayerSpawnPoints(@NotNull List playerSpawnPoints) { + this.playerSpawnPoints = playerSpawnPoints; + } + public enum CharacterType { + MURDERER, DETECTIVE, FAKE_DETECTIVE, HERO + } +} \ No newline at end of file diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index 61deae19..74fa2d11 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -1,6 +1,6 @@ /* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * Village Defense - Protect villagers from hordes of zombies + * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,14 +28,11 @@ import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; @@ -43,110 +40,87 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.spigotmc.event.entity.EntityDismountEvent; -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.minecraft.compat.events.api.CBEntityPickupItemEvent; -import plugily.projects.commonsbox.minecraft.compat.events.api.CBPlayerPickupArrow; -import plugily.projects.commonsbox.minecraft.compat.xseries.XSound; -import plugily.projects.commonsbox.minecraft.misc.stuff.ComplementAccessor; -import plugily.projects.murdermystery.ConfigPreferences; +import plugily.projects.minigamesbox.classic.arena.ArenaState; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.PluginArenaEvents; +import plugily.projects.minigamesbox.classic.handlers.items.SpecialItem; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.handlers.language.TitleBuilder; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.misc.complement.ComplementAccessor; +import plugily.projects.minigamesbox.classic.utils.version.ServerVersion; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; +import plugily.projects.minigamesbox.classic.utils.version.events.api.PlugilyEntityPickupItemEvent; +import plugily.projects.minigamesbox.classic.utils.version.events.api.PlugilyPlayerPickupArrow; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XSound; import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; +import plugily.projects.murdermystery.arena.managers.MapRestorerManager; import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.arena.special.pray.PrayerRegistry; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.items.SpecialItem; -import plugily.projects.murdermystery.handlers.rewards.Reward; -import plugily.projects.murdermystery.user.User; +import plugily.projects.murdermystery.old.arena.ArenaRegistry; import plugily.projects.murdermystery.utils.ItemPosition; -import plugily.projects.murdermystery.utils.Utils; +import plugily.projects.thebridge.Main; +import plugily.projects.thebridge.arena.base.Base; +import plugily.projects.thebridge.arena.managers.ScoreboardManager; +import plugily.projects.thebridge.kits.level.ArcherKit; /** * @author Plajer - *

- * Created at 13.03.2018 + *

Created at 13.03.2018 */ -public class ArenaEvents implements Listener { +public class ArenaEvents extends PluginArenaEvents { private final Main plugin; - private final ChatManager chatManager; public ArenaEvents(Main plugin) { + super(plugin); this.plugin = plugin; - chatManager = plugin.getChatManager(); plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler public void onArmorStandEject(EntityDismountEvent e) { - if(e.getEntityType() != EntityType.ARMOR_STAND || !"MurderMysteryArmorStand".equals(e.getEntity().getCustomName())) { + if (!(e.getEntity() instanceof ArmorStand) + || !"MurderMysteryArmorStand".equals(e.getEntity().getCustomName())) { return; } - if(!(e.getDismounted() instanceof Player)) { + if (!(e.getDismounted() instanceof Player)) { return; } - if(e.getDismounted().isDead()) { + if (e.getDismounted().isDead()) { e.getEntity().remove(); } - //we could use setCancelled here but for 1.12 support we cannot (no api) + // we could use setCancelled here but for 1.12 support we cannot (no api) e.getDismounted().addPassenger(e.getEntity()); } - @EventHandler - public void onEntityDamage(EntityDamageEvent e) { - if(e.getEntityType() != EntityType.PLAYER) { - return; - } - Player victim = (Player) e.getEntity(); - Arena arena = ArenaRegistry.getArena(victim); - if(arena == null) { + @Override + public void handleIngameVoidDeath(Player victim, PluginArena arena) { + Arena pluginArena = (Arena) plugin.getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { return; } - - switch (e.getCause()) { - case DROWNING: - e.setCancelled(true); - break; - case FALL: - if(!plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DISABLE_FALL_DAMAGE)) { - if(e.getDamage() >= 20.0) { - //kill the player for suicidal death, else do not - victim.damage(1000.0); - } - } - - e.setCancelled(true); - break; - case VOID: //kill the player and move to the spawn point - victim.damage(1000.0); - - if(arena.getArenaState() == ArenaState.WAITING_FOR_PLAYERS || arena.getArenaState() == ArenaState.STARTING) { - victim.teleport(arena.getLobbyLocation()); - } else { - victim.teleport(arena.getPlayerSpawnPoints().get(0)); - } - - break; - default: - break; + victim.damage(1000.0); + if (arena.getArenaState() == ArenaState.IN_GAME) { + victim.teleport(pluginArena.getPlayerSpawnPoints().get(0)); } } @EventHandler public void onBowShot(EntityShootBowEvent e) { - if(e.getEntityType() != EntityType.PLAYER) { + if (e.getEntityType() != EntityType.PLAYER) { return; } Player player = (Player) e.getEntity(); - if(!Role.isRole(Role.ANY_DETECTIVE, player)) { + User user = plugin.getUserManager().getUser(player); + if (!Role.isRole(Role.ANY_DETECTIVE, user)) { return; } - User user = plugin.getUserManager().getUser(player); - if(user.getCooldown("bow_shot") == 0) { + if (user.getCooldown("bow_shot") == 0) { int bowCooldown = plugin.getConfig().getInt("Detective-Bow-Cooldown", 5); user.setCooldown("bow_shot", bowCooldown); - Utils.applyActionBarCooldown(player, bowCooldown); + plugin.getBukkitHelper().applyActionBarCooldown(player, bowCooldown); VersionUtils.setDurability(e.getBow(), (short) 0); } else { e.setCancelled(true); @@ -154,56 +128,65 @@ public void onBowShot(EntityShootBowEvent e) { } @EventHandler - public void onArrowPickup(CBPlayerPickupArrow e) { - if(ArenaRegistry.isInArena(e.getPlayer())) { + public void onArrowPickup(PlugilyPlayerPickupArrow e) { + if (plugin.getArenaRegistry().isInArena(e.getPlayer())) { e.getItem().remove(); e.setCancelled(true); } } @EventHandler - public void onItemPickup(CBEntityPickupItemEvent e) { - if(!(e.getEntity() instanceof Player)) { + public void onItemPickup(PlugilyEntityPickupItemEvent e) { + if (!(e.getEntity() instanceof Player)) { return; } Player player = (Player) e.getEntity(); - Arena arena = ArenaRegistry.getArena(player); - if(arena == null) { + Arena arena = (Arena) plugin.getArenaRegistry().getArena(player); + if (arena == null) { return; } + User user = plugin.getUserManager().getUser(player); e.setCancelled(true); - if(arena.getBowHologram() != null && e.getItem().equals(arena.getBowHologram().getEntityItem())) { - if(!plugin.getUserManager().getUser(player).isSpectator() && Role.isRole(Role.INNOCENT, player, arena)) { + if (arena.getBowHologram() != null + && e.getItem().equals(arena.getBowHologram().getEntityItem())) { + if (!user.isSpectator() && Role.isRole(Role.INNOCENT, user, arena)) { XSound.BLOCK_LAVA_POP.play(player.getLocation(), 1F, 2F); - arena.removeBowHolo(); + ((MapRestorerManager) arena.getMapRestorerManager()).removeBowHolo(); e.getItem().remove(); - for(Player loopPlayer : arena.getPlayersLeft()) { - if(Role.isRole(Role.INNOCENT, loopPlayer)) { - ItemPosition.setItem(loopPlayer, ItemPosition.BOW_LOCATOR, new ItemStack(Material.AIR, 1)); + for (Player loopPlayer : arena.getPlayersLeft()) { + if (Role.isRole(Role.INNOCENT, plugin.getUserManager().getUser(loopPlayer))) { + ItemPosition.setItem( + loopPlayer, ItemPosition.BOW_LOCATOR, new ItemStack(Material.AIR, 1)); } } arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, player); ItemPosition.setItem(player, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); - ItemPosition.setItem(player, ItemPosition.INFINITE_ARROWS, new ItemStack(Material.ARROW, plugin.getConfig().getInt("Detective-Fake-Arrows", 3))); - chatManager.broadcast(arena, chatManager.colorMessage("In-Game.Messages.Bow-Messages.Pickup-Bow-Message", player)); + ItemPosition.setItem( + player, + ItemPosition.INFINITE_ARROWS, + new ItemStack(Material.ARROW, plugin.getConfig().getInt("Detective-Fake-Arrows", 3))); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_PICKUP") + .asKey() + .player(player) + .arena(arena) + .sendArena(); } return; } - if(e.getItem().getItemStack().getType() != Material.GOLD_INGOT) { + if (e.getItem().getItemStack().getType() != Material.GOLD_INGOT) { return; } - User user = plugin.getUserManager().getUser(player); - if(user.isSpectator() || arena.getArenaState() != ArenaState.IN_GAME) { + if (user.isSpectator() || arena.getArenaState() != ArenaState.IN_GAME) { return; } - if(PrayerRegistry.getBan().contains(player)) { + if (PrayerRegistry.getBan().contains(player)) { e.setCancelled(true); return; } @@ -214,39 +197,64 @@ public void onItemPickup(CBEntityPickupItemEvent e) { arena.getGoldSpawned().remove(e.getItem()); ItemStack stack = new ItemStack(Material.GOLD_INGOT, e.getItem().getItemStack().getAmount()); - if(PrayerRegistry.getRush().contains(player)) { + if (PrayerRegistry.getRush().contains(player)) { stack.setAmount(3 * e.getItem().getItemStack().getAmount()); } ItemPosition.addItem(player, ItemPosition.GOLD_INGOTS, stack); - user.addStat(StatsStorage.StatisticType.LOCAL_GOLD, stack.getAmount()); + user.adjustStatistic("LOCAL_GOLD", stack.getAmount()); ArenaUtils.addScore(user, ArenaUtils.ScoreAction.GOLD_PICKUP, stack.getAmount()); - player.sendMessage(chatManager.colorMessage("In-Game.Messages.Picked-Up-Gold", player)); - plugin.getRewardsHandler().performReward(player, Reward.RewardType.GOLD_PICKUP); - - if(Role.isRole(Role.ANY_DETECTIVE, player, arena)) { - ItemPosition.addItem(player, ItemPosition.ARROWS, new ItemStack(Material.ARROW, e.getItem().getItemStack().getAmount() * plugin.getConfig().getInt("Detective-Gold-Pick-Up-Arrows", 3))); - return; - } - - if(user.getStat(StatsStorage.StatisticType.LOCAL_GOLD) >= plugin.getConfig().getInt("Gold-For-Bow", 10)) { - user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, 0); - VersionUtils.sendTitles(player, chatManager.colorMessage("In-Game.Messages.Bow-Messages.Bow-Shot-For-Gold", player), - chatManager.colorMessage("In-Game.Messages.Bow-Messages.Bow-Shot-Subtitle", player), 5, 40, 5); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_GOLD") + .asKey() + .player(player) + .arena(arena) + .sendPlayer(); + plugin + .getRewardsHandler() + .performReward(player, plugin.getRewardsHandler().getRewardType("GOLD_PICKUP")); + + if (Role.isRole(Role.ANY_DETECTIVE, user, arena)) { + ItemPosition.addItem( + player, + ItemPosition.ARROWS, + new ItemStack( + Material.ARROW, + e.getItem().getItemStack().getAmount() + * plugin.getConfig().getInt("Bow.Amount.Arrows.Detective", 3))); + return; + } + + if (user.getStatistic("LOCAL_GOLD") >= plugin.getConfig().getInt("Gold.Amount.Bow", 10)) { + user.setStatistic("LOCAL_GOLD", 0); + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_SHOT_TITLE") + .asKey() + .player(player) + .arena(arena) + .sendPlayer(); ItemPosition.setItem(player, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); - ItemPosition.addItem(player, ItemPosition.ARROWS, new ItemStack(Material.ARROW, plugin.getConfig().getInt("Gold-Bow-Arrows", 3))); - player.getInventory().setItem(/* same for all roles */ ItemPosition.GOLD_INGOTS.getOtherRolesItemPosition(), new ItemStack(Material.GOLD_INGOT, 0)); + ItemPosition.addItem( + player, + ItemPosition.ARROWS, + new ItemStack(Material.ARROW, plugin.getConfig().getInt("Bow.Amount.Arrows.Gold", 3))); + player + .getInventory() + .setItem( + /* same for all roles */ ItemPosition.GOLD_INGOTS.getOtherRolesItemPosition(), + new ItemStack(Material.GOLD_INGOT, 0)); } } + @EventHandler public void onMurdererDamage(EntityDamageByEntityEvent e) { if(!(e.getDamager() instanceof Player) || e.getEntityType() != EntityType.PLAYER) { return; } Player attacker = (Player) e.getDamager(); + User userAttacker = plugin.getUserManager().getUser(attacker); Player victim = (Player) e.getEntity(); + User userVictim = plugin.getUserManager().getUser(victim); if(!ArenaUtils.areInSameArena(attacker, victim)) { return; } @@ -254,12 +262,12 @@ public void onMurdererDamage(EntityDamageByEntityEvent e) { e.setCancelled(true); //better check this for future even if anyone else cannot use sword - if(!Role.isRole(Role.MURDERER, attacker)) { + if(!Role.isRole(Role.MURDERER, userAttacker)) { return; } //check if victim is murderer - if(Role.isRole(Role.MURDERER, victim)) { + if(Role.isRole(Role.MURDERER, userVictim)) { return; } @@ -278,10 +286,13 @@ public void onMurdererDamage(EntityDamageByEntityEvent e) { return; } - if(Role.isRole(Role.MURDERER, victim)) { - plugin.getRewardsHandler().performReward(attacker, Reward.RewardType.MURDERER_KILL); - } else if(Role.isRole(Role.ANY_DETECTIVE, victim)) { - plugin.getRewardsHandler().performReward(attacker, Reward.RewardType.DETECTIVE_KILL); + if(Role.isRole(Role.MURDERER, userVictim)) { + plugin + .getRewardsHandler() + .performReward( + attacker, plugin.getRewardsHandler().getRewardType("MURDERER_KILL")); + } else if(Role.isRole(Role.ANY_DETECTIVE, userVictim)) { + plugin.getRewardsHandler().performReward(attacker, plugin.getRewardsHandler().getRewardType("DETECTIVE_KILL")); } XSound.ENTITY_PLAYER_DEATH.play(victim.getLocation(), 50, 1); @@ -289,21 +300,22 @@ public void onMurdererDamage(EntityDamageByEntityEvent e) { User user = plugin.getUserManager().getUser(attacker); - user.addStat(StatsStorage.StatisticType.KILLS, 1); - user.addStat(StatsStorage.StatisticType.LOCAL_KILLS, 1); + user.adjustStatistic("KILLS", 1); + user.adjustStatistic("LOCAL_KILLS", 1); ArenaUtils.addScore(user, ArenaUtils.ScoreAction.KILL_PLAYER, 0); Arena arena = ArenaRegistry.getArena(attacker); - if(Role.isRole(Role.ANY_DETECTIVE, victim) && arena.lastAliveDetective()) { + if(Role.isRole(Role.ANY_DETECTIVE, userVictim) && arena.lastAliveDetective()) { //if already true, no effect is done :) arena.setDetectiveDead(true); - if(Role.isRole(Role.FAKE_DETECTIVE, victim)) { + if(Role.isRole(Role.FAKE_DETECTIVE, userVictim)) { arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); } ArenaUtils.dropBowAndAnnounce(arena, victim); } } + @EventHandler public void onArrowDamage(EntityDamageByEntityEvent e) { if(!(e.getDamager() instanceof Arrow)) { @@ -313,6 +325,7 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { return; } Player attacker = (Player) ((Arrow) e.getDamager()).getShooter(); + User userAttacker = plugin.getUserManager().getUser(attacker); if(ArenaRegistry.isInArena(attacker)) { e.setCancelled(true); e.getDamager().remove(); @@ -321,6 +334,7 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { return; } Player victim = (Player) e.getEntity(); + User userVictim = plugin.getUserManager().getUser(victim); if(!ArenaUtils.areInSameArena(attacker, victim)) { return; } @@ -330,47 +344,50 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { return; } //dont kill murderer on bow damage if attacker is murderer - if(Role.isRole(Role.MURDERER, attacker) && Role.isRole(Role.MURDERER, victim)) { + if(Role.isRole(Role.MURDERER, userAttacker) && Role.isRole(Role.MURDERER, userVictim)) { e.setCancelled(true); return; } Arena arena = ArenaRegistry.getArena(attacker); //we need to set it before the victim die, because of hero character - if(Role.isRole(Role.MURDERER, victim)) { + if(Role.isRole(Role.MURDERER, userVictim)) { arena.setCharacter(Arena.CharacterType.HERO, attacker); } XSound.ENTITY_PLAYER_DEATH.play(victim.getLocation(), 50, 1); victim.damage(100.0); - User user = plugin.getUserManager().getUser(attacker); - user.addStat(StatsStorage.StatisticType.KILLS, 1); - if(Role.isRole(Role.MURDERER, attacker)) { - user.addStat(StatsStorage.StatisticType.LOCAL_KILLS, 1); - ArenaUtils.addScore(user, ArenaUtils.ScoreAction.KILL_PLAYER, 0); + + userAttacker.adjustStatistic("KILLS", 1); + if(Role.isRole(Role.MURDERER, userAttacker)) { + userAttacker.adjustStatistic("LOCAL_KILLS", 1); + ArenaUtils.addScore(userAttacker, ArenaUtils.ScoreAction.KILL_PLAYER, 0); } - VersionUtils.sendTitles(victim, chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Died", victim), null, 5, 40, 50); + VersionUtils.sendTitles(victim, new MessageBuilder("IN_GAME_DEATH_SCREEN").asKey().build(), null, 5, 40, 50); - if(Role.isRole(Role.MURDERER, victim)) { - ArenaUtils.addScore(user, ArenaUtils.ScoreAction.KILL_MURDERER, 0); - } else if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.ENABLE_KILL_DETECTIVE_IF_INNOCENT_KILLED) && (Role.isRole(Role.ANY_DETECTIVE, victim) || Role.isRole(Role.INNOCENT, victim))) { - if(Role.isRole(Role.MURDERER, attacker)) { - VersionUtils.sendTitles(victim, null, chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Subtitles.Murderer-Killed-You", victim), 5, 40, 5); + if(Role.isRole(Role.MURDERER, userVictim)) { + ArenaUtils.addScore(userAttacker, ArenaUtils.ScoreAction.KILL_MURDERER, 0); + } else if(plugin.getConfigPreferences().getOption("BOW_KILL_DETECTIVE") && (Role.isRole(Role.ANY_DETECTIVE, userVictim) || Role.isRole(Role.INNOCENT, userVictim))) { + if(Role.isRole(Role.MURDERER, userAttacker)) { + VersionUtils.sendTitles(victim, null, new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_YOU").asKey().build(), 5, 40, 5); } else { - VersionUtils.sendTitles(victim, null, chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Subtitles.Player-Killed-You", victim), 5, 40, 5); + VersionUtils.sendTitles(victim, null, new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_YOU").asKey().build(),5,40, 5); } //if else, murderer killed, so don't kill him :) - if(Role.isRole(Role.ANY_DETECTIVE, attacker) || Role.isRole(Role.INNOCENT, attacker)) { - VersionUtils.sendTitles(attacker, chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Died", attacker), - chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Subtitles.Killed-Innocent", attacker), 5, 40, 5); + if(Role.isRole(Role.ANY_DETECTIVE, userAttacker) || Role.isRole(Role.INNOCENT, userAttacker)) { + VersionUtils.sendSubTitle(attacker, new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_WRONGLY").asKey().build(), 5, 40, 5); + attacker.damage(100.0); - ArenaUtils.addScore(user, ArenaUtils.ScoreAction.INNOCENT_KILL, 0); - plugin.getRewardsHandler().performReward(attacker, Reward.RewardType.DETECTIVE_KILL); - if(Role.isRole(Role.ANY_DETECTIVE, attacker) && arena.lastAliveDetective()) { + ArenaUtils.addScore(userAttacker, ArenaUtils.ScoreAction.INNOCENT_KILL, 0); + plugin + .getRewardsHandler() + .performReward( + attacker, plugin.getRewardsHandler().getRewardType("DETECTIVE_KILL")); + if(Role.isRole(Role.ANY_DETECTIVE, userAttacker) && arena.lastAliveDetective()) { arena.setDetectiveDead(true); - if(Role.isRole(Role.FAKE_DETECTIVE, attacker)) { + if(Role.isRole(Role.FAKE_DETECTIVE, userAttacker)) { arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); } ArenaUtils.dropBowAndAnnounce(arena, victim); @@ -382,10 +399,11 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { @EventHandler(priority = EventPriority.HIGH) public void onPlayerDie(PlayerDeathEvent e) { Player player = e.getEntity(); - Arena arena = ArenaRegistry.getArena(player); + Arena arena = plugin.getArenaRegistry().getArena(player); if(arena == null) { return; } + User user = plugin.getUserManager().getUser(player); ComplementAccessor.getComplement().setDeathMessage(e, ""); e.getDrops().clear(); e.setDroppedExp(0); @@ -397,58 +415,55 @@ public void onPlayerDie(PlayerDeathEvent e) { player.getInventory().clear(); player.setFlying(false); player.setAllowFlight(false); - plugin.getUserManager().getUser(player).setStat(StatsStorage.StatisticType.LOCAL_GOLD, 0); + user.setStatistic("LOCAL_GOLD", 0); return; } - if(Role.isRole(Role.MURDERER, player, arena) && arena.lastAliveMurderer()) { + if(Role.isRole(Role.MURDERER, user, arena) && arena.lastAliveMurderer()) { ArenaUtils.onMurdererDeath(arena); } - if(Role.isRole(Role.ANY_DETECTIVE, player) && arena.lastAliveDetective()) { + if(Role.isRole(Role.ANY_DETECTIVE, user) && arena.lastAliveDetective()) { arena.setDetectiveDead(true); - if(Role.isRole(Role.FAKE_DETECTIVE, player)) { + if(Role.isRole(Role.FAKE_DETECTIVE, user)) { arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); } ArenaUtils.dropBowAndAnnounce(arena, player); } - User user = plugin.getUserManager().getUser(player); - user.addStat(StatsStorage.StatisticType.DEATHS, 1); + user.adjustStatistic("DEATHS", 1); user.setSpectator(true); VersionUtils.setCollidable(player, false); player.setGameMode(GameMode.SURVIVAL); - user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, 0); + user.setStatistic("LOCAL_GOLD", 0); ArenaUtils.hidePlayer(player, arena); player.setAllowFlight(true); player.setFlying(true); player.getInventory().clear(); - chatManager.broadcastAction(arena, player, ChatManager.ActionType.DEATH); + if(plugin.getConfigPreferences().getOption("HIDE_DEATH")) { + new MessageBuilder(MessageBuilder.ActionType.DEATH).player(player).arena(arena).sendArena(); + } + if(arena.getArenaState() != ArenaState.ENDING && arena.getArenaState() != ArenaState.RESTARTING) { arena.addDeathPlayer(player); } //we must call it ticks later due to instant respawn bug Bukkit.getScheduler().runTaskLater(plugin, () -> { player.spigot().respawn(); - for(SpecialItem item : plugin.getSpecialItemManager().getSpecialItems()) { - if(item.getDisplayStage() != SpecialItem.DisplayStage.SPECTATOR) { - continue; - } - player.getInventory().setItem(item.getSlot(), item.getItemStack()); - } + plugin.getSpecialItemManager().addSpecialItemsOfStage(player, SpecialItem.DisplayStage.SPECTATOR); }, 5); } @EventHandler(priority = EventPriority.HIGHEST) - public void onRespawn(PlayerRespawnEvent e) { - Player player = e.getPlayer(); - Arena arena = ArenaRegistry.getArena(player); + public void onRespawn(PlayerRespawnEvent event) { + Player player = event.getPlayer(); + Arena arena = plugin.getArenaRegistry().getArena(player); if(arena == null) { return; } if(arena.getArenaState() == ArenaState.STARTING || arena.getArenaState() == ArenaState.WAITING_FOR_PLAYERS) { - e.setRespawnLocation(arena.getLobbyLocation()); + event.setRespawnLocation(arena.getLobbyLocation()); return; } if(arena.getArenaState() == ArenaState.ENDING || arena.getArenaState() == ArenaState.RESTARTING) { - e.setRespawnLocation(arena.getEndLocation()); + event.setRespawnLocation(arena.getEndLocation()); return; } if(arena.getPlayers().contains(player)) { @@ -456,9 +471,9 @@ public void onRespawn(PlayerRespawnEvent e) { org.bukkit.Location firstSpawn = arena.getPlayerSpawnPoints().get(0); if(player.getLocation().getWorld().equals(firstSpawn.getWorld())) { - e.setRespawnLocation(player.getLocation()); + event.setRespawnLocation(player.getLocation()); } else { - e.setRespawnLocation(firstSpawn); + event.setRespawnLocation(firstSpawn); } player.setAllowFlight(true); player.setFlying(true); @@ -467,66 +482,46 @@ public void onRespawn(PlayerRespawnEvent e) { VersionUtils.setCollidable(player, false); player.setGameMode(GameMode.SURVIVAL); player.removePotionEffect(PotionEffectType.NIGHT_VISION); - user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, 0); - plugin.getRewardsHandler().performReward(player, Reward.RewardType.DEATH); + user.setStatistic("LOCAL_GOLD", 0); + plugin + .getRewardsHandler() + .performReward(player, plugin.getRewardsHandler().getRewardType("DEATH"); } } - @EventHandler - public void onItemMove(InventoryClickEvent e) { - if(e.getWhoClicked() instanceof Player && ArenaRegistry.isInArena((Player) e.getWhoClicked())) { - if(e.getView().getType() == InventoryType.CRAFTING || e.getView().getType() == InventoryType.PLAYER) { - e.setResult(Event.Result.DENY); - } - } - } @EventHandler - public void playerCommandExecution(PlayerCommandPreprocessEvent e) { - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.ENABLE_SHORT_COMMANDS)) { - if(e.getMessage().equalsIgnoreCase("/start")) { - e.getPlayer().performCommand("mma forcestart"); - e.setCancelled(true); - return; - } - - if(e.getMessage().equalsIgnoreCase("/leave")) { - e.getPlayer().performCommand("mm leave"); - e.setCancelled(true); - } - } - } - - @EventHandler - public void locatorDistanceUpdate(PlayerMoveEvent e) { - Player player = e.getPlayer(); - Arena arena = ArenaRegistry.getArena(player); + public void locatorDistanceUpdate(PlayerMoveEvent event) { + Player player = event.getPlayer(); + Arena arena = plugin.getArenaRegistry().getArena(player); if(arena == null) { return; } + User user = plugin.getUserManager().getUser(player); //skip spectators - if(plugin.getUserManager().getUser(player).isSpectator()) { + if(user.isSpectator()) { return; } if(arena.getArenaState() == ArenaState.IN_GAME) { - if(Role.isRole(Role.INNOCENT, player, arena)) { + if(Role.isRole(Role.INNOCENT, user, arena)) { if(player.getInventory().getItem(ItemPosition.BOW_LOCATOR.getOtherRolesItemPosition()) != null) { ItemStack bowLocator = new ItemStack(Material.COMPASS, 1); ItemMeta bowMeta = bowLocator.getItemMeta(); - ComplementAccessor.getComplement().setDisplayName(bowMeta, chatManager.colorMessage("In-Game.Bow-Locator-Item-Name", player) + " §7| §a" + (int) Math.round(player.getLocation().distance(player.getCompassTarget()))); + ComplementAccessor.getComplement().setDisplayName(bowMeta, new MessageBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_BOW").asKey().player(player).arena(arena).build() + " §7| §a" + (int) Math.round(player.getLocation().distance(player.getCompassTarget()))); bowLocator.setItemMeta(bowMeta); ItemPosition.setItem(player, ItemPosition.BOW_LOCATOR, bowLocator); return; } } - if(arena.isMurdererLocatorReceived() && Role.isRole(Role.MURDERER, player, arena) && arena.isMurderAlive(player)) { + if(arena.isMurdererLocatorReceived() && Role.isRole(Role.MURDERER, user, arena) && arena.isMurderAlive(player)) { ItemStack innocentLocator = new ItemStack(Material.COMPASS, 1); ItemMeta innocentMeta = innocentLocator.getItemMeta(); for(Player p : arena.getPlayersLeft()) { - Arena playerArena = ArenaRegistry.getArena(p); + Arena playerArena = plugin.getArenaRegistry().getArena(p); + User playerUser = plugin.getUserManager().getUser(p); - if(Role.isRole(Role.INNOCENT, p, playerArena) || Role.isRole(Role.ANY_DETECTIVE, p, playerArena)) { - ComplementAccessor.getComplement().setDisplayName(innocentMeta, chatManager.colorMessage("In-Game.Innocent-Locator-Item-Name", player) + " §7| §a" + (int) Math.round(player.getLocation().distance(p.getLocation()))); + if(Role.isRole(Role.INNOCENT, playerUser, playerArena) || Role.isRole(Role.ANY_DETECTIVE, playerUser, playerArena)) { + ComplementAccessor.getComplement().setDisplayName(innocentMeta, new MessageBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_INNOCENT").asKey().player(player).arena(arena).build() + " §7| §a" + (int) Math.round(player.getLocation().distance(p.getLocation()))); innocentLocator.setItemMeta(innocentMeta); ItemPosition.setItem(player, ItemPosition.INNOCENTS_LOCATOR, innocentLocator); } @@ -535,4 +530,13 @@ public void locatorDistanceUpdate(PlayerMoveEvent e) { } } + + @EventHandler + public void onItemMove(InventoryClickEvent e) { + if(e.getWhoClicked() instanceof Player && ArenaRegistry.isInArena((Player) e.getWhoClicked())) { + if(e.getView().getType() == InventoryType.CRAFTING || e.getView().getType() == InventoryType.PLAYER) { + e.setResult(Event.Result.DENY); + } + } + } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java index 78360ad8..08a88a57 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java @@ -1,6 +1,6 @@ /* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * Village Defense - Protect villagers from hordes of zombies + * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,39 +18,20 @@ package plugily.projects.murdermystery.arena; -import me.clip.placeholderapi.PlaceholderAPI; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scheduler.BukkitRunnable; - -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.minecraft.misc.MiscUtils; -import plugily.projects.commonsbox.minecraft.serialization.InventorySerializer; -import plugily.projects.murdermystery.ConfigPreferences; +import org.jetbrains.annotations.NotNull; +import plugily.projects.minigamesbox.classic.arena.ArenaState; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.PluginArenaManager; +import plugily.projects.minigamesbox.classic.handlers.language.TitleBuilder; +import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.api.events.game.MMGameJoinAttemptEvent; -import plugily.projects.murdermystery.api.events.game.MMGameLeaveAttemptEvent; -import plugily.projects.murdermystery.api.events.game.MMGameStopEvent; +import plugily.projects.murdermystery.arena.managers.MapRestorerManager; import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.arena.special.SpecialBlock; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.PermissionsManager; -import plugily.projects.murdermystery.handlers.items.SpecialItem; -import plugily.projects.murdermystery.handlers.language.LanguageManager; -import plugily.projects.murdermystery.handlers.party.GameParty; -import plugily.projects.murdermystery.handlers.rewards.Reward; -import plugily.projects.murdermystery.user.User; -import plugily.projects.murdermystery.utils.Debugger; import plugily.projects.murdermystery.utils.ItemPosition; +import plugily.projects.thebridge.Main; +import plugily.projects.thebridge.arena.base.Base; import java.util.ArrayList; import java.util.List; @@ -58,492 +39,232 @@ /** * @author Plajer - *

- * Created at 13.05.2018 + *

Created at 13.05.2018 */ -public class ArenaManager { +public class ArenaManager extends PluginArenaManager { - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - private static final ChatManager chatManager = plugin.getChatManager(); + private final Main plugin; - private ArenaManager() { + public ArenaManager(Main plugin) { + super(plugin); + this.plugin = plugin; } - /** - * Attempts player to join arena. - * Calls MMGameJoinAttemptEvent. - * Can be cancelled only via above-mentioned event - * - * @param player player to join - * @see MMGameJoinAttemptEvent - */ - public static void joinAttempt(Player player, Arena arena) { - Debugger.debug("[{0}] Initial join attempt for {1}", arena.getId(), player.getName()); - long start = System.currentTimeMillis(); - MMGameJoinAttemptEvent gameJoinAttemptEvent = new MMGameJoinAttemptEvent(player, arena); - Bukkit.getPluginManager().callEvent(gameJoinAttemptEvent); - - if(!arena.isReady()) { - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Arena-Not-Configured")); - return; - } - if(gameJoinAttemptEvent.isCancelled()) { - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Join-Cancelled-Via-API")); + @Override + public void joinAttempt(@NotNull Player player, @NotNull PluginArena arena) { + Arena pluginArena = (Arena) plugin.getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { return; } - if(ArenaRegistry.isInArena(player)) { - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Already-Playing")); - return; - } - - //check if player is in party and send party members to the game - GameParty party = plugin.getPartyHandler().getParty(player); - - if(party != null) { - Debugger.debug("{0} is in a party", player.getName()); - - if(party.getLeader().equals(player)) { - Debugger.debug("{0} is partyleader", player.getName()); - - if(arena.getMaximumPlayers() - arena.getPlayers().size() >= party.getPlayers().size()) { - for(Player partyPlayer : party.getPlayers()) { - if(player.equals(partyPlayer)) { - continue; - } - Arena partyArena = ArenaRegistry.getArena(partyPlayer); - if(partyArena != null) { - if(partyArena.getArenaState() == ArenaState.IN_GAME) { - continue; - } - Debugger.debug("[Partyleader: {0}] Found party member {1} on other arena", player.getName(), partyPlayer.getName()); - leaveAttempt(partyPlayer, partyArena); - } - partyPlayer.sendMessage(chatManager.getPrefix() + chatManager.formatMessage(arena, chatManager.colorMessage("In-Game.Join-As-Party-Member"), partyPlayer)); - Debugger.debug("Let party member {0} join the arena of {1}", partyPlayer.getName(), player.getName()); - joinAttempt(partyPlayer, arena); - } - } else { - Debugger.debug("[Partyleader: {0}] The arena got not enough space for the party", player.getName()); - player.sendMessage(chatManager.getPrefix() + chatManager.formatMessage(arena, chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Not-Enough-Space-For-Party"), player)); - return; - } - } - } - - if(!(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED) - || player.hasPermission(PermissionsManager.getJoinPerm().replace("", "*")) - || player.hasPermission(PermissionsManager.getJoinPerm().replace("", arena.getId())))) { - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Join-No-Permission").replace("%permission%", - PermissionsManager.getJoinPerm().replace("", arena.getId()))); - return; - } - if(arena.getArenaState() == ArenaState.RESTARTING) { - return; - } - if(arena.getArenaState() == ArenaState.STARTING && arena.getPlayers().size() >= arena.getMaximumPlayers()) { - if(!player.hasPermission(PermissionsManager.getJoinFullGames())) { - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Full-Game-No-Permission")); - return; - } - boolean foundSlot = false; - for(Player loopPlayer : arena.getPlayers()) { - if(loopPlayer.hasPermission(PermissionsManager.getJoinFullGames())) { - continue; - } - leaveAttempt(loopPlayer, arena); - loopPlayer.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Messages.Lobby-Messages.You-Were-Kicked-For-Premium-Slot")); - chatManager.broadcast(arena, chatManager.formatMessage(arena, chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Kicked-For-Premium-Slot"), loopPlayer)); - foundSlot = true; - break; - } - if(!foundSlot) { - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.No-Slots-For-Premium")); - return; - } - } - - Debugger.debug("[{0}] Checked join attempt for {1} initialized", arena.getId(), player.getName()); - + super.joinAttempt(player, arena); + int murderIncrease = + player.getEffectivePermissions().stream() + .filter( + permAttach -> permAttach.getPermission().startsWith("murdermystery.role.murderer.")) + .mapToInt( + pai -> + Integer.parseInt( + pai.getPermission() + .substring(28 /* remove the permission node to obtain the number*/))) + .max() + .orElse(0); + int detectiveIncrease = + player.getEffectivePermissions().stream() + .filter( + permAttach -> + permAttach.getPermission().startsWith("murdermystery.role.detective.")) + .mapToInt( + pai -> + Integer.parseInt( + pai.getPermission() + .substring(29 /* remove the permission node to obtain the number*/))) + .max() + .orElse(0); User user = plugin.getUserManager().getUser(player); - user.lastBoard = player.getScoreboard(); - - //reset scoreboard - player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); - - arena.getScoreboardManager().createScoreboard(user); - - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.INVENTORY_MANAGER_ENABLED)) { - InventorySerializer.saveInventoryToFile(plugin, player); - } - - int murderIncrease = player.getEffectivePermissions().stream().filter(permAttach -> permAttach.getPermission().startsWith("murdermystery.role.murderer.")) - .mapToInt(pai -> Integer.parseInt(pai.getPermission().substring(28 /* remove the permission node to obtain the number*/))).max().orElse(0); - int detectiveIncrease = player.getEffectivePermissions().stream().filter(permAttach -> permAttach.getPermission().startsWith("murdermystery.role.detective.")) - .mapToInt(pai -> Integer.parseInt(pai.getPermission().substring(29 /* remove the permission node to obtain the number*/))).max().orElse(0); - user.addStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, murderIncrease); - user.addStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, detectiveIncrease); - - arena.addPlayer(player); - player.setLevel(0); - player.setExp(1); - player.setHealth(VersionUtils.getMaxHealth(player)); - player.setFoodLevel(20); - if((arena.getArenaState() == ArenaState.IN_GAME || arena.getArenaState() == ArenaState.ENDING)) { - arena.teleportToStartLocation(player); - player.sendMessage(chatManager.colorMessage("In-Game.You-Are-Spectator")); - player.getInventory().clear(); - - for(SpecialItem item : plugin.getSpecialItemManager().getSpecialItems()) { - if(item.getDisplayStage() != SpecialItem.DisplayStage.SPECTATOR) { - continue; - } - player.getInventory().setItem(item.getSlot(), item.getItemStack()); - } - - player.getActivePotionEffects().forEach(potionEffect -> player.removePotionEffect(potionEffect.getType())); - player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 0)); - ArenaUtils.hidePlayer(player, arena); - - user.setSpectator(true); - - arena.addSpectatorPlayer(player); - VersionUtils.setCollidable(player, false); - player.setGameMode(GameMode.SURVIVAL); - player.setAllowFlight(true); - player.setFlying(true); + user.adjustStatistic("CONTRIBUTION_MURDERER", murderIncrease); + user.adjustStatistic("CONTRIBUTION_DETECTIVE", detectiveIncrease); + ArenaUtils.updateNameTagsVisibility(player); + } - for(Player spectator : arena.getPlayers()) { - if(!plugin.getUserManager().getUser(spectator).isSpectator()) { - VersionUtils.hidePlayer(plugin, /*not spectator*/ spectator, /*joined spectator*/ player); - } - VersionUtils.showPlayer(plugin, player, spectator); - } - ArenaUtils.hidePlayersOutsideTheGame(player, arena); - Debugger.debug("[{0}] Join attempt as spectator finished for {1} took {2}ms", arena.getId(), player.getName(), System.currentTimeMillis() - start); + @Override + public void leaveAttempt(@NotNull Player player, @NotNull PluginArena arena) { + Arena pluginArena = (Arena) plugin.getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { return; } - arena.teleportToLobby(player); - player.getInventory().setArmorContents(new ItemStack[]{new ItemStack(Material.AIR), new ItemStack(Material.AIR), new ItemStack(Material.AIR), new ItemStack(Material.AIR)}); - player.setFlying(false); - player.setAllowFlight(false); - player.getInventory().clear(); - arena.doBarAction(Arena.BarAction.ADD, player); - if(!user.isSpectator()) { - chatManager.broadcastAction(arena, player, ChatManager.ActionType.JOIN); + super.leaveAttempt(player, arena); + if (pluginArena.isDeathPlayer(player)) { + pluginArena.removeDeathPlayer(player); } - if(arena.getArenaState() == ArenaState.STARTING || arena.getArenaState() == ArenaState.WAITING_FOR_PLAYERS) { - for(SpecialItem item : plugin.getSpecialItemManager().getSpecialItems()) { - if(item.getDisplayStage() != SpecialItem.DisplayStage.LOBBY) { - continue; - } - player.getInventory().setItem(item.getSlot(), item.getItemStack()); - } - } - player.updateInventory(); - for(Player arenaPlayer : arena.getPlayers()) { - ArenaUtils.showPlayer(arenaPlayer, arena); - } - arena.showPlayers(); - ArenaUtils.updateNameTagsVisibility(player); - plugin.getSignManager().updateSigns(); - Debugger.debug("[{0}] Join attempt as player for {1} took {2}ms", arena.getId(), player.getName(), System.currentTimeMillis() - start); - } - - /** - * Attempts player to leave arena. - * Calls MMGameLeaveAttemptEvent event. - * - * @param player player to join - * @see MMGameLeaveAttemptEvent - */ - public static void leaveAttempt(Player player, Arena arena) { - Debugger.debug("[{0}] Initial leave attempt for {1}", arena.getId(), player.getName()); - long start = System.currentTimeMillis(); - - Bukkit.getPluginManager().callEvent(new MMGameLeaveAttemptEvent(player, arena)); User user = plugin.getUserManager().getUser(player); - int localScore = user.getStat(StatsStorage.StatisticType.LOCAL_SCORE); - if(localScore > user.getStat(StatsStorage.StatisticType.HIGHEST_SCORE)) { - user.setStat(StatsStorage.StatisticType.HIGHEST_SCORE, localScore); + int localScore = user.getStatistic("LOCAL_SCORE"); + if (localScore > user.getStatistic("HIGHEST_SCORE")) { + user.setStatistic("HIGHEST_SCORE", localScore); } - //todo change later - int murderDecrease = player.getEffectivePermissions().stream().filter(permAttach -> permAttach.getPermission().startsWith("murdermystery.role.murderer.")) - .mapToInt(pai -> Integer.parseInt(pai.getPermission().substring(28 /* remove the permission node to obtain the number*/))).max().orElse(0); - int detectiveDecrease = player.getEffectivePermissions().stream().filter(permAttach -> permAttach.getPermission().startsWith("murdermystery.role.detective.")) - .mapToInt(pai -> Integer.parseInt(pai.getPermission().substring(29 /* remove the permission node to obtain the number*/))).max().orElse(0); - user.addStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, -murderDecrease); - if(user.getStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER) <= 0) { - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, 1); + // todo change later + int murderDecrease = + player.getEffectivePermissions().stream() + .filter( + permAttach -> permAttach.getPermission().startsWith("murdermystery.role.murderer.")) + .mapToInt( + pai -> + Integer.parseInt( + pai.getPermission() + .substring(28 /* remove the permission node to obtain the number*/))) + .max() + .orElse(0); + int detectiveDecrease = + player.getEffectivePermissions().stream() + .filter( + permAttach -> + permAttach.getPermission().startsWith("murdermystery.role.detective.")) + .mapToInt( + pai -> + Integer.parseInt( + pai.getPermission() + .substring(29 /* remove the permission node to obtain the number*/))) + .max() + .orElse(0); + user.adjustStatistic("CONTRIBUTION_MURDERER", -murderDecrease); + if (user.getStatistic("CONTRIBUTION_MURDERER") <= 0) { + user.setStatistic("CONTRIBUTION_MURDERER", 1); } - user.addStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, -detectiveDecrease); - if(user.getStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE) <= 0) { - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, 1); + user.adjustStatistic("CONTRIBUTION_DETECTIVE", -detectiveDecrease); + if (user.getStatistic("CONTRIBUTION_DETECTIVE") <= 0) { + user.setStatistic("CONTRIBUTION_DETECTIVE", 1); } - if(arena.getArenaState() == ArenaState.IN_GAME) { - if(Role.isRole(Role.FAKE_DETECTIVE, player, arena) || Role.isRole(Role.INNOCENT, player, arena)) { - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, ThreadLocalRandom.current().nextInt(4) + 1); - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, ThreadLocalRandom.current().nextInt(4) + 1); + if (arena.getArenaState() == ArenaState.IN_GAME) { + if (Role.isRole(Role.FAKE_DETECTIVE, user, arena) + || Role.isRole(Role.INNOCENT, user, arena)) { + user.setStatistic("CONTRIBUTION_MURDERER", ThreadLocalRandom.current().nextInt(4) + 1); + user.setStatistic("CONTRIBUTION_DETECTIVE", ThreadLocalRandom.current().nextInt(4) + 1); } } - user.removeScoreboard(arena); - - boolean playerHasMurdererRole = Role.isRole(Role.MURDERER, player, arena); - if(playerHasMurdererRole) { - arena.removeFromMurdererList(player); + boolean playerHasMurdererRole = Role.isRole(Role.MURDERER, user, arena); + if (playerHasMurdererRole) { + pluginArena.removeFromMurdererList(player); } - if(arena.getArenaState() == ArenaState.IN_GAME && !user.isSpectator()) { + + if (arena.getArenaState() == ArenaState.IN_GAME && !user.isSpectator()) { List playersLeft = arena.getPlayersLeft(); - //-1 cause we didn't remove player yet - if(playersLeft.size() - 1 > 1) { - if(playerHasMurdererRole) { - if(arena.getMurdererList().isEmpty()) { + // -1 cause we didn't remove player yet + if (playersLeft.size() - 1 > 1) { + if (playerHasMurdererRole) { + if (pluginArena.getMurdererList().isEmpty()) { List players = new ArrayList<>(); - for(Player gamePlayer : playersLeft) { - if(gamePlayer == player || Role.isRole(Role.ANY_DETECTIVE, gamePlayer, arena) || Role.isRole(Role.MURDERER, gamePlayer, arena)) { + for (Player gamePlayer : playersLeft) { + User userGamePlayer = plugin.getUserManager().getUser(gamePlayer); + if (gamePlayer == player + || Role.isRole(Role.ANY_DETECTIVE, userGamePlayer, arena) + || Role.isRole(Role.MURDERER, userGamePlayer, arena)) { continue; } players.add(gamePlayer); } - Player newMurderer = players.get(players.size() == 1 ? 0 : ThreadLocalRandom.current().nextInt(players.size())); + Player newMurderer = + players.get( + players.size() == 1 ? 0 : ThreadLocalRandom.current().nextInt(players.size())); if (newMurderer != null) { - Debugger.debug("A murderer left the game. New murderer: {0}", newMurderer.getName()); - arena.setCharacter(Arena.CharacterType.MURDERER, newMurderer); - arena.addToMurdererList(newMurderer); + plugin + .getDebugger() + .debug("A murderer left the game. New murderer: {0}", newMurderer.getName()); + pluginArena.setCharacter(Arena.CharacterType.MURDERER, newMurderer); + pluginArena.addToMurdererList(newMurderer); } - String title = chatManager.colorMessage("In-Game.Messages.Previous-Role-Left-Title", player).replace("%role%", - chatManager.colorMessage("Scoreboard.Roles.Murderer", player)); - String subtitle = chatManager.colorMessage("In-Game.Messages.Previous-Role-Left-Subtitle", player).replace("%role%", - chatManager.colorMessage("Scoreboard.Roles.Murderer", player)); - - for(Player gamePlayer : arena.getPlayers()) { - VersionUtils.sendTitles(gamePlayer, title, subtitle, 5, 40, 5); - } + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_CHANGE") + .asKey() + .player(player) + .arena(pluginArena) + .sendArena(); if (newMurderer != null) { - VersionUtils.sendTitles(newMurderer, chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Title", player), - chatManager.colorMessage("In-Game.Messages.Role-Set.Murderer-Subtitle", player), 5, 40, 5); - ItemPosition.setItem(newMurderer, ItemPosition.MURDERER_SWORD, plugin.getConfigPreferences().getMurdererSword()); + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_MURDERER") + .asKey() + .player(player) + .arena(pluginArena) + .sendArena(); + ItemPosition.setItem( + newMurderer, + ItemPosition.MURDERER_SWORD, + plugin.getConfigPreferences().getMurdererSword()); } - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, 1); + user.setStatistic("CONTRIBUTION_MURDERER", 1); } else { - Debugger.debug("No new murderer added as there are some"); + plugin.getDebugger().debug("No new murderer added as there are some"); } - } else if(Role.isRole(Role.ANY_DETECTIVE, player, arena) && arena.lastAliveDetective()) { - arena.setDetectiveDead(true); - if(Role.isRole(Role.FAKE_DETECTIVE, player, arena)) { - arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); + } else if (Role.isRole(Role.ANY_DETECTIVE, user, arena) + && pluginArena.lastAliveDetective()) { + pluginArena.setDetectiveDead(true); + if (Role.isRole(Role.FAKE_DETECTIVE, user, arena)) { + pluginArena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); } else { - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, 1); + user.setStatistic("CONTRIBUTION_DETECTIVE", 1); } - ArenaUtils.dropBowAndAnnounce(arena, player); + ArenaUtils.dropBowAndAnnounce(pluginArena, player); } plugin.getCorpseHandler().spawnCorpse(player, arena); } else { stopGame(false, arena); } } - //the default fly speed - player.setFlySpeed(0.1f); - player.getInventory().clear(); - player.getInventory().setArmorContents(null); - arena.removePlayer(player); - - if(!user.isSpectator() && !arena.isSpectatorPlayer(player)) { - chatManager.broadcastAction(arena, player, ChatManager.ActionType.LEAVE); - } - - VersionUtils.setGlowing(player, false); - user.setSpectator(false); - - arena.removeDeathPlayer(player); - arena.removeSpectatorPlayer(player); - - VersionUtils.setCollidable(player, true); - user.removeScoreboard(arena); - arena.doBarAction(Arena.BarAction.REMOVE, player); - player.setHealth(VersionUtils.getMaxHealth(player)); - player.setFoodLevel(20); - player.setLevel(0); - player.setExp(0); - player.setFlying(false); - player.setAllowFlight(false); - player.getActivePotionEffects().forEach(effect -> player.removePotionEffect(effect.getType())); - player.setWalkSpeed(0.2f); - player.setFireTicks(0); - if(arena.getArenaState() != ArenaState.WAITING_FOR_PLAYERS && arena.getArenaState() != ArenaState.STARTING && arena.getPlayers().isEmpty()) { - arena.setArenaState(ArenaState.ENDING); - arena.setTimer(0); - } - - player.setGameMode(GameMode.SURVIVAL); - for(Player players : plugin.getServer().getOnlinePlayers()) { - if(!ArenaRegistry.isInArena(players)) { - VersionUtils.showPlayer(plugin, players, player); - } - VersionUtils.showPlayer(plugin, player, players); - } - arena.teleportToEndLocation(player); - if(!plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED) - && plugin.getConfigPreferences().getOption(ConfigPreferences.Option.INVENTORY_MANAGER_ENABLED)) { - InventorySerializer.loadInventory(plugin, player); - } - plugin.getUserManager().saveAllStatistic(user); - plugin.getSignManager().updateSigns(); - Debugger.debug("[{0}] Game leave finished for {1} took{2}ms ", arena.getId(), player.getName(), System.currentTimeMillis() - start); } - /** - * Stops current arena. Calls MMGameStopEvent event - * - * @param quickStop should arena be stopped immediately? (use only in important cases) - * @see MMGameStopEvent - */ - public static void stopGame(boolean quickStop, Arena arena) { - Debugger.debug("[{0}] Stop game event initialized with quickStop {1}", arena.getId(), quickStop); - long start = System.currentTimeMillis(); - - Bukkit.getPluginManager().callEvent(new MMGameStopEvent(arena)); - arena.setArenaState(ArenaState.ENDING); - if(quickStop) { - arena.setTimer(2); - chatManager.broadcast(arena, chatManager.colorRawMessage("&cThe game has been force stopped by command")); - } else { - arena.setTimer(10); + @Override + public void stopGame(boolean quickStop, @NotNull PluginArena arena) { + Arena pluginArena = (Arena) plugin.getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return; } - - for(SpecialBlock specialBlock : arena.getSpecialBlocks()) { - if(specialBlock.getArmorStandHologram() != null) { + for (SpecialBlock specialBlock : pluginArena.getSpecialBlocks()) { + if (specialBlock.getArmorStandHologram() != null) { specialBlock.getArmorStandHologram().delete(); } } - - arena.removeBowHolo(); - - List summaryMessages = LanguageManager.getLanguageList("In-Game.Messages.Game-End-Messages.Summary-Message"); - arena.getScoreboardManager().stopAllScoreboards(); - - boolean murderWon = arena.getPlayersLeft().size() == arena.aliveMurderer(); - - for(final Player player : arena.getPlayers()) { - User user = plugin.getUserManager().getUser(player); - - if(!quickStop && Role.isAnyRole(player, arena)) { - boolean hasDeathRole = Role.isRole(Role.DEATH, player, arena); - - if(!hasDeathRole && !Role.isRole(Role.SPECTATOR, player, arena)) { - if(Role.isRole(Role.FAKE_DETECTIVE, player, arena) || Role.isRole(Role.INNOCENT, player, arena)) { - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, ThreadLocalRandom.current().nextInt(4) + 1); - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, ThreadLocalRandom.current().nextInt(4) + 1); - } - - boolean hasMurdererRole = Role.isRole(Role.MURDERER, player, arena); - - if((murderWon && hasMurdererRole) || !hasMurdererRole) { - user.addStat(StatsStorage.StatisticType.WINS, 1); - plugin.getRewardsHandler().performReward(player, Reward.RewardType.WIN); - } else { - user.addStat(StatsStorage.StatisticType.LOSES, 1); - plugin.getRewardsHandler().performReward(player, Reward.RewardType.LOSE); - } - } else if(hasDeathRole) { - user.addStat(StatsStorage.StatisticType.LOSES, 1); - plugin.getRewardsHandler().performReward(player, Reward.RewardType.LOSE); - } - } - //the default walk & fly speed - player.setFlySpeed(0.1f); - player.setWalkSpeed(0.2f); - - player.getInventory().clear(); - for(SpecialItem item : plugin.getSpecialItemManager().getSpecialItems()) { - if(item.getDisplayStage() != SpecialItem.DisplayStage.SPECTATOR) { - continue; - } - player.getInventory().setItem(item.getSlot(), item.getItemStack()); - } - if(!quickStop) { - for(String msg : summaryMessages) { - MiscUtils.sendCenteredMessage(player, formatSummaryPlaceholders(msg, arena, player)); - } - } - user.removeScoreboard(arena); - if(!quickStop && !user.isSpectator() && !user.isPermanentSpectator() && plugin.getConfig().getBoolean("Firework-When-Game-Ends", true)) { - new BukkitRunnable() { - int i = 0; - - @Override - public void run() { - if(i >= 4 || !arena.getPlayers().contains(player)) { - cancel(); + ((MapRestorerManager) pluginArena.getMapRestorerManager()).removeBowHolo(); + boolean murderWon = arena.getPlayersLeft().size() == pluginArena.aliveMurderer(); + for (Player player : arena.getPlayers()) { + if (!quickStop) { + User user = plugin.getUserManager().getUser(player); + if (!quickStop && Role.isAnyRole(user, arena)) { + boolean hasDeathRole = Role.isRole(Role.DEATH, user, arena); + + if (!hasDeathRole && !Role.isRole(Role.SPECTATOR, user, arena)) { + if (Role.isRole(Role.FAKE_DETECTIVE, user, arena) + || Role.isRole(Role.INNOCENT, user, arena)) { + user.setStatistic( + "CONTRIBUTION_MURDERER", ThreadLocalRandom.current().nextInt(4) + 1); + user.setStatistic( + "CONTRIBUTION_DETECTIVE", ThreadLocalRandom.current().nextInt(4) + 1); + } + boolean hasMurdererRole = Role.isRole(Role.MURDERER, user, arena); + if (murderWon || !hasMurdererRole) { + user.adjustStatistic("WINS", 1); + plugin + .getRewardsHandler() + .performReward(player, plugin.getRewardsHandler().getRewardType("WIN")); + } else { + user.adjustStatistic("LOSES", 1); + plugin + .getRewardsHandler() + .performReward(player, plugin.getRewardsHandler().getRewardType("LOSE")); } - MiscUtils.spawnRandomFirework(player.getLocation()); - i++; + } else if (hasDeathRole) { + user.adjustStatistic("LOSES", 1); + plugin + .getRewardsHandler() + .performReward(player, plugin.getRewardsHandler().getRewardType("LOSE")); } - }.runTaskTimer(plugin, 30, 30); - } - } - Debugger.debug("[{0}] Stop game event finished took{1}ms ", arena.getId(), System.currentTimeMillis() - start); - } - - private static String formatSummaryPlaceholders(String msg, Arena arena, Player player) { - String formatted = msg; - - StringBuilder murders = new StringBuilder(), detectives = new StringBuilder(); - int murdererKills = 0; - for(Player p : arena.getMurdererList()) { - User user = plugin.getUserManager().getUser(p); - int localKills = user.getStat(StatsStorage.StatisticType.LOCAL_KILLS); - - murders.append(p.getName()); - - if(arena.getMurdererList().size() > 1) { - murders.append(" (").append(localKills).append("), "); + } } - - murdererKills += localKills; - } - if(arena.getMurdererList().size() > 1) { - murders.deleteCharAt(murders.length() - 2); + super.stopGame(quickStop, arena); } - for(Player p : arena.getDetectiveList()) { - detectives.append(p.getName()).append(", "); - } - - int index = detectives.length() - 2; - if (index > 0 && index < detectives.length()) { - detectives.deleteCharAt(index); - } - - int aliveMurderer = arena.aliveMurderer(); - - if(arena.getPlayersLeft().size() == aliveMurderer) { - formatted = StringUtils.replace(formatted, "%winner%", chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Winners.Murderer")); - } else { - formatted = StringUtils.replace(formatted, "%winner%", chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Winners.Players")); - } - - formatted = StringUtils.replace(formatted, "%detective%", (arena.isDetectiveDead() ? ChatColor.STRIKETHROUGH : "") + detectives.toString()); - - formatted = StringUtils.replace(formatted, "%murderer%", (aliveMurderer == 1 ? "" : ChatColor.STRIKETHROUGH) + murders.toString()); - - formatted = StringUtils.replace(formatted, "%murderer_kills%", Integer.toString(murdererKills)); - - Player hero = arena.getCharacter(Arena.CharacterType.HERO); - formatted = StringUtils.replace(formatted, "%hero%", hero != null ? hero.getName() : chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Winners.Nobody")); - - if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { - formatted = PlaceholderAPI.setPlaceholders(player, formatted); - } - - return formatted; } - } diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java index 81943814..63dce88b 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java @@ -1,6 +1,6 @@ /* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * Village Defense - Protect villagers from hordes of zombies + * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,194 +19,114 @@ package plugily.projects.murdermystery.arena; import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; - -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.PluginArenaRegistry; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.utils.dimensional.Cuboid; +import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; +import plugily.projects.minigamesbox.classic.utils.serialization.LocationSerializer; import plugily.projects.murdermystery.Main; import plugily.projects.murdermystery.arena.special.SpecialBlock; -import plugily.projects.murdermystery.utils.Debugger; +import plugily.projects.thebridge.Main; +import plugily.projects.thebridge.arena.base.Base; import java.util.ArrayList; import java.util.List; -import java.util.Random; /** * Created by Tom on 27/07/2014. */ -public class ArenaRegistry { - - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - private static final List arenas = new ArrayList<>(); - private static int bungeeArena = -999; - - /** - * Checks if player is in any arena - * - * @param player player to check - * @return [b]true[/b] when player is in arena, [b]false[/b] if otherwise - */ - public static boolean isInArena(Player player) { - return getArena(player) != null; - } - - /** - * Returns arena where the player is - * - * @param p target player - * @return Arena or null if not playing - * @see #isInArena(Player) to check if player is playing - */ - public static Arena getArena(Player p) { - if(p == null) { - return null; - } +public class ArenaRegistry extends PluginArenaRegistry { - java.util.UUID playerId = p.getUniqueId(); + private final Main plugin; - for(Arena arena : arenas) { - for(Player player : arena.getPlayers()) { - if(player.getUniqueId().equals(playerId)) { - return arena; - } - } - } - return null; + public ArenaRegistry(Main plugin) { + super(plugin); + this.plugin = plugin; } - /** - * Returns arena based by ID - * - * @param id name of arena - * @return Arena or null if not found - */ - public static Arena getArena(String id) { - for(Arena loopArena : arenas) { - if(loopArena.getId().equalsIgnoreCase(id)) { - return loopArena; - } - } - return null; - } - public static int getArenaPlayersOnline() { - int players = 0; - for(Arena arena : arenas) { - players += arena.getPlayers().size(); - } - return players; - } - - public static void registerArena(Arena arena) { - Debugger.debug("Registering new game instance {0}", arena.getId()); - arenas.add(arena); - } - - public static void unregisterArena(Arena arena) { - Debugger.debug("Unegistering game instance {0}", arena.getId()); - arenas.remove(arena); + @Override + public PluginArena getNewArena(String id) { + return new Arena(id); } - public static void registerArenas() { - Debugger.debug("Initial arenas registration"); - long start = System.currentTimeMillis(); + @Override + public boolean additionalValidatorChecks(ConfigurationSection section, PluginArena arena, String id) { + boolean checks = super.additionalValidatorChecks(section, arena, id); + if(!checks) return false; - if(!arenas.isEmpty()) { - for(Arena arena : new ArrayList<>(arenas)) { - arena.cleanUpArena(); - unregisterArena(arena); - } - } - - org.bukkit.configuration.file.FileConfiguration config = ConfigUtils.getConfig(plugin, "arenas"); - org.bukkit.configuration.ConfigurationSection section = config.getConfigurationSection("instances"); - if(section == null) { - Debugger.sendConsoleMsg(plugin.getChatManager().colorMessage("Validator.No-Instances-Created")); - return; + if(!section.getBoolean(id + ".isdone")) { + plugin.getDebugger().sendConsoleMsg(new MessageBuilder("VALIDATOR_INVALID_ARENA_CONFIGURATION").asKey().value("NOT VALIDATED").arena(arena).build()); + return false; } - for(String id : section.getKeys(false)) { - if(id.equalsIgnoreCase("default")) { - continue; - } - - Arena arena = new Arena(id); + List playerSpawnPoints = new ArrayList<>(); + for(String loc : section.getStringList(id + ".playerspawnpoints")) { + org.bukkit.Location serialized = LocationSerializer.getLocation(loc); - List playerSpawnPoints = new ArrayList<>(); - for(String loc : section.getStringList(id + ".playerspawnpoints")) { - org.bukkit.Location serialized = LocationSerializer.getLocation(loc); - - // Ignore the arena if world is not exist at least in spawn points - if(serialized == null || serialized.getWorld() == null) { - section.set(id + ".isdone", false); - } else { - playerSpawnPoints.add(serialized); - } - } - - arena.setPlayerSpawnPoints(playerSpawnPoints); - arena.setMinimumPlayers(section.getInt(id + ".minimumplayers", 2)); - arena.setMaximumPlayers(section.getInt(id + ".maximumplayers", 4)); - arena.setMapName(section.getString(id + ".mapname", "none")); - arena.setSpawnGoldTime(section.getInt(id + ".spawngoldtime", 5)); - arena.setHideChances(section.getBoolean(id + ".hidechances")); - arena.setMurderers(section.getInt(id + ".playerpermurderer", 5)); - arena.setDetectives(section.getInt(id + ".playerperdetective", 7)); - arena.setGoldVisuals(section.getBoolean(id + ".goldvisuals")); - - Location endLoc = LocationSerializer.getLocation(section.getString(id + ".Endlocation", "world,364.0,63.0,-72.0,0.0,0.0")); - Location lobbyLoc = LocationSerializer.getLocation(section.getString(id + ".lobbylocation", "world,364.0,63.0,-72.0,0.0,0.0")); - if(lobbyLoc == null || lobbyLoc.getWorld() == null || endLoc == null || endLoc.getWorld() == null) { + // Ignore the arena if world is not exist at least in spawn points + if(serialized == null || serialized.getWorld() == null) { section.set(id + ".isdone", false); } else { - arena.setLobbyLocation(lobbyLoc); - arena.setEndLocation(endLoc); - } - - if(!section.getBoolean(id + ".isdone")) { - Debugger.sendConsoleMsg(plugin.getChatManager().colorMessage("Validator.Invalid-Arena-Configuration").replace("%arena%", id).replace("%error%", "NOT VALIDATED")); - arena.setReady(false); - registerArena(arena); - continue; + playerSpawnPoints.add(serialized); } + } - List goldSpawnPoints = new ArrayList<>(); - for(String loc : section.getStringList(id + ".goldspawnpoints")) { - goldSpawnPoints.add(LocationSerializer.getLocation(loc)); - } - arena.setGoldSpawnPoints(goldSpawnPoints); - - List specialBlocks = new ArrayList<>(); - for(String loc : section.getStringList(id + ".mystery-cauldrons")) { - specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.MYSTERY_CAULDRON)); - } - for(String loc : section.getStringList(id + ".confessionals")) { - specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.PRAISE_DEVELOPER)); - } + ((Arena) arena).setSpawnGoldTime(section.getInt(id + ".spawngoldtime", 5)); + ((Arena) arena).setHideChances(section.getBoolean(id + ".hidechances")); + arena.setArenaOption("MURDERER_DIVIDER",section.getInt(id + ".playerpermurderer", 5)); + arena.setArenaOption("DETECTIVE_DIVIDER",section.getInt(id + ".playerperdetective", 7)); + ((Arena) arena).setGoldVisuals(section.getBoolean(id + ".goldvisuals")); + ((Arena) arena).setPlayerSpawnPoints(playerSpawnPoints); - specialBlocks.forEach(arena::loadSpecialBlock); + List goldSpawnPoints = new ArrayList<>(); + for(String loc : section.getStringList(id + ".goldspawnpoints")) { + goldSpawnPoints.add(LocationSerializer.getLocation(loc)); + } + ((Arena) arena).setGoldSpawnPoints(goldSpawnPoints); - registerArena(arena); - arena.start(); - Debugger.sendConsoleMsg(plugin.getChatManager().colorMessage("Validator.Instance-Started").replace("%arena%", id)); + List specialBlocks = new ArrayList<>(); + for(String loc : section.getStringList(id + ".mystery-cauldrons")) { + specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.MYSTERY_CAULDRON)); + } + for(String loc : section.getStringList(id + ".confessionals")) { + specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.PRAISE_DEVELOPER)); } - ConfigUtils.saveConfig(plugin, config, "arenas"); - Debugger.debug("Arenas registration completed, took {0}ms", System.currentTimeMillis() - start); + + specialBlocks.forEach(((Arena) arena)::loadSpecialBlock); + return true; } - public static List getArenas() { - return arenas; + @Override + public @Nullable Arena getArena(Player player) { + PluginArena pluginArena = super.getArena(player); + if(pluginArena instanceof Arena) { + return (Arena) pluginArena; + } + return null; } - public static void shuffleBungeeArena() { - bungeeArena = new Random().nextInt(arenas.size()); + @Override + public @Nullable Arena getArena(String id) { + PluginArena pluginArena = super.getArena(id); + if(pluginArena instanceof Arena) { + return (Arena) pluginArena; + } + return null; } - public static int getBungeeArena() { - if(bungeeArena == -999) { - bungeeArena = new Random().nextInt(arenas.size()); + public @NotNull List getPluginArenas() { + List arenas = new ArrayList<>(); + for(PluginArena pluginArena : super.getArenas()) { + if(pluginArena instanceof Arena) { + arenas.add((Arena) pluginArena); + } } - return bungeeArena; + return arenas; } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaState.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaState.java deleted file mode 100644 index 103fe03b..00000000 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaState.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.arena; - -import org.bukkit.plugin.java.JavaPlugin; - -import plugily.projects.murdermystery.Main; - -/** - * @author TomTheDeveloper - *

- * Contains all GameStates. - */ -public enum ArenaState { - WAITING_FOR_PLAYERS("Waiting"), STARTING("Starting"), IN_GAME("In-Game"), ENDING("Ending"), RESTARTING("Restarting"); - - private final String formattedName; - private final String placeholder; - - ArenaState(String formattedName) { - this.formattedName = formattedName; - this.placeholder = JavaPlugin.getPlugin(Main.class).getChatManager().colorMessage("Placeholders.Game-States." + formattedName); - } - - public String getFormattedName() { - return formattedName; - } - - public String getPlaceholder() { - return placeholder; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java index 8d51e13e..4ca7609b 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java @@ -1,6 +1,6 @@ /* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * Village Defense - Protect villagers from hordes of zombies + * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,146 +22,83 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.plugin.java.JavaPlugin; - -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.minecraft.compat.xseries.XSound; -import plugily.projects.commonsbox.minecraft.hologram.ArmorStandHologram; -import plugily.projects.commonsbox.minecraft.misc.stuff.ComplementAccessor; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; +import plugily.projects.minigamesbox.classic.arena.ArenaState; +import plugily.projects.minigamesbox.classic.arena.PluginArenaUtils; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.handlers.language.TitleBuilder; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; +import plugily.projects.minigamesbox.classic.utils.misc.complement.ComplementAccessor; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XSound; import plugily.projects.murdermystery.arena.role.Role; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.user.User; +import plugily.projects.murdermystery.old.arena.ArenaRegistry; import plugily.projects.murdermystery.utils.ItemPosition; -import plugily.projects.murdermystery.utils.Utils; /** * @author Plajer - *

- * Created at 13.03.2018 + *

Created at 13.03.2018 */ -public class ArenaUtils { +public class ArenaUtils extends PluginArenaUtils { - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - private static final ChatManager chatManager = plugin.getChatManager(); + private ArenaUtils() { + super(); + } public static void onMurdererDeath(Arena arena) { for(Player player : arena.getPlayers()) { - VersionUtils.sendTitles(player, chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Win", player), - chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Subtitles.Murderer-Stopped", player), 5, 40, 5); - if(Role.isRole(Role.MURDERER, player, arena)) { - VersionUtils.sendTitles(player, chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Lose", player), null, 5, 40, 5); - } - User loopUser = plugin.getUserManager().getUser(player); - if(Role.isRole(Role.INNOCENT, player, arena)) { + VersionUtils.sendSubTitle(player, getPlugin().getLanguageManager().getLanguageMessage("In-Game.Messages.Game-End.Placeholders.Murderer.Stopped"), 5, 40, 5); + User loopUser = getPlugin().getUserManager().getUser(player); + if(Role.isRole(Role.INNOCENT, loopUser, arena)) { addScore(loopUser, ScoreAction.SURVIVE_GAME, 0); - } else if(Role.isRole(Role.ANY_DETECTIVE, player, arena)) { + } else if(Role.isRole(Role.ANY_DETECTIVE, loopUser, arena)) { addScore(loopUser, ScoreAction.WIN_GAME, 0); addScore(loopUser, ScoreAction.DETECTIVE_WIN_GAME, 0); } } - for(Player murderer : arena.getMurdererList()) { - VersionUtils.sendTitles(murderer, chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Titles.Lose", murderer), - chatManager.colorMessage("In-Game.Messages.Game-End-Messages.Subtitles.Murderer-Stopped", murderer), 5, 40, 5); - } //we must call it ticks later due to instant respawn bug - Bukkit.getScheduler().runTaskLater(plugin, () -> ArenaManager.stopGame(false, arena), 10); - } - - public static void addScore(User user, ScoreAction action, int amount) { - String s = plugin.getConfig().getString("AddScore-Sound", ""); - if(!s.isEmpty()) { - Sound sound = XSound.ENTITY_EXPERIENCE_ORB_PICKUP.parseSound(); - - try { - sound = Sound.valueOf(s.toUpperCase()); - } catch(IllegalArgumentException e) { - } - - XSound.matchXSound(sound).play(user.getPlayer().getLocation(), 1F, 2F); - } - - String msg = chatManager.colorMessage("In-Game.Messages.Bonus-Score"); - - if(action == ScoreAction.GOLD_PICKUP && amount > 1) { - int score = action.points * amount; - - msg = StringUtils.replace(msg, "%score%", Integer.toString(score)); - msg = StringUtils.replace(msg, "%action%", action.action); - - user.setStat(StatsStorage.StatisticType.LOCAL_SCORE, user.getStat(StatsStorage.StatisticType.LOCAL_SCORE) + score); - user.getPlayer().sendMessage(msg); - return; - } - - if(action == ScoreAction.DETECTIVE_WIN_GAME) { - int innocents = 0; - Arena arena = user.getArena(); - - for(Player p : arena.getPlayersLeft()) { - if(Role.isRole(Role.INNOCENT, p, arena)) { - innocents++; - } - } - - int overallInnocents = 100 * innocents; - - user.setStat(StatsStorage.StatisticType.LOCAL_SCORE, user.getStat(StatsStorage.StatisticType.LOCAL_SCORE) + overallInnocents); - - msg = StringUtils.replace(msg, "%score%", Integer.toString(overallInnocents)); - msg = StringUtils.replace(msg, "%action%", action.action.replace("%amount%", Integer.toString(innocents))); - - user.getPlayer().sendMessage(msg); - return; - } - - msg = StringUtils.replace(msg, "%score%", Integer.toString(action.points)); - - if(action.points < 0) { - msg = StringUtils.replace(msg, "+", ""); - } - - msg = StringUtils.replace(msg, "%action%", action.action); - - user.setStat(StatsStorage.StatisticType.LOCAL_SCORE, user.getStat(StatsStorage.StatisticType.LOCAL_SCORE) + action.points); - user.getPlayer().sendMessage(msg); + Bukkit.getScheduler().runTaskLater(getPlugin(), () -> ArenaManager.stopGame(false, arena), 10); } public static void updateInnocentLocator(Arena arena) { java.util.List list = arena.getPlayersLeft(); - if(!arena.isMurdererLocatorReceived()) { + if (!arena.isMurdererLocatorReceived()) { ItemStack innocentLocator = new ItemStack(Material.COMPASS, 1); ItemMeta innocentMeta = innocentLocator.getItemMeta(); - ComplementAccessor.getComplement().setDisplayName(innocentMeta, chatManager.colorMessage("In-Game.Innocent-Locator-Item-Name")); + ComplementAccessor.getComplement() + .setDisplayName( + innocentMeta, + new MessageBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_INNOCENT").asKey().build()); innocentLocator.setItemMeta(innocentMeta); - for(Player p : list) { - if(arena.isMurderAlive(p)) { + for (Player p : list) { + if (arena.isMurderAlive(p)) { ItemPosition.setItem(p, ItemPosition.INNOCENTS_LOCATOR, innocentLocator); } } arena.setMurdererLocatorReceived(true); - for(Player p : list) { - if(Role.isRole(Role.MURDERER, p, arena)) { + for (Player p : list) { + if (Role.isRole(Role.MURDERER, getPlugin().getUserManager().getUser(p), arena)) { continue; } - VersionUtils.sendTitles(p, chatManager.colorMessage("In-Game.Watch-Out-Title", p), chatManager.colorMessage("In-Game.Watch-Out-Subtitle", p), 5, 40, 5); + new TitleBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_WATCH_OUT") + .asKey() + .player(p) + .arena(arena) + .sendPlayer(); } } - for(Player p : list) { - if(Role.isRole(Role.MURDERER, p, arena)) { + for (Player p : list) { + if (Role.isRole(Role.MURDERER, getPlugin().getUserManager().getUser(p), arena)) { continue; } - for(Player murder : arena.getMurdererList()) { - if(arena.isMurderAlive(murder)) { + for (Player murder : arena.getMurdererList()) { + if (arena.isMurderAlive(murder)) { murder.setCompassTarget(p.getLocation()); } } @@ -169,111 +106,142 @@ public static void updateInnocentLocator(Arena arena) { } } - private static void addBowLocator(Arena arena, Location loc) { - ItemStack bowLocator = new ItemStack(Material.COMPASS, 1); - ItemMeta bowMeta = bowLocator.getItemMeta(); - ComplementAccessor.getComplement().setDisplayName(bowMeta, chatManager.colorMessage("In-Game.Bow-Locator-Item-Name")); - bowLocator.setItemMeta(bowMeta); - for(Player p : arena.getPlayersLeft()) { - if(Role.isRole(Role.INNOCENT, p, arena)) { - ItemPosition.setItem(p, ItemPosition.BOW_LOCATOR, bowLocator); - p.setCompassTarget(loc); - } - } - } - public static void dropBowAndAnnounce(Arena arena, Player victim) { - if(arena.getBowHologram() != null) { + if (arena.getBowHologram() != null) { return; } - java.util.List list = arena.getPlayersLeft(); - if(list.size() > 1) { - for(Player p : arena.getPlayers()) { - VersionUtils.sendTitles(p, chatManager.colorMessage("In-Game.Messages.Bow-Messages.Bow-Dropped-Title", p), null, 5, 40, 5); - } - for(Player p : list) { - VersionUtils.sendTitles(p, null, chatManager.colorMessage("In-Game.Messages.Bow-Messages.Bow-Dropped-Subtitle", p), 5, 40, 5); - } - } + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_DROPPED").asKey().arena(arena).sendArena(); - ArmorStandHologram hologram = new ArmorStandHologram(victim.getLocation()) - .appendItem(new ItemStack(Material.BOW, 1)); + ArmorStandHologram hologram = + new ArmorStandHologram(victim.getLocation()).appendItem(new ItemStack(Material.BOW, 1)); arena.setBowHologram(hologram); addBowLocator(arena, hologram.getLocation()); } - public static boolean areInSameArena(Player one, Player two) { - Arena a1 = ArenaRegistry.getArena(one); - return a1 != null && a1.equals(ArenaRegistry.getArena(two)); - } - - public static void hidePlayer(Player p, Arena arena) { - for(Player player : arena.getPlayers()) { - if(plugin.getUserManager().getUser(player).isSpectator()) { - VersionUtils.showPlayer(plugin, player, p); - } else { - VersionUtils.hidePlayer(plugin, player, p); - } - } - } - - public static void showPlayer(Player p, Arena arena) { - for(Player player : arena.getPlayers()) { - VersionUtils.showPlayer(plugin, player, p); - } - } - - public static void hidePlayersOutsideTheGame(Player player, Arena arena) { - for(Player players : plugin.getServer().getOnlinePlayers()) { - if(arena.getPlayers().contains(players)) { - continue; + private static void addBowLocator(Arena arena, Location loc) { + ItemStack bowLocator = new ItemStack(Material.COMPASS, 1); + ItemMeta bowMeta = bowLocator.getItemMeta(); + ComplementAccessor.getComplement() + .setDisplayName( + bowMeta, new MessageBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_BOW").asKey().build()); + bowLocator.setItemMeta(bowMeta); + for (Player p : arena.getPlayersLeft()) { + if (Role.isRole(Role.INNOCENT, getPlugin().getUserManager().getUser(p), arena)) { + ItemPosition.setItem(p, ItemPosition.BOW_LOCATOR, bowLocator); + p.setCompassTarget(loc); } - VersionUtils.hidePlayer(plugin, player, players); - VersionUtils.hidePlayer(plugin, players, player); } } public static void updateNameTagsVisibility(final Player p) { - if(!plugin.getConfigPreferences().getOption(ConfigPreferences.Option.NAMETAGS_HIDDEN)) { + if (!getPlugin().getConfigPreferences().getOption("HIDE_NAMETAGS")) { return; } - for(Player players : plugin.getServer().getOnlinePlayers()) { + for (Player players : getPlugin().getServer().getOnlinePlayers()) { Arena arena = ArenaRegistry.getArena(players); - if(arena == null) { + if (arena == null) { continue; } - VersionUtils.updateNameTagsVisibility(p, players, "MMHide", arena.getArenaState() != ArenaState.IN_GAME); + VersionUtils.updateNameTagsVisibility( + p, players, "MMHide", arena.getArenaState() != ArenaState.IN_GAME); } } - public static void arenaForceStart(Player player) { - if(!Utils.hasPermission(player, "murdermystery.admin.forcestart")) { - return; - } - if(!Utils.checkIsInGameInstance(player)) { + public static void addScore(User user, ScoreAction action, int amount) { + XSound.matchXSound(XSound.ENTITY_EXPERIENCE_ORB_PICKUP.parseSound()) + .play(user.getPlayer().getLocation(), 1F, 2F); + + if (action == ScoreAction.GOLD_PICKUP && amount > 1) { + int score = action.points * amount; + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_BONUS") + .asKey() + .player(user.getPlayer()) + .arena(user.getArena()) + .integer(score) + .value(action.action) + .sendPlayer(); + user.adjustStatistic("LOCAL_SCORE", score); return; } - Arena arena = ArenaRegistry.getArena(player); - if(arena.getPlayers().size() < 2) { - chatManager.broadcast(arena, chatManager.formatMessage(arena, chatManager.colorMessage("In-Game.Messages.Lobby-Messages.Waiting-For-Players"), arena.getMinimumPlayers())); + + if (action == ScoreAction.DETECTIVE_WIN_GAME) { + int innocents = 0; + Arena arena = (Arena) user.getArena(); + + for (Player p : arena.getPlayersLeft()) { + if (Role.isRole(Role.INNOCENT, getPlugin().getUserManager().getUser(p), arena)) { + innocents++; + } + } + + int overallInnocents = 100 * innocents; + + user.adjustStatistic("LOCAL_SCORE", overallInnocents); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_BONUS") + .asKey() + .player(user.getPlayer()) + .arena(user.getArena()) + .integer(overallInnocents) + .value(action.action.replace("%amount%", Integer.toString(innocents))) + .sendPlayer(); return; } - if(arena.getArenaState() == ArenaState.WAITING_FOR_PLAYERS || arena.getArenaState() == ArenaState.STARTING) { - arena.setArenaState(ArenaState.STARTING); - arena.setForceStart(true); - arena.setTimer(0); - for(Player arenaPlayers : arena.getPlayers()) { - arenaPlayers.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Messages.Admin-Messages.Set-Starting-In-To-0")); - } + String msg = + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_BONUS") + .asKey() + .player(user.getPlayer()) + .arena(user.getArena()) + .integer(action.points) + .value(action.action) + .build(); + + if (action.points < 0) { + msg = StringUtils.replace(msg, "+", ""); } + + user.adjustStatistic("LOCAL_SCORE", action.points); + user.getPlayer().sendMessage(msg); } public enum ScoreAction { - KILL_PLAYER(100, chatManager.colorMessage("In-Game.Messages.Score-Actions.Kill-Player")), KILL_MURDERER(200, chatManager.colorMessage("In-Game.Messages.Score-Actions.Kill-Murderer")), - GOLD_PICKUP(15, chatManager.colorMessage("In-Game.Messages.Score-Actions.Gold-Pickup")), SURVIVE_TIME(150, chatManager.colorMessage("In-Game.Messages.Score-Actions.Survive")), - SURVIVE_GAME(200, chatManager.colorMessage("In-Game.Messages.Score-Actions.Survive-Till-End")), WIN_GAME(100, chatManager.colorMessage("In-Game.Messages.Score-Actions.Win-Game")), - DETECTIVE_WIN_GAME(0, chatManager.colorMessage("In-Game.Messages.Score-Actions.Detective-Reward")), INNOCENT_KILL(-100, chatManager.colorMessage("In-Game.Messages.Score-Actions.Innocent-Kill")); + KILL_PLAYER( + 100, + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_PLAYER") + .asKey() + .build()), + KILL_MURDERER( + 200, + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_MURDERER") + .asKey() + .build()), + GOLD_PICKUP( + 15, + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_PICKUP_GOLD") + .asKey() + .build()), + SURVIVE_TIME( + 150, + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_SURVIVING_TIME") + .asKey() + .build()), + SURVIVE_GAME( + 200, + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_SURVIVING_END") + .asKey() + .build()), + WIN_GAME( + 100, new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_WIN").asKey().build()), + DETECTIVE_WIN_GAME( + 0, + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_DETECTIVE") + .asKey() + .build()), + INNOCENT_KILL( + -100, + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_INNOCENT") + .asKey() + .build()); int points; String action; @@ -291,5 +259,4 @@ public String getAction() { return action; } } - } diff --git a/src/main/java/plugily/projects/murdermystery/arena/corpse/Corpse.java b/src/main/java/plugily/projects/murdermystery/arena/corpse/Corpse.java index f6c75514..3410978c 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/corpse/Corpse.java +++ b/src/main/java/plugily/projects/murdermystery/arena/corpse/Corpse.java @@ -21,6 +21,7 @@ import org.golde.bukkit.corpsereborn.nms.Corpses; import plugily.projects.commonsbox.minecraft.hologram.ArmorStandHologram; +import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; /** * @author Plajer diff --git a/src/main/java/plugily/projects/murdermystery/arena/corpse/Stand.java b/src/main/java/plugily/projects/murdermystery/arena/corpse/Stand.java index 875a4a27..fa2697f8 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/corpse/Stand.java +++ b/src/main/java/plugily/projects/murdermystery/arena/corpse/Stand.java @@ -21,6 +21,7 @@ import org.bukkit.entity.ArmorStand; import plugily.projects.commonsbox.minecraft.hologram.ArmorStandHologram; +import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; /** * @author Plajer diff --git a/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java b/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java new file mode 100644 index 00000000..b7ab04db --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java @@ -0,0 +1,73 @@ +package plugily.projects.murdermystery.arena.managers; + +import org.bukkit.entity.Item; +import org.golde.bukkit.corpsereborn.CorpseAPI.CorpseAPI; +import plugily.projects.minigamesbox.classic.arena.managers.PluginMapRestorerManager; +import plugily.projects.murdermystery.arena.Arena; + +import java.util.Objects; + +public class MapRestorerManager extends PluginMapRestorerManager { + + public final Arena arena; + + public MapRestorerManager(Arena arena) { + super(arena); + this.arena = arena; + } + + @Override + public void fullyRestoreArena() { + cleanUpArena(); + super.fullyRestoreArena(); + } + + + public void cleanUpArena() { + removeBowHolo(); + arena.setMurdererLocatorReceived(false); + arena.getGameCharacters().clear(); + arena.getMurdererList().clear(); + arena.getDetectiveList().clear(); + arena.setDetectiveDead(false); + clearCorpses(); + clearGold(); + } + + public void removeBowHolo() { + if(arena.getBowHologram() != null && !arena.getBowHologram().isDeleted()) { + arena.getBowHologram().delete(); + } +arena.setBowHologram(null); + } + + public void clearGold() { + arena.getGoldSpawned().stream().filter(Objects::nonNull).forEach(Item::remove); + arena.getGoldSpawned().clear(); + } + + public void clearCorpses() { + if(!plugin.getHookManager().isFeatureEnabled(HookManager.HookFeature.CORPSES)) { + for(Stand stand : stands) { + if(!stand.getHologram().isDeleted()) { + stand.getHologram().delete(); + } + if(stand.getStand() != null) { + stand.getStand().remove(); + } + } + stands.clear(); + return; + } + for(Corpse corpse : corpses) { + if(!corpse.getHologram().isDeleted()) { + corpse.getHologram().delete(); + } + if(corpse.getCorpseData() != null) { + corpse.getCorpseData().destroyCorpseFromEveryone(); + CorpseAPI.removeCorpse(corpse.getCorpseData()); + } + } + corpses.clear(); + } +} diff --git a/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java b/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java index 01a0fe78..475bc33c 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java @@ -1,6 +1,6 @@ /* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * Village Defense - Protect villagers from hordes of zombies + * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,191 +18,57 @@ package plugily.projects.murdermystery.arena.managers; -import me.clip.placeholderapi.PlaceholderAPI; -import me.tigerhix.lib.scoreboard.ScoreboardLib; -import me.tigerhix.lib.scoreboard.common.EntryBuilder; -import me.tigerhix.lib.scoreboard.type.Entry; -import me.tigerhix.lib.scoreboard.type.Scoreboard; -import me.tigerhix.lib.scoreboard.type.ScoreboardHandler; -import org.apache.commons.lang.StringUtils; -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; - -import plugily.projects.commonsbox.string.StringFormatUtils; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaState; +import plugily.projects.minigamesbox.classic.arena.ArenaState; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.managers.PluginScoreboardManager; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.scoreboard.common.EntryBuilder; +import plugily.projects.minigamesbox.classic.utils.scoreboard.type.Entry; import plugily.projects.murdermystery.arena.role.Role; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.language.LanguageManager; -import plugily.projects.murdermystery.user.User; -import java.util.ArrayList; import java.util.List; /** - * @author Plajer - *

- * Created at 24.03.2019 + * @author Tigerpanzer_02 + *

Created at 19.12.2021 */ -public class ScoreboardManager { - - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - private final List scoreboards = new ArrayList<>(); - private final Arena arena; +public class ScoreboardManager extends PluginScoreboardManager { - public ScoreboardManager(Arena arena) { + private final PluginArena arena; + public ScoreboardManager(PluginArena arena) { + super(arena); this.arena = arena; } - /** - * Creates arena scoreboard for target user - * - * @param user user that represents game player - * @see User - */ - public void createScoreboard(User user) { - Player player = user.getPlayer(); - final String boardTitle = plugin.getChatManager().colorMessage("Scoreboard.Title"); - Scoreboard scoreboard = ScoreboardLib.createScoreboard(player).setHandler(new ScoreboardHandler() { - @Override - public String getTitle(Player player) { - return boardTitle; - } - - @Override - public List getEntries(Player player) { - return formatScoreboard(user); - } - }); - scoreboard.activate(); - scoreboards.add(scoreboard); - } - - /** - * Removes scoreboard of user - * - * @param user user that represents game player - * @see User - */ - public void removeScoreboard(User user) { - for(Scoreboard board : scoreboards) { - if(board.getHolder().equals(user.getPlayer())) { - scoreboards.remove(board); - board.deactivate(); - return; - } - } - } - - /** - * Forces all scoreboards to deactivate. - */ - public void stopAllScoreboards() { - scoreboards.forEach(Scoreboard::deactivate); - scoreboards.clear(); - } - - private List formatScoreboard(User user) { + @Override + public List formatScoreboard(User user) { EntryBuilder builder = new EntryBuilder(); List lines; - if(arena.getArenaState() == ArenaState.IN_GAME) { - lines = LanguageManager.getLanguageList("Scoreboard.Content.Playing"); - if(Role.isRole(Role.MURDERER, user.getPlayer())) { - lines = LanguageManager.getLanguageList("Scoreboard.Content.Playing-Murderer"); - } - } else { - //apply fix - if(arena.getArenaState() == ArenaState.ENDING) { - lines = LanguageManager.getLanguageList("Scoreboard.Content.Playing"); - if(Role.isRole(Role.MURDERER, user.getPlayer())) { - lines = LanguageManager.getLanguageList("Scoreboard.Content.Playing-Murderer"); - } - } else { - lines = LanguageManager.getLanguageList("Scoreboard.Content." + arena.getArenaState().getFormattedName()); - } + if (user.getArena().getArenaState() == ArenaState.FULL_GAME) { + lines = + user.getArena() + .getPlugin() + .getLanguageManager() + .getLanguageList("Scoreboard.Content.Starting"); + } else if (user.getArena().getArenaState() == ArenaState.IN_GAME) { + lines = + user.getArena() + .getPlugin() + .getLanguageManager() + .getLanguageList( + "Scoreboard.Content." + user.getArena().getArenaState().getFormattedName() + (Role.isRole(Role.MURDERER, user.getPlayer()) ? "Murderer" : "")); + }else { + lines = + user.getArena() + .getPlugin() + .getLanguageManager() + .getLanguageList( + "Scoreboard.Content." + user.getArena().getArenaState().getFormattedName()); } for(String line : lines) { - builder.next(formatScoreboardLine(line, user)); + builder.next(new MessageBuilder(line).player(user.getPlayer()).arena(arena).build()); } return builder.build(); } - - private String formatScoreboardLine(String line, User user) { - String formattedLine = line; - - int timer = arena.getTimer(); - - formattedLine = StringUtils.replace(formattedLine, "%TIME%", Integer.toString(timer + 1)); - formattedLine = StringUtils.replace(formattedLine, "%FORMATTED_TIME%", StringFormatUtils.formatIntoMMSS(timer + 1)); - formattedLine = StringUtils.replace(formattedLine, "%MAPNAME%", arena.getMapName()); - - boolean havePlayer = false; - int innocents = 0; - - Player player = user.getPlayer(); - - for(Player p : arena.getPlayersLeft()) { - if (p == player) { - havePlayer = true; - } - - if(!Role.isRole(Role.MURDERER, p)) { - innocents++; - } - } - - ChatManager chatManager = plugin.getChatManager(); - - if(!havePlayer) { - formattedLine = StringUtils.replace(formattedLine, "%ROLE%", chatManager.colorMessage("Scoreboard.Roles.Dead")); - } else { - if(Role.isRole(Role.MURDERER, player)) { - formattedLine = StringUtils.replace(formattedLine, "%ROLE%", chatManager.colorMessage("Scoreboard.Roles.Murderer")); - } else if(Role.isRole(Role.ANY_DETECTIVE, player)) { - formattedLine = StringUtils.replace(formattedLine, "%ROLE%", chatManager.colorMessage("Scoreboard.Roles.Detective")); - } else { - formattedLine = StringUtils.replace(formattedLine, "%ROLE%", chatManager.colorMessage("Scoreboard.Roles.Innocent")); - } - } - formattedLine = StringUtils.replace(formattedLine, "%INNOCENTS%", Integer.toString(innocents)); - formattedLine = StringUtils.replace(formattedLine, "%PLAYERS%", Integer.toString(arena.getPlayers().size())); - formattedLine = StringUtils.replace(formattedLine, "%MAX_PLAYERS%", Integer.toString(arena.getMaximumPlayers())); - formattedLine = StringUtils.replace(formattedLine, "%MIN_PLAYERS%", Integer.toString(arena.getMinimumPlayers())); - - if (!arena.isHideChances()) { - int totalMurderer = 0; - int totalDetective = 0; - - for(Player p : arena.getPlayers()) { - User us = plugin.getUserManager().getUser(p); - totalMurderer += us.getStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER); - totalDetective += us.getStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE); - } - - formattedLine = arena.formatRoleChance(formattedLine, user, totalMurderer, totalDetective); - } - - if (arena.isDetectiveDead()) { - if(!arena.isCharacterSet(Arena.CharacterType.FAKE_DETECTIVE)) { - formattedLine = StringUtils.replace(formattedLine, "%DETECTIVE_STATUS%", chatManager.colorMessage("Scoreboard.Detective-Died-No-Bow")); - } else { - formattedLine = StringUtils.replace(formattedLine, "%DETECTIVE_STATUS%", chatManager.colorMessage("Scoreboard.Detective-Died-Bow")); - } - } else { - formattedLine = StringUtils.replace(formattedLine, "%DETECTIVE_STATUS%", chatManager.colorMessage("Scoreboard.Detective-Status-Normal")); - } - - //should be for murderer only - formattedLine = StringUtils.replace(formattedLine, "%KILLS%", Integer.toString(user.getStat(StatsStorage.StatisticType.LOCAL_KILLS))); - formattedLine = StringUtils.replace(formattedLine, "%SCORE%", Integer.toString(user.getStat(StatsStorage.StatisticType.LOCAL_SCORE))); - - if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { - formattedLine = PlaceholderAPI.setPlaceholders(player, formattedLine); - } - - return chatManager.colorRawMessage(formattedLine); - } - } diff --git a/src/main/java/plugily/projects/murdermystery/arena/options/ArenaOption.java b/src/main/java/plugily/projects/murdermystery/arena/options/ArenaOption.java deleted file mode 100644 index 17e5283a..00000000 --- a/src/main/java/plugily/projects/murdermystery/arena/options/ArenaOption.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.arena.options; - -/** - * @author Plajer - *

- * Created at 24.03.2019 - */ -public enum ArenaOption { - /** - * Current arena timer, ex. 30 seconds before game starts. - */ - TIMER(0), - /** - * Minimum players in arena needed to start. - */ - MINIMUM_PLAYERS(2), - /** - * Maximum players arena can hold, users with full games permission can bypass this! - */ - MAXIMUM_PLAYERS(10); - - private final int defaultValue; - - ArenaOption(int defaultValue) { - this.defaultValue = defaultValue; - } - - public int getDefaultValue() { - return defaultValue; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java index 3ea133cf..95a9848c 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java +++ b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java @@ -19,8 +19,10 @@ package plugily.projects.murdermystery.arena.role; import org.bukkit.entity.Player; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; +import plugily.projects.murdermystery.old.arena.ArenaRegistry; /** * @author Plajer @@ -66,8 +68,8 @@ public enum Role { * @param player player to check * @return true if is playing it, false otherwise */ - public static boolean isRole(Role role, Player player) { - return isRole(role, player, ArenaRegistry.getArena(player)); + public static boolean isRole(Role role, User user) { + return isRole(role, user, user.getArena()); } /** @@ -78,25 +80,29 @@ public static boolean isRole(Role role, Player player) { * @param arena the arena where to check * @return true if is playing it, false otherwise */ - public static boolean isRole(Role role, Player player, Arena arena) { + public static boolean isRole(Role role, User user, PluginArena arena) { if (arena == null) return false; - + Arena pluginArena = (Arena) arena.getPlugin().getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return false; + } +Player player = user.getPlayer(); switch(role) { case DETECTIVE: - return arena.isCharacterSet(Arena.CharacterType.DETECTIVE) && arena.getDetectiveList().contains(player); + return pluginArena.isCharacterSet(Arena.CharacterType.DETECTIVE) && pluginArena.getDetectiveList().contains(player); case FAKE_DETECTIVE: - return player.equals(arena.getCharacter(Arena.CharacterType.FAKE_DETECTIVE)); + return player.equals(pluginArena.getCharacter(Arena.CharacterType.FAKE_DETECTIVE)); case MURDERER: - return arena.isCharacterSet(Arena.CharacterType.MURDERER) && arena.getMurdererList().contains(player); + return pluginArena.isCharacterSet(Arena.CharacterType.MURDERER) && pluginArena.getMurdererList().contains(player); case ANY_DETECTIVE: - return isRole(Role.DETECTIVE, player) || isRole(Role.FAKE_DETECTIVE, player); + return isRole(Role.DETECTIVE, user) || isRole(Role.FAKE_DETECTIVE, user); case INNOCENT: - return !isRole(Role.MURDERER, player) && !isRole(Role.ANY_DETECTIVE, player); + return !isRole(Role.MURDERER, user) && !isRole(Role.ANY_DETECTIVE, user); case DEATH: - return arena.isDeathPlayer(player); + return pluginArena.isDeathPlayer(player); case SPECTATOR: - return arena.isSpectatorPlayer(player); + return pluginArena.isSpectatorPlayer(player); default: return false; } @@ -108,8 +114,8 @@ public static boolean isRole(Role role, Player player, Arena arena) { * @param player player to check * @return true if is playing one role, false otherwise */ - public static boolean isAnyRole(Player player) { - return isAnyRole(player, ArenaRegistry.getArena(player)); + public static boolean isAnyRole(User user) { + return isAnyRole(user, user.getArena()); } private static final Role[] roles = Role.values(); @@ -121,7 +127,7 @@ public static boolean isAnyRole(Player player) { * @param arena the player's arena * @return true if is playing one role, false otherwise */ - public static boolean isAnyRole(Player player, Arena arena) { - return arena != null && java.util.Arrays.stream(roles).anyMatch(role -> isRole(role, player, arena)); + public static boolean isAnyRole(User user, PluginArena arena) { + return arena != null && java.util.Arrays.stream(roles).anyMatch(role -> isRole(role, user, arena)); } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlock.java b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlock.java index fe932463..a0350241 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlock.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlock.java @@ -21,6 +21,7 @@ import org.bukkit.Location; import plugily.projects.commonsbox.minecraft.hologram.ArmorStandHologram; +import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; /** * @author Plajer diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java index a60566f9..5170e254 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java @@ -26,25 +26,9 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.inventory.ItemStack; - -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.item.ItemUtils; -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.minecraft.item.ItemBuilder; -import plugily.projects.commonsbox.minecraft.misc.stuff.ComplementAccessor; +import plugily.projects.minigamesbox.classic.utils.version.ServerVersion; import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.ArenaState; -import plugily.projects.murdermystery.arena.special.mysterypotion.MysteryPotion; -import plugily.projects.murdermystery.arena.special.mysterypotion.MysteryPotionRegistry; -import plugily.projects.murdermystery.arena.special.pray.PrayerRegistry; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.user.User; -import plugily.projects.murdermystery.utils.ItemPosition; -import plugily.projects.murdermystery.utils.Utils; + /** * @author Plajer @@ -54,11 +38,9 @@ public class SpecialBlockEvents implements Listener { private final Main plugin; - private final ChatManager chatManager; public SpecialBlockEvents(Main plugin) { this.plugin = plugin; - chatManager = plugin.getChatManager(); plugin.getServer().getPluginManager().registerEvents(this, plugin); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java b/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java index 2ab7a5d8..51c58d1d 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java @@ -22,8 +22,8 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.murdermystery.Main; +import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; +import plugily.projects.murdermystery.old.Main; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java b/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java index 466ac2e9..76c290ad 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java @@ -25,16 +25,11 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; -import plugily.projects.commonsbox.minecraft.misc.MiscUtils; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.misc.MiscUtils; import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.ArenaState; import plugily.projects.murdermystery.arena.role.Role; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.language.LanguageManager; -import plugily.projects.murdermystery.user.User; import plugily.projects.murdermystery.utils.ItemPosition; import java.util.ArrayList; @@ -49,7 +44,6 @@ public class PrayerRegistry { private static Main plugin; - private static ChatManager chatManager; private static final List prayers = new ArrayList<>(); private static final List ban = new ArrayList<>(), rush = new ArrayList<>(); @@ -58,7 +52,6 @@ private PrayerRegistry() { public static void init(Main plugin) { PrayerRegistry.plugin = plugin; - chatManager = plugin.getChatManager(); //good prayers prayers.add(new Prayer(Prayer.PrayerType.DETECTIVE_REVELATION, true, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Gifts.Detective-Revelation"))); prayers.add(new Prayer(Prayer.PrayerType.GOLD_RUSH, true, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Gifts.Gold-Rush"))); @@ -83,11 +76,11 @@ public static List getPrayers() { public static void applyRandomPrayer(User user) { Prayer prayer = getRandomPray(); - user.setStat(StatsStorage.StatisticType.LOCAL_CURRENT_PRAY, prayer.getPrayerType().ordinal()); + user.setStatistic("LOCAL_CURRENT_PRAY", prayer.getPrayerType().ordinal()); Player player = user.getPlayer(); - Arena arena = ArenaRegistry.getArena(player); - List prayMessage = LanguageManager.getLanguageList("In-Game.Messages.Special-Blocks.Praises.Message"); + Arena arena = plugin.getArenaRegistry().getArena(player); + List prayMessage = plugin.getLanguageManager().getLanguageList("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praises.Message"); String feeling = chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Feelings." + (prayer.isGoodPray() ? "Blessed" : "Cursed"), player); int praySize = prayMessage.size(); diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java new file mode 100644 index 00000000..d9a0617d --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java @@ -0,0 +1,166 @@ +/* + * Village Defense - Protect villagers from hordes of zombies + * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package plugily.projects.murdermystery.arena.states; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.states.PluginInGameState; +import plugily.projects.minigamesbox.classic.handlers.language.TitleBuilder; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XSound; +import plugily.projects.murdermystery.arena.Arena; +import plugily.projects.murdermystery.arena.role.Role; +import plugily.projects.murdermystery.utils.ItemPosition; +import plugily.projects.thebridge.api.events.game.TBRoundStartEvent; +import plugily.projects.thebridge.arena.Arena; +import plugily.projects.thebridge.arena.ArenaUtils; +import plugily.projects.thebridge.arena.base.Base; + +import java.util.Random; + +/** + * @author Plajer + *

Created at 03.06.2019 + */ +public class InGameState extends PluginInGameState { + + @Override + public void handleCall(PluginArena arena) { + super.handleCall(arena); + Arena pluginArena = (Arena) getPlugin().getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return; + } + if (arena.getTimer() <= 0) { + getPlugin().getArenaManager().stopGame(false, arena); + } + int inGameLength = getPlugin().getConfig().getInt("Time-Manager.In-Game", 270); + + + if(arena.getTimer() <= (inGameLength - 10) && arena.getTimer() > (inGameLength - 15)) { + String murdererGetSword = chatManager.colorMessage("In-Game.Messages.Murderer-Get-Sword") + .replace("%time%", Integer.toString(arena.getTimer() - (inGameLength - 15))); + + for(Player p : arena.getPlayers()) { + p.sendMessage(murdererGetSword); + XSound.UI_BUTTON_CLICK.play(p.getLocation(), 1, 1); + } + + if(arena.getTimer() == (inGameLength - 14)) { + if(pluginArena.getMurdererList().isEmpty()) ArenaManager.stopGame(false, pluginArena); + + for(Player p : pluginArena.getMurdererList()) { + User murderer = getPlugin().getUserManager().getUser(p); + + if(murderer.isSpectator() || !p.isOnline()) + continue; + + p.getInventory().setHeldItemSlot(0); + ItemPosition.setItem(p, ItemPosition.MURDERER_SWORD, plugin.getConfigPreferences().getMurdererSword()); + } + } + } + + //every 30 secs survive reward + if(arena.getTimer() % 30 == 0) { + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_TIME_LEFT").arena(pluginArena).sendArena(); + for(Player p : arena.getPlayersLeft()) { + if(Role.isRole(Role.INNOCENT, p, pluginArena)) { + ArenaUtils.addScore(getPlugin().getUserManager().getUser(p), ArenaUtils.ScoreAction.SURVIVE_TIME, 0); + } + } + } + + if (arena.getTimer() <= 30 + || arena.getPlayersLeft().size() == pluginArena.aliveMurderer() + 1) { + //todo locator config option + if(getPlugin().getConfigPreferences().getOption("INNOCENT_LOCATOR")) { + ArenaUtils.updateInnocentLocator(pluginArena); + } + } + + // no players - stop game + if (pluginArena.getPlayersLeft().isEmpty()) { + getPlugin().getArenaManager().stopGame(false, pluginArena); + } else { + // winner check + if (arena.getPlayersLeft().size() == pluginArena.aliveMurderer()) { + //todo placeholder check + for(Player player : arena.getPlayers()) { + + if(pluginArena.getMurdererList().contains(player)) { + + } + } + + getPlugin().getArenaManager().stopGame(false, pluginArena); + // murderer speed add + // todo config otpion + } else if (getPlugin().getConfigPreferences().getOption("MURDERER_SPEED") + && arena.getPlayersLeft().size() == pluginArena.aliveMurderer() + 1) { + int multiplier = getPlugin().getConfig().getInt("Speed-Effect-Murderer.Speed", 3); + + if (multiplier > 1 && multiplier <= 10) { + for (Player player : pluginArena.getMurdererList()) { + if (pluginArena.isMurderAlive(player)) { + // no potion because it adds particles which can be identified + player.setWalkSpeed(0.1f * multiplier); + } + } + } + } + //don't spawn it every time + if(pluginArena.getSpawnGoldTimer() == pluginArena.getSpawnGoldTime()) { + spawnSomeGold(); + pluginArena.setSpawnGoldTimer(0); + } else { + pluginArena.setSpawnGoldTimer(pluginArena.getSpawnGoldTimer()+1); + } + + } + } + + private void spawnSomeGold(Arena arena) { + int spawnPointsSize = arena.getPlayerSpawnPoints().size(); + + if(spawnPointsSize == 0) { + return; + } +//todo config option + //may users want to disable it and want much gold on there map xD + if(!getPlugin().getConfigPreferences().getOption("DISABLE_GOLD_LIMITER")) { + //do not exceed amount of gold per spawn + if(arena.getGoldSpawned().size() >= spawnPointsSize) { + return; + } + } +//todo config option + if(getPlugin().getConfigPreferences().getOption("SPAWN_GOLD_EVERY_SPAWNER_MODE")) { + for(Location location : arena.getPlayerSpawnPoints()) { + arena.getGoldSpawned().add(location.getWorld().dropItem(location, new ItemStack(Material.GOLD_INGOT, 1))); + } + } else { + Location loc = arena.getGoldSpawned().get(spawnPointsSize == 1 ? 0 : new Random().nextInt(spawnPointsSize)).getLocation(); + arena.getGoldSpawned().add(loc.getWorld().dropItem(loc, new ItemStack(Material.GOLD_INGOT, 1))); + } + } +} diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/RestartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/RestartingState.java new file mode 100644 index 00000000..efaac578 --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/arena/states/RestartingState.java @@ -0,0 +1,46 @@ +/* + * Village Defense - Protect villagers from hordes of zombies + * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package plugily.projects.murdermystery.arena.states; + +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.states.PluginRestartingState; +import plugily.projects.murdermystery.arena.Arena; +import plugily.projects.thebridge.arena.Arena; + +/** + * @author Plajer + *

+ * Created at 03.06.2019 + */ +public class RestartingState extends PluginRestartingState { + + @Override + public void handleCall(PluginArena arena) { + super.handleCall(arena); + Arena pluginArena = (Arena) getPlugin().getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return; + } + if(arena.getTimer() <= 0) { + if(pluginArena.isGoldVisuals()) { + pluginArena.startGoldVisuals(); + } + } + } +} diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java new file mode 100644 index 00000000..f203ec73 --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java @@ -0,0 +1,233 @@ +/* + * Village Defense - Protect villagers from hordes of zombies + * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package plugily.projects.murdermystery.arena.states; + +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.states.PluginStartingState; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.handlers.language.TitleBuilder; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; +import plugily.projects.murdermystery.arena.Arena; +import plugily.projects.murdermystery.arena.ArenaUtils; +import plugily.projects.murdermystery.arena.role.Role; +import plugily.projects.murdermystery.utils.ItemPosition; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author Plajer + *

Created at 03.06.2019 + */ +public class StartingState extends PluginStartingState { + + int maxmurderer = 1; + int maxdetectives = 1; + + @Override + public void handleCall(PluginArena arena) { + super.handleCall(arena); + Arena pluginArena = (Arena) getPlugin().getArenaRegistry().getArena(arena.getId()); + if (pluginArena == null) { + return; + } + + int totalMurderer = 0; + int totalDetective = 0; + + for (Player p : arena.getPlayers()) { + User user = arena.getPlugin().getUserManager().getUser(p); + totalMurderer += user.getStatistic("CONTRIBUTION_MURDERER"); + totalDetective += user.getStatistic("CONTRIBUTION_DETECTIVE"); + } + + if (!pluginArena.isHideChances()) { + for (Player player : arena.getPlayers()) { + String message = + new MessageBuilder("IN_GAME_MESSAGES_ARENA_ROLE_CHANCES_ACTION_BAR") + .asKey() + .player(player) + .arena(pluginArena) + .build(); + VersionUtils.sendActionBar(player, message); + } + } + + if (arena.getTimer() == 0 || arena.isForceStart()) { + Map murdererChances = new HashMap<>(); + Map detectiveChances = new HashMap<>(); + for (Player player : arena.getPlayers()) { + User user = arena.getPlugin().getUserManager().getUser(player); + /* + //reset local variables to be 100% sure + User user = plugin.getUserManager().getUser(player); + user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, 0); + user.setStat(StatsStorage.StatisticType.LOCAL_CURRENT_PRAY, 0); + user.setStat(StatsStorage.StatisticType.LOCAL_KILLS, 0); + user.setStat(StatsStorage.StatisticType.LOCAL_PRAISES, 0); + user.setStat(StatsStorage.StatisticType.LOCAL_SCORE, 0); + */ + ArenaUtils.updateNameTagsVisibility(player); + player.setGameMode(GameMode.ADVENTURE); + + murdererChances.put( + user, + ((double) user.getStatistic("CONTRIBUTION_MURDERER") / (double) totalMurderer) * 100.0); + detectiveChances.put( + user, + ((double) user.getStatistic("CONTRIBUTION_DETECTIVE") / (double) totalDetective) + * 100.0); + } + + Set playersToSet = new HashSet<>(arena.getPlayers()); + + getMaxRolesToSet(pluginArena); + + addRole(pluginArena, Role.MURDERER, murdererChances, playersToSet); + addRole(pluginArena, Role.DETECTIVE, detectiveChances, playersToSet); + + for (Player player : playersToSet) { + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_INNOCENT") + .asKey() + .player(player) + .arena(pluginArena) + .sendPlayer(); + } + + arena + .getPlugin() + .getDebugger() + .debug( + "After: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Players: Detectives = {4}, Murders = {5}", + arena.getId(), + maxdetectives, + maxmurderer, + arena.getPlayers().size(), + pluginArena.getMurdererList(), + pluginArena.getDetectiveList()); + + // Load and append special blocks hologram + pluginArena.getSpecialBlocks().forEach(pluginArena::loadSpecialBlock); + } + } + + private void addRole( + Arena arena, Role role, Map chances, Set playersToSet) { + String roleName = role.toString(); + // shuffling map to avoid the same roles for players on the next round + List> shuffledChances = new ArrayList<>(chances.entrySet()); + Collections.shuffle(shuffledChances); + // + Map sortedChances = + shuffledChances.stream() + .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) + .collect( + Collectors.toMap( + Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new)); + + Object[] sortedChancesUser = sortedChances.keySet().toArray(); + int amount = role == Role.MURDERER ? maxmurderer : maxdetectives; + for (int i = 0; i < amount; i++) { + if (i >= sortedChancesUser.length) break; + User user = (User) sortedChancesUser[i]; + Player userPlayer = user.getPlayer(); + arena.setCharacter(Arena.CharacterType.valueOf(roleName), userPlayer); + user.setStatistic("CONTRIBUTION_" + roleName, 1); + playersToSet.remove(userPlayer); + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_" + roleName) + .asKey() + .arena(arena) + .player(user.getPlayer()) + .sendPlayer(); + if (role == Role.MURDERER) { + arena.getMurdererList().add(userPlayer); + } else if (role == Role.DETECTIVE) { + arena.getDetectiveList().add(userPlayer); + userPlayer.getInventory().setHeldItemSlot(0); + ItemPosition.setItem(user, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); + ItemPosition.setItem( + userPlayer, + ItemPosition.INFINITE_ARROWS, + new ItemStack( + Material.ARROW, plugin.getConfig().getInt("Detective-Default-Arrows", 3))); + } + } + } + + private void getMaxRolesToSet(Arena arena) { + int playersSize = arena.getPlayers().size(); + arena + .getPlugin() + .getDebugger() + .debug( + "Before: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Configured: Detectives = {4}, Murders = {5}", + arena.getId(), + maxdetectives, + maxmurderer, + playersSize, + arena.getArenaOption("DETECTIVE_DIVIDER"), + arena.getArenaOption("MURDERER_DIVIDER")); + if (arena.getArenaOption("MURDERER_DIVIDER") > 1 + && playersSize > arena.getArenaOption("MURDERER_DIVIDER")) { + maxmurderer = (playersSize / arena.getArenaOption("MURDERER_DIVIDER")); + } + if (arena.getArenaOption("DETECTIVE_DIVIDER") > 1 + && playersSize > arena.getArenaOption("DETECTIVE_DIVIDER")) { + maxdetectives = (playersSize / arena.getArenaOption("DETECTIVE_DIVIDER")); + } + if (playersSize - (maxmurderer + maxdetectives) < 1) { + arena + .getPlugin() + .getDebugger() + .debug( + "{0} Murderers and detectives amount was reduced because there are not enough players", + arena.getId()); + // Make sure to have one innocent! + if (maxdetectives > 1) { + maxdetectives--; + } else if (maxmurderer > 1) { + maxmurderer--; + } + } + + arena + .getPlugin() + .getDebugger() + .debug( + "After: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Configured: Detectives = {4}, Murders = {5}", + arena.getId(), + maxdetectives, + maxmurderer, + playersSize, + arena.getArenaOption("DETECTIVE_DIVIDER"), + arena.getArenaOption("MURDERER_DIVIDER")); + } +} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/ArgumentsRegistry.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/ArgumentsRegistry.java index 6768b0a8..5ea75f93 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/ArgumentsRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/ArgumentsRegistry.java @@ -18,226 +18,27 @@ package plugily.projects.murdermystery.commands.arguments; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; - -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.string.StringMatcher; +import plugily.projects.minigamesbox.classic.commands.arguments.PluginArgumentsRegistry; import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.commands.arguments.admin.ListArenasArgument; import plugily.projects.murdermystery.commands.arguments.admin.RolePassArgument; -import plugily.projects.murdermystery.commands.arguments.admin.TeleportArgument; -import plugily.projects.murdermystery.commands.arguments.admin.arena.DeleteArgument; -import plugily.projects.murdermystery.commands.arguments.admin.arena.ForceStartArgument; -import plugily.projects.murdermystery.commands.arguments.admin.arena.ReloadArgument; import plugily.projects.murdermystery.commands.arguments.admin.arena.SpecialBlockRemoverArgument; -import plugily.projects.murdermystery.commands.arguments.admin.arena.StopArgument; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.commands.arguments.game.ArenaSelectorArgument; -import plugily.projects.murdermystery.commands.arguments.game.CreateArgument; -import plugily.projects.murdermystery.commands.arguments.game.JoinArguments; -import plugily.projects.murdermystery.commands.arguments.game.LeaderboardArgument; -import plugily.projects.murdermystery.commands.arguments.game.LeaveArgument; import plugily.projects.murdermystery.commands.arguments.game.RoleSelectorArgument; -import plugily.projects.murdermystery.commands.arguments.game.StatsArgument; -import plugily.projects.murdermystery.commands.completion.TabCompletion; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.setup.SetupInventory; -import plugily.projects.murdermystery.utils.Utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; /** * @author Plajer *

* Created at 11.01.2019 */ -public class ArgumentsRegistry implements CommandExecutor { - - private final Map> mappedArguments = new HashMap<>(); - private final Main plugin; - private final ChatManager chatManager; - private final TabCompletion tabCompletion; +public class ArgumentsRegistry extends PluginArgumentsRegistry { public ArgumentsRegistry(Main plugin) { - this.plugin = plugin; - chatManager = plugin.getChatManager(); - tabCompletion = new TabCompletion(this); - - Optional.ofNullable(plugin.getCommand("murdermystery")).ifPresent(mm -> { - mm.setExecutor(this); - mm.setTabCompleter(tabCompletion); - }); - Optional.ofNullable(plugin.getCommand("murdermysteryadmin")).ifPresent(mma -> { - mma.setExecutor(this); - mma.setTabCompleter(tabCompletion); - }); - + super(plugin); //register basic arugments - new ArenaSelectorArgument(this, chatManager); - new CreateArgument(this, chatManager); - new JoinArguments(this, chatManager); - new LeaderboardArgument(this, chatManager); - new LeaveArgument(this, chatManager); - new StatsArgument(this, chatManager); new RoleSelectorArgument(this); //register admin related arguments - new DeleteArgument(this, chatManager); - new ForceStartArgument(this); - new ListArenasArgument(this, chatManager); new SpecialBlockRemoverArgument(this); - new ReloadArgument(this, chatManager); - new StopArgument(this); - new TeleportArgument(this); - new RolePassArgument(this, chatManager); - } - - @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { - for(Map.Entry> entry : mappedArguments.entrySet()) { - if(cmd.getName().equalsIgnoreCase(entry.getKey())) { - if(cmd.getName().equalsIgnoreCase("murdermystery")) { - if(args.length == 0 || args[0].equalsIgnoreCase("help")) { - sendHelpCommand(sender); - return true; - } - if(args.length > 1 && args[1].equalsIgnoreCase("edit")) { - if(!checkSenderIsExecutorType(sender, CommandArgument.ExecutorType.PLAYER) - || !Utils.hasPermission(sender, "murdermystery.admin.create")) { - return true; - } - Arena arena = ArenaRegistry.getArena(args[0]); - if(arena == null) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.No-Arena-Like-That")); - return true; - } - - new SetupInventory(arena, (Player) sender).openInventory(); - return true; - } - } - if(cmd.getName().equalsIgnoreCase("murdermysteryadmin") && (args.length == 0 || args[0].equalsIgnoreCase("help"))) { - if(!sender.hasPermission("murdermystery.admin")) { - return true; - } - sendAdminHelpCommand(sender); - return true; - } - for(CommandArgument argument : entry.getValue()) { - if(argument.getArgumentName().equalsIgnoreCase(args[0])) { - //does it make sense that it is a list? - for(String perm : argument.getPermissions()) { - if(perm.isEmpty() || Utils.hasPermission(sender, perm)) { - break; - } - //user has no permission to execute command - return true; - } - if(checkSenderIsExecutorType(sender, argument.getValidExecutors())) { - argument.execute(sender, args); - } - //return true even if sender is not good executor or hasn't got permission - return true; - } - } - - //sending did you mean help - List matches = StringMatcher.match(args[0], mappedArguments.get(cmd.getName().toLowerCase()).stream().map(CommandArgument::getArgumentName).collect(Collectors.toList())); - if(!matches.isEmpty()) { - sender.sendMessage(chatManager.colorMessage("Commands.Did-You-Mean").replace("%command%", label + " " + matches.get(0).getMatch())); - return true; - } - } - } - return false; - } - - private boolean checkSenderIsExecutorType(CommandSender sender, CommandArgument.ExecutorType type) { - switch(type) { - case BOTH: - return sender instanceof ConsoleCommandSender || sender instanceof Player; - case CONSOLE: - return sender instanceof ConsoleCommandSender; - case PLAYER: - if(sender instanceof Player) { - return true; - } - sender.sendMessage(chatManager.colorMessage("Commands.Only-By-Player")); - return false; - default: - return false; - } - } - - private void sendHelpCommand(CommandSender sender) { - sender.sendMessage(chatManager.colorMessage("Commands.Main-Command.Header")); - sender.sendMessage(chatManager.colorMessage("Commands.Main-Command.Description")); - if(sender.hasPermission("murdermystery.admin")) { - sender.sendMessage(chatManager.colorMessage("Commands.Main-Command.Admin-Bonus-Description")); - } - sender.sendMessage(chatManager.colorMessage("Commands.Main-Command.Footer")); - } - - private void sendAdminHelpCommand(CommandSender sender) { - sender.sendMessage(ChatColor.GREEN + " " + ChatColor.BOLD + "Murder Mystery " + ChatColor.GRAY + plugin.getDescription().getVersion()); - sender.sendMessage(ChatColor.RED + " []" + ChatColor.GRAY + " = optional " + ChatColor.GOLD + "<>" + ChatColor.GRAY + " = required"); - if(sender instanceof Player) { - sender.sendMessage(ChatColor.GRAY + "Hover command to see more, click command to suggest it."); - } - List data = mappedArguments.get("murdermysteryadmin").stream().filter(arg -> arg instanceof LabeledCommandArgument) - .map(arg -> ((LabeledCommandArgument) arg).getLabelData()).collect(Collectors.toList()); - data.add(new LabelData("/mm &6&f edit", "/mm edit", - "&7Edit existing arena\n&6Permission: &7murdermystery.admin.edit")); - data.addAll(mappedArguments.get("murdermystery").stream().filter(arg -> arg instanceof LabeledCommandArgument) - .map(arg -> ((LabeledCommandArgument) arg).getLabelData()).collect(Collectors.toList())); - for(LabelData labelData : data) { - TextComponent component = new TextComponent(labelData.getText()); - component.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, labelData.getCommand())); - component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(labelData.getDescription()).create())); - VersionUtils.sendTextComponent(sender, component); - } - } - - /** - * Maps new argument to the main command - * - * @param mainCommand mother command ex. /mm - * @param argument argument to map ex. leave (for /mm leave) - */ - public void mapArgument(String mainCommand, CommandArgument argument) { - List args = mappedArguments.getOrDefault(mainCommand, new ArrayList<>()); - args.add(argument); - mappedArguments.put(mainCommand, args); - } - - public Map> getMappedArguments() { - return mappedArguments; - } - - public TabCompletion getTabCompletion() { - return tabCompletion; - } - - public Main getPlugin() { - return plugin; + new RolePassArgument(this); } } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/ListArenasArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/ListArenasArgument.java deleted file mode 100644 index 4c902ce4..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/ListArenasArgument.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.admin; - -import org.bukkit.command.CommandSender; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.handlers.ChatManager; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class ListArenasArgument { - - public ListArenasArgument(ArgumentsRegistry registry, ChatManager chatManager) { - registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("list", "murdermystery.admin.list", CommandArgument.ExecutorType.BOTH, - new LabelData("/mma list", "/mma list", "&7Shows list with all loaded arenas\n&6Permission: &7murdermystery.admin.list")) { - @Override - public void execute(CommandSender sender, String[] args) { - sender.sendMessage(chatManager.colorMessage("Commands.Admin-Commands.List-Command.Header")); - int i = 0; - for(Arena arena : ArenaRegistry.getArenas()) { - sender.sendMessage(chatManager.colorMessage("Commands.Admin-Commands.List-Command.Format").replace("%arena%", arena.getId()) - .replace("%status%", arena.getArenaState().getFormattedName()).replace("%players%", Integer.toString(arena.getPlayers().size())) - .replace("%maxplayers%", Integer.toString(arena.getMaximumPlayers()))); - i++; - } - if(i == 0) { - sender.sendMessage(chatManager.colorMessage("Commands.Admin-Commands.List-Command.No-Arenas")); - } - } - }); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java index afc92fbb..e750df17 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java @@ -4,15 +4,14 @@ import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import plugily.projects.commonsbox.number.NumberUtils; -import plugily.projects.murdermystery.api.StatsStorage; +import plugily.projects.minigamesbox.classic.commands.arguments.data.CommandArgument; +import plugily.projects.minigamesbox.classic.commands.arguments.data.LabelData; +import plugily.projects.minigamesbox.classic.commands.arguments.data.LabeledCommandArgument; +import plugily.projects.minigamesbox.classic.commonsbox.number.NumberUtils; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.user.User; /** * @author Tigerpanzer_02 @@ -21,19 +20,19 @@ */ public class RolePassArgument { - public RolePassArgument(ArgumentsRegistry registry, ChatManager chatManager) { + public RolePassArgument(ArgumentsRegistry registry) { registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("rolepass", "murdermystery.admin.rolepass", CommandArgument.ExecutorType.BOTH, new LabelData("/mma rolepass [player]", "/mma rolepass [player] ", "&7Add or remove rolepass\n&6Permission: &7murdermystery.admin.rolepass")) { @Override public void execute(CommandSender sender, String[] args) { if(args.length < 4) { - sender.sendMessage(chatManager.getPrefix() + ChatColor.RED + "Command: /mma rolepass [player]"); + sender.sendMessage(ChatColor.RED + "Command: /mma rolepass [player]"); return; } //add/remove String addOrRemove = args[1]; if(!addOrRemove.equalsIgnoreCase("add") && !addOrRemove.equalsIgnoreCase("remove") && !addOrRemove.equalsIgnoreCase("set")) { - sender.sendMessage(chatManager.getPrefix() + ChatColor.RED + "Command: /mma rolepass [player]"); + sender.sendMessage(ChatColor.RED + "Command: /mma rolepass [player]"); return; } String roleArg = args[2]; @@ -41,55 +40,55 @@ public void execute(CommandSender sender, String[] args) { try { role = Role.valueOf(roleArg.toUpperCase()); } catch(IllegalArgumentException exception) { - sender.sendMessage(chatManager.getPrefix() + ChatColor.RED + "Command: /mma rolepass [player]"); + sender.sendMessage(ChatColor.RED + "Command: /mma rolepass [player]"); return; } if(role != Role.MURDERER && role != Role.DETECTIVE) { - sender.sendMessage(chatManager.getPrefix() + ChatColor.RED + "Command: /mma rolepass [player]"); + sender.sendMessage(ChatColor.RED + "Command: /mma rolepass [player]"); return; } java.util.Optional opt = NumberUtils.parseInt(args[3]); if(!opt.isPresent()) { - sender.sendMessage(chatManager.getPrefix() + ChatColor.RED + "Command: /mma rolepass [player]"); + sender.sendMessage(ChatColor.RED + "Command: /mma rolepass [player]"); return; } int amount = opt.orElse(0); //player Player player = args.length == 5 ? Bukkit.getPlayerExact(args[4]) : (Player) sender; if(player == null) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Admin-Commands.Player-Not-Found")); + new MessageBuilder("COMMANDS_PLAYER_NOT_FOUND").asKey().send(sender); return; } User user = registry.getPlugin().getUserManager().getUser(player); switch(addOrRemove.toLowerCase()) { case "add": if(role == Role.MURDERER) { - user.addStat(StatsStorage.StatisticType.MURDERER_PASS, amount); + user.adjustStatistic("MURDERER_PASS", amount); } else { - user.addStat(StatsStorage.StatisticType.DETECTIVE_PASS, amount); + user.adjustStatistic("DETECTIVE_PASS", amount); } break; case "remove": if(role == Role.MURDERER) { - user.addStat(StatsStorage.StatisticType.MURDERER_PASS, -amount); + user.adjustStatistic("MURDERER_PASS", -amount); } else { - user.addStat(StatsStorage.StatisticType.DETECTIVE_PASS, -amount); + user.adjustStatistic("DETECTIVE_PASS", -amount); } break; case "set": if(role == Role.MURDERER) { - user.setStat(StatsStorage.StatisticType.MURDERER_PASS, amount); + user.setStatistic("MURDERER_PASS", amount); } else { - user.setStat(StatsStorage.StatisticType.DETECTIVE_PASS, amount); + user.setStatistic("DETECTIVE_PASS", amount); } break; default: break; } if(role == Role.MURDERER) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Role-Pass.Change").replace("%amount%", Integer.toString(user.getStat(StatsStorage.StatisticType.MURDERER_PASS))).replace("%role%", Role.MURDERER.name())); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_CHANGE").asKey().player(player).integer(user.getStatistic("MURDERER_PASS")).value(Role.MURDERER.name()).sendPlayer(); } else { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Role-Pass.Change").replace("%amount%", Integer.toString(user.getStat(StatsStorage.StatisticType.DETECTIVE_PASS))).replace("%role%", Role.DETECTIVE.name())); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_CHANGE").asKey().player(player).integer(user.getStatistic("DETECTIVE_PASS")).value(Role.DETECTIVE.name()).sendPlayer(); } } }); diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/SpectateArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/SpectateArgument.java deleted file mode 100644 index f5a1491b..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/SpectateArgument.java +++ /dev/null @@ -1,30 +0,0 @@ -package plugily.projects.murdermystery.commands.arguments.admin; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.user.User; - -/** - * @author Tigerpanzer_02 - *

- * Created at 30.06.2020 - */ - -public class SpectateArgument { - - public SpectateArgument(ArgumentsRegistry registry) { - registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("spectate", "murdermystery.admin.spectate", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mma spectate", "/mma spectate", "&7Enable/Disable permanent spectator mode\n&6Permission: &7murdermystery.admin.spectate")) { - @Override - public void execute(CommandSender sender, String[] args) { - User user = registry.getPlugin().getUserManager().getUser((Player) sender); - user.setPermanentSpectator(!user.isPermanentSpectator()); - } - }); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/TeleportArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/TeleportArgument.java deleted file mode 100644 index 3f204e49..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/TeleportArgument.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.admin; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; - -import java.util.Arrays; - -/** - * @author Tigerpanzer_02 - *

- * Created at 14.03.2021 - */ -public class TeleportArgument { - - public TeleportArgument(ArgumentsRegistry registry) { - registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("tp", "murdermystery.admin.teleport", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mma tp &6 ", "/mma tp ", - "&7Teleport you to provided arena location\n&7Valid locations:\n&7• LOBBY - lobby location\n&7• START - starting location\n" - + "&7• END - ending location\n&6Permission: &7murdermystery.admin.teleport")) { - @Override - public void execute(CommandSender sender, String[] args) { - if(args.length == 1) { - sender.sendMessage(registry.getPlugin().getChatManager().getPrefix() + registry.getPlugin().getChatManager().colorMessage("Commands.Type-Arena-Name")); - return; - } - if(args.length == 2) { - sender.sendMessage(registry.getPlugin().getChatManager().getPrefix() + ChatColor.RED + "Please type location type: " + Arrays.toString(LocationType.values()).replace("[", "").replace("]", "")); - return; - } - LocationType locType; - try { - locType = LocationType.valueOf(args[2].toUpperCase()); - } catch(IllegalArgumentException e) { - sender.sendMessage(registry.getPlugin().getChatManager().getPrefix() + ChatColor.RED + "Please type location type: " + Arrays.toString(LocationType.values()).replace("[", "").replace("]", "")); - return; - } - for(Arena arena : ArenaRegistry.getArenas()) { - if(arena.getId().equalsIgnoreCase(args[1])) { - teleport((Player) sender, arena, locType); - break; - } - } - } - }); - } - - private void teleport(Player player, Arena arena, LocationType locationType) { - switch(locationType) { - case LOBBY: - org.bukkit.Location lobby = arena.getLobbyLocation(); - if(lobby == null) { - player.sendMessage(ChatColor.RED + "Lobby location isn't set for this arena!"); - return; - } - player.teleport(lobby); - player.sendMessage(ChatColor.GRAY + "Teleported to LOBBY location from arena " + arena.getId()); - break; - case START: - if(arena.getLobbyLocation() == null) { - player.sendMessage(ChatColor.RED + "Start location isn't set for this arena!"); - return; - } - player.teleport(arena.getPlayerSpawnPoints().get(0)); - player.sendMessage(ChatColor.GRAY + "Teleported to START location from arena " + arena.getId()); - break; - case END: - if(arena.getLobbyLocation() == null) { - player.sendMessage(ChatColor.RED + "End location isn't set for this arena!"); - return; - } - arena.teleportToEndLocation(player); - player.sendMessage(ChatColor.GRAY + "Teleported to END location from arena " + arena.getId()); - break; - default: - break; //o.o - } - } - - public enum LocationType { - LOBBY, END, START - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/DeleteArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/DeleteArgument.java deleted file mode 100644 index 86f3d379..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/DeleteArgument.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.admin.arena; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.file.FileConfiguration; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.handlers.ChatManager; - -import java.util.HashSet; -import java.util.Set; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class DeleteArgument { - - private Set confirmations; - - public DeleteArgument(ArgumentsRegistry registry, ChatManager chatManager) { - registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("delete", "murdermystery.admin.delete", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mma delete &6", "/mma delete ", - "&7Deletes specified arena\n&6Permission: &7murdermystery.admin.delete")) { - @Override - public void execute(CommandSender sender, String[] args) { - if(args.length == 1) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Type-Arena-Name")); - return; - } - - Arena arena = ArenaRegistry.getArena(args[1]); - if(arena == null) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.No-Arena-Like-That")); - return; - } - - if (registry.getPlugin().getConfig().getBoolean("Deleting-Arena-Needs-Confirmation", true)) { - if (confirmations == null) - confirmations = new HashSet<>(); - - if(!confirmations.remove(sender)) { - confirmations.add(sender); - Bukkit.getScheduler().runTaskLater(registry.getPlugin(), () -> confirmations.remove(sender), 20 * 10); - sender.sendMessage(chatManager.getPrefix() + chatManager.colorRawMessage("&cAre you sure you want to do this action? Type the command again &6within 10 seconds &cto confirm!")); - return; - } - } - - ArenaManager.stopGame(true, arena); - - FileConfiguration config = ConfigUtils.getConfig(registry.getPlugin(), "arenas"); - config.set("instances." + args[1], null); - ConfigUtils.saveConfig(registry.getPlugin(), config, "arenas"); - - ArenaRegistry.unregisterArena(arena); - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Removed-Game-Instance")); - } - }); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/ForceStartArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/ForceStartArgument.java deleted file mode 100644 index c6796549..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/ForceStartArgument.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.admin.arena; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import plugily.projects.murdermystery.arena.ArenaUtils; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class ForceStartArgument { - - public ForceStartArgument(ArgumentsRegistry registry) { - registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("forcestart", "murdermystery.admin.forcestart", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mma forcestart", "/mma forcestart", "&7Force starts arena you're in\n&6Permission: &7murdermystery.admin.forcestart")) { - @Override - public void execute(CommandSender sender, String[] args) { - ArenaUtils.arenaForceStart((Player) sender); - } - }); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/ReloadArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/ReloadArgument.java deleted file mode 100644 index 29aafe4a..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/ReloadArgument.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.admin.arena; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import plugily.projects.commonsbox.minecraft.serialization.InventorySerializer; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.language.LanguageManager; -import plugily.projects.murdermystery.utils.Debugger; - -import java.util.HashSet; -import java.util.Set; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class ReloadArgument { - - private final Set confirmations = new HashSet<>(); - - public ReloadArgument(ArgumentsRegistry registry, ChatManager chatManager) { - registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("reload", "murdermystery.admin.reload", CommandArgument.ExecutorType.BOTH, - new LabelData("/mma reload", "/mma reload", "&7Reload all game arenas and configurations\n&7&lArenas will be stopped!\n&6Permission: &7murdermystery.admin.reload")) { - @Override - public void execute(CommandSender sender, String[] args) { - if(!confirmations.contains(sender)) { - confirmations.add(sender); - Bukkit.getScheduler().runTaskLater(registry.getPlugin(), () -> confirmations.remove(sender), 20 * 10); - sender.sendMessage(chatManager.getPrefix() + chatManager.colorRawMessage("&cAre you sure you want to do this action? Type the command again &6within 10 seconds &cto confirm!")); - return; - } - confirmations.remove(sender); - Debugger.debug("Initiated plugin reload by {0}", sender.getName()); - long start = System.currentTimeMillis(); - - registry.getPlugin().reloadConfig(); - LanguageManager.reloadConfig(); - - for(Arena arena : ArenaRegistry.getArenas()) { - Debugger.debug("[Reloader] Stopping {0} instance."); - long stopTime = System.currentTimeMillis(); - for(Player player : arena.getPlayers()) { - arena.doBarAction(Arena.BarAction.REMOVE, player); - arena.teleportToEndLocation(player); - if(registry.getPlugin().getConfigPreferences().getOption(ConfigPreferences.Option.INVENTORY_MANAGER_ENABLED)) { - InventorySerializer.loadInventory(registry.getPlugin(), player); - } else { - player.getInventory().clear(); - player.getInventory().setArmorContents(null); - player.getActivePotionEffects().forEach(pe -> player.removePotionEffect(pe.getType())); - player.setWalkSpeed(0.2f); - } - } - ArenaManager.stopGame(true, arena); - Debugger.debug("[Reloader] Instance {0} stopped took {1}ms", arena.getId(), System.currentTimeMillis() - stopTime); - } - ArenaRegistry.registerArenas(); - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Admin-Commands.Success-Reload")); - Debugger.debug("[Reloader] Finished reloading took {0}ms", System.currentTimeMillis() - start); - } - }); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java index 53f77620..67d654d2 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java @@ -25,73 +25,98 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.commands.arguments.data.CommandArgument; +import plugily.projects.minigamesbox.classic.commands.arguments.data.LabelData; +import plugily.projects.minigamesbox.classic.commands.arguments.data.LabeledCommandArgument; +import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; +import plugily.projects.minigamesbox.classic.utils.serialization.LocationSerializer; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; import plugily.projects.murdermystery.arena.special.SpecialBlock; import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; import java.util.ArrayList; import java.util.List; /** * @author Tigerpanzer_02 - *

- * Created at 22.10.2020 + *

Created at 22.10.2020 */ - public class SpecialBlockRemoverArgument { public SpecialBlockRemoverArgument(ArgumentsRegistry registry) { - registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("removeblock", "murdermystery.admin.removeblock", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mma removeblock", "/mma removeblock", "&7Removes the special block you are looking at \n&6Permission: &7murdermystery.admin.removeblock")) { - @Override - public void execute(CommandSender sender, String[] args) { - //no need for check as argument is only for players - Player player = (Player) sender; - Block targetBlock = player.getTargetBlock(null, 7); - if(targetBlock.getType() == Material.CAULDRON || targetBlock.getType() == XMaterial.ENCHANTING_TABLE.parseMaterial()) { - for(Arena arena : ArenaRegistry.getArenas()) { - //do not check arenas that could not be the case - if(arena.getSpecialBlocks().isEmpty()) { - continue; - } - if(arena.getPlayerSpawnPoints().get(0).getWorld() != player.getWorld()) { - continue; - } - //get all special blocks - for(SpecialBlock specialBlock : new ArrayList<>(arena.getSpecialBlocks())) { - //check if targetBlock is specialblock - if(specialBlock.getLocation().getBlock().equals(targetBlock)) { - //get special blocks from config - FileConfiguration config = ConfigUtils.getConfig(registry.getPlugin(), "arenas"); - //remove special block from arena - arena.getSpecialBlocks().remove(specialBlock); - //remove hologram - if(specialBlock.getArmorStandHologram() != null) { - specialBlock.getArmorStandHologram().delete(); + registry.mapArgument( + "murdermysteryadmin", + new LabeledCommandArgument( + "removeblock", + "murdermystery.admin.removeblock", + CommandArgument.ExecutorType.PLAYER, + new LabelData( + "/mma removeblock", + "/mma removeblock", + "&7Removes the special block you are looking at \n&6Permission: &7murdermystery.admin.removeblock")) { + @Override + public void execute(CommandSender sender, String[] args) { + // no need for check as argument is only for players + Player player = (Player) sender; + Block targetBlock = player.getTargetBlock(null, 7); + if (targetBlock.getType() == Material.CAULDRON + || targetBlock.getType() == XMaterial.ENCHANTING_TABLE.parseMaterial()) { + for (PluginArena arena : registry.getPlugin().getArenaRegistry().getArenas()) { + + Arena pluginArena = + (Arena) registry.getPlugin().getArenaRegistry().getArena(player); + if (arena == null) { + return; } - //remove special block from arena file - String path = targetBlock.getType() == Material.CAULDRON ? ".mystery-cauldrons" : ".confessionals"; - String serializedLoc = LocationSerializer.locationToString(specialBlock.getLocation()); - List specialBlocksType = config.getStringList("instances." + arena.getId() + path); - specialBlocksType.remove(serializedLoc); - config.set("instances." + arena.getId() + path, specialBlocksType); - //save arena config after removing special block - ConfigUtils.saveConfig(registry.getPlugin(), config, "arenas"); - player.sendMessage(ChatColor.RED + "Removed special block at loc " + serializedLoc + " from arena " + arena.getId()); - return; + // do not check arenas that could not be the case + if (pluginArena.getSpecialBlocks().isEmpty()) { + continue; + } + if (pluginArena.getPlayerSpawnPoints().get(0).getWorld() != player.getWorld()) { + continue; + } + // get all special blocks + for (SpecialBlock specialBlock : new ArrayList<>(pluginArena.getSpecialBlocks())) { + // check if targetBlock is specialblock + if (specialBlock.getLocation().getBlock().equals(targetBlock)) { + // get special blocks from config + FileConfiguration config = + ConfigUtils.getConfig(registry.getPlugin(), "arenas"); + // remove special block from arena + pluginArena.getSpecialBlocks().remove(specialBlock); + // remove hologram + if (specialBlock.getArmorStandHologram() != null) { + specialBlock.getArmorStandHologram().delete(); + } + // remove special block from arena file + String path = + targetBlock.getType() == Material.CAULDRON + ? ".mystery-cauldrons" + : ".confessionals"; + String serializedLoc = + LocationSerializer.locationToString(specialBlock.getLocation()); + List specialBlocksType = + config.getStringList("instances." + arena.getId() + path); + specialBlocksType.remove(serializedLoc); + config.set("instances." + arena.getId() + path, specialBlocksType); + // save arena config after removing special block + ConfigUtils.saveConfig(registry.getPlugin(), config, "arenas"); + + player.sendMessage( + ChatColor.RED + + "Removed special block at loc " + + serializedLoc + + " from arena " + + arena.getId()); + return; + } + } } } + player.sendMessage(ChatColor.RED + "Please target an special block to continue!"); } - } - player.sendMessage(ChatColor.RED + "Please target an special block to continue!"); - } - }); + }); } } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/StopArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/StopArgument.java deleted file mode 100644 index dd19c86b..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/StopArgument.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.admin.arena; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.ArenaState; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.utils.Utils; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class StopArgument { - - public StopArgument(ArgumentsRegistry registry) { - registry.mapArgument("murdermysteryadmin", new LabeledCommandArgument("stop", "murdermystery.admin.stop", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mma stop", "/mma stop", "&7Stops the arena you're in\n&7&lYou must be in target arena!\n&6Permission: &7murdermystery.admin.stop")) { - @Override - public void execute(CommandSender sender, String[] args) { - if(!Utils.checkIsInGameInstance((Player) sender)) { - return; - } - Arena arena = ArenaRegistry.getArena((Player) sender); - if(arena.getArenaState() != ArenaState.ENDING) { - ArenaManager.stopGame(true, arena); - //todo execute success command message - } - } - }); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/data/CommandArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/data/CommandArgument.java deleted file mode 100644 index 3dea8aac..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/data/CommandArgument.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.data; - -import org.bukkit.command.CommandSender; - -import java.util.Collections; -import java.util.List; - -/** - * @author Plajer - *

- * Created at 11.01.2019 - */ -public class CommandArgument { - - private final String argumentName; - private final List permissions; - private final ExecutorType validExecutors; - - public CommandArgument(String argumentName, String permissions, ExecutorType validExecutors) { - this.argumentName = argumentName; - this.permissions = Collections.singletonList(permissions); - this.validExecutors = validExecutors; - } - - public CommandArgument(String argumentName, List permissions, ExecutorType validExecutors) { - this.argumentName = argumentName; - this.permissions = permissions; - this.validExecutors = validExecutors; - } - - public String getArgumentName() { - return argumentName; - } - - public List getPermissions() { - return permissions; - } - - public ExecutorType getValidExecutors() { - return validExecutors; - } - - public void execute(CommandSender sender, String[] args) { - } - - public enum ExecutorType { - BOTH, CONSOLE, PLAYER - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/data/LabelData.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/data/LabelData.java deleted file mode 100644 index a2f51070..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/data/LabelData.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.data; - -import org.bukkit.plugin.java.JavaPlugin; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.handlers.ChatManager; - -/** - * @author Plajer - *

- * Created at 11.01.2019 - */ -public class LabelData { - - private final String text; - private String command; - private String description; - - public LabelData(String text, String command, String description) { - ChatManager chatManager = JavaPlugin.getPlugin(Main.class).getChatManager(); - this.text = chatManager.colorRawMessage(text); - this.command = command; - this.description = chatManager.colorRawMessage(description); - } - - public String getText() { - return text; - } - - public String getCommand() { - return command; - } - - public void setCommand(String command) { - this.command = command; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/data/LabeledCommandArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/data/LabeledCommandArgument.java deleted file mode 100644 index 026f96af..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/data/LabeledCommandArgument.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.data; - -import java.util.List; - -/** - * @author Plajer - *

- * Created at 11.01.2019 - */ -public class LabeledCommandArgument extends CommandArgument { - - private final LabelData labelData; - - public LabeledCommandArgument(String argumentName, List permissions, ExecutorType validExecutors, LabelData labelData) { - super(argumentName, permissions, validExecutors); - this.labelData = labelData; - } - - public LabeledCommandArgument(String argumentName, String permissions, ExecutorType validExecutors, LabelData labelData) { - super(argumentName, permissions, validExecutors); - this.labelData = labelData; - } - - /** - * @return label data of command (description and usages of command) - */ - public LabelData getLabelData() { - return labelData; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/ArenaSelectorArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/ArenaSelectorArgument.java deleted file mode 100644 index a1de1833..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/ArenaSelectorArgument.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.game; - -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.misc.stuff.ComplementAccessor; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.language.LanguageManager; -import plugily.projects.murdermystery.utils.Utils; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author 2Wild4You - *

- * Created at 09.08.2020 - */ -public class ArenaSelectorArgument implements Listener { - - private final ChatManager chatManager; - - private final Map arenaMappings = new HashMap<>(); - - public ArenaSelectorArgument(ArgumentsRegistry registry, ChatManager chatManager) { - this.chatManager = chatManager; - registry.getPlugin().getServer().getPluginManager().registerEvents(this, registry.getPlugin()); - registry.mapArgument("murdermystery", new LabeledCommandArgument("arenas", "murdermystery.arenas", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mm arenas", "/mm arenas", "&7Select an arena\n&6Permission: &7murdermystery.arenas")) { - @Override - public void execute(CommandSender sender, String[] args) { - if(ArenaRegistry.getArenas().size() == 0) { - sender.sendMessage(chatManager.colorMessage("Validator.No-Instances-Created")); - return; - } - - Player player = (Player) sender; - Inventory inventory = ComplementAccessor.getComplement().createInventory(player, Utils.serializeInt(ArenaRegistry.getArenas().size()), chatManager.colorMessage("Arena-Selector.Inv-Title")); - - int sloti = 0; - arenaMappings.clear(); - - for(Arena arena : ArenaRegistry.getArenas()) { - arenaMappings.put(sloti, arena); - ItemStack itemStack = XMaterial.matchXMaterial(registry.getPlugin().getConfig().getString("Arena-Selector.State-Item." + arena.getArenaState().getFormattedName(), "YELLOW_WOOL").toUpperCase()).orElse(XMaterial.YELLOW_WOOL).parseItem(); - if(itemStack == null) - continue; - - ItemMeta itemMeta = itemStack.getItemMeta(); - if(itemMeta != null) { - ComplementAccessor.getComplement().setDisplayName(itemMeta, formatItem(LanguageManager.getLanguageMessage("Arena-Selector.Item.Name"), arena)); - - java.util.List lore = LanguageManager.getLanguageList("Arena-Selector.Item.Lore"); - for(int a = 0; a < lore.size(); a++) { - lore.set(a, formatItem(lore.get(a), arena)); - } - - ComplementAccessor.getComplement().setLore(itemMeta, lore); - itemStack.setItemMeta(itemMeta); - } - inventory.addItem(itemStack); - sloti++; - } - player.openInventory(inventory); - } - }); - } - - private String formatItem(String string, Arena arena) { - String formatted = string; - formatted = StringUtils.replace(formatted, "%mapname%", arena.getMapName()); - int maxPlayers = arena.getMaximumPlayers(); - if(arena.getPlayers().size() >= maxPlayers) { - formatted = StringUtils.replace(formatted, "%state%", chatManager.colorMessage("Signs.Game-States.Full-Game")); - } else { - formatted = StringUtils.replace(formatted, "%state%", arena.getArenaState().getPlaceholder()); - } - formatted = StringUtils.replace(formatted, "%playersize%", Integer.toString(arena.getPlayers().size())); - formatted = StringUtils.replace(formatted, "%maxplayers%", Integer.toString(maxPlayers)); - formatted = chatManager.colorRawMessage(formatted); - return formatted; - } - - private String invTitle; - - @EventHandler - public void onArenaSelectorMenuClick(InventoryClickEvent e) { - if (invTitle == null) - invTitle = chatManager.colorMessage("Arena-Selector.Inv-Title"); - - if(!ComplementAccessor.getComplement().getTitle(e.getView()).equals(invTitle)) { - return; - } - ItemStack currentItem = e.getCurrentItem(); - if(currentItem == null || !currentItem.hasItemMeta()) { - return; - } - Player player = (Player) e.getWhoClicked(); - player.closeInventory(); - - Arena arena = arenaMappings.get(e.getRawSlot()); - if(arena != null) { - ArenaManager.joinAttempt(player, arena); - } else { - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.No-Arena-Like-That")); - } - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/CreateArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/CreateArgument.java index 7d0c196c..1b10cca7 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/CreateArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/CreateArgument.java @@ -27,15 +27,12 @@ import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; +import plugily.projects.murdermystery.old.arena.ArenaRegistry; import plugily.projects.murdermystery.arena.special.SpecialBlock; import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.setup.SetupInventory; +import plugily.projects.murdermystery.arguments.data.CommandArgument; +import plugily.projects.murdermystery.arguments.data.LabelData; +import plugily.projects.murdermystery.arguments.data.LabeledCommandArgument; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/JoinArguments.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/JoinArguments.java deleted file mode 100644 index ff3e23ca..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/JoinArguments.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.game; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.ArenaState; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.handlers.ChatManager; - -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class JoinArguments { - - public JoinArguments(ArgumentsRegistry registry, ChatManager chatManager) { - //join argument - registry.mapArgument("murdermystery", new CommandArgument("join", "", CommandArgument.ExecutorType.PLAYER) { - @Override - public void execute(CommandSender sender, String[] args) { - if(args.length == 1) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Type-Arena-Name")); - return; - } - - if(!ArenaRegistry.getArenas().isEmpty() && args[1].equalsIgnoreCase("maxplayers") && ArenaRegistry.getArena("maxplayers") == null) { - if(ArenaRegistry.getArenaPlayersOnline() == 0) { - ArenaManager.joinAttempt((Player) sender, ArenaRegistry.getArenas().get(ThreadLocalRandom.current().nextInt(ArenaRegistry.getArenas().size()))); - return; - } - - Map arenas = new HashMap<>(); - for(Arena arena : ArenaRegistry.getArenas()) { - arenas.put(arena, arena.getPlayers().size()); - } - - LinkedHashMap orderedArenas = new LinkedHashMap<>(); - arenas.entrySet() - .stream() - .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) - .forEachOrdered(x -> orderedArenas.put(x.getKey(), x.getValue())); - - if(!orderedArenas.isEmpty()) { - Arena arena = orderedArenas.keySet().stream().findFirst().get(); - ArenaManager.joinAttempt((Player) sender, arena); - return; - } - return; - } - - for(Arena arena : ArenaRegistry.getArenas()) { - if(args[1].equalsIgnoreCase(arena.getId())) { - ArenaManager.joinAttempt((Player) sender, arena); - return; - } - } - - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.No-Arena-Like-That")); - } - }); - - //random join argument, register only for multi arena - if(!registry.getPlugin().getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - registry.mapArgument("murdermystery", new CommandArgument("randomjoin", "", CommandArgument.ExecutorType.PLAYER) { - @Override - public void execute(CommandSender sender, String[] args) { - //check starting arenas -> random - List arenas = ArenaRegistry.getArenas().stream().filter(arena -> arena.getArenaState() == ArenaState.STARTING && arena.getPlayers().size() < arena.getMaximumPlayers()).collect(Collectors.toList()); - if(!arenas.isEmpty()) { - Arena arena = arenas.get(ThreadLocalRandom.current().nextInt(arenas.size())); - ArenaManager.joinAttempt((Player) sender, arena); - return; - } - //check waiting arenas -> random - arenas = ArenaRegistry.getArenas().stream().filter(arena -> (arena.getArenaState() == ArenaState.WAITING_FOR_PLAYERS || arena.getArenaState() == ArenaState.STARTING) - && arena.getPlayers().size() < arena.getMaximumPlayers()).collect(Collectors.toList()); - if(!arenas.isEmpty()) { - Arena arena = arenas.get(ThreadLocalRandom.current().nextInt(arenas.size())); - ArenaManager.joinAttempt((Player) sender, arena); - return; - } - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.No-Free-Arenas")); - } - }); - } - } -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaderboardArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaderboardArgument.java deleted file mode 100644 index dc8377f7..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaderboardArgument.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.game; - -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.CommandSender; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.completion.CompletableArgument; -import plugily.projects.murdermystery.handlers.ChatManager; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class LeaderboardArgument { - - private final ArgumentsRegistry registry; - private final ChatManager chatManager; - - public LeaderboardArgument(ArgumentsRegistry registry, ChatManager chatManager) { - this.registry = registry; - this.chatManager = chatManager; - - List stats = new ArrayList<>(); - for(StatsStorage.StatisticType value : StatsStorage.StatisticType.values()) { - if(value.isPersistent()) { - stats.add(value.name().toLowerCase()); - } - } - registry.getTabCompletion().registerCompletion(new CompletableArgument("murdermystery", "top", stats)); - registry.mapArgument("murdermystery", new CommandArgument("top", "", CommandArgument.ExecutorType.PLAYER) { - @Override - public void execute(CommandSender sender, String[] args) { - if(args.length == 1) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Statistics.Type-Name")); - return; - } - - StatsStorage.StatisticType statisticType; - - try { - statisticType = StatsStorage.StatisticType.valueOf(args[1].toUpperCase()); - } catch(IllegalArgumentException e) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Statistics.Invalid-Name")); - return; - } - - if(!statisticType.isPersistent()) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Statistics.Invalid-Name")); - return; - } - - printLeaderboard(sender, statisticType); - } - }); - } - - private void printLeaderboard(CommandSender sender, StatsStorage.StatisticType statisticType) { - java.util.Map stats = StatsStorage.getStats(statisticType); - - sender.sendMessage(chatManager.colorMessage("Commands.Statistics.Header")); - - String statistic = StringUtils.capitalize(statisticType.toString().toLowerCase().replace('_', ' ')); - UUID[] array = stats.keySet().toArray(new UUID[0]); - - for(int i = 1; i <= 10; i++) { - if (array.length - i < 0) { - sender.sendMessage(formatMessage(statistic, "Empty", i, 0)); - } else { - UUID current = array[array.length - i]; - String name = registry.getPlugin().getUserManager().getDatabase().getPlayerName(current); - if (name == null) { - name = "Unknown Player"; - } - sender.sendMessage(formatMessage(statistic, name, i, stats.get(current))); - } - } - } - - private String formatMessage(String statisticName, String playerName, int position, int value) { - String message = chatManager.colorMessage("Commands.Statistics.Format"); - message = StringUtils.replace(message, "%position%", Integer.toString(position)); - message = StringUtils.replace(message, "%name%", playerName); - message = StringUtils.replace(message, "%value%", Integer.toString(value)); - message = StringUtils.replace(message, "%statistic%", statisticName); - return message; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaveArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaveArgument.java deleted file mode 100644 index b4acec92..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/LeaveArgument.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.game; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.utils.Debugger; -import plugily.projects.murdermystery.utils.Utils; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class LeaveArgument { - - public LeaveArgument(ArgumentsRegistry registry, ChatManager chatManager) { - registry.mapArgument("murdermystery", new CommandArgument("leave", "", CommandArgument.ExecutorType.PLAYER) { - @Override - public void execute(CommandSender sender, String[] args) { - if(!registry.getPlugin().getConfig().getBoolean("Disable-Leave-Command")) { - Player player = (Player) sender; - if(!Utils.checkIsInGameInstance(player)) { - return; - } - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Teleported-To-The-Lobby", player)); - if(registry.getPlugin().getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - registry.getPlugin().getBungeeManager().connectToHub(player); - Debugger.debug("{0} was teleported to the Hub server", player.getName()); - return; - } - Arena arena = ArenaRegistry.getArena(player); - ArenaManager.leaveAttempt(player, arena); - Debugger.debug("{0} has left the arena {1}! Teleported to end location.", player.getName(), arena.getId()); - } - } - }); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java index b770b564..0c9fd1c2 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java @@ -3,21 +3,18 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.Listener; -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.item.ItemBuilder; -import plugily.projects.inventoryframework.gui.GuiItem; -import plugily.projects.inventoryframework.gui.type.ChestGui; -import plugily.projects.inventoryframework.pane.OutlinePane; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; +import plugily.projects.minigamesbox.classic.PluginMain; +import plugily.projects.minigamesbox.classic.commands.arguments.data.CommandArgument; +import plugily.projects.minigamesbox.classic.commands.arguments.data.LabelData; +import plugily.projects.minigamesbox.classic.commands.arguments.data.LabeledCommandArgument; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; +import plugily.projects.minigamesbox.inventory.common.item.SimpleClickableItem; +import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.commands.arguments.data.LabelData; -import plugily.projects.murdermystery.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.murdermystery.handlers.language.LanguageManager; -import plugily.projects.murdermystery.user.User; -import plugily.projects.murdermystery.utils.Utils; import java.util.stream.Collectors; @@ -30,50 +27,45 @@ public RoleSelectorArgument(ArgumentsRegistry registry) { public void execute(CommandSender sender, String[] args) { Player player = (Player) sender; - if(Utils.checkIsInGameInstance(player)) { + if(registry.getPlugin().getBukkitHelper().checkIsInGameInstance(player)) { openRolePassMenu(player, registry.getPlugin()); } } }); } - public static void openRolePassMenu(Player player, Main plugin) { - int rows = Utils.serializeInt(Role.values().length) / 9; - ChestGui gui = new ChestGui(rows, plugin.getChatManager().colorMessage("In-Game.Role-Pass.Menu-Name")); - gui.setOnGlobalClick(event -> event.setCancelled(true)); - OutlinePane pane = new OutlinePane(9, rows); - gui.addPane(pane); + public static void openRolePassMenu(Player player, PluginMain plugin) { + NormalFastInv gui = new NormalFastInv(plugin.getBukkitHelper().serializeInt(Role.values().length), new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_NAME").asKey().build()); - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.IRON_SWORD.parseMaterial()) - .name(plugin.getChatManager().colorMessage("In-Game.Role-Pass.Role.Murderer.Name")) - .lore(LanguageManager.getLanguageList("In-Game.Role-Pass.Role.Murderer.Lore").stream().map(string -> string.replace("%amount%", Integer.toString(plugin.getUserManager().getUser(player).getStat(StatsStorage.StatisticType.DETECTIVE_PASS)))).collect(Collectors.toList())) + gui.addItem(new SimpleClickableItem(new ItemBuilder(XMaterial.IRON_SWORD.parseMaterial()) + .name(new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_NAME").asKey().build()) + .lore(plugin.getLanguageManager().getLanguageListFromKey("IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_LORE").stream().map(string -> string.replace("%amount%", plugin.getUserManager().getUser(player).getStatistic("DETECTIVE_PASS") + "")).collect(Collectors.toList())) .build(), event -> { - event.setCancelled(true); User user = plugin.getUserManager().getUser(player); - if(user.getStat(StatsStorage.StatisticType.MURDERER_PASS) <= 0) { - player.sendMessage(plugin.getChatManager().getPrefix() + plugin.getChatManager().colorMessage("In-Game.Role-Pass.Fail").replace("%role%", Role.MURDERER.name())); + if(user.getStatistic("MURDERER_PASS") <= 0) { + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_FAIL").asKey().player(player).value(Role.MURDERER.name()).sendPlayer(); return; } - user.addStat(StatsStorage.StatisticType.MURDERER_PASS, -1); - user.addStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, 999); - player.sendMessage(plugin.getChatManager().getPrefix() + plugin.getChatManager().colorMessage("In-Game.Role-Pass.Success").replace("%role%", Role.MURDERER.name())); + user.adjustStatistic("MURDERER_PASS", -1); + user.adjustStatistic("CONTRIBUTION_MURDERER", 999); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_SUCCESS").asKey().player(player).value(Role.MURDERER.name()).sendPlayer(); })); - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.BOW.parseMaterial()) - .name(plugin.getChatManager().colorMessage("In-Game.Role-Pass.Role.Detective.Name")) - .lore(LanguageManager.getLanguageList("In-Game.Role-Pass.Role.Detective.Lore").stream().map(string -> string.replace("%amount%", Integer.toString(plugin.getUserManager().getUser(player).getStat(StatsStorage.StatisticType.DETECTIVE_PASS)))).collect(Collectors.toList())) + gui.addItem(new SimpleClickableItem(new ItemBuilder(XMaterial.BOW.parseMaterial()) + .name(new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_NAME").asKey().build()) + .lore(plugin.getLanguageManager().getLanguageListFromKey("IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_LORE").stream().map(string -> string.replace("%amount%", plugin.getUserManager().getUser(player).getStatistic("DETECTIVE_PASS") + "")).collect(Collectors.toList())) .build(), event -> { - event.setCancelled(true); User user = plugin.getUserManager().getUser(player); - if(user.getStat(StatsStorage.StatisticType.DETECTIVE_PASS) <= 0) { - player.sendMessage(plugin.getChatManager().getPrefix() + plugin.getChatManager().colorMessage("In-Game.Role-Pass.Fail").replace("%role%", Role.DETECTIVE.name())); + if(user.getStatistic("DETECTIVE_PASS") <= 0) { + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_FAIL").asKey().player(player).value(Role.DETECTIVE.name()).sendPlayer(); return; } - user.addStat(StatsStorage.StatisticType.DETECTIVE_PASS, -1); - user.addStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, 999); - player.sendMessage(plugin.getChatManager().getPrefix() + plugin.getChatManager().colorMessage("In-Game.Role-Pass.Success").replace("%role%", Role.DETECTIVE.name())); + user.adjustStatistic("DETECTIVE_PASS", -1); + user.adjustStatistic("CONTRIBUTION_DETECTIVE", 999); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_SUCCESS").asKey().player(player).value(Role.DETECTIVE.name()).sendPlayer(); })); - gui.show(player); + + gui.open(player); } } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/StatsArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/StatsArgument.java deleted file mode 100644 index f905dad1..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/StatsArgument.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.game; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.user.User; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class StatsArgument { - - public StatsArgument(ArgumentsRegistry registry, ChatManager chatManager) { - registry.mapArgument("murdermystery", new CommandArgument("stats", "", CommandArgument.ExecutorType.PLAYER) { - @Override - public void execute(@NotNull CommandSender sender, String[] args) { - Player player = args.length == 2 ? Bukkit.getPlayerExact(args[1]) : (Player) sender; - if(player == null) { - sender.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Commands.Admin-Commands.Player-Not-Found")); - return; - } - if(player.equals(sender)) { - sender.sendMessage(chatManager.colorMessage("Commands.Stats-Command.Header", player)); - } else { - sender.sendMessage(chatManager.colorMessage("Commands.Stats-Command.Header-Other", player).replace("%player%", player.getName())); - } - User user = registry.getPlugin().getUserManager().getUser(player); - sender.sendMessage(chatManager.colorMessage("Commands.Stats-Command.Kills", player) + user.getStat(StatsStorage.StatisticType.KILLS)); - sender.sendMessage(chatManager.colorMessage("Commands.Stats-Command.Deaths", player) + user.getStat(StatsStorage.StatisticType.DEATHS)); - sender.sendMessage(chatManager.colorMessage("Commands.Stats-Command.Wins", player) + user.getStat(StatsStorage.StatisticType.WINS)); - sender.sendMessage(chatManager.colorMessage("Commands.Stats-Command.Loses", player) + user.getStat(StatsStorage.StatisticType.LOSES)); - sender.sendMessage(chatManager.colorMessage("Commands.Stats-Command.Games-Played", player) + user.getStat(StatsStorage.StatisticType.GAMES_PLAYED)); - sender.sendMessage(chatManager.colorMessage("Commands.Stats-Command.Highest-Score", player) + user.getStat(StatsStorage.StatisticType.HIGHEST_SCORE)); - sender.sendMessage(chatManager.colorMessage("Commands.Stats-Command.Footer", player)); - } - }); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/completion/CompletableArgument.java b/src/main/java/plugily/projects/murdermystery/commands/completion/CompletableArgument.java deleted file mode 100644 index 70276c51..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/completion/CompletableArgument.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.completion; - -import java.util.List; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class CompletableArgument { - - private final String mainCommand; - private final String argument; - private final List completions; - - public CompletableArgument(String mainCommand, String argument, List completions) { - this.mainCommand = mainCommand; - this.argument = argument; - this.completions = completions; - } - - /** - * @return main command of the argument - */ - public String getMainCommand() { - return mainCommand; - } - - /** - * @return argument name - */ - public String getArgument() { - return argument; - } - - /** - * @return all possible completions for this command argument - */ - public List getCompletions() { - return completions; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/commands/completion/TabCompletion.java b/src/main/java/plugily/projects/murdermystery/commands/completion/TabCompletion.java deleted file mode 100644 index 659f02bc..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/completion/TabCompletion.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.completion; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.commands.arguments.data.CommandArgument; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author Plajer - *

- * Created at 05.08.2018 - */ -public class TabCompletion implements TabCompleter { - - private final List registeredCompletions = new ArrayList<>(); - private final ArgumentsRegistry registry; - - public TabCompletion(ArgumentsRegistry registry) { - this.registry = registry; - } - - public void registerCompletion(CompletableArgument completion) { - registeredCompletions.add(completion); - } - - @Override - public List onTabComplete(CommandSender sender, Command cmd, String label, String[] args) { - List cmds = new ArrayList<>(); - - if(cmd.getName().equalsIgnoreCase("murdermysteryadmin")) { - if(args.length == 1) { - cmds.addAll(registry.getMappedArguments().get("murdermysteryadmin").stream().map(CommandArgument::getArgumentName) - .collect(Collectors.toList())); - } else if(args.length == 2 && args[0].equalsIgnoreCase("delete")) { - cmds.addAll(ArenaRegistry.getArenas().stream().map(Arena::getId).collect(Collectors.toList())); - } - } - - if(cmd.getName().equalsIgnoreCase("murdermystery")) { - if(args.length == 2 && args[0].equalsIgnoreCase("join")) { - cmds.addAll(ArenaRegistry.getArenas().stream().map(Arena::getId).collect(Collectors.toList())); - } else if(args.length == 1) { - cmds.addAll(registry.getMappedArguments().get("murdermystery").stream().map(CommandArgument::getArgumentName) - .collect(Collectors.toList())); - } - } - - // Completes the player names - if(cmds.isEmpty()) { - for(CompletableArgument completion : registeredCompletions) { - if(!cmd.getName().equalsIgnoreCase(completion.getMainCommand()) || !completion.getArgument().equalsIgnoreCase(args[0])) { - continue; - } - return completion.getCompletions(); - } - - return null; - } - - return cmds; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/events/ChatEvents.java b/src/main/java/plugily/projects/murdermystery/events/ChatEvents.java deleted file mode 100644 index 34fdb1e6..00000000 --- a/src/main/java/plugily/projects/murdermystery/events/ChatEvents.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.events; - -import me.clip.placeholderapi.PlaceholderAPI; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.handlers.language.LanguageManager; -import plugily.projects.murdermystery.user.User; - -import java.util.regex.Pattern; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class ChatEvents implements Listener { - - private final Main plugin; - private final String[] regexChars = {"$", "\\"}; - - public ChatEvents(Main plugin) { - this.plugin = plugin; - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @EventHandler(ignoreCancelled = true) - public void onChatIngame(AsyncPlayerChatEvent event) { - Arena arena = ArenaRegistry.getArena(event.getPlayer()); - if(arena == null) { - if(!plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DISABLE_SEPARATE_CHAT)) { - for(Arena loopArena : ArenaRegistry.getArenas()) { - for(Player player : loopArena.getPlayers()) { - event.getRecipients().remove(player); - } - } - } - return; - } - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.CHAT_FORMAT_ENABLED)) { - String eventMessage = event.getMessage(); - for(String regexChar : regexChars) { - if(eventMessage.contains(regexChar)) { - eventMessage = eventMessage.replaceAll(Pattern.quote(regexChar), ""); - } - } - String message = formatChatPlaceholders(LanguageManager.getLanguageMessage("In-Game.Game-Chat-Format"), plugin.getUserManager().getUser(event.getPlayer()), eventMessage); - if(!plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DISABLE_SEPARATE_CHAT)) { - event.setCancelled(true); - boolean dead = !arena.getPlayersLeft().contains(event.getPlayer()); - for(Player player : arena.getPlayers()) { - if(dead && arena.getPlayersLeft().contains(player)) { - continue; - } - if(dead) { - String prefix = formatChatPlaceholders(LanguageManager.getLanguageMessage("In-Game.Game-Death-Format"), plugin.getUserManager().getUser(event.getPlayer()), null); - player.sendMessage(prefix + message); - } else { - player.sendMessage(message); - } - } - Bukkit.getConsoleSender().sendMessage(message); - } else { - event.setMessage(message); - } - } - } - - private String formatChatPlaceholders(String message, User user, String saidMessage) { - String formatted = message; - formatted = plugin.getChatManager().colorRawMessage(formatted); - formatted = StringUtils.replace(formatted, "%player%", user.getPlayer().getName()); - formatted = StringUtils.replace(formatted, "%message%", ChatColor.stripColor(saidMessage)); - if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { - formatted = PlaceholderAPI.setPlaceholders(user.getPlayer(), formatted); - } - return formatted; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/events/Events.java b/src/main/java/plugily/projects/murdermystery/events/Events.java deleted file mode 100644 index 5f8e38fe..00000000 --- a/src/main/java/plugily/projects/murdermystery/events/Events.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.events; - -import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.ItemFrame; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Painting; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.FoodLevelChangeEvent; -import org.bukkit.event.hanging.HangingBreakByEntityEvent; -import org.bukkit.event.player.PlayerArmorStandManipulateEvent; -import org.bukkit.event.player.PlayerBedEnterEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.weather.WeatherChangeEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.EulerAngle; -import org.bukkit.util.Vector; - -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.minecraft.compat.events.api.CBPlayerInteractEvent; -import plugily.projects.commonsbox.minecraft.compat.events.api.CBPlayerSwapHandItemsEvent; -import plugily.projects.commonsbox.minecraft.compat.xseries.XSound; -import plugily.projects.commonsbox.minecraft.hologram.HologramManager; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.ArenaState; -import plugily.projects.murdermystery.arena.ArenaUtils; -import plugily.projects.murdermystery.arena.role.Role; -import plugily.projects.murdermystery.commands.arguments.game.RoleSelectorArgument; -import plugily.projects.murdermystery.handlers.items.SpecialItemManager; -import plugily.projects.murdermystery.user.User; -import plugily.projects.murdermystery.utils.Utils; - -/** - * @author Plajer - *

- * Created at 05.08.2018 - */ -public class Events implements Listener { - - private final Main plugin; - - public Events(Main plugin) { - this.plugin = plugin; - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @EventHandler - public void onItemSwap(CBPlayerSwapHandItemsEvent e) { - if(ArenaRegistry.isInArena(e.getPlayer())) { - e.setCancelled(true); - } - } - - @EventHandler - public void onDrop(PlayerDropItemEvent event) { - if(ArenaRegistry.isInArena(event.getPlayer())) { - event.setCancelled(true); - } - } - - @EventHandler - public void onSwordThrow(PlayerInteractEvent e) { - if(e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK || e.getAction() == Action.PHYSICAL) { - return; - } - Arena arena = ArenaRegistry.getArena(e.getPlayer()); - if(arena == null) { - return; - } - if(!Role.isRole(Role.MURDERER, e.getPlayer(), arena)) { - return; - } - Player attacker = e.getPlayer(); - if(VersionUtils.getItemInHand(attacker).getType() != plugin.getConfigPreferences().getMurdererSword().getType()) { - return; - } - User attackerUser = plugin.getUserManager().getUser(attacker); - if(attackerUser.getCooldown("sword_shoot") > 0) { - return; - } - - int swordFlyCooldown = plugin.getConfig().getInt("Murderer-Sword-Fly-Cooldown", 5); - - attackerUser.setCooldown("sword_shoot", swordFlyCooldown); - - if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_10_R1)) { - attackerUser.setCooldown("sword_attack", (plugin.getConfig().getInt("Murderer-Sword-Attack-Cooldown", 1))); - } else { - attacker.setCooldown(plugin.getConfigPreferences().getMurdererSword().getType(), 20 * (plugin.getConfig().getInt("Murderer-Sword-Attack-Cooldown", 1))); - } - - createFlyingSword(arena, attacker, attackerUser); - Utils.applyActionBarCooldown(attacker, swordFlyCooldown); - } - - private void createFlyingSword(Arena arena, Player attacker, User attackerUser) { - Location loc = attacker.getLocation(); - Vector vec = loc.getDirection(); - vec.normalize().multiply(plugin.getConfig().getDouble("Murderer-Sword-Speed", 0.65)); - Location standStart = Utils.rotateAroundAxisY(new Vector(1.0D, 0.0D, 0.0D), loc.getYaw()).toLocation(attacker.getWorld()).add(loc); - standStart.setYaw(loc.getYaw()); - ArmorStand stand = (ArmorStand) attacker.getWorld().spawnEntity(standStart, EntityType.ARMOR_STAND); - stand.setVisible(false); - if(ServerVersion.Version.isCurrentHigher(ServerVersion.Version.v1_8_R3)) { - stand.setInvulnerable(true); - stand.setSilent(true); - } - - VersionUtils.setItemInHand(stand, plugin.getConfigPreferences().getMurdererSword()); - - stand.setRightArmPose(new EulerAngle(Math.toRadians(350.0), Math.toRadians(loc.getPitch() * -1.0), Math.toRadians(90.0))); - VersionUtils.setCollidable(stand, false); - - stand.setGravity(false); - stand.setRemoveWhenFarAway(true); - - if(ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_8_R3)) { - stand.setMarker(true); - } - - Location initialise = Utils.rotateAroundAxisY(new Vector(-0.8D, 1.45D, 0.0D), loc.getYaw()).toLocation(attacker.getWorld()).add(standStart).add(Utils.rotateAroundAxisY(Utils.rotateAroundAxisX(new Vector(0.0D, 0.0D, 1.0D), loc.getPitch()), loc.getYaw())); - int maxRange = plugin.getConfig().getInt("Murderer-Sword-Fly-Range", 20); - double maxHitRange = plugin.getConfig().getDouble("Murderer-Sword-Fly-Hit-Range", 0.5); - new BukkitRunnable() { - @Override - public void run() { - stand.teleport(standStart.add(vec)); - initialise.add(vec); - initialise.getWorld().getNearbyEntities(initialise, maxHitRange, maxHitRange, maxHitRange).forEach(entity -> { - if(entity instanceof Player) { - Player victim = (Player) entity; - if(ArenaRegistry.isInArena(victim) && !plugin.getUserManager().getUser(victim).isSpectator() && !victim.equals(attacker)) { - killBySword(arena, attackerUser, victim); - cancel(); - stand.remove(); - } - } - }); - if(loc.distance(initialise) > maxRange || initialise.getBlock().getType().isSolid()) { - cancel(); - stand.remove(); - } - } - }.runTaskTimer(plugin, 0, 1); - } - - private void killBySword(Arena arena, User attackerUser, Player victim) { - Arena victimArena = ArenaRegistry.getArena(victim); - - //check if victim is murderer - if(Role.isRole(Role.MURDERER, victim, victimArena)) { - return; - } - XSound.ENTITY_PLAYER_DEATH.play(victim.getLocation(), 50, 1); - victim.damage(100.0); - VersionUtils.sendTitles(victim, plugin.getChatManager().colorMessage("In-Game.Messages.Game-End-Messages.Titles.Died", victim), - plugin.getChatManager().colorMessage("In-Game.Messages.Game-End-Messages.Subtitles.Murderer-Killed-You", victim), 5, 40, 5); - attackerUser.addStat(StatsStorage.StatisticType.LOCAL_KILLS, 1); - attackerUser.addStat(StatsStorage.StatisticType.KILLS, 1); - ArenaUtils.addScore(attackerUser, ArenaUtils.ScoreAction.KILL_PLAYER, 0); - if(Role.isRole(Role.ANY_DETECTIVE, victim, victimArena) && arena.lastAliveDetective()) { - if(Role.isRole(Role.FAKE_DETECTIVE, victim, victimArena)) { - arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); - } - ArenaUtils.dropBowAndAnnounce(arena, victim); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onCommandExecute(PlayerCommandPreprocessEvent event) { - Arena arena = ArenaRegistry.getArena(event.getPlayer()); - if(arena == null) { - return; - } - if(!plugin.getConfig().getBoolean("Block-Commands-In-Game", true)) { - return; - } - - if(event.getPlayer().isOp() || event.getPlayer().hasPermission("murdermystery.admin") || event.getPlayer().hasPermission("murdermystery.command.bypass")) { - return; - } - - String command = event.getMessage().substring(1); - int index = command.indexOf(' '); - command = (index >= 0 ? command.substring(0, index) : command); - for(String msg : plugin.getConfig().getStringList("Whitelisted-Commands")) { - if(command.equalsIgnoreCase(msg)) { - return; - } - } - - if(command.equalsIgnoreCase("mm") || command.equalsIgnoreCase("murdermystery") - || event.getMessage().contains("murdermysteryadmin") || event.getMessage().contains("leave") - || command.equalsIgnoreCase("stats") || command.equalsIgnoreCase("mma")) { - return; - } - event.setCancelled(true); - event.getPlayer().sendMessage(plugin.getChatManager().getPrefix() + plugin.getChatManager().colorMessage("In-Game.Only-Command-Ingame-Is-Leave")); - } - - @EventHandler - public void onInGameInteract(PlayerInteractEvent event) { - if (event.getClickedBlock() == null || ArenaRegistry.getArena(event.getPlayer()) == null) { - return; - } - - org.bukkit.Material type = event.getClickedBlock().getType(); - - if(type == XMaterial.PAINTING.parseMaterial() || type == XMaterial.FLOWER_POT.parseMaterial()) { - event.setCancelled(true); - } - } - - @EventHandler - public void onWeatherChange(WeatherChangeEvent event) { - for (Arena arena : ArenaRegistry.getArenas()) { - if (arena.getArenaState() != ArenaState.WAITING_FOR_PLAYERS && !arena.getPlayerSpawnPoints().isEmpty() - && arena.getPlayerSpawnPoints().get(0).getWorld() == event.getWorld()) { - event.setCancelled(true); - break; - } - } - } - - @EventHandler - public void onInGameBedEnter(PlayerBedEnterEvent event) { - if(ArenaRegistry.isInArena(event.getPlayer())) { - event.setCancelled(true); - } - } - - @EventHandler - public void onSpecialItem(CBPlayerInteractEvent event) { - if(event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.PHYSICAL) { - return; - } - Arena arena = ArenaRegistry.getArena(event.getPlayer()); - if (arena == null) - return; - - ItemStack itemStack = VersionUtils.getItemInHand(event.getPlayer()); - if(!Utils.isNamed(itemStack)) { - return; - } - String key = plugin.getSpecialItemManager().getRelatedSpecialItem(itemStack).getName(); - if(key == null) { - return; - } - if(key.equalsIgnoreCase(SpecialItemManager.SpecialItems.ROLE_PASS.getName())) { - event.setCancelled(true); - RoleSelectorArgument.openRolePassMenu(event.getPlayer(), plugin); - return; - } - if(key.equalsIgnoreCase(SpecialItemManager.SpecialItems.FORCESTART.getName())) { - event.setCancelled(true); - ArenaUtils.arenaForceStart(event.getPlayer()); - return; - } - if(key.equals(SpecialItemManager.SpecialItems.LOBBY_LEAVE_ITEM.getName()) || key.equals(SpecialItemManager.SpecialItems.SPECTATOR_LEAVE_ITEM.getName())) { - event.setCancelled(true); - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - plugin.getBungeeManager().connectToHub(event.getPlayer()); - } else { - ArenaManager.leaveAttempt(event.getPlayer(), arena); - } - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onFoodLevelChange(FoodLevelChangeEvent event) { - if(event.getEntity().getType() == EntityType.PLAYER && ArenaRegistry.isInArena((Player) event.getEntity())) { - event.setFoodLevel(20); - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - //highest priority to fully protect our game - public void onBlockBreakEvent(BlockBreakEvent event) { - if(ArenaRegistry.isInArena(event.getPlayer())) { - event.setCancelled(true); - return; - } - if(event.getBlock().getType() != XMaterial.ARMOR_STAND.parseMaterial()) { - return; - } - - HologramManager.getArmorStands().removeIf(armorStand -> { - boolean isSameType = armorStand.getLocation().getBlock().getType() == event.getBlock().getType(); - if(isSameType) { - armorStand.remove(); - armorStand.setCustomNameVisible(false); - } - return isSameType; - }); - } - - @EventHandler(priority = EventPriority.HIGH) - //highest priority to fully protect our game - public void onBuild(BlockPlaceEvent event) { - if(ArenaRegistry.isInArena(event.getPlayer())) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - //highest priority to fully protect our game - public void onHangingBreakEvent(HangingBreakByEntityEvent event) { - if(event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) { - if(event.getRemover() instanceof Player && ArenaRegistry.isInArena((Player) event.getRemover())) { - event.setCancelled(true); - return; - } - if(!(event.getRemover() instanceof Arrow)) { - return; - } - Arrow arrow = (Arrow) event.getRemover(); - if(arrow.getShooter() instanceof Player && ArenaRegistry.isInArena((Player) arrow.getShooter())) { - event.setCancelled(true); - } - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onArmorStandDestroy(EntityDamageByEntityEvent e) { - if(!(e.getEntity() instanceof LivingEntity)) { - return; - } - LivingEntity livingEntity = (LivingEntity) e.getEntity(); - if(livingEntity.getType() != EntityType.ARMOR_STAND) { - return; - } - if((e.getDamager() instanceof Arrow && ((Arrow) e.getDamager()).getShooter() instanceof Player && ArenaRegistry.isInArena((Player) ((Arrow) e.getDamager()).getShooter())) - || (e.getDamager() instanceof Player && ArenaRegistry.isInArena((Player) e.getDamager()))) { - e.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onInteractWithArmorStand(PlayerArmorStandManipulateEvent event) { - if(ArenaRegistry.isInArena(event.getPlayer())) { - event.setCancelled(true); - } - } - - @EventHandler - public void onCraft(PlayerInteractEvent event) { - if(!ArenaRegistry.isInArena(event.getPlayer())) { - return; - } - if(event.getPlayer().getTargetBlock(null, 7).getType() == XMaterial.CRAFTING_TABLE.parseMaterial()) { - event.setCancelled(true); - } - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/events/JoinEvent.java b/src/main/java/plugily/projects/murdermystery/events/JoinEvent.java deleted file mode 100644 index 595aaec7..00000000 --- a/src/main/java/plugily/projects/murdermystery/events/JoinEvent.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.events; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; - -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.minecraft.serialization.InventorySerializer; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.handlers.PermissionsManager; -import plugily.projects.murdermystery.utils.UpdateChecker; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class JoinEvent implements Listener { - - private final Main plugin; - - public JoinEvent(Main plugin) { - this.plugin = plugin; - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @EventHandler - public void onLogin(PlayerLoginEvent e) { - if(!plugin.getServer().hasWhitelist() && !plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED) - || e.getResult() != PlayerLoginEvent.Result.KICK_WHITELIST) { - return; - } - if(e.getPlayer().hasPermission(PermissionsManager.getJoinFullGames())) { - e.setResult(PlayerLoginEvent.Result.ALLOWED); - } - } - - @EventHandler - public void onJoin(PlayerJoinEvent event) { - //Load statistics first - plugin.getUserManager().loadStatistics(plugin.getUserManager().getUser(event.getPlayer())); - //Teleport to lobby on bungee mode - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - ArenaRegistry.getArenas().get(ArenaRegistry.getBungeeArena()).teleportToLobby(event.getPlayer()); - return; - } - for(Player player : plugin.getServer().getOnlinePlayers()) { - if(ArenaRegistry.getArena(player) == null) { - continue; - } - VersionUtils.hidePlayer(plugin, player, event.getPlayer()); - VersionUtils.hidePlayer(plugin, event.getPlayer(), player); - } - //load player inventory in case of server crash, file is deleted once loaded so if file was already - //deleted player won't receive his backup, in case of crash he will get it back - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.INVENTORY_MANAGER_ENABLED)) { - InventorySerializer.loadInventory(plugin, event.getPlayer()); - } - } - - @EventHandler - public void onJoinCheckVersion(final PlayerJoinEvent event) { - if(!plugin.getConfig().getBoolean("Update-Notifier.Enabled", true) || !event.getPlayer().hasPermission("murdermystery.updatenotify")) { - return; - } - //we want to be the first :) - Bukkit.getScheduler().runTaskLater(plugin, () -> UpdateChecker.init(plugin, 66614).requestUpdateCheck().whenComplete((result, exception) -> { - if(!result.requiresUpdate()) { - return; - } - if(result.getNewestVersion().contains("b")) { - event.getPlayer().sendMessage(""); - event.getPlayer().sendMessage(ChatColor.BOLD + "MURDER MYSTERY UPDATE NOTIFY"); - event.getPlayer().sendMessage(ChatColor.RED + "BETA version of software is ready for update! Proceed with caution."); - event.getPlayer().sendMessage(ChatColor.YELLOW + "Current version: " + ChatColor.RED + plugin.getDescription().getVersion() + ChatColor.YELLOW + " Latest version: " + ChatColor.GREEN + result.getNewestVersion()); - } else { - event.getPlayer().sendMessage(""); - event.getPlayer().sendMessage(ChatColor.BOLD + "MURDER MYSTERY UPDATE NOTIFY"); - event.getPlayer().sendMessage(ChatColor.GREEN + "Software is ready for update! Download it to keep with latest changes and fixes."); - event.getPlayer().sendMessage(ChatColor.YELLOW + "Current version: " + ChatColor.RED + plugin.getDescription().getVersion() + ChatColor.YELLOW + " Latest version: " + ChatColor.GREEN + result.getNewestVersion()); - } - }), 25); - } -} diff --git a/src/main/java/plugily/projects/murdermystery/events/LobbyEvent.java b/src/main/java/plugily/projects/murdermystery/events/LobbyEvent.java deleted file mode 100644 index bcfff911..00000000 --- a/src/main/java/plugily/projects/murdermystery/events/LobbyEvent.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.events; - -import org.bukkit.Material; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.ItemFrame; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.FoodLevelChangeEvent; -import org.bukkit.event.hanging.HangingBreakByEntityEvent; -import org.bukkit.event.player.PlayerInteractEntityEvent; - -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.ArenaState; - -/** - * @author Plajer - *

- * Created at 05.08.2018 - */ -public class LobbyEvent implements Listener { - - public LobbyEvent(Main plugin) { - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onFoodLose(FoodLevelChangeEvent event) { - if(event.getEntity().getType() != EntityType.PLAYER) { - return; - } - Arena arena = ArenaRegistry.getArena((Player) event.getEntity()); - if(arena != null && (arena.getArenaState() == ArenaState.STARTING || arena.getArenaState() == ArenaState.WAITING_FOR_PLAYERS)) { - event.setCancelled(true); - } - } - - @EventHandler - public void onLobbyDamage(EntityDamageEvent event) { - if(event.getEntity().getType() != EntityType.PLAYER) { - return; - } - Player player = (Player) event.getEntity(); - Arena arena = ArenaRegistry.getArena(player); - if(arena == null || arena.getArenaState() == ArenaState.IN_GAME) { - return; - } - event.setCancelled(true); - player.setFireTicks(0); - player.setHealth(VersionUtils.getMaxHealth(player)); - } - - @EventHandler - public void onItemFrameRotate(PlayerInteractEntityEvent event) { - Arena arena = ArenaRegistry.getArena(event.getPlayer()); - if(arena == null || arena.getArenaState() == ArenaState.IN_GAME) { - return; - } - - if(event.getRightClicked() instanceof ItemFrame && ((ItemFrame) event.getRightClicked()).getItem().getType() != Material.AIR) { - event.setCancelled(true); - } - } - - @EventHandler - public void onHangingBreak(HangingBreakByEntityEvent event) { - if(event.getEntity().getType() != EntityType.PLAYER) { - return; - } - - Arena arena = ArenaRegistry.getArena((Player) event.getEntity()); - if(arena == null || arena.getArenaState() == ArenaState.IN_GAME) { - return; - } - - event.setCancelled(true); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java new file mode 100644 index 00000000..ff604b3a --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java @@ -0,0 +1,238 @@ +/* + * MurderMystery - Find the murderer, kill him and survive! + * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package plugily.projects.murdermystery.events; + +import org.bukkit.Location; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.EulerAngle; +import org.bukkit.util.Vector; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.version.ServerVersion; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XSound; +import plugily.projects.murdermystery.Main; +import plugily.projects.murdermystery.arena.Arena; +import plugily.projects.murdermystery.arena.ArenaUtils; +import plugily.projects.murdermystery.arena.role.Role; + +/** + * @author Plajer + *

Created at 05.08.2018 + */ +public class PluginEvents implements Listener { + + private final Main plugin; + + public PluginEvents(Main plugin) { + this.plugin = plugin; + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @EventHandler + public void onSwordThrow(PlayerInteractEvent event) { + if (event.getAction() == Action.LEFT_CLICK_AIR + || event.getAction() == Action.LEFT_CLICK_BLOCK + || event.getAction() == Action.PHYSICAL) { + return; + } + Player attacker = event.getPlayer(); + Arena arena = (Arena) plugin.getArenaRegistry().getArena(attacker); + if (arena == null) { + return; + } + + User attackerUser = plugin.getUserManager().getUser(attacker); + if (!Role.isRole(Role.MURDERER, attackerUser, arena)) { + return; + } + + if (VersionUtils.getItemInHand(attacker).getType() + != plugin.getConfigPreferences().getMurdererSword().getType()) { + return; + } + if (attackerUser.getCooldown("sword_shoot") > 0) { + return; + } + + int swordFlyCooldown = plugin.getConfig().getInt("Murderer-Sword-Fly-Cooldown", 5); + + attackerUser.setCooldown("sword_shoot", swordFlyCooldown); + + if (ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_10_R1)) { + attackerUser.setCooldown( + "sword_attack", (plugin.getConfig().getInt("Murderer-Sword-Attack-Cooldown", 1))); + } else { + attacker.setCooldown( + plugin.getConfigPreferences().getMurdererSword().getType(), + 20 * (plugin.getConfig().getInt("Murderer-Sword-Attack-Cooldown", 1))); + } + + createFlyingSword(arena, attacker, attackerUser); + plugin.getBukkitHelper().applyActionBarCooldown(attacker, swordFlyCooldown); + } + + private void createFlyingSword(Arena arena, Player attacker, User attackerUser) { + Location loc = attacker.getLocation(); + Vector vec = loc.getDirection(); + vec.normalize().multiply(plugin.getConfig().getDouble("Murderer-Sword-Speed", 0.65)); + Location standStart = + plugin + .getBukkitHelper() + .rotateAroundAxisY(new Vector(1.0D, 0.0D, 0.0D), loc.getYaw()) + .toLocation(attacker.getWorld()) + .add(loc); + standStart.setYaw(loc.getYaw()); + ArmorStand stand = + (ArmorStand) attacker.getWorld().spawnEntity(standStart, EntityType.ARMOR_STAND); + stand.setVisible(false); + if (ServerVersion.Version.isCurrentHigher(ServerVersion.Version.v1_8_R3)) { + stand.setInvulnerable(true); + stand.setSilent(true); + } + + VersionUtils.setItemInHand(stand, plugin.getConfigPreferences().getMurdererSword()); + + stand.setRightArmPose( + new EulerAngle( + Math.toRadians(350.0), Math.toRadians(loc.getPitch() * -1.0), Math.toRadians(90.0))); + VersionUtils.setCollidable(stand, false); + + stand.setGravity(false); + stand.setRemoveWhenFarAway(true); + + if (ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_8_R3)) { + stand.setMarker(true); + } + + Location initialise = + plugin + .getBukkitHelper() + .rotateAroundAxisY(new Vector(-0.8D, 1.45D, 0.0D), loc.getYaw()) + .toLocation(attacker.getWorld()) + .add(standStart) + .add( + plugin.getBukkitHelper().rotateAroundAxisY( + plugin.getBukkitHelper().rotateAroundAxisX(new Vector(0.0D, 0.0D, 1.0D), loc.getPitch()), + loc.getYaw())); + int maxRange = plugin.getConfig().getInt("Murderer-Sword-Fly-Range", 20); + double maxHitRange = plugin.getConfig().getDouble("Murderer-Sword-Fly-Hit-Range", 0.5); + new BukkitRunnable() { + @Override + public void run() { + stand.teleport(standStart.add(vec)); + initialise.add(vec); + initialise + .getWorld() + .getNearbyEntities(initialise, maxHitRange, maxHitRange, maxHitRange) + .forEach( + entity -> { + if (entity instanceof Player) { + Player victim = (Player) entity; + Arena arena = (Arena) plugin.getArenaRegistry().getArena(victim); + if (arena == null) { + return; + } + if (!plugin.getUserManager().getUser(victim).isSpectator() + && !victim.equals(attacker)) { + killBySword(arena, attackerUser, victim); + cancel(); + stand.remove(); + } + } + }); + if (loc.distance(initialise) > maxRange || initialise.getBlock().getType().isSolid()) { + cancel(); + stand.remove(); + } + } + }.runTaskTimer(plugin, 0, 1); + } + + private void killBySword(Arena arena, User attackerUser, Player victim) { + Arena victimArena = (Arena) plugin.getArenaRegistry().getArena(victim); + if (arena == null) { + return; + } + User user = plugin.getUserManager().getUser(victim); + + // check if victim is murderer + if (Role.isRole(Role.MURDERER, user, victimArena)) { + return; + } + XSound.ENTITY_PLAYER_DEATH.play(victim.getLocation(), 50, 1); + victim.damage(100.0); + attackerUser.adjustStatistic("LOCAL_KILLS", 1); + attackerUser.adjustStatistic("KILLS", 1); + ArenaUtils.addScore(attackerUser, ArenaUtils.ScoreAction.KILL_PLAYER, 0); + if (Role.isRole(Role.ANY_DETECTIVE, user, victimArena) && arena.lastAliveDetective()) { + if (Role.isRole(Role.FAKE_DETECTIVE, user, victimArena)) { + arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); + } + ArenaUtils.dropBowAndAnnounce(arena, victim); + } + } + + @EventHandler(priority = EventPriority.HIGH) + // highest priority to fully protect our game + public void onBlockBreakEvent(BlockBreakEvent event) { + Arena arena = (Arena) plugin.getArenaRegistry().getArena(event.getPlayer()); + if (arena == null) { + event.setCancelled(true); + return; + } + if (event.getBlock().getType() != XMaterial.ARMOR_STAND.parseMaterial()) { + return; + } + + plugin + .getHologramManager() + .getArmorStands() + .removeIf( + armorStand -> { + boolean isSameType = + armorStand.getLocation().getBlock().getType() == event.getBlock().getType(); + if (isSameType) { + armorStand.remove(); + armorStand.setCustomNameVisible(false); + } + return isSameType; + }); + } + + @EventHandler(priority = EventPriority.HIGH) + // highest priority to fully protect our game + public void onBuild(BlockPlaceEvent event) { + Arena arena = (Arena) plugin.getArenaRegistry().getArena(event.getPlayer()); + if (arena == null) { + return; + } + event.setCancelled(true); + } +} diff --git a/src/main/java/plugily/projects/murdermystery/events/QuitEvent.java b/src/main/java/plugily/projects/murdermystery/events/QuitEvent.java deleted file mode 100644 index 0cf12515..00000000 --- a/src/main/java/plugily/projects/murdermystery/events/QuitEvent.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.events; - -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerKickEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; - -/** - * @author Plajer - *

- * Created at 05.08.2018 - */ -public class QuitEvent implements Listener { - - private final Main plugin; - - public QuitEvent(Main plugin) { - this.plugin = plugin; - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @EventHandler - public void onQuit(PlayerQuitEvent event) { - onQuit(event.getPlayer()); - } - - @EventHandler - public void onKick(PlayerKickEvent event) { - onQuit(event.getPlayer()); - } - - private void onQuit(Player player) { - Arena arena = ArenaRegistry.getArena(player); - if(arena != null) { - ArenaManager.leaveAttempt(player, arena); - } - plugin.getUserManager().removeUser(plugin.getUserManager().getUser(player)); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorEvents.java b/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorEvents.java deleted file mode 100644 index 032bdafc..00000000 --- a/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorEvents.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.events.spectator; - -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageByBlockEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; -import org.bukkit.event.entity.FoodLevelChangeEvent; -import org.bukkit.event.player.PlayerBucketEmptyEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerInteractEntityEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerItemConsumeEvent; -import org.bukkit.event.player.PlayerShearEntityEvent; - -import plugily.projects.commonsbox.minecraft.compat.events.api.CBEntityPickupItemEvent; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; - -/** - * @author Plajer - *

- * Created at 05.08.2018 - */ -public class SpectatorEvents implements Listener { - - private final Main plugin; - - public SpectatorEvents(Main plugin) { - this.plugin = plugin; - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onSpectatorTarget(EntityTargetEvent e) { - if(!(e.getTarget() instanceof Player)) { - return; - } - if(plugin.getUserManager().getUser((Player) e.getTarget()).isSpectator()) { - e.setCancelled(true); - e.setTarget(null); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onSpectatorTarget(EntityTargetLivingEntityEvent e) { - if(!(e.getTarget() instanceof Player)) { - return; - } - if(plugin.getUserManager().getUser((Player) e.getTarget()).isSpectator()) { - e.setCancelled(true); - e.setTarget(null); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onBlockPlace(BlockPlaceEvent event) { - if(plugin.getUserManager().getUser(event.getPlayer()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onBlockBreak(BlockBreakEvent event) { - if(plugin.getUserManager().getUser(event.getPlayer()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onDropItem(PlayerDropItemEvent event) { - if(plugin.getUserManager().getUser(event.getPlayer()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onBucketEmpty(PlayerBucketEmptyEvent event) { - if(plugin.getUserManager().getUser(event.getPlayer()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onInteract(PlayerInteractEntityEvent event) { - if(plugin.getUserManager().getUser(event.getPlayer()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onShear(PlayerShearEntityEvent event) { - if(plugin.getUserManager().getUser(event.getPlayer()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onConsume(PlayerItemConsumeEvent event) { - if(plugin.getUserManager().getUser(event.getPlayer()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onFoodLevelChange(FoodLevelChangeEvent event) { - if(event.getEntityType() == EntityType.PLAYER && plugin.getUserManager().getUser((Player) event.getEntity()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onDamage(EntityDamageEvent event) { - if(event.getEntityType() != EntityType.PLAYER) { - return; - } - - Player player = (Player) event.getEntity(); - - if(!plugin.getUserManager().getUser(player).isSpectator()) { - return; - } - - Arena playerArena = ArenaRegistry.getArena(player); - if (playerArena == null) - return; - - if(player.getLocation().getY() < 1) { - player.teleport(playerArena.getPlayerSpawnPoints().get(0)); - event.setDamage(0); - } - event.setCancelled(true); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onDamageByBlock(EntityDamageByBlockEvent event) { - if(event.getEntityType() == EntityType.PLAYER && plugin.getUserManager().getUser((Player) event.getEntity()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onDamageByEntity(EntityDamageByEntityEvent event) { - if(event.getDamager() instanceof Player && plugin.getUserManager().getUser((Player) event.getDamager()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPickup(CBEntityPickupItemEvent event) { - if(event.getEntity() instanceof Player && plugin.getUserManager().getUser((Player) event.getEntity()).isSpectator()) { - event.setCancelled(true); - } - } - - @EventHandler - public void onRightClick(PlayerInteractEvent event) { - if(ArenaRegistry.isInArena(event.getPlayer()) && plugin.getUserManager().getUser(event.getPlayer()).isSpectator()) { - event.setCancelled(true); - } - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorItemEvents.java b/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorItemEvents.java deleted file mode 100644 index 8f1440e7..00000000 --- a/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorItemEvents.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.events.spectator; - -import plugily.projects.commonsbox.minecraft.item.ItemUtils; -import plugily.projects.commonsbox.minecraft.misc.stuff.ComplementAccessor; -import plugily.projects.commonsbox.number.NumberUtils; -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.minecraft.compat.events.api.CBPlayerInteractEvent; -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.inventoryframework.gui.GuiItem; -import plugily.projects.inventoryframework.gui.type.ChestGui; -import plugily.projects.inventoryframework.pane.OutlinePane; -import org.apache.commons.lang.StringUtils; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.SkullMeta; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.role.Role; -import plugily.projects.murdermystery.handlers.items.SpecialItemManager; -import plugily.projects.murdermystery.utils.Utils; - -import java.util.ArrayList; - -/** - * @author Plajer - *

- * Created at 05.08.2018 - */ -public class SpectatorItemEvents implements Listener { - - private final Main plugin; - private final SpectatorSettingsMenu spectatorSettingsMenu; - - public SpectatorItemEvents(Main plugin) { - this.plugin = plugin; - plugin.getServer().getPluginManager().registerEvents(this, plugin); - spectatorSettingsMenu = new SpectatorSettingsMenu(plugin, plugin.getChatManager().colorMessage("In-Game.Spectator.Settings-Menu.Inventory-Name"), - plugin.getChatManager().colorMessage("In-Game.Spectator.Settings-Menu.Speed-Name")); - } - - @EventHandler - public void onSpectatorItemClick(CBPlayerInteractEvent e) { - if(e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK || e.getAction() == Action.PHYSICAL) { - return; - } - Arena arena = ArenaRegistry.getArena(e.getPlayer()); - ItemStack stack = VersionUtils.getItemInHand(e.getPlayer()); - if(arena == null || !ItemUtils.isItemStackNamed(stack)) { - return; - } - if(plugin.getSpecialItemManager().getRelatedSpecialItem(stack).getName().equals(SpecialItemManager.SpecialItems.PLAYERS_LIST.getName())) { - e.setCancelled(true); - openSpectatorMenu(e.getPlayer(), arena); - } else if(plugin.getSpecialItemManager().getRelatedSpecialItem(stack).getName().equals(SpecialItemManager.SpecialItems.SPECTATOR_OPTIONS.getName())) { - e.setCancelled(true); - spectatorSettingsMenu.openSpectatorSettingsMenu(e.getPlayer()); - } else if(plugin.getSpecialItemManager().getRelatedSpecialItem(stack).getName().equals(SpecialItemManager.SpecialItems.SPECTATOR_LEAVE_ITEM.getName())) { - e.setCancelled(true); - ArenaManager.leaveAttempt(e.getPlayer(), arena); - } - } - - private void openSpectatorMenu(Player player, Arena arena) { - int rows = Utils.serializeInt(arena.getPlayers().size()) / 9; - ChestGui gui = new ChestGui(rows, plugin.getChatManager().colorMessage("In-Game.Spectator.Spectator-Menu-Name")); - OutlinePane pane = new OutlinePane(9, rows); - gui.addPane(pane); - - ItemStack skull = XMaterial.PLAYER_HEAD.parseItem(); - - for(Player arenaPlayer : arena.getPlayers()) { - if(plugin.getUserManager().getUser(arenaPlayer).isSpectator()) { - continue; - } - //Get the raw role message and replace old placeholder, we don't want to do this inside the for loop. - String roleRaw = plugin.getChatManager().colorMessage("In-Game.Spectator.Target-Player-Role", arenaPlayer); - roleRaw = StringUtils.replace(roleRaw, "%ROLE%", "%role%"); - ItemStack cloneSkull = skull.clone(); - SkullMeta meta = VersionUtils.setPlayerHead(arenaPlayer, (SkullMeta) cloneSkull.getItemMeta()); - ComplementAccessor.getComplement().setDisplayName(meta, arenaPlayer.getName()); - - ArrayList lore = new ArrayList<>(); - - lore.add(plugin.getChatManager().colorMessage("In-Game.Spectator.Target-Player-Health") - .replace("%health%", Double.toString(NumberUtils.round(arenaPlayer.getHealth(), 2)))); - String role = roleRaw; - if(Role.isRole(Role.MURDERER, player, arena)) { - role = StringUtils.replace(role, "%role%", plugin.getChatManager().colorMessage("Scoreboard.Roles.Murderer")); - } else if(Role.isRole(Role.ANY_DETECTIVE, player, arena)) { - role = StringUtils.replace(role, "%role%", plugin.getChatManager().colorMessage("Scoreboard.Roles.Detective")); - } else { - role = StringUtils.replace(role, "%role%", plugin.getChatManager().colorMessage("Scoreboard.Roles.Innocent")); - } - lore.add(role); - ComplementAccessor.getComplement().setLore(meta, lore); - cloneSkull.setItemMeta(meta); - pane.addItem(new GuiItem(cloneSkull, e -> { - e.setCancelled(true); - e.getWhoClicked().sendMessage(plugin.getChatManager().formatMessage(arena, plugin.getChatManager().colorMessage("Commands.Admin-Commands.Teleported-To-Player"), arenaPlayer)); - e.getWhoClicked().closeInventory(); - e.getWhoClicked().teleport(arenaPlayer); - })); - } - gui.show(player); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorSettingsMenu.java b/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorSettingsMenu.java deleted file mode 100644 index e8156ec4..00000000 --- a/src/main/java/plugily/projects/murdermystery/events/spectator/SpectatorSettingsMenu.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.events.spectator; - -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.item.ItemBuilder; -import plugily.projects.commonsbox.minecraft.misc.stuff.ComplementAccessor; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.handlers.ChatManager; - -/** - * @author Plajer - *

- * Created at 06.04.2019 - */ -public class SpectatorSettingsMenu implements Listener { - - private final String inventoryName; - private final String speedOptionName; - private final Main plugin; - private final Inventory inv; - - public SpectatorSettingsMenu(Main plugin, String inventoryName, String speedOptionName) { - this.inventoryName = inventoryName; - this.speedOptionName = speedOptionName; - (this.plugin = plugin).getServer().getPluginManager().registerEvents(this, plugin); - this.inv = initInventory(); - } - - public void openSpectatorSettingsMenu(Player player) { - player.openInventory(this.inv); - } - - @EventHandler - public void onSpectatorMenuClick(InventoryClickEvent e) { - if(!ComplementAccessor.getComplement().getTitle(e.getView()).equals(plugin.getChatManager().colorRawMessage(inventoryName))) { - return; - } - org.bukkit.inventory.ItemStack currentItem = e.getCurrentItem(); - if(currentItem == null || !currentItem.hasItemMeta()) { - return; - } - Player p = (Player) e.getWhoClicked(); - p.closeInventory(); - - switch(currentItem.getType()) { - case LEATHER_BOOTS: - p.removePotionEffect(PotionEffectType.SPEED); - p.setFlySpeed(0.15f); - p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 0, false, false)); - break; - case CHAINMAIL_BOOTS: - p.removePotionEffect(PotionEffectType.SPEED); - p.setFlySpeed(0.2f); - p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 1, false, false)); - break; - case IRON_BOOTS: - p.removePotionEffect(PotionEffectType.SPEED); - p.setFlySpeed(0.25f); - p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 2, false, false)); - break; - case GOLDEN_BOOTS: - p.removePotionEffect(PotionEffectType.SPEED); - p.setFlySpeed(0.3f); - p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 3, false, false)); - break; - case DIAMOND_BOOTS: - p.removePotionEffect(PotionEffectType.SPEED); - p.setFlySpeed(0.35f); - p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 4, false, false)); - break; - default: - break; - } - } - - private Inventory initInventory() { - Inventory inv = ComplementAccessor.getComplement().createInventory(null, 9 * 3, inventoryName); - ChatManager chatManager = plugin.getChatManager(); - inv.setItem(11, new ItemBuilder(Material.LEATHER_BOOTS) - .name(chatManager.colorRawMessage(speedOptionName + " I")).build()); - inv.setItem(12, new ItemBuilder(Material.CHAINMAIL_BOOTS) - .name(chatManager.colorRawMessage(speedOptionName + " II")).build()); - inv.setItem(13, new ItemBuilder(Material.IRON_BOOTS) - .name(chatManager.colorRawMessage(speedOptionName + " III")).build()); - inv.setItem(14, new ItemBuilder(XMaterial.GOLDEN_BOOTS.parseItem()) - .name(chatManager.colorRawMessage(speedOptionName + " IV")).build()); - inv.setItem(15, new ItemBuilder(Material.DIAMOND_BOOTS) - .name(chatManager.colorRawMessage(speedOptionName + " V")).build()); - return inv; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/BungeeManager.java b/src/main/java/plugily/projects/murdermystery/handlers/BungeeManager.java deleted file mode 100644 index d58e7857..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/BungeeManager.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers; - -import com.google.common.io.ByteArrayDataOutput; -import com.google.common.io.ByteStreams; - -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.server.ServerListPingEvent; - -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.misc.stuff.ComplementAccessor; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.ArenaState; - -import java.util.EnumMap; -import java.util.Map; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class BungeeManager implements Listener { - - private final Main plugin; - private final Map gameStateToString = new EnumMap<>(ArenaState.class); - private final String motd; - private final FileConfiguration bungee; - - public BungeeManager(Main plugin) { - this.plugin = plugin; - bungee = ConfigUtils.getConfig(plugin, "bungee"); - - ChatManager chatManager = plugin.getChatManager(); - - gameStateToString.put(ArenaState.WAITING_FOR_PLAYERS, chatManager.colorRawMessage(bungee.getString("MOTD.Game-States.Inactive", "Inactive"))); - gameStateToString.put(ArenaState.STARTING, chatManager.colorRawMessage(bungee.getString("MOTD.Game-States.Starting", "Starting"))); - gameStateToString.put(ArenaState.IN_GAME, chatManager.colorRawMessage(bungee.getString("MOTD.Game-States.In-Game", "In-Game"))); - gameStateToString.put(ArenaState.ENDING, chatManager.colorRawMessage(bungee.getString("MOTD.Game-States.Ending", "Ending"))); - gameStateToString.put(ArenaState.RESTARTING, chatManager.colorRawMessage(bungee.getString("MOTD.Game-States.Restarting", "Restarting"))); - motd = chatManager.colorRawMessage(bungee.getString("MOTD.Message", "The actual game state of mm is %state%")); - plugin.getServer().getMessenger().registerOutgoingPluginChannel(plugin, "BungeeCord"); - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - public void connectToHub(Player player) { - if(!plugin.isEnabled() || !bungee.getBoolean("Connect-To-Hub", true)) { - return; - } - ByteArrayDataOutput out = ByteStreams.newDataOutput(); - out.writeUTF("Connect"); - out.writeUTF(bungee.getString("Hub")); - player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray()); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onServerListPing(ServerListPingEvent event) { - if(ArenaRegistry.getArenas().isEmpty() || !bungee.getBoolean("MOTD.Manager")) { - return; - } - Arena arena = ArenaRegistry.getArenas().get(ArenaRegistry.getBungeeArena()); - event.setMaxPlayers(arena.getMaximumPlayers()); - ComplementAccessor.getComplement().setMotd(event, motd.replace("%state%", gameStateToString.get(arena.getArenaState()))); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onJoin(final PlayerJoinEvent event) { - if(ArenaRegistry.getArenas().isEmpty()) { - return; - } - - ComplementAccessor.getComplement().setJoinMessage(event, ""); - plugin.getServer().getScheduler().runTaskLater(plugin, () -> ArenaManager.joinAttempt(event.getPlayer(), ArenaRegistry.getArenas().get(ArenaRegistry.getBungeeArena())), 1L); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onQuit(PlayerQuitEvent event) { - if(ArenaRegistry.getArenas().isEmpty()) { - return; - } - - ComplementAccessor.getComplement().setQuitMessage(event, ""); - if(ArenaRegistry.isInArena(event.getPlayer())) { - ArenaManager.leaveAttempt(event.getPlayer(), ArenaRegistry.getArenas().get(ArenaRegistry.getBungeeArena())); - } - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/ChatManager.java b/src/main/java/plugily/projects/murdermystery/handlers/ChatManager.java deleted file mode 100644 index 82884ed6..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/ChatManager.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers; - -import me.clip.placeholderapi.PlaceholderAPI; -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; - -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.misc.MiscUtils; -import plugily.projects.commonsbox.string.StringFormatUtils; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.handlers.language.LanguageManager; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class ChatManager { - - private final String pluginPrefix; - private final Main plugin; - - public ChatManager(Main plugin) { - this.plugin = plugin; - pluginPrefix = colorMessage("In-Game.Plugin-Prefix"); - } - - /** - * @return game prefix - */ - public String getPrefix() { - return pluginPrefix; - } - - public String colorMessage(String message) { - return colorRawMessage(LanguageManager.getLanguageMessage(message)); - } - - public String colorRawMessage(String message) { - if(message == null) { - return ""; - } - - if(ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_16_R1) && message.indexOf('#') >= 0) { - message = MiscUtils.matchColorRegex(message); - } - - return ChatColor.translateAlternateColorCodes('&', message); - } - - public String colorMessage(String path, Player player) { - String returnString = LanguageManager.getLanguageMessage(path); - - if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { - returnString = PlaceholderAPI.setPlaceholders(player, returnString); - } - - return colorRawMessage(returnString); - } - - public void broadcast(Arena arena, String message) { - if (message != null && !message.isEmpty()) { - for(Player p : arena.getPlayers()) { - p.sendMessage(pluginPrefix + message); - } - } - } - - public String formatMessage(Arena arena, String message, int integer) { - String returnString = message; - returnString = StringUtils.replace(returnString, "%NUMBER%", Integer.toString(integer)); - returnString = colorRawMessage(formatPlaceholders(returnString, arena)); - return returnString; - } - - public String formatMessage(Arena arena, String message, Player player) { - String returnString = message; - returnString = StringUtils.replace(returnString, "%PLAYER%", player.getName()); - returnString = colorRawMessage(formatPlaceholders(returnString, arena)); - if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { - returnString = PlaceholderAPI.setPlaceholders(player, returnString); - } - return returnString; - } - - private String formatPlaceholders(String message, Arena arena) { - String returnString = message; - - int timer = arena.getTimer(); - - returnString = StringUtils.replace(returnString, "%ARENANAME%", arena.getMapName()); - returnString = StringUtils.replace(returnString, "%TIME%", Integer.toString(timer)); - returnString = StringUtils.replace(returnString, "%FORMATTEDTIME%", StringFormatUtils.formatIntoMMSS(timer)); - returnString = StringUtils.replace(returnString, "%PLAYERSIZE%", Integer.toString(arena.getPlayers().size())); - returnString = StringUtils.replace(returnString, "%MAXPLAYERS%", Integer.toString(arena.getMaximumPlayers())); - returnString = StringUtils.replace(returnString, "%MINPLAYERS%", Integer.toString(arena.getMinimumPlayers())); - return returnString; - } - - public void broadcastAction(Arena a, Player p, ActionType action) { - String message; - switch(action) { - case JOIN: - message = formatMessage(a, colorMessage("In-Game.Messages.Join"), p); - break; - case LEAVE: - message = formatMessage(a, colorMessage("In-Game.Messages.Leave"), p); - break; - case DEATH: - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DISABLE_DEATH_MESSAGE)) { - return; - } - - message = formatMessage(a, colorMessage("In-Game.Messages.Death"), p); - break; - default: - return; //likely won't ever happen - } - for(Player player : a.getPlayers()) { - player.sendMessage(pluginPrefix + message); - } - } - - public enum ActionType { - JOIN, LEAVE, DEATH - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java b/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java index de52dc06..27157827 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java @@ -31,15 +31,14 @@ import org.golde.bukkit.corpsereborn.CorpseAPI.events.CorpseSpawnEvent; import org.golde.bukkit.corpsereborn.nms.Corpses; -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.hologram.ArmorStandHologram; -import plugily.projects.commonsbox.minecraft.hologram.HologramManager; -import plugily.projects.murdermystery.HookManager; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; +import plugily.projects.minigamesbox.classic.utils.version.ServerVersion; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; import plugily.projects.murdermystery.Main; import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; +import plugily.projects.murdermystery.HookManager; import plugily.projects.murdermystery.arena.corpse.Corpse; import plugily.projects.murdermystery.arena.corpse.Stand; @@ -91,12 +90,12 @@ public void spawnCorpse(Player p, Arena arena) { stand.setCustomNameVisible(false); stand.setHeadPose(new EulerAngle(Math.toRadians(p.getLocation().getX()), Math.toRadians(p.getLocation().getPitch()), Math.toRadians(p.getLocation().getZ()))); - HologramManager.getArmorStands().add(stand); + plugin.getHologramManager().getArmorStands().add(stand); ArmorStandHologram hologram = getLastWordsHologram(p); arena.addHead(new Stand(hologram, stand)); Bukkit.getScheduler().runTaskLater(plugin, () -> { hologram.delete(); - HologramManager.getArmorStands().remove(stand); + plugin.getHologramManager().getArmorStands().remove(stand); Bukkit.getScheduler().runTaskLater(plugin, stand::remove, 20 * 20); }, 15 * 20); return; @@ -114,7 +113,7 @@ public void spawnCorpse(Player p, Arena arena) { private ArmorStandHologram getLastWordsHologram(Player player) { ArmorStandHologram hologram = new ArmorStandHologram(player.getLocation()); - hologram.appendLine(plugin.getChatManager().colorMessage("In-Game.Messages.Corpse-Last-Words", player).replace("%player%", player.getName())); + hologram.appendLine(new MessageBuilder(plugin.getLastWordsManager().getHologramTitle()).player(player).build()); hologram.appendLine(plugin.getLastWordsManager().getRandomLastWord(player)); return hologram; } @@ -124,14 +123,14 @@ public void onCorpseSpawn(CorpseSpawnEvent e) { if(lastSpawnedCorpse == null) { return; } - if(plugin.getConfig().getBoolean("Override-Corpses-Spawn", true) && !lastSpawnedCorpse.equals(e.getCorpse())) { + if(plugin.getConfigPreferences().getOption("CORPSES_INTEGRATION_OVERWRITE") && !lastSpawnedCorpse.equals(e.getCorpse())) { e.setCancelled(true); } } @EventHandler public void onCorpseClick(CorpseClickEvent e) { - if(ArenaRegistry.isInArena(e.getClicker())) { + if(plugin.getArenaRegistry().isInArena(e.getClicker())) { e.setCancelled(true); e.getClicker().closeInventory(); } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/PermissionsManager.java b/src/main/java/plugily/projects/murdermystery/handlers/PermissionsManager.java deleted file mode 100644 index 142fe825..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/PermissionsManager.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers; - -import org.bukkit.plugin.java.JavaPlugin; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.utils.Debugger; - -import java.util.logging.Level; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class PermissionsManager { - - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - private static String joinFullPerm = "murdermystery.fullgames"; - private static String joinPerm = "murdermystery.join."; - - public static void init() { - setupPermissions(); - } - - public static String getJoinFullGames() { - return joinFullPerm; - } - - private static void setJoinFullGames(String joinFullGames) { - PermissionsManager.joinFullPerm = joinFullGames; - } - - public static String getJoinPerm() { - return joinPerm; - } - - private static void setJoinPerm(String joinPerm) { - PermissionsManager.joinPerm = joinPerm; - } - - private static void setupPermissions() { - PermissionsManager.setJoinFullGames(plugin.getConfig().getString("Basic-Permissions.Full-Games-Permission", "murdermystery.fullgames")); - PermissionsManager.setJoinPerm(plugin.getConfig().getString("Basic-Permissions.Join-Permission", "murdermystery.join.")); - Debugger.debug(Level.INFO, "Basic permissions registered"); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/PlaceholderManager.java b/src/main/java/plugily/projects/murdermystery/handlers/PlaceholderManager.java deleted file mode 100644 index 1d306dbf..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/PlaceholderManager.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers; - -import me.clip.placeholderapi.expansion.PlaceholderExpansion; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; - -/** - * @author Plajer - *

- * Created at 08.08.2018 - */ -public class PlaceholderManager extends PlaceholderExpansion { - - @Override - public boolean persist() { - return true; - } - - @Override - public @NotNull String getIdentifier() { - return "murdermystery"; - } - - @Override - public @NotNull String getAuthor() { - return "Plugily Projects"; - } - - @Override - public @NotNull String getVersion() { - return "1.0.2"; - } - - @Override - public String onPlaceholderRequest(Player player, String id) { - if(player == null) { - return null; - } - switch(id.toLowerCase()) { - case "kills": - return Integer.toString(StatsStorage.getUserStats(player, StatsStorage.StatisticType.KILLS)); - case "deaths": - return Integer.toString(StatsStorage.getUserStats(player, StatsStorage.StatisticType.DEATHS)); - case "games_played": - return Integer.toString(StatsStorage.getUserStats(player, StatsStorage.StatisticType.GAMES_PLAYED)); - case "highest_score": - return Integer.toString(StatsStorage.getUserStats(player, StatsStorage.StatisticType.HIGHEST_SCORE)); - case "wins": - return Integer.toString(StatsStorage.getUserStats(player, StatsStorage.StatisticType.WINS)); - case "loses": - return Integer.toString(StatsStorage.getUserStats(player, StatsStorage.StatisticType.LOSES)); - case "arena_players_online": - return Integer.toString(ArenaRegistry.getArenaPlayersOnline()); - default: - return handleArenaPlaceholderRequest(id); - } - } - - private String handleArenaPlaceholderRequest(String id) { - String[] data = id.split(":", 2); - if (data.length < 2) - return null; - - Arena arena = ArenaRegistry.getArena(data[0]); - if(arena == null) { - return null; - } - switch(data[1].toLowerCase()) { - case "players": - return Integer.toString(arena.getPlayers().size()); - case "max_players": - return Integer.toString(arena.getMaximumPlayers()); - case "state": - return arena.getArenaState().getFormattedName(); - case "state_pretty": - return arena.getArenaState().getPlaceholder(); - case "mapname": - return arena.getMapName(); - default: - return null; - } - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/items/SpecialItem.java b/src/main/java/plugily/projects/murdermystery/handlers/items/SpecialItem.java deleted file mode 100644 index 24f29060..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/items/SpecialItem.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package plugily.projects.murdermystery.handlers.items; - -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - -/** - * Created by Tom on 5/02/2016. - */ -public class SpecialItem { - - public static final SpecialItem INVALID_ITEM = new SpecialItem("INVALID", new ItemStack(Material.BEDROCK), -1, DisplayStage.LOBBY); - private final String name; - private final ItemStack itemStack; - private int slot; - private final DisplayStage displayStage; - - public SpecialItem(String name, ItemStack itemStack, int slot, DisplayStage displayStage) { - this.name = name; - this.itemStack = itemStack; - this.slot = slot; - this.displayStage = displayStage; - } - - public String getName() { - return name; - } - - public ItemStack getItemStack() { - return itemStack; - } - - public int getSlot() { - return slot; - } - - public void setSlot(int slot) { - this.slot = slot; - } - - public DisplayStage getDisplayStage() { - return displayStage; - } - - public enum DisplayStage { - LOBBY, SPECTATOR - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/items/SpecialItemManager.java b/src/main/java/plugily/projects/murdermystery/handlers/items/SpecialItemManager.java deleted file mode 100644 index 2cd595ae..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/items/SpecialItemManager.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package plugily.projects.murdermystery.handlers.items; - -import org.bukkit.Material; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.item.ItemBuilder; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.utils.Debugger; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.stream.Collectors; - -/** - * Created by Tom on 5/02/2016. - */ -public class SpecialItemManager { - - private final List specialItems = new ArrayList<>(); - private final FileConfiguration config; - private final Main plugin; - - public SpecialItemManager(Main plugin) { - this.plugin = plugin; - this.config = ConfigUtils.getConfig(plugin, "special_items"); - registerItems(); - } - - public void addItem(SpecialItem item) { - specialItems.add(item); - } - - @NotNull - public SpecialItem getSpecialItem(String name) { - for(SpecialItem item : specialItems) { - if(item.getName().equals(name)) { - return item; - } - } - return SpecialItem.INVALID_ITEM; - } - - @NotNull - public SpecialItem getRelatedSpecialItem(ItemStack itemStack) { - for(SpecialItem item : specialItems) { - if(item.getItemStack().isSimilar(itemStack)) { - return item; - } - } - return SpecialItem.INVALID_ITEM; - } - - public void registerItems() { - for(String key : config.getKeys(false)) { - if("Version".equals(key)) { - continue; - } - Material mat; - String name; - List lore; - int slot; - try { - mat = XMaterial.matchXMaterial(config.getString(key + ".material-name", "BEDROCK").toUpperCase()).orElse(XMaterial.BEDROCK).parseMaterial(); - name = plugin.getChatManager().colorRawMessage(config.getString(key + ".displayname")); - lore = config.getStringList(key + ".lore").stream() - .map(itemLore -> itemLore = plugin.getChatManager().colorRawMessage(itemLore)) - .collect(Collectors.toList()); - slot = config.getInt(key + ".slot"); - } catch(Exception ex) { - plugin.getLogger().log(Level.WARNING, "Configuration of " + key + "is missing a value. (material-name, displayname, lore or slot)"); - continue; - } - SpecialItem.DisplayStage stage; - try { - stage = SpecialItem.DisplayStage.valueOf(config.getString(key + ".stage").toUpperCase()); - } catch(Exception ex) { - Debugger.debug(Level.WARNING, "Invalid display stage of special item " + key + " in special_items.yml! Please use lobby or spectator!"); - stage = SpecialItem.DisplayStage.LOBBY; - } - SpecialItem item = new SpecialItem(key, new ItemBuilder(mat).name(name).lore(lore).build(), slot, stage); - addItem(item); - } - } - - public List getSpecialItems() { - return specialItems; - } - - public enum SpecialItems { - ROLE_PASS("Role-Pass"), FORCESTART("Forcestart"), LOBBY_LEAVE_ITEM("Leave-Lobby"), PLAYERS_LIST("Player-List"), - SPECTATOR_OPTIONS("Spectator-Options"), SPECTATOR_LEAVE_ITEM("Leave-Spectator"), BASE_SELECTOR("Base-Selector"); - - private final String name; - - SpecialItems(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageManager.java b/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageManager.java deleted file mode 100644 index 82fda92d..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageManager.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.language; - -import org.bukkit.configuration.file.FileConfiguration; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.utils.Debugger; -import plugily.projects.murdermystery.utils.services.ServiceRegistry; -import plugily.projects.murdermystery.utils.services.locale.Locale; -import plugily.projects.murdermystery.utils.services.locale.LocaleRegistry; -import plugily.projects.murdermystery.utils.services.locale.LocaleService; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Properties; -import java.util.stream.Collectors; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class LanguageManager { - - private static final Properties properties = new Properties(); - private static Main plugin; - private static Locale pluginLocale; - private static FileConfiguration languageConfig; - private static FileConfiguration defaultLanguageConfig; - - private LanguageManager() { - } - - public static void init(Main plugin) { - LanguageManager.plugin = plugin; - if(!new File(LanguageManager.plugin.getDataFolder() + File.separator + "language.yml").exists()) { - plugin.saveResource("language.yml", false); - } - //auto update - plugin.saveResource("locales/language_default.yml", true); - - new LanguageMigrator(plugin); - languageConfig = ConfigUtils.getConfig(plugin, "language"); - defaultLanguageConfig = ConfigUtils.getConfig(plugin, "locales/language_default"); - registerLocales(); - setupLocale(); - } - - private static void registerLocales() { - Arrays.asList( - new Locale("Afrikaans", "Afrikaans", "af_ZA", "POEditor contributors", Arrays.asList("afrika", "af", "afr")), - new Locale("Chinese (Simplified)", "简体中文", "zh_CN", "POEditor contributors", Arrays.asList("简体中文", "中文", "chinese", "chinese_simplified", "cn")), - new Locale("Chinese (Traditional)", "繁體中文", "zh_TW", "POEditor contributors", Arrays.asList("中文(繁體)", "繁體中文", "chinese_traditional", "zh_tw")), - new Locale("Czech", "Český", "cs_CZ", "POEditor contributors", Arrays.asList("czech", "cesky", "český", "cs")), - new Locale("Danish", "Dänemark", "da_DK", "POEditor contributors", Arrays.asList("dänisch", "da", "dk")), - new Locale("Dutch", "Nederlands", "nl_NL", "POEditor contributors", Arrays.asList("dutch", "nederlands", "nl")), - new Locale("English", "English", "en_GB", "Plajer", Arrays.asList("default", "english", "en")), - new Locale("French", "Français", "fr_FR", "POEditor contributors", Arrays.asList("french", "francais", "français", "fr")), - new Locale("German", "Deutsch", "de_DE", "Tigerkatze and POEditor contributors", Arrays.asList("deutsch", "german", "de")), - new Locale("Hungarian", "Magyar", "hu_HU", "POEditor contributors", Arrays.asList("hungarian", "magyar", "hu")), - new Locale("Indonesian", "Indonesia", "id_ID", "POEditor contributors", Arrays.asList("indonesian", "indonesia", "id")), - new Locale("Italian", "Italiano", "it_IT", "POEditor contributors", Arrays.asList("italian", "italiano", "it")), - new Locale("Japanese", "Japan", "ja_JP", "POEditor contributors", Arrays.asList("japan", "japanese", "ja")), - new Locale("Korean", "한국의", "ko_KR", "POEditor contributors", Arrays.asList("korean", "한국의", "kr")), - new Locale("Polish", "Polski", "pl_PL", "Plajer", Arrays.asList("polish", "polski", "pl")), - new Locale("Portuguese (BR)", "Português (Brasil)", "pt_BR", "POEditor contributors", Arrays.asList("portuguese br", "português br", "português brasil", "pt_br")), - new Locale("Romanian", "Românesc", "ro_RO", "POEditor contributors", Arrays.asList("romanian", "romanesc", "românesc", "ro")), - new Locale("Russian", "Pусский", "ru_RU", "POEditor contributors", Arrays.asList("russian", "pусский", "pyccknn", "russkiy", "ru")), - new Locale("Slovak", "Slovenský", "sk_SK", "POEditor contributors", Arrays.asList("slovak", "slovenský", "slovensky", "sk")), - new Locale("Spanish", "Español", "es_ES", "POEditor contributors", Arrays.asList("spanish", "espanol", "español", "es")), - new Locale("Thai", "Thai", "th_TH", "POEditor contributors", Arrays.asList("thai", "th")), - new Locale("Turkish", "Türkçe", "tr_TR", "POEditor contributors", Arrays.asList("turkish", "türkçe", "turkce", "tr")), - new Locale("Ukrainian", "Ukraine", "uk_UA", "POEditor contributors", Arrays.asList("ukraine", "ua", "uk")), - new Locale("Vietnamese", "Việt", "vn_VN", "POEditor contributors", Arrays.asList("vietnamese", "viet", "việt", "vn"))) - .forEach(LocaleRegistry::registerLocale); - } - - private static void loadProperties() { - LocaleService service = ServiceRegistry.getLocaleService(plugin); - /* is beta release */ - if((plugin.getDescription().getVersion().contains("locales") || plugin.getDescription().getVersion().contains("pre")) && !plugin.getConfig().getBoolean("Developer-Mode", false)) { - Debugger.sendConsoleMsg("&c[Murder Mystery] Locales aren't supported in beta versions because they're lacking latest translations! Enabling English one..."); - pluginLocale = LocaleRegistry.getByName("English"); - return; - } - if(service == null) { - Debugger.sendConsoleMsg("&c[Murder Mystery] Locales cannot be downloaded because API website is unreachable, locales will be disabled."); - pluginLocale = LocaleRegistry.getByName("English"); - return; - } - if(service.isValidVersion()) { - LocaleService.DownloadStatus status = service.demandLocaleDownload(pluginLocale); - if(status == LocaleService.DownloadStatus.FAIL) { - pluginLocale = LocaleRegistry.getByName("English"); - Debugger.sendConsoleMsg("&c[Murder Mystery] Locale service couldn't download latest locale for plugin! English locale will be used instead!"); - return; - } else if(status == LocaleService.DownloadStatus.SUCCESS) { - Debugger.sendConsoleMsg("&c[Murder Mystery] Downloaded locale " + pluginLocale.getPrefix() + " properly!"); - } else if(status == LocaleService.DownloadStatus.LATEST) { - Debugger.sendConsoleMsg("&c[Murder Mystery] Locale " + pluginLocale.getPrefix() + " is latest! Awesome!"); - } - } else { - pluginLocale = LocaleRegistry.getByName("English"); - Debugger.sendConsoleMsg("&c[Murder Mystery] Your plugin version is too old to use latest locale! Please update plugin to access latest updates of locale!"); - return; - } - try(InputStreamReader reader = new InputStreamReader(new FileInputStream(plugin.getDataFolder() + "/locales/" - + pluginLocale.getPrefix() + ".properties"), StandardCharsets.UTF_8)) { - properties.load(reader); - } catch(IOException e) { - e.printStackTrace(); - } - } - - private static void setupLocale() { - String localeName = plugin.getConfig().getString("locale", "default").toLowerCase(); - for(Locale locale : LocaleRegistry.getRegisteredLocales()) { - if(locale.getPrefix().equalsIgnoreCase(localeName)) { - pluginLocale = locale; - break; - } - for(String alias : locale.getAliases()) { - if(alias.equals(localeName)) { - pluginLocale = locale; - break; - } - } - } - if(pluginLocale == null) { - Debugger.sendConsoleMsg("&c[Murder Mystery] Plugin locale is invalid! Using default one..."); - pluginLocale = LocaleRegistry.getByName("English"); - } - Debugger.sendConsoleMsg("&a[Murder Mystery] Loaded locale " + pluginLocale.getName() + " (" + pluginLocale.getOriginalName() + " ID: " - + pluginLocale.getPrefix() + ") by " + pluginLocale.getAuthor()); - loadProperties(); - } - - public static boolean isDefaultLanguageUsed() { - return pluginLocale.getName().equals("English"); - } - - public static String getLanguageMessage(String path) { - if(isDefaultLanguageUsed()) { - return getString(path); - } - String prop = properties.getProperty(path); - if(prop == null) { - return getString(path); - } - if(getString(path).equalsIgnoreCase(defaultLanguageConfig.getString(path, "not found"))) { - return prop; - } - return getString(path); - } - - public static List getLanguageList(String path) { - if(isDefaultLanguageUsed()) { - return getStrings(path); - } - String prop = properties.getProperty(path); - if(prop == null) { - return getStrings(path); - } - if(getString(path).equalsIgnoreCase(defaultLanguageConfig.getString(path, "not found"))) { - return Arrays.asList(plugin.getChatManager().colorRawMessage(prop).split(";")); - } - return getStrings(path); - } - - - private static List getStrings(String path) { - if(!languageConfig.isSet(path)) { - Debugger.sendConsoleMsg("&c[Murder Mystery] Game message not found in your locale!"); - Debugger.sendConsoleMsg("&c[Murder Mystery] Please regenerate your language.yml file! If error still occurs report it to the developer on discord!"); - Debugger.sendConsoleMsg("&c[Murder Mystery] Path: " + path); - return Collections.singletonList("ERR_MESSAGE_" + path + "_NOT_FOUND"); - } - List list = languageConfig.getStringList(path); - list = list.stream().map(string -> string = plugin.getChatManager().colorRawMessage(string)).collect(Collectors.toList()); - return list; - } - - - private static String getString(String path) { - if(!languageConfig.isSet(path)) { - Debugger.sendConsoleMsg("&c[Murder Mystery] Game message not found in your locale!"); - Debugger.sendConsoleMsg("&c[Murder Mystery] Please regenerate your language.yml file! If error still occurs report it to the developer on discord!"); - Debugger.sendConsoleMsg("&c[Murder Mystery] Path: " + path); - return "ERR_MESSAGE_" + path + "_NOT_FOUND"; - } - return languageConfig.getString(path, "not found"); - } - - public static void reloadConfig() { - languageConfig = ConfigUtils.getConfig(plugin, "language"); - } - - public static Locale getPluginLocale() { - return pluginLocale; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageMigrator.java b/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageMigrator.java deleted file mode 100644 index dda9cf1b..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/language/LanguageMigrator.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.language; - -import org.apache.commons.lang.math.NumberUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.configuration.file.FileConfiguration; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.migrator.MigratorUtils; -import plugily.projects.murdermystery.Main; - -import java.io.File; - -/* - NOTE FOR CONTRIBUTORS - Please do not touch this class if you don't now how it works! You can break migrator modyfing these values! - */ -@SuppressWarnings("deprecation") -public class LanguageMigrator { - - public static final int CONFIG_FILE_VERSION = 24; - public static final int LANGUAGE_FILE_VERSION = 8; - private final Main plugin; - - public LanguageMigrator(Main plugin) { - this.plugin = plugin; - - //initializes migrator to update files with latest values - configUpdate(); - languageFileUpdate(); - } - - private void configUpdate() { - if(plugin.getConfig().getInt("Version") == CONFIG_FILE_VERSION) { - return; - } - Bukkit.getConsoleSender().sendMessage(ChatColor.YELLOW + "[Murder Mystery] System notify >> Your config file is outdated! Updating..."); - File file = new File(plugin.getDataFolder() + "/config.yml"); - File bungeefile = new File(plugin.getDataFolder() + "/bungee.yml"); - - int version = plugin.getConfig().getInt("Version", CONFIG_FILE_VERSION - 1); - - for(int i = version; i < CONFIG_FILE_VERSION; i++) { - switch(i) { - case 1: - MigratorUtils.addNewLines(file, "\r\n# How many blocks per tick sword thrown by murderer should fly\r\n" + - "# Please avoid high values as it might look like the sword is\r\n" + - "# blinking each tick\r\n" + - "Murderer-Sword-Speed: 0.65\r\n"); - break; - case 2: - MigratorUtils.addNewLines(file, "\r\n# Should players' name tags in game be hidden?\r\n" + - "Nametags-Hidden: true\r\n"); - break; - case 3: - MigratorUtils.addNewLines(file, "\r\n# Lobby waiting time set when lobby max players number is reached, used to start game quicker.\r\n" + - "Start-Time-On-Full-Lobby: 15\r\n"); - break; - case 4: - MigratorUtils.addNewLines(file, "\r\n# Should players get no fall damage?\r\n" + - "Disable-Fall-Damage: false\r\n"); - break; - case 5: - MigratorUtils.addNewLines(file, "\r\n#How long should be the sword attack after throw cooldown in seconds?\r\n" + - "#Its normal lower than Murderer-Sword-Fly-Cooldown!\r\n" + - "Murderer-Sword-Attack-Cooldown: 1\r\n" + - "\r\n" + - "#How long should be the sword fly cooldown in seconds?\r\n" + - "Murderer-Sword-Fly-Cooldown: 5\r\n" + - "\r\n" + - "#How long should be the bow shoot cooldown in seconds?\r\n" + - "Detective-Bow-Cooldown: 5\r\n"); - break; - case 6: - MigratorUtils.addNewLines(file, "\r\n# Which item should be your Murderer sword?\r\n" + - "Murderer-Sword-Material: IRON_SWORD\r\n"); - break; - case 7: - MigratorUtils.addNewLines(file, "\r\n#How much arrows should a player with bow gets when he pick up a gold ingot?\r\n" + - "Detective-Gold-Pick-Up-Arrows: 1\r\n" + - "\r\n" + - "#How much arrows should the detective gets on game start or when a player get a bow?\r\n" + - "Detective-Default-Arrows: 3\r\n" + - "\r\n" + - "#How much arrows should the player get when the prayer gives a bow to him?\r\n" + - "Detective-Prayer-Arrows: 2\r\n"); - break; - case 8: - MigratorUtils.removeLineFromFile(bungeefile, "# This is useful for bungee game systems."); - MigratorUtils.removeLineFromFile(bungeefile, "# Game state will be visible at MOTD."); - MigratorUtils.removeLineFromFile(bungeefile, "MOTD-manager: false"); - MigratorUtils.removeLineFromFile(bungeefile, "MOTD-manager: true"); - MigratorUtils.addNewLines(bungeefile, "\r\n# This is useful for bungee game systems.\r\n" + - "# %state% - Game state will be visible at MOTD.\r\n" + - "MOTD:\r\n" + - " Manager: false\r\n" + - " Message: \"The actual game state of mm is %state%\"\r\n" + - " Game-States:\r\n" + - " Inactive: \"&lInactive...\"\r\n" + - " In-Game: \"&lIn-game\"\r\n" + - " Starting: \"&e&lStarting\"\r\n" + - " Full-Game: \"&4&lFULL\"\r\n" + - " Ending: \"&lEnding\"\r\n" + - " Restarting: \"&c&lRestarting\"\r\n"); - break; - case 9: - MigratorUtils.addNewLines(file, "\r\n" + - "# Should we enable short commands such as /start and /leave\r\n" + - "Enable-Short-Commands: false\r\n"); - break; - case 10: - MigratorUtils.addNewLines(file, "\r\n" + - "#Should Detectives be killed if they kill a innocent?\r\n" + - "Enable-Kill-Detective-If-Innocent-Killed: true\r\n"); - break; - case 11: - MigratorUtils.addNewLines(file, "\r\n#Should the murderer get speed effect?\r\n" + - "Speed-Effect-Murderer:\r\n" + - " Enabled: true\r\n" + - " #Enter a multiplier (min 2, max 10)\r\n" + - " Speed: 3\r\n"); - break; - case 12: - MigratorUtils.addNewLines(file, "\r\n" + - "#Should we change spawner mode to spawn on all spawners instant of random one\r\n" + - "Change-Gold-Spawner-Mode-To-All: false\r\n"); - MigratorUtils.addNewLines(file, "\r\n" + - "#Should we disable the gold spawn limit (It does not spawn more gold than spawner locations)\r\n" + - "Disable-Gold-Limiter: false\r\n"); - break; - case 13: - MigratorUtils.addNewLines(file, "\r\n" + - "# How many blocks should the sword fly\r\n" + - "Murderer-Sword-Fly-Range: 20\r\n" + - "\r\n" + - "# In what radius should we hit the players\r\n" + - "Murderer-Sword-Fly-Hit-Range: 0.5\r\n"); - break; - case 14: - MigratorUtils.addNewLines(file, "\r\n" + - "#How much gold should a player need to get a bow\r\n" + - "Gold-For-Bow: 10\r\n"); - break; - case 15: - MigratorUtils.addNewLines(file, "\r\n" + - "#How much arrows should the fake detective get? (Cause: Player pick up bow after detective died)\r\n" + - "Detective-Fake-Arrows: 3\r\n" + - "\r\n" + - "#How much arrows should the player get? (Cause: Bow because enough gold collected)\r\n" + - "Gold-Bow-Arrows: 3\r\n"); - break; - case 16: - MigratorUtils.addNewLines(file, "\r\n" + - "# Should we disable all chat related stuff?\r\n" + - "# It will disable the separated chat, for example\r\n" + - "Disable-Separate-Chat: false\r\n"); - break; - case 17: - MigratorUtils.addNewLines(file, "\r\n" + - "#Disable Party features of external party plugins (such as PAF, Parties ...)\r\n" + - "Disable-Parties: true\r\n"); - break; - case 18: - MigratorUtils.addNewLines(file, "\r\n" + - "#Should there be a innocent locator\r\n" + - "Enable-Innocent-Locator: true\r\n"); - break; - case 19: - MigratorUtils.addNewLines(file, "\r\n" + - "# Should we disable death messages, so the player dies without other recognizes it\r\n" + - "# It will not broadcast the death message to all ;)\r\n" + - "Hide-Death: false\r\n" + - "\r\n"); - break; - case 20: - MigratorUtils.addNewLines(file, "\r\nArena-Selector:\r\n" + - " Items:\r\n" + - " waiting-for-players: lime_concrete\r\n" + - " starting: yellow_concrete\r\n" + - " other: red_concrete\r\n"); - break; - case 21: - MigratorUtils.insertAfterLine(file, "Arena-Selector:", " State-Item:\r\n" + - " Waiting: LIME_wool\r\n" + - " Starting: YELLOW_wool\r\n" + - " In-Game: RED_wool\r\n" + - " Ending: RED_wool\r\n" + - " Restarting: RED_wool\r\n"); - break; - case 22: - MigratorUtils.addNewLines(file, "\r\n#Add trails that you want to blacklist from all trails(particles)\r\n" + - "Blacklisted-Trails:\r\n" + - " - \"elder_guardian\"\r\n" + - " - \"block_crack\"\r\n" + - " - \"item_crack\"\r\n" + - " - \"block_dust\"\r\n"); - break; - case 23: - MigratorUtils.addNewLines(file, "\r\n# Should the /mma delete command awaits the confirmation to delete the arena?\r\n" - + "Deleting-Arena-Needs-Confirmation: true\r\n"); - break; - default: - break; - } - i++; - } - updateConfigVersionControl(version); - plugin.reloadConfig(); - Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "[Murder Mystery] [System notify] Config updated, no comments were removed :)"); - Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "[Murder Mystery] [System notify] You're using latest config file version! Nice!"); - } - - private void languageFileUpdate() { - FileConfiguration config = ConfigUtils.getConfig(plugin, "language"); - if(config.getString("File-Version-Do-Not-Edit", "").equals(Integer.toString(LANGUAGE_FILE_VERSION))) { - return; - } - Bukkit.getConsoleSender().sendMessage(ChatColor.YELLOW + "[Murder Mystery] [System notify] Your language file is outdated! Updating..."); - - int version = LANGUAGE_FILE_VERSION - 1; - if(NumberUtils.isNumber(config.getString("File-Version-Do-Not-Edit"))) { - version = Integer.parseInt(config.getString("File-Version-Do-Not-Edit")); - } else { - Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "[Murder Mystery] [System notify] Failed to parse language file version!"); - } - updateLanguageVersionControl(version); - - File file = new File(plugin.getDataFolder() + "/language.yml"); - - for(int i = version; i < LANGUAGE_FILE_VERSION; i++) { - switch(version) { - case 1: - MigratorUtils.insertAfterLine(file, "Lobby-Messages:", " Not-Enough-Space-For-Party: \"&cYour party is bigger than free places on the arena %ARENANAME%\""); - MigratorUtils.insertAfterLine(file, "In-Game:", " Join-As-Party-Member: \"&cYou joined %ARENANAME% because the party leader joined it!\""); - break; - case 2: - MigratorUtils.addNewLines(file, "Arena-Selector:\r\n" + - " Inv-Title: \"Arena selector\"\r\n" + - " Item:\r\n" + - " Name: \"&f%mapname%\"\r\n" + - " Lore:\r\n" + - " - \"&4Murder Mystery &f- &e%mapname%\"\r\n" + - " - \" \"\r\n" + - " - \" \"\r\n" + - " - \" &fOnline: %playersize%/%maxplayers%\"\r\n" + - " - \" &fState: %state%\"\r\n" + - " - \" \"\r\n" + - " - \" \"\r\n" + - " - \"&eClick to join this arena\"\r\n"); - break; - case 3: - MigratorUtils.insertAfterLine(file, "In-Game:", " Game-Death-Format: \"&7[&4☠&7] &r\""); - break; - case 4: - MigratorUtils.insertAfterLine(file, " Item:", " Name: \"&f%mapname%\""); - break; - case 5: - MigratorUtils.addNewLines(file, "Placeholders:\r\n" + - " Game-States:\r\n" + - " Waiting: \"&lWaiting for players...\"\r\n" + - " Starting: \"&e&lStarting\"\r\n" + - " In-Game: \"&lPlaying\"\r\n" + - " Ending: \"&lEnding\"\r\n" + - " Restarting: \"&c&lRestarting\"\r\n"); - break; - case 6: - //No migrator as we can't handle that - break; - case 7: - MigratorUtils.insertAfterLine(file, " Spectator:", " Target-Player-Health: \"&cHealth: &7%health%\"\r\n"); - MigratorUtils.insertAfterLine(file, "In-Game:", " Role-Pass:\r\n" + - " Menu-Name: \"Role pass menu\"\r\n" + - " Role:\r\n" + - " Murderer:\r\n" + - " Name: \"Be murderer\"\r\n" + - " Lore:\r\n" + - " - \"Cost 1 murderer pass\"\r\n" + - " - \"You got %amount%\"\r\n" + - " Detective:\r\n" + - " Name: \"Be detective\"\r\n" + - " Lore:\r\n" + - " - \"Cost 1 detective pass\"\r\n" + - " - \"You got %amount%\"\r\n" + - " Fail: \"You do not got enough passes for %role% role\"\r\n" + - " Success: \"You will be %role% next round!\"\r\n" + - " Change: \"You now got %amount% %role% passes!\"\r\n"); - default: - break; - } - version++; - } - Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "[Murder Mystery] [System notify] Language file updated! Nice!"); - Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "[Murder Mystery] [System notify] You're using latest language file version! Nice!"); - } - - private void updateConfigVersionControl(int oldVersion) { - File file = new File(plugin.getDataFolder() + "/config.yml"); - MigratorUtils.removeLineFromFile(file, "# Don't modify"); - MigratorUtils.removeLineFromFile(file, "Version: " + oldVersion); - MigratorUtils.removeLineFromFile(file, "# No way! You've reached the end! But... where's the dragon!?"); - MigratorUtils.addNewLines(file, "# Don't modify\r\nVersion: " + CONFIG_FILE_VERSION + "\r\n# No way! You've reached the end! But... where's the dragon!?"); - } - - private void updateLanguageVersionControl(int oldVersion) { - File file = new File(plugin.getDataFolder() + "/language.yml"); - MigratorUtils.removeLineFromFile(file, "# Don't edit it. But who's stopping you? It's your server!"); - MigratorUtils.removeLineFromFile(file, "# Really, don't edit ;p"); - MigratorUtils.removeLineFromFile(file, "File-Version-Do-Not-Edit: " + oldVersion); - MigratorUtils.addNewLines(file, "# Don't edit it. But who's stopping you? It's your server!\r\n# Really, don't edit ;p\r\nFile-Version-Do-Not-Edit: " + LANGUAGE_FILE_VERSION + "\r\n"); - } -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/lastwords/LastWordsManager.java b/src/main/java/plugily/projects/murdermystery/handlers/lastwords/LastWordsManager.java index a0a8dfbe..19e7a5a7 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/lastwords/LastWordsManager.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/lastwords/LastWordsManager.java @@ -20,9 +20,9 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.utils.Debugger; import java.util.ArrayList; import java.util.List; @@ -38,25 +38,19 @@ public class LastWordsManager { private final List registeredLastWords = new ArrayList<>(); + private String hologramTitle = ""; + public LastWordsManager(Main plugin) { registerLastWords(plugin); } public void registerLastWords(Main plugin) { - FileConfiguration config = ConfigUtils.getConfig(plugin, "language"); - ConfigurationSection section = config.getConfigurationSection("In-Game.Messages.Last-Words"); - if(section == null) { - //use old formatting under v1.7.5 - addLastWord(new LastWord(plugin.getChatManager().colorMessage("In-Game.Messages.Last-Words.Meme"), "murdermystery.lastwords.meme")); - addLastWord(new LastWord(plugin.getChatManager().colorMessage("In-Game.Messages.Last-Words.Rage"), "murdermystery.lastwords.rage")); - addLastWord(new LastWord(plugin.getChatManager().colorMessage("In-Game.Messages.Last-Words.Pro"), "murdermystery.lastwords.pro")); - addLastWord(new LastWord(plugin.getChatManager().colorMessage("In-Game.Messages.Last-Words.Default"), "")); - Debugger.sendConsoleMsg("[Murder Mystery] Please check your language.yml and update it to the new last words design that can be found on the latest language.yml"); - return; - } - String path = "In-Game.Messages.Last-Words."; + FileConfiguration config = ConfigUtils.getConfig(plugin, "lastwords"); + hologramTitle = config.getString("Last-Words.Hologram.Title", "-"); + ConfigurationSection section = config.getConfigurationSection("Last-Words.Hologram.Content"); + String path = "Last-Words.Hologram.Content."; for(String id : section.getKeys(false)) { - addLastWord(new LastWord(plugin.getChatManager().colorMessage(path + id + ".Message"), config.getString(path + id + ".Permission", ""))); + addLastWord(new LastWord(new MessageBuilder(config.getString(path + id + ".Message")).build(), config.getString(path + id + ".Permission", ""))); } } @@ -64,6 +58,10 @@ public List getRegisteredLastWords() { return registeredLastWords; } + public String getHologramTitle() { + return hologramTitle; + } + public void addLastWord(LastWord lastWord) { registeredLastWords.add(lastWord); } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PAFBPartyHandlerImpl.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PAFBPartyHandlerImpl.java deleted file mode 100644 index 2b5da0a5..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PAFBPartyHandlerImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.party; - -import de.simonsator.partyandfriends.spigot.api.pafplayers.PAFPlayer; -import de.simonsator.partyandfriends.spigot.api.pafplayers.PAFPlayerManager; -import de.simonsator.partyandfriends.spigot.api.party.PartyManager; -import de.simonsator.partyandfriends.spigot.api.party.PlayerParty; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -/** - * @author Plajer - *

- * Created at 09.02.2020 - */ -public class PAFBPartyHandlerImpl implements PartyHandler { - - @Override - public GameParty getParty(Player player) { - PAFPlayer partyPlayer = PAFPlayerManager.getInstance().getPlayer(player.getUniqueId()); - if (partyPlayer == null) - return null; - - PlayerParty party = PartyManager.getInstance().getParty(partyPlayer); - if (party == null) - return null; - - Player leader = Bukkit.getPlayer(party.getLeader().getUniqueId()); - if (leader == null) - return null; - - java.util.List allMembers = party.getAllPlayers().stream() - .map(localPlayer -> Bukkit.getPlayer(localPlayer.getUniqueId())) - .filter(java.util.Objects::nonNull).collect(java.util.stream.Collectors.toList()); - - return new GameParty(allMembers, leader); - } - - @Override - public boolean partiesSupported() { - return true; - } - - @Override - public PartyPluginType getPartyPluginType() { - return PartyPluginType.PAFBungee; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PAFSPartyHandlerImpl.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PAFSPartyHandlerImpl.java deleted file mode 100644 index 3f9df35e..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PAFSPartyHandlerImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.party; - -import de.simonsator.partyandfriends.api.party.PartyManager; -import de.simonsator.partyandfriends.api.party.PlayerParty; - -import java.util.stream.Collectors; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -/** - * @author Plajer - *

- * Created at 09.02.2020 - */ -public class PAFSPartyHandlerImpl implements PartyHandler { - - @Override - public GameParty getParty(Player player) { - PlayerParty party = PartyManager.getInstance().getParty(player.getUniqueId()); - if (party == null) - return null; - - Player leader = Bukkit.getPlayer(party.getLeader().getUniqueId()); - if (leader == null) - return null; - - java.util.List allMembers = party.getAllPlayers().stream() - .map(localPlayer -> Bukkit.getPlayer(localPlayer.getUniqueId())) - .filter(java.util.Objects::nonNull).collect(Collectors.toList()); - - return new GameParty(allMembers, leader); - } - - @Override - public boolean partiesSupported() { - return true; - } - - @Override - public PartyPluginType getPartyPluginType() { - return PartyPluginType.PAFSpigot; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PartiesPartyHandlerImpl.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PartiesPartyHandlerImpl.java deleted file mode 100644 index 90031664..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PartiesPartyHandlerImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.party; - -import com.alessiodp.parties.api.Parties; -import com.alessiodp.parties.api.interfaces.PartiesAPI; -import com.alessiodp.parties.api.interfaces.Party; -import com.alessiodp.parties.api.interfaces.PartyPlayer; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -/** - * @author Plajer - *

- * Created at 09.02.2020 - */ -public class PartiesPartyHandlerImpl implements PartyHandler { - - @Override - public GameParty getParty(Player player) { - PartiesAPI api = Parties.getApi(); - PartyPlayer partyPlayer = api.getPartyPlayer(player.getUniqueId()); - - if (partyPlayer == null) - return null; - - Party party = api.getParty(partyPlayer.getPartyId()); - if (party == null || party.getMembers().size() <= 1) - return null; - - Player leader = Bukkit.getPlayer(party.getLeader()); - if (leader == null) - return null; - - java.util.List members = party.getOnlineMembers(true).stream() - .map(localPlayer -> Bukkit.getPlayer(localPlayer.getPlayerUUID())) - .filter(java.util.Objects::nonNull).collect(java.util.stream.Collectors.toList()); - - return new GameParty(members, leader); - } - - @Override - public boolean partiesSupported() { - return true; - } - - @Override - public PartyPluginType getPartyPluginType() { - return PartyPluginType.PARTIES; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PartyHandler.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PartyHandler.java deleted file mode 100644 index 8de280c2..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PartyHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.party; - -import org.bukkit.entity.Player; - -/** - * @author Plajer - *

- * Created at 09.02.2020 - */ -public interface PartyHandler { - - GameParty getParty(Player player); - - boolean partiesSupported(); - - PartyPluginType getPartyPluginType(); - - enum PartyPluginType { - PARTIES, PAFSpigot, PAFBungee, NONE - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java b/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java deleted file mode 100644 index bf81cb38..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/PartySupportInitializer.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.party; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.Main; - -/** - * @author Plajer - *

- * Created at 09.02.2020 - */ -public class PartySupportInitializer { - - public PartyHandler initialize(Main plugin) { - if(!plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DISABLE_PARTIES)) { - if(Bukkit.getServer().getPluginManager().getPlugin("Parties") != null) { - return new PartiesPartyHandlerImpl(); - } else if(Bukkit.getServer().getPluginManager().getPlugin("Spigot-Party-API-PAF") != null) { - return new PAFBPartyHandlerImpl(); - } else if(Bukkit.getServer().getPluginManager().getPlugin("PartyAndFriends") != null) { - return new PAFSPartyHandlerImpl(); - } - } - - return new PartyHandler() { - @Override - public GameParty getParty(Player player) { - return null; - } - - @Override - public boolean partiesSupported() { - return false; - } - - @Override - public PartyPluginType getPartyPluginType() { - return PartyPluginType.NONE; - } - }; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/rewards/Reward.java b/src/main/java/plugily/projects/murdermystery/handlers/rewards/Reward.java deleted file mode 100644 index bd7cac77..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/rewards/Reward.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.rewards; - -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; - -/** - * @author Plajer - *

- * Created at 06.04.2019 - */ -public class Reward { - - private final RewardType type; - private final RewardExecutor executor; - private String executableCode; - private final double chance; - - public Reward(RewardType type, String rawCode) { - this.type = type; - String processedCode = rawCode; - - //set reward executor based on provided code - if(rawCode.contains("p:")) { - this.executor = RewardExecutor.PLAYER; - processedCode = StringUtils.replace(processedCode, "p:", ""); - } else if(rawCode.contains("script:")) { - this.executor = RewardExecutor.SCRIPT; - processedCode = StringUtils.replace(processedCode, "script:", ""); - } else { - this.executor = RewardExecutor.CONSOLE; - } - - //search for chance modifier - if(processedCode.contains("chance(")) { - int loc = processedCode.indexOf(")"); - //modifier is invalid - if(loc == -1) { - Bukkit.getLogger().warning("rewards.yml configuration is broken! Make sure you don't forget using ')' character in chance condition! Command: " + rawCode); - //invalid code, 0% chance to execute - this.chance = 0.0; - return; - } - String chanceStr = processedCode; - chanceStr = chanceStr.substring(0, loc).replaceAll("[^0-9]+", ""); - double chance = Double.parseDouble(chanceStr); - processedCode = StringUtils.replace(processedCode, "chance(" + chanceStr + "):", ""); - this.chance = chance; - } else { - this.chance = 100.0; - } - this.executableCode = processedCode; - } - - public RewardExecutor getExecutor() { - return executor; - } - - public String getExecutableCode() { - return executableCode; - } - - public double getChance() { - return chance; - } - - public RewardType getType() { - return type; - } - - public enum RewardType { - DETECTIVE_KILL("detectivekill"), MURDERER_KILL("murdererkill"), END_GAME("endgame"), - LOSE("lose"), WIN("win"), DEATH("death"), GOLD_PICKUP("gold_pickup"); - - private final String path; - - RewardType(String path) { - this.path = path; - } - - public String getPath() { - return path; - } - - } - - public enum RewardExecutor { - CONSOLE, PLAYER, SCRIPT - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/rewards/RewardsFactory.java b/src/main/java/plugily/projects/murdermystery/handlers/rewards/RewardsFactory.java deleted file mode 100644 index 6aeea3f3..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/rewards/RewardsFactory.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.rewards; - -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.engine.ScriptEngine; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.utils.Debugger; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; -import java.util.logging.Level; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class RewardsFactory { - - private final Set rewards = new HashSet<>(); - private final FileConfiguration config; - private final boolean enabled; - - public RewardsFactory(Main plugin) { - enabled = plugin.getConfig().getBoolean("Rewards-Enabled"); - config = ConfigUtils.getConfig(plugin, "rewards"); - registerRewards(); - } - - public void performReward(Arena arena, Reward.RewardType type) { - if(enabled) { - arena.getPlayers().forEach(p -> performReward(p, type)); - } - } - - public void performReward(Player player, Reward.RewardType type) { - if(!enabled) { - return; - } - Arena arena = ArenaRegistry.getArena(player); - if(arena == null) { - return; - } - for(Reward reward : rewards) { - if(reward.getType() == type) { - //cannot execute if chance wasn't met - if(reward.getChance() != -1 && ThreadLocalRandom.current().nextInt(0, 100) > reward.getChance()) { - continue; - } - String command = reward.getExecutableCode(); - command = StringUtils.replace(command, "%PLAYER%", player.getName()); - command = formatCommandPlaceholders(command, arena); - switch(reward.getExecutor()) { - case CONSOLE: - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command); - break; - case PLAYER: - player.performCommand(command); - break; - case SCRIPT: - ScriptEngine engine = new ScriptEngine(); - engine.setValue("player", player); - engine.setValue("server", Bukkit.getServer()); - engine.setValue("arena", arena); - engine.execute(command); - break; - default: - break; - } - } - } - } - - private String formatCommandPlaceholders(String command, Arena arena) { - String formatted = command; - formatted = StringUtils.replace(formatted, "%ARENA-ID%", arena.getId()); - formatted = StringUtils.replace(formatted, "%MAPNAME%", arena.getMapName()); - formatted = StringUtils.replace(formatted, "%PLAYERAMOUNT%", Integer.toString(arena.getPlayers().size())); - return formatted; - } - - private void registerRewards() { - if(!enabled) { - return; - } - Debugger.debug(Level.INFO, "[RewardsFactory] Starting rewards registration"); - long start = System.currentTimeMillis(); - - Map registeredRewards = new HashMap<>(); - for(Reward.RewardType rewardType : Reward.RewardType.values()) { - try { - for(String reward : config.getStringList("rewards." + rewardType.getPath())) { - rewards.add(new Reward(rewardType, reward)); - registeredRewards.put(rewardType, registeredRewards.getOrDefault(rewardType, 0) + 1); - } - } catch(Exception ignored) {/*ignored*/} - } - for(Reward.RewardType rewardType : registeredRewards.keySet()) { - Debugger.debug(Level.INFO, "[RewardsFactory] Registered {0} {1} rewards!", registeredRewards.get(rewardType), rewardType.name()); - } - Debugger.debug(Level.INFO, "[RewardsFactory] Registered all rewards took {0}ms", System.currentTimeMillis() - start); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java index 73e10366..deed3764 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java @@ -1,148 +1,345 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package plugily.projects.murdermystery.handlers.setup; -import plugily.projects.inventoryframework.gui.type.ChestGui; -import plugily.projects.inventoryframework.pane.StaticPane; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import plugily.projects.minigamesbox.classic.PluginMain; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.handlers.setup.PluginSetupInventory; +import plugily.projects.minigamesbox.classic.handlers.setup.SetupUtilities; +import plugily.projects.minigamesbox.classic.handlers.setup.items.CountItem; +import plugily.projects.minigamesbox.classic.handlers.setup.items.LocationItem; +import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; +import plugily.projects.minigamesbox.classic.utils.conversation.SimpleConversationBuilder; +import plugily.projects.minigamesbox.classic.utils.dimensional.Cuboid; +import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; +import plugily.projects.minigamesbox.classic.utils.serialization.LocationSerializer; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; +import plugily.projects.minigamesbox.inventory.common.item.ClickableItem; +import plugily.projects.minigamesbox.inventory.common.item.SimpleClickableItem; +import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; import plugily.projects.murdermystery.Main; import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.setup.components.ArenaRegisterComponent; -import plugily.projects.murdermystery.handlers.setup.components.MiscComponents; -import plugily.projects.murdermystery.handlers.setup.components.PlayerAmountComponents; -import plugily.projects.murdermystery.handlers.setup.components.SpawnComponents; -import plugily.projects.murdermystery.handlers.setup.components.SpecialBlocksComponents; - -import java.util.Random; - -/** - * @author Plajer - *

- * Created at 25.05.2019 - */ -public class SetupInventory { - - public static final String VIDEO_LINK = "https://tutorial.plugily.xyz"; - private static final Random random = new Random(); - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - private final FileConfiguration config = ConfigUtils.getConfig(plugin, "arenas"); - private final Arena arena; - private final Player player; - private ChestGui gui; - private final SetupUtilities setupUtilities; - - public SetupInventory(Arena arena, Player player) { - this.arena = arena; - this.player = player; - this.setupUtilities = new SetupUtilities(config, arena, plugin.getChatManager()); - prepareGui(); - } +import plugily.projects.murdermystery.arena.special.SpecialBlock; - private void prepareGui() { - this.gui = new ChestGui(4, "Murder Mystery Arena Setup"); - this.gui.setOnGlobalClick(e -> e.setCancelled(true)); - StaticPane pane = new StaticPane(9, 4); - this.gui.addPane(pane); +import java.util.ArrayList; +import java.util.List; - prepareComponents(pane); - } +public class SetupInventory extends PluginSetupInventory { - private void prepareComponents(StaticPane pane) { - SpawnComponents spawnComponents = new SpawnComponents(); - spawnComponents.prepare(this); - spawnComponents.injectComponents(pane); - PlayerAmountComponents playerAmountComponents = new PlayerAmountComponents(); - playerAmountComponents.prepare(this); - playerAmountComponents.injectComponents(pane); + private final Main plugin; + private Arena arena; + private final Player player; - MiscComponents miscComponents = new MiscComponents(); - miscComponents.prepare(this); - miscComponents.injectComponents(pane); - ArenaRegisterComponent arenaRegisterComponent = new ArenaRegisterComponent(); - arenaRegisterComponent.prepare(this); - arenaRegisterComponent.injectComponents(pane); + public SetupInventory(Main plugin, @Nullable PluginArena arena, Player player) { + super(plugin, arena, player); + this.plugin = plugin; + this.player = player; + setArena(player, arena); + open(); + } - SpecialBlocksComponents specialBlocksComponents = new SpecialBlocksComponents(); - specialBlocksComponents.prepare(this); - specialBlocksComponents.injectComponents(pane); + public SetupInventory(Main plugin, @Nullable PluginArena arena, Player player, SetupUtilities.InventoryStage inventoryStage) { + super(plugin, arena, player, inventoryStage); + this.plugin = plugin; + this.player = player; + setArena(player, arena); + open(); } - private void sendProTip(Player p) { - ChatManager chatManager = plugin.getChatManager(); + @Override + public void setArena(Player player, PluginArena arena) { + if(arena == null && plugin.getSetupUtilities().getArena(player) != null) { + this.arena = plugin.getArenaRegistry().getArena(plugin.getSetupUtilities().getArena(player).getId()); + setInventoryStage(SetupUtilities.InventoryStage.PAGED_GUI); + } else if(arena != null) { + this.arena = plugin.getArenaRegistry().getArena(arena.getId()); + } else { + this.arena = null; + } + setArena(this.arena); + } - switch(random.nextInt(16 + 1)) { - case 0: - p.sendMessage(chatManager.colorRawMessage("&e&lTIP: &7Help us translating plugin to your language here: https://translate.plugily.xyz")); - break; - case 1: - p.sendMessage(chatManager.colorRawMessage("&e&lTIP: &7PlaceholderApi plugin is supported with our plugin! Check here: https://wiki.plugily.xyz/murdermystery/placeholders/placeholderapi")); + @Override + public void addExternalItems(NormalFastInv inv) { + switch (getInventoryStage()) { + case SETUP_GUI: break; - case 2: - p.sendMessage(chatManager.colorRawMessage("&e&lTIP: &7We are open source! You can always help us by contributing! Check https://github.com/Plugily-Projects/MurderMystery")); + case ARENA_LIST: break; - case 3: - p.sendMessage(chatManager.colorRawMessage("&e&lTIP: &7Need help? Check wiki &8https://wiki.plugily.xyz/minecraft/murdermystery &7or discord https://discord.gg/UXzUdTP")); + case PAGED_GUI: break; - case 4: - p.sendMessage(chatManager.colorRawMessage("&e&lTIP: &7Suggest new ideas for the plugin or vote on current ones! https://app.feedbacky.net/b/MurderMystery")); + case PAGED_VALUES: break; - case 5: - p.sendMessage(chatManager.colorRawMessage("&e&lTIP: &7Achievements, ranks and replay ability are things available in our paid addon for this minigame! https://wiki.plugily.xyz/murdermystery/addon/overview")); + case PAGED_BOOLEAN: + inv.setItem(10, new SimpleClickableItem(new ItemBuilder(XMaterial.REDSTONE.parseItem()) + .name(new MessageBuilder(arena.isGoldVisuals() ? "&c&lDisable Gold Visuals" : "&a&lEnable Gold Visuals").build()) + .lore(ChatColor.GRAY + "Enables gold visuals to spawn") + .lore(ChatColor.GRAY + "some particle effects above gold locations") + .build(), event -> { + arena.toggleGoldVisuals(); + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".goldvisuals", arena.isGoldVisuals()); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + plugin.openSetupInventory(arena, player, SetupUtilities.InventoryStage.PAGED_BOOLEAN); + })); break; - default: + case PAGED_COUNTABLE: + inv.setItem(11, new CountItem(new ItemBuilder(Material.REDSTONE_TORCH) + .amount(plugin.getSetupUtilities().getMinimumValueHigherThanZero("spawngoldtime", this)) + .name(new MessageBuilder("&e&lSet gold spawn time in seconds").build()) + .lore(ChatColor.GRAY + "LEFT click to decrease") + .lore(ChatColor.GRAY + "RIGHT click to increase") + .lore(ChatColor.DARK_GRAY + "How much gold should be spawned? ") + .lore(ChatColor.DARK_GRAY + "That means 1 gold spawned every ... seconds") + .lore(ChatColor.DARK_GRAY + "Default: 5") + .lore(ChatColor.DARK_GRAY + "Every 5 seconds it will spawn 1 gold") + .lore("", plugin.getSetupUtilities().isOptionDone("spawngoldtime", this)) + .build(), e -> { + ItemStack currentItem = e.getCurrentItem(); + if(currentItem == null) { + return; + } + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".spawngoldtime", e.getCurrentItem().getAmount()); + arena.setSpawnGoldTime(e.getCurrentItem().getAmount()); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + inv.refresh(); + })); + + + inv.setItem(12, new CountItem(new ItemBuilder(Material.IRON_SWORD) + .amount(plugin.getSetupUtilities().getMinimumValueHigherThanZero("playerpermurderer", this)) + .name(new MessageBuilder("&e&lSet Player Per Murderer Amount").build()) + .lore(ChatColor.GRAY + "LEFT click to decrease") + .lore(ChatColor.GRAY + "RIGHT click to increase") + .lore(ChatColor.DARK_GRAY + "How many murderer should be ingame? This means ") + .lore(ChatColor.DARK_GRAY + "one murderer for that amount of players. Default: ") + .lore(ChatColor.DARK_GRAY + "5 players are 1 murderer, that means if we have ") + .lore(ChatColor.DARK_GRAY + "14 Players it will calculate 2 murderer! ") + .lore(ChatColor.DARK_GRAY + "Set it to 1 if you want only one murderer ") + .lore("", plugin.getSetupUtilities().isOptionDone("playerpermurderer", this)) + .build(), e -> { + ItemStack currentItem = e.getCurrentItem(); + if(currentItem == null) { + return; + } + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".playerpermurderer", e.getCurrentItem().getAmount()); + arena.setArenaOption("MURDERER_DIVIDER", e.getCurrentItem().getAmount()); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + inv.refresh(); + })); + inv.setItem(13, new CountItem(new ItemBuilder(Material.BOW) + .amount(plugin.getSetupUtilities().getMinimumValueHigherThanZero("playerperdetective", this)) + .name(new MessageBuilder("&e&lSet Player Per Detective Amount").build()) + .lore(ChatColor.GRAY + "LEFT click to decrease") + .lore(ChatColor.GRAY + "RIGHT click to increase") + .lore(ChatColor.DARK_GRAY + "How many detectives should be ingame? This means ") + .lore(ChatColor.DARK_GRAY + "one detective for that amount of players. Default: ") + .lore(ChatColor.DARK_GRAY + "7 players are 1 detective, that means if we have ") + .lore(ChatColor.DARK_GRAY + "18 Players it will calculate 2 detectives! ") + .lore(ChatColor.DARK_GRAY + "Set it to 1 if you want only one detectives ") + .lore("", plugin.getSetupUtilities().isOptionDone("playerperdetective", this)) + .build(), e -> { + ItemStack currentItem = e.getCurrentItem(); + if(currentItem == null) { + return; + } + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".playerperdetective", e.getCurrentItem().getAmount()); + arena.setArenaOption("DETECTIVE_DIVIDER", e.getCurrentItem().getAmount()); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + inv.refresh(); + })); + break; - } - } + case PAGED_LOCATIONS: + inv.setItem(22, new LocationItem(new ItemBuilder(XMaterial.GOLD_INGOT.parseMaterial()) + .name(new MessageBuilder("&e&lAdd Gold Spawn").build()) + .lore(ChatColor.GRAY + "Add new gold spawn") + .lore(ChatColor.GRAY + "on the place you're standing at.") + .lore("", plugin.getSetupUtilities().isOptionDoneSection("goldspawnpoints", 4,this)) + .build(), e -> { + if(e.getClick() == ClickType.SHIFT_RIGHT) { + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".goldspawnpoints", new ArrayList<>()); + arena.setGoldSpawnPoints(new ArrayList<>()); + new MessageBuilder("&eDone | &aGold spawn points deleted, you can add them again now!").player(player).sendPlayer(); + arena.setReady(false); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + return; + } - public void openInventory() { - sendProTip(player); - gui.show(player); - } + List goldSpawns = plugin.getSetupUtilities().getConfig().getStringList("instances." + arena.getId() + ".goldspawnpoints"); + goldSpawns.add(LocationSerializer.locationToString(player.getLocation())); + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".goldspawnpoints", goldSpawns); + String goldProgress = goldSpawns.size() >= 4 ? "&e✔ Completed | " : "&c✘ Not completed | "; + new MessageBuilder(goldProgress + "&aGold spawn added! &8(&7" + goldSpawns.size() + "/4&8)").player(player).sendPlayer(); + if(goldSpawns.size() == 4) { + new MessageBuilder("&eInfo | &aYou can add more than 4 gold spawns! Four is just a minimum!").player(player).sendPlayer(); + } + List spawns = new ArrayList<>(arena.getGoldSpawnPoints()); + spawns.add(player.getLocation()); + arena.setGoldSpawnPoints(spawns); - public Main getPlugin() { - return plugin; - } + new MessageBuilder("&e✔ Completed | &aGold spawn location for arena " + arena.getId() + " set at your location!").player(player).sendPlayer(); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + }, event -> { + new MessageBuilder("&cNot supported!").prefix().player(player).sendPlayer(); + }, false, false, false)); - public FileConfiguration getConfig() { - return config; - } + inv.setItem(23, new LocationItem(new ItemBuilder(XMaterial.EMERALD_BLOCK.parseMaterial()) + .name(new MessageBuilder("&e&lAdd Starting Location").build()) + .lore(ChatColor.GRAY + "Click to add the starting location") + .lore(ChatColor.GRAY + "on the place where you are standing.") + .lore(ChatColor.DARK_GRAY + "(locations where players will be") + .lore(ChatColor.DARK_GRAY + "teleported when game starts)") + .lore("", plugin.getSetupUtilities().isOptionDoneSection("playerspawnpoints", 4,this)) + .build(), e -> { + if(e.getClick() == ClickType.SHIFT_RIGHT) { + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".playerspawnpoints", new ArrayList<>()); + arena.setPlayerSpawnPoints(new ArrayList<>()); + new MessageBuilder("&eDone | &aPlayerSpawnPoints spawn points deleted, you can add them again now!").player(player).sendPlayer(); + arena.setReady(false); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + return; + } - public Arena getArena() { - return arena; - } + List startingPoints = plugin.getSetupUtilities().getConfig().getStringList("instances." + arena.getId() + ".playerspawnpoints"); + startingPoints.add(LocationSerializer.locationToString(player.getLocation())); + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".playerspawnpoints", startingPoints); + String startingProgress = startingPoints.size() >= 4 ? "&e✔ Completed | " : "&c✘ Not completed | "; + new MessageBuilder(startingProgress + "&aPlayer spawn added! &8(&7" + startingPoints.size() + "/4&8)").player(player).sendPlayer(); + if(startingPoints.size() == 4) { + new MessageBuilder("&eInfo | &aYou can add more than 4 PlayerSpawnPoints locations! Four is just a minimum!").player(player).sendPlayer(); + } + List spawns = new ArrayList<>(arena.getGoldSpawnPoints()); + spawns.add(player.getLocation()); + arena.setPlayerSpawnPoints(spawns); - public Player getPlayer() { - return player; - } + new MessageBuilder("&e✔ Completed | &aPlayerSpawnPoints location for arena " + arena.getId() + " set at your location!").player(player).sendPlayer(); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + }, event -> { + new MessageBuilder("&cNot supported!").prefix().player(player).sendPlayer(); + }, false, false, false)); - public ChestGui getGui() { - return gui; - } + inv.setItem(30, new LocationItem(new ItemBuilder(Material.ENDER_CHEST) + .name(new MessageBuilder("&e&lAdd Mystery Cauldron").build()) + .lore(ChatColor.GRAY + "Target a cauldron and add it to the game") + .lore(ChatColor.GRAY + "it will cost 1 gold per potion!") + .lore(ChatColor.GRAY + "Configure cauldron potions in specialblocks.yml file!") + .build(), e -> { + e.getWhoClicked().closeInventory(); + Block targetBlock = e.getWhoClicked().getTargetBlock(null, 7); + if(targetBlock.getType() != Material.CAULDRON) { + e.getWhoClicked().sendMessage(ChatColor.RED + "Please target cauldron to continue!"); + return; + } + arena.loadSpecialBlock(new SpecialBlock(targetBlock.getLocation(), + SpecialBlock.SpecialBlockType.MYSTERY_CAULDRON)); + List cauldrons = new ArrayList<>(plugin.getSetupUtilities().getConfig().getStringList("instances." + arena.getId() + ".mystery-cauldrons")); + cauldrons.add(LocationSerializer.locationToString(targetBlock.getLocation())); + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".mystery-cauldrons", cauldrons); + new MessageBuilder("&e✔ Completed | &aAdded Cauldron special block for arena " + arena.getId() + " set at your location!").player(player).sendPlayer(); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + }, event -> { + new MessageBuilder("&cNot supported!").prefix().player(player).sendPlayer(); + }, false, false, false)); + inv.setItem(31, new LocationItem(new ItemBuilder(Material.ENDER_CHEST) + .name(new MessageBuilder("&e&lAdd Confessional").build()) + .lore(ChatColor.GRAY + "Target enchanting table and") + .lore(ChatColor.GRAY + "add praise to the developer") + .lore(ChatColor.GRAY + "confessional, gift for") + .lore(ChatColor.GRAY + "the developer costs 1 gold!") + .lore(ChatColor.GOLD + "Add some levers in radius") + .lore(ChatColor.GOLD + "of 3 blocks near the enchant table") + .lore(ChatColor.GOLD + "to allow users to pray there!") + .lore(ChatColor.RED + "You can either get gifts") + .lore(ChatColor.RED + "or curses from prayer!") + .build(), e -> { + e.getWhoClicked().closeInventory(); + Block targetBlock = e.getWhoClicked().getTargetBlock(null, 7); + if(targetBlock.getType() != XMaterial.ENCHANTING_TABLE.parseMaterial()) { + e.getWhoClicked().sendMessage(ChatColor.RED + "Please target enchanting table to continue!"); + return; + } + arena.loadSpecialBlock(new SpecialBlock(targetBlock.getLocation(), + SpecialBlock.SpecialBlockType.PRAISE_DEVELOPER)); + List confessionals = new ArrayList<>(plugin.getSetupUtilities().getConfig().getStringList("instances." + arena.getId() + ".confessionals")); + confessionals.add(LocationSerializer.locationToString(targetBlock.getLocation())); + plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".confessionals", confessionals); + new MessageBuilder("&e✔ Completed | &aAdded Confessional special block for arena " + arena.getId() + " set at your location!").player(player).sendPlayer(); + new MessageBuilder("&eInfo | &aRemember to place any lever in radius of 3 near enchant table!").player(player).sendPlayer(); + ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); + }, event -> { + new MessageBuilder("&cNot supported!").prefix().player(player).sendPlayer(); + }, false, false, false)); + + break; + default: + break; + } + inv.refresh(); +} + + @Override + public boolean addAdditionalArenaValidateValues(InventoryClickEvent event, PluginArena arena, PluginMain plugin, FileConfiguration config) { + for(String s : new String[]{"goldspawnpoints", "playerspawnpoints"}) { + if(!config.isSet("instances." + arena.getId() + "." + s) || config.getStringList("instances." + arena.getId() + "." + s).size() < 4) { + new MessageBuilder("&c&l✘ &cArena validation failed! Please configure following spawns properly: "+ s + " (must be minimum 4 spawns)").send(event.getWhoClicked()); + return false; + } + } - public SetupUtilities getSetupUtilities() { - return setupUtilities; + return true; } + @Override + public void addAdditionalArenaSetValues(PluginArena arena, FileConfiguration config) { + Arena pluginArena = plugin.getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return; + } + List playerSpawnPoints = new ArrayList<>(); + for(String loc : config.getStringList("instances." + arena.getId() + ".playerspawnpoints")) { + playerSpawnPoints.add(LocationSerializer.getLocation(loc)); + } + pluginArena.setPlayerSpawnPoints(playerSpawnPoints); + List goldSpawnPoints = new ArrayList<>(); + for(String loc : config.getStringList("instances." + arena.getId() + ".goldspawnpoints")) { + goldSpawnPoints.add(LocationSerializer.getLocation(loc)); + } + pluginArena.setGoldSpawnPoints(goldSpawnPoints); + + List specialBlocks = new ArrayList<>(); + if(config.isSet("instances." + arena.getId() + ".mystery-cauldrons")) { + for(String loc : config.getStringList("instances." + arena.getId() + ".mystery-cauldrons")) { + specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.MYSTERY_CAULDRON)); + } + } + if(config.isSet("instances." + arena.getId() + ".confessionals")) { + for(String loc : config.getStringList("instances." + arena.getId() + ".confessionals")) { + specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.PRAISE_DEVELOPER)); + } + } + for(SpecialBlock specialBlock : specialBlocks) { + if(!pluginArena.getSpecialBlocks().contains(specialBlock)) { + pluginArena.loadSpecialBlock(specialBlock); + } + } + pluginArena.setSpawnGoldTime(config.getInt("instances." + arena.getId() + ".spawngoldtime", 5)); + pluginArena.setHideChances(config.getBoolean("instances." + arena.getId() + ".hidechances", false)); + pluginArena.setArenaOption("MURDERER_DIVIDER", config.getInt("instances." + arena.getId() + ".playerpermurderer", 5)); + pluginArena.setArenaOption("DETECTIVE_DIVIDER",config.getInt("instances." + arena.getId() + ".playerperdetective", 7)); + } } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupUtilities.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupUtilities.java deleted file mode 100644 index a77aed3d..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupUtilities.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.setup; - -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.FileConfiguration; - -import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.handlers.ChatManager; - -/** - * @author Plajer - *

- * Created at 25.05.2019 - */ -public class SetupUtilities { - - private final FileConfiguration config; - private final Arena arena; - private final ChatManager chatManager; - - SetupUtilities(FileConfiguration config, Arena arena, ChatManager chatManager) { - this.config = config; - this.arena = arena; - this.chatManager = chatManager; - } - - public String isOptionDone(String path) { - String option = config.getString(path); - - if(option != null) { - return chatManager.colorRawMessage("&a&l✔ Completed &7(value: &8" + option + "&7)"); - } - - return chatManager.colorRawMessage("&c&l✘ Not Completed"); - } - - public String isOptionDoneList(String path, int minimum) { - int listSize = config.getStringList(path).size(); - - if(listSize != 0) { - if(listSize < minimum) { - return chatManager.colorRawMessage("&c&l✘ Not Completed | &cPlease add more spawns"); - } - - return chatManager.colorRawMessage("&a&l✔ Completed &7(value: &8" + listSize + "&7)"); - } - - return chatManager.colorRawMessage("&c&l✘ Not Completed"); - } - - public String isOptionDoneBool(String path) { - String option = config.getString(path); - - if(option != null) { - if(Bukkit.getServer().getWorlds().get(0).getSpawnLocation().equals(LocationSerializer.getLocation(option))) { - return chatManager.colorRawMessage("&c&l✘ Not Completed"); - } - - return chatManager.colorRawMessage("&a&l✔ Completed"); - } - - return chatManager.colorRawMessage("&c&l✘ Not Completed"); - } - - public int getMinimumValueHigherThanZero(String path) { - int amount = config.getInt("instances." + arena.getId() + "." + path); - return amount == 0 ? 1 : amount; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/ArenaRegisterComponent.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/components/ArenaRegisterComponent.java deleted file mode 100644 index 0ecb0c59..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/ArenaRegisterComponent.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.setup.components; - -import plugily.projects.inventoryframework.gui.GuiItem; -import plugily.projects.inventoryframework.pane.StaticPane; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Sign; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.inventory.ItemStack; -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.item.ItemBuilder; -import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.special.SpecialBlock; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.setup.SetupInventory; -import plugily.projects.murdermystery.handlers.sign.ArenaSign; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Plajer - *

- * Created at 25.05.2019 - */ -public class ArenaRegisterComponent implements SetupComponent { - - private SetupInventory setupInventory; - - @Override - public void prepare(SetupInventory setupInventory) { - this.setupInventory = setupInventory; - } - - @Override - public void injectComponents(StaticPane pane) { - Main plugin = setupInventory.getPlugin(); - ChatManager chatManager = plugin.getChatManager(); - ItemStack registeredItem; - if(!setupInventory.getArena().isReady()) { - registeredItem = new ItemBuilder(XMaterial.FIREWORK_ROCKET.parseItem()) - .name(chatManager.colorRawMessage("&e&lRegister Arena - Finish Setup")) - .lore(ChatColor.GRAY + "Click this when you're done with configuration.") - .lore(ChatColor.GRAY + "It will validate and register arena.") - .build(); - } else { - registeredItem = new ItemBuilder(Material.BARRIER) - .name(chatManager.colorRawMessage("&a&lArena Registered - Congratulations")) - .lore(ChatColor.GRAY + "This arena is already registered!") - .lore(ChatColor.GRAY + "Good job, you went through whole setup!") - .lore(ChatColor.GRAY + "You can play on this arena now!") - .build(); - } - pane.addItem(new GuiItem(registeredItem, e -> { - Arena arena = setupInventory.getArena(); - e.getWhoClicked().closeInventory(); - if(arena.isReady()) { - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&a&l✔ &aThis arena was already validated and is ready to use!")); - return; - } - String path = "instances." + arena.getId() + "."; - FileConfiguration arenasConfig = ConfigUtils.getConfig(plugin, "arenas"); - for(String s : new String[]{"lobbylocation", "Endlocation"}) { - if(!arenasConfig.isSet(path + s) || arenasConfig.getString(path + s).equals(LocationSerializer.locationToString(Bukkit.getWorlds().get(0).getSpawnLocation()))) { - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&c&l✘ &cArena validation failed! Please configure following spawn properly: " + s + " (cannot be world spawn location)")); - return; - } - } - for(String s : new String[]{"goldspawnpoints", "playerspawnpoints"}) { - if(!arenasConfig.isSet(path + s) || arenasConfig.getStringList(path + s).size() < 4) { - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&c&l✘ &cArena validation failed! Please configure following spawns properly: " + s + " (must be minimum 4 spawns)")); - return; - } - } - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&a&l✔ &aValidation succeeded! Registering new arena instance: " + arena.getId())); - - arenasConfig.set(path + "isdone", true); - ConfigUtils.saveConfig(plugin, arenasConfig, "arenas"); - - List signsToUpdate = new ArrayList<>(); - ArenaRegistry.unregisterArena(setupInventory.getArena()); - - plugin.getSignManager().getArenaSigns().stream().filter(arenaSign -> arenaSign.getArena().equals(setupInventory.getArena())) - .forEach(arenaSign -> signsToUpdate.add(arenaSign.getSign())); - - arena = new Arena(setupInventory.getArena().getId()); - arena.setReady(true); - List playerSpawnPoints = new ArrayList<>(); - for(String loc : arenasConfig.getStringList(path + "playerspawnpoints")) { - playerSpawnPoints.add(LocationSerializer.getLocation(loc)); - } - arena.setPlayerSpawnPoints(playerSpawnPoints); - List goldSpawnPoints = new ArrayList<>(); - for(String loc : arenasConfig.getStringList(path + "goldspawnpoints")) { - goldSpawnPoints.add(LocationSerializer.getLocation(loc)); - } - arena.setGoldSpawnPoints(goldSpawnPoints); - - List specialBlocks = new ArrayList<>(); - if(arenasConfig.isSet(path + "mystery-cauldrons")) { - for(String loc : arenasConfig.getStringList(path + "mystery-cauldrons")) { - specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.MYSTERY_CAULDRON)); - } - } - if(arenasConfig.isSet(path + "confessionals")) { - for(String loc : arenasConfig.getStringList(path + "confessionals")) { - specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.PRAISE_DEVELOPER)); - } - } - for(SpecialBlock specialBlock : specialBlocks) { - if(!arena.getSpecialBlocks().contains(specialBlock)) { - arena.loadSpecialBlock(specialBlock); - } - } - arena.setMinimumPlayers(arenasConfig.getInt(path + "minimumplayers")); - arena.setMaximumPlayers(arenasConfig.getInt(path + "maximumplayers")); - arena.setMapName(arenasConfig.getString(path + "mapname")); - arena.setSpawnGoldTime(arenasConfig.getInt(path + "spawngoldtime", 5)); - arena.setHideChances(arenasConfig.getBoolean(path + "hidechances", false)); - arena.setLobbyLocation(LocationSerializer.getLocation(arenasConfig.getString(path + "lobbylocation"))); - arena.setEndLocation(LocationSerializer.getLocation(arenasConfig.getString(path + "Endlocation"))); - arena.setMurderers(arenasConfig.getInt(path + "playerpermurderer", 5)); - arena.setDetectives(arenasConfig.getInt(path + "playerperdetective", 7)); - ArenaRegistry.registerArena(arena); - arena.start(); - plugin.getSignManager().getArenaSigns().clear(); - for(Sign s : signsToUpdate) { - plugin.getSignManager().getArenaSigns().add(new ArenaSign(s, arena)); - plugin.getSignManager().updateSigns(); - } - }), 8, 0); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/MiscComponents.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/components/MiscComponents.java deleted file mode 100644 index 79d222c1..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/MiscComponents.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.setup.components; - -import plugily.projects.inventoryframework.gui.GuiItem; -import plugily.projects.inventoryframework.pane.StaticPane; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Sign; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.conversations.ConversationContext; -import org.bukkit.conversations.Prompt; -import org.bukkit.conversations.StringPrompt; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; - -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.item.ItemBuilder; -import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.setup.SetupInventory; -import plugily.projects.murdermystery.handlers.sign.ArenaSign; -import plugily.projects.murdermystery.utils.conversation.SimpleConversationBuilder; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Plajer - *

- * Created at 25.05.2019 - */ -public class MiscComponents implements SetupComponent { - - private SetupInventory setupInventory; - - @Override - public void prepare(SetupInventory setupInventory) { - this.setupInventory = setupInventory; - } - - @Override - public void injectComponents(StaticPane pane) { - Player player = setupInventory.getPlayer(); - FileConfiguration config = setupInventory.getConfig(); - Arena arena = setupInventory.getArena(); - Main plugin = setupInventory.getPlugin(); - ChatManager chatManager = plugin.getChatManager(); - ItemStack bungeeItem; - if(!plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - bungeeItem = new ItemBuilder(XMaterial.OAK_SIGN.parseMaterial()) - .name(chatManager.colorRawMessage("&e&lAdd Game Sign")) - .lore(ChatColor.GRAY + "Target a sign and click this.") - .lore(ChatColor.DARK_GRAY + "(this will set target sign as game sign)") - .build(); - } else { - bungeeItem = new ItemBuilder(Material.BARRIER) - .name(chatManager.colorRawMessage("&c&lAdd Game Sign")) - .lore(ChatColor.GRAY + "Option disabled in bungee cord mode.") - .lore(ChatColor.DARK_GRAY + "Bungee mode is meant to be one arena per server") - .lore(ChatColor.DARK_GRAY + "If you wish to have multi arena, disable bungee in config!") - .build(); - } - pane.addItem(new GuiItem(bungeeItem, e -> { - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.BUNGEE_ENABLED)) { - return; - } - e.getWhoClicked().closeInventory(); - Location location = player.getTargetBlock(null, 10).getLocation(); - if(!(location.getBlock().getState() instanceof Sign)) { - player.sendMessage(chatManager.colorMessage("Commands.Look-Sign")); - return; - } - if(location.distance(e.getWhoClicked().getWorld().getSpawnLocation()) <= Bukkit.getServer().getSpawnRadius() - && e.getClick() != ClickType.SHIFT_LEFT) { - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&c&l✖ &cWarning | Server spawn protection is set to &6" + Bukkit.getServer().getSpawnRadius() - + " &cand sign you want to place is in radius of this protection! &c&lNon opped players won't be able to interact with this sign and can't join the game so.")); - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&cYou can ignore this warning and add sign with Shift + Left Click, but for now &c&loperation is cancelled")); - return; - } - plugin.getSignManager().getArenaSigns().add(new ArenaSign((Sign) location.getBlock().getState(), arena)); - plugin.getSignManager().updateSigns(); - player.sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Signs.Sign-Created")); - String signLoc = location.getBlock().getWorld().getName() + "," + location.getBlock().getX() + "," + location.getBlock().getY() + "," + location.getBlock().getZ() + ",0.0,0.0"; - List locs = config.getStringList("instances." + arena.getId() + ".signs"); - locs.add(signLoc); - config.set("instances." + arena.getId() + ".signs", locs); - ConfigUtils.saveConfig(plugin, config, "arenas"); - }), 5, 0); - - pane.addItem(new GuiItem(new ItemBuilder(Material.NAME_TAG) - .name(chatManager.colorRawMessage("&e&lSet Map Name")) - .lore(ChatColor.GRAY + "Click to set arena map name") - .lore("", chatManager.colorRawMessage("&a&lCurrently: &e" + config.getString("instances." + arena.getId() + ".mapname"))) - .build(), e -> { - e.getWhoClicked().closeInventory(); - new SimpleConversationBuilder().withPrompt(new StringPrompt() { - @Override - public String getPromptText(@NotNull ConversationContext context) { - return chatManager.colorRawMessage(chatManager.getPrefix() + "&ePlease type in chat arena name! You can use color codes."); - } - - @Override - public Prompt acceptInput(@NotNull ConversationContext context, String input) { - String name = chatManager.colorRawMessage(input); - player.sendRawMessage(chatManager.colorRawMessage("&e✔ Completed | &aName of arena " + arena.getId() + " set to " + name)); - arena.setMapName(name); - config.set("instances." + arena.getId() + ".mapname", arena.getMapName()); - ConfigUtils.saveConfig(plugin, config, "arenas"); - - new SetupInventory(arena, player).openInventory(); - return Prompt.END_OF_CONVERSATION; - } - }).buildFor(player); - }), 6, 0); - - pane.addItem(new GuiItem(new ItemBuilder(Material.GOLD_INGOT) - .name(chatManager.colorRawMessage("&e&lAdd Gold Spawn")) - .lore(ChatColor.GRAY + "Add new gold spawn") - .lore(ChatColor.GRAY + "on the place you're standing at.") - .lore("", setupInventory.getSetupUtilities().isOptionDoneList("instances." + arena.getId() + ".goldspawnpoints", 4)) - .lore("", chatManager.colorRawMessage("&8Shift + Right Click to remove all spawns")) - .build(), e -> { - e.getWhoClicked().closeInventory(); - if(e.getClick() == ClickType.SHIFT_RIGHT) { - config.set("instances." + arena.getId() + ".goldspawnpoints", new ArrayList<>()); - arena.setGoldSpawnPoints(new ArrayList<>()); - player.sendMessage(chatManager.colorRawMessage("&eDone | &aGold spawn points deleted, you can add them again now!")); - arena.setReady(false); - ConfigUtils.saveConfig(plugin, config, "arenas"); - return; - } - List goldSpawns = config.getStringList("instances." + arena.getId() + ".goldspawnpoints"); - goldSpawns.add(LocationSerializer.locationToString(player.getLocation())); - config.set("instances." + arena.getId() + ".goldspawnpoints", goldSpawns); - String goldProgress = goldSpawns.size() >= 4 ? "&e✔ Completed | " : "&c✘ Not completed | "; - player.sendMessage(chatManager.colorRawMessage(goldProgress + "&aGold spawn added! &8(&7" + goldSpawns.size() + "/4&8)")); - if(goldSpawns.size() == 4) { - player.sendMessage(chatManager.colorRawMessage("&eInfo | &aYou can add more than 4 gold spawns! Four is just a minimum!")); - } - List spawns = new ArrayList<>(arena.getGoldSpawnPoints()); - spawns.add(player.getLocation()); - arena.setGoldSpawnPoints(spawns); - ConfigUtils.saveConfig(plugin, config, "arenas"); - }), 7, 0); - - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.GOLD_NUGGET.parseItem()) - .amount(config.getInt("instances." + arena.getId() + ".spawngoldtime", 3)) - .name(chatManager.colorRawMessage("&e&lSet gold spawn time in seconds")) - .lore(ChatColor.GRAY + "LEFT click to decrease") - .lore(ChatColor.GRAY + "RIGHT click to increase") - .lore(ChatColor.DARK_GRAY + "How much gold should be spawned? ") - .lore(ChatColor.DARK_GRAY + "That means 1 gold spawned every ... seconds") - .lore(ChatColor.DARK_GRAY + "Default: 5") - .lore(ChatColor.DARK_GRAY + "Every 5 seconds it will spawn 1 gold") - .lore("", setupInventory.getSetupUtilities().isOptionDone("instances." + arena.getId() + ".spawngoldtime")) - .build(), e -> { - if(e.getClick().isRightClick()) { - e.getCurrentItem().setAmount(e.getCurrentItem().getAmount() + 1); - } - if(e.getClick().isLeftClick() && e.getCurrentItem().getAmount() > 1) { - e.getCurrentItem().setAmount(e.getCurrentItem().getAmount() - 1); - } - if(e.getInventory().getItem(e.getSlot()).getAmount() < 1) { - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&c&l✖ &cWarning | Please do not set amount lower than 1! Game is not designed without gold!")); - e.getInventory().getItem(e.getSlot()).setAmount(1); - } - config.set("instances." + arena.getId() + ".spawngoldtime", e.getCurrentItem().getAmount()); - arena.setSpawnGoldTime(e.getCurrentItem().getAmount()); - ConfigUtils.saveConfig(plugin, config, "arenas"); - new SetupInventory(arena, setupInventory.getPlayer()).openInventory(); - }), 7, 1); - - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.REDSTONE.parseItem()) - .name(chatManager.colorRawMessage(arena.isGoldVisuals() ? "&c&lDisable Gold Visuals" : "&a&lEnable Gold Visuals")) - .lore(ChatColor.GRAY + "Enables gold visuals to spawn").lore(ChatColor.GRAY + "some particle effects above gold locations") - .build(), e -> { - arena.toggleGoldVisuals(); - config.set("instances." + arena.getId() + ".goldvisuals", arena.isGoldVisuals()); - ConfigUtils.saveConfig(plugin, config, "arenas"); - new SetupInventory(arena, setupInventory.getPlayer()).openInventory(); - }), 7, 2); - - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.FILLED_MAP.parseItem()) - .name(chatManager.colorRawMessage("&e&lView Setup Video")) - .lore(ChatColor.GRAY + "Having problems with setup or wanna") - .lore(ChatColor.GRAY + "know some useful tips? Click to get video link!") - .build(), e -> { - e.getWhoClicked().closeInventory(); - player.sendMessage(chatManager.getPrefix() + chatManager.colorRawMessage("&6Check out this video: " + SetupInventory.VIDEO_LINK)); - }), 8, 1); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/PlayerAmountComponents.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/components/PlayerAmountComponents.java deleted file mode 100644 index b4aa6771..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/PlayerAmountComponents.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.setup.components; - -import plugily.projects.inventoryframework.gui.GuiItem; -import plugily.projects.inventoryframework.pane.StaticPane; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.configuration.file.FileConfiguration; - -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.item.ItemBuilder; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.setup.SetupInventory; - -/** - * @author Plajer - *

- * Created at 25.05.2019 - */ -public class PlayerAmountComponents implements SetupComponent { - - private SetupInventory setupInventory; - - @Override - public void prepare(SetupInventory setupInventory) { - this.setupInventory = setupInventory; - } - - @Override - public void injectComponents(StaticPane pane) { - FileConfiguration config = setupInventory.getConfig(); - Arena arena = setupInventory.getArena(); - Main plugin = setupInventory.getPlugin(); - ChatManager chatManager = plugin.getChatManager(); - pane.addItem(new GuiItem(new ItemBuilder(Material.COAL).amount(setupInventory.getSetupUtilities().getMinimumValueHigherThanZero("minimumplayers")) - .name(chatManager.colorRawMessage("&e&lSet Minimum Players Amount")) - .lore(ChatColor.GRAY + "LEFT click to decrease") - .lore(ChatColor.GRAY + "RIGHT click to increase") - .lore(ChatColor.DARK_GRAY + "(how many players are needed") - .lore(ChatColor.DARK_GRAY + "for game to start lobby countdown)") - .lore("", setupInventory.getSetupUtilities().isOptionDone("instances." + arena.getId() + ".minimumplayers")) - .build(), e -> { - if(e.getClick().isRightClick()) { - e.getInventory().getItem(e.getSlot()).setAmount(e.getCurrentItem().getAmount() + 1); - } - if(e.getClick().isLeftClick()) { - e.getInventory().getItem(e.getSlot()).setAmount(e.getCurrentItem().getAmount() - 1); - } - if(e.getInventory().getItem(e.getSlot()).getAmount() <= 1) { - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&c&l✖ &cWarning | Please do not set amount lower than 2! Game is designed for 2 or more players!")); - e.getInventory().getItem(e.getSlot()).setAmount(2); - } - config.set("instances." + arena.getId() + ".minimumplayers", e.getCurrentItem().getAmount()); - arena.setMinimumPlayers(e.getCurrentItem().getAmount()); - ConfigUtils.saveConfig(plugin, config, "arenas"); - new SetupInventory(arena, setupInventory.getPlayer()).openInventory(); - }), 3, 0); - - pane.addItem(new GuiItem(new ItemBuilder(Material.REDSTONE) - .amount(setupInventory.getSetupUtilities().getMinimumValueHigherThanZero("maximumplayers")) - .name(chatManager.colorRawMessage("&e&lSet Maximum Players Amount")) - .lore(ChatColor.GRAY + "LEFT click to decrease") - .lore(ChatColor.GRAY + "RIGHT click to increase") - .lore(ChatColor.DARK_GRAY + "(how many players arena can hold)") - .lore("", setupInventory.getSetupUtilities().isOptionDone("instances." + arena.getId() + ".maximumplayers")) - .build(), e -> { - if(e.getClick().isRightClick()) { - e.getCurrentItem().setAmount(e.getCurrentItem().getAmount() + 1); - } - if(e.getClick().isLeftClick()) { - e.getCurrentItem().setAmount(e.getCurrentItem().getAmount() - 1); - } - if(e.getInventory().getItem(e.getSlot()).getAmount() <= 1) { - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&c&l✖ &cWarning | Please do not set amount lower than 2! Game is designed for 2 or more players!")); - e.getInventory().getItem(e.getSlot()).setAmount(2); - } - config.set("instances." + arena.getId() + ".maximumplayers", e.getCurrentItem().getAmount()); - arena.setMaximumPlayers(e.getCurrentItem().getAmount()); - ConfigUtils.saveConfig(plugin, config, "arenas"); - new SetupInventory(arena, setupInventory.getPlayer()).openInventory(); - }), 4, 0); - - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.IRON_SWORD.parseItem()) - .amount(setupInventory.getSetupUtilities().getMinimumValueHigherThanZero("playerpermurderer")) - .name(chatManager.colorRawMessage("&e&lSet Player Per Murderer Amount")) - .lore(ChatColor.GRAY + "LEFT click to decrease") - .lore(ChatColor.GRAY + "RIGHT click to increase") - .lore(ChatColor.DARK_GRAY + "How many murderer should be ingame? This means ") - .lore(ChatColor.DARK_GRAY + "one murderer for that amount of players. Default: ") - .lore(ChatColor.DARK_GRAY + "5 players are 1 murderer, that means if we have ") - .lore(ChatColor.DARK_GRAY + "14 Players it will calculate 2 murderer! ") - .lore(ChatColor.DARK_GRAY + "Set it to 1 if you want only one murderer ") - .lore("", setupInventory.getSetupUtilities().isOptionDone("instances." + arena.getId() + ".playerpermurderer")) - .build(), e -> { - if(e.getClick().isRightClick()) { - e.getCurrentItem().setAmount(e.getCurrentItem().getAmount() + 1); - } - if(e.getClick().isLeftClick() && e.getCurrentItem().getAmount() > 1) { - e.getCurrentItem().setAmount(e.getCurrentItem().getAmount() - 1); - } - if(e.getInventory().getItem(e.getSlot()).getAmount() < 1) { - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&c&l✖ &cWarning | Please do not set amount lower than 1! Game is not designed for more murderers than players!")); - e.getInventory().getItem(e.getSlot()).setAmount(1); - } - config.set("instances." + arena.getId() + ".playerpermurderer", e.getCurrentItem().getAmount()); - arena.setMurderers(e.getCurrentItem().getAmount()); - ConfigUtils.saveConfig(plugin, config, "arenas"); - new SetupInventory(arena, setupInventory.getPlayer()).openInventory(); - }), 3, 1); - - - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.BOW.parseItem()) - .amount(setupInventory.getSetupUtilities().getMinimumValueHigherThanZero("playerperdetective")) - .name(chatManager.colorRawMessage("&e&lSet Player Per Detective Amount")) - .lore(ChatColor.GRAY + "LEFT click to decrease") - .lore(ChatColor.GRAY + "RIGHT click to increase") - .lore(ChatColor.DARK_GRAY + "How many detectives should be ingame? This means ") - .lore(ChatColor.DARK_GRAY + "one detective for that amount of players. Default: ") - .lore(ChatColor.DARK_GRAY + "7 players are 1 detective, that means if we have ") - .lore(ChatColor.DARK_GRAY + "18 Players it will calculate 2 detectives! ") - .lore(ChatColor.DARK_GRAY + "Set it to 1 if you want only one detectives ") - .lore("", setupInventory.getSetupUtilities().isOptionDone("instances." + arena.getId() + ".playerperdetective")) - .build(), e -> { - if(e.getClick().isRightClick()) { - e.getCurrentItem().setAmount(e.getCurrentItem().getAmount() + 1); - } - if(e.getClick().isLeftClick() && e.getCurrentItem().getAmount() > 1) { - e.getCurrentItem().setAmount(e.getCurrentItem().getAmount() - 1); - } - if(e.getInventory().getItem(e.getSlot()).getAmount() < 1) { - e.getWhoClicked().sendMessage(chatManager.colorRawMessage("&c&l✖ &cWarning | Please do not set amount lower than 1! Game is not designed for more detectives than players!")); - e.getInventory().getItem(e.getSlot()).setAmount(1); - } - config.set("instances." + arena.getId() + ".playerperdetective", e.getCurrentItem().getAmount()); - arena.setDetectives(e.getCurrentItem().getAmount()); - ConfigUtils.saveConfig(plugin, config, "arenas"); - new SetupInventory(arena, setupInventory.getPlayer()).openInventory(); - }), 4, 1); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/SetupComponent.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/components/SetupComponent.java deleted file mode 100644 index 074f6c0f..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/SetupComponent.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.setup.components; - -import plugily.projects.inventoryframework.pane.StaticPane; -import plugily.projects.murdermystery.handlers.setup.SetupInventory; - -/** - * @author Plajer - *

- * Created at 25.05.2019 - */ -public interface SetupComponent { - - void prepare(SetupInventory setupInventory); - - void injectComponents(StaticPane pane); - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/SpawnComponents.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/components/SpawnComponents.java deleted file mode 100644 index 4c33bf7c..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/SpawnComponents.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.setup.components; - -import plugily.projects.inventoryframework.gui.GuiItem; -import plugily.projects.inventoryframework.pane.StaticPane; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.item.ItemBuilder; -import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.setup.SetupInventory; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Plajer - *

- * Created at 25.05.2019 - */ -public class SpawnComponents implements SetupComponent { - - private SetupInventory setupInventory; - - @Override - public void prepare(SetupInventory setupInventory) { - this.setupInventory = setupInventory; - } - - @Override - public void injectComponents(StaticPane pane) { - Player player = setupInventory.getPlayer(); - FileConfiguration config = setupInventory.getConfig(); - Arena arena = setupInventory.getArena(); - Main plugin = setupInventory.getPlugin(); - ChatManager chatManager = plugin.getChatManager(); - String serializedLocation = player.getLocation().getWorld().getName() + "," + player.getLocation().getX() + "," + player.getLocation().getY() + "," - + player.getLocation().getZ() + "," + player.getLocation().getYaw() + ",0.0"; - pane.addItem(new GuiItem(new ItemBuilder(Material.REDSTONE_BLOCK) - .name(chatManager.colorRawMessage("&e&lSet Ending Location")) - .lore(ChatColor.GRAY + "Click to set the ending location") - .lore(ChatColor.GRAY + "on the place where you are standing.") - .lore(ChatColor.DARK_GRAY + "(location where players will be") - .lore(ChatColor.DARK_GRAY + "teleported after the game)") - .lore("", setupInventory.getSetupUtilities().isOptionDoneBool("instances." + arena.getId() + ".Endlocation")) - .build(), e -> { - e.getWhoClicked().closeInventory(); - config.set("instances." + arena.getId() + ".Endlocation", serializedLocation); - arena.setEndLocation(player.getLocation()); - player.sendMessage(chatManager.colorRawMessage("&e✔ Completed | &aEnding location for arena " + arena.getId() + " set at your location!")); - ConfigUtils.saveConfig(plugin, config, "arenas"); - }), 0, 0); - - pane.addItem(new GuiItem(new ItemBuilder(Material.LAPIS_BLOCK) - .name(chatManager.colorRawMessage("&e&lSet Lobby Location")) - .lore(ChatColor.GRAY + "Click to set the lobby location") - .lore(ChatColor.GRAY + "on the place where you are standing") - .lore("", setupInventory.getSetupUtilities().isOptionDoneBool("instances." + arena.getId() + ".lobbylocation")) - .build(), e -> { - e.getWhoClicked().closeInventory(); - config.set("instances." + arena.getId() + ".lobbylocation", serializedLocation); - arena.setLobbyLocation(player.getLocation()); - player.sendMessage(chatManager.colorRawMessage("&e✔ Completed | &aLobby location for arena " + arena.getId() + " set at your location!")); - ConfigUtils.saveConfig(plugin, config, "arenas"); - }), 1, 0); - - pane.addItem(new GuiItem(new ItemBuilder(Material.EMERALD_BLOCK) - .name(chatManager.colorRawMessage("&e&lAdd Starting Location")) - .lore(ChatColor.GRAY + "Click to add the starting location") - .lore(ChatColor.GRAY + "on the place where you are standing.") - .lore(ChatColor.DARK_GRAY + "(locations where players will be") - .lore(ChatColor.DARK_GRAY + "teleported when game starts)") - .lore("", setupInventory.getSetupUtilities().isOptionDoneList("instances." + arena.getId() + ".playerspawnpoints", 4)) - .lore("", chatManager.colorRawMessage("&8Shift + Right Click to remove all spawns")) - .build(), e -> { - e.getWhoClicked().closeInventory(); - if(e.getClick() == ClickType.SHIFT_RIGHT) { - config.set("instances." + arena.getId() + ".playerspawnpoints", new ArrayList<>()); - arena.setPlayerSpawnPoints(new ArrayList<>()); - player.sendMessage(chatManager.colorRawMessage("&eDone | &aPlayer spawn points deleted, you can add them again now!")); - arena.setReady(false); - ConfigUtils.saveConfig(plugin, config, "arenas"); - return; - } - List startingSpawns = config.getStringList("instances." + arena.getId() + ".playerspawnpoints"); - startingSpawns.add(LocationSerializer.locationToString(player.getLocation())); - config.set("instances." + arena.getId() + ".playerspawnpoints", startingSpawns); - String startingProgress = startingSpawns.size() >= 4 ? "&e✔ Completed | " : "&c✘ Not completed | "; - player.sendMessage(chatManager.colorRawMessage(startingProgress + "&aPlayer spawn added! &8(&7" + startingSpawns.size() + "/4&8)")); - if(startingSpawns.size() == 4) { - player.sendMessage(chatManager.colorRawMessage("&eInfo | &aYou can add more than 4 player spawns! Four is just a minimum!")); - } - List spawns = new ArrayList<>(arena.getPlayerSpawnPoints()); - spawns.add(player.getLocation()); - arena.setPlayerSpawnPoints(spawns); - ConfigUtils.saveConfig(plugin, config, "arenas"); - }), 2, 0); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/SpecialBlocksComponents.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/components/SpecialBlocksComponents.java deleted file mode 100644 index 7dbc6555..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/components/SpecialBlocksComponents.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.setup.components; - -import plugily.projects.inventoryframework.gui.GuiItem; -import plugily.projects.inventoryframework.pane.StaticPane; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; - -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.item.ItemBuilder; -import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.special.SpecialBlock; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.setup.SetupInventory; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Plajer - *

- * Created at 25.05.2019 - */ -public class SpecialBlocksComponents implements SetupComponent { - - private SetupInventory setupInventory; - - @Override - public void prepare(SetupInventory setupInventory) { - this.setupInventory = setupInventory; - } - - @Override - public void injectComponents(StaticPane pane) { - Player player = setupInventory.getPlayer(); - FileConfiguration config = setupInventory.getConfig(); - Arena arena = setupInventory.getArena(); - Main plugin = setupInventory.getPlugin(); - ChatManager chatManager = plugin.getChatManager(); - - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.PAPER.parseItem()) - .name(chatManager.colorRawMessage("&6&lSpecial Blocks Section")) - .lore(ChatColor.GRAY + "Items on the right will allow") - .lore(ChatColor.GRAY + "you to add special game blocks!") - .build()), 0, 3); - - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.ENDER_CHEST.parseItem()) - .name(chatManager.colorRawMessage("&e&lAdd Mystery Cauldron")) - .lore(ChatColor.GRAY + "Target a cauldron and add it to the game") - .lore(ChatColor.GRAY + "it will cost 1 gold per potion!") - .lore(ChatColor.GRAY + "Configure cauldron potions in specialblocks.yml file!") - .build(), e -> { - e.getWhoClicked().closeInventory(); - Block targetBlock = e.getWhoClicked().getTargetBlock(null, 7); - if(targetBlock.getType() != Material.CAULDRON) { - e.getWhoClicked().sendMessage(ChatColor.RED + "Please target cauldron to continue!"); - return; - } - arena.loadSpecialBlock(new SpecialBlock(targetBlock.getLocation(), - SpecialBlock.SpecialBlockType.MYSTERY_CAULDRON)); - List cauldrons = new ArrayList<>(config.getStringList("instances." + arena.getId() + ".mystery-cauldrons")); - cauldrons.add(LocationSerializer.locationToString(targetBlock.getLocation())); - config.set("instances." + arena.getId() + ".mystery-cauldrons", cauldrons); - player.sendMessage(chatManager.colorRawMessage("&e✔ Completed | &aAdded Cauldron special block!")); - ConfigUtils.saveConfig(plugin, config, "arenas"); - }), 1, 3); - - pane.addItem(new GuiItem(new ItemBuilder(XMaterial.ENCHANTING_TABLE.parseItem()) - .name(chatManager.colorRawMessage("&e&lAdd Confessional")) - .lore(ChatColor.GRAY + "Target enchanting table and") - .lore(ChatColor.GRAY + "add praise to the developer") - .lore(ChatColor.GRAY + "confessional, gift for") - .lore(ChatColor.GRAY + "the developer costs 1 gold!") - .lore(ChatColor.GOLD + "Add some levers in radius") - .lore(ChatColor.GOLD + "of 3 blocks near the enchant table") - .lore(ChatColor.GOLD + "to allow users to pray there!") - .lore(ChatColor.RED + "You can either get gifts") - .lore(ChatColor.RED + "or curses from prayer!") - .build(), e -> { - e.getWhoClicked().closeInventory(); - Block targetBlock = e.getWhoClicked().getTargetBlock(null, 7); - if(targetBlock.getType() != XMaterial.ENCHANTING_TABLE.parseMaterial()) { - e.getWhoClicked().sendMessage(ChatColor.RED + "Please target enchanting table to continue!"); - return; - } - - arena.loadSpecialBlock(new SpecialBlock(targetBlock.getLocation(), - SpecialBlock.SpecialBlockType.PRAISE_DEVELOPER)); - List confessionals = new ArrayList<>(config.getStringList("instances." + arena.getId() + ".confessionals")); - confessionals.add(LocationSerializer.locationToString(targetBlock.getLocation())); - config.set("instances." + arena.getId() + ".confessionals", confessionals); - player.sendMessage(chatManager.colorRawMessage("&e✔ Completed | &aAdded Confessional special block!")); - player.sendMessage(chatManager.colorRawMessage("&eInfo | &aRemember to place any lever in radius of 3 near enchant table!")); - ConfigUtils.saveConfig(plugin, config, "arenas"); - }), 2, 3); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/sign/ArenaSign.java b/src/main/java/plugily/projects/murdermystery/handlers/sign/ArenaSign.java deleted file mode 100644 index f58de908..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/sign/ArenaSign.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.sign; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; - -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.murdermystery.arena.Arena; - -import javax.annotation.Nullable; -import java.lang.reflect.InvocationTargetException; - -/** - * Created for 1.14 compatibility purposes, it will cache block behind sign that will be - * accessed via reflection on 1.14 which is expensive - */ -public class ArenaSign { - - private final Sign sign; - private Block behind; - private final Arena arena; - - public ArenaSign(Sign sign, Arena arena) { - this.sign = sign; - this.arena = arena; - setBehindBlock(); - } - - private void setBehindBlock() { - this.behind = null; - if(sign.getBlock().getType() == Material.getMaterial("WALL_SIGN")) { - this.behind = ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_14_R1) ? getBlockBehind() : getBlockBehindLegacy(); - } - } - - private Block getBlockBehind() { - try { - org.bukkit.block.BlockState state = sign.getBlock().getState(); - Object blockData = state.getClass().getMethod("getBlockData").invoke(state); - BlockFace face = (BlockFace) blockData.getClass().getMethod("getFacing").invoke(blockData); - - Location loc = sign.getLocation(); - Location location = new Location(sign.getWorld(), loc.getBlockX() - face.getModX(), loc.getBlockY() - face.getModY(), - loc.getBlockZ() - face.getModZ()); - return location.getBlock(); - } catch(NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - return null; - } - } - - private Block getBlockBehindLegacy() { - return sign.getBlock().getRelative(((org.bukkit.material.Sign) sign.getData()).getAttachedFace()); - } - - public Sign getSign() { - return sign; - } - - @Nullable - public Block getBehind() { - return behind; - } - - public Arena getArena() { - return arena; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/sign/SignManager.java b/src/main/java/plugily/projects/murdermystery/handlers/sign/SignManager.java deleted file mode 100644 index 2af7943c..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/sign/SignManager.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.sign; - -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.block.Sign; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.SignChangeEvent; -import org.bukkit.event.player.PlayerInteractEvent; - -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.compat.xseries.XMaterial; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.misc.stuff.ComplementAccessor; -import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaManager; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.ArenaState; -import plugily.projects.murdermystery.handlers.ChatManager; -import plugily.projects.murdermystery.handlers.language.LanguageManager; -import plugily.projects.murdermystery.utils.Debugger; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class SignManager implements Listener { - - private final List arenaSigns = new ArrayList<>(); - private final Map gameStateToString = new EnumMap<>(ArenaState.class); - private final Main plugin; - private final ChatManager chatManager; - private final List signLines; - - public SignManager(Main plugin) { - this.plugin = plugin; - chatManager = plugin.getChatManager(); - gameStateToString.put(ArenaState.WAITING_FOR_PLAYERS, chatManager.colorMessage("Signs.Game-States.Inactive")); - gameStateToString.put(ArenaState.STARTING, chatManager.colorMessage("Signs.Game-States.Starting")); - gameStateToString.put(ArenaState.IN_GAME, chatManager.colorMessage("Signs.Game-States.In-Game")); - gameStateToString.put(ArenaState.ENDING, chatManager.colorMessage("Signs.Game-States.Ending")); - gameStateToString.put(ArenaState.RESTARTING, chatManager.colorMessage("Signs.Game-States.Restarting")); - signLines = LanguageManager.getLanguageList("Signs.Lines"); - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @EventHandler - public void onSignChange(SignChangeEvent e) { - if(!e.getPlayer().hasPermission("murdermystery.admin.sign.create") - || !ComplementAccessor.getComplement().getLine(e, 0).equalsIgnoreCase("[murdermystery]")) { - return; - } - String line1 = ComplementAccessor.getComplement().getLine(e, 1); - if(line1.isEmpty()) { - e.getPlayer().sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Signs.Please-Type-Arena-Name")); - return; - } - for(Arena arena : ArenaRegistry.getArenas()) { - if(!arena.getId().equalsIgnoreCase(line1)) { - continue; - } - for(int i = 0; i < signLines.size(); i++) { - ComplementAccessor.getComplement().setLine(e, i, formatSign(signLines.get(i), arena)); - } - arenaSigns.add(new ArenaSign((Sign) e.getBlock().getState(), arena)); - e.getPlayer().sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Signs.Sign-Created")); - String location = e.getBlock().getWorld().getName() + "," + e.getBlock().getX() + "," + e.getBlock().getY() + "," + e.getBlock().getZ() + ",0.0,0.0"; - FileConfiguration config = ConfigUtils.getConfig(plugin, "arenas"); - List locs = config.getStringList("instances." + arena.getId() + ".signs"); - locs.add(location); - config.set("instances." + arena.getId() + ".signs", locs); - ConfigUtils.saveConfig(plugin, config, "arenas"); - return; - } - e.getPlayer().sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Signs.Arena-Doesnt-Exists")); - } - - private String formatSign(String msg, Arena a) { - String formatted = msg; - formatted = StringUtils.replace(formatted, "%mapname%", a.getMapName()); - - int maxPlayers = a.getMaximumPlayers(); - if(a.getPlayers().size() >= maxPlayers) { - formatted = StringUtils.replace(formatted, "%state%", chatManager.colorMessage("Signs.Game-States.Full-Game")); - } else { - formatted = StringUtils.replace(formatted, "%state%", gameStateToString.get(a.getArenaState())); - } - formatted = StringUtils.replace(formatted, "%playersize%", Integer.toString(a.getPlayers().size())); - formatted = StringUtils.replace(formatted, "%maxplayers%", Integer.toString(maxPlayers)); - formatted = chatManager.colorRawMessage(formatted); - return formatted; - } - - @EventHandler - public void onSignDestroy(BlockBreakEvent e) { - if (!e.getPlayer().hasPermission("murdermystery.admin.sign.break")) - return; - - ArenaSign arenaSign = getArenaSignByBlock(e.getBlock()); - if(arenaSign == null) { - return; - } - arenaSigns.remove(arenaSign); - FileConfiguration config = ConfigUtils.getConfig(plugin, "arenas"); - ConfigurationSection section = config.getConfigurationSection("instances"); - if (section == null) - return; - - String location = e.getBlock().getWorld().getName() + "," + e.getBlock().getX() + "," + e.getBlock().getY() + "," + e.getBlock().getZ() + "," + "0.0,0.0"; - for(String arena : section.getKeys(false)) { - for(String sign : section.getStringList(arena + ".signs")) { - if(!sign.equals(location)) { - continue; - } - List signs = section.getStringList(arena + ".signs"); - signs.remove(location); - config.set(arena + ".signs", signs); - ConfigUtils.saveConfig(plugin, config, "arenas"); - e.getPlayer().sendMessage(chatManager.getPrefix() + chatManager.colorMessage("Signs.Sign-Removed")); - return; - } - } - e.getPlayer().sendMessage(chatManager.getPrefix() + ChatColor.RED + "Couldn't remove sign from configuration! Please do this manually!"); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onJoinAttempt(PlayerInteractEvent e) { - if (e.getAction() != Action.RIGHT_CLICK_BLOCK || e.getClickedBlock() == null || !(e.getClickedBlock().getState() instanceof Sign)) { - return; - } - - ArenaSign arenaSign = getArenaSignByBlock(e.getClickedBlock()); - if(arenaSign != null) { - Arena arena = arenaSign.getArena(); - if(arena != null) { - ArenaManager.joinAttempt(e.getPlayer(), arena); - } - } - } - - @Nullable - private ArenaSign getArenaSignByBlock(Block block) { - if(block == null) { - return null; - } - for(ArenaSign sign : arenaSigns) { - if(sign.getSign().getLocation().equals(block.getLocation())) { - return sign; - } - } - return null; - } - - public void loadSigns() { - Debugger.debug("Signs load event started"); - long start = System.currentTimeMillis(); - - arenaSigns.clear(); - - ConfigurationSection section = ConfigUtils.getConfig(plugin, "arenas").getConfigurationSection("instances"); - if(section == null) { - return; - } - - for(String path : section.getKeys(false)) { - for(String sign : section.getStringList(path + ".signs")) { - Location loc = LocationSerializer.getLocation(sign); - if(loc.getBlock().getState() instanceof Sign) { - arenaSigns.add(new ArenaSign((Sign) loc.getBlock().getState(), ArenaRegistry.getArena(path))); - } else { - Debugger.debug(Level.WARNING, "Block at location {0} for arena {1} not a sign", loc, path); - } - } - } - Debugger.debug("Sign load event finished took {0}ms", System.currentTimeMillis() - start); - } - - public void updateSigns() { - Debugger.performance("SignUpdate", "[PerformanceMonitor] [SignUpdate] Updating signs"); - long start = System.currentTimeMillis(); - - for(ArenaSign arenaSign : arenaSigns) { - Sign sign = arenaSign.getSign(); - for(int i = 0; i < signLines.size(); i++) { - ComplementAccessor.getComplement().setLine(sign, i, formatSign(signLines.get(i), arenaSign.getArena())); - } - if(plugin.getConfig().getBoolean("Signs-Block-States-Enabled", true) && arenaSign.getBehind() != null) { - Block behind = arenaSign.getBehind(); - try { - switch(arenaSign.getArena().getArenaState()) { - case WAITING_FOR_PLAYERS: - behind.setType(XMaterial.WHITE_STAINED_GLASS.parseMaterial()); - if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_13_R1)) { - Block.class.getMethod("setData", byte.class).invoke(behind, (byte) 0); - } - break; - case STARTING: - behind.setType(XMaterial.YELLOW_STAINED_GLASS.parseMaterial()); - if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_13_R1)) { - Block.class.getMethod("setData", byte.class).invoke(behind, (byte) 4); - } - break; - case IN_GAME: - behind.setType(XMaterial.ORANGE_STAINED_GLASS.parseMaterial()); - if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_13_R1)) { - Block.class.getMethod("setData", byte.class).invoke(behind, (byte) 1); - } - break; - case ENDING: - behind.setType(XMaterial.GRAY_STAINED_GLASS.parseMaterial()); - if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_13_R1)) { - Block.class.getMethod("setData", byte.class).invoke(behind, (byte) 7); - } - break; - case RESTARTING: - behind.setType(XMaterial.BLACK_STAINED_GLASS.parseMaterial()); - if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_13_R1)) { - Block.class.getMethod("setData", byte.class).invoke(behind, (byte) 15); - } - break; - default: - break; - } - } catch(Exception ignored) { - } - } - sign.update(); - } - Debugger.performance("SignUpdate", "[PerformanceMonitor] [SignUpdate] Updated signs took {0}ms", System.currentTimeMillis() - start); - } - - public List getArenaSigns() { - return arenaSigns; - } - - public Map getGameStateToString() { - return gameStateToString; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/party/GameParty.java b/src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkin.java similarity index 60% rename from src/main/java/plugily/projects/murdermystery/handlers/party/GameParty.java rename to src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkin.java index f7faa075..b1539df1 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/party/GameParty.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkin.java @@ -15,33 +15,35 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +package plugily.projects.murdermystery.handlers.skins.sword; -package plugily.projects.murdermystery.handlers.party; - -import org.bukkit.entity.Player; - -import java.util.List; +import org.bukkit.inventory.ItemStack; /** - * @author Plajer + * @author Tigerpanzer_02 *

- * Created at 09.02.2020 + * Created at 03.04.2022 */ -public class GameParty { +public class SwordSkin { - private final List players; - private final Player leader; + private final ItemStack itemStack; + private final String permission; - public GameParty(List players, Player leader) { - this.players = players; - this.leader = leader; + public SwordSkin(ItemStack itemStack, String permission) { + this.itemStack = itemStack; + this.permission = permission; } - public List getPlayers() { - return players; + public ItemStack getItemStack() { + return itemStack; } - public Player getLeader() { - return leader; + public String getPermission() { + return permission; } + + public boolean hasPermission() { + return !permission.isEmpty(); + } + } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkinManager.java b/src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkinManager.java new file mode 100644 index 00000000..bc9b49e6 --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkinManager.java @@ -0,0 +1,106 @@ +/* + * MurderMystery - Find the murderer, kill him and survive! + * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package plugily.projects.murdermystery.handlers.skins.sword; + +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; +import plugily.projects.murdermystery.Main; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +/** + * @author 2Wild4You, Tigerpanzer_02 + *

Created at 19.02.2021 + */ +public class SwordSkinManager { + + private final List registeredSwordSkins = new ArrayList<>(); + private final Map murdererSwords = new HashMap<>(); + + public SwordSkinManager(Main plugin) { + registerSwordSkins(plugin); + } + + public void registerSwordSkins(Main plugin) { + FileConfiguration config = ConfigUtils.getConfig(plugin, "skins"); + ConfigurationSection section = config.getConfigurationSection("Skins.Sword"); + String path = "Skins.Sword."; + for (String id : section.getKeys(false)) { + addSwordSkin( + new SwordSkin( + XMaterial.matchXMaterial(config.getString(path + id + "Material", "BEDROCK")) + .orElse(XMaterial.BEDROCK) + .parseItem(), + config.getString(path + id + ".Permission", ""))); + } + } + + public List getRegisteredSwordSkins() { + return registeredSwordSkins; + } + + public void addSwordSkin(SwordSkin lastWord) { + registeredSwordSkins.add(lastWord); + } + + public ItemStack getRandomSwordSkin(Player player) { + // check perms + List perms = + registeredSwordSkins.stream() + .filter(swordSkin -> player.hasPermission(swordSkin.getPermission())) + .collect(Collectors.toList()); + if (!perms.isEmpty()) { + ItemStack itemStack = + perms.get(ThreadLocalRandom.current().nextInt(perms.size())).getItemStack(); + murdererSwords.put(player, itemStack); + return itemStack; + } + // check default + List noPerms = + registeredSwordSkins.stream() + .filter(swordSkin -> !swordSkin.hasPermission()) + .collect(Collectors.toList()); + if (!noPerms.isEmpty()) { + ItemStack itemStack = + noPerms.get(ThreadLocalRandom.current().nextInt(noPerms.size())).getItemStack(); + murdererSwords.put(player, itemStack); + return itemStack; + } + // fallback + ItemStack itemStack = registeredSwordSkins.get(0).getItemStack(); + murdererSwords.put(player, itemStack); + return itemStack; + } + + public void removeMurdererSword(Player player) { + murdererSwords.remove(player); + } + + public ItemStack getMurdererSword(Player player) { + return murdererSwords.get(player); + } +} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/trails/BowTrailsHandler.java b/src/main/java/plugily/projects/murdermystery/handlers/trails/BowTrailsHandler.java index 45fdfb61..a97edc51 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/trails/BowTrailsHandler.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/trails/BowTrailsHandler.java @@ -25,11 +25,9 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.scheduler.BukkitRunnable; - -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.utils.Debugger; + /** * @author 2Wild4You, Tigerpanzer_02 @@ -59,17 +57,17 @@ public void onArrowShoot(EntityShootBowEvent event) { Player player = (Player) event.getEntity(); - if(!ArenaRegistry.isInArena(player) || !plugin.getTrailsManager().gotAnyTrails(player)) { + if(!plugin.getArenaRegistry().isInArena(player) || !plugin.getTrailsManager().gotAnyTrails(player)) { return; } Trail trail = plugin.getTrailsManager().getRandomTrail(player); - Debugger.debug("Spawning particle with perm {0} for player {1}", trail.getPermission(), player.getName()); + plugin.getDebugger().debug("Spawning particle with perm {0} for player {1}", trail.getPermission(), player.getName()); new BukkitRunnable() { @Override public void run() { if(projectile.isDead() || projectile.isOnGround()) { - Debugger.debug("Stopped spawning particle with perm {0} for player {1}", trail.getPermission(), player.getName()); + plugin.getDebugger().debug("Stopped spawning particle with perm {0} for player {1}", trail.getPermission(), player.getName()); cancel(); } VersionUtils.sendParticles(trail.getName(), player, projectile.getLocation(), 3); diff --git a/src/main/java/plugily/projects/murdermystery/handlers/trails/TrailsManager.java b/src/main/java/plugily/projects/murdermystery/handlers/trails/TrailsManager.java index a35728fc..580db2b6 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/trails/TrailsManager.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/trails/TrailsManager.java @@ -17,9 +17,11 @@ */ package plugily.projects.murdermystery.handlers.trails; +import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; +import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; import plugily.projects.murdermystery.Main; import java.util.ArrayList; @@ -28,11 +30,10 @@ import java.util.stream.Collectors; /** - * @author 2Wild4You, Tigerpanzer_02 + * @author Tigerpanzer_02 *

* Created at 19.02.2021 */ - public class TrailsManager { private final List registeredTrails = new ArrayList<>(); @@ -40,13 +41,14 @@ public class TrailsManager { private final List blacklistedTrails; public TrailsManager(Main plugin) { - blacklistedTrails = plugin.getConfig().getStringList("Blacklisted-Trails"); + FileConfiguration config = ConfigUtils.getConfig(plugin, "trails"); + blacklistedTrails = config.getStringList("Blacklisted-Trails"); registerTrails(); } public void registerTrails() { - for(String particle : VersionUtils.getParticleValues()) { - if(blacklistedTrails.contains(particle.toLowerCase())) { + for (String particle : VersionUtils.getParticleValues()) { + if (blacklistedTrails.contains(particle.toLowerCase())) { continue; } addTrail(new Trail(particle, "murdermystery.trails." + particle.toLowerCase())); @@ -66,12 +68,15 @@ public boolean gotAnyTrails(Player player) { } public Trail getRandomTrail(Player player) { - //check perms - List perms = registeredTrails.stream().filter(trail -> player.hasPermission(trail.getPermission())).collect(Collectors.toList()); - if(!perms.isEmpty()) { + // check perms + List perms = + registeredTrails.stream() + .filter(trail -> player.hasPermission(trail.getPermission())) + .collect(Collectors.toList()); + if (!perms.isEmpty()) { return perms.get(perms.size() == 1 ? 0 : ThreadLocalRandom.current().nextInt(perms.size())); } - //fallback + // fallback return registeredTrails.get(0); } } diff --git a/src/main/java/plugily/projects/murdermystery/old/Main.java b/src/main/java/plugily/projects/murdermystery/old/Main.java new file mode 100644 index 00000000..f595da7e --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/old/Main.java @@ -0,0 +1,357 @@ +/* + * MurderMystery - Find the murderer, kill him and survive! + * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package plugily.projects.murdermystery.old; + +import me.tigerhix.lib.scoreboard.ScoreboardLib; +import org.bstats.bukkit.Metrics; +import org.bukkit.GameMode; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +import plugily.projects.commonsbox.database.MysqlDatabase; +import plugily.projects.commonsbox.minecraft.compat.ServerVersion; +import plugily.projects.commonsbox.minecraft.compat.events.EventsInitializer; +import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; +import plugily.projects.commonsbox.minecraft.hologram.HologramManager; +import plugily.projects.commonsbox.minecraft.misc.MiscUtils; +import plugily.projects.commonsbox.minecraft.serialization.InventorySerializer; +import plugily.projects.murdermystery.HookManager; +import plugily.projects.murdermystery.old.api.StatsStorage; +import plugily.projects.murdermystery.old.arena.ArenaRegistry; +import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; +import plugily.projects.murdermystery.events.Events; +import plugily.projects.murdermystery.events.spectator.SpectatorItemEvents; +import plugily.projects.murdermystery.handlers.CorpseHandler; +import plugily.projects.murdermystery.handlers.items.SpecialItemManager; +import plugily.projects.murdermystery.handlers.language.LanguageManager; +import plugily.projects.murdermystery.handlers.lastwords.LastWordsManager; +import plugily.projects.murdermystery.handlers.party.PartyHandler; +import plugily.projects.murdermystery.handlers.party.PartySupportInitializer; +import plugily.projects.murdermystery.handlers.rewards.RewardsFactory; +import plugily.projects.murdermystery.handlers.sign.SignManager; +import plugily.projects.murdermystery.handlers.trails.TrailsManager; +import plugily.projects.murdermystery.old.user.UserManager; +import plugily.projects.murdermystery.old.user.data.MysqlManager; +import plugily.projects.murdermystery.utils.services.ServiceRegistry; + +import java.io.File; +import java.util.Arrays; +import java.util.logging.Level; + +/** + * @author Plajer + *

+ * Created at 03.08.2018 + */ +public class Main extends JavaPlugin { + + private ExceptionLogHandler exceptionLogHandler; + private boolean forceDisable = false; + private BungeeManager bungeeManager; + private RewardsFactory rewardsHandler; + private MysqlDatabase database; + private SignManager signManager; + private CorpseHandler corpseHandler; + private PartyHandler partyHandler; + private ConfigPreferences configPreferences; + private ArgumentsRegistry argumentsRegistry; + private HookManager hookManager; + private UserManager userManager; + private ChatManager chatManager; + + private SpecialItemManager specialItemManager; + + @Override + public void onEnable() { + if(!validateIfPluginShouldStart()) { + return; + } + + long start = System.currentTimeMillis(); + + ServiceRegistry.registerService(this); + exceptionLogHandler = new ExceptionLogHandler(this); + LanguageManager.init(this); + saveDefaultConfig(); + + Debugger.setEnabled(getDescription().getVersion().contains("debug") || getConfig().getBoolean("Debug")); + + Debugger.debug("[System] Initialization start"); + if(getConfig().getBoolean("Developer-Mode")) { + Debugger.deepDebug(true); + Debugger.debug(Level.FINE, "Deep debug enabled"); + for(String listenable : getConfig().getStringList("Performance-Listenable")) { + Debugger.monitorPerformance(listenable); + } + } + + configPreferences = new ConfigPreferences(this); + setupFiles(); + initializeClasses(); + checkUpdate(); + Debugger.debug("[System] Initialization finished took {0}ms", System.currentTimeMillis() - start); + + Debugger.debug("Plugin loaded!"); + + if(configPreferences.getOption(ConfigPreferences.Option.NAMETAGS_HIDDEN)) { + getServer().getScheduler().scheduleSyncRepeatingTask(this, () -> + getServer().getOnlinePlayers().forEach(ArenaUtils::updateNameTagsVisibility), 60, 140); + } + } + + private boolean validateIfPluginShouldStart() { + if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_8_R1)) { + MessageUtils.thisVersionIsNotSupported(); + Debugger.sendConsoleMsg("&cYour server version is not supported by Murder Mystery!"); + Debugger.sendConsoleMsg("&cSadly, we must shut off. Maybe you consider changing your server version?"); + forceDisable = true; + getServer().getPluginManager().disablePlugin(this); + return false; + } + try { + Class.forName("org.spigotmc.SpigotConfig"); + } catch(Exception e) { + MessageUtils.thisVersionIsNotSupported(); + Debugger.sendConsoleMsg("&cYour server software is not supported by Murder Mystery!"); + Debugger.sendConsoleMsg("&cWe support only Spigot and Spigot forks only! Shutting off..."); + forceDisable = true; + getServer().getPluginManager().disablePlugin(this); + return false; + } + return true; + } + + @Override + public void onDisable() { + if(forceDisable) { + return; + } + Debugger.debug("System disable initialized"); + long start = System.currentTimeMillis(); + + getLogger().removeHandler(exceptionLogHandler); + saveAllUserStatistics(); + if(configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)) { + getMysqlDatabase().shutdownConnPool(); + } + for(ArmorStand armorStand : HologramManager.getArmorStands()) { + armorStand.remove(); + armorStand.setCustomNameVisible(false); + } + HologramManager.getArmorStands().clear(); + for(Arena arena : ArenaRegistry.getArenas()) { + arena.getScoreboardManager().stopAllScoreboards(); + for(Player player : arena.getPlayers()) { + arena.doBarAction(Arena.BarAction.REMOVE, player); + player.setFlySpeed(0.1f); + player.getInventory().clear(); + player.getInventory().setArmorContents(null); + player.getActivePotionEffects().forEach(pe -> player.removePotionEffect(pe.getType())); + player.setWalkSpeed(0.2f); + player.setGameMode(GameMode.SURVIVAL); + arena.teleportToEndLocation(player); + if(configPreferences.getOption(ConfigPreferences.Option.INVENTORY_MANAGER_ENABLED)) { + InventorySerializer.loadInventory(this, player); + } + } + arena.cleanUpArena(); + } + Debugger.debug("System disable finished took {0}ms", System.currentTimeMillis() - start); + } + + private void initializeClasses() { + chatManager = new ChatManager(this); + ScoreboardLib.setPluginInstance(this); + if(getConfig().getBoolean("BungeeActivated")) { + bungeeManager = new BungeeManager(this); + } + if(configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)) { + FileConfiguration config = ConfigUtils.getConfig(this, "mysql"); + database = new MysqlDatabase(config.getString("user"), config.getString("password"), config.getString("address"), config.getLong("maxLifeTime", 1800000)); + } + argumentsRegistry = new ArgumentsRegistry(this); + userManager = new UserManager(this); + + Utils.init(this); + PermissionsManager.init(); + new ArenaEvents(this); + new SpectatorEvents(this); + new QuitEvent(this); + new JoinEvent(this); + new ChatEvents(this); + registerSoftDependenciesAndServices(); + User.cooldownHandlerTask(); + signManager = new SignManager(this); + ArenaRegistry.registerArenas(); + signManager.loadSigns(); + signManager.updateSigns(); + new Events(this); + new LobbyEvent(this); + new SpectatorItemEvents(this); + rewardsHandler = new RewardsFactory(this); + specialItemManager = new SpecialItemManager(this); + corpseHandler = new CorpseHandler(this); + partyHandler = new PartySupportInitializer().initialize(this); + + new EventsInitializer().initialize(this); + + + MiscUtils.sendStartUpMessage(this, "MurderMystery", getDescription(), true, true); + } + + private void registerSoftDependenciesAndServices() { + Debugger.debug("Hooking into soft dependencies"); + long start = System.currentTimeMillis(); + + startPluginMetrics(); + if(getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { + Debugger.debug("Hooking into PlaceholderAPI"); + new PlaceholderManager().register(); + } + Debugger.debug("Hooked into soft dependencies took {0}ms", System.currentTimeMillis() - start); + } + + private void startPluginMetrics() { + Metrics metrics = new Metrics(this, 3038); + + metrics.addCustomChart(new org.bstats.charts.SimplePie("database_enabled", () -> String.valueOf(configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)))); + metrics.addCustomChart(new org.bstats.charts.SimplePie("bungeecord_hooked", () -> String.valueOf(configPreferences.getOption(ConfigPreferences.Option.BUNGEE_ENABLED)))); + metrics.addCustomChart(new org.bstats.charts.SimplePie("locale_used", () -> LanguageManager.getPluginLocale().getPrefix())); + metrics.addCustomChart(new org.bstats.charts.SimplePie("update_notifier", () -> { + if(getConfig().getBoolean("Update-Notifier.Enabled", true)) { + return getConfig().getBoolean("Update-Notifier.Notify-Beta-Versions", true) ? "Enabled with beta notifier" : "Enabled"; + } + return getConfig().getBoolean("Update-Notifier.Notify-Beta-Versions", true) ? "Beta notifier only" : "Disabled"; + })); + } + + private void checkUpdate() { + if(!getConfig().getBoolean("Update-Notifier.Enabled", true)) { + return; + } + UpdateChecker.init(this, 66614).requestUpdateCheck().whenComplete((result, exception) -> { + if(!result.requiresUpdate()) { + return; + } + if(result.getNewestVersion().contains("b")) { + if(getConfig().getBoolean("Update-Notifier.Notify-Beta-Versions", true)) { + Debugger.sendConsoleMsg("&c[Murder Mystery] Your software is ready for update! However it's a BETA VERSION. Proceed with caution."); + Debugger.sendConsoleMsg("&c[Murder Mystery] Current version %old%, latest version %new%".replace("%old%", getDescription().getVersion()).replace("%new%", + result.getNewestVersion())); + } + return; + } + MessageUtils.updateIsHere(); + Debugger.sendConsoleMsg("&aYour MurderMystery plugin is outdated! Download it to keep with latest changes and fixes."); + Debugger.sendConsoleMsg("&aDisable this option in config.yml if you wish."); + Debugger.sendConsoleMsg("&eCurrent version: &c" + getDescription().getVersion() + "&e Latest version: &a" + result.getNewestVersion()); + }); + } + + private void setupFiles() { + for(String fileName : Arrays.asList("arenas", "bungee", "rewards", "stats", "special_items", "mysql", "specialblocks")) { + File file = new File(getDataFolder(), fileName + ".yml"); + if(!file.exists()) { + saveResource(fileName + ".yml", false); + } + } + } + + public RewardsFactory getRewardsHandler() { + return rewardsHandler; + } + + public BungeeManager getBungeeManager() { + return bungeeManager; + } + + public PartyHandler getPartyHandler() { + return partyHandler; + } + + public ChatManager getChatManager() { + return chatManager; + } + + public ConfigPreferences getConfigPreferences() { + return configPreferences; + } + + public MysqlDatabase getMysqlDatabase() { + return database; + } + + public SignManager getSignManager() { + return signManager; + } + + public CorpseHandler getCorpseHandler() { + return corpseHandler; + } + + public ArgumentsRegistry getArgumentsRegistry() { + return argumentsRegistry; + } + + + + public UserManager getUserManager() { + return userManager; + } + + public LastWordsManager getLastWordsManager() { + return lastWordsManager; + } + + public TrailsManager getTrailsManager() { + return trailsManager; + } + + public SpecialItemManager getSpecialItemManager() { + return specialItemManager; + } + + private void saveAllUserStatistics() { + for(Player player : getServer().getOnlinePlayers()) { + User user = userManager.getUser(player); + if(userManager.getDatabase() instanceof MysqlManager) { + StringBuilder update = new StringBuilder(" SET "); + for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { + if(!stat.isPersistent()) continue; + if(update.toString().equalsIgnoreCase(" SET ")) { + update.append(stat.getName()).append('=').append(user.getStat(stat)); + } + update.append(", ").append(stat.getName()).append('=').append(user.getStat(stat)); + } + String finalUpdate = update.toString(); + //copy of userManager#saveStatistic but without async database call that's not allowed in onDisable method. + ((MysqlManager) userManager.getDatabase()).getDatabase().executeUpdate("UPDATE " + ((MysqlManager) getUserManager().getDatabase()).getTableName() + + finalUpdate + " WHERE UUID='" + user.getUniqueId().toString() + "';"); + continue; + } + for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { + userManager.getDatabase().saveStatistic(user, stat); + } + } + } + + +} diff --git a/src/main/java/plugily/projects/murdermystery/user/User.java b/src/main/java/plugily/projects/murdermystery/user/User.java deleted file mode 100644 index dfccd16a..00000000 --- a/src/main/java/plugily/projects/murdermystery/user/User.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.user; - -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scoreboard.Scoreboard; - -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.api.events.player.MMPlayerStatisticChangeEvent; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; - -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class User { - - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - private static long cooldownCounter = 0; - private final Map stats = new EnumMap<>(StatsStorage.StatisticType.class); - private final Map cooldowns = new HashMap<>(); - private final UUID uuid; - private boolean spectator = false; - private boolean permanentSpectator = false; - - public Scoreboard lastBoard; - - @Deprecated - public User(Player player) { - this(player.getUniqueId()); - } - - public User(UUID uuid) { - this.uuid = uuid; - } - - public UUID getUniqueId() { - return uuid; - } - - public static void cooldownHandlerTask() { - plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, () -> cooldownCounter++, 20, 20); - } - - public Arena getArena() { - return ArenaRegistry.getArena(getPlayer()); - } - - public Player getPlayer() { - return plugin.getServer().getPlayer(uuid); - } - - public boolean isSpectator() { - return spectator; - } - - public void setSpectator(boolean b) { - spectator = b; - } - - public boolean isPermanentSpectator() { - return permanentSpectator; - } - - public void setPermanentSpectator(boolean permanentSpectator) { - this.permanentSpectator = permanentSpectator; - } - - public int getStat(StatsStorage.StatisticType stat) { - Integer st = stats.get(stat); - if(st == null) { - stats.put(stat, 0); - return 0; - } - - return st.intValue(); - } - - public void removeScoreboard(Arena arena) { - arena.getScoreboardManager().removeScoreboard(this); - - if (lastBoard != null) { - getPlayer().setScoreboard(lastBoard); - lastBoard = null; - } - } - - public void setStat(StatsStorage.StatisticType stat, int i) { - stats.put(stat, i); - - //statistics manipulation events are called async when using mysql - plugin.getServer().getScheduler().runTask(plugin, () -> { - Player player = getPlayer(); - plugin.getServer().getPluginManager().callEvent(new MMPlayerStatisticChangeEvent( - ArenaRegistry.getArena(player), player, stat, i)); - }); - } - - public void addStat(StatsStorage.StatisticType stat, int i) { - stats.put(stat, getStat(stat) + i); - - //statistics manipulation events are called async when using mysql - plugin.getServer().getScheduler().runTask(plugin, () -> { - Player player = getPlayer(); - plugin.getServer().getPluginManager().callEvent(new MMPlayerStatisticChangeEvent( - ArenaRegistry.getArena(player), player, stat, getStat(stat))); - }); - } - - public void setCooldown(String s, double seconds) { - cooldowns.put(s, seconds + cooldownCounter); - } - - public double getCooldown(String s) { - Double coold = cooldowns.get(s); - return (coold == null || coold.doubleValue() <= cooldownCounter) ? 0 : coold.doubleValue() - cooldownCounter; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/user/UserManager.java b/src/main/java/plugily/projects/murdermystery/user/UserManager.java deleted file mode 100644 index be8494f3..00000000 --- a/src/main/java/plugily/projects/murdermystery/user/UserManager.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.user; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import plugily.projects.murdermystery.ConfigPreferences; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.user.data.FileStats; -import plugily.projects.murdermystery.user.data.MysqlManager; -import plugily.projects.murdermystery.user.data.UserDatabase; -import plugily.projects.murdermystery.utils.Debugger; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class UserManager { - - private final List users = new ArrayList<>(); - private final UserDatabase database; - - public UserManager(Main plugin) { - if(plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DATABASE_ENABLED)) { - database = new MysqlManager(plugin); - Debugger.debug("MySQL Stats enabled"); - } else { - database = new FileStats(plugin); - Debugger.debug("File Stats enabled"); - } - loadStatsForPlayersOnline(); - } - - private void loadStatsForPlayersOnline() { - Bukkit.getServer().getOnlinePlayers().stream().map(this::getUser).forEach(this::loadStatistics); - } - - public User getUser(Player player) { - java.util.UUID playerId = player.getUniqueId(); - - for(User user : users) { - if(user.getUniqueId().equals(playerId)) { - return user; - } - } - - Debugger.debug("Registering new user {0} ({1})", playerId, player.getName()); - User user = new User(playerId); - users.add(user); - return user; - } - - public List getUsers(Arena arena) { - List list = new ArrayList<>(); - - for(Player player : arena.getPlayers()) { - list.add(getUser(player)); - } - - return list; - } - - public void saveStatistic(User user, StatsStorage.StatisticType stat) { - if(!stat.isPersistent()) { - return; - } - //apply before save - fixContributionStat(user); - database.saveStatistic(user, stat); - } - - public void loadStatistics(User user) { - database.loadStatistics(user); - //apply after load to override - fixContributionStat(user); - } - - private void fixContributionStat(User user) { - if(user.getStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE) <= 0) { - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE, 1); - } - if(user.getStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER) <= 0) { - user.setStat(StatsStorage.StatisticType.CONTRIBUTION_MURDERER, 1); - } - } - - public void saveAllStatistic(User user) { - database.saveAllStatistic(user); - } - - public void removeUser(User user) { - users.remove(user); - } - - public UserDatabase getDatabase() { - return database; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/user/data/FileStats.java b/src/main/java/plugily/projects/murdermystery/user/data/FileStats.java deleted file mode 100644 index f9497812..00000000 --- a/src/main/java/plugily/projects/murdermystery/user/data/FileStats.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.user.data; - -import java.util.UUID; - -import org.bukkit.configuration.file.FileConfiguration; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.user.User; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class FileStats implements UserDatabase { - - private final Main plugin; - private final FileConfiguration config; - - public FileStats(Main plugin) { - this.plugin = plugin; - config = ConfigUtils.getConfig(plugin, "stats"); - } - - @Override - public void saveStatistic(User user, StatsStorage.StatisticType stat) { - config.set(user.getUniqueId().toString() + "." + stat.getName(), user.getStat(stat)); - ConfigUtils.saveConfig(plugin, config, "stats"); - } - - @Override - public void saveAllStatistic(User user) { - for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { - if(!stat.isPersistent()) continue; - config.set(user.getUniqueId().toString() + "." + stat.getName(), user.getStat(stat)); - } - ConfigUtils.saveConfig(plugin, config, "stats"); - } - - @Override - public void loadStatistics(User user) { - for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { - user.setStat(stat, config.getInt(user.getUniqueId().toString() + "." + stat.getName(), 0)); - } - } - - @Override - public String getPlayerName(UUID uuid) { - return plugin.getServer().getOfflinePlayer(uuid).getName(); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/user/data/MysqlManager.java b/src/main/java/plugily/projects/murdermystery/user/data/MysqlManager.java deleted file mode 100644 index d27f417f..00000000 --- a/src/main/java/plugily/projects/murdermystery/user/data/MysqlManager.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.user.data; - -import org.bukkit.Bukkit; - -import plugily.projects.commonsbox.database.MysqlDatabase; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.user.User; -import plugily.projects.murdermystery.utils.Debugger; -import plugily.projects.murdermystery.utils.MessageUtils; - -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.UUID; -import java.util.logging.Level; - -/** - * @author Plajer - *

- * Created at 03.10.2018 - */ -public class MysqlManager implements UserDatabase { - - private final Main plugin; - private final MysqlDatabase database; - - public MysqlManager(Main plugin) { - this.plugin = plugin; - database = plugin.getMysqlDatabase(); - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - try(Connection connection = database.getConnection()) { - Statement statement = connection.createStatement(); - statement.executeUpdate("CREATE TABLE IF NOT EXISTS `" + getTableName() + "` (\n" - + " `UUID` char(36) NOT NULL PRIMARY KEY,\n" - + " `name` varchar(32) NOT NULL,\n" - + " `kills` int(11) NOT NULL DEFAULT '0',\n" - + " `deaths` int(11) NOT NULL DEFAULT '0',\n" - + " `highestscore` int(11) NOT NULL DEFAULT '0',\n" - + " `gamesplayed` int(11) NOT NULL DEFAULT '0',\n" - + " `wins` int(11) NOT NULL DEFAULT '0',\n" - + " `loses` int(11) NOT NULL DEFAULT '0',\n" - + " `contribmurderer` int(11) NOT NULL DEFAULT '1',\n" - + " `contribdetective` int(11) NOT NULL DEFAULT '1',\n" - + " `murderer_pass` int(11) NOT NULL DEFAULT '0',\n" - + " `detective_pass` int(11) NOT NULL DEFAULT '0'\n" - + ");"); - } catch(SQLException e) { - e.printStackTrace(); - MessageUtils.errorOccurred(); - Debugger.sendConsoleMsg("Cannot save contents to MySQL database!"); - Debugger.sendConsoleMsg("Check configuration of mysql.yml file or disable mysql option in config.yml"); - } - }); - } - - @Override - public void saveStatistic(User user, StatsStorage.StatisticType stat) { - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - database.executeUpdate("UPDATE " + getTableName() + " SET " + stat.getName() + "=" + user.getStat(stat) + " WHERE UUID='" + user.getUniqueId().toString() + "';"); - Debugger.debug(Level.INFO, "Executed MySQL: " + "UPDATE " + getTableName() + " SET " + stat.getName() + "=" + user.getStat(stat) + " WHERE UUID='" + user.getUniqueId().toString() + "';"); - }); - } - - @Override - public void saveAllStatistic(User user) { - StringBuilder update = new StringBuilder(" SET "); - for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { - if(!stat.isPersistent()) continue; - if(update.toString().equalsIgnoreCase(" SET ")) { - update.append(stat.getName()).append('=').append(user.getStat(stat)); - } - update.append(", ").append(stat.getName()).append('=').append(user.getStat(stat)); - } - String finalUpdate = update.toString(); - - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> - database.executeUpdate("UPDATE " + getTableName() + finalUpdate + " WHERE UUID='" + user.getUniqueId().toString() + "';")); - } - - @Override - public void loadStatistics(User user) { - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - String uuid = user.getUniqueId().toString(); - try(Connection connection = database.getConnection()) { - Statement statement = connection.createStatement(); - ResultSet rs = statement.executeQuery("SELECT * from " + getTableName() + " WHERE UUID='" + uuid + "';"); - if(rs.next()) { - //player already exists - get the stats - Debugger.debug(Level.INFO, "MySQL Stats | Player {0} already exist. Getting Stats...", user.getPlayer().getName()); - for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { - if(!stat.isPersistent()) continue; - int val = rs.getInt(stat.getName()); - user.setStat(stat, val); - } - } else { - //player doesn't exist - make a new record - Debugger.debug(Level.INFO, "MySQL Stats | Player {0} does not exist. Creating new one...", user.getPlayer().getName()); - statement.executeUpdate("INSERT INTO " + getTableName() + " (UUID,name) VALUES ('" + uuid + "','" + user.getPlayer().getName() + "');"); - for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { - if(!stat.isPersistent()) continue; - if(stat == StatsStorage.StatisticType.CONTRIBUTION_DETECTIVE || stat == StatsStorage.StatisticType.CONTRIBUTION_MURDERER) { - user.setStat(stat, 1); - } else { - user.setStat(stat, 0); - } - } - } - } catch(SQLException e) { - e.printStackTrace(); - } - }); - } - - @Override - public String getPlayerName(UUID uuid) { - try(Connection connection = database.getConnection(); Statement statement = connection.createStatement()) { - return statement.executeQuery("Select `name` FROM " + getTableName() + " WHERE UUID='" + uuid.toString() + "'").toString(); - } catch(SQLException | NullPointerException e) { - return null; - } - } - - public String getTableName() { - return ConfigUtils.getConfig(plugin, "mysql").getString("table", "playerstats"); - } - - public MysqlDatabase getDatabase() { - return database; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/user/data/UserDatabase.java b/src/main/java/plugily/projects/murdermystery/user/data/UserDatabase.java deleted file mode 100644 index e3a736fe..00000000 --- a/src/main/java/plugily/projects/murdermystery/user/data/UserDatabase.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.user.data; - -import java.util.UUID; - -import org.jetbrains.annotations.Nullable; - -import plugily.projects.murdermystery.api.StatsStorage; -import plugily.projects.murdermystery.user.User; - -/** - * @author Plajer - *

- * Created at 23.01.2019 - */ -public interface UserDatabase { - - /** - * Saves player statistic into yaml or MySQL storage based on user choice - * - * @param user user to retrieve statistic from - * @param stat stat to save to storage - */ - void saveStatistic(User user, StatsStorage.StatisticType stat); - - /** - * Saves player statistic into yaml or MySQL storage based on user choice - * - * @param user user to retrieve statistic from - */ - void saveAllStatistic(User user); - - /** - * Loads player statistic from yaml or MySQL storage based on user choice - * - * @param user user to load statistic for - */ - void loadStatistics(User user); - - /** - * Get the name of the player providing the UUID - * - * @param uuid the UUID - * @return the player's name - */ - @Nullable - String getPlayerName(UUID uuid); - -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/Debugger.java b/src/main/java/plugily/projects/murdermystery/utils/Debugger.java deleted file mode 100644 index c4ec24a4..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/Debugger.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; - -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.misc.MiscUtils; - -import java.util.HashSet; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author Plajer - *

- * Created at 06.04.2019 - */ -public class Debugger { - - private static final HashSet listenedPerformance = new HashSet<>(); - private static boolean enabled = false; - private static boolean deep = false; - private static final Logger logger = Logger.getLogger("Murder Mystery"); - - public static void setEnabled(boolean enabled) { - Debugger.enabled = enabled; - } - - public static void deepDebug(boolean deep) { - Debugger.deep = deep; - } - - public static void monitorPerformance(String task) { - listenedPerformance.add(task); - } - - public static void sendConsoleMsg(String msg) { - if(ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_16_R1) && msg.indexOf('#') >= 0) { - msg = MiscUtils.matchColorRegex(msg); - } - - Bukkit.getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', msg)); - } - - public static void debug(String msg) { - debug(Level.INFO, msg); - } - - /** - * Prints debug message with selected log level. - * Messages of level INFO or TASK won't be posted if - * debugger is enabled, warnings and errors will be. - * - * @param level level of debugged message - * @param msg debugged message - */ - public static void debug(Level level, String msg) { - if(!enabled && (level != Level.WARNING || level != Level.SEVERE)) { - return; - } - logger.log(level, "[MMDBG] " + msg); - } - - public static void debug(String msg, Object... params) { - debug(Level.INFO, msg, params); - } - - /** - * Prints debug message with selected log level and replaces parameters. - * Messages of level INFO or TASK won't be posted if - * debugger is enabled, warnings and errors will be. - * - * @param level level of debugged message - * @param msg debugged message - */ - public static void debug(Level level, String msg, Object... params) { - if(!enabled && (level != Level.WARNING || level != Level.SEVERE)) { - return; - } - logger.log(level, "[MMDBG] " + msg, params); - } - - /** - * Prints performance debug message with selected log level and replaces parameters. - * - * @param msg debugged message - */ - public static void performance(String monitorName, String msg, Object... params) { - if(!deep || !listenedPerformance.contains(monitorName)) { - return; - } - logger.log(Level.INFO, "[MMDBG] " + msg, params); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/ExceptionLogHandler.java b/src/main/java/plugily/projects/murdermystery/utils/ExceptionLogHandler.java deleted file mode 100644 index f7cba75f..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/ExceptionLogHandler.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils; - -import org.bukkit.Bukkit; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.utils.services.exception.ReportedException; - -import java.util.Arrays; -import java.util.List; -import java.util.logging.Handler; -import java.util.logging.LogRecord; - -/** - * @author Plajer - *

- * Created at 24.03.2019 - */ -public class ExceptionLogHandler extends Handler { - - //these classes if found in stacktraces won't be reported - //to the Error Service - private final List blacklistedClasses = Arrays.asList("plugily.projects.murdermystery.user.data.MysqlManager", "plugily.projects.murdermystery.plajerlair.commonsbox.database.MysqlDatabase"); - private final Main plugin; - - public ExceptionLogHandler(Main plugin) { - this.plugin = plugin; - Bukkit.getLogger().addHandler(this); - } - - @Override - public void close() throws SecurityException { - } - - @Override - public void flush() { - } - - @Override - public void publish(LogRecord record) { - Throwable throwable = record.getThrown(); - if(throwable == null || throwable.getCause() == null) { - return; - } - StackTraceElement[] element = throwable.getCause().getStackTrace(); - if(element.length == 0 || element[0] == null || !element[0].getClassName().contains("plugily.projects.murdermystery")) { - return; - } - if(containsBlacklistedClass(throwable)) { - return; - } - new ReportedException(plugin, throwable); - record.setThrown(null); - record.setMessage("[Murder Mystery] We have found a bug in the code. Contact us at our official discord server (Invite link: https://discordapp.com/invite/UXzUdTP) with the following error given" + - " above!"); - } - - private boolean containsBlacklistedClass(Throwable throwable) { - for(StackTraceElement element : throwable.getStackTrace()) { - for(String blacklist : blacklistedClasses) { - if(element.getClassName().contains(blacklist)) { - return true; - } - } - } - return false; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/ItemPosition.java b/src/main/java/plugily/projects/murdermystery/utils/ItemPosition.java index 82769076..1af1fa6e 100644 --- a/src/main/java/plugily/projects/murdermystery/utils/ItemPosition.java +++ b/src/main/java/plugily/projects/murdermystery/utils/ItemPosition.java @@ -18,9 +18,9 @@ package plugily.projects.murdermystery.utils; -import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.murdermystery.arena.role.Role; /** @@ -45,23 +45,19 @@ public enum ItemPosition { * Adds target item to specified hotbar position sorta different for each role. * Item will be added if there is already set or will be set when no item is set in the position. * - * @param player player to add item to + * @param user player to add item to * @param itemPosition position of item to set/add * @param itemStack itemstack to be added at itemPostion or set at itemPosition */ - public static void addItem(Player player, ItemPosition itemPosition, ItemStack itemStack) { - if(player == null) { - return; - } - - int itemPos = Role.isRole(Role.MURDERER, player) ? itemPosition.getMurdererItemPosition() + public static void addItem(User user, ItemPosition itemPosition, ItemStack itemStack) { + int itemPos = Role.isRole(Role.MURDERER, user) ? itemPosition.getMurdererItemPosition() : itemPosition.getOtherRolesItemPosition(); if (itemPos < 0) { return; } - Inventory inv = player.getInventory(); + Inventory inv = user.getPlayer().getInventory(); ItemStack item = inv.getItem(itemPos); if(item != null) { @@ -76,19 +72,15 @@ public static void addItem(Player player, ItemPosition itemPosition, ItemStack i * Sets target item in specified hotbar position sorta different for each role. * If item there is already set it will be incremented by itemStack amount if possible. * - * @param player player to set item to + * @param user player to set item to * @param itemPosition position of item to set * @param itemStack itemstack to set at itemPosition */ - public static void setItem(Player player, ItemPosition itemPosition, ItemStack itemStack) { - if(player == null) { - return; - } - - if(itemPosition.getMurdererItemPosition() >= 0 && Role.isRole(Role.MURDERER, player)) { - player.getInventory().setItem(itemPosition.getMurdererItemPosition(), itemStack); + public static void setItem(User user, ItemPosition itemPosition, ItemStack itemStack) { + if(itemPosition.getMurdererItemPosition() >= 0 && Role.isRole(Role.MURDERER, user)) { + user.getPlayer().getInventory().setItem(itemPosition.getMurdererItemPosition(), itemStack); } else if (itemPosition.getOtherRolesItemPosition() >= 0) { - player.getInventory().setItem(itemPosition.getOtherRolesItemPosition(), itemStack); + user.getPlayer().getInventory().setItem(itemPosition.getOtherRolesItemPosition(), itemStack); } } diff --git a/src/main/java/plugily/projects/murdermystery/utils/MessageUtils.java b/src/main/java/plugily/projects/murdermystery/utils/MessageUtils.java deleted file mode 100644 index abc9c150..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/MessageUtils.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class MessageUtils { - - private MessageUtils() { - } - - public static void thisVersionIsNotSupported() { - Debugger.sendConsoleMsg("&c _ _ _ _ _ "); - Debugger.sendConsoleMsg("&c | \\ | | ___ | |_ ___ _ _ _ __ _ __ ___ _ __ | |_ ___ __| |"); - Debugger.sendConsoleMsg("&c | \\| | / _ \\ | __| / __| | | | | | '_ \\ | '_ \\ / _ \\ | '__| | __| / _ \\ / _` |"); - Debugger.sendConsoleMsg("&c | |\\ | | (_) | | |_ \\__ \\ | |_| | | |_) | | |_) | | (_) | | | | |_ | __/ | (_| |"); - Debugger.sendConsoleMsg("&c |_| \\_| \\___/ \\__| |___/ \\__,_| | .__/ | .__/ \\___/ |_| \\__| \\___| \\__,_|"); - Debugger.sendConsoleMsg("&c |_| |_| "); - } - - public static void errorOccurred() { - Debugger.sendConsoleMsg("&c _____ _ _ "); - Debugger.sendConsoleMsg("&c | ____| _ __ _ __ ___ _ __ ___ ___ ___ _ _ _ __ ___ __| | | |"); - Debugger.sendConsoleMsg("&c | _| | '__| | '__| / _ \\ | '__| / _ \\ / __| / __| | | | | | '__| / _ \\ / _` | | |"); - Debugger.sendConsoleMsg("&c | |___ | | | | | (_) | | | | (_) | | (__ | (__ | |_| | | | | __/ | (_| | |_|"); - Debugger.sendConsoleMsg("&c |_____| |_| |_| \\___/ |_| \\___/ \\___| \\___| \\__,_| |_| \\___| \\__,_| (_)"); - Debugger.sendConsoleMsg("&c "); - } - - public static void updateIsHere() { - Debugger.sendConsoleMsg("&a _ _ _ _ "); - Debugger.sendConsoleMsg("&a | | | | _ __ __| | __ _ | |_ ___ "); - Debugger.sendConsoleMsg("&a | | | | | '_ \\ / _` | / _` | | __| / _ \\"); - Debugger.sendConsoleMsg("&a | |_| | | |_) | | (_| | | (_| | | |_ | __/"); - Debugger.sendConsoleMsg("&a \\___/ | .__/ \\__,_| \\__,_| \\__| \\___|"); - Debugger.sendConsoleMsg("&a |_| "); - } - - public static void info() { - Debugger.sendConsoleMsg("&e _____ __ _ "); - Debugger.sendConsoleMsg("&e |_ _| / _| | |"); - Debugger.sendConsoleMsg("&e | | _ __ | |_ ___ | |"); - Debugger.sendConsoleMsg("&e | | | '_ \\| _/ _ \\ | |"); - Debugger.sendConsoleMsg("&e _| |_| | | | || (_) | |_|"); - Debugger.sendConsoleMsg("&e |_____|_| |_|_| \\___/ (_)"); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/UpdateChecker.java b/src/main/java/plugily/projects/murdermystery/utils/UpdateChecker.java deleted file mode 100644 index 21f43cfc..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/UpdateChecker.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils; - -import com.google.common.base.Preconditions; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonSyntaxException; -import org.apache.commons.lang.math.NumberUtils; -import org.bukkit.plugin.java.JavaPlugin; - -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.concurrent.CompletableFuture; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * A utility class to assist in checking for updates for plugins uploaded to - * SpigotMC. Before any members of this - * class are accessed, {@link #init(JavaPlugin, int)} must be invoked by the plugin, - * preferrably in its {@link JavaPlugin#onEnable()} method, though that is not a - * requirement. - *

- * This class performs asynchronous queries to SpiGet, - * an REST server which is updated periodically. If the results of {@link #requestUpdateCheck()} - * are inconsistent with what is published on SpigotMC, it may be due to SpiGet's cache. - * Results will be updated in due time. - * - * @author Parker Hawke - 2008Choco - */ -public final class UpdateChecker { - - private static final String USER_AGENT = "CHOCO-update-checker"; - private static final String UPDATE_URL = "https://api.spiget.org/v2/resources/%d/versions?size=1&sort=-releaseDate"; - private static final Pattern DECIMAL_SCHEME_PATTERN = Pattern.compile("\\d+(?:\\.\\d+)*"); - public static final VersionScheme VERSION_SCHEME_DECIMAL = (first, second) -> { - String[] firstSplit = splitVersionInfo(first), secondSplit = splitVersionInfo(second); - if(firstSplit == null || secondSplit == null) { - return null; - } - - for(int i = 0; i < Math.min(firstSplit.length, secondSplit.length); i++) { - int currentValue = NumberUtils.toInt(firstSplit[i]), newestValue = NumberUtils.toInt(secondSplit[i]); - - if(newestValue > currentValue) { - return second; - } else if(newestValue < currentValue) { - return first; - } - } - - return (secondSplit.length > firstSplit.length) ? second : first; - }; - private static UpdateChecker instance; - private final JavaPlugin plugin; - private final int pluginID; - private final VersionScheme versionScheme; - private UpdateResult lastResult = null; - - private UpdateChecker(JavaPlugin plugin, int pluginID, VersionScheme versionScheme) { - this.plugin = plugin; - this.pluginID = pluginID; - this.versionScheme = versionScheme; - } - - private static String[] splitVersionInfo(String version) { - Matcher matcher = DECIMAL_SCHEME_PATTERN.matcher(version); - if(!matcher.find()) { - return null; - } - - return matcher.group().split("\\."); - } - - /** - * Initialize this update checker with the specified values and return its instance. If an instance - * of UpdateChecker has already been initialized, this method will act similarly to {@link #get()} - * (which is recommended after initialization). - * - * @param plugin the plugin for which to check updates. Cannot be null - * @param pluginID the ID of the plugin as identified in the SpigotMC resource link. For example, - * "https://www.spigotmc.org/resources/veinminer.12038/" would expect "12038" as a value. The - * value must be greater than 0 - * @param versionScheme a custom version scheme parser. Cannot be null - * @return the UpdateChecker instance - */ - public static UpdateChecker init(JavaPlugin plugin, int pluginID, VersionScheme versionScheme) { - Preconditions.checkArgument(plugin != null, "Plugin cannot be null"); - Preconditions.checkArgument(pluginID > 0, "Plugin ID must be greater than 0"); - Preconditions.checkArgument(versionScheme != null, "null version schemes are unsupported"); - - return (instance == null) ? instance = new UpdateChecker(plugin, pluginID, versionScheme) : instance; - } - - /** - * Initialize this update checker with the specified values and return its instance. If an instance - * of UpdateChecker has already been initialized, this method will act similarly to {@link #get()} - * (which is recommended after initialization). - * - * @param plugin the plugin for which to check updates. Cannot be null - * @param pluginID the ID of the plugin as identified in the SpigotMC resource link. For example, - * "https://www.spigotmc.org/resources/veinminer.12038/" would expect "12038" as a value. The - * value must be greater than 0 - * @return the UpdateChecker instance - */ - public static UpdateChecker init(JavaPlugin plugin, int pluginID) { - return init(plugin, pluginID, VERSION_SCHEME_DECIMAL); - } - - /** - * Get the initialized instance of UpdateChecker. If {@link #init(JavaPlugin, int)} has not yet been - * invoked, this method will throw an exception. - * - * @return the UpdateChecker instance - */ - public static UpdateChecker get() { - Preconditions.checkState(instance != null, "Instance has not yet been initialized. Be sure #init() has been invoked"); - return instance; - } - - /** - * Check whether the UpdateChecker has been initialized or not (if {@link #init(JavaPlugin, int)} - * has been invoked) and {@link #get()} is safe to use. - * - * @return true if initialized, false otherwise - */ - public static boolean isInitialized() { - return instance != null; - } - - /** - * Request an update check to SpiGet. This request is asynchronous and may not complete - * immediately as an HTTP GET request is published to the SpiGet API. - * - * @return a future update result - */ - public CompletableFuture requestUpdateCheck() { - return CompletableFuture.supplyAsync(() -> { - int responseCode = -1; - try { - URL url = new URL(String.format(UPDATE_URL, pluginID)); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.addRequestProperty("User-Agent", USER_AGENT); - - InputStreamReader reader = new InputStreamReader(connection.getInputStream()); - responseCode = connection.getResponseCode(); - - JsonElement element = new JsonParser().parse(reader); - if(!element.isJsonArray()) { - return new UpdateResult(UpdateReason.INVALID_JSON); - } - - reader.close(); - - JsonObject versionObject = element.getAsJsonArray().get(0).getAsJsonObject(); - String current = plugin.getDescription().getVersion(), newest = versionObject.get("name").getAsString(); - String latest = versionScheme.compareVersions(current, newest); - - if(latest == null) { - return new UpdateResult(UpdateReason.UNSUPPORTED_VERSION_SCHEME); - } else if(latest.equals(current)) { - return new UpdateResult(current.equals(newest) ? UpdateReason.UP_TO_DATE : UpdateReason.UNRELEASED_VERSION); - } else if(latest.equals(newest)) { - return new UpdateResult(UpdateReason.NEW_UPDATE, latest); - } - } catch(IOException e) { - return new UpdateResult(UpdateReason.COULD_NOT_CONNECT); - } catch(JsonSyntaxException e) { - return new UpdateResult(UpdateReason.INVALID_JSON); - } - - return new UpdateResult(responseCode == 401 ? UpdateReason.UNAUTHORIZED_QUERY : UpdateReason.UNKNOWN_ERROR); - }); - } - - /** - * Get the last update result that was queried by {@link #requestUpdateCheck()}. If no update - * check was performed since this class' initialization, this method will return null. - * - * @return the last update check result. null if none. - */ - public UpdateResult getLastResult() { - return lastResult; - } - - - /** - * A constant reason for the result of {@link UpdateResult}. - */ - public enum UpdateReason { - - /** - * A new update is available for download on SpigotMC. - */ - NEW_UPDATE, // The only reason that requires an update - - /** - * A successful connection to the SpiGet API could not be established. - */ - COULD_NOT_CONNECT, - - /** - * The JSON retrieved from SpiGet was invalid or malformed. - */ - INVALID_JSON, - - /** - * A 401 error was returned by the SpiGet API. - */ - UNAUTHORIZED_QUERY, - - /** - * The version of the plugin installed on the server is greater than the one uploaded - * to SpigotMC's resources section. - */ - UNRELEASED_VERSION, - - /** - * An unknown error occurred. - */ - UNKNOWN_ERROR, - - /** - * The plugin uses an unsupported version scheme, therefore a proper comparison between - * versions could not be made. - */ - UNSUPPORTED_VERSION_SCHEME, - - /** - * The plugin is up to date with the version released on SpigotMC's resources section. - */ - UP_TO_DATE - - } - - /** - * A functional interface to compare two version Strings with similar version schemes. - */ - @FunctionalInterface - public interface VersionScheme { - - /** - * Compare two versions and return the higher of the two. If null is returned, it is assumed - * that at least one of the two versions are unsupported by this version scheme parser. - * - * @param first the first version to check - * @param second the second version to check - * @return the greater of the two versions. null if unsupported version schemes - */ - String compareVersions(String first, String second); - - } - - /** - * Represents a result for an update query performed by {@link UpdateChecker#requestUpdateCheck()}. - */ - public final class UpdateResult { - - private final UpdateReason reason; - private final String newestVersion; - - { // An actual use for initializer blocks. This is madness! - UpdateChecker.this.lastResult = this; - } - - private UpdateResult(UpdateReason reason, String newestVersion) { - this.reason = reason; - this.newestVersion = newestVersion; - } - - private UpdateResult(UpdateReason reason) { - Preconditions.checkArgument(reason != UpdateReason.NEW_UPDATE, "Reasons that require updates must also provide the latest version String"); - this.reason = reason; - this.newestVersion = plugin.getDescription().getVersion(); - } - - /** - * Get the constant reason of this result. - * - * @return the reason - */ - public UpdateReason getReason() { - return reason; - } - - /** - * Check whether or not this result requires the user to update. - * - * @return true if requires update, false otherwise - */ - public boolean requiresUpdate() { - return reason == UpdateReason.NEW_UPDATE; - } - - /** - * Get the latest version of the plugin. This may be the currently installed version, it - * may not be. This depends entirely on the result of the update. - * - * @return the newest version of the plugin - */ - public String getNewestVersion() { - return newestVersion; - } - - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/Utils.java b/src/main/java/plugily/projects/murdermystery/utils/Utils.java deleted file mode 100644 index 74ef5ca5..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/Utils.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils; - -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import plugily.projects.commonsbox.minecraft.compat.VersionUtils; -import plugily.projects.commonsbox.string.StringFormatUtils; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.ArenaState; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Plajer - *

- * Created at 06.10.2018 - */ -public class Utils { - - private static Main plugin; - - private Utils() { - } - - public static void init(Main plugin) { - Utils.plugin = plugin; - } - - /** - * Serialize int to use it in Inventories size - * ex. you have 38 kits and it will serialize it to 45 (9*5) - * because it is valid inventory size - * next ex. you have 55 items and it will serialize it to 63 (9*7) not 54 because it's too less - * - * @param i integer to serialize - * @return serialized number - */ - public static int serializeInt(int i) { - if(i == 0) return 9; //The function bellow doesn't work if i == 0, so return 9 in case that happens. - return (i % 9) == 0 ? i : (i + 9 - 1) / 9 * 9; - } - - public static void applyActionBarCooldown(Player p, int seconds) { - final int s = seconds * 20; - - new BukkitRunnable() { - int ticks = 0; - - @Override - public void run() { - Arena arena = ArenaRegistry.getArena(p); - - if(arena == null || arena.getArenaState() != ArenaState.IN_GAME) { - cancel(); - } - - if(ticks >= s) { - cancel(); - } - - String progress = StringFormatUtils.getProgressBar(ticks, s, 10, "■", ChatColor.COLOR_CHAR + "a", ChatColor.COLOR_CHAR + "c"); - VersionUtils.sendActionBar(p, plugin.getChatManager().colorMessage("In-Game.Cooldown-Format", p) - .replace("%progress%", progress).replace("%time%", Double.toString((double) (s - ticks) / 20))); - ticks += 10; - } - }.runTaskTimer(plugin, 0, 10); - } - - public static List getNearbyBlocks(Location location, int radius) { - List blocks = new ArrayList<>(); - - org.bukkit.World world = location.getWorld(); - if(world == null) - return blocks; - - int blockX = location.getBlockX(); - int blockY = location.getBlockY(); - int blockZ = location.getBlockZ(); - - for(int x = blockX - radius; x <= blockX + radius; x++) { - for(int y = blockY - radius; y <= blockY + radius; y++) { - for(int z = blockZ - radius; z <= blockZ + radius; z++) { - blocks.add(world.getBlockAt(x, y, z)); - } - } - } - return blocks; - } - - public static Location getBlockCenter(Location location) { - return location.clone().add(0.5, 0, 0.5); - } - - public static boolean checkIsInGameInstance(Player player) { - if(!ArenaRegistry.isInArena(player)) { - player.sendMessage(plugin.getChatManager().getPrefix() + plugin.getChatManager().colorMessage("Commands.Not-Playing", player)); - return false; - } - return true; - } - - public static boolean hasPermission(CommandSender sender, String perm) { - if(sender.hasPermission(perm)) { - return true; - } - sender.sendMessage(plugin.getChatManager().getPrefix() + plugin.getChatManager().colorMessage("Commands.No-Permission")); - return false; - } - - public static boolean hasPermission(Player sender, String perm) { - if(sender.hasPermission(perm)) { - return true; - } - sender.sendMessage(plugin.getChatManager().getPrefix() + plugin.getChatManager().colorMessage("Commands.No-Permission")); - return false; - } - - public static Vector rotateAroundAxisX(Vector v, double angle) { - angle = Math.toRadians(angle); - double cos = Math.cos(angle), - sin = Math.sin(angle), - y = v.getY() * cos - v.getZ() * sin, - z = v.getY() * sin + v.getZ() * cos; - return v.setY(y).setZ(z); - } - - public static Vector rotateAroundAxisY(Vector v, double angle) { - angle = -angle; - angle = Math.toRadians(angle); - double cos = Math.cos(angle), - sin = Math.sin(angle), - x = v.getX() * cos + v.getZ() * sin, - z = v.getX() * -sin + v.getZ() * cos; - return v.setX(x).setZ(z); - } - - /** - * Checks whether itemstack is named (not null, has meta and display name) - * - * @param stack item stack to check - * @return true if named, false otherwise - */ - public static boolean isNamed(ItemStack stack) { - return stack != null && stack.hasItemMeta() && stack.getItemMeta().hasDisplayName(); - } -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/conversation/SimpleConversationBuilder.java b/src/main/java/plugily/projects/murdermystery/utils/conversation/SimpleConversationBuilder.java deleted file mode 100644 index 4aecea1e..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/conversation/SimpleConversationBuilder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils.conversation; - -import org.bukkit.ChatColor; -import org.bukkit.conversations.Conversable; -import org.bukkit.conversations.ConversationFactory; -import org.bukkit.conversations.Prompt; -import org.bukkit.plugin.java.JavaPlugin; -import plugily.projects.murdermystery.Main; - -/** - * @author Plajer - *

- * Created at 25.05.2019 - */ -public class SimpleConversationBuilder { - - private static final Main plugin = JavaPlugin.getPlugin(Main.class); - private final ConversationFactory conversationFactory; - - public SimpleConversationBuilder() { - conversationFactory = new ConversationFactory(plugin) - .withModality(true) - .withLocalEcho(false) - .withEscapeSequence("cancel") - .withTimeout(30) - .addConversationAbandonedListener(listener -> { - if(listener.gracefulExit()) { - return; - } - listener.getContext().getForWhom().sendRawMessage(plugin.getChatManager().colorRawMessage("&7Operation cancelled!")); - }) - .thatExcludesNonPlayersWithMessage(ChatColor.RED + "Only by players!"); - } - - public SimpleConversationBuilder withPrompt(Prompt prompt) { - conversationFactory.withFirstPrompt(prompt); - return this; - } - - public void buildFor(Conversable conversable) { - conversationFactory.buildConversation(conversable).begin(); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/services/ServiceRegistry.java b/src/main/java/plugily/projects/murdermystery/utils/services/ServiceRegistry.java deleted file mode 100644 index 16fb1c73..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/services/ServiceRegistry.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils.services; - -import org.bukkit.plugin.java.JavaPlugin; -import plugily.projects.murdermystery.utils.services.locale.LocaleService; -import plugily.projects.murdermystery.utils.services.metrics.MetricsService; - -import javax.net.ssl.HttpsURLConnection; -import java.io.IOException; -import java.net.URL; -import java.util.logging.Level; - -/** - * Class for registering new services - */ -public class ServiceRegistry { - - private static JavaPlugin registeredService; - private static boolean serviceEnabled; - private static long serviceCooldown = 0; - private static LocaleService localeService; - - private ServiceRegistry() { - } - - public static boolean registerService(JavaPlugin plugin) { - if(registeredService != null && registeredService.equals(plugin)) { - return false; - } - plugin.getLogger().log(Level.INFO, "Connecting to services, please wait! Server may freeze a bit!"); - try { - HttpsURLConnection connection = (HttpsURLConnection) new URL("https://api.plugily.xyz/ping.php").openConnection(); - connection.setConnectTimeout(3000); - connection.setReadTimeout(2000); - connection.setRequestMethod("HEAD"); - connection.setRequestProperty("User-Agent", "PLService/1.0"); - int responseCode = connection.getResponseCode(); - if(responseCode != 200) { - plugin.getLogger().log(Level.WARNING, "Plugily Projects services aren't online or inaccessible from your location! Response: " + responseCode + ". Do you think it's site problem? Contact developer! Make sure Cloudflare isn't blocked in your area!"); - serviceEnabled = false; - return false; - } - } catch(IOException ignored) { - plugin.getLogger().log(Level.WARNING, "Plugily Projects services aren't online or inaccessible from your location!"); - serviceEnabled = false; - return false; - } - registeredService = plugin; - serviceEnabled = true; - plugin.getLogger().log(Level.INFO, "Hooked with ServiceRegistry! Initialized services properly!"); - new MetricsService(plugin); - localeService = new LocaleService(plugin); - return true; - } - - public static JavaPlugin getRegisteredService() { - return registeredService; - } - - public static long getServiceCooldown() { - return serviceCooldown; - } - - public static void setServiceCooldown(long serviceCooldown) { - ServiceRegistry.serviceCooldown = serviceCooldown; - } - - public static LocaleService getLocaleService(JavaPlugin plugin) { - return (!serviceEnabled || registeredService == null || !registeredService.equals(plugin)) ? null : localeService; - } - - public static boolean isServiceEnabled() { - return serviceEnabled; - } -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/services/exception/ReportedException.java b/src/main/java/plugily/projects/murdermystery/utils/services/exception/ReportedException.java deleted file mode 100644 index 67c54001..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/services/exception/ReportedException.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils.services.exception; - -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitRunnable; -import plugily.projects.murdermystery.utils.services.ServiceRegistry; - -import java.util.logging.Level; - -/** - * Create reported exception with data sent to plugily.xyz reporter service - */ -public class ReportedException { - - private ReporterService reporterService; - - public ReportedException(JavaPlugin plugin, Throwable e) { - Throwable exception = e.getCause() != null ? e.getCause() : e; - StringBuilder stacktrace = new StringBuilder(exception.getClass().getSimpleName()); - if(exception.getMessage() != null) { - stacktrace.append(" (").append(exception.getMessage()).append(")"); - } - stacktrace.append("\n"); - for(StackTraceElement str : exception.getStackTrace()) { - stacktrace.append(str.toString()).append("\n"); - } - - plugin.getLogger().log(Level.WARNING, "[Reporter service] <<-----------------------------[START]----------------------------->>"); - plugin.getLogger().log(Level.WARNING, stacktrace.toString()); - plugin.getLogger().log(Level.WARNING, "[Reporter service] <<------------------------------[END]------------------------------>>"); - - if(!ServiceRegistry.isServiceEnabled() || System.currentTimeMillis() - ServiceRegistry.getServiceCooldown() < 900000) { - return; - } - ServiceRegistry.setServiceCooldown(System.currentTimeMillis()); - new BukkitRunnable() { - @Override - public void run() { - reporterService = new ReporterService(plugin, plugin.getName(), plugin.getDescription().getVersion(), plugin.getServer().getBukkitVersion() + " " + plugin.getServer().getVersion(), - stacktrace.toString()); - reporterService.reportException(); - } - }.runTaskAsynchronously(plugin); - } -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/services/exception/ReporterService.java b/src/main/java/plugily/projects/murdermystery/utils/services/exception/ReporterService.java deleted file mode 100644 index b410aca1..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/services/exception/ReporterService.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils.services.exception; - -import org.bukkit.plugin.java.JavaPlugin; -import plugily.projects.murdermystery.utils.Debugger; - -import javax.net.ssl.HttpsURLConnection; -import java.io.IOException; -import java.io.OutputStream; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.logging.Level; - -/** - * Reporter service for reporting exceptions directly to website reporter panel - */ -public class ReporterService { - - private final JavaPlugin plugin; - private final String pluginName; - private final String pluginVersion; - private final String serverVersion; - private final String error; - - //don't create it outside core - ReporterService(JavaPlugin plugin, String pluginName, String pluginVersion, String serverVersion, String error) { - this.plugin = plugin; - this.pluginName = pluginName; - this.pluginVersion = pluginVersion; - this.serverVersion = serverVersion; - this.error = error; - } - - public void reportException() { - try { - URL url = new URL("https://api.plugily.xyz/error/report.php"); - HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); - conn.setRequestMethod("POST"); - conn.setRequestProperty("User-Agent", "PLService/1.0"); - conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); - conn.setDoOutput(true); - - OutputStream os = conn.getOutputStream(); - os.write(("pass=servicereporter&type=" + pluginName + "&pluginversion=" + pluginVersion + "&serverversion=" + serverVersion + "&error=" + error).getBytes(StandardCharsets.UTF_8)); - os.flush(); - os.close(); - - plugin.getLogger().log(Level.WARNING, "[Reporter service] Error reported!"); - Debugger.debug(Level.INFO, "[Reporter service] Code: {0} ({1})", conn.getResponseCode(), conn.getResponseMessage()); - } catch(IOException ignored) {/*cannot connect or there is a problem*/ - } - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/services/locale/Locale.java b/src/main/java/plugily/projects/murdermystery/utils/services/locale/Locale.java deleted file mode 100644 index 745a33ea..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/services/locale/Locale.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils.services.locale; - -import java.util.List; - -/** - * Class for locales - * - * @since 1.2.0 - */ -public class Locale { - - private final String name; - private final String originalName; - private final String prefix; - private final String author; - private final List aliases; - - public Locale(String name, String originalName, String prefix, String author, List aliases) { - this.prefix = prefix; - this.name = name; - this.originalName = originalName; - this.author = author; - this.aliases = aliases; - } - - /** - * Gets name of locale, ex. English or German - * - * @return name of locale - */ - public String getName() { - return name; - } - - /** - * Gets original name of locale ex. for German it will return Deutsch, Polish returns Polski etc. - * - * @return name of locale in its language - */ - public String getOriginalName() { - return originalName; - } - - /** - * @return authors of locale - */ - public String getAuthor() { - return author; - } - - /** - * Language code ex. en_GB, de_DE, pl_PL etc. - * - * @return language code of locale - */ - public String getPrefix() { - return prefix; - } - - /** - * Valid aliases of locale ex. for German - deutsch, de, german; Polish - polski, pl, polish etc. - * - * @return aliases for locale - */ - public List getAliases() { - return aliases; - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/services/locale/LocaleRegistry.java b/src/main/java/plugily/projects/murdermystery/utils/services/locale/LocaleRegistry.java deleted file mode 100644 index 3997dd48..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/services/locale/LocaleRegistry.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils.services.locale; - -import java.util.ArrayList; -import java.util.List; - -/** - * Registry class for holding locales - * - * @since 1.2.0 - */ -public class LocaleRegistry { - - private static final List registeredLocales = new ArrayList<>(); - - /** - * Register new locale into registry - * - * @param locale locale to register - * @throws IllegalArgumentException if same locale is registered twice - */ - public static void registerLocale(Locale locale) { - if(registeredLocales.contains(locale)) { - throw new IllegalArgumentException("Cannot register same locale twice!"); - } - registeredLocales.add(locale); - } - - /** - * Get all registered locales - * - * @return all registered locales - */ - public static List getRegisteredLocales() { - return registeredLocales; - } - - /** - * Get locale by its name - * - * @param name name to search - * @return locale by name or locale "Undefined" when not found (null is not returned) - * @since 1.2.2 - */ - public static Locale getByName(String name) { - for(Locale locale : registeredLocales) { - if(locale.getName().equals(name)) { - return locale; - } - } - return new Locale("Undefined", "Undefined", "", "System", new ArrayList<>()); - } -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/services/locale/LocaleService.java b/src/main/java/plugily/projects/murdermystery/utils/services/locale/LocaleService.java deleted file mode 100644 index 00d5ed07..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/services/locale/LocaleService.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils.services.locale; - -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.plugin.java.JavaPlugin; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.murdermystery.utils.services.ServiceRegistry; - -import javax.net.ssl.HttpsURLConnection; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.Scanner; -import java.util.logging.Level; -import java.util.regex.Pattern; - -/** - * Localization service used for fetching latest locales for minigames - */ -public class LocaleService { - - private JavaPlugin plugin; - private FileConfiguration localeData; - - public LocaleService(JavaPlugin plugin) { - if(ServiceRegistry.getRegisteredService() == null || !ServiceRegistry.getRegisteredService().equals(plugin)) { - throw new IllegalArgumentException("LocaleService cannot be used without registering service via ServiceRegistry first!"); - } - if(!ServiceRegistry.isServiceEnabled()) { - return; - } - this.plugin = plugin; - try(Scanner scanner = new Scanner(requestLocaleFetch(null), "UTF-8").useDelimiter("\\A")) { - String data = scanner.hasNext() ? scanner.next() : ""; - File file = new File(plugin.getDataFolder().getPath() + "/locales/locale_data.yml"); - if(!file.exists()) { - new File(plugin.getDataFolder().getPath() + "/locales").mkdir(); - if(!file.createNewFile()) { - plugin.getLogger().log(Level.WARNING, "Couldn't create locales folder! We must disable locales support."); - return; - } - } - Files.write(file.toPath(), data.getBytes()); - this.localeData = ConfigUtils.getConfig(plugin, "/locales/locale_data"); - plugin.getLogger().log(Level.INFO, "Fetched latest localization file from repository."); - } catch(IOException ignored) { - //ignore exceptions - plugin.getLogger().log(Level.WARNING, "Couldn't access locale fetcher service or there is other problem! You should notify author!"); - } - } - - private static String toReadable(String version) { - String[] split = Pattern.compile(".", Pattern.LITERAL).split(version.replace("v", "")); - StringBuilder versionBuilder = new StringBuilder(); - for(String s : split) { - versionBuilder.append(String.format("%4s", s)); - } - version = versionBuilder.toString(); - return version; - } - - private InputStream requestLocaleFetch(Locale locale) { - try { - URL url = new URL("https://api.plugily.xyz/locale/v2/fetch.php"); - HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); - conn.setRequestMethod("POST"); - conn.setRequestProperty("User-Agent", "PLLocale/1.0"); - conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); - conn.setRequestProperty("Accept-Charset", "UTF-8"); - conn.setDoOutput(true); - - OutputStream os = conn.getOutputStream(); - if(locale == null) { - os.write(("pass=localeservice&type=" + plugin.getName()).getBytes(StandardCharsets.UTF_8)); - } else { - os.write(("pass=localeservice&type=" + plugin.getName() + "&locale=" + locale.getPrefix()).getBytes(StandardCharsets.UTF_8)); - } - os.flush(); - os.close(); - return conn.getInputStream(); - } catch(Exception e) { - e.printStackTrace(); - return new InputStream() { - @Override - public int read() { - return -1; - } - }; - } - } - - /** - * Sends a demand request to download latest locale from Plugily-Projects/locale_storage repository - * Whole repository can be seen here https://github.com/Plugily-Projects/locale_storage - * - * @param locale locale to download - * @return SUCCESS for downloaded locale, FAIL for service fault, LATEST when locale is latest as one in repository - */ - public DownloadStatus demandLocaleDownload(Locale locale) { - //service fault - if(localeData == null) { - return DownloadStatus.FAIL; - } - File localeFile = new File(plugin.getDataFolder() + "/locales/" + locale.getPrefix() + ".properties"); - if(!localeFile.exists() || !isExact(locale, localeFile)) { - return writeFile(locale); - } - return DownloadStatus.LATEST; - } - - private DownloadStatus writeFile(Locale locale) { - try(Scanner scanner = new Scanner(requestLocaleFetch(locale), "UTF-8").useDelimiter("\\A")) { - String data = scanner.hasNext() ? scanner.next() : ""; - try(OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(plugin.getDataFolder().getPath() + "/locales/" + locale.getPrefix() + ".properties")), StandardCharsets.UTF_8)) { - writer.write(data); - } - return DownloadStatus.SUCCESS; - } catch(IOException ignored) { - plugin.getLogger().log(Level.WARNING, "Demanded locale " + locale.getPrefix() + " cannot be downloaded! You should notify author!"); - return DownloadStatus.FAIL; - } - } - - /** - * Checks if plugin version allows to update locale - * - * @return true if locale can be updated for this version else cannot - */ - public boolean isValidVersion() { - //service fault - if(localeData == null) { - return false; - } - return !checkHigher(plugin.getDescription().getVersion(), localeData.getString("locales.valid-version", plugin.getDescription().getVersion())); - } - - private boolean isExact(Locale locale, File file) { - try(Scanner scanner = new Scanner(requestLocaleFetch(locale), "UTF-8").useDelimiter("\\A")) { - String onlineData = scanner.hasNext() ? scanner.next() : ""; - Scanner localScanner = new Scanner(file, "UTF-8").useDelimiter("\\A"); - String localData = localScanner.hasNext() ? localScanner.next() : ""; - localScanner.close(); - - return onlineData.equals(localData); - } catch(IOException ignored) { - return false; - } - } - - private boolean checkHigher(String currentVersion, String newVersion) { - String current = toReadable(currentVersion); - String newVer = toReadable(newVersion); - return current.compareTo(newVer) < 0; - } - - /** - * Download status enum for locale download demands - */ - public enum DownloadStatus { - SUCCESS, FAIL, LATEST - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/utils/services/metrics/MetricsService.java b/src/main/java/plugily/projects/murdermystery/utils/services/metrics/MetricsService.java deleted file mode 100644 index bfc25851..00000000 --- a/src/main/java/plugily/projects/murdermystery/utils/services/metrics/MetricsService.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.utils.services.metrics; - -import org.bukkit.Bukkit; -import org.bukkit.plugin.java.JavaPlugin; -import plugily.projects.murdermystery.utils.services.ServiceRegistry; - -import javax.net.ssl.HttpsURLConnection; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.InetAddress; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.Timer; -import java.util.TimerTask; -import java.util.logging.Level; - -/** - * Metrics service for sending usage data - */ -public class MetricsService { - - private JavaPlugin plugin; - - public MetricsService(JavaPlugin plugin) { - if(ServiceRegistry.getRegisteredService() == null || !ServiceRegistry.getRegisteredService().equals(plugin)) { - throw new IllegalArgumentException("MetricsService cannot be used without registering service via ServiceRegistry first!"); - } - if(!ServiceRegistry.isServiceEnabled()) { - return; - } - this.plugin = plugin; - metricsSchedulerTask(); - } - - private void metricsSchedulerTask() { - Timer timer = new Timer(true); - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - if(!plugin.isEnabled()) { - timer.cancel(); - return; - } - Bukkit.getScheduler().runTask(plugin, () -> { - try { - final byte[] post = ("pass=metricsservice&type=" + plugin.getName() + "&pluginversion=" + plugin.getDescription().getVersion() + - "&serverversion=" + plugin.getServer().getBukkitVersion() + "&ip=" + InetAddress.getLocalHost().getHostAddress() + ":" + plugin.getServer().getPort() + - "&playersonline=" + Bukkit.getOnlinePlayers().size()).getBytes(StandardCharsets.UTF_8); - new Thread(() -> { - try { - plugin.getLogger().log(Level.FINE, "Metrics data sent!"); - URL url = new URL("https://api.plugily.xyz/metrics/receiver.php"); - HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); - conn.setRequestMethod("POST"); - conn.setRequestProperty("User-Agent", "PLMetrics/1.0"); - conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); - conn.setDoOutput(true); - - OutputStream os = conn.getOutputStream(); - os.write(post); - os.flush(); - os.close(); - StringBuilder content; - - try(BufferedReader in = new BufferedReader( - new InputStreamReader(conn.getInputStream()))) { - - String line; - content = new StringBuilder(); - - while((line = in.readLine()) != null) { - content.append(line); - content.append(System.lineSeparator()); - } - } - - plugin.getLogger().log(Level.FINE, "Metrics response: " + content.toString()); - } catch(IOException ignored) { - } - }).start(); - } catch(IOException ignored) {/*cannot connect or there is a problem*/} - }); - } - }, 1000 * 60 * 5, 1000 * 60 * 30); - } - -} diff --git a/src/main/resources/arena_selector.yml b/src/main/resources/arena_selector.yml new file mode 100644 index 00000000..b08570ed --- /dev/null +++ b/src/main/resources/arena_selector.yml @@ -0,0 +1,6 @@ +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/arenas.yml b/src/main/resources/arenas.yml index 23ee01d7..72cc2d41 100644 --- a/src/main/resources/arenas.yml +++ b/src/main/resources/arenas.yml @@ -1,12 +1,13 @@ instances: default: lobbylocation: world,364.0,63.0,-72.0,0.0,0.0 - Endlocation: world,364.0,63.0,-72.0,0.0,0.0 + startlocation: world,364.0,63.0,-72.0,0.0,0.0 + endlocation: world,364.0,63.0,-72.0,0.0,0.0 minimumplayers: 2 maximumplayers: 10 mapname: mapname world: worldname - signs: [] + signs: [ ] isdone: false playerspawnpoints: - world,364.0,63.0,-72.0,0.0,0.0 @@ -16,4 +17,11 @@ instances: - world,364.0,63.0,-72.0,0.0,0.0 playerpermurderer: 5 playerperdetective: 7 - goldvisuals: false \ No newline at end of file + goldvisuals: false + +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml index 6e83e1d4..b4a4a8f4 100644 --- a/src/main/resources/bungee.yml +++ b/src/main/resources/bungee.yml @@ -1,7 +1,7 @@ # Configuration for Bungeecord support. -# Remember to enable it in config.yml (BungeeActivated option) +# Remember to enable it in config.yml (Bungee-Mode: true) -# Your bungeecord server name where player will be teleported after game (main lobby with signs etc.) +# Your bungeecord server name where players will be teleported after game (main lobby with signs etc.) Hub: lobby # Should game server be closed after game? @@ -17,11 +17,18 @@ End-Location-Hub: true # %state% - Game state will be visible at MOTD. MOTD: Manager: false - Message: "The actual game state of mm is %state%" + Message: "The actual game state of the minigame is %state%" Game-States: Inactive: "&lInactive..." In-Game: "&lIn-game" Starting: "&e&lStarting" Full-Game: "&4&lFULL" Ending: "&lEnding" - Restarting: "&c&lRestarting" \ No newline at end of file + Restarting: "&c&lRestarting" + +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 58120c36..bd8a1f6a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,10 +1,13 @@ -# Murder Mystery configuration file +### Initial config.yml for all plugily projects +## Thanks for using our plugins! ~Tigerpanzer_02 from Plugily Projects +# PlugilyProjects configuration file # -# You can edit here the basic things of MM +# You can edit here the basic things of PlugilyProjects # Please read everything CAREFULLY! # You don't want to break anything, do you? # + # Select locale of MurderMystery, default it's English. # Available locales: # default - English language. Uses 'language.yml'. @@ -22,170 +25,169 @@ # uk - Ukrainian locale: default -# Enable bossbar support? -Bossbar-Enabled: true - -# How many seconds game should take to start. -Starting-Waiting-Time: 60 -# Lobby waiting time set when lobby max players number is reached, used to start game quicker. -Start-Time-On-Full-Lobby: 15 +# Should we display a boss bar with additional arena information? +Bossbar: + Display: true + # Interval in seconds between messages + Interval: 10 -# How many seconds classic game should play. -Classic-Gameplay-Time: 270 -# Should we hook into bungee cord? (If you wanna use arena per server option) +# Should we hook into bungeecord? (If you wanna use arena per server option) +# This option will let you access bungee.yml and its options. # You STILL need to use external addon for HUB server game signs -# Murder Mystery doesn't offer that addon. -# Check here for more info: https://wiki.plugily.xyz/murdermystery/support/servertips#bungeecord-lobby-signs -BungeeActivated: false +# Check here for more info: https://wiki.plugily.xyz/ +Bungee-Mode: false -# Enable this option when you're using MySQL, otherwise it won't work. -# Be careful when changing this because there is NO migrator between -# flat file and MySQL for player stats. -DatabaseActivated: false # Enable Inventory Manager for your games? (VERY USEFUL feature for MULTI ARENA) # This saves inventory of players and restores it after player leaves arena. -# Saved elements: max health, health, food, experience, full inventory, armor contents, fire ticks, active potions, gamemode -InventoryManager: true - -# Should in-game chat format be enabled? -# You can edit the formatting in language.yml -ChatFormat-Enabled: true - -# Should we disable all chat related stuff? -# It will disable the separated chat, for example -Disable-Separate-Chat: false - -# Should we disable death messages, so the player dies without other recognizes it -# It will not broadcast the death message to all ;) -Hide-Death: false +# Saved elements: max health, health, food, experience, full inventory, armor contents, fire ticks, active potions +Inventory-Manager: true + + +Commands: + # Commands which can be used in game, remove all of them to disable (only works if Block.In-Game.Commands = true) + Whitelist: + - me + - help + # Enable and Disable predefined shortened commands or add your own + Shorter: + '1': + Short: "start" + Executes: "plugilyprojectsadmin forcestart" + Enabled: true + '2': + Short: "leave" + Executes: "plugilyprojects leave" + Enabled: true + '3': + Short: "kit" + Executes: "plugilyprojects selectkit" + Enabled: false + '4': + Short: "stats" + Executes: "plugilyprojects stats" + Enabled: false + '5': + Short: "top" + Executes: "plugilyprojects top" + Enabled: true + + +# Block some functions of your players +Block: + In-Game: + # Should we block every not plugin associated commands in game? + Commands: true + # Should the leave command be blocked inside arena? + Leave: false + # Cancels Item Movement into player crafting, enchantment tables, anvils ... + Item-Move: true -# Should we override corpses spawn from CorpsesReborn plugin? -# When player will die outside game corpse won't be spawned! -# Disable this if you don't want this! -# WARNING: If disabled, two corpses will be spawned when player in-game dies -Override-Corpses-Spawn: true -# Which item should be your Murderer sword? -Murderer-Sword-Material: IRON_SWORD - -# How many blocks per tick sword thrown by murderer should fly -# Please avoid high values as it might look like the sword is -# blinking each tick -Murderer-Sword-Speed: 0.65 - -# How many blocks should the sword fly -Murderer-Sword-Fly-Range: 20 +# Enable this option when you're using MySQL, otherwise it won't work. +# Be careful when changing this because there is NO migrator between +# flat file and MySQL for player stats. +# If this option is disabled it means all stats will be saved as flat file! +Database: false -# In what radius should we hit the players -Murderer-Sword-Fly-Hit-Range: 0.5 -#How long should be the sword attack after throw cooldown in seconds? -#Its normal lower than Murderer-Sword-Fly-Cooldown! -Murderer-Sword-Attack-Cooldown: 1 +# Should we enable in game rewards? See rewards.yml for more... +# You should also check out our script engine tutorial for rewards! https://tutorial.plugily.xyz +Rewards: true -#How long should be the sword fly cooldown in seconds? -Murderer-Sword-Fly-Cooldown: 5 -#Should we change spawner mode to spawn on all spawners instant of random one -Change-Gold-Spawner-Mode-To-All: false +# Enable in game (eg. '[KIT][LEVEL] Tigerpanzer_02: hey') special formatting? +# Formatting is configurable in language.yml +# You can use PlaceholderAPI placeholders in chat format! +Plugin-Chat-Format: true -#Should we disable the gold spawn limit (It does not spawn more gold than spawner locations) -Disable-Gold-Limiter: false -#How much arrows should a player with bow gets when he pick up a gold ingot? -Detective-Gold-Pick-Up-Arrows: 1 +# Should we enable a separate arena chat for players inside a arena +# Useful on multi arena servers that don't want the same chat for all players on the server +Separate-Arena-Chat: true -#How much gold should a player need to get a bow -Gold-For-Bow: 10 -#How much arrows should the player get? (Cause: Bow because enough gold collected) -Gold-Bow-Arrows: 3 +# Should we fire some cool fireworks at locations of every player at special events such as the game end? +Firework: true -#How much arrows should the detective gets on game start or when a player get a bow? -Detective-Default-Arrows: 3 -#How much arrows should the fake detective get? (Cause: Player pick up bow after detective died) -Detective-Fake-Arrows: 3 +# Should blocks behind game signs change their color based on game state? +# They will change color to: +# - white (waiting for players) stained glass +# - yellow (starting) stained glass +# - orange (in game) stained glass +# - gray (ending) stained glass +# - black (restarting) stained glass +# or define your own at signs.yml! +Sign-Block-States: true -#How much arrows should the player get when the prayer gives a bow to him? -Detective-Prayer-Arrows: 2 -#How long should be the bow shoot cooldown in seconds? -Detective-Bow-Cooldown: 5 +# Should holiday events for the plugin be enabled? +# Eg. 4 days before and 4 days after Halloween special effects +# for death, spooky! There are more holiday events! Check wiki! +# Wiki: - +Holidays: true -#Should Detectives be killed if they kill a innocent? -Enable-Kill-Detective-If-Innocent-Killed: true -#Should there be a innocent locator -Enable-Innocent-Locator: true +# Should the plugin enable special powerups which can be found in powerups.yml +Powerups: false -#Should the murderer get speed effect? -Speed-Effect-Murderer: - Enabled: true - #Enter a multiplier (min 2, max 10) - Speed: 3 -# Play sound when a user gets score. -# https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Sound.html -AddScore-Sound: "" +# Should we create leaderboards out of the stats? +Leaderboard: true -# Basic permissions for game, permissions explained here: https://wiki.plugily.xyz/murdermystery/setup/cmdsandperms#basic-permissions -Basic-Permissions: - Full-Games-Permission: "murdermystery.fullgames" - # represents arena name (NOT MAP NAME!), for example: 'murdermystery.join.MM02' - # use 'murdermystery.join.*' to enable access to all arenas - Join-Permission: "murdermystery.join." -# Should we enable short commands such as /start and /leave -Enable-Short-Commands: false +Parties: + # Should we try to hook into your current party plugin? (Supports well know party plugins, see wiki!) + # It will group up all players with the party leader. The party leader can join with the whole party! + External: true + # Should we enable our own party system that can be only used for this plugin? + # Check the wiki for commands + Own: false -# Should /mm leave command be blocked? -Disable-Leave-Command: false -# Should the /mma delete command awaits the confirmation to delete the arena? -Deleting-Arena-Needs-Confirmation: true +Damage: + # Should players get fall damage? + Fall: false + # Should players get drowning damage? + Drowning: false + # Should players get fire damage? + Fire: false + # Should players lose food ingame? + Food: false -# Should players get no fall damage? -Disable-Fall-Damage: false -# Commands which can be used in game, remove all of them to disable -Whitelisted-Commands: - - me - - help +Option: + Player: + # Disable player drops ingame? + Drop: true -# Enable in game rewards? See rewards.yml for more... -Rewards-Enabled: false -# Should we block every not Murder Mystery associated commands in game? -Block-Commands-In-Game: true +Cycle: + # Should we make permanent clear weather on all worlds where our arenas are? + Weather: false + # Should the time on the world your arenas are modified to stay at the same time? + Daylight: + Enable: false + Time: 10000 -# Should we fire some cool fireworks at location of every player after the game ends? -Firework-When-Game-Ends: true -# Should players' name tags in game be hidden? -Nametags-Hidden: true +# How many seconds game should take to start. +Time-Manager: + Waiting: 20 + Starting: 60 + Shorten-Waiting-Full: 15 + Shorten-Waiting-Force: 5 + In-Game: 270 + Ending: 10 + Restarting: 5 -# Should blocks behind game signs change their color based on game state? -# They will change color to: -# - white (waiting for players) stained glass -# - yellow (starting) stained glass -# - orange (in game) stained glass -# - gray (ending) stained glass -# - black (restarting) stained glass -Signs-Block-States-Enabled: true +# Allow spectators on arena instances +Spectators: true -Arena-Selector: - # Change items of arena selector - State-Item: - Waiting: LIME_wool - Starting: YELLOW_wool - In-Game: RED_wool - Ending: RED_wool - Restarting: RED_wool Update-Notifier: # Should we check for updates on plugin start/after admin join? @@ -195,17 +197,79 @@ Update-Notifier: # BETA IS NOT ALWAYS AS STABLE AS NORMAL RELEASE! Notify-Beta-Versions: true -#Disable Party features of external party plugins (such as PAF, Parties ...) -Disable-Parties: true - -#Add trails that you want to blacklist from all trails(particles) -Blacklisted-Trails: - - "elder_guardian" - - "block_crack" - - "item_crack" - - "block_dust" +Corpses: + # Should we override corpses spawn from CorpsesReborn plugin? + # When player will die outside game corpse won't be spawned! + # Disable this if you don't want this! + # WARNING: If disabled, two corpses will be spawned when player in-game dies + Integration-Overwrite: true + + +Gold: + #Should we change spawner mode to spawn on all spawners instant of random one + Spawner-Mode: false + #Should we disable the gold spawn limit (It does not spawn more gold than spawner locations) + Limiter: false + Amount: + #How much gold should a player need to get a bow + Bow: 10 + #How much arrows should the player get? (Cause: Bow because enough gold collected) + Arrows: 3 + #How much arrows should a player with bow gets when he pick up a gold ingot? + Pick-Up: 1 + + +Bow: + #Should Detectives be killed if they kill a innocent? + Kill-Detective: true + Amount: + Arrows: + #How much arrows should the detective gets on game start or when a player get a bow? + Detective: 3 + #How much arrows should the fake detective get? (Cause: Player pick up bow after detective died) + Fake: 3 + #How much arrows should the player get when the prayer gives a bow to him? + Prayer: 2 + #How much arrows should the player get after x picked up gold + Gold: 3 + #How long should be the bow shoot cooldown in seconds? + Cooldown: 5 + + +Hide: + # Should we disable death messages, so the player dies without other recognizes it + # It will not broadcast the death message to all ;) + Death: false + # Should players' name tags in game be hidden? + Nametags: true + + +Murderer: + #Should the murderer get speed effect? + #Enter a multiplier (min 2, max 10, 1 is normal speed) + Speed: 3 -# Don't modify. -Version: 24 -# No way! You've reached the end! But... where's the dragon!? \ No newline at end of file +Sword: + # How many blocks per tick sword thrown by murderer should fly + # Please avoid high values as it might look like the sword is + # blinking each tick + Speed: 0.65 + Fly: + # How many blocks should the sword fly + Range: 20 + # In what radius should we hit the players + Radius: 0.5 + Cooldown: + #How long should be the sword attack after throw cooldown in seconds? + #Its normal lower than Murderer-Sword-Fly-Cooldown! + Attack: 1 + #How long should be the sword fly cooldown in seconds? + Fly: 5 + +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/internal/data.yml b/src/main/resources/internal/data.yml new file mode 100644 index 00000000..dfad6ccf --- /dev/null +++ b/src/main/resources/internal/data.yml @@ -0,0 +1,29 @@ +###############################[IMPORTANT]############################### +# +# Leave this file as it is! It is kinda an internal file! +# +### !!!Do not change anything here!!! +# +### THIS FILE AUTOMATICALLY REGENERATES ON SERVER RESTART +# +###############################[IMPORTANT]############################### +Plugin: + Name: + Shot: mm + Long: ${project.name} + Id: + Spigot: 66614 + BStats: 3038 + Compatibility: + Spigot: + - "1.8" + - "1.9" + - "1.10" + - "1.11" + - "1.12" + - "1.13" + - "1.14" + - "1.15" + - "1.16" + - "1.17" + - "1.18" \ No newline at end of file diff --git a/src/main/resources/internal/leaderboards_data.yml b/src/main/resources/internal/leaderboards_data.yml new file mode 100644 index 00000000..cec96167 --- /dev/null +++ b/src/main/resources/internal/leaderboards_data.yml @@ -0,0 +1 @@ +holograms: {} \ No newline at end of file diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index d55d7121..4676fa33 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -1,337 +1,450 @@ -# You can translate Murder Mystery messages here. +# You can translate MurderMystery messages here. # Color codes (&) supported. # -# Use \n to make new line -# Some messages like kit and kit items +# Use \n to make new line +# Some messages like item # descriptions don't support new lines # they are wrapped every 40 characters automatically # # Some messages support their own placeholders -# like %player% +# like %player%, %kit% etc. -# Murder Mystery commands messages +# +# Color scheme +# +Color: + Placeholder: + Value: "&4" + Number: "&4" + Player: "&b" + Other: "&4" + Chat: + Issue: "&c" + Messages: "&7" + Special-Char: + Contains: "[,],(,),{,},■,/,|,▸" + Before: "&8" + + +# +# Command messages +# Commands: - Did-You-Mean: "&6Did you mean &e/%command%&6?" - Teleported-To-The-Lobby: "Teleported to the lobby!" - Removed-Game-Instance: "&cSuccessfully removed game instance!" - No-Arena-Like-That: "&cNo arena with that ID!" - Look-Sign: "&cYou have to look at a sign to perform this command!" - Type-Arena-Name: "&cPlease type arena ID!" - No-Free-Arenas: "&cThere are no free arenas!" - Statistics: - Type-Name: "&cPlease type statistic name to view!" - Invalid-Name: "&cName of statistic is invalid! Type: kills, deaths, games_played, wins, loses, highest_score" - Header: "&8&m-------------------[&6 Top 10 &8&m]-------------------" - Format: "&e#%position% %name% - %value% &7%statistic%" - Only-By-Player: "&cYou can execute this command only as player!" - Not-Playing: "&cYou must play to execute this command!" - No-Permission: "&cYou don't have permission to use this command!" - Admin-Commands: - Teleported-To-Player: "&aTeleported to player!" - Player-Not-Found: "&cPlayer not found!" - Success-Reload: "&aArenas reloaded!" - List-Command: - Header: "&aMurder Mystery &6arenas:" - Format: "&a%arena% &e%status% &6%players%/%maxplayers%" - No-Arenas: "&cThere are no game instances!" - Stats-Command: - Header: "&l-----YOUR STATS-----" - Header-Other: "&l-----STATS FOR %player%-----" - Footer: "&l--------------------" - Kills: "&aKills: &e" - Deaths: "&aDeaths: &e" - Wins: "&aWins: &e" - Loses: "&aLoses: &e" - Highest-Score: "&aHighest score: &e" - Games-Played: "&aGames played: &e" - Main-Command: - Header: "&6----------------{Murder Mystery commands}----------" - Description: "&aGame commands:\n - &b/mm stats: &7Shows your stats!\n - &b/mm leave: &7Quits current arena!\n - &b/mm join : &7Joins specified arena!\n - &b/mm top : &7Shows top 10 players!\n - &b/mm randomjoin: &7Join random arena!" - Admin-Bonus-Description: "\n&b/mma: &7Shows all the admin commands" + Did-You-Mean: "%plugin_prefix% Did you mean /%value%?" + Command-Executed: "%plugin_prefix% Command successfully executed!" + Teleported-To-Lobby: "%plugin_prefix% Teleported to lobby!" + Removed-Game-Instance: "%color_chat_issue%%plugin_prefix% Successfully removed game instance!" + No-Arena-Like-That: "%color_chat_issue%%plugin_prefix% No arena with that ID!" + Look-At-Sign: "%color_chat_issue%%plugin_prefix% You have to look at a sign to perform this command!" + Type-Arena-Name: "%color_chat_issue%%plugin_prefix% Please type arena ID!" + Hold-Any-Item: "%color_chat_issue%%plugin_prefix% You must hold any item!" + No-Free-Arenas: "%color_chat_issue%%plugin_prefix% There are no free arenas!" + Only-By-Player: "%color_chat_issue%%plugin_prefix% You can execute this command only as player!" + Not-Playing: "%color_chat_issue%%plugin_prefix% You must play to execute this command!" + No-Permission: "%color_chat_issue%%plugin_prefix% You don't have permission to use this command!" + Player-Not-Found: "%color_chat_issue%%plugin_prefix% Target player %player% doesn't exist!" + Invalid-Location-Teleport: "%color_chat_issue%%plugin_prefix% Location to teleport is invalid!" + Wrong-Usage: "%color_chat_issue%%plugin_prefix% Wrong usage. Do %value%" + Admin: + Adjust-Statistic: "%plugin_prefix% Statistic %value% of %player% is now %number%!" + Reload-Success: "%plugin_prefix% Arenas reloaded!" + List: + Header: "%plugin_name% arenas: Name State Players" + Format: "%arena_name% %arena_state_placeholder% %arena_players_size%/%arena_max_players%" + No-Arenas: "%color_chat_issue%%plugin_prefix% There are no game instances!" + Spychat: + Toggled: "%plugin_prefix% Game spy chat toggled to %value%" + Main: + Header: "&6----------------{%plugin_name% commands}----------" + Description: + - "&aGame commands:" + - "&b/%plugin_short_command% stats: Shows your stats!" + - "&b/%plugin_short_command% leave: Quits current arena!" + - "&b/%plugin_short_command% join : Joins specified arena!" + - "&b/%plugin_short_command% top : Shows top 10 players!" + - "&b/%plugin_short_command% randomjoin: Join random arena!" + Admin-Bonus-Description: "&b/%plugin_short_command%: Shows all the admin commands" Footer: "&6-------------------------------------------------" -# In-game scoreboard messages. -# Please do not use more than 48 chars here! COLOR CODES INCLUDED. + +# +# In-Game scoreboard messages +# +# Please do not use more chars than the scoreboard can handle! +# Scoreboard supports up to 122 chars for 1.14+ and 48 chars for 1.13- (COLOR CODES INCLUDED.) +# Placeholders: +# https://wiki.plugily.xyz/REPLACEWITHPROJECTNAME/placeholders/language Scoreboard: - Title: "&4&lMurder Mystery" - Detective-Status-Normal: "&fDetective: &eAlive" - Detective-Died-No-Bow: "&cBow Dropped" - Detective-Died-Bow: "&aBow Not Dropped" + Title: "&a&l%plugin_name%" Roles: Detective: "&bDetective" Murderer: "&cMurderer" Innocent: "&eInnocent" - Dead: "&7Dead" + Dead: "Dead" + Detective: + Alive: "Detective: &aAlive" + Bow: + Dropped: "%color_chat_issue%Bow Dropped" + Picked: "Bow Not Dropped" Content: - # Contents of scoreboard for innocents and detective - Playing: - - "&fRole: %ROLE%" + Waiting: - "" - - "&fInnocents Left: &e%INNOCENTS%" - - "&fTime Left: &e%FORMATTED_TIME%" + - "■ Players | %arena_players_size%" - "" - - "%DETECTIVE_STATUS%" + - "■ Minimum Players | %arena_min_players%" - "" - - "&fScore: &e%SCORE%" + - " www.plugily.xyz" + Starting: - "" - - "&ewww.plugily.xyz" - # Contents of scoreboard for murderer - Playing-Murderer: - - "&fRole: %ROLE%" + - "■ Starting In | %arena_time%" - "" - - "&fInnocents Left: &e%INNOCENTS%" - - "&fTime Left: &e%FORMATTED_TIME%" + - "■ Players | %arena_players_size%" - "" - - "%DETECTIVE_STATUS%" + - "■ Minimum Players | %arena_min_players%" - "" - - "&fKills: &e%KILLS%" + - " www.plugily.xyz" + # Contents of scoreboard while ingame + In-Game: - "" - - "&fScore: &e%SCORE%" + - "■ Role | %arena_player_role%" + - "&f" + - "■ Innocents | %arena_innocents%" + - "&f" + - "■ Time | %arena_time%" - "" - - "&ewww.plugily.xyz" - Waiting: - - "&fPlayers: &e%PLAYERS%" + - "■ %arena_detective_status%" - "" - - "&fMinimum Players: &e%MIN_PLAYERS%" + - "■ Score | %USERSTATISTC SCORE%" - "" - - "&ewww.plugily.xyz" - Starting: - - "&fStarting In: &e%TIME%" + - " www.plugily.xyz" + In-Game-Murderer: + - "" + - "■ Role | %arena_player_role%" + - "&f" + - "■ Innocents | %arena_innocents%" + - "&f" + - "■ Time | %arena_time%" - "" - - "&fPlayers: &e%PLAYERS%" + - "■ %arena_detective_status%" - "" - - "&fMinimum Players: &e%MIN_PLAYERS%" + - "■ Kills | %USER STATISTIC LOCAL KILLS%" - "" - - "&ewww.plugily.xyz" + - "■ Score | %USERSTATISTC SCORE%" + - "" + - " www.plugily.xyz" + # Contents of scoreboard while state is ending + Ending: + - "&f" + - "&f" + - "&cGAME ENDED" + - "" + - "&f" + - "&f" + - "" + - " www.plugily.xyz" + # Contents of scoreboard while state is restarting + Restarting: + - "&f" + - "&f" + - "&cRESTARTING GAME" + - "" + - "&f" + - "&f" + - "" + - " www.plugily.xyz" -# Has usage only when bossbar is enabled in config.yml +# +# Bossbar messages +# +# Bossbar needs to be enabled on config.yml Bossbar: - Main-Title: "&a&lMurder Mystery &6- www.plugily.xyz" - Starting-In: "&f&lStarting in: &e&l%time%" - Waiting-For-Players: "&4&lWaiting for more players..." - In-Game-Info: "&e&lPlaying &f&lMURDER MYSTERY &e&lon &b&lPLUGILY.XYZ" - Game-Ended: "&c&lGame has ended! You were playing on &b&lPLUGILY.XYZ" + Title: "%plugin_name% - www.plugily.xyz" + Content: + Waiting: + - "Waiting for more players..." + Starting: + - "Starting in: %arena_time%" + In-Game: + - "Playing %plugin_name_uppercase% on PLUGILY.XYZ" + - "Check the plugin creator out on PLUGILY.XYZ" + - "Your role %arena_player_role%" + Ending: + - "Game has ended! You were playing on PLUGILY.XYZ" + Restarting: + - "Restarting the arena. You will be moved soon!" +# +# In-Game Messages +# In-Game: #Used in most game messages. - Plugin-Prefix: "&4[Murder Mystery] " - Already-Playing: "&cYou are already queued for a game! You can leave a game with /mm leave." - Join-No-Permission: "&cYou don't have &6%permission% &cpermission to join this arena!" - Full-Game-No-Permission: "&cYou don't have the permission to join full games!" - No-Slots-For-Premium: "&cThis game is already full of premium players! Sorry" - You-Are-Spectator: "&cYou're now a spectator! You can fly now!" - Only-Command-Ingame-Is-Leave: "&cYou have to leave the game first to perform commands. The only command that works is /mm leave!" - # Join cancelled via external plugin that uses MM api. - Join-Cancelled-Via-API: "&cYou can't join this game!" - Join-As-Party-Member: "&cYou joined %ARENANAME% because the party leader joined it!" - Arena-Not-Configured: "&cArena is not configured yet! Contact staff!" - Game-Chat-Format: "&7%player%: &f%message%" - Game-Death-Format: "&7[&4☠&7] &r" - Cooldown-Format: "&8&l[%progress%&8&l] &6%time% seconds" - Bow-Locator-Item-Name: "&6Bow locator" - Innocent-Locator-Item-Name: "&6Innocent locator" - Watch-Out-Title: "&cWatch out!" - Watch-Out-Subtitle: "&eThe Murderer can now find survivors easily" - Role-Pass: - Menu-Name: "Role pass menu" - Role: - Murderer: - Name: "Be murderer" - Lore: - - "Cost 1 murderer pass" - - "You got %amount%" - Detective: - Name: "Be detective" - Lore: - - "Cost 1 detective pass" - - "You got %amount%" - Fail: "You do not got enough passes for %role% role" - Success: "You will be %role% next round!" - Change: "You now got %amount% %role% passes!" + Plugin-Prefix: "(%plugin_name%)" + Game-Chat-Format: "[%user_statistic_level%][%kit%] %player% | %message%" + You-Leveled-Up: "%plugin_prefix% You leveled up! You're now level %number%!" + Commands-Blocked: "%color_chat_issue%%plugin_prefix% You have to leave the game first to perform commands. The only command that works is /%plugin_short_command% leave!" + Join: + Already-Playing: "%color_chat_issue%%plugin_prefix% You are already queued for a game! You can leave a game with /%plugin_short_command% leave." + No-Permission: "%color_chat_issue%%plugin_prefix% You don't have %value% permission to join this arena!" + Full-Game: "%color_chat_issue%%plugin_prefix% You don't have the permission to join full games!" + No-Slots-For-Premium: "%color_chat_issue%%plugin_prefix% This game is already full of premium players! Sorry" + # Join cancelled via external plugin that uses the API of our plugin. + Cancelled-Via-API: "%color_chat_issue%%plugin_prefix% You can't join this game!" + As-Party-Member: "%color_chat_issue%%plugin_prefix% You joined %arena_name% because the party leader joined it!" + Arena-Not-Configured: "%color_chat_issue%%plugin_prefix% Arena is not configured yet! Contact staff!" + Title: "20, 30, 20;%arena_name%;%arena_players_size%/%arena_max_players%" + Death: + Tag: "&8Dead" + Screen: "%color_chat_issue%You died!" Spectator: - Spectator-Menu-Name: "Alive players list" - Target-Player-Role: "&7Role: %role%" - Target-Player-Health: "&cHealth: &7%health%" - Settings-Menu: - Inventory-Name: "&7Spectator settings" - Speed-Name: "&aSpeed" + Blocked: "%color_chat_issue%%plugin_prefix% Spectators are disabled for this arena" + You-Are-Spectator: "%plugin_prefix% You're now a spectator! You can fly now!" + Spectator-Menu-Name: "%color_chat_issue%Alive players list" + Target-Player-Health: "%color_chat_issue%Health: %number% | Role: %arena_role%" + Spectator-Warning: "%plugin_prefix% You are a spectator!" + Teleport: "%plugin_prefix% Teleported to %player%" + Menu: + Settings: + Status: + Enabled: "Enabled" + Disabled: "Disabled" + Changed-Speed: "Changed Speed to %number%" + Auto-Teleport: "%value% auto teleport" + Target-Player: + Action-Bar: "%number% blocks away | Target %player%" + Night-Vision: "%value% night vision" + First-Person-Mode: + Action-Bar: "&eSNEAK &cto leave! | Target %player%" + Title: "&eSNEAK &cto leave!" + Visibility: "%value% other spectator players" Messages: - Lobby-Messages: - Start-In: "&7The game starts in &b%TIME%&7 seconds!" - Waiting-For-Players: "&7Waiting for players... We need at least &b%MINPLAYERS%&7 players to start." - Enough-Players-To-Start: "&7We now have enough players. The game is starting soon!" - Game-Started: "&7The game has started! Survive till the end!" - Kicked-For-Premium-Slot: "&c%PLAYER% got removed from the game to make a place for premium players!" - You-Were-Kicked-For-Premium-Slot: "&cYou got kicked out of the game to make a place for a premium player!" - Role-Chances-Action-Bar: "&cMurderer Chance: %murderer_chance% &a- &bDetective Chance: %detective_chance%" - Not-Enough-Space-For-Party: "&cYour party is bigger than free places on the arena %ARENANAME%" - Join: "&b%PLAYER%&7 joined the game (%PLAYERSIZE%/%MAXPLAYERS%)!" - Leave: "&b%PLAYER% &7left the game (%PLAYERSIZE%/%MAXPLAYERS%)!" - Death: "&b%PLAYER% &7died!" - Seconds-Left-Title: "&c%time% &eseconds left!" - Seconds-Left-Subtitle: "&eAfter %time%s the Murderer will lose" - Role-Set: - Murderer-Title: "&cROLE: MURDERER" - Murderer-Subtitle: "&eKill all players!" - Detective-Title: "&bROLE: DETECTIVE" - Detective-Subtitle: "&eFind and kill the murderer!" - Innocent-Title: "&eROLE: INNOCENT" - Innocent-Subtitle: "&eStay alive as long as possible!" - Bonus-Score: "&e+%score% score (%action%)" - Score-Actions: - Kill-Player: "for killing player" - Kill-Murderer: "for killing murderer" - Gold-Pickup: "for gold pickup" - Survive: "for surviving 30 seconds" - #for innocents - Survive-Till-End: "for surviving till end" - #for murderer or detective - Win-Game: "for winning the game" - Detective-Reward: "for %amount% innocents survived" - Innocent-Kill: "for killing innocent" - Picked-Up-Gold: "&ePicked up gold!" - Previous-Role-Left-Title: "&cPrevious %role% has left!" - Previous-Role-Left-Subtitle: "&cSelecting new %role%!" - Corpse-Last-Words: "&7%player%&e's last words:" - Murderer-Get-Sword: "&eThe Murderer gets their sword in &c%time% &eseconds!" - Special-Blocks: - Cauldron-Drink-Potion: "&cPlease drink your current potion!" - Not-Enough-Gold: "&cYou need %amount% gold for this!" - Cauldron-Hologram: "&fMystery Potion - 1 &eGold" - Praise-Hologram: "&eClick to give gift;&ePull lever to pray" - Prayed-Message: "&aYou prayed to the developer! Hope he will hear that!" - No-Money-No-Pray: "&cPay to pray!" - Praises: - Message: - - "" - - "&7Developer hears your prayer." - - "%feeling%" - - "%praise%" - Feelings: - Blessed: "&aYou feel blessed." - Cursed: "&cYou feel cursed." - Gifts: - Detective-Revelation: "&aYou know that &bCurrent detective &ais %detective%" - Gold-Rush: "&aYou received power of ancients. For each gold you collect, you will receive 3 gold now." - Single-Compensation: "&aDeveloper is proud of you! He rewarded you with 5 gold ingots!" - Bow-Time: "&aYou received bow from pleased developer!" - Curses: - Slowness-Curse: "&cYour legs are much heavier than before." - Blindness-Curse: "&cYour eyes can't see that well anymore." - Gold-Ban: "&cDeveloper cursed you with gold ban! You cannot longer pickup any gold!" - Incoming-Death: "&cYou feel overpowering force of death. You know that you'll be dead in a minute!" - Bow-Messages: - Bow-Dropped-Title: "&6The Bow has been dropped!" - Bow-Dropped-Subtitle: "&eFind the Bow for a chance to kill the Murderer." - Pickup-Bow-Message: "&eA player has picked up the Bow!" - Bow-Shot-For-Gold: "&a+1 Bow Shot!" - Bow-Shot-Subtitle: "&eYou collected 10 gold and got an arrow!" - Last-Words: - 'default': - Message: "&fPlease respawn :(" - 'meme': - Message: "&fDespacito 2 is confirmed by God" - Permission: "murdermystery.lastwords.meme" - 'rage': - Message: "&fWHY YOU KILLED ME?!!?" - Permission: "murdermystery.lastwords.rage" - 'pro': - Message: "&fIt was lagging..." - Permission: "murdermystery.lastwords.pro" - 'hacker': - Message: "Turn off your hacks..." - Permission: "murdermystery.lastwords.hacker" - Game-End-Messages: - Titles: - Win: "&aYOU WIN!" - Lose: "&cYOU LOSE!" - Died: "&cYOU DIED!" - Subtitles: - Murderer-Stopped: "&6The Murderer has been stopped!" - Murderer-Kill-Everyone: "&6The Murderer has killed everyone." - Murderer-Killed-You: "&eThe murderer killed you!" - Player-Killed-You: "&cA player killed you with a Bow!" - Killed-Innocent: "&eYou killed an innocent player!" - Winners: - Players: "&ePLAYERS" - Murderer: "&cMURDERER" - Nobody: "&7Nobody" - Summary-Message: - - "&a&m------------------------------------------------------------------" - - "&f&lMurder Mystery" + Join: "%plugin_prefix% %player% joined the game (%arena_players_size%/%arena_max_players%)!" + Leave: "%plugin_prefix% %player% left the game (%arena_players_size%/%arena_max_players%)!" + Death: "%plugin_prefix% %player% died!" + Lobby: + Start-In: "%plugin_prefix% The game starts in %arena_time% seconds!" + Waiting-For-Players: "%plugin_prefix% Waiting for players... We need at least %arena_min_players% players to start." + Enough-Players-To-Start: "%plugin_prefix% We now have enough players. The game is starting soon!" + Reduced-Time: "%plugin_prefix% The time got reduced to %number% seconds" + Max-Players: "%plugin_prefix% We reached max players for this round. Let's shorten the time!" + Game-Started: "%plugin_prefix% The game has started!" + Kicked-For-Premium-Slot: "%color_chat_issue%%plugin_prefix% %player% got removed from the game to make a place for premium players!" + You-Were-Kicked-For-Premium-Slot: "%color_chat_issue%%plugin_prefix% You got kicked out of the game to make a place for a premium player!" + Not-Enough-Space-For-Party: "%color_chat_issue%%plugin_prefix% Your party is bigger than free places on the arena %arena_name%" + Game-End: + Summary: + - "&a&m--------------------------------------------------" + - "%plugin_name%" - "" - - "&f&lWINNER: %winner%" + - "%arena_summary%" + - "%arena_summary_player%" - "" - "&7Detective: %detective%" - "&7Murderer: %murderer% (%murderer_kills%)" - "&7Hero: %hero%" - "" - - "&a&m------------------------------------------------------------------" - Admin-Messages: - Set-Starting-In-To-0: "&bAn admin set waiting time to 0. The game starts now!" + - "&a&m--------------------------------------------------" + Placeholders: + Win: "&aYou won the game" + Lose: "%color_chat_issue%You lost the game" + Players: "&cThere are not enough players anymore. Arena got force stopped!" + Murderer: + Stopped: "The Murderer has been stopped!" + Killed: + You: "The murderer killed you!" + All: "The Murderer has killed everyone." + Innocent: + Killed: + You: "A player killed you with a Bow!" + Wrongly: "You killed an innocent player!" + Nobody: "Nobody" + Admin: + Set-Starting-In-To-0: "%plugin_prefix% An admin set waiting time to 0. The game starts now!" + Arena: + Chances: + Action-Bar: "&cMurderer Chance: %murderer_chance% &a- &bDetective Chance: %detective_chance%" + Cooldown: "&8&l[%progress%&8&l] &6%time% seconds" + Locator: + Bow: "Bow locator" + Innocent: "Innocent locator" + Watch-Out: "5,20,5;Watch out!;The Murderer can now find survivors easily" + Pass: + Name: "Role pass menu" + Role: + Murderer: + Name: "Be murderer" + Lore: + - "Cost 1 murderer pass" + - "You got %amount%" + Detective: + Name: "Be detective" + Lore: + - "Cost 1 detective pass" + - "You got %amount%" + Fail: "You do not got enough passes for %arena_role% role" + Success: "You will be %arena_role% next round!" + Change: "You now got %number% %value% passes!" + Playing: + Time-Left: "5,20,5;%arena_time% seconds left!;After %arena_time%s the Murderer will lose" + Role: + Change: "5,20,5;Previous %arena_role% has left!" + Murderer: "5,20,5;ROLE | MURDERER; Kill all players!" + Detective: "5,20,5;ROLE | DETECTIVE;Find and kill the murderer!" + Innocent: "5,20,5;ROLE | INNOCENT;Stay alive as long as possible!" + Score: + Bonus: "+%score% score (%action%)" + Gold: "Picked up gold!" + Action: + Kill: + Player: "for killing players" + Murderer: "for killing murderer" + Innocent: "for killing innocent" + Pickup: + Gold: "for gold pickup" + Surviving: + Time: "for surviving 30 seconds" + End: "for surviving till end" + Win: "for winning the game" + Detective: "for %number% innocents survived" + Sword: + Soon: "The Murderer gets their sword in %time% seconds!" + Special-Blocks: + Cauldron: + Potion: "Please drink your current potion!" + Hologram: "Mystery Potion - &e1 Gold" + Not-Enough-Gold: "You need %amount% gold for this!" + Pray: + Hologram: "Click to give gift;Pull lever to pray" + Chat: "You prayed to the developer! Hope he will hear that!" + Pay: "%color_chat_issue%Pay to pray!" + Praise: + Heard: + - "" + - "&7Developer hears your prayer." + - "%feeling%" + - "%praise%" + Feeling: + Blessed: "&aYou feel blessed." + Cursed: "&cYou feel cursed." + Gifts: + Detective-Revelation: "&aYou know that &bCurrent detective &ais %detective%" + Gold-Rush: "&aYou received power of ancients. For each gold you collect, you will receive 3 gold now." + Single-Compensation: "&aDeveloper is proud of you! He rewarded you with 5 gold ingots!" + Bow: "&aYou received bow from pleased developer!" + Curses: + Slowness: "%color_chat_issue%Your legs are much heavier than before." + Blindness: "%color_chat_issue%Your eyes can't see that well anymore." + Gold: "%color_chat_issue%Developer cursed you with gold ban! You cannot longer pickup any gold!" + Death: "%color_chat_issue%You feel overpowering force of death. You know that you'll be dead in a minute!" + Bow: + Dropped: "5,20,5;The Bow has been dropped!;Find the Bow for a chance to kill the Murderer." + Pickup: "A player has picked up the Bow!" + Shot: + Gold: "&a+1 Bow Shot!" + Title: "5,20,5;;You collected 10 gold and got an arrow!" + + + + + + +# +# Sign messages +# Signs: - Please-Type-Arena-Name: "&cPlease type arena name in second line!" - Arena-Doesnt-Exists: "&cArena with that name doesn't exists!" - Sign-Created: "&aSign created successfully!" - Sign-Removed: "&aSign successfully removed!" - Game-States: - Inactive: "&lInactive..." - In-Game: "&lIn-game" - Starting: "&e&lStarting" - Full-Game: "&4&lFULL" - Ending: "&lEnding" - Restarting: "&c&lRestarting" + Please-Type-Arena-Name: "%color_chat_issue%%plugin_prefix% Please type arena name in second line!" + Arena-Doesnt-Exists: "%color_chat_issue%%plugin_prefix% Arena with that name doesn't exists!" + Created: "%plugin_prefix% Sign created successfully!" + Removed: "%plugin_prefix% Sign successfully removed!" Lines: - - "&4&lMurder Mystery" - - "%state%" - - "%mapname%" - - "&5[%playersize%/%maxplayers%]" + - "%plugin_prefix%" + - "%arena_state_placeholder%" + - "%arena_name%" + - "[%arena_players_size%/%arena_max_players%]" + +# +# Arena Selector messages +# Arena-Selector: - Inv-Title: "Arena selector" + Inventory-Title: "%plugin_short_command% ▸ Arena selector" Item: - Name: "&f%mapname%" + Name: "%arena_name%" Lore: - - "&4Murder Mystery &f- &e%mapname%" + - "%plugin_name% - %arena_name%" - " " - " " - - " &fOnline: %playersize%/%maxplayers%" - - " &fState: %state%" + - " Online: %arena_players_size%/%arena_max_players%" + - " State: %arena_state_placeholder%" - " " - " " - - "&eClick to join this arena" - -Leaderheads: - #top command from leaderheads ex. mmtopkills - Top-Command-Name: "mmtop%stat%" - Top-Command-Inv-Title: "&bTop users" - Leaderboard-Value: - Kills: "&e{amount} kills" - Deaths: "&e{amount} deaths" - Games-Played: "&e{amount} games played" - Highest-Score: "&e{amount} highest score" - Wins: "&e{amount} wins" - Loses: "&e{amount} loses" + - "&aClick to join this arena" +# +# Validator messages +# Validator: - Invalid-Arena-Configuration: "[Murder Mystery] Arena %arena% has invalid configuration! Missing node: %error%" - Instance-Started: "[Murder Mystery] Arena %arena% instance successfully started!" - No-Instances-Created: "[Murder Mystery] There are no arena instances created in configuration!" + Invalid-Arena-Configuration: "Arena %arena_name% has invalid configuration! Missing node: %value%" + Instance-Started: "Arena %arena_name% instance successfully started!" + No-Instances-Created: "There are no arena instances created in configuration!" + +# +# Placeholder messages inside plugin +# Placeholders: Game-States: Waiting: "&lWaiting for players..." Starting: "&e&lStarting" + Full-Game: "&4&lFULL" In-Game: "&lIn-game" Ending: "&lEnding" Restarting: "&c&lRestarting" + Motd: + Waiting: "&lYou can join this game..." + Starting: "&e&lStarting" + Full-Game: "&4&lFULL | Use another Server" + In-Game: "&lIn-game | Click to spectate" + Ending: "&lEnding | Server is closing" + Restarting: "&c&lRestarting" + + +# +# Leaderboard messages +# +# Hologram function need to be enabled on config.yml +Leaderboard: + Type: + Hologram: + Header: "&6&lTop %number% in %value%" + Format: "&e%number%. %player% (%value%)" + Empty-Format: "&e%number%. Empty (0)" + Chat: + Header: "&8+-------+ &a&lYOUR STATS &8+-------+" + Header-Other: "&8+---------+ &aSTATS FOR &b%player% &8+---------+" + Footer: "&8+-----------------------------+" + Format: "%value% ▸ &a%number%" + Top: + Type-Name: "%color_chat_issue%Please type statistic name to view!" + Header: "&8&m+----------------+ [&6 Top 10 &8&m] +----------------+" + Format: "&e#%number% %player% - %value% %user_statistic%" + Statistics: + Wins: "Wins ▸ %number%" + Loses: "Loses ▸ %number%" + Games-Played: "Games Played ▸ %number%" + Level: "Level ▸ %number%" + Exp: "Experience ▸ %number%" + Next-Level-Exp: "Exp to Level Up ▸ %number%" + Kills: "Kills ▸ %number%" + Deaths: "Deaths ▸ %number%" + Highest-Score: "Highest score ▸ %number%" + Invalid-Name: "%color_chat_issue%Name of statistic is invalid! Type: %value%" + Unknown-Player: "%color_chat_issue%Unknown Player" + # Don't edit it. But who's stopping you? It's your server! # Really, don't edit ;p -File-Version-Do-Not-Edit: 8 +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 diff --git a/src/main/resources/lastwords.yml b/src/main/resources/lastwords.yml new file mode 100644 index 00000000..0c1bc870 --- /dev/null +++ b/src/main/resources/lastwords.yml @@ -0,0 +1,18 @@ +Last-Words: + Hologram: + Title: "%player%'s last words:" + Content: + 'default': + Message: "&fPlease respawn :(" + 'meme': + Message: "&fDespacito 2 is confirmed by God" + Permission: "murdermystery.lastwords.meme" + 'rage': + Message: "&fWHY YOU KILLED ME?!!?" + Permission: "murdermystery.lastwords.rage" + 'pro': + Message: "&fIt was lagging..." + Permission: "murdermystery.lastwords.pro" + 'hacker': + Message: "Turn off your hacks..." + Permission: "murdermystery.lastwords.hacker" \ No newline at end of file diff --git a/src/main/resources/leaderboards.yml b/src/main/resources/leaderboards.yml new file mode 100644 index 00000000..b08570ed --- /dev/null +++ b/src/main/resources/leaderboards.yml @@ -0,0 +1,6 @@ +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/locales/language_default.yml b/src/main/resources/locales/language_default.yml index 3f0c4602..66c68462 100644 --- a/src/main/resources/locales/language_default.yml +++ b/src/main/resources/locales/language_default.yml @@ -1,333 +1,326 @@ -# Leave this file as it is! +###############################[IMPORTANT]############################### +# +# Leave this file as it is! It is kinda an internal backup file! # ### !!!Do not change anything here!!! # ### THIS FILE AUTOMATICALLY REGENERATES ON SERVER RESTART # -# Needed as it can be possible that the api is not working +# Needed when the external api isn't working +# +###############################[IMPORTANT]############################### +# You can translate REPLACEWITHPROJECTNAME messages here. +# Color codes (&) supported. +# +# Use \n to make new line +# Some messages like item +# descriptions don't support new lines +# they are wrapped every 40 characters automatically +# +# Some messages support their own placeholders +# like %player%, %kit% etc. + +# +# Command messages +# Commands: - Did-You-Mean: "&6Did you mean &e/%command%&6?" - Teleported-To-The-Lobby: "Teleported to the lobby!" + Did-You-Mean: "&6Did you mean &e/%value%&6?" + Command-Executed: "&aCommand successfully executed!" + Teleported-To-Lobby: "&aTeleported to lobby!" Removed-Game-Instance: "&cSuccessfully removed game instance!" No-Arena-Like-That: "&cNo arena with that ID!" - Look-Sign: "&cYou have to look at a sign to perform this command!" + Look-At-Sign: "&cYou have to look at a sign to perform this command!" Type-Arena-Name: "&cPlease type arena ID!" + Hold-Any-Item: "&cYou must hold any item!" No-Free-Arenas: "&cThere are no free arenas!" - Statistics: - Type-Name: "&cPlease type statistic name to view!" - Invalid-Name: "&cName of statistic is invalid! Type: kills, deaths, games_played, wins, loses, highest_score" - Header: "&8&m-------------------[&6 Top 10 &8&m]-------------------" - Format: "&e#%position% %name% - %value% &7%statistic%" Only-By-Player: "&cYou can execute this command only as player!" Not-Playing: "&cYou must play to execute this command!" No-Permission: "&cYou don't have permission to use this command!" - Admin-Commands: - Teleported-To-Player: "&aTeleported to player!" - Player-Not-Found: "&cPlayer not found!" - Success-Reload: "&aArenas reloaded!" - List-Command: - Header: "&aMurder Mystery &6arenas:" - Format: "&a%arena% &e%status% &6%players%/%maxplayers%" + Player-Not-Found: "&cTarget player %player% doesn't exist!" + Invalid-Location-Teleport: "&cLocation to teleport is invalid!" + Wrong-Usage: "&cWrong usage. Do %value%" + Admin: + Adjust-Statistic: "&eStatistic %value% of %player% is now %number%!" + Reload-Success: "&aArenas reloaded!" + List: + Header: "&a%plugin_name% &6arenas: &aName &eState &6Players" + Format: "&a%arena_name% &e%arena_state_placeholder% &6%arena_players_size%/%arena_max_players%" No-Arenas: "&cThere are no game instances!" - Stats-Command: - Header: "&l-----YOUR STATS-----" - Header-Other: "&l-----STATS FOR %player%-----" - Footer: "&l--------------------" - Kills: "&aKills: &e" - Deaths: "&aDeaths: &e" - Wins: "&aWins: &e" - Loses: "&aLoses: &e" - Highest-Score: "&aHighest score: &e" - Games-Played: "&aGames played: &e" - Main-Command: - Header: "&6----------------{Murder Mystery commands}----------" - Description: "&aGame commands:\n - &b/mm stats: &7Shows your stats!\n - &b/mm leave: &7Quits current arena!\n - &b/mm join : &7Joins specified arena!\n - &b/mm top : &7Shows top 10 players!\n - &b/mm randomjoin: &7Join random arena!" - Admin-Bonus-Description: "\n&b/mma: &7Shows all the admin commands" + Spychat: + Toggled: "&aGame spy chat toggled to&c %value%" + Main: + Header: "&6----------------{%plugin_name% commands}----------" + Description: + - "&aGame commands:" + - "&b/%plugin_short_command% stats: &7Shows your stats!" + - "&b/%plugin_short_command% leave: &7Quits current arena!" + - "&b/%plugin_short_command% join : &7Joins specified arena!" + - "&b/%plugin_short_command% top : &7Shows top 10 players!" + - "&b/%plugin_short_command% randomjoin: &7Join random arena!" + Admin-Bonus-Description: "&b/%plugin_short_command%a: &7Shows all the admin commands" Footer: "&6-------------------------------------------------" -# In-game scoreboard messages. -# Please do not use more than 48 chars here! COLOR CODES INCLUDED. + +# +# In-Game scoreboard messages +# +# Please do not use more chars than the scoreboard can handle! +# Scoreboard supports up to 122 chars for 1.14+ and 48 chars for 1.13- (COLOR CODES INCLUDED.) +# Placeholders: +# https://wiki.plugily.xyz/REPLACEWITHPROJECTNAME/placeholders/language Scoreboard: - Title: "&4&lMurder Mystery" - Detective-Status-Normal: "&fDetective: &eAlive" - Detective-Died-No-Bow: "&cBow Dropped" - Detective-Died-Bow: "&aBow Not Dropped" - Roles: - Detective: "&bDetective" - Murderer: "&cMurderer" - Innocent: "&eInnocent" - Dead: "&7Dead" + Title: "&a&l%plugin_name%" Content: - # Contents of scoreboard for innocents and detective - Playing: - - "&fRole: %ROLE%" - - "" - - "&fInnocents Left: &e%INNOCENTS%" - - "&fTime Left: &e%FORMATTED_TIME%" - - "" - - "%DETECTIVE_STATUS%" + Waiting: + - "&fPlayers: &e%arena_players_size%" - "" - - "&fScore: &e%SCORE%" + - "&fMinimum Players: &e%arena_min_players%" - "" - "&ewww.plugily.xyz" - # Contents of scoreboard for murderer - Playing-Murderer: - - "&fRole: %ROLE%" + Starting: + - "&fStarting In: &e%arena_time%" - "" - - "&fInnocents Left: &e%INNOCENTS%" - - "&fTime Left: &e%FORMATTED_TIME%" + - "&fPlayers: &e%arena_players_size%" - "" - - "%DETECTIVE_STATUS%" + - "&fMinimum Players: &e%arena_min_players%" - "" - - "&fKills: &e%KILLS%" + - "&ewww.plugily.xyz" + # Contents of scoreboard while ingame + In-Game: + - "&f" + - "&f" + - "&f" - "" - - "&fScore: &e%SCORE%" + - "&f" + - "&f" - "" - "&ewww.plugily.xyz" - Waiting: - - "&fPlayers: &e%PLAYERS%" + # Contents of scoreboard while state is ending + Ending: + - "&f" + - "&f" + - "&cGAME ENDED" - "" - - "&fMinimum Players: &e%MIN_PLAYERS%" + - "&f" + - "&f" - "" - "&ewww.plugily.xyz" - Starting: - - "&fStarting In: &e%TIME%" + # Contents of scoreboard while state is restarting + Restarting: + - "&f" + - "&f" + - "&cRESTARTING GAME" - "" - - "&fPlayers: &e%PLAYERS%" - - "" - - "&fMinimum Players: &e%MIN_PLAYERS%" + - "&f" + - "&f" - "" - "&ewww.plugily.xyz" -# Has usage only when bossbar is enabled in config.yml +# +# Bossbar messages +# +# Bossbar needs to be enabled on config.yml Bossbar: - Main-Title: "&a&lMurder Mystery &6- www.plugily.xyz" - Starting-In: "&f&lStarting in: &e&l%time%" - Waiting-For-Players: "&4&lWaiting for more players..." - In-Game-Info: "&e&lPlaying &f&lMURDER MYSTERY &e&lon &b&lPLUGILY.XYZ" - Game-Ended: "&c&lGame has ended! You were playing on &b&lPLUGILY.XYZ" + Title: "&a&l%plugin_name% &6- www.plugily.xyz" + Content: + Waiting: + - "&4&lWaiting for more players..." + Starting: + - "&f&lStarting in: &e&l%arena_time%" + In-Game: + - "&e&lPlaying &f&l%plugin_name_uppercase% &e&lon &b&lPLUGILY.XYZ" + - "&e&lCheck the plugin creator out &e&lon &b&lPLUGILY.XYZ" + Ending: + - "&c&lGame has ended! You were playing on &b&lPLUGILY.XYZ" + Restarting: + - "&c&lRestarting the arena. You will be moved soon!" +# +# In-Game Messages +# In-Game: #Used in most game messages. - Plugin-Prefix: "&4[Murder Mystery] " - Already-Playing: "&cYou are already queued for a game! You can leave a game with /mm leave." - Join-No-Permission: "&cYou don't have &6%permission% &cpermission to join this arena!" - Full-Game-No-Permission: "&cYou don't have the permission to join full games!" - No-Slots-For-Premium: "&cThis game is already full of premium players! Sorry" - You-Are-Spectator: "&cYou're now a spectator! You can fly now!" - Only-Command-Ingame-Is-Leave: "&cYou have to leave the game first to perform commands. The only command that works is /mm leave!" - # Join cancelled via external plugin that uses MM api. - Join-Cancelled-Via-API: "&cYou can't join this game!" - Join-As-Party-Member: "&cYou joined %ARENANAME% because the party leader joined it!" - Arena-Not-Configured: "&cArena is not configured yet! Contact staff!" - Game-Chat-Format: "&7%player%: &f%message%" - Game-Death-Format: "&7[&4☠&7] &r" - Cooldown-Format: "&8&l[%progress%&8&l] &6%time% seconds" - Bow-Locator-Item-Name: "&6Bow locator" - Innocent-Locator-Item-Name: "&6Innocent locator" - Watch-Out-Title: "&cWatch out!" - Watch-Out-Subtitle: "&eThe Murderer can now find survivors easily" - Role-Pass: - Menu-Name: "Role pass menu" - Role: - Murderer: - Name: "Be murderer" - Lore: - - "Cost 1 murderer pass" - - "You got %amount%" - Detective: - Name: "Be detective" - Lore: - - "Cost 1 detective pass" - - "You got %amount%" - Fail: "You do not got enough passes for %role% role" - Success: "You will be %role% next round!" - Change: "You now got %amount% %role% passes!" + Plugin-Prefix: "&a[%plugin_name%] " + Game-Chat-Format: "&6[&5%user_statistic_level%&6]&6[%kit%&6] %player%: &f%message%" + You-Leveled-Up: "&7You leveled up! You're now level %number%!" + Commands-Blocked: "&cYou have to leave the game first to perform commands. The only command that works is /%plugin_short_command% leave!" + Join: + Already-Playing: "&cYou are already queued for a game! You can leave a game with /%plugin_short_command% leave." + No-Permission: "&cYou don't have &6%value% &cpermission to join this arena!" + Full-Game: "&cYou don't have the permission to join full games!" + No-Slots-For-Premium: "&cThis game is already full of premium players! Sorry" + # Join cancelled via external plugin that uses the API of our plugin. + Cancelled-Via-API: "&cYou can't join this game!" + As-Party-Member: "&cYou joined %arena_name% because the party leader joined it!" + Arena-Not-Configured: "&cArena is not configured yet! Contact staff!" + Death: + Tag: "&8Dead" + Screen: "&cYou died!" Spectator: + You-Are-Spectator: "&cYou're now a spectator! You can fly now!" Spectator-Menu-Name: "Alive players list" - Target-Player-Role: "&7Role: %role%" - Target-Player-Health: "&cHealth: &7%health%" - Settings-Menu: - Inventory-Name: "&7Spectator settings" - Speed-Name: "&aSpeed" + Target-Player-Health: "&cHealth: &7%number%" + Spectator-Warning: "&cYou are a spectator!" + Teleport: "&cTeleported to %player%" + Menu: + Settings: + Status: + Enabled: "Enabled" + Disabled: "Disabled" + Changed-Speed: "Changed Speed to %number%" + Auto-Teleport: "%value% auto teleport" + Target-Player: + Action-Bar: "%number% blocks away | Target %player%" + Night-Vision: "%value% night vision" + First-Person-Mode: + Action-Bar: "&eSNEAK &cto leave! | Target %player%" + Title: "&eSNEAK &cto leave!" + Visibility: "%value% other spectator players" Messages: - Lobby-Messages: - Start-In: "&7The game starts in &b%TIME%&7 seconds!" - Waiting-For-Players: "&7Waiting for players... We need at least &b%MINPLAYERS%&7 players to start." + Join: "&b%player%&7 joined the game (%arena_players_size%/%arena_max_players%)!" + Leave: "&b%player% &7left the game (%arena_players_size%/%arena_max_players%)!" + Death: "&b%player% &7died!" + Lobby: + Start-In: "&7The game starts in &b%arena_time%&7 seconds!" + Waiting-For-Players: "&7Waiting for players... We need at least &b%arena_min_players%&7 players to start." Enough-Players-To-Start: "&7We now have enough players. The game is starting soon!" - Game-Started: "&7The game has started! Survive till the end!" - Kicked-For-Premium-Slot: "&c%PLAYER% got removed from the game to make a place for premium players!" + Reduced-Time: "&7The time got reduced to %number% seconds" + Max-Players: "&7We reached max players for this round. Let's shorten the time!" + Game-Started: "&7The game has started!" + Kicked-For-Premium-Slot: "&c%player% got removed from the game to make a place for premium players!" You-Were-Kicked-For-Premium-Slot: "&cYou got kicked out of the game to make a place for a premium player!" - Role-Chances-Action-Bar: "&cMurderer Chance: %murderer_chance% &a- &bDetective Chance: %detective_chance%" - Not-Enough-Space-For-Party: "&cYour party is bigger than free places on the arena %ARENANAME%" - Join: "&b%PLAYER%&7 joined the game (%PLAYERSIZE%/%MAXPLAYERS%)!" - Leave: "&b%PLAYER% &7left the game (%PLAYERSIZE%/%MAXPLAYERS%)!" - Death: "&b%PLAYER% &7died!" - Seconds-Left-Title: "&c%time% &eseconds left!" - Seconds-Left-Subtitle: "&eAfter %time%s the Murderer will lose" - Role-Set: - Murderer-Title: "&cROLE: MURDERER" - Murderer-Subtitle: "&eKill all players!" - Detective-Title: "&bROLE: DETECTIVE" - Detective-Subtitle: "&eFind and kill the murderer!" - Innocent-Title: "&eROLE: INNOCENT" - Innocent-Subtitle: "&eStay alive as long as possible!" - Bonus-Score: "&e+%score% score (%action%)" - Score-Actions: - Kill-Player: "for killing player" - Kill-Murderer: "for killing murderer" - Gold-Pickup: "for gold pickup" - Survive: "for surviving 30 seconds" - #for innocents - Survive-Till-End: "for surviving till end" - #for murderer or detective - Win-Game: "for winning the game" - Detective-Reward: "for %amount% innocents survived" - Innocent-Kill: "for killing innocent" - Picked-Up-Gold: "&ePicked up gold!" - Previous-Role-Left-Title: "&cPrevious %role% has left!" - Previous-Role-Left-Subtitle: "&cSelecting new %role%!" - Corpse-Last-Words: "&7%player%&e's last words:" - Murderer-Get-Sword: "&eThe Murderer gets their sword in &c%time% &eseconds!" - Special-Blocks: - Cauldron-Drink-Potion: "&cPlease drink your current potion!" - Not-Enough-Gold: "&cYou need %amount% gold for this!" - Cauldron-Hologram: "&fMystery Potion - 1 &eGold" - Praise-Hologram: "&eClick to give gift;&ePull lever to pray" - Prayed-Message: "&aYou prayed to the developer! Hope he will hear that!" - No-Money-No-Pray: "&cPay to pray!" - Praises: - Message: - - "" - - "&7Developer hears your prayer." - - "%feeling%" - - "%praise%" - Feelings: - Blessed: "&aYou feel blessed." - Cursed: "&cYou feel cursed." - Gifts: - Detective-Revelation: "&aYou know that &bCurrent detective &ais %detective%" - Gold-Rush: "&aYou received power of ancients. For each gold you collect, you will receive 3 gold now." - Single-Compensation: "&aDeveloper is proud of you! He rewarded you with 5 gold ingots!" - Bow-Time: "&aYou received bow from pleased developer!" - Curses: - Slowness-Curse: "&cYour legs are much heavier than before." - Blindness-Curse: "&cYour eyes can't see that well anymore." - Gold-Ban: "&cDeveloper cursed you with gold ban! You cannot longer pickup any gold!" - Incoming-Death: "&cYou feel overpowering force of death. You know that you'll be dead in a minute!" - Bow-Messages: - Bow-Dropped-Title: "&6The Bow has been dropped!" - Bow-Dropped-Subtitle: "&eFind the Bow for a chance to kill the Murderer." - Pickup-Bow-Message: "&eA player has picked up the Bow!" - Bow-Shot-For-Gold: "&a+1 Bow Shot!" - Bow-Shot-Subtitle: "&eYou collected 10 gold and got an arrow!" - Last-Words: - 'default': - Message: "&fPlease respawn :(" - 'meme': - Message: "&fDespacito 2 is confirmed by God" - Permission: "murdermystery.lastwords.meme" - 'rage': - Message: "&fWHY YOU KILLED ME?!!?" - Permission: "murdermystery.lastwords.rage" - 'pro': - Message: "&fIt was lagging..." - Permission: "murdermystery.lastwords.pro" - 'hacker': - Message: "Turn off your hacks..." - Permission: "murdermystery.lastwords.hacker" - - Game-End-Messages: - Titles: - Win: "&aYOU WIN!" - Lose: "&cYOU LOSE!" - Died: "&cYOU DIED!" - Subtitles: - Murderer-Stopped: "&6The Murderer has been stopped!" - Murderer-Kill-Everyone: "&6The Murderer has killed everyone." - Murderer-Killed-You: "&eThe murderer killed you!" - Player-Killed-You: "&cA player killed you with a Bow!" - Killed-Innocent: "&eYou killed an innocent player!" - Winners: - Players: "&ePLAYERS" - Murderer: "&cMURDERER" - Nobody: "&7Nobody" - Summary-Message: - - "&a&m------------------------------------------------------------------" - - "&f&lMurder Mystery" + Not-Enough-Space-For-Party: "&cYour party is bigger than free places on the arena %arena_name%" + Game-End: + Summary: + - "&a&m--------------------------------------------------" + - "&f&l%plugin_name%" + - "" + - "%arena_summary%" + - "%arena_summary_player%" - "" - - "&f&lWINNER: %winner%" - "" - - "&7Detective: %detective%" - - "&7Murderer: %murderer% (%murderer_kills%)" - - "&7Hero: %hero%" - "" - - "&a&m------------------------------------------------------------------" - Admin-Messages: + - "" + - "" + - "&a&m--------------------------------------------------" + Placeholders: + Win: "You won the game" + Lose: "You lost the game" + Admin: Set-Starting-In-To-0: "&bAn admin set waiting time to 0. The game starts now!" + +# +# Sign messages +# Signs: Please-Type-Arena-Name: "&cPlease type arena name in second line!" Arena-Doesnt-Exists: "&cArena with that name doesn't exists!" - Sign-Created: "&aSign created successfully!" - Sign-Removed: "&aSign successfully removed!" - Game-States: - Inactive: "&lInactive..." - In-Game: "&lIn-game" - Starting: "&e&lStarting" - Full-Game: "&4&lFULL" - Ending: "&lEnding" - Restarting: "&c&lRestarting" + Created: "&aSign created successfully!" + Removed: "&aSign successfully removed!" Lines: - - "&4&lMurder Mystery" - - "%state%" - - "%mapname%" - - "&5[%playersize%/%maxplayers%]" + - "&a&l%plugin_name%" + - "%arena_state_placeholder%" + - "%arena_name%" + - "&5[%arena_players_size%/%arena_max_players%]" + +# +# Arena Selector messages +# Arena-Selector: - Inv-Title: "Arena selector" + Inventory-Title: "%plugin_short_command% > Arena selector" Item: - Name: "&f%mapname%" + Name: "&f%arena_name%" Lore: - - "&4Murder Mystery &f- &e%mapname%" + - "&a%plugin_name% &f- &e%arena_name%" - " " - " " - - " &fOnline: %playersize%/%maxplayers%" - - " &fState: %state%" + - " &fOnline: %arena_players_size%/%arena_max_players%" + - " &fState: %arena_state_placeholder%" - " " - " " - "&eClick to join this arena" -Leaderheads: - #top command from leaderheads ex. mmtopkills - Top-Command-Name: "mmtop%stat%" - Top-Command-Inv-Title: "&bTop users" - Leaderboard-Value: - Kills: "&e{amount} kills" - Deaths: "&e{amount} deaths" - Games-Played: "&e{amount} games played" - Highest-Score: "&e{amount} highest score" - Wins: "&e{amount} wins" - Loses: "&e{amount} loses" - +# +# Validator messages +# Validator: - Invalid-Arena-Configuration: "[Murder Mystery] Arena %arena% has invalid configuration! Missing node: %error%" - Instance-Started: "[Murder Mystery] Arena %arena% instance successfully started!" - No-Instances-Created: "[Murder Mystery] There are no arena instances created in configuration!" + Invalid-Arena-Configuration: "Arena %arena_name% has invalid configuration! Missing node: %value%" + Instance-Started: "Arena %arena_name% instance successfully started!" + No-Instances-Created: "There are no arena instances created in configuration!" + +# +# Placeholder messages inside plugin +# Placeholders: Game-States: Waiting: "&lWaiting for players..." Starting: "&e&lStarting" + Full-Game: "&4&lFULL" In-Game: "&lIn-game" Ending: "&lEnding" Restarting: "&c&lRestarting" + Motd: + Waiting: "&lYou can join this game..." + Starting: "&e&lStarting" + Full-Game: "&4&lFULL | Use another Server" + In-Game: "&lIn-game | Click to spectate" + Ending: "&lEnding | Server is closing" + Restarting: "&c&lRestarting" + + +# +# Kit messages +# +Kit: + Not-Unlocked: "&cYou haven't unlocked &b%value%&c yet!" + Choose: "&aYou have chosen: &b%value%&a!" + Open-Menu: "Open Kit Menu" + Cooldown: "&cKit ability still on cooldown (%number%)!" + Menu: + Title: "Kit Menu" + Lore: + Unlocked: "&aUNLOCKED!" + Locked: "&cLOCKED!" + Unlock-At-Level: "&aUnlocks at level %number%" + Unlock-In-Store: "&bUnlock this in the store!" + + +# +# Leaderboard messages +# +# Hologram function need to be enabled on config.yml +Leaderboard: + Type: + Hologram: + Header: "&6&lTop %number% in %value%" + Format: "&e%number%. &f%player% (%value%)" + Empty-Format: "&e%number%. &fEmpty (0)" + Chat: + Header: "&l-----YOUR STATS-----" + Header-Other: "&l-----STATS FOR %player%-----" + Footer: "&l--------------------" + Format: "&a%value%: &e%number%" + Top: + Type-Name: "&cPlease type statistic name to view!" + Header: "&8&m-------------------[&6 Top 10 &8&m]-------------------" + Format: "&e#%number% %player% - %value% &7%user_statistic%" + Statistics: + Wins: "Wins ▸ %number%" + Loses: "Loses ▸ %number%" + Games-Played: "&aGames Played &e%number%" + Level: "&aLevel &e%number%" + Exp: "&aExperience &e%number%" + Next-Level-Exp: "&aExp to Level Up &e%number%" + Invalid-Name: "&cName of statistic is invalid! Type: %value%" + Unknown-Player: "&fUnknown Player" + # Don't edit it. But who's stopping you? It's your server! # Really, don't edit ;p -File-Version-Do-Not-Edit: 8 +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 diff --git a/src/main/resources/mysql.yml b/src/main/resources/mysql.yml index 548ba14f..fa5367de 100644 --- a/src/main/resources/mysql.yml +++ b/src/main/resources/mysql.yml @@ -1,4 +1,4 @@ -# MySQL database configuration, you no need to touch this unless you enabled MySQL support. +# MySQL database configuration, you don't need to touch this unless you enabled MySQL support. # To enable MySQL support go to > config.yml and set 'DatabaseEnabled' to true # Replace with your database @@ -11,9 +11,16 @@ user: password: # MySQL tablename -table: playerstats +table: mm_playerstats # Maximum life time for HikariCP database. # For documentation, see https://github.com/brettwooldridge/HikariCP#frequently-used # Default 1800000 = 30 minute -maxLifeTime: 1800000 \ No newline at end of file +maxLifeTime: 1800000 + +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/permissions.yml b/src/main/resources/permissions.yml new file mode 100644 index 00000000..b56c7cff --- /dev/null +++ b/src/main/resources/permissions.yml @@ -0,0 +1,53 @@ +# You can create custom players permissions here. +# Player with your custom permission will get int + +Chances-Boost: + # Do not use dots (.), they won't work. + # Increase chance by 10 percent + chances-boost-5: 10 + chances-boost-50: 50 + # Increase chance by 100 percent + admin-boost: 100 + + +Murderer-Boost: + # Do not use dots (.), they won't work. + # Increase murderer chance by 10 percent + murderer-boost-5: 10 + murderer-boost-50: 50 + # Increase murderer chance by 100 percent + admin-boost: 100 + + +Detective-Boost: + # Do not use dots (.), they won't work. + # Increase detective chance by 10 percent + detective-boost-5: 10 + detective-boost-50: 50 + # Increase detective chance by 100 percent + admin-boost: 100 + + +# Create custom exp boost permissions +Exp-Boost: + # Do not use dots (.), they won't work. + # Increase exp by 10 percent + exp-boost-10: 10 + exp-boost-50: 50 + # Increase exp by 300 percent + admin-boost: 300 + +# Basic permissions for game, permissions explained here: https://wiki.plugily.xyz/ +Basic: + Full-Games: "plugilyprojects.fullgames" + # represents arena name (NOT MAP NAME!), for example: 'plugilyprojects.join.ARENAnice' + # use 'plugilyprojects.join.*' to enable access to all arenas + Join: "plugilyprojects.join." + Forcestart: "plugilyprojects.admin.forcestart" + +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 3c151d8d..4f3de8ef 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,18 +1,18 @@ name: MurderMystery main: plugily.projects.murdermystery.Main -authors: [2Wild4You, Tigerpanzer, Plajer, montlikadani] +authors: [ PlugilyProjects, Tigerpanzer_02 ] version: ${project.version} +softdepend: [CorpseReborn, PlaceholderAPI, Parties, Spigot-Party-API-PAF, PartyAndFriends, ViaVersion, ProtocolSupport] api-version: 1.13 -softdepend: [CorpseReborn, PlaceholderAPI, Parties, Spigot-Party-API-PAF, PartyAndFriends] commands: MurderMystery: - description: Murder mystery commands - usage: "\u00A76Correct usage: /mm [stats/leave/join]" + description: MurderMystery Commands + usage: "\u00A76Correct usage: /murdermystery [option]" aliases: [mm, murder] MurderMysteryAdmin: - description: Murder mystery admin commands - usage: "\u00A76Correct usage: /mma [option]" + description: MurderMysteryAdmin commands + usage: "\u00A76Correct usage: /murdermysterya [option]" aliases: [mma, murderadmin] permissions: @@ -20,14 +20,16 @@ permissions: default: op children: murdermystery.updatenotify: true - murdermystery.command.override: true murdermystery.admin: true murdermystery.admin.setup: true - murdermystery.admin.create: true murdermystery.admin.delete: true murdermystery.admin.list: true + murdermystery.admin.spychat: true murdermystery.admin.stopgame: true murdermystery.admin.forcestart: true murdermystery.admin.addsign: true + murdermystery.admin.clear: true murdermystery.admin.sign.create: true - murdermystery.admin.sign.break: true \ No newline at end of file + murdermystery.admin.sign.break: true + murdermystery.admin.reload: true + murdermystery.command.override: true \ No newline at end of file diff --git a/src/main/resources/rewards.yml b/src/main/resources/rewards.yml index 59e4fe74..b9f3462f 100644 --- a/src/main/resources/rewards.yml +++ b/src/main/resources/rewards.yml @@ -1,14 +1,15 @@ # -# Murder Mystery rewards configuration +# Plugily Projects rewards configuration # -# Placeholders list: -# %PLAYER% - Current player name -# %MAPNAME% - Name of map -# %ARENA-ID% - Arena Identifier +# Placeholders list: +# %PLAYER% - Current player name +# %WAVE% - Current wave number +# %MAPNAME% - Name of map +# %ARENA-ID% - Arena Identifier # %PLAYERAMOUNT% - Number of players in game # # Commands are executed by default BY CONSOLE, use "p:" to preform command by player -# You can use chance to execute command adding "chance(NUMBER):" (ex chance(10):) at the beginning of command +# Since 3.6.3 you can use chance to execute command adding "chance(NUMBER):" (ex chance(10):) at the beginning of command # # Commands examples: # - p:say Hello everyone in %MAPNAME%! # Player will say "Hello everyone in " @@ -18,33 +19,39 @@ # ^ YOU CAN EVEN SWAP CHANCE WITH PLAYER! # - chance(50):eco give %PLAYER% 10 # Console has 10% chance to give player 10$ # +# Performed rewards: +# game-end +# # You can unlock full potential of rewards using our script engine! (since 4.0.0) # Just add example reward: # - script:player.sendMessage("oh, hi %PLAYER%"); # It will send "oh, hi " to player! 100% plain java! -# - script:arena.setWave(1); # Sets the wave to 1! # - script:server.broadcastMessage("hello everyone"); # Broadcasts "hello everyone" to whole server # - script:player.getInventory().addItem(new org.bukkit.inventory.ItemStack(org.bukkit.Material.DIRT)); # ^ Gives player dirt item (you must always use direct package names for not provided objects) # # All script provided objects: # player - Player object (API methods https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Player.html) -# arena - Murder Mystery arena (API methods https://jd.plugily.xyz/apidocs/minecraft/murdermystery/plugily/projects/murdermystery/arena/Arena.html) +# arena - Plugin arena (API methods https://jd.plugily.xyz/apidocs/minecraft/PLUGILYPROJECTS/plugily/projects/PLUGILYPROJECTS/arena/Arena.html) # server - Bukkit server object (API methods https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Server.html) # # Whole documentation of scripts soon! # Rewards must be enabled via config.yml first! rewards: + # Commands performed when game is started + game-start: + - say %arena_name% has started + - say Ooh and there are playing %arena_players_size% players # Commands performed when game is finished - endgame: - - say %MAPNAME% has ended! - - say Ooh and there were playing %PLAYERAMOUNT% players + game-end: + - say %arena_name% has ended + - say Ooh and there were playing %arena_players_size% players # Commands executed when detective is killed - detectivekill: + detective-kill: - eco give %PLAYER% 2 - chance(10):eco give %PLAYER% 8 # Commands executed when murderer is killed - murdererkill: + murderer-kill: - eco give %PLAYER% 2 - chance(10):eco give %PLAYER% 8 # Commands executed when player wins the game @@ -53,7 +60,14 @@ rewards: # Commands executed when player loses the game lose: - say I lost the game! - death: + player-death: - say I died! - gold_pickup: - - say You picked up gold! \ No newline at end of file + gold-pickup: + - say You picked up gold! + +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/signs.yml b/src/main/resources/signs.yml new file mode 100644 index 00000000..b08570ed --- /dev/null +++ b/src/main/resources/signs.yml @@ -0,0 +1,6 @@ +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/skins.yml b/src/main/resources/skins.yml new file mode 100644 index 00000000..af8290ac --- /dev/null +++ b/src/main/resources/skins.yml @@ -0,0 +1,7 @@ +Skins: + Sword: + 'default': + Material: IRON_SWORD + 'Stone': + Material: STONE_SWORD + Permission: "murdermystery.skins.sword.stone" \ No newline at end of file diff --git a/src/main/resources/special_items.yml b/src/main/resources/special_items.yml index c2138bf1..8061affc 100644 --- a/src/main/resources/special_items.yml +++ b/src/main/resources/special_items.yml @@ -1,57 +1,137 @@ -# Custom in-game items. -# Probably you will only translate displayname and lore so don't mess with it. +# Custom special items. +# You can also add your own special items! # -# Please don't modify 'Leave-Lobby', 'Leave-Spectator', 'Player-List' and 'Spectator-Options' +# Stage: SERVER_JOIN, WAITING_FOR_PLAYERS, ENOUGH_PLAYERS_TO_START, LOBBY, IN_GAME, SPECTATOR, ENDING +# +# Please don't modify 'Kit-Menu', 'Leave-Lobby', 'Leave-Spectator', 'Player-List' and 'Spectator-Options', 'Forcestart' # nodes as they are hardcoded in code! - -Forcestart: - displayname: "&c&lClick to start the game &7(Right Click)" - lore: - - "&7You need the following permission for it" - - "&7murdermystery.admin.forcestart" - material-name: EMERALD - slot: 0 - stage: lobby +# +# Also see the wiki for further reference! Role-Pass: + permission: "" + execute: + - "" displayname: "&c&lClick to open role pass menu &7(Right Click)" lore: - "&7Enjoy one round of guaranteed role with pass" - material-name: CHEST + material: CHEST slot: 4 stage: lobby + force: true + move: false -Leave-Lobby: +# Uses bungee.yml configuration - if enabled it tries to connect to your hub +Lobby-Leave: + permission: "" + execute: + - "" displayname: "&c&lReturn to Lobby &7(Right Click)" lore: - "&7Right-click to leave to the lobby" - material-name: BED + material: BED slot: 8 - stage: lobby + stage: LOBBY + force: true + move: false -Leave-Spectator: +# Uses bungee.yml configuration - if enabled it tries to connect to your hub +Spectator-Leave: + permission: "" + execute: + - "" displayname: "&c&lLeave the Game &7(Right Click)" lore: - "&7Right-click to leave to the lobby" - material-name: BED + material: BED slot: 8 - stage: spectator + stage: SPECTATOR + force: true + move: false Player-List: + permission: "" + execute: + - "" displayname: "&a&lAlive Players &7(Right Click)" lore: - "&7Right-click to see alive players list" - material-name: PLAYER_HEAD + material: PLAYER_HEAD slot: 0 - stage: spectator + stage: SPECTATOR + force: true + move: false -Spectator-Options: +Spectator-Settings: + permission: "" + execute: + - "" displayname: "&b&lSpectator Settings &7(Right Click)" lore: - "&7Right-click to adjust spectator settings" - material-name: COMPARATOR + material: COMPASS + slot: 4 + stage: SPECTATOR + force: true + move: false + +Forcestart: + permission: "plugily.projects.forcestart" + execute: + - "" + displayname: "&c&lStart the game &7(Right Click)" + lore: + - "&7You need the following permission for it" + - "&7plugily.projects.forcestart" + material: EMERALD + slot: 2 + stage: ENOUGH_PLAYERS_TO_START + force: true + move: false + +Arena-Selector: + permission: "" + execute: + - "p:plugilyprojects arenas" + displayname: "&c&lArena selector &7(Right Click)" + lore: + - "&7Right-click to see all arenas" + material: CHEST slot: 4 - stage: spectator + stage: SERVER_JOIN + force: false + move: false + +Stats: + permission: "" + execute: + - "p:plugilyprojects stats" + displayname: "&c&lStats &7(Right Click)" + lore: + - "&7Right-click to see your Stats" + material: PLAYER_HEAD + slot: 0 + stage: SERVER_JOIN + force: false + move: false + +# Uses bungee.yml configuration - if enabled it tries to connect to your hub +Back-To-Hub: + permission: "" + execute: + - "p:hub" + displayname: "&c&lBack to Hub &7(Right Click)" + lore: + - "&7Right-click to return to lobby" + material: Bed + slot: 8 + stage: SERVER_JOIN + force: false + move: false -# Don't touch this -Version: 1 \ No newline at end of file +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/spectator.yml b/src/main/resources/spectator.yml new file mode 100644 index 00000000..7f3e828d --- /dev/null +++ b/src/main/resources/spectator.yml @@ -0,0 +1,97 @@ +# Make sure to read the wiki for further reference! +# section keys with DEFAULT_SPEED, SPEED1, SPEED2, SPEED3, SPEED4, AUTO_TELEPORT, NIGHT_VISION, FIRST_PERSON_MODE, SPECTATORS_VISIBILITY have a defined function + +Settings-Menu: + Inventory-name: "&7Spectator settings" + Content: + 'DEFAULT_SPEED': + material: LEATHER_BOOTS + # slot at the inventory, 0 is first slot + slot: 11 + name: "Default Speed" + description: + - "Sets the default minecraft speed" + permission: "" + execute: + # You could also add a potion effect by console command + - "" + 'SPEED1': + material: CHAINMAIL_BOOTS + slot: 12 + name: "Speed I" + description: + - "Adds a speed 1 potion" + permission: "" + execute: + - "" + 'SPEED2': + material: IRON_BOOTS + slot: 13 + name: "Speed II" + description: + - "Adds a speed 2 potion" + permission: "" + execute: + - "" + 'SPEED3': + material: GOLDEN_BOOTS + slot: 14 + name: "Speed III" + description: + - "Adds a speed 3 potion" + permission: "" + execute: + - "" + 'SPEED4': + material: DIAMOND_BOOTS + slot: 15 + name: "Speed IV" + description: + - "Adds a speed 4 potion" + permission: "" + execute: + - "" + 'AUTO_TELEPORT': + material: COMPASS + slot: 20 + name: "Automatically teleport" + description: + - "Automatically teleports you to your targeted player" + permission: "" + execute: + - "" + 'NIGHT_VISION': + material: ENDER_PEARL + slot: 21 + name: "Night vision" + description: + - "With nigh vision you will be able to see ghosts" + permission: "" + execute: + - "" + 'FIRST_PERSON_MODE': + material: CLOCK + slot: 23 + name: "First person mode" + description: + - "When in first person mode you will spectate like you would play yourself" + permission: "" + execute: + - "" + 'SPECTATORS_VISIBILITY': + material: REDSTONE + slot: 24 + name: "Spectators visibility" + description: + - "Its a good choice if you hate other players" + permission: "" + execute: + - "" + + +# Don't edit it. But who's stopping you? It's your server! +# Really, don't edit ;p +# You edited it, huh? Next time hurt yourself! +Do-Not-Edit: + File-Version: 1 + Core-Version: 1 \ No newline at end of file diff --git a/src/main/resources/stats.yml b/src/main/resources/stats.yml index e69de29b..37408612 100644 --- a/src/main/resources/stats.yml +++ b/src/main/resources/stats.yml @@ -0,0 +1 @@ +data-version: 1 \ No newline at end of file diff --git a/src/main/resources/trails.yml b/src/main/resources/trails.yml new file mode 100644 index 00000000..a6436263 --- /dev/null +++ b/src/main/resources/trails.yml @@ -0,0 +1,6 @@ +#Add trails that you want to blacklist from all trails(particles) +Blacklisted-Trails: + - "elder_guardian" + - "block_crack" + - "item_crack" + - "block_dust" From 1108bd4bb596ba7047373086c5d4053dc04eac76 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 21:24:27 +0000 Subject: [PATCH 028/127] Bump pom.xml from 1.7.9-dev12 to 1.7.9-dev13 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4046290..191298ae 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev12 + 1.7.9-dev13 MurderMystery From b12fd8c56e3e9c8bfa4309425cf3d5d008ac6338 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 15 Apr 2022 10:14:01 +0200 Subject: [PATCH 029/127] Added MurderGameCorpseSpawnEvent --- .../game/MurderGameCorpseSpawnEvent.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/main/java/plugily/projects/murdermystery/api/events/game/MurderGameCorpseSpawnEvent.java diff --git a/src/main/java/plugily/projects/murdermystery/api/events/game/MurderGameCorpseSpawnEvent.java b/src/main/java/plugily/projects/murdermystery/api/events/game/MurderGameCorpseSpawnEvent.java new file mode 100644 index 00000000..5679aa6f --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/api/events/game/MurderGameCorpseSpawnEvent.java @@ -0,0 +1,56 @@ +package plugily.projects.murdermystery.api.events.game; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; +import plugily.projects.minigamesbox.classic.api.event.PlugilyEvent; +import plugily.projects.murdermystery.arena.Arena; + +/** + * @author Tigerpanzer_02 + *

+ * Created at 15.04.2022 + */ +public class MurderGameCorpseSpawnEvent extends PlugilyEvent implements Cancellable { + + private static final HandlerList HANDLERS = new HandlerList(); + private boolean isCancelled = false; + private final Player player; + private final Location location; + + public MurderGameCorpseSpawnEvent(Arena arena, Player player, Location location) { + super(arena); + this.player = player; + this.location = location; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + + @Override + public HandlerList getHandlers() { + return HANDLERS; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + isCancelled = cancelled; + } + + public Player getPlayer() { + return player; + } + + public Location getLocation() { + return location; + } + +} From aabc4261cbac0ec5bb41bc90f02341a44c2c7f79 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 15 Apr 2022 10:17:57 +0200 Subject: [PATCH 030/127] Implementation core update (2/2) --- pom.xml | 4 +- .../plugily/projects/murdermystery/Main.java | 112 +++--- .../projects/murdermystery/arena/Arena.java | 4 + .../murdermystery/arena/ArenaEvents.java | 45 +-- .../murdermystery/arena/ArenaManager.java | 68 ++-- .../murdermystery/arena/ArenaRegistry.java | 4 - .../murdermystery/arena/ArenaUtils.java | 53 +-- .../murdermystery/arena/corpse/Corpse.java | 1 - .../murdermystery/arena/corpse/Stand.java | 1 - .../arena/managers/MapRestorerManager.java | 15 +- .../arena/managers/ScoreboardManager.java | 11 +- .../murdermystery/arena/role/Role.java | 9 +- .../arena/special/SpecialBlock.java | 1 - .../arena/special/SpecialBlockEvents.java | 108 +++--- .../mysterypotion/MysteryPotionRegistry.java | 11 +- .../arena/special/pray/PrayerRegistry.java | 40 +- .../arena/states/InGameState.java | 66 ++-- .../arena/states/RestartingState.java | 1 - .../arena/states/StartingState.java | 38 +- .../arena/SpecialBlockRemoverArgument.java | 33 +- .../arguments/game/CreateArgument.java | 140 ------- .../murdermystery/events/PluginEvents.java | 60 +-- .../murdermystery/handlers/CorpseHandler.java | 22 +- .../handlers/setup/SetupInventory.java | 2 +- .../projects/murdermystery/old/Main.java | 357 ------------------ src/main/resources/config.yml | 6 +- .../{specialblocks.yml => special_blocks.yml} | 0 27 files changed, 365 insertions(+), 847 deletions(-) delete mode 100644 src/main/java/plugily/projects/murdermystery/commands/arguments/game/CreateArgument.java delete mode 100644 src/main/java/plugily/projects/murdermystery/old/Main.java rename src/main/resources/{specialblocks.yml => special_blocks.yml} (100%) diff --git a/pom.xml b/pom.xml index 191298ae..450dbf43 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ io.papermc.paper paper-api - 1.17.1-R0.1-SNAPSHOT + 1.18.2-R0.1-SNAPSHOT provided @@ -85,7 +85,7 @@ plugily.projects MiniGamesBox-Classic - 1.0.0-SNAPSHOT + 1.1.0 compile true diff --git a/src/main/java/plugily/projects/murdermystery/Main.java b/src/main/java/plugily/projects/murdermystery/Main.java index 22429aeb..00ab9b1b 100644 --- a/src/main/java/plugily/projects/murdermystery/Main.java +++ b/src/main/java/plugily/projects/murdermystery/Main.java @@ -1,6 +1,5 @@ package plugily.projects.murdermystery; -import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; @@ -35,7 +34,10 @@ import plugily.projects.murdermystery.arena.special.mysterypotion.MysteryPotionRegistry; import plugily.projects.murdermystery.arena.special.pray.PrayerRegistry; import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; +import plugily.projects.murdermystery.events.PluginEvents; +import plugily.projects.murdermystery.handlers.CorpseHandler; import plugily.projects.murdermystery.handlers.lastwords.LastWordsManager; +import plugily.projects.murdermystery.handlers.setup.SetupInventory; import plugily.projects.murdermystery.handlers.skins.sword.SwordSkinManager; import plugily.projects.murdermystery.handlers.trails.BowTrailsHandler; import plugily.projects.murdermystery.handlers.trails.TrailsManager; @@ -43,7 +45,9 @@ import java.io.File; import java.util.Arrays; -/** Created by Tigerpanzer_02 on 13.03.2022 */ +/** + * Created by Tigerpanzer_02 on 13.03.2022 + */ public class Main extends PluginMain { private FileConfiguration entityUpgradesConfig; private ArenaRegistry arenaRegistry; @@ -53,6 +57,7 @@ public class Main extends PluginMain { private TrailsManager trailsManager; private SwordSkinManager swordSkinManager; private HookManager hookManager; + private CorpseHandler corpseHandler; @TestOnly public Main() { @@ -75,6 +80,12 @@ public void onEnable() { addMessages(); addAdditionalValues(); initializePluginClasses(); + + if(getConfigPreferences().getOption("NAMETAGS_HIDDEN")) { + getServer().getScheduler().scheduleSyncRepeatingTask(this, () -> + getServer().getOnlinePlayers().forEach(ArenaUtils::updateNameTagsVisibility), 60, 140); + } + getDebugger().debug("Full {0} plugin enabled", getName()); getDebugger() .debug( @@ -84,6 +95,9 @@ public void onEnable() { public void initializePluginClasses() { addFileName("lastwords"); + addFileName("skins"); + addFileName("special_blocks"); + addFileName("trails"); addArenaOptions(); Arena.init(this); ArenaUtils.init(this); @@ -102,6 +116,7 @@ public void initializePluginClasses() { new SpecialBlockEvents(this); trailsManager = new TrailsManager(this); hookManager = new HookManager(this); + corpseHandler = new CorpseHandler(this); swordSkinManager = new SwordSkinManager(this); new PluginEvents(this); addPluginMetrics(); @@ -229,15 +244,14 @@ public void addAdditionalValues() { .registerOption( "CORPSES_INTEGRATION_OVERWRITE", new ConfigOption("Corpses.Integration-Overwrite", true)); - getConfigPreferences() - .registerOption("GOLD_SPAWNER_MODE", new ConfigOption("Gold.Spawner-Mode", false)); - getConfigPreferences().registerOption("GOLD_LIMITER", new ConfigOption("Gold.Limiter", false)); getConfigPreferences() .registerOption("BOW_KILL_DETECTIVE", new ConfigOption("Bow.Kill-Detective", true)); getConfigPreferences().registerOption("HIDE_DEATH", new ConfigOption("Hide.Death", false)); getConfigPreferences() .registerOption("HIDE_NAMETAGS", new ConfigOption("Hide.Nametags", false)); - + getConfigPreferences().registerOption("GOLD_SPAWNER_MODE_ALL", new ConfigOption("Gold.Spawner-Mode", false)); + getConfigPreferences().registerOption("GOLD_LIMITER", new ConfigOption("Gold.Limiter", false)); + getConfigPreferences().registerOption("MURDERER_LOCATOR", new ConfigOption("Murderer.Locator", true)); getStatsStorage() .registerStatistic("WINS", new StatisticType("wins", true, "int(11) NOT NULL DEFAULT '0'")); getStatsStorage() @@ -576,17 +590,17 @@ public void registerPlaceholders() { @Override public String getValue(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } StringBuilder detectives = new StringBuilder(); - for (Player p : pluginArena.getDetectiveList()) { + for(Player p : pluginArena.getDetectiveList()) { detectives.append(p.getName()).append(", "); } int index = detectives.length() - 2; - if (index > 0 && index < detectives.length()) { + if(index > 0 && index < detectives.length()) { detectives.deleteCharAt(index); } @@ -604,20 +618,20 @@ public String getValue(Player player, PluginArena arena) { @Override public String getValue(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } StringBuilder murders = new StringBuilder(); - for (Player p : pluginArena.getMurdererList()) { + for(Player p : pluginArena.getMurdererList()) { User user = getUserManager().getUser(p); int localKills = user.getStatistic("LOCAL_KILLS"); murders.append(p.getName()); - if (pluginArena.getMurdererList().size() > 1) { + if(pluginArena.getMurdererList().size() > 1) { murders.append(" (").append(localKills).append("), "); } } - if (pluginArena.getMurdererList().size() > 1) { + if(pluginArena.getMurdererList().size() > 1) { murders.deleteCharAt(murders.length() - 2); } @@ -635,11 +649,11 @@ public String getValue(Player player, PluginArena arena) { @Override public String getValue(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } int murdererKills = 0; - for (Player p : pluginArena.getMurdererList()) { + for(Player p : pluginArena.getMurdererList()) { User user = getUserManager().getUser(p); int localKills = user.getStatistic("LOCAL_KILLS"); murdererKills += localKills; @@ -655,15 +669,15 @@ public String getValue(Player player, PluginArena arena) { @Override public String getValue(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } Player hero = pluginArena.getCharacter(Arena.CharacterType.HERO); return hero != null ? hero.getName() : new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_NOBODY") - .asKey() - .build(); + .asKey() + .build(); } }); @@ -676,22 +690,22 @@ public String getValue(Player player, PluginArena arena) { @Override public String getValue(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } int totalMurderer = 0; - for (Player p : arena.getPlayers()) { + for(Player p : arena.getPlayers()) { User user = getUserManager().getUser(p); totalMurderer += user.getStatistic("CONTRIBUTION_MURDERER"); } User user = getUserManager().getUser(player); return NumberUtils.round( - ((double) user.getStatistic("CONTRIBUTION_MURDERER") - / (double) totalMurderer) - * 100.0, - 2) + ((double) user.getStatistic("CONTRIBUTION_MURDERER") + / (double) totalMurderer) + * 100.0, + 2) + "%"; } }); @@ -705,22 +719,22 @@ public String getValue(Player player, PluginArena arena) { @Override public String getValue(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } int totalDetectives = 0; - for (Player p : arena.getPlayers()) { + for(Player p : arena.getPlayers()) { User user = getUserManager().getUser(p); totalDetectives += user.getStatistic("CONTRIBUTION_DETECTIVE"); } User user = getUserManager().getUser(player); return NumberUtils.round( - ((double) user.getStatistic("CONTRIBUTION_DETECTIVE") - / (double) totalDetectives) - * 100.0, - 2) + ((double) user.getStatistic("CONTRIBUTION_DETECTIVE") + / (double) totalDetectives) + * 100.0, + 2) + "%"; } }); @@ -734,12 +748,12 @@ public String getValue(Player player, PluginArena arena) { @Override public String getValue(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } - if (pluginArena.isDetectiveDead()) { - if (!pluginArena.isCharacterSet(Arena.CharacterType.FAKE_DETECTIVE)) { + if(pluginArena.isDetectiveDead()) { + if(!pluginArena.isCharacterSet(Arena.CharacterType.FAKE_DETECTIVE)) { return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_DROPPED").build(); } else { return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_PICKED").build(); @@ -759,12 +773,12 @@ public String getValue(Player player, PluginArena arena) { @Override public String getValue(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } int innocents = 0; - for (Player p : arena.getPlayersLeft()) { - if (!Role.isRole(Role.MURDERER, getUserManager().getUser(p))) { + for(Player p : arena.getPlayersLeft()) { + if(!Role.isRole(Role.MURDERER, getUserManager().getUser(p))) { innocents++; } } @@ -779,16 +793,16 @@ public String getValue(Player player, PluginArena arena) { @Override public String getValue(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } User user = getUserManager().getUser(player); String role; - if (pluginArena.isDeathPlayer(player)) { + if(pluginArena.isDeathPlayer(player)) { role = new MessageBuilder("SCOREBOARD_ROLES_DEAD").asKey().build(); - } else if (Role.isRole(Role.MURDERER, user, arena)) { + } else if(Role.isRole(Role.MURDERER, user, arena)) { role = new MessageBuilder("SCOREBOARD_ROLES_DETECTIVE").asKey().build(); - } else if (Role.isRole(Role.ANY_DETECTIVE, user, arena)) { + } else if(Role.isRole(Role.ANY_DETECTIVE, user, arena)) { role = new MessageBuilder("SCOREBOARD_ROLES_MURDERER").asKey().build(); } else { role = new MessageBuilder("SCOREBOARD_ROLES_INNOCENT").asKey().build(); @@ -811,19 +825,19 @@ public String getValue(Player player, PluginArena arena) { @Nullable private String getSummary(Player player, PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } String summaryEnding; - if (pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) + if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) && pluginArena.getMurdererList().contains(player)) { summaryEnding = new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") .asKey() .arena(pluginArena) .build(); - } else if (!pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) + } else if(!pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) && !pluginArena.getMurdererList().contains(player)) { summaryEnding = new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") @@ -857,15 +871,15 @@ public String getValue(PluginArena arena) { @Nullable private String getSummary(PluginArena arena) { Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return null; } String summaryEnding; - if (pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft())) { + if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft())) { summaryEnding = new MessageBuilder( - "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL") + "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL") .asKey() .arena(pluginArena) .build(); @@ -887,7 +901,7 @@ private void addPluginMetrics() { new Metrics.SimplePie( "hooked_addons", () -> { - if (getServer().getPluginManager().getPlugin("MurderMystery-Extension") != null) { + if(getServer().getPluginManager().getPlugin("MurderMystery-Extension") != null) { return "Extension"; } return "None"; @@ -930,6 +944,10 @@ public HookManager getHookManager() { return hookManager; } + public CorpseHandler getCorpseHandler() { + return corpseHandler; + } + @Override public PluginSetupInventory openSetupInventory(PluginArena arena, Player player) { return new SetupInventory(this, arena, player); diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index 0590a568..38bac713 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -119,6 +119,10 @@ public List getCorpses() { return corpses; } + public List getStands() { + return stands; + } + public void addHead(Stand stand) { stands.add(stand); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index 74fa2d11..c6a22a65 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -57,12 +57,7 @@ import plugily.projects.murdermystery.arena.managers.MapRestorerManager; import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.arena.special.pray.PrayerRegistry; -import plugily.projects.murdermystery.old.arena.ArenaRegistry; import plugily.projects.murdermystery.utils.ItemPosition; -import plugily.projects.thebridge.Main; -import plugily.projects.thebridge.arena.base.Base; -import plugily.projects.thebridge.arena.managers.ScoreboardManager; -import plugily.projects.thebridge.kits.level.ArcherKit; /** * @author Plajer @@ -117,7 +112,7 @@ public void onBowShot(EntityShootBowEvent e) { return; } if (user.getCooldown("bow_shot") == 0) { - int bowCooldown = plugin.getConfig().getInt("Detective-Bow-Cooldown", 5); + int bowCooldown = plugin.getConfig().getInt("Bow.Amount.Cooldown", 5); user.setCooldown("bow_shot", bowCooldown); plugin.getBukkitHelper().applyActionBarCooldown(player, bowCooldown); @@ -156,18 +151,19 @@ public void onItemPickup(PlugilyEntityPickupItemEvent e) { e.getItem().remove(); for (Player loopPlayer : arena.getPlayersLeft()) { - if (Role.isRole(Role.INNOCENT, plugin.getUserManager().getUser(loopPlayer))) { + User loopUser = plugin.getUserManager().getUser(loopPlayer); + if (Role.isRole(Role.INNOCENT,loopUser)) { ItemPosition.setItem( - loopPlayer, ItemPosition.BOW_LOCATOR, new ItemStack(Material.AIR, 1)); + loopUser, ItemPosition.BOW_LOCATOR, new ItemStack(Material.AIR, 1)); } } arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, player); - ItemPosition.setItem(player, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); + ItemPosition.setItem(user, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); ItemPosition.setItem( - player, + user, ItemPosition.INFINITE_ARROWS, - new ItemStack(Material.ARROW, plugin.getConfig().getInt("Detective-Fake-Arrows", 3))); + new ItemStack(Material.ARROW, plugin.getConfig().getInt("Bow.Amount.Arrows.Fake", 3))); new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_PICKUP") .asKey() .player(player) @@ -201,7 +197,7 @@ public void onItemPickup(PlugilyEntityPickupItemEvent e) { stack.setAmount(3 * e.getItem().getItemStack().getAmount()); } - ItemPosition.addItem(player, ItemPosition.GOLD_INGOTS, stack); + ItemPosition.addItem(user, ItemPosition.GOLD_INGOTS, stack); user.adjustStatistic("LOCAL_GOLD", stack.getAmount()); ArenaUtils.addScore(user, ArenaUtils.ScoreAction.GOLD_PICKUP, stack.getAmount()); @@ -216,7 +212,7 @@ public void onItemPickup(PlugilyEntityPickupItemEvent e) { if (Role.isRole(Role.ANY_DETECTIVE, user, arena)) { ItemPosition.addItem( - player, + user, ItemPosition.ARROWS, new ItemStack( Material.ARROW, @@ -232,9 +228,9 @@ public void onItemPickup(PlugilyEntityPickupItemEvent e) { .player(player) .arena(arena) .sendPlayer(); - ItemPosition.setItem(player, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); + ItemPosition.setItem(user, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); ItemPosition.addItem( - player, + user, ItemPosition.ARROWS, new ItemStack(Material.ARROW, plugin.getConfig().getInt("Bow.Amount.Arrows.Gold", 3))); player @@ -271,9 +267,8 @@ public void onMurdererDamage(EntityDamageByEntityEvent e) { return; } - //todo support for skins later //just don't kill user if item isn't murderer sword - if(VersionUtils.getItemInHand(attacker).getType() != plugin.getConfigPreferences().getMurdererSword().getType()) { + if(VersionUtils.getItemInHand(attacker).getType() != plugin.getSwordSkinManager().getMurdererSword(attacker).getType()) { return; } @@ -282,7 +277,7 @@ public void onMurdererDamage(EntityDamageByEntityEvent e) { if(plugin.getUserManager().getUser(attacker).getCooldown("sword_attack") > 0) { return; } - } else if(attacker.hasCooldown(plugin.getConfigPreferences().getMurdererSword().getType())) { + } else if(attacker.hasCooldown(plugin.getSwordSkinManager().getMurdererSword(attacker).getType())) { return; } @@ -304,7 +299,7 @@ public void onMurdererDamage(EntityDamageByEntityEvent e) { user.adjustStatistic("LOCAL_KILLS", 1); ArenaUtils.addScore(user, ArenaUtils.ScoreAction.KILL_PLAYER, 0); - Arena arena = ArenaRegistry.getArena(attacker); + Arena arena = plugin.getArenaRegistry().getArena(attacker); if(Role.isRole(Role.ANY_DETECTIVE, userVictim) && arena.lastAliveDetective()) { //if already true, no effect is done :) arena.setDetectiveDead(true); @@ -326,7 +321,7 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { } Player attacker = (Player) ((Arrow) e.getDamager()).getShooter(); User userAttacker = plugin.getUserManager().getUser(attacker); - if(ArenaRegistry.isInArena(attacker)) { + if(plugin.getArenaRegistry().isInArena(attacker)) { e.setCancelled(true); e.getDamager().remove(); } @@ -348,7 +343,7 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { e.setCancelled(true); return; } - Arena arena = ArenaRegistry.getArena(attacker); + Arena arena = plugin.getArenaRegistry().getArena(attacker); //we need to set it before the victim die, because of hero character if(Role.isRole(Role.MURDERER, userVictim)) { arena.setCharacter(Arena.CharacterType.HERO, attacker); @@ -485,7 +480,7 @@ public void onRespawn(PlayerRespawnEvent event) { user.setStatistic("LOCAL_GOLD", 0); plugin .getRewardsHandler() - .performReward(player, plugin.getRewardsHandler().getRewardType("DEATH"); + .performReward(player, plugin.getRewardsHandler().getRewardType("DEATH")); } } @@ -509,7 +504,7 @@ public void locatorDistanceUpdate(PlayerMoveEvent event) { ItemMeta bowMeta = bowLocator.getItemMeta(); ComplementAccessor.getComplement().setDisplayName(bowMeta, new MessageBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_BOW").asKey().player(player).arena(arena).build() + " §7| §a" + (int) Math.round(player.getLocation().distance(player.getCompassTarget()))); bowLocator.setItemMeta(bowMeta); - ItemPosition.setItem(player, ItemPosition.BOW_LOCATOR, bowLocator); + ItemPosition.setItem(user, ItemPosition.BOW_LOCATOR, bowLocator); return; } } @@ -523,7 +518,7 @@ public void locatorDistanceUpdate(PlayerMoveEvent event) { if(Role.isRole(Role.INNOCENT, playerUser, playerArena) || Role.isRole(Role.ANY_DETECTIVE, playerUser, playerArena)) { ComplementAccessor.getComplement().setDisplayName(innocentMeta, new MessageBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_INNOCENT").asKey().player(player).arena(arena).build() + " §7| §a" + (int) Math.round(player.getLocation().distance(p.getLocation()))); innocentLocator.setItemMeta(innocentMeta); - ItemPosition.setItem(player, ItemPosition.INNOCENTS_LOCATOR, innocentLocator); + ItemPosition.setItem(user, ItemPosition.INNOCENTS_LOCATOR, innocentLocator); } } } @@ -533,7 +528,7 @@ public void locatorDistanceUpdate(PlayerMoveEvent event) { @EventHandler public void onItemMove(InventoryClickEvent e) { - if(e.getWhoClicked() instanceof Player && ArenaRegistry.isInArena((Player) e.getWhoClicked())) { + if(e.getWhoClicked() instanceof Player && plugin.getArenaRegistry().isInArena((Player) e.getWhoClicked())) { if(e.getView().getType() == InventoryType.CRAFTING || e.getView().getType() == InventoryType.PLAYER) { e.setResult(Event.Result.DENY); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java index 08a88a57..356a11d8 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java @@ -30,8 +30,6 @@ import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.arena.special.SpecialBlock; import plugily.projects.murdermystery.utils.ItemPosition; -import plugily.projects.thebridge.Main; -import plugily.projects.thebridge.arena.base.Base; import java.util.ArrayList; import java.util.List; @@ -39,7 +37,7 @@ /** * @author Plajer - *

Created at 13.05.2018 + *

Created at 13.05.2018 */ public class ArenaManager extends PluginArenaManager { @@ -53,7 +51,7 @@ public ArenaManager(Main plugin) { @Override public void joinAttempt(@NotNull Player player, @NotNull PluginArena arena) { Arena pluginArena = (Arena) plugin.getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return; } super.joinAttempt(player, arena); @@ -89,17 +87,17 @@ public void joinAttempt(@NotNull Player player, @NotNull PluginArena arena) { @Override public void leaveAttempt(@NotNull Player player, @NotNull PluginArena arena) { Arena pluginArena = (Arena) plugin.getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return; } super.leaveAttempt(player, arena); - if (pluginArena.isDeathPlayer(player)) { + if(pluginArena.isDeathPlayer(player)) { pluginArena.removeDeathPlayer(player); } User user = plugin.getUserManager().getUser(player); int localScore = user.getStatistic("LOCAL_SCORE"); - if (localScore > user.getStatistic("HIGHEST_SCORE")) { + if(localScore > user.getStatistic("HIGHEST_SCORE")) { user.setStatistic("HIGHEST_SCORE", localScore); } @@ -128,16 +126,16 @@ public void leaveAttempt(@NotNull Player player, @NotNull PluginArena arena) { .max() .orElse(0); user.adjustStatistic("CONTRIBUTION_MURDERER", -murderDecrease); - if (user.getStatistic("CONTRIBUTION_MURDERER") <= 0) { + if(user.getStatistic("CONTRIBUTION_MURDERER") <= 0) { user.setStatistic("CONTRIBUTION_MURDERER", 1); } user.adjustStatistic("CONTRIBUTION_DETECTIVE", -detectiveDecrease); - if (user.getStatistic("CONTRIBUTION_DETECTIVE") <= 0) { + if(user.getStatistic("CONTRIBUTION_DETECTIVE") <= 0) { user.setStatistic("CONTRIBUTION_DETECTIVE", 1); } - if (arena.getArenaState() == ArenaState.IN_GAME) { - if (Role.isRole(Role.FAKE_DETECTIVE, user, arena) + if(arena.getArenaState() == ArenaState.IN_GAME) { + if(Role.isRole(Role.FAKE_DETECTIVE, user, arena) || Role.isRole(Role.INNOCENT, user, arena)) { user.setStatistic("CONTRIBUTION_MURDERER", ThreadLocalRandom.current().nextInt(4) + 1); user.setStatistic("CONTRIBUTION_DETECTIVE", ThreadLocalRandom.current().nextInt(4) + 1); @@ -145,21 +143,21 @@ public void leaveAttempt(@NotNull Player player, @NotNull PluginArena arena) { } boolean playerHasMurdererRole = Role.isRole(Role.MURDERER, user, arena); - if (playerHasMurdererRole) { + if(playerHasMurdererRole) { pluginArena.removeFromMurdererList(player); } - if (arena.getArenaState() == ArenaState.IN_GAME && !user.isSpectator()) { + if(arena.getArenaState() == ArenaState.IN_GAME && !user.isSpectator()) { List playersLeft = arena.getPlayersLeft(); // -1 cause we didn't remove player yet - if (playersLeft.size() - 1 > 1) { - if (playerHasMurdererRole) { - if (pluginArena.getMurdererList().isEmpty()) { + if(playersLeft.size() - 1 > 1) { + if(playerHasMurdererRole) { + if(pluginArena.getMurdererList().isEmpty()) { List players = new ArrayList<>(); - for (Player gamePlayer : playersLeft) { + for(Player gamePlayer : playersLeft) { User userGamePlayer = plugin.getUserManager().getUser(gamePlayer); - if (gamePlayer == player + if(gamePlayer == player || Role.isRole(Role.ANY_DETECTIVE, userGamePlayer, arena) || Role.isRole(Role.MURDERER, userGamePlayer, arena)) { continue; @@ -170,7 +168,7 @@ public void leaveAttempt(@NotNull Player player, @NotNull PluginArena arena) { Player newMurderer = players.get( players.size() == 1 ? 0 : ThreadLocalRandom.current().nextInt(players.size())); - if (newMurderer != null) { + if(newMurderer != null) { plugin .getDebugger() .debug("A murderer left the game. New murderer: {0}", newMurderer.getName()); @@ -184,33 +182,33 @@ public void leaveAttempt(@NotNull Player player, @NotNull PluginArena arena) { .arena(pluginArena) .sendArena(); - if (newMurderer != null) { + if(newMurderer != null) { new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_MURDERER") .asKey() .player(player) .arena(pluginArena) .sendArena(); ItemPosition.setItem( - newMurderer, + plugin.getUserManager().getUser(newMurderer), ItemPosition.MURDERER_SWORD, - plugin.getConfigPreferences().getMurdererSword()); + plugin.getSwordSkinManager().getRandomSwordSkin(player)); } user.setStatistic("CONTRIBUTION_MURDERER", 1); } else { plugin.getDebugger().debug("No new murderer added as there are some"); } - } else if (Role.isRole(Role.ANY_DETECTIVE, user, arena) + } else if(Role.isRole(Role.ANY_DETECTIVE, user, arena) && pluginArena.lastAliveDetective()) { pluginArena.setDetectiveDead(true); - if (Role.isRole(Role.FAKE_DETECTIVE, user, arena)) { + if(Role.isRole(Role.FAKE_DETECTIVE, user, arena)) { pluginArena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); } else { user.setStatistic("CONTRIBUTION_DETECTIVE", 1); } ArenaUtils.dropBowAndAnnounce(pluginArena, player); } - plugin.getCorpseHandler().spawnCorpse(player, arena); + plugin.getCorpseHandler().spawnCorpse(player, pluginArena); } else { stopGame(false, arena); } @@ -220,24 +218,24 @@ public void leaveAttempt(@NotNull Player player, @NotNull PluginArena arena) { @Override public void stopGame(boolean quickStop, @NotNull PluginArena arena) { Arena pluginArena = (Arena) plugin.getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return; } - for (SpecialBlock specialBlock : pluginArena.getSpecialBlocks()) { - if (specialBlock.getArmorStandHologram() != null) { + for(SpecialBlock specialBlock : pluginArena.getSpecialBlocks()) { + if(specialBlock.getArmorStandHologram() != null) { specialBlock.getArmorStandHologram().delete(); } } ((MapRestorerManager) pluginArena.getMapRestorerManager()).removeBowHolo(); boolean murderWon = arena.getPlayersLeft().size() == pluginArena.aliveMurderer(); - for (Player player : arena.getPlayers()) { - if (!quickStop) { + for(Player player : arena.getPlayers()) { + if(!quickStop) { User user = plugin.getUserManager().getUser(player); - if (!quickStop && Role.isAnyRole(user, arena)) { + if(!quickStop && Role.isAnyRole(user, arena)) { boolean hasDeathRole = Role.isRole(Role.DEATH, user, arena); - if (!hasDeathRole && !Role.isRole(Role.SPECTATOR, user, arena)) { - if (Role.isRole(Role.FAKE_DETECTIVE, user, arena) + if(!hasDeathRole && !Role.isRole(Role.SPECTATOR, user, arena)) { + if(Role.isRole(Role.FAKE_DETECTIVE, user, arena) || Role.isRole(Role.INNOCENT, user, arena)) { user.setStatistic( "CONTRIBUTION_MURDERER", ThreadLocalRandom.current().nextInt(4) + 1); @@ -245,7 +243,7 @@ public void stopGame(boolean quickStop, @NotNull PluginArena arena) { "CONTRIBUTION_DETECTIVE", ThreadLocalRandom.current().nextInt(4) + 1); } boolean hasMurdererRole = Role.isRole(Role.MURDERER, user, arena); - if (murderWon || !hasMurdererRole) { + if(murderWon || !hasMurdererRole) { user.adjustStatistic("WINS", 1); plugin .getRewardsHandler() @@ -256,7 +254,7 @@ public void stopGame(boolean quickStop, @NotNull PluginArena arena) { .getRewardsHandler() .performReward(player, plugin.getRewardsHandler().getRewardType("LOSE")); } - } else if (hasDeathRole) { + } else if(hasDeathRole) { user.adjustStatistic("LOSES", 1); plugin .getRewardsHandler() diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java index 63dce88b..e9f3c566 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaRegistry.java @@ -26,13 +26,9 @@ import plugily.projects.minigamesbox.classic.arena.PluginArena; import plugily.projects.minigamesbox.classic.arena.PluginArenaRegistry; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; -import plugily.projects.minigamesbox.classic.utils.dimensional.Cuboid; -import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; import plugily.projects.minigamesbox.classic.utils.serialization.LocationSerializer; import plugily.projects.murdermystery.Main; import plugily.projects.murdermystery.arena.special.SpecialBlock; -import plugily.projects.thebridge.Main; -import plugily.projects.thebridge.arena.base.Base; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java index 4ca7609b..cca276fe 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java @@ -26,6 +26,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import plugily.projects.minigamesbox.classic.arena.ArenaState; +import plugily.projects.minigamesbox.classic.arena.PluginArena; import plugily.projects.minigamesbox.classic.arena.PluginArenaUtils; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.handlers.language.TitleBuilder; @@ -35,12 +36,11 @@ import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; import plugily.projects.minigamesbox.classic.utils.version.xseries.XSound; import plugily.projects.murdermystery.arena.role.Role; -import plugily.projects.murdermystery.old.arena.ArenaRegistry; import plugily.projects.murdermystery.utils.ItemPosition; /** * @author Plajer - *

Created at 13.03.2018 + *

Created at 13.03.2018 */ public class ArenaUtils extends PluginArenaUtils { @@ -60,13 +60,13 @@ public static void onMurdererDeath(Arena arena) { } } //we must call it ticks later due to instant respawn bug - Bukkit.getScheduler().runTaskLater(getPlugin(), () -> ArenaManager.stopGame(false, arena), 10); + Bukkit.getScheduler().runTaskLater(getPlugin(), () -> getPlugin().getArenaManager().stopGame(false, arena), 10); } public static void updateInnocentLocator(Arena arena) { java.util.List list = arena.getPlayersLeft(); - if (!arena.isMurdererLocatorReceived()) { + if(!arena.isMurdererLocatorReceived()) { ItemStack innocentLocator = new ItemStack(Material.COMPASS, 1); ItemMeta innocentMeta = innocentLocator.getItemMeta(); ComplementAccessor.getComplement() @@ -74,15 +74,15 @@ public static void updateInnocentLocator(Arena arena) { innocentMeta, new MessageBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_INNOCENT").asKey().build()); innocentLocator.setItemMeta(innocentMeta); - for (Player p : list) { - if (arena.isMurderAlive(p)) { - ItemPosition.setItem(p, ItemPosition.INNOCENTS_LOCATOR, innocentLocator); + for(Player p : list) { + if(arena.isMurderAlive(p)) { + ItemPosition.setItem(getPlugin().getUserManager().getUser(p), ItemPosition.INNOCENTS_LOCATOR, innocentLocator); } } arena.setMurdererLocatorReceived(true); - for (Player p : list) { - if (Role.isRole(Role.MURDERER, getPlugin().getUserManager().getUser(p), arena)) { + for(Player p : list) { + if(Role.isRole(Role.MURDERER, getPlugin().getUserManager().getUser(p), arena)) { continue; } new TitleBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_WATCH_OUT") @@ -93,12 +93,12 @@ public static void updateInnocentLocator(Arena arena) { } } - for (Player p : list) { - if (Role.isRole(Role.MURDERER, getPlugin().getUserManager().getUser(p), arena)) { + for(Player p : list) { + if(Role.isRole(Role.MURDERER, getPlugin().getUserManager().getUser(p), arena)) { continue; } - for (Player murder : arena.getMurdererList()) { - if (arena.isMurderAlive(murder)) { + for(Player murder : arena.getMurdererList()) { + if(arena.isMurderAlive(murder)) { murder.setCompassTarget(p.getLocation()); } } @@ -107,7 +107,7 @@ public static void updateInnocentLocator(Arena arena) { } public static void dropBowAndAnnounce(Arena arena, Player victim) { - if (arena.getBowHologram() != null) { + if(arena.getBowHologram() != null) { return; } new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_DROPPED").asKey().arena(arena).sendArena(); @@ -126,21 +126,22 @@ private static void addBowLocator(Arena arena, Location loc) { .setDisplayName( bowMeta, new MessageBuilder("IN_GAME_MESSAGES_ARENA_LOCATOR_BOW").asKey().build()); bowLocator.setItemMeta(bowMeta); - for (Player p : arena.getPlayersLeft()) { - if (Role.isRole(Role.INNOCENT, getPlugin().getUserManager().getUser(p), arena)) { - ItemPosition.setItem(p, ItemPosition.BOW_LOCATOR, bowLocator); + for(Player p : arena.getPlayersLeft()) { + User user = getPlugin().getUserManager().getUser(p); + if(Role.isRole(Role.INNOCENT, user, arena)) { + ItemPosition.setItem(user, ItemPosition.BOW_LOCATOR, bowLocator); p.setCompassTarget(loc); } } } public static void updateNameTagsVisibility(final Player p) { - if (!getPlugin().getConfigPreferences().getOption("HIDE_NAMETAGS")) { + if(!getPlugin().getConfigPreferences().getOption("HIDE_NAMETAGS")) { return; } - for (Player players : getPlugin().getServer().getOnlinePlayers()) { - Arena arena = ArenaRegistry.getArena(players); - if (arena == null) { + for(Player players : getPlugin().getServer().getOnlinePlayers()) { + PluginArena arena = getPlugin().getArenaRegistry().getArena(players); + if(arena == null) { continue; } VersionUtils.updateNameTagsVisibility( @@ -152,7 +153,7 @@ public static void addScore(User user, ScoreAction action, int amount) { XSound.matchXSound(XSound.ENTITY_EXPERIENCE_ORB_PICKUP.parseSound()) .play(user.getPlayer().getLocation(), 1F, 2F); - if (action == ScoreAction.GOLD_PICKUP && amount > 1) { + if(action == ScoreAction.GOLD_PICKUP && amount > 1) { int score = action.points * amount; new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_BONUS") .asKey() @@ -165,12 +166,12 @@ public static void addScore(User user, ScoreAction action, int amount) { return; } - if (action == ScoreAction.DETECTIVE_WIN_GAME) { + if(action == ScoreAction.DETECTIVE_WIN_GAME) { int innocents = 0; Arena arena = (Arena) user.getArena(); - for (Player p : arena.getPlayersLeft()) { - if (Role.isRole(Role.INNOCENT, getPlugin().getUserManager().getUser(p), arena)) { + for(Player p : arena.getPlayersLeft()) { + if(Role.isRole(Role.INNOCENT, getPlugin().getUserManager().getUser(p), arena)) { innocents++; } } @@ -196,7 +197,7 @@ public static void addScore(User user, ScoreAction action, int amount) { .value(action.action) .build(); - if (action.points < 0) { + if(action.points < 0) { msg = StringUtils.replace(msg, "+", ""); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/corpse/Corpse.java b/src/main/java/plugily/projects/murdermystery/arena/corpse/Corpse.java index 3410978c..a5c52021 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/corpse/Corpse.java +++ b/src/main/java/plugily/projects/murdermystery/arena/corpse/Corpse.java @@ -20,7 +20,6 @@ import org.golde.bukkit.corpsereborn.nms.Corpses; -import plugily.projects.commonsbox.minecraft.hologram.ArmorStandHologram; import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; /** diff --git a/src/main/java/plugily/projects/murdermystery/arena/corpse/Stand.java b/src/main/java/plugily/projects/murdermystery/arena/corpse/Stand.java index fa2697f8..489097e2 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/corpse/Stand.java +++ b/src/main/java/plugily/projects/murdermystery/arena/corpse/Stand.java @@ -20,7 +20,6 @@ import org.bukkit.entity.ArmorStand; -import plugily.projects.commonsbox.minecraft.hologram.ArmorStandHologram; import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; /** diff --git a/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java b/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java index b7ab04db..ee7d07af 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java @@ -3,7 +3,10 @@ import org.bukkit.entity.Item; import org.golde.bukkit.corpsereborn.CorpseAPI.CorpseAPI; import plugily.projects.minigamesbox.classic.arena.managers.PluginMapRestorerManager; +import plugily.projects.murdermystery.HookManager; import plugily.projects.murdermystery.arena.Arena; +import plugily.projects.murdermystery.arena.corpse.Corpse; +import plugily.projects.murdermystery.arena.corpse.Stand; import java.util.Objects; @@ -38,7 +41,7 @@ public void removeBowHolo() { if(arena.getBowHologram() != null && !arena.getBowHologram().isDeleted()) { arena.getBowHologram().delete(); } -arena.setBowHologram(null); + arena.setBowHologram(null); } public void clearGold() { @@ -47,8 +50,8 @@ public void clearGold() { } public void clearCorpses() { - if(!plugin.getHookManager().isFeatureEnabled(HookManager.HookFeature.CORPSES)) { - for(Stand stand : stands) { + if(!arena.getPlugin().getHookManager().isFeatureEnabled(HookManager.HookFeature.CORPSES)) { + for(Stand stand : arena.getStands()) { if(!stand.getHologram().isDeleted()) { stand.getHologram().delete(); } @@ -56,10 +59,10 @@ public void clearCorpses() { stand.getStand().remove(); } } - stands.clear(); + arena.getStands().clear(); return; } - for(Corpse corpse : corpses) { + for(Corpse corpse : arena.getCorpses()) { if(!corpse.getHologram().isDeleted()) { corpse.getHologram().delete(); } @@ -68,6 +71,6 @@ public void clearCorpses() { CorpseAPI.removeCorpse(corpse.getCorpseData()); } } - corpses.clear(); + arena.getCorpses().clear(); } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java b/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java index 475bc33c..5e83c103 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/managers/ScoreboardManager.java @@ -31,11 +31,12 @@ /** * @author Tigerpanzer_02 - *

Created at 19.12.2021 + *

Created at 19.12.2021 */ public class ScoreboardManager extends PluginScoreboardManager { private final PluginArena arena; + public ScoreboardManager(PluginArena arena) { super(arena); this.arena = arena; @@ -45,20 +46,20 @@ public ScoreboardManager(PluginArena arena) { public List formatScoreboard(User user) { EntryBuilder builder = new EntryBuilder(); List lines; - if (user.getArena().getArenaState() == ArenaState.FULL_GAME) { + if(user.getArena().getArenaState() == ArenaState.FULL_GAME) { lines = user.getArena() .getPlugin() .getLanguageManager() .getLanguageList("Scoreboard.Content.Starting"); - } else if (user.getArena().getArenaState() == ArenaState.IN_GAME) { + } else if(user.getArena().getArenaState() == ArenaState.IN_GAME) { lines = user.getArena() .getPlugin() .getLanguageManager() .getLanguageList( - "Scoreboard.Content." + user.getArena().getArenaState().getFormattedName() + (Role.isRole(Role.MURDERER, user.getPlayer()) ? "Murderer" : "")); - }else { + "Scoreboard.Content." + user.getArena().getArenaState().getFormattedName() + (Role.isRole(Role.MURDERER, user) ? "Murderer" : "")); + } else { lines = user.getArena() .getPlugin() diff --git a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java index 95a9848c..3ea5860c 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java +++ b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java @@ -22,7 +22,6 @@ import plugily.projects.minigamesbox.classic.arena.PluginArena; import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.old.arena.ArenaRegistry; /** * @author Plajer @@ -81,13 +80,13 @@ public static boolean isRole(Role role, User user) { * @return true if is playing it, false otherwise */ public static boolean isRole(Role role, User user, PluginArena arena) { - if (arena == null) + if(arena == null) return false; Arena pluginArena = (Arena) arena.getPlugin().getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return false; } -Player player = user.getPlayer(); + Player player = user.getPlayer(); switch(role) { case DETECTIVE: return pluginArena.isCharacterSet(Arena.CharacterType.DETECTIVE) && pluginArena.getDetectiveList().contains(player); @@ -124,7 +123,7 @@ public static boolean isAnyRole(User user) { * Checks whether player is playing a role or not * * @param player player to check - * @param arena the player's arena + * @param arena the player's arena * @return true if is playing one role, false otherwise */ public static boolean isAnyRole(User user, PluginArena arena) { diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlock.java b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlock.java index a0350241..6fa43719 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlock.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlock.java @@ -20,7 +20,6 @@ import org.bukkit.Location; -import plugily.projects.commonsbox.minecraft.hologram.ArmorStandHologram; import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; /** diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java index 5170e254..16656844 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/SpecialBlockEvents.java @@ -26,8 +26,21 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.inventory.ItemStack; +import plugily.projects.minigamesbox.classic.arena.ArenaState; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; +import plugily.projects.minigamesbox.classic.utils.helper.ItemUtils; +import plugily.projects.minigamesbox.classic.utils.misc.complement.ComplementAccessor; import plugily.projects.minigamesbox.classic.utils.version.ServerVersion; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; import plugily.projects.murdermystery.Main; +import plugily.projects.murdermystery.arena.Arena; +import plugily.projects.murdermystery.arena.special.mysterypotion.MysteryPotion; +import plugily.projects.murdermystery.arena.special.mysterypotion.MysteryPotionRegistry; +import plugily.projects.murdermystery.arena.special.pray.PrayerRegistry; +import plugily.projects.murdermystery.utils.ItemPosition; /** @@ -45,35 +58,35 @@ public SpecialBlockEvents(Main plugin) { } @EventHandler - public void onSpecialBlockClick(PlayerInteractEvent e) { - if (e.getClickedBlock() == null) + public void onSpecialBlockClick(PlayerInteractEvent event) { + if(event.getClickedBlock() == null) return; - if(ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_11_R1) && e.getHand() == org.bukkit.inventory.EquipmentSlot.OFF_HAND) { + if(ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_11_R1) && event.getHand() == org.bukkit.inventory.EquipmentSlot.OFF_HAND) { return; } - Arena arena = ArenaRegistry.getArena(e.getPlayer()); + Arena arena = plugin.getArenaRegistry().getArena(event.getPlayer()); if(arena == null) { return; } - if(arena.getArenaState() != ArenaState.IN_GAME || plugin.getUserManager().getUser(e.getPlayer()).isSpectator()) { + if(arena.getArenaState() != ArenaState.IN_GAME || plugin.getUserManager().getUser(event.getPlayer()).isSpectator()) { return; } for(SpecialBlock specialBlock : arena.getSpecialBlocks()) { - if(e.getClickedBlock().getType() == XMaterial.LEVER.parseMaterial() && Utils.getNearbyBlocks(specialBlock.getLocation(), 3).contains(e.getClickedBlock())) { - onPrayLeverClick(e); + if(event.getClickedBlock().getType() == XMaterial.LEVER.parseMaterial() && plugin.getBukkitHelper().getNearbyBlocks(specialBlock.getLocation(), 3).contains(event.getClickedBlock())) { + onPrayLeverClick(event); return; } - if(specialBlock.getLocation().getBlock().equals(e.getClickedBlock())) { + if(specialBlock.getLocation().getBlock().equals(event.getClickedBlock())) { switch(specialBlock.getSpecialBlockType()) { case MYSTERY_CAULDRON: - onCauldronClick(e); + onCauldronClick(event); return; case PRAISE_DEVELOPER: - onPrayerClick(e); + onPrayerClick(event); return; case HORSE_PURCHASE: case RAPID_TELEPORTATION: @@ -85,87 +98,86 @@ public void onSpecialBlockClick(PlayerInteractEvent e) { } } - private void onCauldronClick(PlayerInteractEvent e) { - if(e.getClickedBlock().getType() != Material.CAULDRON) { + private void onCauldronClick(PlayerInteractEvent event) { + if(event.getClickedBlock().getType() != Material.CAULDRON) { return; } - if(e.getPlayer().getInventory().getItem(/* same for all roles */ ItemPosition.POTION.getOtherRolesItemPosition()) != null) { - e.getPlayer().sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Messages.Special-Blocks.Cauldron-Drink-Potion", e.getPlayer())); + if(event.getPlayer().getInventory().getItem(/* same for all roles */ ItemPosition.POTION.getOtherRolesItemPosition()) != null) { + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_CAULDRON_POTION").asKey().player(event.getPlayer()).sendPlayer(); return; } - User user = plugin.getUserManager().getUser(e.getPlayer()); + User user = plugin.getUserManager().getUser(event.getPlayer()); - int localGold = user.getStat(StatsStorage.StatisticType.LOCAL_GOLD); + int localGold = user.getStatistic("LOCAL_GOLD"); if(localGold < 1) { - e.getPlayer().sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Messages.Special-Blocks.Not-Enough-Gold", e.getPlayer()).replace("%amount%", "1")); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_NOT_ENOUGH_GOLD").asKey().player(event.getPlayer()).integer(1).sendPlayer(); return; } - org.bukkit.Location blockLoc = e.getClickedBlock().getLocation(); + org.bukkit.Location blockLoc = event.getClickedBlock().getLocation(); - VersionUtils.sendParticles("FIREWORKS_SPARK", e.getPlayer(), blockLoc, 10); + VersionUtils.sendParticles("FIREWORKS_SPARK", event.getPlayer(), blockLoc, 10); Item item = blockLoc.getWorld().dropItemNaturally(blockLoc.clone().add(0, 1, 0), new ItemStack(Material.POTION, 1)); item.setPickupDelay(10000); Bukkit.getScheduler().runTaskLater(plugin, item::remove, 20); - user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, localGold - 1); - ItemPosition.addItem(e.getPlayer(), ItemPosition.GOLD_INGOTS, new ItemStack(Material.GOLD_INGOT, -1)); - ItemPosition.setItem(e.getPlayer(), ItemPosition.POTION, new ItemBuilder(XMaterial.POTION.parseItem()).name(MysteryPotionRegistry.getRandomPotion().getName()).build()); + user.adjustStatistic("LOCAL_GOLD", 1); + ItemPosition.addItem(user, ItemPosition.GOLD_INGOTS, new ItemStack(Material.GOLD_INGOT, -1)); + ItemPosition.setItem(user, ItemPosition.POTION, new ItemBuilder(XMaterial.POTION.parseItem()).name(MysteryPotionRegistry.getRandomPotion().getName()).build()); } - private void onPrayerClick(PlayerInteractEvent e) { - if(e.getClickedBlock().getType() != XMaterial.ENCHANTING_TABLE.parseMaterial()) { + private void onPrayerClick(PlayerInteractEvent event) { + if(event.getClickedBlock().getType() != XMaterial.ENCHANTING_TABLE.parseMaterial()) { return; } - e.setCancelled(true); + event.setCancelled(true); - User user = plugin.getUserManager().getUser(e.getPlayer()); - int localGold = user.getStat(StatsStorage.StatisticType.LOCAL_GOLD); + User user = plugin.getUserManager().getUser(event.getPlayer()); + int localGold = user.getStatistic("LOCAL_GOLD"); if(localGold < 1) { - e.getPlayer().sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Messages.Special-Blocks.Not-Enough-Gold", e.getPlayer()).replace("%amount%", "1")); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_NOT_ENOUGH_GOLD").asKey().player(event.getPlayer()).integer(1).sendPlayer(); return; } - - e.getPlayer().sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Messages.Special-Blocks.Prayed-Message", e.getPlayer())); - user.setStat(StatsStorage.StatisticType.LOCAL_PRAISES, user.getStat(StatsStorage.StatisticType.LOCAL_PRAISES) + 1); - VersionUtils.sendParticles("FIREWORKS_SPARK", e.getPlayer(), e.getClickedBlock().getLocation(), 10); - user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, localGold - 1); - ItemPosition.addItem(e.getPlayer(), ItemPosition.GOLD_INGOTS, new ItemStack(Material.GOLD_INGOT, -1)); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_CHAT").asKey().player(event.getPlayer()).sendPlayer(); + user.adjustStatistic("LOCAL_PRAISES", 1); + VersionUtils.sendParticles("FIREWORKS_SPARK", event.getPlayer(), event.getClickedBlock().getLocation(), 10); + user.adjustStatistic("LOCAL_GOLD", 1); + ItemPosition.addItem(user, ItemPosition.GOLD_INGOTS, new ItemStack(Material.GOLD_INGOT, -1)); } - private void onPrayLeverClick(PlayerInteractEvent e) { - User user = plugin.getUserManager().getUser(e.getPlayer()); - if(user.getStat(StatsStorage.StatisticType.LOCAL_PRAISES) < 1) { - e.getPlayer().sendMessage(chatManager.getPrefix() + chatManager.colorMessage("In-Game.Messages.Special-Blocks.No-Money-No-Pray", e.getPlayer())); + private void onPrayLeverClick(PlayerInteractEvent event) { + User user = plugin.getUserManager().getUser(event.getPlayer()); + if(user.getStatistic("LOCAL_PRAISES") < 1) { + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PAY").asKey().player(event.getPlayer()).sendPlayer(); return; } PrayerRegistry.applyRandomPrayer(user); - user.setStat(StatsStorage.StatisticType.LOCAL_PRAISES, 0); + user.setStatistic("LOCAL_PRAISES", 0); } @EventHandler - public void onMysteryPotionDrink(PlayerItemConsumeEvent e) { - ItemStack item = e.getItem(); + public void onMysteryPotionDrink(PlayerItemConsumeEvent event) { + ItemStack item = event.getItem(); if(item.getType() != XMaterial.POTION.parseMaterial() || !ItemUtils.isItemStackNamed(item)) { return; } - if(ArenaRegistry.getArena(e.getPlayer()) == null) { + if(plugin.getArenaRegistry().getArena(event.getPlayer()) == null) { return; } String itemDisplayName = ComplementAccessor.getComplement().getDisplayName(item.getItemMeta()); - + User user = plugin.getUserManager().getUser(event.getPlayer()); for(MysteryPotion potion : MysteryPotionRegistry.getMysteryPotions()) { if(itemDisplayName.equals(potion.getName())) { - e.setCancelled(true); - e.getPlayer().sendMessage(potion.getSubtitle()); - VersionUtils.sendTitles(e.getPlayer(), "", potion.getSubtitle(), 5, 40, 5); - ItemPosition.setItem(e.getPlayer(), ItemPosition.POTION, null); - e.getPlayer().addPotionEffect(potion.getPotionEffect()); + event.setCancelled(true); + event.getPlayer().sendMessage(potion.getSubtitle()); + VersionUtils.sendTitles(event.getPlayer(), "", potion.getSubtitle(), 5, 40, 5); + ItemPosition.setItem(user, ItemPosition.POTION, null); + event.getPlayer().addPotionEffect(potion.getPotionEffect()); return; } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java b/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java index 51c58d1d..b516c529 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java @@ -22,8 +22,9 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; -import plugily.projects.murdermystery.old.Main; +import plugily.projects.murdermystery.Main; import java.util.ArrayList; import java.util.List; @@ -39,7 +40,7 @@ public class MysteryPotionRegistry { private static final List mysteryPotions = new ArrayList<>(); public static void init(Main plugin) { - FileConfiguration config = ConfigUtils.getConfig(plugin, "specialblocks"); + FileConfiguration config = ConfigUtils.getConfig(plugin, "special_blocks"); org.bukkit.configuration.ConfigurationSection section = config.getConfigurationSection("Special-Blocks.Cauldron-Potions"); if(section == null) { return; @@ -48,7 +49,7 @@ public static void init(Main plugin) { for(String key : section.getKeys(false)) { PotionEffectType effectType = PotionEffectType.getByName(section.getString(key + ".Type", "").toUpperCase()); - if (effectType == null) { + if(effectType == null) { effectType = PotionEffectType.HEAL; } @@ -56,8 +57,8 @@ public static void init(Main plugin) { PotionEffect effect = new PotionEffect(effectType, section.getInt(key + ".Duration") * 20, section.getInt(key + ".Amplifier") - 1, false, false); - mysteryPotions.add(new MysteryPotion(plugin.getChatManager().colorRawMessage(section.getString(key + ".Name")), - plugin.getChatManager().colorRawMessage(section.getString(key + ".Subtitle")), effect)); + mysteryPotions.add(new MysteryPotion(new MessageBuilder(section.getString(key + ".Name")).build(), + new MessageBuilder(section.getString(key + ".Subtitle")).build(), effect)); } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java b/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java index 76c290ad..af2bdecb 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/pray/PrayerRegistry.java @@ -25,6 +25,8 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; +import plugily.projects.minigamesbox.classic.arena.ArenaState; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.minigamesbox.classic.utils.misc.MiscUtils; import plugily.projects.murdermystery.Main; @@ -53,16 +55,16 @@ private PrayerRegistry() { public static void init(Main plugin) { PrayerRegistry.plugin = plugin; //good prayers - prayers.add(new Prayer(Prayer.PrayerType.DETECTIVE_REVELATION, true, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Gifts.Detective-Revelation"))); - prayers.add(new Prayer(Prayer.PrayerType.GOLD_RUSH, true, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Gifts.Gold-Rush"))); - prayers.add(new Prayer(Prayer.PrayerType.SINGLE_COMPENSATION, true, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Gifts.Single-Compensation"))); - prayers.add(new Prayer(Prayer.PrayerType.BOW_TIME, true, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Gifts.Bow-Time"))); + prayers.add(new Prayer(Prayer.PrayerType.DETECTIVE_REVELATION, true, new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_DETECTIVE_REVELATION").asKey().build())); + prayers.add(new Prayer(Prayer.PrayerType.GOLD_RUSH, true, new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_GOLD_RUSH").asKey().build())); + prayers.add(new Prayer(Prayer.PrayerType.SINGLE_COMPENSATION, true, new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_SINGLE_COMPENSATION").asKey().build())); + prayers.add(new Prayer(Prayer.PrayerType.BOW_TIME, true, new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_BOW").asKey().build())); //bad prayers - prayers.add(new Prayer(Prayer.PrayerType.SLOWNESS_CURSE, false, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Curses.Slowness-Curse"))); - prayers.add(new Prayer(Prayer.PrayerType.BLINDNESS_CURSE, false, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Curses.Blindness-Curse"))); - prayers.add(new Prayer(Prayer.PrayerType.GOLD_BAN, false, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Curses.Gold-Ban"))); - prayers.add(new Prayer(Prayer.PrayerType.INCOMING_DEATH, false, chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Curses.Incoming-Death"))); + prayers.add(new Prayer(Prayer.PrayerType.SLOWNESS_CURSE, false, new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_SLOWNESS").asKey().build())); + prayers.add(new Prayer(Prayer.PrayerType.BLINDNESS_CURSE, false, new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_BLINDNESS").asKey().build())); + prayers.add(new Prayer(Prayer.PrayerType.GOLD_BAN, false, new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_GOLD").asKey().build())); + prayers.add(new Prayer(Prayer.PrayerType.INCOMING_DEATH, false, new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_DEATH").asKey().build())); } public static Prayer getRandomPray() { @@ -80,12 +82,12 @@ public static void applyRandomPrayer(User user) { Player player = user.getPlayer(); Arena arena = plugin.getArenaRegistry().getArena(player); - List prayMessage = plugin.getLanguageManager().getLanguageList("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praises.Message"); + List prayMessage = plugin.getLanguageManager().getLanguageList("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Heard"); - String feeling = chatManager.colorMessage("In-Game.Messages.Special-Blocks.Praises.Feelings." + (prayer.isGoodPray() ? "Blessed" : "Cursed"), player); + String feeling = plugin.getLanguageManager().getLanguageMessage("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Feeling." + (prayer.isGoodPray() ? "Blessed" : "Cursed")); int praySize = prayMessage.size(); - for (int a = 0; a < praySize; a++) { + for(int a = 0; a < praySize; a++) { prayMessage.set(a, prayMessage.get(a).replace("%feeling%", feeling).replace("%praise%", prayer.getPrayerDescription())); } @@ -94,25 +96,25 @@ public static void applyRandomPrayer(User user) { player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Integer.MAX_VALUE, 0, false, false)); break; case BOW_TIME: - if(!Role.isRole(Role.ANY_DETECTIVE, player, arena)) { - ItemPosition.addItem(player, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); + if(!Role.isRole(Role.ANY_DETECTIVE, user, arena)) { + ItemPosition.addItem(user, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); } - ItemPosition.setItem(player, ItemPosition.ARROWS, new ItemStack(Material.ARROW, plugin.getConfig().getInt("Detective-Prayer-Arrows", 2))); + ItemPosition.setItem(user, ItemPosition.ARROWS, new ItemStack(Material.ARROW, plugin.getConfig().getInt("Bow.Amount.Arrows.Prayer", 2))); break; case DETECTIVE_REVELATION: Player characterType = null; - if (arena != null) { + if(arena != null) { characterType = arena.getCharacter(Arena.CharacterType.DETECTIVE); - if (characterType == null) { + if(characterType == null) { characterType = arena.getCharacter(Arena.CharacterType.FAKE_DETECTIVE); } } String charName = characterType == null ? "????" : characterType.getName(); - for (int a = 0; a < praySize; a++) { + for(int a = 0; a < praySize; a++) { prayMessage.set(a, prayMessage.get(a).replace("%detective%", charName)); } @@ -136,8 +138,8 @@ public void run() { }.runTaskTimer(plugin, 20, 20); break; case SINGLE_COMPENSATION: - ItemPosition.addItem(player, ItemPosition.GOLD_INGOTS, new ItemStack(Material.GOLD_INGOT, 5)); - user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, user.getStat(StatsStorage.StatisticType.LOCAL_GOLD) + 5); + ItemPosition.addItem(user, ItemPosition.GOLD_INGOTS, new ItemStack(Material.GOLD_INGOT, 5)); + user.adjustStatistic("LOCAL_GOLD", 5); break; case SLOWNESS_CURSE: player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, Integer.MAX_VALUE, 0, false, false)); diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java index d9a0617d..da6c44ad 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java @@ -24,22 +24,20 @@ import org.bukkit.inventory.ItemStack; import plugily.projects.minigamesbox.classic.arena.PluginArena; import plugily.projects.minigamesbox.classic.arena.states.PluginInGameState; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.handlers.language.TitleBuilder; import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.minigamesbox.classic.utils.version.xseries.XSound; import plugily.projects.murdermystery.arena.Arena; +import plugily.projects.murdermystery.arena.ArenaUtils; import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.utils.ItemPosition; -import plugily.projects.thebridge.api.events.game.TBRoundStartEvent; -import plugily.projects.thebridge.arena.Arena; -import plugily.projects.thebridge.arena.ArenaUtils; -import plugily.projects.thebridge.arena.base.Base; import java.util.Random; /** * @author Plajer - *

Created at 03.06.2019 + *

Created at 03.06.2019 */ public class InGameState extends PluginInGameState { @@ -47,26 +45,24 @@ public class InGameState extends PluginInGameState { public void handleCall(PluginArena arena) { super.handleCall(arena); Arena pluginArena = (Arena) getPlugin().getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return; } - if (arena.getTimer() <= 0) { + if(arena.getTimer() <= 0) { getPlugin().getArenaManager().stopGame(false, arena); } int inGameLength = getPlugin().getConfig().getInt("Time-Manager.In-Game", 270); if(arena.getTimer() <= (inGameLength - 10) && arena.getTimer() > (inGameLength - 15)) { - String murdererGetSword = chatManager.colorMessage("In-Game.Messages.Murderer-Get-Sword") - .replace("%time%", Integer.toString(arena.getTimer() - (inGameLength - 15))); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SWORD_SOON").asKey().integer(arena.getTimer() - (inGameLength - 15)).arena(pluginArena).sendArena(); for(Player p : arena.getPlayers()) { - p.sendMessage(murdererGetSword); XSound.UI_BUTTON_CLICK.play(p.getLocation(), 1, 1); } if(arena.getTimer() == (inGameLength - 14)) { - if(pluginArena.getMurdererList().isEmpty()) ArenaManager.stopGame(false, pluginArena); + if(pluginArena.getMurdererList().isEmpty()) getPlugin().getArenaManager().stopGame(false, pluginArena); for(Player p : pluginArena.getMurdererList()) { User murderer = getPlugin().getUserManager().getUser(p); @@ -75,7 +71,7 @@ public void handleCall(PluginArena arena) { continue; p.getInventory().setHeldItemSlot(0); - ItemPosition.setItem(p, ItemPosition.MURDERER_SWORD, plugin.getConfigPreferences().getMurdererSword()); + ItemPosition.setItem(murderer, ItemPosition.MURDERER_SWORD, pluginArena.getPlugin().getSwordSkinManager().getRandomSwordSkin(p)); } } } @@ -84,44 +80,34 @@ public void handleCall(PluginArena arena) { if(arena.getTimer() % 30 == 0) { new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_TIME_LEFT").arena(pluginArena).sendArena(); for(Player p : arena.getPlayersLeft()) { - if(Role.isRole(Role.INNOCENT, p, pluginArena)) { - ArenaUtils.addScore(getPlugin().getUserManager().getUser(p), ArenaUtils.ScoreAction.SURVIVE_TIME, 0); + User user = getPlugin().getUserManager().getUser(p); + if(Role.isRole(Role.INNOCENT, user, pluginArena)) { + ArenaUtils.addScore(user, ArenaUtils.ScoreAction.SURVIVE_TIME, 0); } } } - if (arena.getTimer() <= 30 + if(arena.getTimer() <= 30 || arena.getPlayersLeft().size() == pluginArena.aliveMurderer() + 1) { - //todo locator config option - if(getPlugin().getConfigPreferences().getOption("INNOCENT_LOCATOR")) { + if(getPlugin().getConfigPreferences().getOption("MURDERER_LOCATOR")) { ArenaUtils.updateInnocentLocator(pluginArena); } } // no players - stop game - if (pluginArena.getPlayersLeft().isEmpty()) { + if(pluginArena.getPlayersLeft().isEmpty()) { getPlugin().getArenaManager().stopGame(false, pluginArena); } else { // winner check - if (arena.getPlayersLeft().size() == pluginArena.aliveMurderer()) { - //todo placeholder check - for(Player player : arena.getPlayers()) { - - if(pluginArena.getMurdererList().contains(player)) { - - } - } - + if(arena.getPlayersLeft().size() == pluginArena.aliveMurderer()) { getPlugin().getArenaManager().stopGame(false, pluginArena); // murderer speed add - // todo config otpion - } else if (getPlugin().getConfigPreferences().getOption("MURDERER_SPEED") - && arena.getPlayersLeft().size() == pluginArena.aliveMurderer() + 1) { - int multiplier = getPlugin().getConfig().getInt("Speed-Effect-Murderer.Speed", 3); - - if (multiplier > 1 && multiplier <= 10) { - for (Player player : pluginArena.getMurdererList()) { - if (pluginArena.isMurderAlive(player)) { + } else if(arena.getPlayersLeft().size() == pluginArena.aliveMurderer() + 1) { + int multiplier = getPlugin().getConfig().getInt("Murderer.Speed", 3); + + if(multiplier > 1 && multiplier <= 10) { + for(Player player : pluginArena.getMurdererList()) { + if(pluginArena.isMurderAlive(player)) { // no potion because it adds particles which can be identified player.setWalkSpeed(0.1f * multiplier); } @@ -130,10 +116,10 @@ public void handleCall(PluginArena arena) { } //don't spawn it every time if(pluginArena.getSpawnGoldTimer() == pluginArena.getSpawnGoldTime()) { - spawnSomeGold(); + spawnSomeGold(pluginArena); pluginArena.setSpawnGoldTimer(0); } else { - pluginArena.setSpawnGoldTimer(pluginArena.getSpawnGoldTimer()+1); + pluginArena.setSpawnGoldTimer(pluginArena.getSpawnGoldTimer() + 1); } } @@ -145,16 +131,14 @@ private void spawnSomeGold(Arena arena) { if(spawnPointsSize == 0) { return; } -//todo config option //may users want to disable it and want much gold on there map xD - if(!getPlugin().getConfigPreferences().getOption("DISABLE_GOLD_LIMITER")) { + if(!getPlugin().getConfigPreferences().getOption("GOLD_LIMITER")) { //do not exceed amount of gold per spawn if(arena.getGoldSpawned().size() >= spawnPointsSize) { return; } } -//todo config option - if(getPlugin().getConfigPreferences().getOption("SPAWN_GOLD_EVERY_SPAWNER_MODE")) { + if(getPlugin().getConfigPreferences().getOption("GOLD_SPAWNER_MODE_ALL")) { for(Location location : arena.getPlayerSpawnPoints()) { arena.getGoldSpawned().add(location.getWorld().dropItem(location, new ItemStack(Material.GOLD_INGOT, 1))); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/RestartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/RestartingState.java index efaac578..eb3760af 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/RestartingState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/RestartingState.java @@ -21,7 +21,6 @@ import plugily.projects.minigamesbox.classic.arena.PluginArena; import plugily.projects.minigamesbox.classic.arena.states.PluginRestartingState; import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.thebridge.arena.Arena; /** * @author Plajer diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java index f203ec73..520c857a 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java @@ -45,7 +45,7 @@ /** * @author Plajer - *

Created at 03.06.2019 + *

Created at 03.06.2019 */ public class StartingState extends PluginStartingState { @@ -56,21 +56,21 @@ public class StartingState extends PluginStartingState { public void handleCall(PluginArena arena) { super.handleCall(arena); Arena pluginArena = (Arena) getPlugin().getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return; } int totalMurderer = 0; int totalDetective = 0; - for (Player p : arena.getPlayers()) { + for(Player p : arena.getPlayers()) { User user = arena.getPlugin().getUserManager().getUser(p); totalMurderer += user.getStatistic("CONTRIBUTION_MURDERER"); totalDetective += user.getStatistic("CONTRIBUTION_DETECTIVE"); } - if (!pluginArena.isHideChances()) { - for (Player player : arena.getPlayers()) { + if(!pluginArena.isHideChances()) { + for(Player player : arena.getPlayers()) { String message = new MessageBuilder("IN_GAME_MESSAGES_ARENA_ROLE_CHANCES_ACTION_BAR") .asKey() @@ -81,10 +81,10 @@ public void handleCall(PluginArena arena) { } } - if (arena.getTimer() == 0 || arena.isForceStart()) { + if(arena.getTimer() == 0 || arena.isForceStart()) { Map murdererChances = new HashMap<>(); Map detectiveChances = new HashMap<>(); - for (Player player : arena.getPlayers()) { + for(Player player : arena.getPlayers()) { User user = arena.getPlugin().getUserManager().getUser(player); /* //reset local variables to be 100% sure @@ -114,7 +114,7 @@ public void handleCall(PluginArena arena) { addRole(pluginArena, Role.MURDERER, murdererChances, playersToSet); addRole(pluginArena, Role.DETECTIVE, detectiveChances, playersToSet); - for (Player player : playersToSet) { + for(Player player : playersToSet) { new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_INNOCENT") .asKey() .player(player) @@ -155,8 +155,8 @@ private void addRole( Object[] sortedChancesUser = sortedChances.keySet().toArray(); int amount = role == Role.MURDERER ? maxmurderer : maxdetectives; - for (int i = 0; i < amount; i++) { - if (i >= sortedChancesUser.length) break; + for(int i = 0; i < amount; i++) { + if(i >= sortedChancesUser.length) break; User user = (User) sortedChancesUser[i]; Player userPlayer = user.getPlayer(); arena.setCharacter(Arena.CharacterType.valueOf(roleName), userPlayer); @@ -167,17 +167,17 @@ private void addRole( .arena(arena) .player(user.getPlayer()) .sendPlayer(); - if (role == Role.MURDERER) { + if(role == Role.MURDERER) { arena.getMurdererList().add(userPlayer); - } else if (role == Role.DETECTIVE) { + } else if(role == Role.DETECTIVE) { arena.getDetectiveList().add(userPlayer); userPlayer.getInventory().setHeldItemSlot(0); ItemPosition.setItem(user, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); ItemPosition.setItem( - userPlayer, + user, ItemPosition.INFINITE_ARROWS, new ItemStack( - Material.ARROW, plugin.getConfig().getInt("Detective-Default-Arrows", 3))); + Material.ARROW, getPlugin().getConfig().getInt("Bow.Amount.Arrows.Detective", 3))); } } } @@ -195,15 +195,15 @@ private void getMaxRolesToSet(Arena arena) { playersSize, arena.getArenaOption("DETECTIVE_DIVIDER"), arena.getArenaOption("MURDERER_DIVIDER")); - if (arena.getArenaOption("MURDERER_DIVIDER") > 1 + if(arena.getArenaOption("MURDERER_DIVIDER") > 1 && playersSize > arena.getArenaOption("MURDERER_DIVIDER")) { maxmurderer = (playersSize / arena.getArenaOption("MURDERER_DIVIDER")); } - if (arena.getArenaOption("DETECTIVE_DIVIDER") > 1 + if(arena.getArenaOption("DETECTIVE_DIVIDER") > 1 && playersSize > arena.getArenaOption("DETECTIVE_DIVIDER")) { maxdetectives = (playersSize / arena.getArenaOption("DETECTIVE_DIVIDER")); } - if (playersSize - (maxmurderer + maxdetectives) < 1) { + if(playersSize - (maxmurderer + maxdetectives) < 1) { arena .getPlugin() .getDebugger() @@ -211,9 +211,9 @@ private void getMaxRolesToSet(Arena arena) { "{0} Murderers and detectives amount was reduced because there are not enough players", arena.getId()); // Make sure to have one innocent! - if (maxdetectives > 1) { + if(maxdetectives > 1) { maxdetectives--; - } else if (maxmurderer > 1) { + } else if(maxmurderer > 1) { maxmurderer--; } } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java index 67d654d2..429f87b6 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java @@ -18,7 +18,6 @@ package plugily.projects.murdermystery.commands.arguments.admin.arena; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; @@ -29,6 +28,7 @@ import plugily.projects.minigamesbox.classic.commands.arguments.data.CommandArgument; import plugily.projects.minigamesbox.classic.commands.arguments.data.LabelData; import plugily.projects.minigamesbox.classic.commands.arguments.data.LabeledCommandArgument; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; import plugily.projects.minigamesbox.classic.utils.serialization.LocationSerializer; import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; @@ -41,7 +41,7 @@ /** * @author Tigerpanzer_02 - *

Created at 22.10.2020 + *

Created at 22.10.2020 */ public class SpecialBlockRemoverArgument { public SpecialBlockRemoverArgument(ArgumentsRegistry registry) { @@ -60,34 +60,34 @@ public void execute(CommandSender sender, String[] args) { // no need for check as argument is only for players Player player = (Player) sender; Block targetBlock = player.getTargetBlock(null, 7); - if (targetBlock.getType() == Material.CAULDRON + if(targetBlock.getType() == Material.CAULDRON || targetBlock.getType() == XMaterial.ENCHANTING_TABLE.parseMaterial()) { - for (PluginArena arena : registry.getPlugin().getArenaRegistry().getArenas()) { + for(PluginArena arena : registry.getPlugin().getArenaRegistry().getArenas()) { Arena pluginArena = (Arena) registry.getPlugin().getArenaRegistry().getArena(player); - if (arena == null) { + if(arena == null) { return; } // do not check arenas that could not be the case - if (pluginArena.getSpecialBlocks().isEmpty()) { + if(pluginArena.getSpecialBlocks().isEmpty()) { continue; } - if (pluginArena.getPlayerSpawnPoints().get(0).getWorld() != player.getWorld()) { + if(pluginArena.getPlayerSpawnPoints().get(0).getWorld() != player.getWorld()) { continue; } // get all special blocks - for (SpecialBlock specialBlock : new ArrayList<>(pluginArena.getSpecialBlocks())) { + for(SpecialBlock specialBlock : new ArrayList<>(pluginArena.getSpecialBlocks())) { // check if targetBlock is specialblock - if (specialBlock.getLocation().getBlock().equals(targetBlock)) { + if(specialBlock.getLocation().getBlock().equals(targetBlock)) { // get special blocks from config FileConfiguration config = ConfigUtils.getConfig(registry.getPlugin(), "arenas"); // remove special block from arena pluginArena.getSpecialBlocks().remove(specialBlock); // remove hologram - if (specialBlock.getArmorStandHologram() != null) { + if(specialBlock.getArmorStandHologram() != null) { specialBlock.getArmorStandHologram().delete(); } // remove special block from arena file @@ -103,19 +103,16 @@ public void execute(CommandSender sender, String[] args) { config.set("instances." + arena.getId() + path, specialBlocksType); // save arena config after removing special block ConfigUtils.saveConfig(registry.getPlugin(), config, "arenas"); - - player.sendMessage( - ChatColor.RED - + "Removed special block at loc " - + serializedLoc - + " from arena " - + arena.getId()); + new MessageBuilder("&cRemoved special block at loc " + + serializedLoc + + " from arena " + + arena.getId()).player(player).sendPlayer(); return; } } } } - player.sendMessage(ChatColor.RED + "Please target an special block to continue!"); + new MessageBuilder("&cPlease target an special block to continue!").player(player).sendPlayer(); } }); } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/CreateArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/CreateArgument.java deleted file mode 100644 index 1b10cca7..00000000 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/CreateArgument.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.commands.arguments.game; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; - -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.serialization.LocationSerializer; -import plugily.projects.murdermystery.old.arena.ArenaRegistry; -import plugily.projects.murdermystery.arena.special.SpecialBlock; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.arguments.data.CommandArgument; -import plugily.projects.murdermystery.arguments.data.LabelData; -import plugily.projects.murdermystery.arguments.data.LabeledCommandArgument; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Plajer - *

- * Created at 18.05.2019 - */ -public class CreateArgument { - - private final ArgumentsRegistry registry; - - public CreateArgument(ArgumentsRegistry registry, ChatManager chatManager) { - this.registry = registry; - registry.mapArgument("murdermystery", new LabeledCommandArgument("create", "murdermystery.admin.create", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mm create &6", "/mm create ", "&7Create new arena\n&6Permission: &7murdermystery.admin.create")) { - @Override - public void execute(CommandSender sender, String[] args) { - if(args.length == 1) { - sender.sendMessage(chatManager.colorMessage("Commands.Type-Arena-Name")); - return; - } - for(Arena arena : ArenaRegistry.getArenas()) { - if(arena.getId().equalsIgnoreCase(args[1])) { - sender.sendMessage(ChatColor.DARK_RED + "Arena with that ID already exists!"); - sender.sendMessage(ChatColor.DARK_RED + "Usage: /mm create "); - return; - } - } - if(ConfigUtils.getConfig(registry.getPlugin(), "arenas").contains("instances." + args[1])) { - sender.sendMessage(ChatColor.DARK_RED + "Instance/Arena already exists! Use another ID or delete it first!"); - } else { - createInstanceInConfig(args[1], ((Player) sender).getWorld().getName()); - sender.sendMessage(ChatColor.BOLD + "------------------------------------------"); - sender.sendMessage(ChatColor.YELLOW + " Instance " + args[1] + " created!"); - sender.sendMessage(""); - sender.sendMessage(ChatColor.GREEN + "Edit this arena via " + ChatColor.GOLD + "/mm " + args[1] + " edit" + ChatColor.GREEN + "!"); - sender.sendMessage(ChatColor.GOLD + "Don't know where to start? Check out tutorial video:"); - sender.sendMessage(ChatColor.GOLD + SetupInventory.VIDEO_LINK); - sender.sendMessage(ChatColor.BOLD + "------------------------------------------- "); - } - } - }); - } - - private void createInstanceInConfig(String id, String worldName) { - String path = "instances." + id + "."; - FileConfiguration config = ConfigUtils.getConfig(registry.getPlugin(), "arenas"); - Location worldSpawn = Bukkit.getServer().getWorlds().get(0).getSpawnLocation(); - LocationSerializer.saveLoc(registry.getPlugin(), config, "arenas", path + "lobbylocation", worldSpawn); - LocationSerializer.saveLoc(registry.getPlugin(), config, "arenas", path + "Startlocation", worldSpawn); - LocationSerializer.saveLoc(registry.getPlugin(), config, "arenas", path + "Endlocation", worldSpawn); - config.set(path + "playerspawnpoints", new ArrayList<>()); - config.set(path + "goldspawnpoints", new ArrayList<>()); - config.set(path + "minimumplayers", 2); - config.set(path + "maximumplayers", 10); - config.set(path + "playerpermurderer", 5); - config.set(path + "playerperdetective", 7); - config.set(path + "mapname", id); - config.set(path + "signs", new ArrayList<>()); - config.set(path + "isdone", false); - config.set(path + "world", worldName); - config.set(path + "mystery-cauldrons", new ArrayList<>()); - config.set(path + "confessionals", new ArrayList<>()); - config.set(path + "spawngoldtime", 5); - config.set(path + "hidechances", false); - ConfigUtils.saveConfig(registry.getPlugin(), config, "arenas"); - - Arena arena = new Arena(id); - - List playerSpawnPoints = new ArrayList<>(); - for(String loc : config.getStringList(path + "playerspawnpoints")) { - playerSpawnPoints.add(LocationSerializer.getLocation(loc)); - } - arena.setPlayerSpawnPoints(playerSpawnPoints); - List goldSpawnPoints = new ArrayList<>(); - for(String loc : config.getStringList(path + "goldspawnpoints")) { - goldSpawnPoints.add(LocationSerializer.getLocation(loc)); - } - arena.setGoldSpawnPoints(goldSpawnPoints); - - List specialBlocks = new ArrayList<>(); - if(config.isSet("instances." + arena.getId() + ".mystery-cauldrons")) { - for(String loc : config.getStringList("instances." + arena.getId() + ".mystery-cauldrons")) { - specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.MYSTERY_CAULDRON)); - } - } - specialBlocks.forEach(arena::loadSpecialBlock); - - arena.setMinimumPlayers(config.getInt(path + "minimumplayers")); - arena.setMaximumPlayers(config.getInt(path + "maximumplayers")); - arena.setSpawnGoldTime(config.getInt(path + "spawngoldtime", 5)); - arena.setHideChances(config.getBoolean(path + "hidechances", false)); - arena.setDetectives(config.getInt(path + "playerperdetective")); - arena.setMurderers(config.getInt(path + "playerpermurderer")); - arena.setMapName(config.getString(path + "mapname")); - arena.setLobbyLocation(LocationSerializer.getLocation(config.getString(path + "lobbylocation"))); - arena.setEndLocation(LocationSerializer.getLocation(config.getString(path + "Endlocation"))); - arena.setReady(false); - - ArenaRegistry.registerArena(arena); - } - -} diff --git a/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java index ff604b3a..1417bdfe 100644 --- a/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java +++ b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java @@ -44,7 +44,7 @@ /** * @author Plajer - *

Created at 05.08.2018 + *

Created at 05.08.2018 */ public class PluginEvents implements Listener { @@ -57,41 +57,41 @@ public PluginEvents(Main plugin) { @EventHandler public void onSwordThrow(PlayerInteractEvent event) { - if (event.getAction() == Action.LEFT_CLICK_AIR + if(event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.PHYSICAL) { return; } Player attacker = event.getPlayer(); Arena arena = (Arena) plugin.getArenaRegistry().getArena(attacker); - if (arena == null) { + if(arena == null) { return; } User attackerUser = plugin.getUserManager().getUser(attacker); - if (!Role.isRole(Role.MURDERER, attackerUser, arena)) { + if(!Role.isRole(Role.MURDERER, attackerUser, arena)) { return; } - if (VersionUtils.getItemInHand(attacker).getType() - != plugin.getConfigPreferences().getMurdererSword().getType()) { + if(VersionUtils.getItemInHand(attacker).getType() + != plugin.getSwordSkinManager().getMurdererSword(attacker).getType()) { return; } - if (attackerUser.getCooldown("sword_shoot") > 0) { + if(attackerUser.getCooldown("sword_shoot") > 0) { return; } - int swordFlyCooldown = plugin.getConfig().getInt("Murderer-Sword-Fly-Cooldown", 5); + int swordFlyCooldown = plugin.getConfig().getInt("Sword.Cooldown.Fly", 5); attackerUser.setCooldown("sword_shoot", swordFlyCooldown); - if (ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_10_R1)) { + if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_10_R1)) { attackerUser.setCooldown( - "sword_attack", (plugin.getConfig().getInt("Murderer-Sword-Attack-Cooldown", 1))); + "sword_attack", (plugin.getConfig().getInt("Sword.Cooldown.Attack", 1))); } else { attacker.setCooldown( - plugin.getConfigPreferences().getMurdererSword().getType(), - 20 * (plugin.getConfig().getInt("Murderer-Sword-Attack-Cooldown", 1))); + plugin.getSwordSkinManager().getMurdererSword(attacker).getType(), + 20 * (plugin.getConfig().getInt("Sword.Cooldown.Attack", 1))); } createFlyingSword(arena, attacker, attackerUser); @@ -101,7 +101,7 @@ public void onSwordThrow(PlayerInteractEvent event) { private void createFlyingSword(Arena arena, Player attacker, User attackerUser) { Location loc = attacker.getLocation(); Vector vec = loc.getDirection(); - vec.normalize().multiply(plugin.getConfig().getDouble("Murderer-Sword-Speed", 0.65)); + vec.normalize().multiply(plugin.getConfig().getDouble("Sword.Speed", 0.65)); Location standStart = plugin .getBukkitHelper() @@ -112,12 +112,12 @@ private void createFlyingSword(Arena arena, Player attacker, User attackerUser) ArmorStand stand = (ArmorStand) attacker.getWorld().spawnEntity(standStart, EntityType.ARMOR_STAND); stand.setVisible(false); - if (ServerVersion.Version.isCurrentHigher(ServerVersion.Version.v1_8_R3)) { + if(ServerVersion.Version.isCurrentHigher(ServerVersion.Version.v1_8_R3)) { stand.setInvulnerable(true); stand.setSilent(true); } - VersionUtils.setItemInHand(stand, plugin.getConfigPreferences().getMurdererSword()); + VersionUtils.setItemInHand(stand, plugin.getSwordSkinManager().getMurdererSword(attacker)); stand.setRightArmPose( new EulerAngle( @@ -127,7 +127,7 @@ private void createFlyingSword(Arena arena, Player attacker, User attackerUser) stand.setGravity(false); stand.setRemoveWhenFarAway(true); - if (ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_8_R3)) { + if(ServerVersion.Version.isCurrentEqualOrHigher(ServerVersion.Version.v1_8_R3)) { stand.setMarker(true); } @@ -141,8 +141,8 @@ private void createFlyingSword(Arena arena, Player attacker, User attackerUser) plugin.getBukkitHelper().rotateAroundAxisY( plugin.getBukkitHelper().rotateAroundAxisX(new Vector(0.0D, 0.0D, 1.0D), loc.getPitch()), loc.getYaw())); - int maxRange = plugin.getConfig().getInt("Murderer-Sword-Fly-Range", 20); - double maxHitRange = plugin.getConfig().getDouble("Murderer-Sword-Fly-Hit-Range", 0.5); + int maxRange = plugin.getConfig().getInt("Sword.Fly.Range", 20); + double maxHitRange = plugin.getConfig().getDouble("Sword.Fly.Radius", 0.5); new BukkitRunnable() { @Override public void run() { @@ -153,13 +153,13 @@ public void run() { .getNearbyEntities(initialise, maxHitRange, maxHitRange, maxHitRange) .forEach( entity -> { - if (entity instanceof Player) { + if(entity instanceof Player) { Player victim = (Player) entity; Arena arena = (Arena) plugin.getArenaRegistry().getArena(victim); - if (arena == null) { + if(arena == null) { return; } - if (!plugin.getUserManager().getUser(victim).isSpectator() + if(!plugin.getUserManager().getUser(victim).isSpectator() && !victim.equals(attacker)) { killBySword(arena, attackerUser, victim); cancel(); @@ -167,7 +167,7 @@ public void run() { } } }); - if (loc.distance(initialise) > maxRange || initialise.getBlock().getType().isSolid()) { + if(loc.distance(initialise) > maxRange || initialise.getBlock().getType().isSolid()) { cancel(); stand.remove(); } @@ -177,13 +177,13 @@ public void run() { private void killBySword(Arena arena, User attackerUser, Player victim) { Arena victimArena = (Arena) plugin.getArenaRegistry().getArena(victim); - if (arena == null) { + if(arena == null) { return; } User user = plugin.getUserManager().getUser(victim); // check if victim is murderer - if (Role.isRole(Role.MURDERER, user, victimArena)) { + if(Role.isRole(Role.MURDERER, user, victimArena)) { return; } XSound.ENTITY_PLAYER_DEATH.play(victim.getLocation(), 50, 1); @@ -191,8 +191,8 @@ private void killBySword(Arena arena, User attackerUser, Player victim) { attackerUser.adjustStatistic("LOCAL_KILLS", 1); attackerUser.adjustStatistic("KILLS", 1); ArenaUtils.addScore(attackerUser, ArenaUtils.ScoreAction.KILL_PLAYER, 0); - if (Role.isRole(Role.ANY_DETECTIVE, user, victimArena) && arena.lastAliveDetective()) { - if (Role.isRole(Role.FAKE_DETECTIVE, user, victimArena)) { + if(Role.isRole(Role.ANY_DETECTIVE, user, victimArena) && arena.lastAliveDetective()) { + if(Role.isRole(Role.FAKE_DETECTIVE, user, victimArena)) { arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); } ArenaUtils.dropBowAndAnnounce(arena, victim); @@ -203,11 +203,11 @@ private void killBySword(Arena arena, User attackerUser, Player victim) { // highest priority to fully protect our game public void onBlockBreakEvent(BlockBreakEvent event) { Arena arena = (Arena) plugin.getArenaRegistry().getArena(event.getPlayer()); - if (arena == null) { + if(arena == null) { event.setCancelled(true); return; } - if (event.getBlock().getType() != XMaterial.ARMOR_STAND.parseMaterial()) { + if(event.getBlock().getType() != XMaterial.ARMOR_STAND.parseMaterial()) { return; } @@ -218,7 +218,7 @@ public void onBlockBreakEvent(BlockBreakEvent event) { armorStand -> { boolean isSameType = armorStand.getLocation().getBlock().getType() == event.getBlock().getType(); - if (isSameType) { + if(isSameType) { armorStand.remove(); armorStand.setCustomNameVisible(false); } @@ -230,7 +230,7 @@ public void onBlockBreakEvent(BlockBreakEvent event) { // highest priority to fully protect our game public void onBuild(BlockPlaceEvent event) { Arena arena = (Arena) plugin.getArenaRegistry().getArena(event.getPlayer()); - if (arena == null) { + if(arena == null) { return; } event.setCancelled(true); diff --git a/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java b/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java index 27157827..c1123b60 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/CorpseHandler.java @@ -37,6 +37,7 @@ import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; import plugily.projects.murdermystery.Main; +import plugily.projects.murdermystery.api.events.game.MurderGameCorpseSpawnEvent; import plugily.projects.murdermystery.arena.Arena; import plugily.projects.murdermystery.HookManager; import plugily.projects.murdermystery.arena.corpse.Corpse; @@ -73,11 +74,16 @@ public void registerLastWord(String permission, String lastWord) { } @SuppressWarnings("deprecation") - public void spawnCorpse(Player p, Arena arena) { + public void spawnCorpse(Player player, Arena arena) { + MurderGameCorpseSpawnEvent murderGameCorpseSpawnEvent = new MurderGameCorpseSpawnEvent(arena, player.getPlayer(), player.getLocation()); + Bukkit.getPluginManager().callEvent(murderGameCorpseSpawnEvent); + if(murderGameCorpseSpawnEvent.isCancelled()) { + return; + } if(!plugin.getHookManager().isFeatureEnabled(HookManager.HookFeature.CORPSES)) { - ArmorStand stand = p.getLocation().getWorld().spawn(p.getLocation().add(0.0D, -1.25D, 0.0D), ArmorStand.class); + ArmorStand stand = player.getLocation().getWorld().spawn(player.getLocation().add(0.0D, -1.25D, 0.0D), ArmorStand.class); SkullMeta meta = (SkullMeta) head.getItemMeta(); - meta = VersionUtils.setPlayerHead(p, meta); + meta = VersionUtils.setPlayerHead(player, meta); head.setItemMeta(meta); stand.setVisible(false); @@ -88,10 +94,10 @@ public void spawnCorpse(Player p, Arena arena) { } stand.setGravity(false); stand.setCustomNameVisible(false); - stand.setHeadPose(new EulerAngle(Math.toRadians(p.getLocation().getX()), Math.toRadians(p.getLocation().getPitch()), Math.toRadians(p.getLocation().getZ()))); + stand.setHeadPose(new EulerAngle(Math.toRadians(player.getLocation().getX()), Math.toRadians(player.getLocation().getPitch()), Math.toRadians(player.getLocation().getZ()))); plugin.getHologramManager().getArmorStands().add(stand); - ArmorStandHologram hologram = getLastWordsHologram(p); + ArmorStandHologram hologram = getLastWordsHologram(player); arena.addHead(new Stand(hologram, stand)); Bukkit.getScheduler().runTaskLater(plugin, () -> { hologram.delete(); @@ -100,10 +106,10 @@ public void spawnCorpse(Player p, Arena arena) { }, 15 * 20); return; } - ArmorStandHologram hologram = getLastWordsHologram(p); - Corpses.CorpseData corpse = CorpseAPI.spawnCorpse(p, p.getLocation()); + ArmorStandHologram hologram = getLastWordsHologram(player); + Corpses.CorpseData corpse = CorpseAPI.spawnCorpse(player, player.getLocation()); lastSpawnedCorpse = corpse; - //spawns 2 corpses - Corpses.CorpseData corpse = lastSpawnedCorpse = CorpseAPI.spawnCorpse(p, p.getLocation()); + //spawns 2 corpses - Corpses.CorpseData corpse = lastSpawnedCorpse = CorpseAPI.spawnCorpse(player, player.getLocation()); arena.addCorpse(new Corpse(hologram, corpse)); Bukkit.getScheduler().runTaskLater(plugin, () -> { hologram.delete(); diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java index deed3764..e6407d79 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java @@ -237,7 +237,7 @@ public void addExternalItems(NormalFastInv inv) { .name(new MessageBuilder("&e&lAdd Mystery Cauldron").build()) .lore(ChatColor.GRAY + "Target a cauldron and add it to the game") .lore(ChatColor.GRAY + "it will cost 1 gold per potion!") - .lore(ChatColor.GRAY + "Configure cauldron potions in specialblocks.yml file!") + .lore(ChatColor.GRAY + "Configure cauldron potions in special_blocks.yml file!") .build(), e -> { e.getWhoClicked().closeInventory(); Block targetBlock = e.getWhoClicked().getTargetBlock(null, 7); diff --git a/src/main/java/plugily/projects/murdermystery/old/Main.java b/src/main/java/plugily/projects/murdermystery/old/Main.java deleted file mode 100644 index f595da7e..00000000 --- a/src/main/java/plugily/projects/murdermystery/old/Main.java +++ /dev/null @@ -1,357 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (C) 2020 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.old; - -import me.tigerhix.lib.scoreboard.ScoreboardLib; -import org.bstats.bukkit.Metrics; -import org.bukkit.GameMode; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; - -import plugily.projects.commonsbox.database.MysqlDatabase; -import plugily.projects.commonsbox.minecraft.compat.ServerVersion; -import plugily.projects.commonsbox.minecraft.compat.events.EventsInitializer; -import plugily.projects.commonsbox.minecraft.configuration.ConfigUtils; -import plugily.projects.commonsbox.minecraft.hologram.HologramManager; -import plugily.projects.commonsbox.minecraft.misc.MiscUtils; -import plugily.projects.commonsbox.minecraft.serialization.InventorySerializer; -import plugily.projects.murdermystery.HookManager; -import plugily.projects.murdermystery.old.api.StatsStorage; -import plugily.projects.murdermystery.old.arena.ArenaRegistry; -import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; -import plugily.projects.murdermystery.events.Events; -import plugily.projects.murdermystery.events.spectator.SpectatorItemEvents; -import plugily.projects.murdermystery.handlers.CorpseHandler; -import plugily.projects.murdermystery.handlers.items.SpecialItemManager; -import plugily.projects.murdermystery.handlers.language.LanguageManager; -import plugily.projects.murdermystery.handlers.lastwords.LastWordsManager; -import plugily.projects.murdermystery.handlers.party.PartyHandler; -import plugily.projects.murdermystery.handlers.party.PartySupportInitializer; -import plugily.projects.murdermystery.handlers.rewards.RewardsFactory; -import plugily.projects.murdermystery.handlers.sign.SignManager; -import plugily.projects.murdermystery.handlers.trails.TrailsManager; -import plugily.projects.murdermystery.old.user.UserManager; -import plugily.projects.murdermystery.old.user.data.MysqlManager; -import plugily.projects.murdermystery.utils.services.ServiceRegistry; - -import java.io.File; -import java.util.Arrays; -import java.util.logging.Level; - -/** - * @author Plajer - *

- * Created at 03.08.2018 - */ -public class Main extends JavaPlugin { - - private ExceptionLogHandler exceptionLogHandler; - private boolean forceDisable = false; - private BungeeManager bungeeManager; - private RewardsFactory rewardsHandler; - private MysqlDatabase database; - private SignManager signManager; - private CorpseHandler corpseHandler; - private PartyHandler partyHandler; - private ConfigPreferences configPreferences; - private ArgumentsRegistry argumentsRegistry; - private HookManager hookManager; - private UserManager userManager; - private ChatManager chatManager; - - private SpecialItemManager specialItemManager; - - @Override - public void onEnable() { - if(!validateIfPluginShouldStart()) { - return; - } - - long start = System.currentTimeMillis(); - - ServiceRegistry.registerService(this); - exceptionLogHandler = new ExceptionLogHandler(this); - LanguageManager.init(this); - saveDefaultConfig(); - - Debugger.setEnabled(getDescription().getVersion().contains("debug") || getConfig().getBoolean("Debug")); - - Debugger.debug("[System] Initialization start"); - if(getConfig().getBoolean("Developer-Mode")) { - Debugger.deepDebug(true); - Debugger.debug(Level.FINE, "Deep debug enabled"); - for(String listenable : getConfig().getStringList("Performance-Listenable")) { - Debugger.monitorPerformance(listenable); - } - } - - configPreferences = new ConfigPreferences(this); - setupFiles(); - initializeClasses(); - checkUpdate(); - Debugger.debug("[System] Initialization finished took {0}ms", System.currentTimeMillis() - start); - - Debugger.debug("Plugin loaded!"); - - if(configPreferences.getOption(ConfigPreferences.Option.NAMETAGS_HIDDEN)) { - getServer().getScheduler().scheduleSyncRepeatingTask(this, () -> - getServer().getOnlinePlayers().forEach(ArenaUtils::updateNameTagsVisibility), 60, 140); - } - } - - private boolean validateIfPluginShouldStart() { - if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_8_R1)) { - MessageUtils.thisVersionIsNotSupported(); - Debugger.sendConsoleMsg("&cYour server version is not supported by Murder Mystery!"); - Debugger.sendConsoleMsg("&cSadly, we must shut off. Maybe you consider changing your server version?"); - forceDisable = true; - getServer().getPluginManager().disablePlugin(this); - return false; - } - try { - Class.forName("org.spigotmc.SpigotConfig"); - } catch(Exception e) { - MessageUtils.thisVersionIsNotSupported(); - Debugger.sendConsoleMsg("&cYour server software is not supported by Murder Mystery!"); - Debugger.sendConsoleMsg("&cWe support only Spigot and Spigot forks only! Shutting off..."); - forceDisable = true; - getServer().getPluginManager().disablePlugin(this); - return false; - } - return true; - } - - @Override - public void onDisable() { - if(forceDisable) { - return; - } - Debugger.debug("System disable initialized"); - long start = System.currentTimeMillis(); - - getLogger().removeHandler(exceptionLogHandler); - saveAllUserStatistics(); - if(configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)) { - getMysqlDatabase().shutdownConnPool(); - } - for(ArmorStand armorStand : HologramManager.getArmorStands()) { - armorStand.remove(); - armorStand.setCustomNameVisible(false); - } - HologramManager.getArmorStands().clear(); - for(Arena arena : ArenaRegistry.getArenas()) { - arena.getScoreboardManager().stopAllScoreboards(); - for(Player player : arena.getPlayers()) { - arena.doBarAction(Arena.BarAction.REMOVE, player); - player.setFlySpeed(0.1f); - player.getInventory().clear(); - player.getInventory().setArmorContents(null); - player.getActivePotionEffects().forEach(pe -> player.removePotionEffect(pe.getType())); - player.setWalkSpeed(0.2f); - player.setGameMode(GameMode.SURVIVAL); - arena.teleportToEndLocation(player); - if(configPreferences.getOption(ConfigPreferences.Option.INVENTORY_MANAGER_ENABLED)) { - InventorySerializer.loadInventory(this, player); - } - } - arena.cleanUpArena(); - } - Debugger.debug("System disable finished took {0}ms", System.currentTimeMillis() - start); - } - - private void initializeClasses() { - chatManager = new ChatManager(this); - ScoreboardLib.setPluginInstance(this); - if(getConfig().getBoolean("BungeeActivated")) { - bungeeManager = new BungeeManager(this); - } - if(configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)) { - FileConfiguration config = ConfigUtils.getConfig(this, "mysql"); - database = new MysqlDatabase(config.getString("user"), config.getString("password"), config.getString("address"), config.getLong("maxLifeTime", 1800000)); - } - argumentsRegistry = new ArgumentsRegistry(this); - userManager = new UserManager(this); - - Utils.init(this); - PermissionsManager.init(); - new ArenaEvents(this); - new SpectatorEvents(this); - new QuitEvent(this); - new JoinEvent(this); - new ChatEvents(this); - registerSoftDependenciesAndServices(); - User.cooldownHandlerTask(); - signManager = new SignManager(this); - ArenaRegistry.registerArenas(); - signManager.loadSigns(); - signManager.updateSigns(); - new Events(this); - new LobbyEvent(this); - new SpectatorItemEvents(this); - rewardsHandler = new RewardsFactory(this); - specialItemManager = new SpecialItemManager(this); - corpseHandler = new CorpseHandler(this); - partyHandler = new PartySupportInitializer().initialize(this); - - new EventsInitializer().initialize(this); - - - MiscUtils.sendStartUpMessage(this, "MurderMystery", getDescription(), true, true); - } - - private void registerSoftDependenciesAndServices() { - Debugger.debug("Hooking into soft dependencies"); - long start = System.currentTimeMillis(); - - startPluginMetrics(); - if(getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { - Debugger.debug("Hooking into PlaceholderAPI"); - new PlaceholderManager().register(); - } - Debugger.debug("Hooked into soft dependencies took {0}ms", System.currentTimeMillis() - start); - } - - private void startPluginMetrics() { - Metrics metrics = new Metrics(this, 3038); - - metrics.addCustomChart(new org.bstats.charts.SimplePie("database_enabled", () -> String.valueOf(configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)))); - metrics.addCustomChart(new org.bstats.charts.SimplePie("bungeecord_hooked", () -> String.valueOf(configPreferences.getOption(ConfigPreferences.Option.BUNGEE_ENABLED)))); - metrics.addCustomChart(new org.bstats.charts.SimplePie("locale_used", () -> LanguageManager.getPluginLocale().getPrefix())); - metrics.addCustomChart(new org.bstats.charts.SimplePie("update_notifier", () -> { - if(getConfig().getBoolean("Update-Notifier.Enabled", true)) { - return getConfig().getBoolean("Update-Notifier.Notify-Beta-Versions", true) ? "Enabled with beta notifier" : "Enabled"; - } - return getConfig().getBoolean("Update-Notifier.Notify-Beta-Versions", true) ? "Beta notifier only" : "Disabled"; - })); - } - - private void checkUpdate() { - if(!getConfig().getBoolean("Update-Notifier.Enabled", true)) { - return; - } - UpdateChecker.init(this, 66614).requestUpdateCheck().whenComplete((result, exception) -> { - if(!result.requiresUpdate()) { - return; - } - if(result.getNewestVersion().contains("b")) { - if(getConfig().getBoolean("Update-Notifier.Notify-Beta-Versions", true)) { - Debugger.sendConsoleMsg("&c[Murder Mystery] Your software is ready for update! However it's a BETA VERSION. Proceed with caution."); - Debugger.sendConsoleMsg("&c[Murder Mystery] Current version %old%, latest version %new%".replace("%old%", getDescription().getVersion()).replace("%new%", - result.getNewestVersion())); - } - return; - } - MessageUtils.updateIsHere(); - Debugger.sendConsoleMsg("&aYour MurderMystery plugin is outdated! Download it to keep with latest changes and fixes."); - Debugger.sendConsoleMsg("&aDisable this option in config.yml if you wish."); - Debugger.sendConsoleMsg("&eCurrent version: &c" + getDescription().getVersion() + "&e Latest version: &a" + result.getNewestVersion()); - }); - } - - private void setupFiles() { - for(String fileName : Arrays.asList("arenas", "bungee", "rewards", "stats", "special_items", "mysql", "specialblocks")) { - File file = new File(getDataFolder(), fileName + ".yml"); - if(!file.exists()) { - saveResource(fileName + ".yml", false); - } - } - } - - public RewardsFactory getRewardsHandler() { - return rewardsHandler; - } - - public BungeeManager getBungeeManager() { - return bungeeManager; - } - - public PartyHandler getPartyHandler() { - return partyHandler; - } - - public ChatManager getChatManager() { - return chatManager; - } - - public ConfigPreferences getConfigPreferences() { - return configPreferences; - } - - public MysqlDatabase getMysqlDatabase() { - return database; - } - - public SignManager getSignManager() { - return signManager; - } - - public CorpseHandler getCorpseHandler() { - return corpseHandler; - } - - public ArgumentsRegistry getArgumentsRegistry() { - return argumentsRegistry; - } - - - - public UserManager getUserManager() { - return userManager; - } - - public LastWordsManager getLastWordsManager() { - return lastWordsManager; - } - - public TrailsManager getTrailsManager() { - return trailsManager; - } - - public SpecialItemManager getSpecialItemManager() { - return specialItemManager; - } - - private void saveAllUserStatistics() { - for(Player player : getServer().getOnlinePlayers()) { - User user = userManager.getUser(player); - if(userManager.getDatabase() instanceof MysqlManager) { - StringBuilder update = new StringBuilder(" SET "); - for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { - if(!stat.isPersistent()) continue; - if(update.toString().equalsIgnoreCase(" SET ")) { - update.append(stat.getName()).append('=').append(user.getStat(stat)); - } - update.append(", ").append(stat.getName()).append('=').append(user.getStat(stat)); - } - String finalUpdate = update.toString(); - //copy of userManager#saveStatistic but without async database call that's not allowed in onDisable method. - ((MysqlManager) userManager.getDatabase()).getDatabase().executeUpdate("UPDATE " + ((MysqlManager) getUserManager().getDatabase()).getTableName() - + finalUpdate + " WHERE UUID='" + user.getUniqueId().toString() + "';"); - continue; - } - for(StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) { - userManager.getDatabase().saveStatistic(user, stat); - } - } - } - - -} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index bd8a1f6a..c425db0c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -245,9 +245,11 @@ Hide: Murderer: - #Should the murderer get speed effect? - #Enter a multiplier (min 2, max 10, 1 is normal speed) + # Should the murderer get speed effect? + # Enter a multiplier (min 2, max 10, 1 is normal speed) Speed: 3 + # Should the Murderer get a locator with Innocent location information + Locator: true Sword: diff --git a/src/main/resources/specialblocks.yml b/src/main/resources/special_blocks.yml similarity index 100% rename from src/main/resources/specialblocks.yml rename to src/main/resources/special_blocks.yml From db4e29fdbf3e8bdb37e2a6b465b4204523b6d25b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 15 Apr 2022 08:18:06 +0000 Subject: [PATCH 031/127] Bump pom.xml from 1.7.9-dev13 to 1.7.9-dev14 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 450dbf43..50bdfe50 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev13 + 1.7.9-dev14 MurderMystery From 3decad7305667416990e1205c82cfe5b18a05c29 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 15 Apr 2022 10:24:51 +0200 Subject: [PATCH 032/127] Updated Copyright notice --- .checkstyle/checkstyle.xml | 18 ++++++++++++++++++ pom.xml | 2 +- .../projects/murdermystery/HookManager.java | 2 +- .../plugily/projects/murdermystery/Main.java | 18 ++++++++++++++++++ .../game/MurderGameCorpseSpawnEvent.java | 19 ++++++++++++++++++- .../api/events/game/package-info.java | 2 +- .../api/events/player/package-info.java | 2 +- .../murdermystery/api/package-info.java | 2 +- .../projects/murdermystery/arena/Arena.java | 2 +- .../murdermystery/arena/ArenaEvents.java | 2 +- .../murdermystery/arena/ArenaManager.java | 2 +- .../murdermystery/arena/ArenaRegistry.java | 2 +- .../murdermystery/arena/ArenaUtils.java | 2 +- .../murdermystery/arena/corpse/Corpse.java | 2 +- .../murdermystery/arena/corpse/Stand.java | 2 +- .../arena/managers/MapRestorerManager.java | 18 ++++++++++++++++++ .../arena/managers/ScoreboardManager.java | 2 +- .../murdermystery/arena/role/Role.java | 2 +- .../arena/special/SpecialBlock.java | 2 +- .../arena/special/SpecialBlockEvents.java | 2 +- .../special/mysterypotion/MysteryPotion.java | 2 +- .../mysterypotion/MysteryPotionRegistry.java | 2 +- .../arena/special/pray/Prayer.java | 2 +- .../arena/special/pray/PrayerRegistry.java | 2 +- .../arena/states/InGameState.java | 2 +- .../arena/states/RestartingState.java | 2 +- .../arena/states/StartingState.java | 2 +- .../commands/arguments/ArgumentsRegistry.java | 2 +- .../arguments/admin/RolePassArgument.java | 18 ++++++++++++++++++ .../arena/SpecialBlockRemoverArgument.java | 2 +- .../arguments/game/RoleSelectorArgument.java | 18 ++++++++++++++++++ .../murdermystery/events/PluginEvents.java | 2 +- .../murdermystery/handlers/CorpseHandler.java | 2 +- .../handlers/lastwords/LastWord.java | 2 +- .../handlers/lastwords/LastWordsManager.java | 2 +- .../handlers/setup/SetupInventory.java | 18 ++++++++++++++++++ .../handlers/skins/sword/SwordSkin.java | 2 +- .../skins/sword/SwordSkinManager.java | 2 +- .../handlers/trails/BowTrailsHandler.java | 2 +- .../murdermystery/handlers/trails/Trail.java | 2 +- .../handlers/trails/TrailsManager.java | 2 +- .../murdermystery/utils/ItemPosition.java | 2 +- 42 files changed, 161 insertions(+), 36 deletions(-) diff --git a/.checkstyle/checkstyle.xml b/.checkstyle/checkstyle.xml index 775c09f1..5e65df7f 100644 --- a/.checkstyle/checkstyle.xml +++ b/.checkstyle/checkstyle.xml @@ -1,5 +1,23 @@ + + org.jetbrains annotations - 21.0.1 + 23.0.0 compile @@ -101,12 +101,12 @@ org.apache.maven.plugins maven-site-plugin - 3.9.1 + 3.12.0 org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.10.1 compile @@ -118,7 +118,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.3.0 + 3.4.0 Murder Mystery API docs for v${project.version} Minecraft survival minigame. @@ -132,12 +132,12 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.2.2 org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.3.0 package @@ -180,7 +180,7 @@ org.apache.maven.wagon wagon-ssh - 3.5.1 + 3.5.2 diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index 3bb4dff6..36ca534a 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -91,13 +91,13 @@ public void onArmorStandEject(EntityDismountEvent e) { @Override public void handleIngameVoidDeath(Player victim, PluginArena arena) { - Arena pluginArena = (Arena) plugin.getArenaRegistry().getArena(arena.getId()); + Arena pluginArena = plugin.getArenaRegistry().getArena(arena.getId()); if (pluginArena == null) { return; } victim.damage(1000.0); if (arena.getArenaState() == ArenaState.IN_GAME) { - victim.teleport(pluginArena.getPlayerSpawnPoints().get(0)); + VersionUtils.teleport(victim, pluginArena.getPlayerSpawnPoints().get(0)); } } @@ -136,7 +136,7 @@ public void onItemPickup(PlugilyEntityPickupItemEvent e) { return; } Player player = (Player) e.getEntity(); - Arena arena = (Arena) plugin.getArenaRegistry().getArena(player); + Arena arena = plugin.getArenaRegistry().getArena(player); if (arena == null) { return; } diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java index 53378e82..3d6ab188 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java @@ -86,7 +86,7 @@ public void handleCall(PluginArena arena) { Map detectiveChances = new HashMap<>(); int size = pluginArena.getPlayerSpawnPoints().size(); for(Player player : arena.getPlayers()) { - player.teleport(pluginArena.getPlayerSpawnPoints().get(size == 1 ? 0 : getPlugin().getRandom().nextInt(size))); + VersionUtils.teleport(player, pluginArena.getPlayerSpawnPoints().get(size == 1 ? 0 : getPlugin().getRandom().nextInt(size))); User user = arena.getPlugin().getUserManager().getUser(player); /* //reset local variables to be 100% sure diff --git a/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java index d702a0ef..3c105416 100644 --- a/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java +++ b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java @@ -64,7 +64,7 @@ public void onSwordThrow(PlayerInteractEvent event) { return; } Player attacker = event.getPlayer(); - Arena arena = (Arena) plugin.getArenaRegistry().getArena(attacker); + Arena arena = plugin.getArenaRegistry().getArena(attacker); if(arena == null) { return; } @@ -153,7 +153,7 @@ private void createFlyingSword(Arena arena, Player attacker, User attackerUser) new BukkitRunnable() { @Override public void run() { - stand.teleport(standStart.add(vec)); + VersionUtils.teleport(stand, standStart.add(vec)); initialise.add(vec); initialise .getWorld() @@ -162,7 +162,7 @@ public void run() { entity -> { if(entity instanceof Player) { Player victim = (Player) entity; - Arena arena = (Arena) plugin.getArenaRegistry().getArena(victim); + Arena arena = plugin.getArenaRegistry().getArena(victim); if(arena == null) { return; } @@ -183,7 +183,7 @@ public void run() { } private void killBySword(Arena arena, User attackerUser, Player victim) { - Arena victimArena = (Arena) plugin.getArenaRegistry().getArena(victim); + Arena victimArena = plugin.getArenaRegistry().getArena(victim); if(arena == null) { return; } From ce64ee88644d030ac8d50c5dfd199642756169b6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 31 Jul 2022 06:32:02 +0000 Subject: [PATCH 076/127] Bump pom.xml from 1.7.9-dev28 to 1.7.9-dev29 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 889b50ac..c7d4cef3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev28 + 1.7.9-dev29 MurderMystery From c3fcf45197c4056741fc41ff572cae5fb29048d8 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 2 Sep 2022 23:46:27 +0200 Subject: [PATCH 077/127] Updated setup menu --- .../plugily/projects/murdermystery/Main.java | 16 +- .../handlers/setup/LocationCategory.java | 53 +++ .../handlers/setup/SetupCategoryManager.java | 42 ++ .../handlers/setup/SetupInventory.java | 363 ------------------ .../handlers/setup/SpecificCategory.java | 73 ++++ .../handlers/setup/SwitchCategory.java | 50 +++ 6 files changed, 223 insertions(+), 374 deletions(-) create mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/LocationCategory.java create mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/SetupCategoryManager.java delete mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java create mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java create mode 100644 src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java diff --git a/src/main/java/plugily/projects/murdermystery/Main.java b/src/main/java/plugily/projects/murdermystery/Main.java index 48b14025..e8543408 100644 --- a/src/main/java/plugily/projects/murdermystery/Main.java +++ b/src/main/java/plugily/projects/murdermystery/Main.java @@ -35,8 +35,8 @@ import plugily.projects.minigamesbox.classic.handlers.permissions.PermissionCategory; import plugily.projects.minigamesbox.classic.handlers.placeholder.Placeholder; import plugily.projects.minigamesbox.classic.handlers.reward.RewardType; -import plugily.projects.minigamesbox.classic.handlers.setup.PluginSetupInventory; -import plugily.projects.minigamesbox.classic.handlers.setup.SetupUtilities; +import plugily.projects.minigamesbox.classic.handlers.setup.SetupInventory; +import plugily.projects.minigamesbox.classic.handlers.setup.categories.PluginSetupCategoryManager; import plugily.projects.minigamesbox.classic.preferences.ConfigOption; import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.minigamesbox.classic.utils.services.locale.Locale; @@ -55,7 +55,7 @@ import plugily.projects.murdermystery.events.PluginEvents; import plugily.projects.murdermystery.handlers.CorpseHandler; import plugily.projects.murdermystery.handlers.lastwords.LastWordsManager; -import plugily.projects.murdermystery.handlers.setup.SetupInventory; +import plugily.projects.murdermystery.handlers.setup.SetupCategoryManager; import plugily.projects.murdermystery.handlers.skins.sword.SwordSkinManager; import plugily.projects.murdermystery.handlers.trails.BowTrailsHandler; import plugily.projects.murdermystery.handlers.trails.TrailsManager; @@ -989,13 +989,7 @@ public CorpseHandler getCorpseHandler() { } @Override - public PluginSetupInventory openSetupInventory(PluginArena arena, Player player) { - return new SetupInventory(this, arena, player); - } - - @Override - public PluginSetupInventory openSetupInventory( - PluginArena arena, Player player, SetupUtilities.InventoryStage inventoryStage) { - return new SetupInventory(this, arena, player, inventoryStage); + public PluginSetupCategoryManager getSetupCategoryManager(SetupInventory setupInventory) { + return new SetupCategoryManager(setupInventory); } } diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/LocationCategory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/LocationCategory.java new file mode 100644 index 00000000..9d978a44 --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/LocationCategory.java @@ -0,0 +1,53 @@ +/* + * + * BuildBattle - Ultimate building competition minigame + * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package plugily.projects.murdermystery.handlers.setup; + +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.handlers.setup.categories.PluginLocationCategory; +import plugily.projects.minigamesbox.classic.handlers.setup.categories.PluginSpecificCategory; +import plugily.projects.minigamesbox.classic.handlers.setup.items.category.CountItem; +import plugily.projects.minigamesbox.classic.handlers.setup.items.category.LocationItem; +import plugily.projects.minigamesbox.classic.handlers.setup.items.category.MultiLocationItem; +import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; +import plugily.projects.minigamesbox.classic.utils.serialization.LocationSerializer; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; +import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; + + +/** + * @author Tigerpanzer_02 + *

+ * Created at 01.07.2022 + */ +public class LocationCategory extends PluginLocationCategory { + @Override + public void addItems(NormalFastInv gui) { + super.addItems(gui); + + MultiLocationItem starting = new MultiLocationItem(getSetupInventory(), new ItemBuilder(XMaterial.EMERALD_BLOCK.parseMaterial()), "Player Spawn Points", "Location where players will be randomly teleported when the game starts", "playerspawnpoints", 4, inventoryClickEvent -> { + LocationSerializer.saveLoc(getSetupInventory().getPlugin(), getSetupInventory().getConfig(), "arenas", "instances." + getSetupInventory().getArenaKey() + "." + "startlocation", inventoryClickEvent.getWhoClicked().getLocation()); + }, (emptyConsumer) -> { + }, true, true, true); + getItemList().add(starting); + gui.setItem((getInventoryLine() * 9) + 2, starting); + } + +} \ No newline at end of file diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupCategoryManager.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupCategoryManager.java new file mode 100644 index 00000000..fd7e2924 --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupCategoryManager.java @@ -0,0 +1,42 @@ +/* + * + * BuildBattle - Ultimate building competition minigame + * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package plugily.projects.murdermystery.handlers.setup; + +import plugily.projects.minigamesbox.classic.handlers.setup.SetupInventory; +import plugily.projects.minigamesbox.classic.handlers.setup.categories.PluginSetupCategoryManager; +import plugily.projects.minigamesbox.classic.handlers.setup.categories.SetupCategory; + +/** + * @author Tigerpanzer_02 + *

+ * Created at 01.07.2022 + */ +public class SetupCategoryManager extends PluginSetupCategoryManager { + + public SetupCategoryManager(SetupInventory setupInventory) { + super(setupInventory); + getCategoryHandler().put(SetupCategory.LOCATIONS, new LocationCategory()); + getCategoryHandler().put(SetupCategory.SPECIFIC, new SpecificCategory()); + getCategoryHandler().put(SetupCategory.SWITCH, new SwitchCategory()); + super.init(); + } + +} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java deleted file mode 100644 index 855da220..00000000 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupInventory.java +++ /dev/null @@ -1,363 +0,0 @@ -/* - * MurderMystery - Find the murderer, kill him and survive! - * Copyright (c) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package plugily.projects.murdermystery.handlers.setup; - -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.conversations.ConversationContext; -import org.bukkit.conversations.Prompt; -import org.bukkit.conversations.StringPrompt; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import plugily.projects.minigamesbox.classic.PluginMain; -import plugily.projects.minigamesbox.classic.arena.PluginArena; -import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; -import plugily.projects.minigamesbox.classic.handlers.setup.PluginSetupInventory; -import plugily.projects.minigamesbox.classic.handlers.setup.SetupUtilities; -import plugily.projects.minigamesbox.classic.handlers.setup.items.CountItem; -import plugily.projects.minigamesbox.classic.handlers.setup.items.LocationItem; -import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; -import plugily.projects.minigamesbox.classic.utils.conversation.SimpleConversationBuilder; -import plugily.projects.minigamesbox.classic.utils.dimensional.Cuboid; -import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; -import plugily.projects.minigamesbox.classic.utils.serialization.LocationSerializer; -import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; -import plugily.projects.minigamesbox.inventory.common.item.ClickableItem; -import plugily.projects.minigamesbox.inventory.common.item.SimpleClickableItem; -import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; -import plugily.projects.murdermystery.Main; -import plugily.projects.murdermystery.arena.Arena; -import plugily.projects.murdermystery.arena.special.SpecialBlock; - -import java.util.ArrayList; -import java.util.List; - -public class SetupInventory extends PluginSetupInventory { - - - private final Main plugin; - private Arena arena; - private final Player player; - - - public SetupInventory(Main plugin, @Nullable PluginArena arena, Player player) { - super(plugin, arena, player); - this.plugin = plugin; - this.player = player; - setArena(player, arena); - open(); - } - - public SetupInventory(Main plugin, @Nullable PluginArena arena, Player player, SetupUtilities.InventoryStage inventoryStage) { - super(plugin, arena, player, inventoryStage); - this.plugin = plugin; - this.player = player; - setArena(player, arena); - open(); - } - - @Override - public void setArena(Player player, PluginArena arena) { - if(arena == null && plugin.getSetupUtilities().getArena(player) != null) { - this.arena = plugin.getArenaRegistry().getArena(plugin.getSetupUtilities().getArena(player).getId()); - setInventoryStage(SetupUtilities.InventoryStage.PAGED_GUI); - } else if(arena != null) { - this.arena = plugin.getArenaRegistry().getArena(arena.getId()); - } else { - this.arena = null; - } - setArena(this.arena); - } - - @Override - public void addExternalItems(NormalFastInv inv) { - switch (getInventoryStage()) { - case SETUP_GUI: - break; - case ARENA_LIST: - break; - case PAGED_GUI: - break; - case PAGED_VALUES: - break; - case PAGED_BOOLEAN: - inv.setItem(10, new SimpleClickableItem(new ItemBuilder(XMaterial.REDSTONE.parseItem()) - .name(new MessageBuilder(arena.isGoldVisuals() ? "&c&lDisable Gold Visuals" : "&a&lEnable Gold Visuals").build()) - .lore(ChatColor.GRAY + "Enables gold visuals to spawn") - .lore(ChatColor.GRAY + "some particle effects above gold locations") - .build(), event -> { - arena.toggleGoldVisuals(); - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".goldvisuals", arena.isGoldVisuals()); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - plugin.openSetupInventory(arena, player, SetupUtilities.InventoryStage.PAGED_BOOLEAN); - })); - break; - case PAGED_COUNTABLE: - inv.setItem(11, new CountItem(new ItemBuilder(XMaterial.REDSTONE_TORCH.parseMaterial()) - .amount(plugin.getSetupUtilities().getMinimumValueHigherThanZero("spawngoldtime", this)) - .name(new MessageBuilder("&e&lSet gold spawn time in seconds").build()) - .lore(ChatColor.GRAY + "LEFT click to decrease") - .lore(ChatColor.GRAY + "RIGHT click to increase") - .lore(ChatColor.DARK_GRAY + "How much gold should be spawned? ") - .lore(ChatColor.DARK_GRAY + "That means 1 gold spawned every ... seconds") - .lore(ChatColor.DARK_GRAY + "Default: 5") - .lore(ChatColor.DARK_GRAY + "Every 5 seconds it will spawn 1 gold") - .lore("", plugin.getSetupUtilities().isOptionDone("spawngoldtime", this)) - .build(), e -> { - ItemStack currentItem = e.getCurrentItem(); - if(currentItem == null) { - return; - } - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".spawngoldtime", e.getCurrentItem().getAmount()); - arena.setSpawnGoldTime(e.getCurrentItem().getAmount()); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - inv.refresh(); - })); - - - inv.setItem(12, new CountItem(new ItemBuilder(Material.IRON_SWORD) - .amount(plugin.getSetupUtilities().getMinimumValueHigherThanZero("playerpermurderer", this)) - .name(new MessageBuilder("&e&lSet Player Per Murderer Amount").build()) - .lore(ChatColor.GRAY + "LEFT click to decrease") - .lore(ChatColor.GRAY + "RIGHT click to increase") - .lore(ChatColor.DARK_GRAY + "How many murderer should be ingame? This means ") - .lore(ChatColor.DARK_GRAY + "one murderer for that amount of players. Default: ") - .lore(ChatColor.DARK_GRAY + "5 players are 1 murderer, that means if we have ") - .lore(ChatColor.DARK_GRAY + "14 Players it will calculate 2 murderer! ") - .lore(ChatColor.DARK_GRAY + "Set it to 1 if you want only one murderer ") - .lore("", plugin.getSetupUtilities().isOptionDone("playerpermurderer", this)) - .build(), e -> { - ItemStack currentItem = e.getCurrentItem(); - if(currentItem == null) { - return; - } - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".playerpermurderer", e.getCurrentItem().getAmount()); - arena.setArenaOption("MURDERER_DIVIDER", e.getCurrentItem().getAmount()); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - inv.refresh(); - })); - inv.setItem(13, new CountItem(new ItemBuilder(Material.BOW) - .amount(plugin.getSetupUtilities().getMinimumValueHigherThanZero("playerperdetective", this)) - .name(new MessageBuilder("&e&lSet Player Per Detective Amount").build()) - .lore(ChatColor.GRAY + "LEFT click to decrease") - .lore(ChatColor.GRAY + "RIGHT click to increase") - .lore(ChatColor.DARK_GRAY + "How many detectives should be ingame? This means ") - .lore(ChatColor.DARK_GRAY + "one detective for that amount of players. Default: ") - .lore(ChatColor.DARK_GRAY + "7 players are 1 detective, that means if we have ") - .lore(ChatColor.DARK_GRAY + "18 Players it will calculate 2 detectives! ") - .lore(ChatColor.DARK_GRAY + "Set it to 1 if you want only one detectives ") - .lore("", plugin.getSetupUtilities().isOptionDone("playerperdetective", this)) - .build(), e -> { - ItemStack currentItem = e.getCurrentItem(); - if(currentItem == null) { - return; - } - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".playerperdetective", e.getCurrentItem().getAmount()); - arena.setArenaOption("DETECTIVE_DIVIDER", e.getCurrentItem().getAmount()); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - inv.refresh(); - })); - - break; - case PAGED_LOCATIONS: - inv.setItem(22, new LocationItem(new ItemBuilder(XMaterial.GOLD_INGOT.parseMaterial()) - .name(new MessageBuilder("&e&lAdd Gold Spawn").build()) - .lore(ChatColor.GRAY + "Add new gold spawn") - .lore(ChatColor.GRAY + "on the place you're standing at.") - .lore("", plugin.getSetupUtilities().isOptionDoneSection("goldspawnpoints", 4,this)) - .build(), e -> { - if(e.getClick() == ClickType.SHIFT_RIGHT) { - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".goldspawnpoints", new ArrayList<>()); - arena.setGoldSpawnPoints(new ArrayList<>()); - new MessageBuilder("&eDone | &aGold spawn points deleted, you can add them again now!").player(player).sendPlayer(); - arena.setReady(false); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - return; - } - - List goldSpawns = plugin.getSetupUtilities().getConfig().getStringList("instances." + arena.getId() + ".goldspawnpoints"); - goldSpawns.add(LocationSerializer.locationToString(player.getLocation())); - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".goldspawnpoints", goldSpawns); - String goldProgress = goldSpawns.size() >= 4 ? "&e✔ Completed | " : "&c✘ Not completed | "; - new MessageBuilder(goldProgress + "&aGold spawn added! &8(&7" + goldSpawns.size() + "/4&8)").player(player).sendPlayer(); - if(goldSpawns.size() == 4) { - new MessageBuilder("&eInfo | &aYou can add more than 4 gold spawns! Four is just a minimum!").player(player).sendPlayer(); - } - List spawns = new ArrayList<>(arena.getGoldSpawnPoints()); - spawns.add(player.getLocation()); - arena.setGoldSpawnPoints(spawns); - - new MessageBuilder("&e✔ Completed | &aGold spawn location for arena " + arena.getId() + " set at your location!").player(player).sendPlayer(); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - }, event -> { - new MessageBuilder("&cNot supported!").prefix().player(player).sendPlayer(); - }, false, false, false)); - - inv.setItem(23, new LocationItem(new ItemBuilder(XMaterial.EMERALD_BLOCK.parseMaterial()) - .name(new MessageBuilder("&e&lAdd Starting Location").build()) - .lore(ChatColor.GRAY + "Click to add the starting location") - .lore(ChatColor.GRAY + "on the place where you are standing.") - .lore(ChatColor.DARK_GRAY + "(locations where players will be") - .lore(ChatColor.DARK_GRAY + "teleported when game starts)") - .lore("", plugin.getSetupUtilities().isOptionDoneSection("playerspawnpoints", 4,this)) - .build(), e -> { - if(e.getClick() == ClickType.SHIFT_RIGHT) { - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".playerspawnpoints", new ArrayList<>()); - arena.setPlayerSpawnPoints(new ArrayList<>()); - new MessageBuilder("&eDone | &aPlayerSpawnPoints spawn points deleted, you can add them again now!").player(player).sendPlayer(); - arena.setReady(false); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - return; - } - - List startingPoints = plugin.getSetupUtilities().getConfig().getStringList("instances." + arena.getId() + ".playerspawnpoints"); - startingPoints.add(LocationSerializer.locationToString(player.getLocation())); - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".playerspawnpoints", startingPoints); - String startingProgress = startingPoints.size() >= 4 ? "&e✔ Completed | " : "&c✘ Not completed | "; - new MessageBuilder(startingProgress + "&aPlayer spawn added! &8(&7" + startingPoints.size() + "/4&8)").player(player).sendPlayer(); - if(startingPoints.size() == 4) { - new MessageBuilder("&eInfo | &aYou can add more than 4 PlayerSpawnPoints locations! Four is just a minimum!").player(player).sendPlayer(); - } - List spawns = new ArrayList<>(arena.getGoldSpawnPoints()); - spawns.add(player.getLocation()); - arena.setPlayerSpawnPoints(spawns); - - new MessageBuilder("&e✔ Completed | &aPlayerSpawnPoints location for arena " + arena.getId() + " set at your location!").player(player).sendPlayer(); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - }, event -> { - new MessageBuilder("&cNot supported!").prefix().player(player).sendPlayer(); - }, false, false, false)); - - inv.setItem(30, new LocationItem(new ItemBuilder(Material.ENDER_CHEST) - .name(new MessageBuilder("&e&lAdd Mystery Cauldron").build()) - .lore(ChatColor.GRAY + "Target a cauldron and add it to the game") - .lore(ChatColor.GRAY + "it will cost 1 gold per potion!") - .lore(ChatColor.GRAY + "Configure cauldron potions in special_blocks.yml file!") - .build(), e -> { - e.getWhoClicked().closeInventory(); - Block targetBlock = e.getWhoClicked().getTargetBlock(null, 7); - if(targetBlock.getType() != Material.CAULDRON) { - e.getWhoClicked().sendMessage(ChatColor.RED + "Please target cauldron to continue!"); - return; - } - arena.loadSpecialBlock(new SpecialBlock(targetBlock.getLocation(), - SpecialBlock.SpecialBlockType.MYSTERY_CAULDRON)); - List cauldrons = new ArrayList<>(plugin.getSetupUtilities().getConfig().getStringList("instances." + arena.getId() + ".mystery-cauldrons")); - cauldrons.add(LocationSerializer.locationToString(targetBlock.getLocation())); - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".mystery-cauldrons", cauldrons); - new MessageBuilder("&e✔ Completed | &aAdded Cauldron special block for arena " + arena.getId() + " set at your location!").player(player).sendPlayer(); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - }, event -> { - new MessageBuilder("&cNot supported!").prefix().player(player).sendPlayer(); - }, false, false, false)); - inv.setItem(31, new LocationItem(new ItemBuilder(Material.ENDER_CHEST) - .name(new MessageBuilder("&e&lAdd Confessional").build()) - .lore(ChatColor.GRAY + "Target enchanting table and") - .lore(ChatColor.GRAY + "add praise to the developer") - .lore(ChatColor.GRAY + "confessional, gift for") - .lore(ChatColor.GRAY + "the developer costs 1 gold!") - .lore(ChatColor.GOLD + "Add some levers in radius") - .lore(ChatColor.GOLD + "of 3 blocks near the enchant table") - .lore(ChatColor.GOLD + "to allow users to pray there!") - .lore(ChatColor.RED + "You can either get gifts") - .lore(ChatColor.RED + "or curses from prayer!") - .build(), e -> { - e.getWhoClicked().closeInventory(); - Block targetBlock = e.getWhoClicked().getTargetBlock(null, 7); - if(targetBlock.getType() != XMaterial.ENCHANTING_TABLE.parseMaterial()) { - e.getWhoClicked().sendMessage(ChatColor.RED + "Please target enchanting table to continue!"); - return; - } - arena.loadSpecialBlock(new SpecialBlock(targetBlock.getLocation(), - SpecialBlock.SpecialBlockType.PRAISE_DEVELOPER)); - List confessionals = new ArrayList<>(plugin.getSetupUtilities().getConfig().getStringList("instances." + arena.getId() + ".confessionals")); - confessionals.add(LocationSerializer.locationToString(targetBlock.getLocation())); - plugin.getSetupUtilities().getConfig().set("instances." + arena.getId() + ".confessionals", confessionals); - new MessageBuilder("&e✔ Completed | &aAdded Confessional special block for arena " + arena.getId() + " set at your location!").player(player).sendPlayer(); - new MessageBuilder("&eInfo | &aRemember to place any lever in radius of 3 near enchant table!").player(player).sendPlayer(); - ConfigUtils.saveConfig(plugin, plugin.getSetupUtilities().getConfig(), "arenas"); - }, event -> { - new MessageBuilder("&cNot supported!").prefix().player(player).sendPlayer(); - }, false, false, false)); - - break; - default: - break; - } - inv.refresh(); -} - - @Override - public boolean addAdditionalArenaValidateValues(InventoryClickEvent event, PluginArena arena, PluginMain plugin, FileConfiguration config) { - for(String s : new String[]{"goldspawnpoints", "playerspawnpoints"}) { - if(!config.isSet("instances." + arena.getId() + "." + s) || config.getStringList("instances." + arena.getId() + "." + s).size() < 4) { - new MessageBuilder("&c&l✘ &cArena validation failed! Please configure following spawns properly: "+ s + " (must be minimum 4 spawns)").send(event.getWhoClicked()); - return false; - } - } - - return true; - } - - @Override - public void addAdditionalArenaSetValues(PluginArena arena, FileConfiguration config) { - Arena pluginArena = plugin.getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return; - } - List playerSpawnPoints = new ArrayList<>(); - for(String loc : config.getStringList("instances." + arena.getId() + ".playerspawnpoints")) { - playerSpawnPoints.add(LocationSerializer.getLocation(loc)); - } - pluginArena.setPlayerSpawnPoints(playerSpawnPoints); - List goldSpawnPoints = new ArrayList<>(); - for(String loc : config.getStringList("instances." + arena.getId() + ".goldspawnpoints")) { - goldSpawnPoints.add(LocationSerializer.getLocation(loc)); - } - pluginArena.setGoldSpawnPoints(goldSpawnPoints); - - List specialBlocks = new ArrayList<>(); - if(config.isSet("instances." + arena.getId() + ".mystery-cauldrons")) { - for(String loc : config.getStringList("instances." + arena.getId() + ".mystery-cauldrons")) { - specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.MYSTERY_CAULDRON)); - } - } - if(config.isSet("instances." + arena.getId() + ".confessionals")) { - for(String loc : config.getStringList("instances." + arena.getId() + ".confessionals")) { - specialBlocks.add(new SpecialBlock(LocationSerializer.getLocation(loc), SpecialBlock.SpecialBlockType.PRAISE_DEVELOPER)); - } - } - for(SpecialBlock specialBlock : specialBlocks) { - if(!pluginArena.getSpecialBlocks().contains(specialBlock)) { - pluginArena.loadSpecialBlock(specialBlock); - } - } - pluginArena.setSpawnGoldTime(config.getInt("instances." + arena.getId() + ".spawngoldtime", 5)); - pluginArena.setHideChances(config.getBoolean("instances." + arena.getId() + ".hidechances", false)); - pluginArena.setArenaOption("MURDERER_DIVIDER", config.getInt("instances." + arena.getId() + ".playerpermurderer", 5)); - pluginArena.setArenaOption("DETECTIVE_DIVIDER",config.getInt("instances." + arena.getId() + ".playerperdetective", 7)); - } -} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java new file mode 100644 index 00000000..2c8b5854 --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java @@ -0,0 +1,73 @@ +/* + * + * BuildBattle - Ultimate building competition minigame + * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package plugily.projects.murdermystery.handlers.setup; + +import org.bukkit.Material; +import plugily.projects.minigamesbox.classic.handlers.setup.categories.PluginSpecificCategory; +import plugily.projects.minigamesbox.classic.handlers.setup.items.category.CountItem; +import plugily.projects.minigamesbox.classic.handlers.setup.items.category.MaterialLocationItem; +import plugily.projects.minigamesbox.classic.handlers.setup.items.category.MaterialMultiLocationItem; +import plugily.projects.minigamesbox.classic.handlers.setup.items.category.MultiLocationItem; +import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; +import plugily.projects.minigamesbox.classic.utils.helper.MaterialUtils; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; +import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; + +import java.util.Collections; + + +/** + * @author Tigerpanzer_02 + *

+ * Created at 01.07.2022 + */ +public class SpecificCategory extends PluginSpecificCategory { + @Override + public void addItems(NormalFastInv gui) { + super.addItems(gui); + + CountItem spawnGoldTime = new CountItem(getSetupInventory(), new ItemBuilder(XMaterial.REDSTONE_TORCH.parseMaterial()), "Gold Spawn Time (Seconds)", "How much gold should be spawned? \nThat means 1 gold spawned every ... seconds\nDefault: 5\nEvery 5 seconds it will spawn 1 gold", "spawngoldtime"); + gui.setItem((getInventoryLine() * 9) + 1, spawnGoldTime); + getItemList().add(spawnGoldTime); + + CountItem playerMurderer = new CountItem(getSetupInventory(), new ItemBuilder(XMaterial.IRON_SWORD.parseMaterial()), "Player Per Murderer", "How many murderer should be ingame? This means \none murderer for that amount of players. Default: \n5 players are 1 murderer, that means if we have \n14 Players it will calculate 2 murderer! \nSet it to 1 if you want only one murderer ", "playerpermurderer"); + gui.setItem((getInventoryLine() * 9) + 2, playerMurderer); + getItemList().add(playerMurderer); + + CountItem playerDetective = new CountItem(getSetupInventory(), new ItemBuilder(XMaterial.IRON_SWORD.parseMaterial()), "Player Per Murderer", "How many detectives should be ingame? This means \none detective for that amount of players. Default: \n7 players are 1 detective, that means if we have \n18 Players it will calculate 2 detectives! \nSet it to 1 if you want only one detective ", "playerperdetective"); + gui.setItem((getInventoryLine() * 9) + 3, playerDetective); + getItemList().add(playerDetective); + + MultiLocationItem goldSpawn = new MultiLocationItem(getSetupInventory(), new ItemBuilder(XMaterial.GOLD_INGOT.parseMaterial()), "Gold Spawn", "Add new gold spawn \n on the place you're standing at.", "goldspawnpoints", 4); + gui.setItem((getInventoryLine() * 9) + 4, goldSpawn); + getItemList().add(goldSpawn); + + MaterialMultiLocationItem mysteryCauldron = new MaterialMultiLocationItem(getSetupInventory(), new ItemBuilder(XMaterial.CAULDRON.parseMaterial()), "Mystery Cauldron", "Target a cauldron and add it to the game\nit will cost 1 gold per potion!\nConfigure cauldron potions \nin special_blocks.yml file!", "mystery-cauldrons", Collections.singleton(XMaterial.CAULDRON.parseMaterial()), false, 0); + gui.setItem((getInventoryLine() * 9) + 5, mysteryCauldron); + getItemList().add(mysteryCauldron); + + MaterialMultiLocationItem confessional = new MaterialMultiLocationItem(getSetupInventory(), new ItemBuilder(XMaterial.ENCHANTING_TABLE.parseMaterial()), "Confessional", "Target enchanting table and\nadd praise to the developer\nconfessional, gift for\nthe developer costs 1 gold!\nAdd some levers in radius\nof 3 blocks near the enchant table\nto allow users to pray there!\nYou can either get gifts\nor curses from prayer!", "confessionals", Collections.singleton(XMaterial.ENCHANTING_TABLE.parseMaterial()), false, 0); + gui.setItem((getInventoryLine() * 9) + 5, confessional); + getItemList().add(confessional); + + } + +} \ No newline at end of file diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java new file mode 100644 index 00000000..bae1267a --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java @@ -0,0 +1,50 @@ +/* + * + * BuildBattle - Ultimate building competition minigame + * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package plugily.projects.murdermystery.handlers.setup; + +import org.bukkit.plugin.java.JavaPlugin; +import plugily.projects.minigamesbox.classic.PluginMain; +import plugily.projects.minigamesbox.classic.handlers.setup.categories.PluginSwitchCategory; +import plugily.projects.minigamesbox.classic.handlers.setup.items.category.SwitchItem; +import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; +import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; +import plugily.projects.murdermystery.Main; + +import java.util.Arrays; + +/** + * @author Tigerpanzer_02 + *

+ * Created at 01.07.2022 + */ +public class SwitchCategory extends PluginSwitchCategory { + @Override + public void addItems(NormalFastInv gui) { + super.addItems(gui); + SwitchItem goldVisuals = new SwitchItem(getSetupInventory(), new ItemBuilder(XMaterial.REDSTONE.parseMaterial()), "Gold Visuals", "Enables gold visuals to spawn\nsome particle effects above gold locations", "goldvisuals", Arrays.asList("true", "false"), inventoryClickEvent -> { + JavaPlugin.getPlugin(Main.class).getArenaRegistry().getArena(getSetupInventory().getArenaKey()).toggleGoldVisuals(); + }); + gui.setItem((getInventoryLine() * 9) + 1, goldVisuals); + getItemList().add(goldVisuals); + } + +} From 5c129cb3424e246e438436a321520664c83557bd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Sep 2022 21:47:21 +0000 Subject: [PATCH 078/127] Bump pom.xml from 1.7.9-dev29 to 1.7.9-dev30 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c7d4cef3..0c29d6bd 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev29 + 1.7.9-dev30 MurderMystery From ca16680e93a807ab8ea0e2f17ac5ddc2fbf679f1 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Sat, 3 Sep 2022 10:57:46 +0200 Subject: [PATCH 079/127] Fixed murderer gets sword placeholder usage --- src/main/resources/language.yml | 2 +- src/main/resources/locales/language_default.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index 43273e85..0d3aa3dd 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -306,7 +306,7 @@ In-Game: Win: "for winning the game" Detective: "for %number% innocents survived" Sword: - Soon: "The Murderer gets their sword in %time% seconds!" + Soon: "The Murderer gets their sword in %number% seconds!" Special-Blocks: Cauldron: Potion: "Please drink your current potion!" diff --git a/src/main/resources/locales/language_default.yml b/src/main/resources/locales/language_default.yml index b8d4aa2f..3622b497 100644 --- a/src/main/resources/locales/language_default.yml +++ b/src/main/resources/locales/language_default.yml @@ -317,7 +317,7 @@ In-Game: Win: "for winning the game" Detective: "for %number% innocents survived" Sword: - Soon: "The Murderer gets their sword in %time% seconds!" + Soon: "The Murderer gets their sword in %number% seconds!" Special-Blocks: Cauldron: Potion: "Please drink your current potion!" From 0a25821637d032fa3beb8b35632947b2060358a4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Sep 2022 08:58:25 +0000 Subject: [PATCH 080/127] Bump pom.xml from 1.7.9-dev30 to 1.7.9-dev31 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0c29d6bd..21d77376 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev30 + 1.7.9-dev31 MurderMystery From 64190f221e895405c04780b47d39d701228f2646 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Sat, 3 Sep 2022 11:06:27 +0200 Subject: [PATCH 081/127] Fixed cauldron and pray coloring --- .../plugily/projects/murdermystery/Main.java | 4 ++-- .../projects/murdermystery/arena/Arena.java | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/Main.java b/src/main/java/plugily/projects/murdermystery/Main.java index e8543408..ee9baec0 100644 --- a/src/main/java/plugily/projects/murdermystery/Main.java +++ b/src/main/java/plugily/projects/murdermystery/Main.java @@ -499,11 +499,11 @@ public void addMessages() { getMessageManager() .registerMessage( "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_CAULDRON_POTION", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Potion", "")); + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Cauldron.Potion", "")); getMessageManager() .registerMessage( "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_CAULDRON_HOLOGRAM", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Hologram", "")); + new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Cauldron.Hologram", "")); getMessageManager() .registerMessage( "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_NOT_ENOUGH_GOLD", diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index 2a5c10e6..dd7fd551 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -28,6 +28,7 @@ import plugily.projects.minigamesbox.classic.arena.ArenaState; import plugily.projects.minigamesbox.classic.arena.PluginArena; import plugily.projects.minigamesbox.classic.arena.managers.PluginMapRestorerManager; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; import plugily.projects.murdermystery.Main; @@ -109,6 +110,7 @@ public PluginMapRestorerManager getMapRestorerManager() { private void setPluginValues() { } + public void addCorpse(Corpse corpse) { if(plugin.getHookManager().isFeatureEnabled(HookManager.HookFeature.CORPSES)) { corpses.add(corpse); @@ -198,7 +200,7 @@ public void startGoldVisuals() { Location goldLocation = goldLocations.clone(); goldLocation.add(0, 0.4, 0); java.util.Iterator iterator = Bukkit.getOnlinePlayers().iterator(); - if (iterator.hasNext()) { + if(iterator.hasNext()) { VersionUtils.sendParticles("REDSTONE", iterator.next(), goldLocation, 10); } } @@ -215,19 +217,20 @@ public void setGoldVisuals(boolean goldVisuals) { startGoldVisuals(); } } + public void loadSpecialBlock(SpecialBlock block) { - if (!specialBlocks.contains(block)) { + if(!specialBlocks.contains(block)) { specialBlocks.add(block); } switch(block.getSpecialBlockType()) { case MYSTERY_CAULDRON: - block.setArmorStandHologram(new ArmorStandHologram(plugin.getBukkitHelper().getBlockCenter(block.getLocation()), plugin.getLanguageManager().getLanguageMessage("In-Game.Messages.Arena.Playing.Special-Blocks.Cauldron.Hologram"))); + block.setArmorStandHologram(new ArmorStandHologram(plugin.getBukkitHelper().getBlockCenter(block.getLocation()), new MessageBuilder(plugin.getLanguageManager().getLanguageMessage("In-Game.Messages.Arena.Playing.Special-Blocks.Cauldron.Hologram")).build())); break; case PRAISE_DEVELOPER: ArmorStandHologram prayer = new ArmorStandHologram(plugin.getBukkitHelper().getBlockCenter(block.getLocation())); for(String str : plugin.getLanguageManager().getLanguageMessage("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Hologram").split(";")) { - prayer.appendLine(str); + prayer.appendLine(new MessageBuilder(str).build()); } block.setArmorStandHologram(prayer); break; @@ -242,6 +245,7 @@ public void loadSpecialBlock(SpecialBlock block) { public List getSpecialBlocks() { return specialBlocks; } + public boolean isCharacterSet(Arena.CharacterType type) { return gameCharacters.containsKey(type); } @@ -266,7 +270,7 @@ public boolean lastAliveDetective() { public int aliveDetective() { int alive = 0; for(Player player : getPlayersLeft()) { - if (Role.isRole(Role.ANY_DETECTIVE, plugin.getUserManager().getUser(player), this) + if(Role.isRole(Role.ANY_DETECTIVE, plugin.getUserManager().getUser(player), this) && isDetectiveAlive(player)) { alive++; } @@ -303,7 +307,7 @@ public boolean lastAliveMurderer() { public int aliveMurderer() { int alive = 0; for(Player player : getPlayersLeft()) { - if (Role.isRole(Role.MURDERER, plugin.getUserManager().getUser(player), this) && isMurderAlive(player)) { + if(Role.isRole(Role.MURDERER, plugin.getUserManager().getUser(player), this) && isMurderAlive(player)) { alive++; } } @@ -359,6 +363,7 @@ public void removeSpectatorPlayer(Player player) { public boolean isSpectatorPlayer(Player player) { return spectators.contains(player); } + public List getPlayerSpawnPoints() { return playerSpawnPoints; } @@ -376,10 +381,10 @@ public void setSpawnGoldTimer(int spawnGoldTimer) { } - public void setPlayerSpawnPoints(@NotNull List playerSpawnPoints) { this.playerSpawnPoints = playerSpawnPoints; } + public enum CharacterType { MURDERER, DETECTIVE, FAKE_DETECTIVE, HERO } From ff6cfae2a45f5913cc525f84827e5fb7f47ff1b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Sep 2022 09:07:01 +0000 Subject: [PATCH 082/127] Bump pom.xml from 1.7.9-dev31 to 1.7.9-dev32 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 21d77376..d4d1490d 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev31 + 1.7.9-dev32 MurderMystery From f3c07713fb3fd5b158613503ba06ca2dbbc4d150 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Sat, 3 Sep 2022 11:30:52 +0200 Subject: [PATCH 083/127] Fixed gold does not spawn on gold spawn locations --- .../projects/murdermystery/arena/states/InGameState.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java index 4fc0281b..aacd840c 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java @@ -126,12 +126,12 @@ public void handleCall(PluginArena arena) { } private void spawnSomeGold(Arena arena) { - int spawnPointsSize = arena.getPlayerSpawnPoints().size(); + int spawnPointsSize = arena.getGoldSpawnPoints().size(); if(spawnPointsSize == 0) { return; } - //may users want to disable it and want much gold on there map xD + //may users want to disable it and want much gold on their map xD if(!getPlugin().getConfigPreferences().getOption("GOLD_LIMITER")) { //do not exceed amount of gold per spawn if(arena.getGoldSpawned().size() >= spawnPointsSize) { @@ -139,12 +139,12 @@ private void spawnSomeGold(Arena arena) { } } if(getPlugin().getConfigPreferences().getOption("GOLD_SPAWNER_MODE_ALL")) { - for(Location location : arena.getPlayerSpawnPoints()) { + for(Location location : arena.getGoldSpawnPoints()) { arena.getGoldSpawned().add(location.getWorld().dropItem(location, new ItemStack(Material.GOLD_INGOT, 1))); getPlugin().getPowerupRegistry().spawnPowerup(location, arena); } } else { - Location loc = arena.getGoldSpawned().get(spawnPointsSize == 1 ? 0 : new Random().nextInt(spawnPointsSize)).getLocation(); + Location loc = arena.getGoldSpawned().get(spawnPointsSize == 1 ? 0 : getPlugin().getRandom().nextInt(spawnPointsSize - 1)).getLocation(); arena.getGoldSpawned().add(loc.getWorld().dropItem(loc, new ItemStack(Material.GOLD_INGOT, 1))); getPlugin().getPowerupRegistry().spawnPowerup(loc, arena); } From dc3090ab28e018b305ee81838cf70045070d3794 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Sep 2022 09:31:22 +0000 Subject: [PATCH 084/127] Bump pom.xml from 1.7.9-dev32 to 1.7.9-dev33 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d4d1490d..61df2077 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev32 + 1.7.9-dev33 MurderMystery From 7e890c84498c1333ed8fe38225d43c367dabef7f Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Sat, 3 Sep 2022 11:38:49 +0200 Subject: [PATCH 085/127] Changed replace method for low points --- .../java/plugily/projects/murdermystery/arena/ArenaUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java index f2ecaf5b..eac3e042 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java @@ -18,7 +18,6 @@ package plugily.projects.murdermystery.arena; -import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -198,7 +197,7 @@ public static void addScore(User user, ScoreAction action, int amount) { .build(); if(action.points < 0) { - msg = StringUtils.replace(msg, "+", ""); + msg = msg.replace("+", ""); } user.adjustStatistic("LOCAL_SCORE", action.points); From 7d024a26d328e717d704100dc8d5ca0a534217ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Sep 2022 09:39:23 +0000 Subject: [PATCH 086/127] Bump pom.xml from 1.7.9-dev33 to 1.7.9-dev34 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 61df2077..743a46a8 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev33 + 1.7.9-dev34 MurderMystery From b7444acbd7d68577e312ea0ba8970baf0c20eb1a Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 9 Sep 2022 22:09:43 +0200 Subject: [PATCH 087/127] Fixed special_items.yml file --- src/main/resources/special_items.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/special_items.yml b/src/main/resources/special_items.yml index c6f14771..91f6d6f9 100644 --- a/src/main/resources/special_items.yml +++ b/src/main/resources/special_items.yml @@ -11,7 +11,7 @@ Role-Pass: permission: "" execute: - - "mm roleselector" + - "p:mm roleselector" displayname: "&c&lClick to open role pass menu &7(Right Click)" lore: - "&7Enjoy one round of guaranteed role with pass" From 28ec8e147f2fe19b57356a42aaf7bf6e2c372d71 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 9 Sep 2022 23:17:06 +0200 Subject: [PATCH 088/127] Fixed arena running (death reward type & starting & ingame handling) (seems like role set issues occuring, needs investigation) --- .../java/plugily/projects/murdermystery/arena/ArenaEvents.java | 2 +- .../projects/murdermystery/arena/states/InGameState.java | 3 ++- .../projects/murdermystery/arena/states/StartingState.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index 36ca534a..2afc938f 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -480,7 +480,7 @@ public void onRespawn(PlayerRespawnEvent event) { user.setStatistic("LOCAL_GOLD", 0); plugin .getRewardsHandler() - .performReward(player, plugin.getRewardsHandler().getRewardType("DEATH")); + .performReward(player, plugin.getRewardsHandler().getRewardType("PLAYER_DEATH")); } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java index aacd840c..e1b63474 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java @@ -18,6 +18,7 @@ package plugily.projects.murdermystery.arena.states; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -144,7 +145,7 @@ private void spawnSomeGold(Arena arena) { getPlugin().getPowerupRegistry().spawnPowerup(location, arena); } } else { - Location loc = arena.getGoldSpawned().get(spawnPointsSize == 1 ? 0 : getPlugin().getRandom().nextInt(spawnPointsSize - 1)).getLocation(); + Location loc = arena.getGoldSpawnPoints().get(spawnPointsSize == 1 ? 0 : getPlugin().getRandom().nextInt(spawnPointsSize - 1)); arena.getGoldSpawned().add(loc.getWorld().dropItem(loc, new ItemStack(Material.GOLD_INGOT, 1))); getPlugin().getPowerupRegistry().spawnPowerup(loc, arena); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java index 3d6ab188..d0b78250 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java @@ -86,7 +86,7 @@ public void handleCall(PluginArena arena) { Map detectiveChances = new HashMap<>(); int size = pluginArena.getPlayerSpawnPoints().size(); for(Player player : arena.getPlayers()) { - VersionUtils.teleport(player, pluginArena.getPlayerSpawnPoints().get(size == 1 ? 0 : getPlugin().getRandom().nextInt(size))); + VersionUtils.teleport(player, pluginArena.getPlayerSpawnPoints().get(size == 1 ? 0 : getPlugin().getRandom().nextInt(size - 1))); User user = arena.getPlugin().getUserManager().getUser(player); /* //reset local variables to be 100% sure From ff961b5fa3fc788df661843c76ee472cbab874fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Sep 2022 21:17:33 +0000 Subject: [PATCH 089/127] Bump pom.xml from 1.7.9-dev34 to 1.7.9-dev35 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 743a46a8..214dc1b1 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev34 + 1.7.9-dev35 MurderMystery From 19bf95fdedc8e0188b1dea1ead40f45b440cbccc Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 16 Sep 2022 22:11:34 +0200 Subject: [PATCH 090/127] Disabling SERVER_JOIN items on special_items.yml by default --- src/main/resources/special_items.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/special_items.yml b/src/main/resources/special_items.yml index 91f6d6f9..a7c39efa 100644 --- a/src/main/resources/special_items.yml +++ b/src/main/resources/special_items.yml @@ -90,6 +90,7 @@ Forcestart: move: false Arena-Selector: + disabled: true # disabled by default permission: "" execute: - "p:mm arenas" @@ -103,6 +104,7 @@ Arena-Selector: move: false Stats: + disabled: true # disabled by default permission: "" execute: - "p:mm stats" @@ -117,6 +119,7 @@ Stats: # Uses bungee.yml configuration - if enabled it tries to connect to your hub Back-To-Hub: + disabled: true # disabled by default permission: "" execute: - "p:hub" From 9d87a0383522f82cb769ed3c0ff19d35a9f1559f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 16 Sep 2022 20:12:02 +0000 Subject: [PATCH 091/127] Bump pom.xml from 1.7.9-dev35 to 1.7.9-dev36 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 214dc1b1..5eeabd42 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev35 + 1.7.9-dev36 MurderMystery From 43df77acffaaf07aa89524b23ecf9118e511e63c Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Sun, 16 Oct 2022 00:13:33 +0200 Subject: [PATCH 092/127] Split Main into boot classes --- .../plugily/projects/murdermystery/Main.java | 859 +----------------- .../murdermystery/arena/ArenaEvents.java | 16 - .../boot/AdditionalValueInitializer.java | 108 +++ .../boot/MessageInitializer.java | 131 +++ .../boot/PlaceholderInitializer.java | 366 ++++++++ 5 files changed, 626 insertions(+), 854 deletions(-) create mode 100644 src/main/java/plugily/projects/murdermystery/boot/AdditionalValueInitializer.java create mode 100644 src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java create mode 100644 src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java diff --git a/src/main/java/plugily/projects/murdermystery/Main.java b/src/main/java/plugily/projects/murdermystery/Main.java index ee9baec0..b719d78c 100644 --- a/src/main/java/plugily/projects/murdermystery/Main.java +++ b/src/main/java/plugily/projects/murdermystery/Main.java @@ -18,39 +18,24 @@ package plugily.projects.murdermystery; -import org.bukkit.ChatColor; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPluginLoader; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import plugily.projects.minigamesbox.classic.PluginMain; -import plugily.projects.minigamesbox.classic.api.StatisticType; -import plugily.projects.minigamesbox.classic.arena.PluginArena; -import plugily.projects.minigamesbox.classic.arena.options.ArenaOption; -import plugily.projects.minigamesbox.classic.commonsbox.number.NumberUtils; -import plugily.projects.minigamesbox.classic.handlers.language.Message; -import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; -import plugily.projects.minigamesbox.classic.handlers.permissions.PermissionCategory; -import plugily.projects.minigamesbox.classic.handlers.placeholder.Placeholder; -import plugily.projects.minigamesbox.classic.handlers.reward.RewardType; import plugily.projects.minigamesbox.classic.handlers.setup.SetupInventory; import plugily.projects.minigamesbox.classic.handlers.setup.categories.PluginSetupCategoryManager; -import plugily.projects.minigamesbox.classic.preferences.ConfigOption; -import plugily.projects.minigamesbox.classic.user.User; -import plugily.projects.minigamesbox.classic.utils.services.locale.Locale; -import plugily.projects.minigamesbox.classic.utils.services.locale.LocaleRegistry; import plugily.projects.minigamesbox.classic.utils.services.metrics.Metrics; import plugily.projects.murdermystery.arena.Arena; import plugily.projects.murdermystery.arena.ArenaEvents; import plugily.projects.murdermystery.arena.ArenaManager; import plugily.projects.murdermystery.arena.ArenaRegistry; import plugily.projects.murdermystery.arena.ArenaUtils; -import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.arena.special.SpecialBlockEvents; import plugily.projects.murdermystery.arena.special.mysterypotion.MysteryPotionRegistry; import plugily.projects.murdermystery.arena.special.pray.PrayerRegistry; +import plugily.projects.murdermystery.boot.AdditionalValueInitializer; +import plugily.projects.murdermystery.boot.MessageInitializer; +import plugily.projects.murdermystery.boot.PlaceholderInitializer; import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; import plugily.projects.murdermystery.events.PluginEvents; import plugily.projects.murdermystery.handlers.CorpseHandler; @@ -61,13 +46,11 @@ import plugily.projects.murdermystery.handlers.trails.TrailsManager; import java.io.File; -import java.util.Arrays; /** * Created by Tigerpanzer_02 on 13.03.2022 */ public class Main extends PluginMain { - private FileConfiguration entityUpgradesConfig; private ArenaRegistry arenaRegistry; private ArenaManager arenaManager; private ArgumentsRegistry argumentsRegistry; @@ -84,31 +67,31 @@ public Main() { @TestOnly protected Main( - JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { + JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { super(loader, description, dataFolder, file); } @Override public void onEnable() { long start = System.currentTimeMillis(); - registerLocales(); + MessageInitializer messageInitializer = new MessageInitializer(this); super.onEnable(); getDebugger().debug("[System] [Plugin] Initialization start"); - registerPlaceholders(); - addMessages(); - addAdditionalValues(); + new PlaceholderInitializer(this); + messageInitializer.registerMessages(); + new AdditionalValueInitializer(this); initializePluginClasses(); if(getConfigPreferences().getOption("HIDE_NAMETAGS")) { getServer().getScheduler().scheduleSyncRepeatingTask(this, () -> - getServer().getOnlinePlayers().forEach(ArenaUtils::updateNameTagsVisibility), 60, 140); + getServer().getOnlinePlayers().forEach(ArenaUtils::updateNameTagsVisibility), 60, 140); } getDebugger().debug("Full {0} plugin enabled", getName()); getDebugger() - .debug( - "[System] [Plugin] Initialization finished took {0}ms", - System.currentTimeMillis() - start); + .debug( + "[System] [Plugin] Initialization finished took {0}ms", + System.currentTimeMillis() - start); } public void initializePluginClasses() { @@ -117,7 +100,6 @@ public void initializePluginClasses() { addFileName("skins"); addFileName("special_blocks"); addFileName("trails"); - addArenaOptions(); Arena.init(this); ArenaUtils.init(this); new ArenaEvents(this); @@ -141,816 +123,17 @@ public void initializePluginClasses() { addPluginMetrics(); } - public void registerLocales() { - Arrays.asList( - new Locale( - "Chinese (Traditional)", - "简体中文", - "zh_HK", - "POEditor contributors", - Arrays.asList("中文(傳統)", "中國傳統", "chinese_traditional", "zh")), - new Locale( - "Chinese (Simplified)", - "简体中文", - "zh_CN", - "POEditor contributors", - Arrays.asList("简体中文", "中文", "chinese", "chinese_simplified", "cn")), - new Locale( - "Czech", - "Český", - "cs_CZ", - "POEditor contributors", - Arrays.asList("czech", "cesky", "český", "cs")), - new Locale( - "Dutch", - "Nederlands", - "nl_NL", - "POEditor contributors", - Arrays.asList("dutch", "nederlands", "nl")), - new Locale( - "English", - "English", - "en_GB", - "Tigerpanzer_02", - Arrays.asList("default", "english", "en")), - new Locale( - "French", - "Français", - "fr_FR", - "POEditor contributors", - Arrays.asList("french", "francais", "français", "fr")), - new Locale( - "German", - "Deutsch", - "de_DE", - "Tigerkatze and POEditor contributors", - Arrays.asList("deutsch", "german", "de")), - new Locale( - "Hungarian", - "Magyar", - "hu_HU", - "POEditor contributors", - Arrays.asList("hungarian", "magyar", "hu")), - new Locale( - "Indonesian", - "Indonesia", - "id_ID", - "POEditor contributors", - Arrays.asList("indonesian", "indonesia", "id")), - new Locale( - "Italian", - "Italiano", - "it_IT", - "POEditor contributors", - Arrays.asList("italian", "italiano", "it")), - new Locale( - "Korean", - "한국의", - "ko_KR", - "POEditor contributors", - Arrays.asList("korean", "한국의", "kr")), - new Locale( - "Lithuanian", - "Lietuviešu", - "lt_LT", - "POEditor contributors", - Arrays.asList("lithuanian", "lietuviešu", "lietuviesu", "lt")), - new Locale( - "Polish", "Polski", "pl_PL", "Plajer", Arrays.asList("polish", "polski", "pl")), - new Locale( - "Portuguese (BR)", - "Português Brasileiro", - "pt_BR", - "POEditor contributors", - Arrays.asList("brazilian", "brasil", "brasileiro", "pt-br", "pt_br")), - new Locale( - "Romanian", - "Românesc", - "ro_RO", - "POEditor contributors", - Arrays.asList("romanian", "romanesc", "românesc", "ro")), - new Locale( - "Russian", - "Pусский", - "ru_RU", - "POEditor contributors", - Arrays.asList("russian", "pусский", "pyccknn", "russkiy", "ru")), - new Locale( - "Spanish", - "Español", - "es_ES", - "POEditor contributors", - Arrays.asList("spanish", "espanol", "español", "es")), - new Locale( - "Thai", "Thai", "th_TH", "POEditor contributors", Arrays.asList("thai", "th")), - new Locale( - "Turkish", - "Türk", - "tr_TR", - "POEditor contributors", - Arrays.asList("turkish", "turk", "türk", "tr")), - new Locale( - "Vietnamese", - "Việt", - "vn_VN", - "POEditor contributors", - Arrays.asList("vietnamese", "viet", "việt", "vn"))) - .forEach(LocaleRegistry::registerLocale); - } - - public void addAdditionalValues() { - getConfigPreferences() - .registerOption( - "CORPSES_INTEGRATION_OVERWRITE", - new ConfigOption("Corpses.Integration-Overwrite", true)); - getConfigPreferences() - .registerOption("BOW_KILL_DETECTIVE", new ConfigOption("Bow.Kill-Detective", true)); - getConfigPreferences().registerOption("HIDE_DEATH", new ConfigOption("Hide.Death", false)); - getConfigPreferences() - .registerOption("HIDE_NAMETAGS", new ConfigOption("Hide.Nametags", false)); - getConfigPreferences().registerOption("GOLD_SPAWNER_MODE_ALL", new ConfigOption("Gold.Spawner-Mode", false)); - getConfigPreferences().registerOption("GOLD_LIMITER", new ConfigOption("Gold.Limiter", false)); - getConfigPreferences().registerOption("MURDERER_LOCATOR", new ConfigOption("Murderer.Locator", true)); - getStatsStorage() - .registerStatistic( - "KILLS", new StatisticType("kills", true, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "DEATHS", new StatisticType("deaths", true, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "HIGHEST_SCORE", - new StatisticType("highest_score", true, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "CONTRIBUTION_DETECTIVE", - new StatisticType("contribution_detective", true, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "CONTRIBUTION_MURDERER", - new StatisticType("contribution_murderer", true, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "PASS_MURDERER", - new StatisticType("pass_murderer", true, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "PASS_DETECTIVE", - new StatisticType("pass_detective", true, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "LOCAL_PRAISES", - new StatisticType("local_praises", false, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "LOCAL_SCORE", new StatisticType("local_score", false, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "LOCAL_PRAY", new StatisticType("local_pray", false, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "LOCAL_GOLD", new StatisticType("local_gold", false, "int(11) NOT NULL DEFAULT '0'")); - getStatsStorage() - .registerStatistic( - "LOCAL_KILLS", new StatisticType("local_kills", false, "int(11) NOT NULL DEFAULT '0'")); - - getPermissionsManager() - .registerPermissionCategory( - "CHANCES_BOOSTER", new PermissionCategory("Chances-Boost", null)); - getPermissionsManager() - .registerPermissionCategory( - "MURDERER_BOOSTER", new PermissionCategory("Murderer-Boost", null)); - getPermissionsManager() - .registerPermissionCategory( - "DETECTIVE_BOOSTER", new PermissionCategory("Detective-Boost", null)); - - getRewardsHandler().registerRewardType("KILL_DETECTIVE", new RewardType("detective-kill")); - getRewardsHandler().registerRewardType("KILL_MURDERER", new RewardType("murderer-kill")); - getRewardsHandler().registerRewardType("WIN", new RewardType("win")); - getRewardsHandler().registerRewardType("LOSE", new RewardType("lose")); - getRewardsHandler().registerRewardType("PLAYER_DEATH", new RewardType("player-death")); - getRewardsHandler().registerRewardType("GOLD_PICKUP", new RewardType("gold-pickup")); - - getSpecialItemManager().registerSpecialItem("ROLE_PASS", "Role-Pass"); - } - - public void addMessages() { - getMessageManager().registerMessage("", new Message("", "")); - getMessageManager() - .registerMessage( - "SCOREBOARD_ROLES_DETECTIVE", new Message("Scoreboard.Roles.Detective", "")); - getMessageManager() - .registerMessage("SCOREBOARD_ROLES_MURDERER", new Message("Scoreboard.Roles.Murderer", "")); - getMessageManager() - .registerMessage("SCOREBOARD_ROLES_INNOCENT", new Message("Scoreboard.Roles.Innocent", "")); - getMessageManager() - .registerMessage("SCOREBOARD_ROLES_DEAD", new Message("Scoreboard.Roles.Dead", "")); - getMessageManager() - .registerMessage( - "SCOREBOARD_DETECTIVE_ALIVE", new Message("Scoreboard.Detective.Alive", "")); - getMessageManager() - .registerMessage( - "SCOREBOARD_DETECTIVE_BOW_DROPPED", - new Message("Scoreboard.Detective.Bow.Dropped", "")); - getMessageManager() - .registerMessage( - "SCOREBOARD_DETECTIVE_BOW_PICKED", new Message("Scoreboard.Detective.Bow.Picked", "")); - - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_STOPPED", - new Message("In-Game.Messages.Game-End.Placeholders.Murderer.Stopped", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_YOU", - new Message("In-Game.Messages.Game-End.Placeholders.Murderer.Killed.You", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL", - new Message("In-Game.Messages.Game-End.Placeholders.Murderer.Killed.All", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_YOU", - new Message("In-Game.Messages.Game-End.Placeholders.Innocent.Killed.You", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_WRONGLY", - new Message("In-Game.Messages.Game-End.Placeholders.Innocent.Killed.All", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_NOBODY", - new Message("In-Game.Messages.Game-End.Placeholders.Nobody", "")); - - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_ROLE_CHANCES_ACTION_BAR", - new Message("In-Game.Messages.Arena.Chances.Action-Bar", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_COOLDOWN", new Message("In-Game.Messages.Arena.Cooldown", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_LOCATOR_BOW", - new Message("In-Game.Messages.Arena.Locator.Bow", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_LOCATOR_INNOCENT", - new Message("In-Game.Messages.Arena.Locator.Innocent", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_LOCATOR_WATCH_OUT", - new Message("In-Game.Messages.Arena.Locator.Watch-Out", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PASS_NAME", - new Message("In-Game.Messages.Arena.Pass.Name", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_NAME", - new Message("In-Game.Messages.Arena.Pass.Role.Murderer.Name", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_LORE", - new Message("In-Game.Messages.Arena.Pass.Role.Murderer.Lore", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_NAME", - new Message("In-Game.Messages.Arena.Pass.Role.Detective.Name", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_LORE", - new Message("In-Game.Messages.Arena.Pass.Role.Detective.Lore", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PASS_FAIL", - new Message("In-Game.Messages.Arena.Pass.Fail", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PASS_SUCCESS", - new Message("In-Game.Messages.Arena.Pass.Success", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PASS_CHANGE", - new Message("In-Game.Messages.Arena.Pass.Change", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_TIME_LEFT", - new Message("In-Game.Messages.Arena.Playing.Time-Left", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_CHANGE", - new Message("In-Game.Messages.Arena.Playing.Role.Change", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_MURDERER", - new Message("In-Game.Messages.Arena.Playing.Role.Murderer", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_DETECTIVE", - new Message("In-Game.Messages.Arena.Playing.Role.Detective", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_INNOCENT", - new Message("In-Game.Messages.Arena.Playing.Role.Innocent", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_BONUS", - new Message("In-Game.Messages.Arena.Playing.Score.Bonus", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_GOLD", - new Message("In-Game.Messages.Arena.Playing.Score.Gold", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_PLAYER", - new Message("In-Game.Messages.Arena.Playing.Score.Action.Kill.Player", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_MURDERER", - new Message("In-Game.Messages.Arena.Playing.Score.Action.Kill.Murderer", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_INNOCENT", - new Message("In-Game.Messages.Arena.Playing.Score.Action.Kill.Innocent", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_PICKUP_GOLD", - new Message("In-Game.Messages.Arena.Playing.Score.Action.Pickup.Gold", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_SURVIVING_TIME", - new Message("In-Game.Messages.Arena.Playing.Score.Action.Surviving.Time", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_SURVIVING_END", - new Message("In-Game.Messages.Arena.Playing.Score.Action.Surviving.End", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_WIN", - new Message("In-Game.Messages.Arena.Playing.Score.Action.Win", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_DETECTIVE", - new Message("In-Game.Messages.Arena.Playing.Score.Action.Detective", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SWORD_SOON", - new Message("In-Game.Messages.Arena.Playing.Sword.Soon", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_CAULDRON_POTION", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Cauldron.Potion", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_CAULDRON_HOLOGRAM", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Cauldron.Hologram", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_NOT_ENOUGH_GOLD", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Not-Enough-Gold", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_HOLOGRAM", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Hologram", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_CHAT", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Chat", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PAY", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Pay", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_HEARD", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Heard", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_FEELING_BLESSED", - new Message( - "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Feeling.Blessed", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_FEELING_CURSED", - new Message( - "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Feeling.Cursed", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_DETECTIVE_REVELATION", - new Message( - "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Detective-Revelation", - "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_GOLD_RUSH", - new Message( - "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Gold-Rush", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_SINGLE_COMPENSATION", - new Message( - "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Single-Compensation", - "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_BOW", - new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Bow", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_SLOWNESS", - new Message( - "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Slowness", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_BLINDNESS", - new Message( - "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Blindness", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_GOLD", - new Message( - "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Gold", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_DEATH", - new Message( - "In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Death", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_BOW_DROPPED", - new Message("In-Game.Messages.Arena.Playing.Bow.Dropped", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_BOW_PICKUP", - new Message("In-Game.Messages.Arena.Playing.Bow.Pickup", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_BOW_SHOT_GOLD", - new Message("In-Game.Messages.Arena.Playing.Bow.Shot.Gold", "")); - getMessageManager() - .registerMessage( - "IN_GAME_MESSAGES_ARENA_PLAYING_BOW_SHOT_TITLE", - new Message("In-Game.Messages.Arena.Playing.Bow.Shot.Title", "")); - getMessageManager() - .registerMessage( - "LEADERBOARD_STATISTICS_CONTRIBUTION_DETECTIVE", - new Message("Leaderboard.Statistics.Detective-Contribution", "")); - getMessageManager() - .registerMessage( - "LEADERBOARD_STATISTICS_CONTRIBUTION_MURDERER", - new Message("Leaderboard.Statistics.Murderer-Contribution", "")); - - getMessageManager() - .registerMessage( - "LEADERBOARD_STATISTICS_PASS_DETECTIVE", - new Message("Leaderboard.Statistics.Detective-Pass", "")); - getMessageManager() - .registerMessage( - "LEADERBOARD_STATISTICS_PASS_MURDERER", - new Message("Leaderboard.Statistics.Murderer-Pass", "")); - getMessageManager().registerMessage("LEADERBOARD_STATISTICS_KILLS", new Message("Leaderboard.Statistics.Kills", "")); - getMessageManager().registerMessage("LEADERBOARD_STATISTICS_DEATHS", new Message("Leaderboard.Statistics.Deaths", "")); - getMessageManager().registerMessage("LEADERBOARD_STATISTICS_HIGHEST_SCORE", new Message("Leaderboard.Statistics.Highest-Score", "")); - } - - public void registerPlaceholders() { - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "detective_list", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - StringBuilder detectives = new StringBuilder(); - for(Player p : pluginArena.getDetectiveList()) { - detectives.append(p.getName()).append(", "); - } - - int index = detectives.length() - 2; - if(index > 0 && index < detectives.length()) { - detectives.deleteCharAt(index); - } - - return (pluginArena.isDetectiveDead() ? ChatColor.STRIKETHROUGH : "") - + detectives.toString(); - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "murderer_list", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - StringBuilder murders = new StringBuilder(); - for(Player p : pluginArena.getMurdererList()) { - User user = getUserManager().getUser(p); - int localKills = user.getStatistic("LOCAL_KILLS"); - murders.append(p.getName()); - if(pluginArena.getMurdererList().size() > 1) { - murders.append(" (").append(localKills).append("), "); - } - } - if(pluginArena.getMurdererList().size() > 1) { - murders.deleteCharAt(murders.length() - 2); - } - - return (pluginArena.aliveMurderer() == 1 ? "" : ChatColor.STRIKETHROUGH) - + murders.toString(); - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "murderer_kills", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - int murdererKills = 0; - for(Player p : pluginArena.getMurdererList()) { - User user = getUserManager().getUser(p); - int localKills = user.getStatistic("LOCAL_KILLS"); - murdererKills += localKills; - } - return Integer.toString(murdererKills); - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "hero", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - Player hero = pluginArena.getCharacter(Arena.CharacterType.HERO); - return hero != null - ? hero.getName() - : new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_NOBODY") - .asKey() - .build(); - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "murderer_chance", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - int totalMurderer = 0; - - for(Player p : arena.getPlayers()) { - User user = getUserManager().getUser(p); - totalMurderer += user.getStatistic("CONTRIBUTION_MURDERER"); - } - if(totalMurderer == 0) { - totalMurderer = 1; - } - User user = getUserManager().getUser(player); - return NumberUtils.round( - ((double) user.getStatistic("CONTRIBUTION_MURDERER") - / (double) totalMurderer) - * 100.0, - 2) - + "%"; - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "detective_chance", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - int totalDetectives = 0; - - for(Player p : arena.getPlayers()) { - User user = getUserManager().getUser(p); - totalDetectives += user.getStatistic("CONTRIBUTION_DETECTIVE"); - } - if(totalDetectives == 0) { - totalDetectives = 1; - } - User user = getUserManager().getUser(player); - return NumberUtils.round( - ((double) user.getStatistic("CONTRIBUTION_DETECTIVE") - / (double) totalDetectives) - * 100.0, - 2) - + "%"; - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "detective_status", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - if(pluginArena.isDetectiveDead()) { - if(!pluginArena.isCharacterSet(Arena.CharacterType.FAKE_DETECTIVE)) { - return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_DROPPED").asKey().build(); - } else { - return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_PICKED").asKey().build(); - } - } else { - return new MessageBuilder("SCOREBOARD_DETECTIVE_ALIVE").asKey().build(); - } - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "innocent_size", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - int innocents = 0; - for(Player p : arena.getPlayersLeft()) { - if(!Role.isRole(Role.MURDERER, getUserManager().getUser(p))) { - innocents++; - } - } - return Integer.toString(innocents); - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "player_role", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - User user = getUserManager().getUser(player); - String role; - if(pluginArena.isDeathPlayer(player)) { - role = new MessageBuilder("SCOREBOARD_ROLES_DEAD").asKey().build(); - } else if(Role.isRole(Role.MURDERER, user, arena)) { - role = new MessageBuilder("SCOREBOARD_ROLES_DETECTIVE").asKey().build(); - } else if(Role.isRole(Role.ANY_DETECTIVE, user, arena)) { - role = new MessageBuilder("SCOREBOARD_ROLES_MURDERER").asKey().build(); - } else { - role = new MessageBuilder("SCOREBOARD_ROLES_INNOCENT").asKey().build(); - } - return role; - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "summary_player", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - return getSummary(player, arena); - } - - @Nullable - private String getSummary(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - String summaryEnding; - - if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) - && pluginArena.getMurdererList().contains(player)) { - summaryEnding = - new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") - .asKey() - .arena(pluginArena) - .build(); - } else if(!pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) - && !pluginArena.getMurdererList().contains(player)) { - summaryEnding = - new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") - .asKey() - .arena(pluginArena) - .build(); - } else { - summaryEnding = - new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_LOSE") - .asKey() - .arena(pluginArena) - .build(); - } - return summaryEnding; - } - }); - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "summary", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - return getSummary(arena); - } - - @Override - public String getValue(PluginArena arena) { - return getSummary(arena); - } - - @Nullable - private String getSummary(PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - String summaryEnding; - - if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft())) { - summaryEnding = - new MessageBuilder( - "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL") - .asKey() - .arena(pluginArena) - .build(); - } else { - summaryEnding = - new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_STOPPED") - .asKey() - .arena(pluginArena) - .build(); - } - return summaryEnding; - } - }); - } - private void addPluginMetrics() { getMetrics() - .addCustomChart( - new Metrics.SimplePie( - "hooked_addons", - () -> { - if(getServer().getPluginManager().getPlugin("MurderMystery-Extension") != null) { - return "Extension"; - } - return "None"; - })); - } - - private void addArenaOptions() { - getArenaOptionManager().registerArenaOption("DETECTIVE_DIVIDER", new ArenaOption("null", 1)); - getArenaOptionManager().registerArenaOption("MURDERER_DIVIDER", new ArenaOption("null", 1)); + .addCustomChart( + new Metrics.SimplePie( + "hooked_addons", + () -> { + if(getServer().getPluginManager().getPlugin("MurderMystery-Extension") != null) { + return "Extension"; + } + return "None"; + })); } @Override diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index 2afc938f..5dac8f44 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -73,22 +73,6 @@ public ArenaEvents(Main plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } - @EventHandler - public void onArmorStandEject(EntityDismountEvent e) { - if (!(e.getEntity() instanceof ArmorStand) - || !"MurderMysteryArmorStand".equals(e.getEntity().getCustomName())) { - return; - } - if (!(e.getDismounted() instanceof Player)) { - return; - } - if (e.getDismounted().isDead()) { - e.getEntity().remove(); - } - // we could use setCancelled here but for 1.12 support we cannot (no api) - e.getDismounted().addPassenger(e.getEntity()); - } - @Override public void handleIngameVoidDeath(Player victim, PluginArena arena) { Arena pluginArena = plugin.getArenaRegistry().getArena(arena.getId()); diff --git a/src/main/java/plugily/projects/murdermystery/boot/AdditionalValueInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/AdditionalValueInitializer.java new file mode 100644 index 00000000..0de88e35 --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/boot/AdditionalValueInitializer.java @@ -0,0 +1,108 @@ +package plugily.projects.murdermystery.boot; + +import plugily.projects.minigamesbox.classic.api.StatisticType; +import plugily.projects.minigamesbox.classic.api.StatsStorage; +import plugily.projects.minigamesbox.classic.arena.options.ArenaOption; +import plugily.projects.minigamesbox.classic.arena.options.ArenaOptionManager; +import plugily.projects.minigamesbox.classic.handlers.items.SpecialItemManager; +import plugily.projects.minigamesbox.classic.handlers.permissions.PermissionCategory; +import plugily.projects.minigamesbox.classic.handlers.permissions.PermissionsManager; +import plugily.projects.minigamesbox.classic.handlers.reward.RewardType; +import plugily.projects.minigamesbox.classic.handlers.reward.RewardsFactory; +import plugily.projects.minigamesbox.classic.preferences.ConfigOption; +import plugily.projects.minigamesbox.classic.preferences.ConfigPreferences; +import plugily.projects.murdermystery.Main; + +/** + * @author Tigerpanzer_02 + *

+ * Created at 15.10.2022 + */ +public class AdditionalValueInitializer { + + private final Main plugin; + + public AdditionalValueInitializer(Main plugin) { + this.plugin = plugin; + registerConfigOptions(); + registerStatistics(); + registerPermission(); + registerRewards(); + registerSpecialItems(); + registerArenaOptions(); + } + + private void registerConfigOptions() { + getConfigPreferences().registerOption("CORPSES_INTEGRATION_OVERWRITE", new ConfigOption("Corpses.Integration-Overwrite", true)); + getConfigPreferences().registerOption("BOW_KILL_DETECTIVE", new ConfigOption("Bow.Kill-Detective", true)); + getConfigPreferences().registerOption("HIDE_DEATH", new ConfigOption("Hide.Death", false)); + getConfigPreferences().registerOption("HIDE_NAMETAGS", new ConfigOption("Hide.Nametags", false)); + getConfigPreferences().registerOption("GOLD_SPAWNER_MODE_ALL", new ConfigOption("Gold.Spawner-Mode", false)); + getConfigPreferences().registerOption("GOLD_LIMITER", new ConfigOption("Gold.Limiter", false)); + getConfigPreferences().registerOption("MURDERER_LOCATOR", new ConfigOption("Murderer.Locator", true)); + } + + private void registerStatistics() { + getStatsStorage().registerStatistic("KILLS", new StatisticType("kills", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("DEATHS", new StatisticType("deaths", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("HIGHEST_SCORE", new StatisticType("highest_score", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("CONTRIBUTION_DETECTIVE", new StatisticType("contribution_detective", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("CONTRIBUTION_MURDERER", new StatisticType("contribution_murderer", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("PASS_MURDERER", new StatisticType("pass_murderer", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("PASS_DETECTIVE", new StatisticType("pass_detective", true, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("LOCAL_PRAISES", new StatisticType("local_praises", false, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("LOCAL_SCORE", new StatisticType("local_score", false, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("LOCAL_PRAY", new StatisticType("local_pray", false, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("LOCAL_GOLD", new StatisticType("local_gold", false, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("LOCAL_KILLS", new StatisticType("local_kills", false, "int(11) NOT NULL DEFAULT '0'")); + } + + private void registerPermission() { + getPermissionsManager().registerPermissionCategory("CHANCES_BOOSTER", new PermissionCategory("Chances-Boost", null)); + getPermissionsManager().registerPermissionCategory("MURDERER_BOOSTER", new PermissionCategory("Murderer-Boost", null)); + getPermissionsManager().registerPermissionCategory("DETECTIVE_BOOSTER", new PermissionCategory("Detective-Boost", null)); + } + + private void registerRewards() { + getRewardsHandler().registerRewardType("KILL_DETECTIVE", new RewardType("detective-kill")); + getRewardsHandler().registerRewardType("KILL_MURDERER", new RewardType("murderer-kill")); + getRewardsHandler().registerRewardType("WIN", new RewardType("win")); + getRewardsHandler().registerRewardType("LOSE", new RewardType("lose")); + getRewardsHandler().registerRewardType("PLAYER_DEATH", new RewardType("player-death")); + getRewardsHandler().registerRewardType("GOLD_PICKUP", new RewardType("gold-pickup")); + } + + private void registerSpecialItems() { + getSpecialItemManager().registerSpecialItem("ROLE_PASS", "Role-Pass"); + } + + private void registerArenaOptions() { + getArenaOptionManager().registerArenaOption("DETECTIVE_DIVIDER", new ArenaOption("null", 1)); + getArenaOptionManager().registerArenaOption("MURDERER_DIVIDER", new ArenaOption("null", 1)); + } + + private ConfigPreferences getConfigPreferences() { + return plugin.getConfigPreferences(); + } + + private StatsStorage getStatsStorage() { + return plugin.getStatsStorage(); + } + + private PermissionsManager getPermissionsManager() { + return plugin.getPermissionsManager(); + } + + private RewardsFactory getRewardsHandler() { + return plugin.getRewardsHandler(); + } + + private SpecialItemManager getSpecialItemManager() { + return plugin.getSpecialItemManager(); + } + + private ArenaOptionManager getArenaOptionManager() { + return plugin.getArenaOptionManager(); + } + +} diff --git a/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java new file mode 100644 index 00000000..d299d805 --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java @@ -0,0 +1,131 @@ + +package plugily.projects.murdermystery.boot; + + +import plugily.projects.minigamesbox.classic.handlers.language.Message; +import plugily.projects.minigamesbox.classic.handlers.language.MessageManager; +import plugily.projects.minigamesbox.classic.utils.services.locale.Locale; +import plugily.projects.minigamesbox.classic.utils.services.locale.LocaleRegistry; +import plugily.projects.murdermystery.Main; + +import java.util.Arrays; + +/** + * @author Tigerpanzer_02 + *

+ * Created at 15.10.2022 + */ +public class MessageInitializer { + private final Main plugin; + + public MessageInitializer(Main plugin) { + this.plugin = plugin; + registerLocales(); + } + + public void registerMessages() { + getMessageManager().registerMessage("", new Message("", "")); + getMessageManager().registerMessage("SCOREBOARD_ROLES_DETECTIVE", new Message("Scoreboard.Roles.Detective", "")); + getMessageManager().registerMessage("SCOREBOARD_ROLES_MURDERER", new Message("Scoreboard.Roles.Murderer", "")); + getMessageManager().registerMessage("SCOREBOARD_ROLES_INNOCENT", new Message("Scoreboard.Roles.Innocent", "")); + getMessageManager().registerMessage("SCOREBOARD_ROLES_DEAD", new Message("Scoreboard.Roles.Dead", "")); + getMessageManager().registerMessage("SCOREBOARD_DETECTIVE_ALIVE", new Message("Scoreboard.Detective.Alive", "")); + getMessageManager().registerMessage("SCOREBOARD_DETECTIVE_BOW_DROPPED", new Message("Scoreboard.Detective.Bow.Dropped", "")); + getMessageManager().registerMessage("SCOREBOARD_DETECTIVE_BOW_PICKED", new Message("Scoreboard.Detective.Bow.Picked", "")); + + getMessageManager().registerMessage("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_STOPPED", new Message("In-Game.Messages.Game-End.Placeholders.Murderer.Stopped", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_YOU", new Message("In-Game.Messages.Game-End.Placeholders.Murderer.Killed.You", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL", new Message("In-Game.Messages.Game-End.Placeholders.Murderer.Killed.All", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_YOU", new Message("In-Game.Messages.Game-End.Placeholders.Innocent.Killed.You", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_WRONGLY", new Message("In-Game.Messages.Game-End.Placeholders.Innocent.Killed.All", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_NOBODY", new Message("In-Game.Messages.Game-End.Placeholders.Nobody", "")); + + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_ROLE_CHANCES_ACTION_BAR", new Message("In-Game.Messages.Arena.Chances.Action-Bar", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_COOLDOWN", new Message("In-Game.Messages.Arena.Cooldown", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_LOCATOR_BOW", new Message("In-Game.Messages.Arena.Locator.Bow", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_LOCATOR_INNOCENT", new Message("In-Game.Messages.Arena.Locator.Innocent", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_LOCATOR_WATCH_OUT", new Message("In-Game.Messages.Arena.Locator.Watch-Out", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PASS_NAME", new Message("In-Game.Messages.Arena.Pass.Name", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_NAME", new Message("In-Game.Messages.Arena.Pass.Role.Murderer.Name", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_LORE", new Message("In-Game.Messages.Arena.Pass.Role.Murderer.Lore", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_NAME", new Message("In-Game.Messages.Arena.Pass.Role.Detective.Name", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_LORE", new Message("In-Game.Messages.Arena.Pass.Role.Detective.Lore", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PASS_FAIL", new Message("In-Game.Messages.Arena.Pass.Fail", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PASS_SUCCESS", new Message("In-Game.Messages.Arena.Pass.Success", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PASS_CHANGE", new Message("In-Game.Messages.Arena.Pass.Change", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_TIME_LEFT", new Message("In-Game.Messages.Arena.Playing.Time-Left", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_CHANGE", new Message("In-Game.Messages.Arena.Playing.Role.Change", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_MURDERER", new Message("In-Game.Messages.Arena.Playing.Role.Murderer", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_DETECTIVE", new Message("In-Game.Messages.Arena.Playing.Role.Detective", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_INNOCENT", new Message("In-Game.Messages.Arena.Playing.Role.Innocent", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_BONUS", new Message("In-Game.Messages.Arena.Playing.Score.Bonus", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_GOLD", new Message("In-Game.Messages.Arena.Playing.Score.Gold", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_PLAYER", new Message("In-Game.Messages.Arena.Playing.Score.Action.Kill.Player", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_MURDERER", new Message("In-Game.Messages.Arena.Playing.Score.Action.Kill.Murderer", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_KILL_INNOCENT", new Message("In-Game.Messages.Arena.Playing.Score.Action.Kill.Innocent", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_PICKUP_GOLD", new Message("In-Game.Messages.Arena.Playing.Score.Action.Pickup.Gold", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_SURVIVING_TIME", new Message("In-Game.Messages.Arena.Playing.Score.Action.Surviving.Time", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_SURVIVING_END", new Message("In-Game.Messages.Arena.Playing.Score.Action.Surviving.End", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_WIN", new Message("In-Game.Messages.Arena.Playing.Score.Action.Win", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_ACTION_DETECTIVE", new Message("In-Game.Messages.Arena.Playing.Score.Action.Detective", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SWORD_SOON", new Message("In-Game.Messages.Arena.Playing.Sword.Soon", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_CAULDRON_POTION", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Cauldron.Potion", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_CAULDRON_HOLOGRAM", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Cauldron.Hologram", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_NOT_ENOUGH_GOLD", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Not-Enough-Gold", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_HOLOGRAM", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Hologram", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_CHAT", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Chat", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PAY", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Pay", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_HEARD", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Heard", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_FEELING_BLESSED", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Feeling.Blessed", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_FEELING_CURSED", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Feeling.Cursed", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_DETECTIVE_REVELATION", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Detective-Revelation", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_GOLD_RUSH", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Gold-Rush", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_SINGLE_COMPENSATION", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Single-Compensation", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_GIFTS_BOW", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Gifts.Bow", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_SLOWNESS", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Slowness", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_BLINDNESS", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Blindness", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_GOLD", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Gold", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_SPECIAL_BLOCKS_PRAY_PRAISE_CURSES_DEATH", new Message("In-Game.Messages.Arena.Playing.Special-Blocks.Pray.Praise.Curses.Death", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_DROPPED", new Message("In-Game.Messages.Arena.Playing.Bow.Dropped", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_PICKUP", new Message("In-Game.Messages.Arena.Playing.Bow.Pickup", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_SHOT_GOLD", new Message("In-Game.Messages.Arena.Playing.Bow.Shot.Gold", "")); + getMessageManager().registerMessage("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_SHOT_TITLE", new Message("In-Game.Messages.Arena.Playing.Bow.Shot.Title", "")); + getMessageManager().registerMessage("LEADERBOARD_STATISTICS_CONTRIBUTION_DETECTIVE", new Message("Leaderboard.Statistics.Detective-Contribution", "")); + getMessageManager().registerMessage("LEADERBOARD_STATISTICS_CONTRIBUTION_MURDERER", new Message("Leaderboard.Statistics.Murderer-Contribution", "")); + + getMessageManager().registerMessage("LEADERBOARD_STATISTICS_PASS_DETECTIVE", new Message("Leaderboard.Statistics.Detective-Pass", "")); + getMessageManager().registerMessage("LEADERBOARD_STATISTICS_PASS_MURDERER", new Message("Leaderboard.Statistics.Murderer-Pass", "")); + getMessageManager().registerMessage("LEADERBOARD_STATISTICS_KILLS", new Message("Leaderboard.Statistics.Kills", "")); + getMessageManager().registerMessage("LEADERBOARD_STATISTICS_DEATHS", new Message("Leaderboard.Statistics.Deaths", "")); + getMessageManager().registerMessage("LEADERBOARD_STATISTICS_HIGHEST_SCORE", new Message("Leaderboard.Statistics.Highest-Score", "")); + } + + private void registerLocales() { + Arrays.asList(new Locale("Chinese (Traditional)", "简体中文", "zh_HK", "POEditor contributors", Arrays.asList("中文(傳統)", "中國傳統", "chinese_traditional", "zh")), + new Locale("Chinese (Simplified)", "简体中文", "zh_CN", "POEditor contributors", Arrays.asList("简体中文", "中文", "chinese", "chinese_simplified", "cn")), + new Locale("Czech", "Český", "cs_CZ", "POEditor contributors", Arrays.asList("czech", "cesky", "český", "cs")), + new Locale("Dutch", "Nederlands", "nl_NL", "POEditor contributors", Arrays.asList("dutch", "nederlands", "nl")), + new Locale("English", "English", "en_GB", "Tigerpanzer_02", Arrays.asList("default", "english", "en")), + new Locale("French", "Français", "fr_FR", "POEditor contributors", Arrays.asList("french", "francais", "français", "fr")), + new Locale("German", "Deutsch", "de_DE", "Tigerkatze and POEditor contributors", Arrays.asList("deutsch", "german", "de")), + new Locale("Hungarian", "Magyar", "hu_HU", "POEditor contributors", Arrays.asList("hungarian", "magyar", "hu")), + new Locale("Indonesian", "Indonesia", "id_ID", "POEditor contributors", Arrays.asList("indonesian", "indonesia", "id")), + new Locale("Italian", "Italiano", "it_IT", "POEditor contributors", Arrays.asList("italian", "italiano", "it")), + new Locale("Korean", "한국의", "ko_KR", "POEditor contributors", Arrays.asList("korean", "한국의", "kr")), + new Locale("Lithuanian", "Lietuviešu", "lt_LT", "POEditor contributors", Arrays.asList("lithuanian", "lietuviešu", "lietuviesu", "lt")), + new Locale("Polish", "Polski", "pl_PL", "Plajer", Arrays.asList("polish", "polski", "pl")), + new Locale("Portuguese (BR)", "Português Brasileiro", "pt_BR", "POEditor contributors", Arrays.asList("brazilian", "brasil", "brasileiro", "pt-br", "pt_br")), + new Locale("Romanian", "Românesc", "ro_RO", "POEditor contributors", Arrays.asList("romanian", "romanesc", "românesc", "ro")), + new Locale("Russian", "Pусский", "ru_RU", "POEditor contributors", Arrays.asList("russian", "pусский", "pyccknn", "russkiy", "ru")), + new Locale("Spanish", "Español", "es_ES", "POEditor contributors", Arrays.asList("spanish", "espanol", "español", "es")), + new Locale("Thai", "Thai", "th_TH", "POEditor contributors", Arrays.asList("thai", "th")), + new Locale("Turkish", "Türk", "tr_TR", "POEditor contributors", Arrays.asList("turkish", "turk", "türk", "tr")), + new Locale("Vietnamese", "Việt", "vn_VN", "POEditor contributors", + Arrays.asList("vietnamese", "viet", "việt", "vn"))).forEach(LocaleRegistry::registerLocale); + } + + private MessageManager getMessageManager() { + return plugin.getMessageManager(); + } + +} diff --git a/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java new file mode 100644 index 00000000..b1e0f17f --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java @@ -0,0 +1,366 @@ + +package plugily.projects.murdermystery.boot; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.commonsbox.number.NumberUtils; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.handlers.placeholder.Placeholder; +import plugily.projects.minigamesbox.classic.handlers.placeholder.PlaceholderManager; +import plugily.projects.minigamesbox.classic.user.User; +import plugily.projects.minigamesbox.classic.user.UserManager; +import plugily.projects.murdermystery.Main; +import plugily.projects.murdermystery.arena.Arena; +import plugily.projects.murdermystery.arena.ArenaRegistry; +import plugily.projects.murdermystery.arena.role.Role; + +/** + * @author Tigerpanzer_02 + *

+ * Created at 15.10.2022 + */ +public class PlaceholderInitializer { + + private final Main plugin; + + public PlaceholderInitializer(Main plugin) { + this.plugin = plugin; + registerPlaceholders(); + } + + private void registerPlaceholders() { + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "detective_list", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + + StringBuilder detectives = new StringBuilder(); + for(Player p : pluginArena.getDetectiveList()) { + detectives.append(p.getName()).append(", "); + } + + int index = detectives.length() - 2; + if(index > 0 && index < detectives.length()) { + detectives.deleteCharAt(index); + } + + return (pluginArena.isDetectiveDead() ? ChatColor.STRIKETHROUGH : "") + + detectives.toString(); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "murderer_list", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + + StringBuilder murders = new StringBuilder(); + for(Player p : pluginArena.getMurdererList()) { + User user = getUserManager().getUser(p); + int localKills = user.getStatistic("LOCAL_KILLS"); + murders.append(p.getName()); + if(pluginArena.getMurdererList().size() > 1) { + murders.append(" (").append(localKills).append("), "); + } + } + if(pluginArena.getMurdererList().size() > 1) { + murders.deleteCharAt(murders.length() - 2); + } + + return (pluginArena.aliveMurderer() == 1 ? "" : ChatColor.STRIKETHROUGH) + + murders.toString(); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "murderer_kills", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + int murdererKills = 0; + for(Player p : pluginArena.getMurdererList()) { + User user = getUserManager().getUser(p); + int localKills = user.getStatistic("LOCAL_KILLS"); + murdererKills += localKills; + } + return Integer.toString(murdererKills); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "hero", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + Player hero = pluginArena.getCharacter(Arena.CharacterType.HERO); + return hero != null + ? hero.getName() + : new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_NOBODY") + .asKey() + .build(); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "murderer_chance", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + + int totalMurderer = 0; + + for(Player p : arena.getPlayers()) { + User user = getUserManager().getUser(p); + totalMurderer += user.getStatistic("CONTRIBUTION_MURDERER"); + } + if(totalMurderer == 0) { + totalMurderer = 1; + } + User user = getUserManager().getUser(player); + return NumberUtils.round( + ((double) user.getStatistic("CONTRIBUTION_MURDERER") + / (double) totalMurderer) + * 100.0, + 2) + + "%"; + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "detective_chance", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + + int totalDetectives = 0; + + for(Player p : arena.getPlayers()) { + User user = getUserManager().getUser(p); + totalDetectives += user.getStatistic("CONTRIBUTION_DETECTIVE"); + } + if(totalDetectives == 0) { + totalDetectives = 1; + } + User user = getUserManager().getUser(player); + return NumberUtils.round( + ((double) user.getStatistic("CONTRIBUTION_DETECTIVE") + / (double) totalDetectives) + * 100.0, + 2) + + "%"; + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "detective_status", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + + if(pluginArena.isDetectiveDead()) { + if(!pluginArena.isCharacterSet(Arena.CharacterType.FAKE_DETECTIVE)) { + return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_DROPPED").asKey().build(); + } else { + return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_PICKED").asKey().build(); + } + } else { + return new MessageBuilder("SCOREBOARD_DETECTIVE_ALIVE").asKey().build(); + } + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "innocent_size", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + int innocents = 0; + for(Player p : arena.getPlayersLeft()) { + if(!Role.isRole(Role.MURDERER, getUserManager().getUser(p))) { + innocents++; + } + } + return Integer.toString(innocents); + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "player_role", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + User user = getUserManager().getUser(player); + String role; + if(pluginArena.isDeathPlayer(player)) { + role = new MessageBuilder("SCOREBOARD_ROLES_DEAD").asKey().build(); + } else if(Role.isRole(Role.MURDERER, user, arena)) { + role = new MessageBuilder("SCOREBOARD_ROLES_DETECTIVE").asKey().build(); + } else if(Role.isRole(Role.ANY_DETECTIVE, user, arena)) { + role = new MessageBuilder("SCOREBOARD_ROLES_MURDERER").asKey().build(); + } else { + role = new MessageBuilder("SCOREBOARD_ROLES_INNOCENT").asKey().build(); + } + return role; + } + }); + + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "summary_player", + Placeholder.PlaceholderType.ARENA, + Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + return getSummary(player, arena); + } + + @Nullable + private String getSummary(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + String summaryEnding; + + if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) + && pluginArena.getMurdererList().contains(player)) { + summaryEnding = + new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") + .asKey() + .arena(pluginArena) + .build(); + } else if(!pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) + && !pluginArena.getMurdererList().contains(player)) { + summaryEnding = + new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") + .asKey() + .arena(pluginArena) + .build(); + } else { + summaryEnding = + new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_LOSE") + .asKey() + .arena(pluginArena) + .build(); + } + return summaryEnding; + } + }); + getPlaceholderManager() + .registerPlaceholder( + new Placeholder( + "summary", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + return getSummary(arena); + } + + @Override + public String getValue(PluginArena arena) { + return getSummary(arena); + } + + @Nullable + private String getSummary(PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + String summaryEnding; + + if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft())) { + summaryEnding = + new MessageBuilder( + "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL") + .asKey() + .arena(pluginArena) + .build(); + } else { + summaryEnding = + new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_STOPPED") + .asKey() + .arena(pluginArena) + .build(); + } + return summaryEnding; + } + }); + } + + private PlaceholderManager getPlaceholderManager() { + return plugin.getPlaceholderManager(); + } + + private ArenaRegistry getArenaRegistry() { + return plugin.getArenaRegistry(); + } + + private UserManager getUserManager() { + return plugin.getUserManager(); + } + +} From 9e807af32a9f1dfb5afc65f949254c9fc195e6f2 Mon Sep 17 00:00:00 2001 From: Tigerpanzer02 Date: Sat, 15 Oct 2022 22:14:10 +0000 Subject: [PATCH 093/127] Bump pom.xml from 1.7.9-dev36 to 1.7.9-dev37 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5eeabd42..8f098b58 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ plugily.projects murdermystery - 1.7.9-dev36 + 1.7.9-dev37 MurderMystery From f22da01ea07ea0cc10b23457fadab21bd5f848dd Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 30 Dec 2022 21:05:48 +0100 Subject: [PATCH 094/127] moved from maven to gradle --- CHANGELOG.md => .github/CHANGELOG.md | 0 CONTRIBUTORS.md => .github/CONTRIBUTORS.md | 0 LICENSE.md => .github/LICENSE.md | 0 .github/workflows/deploy-development.yml | 43 ++++ .github/workflows/deploy-master.yml | 46 ++++ .github/workflows/deploy.yml | 62 ----- .github/workflows/sonarcloud.yml | 48 ---- .gitignore | 1 - build.gradle | 114 +++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 240 ++++++++++++++++++ gradlew.bat | 91 +++++++ pom.xml | 194 -------------- settings.gradle | 7 + .../murdermystery/arena/role/Role.java | 8 +- .../boot/PlaceholderInitializer.java | 2 +- .../arguments/admin/RolePassArgument.java | 2 +- 18 files changed, 552 insertions(+), 311 deletions(-) rename CHANGELOG.md => .github/CHANGELOG.md (100%) rename CONTRIBUTORS.md => .github/CONTRIBUTORS.md (100%) rename LICENSE.md => .github/LICENSE.md (100%) create mode 100644 .github/workflows/deploy-development.yml create mode 100644 .github/workflows/deploy-master.yml delete mode 100644 .github/workflows/deploy.yml delete mode 100644 .github/workflows/sonarcloud.yml create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat delete mode 100644 pom.xml create mode 100644 settings.gradle diff --git a/CHANGELOG.md b/.github/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to .github/CHANGELOG.md diff --git a/CONTRIBUTORS.md b/.github/CONTRIBUTORS.md similarity index 100% rename from CONTRIBUTORS.md rename to .github/CONTRIBUTORS.md diff --git a/LICENSE.md b/.github/LICENSE.md similarity index 100% rename from LICENSE.md rename to .github/LICENSE.md diff --git a/.github/workflows/deploy-development.yml b/.github/workflows/deploy-development.yml new file mode 100644 index 00000000..92f16b11 --- /dev/null +++ b/.github/workflows/deploy-development.yml @@ -0,0 +1,43 @@ +name: Bump and Publish Development Branch + +on: + push: + branches: [ development ] + workflow_dispatch: +jobs: + bump: + runs-on: ubuntu-latest + steps: + - name: Checkout Latest Commit + uses: actions/checkout@v3 + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Bump Version + id: bump + uses: Plugily-Projects/version-bump-action@v8 + with: + github-token: ${{ secrets.github_token }} + auto-version-bump: true + - name: Print Version + run: "echo 'New Version: ${{steps.bump.outputs.version}}'" + publish: + needs: bump + runs-on: ubuntu-latest + steps: + - name: Checkout Latest Commit + uses: actions/checkout@v3 + with: + ref: 'development' + - name: Set up JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + java-package: jdk + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Publish with Gradle + run: ./gradlew publishMavenPublicationToSnapshotsRepository + env: + MAVEN_USERNAME: ${{ secrets.SNAPSHOTSUSERNAME }} + MAVEN_PASSWORD: ${{ secrets.SNAPSHOTSPASSWORD }} \ No newline at end of file diff --git a/.github/workflows/deploy-master.yml b/.github/workflows/deploy-master.yml new file mode 100644 index 00000000..143add43 --- /dev/null +++ b/.github/workflows/deploy-master.yml @@ -0,0 +1,46 @@ +name: Bump and Publish Master Branch + +on: + pull_request: + types: + - closed + workflow_dispatch: +jobs: + bump: + if: github.event.pull_request.merged + runs-on: ubuntu-latest + steps: + - name: Checkout Latest Commit + uses: actions/checkout@v3 + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Bump Version + id: bump + uses: Plugily-Projects/version-bump-action@v8 + with: + github-token: ${{ secrets.github_token }} + auto-version-bump: false + auto-version-bump-release: true + - name: Print Version + run: "echo 'New Version: ${{steps.bump.outputs.version}}'" + publish: + needs: bump + runs-on: ubuntu-latest + steps: + - name: Checkout Latest Commit + uses: actions/checkout@v3 + with: + ref: 'master' + - name: Set up JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + java-package: jdk + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Publish with Gradle + run: ./gradlew publishMavenPublicationToReleasesRepository + env: + MAVEN_USERNAME: ${{ secrets.RELEASESUSERNAME }} + MAVEN_PASSWORD: ${{ secrets.RELEASESPASSWORD }} \ No newline at end of file diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index c5932d62..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,62 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: deploy - -# Controls when the action will run. -on: - # Triggers the workflow on push or pull request events but only for the main branch - push: - branches: [ development ] -# pull_request: -# branches: [ main ] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - deploy: - # The type of runner that the job will run on - runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 - - - name: Bump Version - id: bump - uses: Plugily-Projects/maven-version-bump-action@dev - with: - github-token: ${{ secrets.github_token }} - - - uses: actions/cache@v2 - with: - path: ~/.m2/repository - key: maven-${{ hashFiles('**/pom.xml') }} - restore-keys: maven- - - - name: Set up Maven - uses: stCarolas/setup-maven@v4 - with: - maven-version: 3.6.3 - - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: '17' - java-package: jdk - - - name: maven-settings-action - uses: s4u/maven-settings-action@v2.5.0 - with: - servers: | - [{ - "id": "${{ secrets.PLUGILY_REPO_ID }}", - "username": "${{ secrets.PLUGILY_REPO_USERNAME }}", - "password": "${{ secrets.PLUGILY_REPO_PASSWORD }}" - }] - - - run: mvn clean verify compile package site:site javadoc:javadoc javadoc:jar deploy -f pom.xml diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml deleted file mode 100644 index 773a9d4b..00000000 --- a/.github/workflows/sonarcloud.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: sonarcloud -on: - push: - branches: - - development - - dev - - main - - master - pull_request: - types: [opened, synchronize, reopened] -jobs: - sonarcloud: - name: Build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - - name: Set up JDK 16 - uses: actions/setup-java@v1 - with: - java-version: 16 - - - name: Set up Maven - uses: stCarolas/setup-maven@v4 - with: - maven-version: 3.6.3 - - - name: Cache SonarCloud packages - uses: actions/cache@v1 - with: - path: ~/.sonar/cache - key: ${{ runner.os }}-sonar - restore-keys: ${{ runner.os }}-sonar - - - name: Cache Maven packages - uses: actions/cache@v1 - with: - path: ~/.m2 - key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} - restore-keys: ${{ runner.os }}-m2 - - - name: Build and analyze - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar diff --git a/.gitignore b/.gitignore index 479123d5..85908858 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ /out/ /generated/ -.* /minecraft/ /target/ \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..3f90d65a --- /dev/null +++ b/build.gradle @@ -0,0 +1,114 @@ +plugins { + id 'java-library' + id 'signing' + id 'maven-publish' + id 'com.github.johnrengelman.shadow' version '7.1.2' +} + +repositories { + mavenLocal() + maven { + url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' + + content { + includeGroup 'org.bukkit' + includeGroup 'org.spigotmc' + } + } + + maven { url = 'https://oss.sonatype.org/content/repositories/snapshots' } + maven { url = 'https://oss.sonatype.org/content/repositories/central' } + + + maven { + url = uri('https://papermc.io/repo/repository/maven-public/') + } + + maven { + url = uri('https://maven.plugily.xyz/releases') + } + + maven { + url = uri('https://maven.plugily.xyz/snapshots') + } + + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +dependencies { + compileOnly 'io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT' + implementation('plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT5') { + exclude group: 'com.google.code.gson', module: 'gson' + exclude group: 'fr.mrmicky', module: 'FastInv' + exclude group: 'me.tigerhix.lib', module: 'scoreboard' + exclude group: 'com.github.cryptomorin', module: 'XSeries' + exclude group: 'plugily.projects', module: 'MiniGamesBox-Inventory' + exclude group: 'plugily.projects', module: 'MiniGamesBox-Database' + exclude group: 'plugily.projects', module: 'MiniGamesBox-Utils' + exclude group: 'io.papermc', module: 'paperlib' + } + compileOnly 'org.jetbrains:annotations:23.1.0' + compileOnly files('lib/CorpseReborn.jar') +} + + +group = 'plugily.projects' +version = '1.7.9-dev37' +description = 'MurderMystery' + +java { + withJavadocJar() +} + +build { + dependsOn(shadowJar) +} + +javadoc { + options.encoding = 'UTF-8' +} + +processResources { + filesMatching("**/plugin.yml") { + expand(project.properties) + } +} + +shadowJar { + archiveClassifier.set('') + relocate 'plugily.projects.minigamesbox', 'plugily.projects.murdermystery.minigamesbox' + relocate 'com.zaxxer.hikari', 'plugily.projects.murdermystery.database.hikari' + minimize() +} + +publishing { + repositories { + maven { + name = "Releases" + url = "https://maven.plugily.xyz/releases" + credentials { + username = System.getenv("MAVEN_USERNAME") + password = System.getenv("MAVEN_PASSWORD") + } + } + maven { + name = "Snapshots" + url = uri("https://maven.plugily.xyz/snapshots") + credentials { + username = System.getenv("MAVEN_USERNAME") + password = System.getenv("MAVEN_PASSWORD") + } + } + } + publications { + maven(MavenPublication) { + from components.java + } + } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..249e5832f090a2944b7473328c07c9755baa3196 GIT binary patch literal 60756 zcmb5WV{~QRw(p$^Dz@00IL3?^hro$gg*4VI_WAaTyVM5Foj~O|-84 z$;06hMwt*rV;^8iB z1~&0XWpYJmG?Ts^K9PC62H*`G}xom%S%yq|xvG~FIfP=9*f zZoDRJBm*Y0aId=qJ?7dyb)6)JGWGwe)MHeNSzhi)Ko6J<-m@v=a%NsP537lHe0R* z`If4$aaBA#S=w!2z&m>{lpTy^Lm^mg*3?M&7HFv}7K6x*cukLIGX;bQG|QWdn{%_6 zHnwBKr84#B7Z+AnBXa16a?or^R?+>$4`}{*a_>IhbjvyTtWkHw)|ay)ahWUd-qq$~ zMbh6roVsj;_qnC-R{G+Cy6bApVOinSU-;(DxUEl!i2)1EeQ9`hrfqj(nKI7?Z>Xur zoJz-a`PxkYit1HEbv|jy%~DO^13J-ut986EEG=66S}D3!L}Efp;Bez~7tNq{QsUMm zh9~(HYg1pA*=37C0}n4g&bFbQ+?-h-W}onYeE{q;cIy%eZK9wZjSwGvT+&Cgv z?~{9p(;bY_1+k|wkt_|N!@J~aoY@|U_RGoWX<;p{Nu*D*&_phw`8jYkMNpRTWx1H* z>J-Mi_!`M468#5Aix$$u1M@rJEIOc?k^QBc?T(#=n&*5eS#u*Y)?L8Ha$9wRWdH^3D4|Ps)Y?m0q~SiKiSfEkJ!=^`lJ(%W3o|CZ zSrZL-Xxc{OrmsQD&s~zPfNJOpSZUl%V8tdG%ei}lQkM+z@-4etFPR>GOH9+Y_F<3=~SXln9Kb-o~f>2a6Xz@AS3cn^;c_>lUwlK(n>z?A>NbC z`Ud8^aQy>wy=$)w;JZzA)_*Y$Z5hU=KAG&htLw1Uh00yE!|Nu{EZkch zY9O6x7Y??>!7pUNME*d!=R#s)ghr|R#41l!c?~=3CS8&zr6*aA7n9*)*PWBV2w+&I zpW1-9fr3j{VTcls1>ua}F*bbju_Xq%^v;-W~paSqlf zolj*dt`BBjHI)H9{zrkBo=B%>8}4jeBO~kWqO!~Thi!I1H(in=n^fS%nuL=X2+s!p}HfTU#NBGiwEBF^^tKU zbhhv+0dE-sbK$>J#t-J!B$TMgN@Wh5wTtK2BG}4BGfsZOoRUS#G8Cxv|6EI*n&Xxq zt{&OxCC+BNqz$9b0WM7_PyBJEVObHFh%%`~!@MNZlo*oXDCwDcFwT~Rls!aApL<)^ zbBftGKKBRhB!{?fX@l2_y~%ygNFfF(XJzHh#?`WlSL{1lKT*gJM zs>bd^H9NCxqxn(IOky5k-wALFowQr(gw%|`0991u#9jXQh?4l|l>pd6a&rx|v=fPJ z1mutj{YzpJ_gsClbWFk(G}bSlFi-6@mwoQh-XeD*j@~huW4(8ub%^I|azA)h2t#yG z7e_V_<4jlM3D(I+qX}yEtqj)cpzN*oCdYHa!nm%0t^wHm)EmFP*|FMw!tb@&`G-u~ zK)=Sf6z+BiTAI}}i{*_Ac$ffr*Wrv$F7_0gJkjx;@)XjYSh`RjAgrCck`x!zP>Ifu z&%he4P|S)H*(9oB4uvH67^0}I-_ye_!w)u3v2+EY>eD3#8QR24<;7?*hj8k~rS)~7 zSXs5ww)T(0eHSp$hEIBnW|Iun<_i`}VE0Nc$|-R}wlSIs5pV{g_Dar(Zz<4X3`W?K z6&CAIl4U(Qk-tTcK{|zYF6QG5ArrEB!;5s?tW7 zrE3hcFY&k)+)e{+YOJ0X2uDE_hd2{|m_dC}kgEKqiE9Q^A-+>2UonB+L@v3$9?AYw zVQv?X*pK;X4Ovc6Ev5Gbg{{Eu*7{N3#0@9oMI~}KnObQE#Y{&3mM4`w%wN+xrKYgD zB-ay0Q}m{QI;iY`s1Z^NqIkjrTlf`B)B#MajZ#9u41oRBC1oM1vq0i|F59> z#StM@bHt|#`2)cpl_rWB($DNJ3Lap}QM-+A$3pe}NyP(@+i1>o^fe-oxX#Bt`mcQc zb?pD4W%#ep|3%CHAYnr*^M6Czg>~L4?l16H1OozM{P*en298b+`i4$|w$|4AHbzqB zHpYUsHZET$Z0ztC;U+0*+amF!@PI%^oUIZy{`L{%O^i{Xk}X0&nl)n~tVEpcAJSJ} zverw15zP1P-O8h9nd!&hj$zuwjg?DoxYIw{jWM zW5_pj+wFy8Tsa9g<7Qa21WaV&;ejoYflRKcz?#fSH_)@*QVlN2l4(QNk| z4aPnv&mrS&0|6NHq05XQw$J^RR9T{3SOcMKCXIR1iSf+xJ0E_Wv?jEc*I#ZPzyJN2 zUG0UOXHl+PikM*&g$U@g+KbG-RY>uaIl&DEtw_Q=FYq?etc!;hEC_}UX{eyh%dw2V zTTSlap&5>PY{6I#(6`j-9`D&I#|YPP8a;(sOzgeKDWsLa!i-$frD>zr-oid!Hf&yS z!i^cr&7tN}OOGmX2)`8k?Tn!!4=tz~3hCTq_9CdiV!NIblUDxHh(FJ$zs)B2(t5@u z-`^RA1ShrLCkg0)OhfoM;4Z{&oZmAec$qV@ zGQ(7(!CBk<5;Ar%DLJ0p0!ResC#U<+3i<|vib1?{5gCebG7$F7URKZXuX-2WgF>YJ^i zMhHDBsh9PDU8dlZ$yJKtc6JA#y!y$57%sE>4Nt+wF1lfNIWyA`=hF=9Gj%sRwi@vd z%2eVV3y&dvAgyuJ=eNJR+*080dbO_t@BFJO<@&#yqTK&+xc|FRR;p;KVk@J3$S{p` zGaMj6isho#%m)?pOG^G0mzOAw0z?!AEMsv=0T>WWcE>??WS=fII$t$(^PDPMU(P>o z_*0s^W#|x)%tx8jIgZY~A2yG;US0m2ZOQt6yJqW@XNY_>_R7(Nxb8Ged6BdYW6{prd!|zuX$@Q2o6Ona8zzYC1u!+2!Y$Jc9a;wy+pXt}o6~Bu1oF1c zp7Y|SBTNi@=I(K%A60PMjM#sfH$y*c{xUgeSpi#HB`?|`!Tb&-qJ3;vxS!TIzuTZs-&%#bAkAyw9m4PJgvey zM5?up*b}eDEY+#@tKec)-c(#QF0P?MRlD1+7%Yk*jW;)`f;0a-ZJ6CQA?E%>i2Dt7T9?s|9ZF|KP4;CNWvaVKZ+Qeut;Jith_y{v*Ny6Co6!8MZx;Wgo z=qAi%&S;8J{iyD&>3CLCQdTX*$+Rx1AwA*D_J^0>suTgBMBb=*hefV+Ars#mmr+YsI3#!F@Xc1t4F-gB@6aoyT+5O(qMz*zG<9Qq*f0w^V!03rpr*-WLH}; zfM{xSPJeu6D(%8HU%0GEa%waFHE$G?FH^kMS-&I3)ycx|iv{T6Wx}9$$D&6{%1N_8 z_CLw)_9+O4&u94##vI9b-HHm_95m)fa??q07`DniVjAy`t7;)4NpeyAY(aAk(+T_O z1om+b5K2g_B&b2DCTK<>SE$Ode1DopAi)xaJjU>**AJK3hZrnhEQ9E`2=|HHe<^tv z63e(bn#fMWuz>4erc47}!J>U58%<&N<6AOAewyzNTqi7hJc|X{782&cM zHZYclNbBwU6673=!ClmxMfkC$(CykGR@10F!zN1Se83LR&a~$Ht&>~43OX22mt7tcZUpa;9@q}KDX3O&Ugp6< zLZLfIMO5;pTee1vNyVC$FGxzK2f>0Z-6hM82zKg44nWo|n}$Zk6&;5ry3`(JFEX$q zK&KivAe${e^5ZGc3a9hOt|!UOE&OocpVryE$Y4sPcs4rJ>>Kbi2_subQ9($2VN(3o zb~tEzMsHaBmBtaHAyES+d3A(qURgiskSSwUc9CfJ@99&MKp2sooSYZu+-0t0+L*!I zYagjOlPgx|lep9tiU%ts&McF6b0VE57%E0Ho%2oi?=Ks+5%aj#au^OBwNwhec zta6QAeQI^V!dF1C)>RHAmB`HnxyqWx?td@4sd15zPd*Fc9hpDXP23kbBenBxGeD$k z;%0VBQEJ-C)&dTAw_yW@k0u?IUk*NrkJ)(XEeI z9Y>6Vel>#s_v@=@0<{4A{pl=9cQ&Iah0iD0H`q)7NeCIRz8zx;! z^OO;1+IqoQNak&pV`qKW+K0^Hqp!~gSohcyS)?^P`JNZXw@gc6{A3OLZ?@1Uc^I2v z+X!^R*HCm3{7JPq{8*Tn>5;B|X7n4QQ0Bs79uTU%nbqOJh`nX(BVj!#f;#J+WZxx4 z_yM&1Y`2XzhfqkIMO7tB3raJKQS+H5F%o83bM+hxbQ zeeJm=Dvix$2j|b4?mDacb67v-1^lTp${z=jc1=j~QD>7c*@+1?py>%Kj%Ejp7Y-!? z8iYRUlGVrQPandAaxFfks53@2EC#0)%mrnmGRn&>=$H$S8q|kE_iWko4`^vCS2aWg z#!`RHUGyOt*k?bBYu3*j3u0gB#v(3tsije zgIuNNWNtrOkx@Pzs;A9un+2LX!zw+p3_NX^Sh09HZAf>m8l@O*rXy_82aWT$Q>iyy zqO7Of)D=wcSn!0+467&!Hl))eff=$aneB?R!YykdKW@k^_uR!+Q1tR)+IJb`-6=jj zymzA>Sv4>Z&g&WWu#|~GcP7qP&m*w-S$)7Xr;(duqCTe7p8H3k5>Y-n8438+%^9~K z3r^LIT_K{i7DgEJjIocw_6d0!<;wKT`X;&vv+&msmhAAnIe!OTdybPctzcEzBy88_ zWO{6i4YT%e4^WQZB)KHCvA(0tS zHu_Bg+6Ko%a9~$EjRB90`P(2~6uI@SFibxct{H#o&y40MdiXblu@VFXbhz>Nko;7R z70Ntmm-FePqhb%9gL+7U8@(ch|JfH5Fm)5${8|`Lef>LttM_iww6LW2X61ldBmG0z zax3y)njFe>j*T{i0s8D4=L>X^j0)({R5lMGVS#7(2C9@AxL&C-lZQx~czI7Iv+{%1 z2hEG>RzX4S8x3v#9sgGAnPzptM)g&LB}@%E>fy0vGSa(&q0ch|=ncKjNrK z`jA~jObJhrJ^ri|-)J^HUyeZXz~XkBp$VhcTEcTdc#a2EUOGVX?@mYx#Vy*!qO$Jv zQ4rgOJ~M*o-_Wptam=~krnmG*p^j!JAqoQ%+YsDFW7Cc9M%YPiBOrVcD^RY>m9Pd< zu}#9M?K{+;UIO!D9qOpq9yxUquQRmQNMo0pT`@$pVt=rMvyX)ph(-CCJLvUJy71DI zBk7oc7)-%ngdj~s@76Yse3L^gV0 z2==qfp&Q~L(+%RHP0n}+xH#k(hPRx(!AdBM$JCfJ5*C=K3ts>P?@@SZ_+{U2qFZb>4kZ{Go37{# zSQc+-dq*a-Vy4?taS&{Ht|MLRiS)Sn14JOONyXqPNnpq&2y~)6wEG0oNy>qvod$FF z`9o&?&6uZjhZ4_*5qWVrEfu(>_n2Xi2{@Gz9MZ8!YmjYvIMasE9yVQL10NBrTCczq zcTY1q^PF2l!Eraguf{+PtHV3=2A?Cu&NN&a8V(y;q(^_mFc6)%Yfn&X&~Pq zU1?qCj^LF(EQB1F`8NxNjyV%fde}dEa(Hx=r7$~ts2dzDwyi6ByBAIx$NllB4%K=O z$AHz1<2bTUb>(MCVPpK(E9wlLElo(aSd(Os)^Raum`d(g9Vd_+Bf&V;l=@mM=cC>) z)9b0enb)u_7V!!E_bl>u5nf&Rl|2r=2F3rHMdb7y9E}}F82^$Rf+P8%dKnOeKh1vs zhH^P*4Ydr^$)$h@4KVzxrHyy#cKmWEa9P5DJ|- zG;!Qi35Tp7XNj60=$!S6U#!(${6hyh7d4q=pF{`0t|N^|L^d8pD{O9@tF~W;#Je*P z&ah%W!KOIN;SyAEhAeTafJ4uEL`(RtnovM+cb(O#>xQnk?dzAjG^~4$dFn^<@-Na3 z395;wBnS{t*H;Jef2eE!2}u5Ns{AHj>WYZDgQJt8v%x?9{MXqJsGP|l%OiZqQ1aB! z%E=*Ig`(!tHh>}4_z5IMpg{49UvD*Pp9!pxt_gdAW%sIf3k6CTycOT1McPl=_#0?8 zVjz8Hj*Vy9c5-krd-{BQ{6Xy|P$6LJvMuX$* zA+@I_66_ET5l2&gk9n4$1M3LN8(yEViRx&mtd#LD}AqEs?RW=xKC(OCWH;~>(X6h!uDxXIPH06xh z*`F4cVlbDP`A)-fzf>MuScYsmq&1LUMGaQ3bRm6i7OsJ|%uhTDT zlvZA1M}nz*SalJWNT|`dBm1$xlaA>CCiQ zK`xD-RuEn>-`Z?M{1%@wewf#8?F|(@1e0+T4>nmlSRrNK5f)BJ2H*$q(H>zGD0>eL zQ!tl_Wk)k*e6v^m*{~A;@6+JGeWU-q9>?+L_#UNT%G?4&BnOgvm9@o7l?ov~XL+et zbGT)|G7)KAeqb=wHSPk+J1bdg7N3$vp(ekjI1D9V$G5Cj!=R2w=3*4!z*J-r-cyeb zd(i2KmX!|Lhey!snRw z?#$Gu%S^SQEKt&kep)up#j&9}e+3=JJBS(s>MH+|=R(`8xK{mmndWo_r`-w1#SeRD&YtAJ#GiVI*TkQZ}&aq<+bU2+coU3!jCI6E+Ad_xFW*ghnZ$q zAoF*i&3n1j#?B8x;kjSJD${1jdRB;)R*)Ao!9bd|C7{;iqDo|T&>KSh6*hCD!rwv= zyK#F@2+cv3=|S1Kef(E6Niv8kyLVLX&e=U;{0x{$tDfShqkjUME>f8d(5nzSkY6@! z^-0>DM)wa&%m#UF1F?zR`8Y3X#tA!*7Q$P3lZJ%*KNlrk_uaPkxw~ zxZ1qlE;Zo;nb@!SMazSjM>;34ROOoygo%SF);LL>rRonWwR>bmSd1XD^~sGSu$Gg# zFZ`|yKU0%!v07dz^v(tY%;So(e`o{ZYTX`hm;@b0%8|H>VW`*cr8R%3n|ehw2`(9B+V72`>SY}9^8oh$En80mZK9T4abVG*to;E z1_S6bgDOW?!Oy1LwYy=w3q~KKdbNtyH#d24PFjX)KYMY93{3-mPP-H>@M-_>N~DDu zENh~reh?JBAK=TFN-SfDfT^=+{w4ea2KNWXq2Y<;?(gf(FgVp8Zp-oEjKzB%2Iqj;48GmY3h=bcdYJ}~&4tS`Q1sb=^emaW$IC$|R+r-8V- zf0$gGE(CS_n4s>oicVk)MfvVg#I>iDvf~Ov8bk}sSxluG!6#^Z_zhB&U^`eIi1@j( z^CK$z^stBHtaDDHxn+R;3u+>Lil^}fj?7eaGB z&5nl^STqcaBxI@v>%zG|j))G(rVa4aY=B@^2{TFkW~YP!8!9TG#(-nOf^^X-%m9{Z zCC?iC`G-^RcBSCuk=Z`(FaUUe?hf3{0C>>$?Vs z`2Uud9M+T&KB6o4o9kvdi^Q=Bw!asPdxbe#W-Oaa#_NP(qpyF@bVxv5D5))srkU#m zj_KA+#7sqDn*Ipf!F5Byco4HOSd!Ui$l94|IbW%Ny(s1>f4|Mv^#NfB31N~kya9!k zWCGL-$0ZQztBate^fd>R!hXY_N9ZjYp3V~4_V z#eB)Kjr8yW=+oG)BuNdZG?jaZlw+l_ma8aET(s+-x+=F-t#Qoiuu1i`^x8Sj>b^U} zs^z<()YMFP7CmjUC@M=&lA5W7t&cxTlzJAts*%PBDAPuqcV5o7HEnqjif_7xGt)F% zGx2b4w{@!tE)$p=l3&?Bf#`+!-RLOleeRk3 z7#pF|w@6_sBmn1nECqdunmG^}pr5(ZJQVvAt$6p3H(16~;vO>?sTE`Y+mq5YP&PBo zvq!7#W$Gewy`;%6o^!Dtjz~x)T}Bdk*BS#=EY=ODD&B=V6TD2z^hj1m5^d6s)D*wk zu$z~D7QuZ2b?5`p)E8e2_L38v3WE{V`bVk;6fl#o2`) z99JsWhh?$oVRn@$S#)uK&8DL8>An0&S<%V8hnGD7Z^;Y(%6;^9!7kDQ5bjR_V+~wp zfx4m3z6CWmmZ<8gDGUyg3>t8wgJ5NkkiEm^(sedCicP^&3D%}6LtIUq>mXCAt{9eF zNXL$kGcoUTf_Lhm`t;hD-SE)m=iBnxRU(NyL}f6~1uH)`K!hmYZjLI%H}AmEF5RZt z06$wn63GHnApHXZZJ}s^s)j9(BM6e*7IBK6Bq(!)d~zR#rbxK9NVIlgquoMq z=eGZ9NR!SEqP6=9UQg#@!rtbbSBUM#ynF);zKX+|!Zm}*{H z+j=d?aZ2!?@EL7C~%B?6ouCKLnO$uWn;Y6Xz zX8dSwj732u(o*U3F$F=7xwxm>E-B+SVZH;O-4XPuPkLSt_?S0)lb7EEg)Mglk0#eS z9@jl(OnH4juMxY+*r03VDfPx_IM!Lmc(5hOI;`?d37f>jPP$?9jQQIQU@i4vuG6MagEoJrQ=RD7xt@8E;c zeGV*+Pt+t$@pt!|McETOE$9k=_C!70uhwRS9X#b%ZK z%q(TIUXSS^F0`4Cx?Rk07C6wI4!UVPeI~-fxY6`YH$kABdOuiRtl73MqG|~AzZ@iL&^s?24iS;RK_pdlWkhcF z@Wv-Om(Aealfg)D^adlXh9Nvf~Uf@y;g3Y)i(YP zEXDnb1V}1pJT5ZWyw=1i+0fni9yINurD=EqH^ciOwLUGi)C%Da)tyt=zq2P7pV5-G zR7!oq28-Fgn5pW|nlu^b!S1Z#r7!Wtr{5J5PQ>pd+2P7RSD?>(U7-|Y z7ZQ5lhYIl_IF<9?T9^IPK<(Hp;l5bl5tF9>X-zG14_7PfsA>6<$~A338iYRT{a@r_ zuXBaT=`T5x3=s&3=RYx6NgG>No4?5KFBVjE(swfcivcIpPQFx5l+O;fiGsOrl5teR z_Cm+;PW}O0Dwe_(4Z@XZ)O0W-v2X><&L*<~*q3dg;bQW3g7)a#3KiQP>+qj|qo*Hk z?57>f2?f@`=Fj^nkDKeRkN2d$Z@2eNKpHo}ksj-$`QKb6n?*$^*%Fb3_Kbf1(*W9K>{L$mud2WHJ=j0^=g30Xhg8$#g^?36`p1fm;;1@0Lrx+8t`?vN0ZorM zSW?rhjCE8$C|@p^sXdx z|NOHHg+fL;HIlqyLp~SSdIF`TnSHehNCU9t89yr@)FY<~hu+X`tjg(aSVae$wDG*C zq$nY(Y494R)hD!i1|IIyP*&PD_c2FPgeY)&mX1qujB1VHPG9`yFQpLFVQ0>EKS@Bp zAfP5`C(sWGLI?AC{XEjLKR4FVNw(4+9b?kba95ukgR1H?w<8F7)G+6&(zUhIE5Ef% z=fFkL3QKA~M@h{nzjRq!Y_t!%U66#L8!(2-GgFxkD1=JRRqk=n%G(yHKn%^&$dW>; zSjAcjETMz1%205se$iH_)ZCpfg_LwvnsZQAUCS#^FExp8O4CrJb6>JquNV@qPq~3A zZ<6dOU#6|8+fcgiA#~MDmcpIEaUO02L5#T$HV0$EMD94HT_eXLZ2Zi&(! z&5E>%&|FZ`)CN10tM%tLSPD*~r#--K(H-CZqIOb99_;m|D5wdgJ<1iOJz@h2Zkq?} z%8_KXb&hf=2Wza(Wgc;3v3TN*;HTU*q2?#z&tLn_U0Nt!y>Oo>+2T)He6%XuP;fgn z-G!#h$Y2`9>Jtf}hbVrm6D70|ERzLAU>3zoWhJmjWfgM^))T+2u$~5>HF9jQDkrXR z=IzX36)V75PrFjkQ%TO+iqKGCQ-DDXbaE;C#}!-CoWQx&v*vHfyI>$HNRbpvm<`O( zlx9NBWD6_e&J%Ous4yp~s6)Ghni!I6)0W;9(9$y1wWu`$gs<$9Mcf$L*piP zPR0Av*2%ul`W;?-1_-5Zy0~}?`e@Y5A&0H!^ApyVTT}BiOm4GeFo$_oPlDEyeGBbh z1h3q&Dx~GmUS|3@4V36&$2uO8!Yp&^pD7J5&TN{?xphf*-js1fP?B|`>p_K>lh{ij zP(?H%e}AIP?_i^f&Li=FDSQ`2_NWxL+BB=nQr=$ zHojMlXNGauvvwPU>ZLq!`bX-5F4jBJ&So{kE5+ms9UEYD{66!|k~3vsP+mE}x!>%P za98bAU0!h0&ka4EoiDvBM#CP#dRNdXJcb*(%=<(g+M@<)DZ!@v1V>;54En?igcHR2 zhubQMq}VSOK)onqHfczM7YA@s=9*ow;k;8)&?J3@0JiGcP! zP#00KZ1t)GyZeRJ=f0^gc+58lc4Qh*S7RqPIC6GugG1gXe$LIQMRCo8cHf^qXgAa2 z`}t>u2Cq1CbSEpLr~E=c7~=Qkc9-vLE%(v9N*&HF`(d~(0`iukl5aQ9u4rUvc8%m) zr2GwZN4!s;{SB87lJB;veebPmqE}tSpT>+`t?<457Q9iV$th%i__Z1kOMAswFldD6 ztbOvO337S5o#ZZgN2G99_AVqPv!?Gmt3pzgD+Hp3QPQ`9qJ(g=kjvD+fUSS3upJn! zqoG7acIKEFRX~S}3|{EWT$kdz#zrDlJU(rPkxjws_iyLKU8+v|*oS_W*-guAb&Pj1 z35Z`3z<&Jb@2Mwz=KXucNYdY#SNO$tcVFr9KdKm|%^e-TXzs6M`PBper%ajkrIyUe zp$vVxVs9*>Vp4_1NC~Zg)WOCPmOxI1V34QlG4!aSFOH{QqSVq1^1)- z0P!Z?tT&E-ll(pwf0?=F=yOzik=@nh1Clxr9}Vij89z)ePDSCYAqw?lVI?v?+&*zH z)p$CScFI8rrwId~`}9YWPFu0cW1Sf@vRELs&cbntRU6QfPK-SO*mqu|u~}8AJ!Q$z znzu}50O=YbjwKCuSVBs6&CZR#0FTu)3{}qJJYX(>QPr4$RqWiwX3NT~;>cLn*_&1H zaKpIW)JVJ>b{uo2oq>oQt3y=zJjb%fU@wLqM{SyaC6x2snMx-}ivfU<1- znu1Lh;i$3Tf$Kh5Uk))G!D1UhE8pvx&nO~w^fG)BC&L!_hQk%^p`Kp@F{cz>80W&T ziOK=Sq3fdRu*V0=S53rcIfWFazI}Twj63CG(jOB;$*b`*#B9uEnBM`hDk*EwSRdwP8?5T?xGUKs=5N83XsR*)a4|ijz|c{4tIU+4j^A5C<#5 z*$c_d=5ml~%pGxw#?*q9N7aRwPux5EyqHVkdJO=5J>84!X6P>DS8PTTz>7C#FO?k#edkntG+fJk8ZMn?pmJSO@`x-QHq;7^h6GEXLXo1TCNhH z8ZDH{*NLAjo3WM`xeb=X{((uv3H(8&r8fJJg_uSs_%hOH%JDD?hu*2NvWGYD+j)&` zz#_1%O1wF^o5ryt?O0n;`lHbzp0wQ?rcbW(F1+h7_EZZ9{>rePvLAPVZ_R|n@;b$;UchU=0j<6k8G9QuQf@76oiE*4 zXOLQ&n3$NR#p4<5NJMVC*S);5x2)eRbaAM%VxWu9ohlT;pGEk7;002enCbQ>2r-us z3#bpXP9g|mE`65VrN`+3mC)M(eMj~~eOf)do<@l+fMiTR)XO}422*1SL{wyY(%oMpBgJagtiDf zz>O6(m;};>Hi=t8o{DVC@YigqS(Qh+ix3Rwa9aliH}a}IlOCW1@?%h_bRbq-W{KHF z%Vo?-j@{Xi@=~Lz5uZP27==UGE15|g^0gzD|3x)SCEXrx`*MP^FDLl%pOi~~Il;dc z^hrwp9sYeT7iZ)-ajKy@{a`kr0-5*_!XfBpXwEcFGJ;%kV$0Nx;apKrur zJN2J~CAv{Zjj%FolyurtW8RaFmpn&zKJWL>(0;;+q(%(Hx!GMW4AcfP0YJ*Vz!F4g z!ZhMyj$BdXL@MlF%KeInmPCt~9&A!;cRw)W!Hi@0DY(GD_f?jeV{=s=cJ6e}JktJw zQORnxxj3mBxfrH=x{`_^Z1ddDh}L#V7i}$njUFRVwOX?qOTKjfPMBO4y(WiU<)epb zvB9L=%jW#*SL|Nd_G?E*_h1^M-$PG6Pc_&QqF0O-FIOpa4)PAEPsyvB)GKasmBoEt z?_Q2~QCYGH+hW31x-B=@5_AN870vY#KB~3a*&{I=f);3Kv7q4Q7s)0)gVYx2#Iz9g(F2;=+Iy4 z6KI^8GJ6D@%tpS^8boU}zpi=+(5GfIR)35PzrbuXeL1Y1N%JK7PG|^2k3qIqHfX;G zQ}~JZ-UWx|60P5?d1e;AHx!_;#PG%d=^X(AR%i`l0jSpYOpXoKFW~7ip7|xvN;2^? zsYC9fanpO7rO=V7+KXqVc;Q5z%Bj})xHVrgoR04sA2 zl~DAwv=!(()DvH*=lyhIlU^hBkA0$e*7&fJpB0|oB7)rqGK#5##2T`@_I^|O2x4GO z;xh6ROcV<9>?e0)MI(y++$-ksV;G;Xe`lh76T#Htuia+(UrIXrf9?

L(tZ$0BqX1>24?V$S+&kLZ`AodQ4_)P#Q3*4xg8}lMV-FLwC*cN$< zt65Rf%7z41u^i=P*qO8>JqXPrinQFapR7qHAtp~&RZ85$>ob|Js;GS^y;S{XnGiBc zGa4IGvDl?x%gY`vNhv8wgZnP#UYI-w*^4YCZnxkF85@ldepk$&$#3EAhrJY0U)lR{F6sM3SONV^+$;Zx8BD&Eku3K zKNLZyBni3)pGzU0;n(X@1fX8wYGKYMpLmCu{N5-}epPDxClPFK#A@02WM3!myN%bkF z|GJ4GZ}3sL{3{qXemy+#Uk{4>Kf8v11;f8I&c76+B&AQ8udd<8gU7+BeWC`akUU~U zgXoxie>MS@rBoyY8O8Tc&8id!w+_ooxcr!1?#rc$-|SBBtH6S?)1e#P#S?jFZ8u-Bs&k`yLqW|{j+%c#A4AQ>+tj$Y z^CZajspu$F%73E68Lw5q7IVREED9r1Ijsg#@DzH>wKseye>hjsk^{n0g?3+gs@7`i zHx+-!sjLx^fS;fY!ERBU+Q zVJ!e0hJH%P)z!y%1^ZyG0>PN@5W~SV%f>}c?$H8r;Sy-ui>aruVTY=bHe}$e zi&Q4&XK!qT7-XjCrDaufT@>ieQ&4G(SShUob0Q>Gznep9fR783jGuUynAqc6$pYX; z7*O@@JW>O6lKIk0G00xsm|=*UVTQBB`u1f=6wGAj%nHK_;Aqmfa!eAykDmi-@u%6~ z;*c!pS1@V8r@IX9j&rW&d*}wpNs96O2Ute>%yt{yv>k!6zfT6pru{F1M3P z2WN1JDYqoTB#(`kE{H676QOoX`cnqHl1Yaru)>8Ky~VU{)r#{&s86Vz5X)v15ULHA zAZDb{99+s~qI6;-dQ5DBjHJP@GYTwn;Dv&9kE<0R!d z8tf1oq$kO`_sV(NHOSbMwr=To4r^X$`sBW4$gWUov|WY?xccQJN}1DOL|GEaD_!@& z15p?Pj+>7d`@LvNIu9*^hPN)pwcv|akvYYq)ks%`G>!+!pW{-iXPZsRp8 z35LR;DhseQKWYSD`%gO&k$Dj6_6q#vjWA}rZcWtQr=Xn*)kJ9kacA=esi*I<)1>w^ zO_+E>QvjP)qiSZg9M|GNeLtO2D7xT6vsj`88sd!94j^AqxFLi}@w9!Y*?nwWARE0P znuI_7A-saQ+%?MFA$gttMV-NAR^#tjl_e{R$N8t2NbOlX373>e7Ox=l=;y#;M7asp zRCz*CLnrm$esvSb5{T<$6CjY zmZ(i{Rs_<#pWW>(HPaaYj`%YqBra=Ey3R21O7vUbzOkJJO?V`4-D*u4$Me0Bx$K(lYo`JO}gnC zx`V}a7m-hLU9Xvb@K2ymioF)vj12<*^oAqRuG_4u%(ah?+go%$kOpfb`T96P+L$4> zQ#S+sA%VbH&mD1k5Ak7^^dZoC>`1L%i>ZXmooA!%GI)b+$D&ziKrb)a=-ds9xk#~& z7)3iem6I|r5+ZrTRe_W861x8JpD`DDIYZNm{$baw+$)X^Jtjnl0xlBgdnNY}x%5za zkQ8E6T<^$sKBPtL4(1zi_Rd(tVth*3Xs!ulflX+70?gb&jRTnI8l+*Aj9{|d%qLZ+ z>~V9Z;)`8-lds*Zgs~z1?Fg?Po7|FDl(Ce<*c^2=lFQ~ahwh6rqSjtM5+$GT>3WZW zj;u~w9xwAhOc<kF}~`CJ68 z?(S5vNJa;kriPlim33{N5`C{9?NWhzsna_~^|K2k4xz1`xcui*LXL-1#Y}Hi9`Oo!zQ>x-kgAX4LrPz63uZ+?uG*84@PKq-KgQlMNRwz=6Yes) zY}>YN+qP}nwr$(CZQFjUOI=-6J$2^XGvC~EZ+vrqWaOXB$k?%Suf5k=4>AveC1aJ! ziaW4IS%F$_Babi)kA8Y&u4F7E%99OPtm=vzw$$ zEz#9rvn`Iot_z-r3MtV>k)YvErZ<^Oa${`2>MYYODSr6?QZu+be-~MBjwPGdMvGd!b!elsdi4% z`37W*8+OGulab8YM?`KjJ8e+jM(tqLKSS@=jimq3)Ea2EB%88L8CaM+aG7;27b?5` z4zuUWBr)f)k2o&xg{iZ$IQkJ+SK>lpq4GEacu~eOW4yNFLU!Kgc{w4&D$4ecm0f}~ zTTzquRW@`f0}|IILl`!1P+;69g^upiPA6F{)U8)muWHzexRenBU$E^9X-uIY2%&1w z_=#5*(nmxJ9zF%styBwivi)?#KMG96-H@hD-H_&EZiRNsfk7mjBq{L%!E;Sqn!mVX*}kXhwH6eh;b42eD!*~upVG@ z#smUqz$ICm!Y8wY53gJeS|Iuard0=;k5i5Z_hSIs6tr)R4n*r*rE`>38Pw&lkv{_r!jNN=;#?WbMj|l>cU(9trCq; z%nN~r^y7!kH^GPOf3R}?dDhO=v^3BeP5hF|%4GNQYBSwz;x({21i4OQY->1G=KFyu z&6d`f2tT9Yl_Z8YACZaJ#v#-(gcyeqXMhYGXb=t>)M@fFa8tHp2x;ODX=Ap@a5I=U z0G80^$N0G4=U(>W%mrrThl0DjyQ-_I>+1Tdd_AuB3qpYAqY54upwa3}owa|x5iQ^1 zEf|iTZxKNGRpI>34EwkIQ2zHDEZ=(J@lRaOH>F|2Z%V_t56Km$PUYu^xA5#5Uj4I4RGqHD56xT%H{+P8Ag>e_3pN$4m8n>i%OyJFPNWaEnJ4McUZPa1QmOh?t8~n& z&RulPCors8wUaqMHECG=IhB(-tU2XvHP6#NrLVyKG%Ee*mQ5Ps%wW?mcnriTVRc4J`2YVM>$ixSF2Xi+Wn(RUZnV?mJ?GRdw%lhZ+t&3s7g!~g{%m&i<6 z5{ib-<==DYG93I(yhyv4jp*y3#*WNuDUf6`vTM%c&hiayf(%=x@4$kJ!W4MtYcE#1 zHM?3xw63;L%x3drtd?jot!8u3qeqctceX3m;tWetK+>~q7Be$h>n6riK(5@ujLgRS zvOym)k+VAtyV^mF)$29Y`nw&ijdg~jYpkx%*^ z8dz`C*g=I?;clyi5|!27e2AuSa$&%UyR(J3W!A=ZgHF9OuKA34I-1U~pyD!KuRkjA zbkN!?MfQOeN>DUPBxoy5IX}@vw`EEB->q!)8fRl_mqUVuRu|C@KD-;yl=yKc=ZT0% zB$fMwcC|HE*0f8+PVlWHi>M`zfsA(NQFET?LrM^pPcw`cK+Mo0%8*x8@65=CS_^$cG{GZQ#xv($7J z??R$P)nPLodI;P!IC3eEYEHh7TV@opr#*)6A-;EU2XuogHvC;;k1aI8asq7ovoP!* z?x%UoPrZjj<&&aWpsbr>J$Er-7!E(BmOyEv!-mbGQGeJm-U2J>74>o5x`1l;)+P&~ z>}f^=Rx(ZQ2bm+YE0u=ZYrAV@apyt=v1wb?R@`i_g64YyAwcOUl=C!i>=Lzb$`tjv zOO-P#A+)t-JbbotGMT}arNhJmmGl-lyUpMn=2UacVZxmiG!s!6H39@~&uVokS zG=5qWhfW-WOI9g4!R$n7!|ViL!|v3G?GN6HR0Pt_L5*>D#FEj5wM1DScz4Jv@Sxnl zB@MPPmdI{(2D?;*wd>3#tjAirmUnQoZrVv`xM3hARuJksF(Q)wd4P$88fGYOT1p6U z`AHSN!`St}}UMBT9o7i|G`r$ zrB=s$qV3d6$W9@?L!pl0lf%)xs%1ko^=QY$ty-57=55PvP(^6E7cc zGJ*>m2=;fOj?F~yBf@K@9qwX0hA803Xw+b0m}+#a(>RyR8}*Y<4b+kpp|OS+!whP( zH`v{%s>jsQI9rd$*vm)EkwOm#W_-rLTHcZRek)>AtF+~<(did)*oR1|&~1|e36d-d zgtm5cv1O0oqgWC%Et@P4Vhm}Ndl(Y#C^MD03g#PH-TFy+7!Osv1z^UWS9@%JhswEq~6kSr2DITo59+; ze=ZC}i2Q?CJ~Iyu?vn|=9iKV>4j8KbxhE4&!@SQ^dVa-gK@YfS9xT(0kpW*EDjYUkoj! zE49{7H&E}k%5(>sM4uGY)Q*&3>{aitqdNnRJkbOmD5Mp5rv-hxzOn80QsG=HJ_atI-EaP69cacR)Uvh{G5dTpYG7d zbtmRMq@Sexey)||UpnZ?;g_KMZq4IDCy5}@u!5&B^-=6yyY{}e4Hh3ee!ZWtL*s?G zxG(A!<9o!CL+q?u_utltPMk+hn?N2@?}xU0KlYg?Jco{Yf@|mSGC<(Zj^yHCvhmyx z?OxOYoxbptDK()tsJ42VzXdINAMWL$0Gcw?G(g8TMB)Khw_|v9`_ql#pRd2i*?CZl z7k1b!jQB=9-V@h%;Cnl7EKi;Y^&NhU0mWEcj8B|3L30Ku#-9389Q+(Yet0r$F=+3p z6AKOMAIi|OHyzlHZtOm73}|ntKtFaXF2Fy|M!gOh^L4^62kGUoWS1i{9gsds_GWBc zLw|TaLP64z3z9?=R2|T6Xh2W4_F*$cq>MtXMOy&=IPIJ`;!Tw?PqvI2b*U1)25^<2 zU_ZPoxg_V0tngA0J+mm?3;OYw{i2Zb4x}NedZug!>EoN3DC{1i)Z{Z4m*(y{ov2%- zk(w>+scOO}MN!exSc`TN)!B=NUX`zThWO~M*ohqq;J2hx9h9}|s#?@eR!=F{QTrq~ zTcY|>azkCe$|Q0XFUdpFT=lTcyW##i;-e{}ORB4D?t@SfqGo_cS z->?^rh$<&n9DL!CF+h?LMZRi)qju!meugvxX*&jfD!^1XB3?E?HnwHP8$;uX{Rvp# zh|)hM>XDv$ZGg=$1{+_bA~u-vXqlw6NH=nkpyWE0u}LQjF-3NhATL@9rRxMnpO%f7 z)EhZf{PF|mKIMFxnC?*78(}{Y)}iztV12}_OXffJ;ta!fcFIVjdchyHxH=t%ci`Xd zX2AUB?%?poD6Zv*&BA!6c5S#|xn~DK01#XvjT!w!;&`lDXSJT4_j$}!qSPrb37vc{ z9^NfC%QvPu@vlxaZ;mIbn-VHA6miwi8qJ~V;pTZkKqqOii<1Cs}0i?uUIss;hM4dKq^1O35y?Yp=l4i zf{M!@QHH~rJ&X~8uATV><23zZUbs-J^3}$IvV_ANLS08>k`Td7aU_S1sLsfi*C-m1 z-e#S%UGs4E!;CeBT@9}aaI)qR-6NU@kvS#0r`g&UWg?fC7|b^_HyCE!8}nyh^~o@< zpm7PDFs9yxp+byMS(JWm$NeL?DNrMCNE!I^ko-*csB+dsf4GAq{=6sfyf4wb>?v1v zmb`F*bN1KUx-`ra1+TJ37bXNP%`-Fd`vVQFTwWpX@;s(%nDQa#oWhgk#mYlY*!d>( zE&!|ySF!mIyfING+#%RDY3IBH_fW$}6~1%!G`suHub1kP@&DoAd5~7J55;5_noPI6eLf{t;@9Kf<{aO0`1WNKd?<)C-|?C?)3s z>wEq@8=I$Wc~Mt$o;g++5qR+(6wt9GI~pyrDJ%c?gPZe)owvy^J2S=+M^ z&WhIE`g;;J^xQLVeCtf7b%Dg#Z2gq9hp_%g)-%_`y*zb; zn9`f`mUPN-Ts&fFo(aNTsXPA|J!TJ{0hZp0^;MYHLOcD=r_~~^ymS8KLCSeU3;^QzJNqS z5{5rEAv#l(X?bvwxpU;2%pQftF`YFgrD1jt2^~Mt^~G>T*}A$yZc@(k9orlCGv&|1 zWWvVgiJsCAtamuAYT~nzs?TQFt<1LSEx!@e0~@yd6$b5!Zm(FpBl;(Cn>2vF?k zOm#TTjFwd2D-CyA!mqR^?#Uwm{NBemP>(pHmM}9;;8`c&+_o3#E5m)JzfwN?(f-a4 zyd%xZc^oQx3XT?vcCqCX&Qrk~nu;fxs@JUoyVoi5fqpi&bUhQ2y!Ok2pzsFR(M(|U zw3E+kH_zmTRQ9dUMZWRE%Zakiwc+lgv7Z%|YO9YxAy`y28`Aw;WU6HXBgU7fl@dnt z-fFBV)}H-gqP!1;V@Je$WcbYre|dRdp{xt!7sL3Eoa%IA`5CAA%;Wq8PktwPdULo! z8!sB}Qt8#jH9Sh}QiUtEPZ6H0b*7qEKGJ%ITZ|vH)5Q^2m<7o3#Z>AKc%z7_u`rXA zqrCy{-{8;9>dfllLu$^M5L z-hXs))h*qz%~ActwkIA(qOVBZl2v4lwbM>9l70Y`+T*elINFqt#>OaVWoja8RMsep z6Or3f=oBnA3vDbn*+HNZP?8LsH2MY)x%c13@(XfuGR}R?Nu<|07{$+Lc3$Uv^I!MQ z>6qWgd-=aG2Y^24g4{Bw9ueOR)(9h`scImD=86dD+MnSN4$6 z^U*o_mE-6Rk~Dp!ANp#5RE9n*LG(Vg`1)g6!(XtDzsov$Dvz|Gv1WU68J$CkshQhS zCrc|cdkW~UK}5NeaWj^F4MSgFM+@fJd{|LLM)}_O<{rj z+?*Lm?owq?IzC%U%9EBga~h-cJbIu=#C}XuWN>OLrc%M@Gu~kFEYUi4EC6l#PR2JS zQUkGKrrS#6H7}2l0F@S11DP`@pih0WRkRJl#F;u{c&ZC{^$Z+_*lB)r)-bPgRFE;* zl)@hK4`tEP=P=il02x7-C7p%l=B`vkYjw?YhdJU9!P!jcmY$OtC^12w?vy3<<=tlY zUwHJ_0lgWN9vf>1%WACBD{UT)1qHQSE2%z|JHvP{#INr13jM}oYv_5#xsnv9`)UAO zuwgyV4YZ;O)eSc3(mka6=aRohi!HH@I#xq7kng?Acdg7S4vDJb6cI5fw?2z%3yR+| zU5v@Hm}vy;${cBp&@D=HQ9j7NcFaOYL zj-wV=eYF{|XTkFNM2uz&T8uH~;)^Zo!=KP)EVyH6s9l1~4m}N%XzPpduPg|h-&lL` zAXspR0YMOKd2yO)eMFFJ4?sQ&!`dF&!|niH*!^*Ml##o0M(0*uK9&yzekFi$+mP9s z>W9d%Jb)PtVi&-Ha!o~Iyh@KRuKpQ@)I~L*d`{O8!kRObjO7=n+Gp36fe!66neh+7 zW*l^0tTKjLLzr`x4`_8&on?mjW-PzheTNox8Hg7Nt@*SbE-%kP2hWYmHu#Fn@Q^J(SsPUz*|EgOoZ6byg3ew88UGdZ>9B2Tq=jF72ZaR=4u%1A6Vm{O#?@dD!(#tmR;eP(Fu z{$0O%=Vmua7=Gjr8nY%>ul?w=FJ76O2js&17W_iq2*tb!i{pt#`qZB#im9Rl>?t?0c zicIC}et_4d+CpVPx)i4~$u6N-QX3H77ez z?ZdvXifFk|*F8~L(W$OWM~r`pSk5}#F?j_5u$Obu9lDWIknO^AGu+Blk7!9Sb;NjS zncZA?qtASdNtzQ>z7N871IsPAk^CC?iIL}+{K|F@BuG2>qQ;_RUYV#>hHO(HUPpk@ z(bn~4|F_jiZi}Sad;_7`#4}EmD<1EiIxa48QjUuR?rC}^HRocq`OQPM@aHVKP9E#q zy%6bmHygCpIddPjE}q_DPC`VH_2m;Eey&ZH)E6xGeStOK7H)#+9y!%-Hm|QF6w#A( zIC0Yw%9j$s-#odxG~C*^MZ?M<+&WJ+@?B_QPUyTg9DJGtQN#NIC&-XddRsf3n^AL6 zT@P|H;PvN;ZpL0iv$bRb7|J{0o!Hq+S>_NrH4@coZtBJu#g8#CbR7|#?6uxi8d+$g z87apN>EciJZ`%Zv2**_uiET9Vk{pny&My;+WfGDw4EVL#B!Wiw&M|A8f1A@ z(yFQS6jfbH{b8Z-S7D2?Ixl`j0{+ZnpT=;KzVMLW{B$`N?Gw^Fl0H6lT61%T2AU**!sX0u?|I(yoy&Xveg7XBL&+>n6jd1##6d>TxE*Vj=8lWiG$4=u{1UbAa5QD>5_ z;Te^42v7K6Mmu4IWT6Rnm>oxrl~b<~^e3vbj-GCdHLIB_>59}Ya+~OF68NiH=?}2o zP(X7EN=quQn&)fK>M&kqF|<_*H`}c zk=+x)GU>{Af#vx&s?`UKUsz})g^Pc&?Ka@t5$n$bqf6{r1>#mWx6Ep>9|A}VmWRnowVo`OyCr^fHsf# zQjQ3Ttp7y#iQY8l`zEUW)(@gGQdt(~rkxlkefskT(t%@i8=|p1Y9Dc5bc+z#n$s13 zGJk|V0+&Ekh(F};PJzQKKo+FG@KV8a<$gmNSD;7rd_nRdc%?9)p!|B-@P~kxQG}~B zi|{0}@}zKC(rlFUYp*dO1RuvPC^DQOkX4<+EwvBAC{IZQdYxoq1Za!MW7%p7gGr=j zzWnAq%)^O2$eItftC#TTSArUyL$U54-O7e|)4_7%Q^2tZ^0-d&3J1}qCzR4dWX!)4 zzIEKjgnYgMus^>6uw4Jm8ga6>GBtMjpNRJ6CP~W=37~||gMo_p@GA@#-3)+cVYnU> zE5=Y4kzl+EbEh%dhQokB{gqNDqx%5*qBusWV%!iprn$S!;oN_6E3?0+umADVs4ako z?P+t?m?};gev9JXQ#Q&KBpzkHPde_CGu-y z<{}RRAx=xlv#mVi+Ibrgx~ujW$h{?zPfhz)Kp7kmYS&_|97b&H&1;J-mzrBWAvY} zh8-I8hl_RK2+nnf&}!W0P+>5?#?7>npshe<1~&l_xqKd0_>dl_^RMRq@-Myz&|TKZBj1=Q()) zF{dBjv5)h=&Z)Aevx}+i|7=R9rG^Di!sa)sZCl&ctX4&LScQ-kMncgO(9o6W6)yd< z@Rk!vkja*X_N3H=BavGoR0@u0<}m-7|2v!0+2h~S2Q&a=lTH91OJsvms2MT~ zY=c@LO5i`mLpBd(vh|)I&^A3TQLtr>w=zoyzTd=^f@TPu&+*2MtqE$Avf>l>}V|3-8Fp2hzo3y<)hr_|NO(&oSD z!vEjTWBxbKTiShVl-U{n*B3#)3a8$`{~Pk}J@elZ=>Pqp|MQ}jrGv7KrNcjW%TN_< zZz8kG{#}XoeWf7qY?D)L)8?Q-b@Na&>i=)(@uNo zr;cH98T3$Iau8Hn*@vXi{A@YehxDE2zX~o+RY`)6-X{8~hMpc#C`|8y> zU8Mnv5A0dNCf{Ims*|l-^ z(MRp{qoGohB34|ggDI*p!Aw|MFyJ|v+<+E3brfrI)|+l3W~CQLPbnF@G0)P~Ly!1TJLp}xh8uW`Q+RB-v`MRYZ9Gam3cM%{ zb4Cb*f)0deR~wtNb*8w-LlIF>kc7DAv>T0D(a3@l`k4TFnrO+g9XH7;nYOHxjc4lq zMmaW6qpgAgy)MckYMhl?>sq;-1E)-1llUneeA!ya9KM$)DaNGu57Z5aE>=VST$#vb zFo=uRHr$0M{-ha>h(D_boS4zId;3B|Tpqo|?B?Z@I?G(?&Iei+-{9L_A9=h=Qfn-U z1wIUnQe9!z%_j$F_{rf&`ZFSott09gY~qrf@g3O=Y>vzAnXCyL!@(BqWa)Zqt!#_k zfZHuwS52|&&)aK;CHq9V-t9qt0au{$#6c*R#e5n3rje0hic7c7m{kW$p(_`wB=Gw7 z4k`1Hi;Mc@yA7dp@r~?@rfw)TkjAW++|pkfOG}0N|2guek}j8Zen(!+@7?qt_7ndX zB=BG6WJ31#F3#Vk3=aQr8T)3`{=p9nBHlKzE0I@v`{vJ}h8pd6vby&VgFhzH|q;=aonunAXL6G2y(X^CtAhWr*jI zGjpY@raZDQkg*aMq}Ni6cRF z{oWv}5`nhSAv>usX}m^GHt`f(t8@zHc?K|y5Zi=4G*UG1Sza{$Dpj%X8 zzEXaKT5N6F5j4J|w#qlZP!zS7BT)9b+!ZSJdToqJts1c!)fwih4d31vfb{}W)EgcA zH2pZ^8_k$9+WD2n`6q5XbOy8>3pcYH9 z07eUB+p}YD@AH!}p!iKv><2QF-Y^&xx^PAc1F13A{nUeCDg&{hnix#FiO!fe(^&%Qcux!h znu*S!s$&nnkeotYsDthh1dq(iQrE|#f_=xVgfiiL&-5eAcC-> z5L0l|DVEM$#ulf{bj+Y~7iD)j<~O8CYM8GW)dQGq)!mck)FqoL^X zwNdZb3->hFrbHFm?hLvut-*uK?zXn3q1z|UX{RZ;-WiLoOjnle!xs+W0-8D)kjU#R z+S|A^HkRg$Ij%N4v~k`jyHffKaC~=wg=9)V5h=|kLQ@;^W!o2^K+xG&2n`XCd>OY5Ydi= zgHH=lgy++erK8&+YeTl7VNyVm9-GfONlSlVb3)V9NW5tT!cJ8d7X)!b-$fb!s76{t z@d=Vg-5K_sqHA@Zx-L_}wVnc@L@GL9_K~Zl(h5@AR#FAiKad8~KeWCo@mgXIQ#~u{ zgYFwNz}2b6Vu@CP0XoqJ+dm8px(5W5-Jpis97F`+KM)TuP*X8H@zwiVKDKGVp59pI zifNHZr|B+PG|7|Y<*tqap0CvG7tbR1R>jn70t1X`XJixiMVcHf%Ez*=xm1(CrTSDt z0cle!+{8*Ja&EOZ4@$qhBuKQ$U95Q%rc7tg$VRhk?3=pE&n+T3upZg^ZJc9~c2es% zh7>+|mrmA-p&v}|OtxqmHIBgUxL~^0+cpfkSK2mhh+4b=^F1Xgd2)}U*Yp+H?ls#z zrLxWg_hm}AfK2XYWr!rzW4g;+^^&bW%LmbtRai9f3PjU${r@n`JThy-cphbcwn)rq9{A$Ht`lmYKxOacy z6v2R(?gHhD5@&kB-Eg?4!hAoD7~(h>(R!s1c1Hx#s9vGPePUR|of32bS`J5U5w{F) z>0<^ktO2UHg<0{oxkdOQ;}coZDQph8p6ruj*_?uqURCMTac;>T#v+l1Tc~%^k-Vd@ zkc5y35jVNc49vZpZx;gG$h{%yslDI%Lqga1&&;mN{Ush1c7p>7e-(zp}6E7f-XmJb4nhk zb8zS+{IVbL$QVF8pf8}~kQ|dHJAEATmmnrb_wLG}-yHe>W|A&Y|;muy-d^t^<&)g5SJfaTH@P1%euONny=mxo+C z4N&w#biWY41r8k~468tvuYVh&XN&d#%QtIf9;iVXfWY)#j=l`&B~lqDT@28+Y!0E+MkfC}}H*#(WKKdJJq=O$vNYCb(ZG@p{fJgu;h z21oHQ(14?LeT>n5)s;uD@5&ohU!@wX8w*lB6i@GEH0pM>YTG+RAIWZD;4#F1&F%Jp zXZUml2sH0!lYJT?&sA!qwez6cXzJEd(1ZC~kT5kZSp7(@=H2$Azb_*W&6aA|9iwCL zdX7Q=42;@dspHDwYE?miGX#L^3xD&%BI&fN9^;`v4OjQXPBaBmOF1;#C)8XA(WFlH zycro;DS2?(G&6wkr6rqC>rqDv3nfGw3hmN_9Al>TgvmGsL8_hXx09};l9Ow@)F5@y z#VH5WigLDwZE4nh^7&@g{1FV^UZ%_LJ-s<{HN*2R$OPg@R~Z`c-ET*2}XB@9xvAjrK&hS=f|R8Gr9 zr|0TGOsI7RD+4+2{ZiwdVD@2zmg~g@^D--YL;6UYGSM8i$NbQr4!c7T9rg!8;TM0E zT#@?&S=t>GQm)*ua|?TLT2ktj#`|R<_*FAkOu2Pz$wEc%-=Y9V*$&dg+wIei3b*O8 z2|m$!jJG!J!ZGbbIa!(Af~oSyZV+~M1qGvelMzPNE_%5?c2>;MeeG2^N?JDKjFYCy z7SbPWH-$cWF9~fX%9~v99L!G(wi!PFp>rB!9xj7=Cv|F+7CsGNwY0Q_J%FID%C^CBZQfJ9K(HK%k31j~e#&?hQ zNuD6gRkVckU)v+53-fc} z7ZCzYN-5RG4H7;>>Hg?LU9&5_aua?A0)0dpew1#MMlu)LHe(M;OHjHIUl7|%%)YPo z0cBk;AOY00%Fe6heoN*$(b<)Cd#^8Iu;-2v@>cE-OB$icUF9EEoaC&q8z9}jMTT2I z8`9;jT%z0;dy4!8U;GW{i`)3!c6&oWY`J3669C!tM<5nQFFrFRglU8f)5Op$GtR-3 zn!+SPCw|04sv?%YZ(a7#L?vsdr7ss@WKAw&A*}-1S|9~cL%uA+E~>N6QklFE>8W|% zyX-qAUGTY1hQ-+um`2|&ji0cY*(qN!zp{YpDO-r>jPk*yuVSay<)cUt`t@&FPF_&$ zcHwu1(SQ`I-l8~vYyUxm@D1UEdFJ$f5Sw^HPH7b!9 zzYT3gKMF((N(v0#4f_jPfVZ=ApN^jQJe-X$`A?X+vWjLn_%31KXE*}5_}d8 zw_B1+a#6T1?>M{ronLbHIlEsMf93muJ7AH5h%;i99<~JX^;EAgEB1uHralD*!aJ@F zV2ruuFe9i2Q1C?^^kmVy921eb=tLDD43@-AgL^rQ3IO9%+vi_&R2^dpr}x{bCVPej z7G0-0o64uyWNtr*loIvslyo0%)KSDDKjfThe0hcqs)(C-MH1>bNGBDRTW~scy_{w} zp^aq8Qb!h9Lwielq%C1b8=?Z=&U)ST&PHbS)8Xzjh2DF?d{iAv)Eh)wsUnf>UtXN( zL7=$%YrZ#|^c{MYmhn!zV#t*(jdmYdCpwqpZ{v&L8KIuKn`@IIZfp!uo}c;7J57N` zAxyZ-uA4=Gzl~Ovycz%MW9ZL7N+nRo&1cfNn9(1H5eM;V_4Z_qVann7F>5f>%{rf= zPBZFaV@_Sobl?Fy&KXyzFDV*FIdhS5`Uc~S^Gjo)aiTHgn#<0C=9o-a-}@}xDor;D zZyZ|fvf;+=3MZd>SR1F^F`RJEZo+|MdyJYQAEauKu%WDol~ayrGU3zzbHKsnHKZ*z zFiwUkL@DZ>!*x05ql&EBq@_Vqv83&?@~q5?lVmffQZ+V-=qL+!u4Xs2Z2zdCQ3U7B&QR9_Iggy} z(om{Y9eU;IPe`+p1ifLx-XWh?wI)xU9ik+m#g&pGdB5Bi<`PR*?92lE0+TkRuXI)z z5LP!N2+tTc%cB6B1F-!fj#}>S!vnpgVU~3!*U1ej^)vjUH4s-bd^%B=ItQqDCGbrEzNQi(dJ`J}-U=2{7-d zK8k^Rlq2N#0G?9&1?HSle2vlkj^KWSBYTwx`2?9TU_DX#J+f+qLiZCqY1TXHFxXZqYMuD@RU$TgcnCC{_(vwZ-*uX)~go#%PK z@}2Km_5aQ~(<3cXeJN6|F8X_1@L%@xTzs}$_*E|a^_URF_qcF;Pfhoe?FTFwvjm1o z8onf@OY@jC2tVcMaZS;|T!Ks(wOgPpRzRnFS-^RZ4E!9dsnj9sFt609a|jJbb1Dt@ z<=Gal2jDEupxUSwWu6zp<<&RnAA;d&4gKVG0iu6g(DsST(4)z6R)zDpfaQ}v{5ARt zyhwvMtF%b-YazR5XLz+oh=mn;y-Mf2a8>7?2v8qX;19y?b>Z5laGHvzH;Nu9S`B8} zI)qN$GbXIQ1VL3lnof^6TS~rvPVg4V?Dl2Bb*K2z4E{5vy<(@@K_cN@U>R!>aUIRnb zL*)=787*cs#zb31zBC49x$`=fkQbMAef)L2$dR{)6BAz!t5U_B#1zZG`^neKSS22oJ#5B=gl%U=WeqL9REF2g zZnfCb0?quf?Ztj$VXvDSWoK`0L=Zxem2q}!XWLoT-kYMOx)!7fcgT35uC~0pySEme z`{wGWTkGr7>+Kb^n;W?BZH6ZP(9tQX%-7zF>vc2}LuWDI(9kh1G#7B99r4x6;_-V+k&c{nPUrR zAXJGRiMe~aup{0qzmLNjS_BC4cB#sXjckx{%_c&^xy{M61xEb>KW_AG5VFXUOjAG4 z^>Qlm9A#1N{4snY=(AmWzatb!ngqiqPbBZ7>Uhb3)dTkSGcL#&SH>iMO-IJBPua`u zo)LWZ>=NZLr758j{%(|uQuZ)pXq_4c!!>s|aDM9#`~1bzK3J1^^D#<2bNCccH7~-X}Ggi!pIIF>uFx%aPARGQsnC8ZQc8lrQ5o~smqOg>Ti^GNme94*w z)JZy{_{#$jxGQ&`M z!OMvZMHR>8*^>eS%o*6hJwn!l8VOOjZQJvh)@tnHVW&*GYPuxqXw}%M!(f-SQf`=L z5;=5w2;%82VMH6Xi&-K3W)o&K^+vJCepWZ-rW%+Dc6X3(){z$@4zjYxQ|}8UIojeC zYZpQ1dU{fy=oTr<4VX?$q)LP}IUmpiez^O&N3E_qPpchGTi5ZM6-2ScWlQq%V&R2Euz zO|Q0Hx>lY1Q1cW5xHv5!0OGU~PVEqSuy#fD72d#O`N!C;o=m+YioGu-wH2k6!t<~K zSr`E=W9)!g==~x9VV~-8{4ZN9{~-A9zJpRe%NGg$+MDuI-dH|b@BD)~>pPCGUNNzY zMDg||0@XGQgw`YCt5C&A{_+J}mvV9Wg{6V%2n#YSRN{AP#PY?1FF1#|vO_%e+#`|2*~wGAJaeRX6=IzFNeWhz6gJc8+(03Ph4y6ELAm=AkN7TOgMUEw*N{= z_)EIDQx5q22oUR+_b*tazu9+pX|n1c*IB-}{DqIj z-?E|ks{o3AGRNb;+iKcHkZvYJvFsW&83RAPs1Oh@IWy%l#5x2oUP6ZCtv+b|q>jsf zZ_9XO;V!>n`UxH1LvH8)L4?8raIvasEhkpQoJ`%!5rBs!0Tu(s_D{`4opB;57)pkX z4$A^8CsD3U5*!|bHIEqsn~{q+Ddj$ME@Gq4JXtgVz&7l{Ok!@?EA{B3P~NAqb9)4? zkQo30A^EbHfQ@87G5&EQTd`frrwL)&Yw?%-W@uy^Gn23%j?Y!Iea2xw<-f;esq zf%w5WN@E1}zyXtYv}}`U^B>W`>XPmdLj%4{P298|SisrE;7HvXX;A}Ffi8B#3Lr;1 zHt6zVb`8{#+e$*k?w8|O{Uh|&AG}|DG1PFo1i?Y*cQm$ZwtGcVgMwtBUDa{~L1KT-{jET4w60>{KZ27vXrHJ;fW{6| z=|Y4!&UX020wU1>1iRgB@Q#m~1^Z^9CG1LqDhYBrnx%IEdIty z!46iOoKlKs)c}newDG)rWUikD%j`)p z_w9Ph&e40=(2eBy;T!}*1p1f1SAUDP9iWy^u^Ubdj21Kn{46;GR+hwLO=4D11@c~V zI8x&(D({K~Df2E)Nx_yQvYfh4;MbMJ@Z}=Dt3_>iim~QZ*hZIlEs0mEb z_54+&*?wMD`2#vsQRN3KvoT>hWofI_Vf(^C1ff-Ike@h@saEf7g}<9T`W;HAne-Nd z>RR+&SP35w)xKn8^U$7))PsM!jKwYZ*RzEcG-OlTrX3}9a{q%#Un5E5W{{hp>w~;` zGky+3(vJvQyGwBo`tCpmo0mo((?nM8vf9aXrrY1Ve}~TuVkB(zeds^jEfI}xGBCM2 zL1|#tycSaWCurP+0MiActG3LCas@_@tao@(R1ANlwB$4K53egNE_;!&(%@Qo$>h`^1S_!hN6 z)vZtG$8fN!|BXBJ=SI>e(LAU(y(i*PHvgQ2llulxS8>qsimv7yL}0q_E5WiAz7)(f zC(ahFvG8&HN9+6^jGyLHM~$)7auppeWh_^zKk&C_MQ~8;N??OlyH~azgz5fe^>~7F zl3HnPN3z-kN)I$4@`CLCMQx3sG~V8hPS^}XDXZrQA>}mQPw%7&!sd(Pp^P=tgp-s^ zjl}1-KRPNWXgV_K^HkP__SR`S-|OF0bR-N5>I%ODj&1JUeAQ3$9i;B~$S6}*^tK?= z**%aCiH7y?xdY?{LgVP}S0HOh%0%LI$wRx;$T|~Y8R)Vdwa}kGWv8?SJVm^>r6+%I z#lj1aR94{@MP;t-scEYQWc#xFA30^}?|BeX*W#9OL;Q9#WqaaM546j5j29((^_8Nu z4uq}ESLr~r*O7E7$D{!k9W>`!SLoyA53i9QwRB{!pHe8um|aDE`Cg0O*{jmor)^t)3`>V>SWN-2VJcFmj^1?~tT=JrP`fVh*t zXHarp=8HEcR#vFe+1a%XXuK+)oFs`GDD}#Z+TJ}Ri`FvKO@ek2ayn}yaOi%(8p%2$ zpEu)v0Jym@f}U|-;}CbR=9{#<^z28PzkkTNvyKvJDZe+^VS2bES3N@Jq!-*}{oQlz z@8bgC_KnDnT4}d#&Cpr!%Yb?E!brx0!eVOw~;lLwUoz#Np%d$o%9scc3&zPm`%G((Le|6o1 zM(VhOw)!f84zG^)tZ1?Egv)d8cdNi+T${=5kV+j;Wf%2{3g@FHp^Gf*qO0q!u$=m9 zCaY`4mRqJ;FTH5`a$affE5dJrk~k`HTP_7nGTY@B9o9vvnbytaID;^b=Tzp7Q#DmD zC(XEN)Ktn39z5|G!wsVNnHi) z%^q94!lL|hF`IijA^9NR0F$@h7k5R^ljOW(;Td9grRN0Mb)l_l7##{2nPQ@?;VjXv zaLZG}yuf$r$<79rVPpXg?6iiieX|r#&`p#Con2i%S8*8F}(E) zI5E6c3tG*<;m~6>!&H!GJ6zEuhH7mkAzovdhLy;)q z{H2*8I^Pb}xC4s^6Y}6bJvMu=8>g&I)7!N!5QG$xseeU#CC?ZM-TbjsHwHgDGrsD= z{%f;@Sod+Ch66Ko2WF~;Ty)v>&x^aovCbCbD7>qF*!?BXmOV3(s|nxsb*Lx_2lpB7 zokUnzrk;P=T-&kUHO}td+Zdj!3n&NR?K~cRU zAXU!DCp?51{J4w^`cV#ye}(`SQhGQkkMu}O3M*BWt4UsC^jCFUy;wTINYmhD$AT;4 z?Xd{HaJjP`raZ39qAm;%beDbrLpbRf(mkKbANan7XsL>_pE2oo^$TgdidjRP!5-`% zv0d!|iKN$c0(T|L0C~XD0aS8t{*&#LnhE;1Kb<9&=c2B+9JeLvJr*AyyRh%@jHej=AetOMSlz^=!kxX>>B{2B1uIrQyfd8KjJ+DBy!h)~*(!|&L4^Q_07SQ~E zcemVP`{9CwFvPFu7pyVGCLhH?LhEVb2{7U+Z_>o25#+3<|8%1T^5dh}*4(kfJGry} zm%r#hU+__Z;;*4fMrX=Bkc@7|v^*B;HAl0((IBPPii%X9+u3DDF6%bI&6?Eu$8&aWVqHIM7mK6?Uvq$1|(-T|)IV<>e?!(rY zqkmO1MRaLeTR=)io(0GVtQT@s6rN%C6;nS3@eu;P#ry4q;^O@1ZKCJyp_Jo)Ty^QW z+vweTx_DLm{P-XSBj~Sl<%_b^$=}odJ!S2wAcxenmzFGX1t&Qp8Vxz2VT`uQsQYtdn&_0xVivIcxZ_hnrRtwq4cZSj1c-SG9 z7vHBCA=fd0O1<4*=lu$6pn~_pVKyL@ztw1swbZi0B?spLo56ZKu5;7ZeUml1Ws1?u zqMf1p{5myAzeX$lAi{jIUqo1g4!zWLMm9cfWcnw`k6*BR^?$2(&yW?>w;G$EmTA@a z6?y#K$C~ZT8+v{87n5Dm&H6Pb_EQ@V0IWmG9cG=O;(;5aMWWrIPzz4Q`mhK;qQp~a z+BbQrEQ+w{SeiuG-~Po5f=^EvlouB@_|4xQXH@A~KgpFHrwu%dwuCR)=B&C(y6J4J zvoGk9;lLs9%iA-IJGU#RgnZZR+@{5lYl8(e1h6&>Vc_mvg0d@);X zji4T|n#lB!>pfL|8tQYkw?U2bD`W{na&;*|znjmalA&f;*U++_aBYerq;&C8Kw7mI z7tsG*?7*5j&dU)Lje;^{D_h`%(dK|pB*A*1(Jj)w^mZ9HB|vGLkF1GEFhu&rH=r=8 zMxO42e{Si6$m+Zj`_mXb&w5Q(i|Yxyg?juUrY}78uo@~3v84|8dfgbPd0iQJRdMj< zncCNGdMEcsxu#o#B5+XD{tsg*;j-eF8`mp~K8O1J!Z0+>0=7O=4M}E?)H)ENE;P*F z$Ox?ril_^p0g7xhDUf(q652l|562VFlC8^r8?lQv;TMvn+*8I}&+hIQYh2 z1}uQQaag&!-+DZ@|C+C$bN6W;S-Z@)d1|en+XGvjbOxCa-qAF*LA=6s(Jg+g;82f$ z(Vb)8I)AH@cdjGFAR5Rqd0wiNCu!xtqWbcTx&5kslzTb^7A78~Xzw1($UV6S^VWiP zFd{Rimd-0CZC_Bu(WxBFW7+k{cOW7DxBBkJdJ;VsJ4Z@lERQr%3eVv&$%)b%<~ zCl^Y4NgO}js@u{|o~KTgH}>!* z_iDNqX2(As7T0xivMH|3SC1ivm8Q}6Ffcd7owUKN5lHAtzMM4<0v+ykUT!QiowO;`@%JGv+K$bBx@*S7C8GJVqQ_K>12}M`f_Ys=S zKFh}HM9#6Izb$Y{wYzItTy+l5U2oL%boCJn?R3?jP@n$zSIwlmyGq30Cw4QBO|14` zW5c);AN*J3&eMFAk$SR~2k|&+&Bc$e>s%c{`?d~85S-UWjA>DS5+;UKZ}5oVa5O(N zqqc@>)nee)+4MUjH?FGv%hm2{IlIF-QX}ym-7ok4Z9{V+ZHVZQl$A*x!(q%<2~iVv znUa+BX35&lCb#9VE-~Y^W_f;Xhl%vgjwdjzMy$FsSIj&ok}L+X`4>J=9BkN&nu^E*gbhj3(+D>C4E z@Fwq_=N)^bKFSHTzZk?-gNU$@l}r}dwGyh_fNi=9b|n}J>&;G!lzilbWF4B}BBq4f zYIOl?b)PSh#XTPp4IS5ZR_2C!E)Z`zH0OW%4;&~z7UAyA-X|sh9@~>cQW^COA9hV4 zXcA6qUo9P{bW1_2`eo6%hgbN%(G-F1xTvq!sc?4wN6Q4`e9Hku zFwvlAcRY?6h^Fj$R8zCNEDq8`=uZB8D-xn)tA<^bFFy}4$vA}Xq0jAsv1&5!h!yRA zU()KLJya5MQ`q&LKdH#fwq&(bNFS{sKlEh_{N%{XCGO+po#(+WCLmKW6&5iOHny>g z3*VFN?mx!16V5{zyuMWDVP8U*|BGT$(%IO|)?EF|OI*sq&RovH!N%=>i_c?K*A>>k zyg1+~++zY4Q)J;VWN0axhoIKx;l&G$gvj(#go^pZskEVj8^}is3Jw26LzYYVos0HX zRPvmK$dVxM8(Tc?pHFe0Z3uq){{#OK3i-ra#@+;*=ui8)y6hsRv z4Fxx1c1+fr!VI{L3DFMwXKrfl#Q8hfP@ajgEau&QMCxd{g#!T^;ATXW)nUg&$-n25 zruy3V!!;{?OTobo|0GAxe`Acn3GV@W=&n;~&9 zQM>NWW~R@OYORkJAo+eq1!4vzmf9K%plR4(tB@TR&FSbDoRgJ8qVcH#;7lQub*nq&?Z>7WM=oeEVjkaG zT#f)=o!M2DO5hLR+op>t0CixJCIeXH*+z{-XS|%jx)y(j&}Wo|3!l7{o)HU3m7LYyhv*xF&tq z%IN7N;D4raue&&hm0xM=`qv`+TK@;_xAcGKuK(2|75~ar2Yw)geNLSmVxV@x89bQu zpViVKKnlkwjS&&c|-X6`~xdnh}Ps)Hs z4VbUL^{XNLf7_|Oi>tA%?SG5zax}esF*FH3d(JH^Gvr7Rp*n=t7frH!U;!y1gJB^i zY_M$KL_}mW&XKaDEi9K-wZR|q*L32&m+2n_8lq$xRznJ7p8}V>w+d@?uB!eS3#u<} zIaqi!b!w}a2;_BfUUhGMy#4dPx>)_>yZ`ai?Rk`}d0>~ce-PfY-b?Csd(28yX22L% zI7XI>OjIHYTk_@Xk;Gu^F52^Gn6E1&+?4MxDS2G_#PQ&yXPXP^<-p|2nLTb@AAQEY zI*UQ9Pmm{Kat}wuazpjSyXCdnrD&|C1c5DIb1TnzF}f4KIV6D)CJ!?&l&{T)e4U%3HTSYqsQ zo@zWB1o}ceQSV)<4G<)jM|@@YpL+XHuWsr5AYh^Q{K=wSV99D~4RRU52FufmMBMmd z_H}L#qe(}|I9ZyPRD6kT>Ivj&2Y?qVZq<4bG_co_DP`sE*_Xw8D;+7QR$Uq(rr+u> z8bHUWbV19i#)@@G4bCco@Xb<8u~wVDz9S`#k@ciJtlu@uP1U0X?yov8v9U3VOig2t zL9?n$P3=1U_Emi$#slR>N5wH-=J&T=EdUHA}_Z zZIl3nvMP*AZS9{cDqFanrA~S5BqxtNm9tlu;^`)3X&V4tMAkJ4gEIPl= zoV!Gyx0N{3DpD@)pv^iS*dl2FwANu;1;%EDl}JQ7MbxLMAp>)UwNwe{=V}O-5C*>F zu?Ny+F64jZn<+fKjF01}8h5H_3pey|;%bI;SFg$w8;IC<8l|3#Lz2;mNNik6sVTG3 z+Su^rIE#40C4a-587$U~%KedEEw1%r6wdvoMwpmlXH$xPnNQN#f%Z7|p)nC>WsuO= z4zyqapLS<8(UJ~Qi9d|dQijb_xhA2)v>la)<1md5s^R1N&PiuA$^k|A<+2C?OiHbj z>Bn$~t)>Y(Zb`8hW7q9xQ=s>Rv81V+UiuZJc<23HplI88isqRCId89fb`Kt|CxVIg znWcwprwXnotO>3s&Oypkte^9yJjlUVVxSe%_xlzmje|mYOVPH^vjA=?6xd0vaj0Oz zwJ4OJNiFdnHJX3rw&inskjryukl`*fRQ#SMod5J|KroJRsVXa5_$q7whSQ{gOi*s0 z1LeCy|JBWRsDPn7jCb4s(p|JZiZ8+*ExC@Vj)MF|*Vp{B(ziccSn`G1Br9bV(v!C2 z6#?eqpJBc9o@lJ#^p-`-=`4i&wFe>2)nlPK1p9yPFzJCzBQbpkcR>={YtamIw)3nt z(QEF;+)4`>8^_LU)_Q3 zC5_7lgi_6y>U%m)m@}Ku4C}=l^J=<<7c;99ec3p{aR+v=diuJR7uZi%aQv$oP?dn?@6Yu_+*^>T0ptf(oobdL;6)N-I!TO`zg^Xbv3#L0I~sn@WGk-^SmPh5>W+LB<+1PU}AKa?FCWF|qMNELOgdxR{ zbqE7@jVe+FklzdcD$!(A$&}}H*HQFTJ+AOrJYnhh}Yvta(B zQ_bW4Rr;R~&6PAKwgLWXS{Bnln(vUI+~g#kl{r+_zbngT`Y3`^Qf=!PxN4IYX#iW4 zucW7@LLJA9Zh3(rj~&SyN_pjO8H&)|(v%!BnMWySBJV=eSkB3YSTCyIeJ{i;(oc%_hk{$_l;v>nWSB)oVeg+blh=HB5JSlG_r7@P z3q;aFoZjD_qS@zygYqCn=;Zxjo!?NK!%J$ z52lOP`8G3feEj+HTp@Tnn9X~nG=;tS+z}u{mQX_J0kxtr)O30YD%oo)L@wy`jpQYM z@M>Me=95k1p*FW~rHiV1CIfVc{K8r|#Kt(ApkXKsDG$_>76UGNhHExFCw#Ky9*B-z zNq2ga*xax!HMf_|Vp-86r{;~YgQKqu7%szk8$hpvi_2I`OVbG1doP(`gn}=W<8%Gn z%81#&WjkH4GV;4u43EtSW>K_Ta3Zj!XF?;SO3V#q=<=>Tc^@?A`i;&`-cYj|;^ zEo#Jl5zSr~_V-4}y8pnufXLa80vZY4z2ko7fj>DR)#z=wWuS1$$W!L?(y}YC+yQ|G z@L&`2upy3f>~*IquAjkVNU>}c10(fq#HdbK$~Q3l6|=@-eBbo>B9(6xV`*)sae58*f zym~RRVx;xoCG3`JV`xo z!lFw)=t2Hy)e!IFs?0~7osWk(d%^wxq&>_XD4+U#y&-VF%4z?XH^i4w`TxpF{`XhZ z%G}iEzf!T(l>g;W9<~K+)$g!{UvhW{E0Lis(S^%I8OF&%kr!gJ&fMOpM=&=Aj@wuL zBX?*6i51Qb$uhkwkFYkaD_UDE+)rh1c;(&Y=B$3)J&iJfQSx!1NGgPtK!$c9OtJuu zX(pV$bfuJpRR|K(dp@^j}i&HeJOh@|7lWo8^$*o~Xqo z5Sb+!EtJ&e@6F+h&+_1ETbg7LfP5GZjvIUIN3ibCOldAv z)>YdO|NH$x7AC8dr=<2ekiY1%fN*r~e5h6Yaw<{XIErujKV~tiyrvV_DV0AzEknC- zR^xKM3i<1UkvqBj3C{wDvytOd+YtDSGu!gEMg+!&|8BQrT*|p)(dwQLEy+ zMtMzij3zo40)CA!BKZF~yWg?#lWhqD3@qR)gh~D{uZaJO;{OWV8XZ_)J@r3=)T|kt zUS1pXr6-`!Z}w2QR7nP%d?ecf90;K_7C3d!UZ`N(TZoWNN^Q~RjVhQG{Y<%E1PpV^4 z-m-K+$A~-+VDABs^Q@U*)YvhY4Znn2^w>732H?NRK(5QSS$V@D7yz2BVX4)f5A04~$WbxGOam22>t&uD)JB8-~yiQW6ik;FGblY_I>SvB_z2?PS z*Qm&qbKI{H1V@YGWzpx`!v)WeLT02};JJo*#f$a*FH?IIad-^(;9XC#YTWN6;Z6+S zm4O1KH=#V@FJw7Pha0!9Vb%ZIM$)a`VRMoiN&C|$YA3~ZC*8ayZRY^fyuP6$n%2IU z$#XceYZeqLTXw(m$_z|33I$B4k~NZO>pP6)H_}R{E$i%USGy{l{-jOE;%CloYPEU+ zRFxOn4;7lIOh!7abb23YKD+_-?O z0FP9otcAh+oSj;=f#$&*ExUHpd&e#bSF%#8*&ItcL2H$Sa)?pt0Xtf+t)z$_u^wZi z44oE}r4kIZGy3!Mc8q$B&6JqtnHZ>Znn!Zh@6rgIu|yU+zG8q`q9%B18|T|oN3zMq z`l&D;U!OL~%>vo&q0>Y==~zLiCZk4v%s_7!9DxQ~id1LLE93gf*gg&2$|hB#j8;?3 z5v4S;oM6rT{Y;I+#FdmNw z){d%tNM<<#GN%n9ox7B=3#;u7unZ~tLB_vRZ52a&2=IM)2VkXm=L+Iqq~uk#Dug|x z>S84e+A7EiOY5lj*!q?6HDkNh~0g;0Jy(al!ZHHDtur9T$y-~)94HelX1NHjXWIM7UAe}$?jiz z9?P4`I0JM=G5K{3_%2jPLC^_Mlw?-kYYgb7`qGa3@dn|^1fRMwiyM@Ch z;CB&o7&&?c5e>h`IM;Wnha0QKnEp=$hA8TJgR-07N~U5(>9vJzeoFsSRBkDq=x(YgEMpb=l4TDD`2 zwVJpWGTA_u7}?ecW7s6%rUs&NXD3+n;jB86`X?8(l3MBo6)PdakI6V6a}22{)8ilT zM~T*mU}__xSy|6XSrJ^%lDAR3Lft%+yxC|ZUvSO_nqMX!_ul3;R#*{~4DA=h$bP)%8Yv9X zyp><|e8=_ttI}ZAwOd#dlnSjck#6%273{E$kJuCGu=I@O)&6ID{nWF5@gLb16sj|&Sb~+du4e4O_%_o`Ix4NRrAsyr1_}MuP94s>de8cH-OUkVPk3+K z&jW)It9QiU-ti~AuJkL`XMca8Oh4$SyJ=`-5WU<{cIh+XVH#e4d&zive_UHC!pN>W z3TB;Mn5i)9Qn)#6@lo4QpI3jFYc0~+jS)4AFz8fVC;lD^+idw^S~Qhq>Tg(!3$yLD zzktzoFrU@6s4wwCMz}edpF5i5Q1IMmEJQHzp(LAt)pgN3&O!&d?3W@6U4)I^2V{;- z6A(?zd93hS*uQmnh4T)nHnE{wVhh(=MMD(h(P4+^p83Om6t<*cUW>l(qJzr%5vp@K zN27ka(L{JX=1~e2^)F^i=TYj&;<7jyUUR2Bek^A8+3Up*&Xwc{)1nRR5CT8vG>ExV zHnF3UqXJOAno_?bnhCX-&kwI~Ti8t4`n0%Up>!U`ZvK^w2+0Cs-b9%w%4`$+To|k= zKtgc&l}P`*8IS>8DOe?EB84^kx4BQp3<7P{Pq}&p%xF_81pg!l2|u=&I{AuUgmF5n zJQCTLv}%}xbFGYtKfbba{CBo)lWW%Z>i(_NvLhoQZ*5-@2l&x>e+I~0Nld3UI9tdL zRzu8}i;X!h8LHVvN?C+|M81e>Jr38%&*9LYQec9Ax>?NN+9(_>XSRv&6hlCYB`>Qm z1&ygi{Y()OU4@D_jd_-7vDILR{>o|7-k)Sjdxkjgvi{@S>6GqiF|o`*Otr;P)kLHN zZkpts;0zw_6;?f(@4S1FN=m!4^mv~W+lJA`&7RH%2$)49z0A+8@0BCHtj|yH--AEL z0tW6G%X-+J+5a{5*WKaM0QDznf;V?L5&uQw+yegDNDP`hA;0XPYc6e0;Xv6|i|^F2WB)Z$LR|HR4 zTQsRAby9(^Z@yATyOgcfQw7cKyr^3Tz7lc7+JEwwzA7)|2x+PtEb>nD(tpxJQm)Kn zW9K_*r!L%~N*vS8<5T=iv|o!zTe9k_2jC_j*7ik^M_ zaf%k{WX{-;0*`t`G!&`eW;gChVXnJ-Rn)To8vW-?>>a%QU1v`ZC=U)f8iA@%JG0mZ zDqH;~mgBnrCP~1II<=V9;EBL)J+xzCoiRBaeH&J6rL!{4zIY8tZka?_FBeQeNO3q6 zyG_alW54Ba&wQf{&F1v-r1R6ID)PTsqjIBc+5MHkcW5Fnvi~{-FjKe)t1bl}Y;z@< z=!%zvpRua>>t_x}^}z0<7MI!H2v6|XAyR9!t50q-A)xk0nflgF4*OQlCGK==4S|wc zRMsSscNhRzHMBU8TdcHN!q^I}x0iXJ%uehac|Zs_B$p@CnF)HeXPpB_Za}F{<@6-4 zl%kml@}kHQ(ypD8FsPJ2=14xXJE|b20RUIgs!2|R3>LUMGF6X*B_I|$`Qg=;zm7C z{mEDy9dTmPbued7mlO@phdmAmJ7p@GR1bjCkMw6*G7#4+`k>fk1czdJUB!e@Q(~6# zwo%@p@V5RL0ABU2LH7Asq^quDUho@H>eTZH9f*no9fY0T zD_-9px3e}A!>>kv5wk91%C9R1J_Nh!*&Kk$J3KNxC}c_@zlgpJZ+5L)Nw|^p=2ue}CJtm;uj*Iqr)K})kA$xtNUEvX;4!Px*^&9T_`IN{D z{6~QY=Nau6EzpvufB^hflc#XIsSq0Y9(nf$d~6ZwK}fal92)fr%T3=q{0mP-EyP_G z)UR5h@IX}3Qll2b0oCAcBF>b*@Etu*aTLPU<%C>KoOrk=x?pN!#f_Og-w+;xbFgjQ zXp`et%lDBBh~OcFnMKMUoox0YwBNy`N0q~bSPh@+enQ=4RUw1) zpovN`QoV>vZ#5LvC;cl|6jPr}O5tu!Ipoyib8iXqy}TeJ;4+_7r<1kV0v5?Kv>fYp zg>9L`;XwXa&W7-jf|9~uP2iyF5`5AJ`Q~p4eBU$MCC00`rcSF>`&0fbd^_eqR+}mK z4n*PMMa&FOcc)vTUR zlDUAn-mh`ahi_`f`=39JYTNVjsTa_Y3b1GOIi)6dY)D}xeshB0T8Eov5%UhWd1)u}kjEQ|LDo{tqKKrYIfVz~@dp!! zMOnah@vp)%_-jDTUG09l+;{CkDCH|Q{NqX*uHa1YxFShy*1+;J`gywKaz|2Q{lG8x zP?KBur`}r`!WLKXY_K;C8$EWG>jY3UIh{+BLv0=2)KH%P}6xE2kg)%(-uA6lC?u8}{K(#P*c zE9C8t*u%j2r_{;Rpe1A{9nNXU;b_N0vNgyK!EZVut~}+R2rcbsHilqsOviYh-pYX= zHw@53nlmwYI5W5KP>&`dBZe0Jn?nAdC^HY1wlR6$u^PbpB#AS&5L6zqrXN&7*N2Q` z+Rae1EwS)H=aVSIkr8Ek^1jy2iS2o7mqm~Mr&g5=jjt7VxwglQ^`h#Mx+x2v|9ZAwE$i_9918MjJxTMr?n!bZ6n$}y11u8I9COTU`Z$Fi z!AeAQLMw^gp_{+0QTEJrhL424pVDp%wpku~XRlD3iv{vQ!lAf!_jyqd_h}+Tr1XG| z`*FT*NbPqvHCUsYAkFnM`@l4u_QH&bszpUK#M~XLJt{%?00GXY?u_{gj3Hvs!=N(I z(=AuWPijyoU!r?aFTsa8pLB&cx}$*%;K$e*XqF{~*rA-qn)h^!(-;e}O#B$|S~c+U zN4vyOK0vmtx$5K!?g*+J@G1NmlEI=pyZXZ69tAv=@`t%ag_Hk{LP~OH9iE)I= zaJ69b4kuCkV0V zo(M0#>phpQ_)@j;h%m{-a*LGi(72TP)ws2w*@4|C-3+;=5DmC4s7Lp95%n%@Ko zfdr3-a7m*dys9iIci$A=4NPJ`HfJ;hujLgU)ZRuJI`n;Pw|yksu!#LQnJ#dJysgNb z@@qwR^wrk(jbq4H?d!lNyy72~Dnn87KxsgQ!)|*m(DRM+eC$wh7KnS-mho3|KE)7h zK3k;qZ;K1Lj6uEXLYUYi)1FN}F@-xJ z@@3Hb84sl|j{4$3J}aTY@cbX@pzB_qM~APljrjju6P0tY{C@ zpUCOz_NFmALMv1*blCcwUD3?U6tYs+N%cmJ98D%3)%)Xu^uvzF zS5O!sc#X6?EwsYkvPo6A%O8&y8sCCQH<%f2togVwW&{M;PR!a(ZT_A+jVAbf{@5kL zB@Z(hb$3U{T_}SKA_CoQVU-;j>2J=L#lZ~aQCFg-d<9rzs$_gO&d5N6eFSc z1ml8)P*FSi+k@!^M9nDWR5e@ATD8oxtDu=36Iv2!;dZzidIS(PCtEuXAtlBb1;H%Z zwnC^Ek*D)EX4#Q>R$$WA2sxC_t(!!6Tr?C#@{3}n{<^o;9id1RA&-Pig1e-2B1XpG zliNjgmd3c&%A}s>qf{_j#!Z`fu0xIwm4L0)OF=u(OEmp;bLCIaZX$&J_^Z%4Sq4GZ zPn6sV_#+6pJmDN_lx@1;Zw6Md_p0w9h6mHtzpuIEwNn>OnuRSC2=>fP^Hqgc)xu^4 z<3!s`cORHJh#?!nKI`Et7{3C27+EuH)Gw1f)aoP|B3y?fuVfvpYYmmukx0ya-)TQX zR{ggy5cNf4X|g)nl#jC9p>7|09_S7>1D2GTRBUTW zAkQ=JMRogZqG#v;^=11O6@rPPwvJkr{bW-Qg8`q8GoD#K`&Y+S#%&B>SGRL>;ZunM@49!}Uy zN|bBCJ%sO;@3wl0>0gbl3L@1^O60ONObz8ZI7nder>(udj-jt`;yj^nTQ$L9`OU9W zX4alF#$|GiR47%x@s&LV>2Sz2R6?;2R~5k6V>)nz!o_*1Y!$p>BC5&?hJg_MiE6UBy>RkVZj`9UWbRkN-Hk!S`=BS3t3uyX6)7SF#)71*}`~Ogz z1rap5H6~dhBJ83;q-Y<5V35C2&F^JI-it(=5D#v!fAi9p#UwV~2tZQI+W(Dv?1t9? zfh*xpxxO{-(VGB>!Q&0%^YW_F!@aZS#ucP|YaD#>wd1Fv&Z*SR&mc;asi}1G) z_H>`!akh-Zxq9#io(7%;a$)w+{QH)Y$?UK1Dt^4)up!Szcxnu}kn$0afcfJL#IL+S z5gF_Y30j;{lNrG6m~$Ay?)*V9fZuU@3=kd40=LhazjFrau>(Y>SJNtOz>8x_X-BlA zIpl{i>OarVGj1v(4?^1`R}aQB&WCRQzS~;7R{tDZG=HhgrW@B`W|#cdyj%YBky)P= zpxuOZkW>S6%q7U{VsB#G(^FMsH5QuGXhb(sY+!-R8Bmv6Sx3WzSW<1MPPN1!&PurYky(@`bP9tz z52}LH9Q?+FF5jR6-;|+GVdRA!qtd;}*-h&iIw3Tq3qF9sDIb1FFxGbo&fbG5n8$3F zyY&PWL{ys^dTO}oZ#@sIX^BKW*bon=;te9j5k+T%wJ zNJtoN1~YVj4~YRrlZl)b&kJqp+Z`DqT!la$x&&IxgOQw#yZd-nBP3!7FijBXD|IsU8Zl^ zc6?MKpJQ+7ka|tZQLfchD$PD|;K(9FiLE|eUZX#EZxhG!S-63C$jWX1Yd!6-Yxi-u zjULIr|0-Q%D9jz}IF~S%>0(jOqZ(Ln<$9PxiySr&2Oic7vb<8q=46)Ln%Z|<*z5&> z3f~Zw@m;vR(bESB<=Jqkxn(=#hQw42l(7)h`vMQQTttz9XW6^|^8EK7qhju4r_c*b zJIi`)MB$w@9epwdIfnEBR+?~);yd6C(LeMC& zn&&N*?-g&BBJcV;8&UoZi4Lmxcj16ojlxR~zMrf=O_^i1wGb9X-0@6_rpjPYemIin zmJb+;lHe;Yp=8G)Q(L1bzH*}I>}uAqhj4;g)PlvD9_e_ScR{Ipq|$8NvAvLD8MYr}xl=bU~)f%B3E>r3Bu9_t|ThF3C5~BdOve zEbk^r&r#PT&?^V1cb{72yEWH}TXEE}w>t!cY~rA+hNOTK8FAtIEoszp!qqptS&;r$ zaYV-NX96-h$6aR@1xz6_E0^N49mU)-v#bwtGJm)ibygzJ8!7|WIrcb`$XH~^!a#s& z{Db-0IOTFq#9!^j!n_F}#Z_nX{YzBK8XLPVmc&X`fT7!@$U-@2KM9soGbmOSAmqV z{nr$L^MBo_u^Joyf0E^=eo{Rt0{{e$IFA(#*kP@SQd6lWT2-#>` zP1)7_@IO!9lk>Zt?#CU?cuhiLF&)+XEM9B)cS(gvQT!X3`wL*{fArTS;Ak`J<84du zALKPz4}3nlG8Fo^MH0L|oK2-4xIY!~Oux~1sw!+It)&D3p;+N8AgqKI`ld6v71wy8I!eP0o~=RVcFQR2Gr(eP_JbSytoQ$Yt}l*4r@A8Me94y z8cTDWhqlq^qoAhbOzGBXv^Wa4vUz$(7B!mX`T=x_ueKRRDfg&Uc-e1+z4x$jyW_Pm zp?U;-R#xt^Z8Ev~`m`iL4*c#65Nn)q#=Y0l1AuD&+{|8-Gsij3LUZXpM0Bx0u7WWm zH|%yE@-#XEph2}-$-thl+S;__ciBxSSzHveP%~v}5I%u!z_l_KoW{KRx2=eB33umE zIYFtu^5=wGU`Jab8#}cnYry@9p5UE#U|VVvx_4l49JQ;jQdp(uw=$^A$EA$LM%vmE zvdEOaIcp5qX8wX{mYf0;#51~imYYPn4=k&#DsKTxo{_Mg*;S495?OBY?#gv=edYC* z^O@-sd-qa+U24xvcbL0@C7_6o!$`)sVr-jSJE4XQUQ$?L7}2(}Eixqv;L8AdJAVqc zq}RPgpnDb@E_;?6K58r3h4-!4rT4Ab#rLHLX?eMOfluJk=3i1@Gt1i#iA=O`M0@x! z(HtJP9BMHXEzuD93m|B&woj0g6T?f#^)>J>|I4C5?Gam>n9!8CT%~aT;=oco5d6U8 zMXl(=W;$ND_8+DD*?|5bJ!;8ebESXMUKBAf7YBwNVJibGaJ*(2G`F%wx)grqVPjudiaq^Kl&g$8A2 zWMxMr@_$c}d+;_B`#kUX-t|4VKH&_f^^EP0&=DPLW)H)UzBG%%Tra*5 z%$kyZe3I&S#gfie^z5)!twG={3Cuh)FdeA!Kj<-9** zvT*5%Tb`|QbE!iW-XcOuy39>D3oe6x{>&<#E$o8Ac|j)wq#kQzz|ATd=Z0K!p2$QE zPu?jL8Lb^y3_CQE{*}sTDe!2!dtlFjq&YLY@2#4>XS`}v#PLrpvc4*@q^O{mmnr5D zmyJq~t?8>FWU5vZdE(%4cuZuao0GNjp3~Dt*SLaxI#g_u>hu@k&9Ho*#CZP~lFJHj z(e!SYlLigyc?&5-YxlE{uuk$9b&l6d`uIlpg_z15dPo*iU&|Khx2*A5Fp;8iK_bdP z?T6|^7@lcx2j0T@x>X7|kuuBSB7<^zeY~R~4McconTxA2flHC0_jFxmSTv-~?zVT| zG_|yDqa9lkF*B6_{j=T>=M8r<0s;@z#h)3BQ4NLl@`Xr__o7;~M&dL3J8fP&zLfDfy z);ckcTev{@OUlZ`bCo(-3? z1u1xD`PKgSg?RqeVVsF<1SLF;XYA@Bsa&cY!I48ZJn1V<3d!?s=St?TLo zC0cNr`qD*M#s6f~X>SCNVkva^9A2ZP>CoJ9bvgXe_c}WdX-)pHM5m7O zrHt#g$F0AO+nGA;7dSJ?)|Mo~cf{z2L)Rz!`fpi73Zv)H=a5K)*$5sf_IZypi($P5 zsPwUc4~P-J1@^3C6-r9{V-u0Z&Sl7vNfmuMY4yy*cL>_)BmQF!8Om9Dej%cHxbIzA zhtV0d{=%cr?;bpBPjt@4w=#<>k5ee=TiWAXM2~tUGfm z$s&!Dm0R^V$}fOR*B^kGaipi~rx~A2cS0;t&khV1a4u38*XRUP~f za!rZMtay8bsLt6yFYl@>-y^31(*P!L^^s@mslZy(SMsv9bVoX`O#yBgEcjCmGpyc* zeH$Dw6vB5P*;jor+JOX@;6K#+xc)Z9B8M=x2a@Wx-{snPGpRmOC$zpsqW*JCh@M2Y z#K+M(>=#d^>Of9C`))h<=Bsy)6zaMJ&x-t%&+UcpLjV`jo4R2025 zXaG8EA!0lQa)|dx-@{O)qP6`$rhCkoQqZ`^SW8g-kOwrwsK8 z3ms*AIcyj}-1x&A&vSq{r=QMyp3CHdWH35!sad#!Sm>^|-|afB+Q;|Iq@LFgqIp#Z zD1%H+3I?6RGnk&IFo|u+E0dCxXz4yI^1i!QTu7uvIEH>i3rR{srcST`LIRwdV1P;W z+%AN1NIf@xxvVLiSX`8ILA8MzNqE&7>%jMzGt9wm78bo9<;h*W84i29^w!>V>{N+S zd`5Zmz^G;f=icvoOZfK5#1ctx*~UwD=ab4DGQXehQ!XYnak*dee%YN$_ZPL%KZuz$ zD;$PpT;HM^$KwtQm@7uvT`i6>Hae1CoRVM2)NL<2-k2PiX=eAx+-6j#JI?M}(tuBW zkF%jjLR)O`gI2fcPBxF^HeI|DWwQWHVR!;;{BXXHskxh8F@BMDn`oEi-NHt;CLymW z=KSv5)3dyzec0T5B*`g-MQ<;gz=nIWKUi9ko<|4I(-E0k$QncH>E4l z**1w&#={&zv4Tvhgz#c29`m|;lU-jmaXFMC11 z*dlXDMEOG>VoLMc>!rApwOu2prKSi*!w%`yzGmS+k(zm*CsLK*wv{S_0WX^8A-rKy zbk^Gf_92^7iB_uUF)EE+ET4d|X|>d&mdN?x@vxKAQk`O+r4Qdu>XGy(a(19g;=jU} zFX{O*_NG>!$@jh!U369Lnc+D~qch3uT+_Amyi}*k#LAAwh}k8IPK5a-WZ81ufD>l> z$4cF}GSz>ce`3FAic}6W4Z7m9KGO?(eWqi@L|5Hq0@L|&2flN1PVl}XgQ2q*_n2s3 zt5KtowNkTYB5b;SVuoXA@i5irXO)A&%7?V`1@HGCB&)Wgk+l|^XXChq;u(nyPB}b3 zY>m5jkxpZgi)zfbgv&ec4Zqdvm+D<?Im*mXweS9H+V>)zF#Zp3)bhl$PbISY{5=_z!8&*Jv~NYtI-g!>fDs zmvL5O^U%!^VaKA9gvKw|5?-jk>~%CVGvctKmP$kpnpfN{D8@X*Aazi$txfa%vd-|E z>kYmV66W!lNekJPom29LdZ%(I+ZLZYTXzTg*to~m?7vp%{V<~>H+2}PQ?PPAq`36R z<%wR8v6UkS>Wt#hzGk#44W<%9S=nBfB);6clKwnxY}T*w21Qc3_?IJ@4gYzC7s;WP zVQNI(M=S=JT#xsZy7G`cR(BP9*je0bfeN8JN5~zY(DDs0t{LpHOIbN);?T-69Pf3R zSNe*&p2%AwXHL>__g+xd4Hlc_vu<25H?(`nafS%)3UPP7_4;gk-9ckt8SJRTv5v0M z_Hww`qPudL?ajIR&X*;$y-`<)6dxx1U~5eGS13CB!lX;3w7n&lDDiArbAhSycd}+b zya_3p@A`$kQy;|NJZ~s44Hqo7Hwt}X86NK=(ey>lgWTtGL6k@Gy;PbO!M%1~Wcn2k zUFP|*5d>t-X*RU8g%>|(wwj*~#l4z^Aatf^DWd1Wj#Q*AY0D^V@sC`M zjJc6qXu0I7Y*2;;gGu!plAFzG=J;1%eIOdn zQA>J&e05UN*7I5@yRhK|lbBSfJ+5Uq;!&HV@xfPZrgD}kE*1DSq^=%{o%|LChhl#0 zlMb<^a6ixzpd{kNZr|3jTGeEzuo}-eLT-)Q$#b{!vKx8Tg}swCni>{#%vDY$Ww$84 zew3c9BBovqb}_&BRo#^!G(1Eg((BScRZ}C)Oz?y`T5wOrv);)b^4XR8 zhJo7+<^7)qB>I;46!GySzdneZ>n_E1oWZY;kf94#)s)kWjuJN1c+wbVoNQcmnv}{> zN0pF+Sl3E}UQ$}slSZeLJrwT>Sr}#V(dVaezCQl2|4LN`7L7v&siYR|r7M(*JYfR$ zst3=YaDw$FSc{g}KHO&QiKxuhEzF{f%RJLKe3p*7=oo`WNP)M(9X1zIQPP0XHhY3c znrP{$4#Ol$A0s|4S7Gx2L23dv*Gv2o;h((XVn+9+$qvm}s%zi6nI-_s6?mG! zj{DV;qesJb&owKeEK?=J>UcAlYckA7Sl+I&IN=yasrZOkejir*kE@SN`fk<8Fgx*$ zy&fE6?}G)d_N`){P~U@1jRVA|2*69)KSe_}!~?+`Yb{Y=O~_+@!j<&oVQQMnhoIRU zA0CyF1OFfkK44n*JD~!2!SCPM;PRSk%1XL=0&rz00wxPs&-_eapJy#$h!eqY%nS0{ z!aGg58JIJPF3_ci%n)QSVpa2H`vIe$RD43;#IRfDV&Ibit z+?>HW4{2wOfC6Fw)}4x}i1maDxcE1qi@BS*qcxD2gE@h3#4cgU*D-&3z7D|tVZWt= z-Cy2+*Cm@P4GN_TPUtaVyVesbVDazF@)j8VJ4>XZv!f%}&eO1SvIgr}4`A*3#vat< z_MoByL(qW6L7SFZ#|Gc1fFN)L2PxY+{B8tJp+pxRyz*87)vXR}*=&ahXjBlQKguuf zX6x<<6fQulE^C*KH8~W%ptpaC0l?b=_{~*U4?5Vt;dgM4t_{&UZ1C2j?b>b+5}{IF_CUyvz-@QZPMlJ)r_tS$9kH%RPv#2_nMb zRLj5;chJ72*U`Z@Dqt4$@_+k$%|8m(HqLG!qT4P^DdfvGf&){gKnGCX#H0!;W=AGP zbA&Z`-__a)VTS}kKFjWGk z%|>yE?t*EJ!qeQ%dPk$;xIQ+P0;()PCBDgjJm6Buj{f^awNoVx+9<|lg3%-$G(*f) zll6oOkN|yamn1uyl2*N-lnqRI1cvs_JxLTeahEK=THV$Sz*gQhKNb*p0fNoda#-&F zB-qJgW^g}!TtM|0bS2QZekW7_tKu%GcJ!4?lObt0z_$mZ4rbQ0o=^curCs3bJK6sq z9fu-aW-l#>z~ca(B;4yv;2RZ?tGYAU)^)Kz{L|4oPj zdOf_?de|#yS)p2v8-N||+XL=O*%3+y)oI(HbM)Ds?q8~HPzIP(vs*G`iddbWq}! z(2!VjP&{Z1w+%eUq^ '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..f127cfd4 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,91 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 8f098b58..00000000 --- a/pom.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - 4.0.0 - - plugily.projects - murdermystery - 1.7.9-dev37 - MurderMystery - - - 1.8 - UTF-8 - Plugily-Projects_MurderMystery - plugily-projects - https://sonarcloud.io - - - - - GNU General Public License v3 - https://www.gnu.org/licenses/gpl-3.0.en.html - - - - - - papermc - https://papermc.io/repo/repository/maven-public/ - - - plugilyprojects - https://maven.plugily.xyz/releases - - - codemc-repo - https://repo.codemc.org/repository/maven-public/ - - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - - - - io.papermc.paper - paper-api - 1.19.1-R0.1-SNAPSHOT - provided - - - - org.jetbrains - annotations - 23.0.0 - compile - - - org.golde - corpsereborn - 2.14.0 - system - ${project.basedir}/lib/CorpseReborn.jar - - - plugily.projects - MiniGamesBox-Classic - 1.1.0 - compile - true - - - - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-site-plugin - 3.12.0 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.10.1 - - compile - - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.4.0 - - Murder Mystery API docs for v${project.version} - Minecraft survival minigame. - Be the murderer, innocent or the detective! Don't be killed during the game to win! API - documentation for hooking Murder Mystery with your plugin. - - minecraft/murdermystery - false - - - - org.apache.maven.plugins - maven-jar-plugin - 3.2.2 - - - org.apache.maven.plugins - maven-shade-plugin - 3.3.0 - - - package - - shade - - - - - com.zaxxer.hikari - plugily.projects.murdermystery.database.hikari - - - plugily.projects.minigamesbox - plugily.projects.murdermystery.minigamesbox - - - plugily.projects.commonsbox - plugily.projects.murdermystery.commonsbox - - - false - - - - - - - - plugily.projects - betty-maven-plugin - 1.0.2 - - ${project.basedir}/CHANGELOG.md - - - - - - - org.apache.maven.wagon - wagon-ssh - 3.5.2 - - - - - - plugily-projects - https://maven.plugily.xyz/releases - - - - diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..d4bd7afe --- /dev/null +++ b/settings.gradle @@ -0,0 +1,7 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This project uses @Incubating APIs which are subject to change. + */ + +rootProject.name = 'murdermystery' diff --git a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java index 933a689c..6cc7284b 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/role/Role.java +++ b/src/main/java/plugily/projects/murdermystery/arena/role/Role.java @@ -64,7 +64,7 @@ public enum Role { * Checks whether player is playing specified role or not * * @param role role to check - * @param player player to check + * @param user player to check * @return true if is playing it, false otherwise */ public static boolean isRole(Role role, User user) { @@ -75,7 +75,7 @@ public static boolean isRole(Role role, User user) { * Checks whether player is playing specified role or not * * @param role role to check - * @param player player to check + * @param user player to check * @param arena the arena where to check * @return true if is playing it, false otherwise */ @@ -110,7 +110,7 @@ public static boolean isRole(Role role, User user, PluginArena arena) { /** * Checks whether player is playing a role or not * - * @param player player to check + * @param user player to check * @return true if is playing one role, false otherwise */ public static boolean isAnyRole(User user) { @@ -122,7 +122,7 @@ public static boolean isAnyRole(User user) { /** * Checks whether player is playing a role or not * - * @param player player to check + * @param user player to check * @param arena the player's arena * @return true if is playing one role, false otherwise */ diff --git a/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java index b1e0f17f..71425d2d 100644 --- a/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java +++ b/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java @@ -5,7 +5,7 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.Nullable; import plugily.projects.minigamesbox.classic.arena.PluginArena; -import plugily.projects.minigamesbox.classic.commonsbox.number.NumberUtils; +import plugily.projects.minigamesbox.number.NumberUtils; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.handlers.placeholder.Placeholder; import plugily.projects.minigamesbox.classic.handlers.placeholder.PlaceholderManager; diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java index 1f02deec..7757d51d 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/RolePassArgument.java @@ -25,7 +25,7 @@ import plugily.projects.minigamesbox.classic.commands.arguments.data.CommandArgument; import plugily.projects.minigamesbox.classic.commands.arguments.data.LabelData; import plugily.projects.minigamesbox.classic.commands.arguments.data.LabeledCommandArgument; -import plugily.projects.minigamesbox.classic.commonsbox.number.NumberUtils; +import plugily.projects.minigamesbox.number.NumberUtils; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.murdermystery.arena.role.Role; From b8a8beff735ba681d82c2a0a48ee877222e6d5b1 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Fri, 30 Dec 2022 20:06:38 +0000 Subject: [PATCH 095/127] Bump version from 1.7.9-dev37 to 1.7.9-SNAPSHOT0 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3f90d65a..4f8870ba 100644 --- a/build.gradle +++ b/build.gradle @@ -55,7 +55,7 @@ dependencies { group = 'plugily.projects' -version = '1.7.9-dev37' +version = '1.7.9-SNAPSHOT0' description = 'MurderMystery' java { From 0a9545f36821415a831f17638c031005c95de194 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 30 Dec 2022 21:28:25 +0100 Subject: [PATCH 096/127] Updated README.md --- .github/README.md | 34 +++++++++++++++++++++++----------- build.gradle | 2 +- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/.github/README.md b/.github/README.md index 318f1736..86192112 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,31 +1,43 @@ ![](https://images.plugily.xyz/banner/display.php?id=MurderMystery) -# Murder Mystery [![](https://img.shields.io/badge/javadocs-latest-red.svg)](https://jd.plugily.xyz/apidocs/minecraft/murdermystery/) [![](https://img.shields.io/badge/wiki-click-blue.svg)](https://wiki.plugily.xyz/murdermystery/) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=Plugily-Projects_MurderMystery&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=Plugily-Projects_MurderMystery) [![Discord](https://img.shields.io/discord/345628548716822530.svg?color=7289DA&label=discord)](https://discord.gg/UXzUdTP) -Murder Mystery is a Minecraft minigame designed for small and big servers. This minigame is unique and very configurable, 100% free and open source! +# Murder Mystery [![Maven Repository](https://maven.plugily.xyz/api/badge/latest/releases/plugily/projects/murdermystery?color=40c14a&name=Maven&prefix=v)](https://maven.plugily.xyz/#/releases/plugily/projects/murdermystery) [![JavaDoc Repository](https://maven.plugily.xyz/api/badge/latest/releases/plugily/projects/murdermystery?color=40c14a&name=JavaDoc&prefix=v)](https://maven.plugily.xyz/javadoc/releases/plugily/projects/murdermystery/latest) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=Plugily-Projects_MurderMystery&metric=sqale_rating)](https://sonarcloud.io/summary/overall?id=Plugily-Projects_MurderMystery) [![Discord](https://img.shields.io/discord/345628548716822530.svg?color=7289DA&style=for-the-badge&logo=discord)](https://discord.plugily.xyz) [![Patreon]( https://img.shields.io/badge/Patreon-F96854?style=for-the-badge&logo=patreon&logoColor=white)](https://patreon.com/plugily) -Be the murderer and kill everyone in the game! Beware of the detective and armored innocents! As a detective you must kill the murderer and protect as much innocents as you can! +Murder Mystery is a Minecraft minigame designed for small and big servers. This minigame is unique and very +configurable, 100% free and open source! + +Be the murderer and kill everyone in the game! Beware of the detective and armored innocents! As a detective you must +kill the murderer and protect as much innocents as you can! As an innocent you must just survive till the end! Have fun using it! Leave a good rating if you really like it. ## Want to contribute in this project? -[**💣 Issues Reporting (Discord)**](https://discordapp.com/invite/UXzUdTP)        [**❤ Make Donation**](https://www.paypal.me/plugilyprojects) + +[**💣 Issues Reporting (Discord)**](https://discordapp.com/invite/UXzUdTP) +[**❤ Make Donation**](https://www.paypal.me/plugilyprojects) # Credits + ## Open Source Libraries -| Library | Author | License | -|-------------------------------------------------------------|-------------------------------------------------|----------------------------------------------------------------------------| -| [ScoreboardLib](https://github.com/TigerHix/ScoreboardLib/) | [TigerHix](https://github.com/TigerHix) | [LGPLv3](https://github.com/TigerHix/ScoreboardLib/blob/master/LICENSE) | -| [HikariCP](https://github.com/brettwooldridge/HikariCP) | [brettwooldridge](https://github.com/brettwooldridge) | [Apache License 2.0](https://github.com/brettwooldridge/HikariCP/blob/dev/LICENSE) | -| [bStats](https://github.com/Bastian/bStats-Metrics) | [Bastian](https://github.com/Bastian) | [LGPLv3](https://github.com/Bastian/bStats-Metrics/blob/master/LICENSE) | -| [Commons Box](https://github.com/Plajer/Commons-Box) | [Plajer](https://github.com/Plajer) | [GPLv3](https://github.com/Plajer/Commons-Box/blob/master/LICENSE.md) | -| [MiniGamesBox](https://github.com/Plugily-Projects/MiniGamesBox) | [Plugily Projets](https://github.com/Plugily-Projects) | [GPLv3](https://github.com/Plugily-Projects/MiniGamesBox/blob/master/LICENSE.md) | + +| Library | Author | License | +|------------------------------------------------------------------|--------------------------------------------------------|------------------------------------------------------------------------------------| +| [ScoreboardLib](https://github.com/TigerHix/ScoreboardLib/) | [TigerHix](https://github.com/TigerHix) | [LGPLv3](https://github.com/TigerHix/ScoreboardLib/blob/master/LICENSE) | +| [HikariCP](https://github.com/brettwooldridge/HikariCP) | [brettwooldridge](https://github.com/brettwooldridge) | [Apache License 2.0](https://github.com/brettwooldridge/HikariCP/blob/dev/LICENSE) | +| [bStats](https://github.com/Bastian/bStats-Metrics) | [Bastian](https://github.com/Bastian) | [LGPLv3](https://github.com/Bastian/bStats-Metrics/blob/master/LICENSE) | +| [Commons Box](https://github.com/Plajer/Commons-Box) | [Plajer](https://github.com/Plajer) | [GPLv3](https://github.com/Plajer/Commons-Box/blob/master/LICENSE.md) | +| [MiniGamesBox](https://github.com/Plugily-Projects/MiniGamesBox) | [Plugily Projets](https://github.com/Plugily-Projects) | [GPLv3](https://github.com/Plugily-Projects/MiniGamesBox/blob/master/LICENSE.md) | + ## Open Source Licenses + #### Code Whale + jetbrains logo Thanks to Code Whale for Open Source license for POEditor project. + ## Contributors + This section will be updated soon diff --git a/build.gradle b/build.gradle index 3f90d65a..888adb13 100644 --- a/build.gradle +++ b/build.gradle @@ -55,7 +55,7 @@ dependencies { group = 'plugily.projects' -version = '1.7.9-dev37' +version = '1.7.9-SNAPSHOT38' description = 'MurderMystery' java { From 2d603b7c29fc7bc83df5f979b04179edacc936da Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Fri, 30 Dec 2022 20:31:24 +0000 Subject: [PATCH 097/127] Bump version from 1.7.9-SNAPSHOT38 to 1.7.9-SNAPSHOT39 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 888adb13..aba57f60 100644 --- a/build.gradle +++ b/build.gradle @@ -55,7 +55,7 @@ dependencies { group = 'plugily.projects' -version = '1.7.9-SNAPSHOT38' +version = '1.7.9-SNAPSHOT39' description = 'MurderMystery' java { From cc867dcff75e6c80569c7a17ad54dfe06aee878b Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 5 May 2023 11:33:12 +0200 Subject: [PATCH 098/127] Moved gradle to kotlin --- build.gradle | 114 ----------------------- build.gradle.kts | 83 +++++++++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 62076 bytes gradle/wrapper/gradle-wrapper.properties | 23 ++++- gradlew | 19 ++-- gradlew.bat | 1 + settings.gradle | 7 -- settings.gradle.kts | 1 + 8 files changed, 119 insertions(+), 129 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/build.gradle b/build.gradle deleted file mode 100644 index aba57f60..00000000 --- a/build.gradle +++ /dev/null @@ -1,114 +0,0 @@ -plugins { - id 'java-library' - id 'signing' - id 'maven-publish' - id 'com.github.johnrengelman.shadow' version '7.1.2' -} - -repositories { - mavenLocal() - maven { - url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' - - content { - includeGroup 'org.bukkit' - includeGroup 'org.spigotmc' - } - } - - maven { url = 'https://oss.sonatype.org/content/repositories/snapshots' } - maven { url = 'https://oss.sonatype.org/content/repositories/central' } - - - maven { - url = uri('https://papermc.io/repo/repository/maven-public/') - } - - maven { - url = uri('https://maven.plugily.xyz/releases') - } - - maven { - url = uri('https://maven.plugily.xyz/snapshots') - } - - maven { - url = uri('https://repo.maven.apache.org/maven2/') - } -} - -dependencies { - compileOnly 'io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT' - implementation('plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT5') { - exclude group: 'com.google.code.gson', module: 'gson' - exclude group: 'fr.mrmicky', module: 'FastInv' - exclude group: 'me.tigerhix.lib', module: 'scoreboard' - exclude group: 'com.github.cryptomorin', module: 'XSeries' - exclude group: 'plugily.projects', module: 'MiniGamesBox-Inventory' - exclude group: 'plugily.projects', module: 'MiniGamesBox-Database' - exclude group: 'plugily.projects', module: 'MiniGamesBox-Utils' - exclude group: 'io.papermc', module: 'paperlib' - } - compileOnly 'org.jetbrains:annotations:23.1.0' - compileOnly files('lib/CorpseReborn.jar') -} - - -group = 'plugily.projects' -version = '1.7.9-SNAPSHOT39' -description = 'MurderMystery' - -java { - withJavadocJar() -} - -build { - dependsOn(shadowJar) -} - -javadoc { - options.encoding = 'UTF-8' -} - -processResources { - filesMatching("**/plugin.yml") { - expand(project.properties) - } -} - -shadowJar { - archiveClassifier.set('') - relocate 'plugily.projects.minigamesbox', 'plugily.projects.murdermystery.minigamesbox' - relocate 'com.zaxxer.hikari', 'plugily.projects.murdermystery.database.hikari' - minimize() -} - -publishing { - repositories { - maven { - name = "Releases" - url = "https://maven.plugily.xyz/releases" - credentials { - username = System.getenv("MAVEN_USERNAME") - password = System.getenv("MAVEN_PASSWORD") - } - } - maven { - name = "Snapshots" - url = uri("https://maven.plugily.xyz/snapshots") - credentials { - username = System.getenv("MAVEN_USERNAME") - password = System.getenv("MAVEN_PASSWORD") - } - } - } - publications { - maven(MavenPublication) { - from components.java - } - } -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..c62689ba --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,83 @@ +plugins { + id("signing") + `maven-publish` + id("com.github.johnrengelman.shadow") version "8.1.1" + java +} + +repositories { + mavenLocal() + maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") + maven("https://oss.sonatype.org/content/repositories/snapshots") + maven("https://oss.sonatype.org/content/repositories/central") + maven(uri("https://papermc.io/repo/repository/maven-public/")) + maven(uri("https://maven.plugily.xyz/releases")) + maven(uri("https://maven.plugily.xyz/snapshots")) + maven(uri("https://repo.maven.apache.org/maven2/")) +} + +dependencies { + implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT18") { isTransitive = false } + compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") + compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") + compileOnly("org.jetbrains:annotations:24.0.1") + compileOnly(files("lib/CorpseReborn.jar")) +} + +group = "plugily.projects" +version = "1.7.9-SNAPSHOT39" +description = "MurderMystery" + +java { + withJavadocJar() +} + +tasks { + build { + dependsOn(shadowJar) + } + + shadowJar { + archiveClassifier.set("") + relocate("plugily.projects.minigamesbox", "plugily.projects.murdermystery.minigamesbox") + relocate("com.zaxxer.hikari", "plugily.projects.murdermystery.database.hikari") + minimize() + } + + processResources { + filesMatching("**/plugin.yml") { + expand(project.properties) + } + } + + javadoc { + options.encoding = "UTF-8" + } + +} + +publishing { + repositories { + maven { + name = "Releases" + url = uri("https://maven.plugily.xyz/releases") + credentials { + username = System.getenv("MAVEN_USERNAME") + password = System.getenv("MAVEN_PASSWORD") + } + } + maven { + name = "Snapshots" + url = uri("https://maven.plugily.xyz/snapshots") + credentials { + username = System.getenv("MAVEN_USERNAME") + password = System.getenv("MAVEN_PASSWORD") + } + } + } + publications { + create("mavenJava") { + from(components["java"]) + } + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..c1962a79e29d3e0ab67b14947c167a862655af9b 100644 GIT binary patch delta 39834 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 G$^QWPgI3l6 delta 38507 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. +# +# + distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index a69d9cb6..aeb74cbb 100644 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -143,12 +140,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +194,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in diff --git a/gradlew.bat b/gradlew.bat index f127cfd4..93e3f59f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index d4bd7afe..00000000 --- a/settings.gradle +++ /dev/null @@ -1,7 +0,0 @@ -/* - * This file was generated by the Gradle 'init' task. - * - * This project uses @Incubating APIs which are subject to change. - */ - -rootProject.name = 'murdermystery' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..5b416215 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "murdermystery" From 1ea031a74ab2758c9f5398f45f366d62e4a42577 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 5 May 2023 12:04:26 +0200 Subject: [PATCH 099/127] Fixed bound must be positve --- .../projects/murdermystery/arena/states/InGameState.java | 2 +- .../projects/murdermystery/arena/states/StartingState.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java index e1b63474..9c7c5a76 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java @@ -145,7 +145,7 @@ private void spawnSomeGold(Arena arena) { getPlugin().getPowerupRegistry().spawnPowerup(location, arena); } } else { - Location loc = arena.getGoldSpawnPoints().get(spawnPointsSize == 1 ? 0 : getPlugin().getRandom().nextInt(spawnPointsSize - 1)); + Location loc = arena.getGoldSpawnPoints().get(getPlugin().getRandom().nextInt(spawnPointsSize)); arena.getGoldSpawned().add(loc.getWorld().dropItem(loc, new ItemStack(Material.GOLD_INGOT, 1))); getPlugin().getPowerupRegistry().spawnPowerup(loc, arena); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java index d0b78250..efdc2f80 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java @@ -86,7 +86,7 @@ public void handleCall(PluginArena arena) { Map detectiveChances = new HashMap<>(); int size = pluginArena.getPlayerSpawnPoints().size(); for(Player player : arena.getPlayers()) { - VersionUtils.teleport(player, pluginArena.getPlayerSpawnPoints().get(size == 1 ? 0 : getPlugin().getRandom().nextInt(size - 1))); + VersionUtils.teleport(player, pluginArena.getPlayerSpawnPoints().get(getPlugin().getRandom().nextInt(size))); User user = arena.getPlugin().getUserManager().getUser(player); /* //reset local variables to be 100% sure From e9b22593ea58d781bdaf85b6c7edb540d5062188 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Fri, 5 May 2023 23:56:47 +0200 Subject: [PATCH 100/127] Fixed arena startup issues --- build.gradle.kts | 2 +- gradle/wrapper/gradle-wrapper.properties | 20 --- .../projects/murdermystery/HookManager.java | 9 +- .../projects/murdermystery/arena/Arena.java | 42 +++-- .../murdermystery/arena/ArenaEvents.java | 153 ++++++++---------- .../murdermystery/arena/ArenaManager.java | 131 ++------------- .../murdermystery/arena/ArenaUtils.java | 4 +- .../arena/managers/MapRestorerManager.java | 1 + .../arena/states/InGameState.java | 106 ++++++------ .../arena/states/StartingState.java | 145 +++-------------- .../boot/AdditionalValueInitializer.java | 1 + .../boot/PlaceholderInitializer.java | 92 ++++------- .../arguments/game/RoleSelectorArgument.java | 26 +-- .../murdermystery/events/PluginEvents.java | 100 ++++-------- .../handlers/setup/LocationCategory.java | 2 +- .../handlers/setup/SetupCategoryManager.java | 20 --- .../handlers/setup/SpecificCategory.java | 2 +- .../handlers/setup/SwitchCategory.java | 20 --- .../skins/sword/SwordSkinManager.java | 2 +- src/main/resources/config.yml | 4 +- src/main/resources/language.yml | 14 +- src/main/resources/permissions.yml | 13 +- 22 files changed, 306 insertions(+), 603 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c62689ba..6799810f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT18") { isTransitive = false } + implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT21") { isTransitive = false } compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.0.1") diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3cc3e256..37aef8d3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,23 +1,3 @@ -# -# -# BuildBattle - Ultimate building competition minigame -# Copyright (C) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# - distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip diff --git a/src/main/java/plugily/projects/murdermystery/HookManager.java b/src/main/java/plugily/projects/murdermystery/HookManager.java index 10b46cc4..d2d1cb98 100644 --- a/src/main/java/plugily/projects/murdermystery/HookManager.java +++ b/src/main/java/plugily/projects/murdermystery/HookManager.java @@ -31,9 +31,10 @@ * Created at 28.04.2019 */ public class HookManager { - + //todo implement in minigamescore as bb citiziens could benefit from too private final Map hooks = new EnumMap<>(HookFeature.class); private final Main plugin; + public HookManager(Main plugin) { this.plugin = plugin; enableHooks(); @@ -43,10 +44,10 @@ private void enableHooks() { for(HookFeature feature : HookFeature.values()) { boolean hooked = true; for(Hook requiredHook : feature.getRequiredHooks()) { - if(!Bukkit.getPluginManager().isPluginEnabled(requiredHook.pluginName)) { + if(!Bukkit.getPluginManager().isPluginEnabled(requiredHook.getPluginName())) { hooks.put(feature, false); - plugin.getDebugger().debug("[HookManager] Feature {0} won't be enabled because {1} is not installed! Please install it in order to enable this feature in-game!", - feature.name(), requiredHook.pluginName); + plugin.getDebugger().debug("[HookManager] Feature {0} won't be enabled because " + requiredHook.getPluginName() + " is not installed! Please install it in order to enable this feature in-game!", + feature.name()); hooked = false; break; } diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index dd7fd551..552cfc1e 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -29,6 +29,7 @@ import plugily.projects.minigamesbox.classic.arena.PluginArena; import plugily.projects.minigamesbox.classic.arena.managers.PluginMapRestorerManager; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.user.User; import plugily.projects.minigamesbox.classic.utils.hologram.ArmorStandHologram; import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; import plugily.projects.murdermystery.Main; @@ -43,11 +44,7 @@ import plugily.projects.murdermystery.HookManager; import plugily.projects.murdermystery.arena.special.SpecialBlock; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; -import java.util.Random; +import java.util.*; /** * @author Tigerpanzer_02 @@ -73,13 +70,10 @@ public class Arena extends PluginArena { private boolean detectiveDead; private boolean murdererLocatorReceived; private boolean hideChances; - private boolean ready = true; - private boolean forceStart = false; private boolean goldVisuals = false; private final Map gameCharacters = new EnumMap<>(CharacterType.class); private MapRestorerManager mapRestorerManager; private ArmorStandHologram bowHologram; - private static final Random random = new Random(); public Arena(String id) { super(id); @@ -246,6 +240,16 @@ public List getSpecialBlocks() { return specialBlocks; } + public int getTotalRoleChances(Role role) { + int totalRoleChances = 0; + + for(Player p : getPlayers()) { + User user = getPlugin().getUserManager().getUser(p); + totalRoleChances += getContributorValue(role, user); + } + return totalRoleChances; + } + public boolean isCharacterSet(Arena.CharacterType type) { return gameCharacters.containsKey(type); } @@ -254,6 +258,10 @@ public void setCharacter(Arena.CharacterType type, Player player) { gameCharacters.put(type, player); } + public void setCharacter(Role role, Player player) { + gameCharacters.put(role == Role.MURDERER ? CharacterType.MURDERER : CharacterType.DETECTIVE, player); + } + @Nullable public Player getCharacter(Arena.CharacterType type) { return gameCharacters.get(type); @@ -271,7 +279,7 @@ public int aliveDetective() { int alive = 0; for(Player player : getPlayersLeft()) { if(Role.isRole(Role.ANY_DETECTIVE, plugin.getUserManager().getUser(player), this) - && isDetectiveAlive(player)) { + && isDetectiveAlive(player)) { alive++; } } @@ -385,6 +393,22 @@ public void setPlayerSpawnPoints(@NotNull List playerSpawnPoints) { this.playerSpawnPoints = playerSpawnPoints; } + public void adjustContributorValue(Role role, User user, int number) { + user.adjustStatistic("CONTRIBUTION_" + role.name(), number); + } + + public int getContributorValue(Role role, User user) { + Player player = user.getPlayer(); + int contributor = user.getStatistic("CONTRIBUTION_" + role.name()); + int increase = plugin.getPermissionsManager().getPermissionCategoryValue(role.name() + "_BOOSTER", player); + int multiplicator = plugin.getPermissionsManager().getPermissionCategoryValue("CHANCES_BOOSTER", player); + return (contributor + increase) * multiplicator; + } + + public void resetContributorValue(Role role, User user) { + user.setStatistic("CONTRIBUTION_" + role.name(), 1); + } + public enum CharacterType { MURDERER, DETECTIVE, FAKE_DETECTIVE, HERO } diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index 5dac8f44..d3aafb36 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -33,6 +33,7 @@ import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; @@ -61,7 +62,7 @@ /** * @author Plajer - *

Created at 13.03.2018 + *

Created at 13.03.2018 */ public class ArenaEvents extends PluginArenaEvents { @@ -76,39 +77,38 @@ public ArenaEvents(Main plugin) { @Override public void handleIngameVoidDeath(Player victim, PluginArena arena) { Arena pluginArena = plugin.getArenaRegistry().getArena(arena.getId()); - if (pluginArena == null) { + if(pluginArena == null) { return; } victim.damage(1000.0); - if (arena.getArenaState() == ArenaState.IN_GAME) { + if(arena.getArenaState() == ArenaState.IN_GAME) { VersionUtils.teleport(victim, pluginArena.getPlayerSpawnPoints().get(0)); } } @EventHandler - public void onBowShot(EntityShootBowEvent e) { - if (e.getEntityType() != EntityType.PLAYER) { + public void onBowShot(EntityShootBowEvent event) { + if(event.getEntityType() != EntityType.PLAYER) { return; } - Player player = (Player) e.getEntity(); + Player player = (Player) event.getEntity(); User user = plugin.getUserManager().getUser(player); - if (!Role.isRole(Role.ANY_DETECTIVE, user)) { + if(!Role.isRole(Role.ANY_DETECTIVE, user)) { return; } - if (user.getCooldown("bow_shot") == 0) { - int bowCooldown = plugin.getConfig().getInt("Bow.Amount.Cooldown", 5); - - user.setCooldown("bow_shot", bowCooldown); - plugin.getBukkitHelper().applyActionBarCooldown(player, bowCooldown); - VersionUtils.setDurability(e.getBow(), (short) 0); - } else { - e.setCancelled(true); + if(user.getCooldown("bow_shot") > 0) { + event.setCancelled(true); + return; } + int bowCooldown = plugin.getConfig().getInt("Bow.Cooldown", 5); + user.setCooldown("bow_shot", bowCooldown); + plugin.getBukkitHelper().applyActionBarCooldown(player, bowCooldown); + player.setCooldown(event.getBow().getType(), 20 * (plugin.getConfig().getInt("Bow.Cooldown", 5))); } @EventHandler public void onArrowPickup(PlugilyPlayerPickupArrow e) { - if (plugin.getArenaRegistry().isInArena(e.getPlayer())) { + if(plugin.getArenaRegistry().isInArena(e.getPlayer())) { e.getItem().remove(); e.setCancelled(true); } @@ -116,57 +116,49 @@ public void onArrowPickup(PlugilyPlayerPickupArrow e) { @EventHandler public void onItemPickup(PlugilyEntityPickupItemEvent e) { - if (!(e.getEntity() instanceof Player)) { + if(!(e.getEntity() instanceof Player)) { return; } Player player = (Player) e.getEntity(); Arena arena = plugin.getArenaRegistry().getArena(player); - if (arena == null) { + if(arena == null) { return; } User user = plugin.getUserManager().getUser(player); e.setCancelled(true); - if (arena.getBowHologram() != null - && e.getItem().equals(arena.getBowHologram().getEntityItem())) { - if (!user.isSpectator() && Role.isRole(Role.INNOCENT, user, arena)) { + if(arena.getBowHologram() != null + && e.getItem().equals(arena.getBowHologram().getEntityItem())) { + if(!user.isSpectator() && Role.isRole(Role.INNOCENT, user, arena)) { XSound.BLOCK_LAVA_POP.play(player.getLocation(), 1F, 2F); ((MapRestorerManager) arena.getMapRestorerManager()).removeBowHolo(); e.getItem().remove(); - for (Player loopPlayer : arena.getPlayersLeft()) { - User loopUser = plugin.getUserManager().getUser(loopPlayer); - if (Role.isRole(Role.INNOCENT,loopUser)) { - ItemPosition.setItem( - loopUser, ItemPosition.BOW_LOCATOR, new ItemStack(Material.AIR, 1)); + for(Player loopPlayer : arena.getPlayersLeft()) { + User loopUser = plugin.getUserManager().getUser(loopPlayer); + if(Role.isRole(Role.INNOCENT, loopUser)) { + ItemPosition.setItem(loopUser, ItemPosition.BOW_LOCATOR, new ItemStack(Material.AIR, 1)); } } arena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, player); ItemPosition.setItem(user, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); - ItemPosition.setItem( - user, - ItemPosition.INFINITE_ARROWS, - new ItemStack(Material.ARROW, plugin.getConfig().getInt("Bow.Amount.Arrows.Fake", 3))); - new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_PICKUP") - .asKey() - .player(player) - .arena(arena) - .sendArena(); + ItemPosition.setItem(user, ItemPosition.INFINITE_ARROWS, new ItemStack(Material.ARROW, plugin.getConfig().getInt("Bow.Amount.Arrows.Fake", 3))); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_PICKUP").asKey().player(player).arena(arena).sendArena(); } return; } - if (e.getItem().getItemStack().getType() != Material.GOLD_INGOT) { + if(e.getItem().getItemStack().getType() != Material.GOLD_INGOT) { return; } - if (user.isSpectator() || arena.getArenaState() != ArenaState.IN_GAME) { + if(user.isSpectator() || arena.getArenaState() != ArenaState.IN_GAME) { return; } - if (PrayerRegistry.getBan().contains(player)) { + if(PrayerRegistry.getBan().contains(player)) { e.setCancelled(true); return; } @@ -177,7 +169,7 @@ public void onItemPickup(PlugilyEntityPickupItemEvent e) { arena.getGoldSpawned().remove(e.getItem()); ItemStack stack = new ItemStack(Material.GOLD_INGOT, e.getItem().getItemStack().getAmount()); - if (PrayerRegistry.getRush().contains(player)) { + if(PrayerRegistry.getRush().contains(player)) { stack.setAmount(3 * e.getItem().getItemStack().getAmount()); } @@ -185,43 +177,31 @@ public void onItemPickup(PlugilyEntityPickupItemEvent e) { user.adjustStatistic("LOCAL_GOLD", stack.getAmount()); ArenaUtils.addScore(user, ArenaUtils.ScoreAction.GOLD_PICKUP, stack.getAmount()); - new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_GOLD") - .asKey() - .player(player) - .arena(arena) - .sendPlayer(); - plugin - .getRewardsHandler() - .performReward(player, plugin.getRewardsHandler().getRewardType("GOLD_PICKUP")); + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SCORE_GOLD").asKey().player(player).arena(arena).sendPlayer(); + plugin.getRewardsHandler().performReward(player, plugin.getRewardsHandler().getRewardType("GOLD_PICKUP")); - if (Role.isRole(Role.ANY_DETECTIVE, user, arena)) { - ItemPosition.addItem( - user, - ItemPosition.ARROWS, - new ItemStack( - Material.ARROW, - e.getItem().getItemStack().getAmount() - * plugin.getConfig().getInt("Bow.Amount.Arrows.Detective", 3))); + if(Role.isRole(Role.ANY_DETECTIVE, user, arena)) { + ItemPosition.addItem(user, ItemPosition.ARROWS, new ItemStack(Material.ARROW, e.getItem().getItemStack().getAmount() * plugin.getConfig().getInt("Bow.Amount.Arrows.Detective", 3))); return; } - if (user.getStatistic("LOCAL_GOLD") >= plugin.getConfig().getInt("Gold.Amount.Bow", 10)) { + if(user.getStatistic("LOCAL_GOLD") >= plugin.getConfig().getInt("Gold.Amount.Bow", 10)) { user.setStatistic("LOCAL_GOLD", 0); new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_BOW_SHOT_TITLE") - .asKey() - .player(player) - .arena(arena) - .sendPlayer(); + .asKey() + .player(player) + .arena(arena) + .sendPlayer(); ItemPosition.setItem(user, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); ItemPosition.addItem( - user, - ItemPosition.ARROWS, - new ItemStack(Material.ARROW, plugin.getConfig().getInt("Bow.Amount.Arrows.Gold", 3))); + user, + ItemPosition.ARROWS, + new ItemStack(Material.ARROW, plugin.getConfig().getInt("Bow.Amount.Arrows.Gold", 3))); player - .getInventory() - .setItem( - /* same for all roles */ ItemPosition.GOLD_INGOTS.getOtherRolesItemPosition(), - new ItemStack(Material.GOLD_INGOT, 0)); + .getInventory() + .setItem( + /* same for all roles */ ItemPosition.GOLD_INGOTS.getOtherRolesItemPosition(), + new ItemStack(Material.GOLD_INGOT, 0)); } } @@ -250,7 +230,9 @@ public void onMurdererDamage(EntityDamageByEntityEvent e) { if(Role.isRole(Role.MURDERER, userVictim)) { return; } - + if(VersionUtils.getItemInHand(attacker) == null || plugin.getSwordSkinManager().getMurdererSword(attacker) == null) { + return; + } //just don't kill user if item isn't murderer sword if(VersionUtils.getItemInHand(attacker).getType() != plugin.getSwordSkinManager().getMurdererSword(attacker).getType()) { return; @@ -266,12 +248,9 @@ public void onMurdererDamage(EntityDamageByEntityEvent e) { } if(Role.isRole(Role.MURDERER, userVictim)) { - plugin - .getRewardsHandler() - .performReward( - attacker, plugin.getRewardsHandler().getRewardType("MURDERER_KILL")); + plugin.getRewardsHandler().performReward(attacker, plugin.getRewardsHandler().getRewardType("KILL_MURDERER")); } else if(Role.isRole(Role.ANY_DETECTIVE, userVictim)) { - plugin.getRewardsHandler().performReward(attacker, plugin.getRewardsHandler().getRewardType("DETECTIVE_KILL")); + plugin.getRewardsHandler().performReward(attacker, plugin.getRewardsHandler().getRewardType("KILL_DETECTIVE")); } XSound.ENTITY_PLAYER_DEATH.play(victim.getLocation(), 50, 1); @@ -336,10 +315,10 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { victim.damage(100.0); - userAttacker.adjustStatistic("KILLS", 1); if(Role.isRole(Role.MURDERER, userAttacker)) { userAttacker.adjustStatistic("LOCAL_KILLS", 1); + arena.adjustContributorValue(Role.DETECTIVE, userAttacker, plugin.getRandom().nextInt(2)); ArenaUtils.addScore(userAttacker, ArenaUtils.ScoreAction.KILL_PLAYER, 0); } @@ -347,11 +326,12 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { if(Role.isRole(Role.MURDERER, userVictim)) { ArenaUtils.addScore(userAttacker, ArenaUtils.ScoreAction.KILL_MURDERER, 0); + arena.adjustContributorValue(Role.MURDERER, userAttacker, plugin.getRandom().nextInt(2)); } else if(plugin.getConfigPreferences().getOption("BOW_KILL_DETECTIVE") && (Role.isRole(Role.ANY_DETECTIVE, userVictim) || Role.isRole(Role.INNOCENT, userVictim))) { if(Role.isRole(Role.MURDERER, userAttacker)) { VersionUtils.sendTitles(victim, null, new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_YOU").asKey().build(), 5, 40, 5); } else { - VersionUtils.sendTitles(victim, null, new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_YOU").asKey().build(),5,40, 5); + VersionUtils.sendTitles(victim, null, new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_INNOCENT_KILLED_YOU").asKey().build(), 5, 40, 5); } //if else, murderer killed, so don't kill him :) @@ -360,10 +340,7 @@ public void onArrowDamage(EntityDamageByEntityEvent e) { attacker.damage(100.0); ArenaUtils.addScore(userAttacker, ArenaUtils.ScoreAction.INNOCENT_KILL, 0); - plugin - .getRewardsHandler() - .performReward( - attacker, plugin.getRewardsHandler().getRewardType("DETECTIVE_KILL")); + plugin.getRewardsHandler().performReward(attacker, plugin.getRewardsHandler().getRewardType("KILL_DETECTIVE")); if(Role.isRole(Role.ANY_DETECTIVE, userAttacker) && arena.lastAliveDetective()) { arena.setDetectiveDead(true); if(Role.isRole(Role.FAKE_DETECTIVE, userAttacker)) { @@ -462,9 +439,7 @@ public void onRespawn(PlayerRespawnEvent event) { player.setGameMode(GameMode.SURVIVAL); player.removePotionEffect(PotionEffectType.NIGHT_VISION); user.setStatistic("LOCAL_GOLD", 0); - plugin - .getRewardsHandler() - .performReward(player, plugin.getRewardsHandler().getRewardType("PLAYER_DEATH")); + plugin.getRewardsHandler().performReward(player, plugin.getRewardsHandler().getRewardType("PLAYER_DEATH")); } } @@ -509,12 +484,18 @@ public void locatorDistanceUpdate(PlayerMoveEvent event) { } } + @EventHandler + public void onDrop(PlayerDropItemEvent event) { + if(plugin.getArenaRegistry().getArena(event.getPlayer()) != null && plugin.getArenaRegistry().getArena(event.getPlayer()).getArenaState() == ArenaState.IN_GAME) { + event.setCancelled(true); + } + } @EventHandler - public void onItemMove(InventoryClickEvent e) { - if(e.getWhoClicked() instanceof Player && plugin.getArenaRegistry().isInArena((Player) e.getWhoClicked())) { - if(e.getView().getType() == InventoryType.CRAFTING || e.getView().getType() == InventoryType.PLAYER) { - e.setResult(Event.Result.DENY); + public void onItemMove(InventoryClickEvent event) { + if(event.getWhoClicked() instanceof Player && plugin.getArenaRegistry().isInArena((Player) event.getWhoClicked())) { + if(event.getView().getType() == InventoryType.CRAFTING || event.getView().getType() == InventoryType.PLAYER) { + event.setResult(Event.Result.DENY); } } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java index 47e3a77e..a27d8d02 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaManager.java @@ -55,32 +55,6 @@ public void joinAttempt(@NotNull Player player, @NotNull PluginArena arena) { return; } super.joinAttempt(player, arena); - int murderIncrease = - player.getEffectivePermissions().stream() - .filter( - permAttach -> permAttach.getPermission().startsWith("murdermystery.role.murderer.")) - .mapToInt( - pai -> - Integer.parseInt( - pai.getPermission() - .substring(28 /* remove the permission node to obtain the number*/))) - .max() - .orElse(0); - int detectiveIncrease = - player.getEffectivePermissions().stream() - .filter( - permAttach -> - permAttach.getPermission().startsWith("murdermystery.role.detective.")) - .mapToInt( - pai -> - Integer.parseInt( - pai.getPermission() - .substring(29 /* remove the permission node to obtain the number*/))) - .max() - .orElse(0); - User user = plugin.getUserManager().getUser(player); - user.adjustStatistic("CONTRIBUTION_MURDERER", murderIncrease); - user.adjustStatistic("CONTRIBUTION_DETECTIVE", detectiveIncrease); ArenaUtils.updateNameTagsVisibility(player); } @@ -101,47 +75,6 @@ public void leaveAttempt(@NotNull Player player, @NotNull PluginArena arena) { user.setStatistic("HIGHEST_SCORE", localScore); } - // todo change later - int murderDecrease = - player.getEffectivePermissions().stream() - .filter( - permAttach -> permAttach.getPermission().startsWith("murdermystery.role.murderer.")) - .mapToInt( - pai -> - Integer.parseInt( - pai.getPermission() - .substring(28 /* remove the permission node to obtain the number*/))) - .max() - .orElse(0); - int detectiveDecrease = - player.getEffectivePermissions().stream() - .filter( - permAttach -> - permAttach.getPermission().startsWith("murdermystery.role.detective.")) - .mapToInt( - pai -> - Integer.parseInt( - pai.getPermission() - .substring(29 /* remove the permission node to obtain the number*/))) - .max() - .orElse(0); - user.adjustStatistic("CONTRIBUTION_MURDERER", -murderDecrease); - if(user.getStatistic("CONTRIBUTION_MURDERER") <= 0) { - user.setStatistic("CONTRIBUTION_MURDERER", 1); - } - user.adjustStatistic("CONTRIBUTION_DETECTIVE", -detectiveDecrease); - if(user.getStatistic("CONTRIBUTION_DETECTIVE") <= 0) { - user.setStatistic("CONTRIBUTION_DETECTIVE", 1); - } - - if(arena.getArenaState() == ArenaState.IN_GAME) { - if(Role.isRole(Role.FAKE_DETECTIVE, user, arena) - || Role.isRole(Role.INNOCENT, user, arena)) { - user.setStatistic("CONTRIBUTION_MURDERER", ThreadLocalRandom.current().nextInt(4) + 1); - user.setStatistic("CONTRIBUTION_DETECTIVE", ThreadLocalRandom.current().nextInt(4) + 1); - } - } - boolean playerHasMurdererRole = Role.isRole(Role.MURDERER, user, arena); if(playerHasMurdererRole) { pluginArena.removeFromMurdererList(player); @@ -157,54 +90,32 @@ public void leaveAttempt(@NotNull Player player, @NotNull PluginArena arena) { List players = new ArrayList<>(); for(Player gamePlayer : playersLeft) { User userGamePlayer = plugin.getUserManager().getUser(gamePlayer); - if(gamePlayer == player - || Role.isRole(Role.ANY_DETECTIVE, userGamePlayer, arena) - || Role.isRole(Role.MURDERER, userGamePlayer, arena)) { + if(gamePlayer == player || Role.isRole(Role.ANY_DETECTIVE, userGamePlayer, arena) || Role.isRole(Role.MURDERER, userGamePlayer, arena)) { continue; } players.add(gamePlayer); } - Player newMurderer = - players.get( - players.size() == 1 ? 0 : ThreadLocalRandom.current().nextInt(players.size())); + Player newMurderer = players.get(players.size() == 1 ? 0 : ThreadLocalRandom.current().nextInt(players.size())); if(newMurderer != null) { - plugin - .getDebugger() - .debug("A murderer left the game. New murderer: {0}", newMurderer.getName()); + plugin.getDebugger().debug("A murderer left the game. New murderer: {0}", newMurderer.getName()); pluginArena.setCharacter(Arena.CharacterType.MURDERER, newMurderer); pluginArena.addToMurdererList(newMurderer); } - new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_CHANGE") - .asKey() - .player(player) - .arena(pluginArena) - .sendArena(); - + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_CHANGE").asKey().player(player).arena(pluginArena).sendArena(); if(newMurderer != null) { - new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_MURDERER") - .asKey() - .player(player) - .arena(pluginArena) - .sendArena(); - ItemPosition.setItem( - plugin.getUserManager().getUser(newMurderer), - ItemPosition.MURDERER_SWORD, - plugin.getSwordSkinManager().getRandomSwordSkin(player)); + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_MURDERER").asKey().player(player).arena(pluginArena).sendArena(); + ItemPosition.setItem(plugin.getUserManager().getUser(newMurderer), ItemPosition.MURDERER_SWORD, plugin.getSwordSkinManager().getRandomSwordSkin(player)); } - - user.setStatistic("CONTRIBUTION_MURDERER", 1); } else { plugin.getDebugger().debug("No new murderer added as there are some"); } } else if(Role.isRole(Role.ANY_DETECTIVE, user, arena) - && pluginArena.lastAliveDetective()) { + && pluginArena.lastAliveDetective()) { pluginArena.setDetectiveDead(true); if(Role.isRole(Role.FAKE_DETECTIVE, user, arena)) { pluginArena.setCharacter(Arena.CharacterType.FAKE_DETECTIVE, null); - } else { - user.setStatistic("CONTRIBUTION_DETECTIVE", 1); } ArenaUtils.dropBowAndAnnounce(pluginArena, player); } @@ -233,36 +144,28 @@ public void stopGame(boolean quickStop, @NotNull PluginArena arena) { User user = plugin.getUserManager().getUser(player); if(!quickStop && Role.isAnyRole(user, arena)) { boolean hasDeathRole = Role.isRole(Role.DEATH, user, arena); - + int multiplicator = 1; + if(!hasDeathRole) { + multiplicator = arena.getMaximumPlayers(); + } + pluginArena.adjustContributorValue(Role.MURDERER, user, plugin.getRandom().nextInt(10 * multiplicator)); + pluginArena.adjustContributorValue(Role.DETECTIVE, user, plugin.getRandom().nextInt(10 * multiplicator)); if(!hasDeathRole && !Role.isRole(Role.SPECTATOR, user, arena)) { - if(Role.isRole(Role.FAKE_DETECTIVE, user, arena) - || Role.isRole(Role.INNOCENT, user, arena)) { - user.setStatistic( - "CONTRIBUTION_MURDERER", ThreadLocalRandom.current().nextInt(4) + 1); - user.setStatistic( - "CONTRIBUTION_DETECTIVE", ThreadLocalRandom.current().nextInt(4) + 1); - } boolean hasMurdererRole = Role.isRole(Role.MURDERER, user, arena); if(murderWon || !hasMurdererRole) { user.adjustStatistic("WINS", 1); - plugin - .getRewardsHandler() - .performReward(player, plugin.getRewardsHandler().getRewardType("WIN")); + plugin.getRewardsHandler().performReward(player, plugin.getRewardsHandler().getRewardType("WIN")); } else { user.adjustStatistic("LOSES", 1); - plugin - .getRewardsHandler() - .performReward(player, plugin.getRewardsHandler().getRewardType("LOSE")); + plugin.getRewardsHandler().performReward(player, plugin.getRewardsHandler().getRewardType("LOSE")); } } else if(hasDeathRole) { user.adjustStatistic("LOSES", 1); - plugin - .getRewardsHandler() - .performReward(player, plugin.getRewardsHandler().getRewardType("LOSE")); + plugin.getRewardsHandler().performReward(player, plugin.getRewardsHandler().getRewardType("LOSE")); } } } - super.stopGame(quickStop, arena); } + super.stopGame(quickStop, arena); } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java index eac3e042..29708eac 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaUtils.java @@ -59,7 +59,7 @@ public static void onMurdererDeath(Arena arena) { } } //we must call it ticks later due to instant respawn bug - Bukkit.getScheduler().runTaskLater(getPlugin(), () -> getPlugin().getArenaManager().stopGame(false, arena), 10); + Bukkit.getScheduler().runTask(getPlugin(), () -> getPlugin().getArenaManager().stopGame(false, arena)); } public static void updateInnocentLocator(Arena arena) { @@ -183,7 +183,7 @@ public static void addScore(User user, ScoreAction action, int amount) { .player(user.getPlayer()) .arena(user.getArena()) .integer(overallInnocents) - .value(action.action.replace("%amount%", Integer.toString(innocents))) + .value(new MessageBuilder(action.action).integer(innocents).build()) .sendPlayer(); return; } diff --git a/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java b/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java index f1afbd03..c6fe93fa 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java @@ -18,6 +18,7 @@ package plugily.projects.murdermystery.arena.managers; +import org.bukkit.Bukkit; import org.bukkit.entity.Item; import org.golde.bukkit.corpsereborn.CorpseAPI.CorpseAPI; import plugily.projects.minigamesbox.classic.arena.managers.PluginMapRestorerManager; diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java index 9c7c5a76..f85d3b8c 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/InGameState.java @@ -18,7 +18,6 @@ package plugily.projects.murdermystery.arena.states; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -34,8 +33,6 @@ import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.utils.ItemPosition; -import java.util.Random; - /** * @author Plajer *

Created at 03.06.2019 @@ -49,20 +46,46 @@ public void handleCall(PluginArena arena) { if(pluginArena == null) { return; } - if(arena.getTimer() <= 0) { - getPlugin().getArenaManager().stopGame(false, arena); + + // winner checks + if(pluginArena.getTimer() <= 0) { + getPlugin().getArenaManager().stopGame(false, pluginArena); + } + if(pluginArena.getPlayersLeft().size() == pluginArena.aliveMurderer()) { + getPlugin().getArenaManager().stopGame(false, pluginArena); } - int inGameLength = getPlugin().getConfig().getInt("Time-Manager.In-Game", 270); + distributeMurdererSword(pluginArena); + //every 30 secs survive reward + givePlayerSurviveReward(pluginArena); + addInnocentLocator(pluginArena); + if(pluginArena.getPlayersLeft().size() == pluginArena.aliveMurderer() + 1) { + addMurdererSpeed(pluginArena); + } + spawnGold(pluginArena); + } - if(arena.getTimer() <= (inGameLength - 10) && arena.getTimer() > (inGameLength - 15)) { - new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SWORD_SOON").asKey().integer(arena.getTimer() - (inGameLength - 15)).arena(pluginArena).sendArena(); + private void addMurdererSpeed(Arena pluginArena) { + int multiplier = getPlugin().getConfig().getInt("Murderer.Speed", 3); + if(multiplier > 1 && multiplier <= 10) { + for(Player player : pluginArena.getMurdererList()) { + if(pluginArena.isMurderAlive(player)) { + // no potion because it adds particles which can be identified + player.setWalkSpeed(0.1f * multiplier); + } + } + } + } - for(Player p : arena.getPlayers()) { + private void distributeMurdererSword(Arena pluginArena) { + int inGameLength = getPlugin().getConfig().getInt("Time-Manager.In-Game", 270); + if(pluginArena.getTimer() <= (inGameLength - 10) && pluginArena.getTimer() > (inGameLength - 15)) { + new MessageBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_SWORD_SOON").asKey().integer(pluginArena.getTimer() - (inGameLength - 15)).arena(pluginArena).sendArena(); + for(Player p : pluginArena.getPlayers()) { XSound.UI_BUTTON_CLICK.play(p.getLocation(), 1, 1); } - if(arena.getTimer() == (inGameLength - 14)) { + if(pluginArena.getTimer() == (inGameLength - 14)) { if(pluginArena.getMurdererList().isEmpty()) getPlugin().getArenaManager().stopGame(false, pluginArena); for(Player p : pluginArena.getMurdererList()) { @@ -76,54 +99,36 @@ public void handleCall(PluginArena arena) { } } } + } - //every 30 secs survive reward - if(arena.getTimer() % 30 == 0) { + private void spawnGold(Arena pluginArena) { + //don't spawn it every time + if(pluginArena.getSpawnGoldTimer() == pluginArena.getSpawnGoldTime()) { + spawnSomeGold(pluginArena); + pluginArena.setSpawnGoldTimer(0); + } else { + pluginArena.setSpawnGoldTimer(pluginArena.getSpawnGoldTimer() + 1); + } + } + + private void givePlayerSurviveReward(Arena pluginArena) { + if(pluginArena.getTimer() % 30 == 0) { new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_TIME_LEFT").arena(pluginArena).sendArena(); - for(Player p : arena.getPlayersLeft()) { + for(Player p : pluginArena.getPlayersLeft()) { User user = getPlugin().getUserManager().getUser(p); if(Role.isRole(Role.INNOCENT, user, pluginArena)) { ArenaUtils.addScore(user, ArenaUtils.ScoreAction.SURVIVE_TIME, 0); } } } + } - if(arena.getTimer() <= 30 - || arena.getPlayersLeft().size() == pluginArena.aliveMurderer() + 1) { + private void addInnocentLocator(Arena pluginArena) { + if(pluginArena.getTimer() <= 30 || pluginArena.getPlayersLeft().size() == pluginArena.aliveMurderer() + 1) { if(getPlugin().getConfigPreferences().getOption("MURDERER_LOCATOR")) { ArenaUtils.updateInnocentLocator(pluginArena); } } - - // no players - stop game - if(pluginArena.getPlayersLeft().isEmpty()) { - getPlugin().getArenaManager().stopGame(false, pluginArena); - } else { - // winner check - if(arena.getPlayersLeft().size() == pluginArena.aliveMurderer()) { - getPlugin().getArenaManager().stopGame(false, pluginArena); - // murderer speed add - } else if(arena.getPlayersLeft().size() == pluginArena.aliveMurderer() + 1) { - int multiplier = getPlugin().getConfig().getInt("Murderer.Speed", 3); - - if(multiplier > 1 && multiplier <= 10) { - for(Player player : pluginArena.getMurdererList()) { - if(pluginArena.isMurderAlive(player)) { - // no potion because it adds particles which can be identified - player.setWalkSpeed(0.1f * multiplier); - } - } - } - } - //don't spawn it every time - if(pluginArena.getSpawnGoldTimer() == pluginArena.getSpawnGoldTime()) { - spawnSomeGold(pluginArena); - pluginArena.setSpawnGoldTimer(0); - } else { - pluginArena.setSpawnGoldTimer(pluginArena.getSpawnGoldTimer() + 1); - } - - } } private void spawnSomeGold(Arena arena) { @@ -141,13 +146,16 @@ private void spawnSomeGold(Arena arena) { } if(getPlugin().getConfigPreferences().getOption("GOLD_SPAWNER_MODE_ALL")) { for(Location location : arena.getGoldSpawnPoints()) { - arena.getGoldSpawned().add(location.getWorld().dropItem(location, new ItemStack(Material.GOLD_INGOT, 1))); - getPlugin().getPowerupRegistry().spawnPowerup(location, arena); + dropGold(arena, location); } } else { Location loc = arena.getGoldSpawnPoints().get(getPlugin().getRandom().nextInt(spawnPointsSize)); - arena.getGoldSpawned().add(loc.getWorld().dropItem(loc, new ItemStack(Material.GOLD_INGOT, 1))); - getPlugin().getPowerupRegistry().spawnPowerup(loc, arena); + dropGold(arena, loc); } } + + private void dropGold(Arena arena, Location location) { + arena.getGoldSpawned().add(location.getWorld().dropItem(location, new ItemStack(Material.GOLD_INGOT, 1))); + getPlugin().getPowerupRegistry().spawnPowerup(location, arena); + } } diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java index efdc2f80..e24ad86f 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java @@ -33,14 +33,7 @@ import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.utils.ItemPosition; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -60,158 +53,83 @@ public void handleCall(PluginArena arena) { return; } - int totalMurderer = 0; - int totalDetective = 0; - - for(Player p : arena.getPlayers()) { - User user = arena.getPlugin().getUserManager().getUser(p); - totalMurderer += user.getStatistic("CONTRIBUTION_MURDERER"); - totalDetective += user.getStatistic("CONTRIBUTION_DETECTIVE"); - } - if(!pluginArena.isHideChances()) { for(Player player : arena.getPlayers()) { - String message = - new MessageBuilder("IN_GAME_MESSAGES_ARENA_ROLE_CHANCES_ACTION_BAR") - .asKey() - .player(player) - .arena(pluginArena) - .build(); + String message = new MessageBuilder("IN_GAME_MESSAGES_ARENA_ROLE_CHANCES_ACTION_BAR").asKey().player(player).arena(pluginArena).build(); VersionUtils.sendActionBar(player, message); } } if(arena.getTimer() == 0 || arena.isForceStart()) { - Map murdererChances = new HashMap<>(); - Map detectiveChances = new HashMap<>(); int size = pluginArena.getPlayerSpawnPoints().size(); for(Player player : arena.getPlayers()) { VersionUtils.teleport(player, pluginArena.getPlayerSpawnPoints().get(getPlugin().getRandom().nextInt(size))); User user = arena.getPlugin().getUserManager().getUser(player); - /* - //reset local variables to be 100% sure - User user = plugin.getUserManager().getUser(player); - user.setStat(StatsStorage.StatisticType.LOCAL_GOLD, 0); - user.setStat(StatsStorage.StatisticType.LOCAL_CURRENT_PRAY, 0); - user.setStat(StatsStorage.StatisticType.LOCAL_KILLS, 0); - user.setStat(StatsStorage.StatisticType.LOCAL_PRAISES, 0); - user.setStat(StatsStorage.StatisticType.LOCAL_SCORE, 0); - */ + user.resetNonePersistentStatistics(); ArenaUtils.updateNameTagsVisibility(player); player.setGameMode(GameMode.ADVENTURE); - - murdererChances.put( - user, - ((double) user.getStatistic("CONTRIBUTION_MURDERER") / (double) totalMurderer) * 100.0); - detectiveChances.put( - user, - ((double) user.getStatistic("CONTRIBUTION_DETECTIVE") / (double) totalDetective) - * 100.0); } Set playersToSet = new HashSet<>(arena.getPlayers()); getMaxRolesToSet(pluginArena); - addRole(pluginArena, Role.MURDERER, murdererChances, playersToSet); - addRole(pluginArena, Role.DETECTIVE, detectiveChances, playersToSet); + addRole(pluginArena, Role.MURDERER, playersToSet); + addRole(pluginArena, Role.DETECTIVE, playersToSet); for(Player player : playersToSet) { - new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_INNOCENT") - .asKey() - .player(player) - .arena(pluginArena) - .sendPlayer(); + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_INNOCENT").asKey().player(player).arena(pluginArena).sendPlayer(); } - arena - .getPlugin() - .getDebugger() - .debug( - "After: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Players: Detectives = {4}, Murders = {5}", - arena.getId(), - maxdetectives, - maxmurderer, - arena.getPlayers().size(), - pluginArena.getMurdererList(), - pluginArena.getDetectiveList()); + arena.getPlugin().getDebugger().debug("After: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Players: Detectives = {4}, Murders = {5}", arena.getId(), maxdetectives, maxmurderer, arena.getPlayers().size(), pluginArena.getDetectiveList(), pluginArena.getMurdererList()); // Load and append special blocks hologram pluginArena.getSpecialBlocks().forEach(pluginArena::loadSpecialBlock); } } - private void addRole( - Arena arena, Role role, Map chances, Set playersToSet) { + private void addRole(Arena arena, Role role, Set playersToSet) { String roleName = role.toString(); - // shuffling map to avoid the same roles for players on the next round - List> shuffledChances = new ArrayList<>(chances.entrySet()); - Collections.shuffle(shuffledChances); - // - Map sortedChances = - shuffledChances.stream() - .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) - .collect( - Collectors.toMap( - Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new)); - - Object[] sortedChancesUser = sortedChances.keySet().toArray(); + + List chancesRanking = getPlugin().getUserManager().getUsers(arena).stream().filter(user -> playersToSet.contains(user.getPlayer())).sorted(Comparator.comparingInt(user -> arena.getContributorValue(role, user))).collect(Collectors.toList()); + List chancesPlayer = new ArrayList<>(); + for(User user : chancesRanking) { + chancesPlayer.add(user.getPlayer()); + } + getPlugin().getDebugger().debug("Arena {0} | Role add {1} | List {2}", arena.getId(), roleName, chancesPlayer); + int amount = role == Role.MURDERER ? maxmurderer : maxdetectives; for(int i = 0; i < amount; i++) { - if(i >= sortedChancesUser.length) break; - User user = (User) sortedChancesUser[i]; + User user = chancesRanking.get(i); Player userPlayer = user.getPlayer(); - arena.setCharacter(Arena.CharacterType.valueOf(roleName), userPlayer); - user.setStatistic("CONTRIBUTION_" + roleName, 1); + arena.setCharacter(role, userPlayer); + arena.resetContributorValue(role, user); playersToSet.remove(userPlayer); - new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_" + roleName) - .asKey() - .arena(arena) - .player(user.getPlayer()) - .sendPlayer(); + new TitleBuilder("IN_GAME_MESSAGES_ARENA_PLAYING_ROLE_" + roleName).asKey().arena(arena).player(user.getPlayer()).sendPlayer(); if(role == Role.MURDERER) { arena.getMurdererList().add(userPlayer); } else if(role == Role.DETECTIVE) { arena.getDetectiveList().add(userPlayer); userPlayer.getInventory().setHeldItemSlot(0); ItemPosition.setItem(user, ItemPosition.BOW, new ItemStack(Material.BOW, 1)); - ItemPosition.setItem( - user, - ItemPosition.INFINITE_ARROWS, - new ItemStack( - Material.ARROW, getPlugin().getConfig().getInt("Bow.Amount.Arrows.Detective", 3))); + ItemPosition.setItem(user, ItemPosition.INFINITE_ARROWS, new ItemStack(Material.ARROW, getPlugin().getConfig().getInt("Bow.Amount.Arrows.Detective", 3))); } } } private void getMaxRolesToSet(Arena arena) { int playersSize = arena.getPlayers().size(); - arena - .getPlugin() - .getDebugger() - .debug( - "Before: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Configured: Detectives = {4}, Murders = {5}", - arena.getId(), - maxdetectives, - maxmurderer, - playersSize, - arena.getArenaOption("DETECTIVE_DIVIDER"), - arena.getArenaOption("MURDERER_DIVIDER")); + arena.getPlugin().getDebugger().debug("Before: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Configured: Detectives = {4}, Murders = {5}", arena.getId(), maxdetectives, maxmurderer, playersSize, arena.getArenaOption("DETECTIVE_DIVIDER"), arena.getArenaOption("MURDERER_DIVIDER")); if(arena.getArenaOption("MURDERER_DIVIDER") > 1 - && playersSize > arena.getArenaOption("MURDERER_DIVIDER")) { + && playersSize > arena.getArenaOption("MURDERER_DIVIDER")) { maxmurderer = (playersSize / arena.getArenaOption("MURDERER_DIVIDER")); } if(arena.getArenaOption("DETECTIVE_DIVIDER") > 1 - && playersSize > arena.getArenaOption("DETECTIVE_DIVIDER")) { + && playersSize > arena.getArenaOption("DETECTIVE_DIVIDER")) { maxdetectives = (playersSize / arena.getArenaOption("DETECTIVE_DIVIDER")); } if(playersSize - (maxmurderer + maxdetectives) < 1) { - arena - .getPlugin() - .getDebugger() - .debug( - "{0} Murderers and detectives amount was reduced because there are not enough players", - arena.getId()); + arena.getPlugin().getDebugger().debug("{0} Murderers and detectives amount was reduced because there are not enough players", arena.getId()); // Make sure to have one innocent! if(maxdetectives > 1) { maxdetectives--; @@ -219,17 +137,6 @@ private void getMaxRolesToSet(Arena arena) { maxmurderer--; } } - - arena - .getPlugin() - .getDebugger() - .debug( - "After: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Configured: Detectives = {4}, Murders = {5}", - arena.getId(), - maxdetectives, - maxmurderer, - playersSize, - arena.getArenaOption("DETECTIVE_DIVIDER"), - arena.getArenaOption("MURDERER_DIVIDER")); + arena.getPlugin().getDebugger().debug("After: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Configured: Detectives = {4}, Murders = {5}", arena.getId(), maxdetectives, maxmurderer, playersSize, arena.getArenaOption("DETECTIVE_DIVIDER"), arena.getArenaOption("MURDERER_DIVIDER")); } } diff --git a/src/main/java/plugily/projects/murdermystery/boot/AdditionalValueInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/AdditionalValueInitializer.java index 0de88e35..ea19b8eb 100644 --- a/src/main/java/plugily/projects/murdermystery/boot/AdditionalValueInitializer.java +++ b/src/main/java/plugily/projects/murdermystery/boot/AdditionalValueInitializer.java @@ -55,6 +55,7 @@ private void registerStatistics() { getStatsStorage().registerStatistic("LOCAL_PRAY", new StatisticType("local_pray", false, "int(11) NOT NULL DEFAULT '0'")); getStatsStorage().registerStatistic("LOCAL_GOLD", new StatisticType("local_gold", false, "int(11) NOT NULL DEFAULT '0'")); getStatsStorage().registerStatistic("LOCAL_KILLS", new StatisticType("local_kills", false, "int(11) NOT NULL DEFAULT '0'")); + getStatsStorage().registerStatistic("LOCAL_CURRENT_PRAY", new StatisticType("local_current_pray", false, "int(11) NOT NULL DEFAULT '0'")); } private void registerPermission() { diff --git a/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java index 71425d2d..17cb3be0 100644 --- a/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java +++ b/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java @@ -131,69 +131,31 @@ public String getValue(Player player, PluginArena arena) { } }); - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "murderer_chance", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - int totalMurderer = 0; - - for(Player p : arena.getPlayers()) { - User user = getUserManager().getUser(p); - totalMurderer += user.getStatistic("CONTRIBUTION_MURDERER"); - } - if(totalMurderer == 0) { - totalMurderer = 1; - } - User user = getUserManager().getUser(player); - return NumberUtils.round( - ((double) user.getStatistic("CONTRIBUTION_MURDERER") - / (double) totalMurderer) - * 100.0, - 2) - + "%"; - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "detective_chance", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - int totalDetectives = 0; - - for(Player p : arena.getPlayers()) { - User user = getUserManager().getUser(p); - totalDetectives += user.getStatistic("CONTRIBUTION_DETECTIVE"); - } - if(totalDetectives == 0) { - totalDetectives = 1; - } - User user = getUserManager().getUser(player); - return NumberUtils.round( - ((double) user.getStatistic("CONTRIBUTION_DETECTIVE") - / (double) totalDetectives) - * 100.0, - 2) - + "%"; - } - }); + getPlaceholderManager().registerPlaceholder(new Placeholder("murderer_chance", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + + User user = getUserManager().getUser(player); + return NumberUtils.round(((double) pluginArena.getContributorValue(Role.MURDERER, user) / (double) pluginArena.getTotalRoleChances(Role.MURDERER)) * 100.0, 2) + "%"; + } + }); + + getPlaceholderManager().registerPlaceholder(new Placeholder("detective_chance", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + + User user = getUserManager().getUser(player); + return NumberUtils.round(((double) pluginArena.getContributorValue(Role.DETECTIVE, user) / (double) pluginArena.getTotalRoleChances(Role.DETECTIVE)) * 100.0, 2) + "%"; + } + }); getPlaceholderManager() .registerPlaceholder( @@ -257,9 +219,9 @@ public String getValue(Player player, PluginArena arena) { if(pluginArena.isDeathPlayer(player)) { role = new MessageBuilder("SCOREBOARD_ROLES_DEAD").asKey().build(); } else if(Role.isRole(Role.MURDERER, user, arena)) { - role = new MessageBuilder("SCOREBOARD_ROLES_DETECTIVE").asKey().build(); - } else if(Role.isRole(Role.ANY_DETECTIVE, user, arena)) { role = new MessageBuilder("SCOREBOARD_ROLES_MURDERER").asKey().build(); + } else if(Role.isRole(Role.ANY_DETECTIVE, user, arena)) { + role = new MessageBuilder("SCOREBOARD_ROLES_DETECTIVE").asKey().build(); } else { role = new MessageBuilder("SCOREBOARD_ROLES_INNOCENT").asKey().build(); } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java index f7cc4e35..8cda24ab 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java @@ -34,13 +34,15 @@ import plugily.projects.murdermystery.arena.role.Role; import plugily.projects.murdermystery.commands.arguments.ArgumentsRegistry; +import java.util.ArrayList; +import java.util.List; import java.util.stream.Collectors; public class RoleSelectorArgument implements Listener { public RoleSelectorArgument(ArgumentsRegistry registry) { registry.mapArgument("murdermystery", new LabeledCommandArgument("roleselector", "murdermystery.roleselector", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mm roleselector", "/mm roleselector", "&7Select a role\n&6Permission: &7murdermystery.roleselector")) { + new LabelData("/mm roleselector", "/mm roleselector", "&7Select a role\n&6Permission: &7murdermystery.roleselector")) { @Override public void execute(CommandSender sender, String[] args) { Player player = (Player) sender; @@ -54,32 +56,34 @@ public void execute(CommandSender sender, String[] args) { public static void openRolePassMenu(Player player, PluginMain plugin) { NormalFastInv gui = new NormalFastInv(plugin.getBukkitHelper().serializeInt(Role.values().length), new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_NAME").asKey().build()); - + List descriptionMurderer = new ArrayList<>(); + plugin.getLanguageManager().getLanguageListFromKey("IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_LORE").forEach(string -> descriptionMurderer.add(new MessageBuilder(string).integer(plugin.getUserManager().getUser(player).getStatistic("PASS_MURDERER")).build())); gui.addItem(new SimpleClickableItem(new ItemBuilder(XMaterial.IRON_SWORD.parseMaterial()) - .name(new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_NAME").asKey().build()) - .lore(plugin.getLanguageManager().getLanguageListFromKey("IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_LORE").stream().map(string -> string.replace("%amount%", plugin.getUserManager().getUser(player).getStatistic("PASS_DETECTIVE") + "")).collect(Collectors.toList())) - .build(), event -> { + .name(new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_ROLE_MURDERER_NAME").asKey().build()) + .lore(descriptionMurderer) + .build(), event -> { User user = plugin.getUserManager().getUser(player); if(user.getStatistic("PASS_MURDERER") <= 0) { new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_FAIL").asKey().player(player).value(Role.MURDERER.name()).sendPlayer(); return; } user.adjustStatistic("PASS_MURDERER", -1); - user.adjustStatistic("CONTRIBUTION_MURDERER", 999); + user.adjustStatistic("CONTRIBUTION_MURDERER", 999999999); new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_SUCCESS").asKey().player(player).value(Role.MURDERER.name()).sendPlayer(); })); - + List descriptionDetective = new ArrayList<>(); + plugin.getLanguageManager().getLanguageListFromKey("IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_LORE").forEach(string -> descriptionDetective.add(new MessageBuilder(string).integer(plugin.getUserManager().getUser(player).getStatistic("PASS_DETECTIVE")).build())); gui.addItem(new SimpleClickableItem(new ItemBuilder(XMaterial.BOW.parseMaterial()) - .name(new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_NAME").asKey().build()) - .lore(plugin.getLanguageManager().getLanguageListFromKey("IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_LORE").stream().map(string -> string.replace("%amount%", plugin.getUserManager().getUser(player).getStatistic("PASS_DETECTIVE") + "")).collect(Collectors.toList())) - .build(), event -> { + .name(new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_ROLE_DETECTIVE_NAME").asKey().build()) + .lore(descriptionDetective) + .build(), event -> { User user = plugin.getUserManager().getUser(player); if(user.getStatistic("PASS_DETECTIVE") <= 0) { new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_FAIL").asKey().player(player).value(Role.DETECTIVE.name()).sendPlayer(); return; } user.adjustStatistic("PASS_DETECTIVE", -1); - user.adjustStatistic("CONTRIBUTION_DETECTIVE", 999); + user.adjustStatistic("CONTRIBUTION_DETECTIVE", 999999999); new MessageBuilder("IN_GAME_MESSAGES_ARENA_PASS_SUCCESS").asKey().player(player).value(Role.DETECTIVE.name()).sendPlayer(); })); gui.refresh(); diff --git a/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java index 3c105416..0edbac07 100644 --- a/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java +++ b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java @@ -58,9 +58,7 @@ public PluginEvents(Main plugin) { @EventHandler public void onSwordThrow(PlayerInteractEvent event) { - if(event.getAction() == Action.LEFT_CLICK_AIR - || event.getAction() == Action.LEFT_CLICK_BLOCK - || event.getAction() == Action.PHYSICAL) { + if(event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.PHYSICAL) { return; } Player attacker = event.getPlayer(); @@ -80,8 +78,7 @@ public void onSwordThrow(PlayerInteractEvent event) { return; } - if(VersionUtils.getItemInHand(attacker).getType() - != murdererSword.getType()) { + if(VersionUtils.getItemInHand(attacker).getType() != murdererSword.getType()) { return; } if(attackerUser.getCooldown("sword_shoot") > 0) { @@ -93,31 +90,22 @@ public void onSwordThrow(PlayerInteractEvent event) { attackerUser.setCooldown("sword_shoot", swordFlyCooldown); if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_10_R1)) { - attackerUser.setCooldown( - "sword_attack", (plugin.getConfig().getInt("Sword.Cooldown.Attack", 1))); + attackerUser.setCooldown("sword_attack", (plugin.getConfig().getInt("Sword.Cooldown.Attack", 1))); } else { - attacker.setCooldown( - plugin.getSwordSkinManager().getMurdererSword(attacker).getType(), - 20 * (plugin.getConfig().getInt("Sword.Cooldown.Attack", 1))); + attacker.setCooldown(plugin.getSwordSkinManager().getMurdererSword(attacker).getType(), 20 * (plugin.getConfig().getInt("Sword.Cooldown.Attack", 1))); } - createFlyingSword(arena, attacker, attackerUser); + createFlyingSword(attacker, attackerUser); plugin.getBukkitHelper().applyActionBarCooldown(attacker, swordFlyCooldown); } - private void createFlyingSword(Arena arena, Player attacker, User attackerUser) { + private void createFlyingSword(Player attacker, User attackerUser) { Location loc = attacker.getLocation(); Vector vec = loc.getDirection(); vec.normalize().multiply(plugin.getConfig().getDouble("Sword.Speed", 0.65)); - Location standStart = - plugin - .getBukkitHelper() - .rotateAroundAxisY(new Vector(1.0D, 0.0D, 0.0D), loc.getYaw()) - .toLocation(attacker.getWorld()) - .add(loc); + Location standStart = plugin.getBukkitHelper().rotateAroundAxisY(new Vector(1.0D, 0.0D, 0.0D), loc.getYaw()).toLocation(attacker.getWorld()).add(loc); standStart.setYaw(loc.getYaw()); - ArmorStand stand = - (ArmorStand) attacker.getWorld().spawnEntity(standStart, EntityType.ARMOR_STAND); + ArmorStand stand = (ArmorStand) attacker.getWorld().spawnEntity(standStart, EntityType.ARMOR_STAND); stand.setVisible(false); if(ServerVersion.Version.isCurrentHigher(ServerVersion.Version.v1_8_R3)) { stand.setInvulnerable(true); @@ -126,9 +114,7 @@ private void createFlyingSword(Arena arena, Player attacker, User attackerUser) VersionUtils.setItemInHand(stand, plugin.getSwordSkinManager().getMurdererSword(attacker)); - stand.setRightArmPose( - new EulerAngle( - Math.toRadians(350.0), Math.toRadians(loc.getPitch() * -1.0), Math.toRadians(90.0))); + stand.setRightArmPose(new EulerAngle(Math.toRadians(350.0), Math.toRadians(loc.getPitch() * -1.0), Math.toRadians(90.0))); VersionUtils.setCollidable(stand, false); stand.setGravity(false); @@ -138,16 +124,8 @@ private void createFlyingSword(Arena arena, Player attacker, User attackerUser) stand.setMarker(true); } - Location initialise = - plugin - .getBukkitHelper() - .rotateAroundAxisY(new Vector(-0.8D, 1.45D, 0.0D), loc.getYaw()) - .toLocation(attacker.getWorld()) - .add(standStart) - .add( - plugin.getBukkitHelper().rotateAroundAxisY( - plugin.getBukkitHelper().rotateAroundAxisX(new Vector(0.0D, 0.0D, 1.0D), loc.getPitch()), - loc.getYaw())); + Location initialise = plugin.getBukkitHelper().rotateAroundAxisY(new Vector(-0.8D, 1.45D, 0.0D), loc.getYaw()).toLocation(attacker.getWorld()).add(standStart) + .add(plugin.getBukkitHelper().rotateAroundAxisY(plugin.getBukkitHelper().rotateAroundAxisX(new Vector(0.0D, 0.0D, 1.0D), loc.getPitch()), loc.getYaw())); int maxRange = plugin.getConfig().getInt("Sword.Fly.Range", 20); double maxHitRange = plugin.getConfig().getDouble("Sword.Fly.Radius", 0.5); new BukkitRunnable() { @@ -155,25 +133,21 @@ private void createFlyingSword(Arena arena, Player attacker, User attackerUser) public void run() { VersionUtils.teleport(stand, standStart.add(vec)); initialise.add(vec); - initialise - .getWorld() - .getNearbyEntities(initialise, maxHitRange, maxHitRange, maxHitRange) - .forEach( - entity -> { - if(entity instanceof Player) { - Player victim = (Player) entity; - Arena arena = plugin.getArenaRegistry().getArena(victim); - if(arena == null) { - return; - } - if(!plugin.getUserManager().getUser(victim).isSpectator() - && !victim.equals(attacker)) { - killBySword(arena, attackerUser, victim); - cancel(); - stand.remove(); - } - } - }); + initialise.getWorld().getNearbyEntities(initialise, maxHitRange, maxHitRange, maxHitRange) + .forEach(entity -> { + if(entity instanceof Player) { + Player victim = (Player) entity; + Arena arena = plugin.getArenaRegistry().getArena(victim); + if(arena == null) { + return; + } + if(!plugin.getUserManager().getUser(victim).isSpectator() && !victim.equals(attacker)) { + killBySword(arena, attackerUser, victim); + cancel(); + stand.remove(); + } + } + }); if(loc.distance(initialise) > maxRange || initialise.getBlock().getType().isSolid()) { cancel(); stand.remove(); @@ -197,6 +171,7 @@ private void killBySword(Arena arena, User attackerUser, Player victim) { victim.damage(100.0); attackerUser.adjustStatistic("LOCAL_KILLS", 1); attackerUser.adjustStatistic("KILLS", 1); + arena.adjustContributorValue(Role.DETECTIVE, user, plugin.getRandom().nextInt(2)); ArenaUtils.addScore(attackerUser, ArenaUtils.ScoreAction.KILL_PLAYER, 0); if(Role.isRole(Role.ANY_DETECTIVE, user, victimArena) && arena.lastAliveDetective()) { if(Role.isRole(Role.FAKE_DETECTIVE, user, victimArena)) { @@ -217,19 +192,14 @@ public void onBlockBreak(BlockBreakEvent event) { if(event.getBlock().getType() != XMaterial.ARMOR_STAND.parseMaterial()) { return; } - plugin - .getHologramManager() - .getArmorStands() - .removeIf( - armorStand -> { - boolean isSameType = - armorStand.getLocation().getBlock().getType() == event.getBlock().getType(); - if(isSameType) { - armorStand.remove(); - armorStand.setCustomNameVisible(false); - } - return isSameType; - }); + plugin.getHologramManager().getArmorStands().removeIf(armorStand -> { + boolean isSameType = armorStand.getLocation().getBlock().getType() == event.getBlock().getType(); + if(isSameType) { + armorStand.remove(); + armorStand.setCustomNameVisible(false); + } + return isSameType; + }); } @EventHandler(priority = EventPriority.HIGH) diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/LocationCategory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/LocationCategory.java index 9d978a44..07af04c0 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/LocationCategory.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/LocationCategory.java @@ -1,6 +1,6 @@ /* * - * BuildBattle - Ultimate building competition minigame + * MurderMystery * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupCategoryManager.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupCategoryManager.java index fd7e2924..33c951ed 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupCategoryManager.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SetupCategoryManager.java @@ -1,23 +1,3 @@ -/* - * - * BuildBattle - Ultimate building competition minigame - * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - package plugily.projects.murdermystery.handlers.setup; import plugily.projects.minigamesbox.classic.handlers.setup.SetupInventory; diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java index 2c8b5854..f1bd6f7b 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java @@ -1,6 +1,6 @@ /* * - * BuildBattle - Ultimate building competition minigame + * MurderMystery * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java index bae1267a..e2d49bf1 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java @@ -1,23 +1,3 @@ -/* - * - * BuildBattle - Ultimate building competition minigame - * Copyright (C) 2021 Plugily Projects - maintained by Tigerpanzer_02, 2Wild4You and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - package plugily.projects.murdermystery.handlers.setup; import org.bukkit.plugin.java.JavaPlugin; diff --git a/src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkinManager.java b/src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkinManager.java index 2d5eee7c..cb3fb77b 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkinManager.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/skins/sword/SwordSkinManager.java @@ -52,7 +52,7 @@ public void registerSwordSkins(Main plugin) { for (String id : section.getKeys(false)) { addSwordSkin( new SwordSkin( - XMaterial.matchXMaterial(config.getString(path + id + "Material", "BEDROCK")) + XMaterial.matchXMaterial(config.getString(path + id + ".Material", "BEDROCK")) .orElse(XMaterial.BEDROCK) .parseItem(), config.getString(path + id + ".Permission", ""))); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index cd4776ac..b1a03e52 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -232,8 +232,8 @@ Bow: Prayer: 2 #How much arrows should the player get after x picked up gold Gold: 3 - #How long should be the bow shoot cooldown in seconds? - Cooldown: 5 + #How long should be the bow shoot cooldown in seconds? + Cooldown: 5 Hide: diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index 0d3aa3dd..0d9ddee6 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -179,7 +179,7 @@ Bossbar: In-Game: #Used in most game messages. Plugin-Prefix: "(%plugin_name%)" - Game-Chat-Format: "[%user_statistic_level%][%kit%] %player% | %message%" + Game-Chat-Format: "[%user_statistic_level%] %player% | %message%" You-Leveled-Up: "%plugin_prefix% You leveled up! You're now level %number%!" Commands-Blocked: "%color_chat_issue%%plugin_prefix% You have to leave the game first to perform commands. The only command that works is /%plugin_short_command% leave!" Join: @@ -271,15 +271,15 @@ In-Game: Name: "Role pass menu" Role: Murderer: - Name: "Be murderer" + Name: "&cBe murderer" Lore: - "Cost 1 murderer pass" - - "You got %amount%" + - "You got %number%" Detective: - Name: "Be detective" + Name: "&bBe detective" Lore: - "Cost 1 detective pass" - - "You got %amount%" + - "You got %number%" Fail: "You do not got enough passes for %value% role" Success: "You will be %value% next round!" Change: "You now got %number% %value% passes!" @@ -291,7 +291,7 @@ In-Game: Detective: "5,20,5;ROLE | DETECTIVE;Find and kill the murderer!" Innocent: "5,20,5;ROLE | INNOCENT;Stay alive as long as possible!" Score: - Bonus: "+%score% score (%action%)" + Bonus: "+%number% score (%value%)" Gold: "Picked up gold!" Action: Kill: @@ -311,7 +311,7 @@ In-Game: Cauldron: Potion: "Please drink your current potion!" Hologram: "Mystery Potion - &e1 Gold" - Not-Enough-Gold: "You need %amount% gold for this!" + Not-Enough-Gold: "You need %number% gold for this!" Pray: Hologram: "Click to give gift;Pull lever to pray" Chat: "You prayed to the developer! Hope he will hear that!" diff --git a/src/main/resources/permissions.yml b/src/main/resources/permissions.yml index b56c7cff..630ea708 100644 --- a/src/main/resources/permissions.yml +++ b/src/main/resources/permissions.yml @@ -1,30 +1,31 @@ # You can create custom players permissions here. # Player with your custom permission will get int +# All chances include murderer and detective Chances-Boost: # Do not use dots (.), they won't work. - # Increase chance by 10 percent + # Increase chance by 10 times chances-boost-5: 10 chances-boost-50: 50 - # Increase chance by 100 percent + # Increase chance by 100 times admin-boost: 100 Murderer-Boost: # Do not use dots (.), they won't work. - # Increase murderer chance by 10 percent + # Increase murderer chance by 10 murderer-boost-5: 10 murderer-boost-50: 50 - # Increase murderer chance by 100 percent + # Increase murderer chance by 100 admin-boost: 100 Detective-Boost: # Do not use dots (.), they won't work. - # Increase detective chance by 10 percent + # Increase detective chance by 10 detective-boost-5: 10 detective-boost-50: 50 - # Increase detective chance by 100 percent + # Increase detective chance by 100 admin-boost: 100 From a6f0d6a8241d48bcf0c3b231fb3f4518f8dcfa9e Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Sat, 6 May 2023 12:16:45 +0200 Subject: [PATCH 101/127] Fixed arena restoring and role selection --- .../projects/murdermystery/arena/Arena.java | 31 +- .../arena/managers/MapRestorerManager.java | 3 + .../mysterypotion/MysteryPotionRegistry.java | 2 +- .../arena/states/StartingState.java | 7 +- .../boot/PlaceholderInitializer.java | 430 ++++++++---------- 5 files changed, 218 insertions(+), 255 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index 552cfc1e..5e7577aa 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -278,8 +278,7 @@ public boolean lastAliveDetective() { public int aliveDetective() { int alive = 0; for(Player player : getPlayersLeft()) { - if(Role.isRole(Role.ANY_DETECTIVE, plugin.getUserManager().getUser(player), this) - && isDetectiveAlive(player)) { + if(Role.isRole(Role.ANY_DETECTIVE, plugin.getUserManager().getUser(player), this) && isDetectiveAlive(player)) { alive++; } } @@ -360,6 +359,10 @@ public boolean isDeathPlayer(Player player) { return deaths.contains(player); } + public List getDeaths() { + return deaths; + } + public void addSpectatorPlayer(Player player) { spectators.add(player); } @@ -397,12 +400,34 @@ public void adjustContributorValue(Role role, User user, int number) { user.adjustStatistic("CONTRIBUTION_" + role.name(), number); } + private Map murdererContributions = new HashMap<>(); + private Map detectiveContributions = new HashMap<>(); + + public Map getMurdererContributions() { + return murdererContributions; + } + + public Map getDetectiveContributions() { + return detectiveContributions; + } + public int getContributorValue(Role role, User user) { + if(role == Role.MURDERER && murdererContributions.containsKey(user)) { + return murdererContributions.get(user); + } else if(detectiveContributions.containsKey(user)) { + return detectiveContributions.get(user); + } Player player = user.getPlayer(); int contributor = user.getStatistic("CONTRIBUTION_" + role.name()); int increase = plugin.getPermissionsManager().getPermissionCategoryValue(role.name() + "_BOOSTER", player); int multiplicator = plugin.getPermissionsManager().getPermissionCategoryValue("CHANCES_BOOSTER", player); - return (contributor + increase) * multiplicator; + int calculatedContributor = (contributor + increase) * multiplicator; + if(role == Role.MURDERER) { + murdererContributions.put(user, calculatedContributor); + } else { + detectiveContributions.put(user, calculatedContributor); + } + return calculatedContributor; } public void resetContributorValue(Role role, User user) { diff --git a/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java b/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java index c6fe93fa..7e7d1ee8 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java +++ b/src/main/java/plugily/projects/murdermystery/arena/managers/MapRestorerManager.java @@ -48,9 +48,12 @@ public void fullyRestoreArena() { public void cleanUpArena() { removeBowHolo(); arena.setMurdererLocatorReceived(false); + arena.getDetectiveContributions().clear(); + arena.getMurdererContributions().clear(); arena.getGameCharacters().clear(); arena.getMurdererList().clear(); arena.getDetectiveList().clear(); + arena.getDeaths().clear(); arena.setDetectiveDead(false); clearCorpses(); clearGold(); diff --git a/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java b/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java index 3524c63d..16afe1e2 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java +++ b/src/main/java/plugily/projects/murdermystery/arena/special/mysterypotion/MysteryPotionRegistry.java @@ -50,7 +50,7 @@ public static void init(Main plugin) { PotionEffectType effectType = PotionEffectType.getByName(section.getString(key + ".Type", "").toUpperCase()); if(effectType == null) { - effectType = PotionEffectType.HEAL; + continue; } //amplifiers are counted from 0 so -1 diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java index e24ad86f..ae71fffc 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java @@ -92,6 +92,7 @@ private void addRole(Arena arena, Role role, Set playersToSet) { String roleName = role.toString(); List chancesRanking = getPlugin().getUserManager().getUsers(arena).stream().filter(user -> playersToSet.contains(user.getPlayer())).sorted(Comparator.comparingInt(user -> arena.getContributorValue(role, user))).collect(Collectors.toList()); + Collections.reverse(chancesRanking); List chancesPlayer = new ArrayList<>(); for(User user : chancesRanking) { chancesPlayer.add(user.getPlayer()); @@ -120,12 +121,10 @@ private void addRole(Arena arena, Role role, Set playersToSet) { private void getMaxRolesToSet(Arena arena) { int playersSize = arena.getPlayers().size(); arena.getPlugin().getDebugger().debug("Before: Arena: {0} | Detectives = {1}, Murders = {2}, Players = {3} | Configured: Detectives = {4}, Murders = {5}", arena.getId(), maxdetectives, maxmurderer, playersSize, arena.getArenaOption("DETECTIVE_DIVIDER"), arena.getArenaOption("MURDERER_DIVIDER")); - if(arena.getArenaOption("MURDERER_DIVIDER") > 1 - && playersSize > arena.getArenaOption("MURDERER_DIVIDER")) { + if(arena.getArenaOption("MURDERER_DIVIDER") > 1 && playersSize > arena.getArenaOption("MURDERER_DIVIDER")) { maxmurderer = (playersSize / arena.getArenaOption("MURDERER_DIVIDER")); } - if(arena.getArenaOption("DETECTIVE_DIVIDER") > 1 - && playersSize > arena.getArenaOption("DETECTIVE_DIVIDER")) { + if(arena.getArenaOption("DETECTIVE_DIVIDER") > 1 && playersSize > arena.getArenaOption("DETECTIVE_DIVIDER")) { maxdetectives = (playersSize / arena.getArenaOption("DETECTIVE_DIVIDER")); } if(playersSize - (maxmurderer + maxdetectives) < 1) { diff --git a/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java index 17cb3be0..256272f1 100644 --- a/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java +++ b/src/main/java/plugily/projects/murdermystery/boot/PlaceholderInitializer.java @@ -31,105 +31,83 @@ public PlaceholderInitializer(Main plugin) { } private void registerPlaceholders() { - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "detective_list", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - StringBuilder detectives = new StringBuilder(); - for(Player p : pluginArena.getDetectiveList()) { - detectives.append(p.getName()).append(", "); - } - - int index = detectives.length() - 2; - if(index > 0 && index < detectives.length()) { - detectives.deleteCharAt(index); - } - - return (pluginArena.isDetectiveDead() ? ChatColor.STRIKETHROUGH : "") - + detectives.toString(); - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "murderer_list", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - StringBuilder murders = new StringBuilder(); - for(Player p : pluginArena.getMurdererList()) { - User user = getUserManager().getUser(p); - int localKills = user.getStatistic("LOCAL_KILLS"); - murders.append(p.getName()); - if(pluginArena.getMurdererList().size() > 1) { - murders.append(" (").append(localKills).append("), "); - } - } - if(pluginArena.getMurdererList().size() > 1) { - murders.deleteCharAt(murders.length() - 2); - } - - return (pluginArena.aliveMurderer() == 1 ? "" : ChatColor.STRIKETHROUGH) - + murders.toString(); - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "murderer_kills", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - int murdererKills = 0; - for(Player p : pluginArena.getMurdererList()) { - User user = getUserManager().getUser(p); - int localKills = user.getStatistic("LOCAL_KILLS"); - murdererKills += localKills; - } - return Integer.toString(murdererKills); - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "hero", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - Player hero = pluginArena.getCharacter(Arena.CharacterType.HERO); - return hero != null - ? hero.getName() - : new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_NOBODY") - .asKey() - .build(); + getPlaceholderManager().registerPlaceholder(new Placeholder("detective_list", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + + StringBuilder detectives = new StringBuilder(); + for(Player p : pluginArena.getDetectiveList()) { + detectives.append(p.getName()).append(", "); + } + + int index = detectives.length() - 2; + if(index > 0 && index < detectives.length()) { + detectives.deleteCharAt(index); + } + + return (pluginArena.isDetectiveDead() ? ChatColor.STRIKETHROUGH : "") + + detectives.toString(); + } + }); + + getPlaceholderManager().registerPlaceholder(new Placeholder("murderer_list", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + + StringBuilder murders = new StringBuilder(); + for(Player p : pluginArena.getMurdererList()) { + User user = getUserManager().getUser(p); + int localKills = user.getStatistic("LOCAL_KILLS"); + murders.append(p.getName()); + if(pluginArena.getMurdererList().size() > 1) { + murders.append(" (").append(localKills).append("), "); } - }); + } + if(pluginArena.getMurdererList().size() > 1) { + murders.deleteCharAt(murders.length() - 2); + } + + return (pluginArena.aliveMurderer() == 1 ? "" : ChatColor.STRIKETHROUGH) + + murders.toString(); + } + }); + + getPlaceholderManager().registerPlaceholder(new Placeholder("murderer_kills", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + int murdererKills = 0; + for(Player p : pluginArena.getMurdererList()) { + User user = getUserManager().getUser(p); + int localKills = user.getStatistic("LOCAL_KILLS"); + murdererKills += localKills; + } + return Integer.toString(murdererKills); + } + }); + + getPlaceholderManager().registerPlaceholder(new Placeholder("hero", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + Player hero = pluginArena.getCharacter(Arena.CharacterType.HERO); + return hero != null ? hero.getName() : new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_NOBODY").asKey().build(); + } + }); getPlaceholderManager().registerPlaceholder(new Placeholder("murderer_chance", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { @Override @@ -157,160 +135,118 @@ public String getValue(Player player, PluginArena arena) { } }); - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "detective_status", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - - if(pluginArena.isDetectiveDead()) { - if(!pluginArena.isCharacterSet(Arena.CharacterType.FAKE_DETECTIVE)) { - return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_DROPPED").asKey().build(); - } else { - return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_PICKED").asKey().build(); - } - } else { - return new MessageBuilder("SCOREBOARD_DETECTIVE_ALIVE").asKey().build(); - } - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "innocent_size", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - int innocents = 0; - for(Player p : arena.getPlayersLeft()) { - if(!Role.isRole(Role.MURDERER, getUserManager().getUser(p))) { - innocents++; - } - } - return Integer.toString(innocents); - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "player_role", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - User user = getUserManager().getUser(player); - String role; - if(pluginArena.isDeathPlayer(player)) { - role = new MessageBuilder("SCOREBOARD_ROLES_DEAD").asKey().build(); - } else if(Role.isRole(Role.MURDERER, user, arena)) { - role = new MessageBuilder("SCOREBOARD_ROLES_MURDERER").asKey().build(); - } else if(Role.isRole(Role.ANY_DETECTIVE, user, arena)) { - role = new MessageBuilder("SCOREBOARD_ROLES_DETECTIVE").asKey().build(); - } else { - role = new MessageBuilder("SCOREBOARD_ROLES_INNOCENT").asKey().build(); - } - return role; - } - }); - - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "summary_player", - Placeholder.PlaceholderType.ARENA, - Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - return getSummary(player, arena); - } + getPlaceholderManager().registerPlaceholder(new Placeholder("detective_status", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } - @Nullable - private String getSummary(Player player, PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - String summaryEnding; - - if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) - && pluginArena.getMurdererList().contains(player)) { - summaryEnding = - new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") - .asKey() - .arena(pluginArena) - .build(); - } else if(!pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) - && !pluginArena.getMurdererList().contains(player)) { - summaryEnding = - new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN") - .asKey() - .arena(pluginArena) - .build(); - } else { - summaryEnding = - new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_LOSE") - .asKey() - .arena(pluginArena) - .build(); - } - return summaryEnding; - } - }); - getPlaceholderManager() - .registerPlaceholder( - new Placeholder( - "summary", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { - @Override - public String getValue(Player player, PluginArena arena) { - return getSummary(arena); + if(pluginArena.isDetectiveDead()) { + if(!pluginArena.isCharacterSet(Arena.CharacterType.FAKE_DETECTIVE)) { + return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_DROPPED").asKey().build(); + } else { + return new MessageBuilder("SCOREBOARD_DETECTIVE_BOW_PICKED").asKey().build(); } + } else { + return new MessageBuilder("SCOREBOARD_DETECTIVE_ALIVE").asKey().build(); + } + } + }); - @Override - public String getValue(PluginArena arena) { - return getSummary(arena); + getPlaceholderManager().registerPlaceholder(new Placeholder("innocent_size", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + int innocents = 0; + for(Player p : arena.getPlayersLeft()) { + if(!Role.isRole(Role.MURDERER, getUserManager().getUser(p))) { + innocents++; } + } + return Integer.toString(innocents); + } + }); - @Nullable - private String getSummary(PluginArena arena) { - Arena pluginArena = getArenaRegistry().getArena(arena.getId()); - if(pluginArena == null) { - return null; - } - String summaryEnding; - - if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft())) { - summaryEnding = - new MessageBuilder( - "IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL") - .asKey() - .arena(pluginArena) - .build(); - } else { - summaryEnding = - new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_STOPPED") - .asKey() - .arena(pluginArena) - .build(); - } - return summaryEnding; - } - }); + getPlaceholderManager().registerPlaceholder(new Placeholder("player_role", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + User user = getUserManager().getUser(player); + String role; + if(pluginArena.isDeathPlayer(player)) { + role = new MessageBuilder("SCOREBOARD_ROLES_DEAD").asKey().build(); + } else if(Role.isRole(Role.MURDERER, user, arena)) { + role = new MessageBuilder("SCOREBOARD_ROLES_MURDERER").asKey().build(); + } else if(Role.isRole(Role.ANY_DETECTIVE, user, arena)) { + role = new MessageBuilder("SCOREBOARD_ROLES_DETECTIVE").asKey().build(); + } else { + role = new MessageBuilder("SCOREBOARD_ROLES_INNOCENT").asKey().build(); + } + return role; + } + }); + + getPlaceholderManager().registerPlaceholder(new Placeholder("summary_player", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + return getSummary(player, arena); + } + + @Nullable + private String getSummary(Player player, PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + String summaryEnding; + + if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) + && pluginArena.getMurdererList().contains(player)) { + summaryEnding = new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN").asKey().arena(pluginArena).build(); + } else if(!pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft()) + && !pluginArena.getMurdererList().contains(player)) { + summaryEnding = new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_WIN").asKey().arena(pluginArena).build(); + } else { + summaryEnding = new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_LOSE").asKey().arena(pluginArena).build(); + } + return summaryEnding; + } + }); + getPlaceholderManager().registerPlaceholder(new Placeholder("summary", Placeholder.PlaceholderType.ARENA, Placeholder.PlaceholderExecutor.ALL) { + @Override + public String getValue(Player player, PluginArena arena) { + return getSummary(arena); + } + + @Override + public String getValue(PluginArena arena) { + return getSummary(arena); + } + + @Nullable + private String getSummary(PluginArena arena) { + Arena pluginArena = getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return null; + } + String summaryEnding; + + if(pluginArena.getMurdererList().containsAll(pluginArena.getPlayersLeft())) { + summaryEnding = new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_KILLED_ALL").asKey().arena(pluginArena).build(); + } else { + summaryEnding = new MessageBuilder("IN_GAME_MESSAGES_GAME_END_PLACEHOLDERS_MURDERER_STOPPED").asKey().arena(pluginArena).build(); + } + return summaryEnding; + } + }); } private PlaceholderManager getPlaceholderManager() { From 4cfd6545a2540a2ba096230f88a299305c948dc4 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Sat, 6 May 2023 12:16:59 +0200 Subject: [PATCH 102/127] added cauldron potions --- src/main/resources/special_blocks.yml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/resources/special_blocks.yml b/src/main/resources/special_blocks.yml index 9891f924..b0fc62e0 100644 --- a/src/main/resources/special_blocks.yml +++ b/src/main/resources/special_blocks.yml @@ -25,14 +25,26 @@ Special-Blocks: Duration: 10 Amplifier: 1 # Beware that we use '&f' at the end to make it different from above! - # Otherwise it will count as Mystery-I potion! + # Otherwise, it will count as Mystery-I potion! Name: "&7Mystery potion &8(???)&f" - Subtitle: "&a10S of Slowness" + Subtitle: "&c10S of Slowness" Mystery-III: Type: INVISIBILITY Duration: 10 Amplifier: 1 # Beware that we use '&a' at the end to make it different from above! - # Otherwise it will count as Mystery-I potion! + # Otherwise, it will count as Mystery-I potion! Name: "&7Mystery potion &8(???)&a" - Subtitle: "&a10S of Invisibility" \ No newline at end of file + Subtitle: "&a10S of Invisibility" + Mystery-IV: + Type: BLINDNESS + Duration: 5 + Amplifier: 1 + Name: "&7Mystery potion &8(???)&b" + Subtitle: "&c5S of Blindness" + Mystery-V: + Type: NIGHT_VISION + Duration: 25 + Amplifier: 1 + Name: "&7Mystery potion &8(???)&c" + Subtitle: "&a25S of Night Vision" \ No newline at end of file From 7f498db66360eec5563f4d3f8972e22a9c1f3b14 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 Date: Sat, 6 May 2023 17:05:02 +0200 Subject: [PATCH 103/127] update minigamesbox --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6799810f..87b86bac 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT21") { isTransitive = false } + implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT22") { isTransitive = false } compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.0.1") From ea073ec2c31cbb0253640ad77ebc6bf19f1fab8f Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Sat, 6 May 2023 15:06:16 +0000 Subject: [PATCH 104/127] Bump version from 1.7.9-SNAPSHOT39 to 1.7.9-SNAPSHOT40 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 87b86bac..03e80da0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { } group = "plugily.projects" -version = "1.7.9-SNAPSHOT39" +version = "1.7.9-SNAPSHOT40" description = "MurderMystery" java { From cbc13db361534d500b737060f6f9c78e927d9a0e Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Wed, 7 Jun 2023 22:07:55 +0200 Subject: [PATCH 105/127] update locales --- build.gradle.kts | 2 +- .../boot/MessageInitializer.java | 17 +++-------- .../resources/locales/language_default.yml | 30 +++++++++---------- 3 files changed, 20 insertions(+), 29 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 03e80da0..8d2a84c0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT22") { isTransitive = false } + implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT28") { isTransitive = false } compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.0.1") diff --git a/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java index d299d805..aded4b6d 100644 --- a/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java +++ b/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java @@ -101,27 +101,18 @@ public void registerMessages() { } private void registerLocales() { - Arrays.asList(new Locale("Chinese (Traditional)", "简体中文", "zh_HK", "POEditor contributors", Arrays.asList("中文(傳統)", "中國傳統", "chinese_traditional", "zh")), - new Locale("Chinese (Simplified)", "简体中文", "zh_CN", "POEditor contributors", Arrays.asList("简体中文", "中文", "chinese", "chinese_simplified", "cn")), + Arrays.asList(new Locale("Chinese", "简体中文", "zh_CN", "POEditor contributors", Arrays.asList("chinese", "zh-zn")), + new Locale("Chinese (Simplified)", "简体中文", "zh_HANS", "POEditor contributors", Arrays.asList("chinese_simplified", "cn-hans")), + new Locale("Chinese (TW)", "简体中文", "zh_TW", "POEditor contributors", Arrays.asList("chinese", "zh-zn")), new Locale("Czech", "Český", "cs_CZ", "POEditor contributors", Arrays.asList("czech", "cesky", "český", "cs")), - new Locale("Dutch", "Nederlands", "nl_NL", "POEditor contributors", Arrays.asList("dutch", "nederlands", "nl")), new Locale("English", "English", "en_GB", "Tigerpanzer_02", Arrays.asList("default", "english", "en")), new Locale("French", "Français", "fr_FR", "POEditor contributors", Arrays.asList("french", "francais", "français", "fr")), new Locale("German", "Deutsch", "de_DE", "Tigerkatze and POEditor contributors", Arrays.asList("deutsch", "german", "de")), - new Locale("Hungarian", "Magyar", "hu_HU", "POEditor contributors", Arrays.asList("hungarian", "magyar", "hu")), - new Locale("Indonesian", "Indonesia", "id_ID", "POEditor contributors", Arrays.asList("indonesian", "indonesia", "id")), - new Locale("Italian", "Italiano", "it_IT", "POEditor contributors", Arrays.asList("italian", "italiano", "it")), - new Locale("Korean", "한국의", "ko_KR", "POEditor contributors", Arrays.asList("korean", "한국의", "kr")), - new Locale("Lithuanian", "Lietuviešu", "lt_LT", "POEditor contributors", Arrays.asList("lithuanian", "lietuviešu", "lietuviesu", "lt")), - new Locale("Polish", "Polski", "pl_PL", "Plajer", Arrays.asList("polish", "polski", "pl")), new Locale("Portuguese (BR)", "Português Brasileiro", "pt_BR", "POEditor contributors", Arrays.asList("brazilian", "brasil", "brasileiro", "pt-br", "pt_br")), - new Locale("Romanian", "Românesc", "ro_RO", "POEditor contributors", Arrays.asList("romanian", "romanesc", "românesc", "ro")), new Locale("Russian", "Pусский", "ru_RU", "POEditor contributors", Arrays.asList("russian", "pусский", "pyccknn", "russkiy", "ru")), new Locale("Spanish", "Español", "es_ES", "POEditor contributors", Arrays.asList("spanish", "espanol", "español", "es")), new Locale("Thai", "Thai", "th_TH", "POEditor contributors", Arrays.asList("thai", "th")), - new Locale("Turkish", "Türk", "tr_TR", "POEditor contributors", Arrays.asList("turkish", "turk", "türk", "tr")), - new Locale("Vietnamese", "Việt", "vn_VN", "POEditor contributors", - Arrays.asList("vietnamese", "viet", "việt", "vn"))).forEach(LocaleRegistry::registerLocale); + new Locale("Turkish", "Türk", "tr_TR", "POEditor contributors", Arrays.asList("turkish", "turk", "türk", "tr"))); } private MessageManager getMessageManager() { diff --git a/src/main/resources/locales/language_default.yml b/src/main/resources/locales/language_default.yml index 3622b497..c8a798a7 100644 --- a/src/main/resources/locales/language_default.yml +++ b/src/main/resources/locales/language_default.yml @@ -93,7 +93,7 @@ Scoreboard: Innocent: "&eInnocent" Dead: "Dead" Detective: - Alive: "Detective: &aAlive" + Alive: "Detective &aAlive" Bow: Dropped: "%color_chat_issue%Bow Dropped" Picked: "Bow Not Dropped" @@ -119,28 +119,28 @@ Scoreboard: - "" - "■ Role | %arena_player_role%" - "&f" - - "■ Innocents | %arena_innocents%" + - "■ Innocents | %arena_innocent_size%" - "&f" - "■ Time | %arena_time%" - "" - "■ %arena_detective_status%" - "" - - "■ Score | %USERSTATISTC SCORE%" + - "■ Score | %user_statistic_local_score%" - "" - " www.plugily.xyz" In-Game-Murderer: - "" - "■ Role | %arena_player_role%" - "&f" - - "■ Innocents | %arena_innocents%" + - "■ Innocents | %arena_innocent_size%" - "&f" - "■ Time | %arena_time%" - "" - "■ %arena_detective_status%" - "" - - "■ Kills | %USER STATISTIC LOCAL KILLS%" + - "■ Kills | %user_statistic_local_kills%" - "" - - "■ Score | %USERSTATISTC SCORE%" + - "■ Score | %user_statistic_local_score%" - "" - " www.plugily.xyz" # Contents of scoreboard while state is ending @@ -190,7 +190,7 @@ Bossbar: In-Game: #Used in most game messages. Plugin-Prefix: "(%plugin_name%)" - Game-Chat-Format: "[%user_statistic_level%][%kit%] %player% | %message%" + Game-Chat-Format: "[%user_statistic_level%] %player% | %message%" You-Leveled-Up: "%plugin_prefix% You leveled up! You're now level %number%!" Commands-Blocked: "%color_chat_issue%%plugin_prefix% You have to leave the game first to perform commands. The only command that works is /%plugin_short_command% leave!" Join: @@ -210,7 +210,7 @@ In-Game: Blocked: "%color_chat_issue%%plugin_prefix% Spectators are disabled for this arena" You-Are-Spectator: "%plugin_prefix% You're now a spectator! You can fly now!" Spectator-Menu-Name: "%color_chat_issue%Alive players list" - Target-Player-Health: "%color_chat_issue%Health: %number% | Role: %arena_role%" + Target-Player-Health: "%color_chat_issue%Health: %number% | Role: %arena_player_role%" Spectator-Warning: "%plugin_prefix% You are a spectator!" Teleport: "%plugin_prefix% Teleported to %player%" Menu: @@ -282,27 +282,27 @@ In-Game: Name: "Role pass menu" Role: Murderer: - Name: "Be murderer" + Name: "&cBe murderer" Lore: - "Cost 1 murderer pass" - - "You got %amount%" + - "You got %number%" Detective: - Name: "Be detective" + Name: "&bBe detective" Lore: - "Cost 1 detective pass" - - "You got %amount%" + - "You got %number%" Fail: "You do not got enough passes for %value% role" Success: "You will be %value% next round!" Change: "You now got %number% %value% passes!" Playing: Time-Left: "5,20,5;%arena_time% seconds left!;After %arena_time%s the Murderer will lose" Role: - Change: "5,20,5;Previous %arena_role% has left!" + Change: "5,20,5;Previous %arena_player_role% has left!" Murderer: "5,20,5;ROLE | MURDERER; Kill all players!" Detective: "5,20,5;ROLE | DETECTIVE;Find and kill the murderer!" Innocent: "5,20,5;ROLE | INNOCENT;Stay alive as long as possible!" Score: - Bonus: "+%score% score (%action%)" + Bonus: "+%number% score (%value%)" Gold: "Picked up gold!" Action: Kill: @@ -322,7 +322,7 @@ In-Game: Cauldron: Potion: "Please drink your current potion!" Hologram: "Mystery Potion - &e1 Gold" - Not-Enough-Gold: "You need %amount% gold for this!" + Not-Enough-Gold: "You need %number% gold for this!" Pray: Hologram: "Click to give gift;Pull lever to pray" Chat: "You prayed to the developer! Hope he will hear that!" From 8441d8e92d24920822fb72d8cdb7f7412f00f516 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Wed, 7 Jun 2023 22:13:45 +0200 Subject: [PATCH 106/127] update locales --- src/main/resources/config.yml | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b1a03e52..d4661ee3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,8 +1,7 @@ -### Initial config.yml for all plugily projects ## Thanks for using our plugins! ~Tigerpanzer_02 from Plugily Projects -# PlugilyProjects configuration file +# murdermystery configuration file # -# You can edit here the basic things of PlugilyProjects +# You can edit here the basic things of murdermystery # Please read everything CAREFULLY! # You don't want to break anything, do you? # @@ -11,18 +10,8 @@ # Select locale of MurderMystery, default it's English. # Available locales: # default - English language. Uses 'language.yml'. -# de - Deutsche sprache pl - Język polski -# fr - Langue française cn - 简体中文 -# zh_tw - 中文(繁體) kr - 한국어 -# id - Bhasa Indonesia hu - Magyar nyelv -# cs - Český jazyk ro - Limba română -# vn - Tiếng Việt it - Lingua italiana -# ru - Русский язык es - Idioma español -# nl - Nederlandse taal pt_br - Português (Brasil) -# tr - Türk dili sk - Slovenský jazyk -# ja - Japanese af - Afrikaans -# dk - Danish th - Thai -# uk - Ukrainian +# See https://github.com/Plugily-Projects/locale_storage/tree/master/plugins/minecraft/murdermystery +# Use filename of the language e.g. de_DE.yml -> locale: de_DE locale: default @@ -55,23 +44,23 @@ Commands: Shorter: '1': Short: "start" - Executes: "plugilyprojectsadmin forcestart" + Executes: "murdermysteryadmin forcestart" Enabled: true '2': Short: "leave" - Executes: "plugilyprojects leave" + Executes: "murdermystery leave" Enabled: true '3': Short: "kit" - Executes: "plugilyprojects selectkit" + Executes: "murdermystery selectkit" Enabled: false '4': Short: "stats" - Executes: "plugilyprojects stats" + Executes: "murdermystery stats" Enabled: false '5': Short: "top" - Executes: "plugilyprojects top" + Executes: "murdermystery top" Enabled: true From b68c449c77c56fc4ee0a28e1fd950d7ce99f8935 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Sun, 18 Jun 2023 17:51:23 +0200 Subject: [PATCH 107/127] fixed startup --- build.gradle.kts | 2 +- .../plugily/projects/murdermystery/Main.java | 2 +- .../boot/MessageInitializer.java | 23 ++++++++++--------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8d2a84c0..f24067ce 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT28") { isTransitive = false } + implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT29") { isTransitive = false } compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.0.1") diff --git a/src/main/java/plugily/projects/murdermystery/Main.java b/src/main/java/plugily/projects/murdermystery/Main.java index b719d78c..da9345cf 100644 --- a/src/main/java/plugily/projects/murdermystery/Main.java +++ b/src/main/java/plugily/projects/murdermystery/Main.java @@ -77,6 +77,7 @@ public void onEnable() { MessageInitializer messageInitializer = new MessageInitializer(this); super.onEnable(); getDebugger().debug("[System] [Plugin] Initialization start"); + arenaRegistry = new ArenaRegistry(this); new PlaceholderInitializer(this); messageInitializer.registerMessages(); new AdditionalValueInitializer(this); @@ -104,7 +105,6 @@ public void initializePluginClasses() { ArenaUtils.init(this); new ArenaEvents(this); arenaManager = new ArenaManager(this); - arenaRegistry = new ArenaRegistry(this); arenaRegistry.registerArenas(); getSignManager().loadSigns(); getSignManager().updateSigns(); diff --git a/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java index aded4b6d..e6c5169d 100644 --- a/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java +++ b/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java @@ -102,17 +102,18 @@ public void registerMessages() { private void registerLocales() { Arrays.asList(new Locale("Chinese", "简体中文", "zh_CN", "POEditor contributors", Arrays.asList("chinese", "zh-zn")), - new Locale("Chinese (Simplified)", "简体中文", "zh_HANS", "POEditor contributors", Arrays.asList("chinese_simplified", "cn-hans")), - new Locale("Chinese (TW)", "简体中文", "zh_TW", "POEditor contributors", Arrays.asList("chinese", "zh-zn")), - new Locale("Czech", "Český", "cs_CZ", "POEditor contributors", Arrays.asList("czech", "cesky", "český", "cs")), - new Locale("English", "English", "en_GB", "Tigerpanzer_02", Arrays.asList("default", "english", "en")), - new Locale("French", "Français", "fr_FR", "POEditor contributors", Arrays.asList("french", "francais", "français", "fr")), - new Locale("German", "Deutsch", "de_DE", "Tigerkatze and POEditor contributors", Arrays.asList("deutsch", "german", "de")), - new Locale("Portuguese (BR)", "Português Brasileiro", "pt_BR", "POEditor contributors", Arrays.asList("brazilian", "brasil", "brasileiro", "pt-br", "pt_br")), - new Locale("Russian", "Pусский", "ru_RU", "POEditor contributors", Arrays.asList("russian", "pусский", "pyccknn", "russkiy", "ru")), - new Locale("Spanish", "Español", "es_ES", "POEditor contributors", Arrays.asList("spanish", "espanol", "español", "es")), - new Locale("Thai", "Thai", "th_TH", "POEditor contributors", Arrays.asList("thai", "th")), - new Locale("Turkish", "Türk", "tr_TR", "POEditor contributors", Arrays.asList("turkish", "turk", "türk", "tr"))); + new Locale("Chinese (Simplified)", "简体中文", "zh_HANS", "POEditor contributors", Arrays.asList("chinese_simplified", "cn-hans")), + new Locale("Chinese (TW)", "简体中文", "zh_TW", "POEditor contributors", Arrays.asList("chinese", "zh-zn")), + new Locale("Czech", "Český", "cs_CZ", "POEditor contributors", Arrays.asList("czech", "cesky", "český", "cs")), + new Locale("English", "English", "en_GB", "Tigerpanzer_02", Arrays.asList("default", "english", "en")), + new Locale("French", "Français", "fr_FR", "POEditor contributors", Arrays.asList("french", "francais", "français", "fr")), + new Locale("German", "Deutsch", "de_DE", "Tigerkatze and POEditor contributors", Arrays.asList("deutsch", "german", "de")), + new Locale("Portuguese (BR)", "Português Brasileiro", "pt_BR", "POEditor contributors", Arrays.asList("brazilian", "brasil", "brasileiro", "pt-br", "pt_br")), + new Locale("Russian", "Pусский", "ru_RU", "POEditor contributors", Arrays.asList("russian", "pусский", "pyccknn", "russkiy", "ru")), + new Locale("Spanish", "Español", "es_ES", "POEditor contributors", Arrays.asList("spanish", "espanol", "español", "es")), + new Locale("Thai", "Thai", "th_TH", "POEditor contributors", Arrays.asList("thai", "th")), + new Locale("Turkish", "Türk", "tr_TR", "POEditor contributors", Arrays.asList("turkish", "turk", "türk", "tr"))) + .forEach(LocaleRegistry::registerLocale); } private MessageManager getMessageManager() { From 8a16e830768c6070e55b39c11a728925f1c901d8 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Sun, 18 Jun 2023 15:52:16 +0000 Subject: [PATCH 108/127] Bump version from 1.7.9-SNAPSHOT40 to 1.7.9-SNAPSHOT41 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index f24067ce..7f954c4f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { } group = "plugily.projects" -version = "1.7.9-SNAPSHOT40" +version = "1.7.9-SNAPSHOT41" description = "MurderMystery" java { From bcfc5f0f21c86a0bfedc7782d4089b728078c8a8 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Sun, 18 Jun 2023 17:58:02 +0200 Subject: [PATCH 109/127] minigamesbox update --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 7f954c4f..717a5bf2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT29") { isTransitive = false } + implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT30") { isTransitive = false } compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.0.1") From e21e78f3e3a4519a998b708c3bf3592d9a9671ea Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Sun, 18 Jun 2023 15:58:45 +0000 Subject: [PATCH 110/127] Bump version from 1.7.9-SNAPSHOT41 to 1.7.9-SNAPSHOT42 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 717a5bf2..f03a68a1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { } group = "plugily.projects" -version = "1.7.9-SNAPSHOT41" +version = "1.7.9-SNAPSHOT42" description = "MurderMystery" java { From e9e04f23c7d283ca6e77bba6f98480944921e7f4 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 Jun 2023 21:19:26 +0200 Subject: [PATCH 111/127] fixed setup menu missing mysterycauldron --- .../projects/murdermystery/handlers/setup/SpecificCategory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java index f1bd6f7b..acaae2e6 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java @@ -65,7 +65,7 @@ public void addItems(NormalFastInv gui) { getItemList().add(mysteryCauldron); MaterialMultiLocationItem confessional = new MaterialMultiLocationItem(getSetupInventory(), new ItemBuilder(XMaterial.ENCHANTING_TABLE.parseMaterial()), "Confessional", "Target enchanting table and\nadd praise to the developer\nconfessional, gift for\nthe developer costs 1 gold!\nAdd some levers in radius\nof 3 blocks near the enchant table\nto allow users to pray there!\nYou can either get gifts\nor curses from prayer!", "confessionals", Collections.singleton(XMaterial.ENCHANTING_TABLE.parseMaterial()), false, 0); - gui.setItem((getInventoryLine() * 9) + 5, confessional); + gui.setItem((getInventoryLine() * 9) + 6, confessional); getItemList().add(confessional); } From 4f44c59837920f9cda38532a7ba9863679137ada Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 Jun 2023 22:15:28 +0200 Subject: [PATCH 112/127] fixed mysterycauldron adding --- .../projects/murdermystery/handlers/setup/SpecificCategory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java index acaae2e6..190949f6 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SpecificCategory.java @@ -60,7 +60,7 @@ public void addItems(NormalFastInv gui) { gui.setItem((getInventoryLine() * 9) + 4, goldSpawn); getItemList().add(goldSpawn); - MaterialMultiLocationItem mysteryCauldron = new MaterialMultiLocationItem(getSetupInventory(), new ItemBuilder(XMaterial.CAULDRON.parseMaterial()), "Mystery Cauldron", "Target a cauldron and add it to the game\nit will cost 1 gold per potion!\nConfigure cauldron potions \nin special_blocks.yml file!", "mystery-cauldrons", Collections.singleton(XMaterial.CAULDRON.parseMaterial()), false, 0); + MaterialMultiLocationItem mysteryCauldron = new MaterialMultiLocationItem(getSetupInventory(), new ItemBuilder(XMaterial.CAULDRON.parseMaterial()), "Mystery Cauldron", "Target a cauldron and add it to the game\nit will cost 1 gold per potion!\nConfigure cauldron potions \nin special_blocks.yml file!", "mystery-cauldrons", Collections.singleton(Material.CAULDRON), false, 0); gui.setItem((getInventoryLine() * 9) + 5, mysteryCauldron); getItemList().add(mysteryCauldron); From d432e4ea67a026dee717d53d73cb73fd4a6acaf4 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 Jun 2023 22:15:37 +0200 Subject: [PATCH 113/127] added prefix to some messages --- src/main/resources/language.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index 0d9ddee6..6366c9db 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -280,9 +280,9 @@ In-Game: Lore: - "Cost 1 detective pass" - "You got %number%" - Fail: "You do not got enough passes for %value% role" - Success: "You will be %value% next round!" - Change: "You now got %number% %value% passes!" + Fail: "%plugin_prefix% You do not got enough passes for %value% role" + Success: "%plugin_prefix% You will be %value% next round!" + Change: "%plugin_prefix% You now got %number% %value% passes!" Playing: Time-Left: "5,20,5;%arena_time% seconds left!;After %arena_time%s the Murderer will lose" Role: From 7c7eb155af5c2cffb4138566cf26065039666142 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 Jun 2023 22:51:56 +0200 Subject: [PATCH 114/127] Fixed NoSuchMethodError Cooldown on 1.8 --- .../java/plugily/projects/murdermystery/arena/ArenaEvents.java | 2 +- .../plugily/projects/murdermystery/events/PluginEvents.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java index d3aafb36..486de01b 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/murdermystery/arena/ArenaEvents.java @@ -103,7 +103,7 @@ public void onBowShot(EntityShootBowEvent event) { int bowCooldown = plugin.getConfig().getInt("Bow.Cooldown", 5); user.setCooldown("bow_shot", bowCooldown); plugin.getBukkitHelper().applyActionBarCooldown(player, bowCooldown); - player.setCooldown(event.getBow().getType(), 20 * (plugin.getConfig().getInt("Bow.Cooldown", 5))); + VersionUtils.setMaterialCooldown(player, event.getBow().getType(), 20 * (plugin.getConfig().getInt("Bow.Cooldown", 5))); } @EventHandler diff --git a/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java index 0edbac07..002ac8b3 100644 --- a/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java +++ b/src/main/java/plugily/projects/murdermystery/events/PluginEvents.java @@ -92,7 +92,7 @@ public void onSwordThrow(PlayerInteractEvent event) { if(ServerVersion.Version.isCurrentLower(ServerVersion.Version.v1_10_R1)) { attackerUser.setCooldown("sword_attack", (plugin.getConfig().getInt("Sword.Cooldown.Attack", 1))); } else { - attacker.setCooldown(plugin.getSwordSkinManager().getMurdererSword(attacker).getType(), 20 * (plugin.getConfig().getInt("Sword.Cooldown.Attack", 1))); + VersionUtils.setMaterialCooldown(attacker ,plugin.getSwordSkinManager().getMurdererSword(attacker).getType(), 20 * (plugin.getConfig().getInt("Sword.Cooldown.Attack", 1))); } createFlyingSword(attacker, attackerUser); From b68d32a559eaeb095cd6ceea53f116bced7a220f Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 Jun 2023 23:53:19 +0200 Subject: [PATCH 115/127] Fixed first game of all players causes nan numbers --- build.gradle.kts | 2 +- .../java/plugily/projects/murdermystery/arena/Arena.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 717a5bf2..7ac9ba2c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT30") { isTransitive = false } + implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT31") { isTransitive = false } compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.0.1") diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index 5e7577aa..f897d50c 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -247,7 +247,9 @@ public int getTotalRoleChances(Role role) { User user = getPlugin().getUserManager().getUser(p); totalRoleChances += getContributorValue(role, user); } - return totalRoleChances; + //avoid division / 0 + Bukkit.getConsoleSender().sendMessage(role.name() + "->T:" + totalRoleChances); + return totalRoleChances == 0 ? 1 : totalRoleChances; } public boolean isCharacterSet(Arena.CharacterType type) { @@ -419,14 +421,16 @@ public int getContributorValue(Role role, User user) { } Player player = user.getPlayer(); int contributor = user.getStatistic("CONTRIBUTION_" + role.name()); + Bukkit.getConsoleSender().sendMessage(user.getPlayer().getName() + role.name() + "->C:" + contributor + user.getStatistic(plugin.getStatsStorage().getStatisticType("CONTRIBUTION_" + role.name()))); int increase = plugin.getPermissionsManager().getPermissionCategoryValue(role.name() + "_BOOSTER", player); int multiplicator = plugin.getPermissionsManager().getPermissionCategoryValue("CHANCES_BOOSTER", player); - int calculatedContributor = (contributor + increase) * multiplicator; + int calculatedContributor = (contributor + increase) * (multiplicator == 0 ? 1 :multiplicator); if(role == Role.MURDERER) { murdererContributions.put(user, calculatedContributor); } else { detectiveContributions.put(user, calculatedContributor); } + Bukkit.getConsoleSender().sendMessage(user.getPlayer().getName() + role.name() + "->" + calculatedContributor); return calculatedContributor; } From 442463243ac5de6abd2b489082381f631134bc7d Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Mon, 19 Jun 2023 21:54:32 +0000 Subject: [PATCH 116/127] Bump version from 1.7.9-SNAPSHOT42 to 1.7.9-SNAPSHOT43 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 107ede5a..588da131 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { } group = "plugily.projects" -version = "1.7.9-SNAPSHOT42" +version = "1.7.9-SNAPSHOT43" description = "MurderMystery" java { From 9f14e3f805fa8f94a8810dbb5d80562adf1edacd Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Wed, 2 Aug 2023 22:44:26 +0200 Subject: [PATCH 117/127] Fixed removeblock command --- build.gradle.kts | 2 +- .../arguments/admin/arena/SpecialBlockRemoverArgument.java | 3 +-- .../commands/arguments/game/RoleSelectorArgument.java | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 588da131..6c570746 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT31") { isTransitive = false } + implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT43") { isTransitive = false } compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.0.1") diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java index f9bd222d..dc143384 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/admin/arena/SpecialBlockRemoverArgument.java @@ -64,8 +64,7 @@ public void execute(CommandSender sender, String[] args) { || targetBlock.getType() == XMaterial.ENCHANTING_TABLE.parseMaterial()) { for(PluginArena arena : registry.getPlugin().getArenaRegistry().getArenas()) { - Arena pluginArena = - (Arena) registry.getPlugin().getArenaRegistry().getArena(player); + Arena pluginArena = (Arena) registry.getPlugin().getArenaRegistry().getArena(arena.getId()); if(arena == null) { return; } diff --git a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java index 8cda24ab..80bffc3d 100644 --- a/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java +++ b/src/main/java/plugily/projects/murdermystery/commands/arguments/game/RoleSelectorArgument.java @@ -41,8 +41,8 @@ public class RoleSelectorArgument implements Listener { public RoleSelectorArgument(ArgumentsRegistry registry) { - registry.mapArgument("murdermystery", new LabeledCommandArgument("roleselector", "murdermystery.roleselector", CommandArgument.ExecutorType.PLAYER, - new LabelData("/mm roleselector", "/mm roleselector", "&7Select a role\n&6Permission: &7murdermystery.roleselector")) { + registry.mapArgument("murdermystery", new LabeledCommandArgument("roleselector", "murdermystery.command.roleselector", CommandArgument.ExecutorType.PLAYER, + new LabelData("/mm roleselector", "/mm roleselector", "&7Select a role\n&6Permission: &7murdermystery.command.roleselector")) { @Override public void execute(CommandSender sender, String[] args) { Player player = (Player) sender; From 19911b5d8ef50c64b64fa97c6d8c32b9c613384e Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Wed, 2 Aug 2023 20:44:12 +0000 Subject: [PATCH 118/127] Bump version from 1.7.9-SNAPSHOT43 to 1.7.9-SNAPSHOT44 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6c570746..54525eda 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { } group = "plugily.projects" -version = "1.7.9-SNAPSHOT43" +version = "1.7.9-SNAPSHOT44" description = "MurderMystery" java { From e5ffab632fdf7438dd2a4d629dcd296292cb5952 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Wed, 2 Aug 2023 23:30:01 +0200 Subject: [PATCH 119/127] Fixed gold visuals --- .../projects/murdermystery/arena/Arena.java | 16 +++---------- .../arena/states/WaitingState.java | 24 +++++++++++++++++++ .../handlers/setup/SwitchCategory.java | 5 ++-- 3 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 src/main/java/plugily/projects/murdermystery/arena/states/WaitingState.java diff --git a/src/main/java/plugily/projects/murdermystery/arena/Arena.java b/src/main/java/plugily/projects/murdermystery/arena/Arena.java index f897d50c..e9ba6bf4 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/Arena.java +++ b/src/main/java/plugily/projects/murdermystery/arena/Arena.java @@ -43,6 +43,7 @@ import plugily.projects.murdermystery.arena.states.StartingState; import plugily.projects.murdermystery.HookManager; import plugily.projects.murdermystery.arena.special.SpecialBlock; +import plugily.projects.murdermystery.arena.states.WaitingState; import java.util.*; @@ -84,6 +85,7 @@ public Arena(String id) { addGameStateHandler(ArenaState.IN_GAME, new InGameState()); addGameStateHandler(ArenaState.RESTARTING, new RestartingState()); addGameStateHandler(ArenaState.STARTING, new StartingState()); + addGameStateHandler(ArenaState.WAITING_FOR_PLAYERS, new WaitingState()); } public static void init(Main plugin) { @@ -169,14 +171,6 @@ public void setGoldSpawnPoints(@NotNull List goldSpawnPoints) { this.goldSpawnPoints = goldSpawnPoints; } - public void toggleGoldVisuals() { - if(goldSpawnPoints.isEmpty() || goldVisuals) { - goldVisuals = false; - return; - } - setGoldVisuals(true); - } - private BukkitTask visualTask; public void startGoldVisuals() { @@ -189,14 +183,10 @@ public void startGoldVisuals() { visualTask.cancel(); return; } - for(Location goldLocations : goldSpawnPoints) { Location goldLocation = goldLocations.clone(); goldLocation.add(0, 0.4, 0); - java.util.Iterator iterator = Bukkit.getOnlinePlayers().iterator(); - if(iterator.hasNext()) { - VersionUtils.sendParticles("REDSTONE", iterator.next(), goldLocation, 10); - } + Bukkit.getOnlinePlayers().forEach(player -> VersionUtils.sendParticles("REDSTONE", player, goldLocation, 10)); } }, 20L, 20L); } diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/WaitingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/WaitingState.java new file mode 100644 index 00000000..b5715a9f --- /dev/null +++ b/src/main/java/plugily/projects/murdermystery/arena/states/WaitingState.java @@ -0,0 +1,24 @@ +package plugily.projects.murdermystery.arena.states; + +import org.bukkit.configuration.file.FileConfiguration; +import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.states.PluginWaitingState; +import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; +import plugily.projects.murdermystery.arena.Arena; + +public class WaitingState extends PluginWaitingState { + + @Override + public void handleCall(PluginArena arena) { + super.handleCall(arena); + Arena pluginArena = (Arena) getPlugin().getArenaRegistry().getArena(arena.getId()); + if(pluginArena == null) { + return; + } + if(arena.getTimer() <= 0) { + FileConfiguration config = + ConfigUtils.getConfig(getPlugin(), "arenas"); + pluginArena.setGoldVisuals(config.getBoolean(pluginArena.getId() + ".goldvisuals")); + } + } +} diff --git a/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java b/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java index e2d49bf1..ba6f4063 100644 --- a/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java +++ b/src/main/java/plugily/projects/murdermystery/handlers/setup/SwitchCategory.java @@ -3,6 +3,7 @@ import org.bukkit.plugin.java.JavaPlugin; import plugily.projects.minigamesbox.classic.PluginMain; import plugily.projects.minigamesbox.classic.handlers.setup.categories.PluginSwitchCategory; +import plugily.projects.minigamesbox.classic.handlers.setup.items.category.BooleanItem; import plugily.projects.minigamesbox.classic.handlers.setup.items.category.SwitchItem; import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; @@ -20,9 +21,7 @@ public class SwitchCategory extends PluginSwitchCategory { @Override public void addItems(NormalFastInv gui) { super.addItems(gui); - SwitchItem goldVisuals = new SwitchItem(getSetupInventory(), new ItemBuilder(XMaterial.REDSTONE.parseMaterial()), "Gold Visuals", "Enables gold visuals to spawn\nsome particle effects above gold locations", "goldvisuals", Arrays.asList("true", "false"), inventoryClickEvent -> { - JavaPlugin.getPlugin(Main.class).getArenaRegistry().getArena(getSetupInventory().getArenaKey()).toggleGoldVisuals(); - }); + BooleanItem goldVisuals = new BooleanItem(getSetupInventory(), new ItemBuilder(XMaterial.REDSTONE.parseMaterial()), "Gold Visuals", "Enables gold visuals to spawn\nsome particle effects above gold locations", "goldvisuals"); gui.setItem((getInventoryLine() * 9) + 1, goldVisuals); getItemList().add(goldVisuals); } From 8db0c824e8a232f0afbf170a2aa17522b72cacb1 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Wed, 2 Aug 2023 21:29:52 +0000 Subject: [PATCH 120/127] Bump version from 1.7.9-SNAPSHOT44 to 1.7.9-SNAPSHOT45 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 54525eda..34559ca5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { } group = "plugily.projects" -version = "1.7.9-SNAPSHOT44" +version = "1.7.9-SNAPSHOT45" description = "MurderMystery" java { From 420f58a467e774b054ca58d15da8bc17b4fe4a0b Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Tue, 8 Aug 2023 21:26:40 +0200 Subject: [PATCH 121/127] Moved locales to remote --- build.gradle.kts | 2 +- .../murdermystery/boot/MessageInitializer.java | 17 ----------------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 34559ca5..2ca450f5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("plugily.projects:MiniGamesBox-Classic:1.2.0-SNAPSHOT43") { isTransitive = false } + implementation("plugily.projects:MiniGamesBox-Classic:1.3.0") { isTransitive = false } compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.0.1") diff --git a/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java b/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java index e6c5169d..5034c80c 100644 --- a/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java +++ b/src/main/java/plugily/projects/murdermystery/boot/MessageInitializer.java @@ -20,7 +20,6 @@ public class MessageInitializer { public MessageInitializer(Main plugin) { this.plugin = plugin; - registerLocales(); } public void registerMessages() { @@ -100,22 +99,6 @@ public void registerMessages() { getMessageManager().registerMessage("LEADERBOARD_STATISTICS_HIGHEST_SCORE", new Message("Leaderboard.Statistics.Highest-Score", "")); } - private void registerLocales() { - Arrays.asList(new Locale("Chinese", "简体中文", "zh_CN", "POEditor contributors", Arrays.asList("chinese", "zh-zn")), - new Locale("Chinese (Simplified)", "简体中文", "zh_HANS", "POEditor contributors", Arrays.asList("chinese_simplified", "cn-hans")), - new Locale("Chinese (TW)", "简体中文", "zh_TW", "POEditor contributors", Arrays.asList("chinese", "zh-zn")), - new Locale("Czech", "Český", "cs_CZ", "POEditor contributors", Arrays.asList("czech", "cesky", "český", "cs")), - new Locale("English", "English", "en_GB", "Tigerpanzer_02", Arrays.asList("default", "english", "en")), - new Locale("French", "Français", "fr_FR", "POEditor contributors", Arrays.asList("french", "francais", "français", "fr")), - new Locale("German", "Deutsch", "de_DE", "Tigerkatze and POEditor contributors", Arrays.asList("deutsch", "german", "de")), - new Locale("Portuguese (BR)", "Português Brasileiro", "pt_BR", "POEditor contributors", Arrays.asList("brazilian", "brasil", "brasileiro", "pt-br", "pt_br")), - new Locale("Russian", "Pусский", "ru_RU", "POEditor contributors", Arrays.asList("russian", "pусский", "pyccknn", "russkiy", "ru")), - new Locale("Spanish", "Español", "es_ES", "POEditor contributors", Arrays.asList("spanish", "espanol", "español", "es")), - new Locale("Thai", "Thai", "th_TH", "POEditor contributors", Arrays.asList("thai", "th")), - new Locale("Turkish", "Türk", "tr_TR", "POEditor contributors", Arrays.asList("turkish", "turk", "türk", "tr"))) - .forEach(LocaleRegistry::registerLocale); - } - private MessageManager getMessageManager() { return plugin.getMessageManager(); } From ce0c0373f89eea59cba68b26eac884e37f8dac0a Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Tue, 8 Aug 2023 21:27:06 +0200 Subject: [PATCH 122/127] Fixed rush and ban reset --- .../projects/murdermystery/arena/states/StartingState.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java index ae71fffc..8832ea27 100644 --- a/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java +++ b/src/main/java/plugily/projects/murdermystery/arena/states/StartingState.java @@ -31,6 +31,7 @@ import plugily.projects.murdermystery.arena.Arena; import plugily.projects.murdermystery.arena.ArenaUtils; import plugily.projects.murdermystery.arena.role.Role; +import plugily.projects.murdermystery.arena.special.pray.PrayerRegistry; import plugily.projects.murdermystery.utils.ItemPosition; import java.util.*; @@ -66,6 +67,8 @@ public void handleCall(PluginArena arena) { VersionUtils.teleport(player, pluginArena.getPlayerSpawnPoints().get(getPlugin().getRandom().nextInt(size))); User user = arena.getPlugin().getUserManager().getUser(player); user.resetNonePersistentStatistics(); + PrayerRegistry.getRush().remove(player); + PrayerRegistry.getBan().remove(player); ArenaUtils.updateNameTagsVisibility(player); player.setGameMode(GameMode.ADVENTURE); } From ed63aa6ff31bdf524fb570746f9ad8fd061bd514 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Tue, 8 Aug 2023 19:28:13 +0000 Subject: [PATCH 123/127] Bump version from 1.7.9-SNAPSHOT45 to 1.7.9-SNAPSHOT46 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2ca450f5..a240b778 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { } group = "plugily.projects" -version = "1.7.9-SNAPSHOT45" +version = "1.7.9-SNAPSHOT46" description = "MurderMystery" java { From 36c7b19f84f2105abdb00c570171625002c52380 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Tue, 8 Aug 2023 21:56:59 +0200 Subject: [PATCH 124/127] Added 2.0.0 CHANGELOG.md --- .github/CHANGELOG.md | 11 ++++++++++- build.gradle.kts | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index fa4bbc6c..4e129cc9 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -1,4 +1,13 @@ -### 1.8.0 Release (05.08.2021 - xx.xx.202x) +### 2.0.0 Release (08.08.2023) +* Added up to 1.20 compatibility +* Added sword skins.yml +* Added trails.yml +* Changed supported languages [https://translate.plugily.xyz] +* Changed plugin base is based on MinigamesCore [https://github.com/Plugily-Projects/MiniGamesBox] +* Changed native java building to java17, java 8 downloadable on our discord [https://discord.plugily.xyz] +* Fixed all known bugs + +### 1.8.0 Release (05.08.2021 - 2022) * Improved leaderboard command * Added murderer and detective chance placeholders to scoreboard * Now weather changing will be cancelled when a game is running diff --git a/build.gradle.kts b/build.gradle.kts index a240b778..cbd3bc52 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("plugily.projects:MiniGamesBox-Classic:1.3.0") { isTransitive = false } + implementation("plugily.projects:MiniGamesBox-Classic:1.3.1") { isTransitive = false } compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.0.1") From 94443bcd574712c4cf064e2074581986c7b55859 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Tue, 8 Aug 2023 19:58:18 +0000 Subject: [PATCH 125/127] Bump version from 1.7.9-SNAPSHOT46 to 1.7.9-SNAPSHOT47 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index cbd3bc52..c37b5387 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { } group = "plugily.projects" -version = "1.7.9-SNAPSHOT46" +version = "1.7.9-SNAPSHOT47" description = "MurderMystery" java { From 4868dc7826f41f299cb2ee22ef721c6e9a5660e0 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Tue, 8 Aug 2023 21:58:44 +0200 Subject: [PATCH 126/127] Added maven pom to .github --- .github/maven/pom.xml | 202 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 .github/maven/pom.xml diff --git a/.github/maven/pom.xml b/.github/maven/pom.xml new file mode 100644 index 00000000..7060ed67 --- /dev/null +++ b/.github/maven/pom.xml @@ -0,0 +1,202 @@ + + + + + 4.0.0 + + plugily.projects + murdermystery + 2.0.0-java8-snapshot + MurderMystery + + + 1.8 + UTF-8 + Plugily-Projects_MurderMystery + plugily-projects + https://sonarcloud.io + + + + + GNU General Public License v3 + https://www.gnu.org/licenses/gpl-3.0.en.html + + + + + + papermc + https://papermc.io/repo/repository/maven-public/ + + + plugilyprojects + https://maven.plugily.xyz/releases + + + plugilyprojects-snapshots + https://maven.plugily.xyz/snapshots + + + jitpack + https://jitpack.io + + + codemc-repo + https://repo.codemc.org/repository/maven-public/ + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + io.papermc.paper + paper-api + 1.19.1-R0.1-SNAPSHOT + provided + + + + org.jetbrains + annotations + 23.0.0 + compile + + + org.golde + corpsereborn + 2.14.0 + system + ${project.basedir}/lib/CorpseReborn.jar + + + plugily.projects + MiniGamesBox-Classic + 1.3.1 + compile + true + + + + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-site-plugin + 3.12.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + compile + + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.4.0 + + Murder Mystery API docs for v${project.version} + Minecraft survival minigame. + Be the murderer, innocent or the detective! Don't be killed during the game to win! API + documentation for hooking Murder Mystery with your plugin. + + minecraft/murdermystery + false + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.2 + + + org.apache.maven.plugins + maven-shade-plugin + 3.3.0 + + + package + + shade + + + + + com.zaxxer.hikari + plugily.projects.murdermystery.database.hikari + + + plugily.projects.minigamesbox + plugily.projects.murdermystery.minigamesbox + + + plugily.projects.commonsbox + plugily.projects.murdermystery.commonsbox + + + false + + + + + + + + plugily.projects + betty-maven-plugin + 1.0.2 + + ${project.basedir}/CHANGELOG.md + + + + + + + org.apache.maven.wagon + wagon-ssh + 3.5.2 + + + + + + plugily-projects + https://maven.plugily.xyz/releases + + + + From 1be6dc3c72ce233e18f971fcffd15154b64ce33f Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Tue, 8 Aug 2023 20:00:07 +0000 Subject: [PATCH 127/127] Bump version from 1.7.9-SNAPSHOT47 to 1.7.9-SNAPSHOT48 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index c37b5387..fe66e335 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { } group = "plugily.projects" -version = "1.7.9-SNAPSHOT47" +version = "1.7.9-SNAPSHOT48" description = "MurderMystery" java {