From 888861c4e59fd77db60c6b51b996816e397a0816 Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 8 Mar 2018 05:07:06 -0500 Subject: [PATCH] Artix QOL/Fixes Round 4 (#589) --- .../mineplex/core/common/util/UtilColor.java | 5 + .../mineplex/core/common/util/UtilPlayer.java | 96 ++++++----- .../core/account/CoreClientManager.java | 5 + .../account/repository/AccountRepository.java | 34 +++- .../core/admin/command/AdminCommands.java | 41 +++++ .../core/admin/command/SeenCommand.java | 71 ++++++++ .../core/antihack/logging/AntihackLogger.java | 49 ++++-- .../mineplex/core/bonuses/BonusManager.java | 20 ++- .../core/boosters/command/BoosterCommand.java | 24 ++- .../src/mineplex/core/chat/Chat.java | 9 +- .../core/chat/command/HelpCommand.java | 108 ++++++++++++ .../mineplex/core/command/CommandBase.java | 6 + .../mineplex/core/command/CommandCenter.java | 2 +- .../core/communities/CommunityManager.java | 96 ++++++++--- .../core/communities/CommunityMemberData.java | 12 +- .../commands/CommunityChatCommand.java | 5 + .../commands/CommunityCreateCommand.java | 26 ++- .../commands/CommunityDescriptionCommand.java | 2 +- .../commands/CommunityRenameCommand.java | 23 ++- .../storage/CommunityRepository.java | 17 +- .../mineplex/core/customdata/CorePlayer.java | 18 -- .../mineplex/core/customdata/CustomData.java | 25 --- .../core/customdata/CustomDataManager.java | 27 +-- .../core/customdata/MineplexPlayer.java | 42 ----- .../core/customdata/PlayerCustomData.java | 56 ------ .../repository/CustomDataRepository.java | 67 ++------ .../core/gadget/types/BalloonGadget.java | 2 +- .../core/gadget/types/GadgetType.java | 14 ++ .../src/mineplex/core/game/GameDisplay.java | 2 + .../mineplex/core/message/MessageManager.java | 7 + .../src/mineplex/core/poll/PollManager.java | 2 +- .../src/mineplex/core/reward/RewardType.java | 4 +- .../core/reward/rewards/GadgetReward.java | 5 + .../reward/rewards/TreasureShardReward.java | 5 + .../core/teamspeak/TeamspeakManager.java | 8 +- .../src/mineplex/core/teleport/Teleport.java | 32 ++-- .../core/treasure/TreasureSession.java | 49 +++++- .../reward/TreasureRewardManager.java | 1 + .../core/treasure/types/MythicalTreasure.java | 14 ++ .../Mineplex.Hub/src/mineplex/hub/Hub.java | 3 + .../src/mineplex/hub/player/HubPlayer.java | 21 --- .../CheckOwnsPackageCommand.java | 4 +- .../nautilus/game/arcade/ArcadeManager.java | 51 +++++- .../arcade/booster/GameBoosterManager.java | 14 +- .../arcade/command/GoToNextGameCommand.java | 2 +- .../arcade/command/ReturnToHubCommand.java | 24 +++ .../src/nautilus/game/arcade/game/Game.java | 7 + .../game/games/baconbrawl/BaconBrawl.java | 3 + .../arcade/game/games/deathtag/DeathTag.java | 3 + .../game/games/dragonescape/DragonEscape.java | 4 +- .../arcade/game/games/dragons/Dragons.java | 29 +++- .../game/games/dragons/DragonsTeams.java | 31 +++- .../game/arcade/game/games/draw/Draw.java | 4 +- .../game/games/gladiators/Gladiators.java | 3 + .../games/gladiators/hotbar/HotbarEditor.java | 11 +- .../arcade/game/games/hideseek/HideSeek.java | 51 +++--- .../game/games/minestrike/ShopManager.java | 8 +- .../game/games/mineware/BawkBawkBattles.java | 5 + .../game/games/paintball/Paintball.java | 2 + .../game/arcade/game/games/quiver/Quiver.java | 28 ++- .../arcade/game/games/sheep/SheepGame.java | 3 + .../sneakyassassins/SneakyAssassins.java | 3 + .../arcade/game/modules/HubClockModule.java | 104 +++++++++++ .../game/arcade/managers/GameHostManager.java | 10 +- .../game/arcade/managers/GameManager.java | 2 +- .../arcade/managers/GameSpectatorManager.java | 4 + .../game/arcade/managers/MiscManager.java | 161 ------------------ .../arcade/managers/NextBestGameManager.java | 37 ++-- .../game/arcade/player/ArcadePlayer.java | 29 ---- .../Models/AccountAdministrator.cs | 10 ++ .../Models/IAccountAdministrator.cs | 1 + .../Controllers/PlayerAccountController.cs | 7 + .../LOC.Website.Web/LOC.Website.Web.csproj | 16 +- Website/LOCWebsite.sln | 29 ++-- 74 files changed, 1099 insertions(+), 656 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/admin/command/AdminCommands.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/admin/command/SeenCommand.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/chat/command/HelpCommand.java delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/customdata/CorePlayer.java delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/customdata/CustomData.java delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/customdata/MineplexPlayer.java delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/customdata/PlayerCustomData.java delete mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/player/HubPlayer.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/ReturnToHubCommand.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/HubClockModule.java delete mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/MiscManager.java delete mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/player/ArcadePlayer.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilColor.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilColor.java index 77ecb995a..323b80dba 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilColor.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilColor.java @@ -116,6 +116,11 @@ public class UtilColor return ChatColor.WHITE; } } + + public static String chatColorToJsonColor(ChatColor chatColor) + { + return chatColor.name().toLowerCase(); + } public static Vector colorToVector(Color color) { diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java index 28dde50b4..fd35426e0 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java @@ -15,6 +15,7 @@ import java.util.Set; import java.util.UUID; import java.util.function.BiConsumer; import java.util.function.Function; +import java.util.regex.Pattern; import java.util.stream.Collectors; import net.md_5.bungee.api.chat.ClickEvent; @@ -57,7 +58,7 @@ import mineplex.core.common.MinecraftVersion; public class UtilPlayer { private static Random RANDOM = new Random(); - + // A mapping of player names (Keys) to the system time when they last changed active Hotbar Slot private static Map _hotbarUpdates = new HashMap<>(); @@ -70,6 +71,9 @@ public class UtilPlayer // The amount of time (in milliseconds) after changin hotbars that you can block public static final long BLOCKING_HOTBAR_DELAY = 100; + // Regex used to match player names + private static final Pattern USERNMAME_PATTERN = Pattern.compile("^([A-Za-z0-9_]{1,16}|\\$)$"); + private static boolean hasIntersection(Vector3D p1, Vector3D p2, Vector3D min, Vector3D max) { final double epsilon = 0.0001f; @@ -95,20 +99,20 @@ public class UtilPlayer return true; } - + public static void setSpectating(Player player, Entity ent) { if(!ent.isValid()) return; - + player.setGameMode(GameMode.SPECTATOR); - + if(player.getSpectatorTarget() != null) { player.setSpectatorTarget(null); } - + player.teleport(ent); - + if(isTracked(player, ent)) { player.setSpectatorTarget(ent); @@ -124,7 +128,7 @@ public class UtilPlayer }.runTaskLater(UtilServer.getPlugin(), 1); } } - + /** * Returns true if the given player is tracking the given target, meaning that the player * got the entity loaded and knows about the entity. @@ -253,15 +257,15 @@ public class UtilPlayer * changed hotbar slots (within {@value BLOCKING_HOTBAR_DELAY} milliseconds), false otherwise. */ public static boolean isBlocking(Player player) - { - String name = player.getName(); + { + String name = player.getName(); long lastUpdate = _hotbarUpdates.containsKey(name) ? _hotbarUpdates.get(name) : 0;; long duration = System.currentTimeMillis() - lastUpdate; - + return player.isBlocking();// && UtilItem.isSword(player.getItemInHand()) - //&& duration >= BLOCKING_HOTBAR_DELAY; + //&& duration >= BLOCKING_HOTBAR_DELAY; } - + /** * Mark the {@code player} as having changed hotbar slots. * @param player - the player to be marked @@ -270,12 +274,12 @@ public class UtilPlayer { _hotbarUpdates.put(player.getName(), System.currentTimeMillis()); } - + /** * AviodAllies doesn't work. Leaving as a param as it sounds like something you may want in the future. */ public static Entity getEntityInSight(Player player, int rangeToScan, boolean avoidAllies, boolean avoidNonLiving, - boolean lineOfSight, float expandBoxesPercentage) + boolean lineOfSight, float expandBoxesPercentage) { Location observerPos = player.getEyeLocation(); Vector3D observerDir = new Vector3D(observerPos.getDirection()); @@ -412,7 +416,7 @@ public class UtilPlayer } public static void searchOffline(List matches, final Callback callback, final Player caller, - final String player, final boolean inform) + final String player, final boolean inform) { // No / Non-Unique if (matches.size() != 1) @@ -516,7 +520,7 @@ public class UtilPlayer return nearbyMap; } - + public static Player getClosest(Location loc, Collection ignore) { return getClosest(loc, -1, ignore); @@ -543,7 +547,7 @@ public class UtilPlayer continue; double dist = UtilMath.offsetSquared(cur.getLocation(), loc); - + if (maxDist > 0 && dist > maxDist) { continue; @@ -558,7 +562,7 @@ public class UtilPlayer return best; } - + public static Player getClosest(Location loc, Entity... ignore) { return getClosest(loc, -1, ignore); @@ -594,13 +598,13 @@ public class UtilPlayer break; } } - + if (shouldIgnore) continue; } double dist = UtilMath.offsetSquared(cur.getLocation(), loc); - + if (maxDist > 0 && dist > maxDist) { continue; @@ -633,7 +637,7 @@ public class UtilPlayer if (log) System.out.println("Kicked Client [" + player.getName() + "] for [" + module + " - " + message + "]"); } - + public static void kick(Collection players, String module, String message, boolean log) { for (Player player : players) @@ -778,9 +782,9 @@ public class UtilPlayer return ((CraftPlayer) player).getHandle().spectating; return false; } - + public static InventoryView swapToInventory(Player player, Inventory inv) { - + EntityPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); if (nmsPlayer.activeContainer != nmsPlayer.defaultContainer) { @@ -790,9 +794,9 @@ public class UtilPlayer } return player.openInventory(inv); } - + /* - public void setListName(Player player, CoreClient client) + public void setListName(Player player, CoreClient client) { StringBuilder playerNameBuilder = new StringBuilder(); @@ -820,7 +824,7 @@ public class UtilPlayer player.setPlayerListName(playerName); } */ - + public static Location getTargetLocation(Player player, double distance) { Vector looking = player.getLocation().getDirection().clone(); @@ -885,7 +889,7 @@ public class UtilPlayer * Sets the world border red screen for a player * @param player * @param warningDistance - */ + */ public static void sendRedScreen(Player player, int warningDistance) { WorldBorder worldBorder = WORLD_BORDERS.computeIfAbsent(player.getUniqueId(), uuid -> new WorldBorder()); @@ -901,7 +905,7 @@ public class UtilPlayer * Checks if player has a WorldBorder object stored * @param player * @return true if WorldBorder object is stored for that player - */ + */ public static boolean hasWorldBorder(Player player) { return WORLD_BORDERS.containsKey(player.getUniqueId()); @@ -910,7 +914,7 @@ public class UtilPlayer /** * Removes player from world border map * @param player - */ + */ public static void removeWorldBorder(Player player) { if (hasWorldBorder(player)) @@ -920,11 +924,11 @@ public class UtilPlayer } } - public static MinecraftVersion getVersion(Player player) + public static MinecraftVersion getVersion(Player player) { if (is1_9(player)) return MinecraftVersion.Version1_9; - + return MinecraftVersion.Version1_8; } @@ -988,16 +992,16 @@ public class UtilPlayer return isInAir(player, minAir, excludeSet); } - + /** * Check if the player is at least the specified amount of blocks in the air * while provided block types are ignored. - * + * * @param player The Player to check * @param minAir The min amount of Blocks to count as in the air * @param exclude that are being ignored and count as Air - * - * @return if the Player is in the air + * + * @return if the Player is in the air */ public static boolean isInAir(Player player, int minAir, Set exclude) { @@ -1034,9 +1038,9 @@ public class UtilPlayer * @param viewDisplayText Optional The text displayed when hovering over VIEW */ public static void sendAcceptOrDeny(Player player, String header, - String acceptCommand, String acceptDisplayText, - String declineCommand, String declineDisplayText, - String viewCommand, String viewDisplayText) + String acceptCommand, String acceptDisplayText, + String declineCommand, String declineDisplayText, + String viewCommand, String viewDisplayText) { TextComponent textComponent = new TextComponent(F.main(header, "Reply: ")); @@ -1045,7 +1049,7 @@ public class UtilPlayer accept.setBold(true); accept.setClickEvent(new ClickEvent(Action.RUN_COMMAND, acceptCommand)); accept.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{ - new TextComponent(acceptDisplayText) + new TextComponent(acceptDisplayText) })); textComponent.addExtra(accept); @@ -1056,7 +1060,7 @@ public class UtilPlayer deny.setBold(true); deny.setClickEvent(new ClickEvent(Action.RUN_COMMAND, declineCommand)); deny.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{ - new TextComponent(declineDisplayText) + new TextComponent(declineDisplayText) })); textComponent.addExtra(deny); @@ -1072,7 +1076,7 @@ public class UtilPlayer if(viewDisplayText != null) { view.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{ - new TextComponent(viewDisplayText) + new TextComponent(viewDisplayText) })); } textComponent.addExtra(view); @@ -1215,4 +1219,14 @@ public class UtilPlayer { return ((CraftPlayer) player).getHandle().getProtocol(); } + + /** + * Returns whether a given string is valid as a player's username. + * @param playerName - The name of the player + * @return Whether this name is synatactically valid. If this returns true it does not necessarily mean they exist. + */ + public static boolean isValidName(String playerName) + { + return USERNMAME_PATTERN.matcher(playerName).matches(); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java index 6406d249a..7e352124c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java @@ -885,4 +885,9 @@ public class CoreClientManager extends MiniPlugin { _loginProcessors.add(processor); } + + public void loadLastLogin(int accountId, Consumer lastLogin) + { + _repository.loadLastLogin(accountId, lastLogin); + } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java index cbfb7a1c5..caf960140 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java @@ -1,6 +1,7 @@ package mineplex.core.account.repository; import java.sql.Connection; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -17,6 +18,7 @@ import java.util.function.Consumer; import java.util.stream.Collectors; import org.apache.commons.dbcp2.BasicDataSource; +import org.bukkit.Bukkit; import com.google.gson.reflect.TypeToken; @@ -51,6 +53,8 @@ public class AccountRepository extends MinecraftRepository private static String SELECT_ACCOUNT_UUID_BY_ID = "SELECT uuid FROM accounts WHERE id=?;"; private static String SELECT_ACCOUNT_ID_BY_UUID = "SELECT id FROM accounts WHERE accounts.uuid = ? LIMIT 1"; + private static final String SELECT_LAST_LOGIN_BY_ID = "SELECT lastLogin FROM accounts WHERE id = ?"; + public AccountRepository() { super(DBPool.getAccount()); @@ -456,4 +460,32 @@ public class AccountRepository extends MinecraftRepository { return handleSyncMSSQLCallStream("PlayerAccount/GetAccount", playerName); } -} \ No newline at end of file + + public void loadLastLogin(int accountId, Consumer lastLogin) + { + UtilServer.runAsync(() -> + { + try (Connection connection = DBPool.getAccount().getConnection(); + PreparedStatement statement = connection.prepareStatement(SELECT_LAST_LOGIN_BY_ID)) + { + statement.setInt(1, accountId); + + try (ResultSet resultSet = statement.executeQuery()) + { + if (resultSet.next()) + { + lastLogin.accept(resultSet.getTimestamp("lastLogin").getTime()); + } + else + { + lastLogin.accept(null); + } + } + } + catch (SQLException ex) + { + lastLogin.accept(null); + } + }); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/admin/command/AdminCommands.java b/Plugins/Mineplex.Core/src/mineplex/core/admin/command/AdminCommands.java new file mode 100644 index 000000000..0278a7273 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/admin/command/AdminCommands.java @@ -0,0 +1,41 @@ +package mineplex.core.admin.command; + +import mineplex.core.MiniPlugin; +import mineplex.core.account.CoreClientManager; +import mineplex.core.account.permissions.Permission; +import mineplex.core.account.permissions.PermissionGroup; + +public class AdminCommands extends MiniPlugin +{ + private CoreClientManager _coreClientManager; + + public enum Perm implements Permission + { + SEEN_COMMAND + } + + public AdminCommands() + { + super("Staff"); + + _coreClientManager = require(CoreClientManager.class); + + generatePermissions(); + } + + public CoreClientManager getCoreClientManager() + { + return _coreClientManager; + } + + public void generatePermissions() + { + PermissionGroup.TRAINEE.setPermission(Perm.SEEN_COMMAND, true, true); + } + + @Override + public void addCommands() + { + addCommand(new SeenCommand(this)); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/admin/command/SeenCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/admin/command/SeenCommand.java new file mode 100644 index 000000000..b895ad2a9 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/admin/command/SeenCommand.java @@ -0,0 +1,71 @@ +package mineplex.core.admin.command; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import mineplex.core.command.CommandBase; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; + +public class SeenCommand extends CommandBase +{ + public SeenCommand(AdminCommands plugin) + { + super(plugin, AdminCommands.Perm.SEEN_COMMAND, "seen", "lastlogin"); + } + + private void help(Player caller) + { + reply(caller, "Usage: " + F.elem("/seen ")); + } + + @Override + public void Execute(Player caller, String[] args) + { + if (args.length != 1) + { + help(caller); + return; + } + + String target = args[0]; + + if (!UtilPlayer.isValidName(target)) + { + reply(caller, "That name isn't valid! Try again?"); + } + + if (target.equalsIgnoreCase(caller.getName())) + { + reply(caller, "I see you right now! Is this a trick?"); + return; + } + + if (Bukkit.getPlayerExact(target) != null) + { + reply(caller, "They're on this server, right now! Have you no eyes?"); + return; + } + + Plugin.getCoreClientManager().getOrLoadClient(target, (client) -> + { + if (client == null) + { + reply(caller, "The player " + F.name(target) + " was not found."); + return; + } + + Plugin.getCoreClientManager().loadLastLogin(client.getAccountId(), (lastLogin) -> + { + if (lastLogin == null) + { + reply(caller, "Unable to load that player's last login. Try again later?"); + return; + } + + reply(caller, "The player " + F.name(target) + " last logged in at " + F.elem(UtilTime.when(lastLogin))); + }); + }); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/logging/AntihackLogger.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/logging/AntihackLogger.java index ccf52f95f..569fc559a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/logging/AntihackLogger.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/logging/AntihackLogger.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.Map; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerQuitEvent; @@ -30,13 +31,17 @@ import mineplex.core.antihack.logging.builtin.PlayerInfoMetadata; import mineplex.core.antihack.logging.builtin.ServerInfoMetadata; import mineplex.core.antihack.logging.builtin.ViolationInfoMetadata; import mineplex.core.command.CommandBase; +import mineplex.core.common.jsonchat.ClickEvent; +import mineplex.core.common.jsonchat.JsonMessage; import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilColor; import mineplex.core.common.util.UtilPlayer; @ReflectivelyCreateMiniPlugin public class AntihackLogger extends MiniPlugin { public static final Gson GSON = new Gson(); + private final static String READABLE_NAME = "GWEN"; public enum Perm implements Permission { @@ -76,23 +81,37 @@ public class AntihackLogger extends MiniPlugin @Override public void Execute(Player caller, String[] args) { - if (args.length == 1) + if (args.length != 1) { - Player player = Bukkit.getPlayer(args[0]); - if (player != null) + UtilPlayer.message(caller, F.main(READABLE_NAME, "Usage: " + F.elem("/smeta "))); + return; + } + + Player player = Bukkit.getPlayer(args[0]); + if (player != null) + { + JsonObject custom = new JsonObject(); + custom.addProperty("is-test-metadata", true); + String id = AntiHack.generateId(); + saveMetadata(player, id, () -> { - JsonObject custom = new JsonObject(); - custom.addProperty("is-test-metadata", true); - String id = AntiHack.generateId(); - saveMetadata(player, id, () -> - { - UtilPlayer.message(caller, F.main(getName(), "Saved metadata for " + player.getName() + " with id " + id)); - }, custom); - } - else - { - UtilPlayer.message(caller, F.main(getName(), "That player doesn't exist!")); - } + new JsonMessage(READABLE_NAME + "> ") + .color(UtilColor.chatColorToJsonColor(ChatColor.BLUE)) + .extra("Saved metadata for ") + .color(UtilColor.chatColorToJsonColor(ChatColor.GRAY)) + .extra(player.getName()) + .color(UtilColor.chatColorToJsonColor(ChatColor.YELLOW)) + .extra(" with id ") + .color(UtilColor.chatColorToJsonColor(ChatColor.GRAY)) + .extra(id) + .color(UtilColor.chatColorToJsonColor(ChatColor.GREEN)) + .click(ClickEvent.OPEN_URL, String.format("https://frozor.io/gwen/meta/%s", id)) + .sendToPlayer(caller); + }, custom); + } + else + { + UtilPlayer.message(caller, F.main(READABLE_NAME, "That player doesn't exist!")); } } }); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusManager.java b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusManager.java index 3630c52a3..c4f96d9df 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusManager.java @@ -690,18 +690,30 @@ public class BonusManager extends MiniClientPlugin implements I BonusClientData client = Get(player); int streak = client.getDailyStreak(); + // Increase the multiplier by 5 for each day + // in the player's streak, until they reach + // 200 (aka 40 days) int multiplier = Math.min(200, 5 * streak); - if (streak >= 40) multiplier += (1 * (streak - 40)); + + // Once they reach 40 days (the 200 cap from + // above), begin adding 1 per day instead of 5. + if (streak >= 40) + { + multiplier += (1 * (streak - 40)); + } + return multiplier; } public int getVoteMultiplier(int streak) { int multiplier = Math.min(100, 5 * streak); + if (streak >= 20) { multiplier += (1 * (streak - 40)); } + return multiplier; } @@ -710,9 +722,9 @@ public class BonusManager extends MiniClientPlugin implements I double mult = getDailyMultiplier(player) / 100.0; BonusAmount amount = new BonusAmount(); - int shards = 100; - int gems = 100; - int experience = 250; + int shards = 200; + int gems = 200; + int experience = 350; amount.setShards(shards); amount.setGems(gems); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/boosters/command/BoosterCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/boosters/command/BoosterCommand.java index c4f64670b..bc4eac0a4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/boosters/command/BoosterCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/boosters/command/BoosterCommand.java @@ -3,20 +3,27 @@ package mineplex.core.boosters.command; import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import mineplex.core.account.CoreClientManager; import mineplex.core.boosters.BoosterManager; import mineplex.core.command.MultiCommandBase; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import static mineplex.core.Managers.require; + /** * @author Shaun Bennett */ public class BoosterCommand extends MultiCommandBase { + CoreClientManager _coreClientManager; + public BoosterCommand(BoosterManager plugin) { super(plugin, BoosterManager.Perm.BOOSTER_COMMAND, "amplifier"); + _coreClientManager = require(CoreClientManager.class); + AddCommand(new AddCommand(plugin)); AddCommand(new GuiCommand(plugin)); AddCommand(new ReloadCommand(plugin)); @@ -26,8 +33,19 @@ public class BoosterCommand extends MultiCommandBase @Override protected void Help(Player caller, String[] args) { - UtilPlayer.message(caller, F.help("amplifier add ", "Add an amplifier to that group", ChatColor.DARK_RED)); - UtilPlayer.message(caller, F.help("amplifier gui", "Open Amplifier GUI", ChatColor.DARK_RED)); - UtilPlayer.message(caller, F.help("amplifier thank ", "Thank an Amplifier for a specific Booster Group", ChatColor.WHITE)); + if (_coreClientManager.Get(caller).hasPermission(BoosterManager.Perm.ADD_BOOSTER_COMMAND)) + { + UtilPlayer.message(caller, F.help("amplifier add ", "Add an amplifier to that group", ChatColor.DARK_RED)); + } + + if (_coreClientManager.Get(caller).hasPermission(BoosterManager.Perm.BOOSTER_GUI_COMMAND)) + { + UtilPlayer.message(caller, F.help("amplifier gui", "Open Amplifier GUI", ChatColor.DARK_RED)); + } + + if (_coreClientManager.Get(caller).hasPermission(BoosterManager.Perm.THANK_COMMAND)) + { + UtilPlayer.message(caller, F.help("amplifier thank ", "Thank an Amplifier for a specific Booster Group", ChatColor.WHITE)); + } } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/chat/Chat.java b/Plugins/Mineplex.Core/src/mineplex/core/chat/Chat.java index 6ec7d54ed..5bf616d5b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/chat/Chat.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/chat/Chat.java @@ -42,6 +42,7 @@ import mineplex.core.account.permissions.PermissionGroup; import mineplex.core.achievement.AchievementManager; import mineplex.core.chat.command.BroadcastCommand; import mineplex.core.chat.command.ChatSlowCommand; +import mineplex.core.chat.command.HelpCommand; import mineplex.core.chat.command.SilenceCommand; import mineplex.core.common.util.C; import mineplex.core.common.util.F; @@ -49,6 +50,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilTime; +import mineplex.core.communities.CommunityManager; import mineplex.core.incognito.IncognitoManager; import mineplex.core.preferences.Preference; import mineplex.core.preferences.PreferencesManager; @@ -70,6 +72,7 @@ public class Chat extends MiniPlugin SILENCE_COMMAND, SLOW_CHAT_COMMAND, BROADCAST_COMMAND, + HELP_COMMAND } private CoreClientManager _clientManager; @@ -127,6 +130,7 @@ public class Chat extends MiniPlugin PermissionGroup.ADMIN.setPermission(Perm.SILENCE_COMMAND, true, true); PermissionGroup.SRMOD.setPermission(Perm.SLOW_CHAT_COMMAND, true, true); PermissionGroup.MOD.setPermission(Perm.BROADCAST_COMMAND, true, true); + PermissionGroup.PLAYER.setPermission(Perm.HELP_COMMAND, true, true); } @Override @@ -135,6 +139,7 @@ public class Chat extends MiniPlugin addCommand(new SilenceCommand(this)); addCommand(new BroadcastCommand(this)); addCommand(new ChatSlowCommand(this)); + addCommand(new HelpCommand(this)); } public void setChatSlow(int seconds, boolean inform) @@ -359,7 +364,9 @@ public class Chat extends MiniPlugin Player sender = event.getPlayer(); - if (_incognitoManager != null && _incognitoManager.Get(sender).Status && !UtilServer.isTestServer()) + if (_incognitoManager != null && _incognitoManager.Get(sender).Status + && !event.getMessage().startsWith(CommunityManager.CHAT_PREFIX) + && !UtilServer.isTestServer()) { UtilPlayer.message(sender, C.cYellow + "You can not chat while incognito."); event.setCancelled(true); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/chat/command/HelpCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/chat/command/HelpCommand.java new file mode 100644 index 000000000..7c5f11cb3 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/chat/command/HelpCommand.java @@ -0,0 +1,108 @@ +package mineplex.core.chat.command; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import mineplex.core.account.permissions.Permission; +import mineplex.core.chat.Chat; +import mineplex.core.command.CommandBase; +import mineplex.core.common.jsonchat.ClickEvent; +import mineplex.core.common.jsonchat.HoverEvent; +import mineplex.core.common.jsonchat.JsonMessage; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilColor; +import mineplex.core.common.util.UtilText; + +public class HelpCommand extends CommandBase +{ + + public HelpCommand(Chat plugin) + { + super(plugin, Chat.Perm.HELP_COMMAND, "help", "?", "pleasehelpmeiamgoingtoexplode"); + } + + private void sendMain(Player caller, String message) + { + caller.sendMessage(F.main("Help", message)); + } + + private void sendSingle(Player caller, String message) + { + caller.sendMessage(F.main("", message)); + } + + private JsonMessage getSingleStart(String before) + { + return new JsonMessage(C.cBlue + "> ") + .extra(before) + .color(C.cGray); + } + + private void sendUrl(Player caller, String before, String clickText, ChatColor clickTextColor, String url, String hoverText) + { + getSingleStart(before) + .color(UtilColor.chatColorToJsonColor(ChatColor.GRAY)) + .extra(clickText) + .color(UtilColor.chatColorToJsonColor(clickTextColor)) + .click(ClickEvent.OPEN_URL, url) + .hover(HoverEvent.SHOW_TEXT, hoverText) + .sendToPlayer(caller); + } + + private void sendFaq(Player caller) + { + sendUrl(caller, + "Check out ", + "our FAQ for commonly asked questions", ChatColor.YELLOW, + "http://www.mineplex.com/faq", + C.cYellow + "Click to visit our FAQ page!"); + } + + private void sendRules(Player caller) + { + sendUrl(caller, + "Read ", + "our rules to avoid being punished!", ChatColor.YELLOW, + "http://www.mineplex.com/rules", + C.cYellow + "Click to visit our rules page!"); + } + + private void sendTrainee(Player caller) + { + sendUrl(caller, + "Want to apply for Trainee? Visit ", + "apply.mineplex.com" + C.cGray + "!", ChatColor.YELLOW, + "http://apply.mineplex.com", + C.cDAqua + "Click to visit our forums to learn about Trainee!"); + } + + private void sendSupport(Player caller) + { + sendUrl(caller, + "Question about a purchase? Contact support at ", + "mineplex.com/support" + C.cGray + "!", ChatColor.YELLOW, + "http://www.mineplex.com/support", + C.cYellow + "Click to visit our support page!"); + } + + private void sendTwitter(Player caller) + { + sendUrl(caller, + "Find us on twitter at ", + "@Mineplex", ChatColor.AQUA, + "https://twitter.com/Mineplex", + C.cAqua + "Click to visit our twitter!"); + } + + @Override + public void Execute(Player caller, String[] args) + { + sendMain(caller, "Hi there! Need some help?"); + sendFaq(caller); + sendRules(caller); + sendTrainee(caller); + sendSupport(caller); + sendTwitter(caller); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/command/CommandBase.java b/Plugins/Mineplex.Core/src/mineplex/core/command/CommandBase.java index a31c04e1e..84c9230e9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/command/CommandBase.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/command/CommandBase.java @@ -16,6 +16,7 @@ import org.bukkit.entity.Player; import mineplex.core.MiniPlugin; import mineplex.core.PlayerSelector; import mineplex.core.account.permissions.Permission; +import mineplex.core.common.util.F; import mineplex.core.common.util.UtilLambda; import mineplex.core.recharge.Recharge; @@ -60,6 +61,11 @@ public abstract class CommandBase implements ICom Recharge.Instance.recharge(caller, "Command"); } + protected void reply(Player caller, String message) + { + caller.sendMessage(F.main(Plugin.getName(), message)); + } + @Override public List onTabComplete(CommandSender sender, String commandLabel, String[] args) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/command/CommandCenter.java b/Plugins/Mineplex.Core/src/mineplex/core/command/CommandCenter.java index 5806b7763..c77060419 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/command/CommandCenter.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/command/CommandCenter.java @@ -40,7 +40,7 @@ public class CommandCenter implements Listener, IPacketHandler protected JavaPlugin Plugin; protected CoreClientManager ClientManager; protected static NautHashMap Commands; - private final List BLOCKED_COMMANDS = Lists.newArrayList("pl", "plugins", "ver", "version", "icanhasbukkit", "about", "?", "help"); + private final List BLOCKED_COMMANDS = Lists.newArrayList("pl", "plugins", "ver", "version", "icanhasbukkit", "about"); private final String MESSAGE = C.cRed + "I'm sorry, but you do not have permission to perform this command. Please contact the server administrators if you believe that this is in error."; private final PacketHandler _packetHandler = Managers.require(PacketHandler.class); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityManager.java b/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityManager.java index 192795043..4f68b2435 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityManager.java @@ -3,21 +3,20 @@ package mineplex.core.communities; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Objects; import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; import java.util.regex.Pattern; import java.util.stream.Collectors; -import com.google.common.collect.Sets; - import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -33,6 +32,7 @@ import mineplex.core.account.CoreClientManager; import mineplex.core.account.ILoginProcessor; import mineplex.core.account.permissions.Permission; import mineplex.core.account.permissions.PermissionGroup; +import mineplex.core.chat.Chat; import mineplex.core.common.jsonchat.ClickEvent; import mineplex.core.common.jsonchat.JsonMessage; import mineplex.core.common.util.C; @@ -66,6 +66,7 @@ import mineplex.core.communities.redis.CommunityUpdateNameHandler; import mineplex.core.communities.redis.CommunityUpdateSetting; import mineplex.core.communities.redis.CommunityUpdateSettingHandler; import mineplex.core.communities.storage.CommunityRepository; +import mineplex.core.customdata.CustomDataManager; import mineplex.core.preferences.Preference; import mineplex.core.preferences.PreferencesManager; import mineplex.core.recharge.Recharge; @@ -101,11 +102,16 @@ public class CommunityManager extends MiniDbClientPlugin COMMUNITY_UNINVITE_COMMAND, COMMUNITY_UNINVITE_STAFF_COMMAND, } - + + public final static String CHAT_PREFIX = "!"; + public final static String COMMUNITY_CHAT_KEY = "core.communities.chat.selected"; + public final static int MAX_NAME_LENGTH = 15; + private final int UPDATE_CYCLE_SECONDS = 10; // The number of seconds between dirty communities refreshes private final int CACHE_INVALIDATION_SECONDS = 300; // The number of seconds between full communities refreshes - public final Pattern ALPHA_NUMERIC_PATTERN = Pattern.compile("[^A-Za-z0-9]"); - public final String[] BLOCKED_NAMES = new String[] {"help", "chat", "create", "description", "disband", "invite", "join", "mcs", "rename", "uninvite", "trainee", "mod", "moderator", "srmod", "seniormod", "seniormoderator", "builder", "maplead", "twitch", "youtube", "support", "admin", "administrator", "leader", "dev", "developer", "owner", "party", "mineplex", "mineplexOfficial", "staff", "mineplexstaff", "qualityassurance", "traineemanagement", "modcoordination", "forumninja", "communitymanagement", "event", "socialmedia"}; + public final Pattern VALID_NAME_PATTERN = Pattern.compile("^[A-Za-z0-9]{1," + MAX_NAME_LENGTH + "}$"); + public final Pattern NON_ALPHANUMERIC_PATTERN = Pattern.compile("[^A-Za-z0-9]"); + public final List BLOCKED_NAMES = Arrays.asList("help", "chat", "create", "description", "disband", "invite", "join", "mcs", "rename", "uninvite", "trainee", "mod", "moderator", "srmod", "seniormod", "seniormoderator", "builder", "maplead", "twitch", "youtube", "support", "admin", "administrator", "leader", "dev", "developer", "owner", "party", "mineplex", "mineplexofficial", "staff", "mineplexstaff", "qualityassurance", "traineemanagement", "modcoordination", "forumninja", "communitymanagement", "event", "socialmedia"); private final CommunityRepository _repo; private final Map _loadedCommunities; @@ -123,6 +129,7 @@ public class CommunityManager extends MiniDbClientPlugin private volatile boolean _cycling = false; private final CoreClientManager _clientManager; + private final CustomDataManager _customDataManager; @SuppressWarnings("deprecation") private CommunityManager() @@ -135,7 +142,7 @@ public class CommunityManager extends MiniDbClientPlugin _us = _plugin.getConfig().getBoolean("serverstatus.us"); _repo = new CommunityRepository(_plugin, statusRepo, _us); - + _loadedCommunities = new ConcurrentHashMap<>(); runAsync(() -> @@ -145,6 +152,10 @@ public class CommunityManager extends MiniDbClientPlugin }); _clientManager = require(CoreClientManager.class); + _customDataManager = require(CustomDataManager.class); + + _customDataManager.getRepository().registerKey(COMMUNITY_CHAT_KEY); + _clientManager.addStoredProcedureLoginProcessor(new ILoginProcessor() { @Override @@ -261,9 +272,24 @@ public class CommunityManager extends MiniDbClientPlugin PermissionGroup.ADMIN.setPermission(Perm.COMMUNITY_UNINVITE_STAFF_COMMAND, true, true); } - public void communityExists(String name, Runnable onTrue, Runnable onFalse) + public CustomDataManager getCustomDataManager() { - _repo.communityExists(name, onTrue, onFalse); + return _customDataManager; + } + + public boolean isNameValid(String communityName) + { + return VALID_NAME_PATTERN.matcher(communityName).find(); + } + + public boolean isNameAllowed(Player caller, String communityName) + { + return !Managers.get(Chat.class).getFilteredMessage(caller, communityName).contains("*"); + } + + public void communityExists(String name, Consumer result) + { + _repo.communityExists(name, result); } public boolean ownsCommunity(UUID uuid) @@ -466,7 +492,7 @@ public class CommunityManager extends MiniDbClientPlugin Get(Bukkit.getPlayer(targetUUID)).Invites.add(community.getId()); if (Managers.get(PreferencesManager.class).get(Bukkit.getPlayer(targetUUID)).isActive(Preference.COMMUNITY_INVITES)) { - new JsonMessage(F.main(getName(), "You have been invited to join " + F.elem(community.getName()) + " by " + F.name(sender) + "! Click to join!")).click(ClickEvent.RUN_COMMAND, "/community join " + community.getName()).sendToPlayer(Bukkit.getPlayer(targetUUID)); + new JsonMessage(F.main(getName(), "You have been invited to join " + F.elem(community.getName()) + " by " + F.name(sender) + "! " + C.cGreen + "Click this message to join!")).click(ClickEvent.RUN_COMMAND, "/community join " + community.getName()).sendToPlayer(Bukkit.getPlayer(targetUUID)); } UtilServer.CallEvent(new CommunityMemberDataUpdateEvent(Bukkit.getPlayer(targetUUID))); @@ -871,34 +897,66 @@ public class CommunityManager extends MiniDbClientPlugin @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onChat(AsyncPlayerChatEvent event) { - if (!event.getMessage().startsWith("!")) + if (!event.getMessage().startsWith(CHAT_PREFIX)) { return; } + event.setCancelled(true); + Player sender = event.getPlayer(); - if (Get(sender).getCommunityChattingTo() != -1) + + CommunityMemberData memberData = Get(sender); + + // If the player does not have a specified community to chat to... + if (memberData.getCommunityChattingTo() == -1) { - Community target = _loadedCommunities.get(Get(sender).getCommunityChattingTo()); - if (target == null || !target.getMembers().containsKey(event.getPlayer().getUniqueId())) + // And they are only in a single community... + if (memberData.getTotalCommunities() == 1) { - UtilPlayer.message(sender, F.main(getName(), "You are not in that community! Use " + F.elem("/com chat ") + " to select a new community to chat to!")); + // Set that as the one they are chatting to. + memberData.setCommunityChattingTo(memberData.getCommunities().get(0)); } else { - if (Recharge.Instance.use(sender, "Community Chat to " + target.getId(), target.getChatDelay(), false, false)) + int savedChattingTo = _customDataManager.getData(sender, COMMUNITY_CHAT_KEY); + + if (savedChattingTo != -1) { - new CommunityChat(sender.getName(), target.getId(), event.getMessage().substring(1)).publish(); + memberData.setCommunityChattingTo(savedChattingTo); } else { - UtilPlayer.message(sender, F.main(getName(), "You cannot chat to " + F.name(target.getName()) + " that quickly!")); + UtilPlayer.message(sender, F.main(getName(), "You are not chatting to a specific community! Use " + F.elem("/com chat ") + " to select a community to chat to.")); + return; } } } + + String newMessage = event.getMessage().substring(1).trim(); + + if (newMessage.length() == 0) + { + UtilPlayer.message(sender, F.main(getName(), "You can't send an empty message.")); + return; + } + + Community target = _loadedCommunities.get(memberData.getCommunityChattingTo()); + + if (target == null || !target.getMembers().containsKey(event.getPlayer().getUniqueId())) + { + UtilPlayer.message(sender, F.main(getName(), "You are not in that community! Use " + F.elem("/com chat ") + " to select a new community to chat to!")); + } else { - UtilPlayer.message(sender, F.main(getName(), "You are not chatting to a specific community! Use " + F.elem("/com chat ") + " to select a community to chat to.")); + if (Recharge.Instance.use(sender, "Community Chat to " + target.getId(), target.getChatDelay(), false, false)) + { + new CommunityChat(sender.getName(), target.getId(), newMessage).publish(); + } + else + { + UtilPlayer.message(sender, F.main(getName(), "You cannot chat to " + F.name(target.getName()) + " that quickly!")); + } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityMemberData.java b/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityMemberData.java index 99a1de9e4..fdc131801 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityMemberData.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityMemberData.java @@ -18,10 +18,9 @@ public class CommunityMemberData public final List Invites = new ArrayList<>(); private int _chattingTo = -1; - + public CommunityMemberData() { - } public int getTotalCommunities() @@ -38,10 +37,15 @@ public class CommunityMemberData { return _chattingTo; } - + + public void setCommunityChattingTo(int id) + { + _chattingTo = id; + } + public void setCommunityChattingTo(Community community) { - _chattingTo = community.getId(); + setCommunityChattingTo(community.getId()); } Set getCommunityIds() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityChatCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityChatCommand.java index 8efbc10a0..e19c067dc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityChatCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityChatCommand.java @@ -11,6 +11,7 @@ import mineplex.core.communities.CommunityManager; public class CommunityChatCommand extends CommandBase { + public CommunityChatCommand(CommunityManager plugin) { super(plugin, CommunityManager.Perm.COMMUNITY_CHAT_COMMAND, "chat"); @@ -36,6 +37,10 @@ public class CommunityChatCommand extends CommandBase return; } UtilPlayer.message(caller, F.main(Plugin.getName(), "You are now chatting to " + F.name(c.getName()) + "! Use " + F.elem("!") + " before your message to use community chat!")); + + Plugin.getCustomDataManager().Get(caller).put(CommunityManager.COMMUNITY_CHAT_KEY, c.getId()); + Plugin.getCustomDataManager().saveData(caller); + Plugin.Get(caller).setCommunityChattingTo(c); } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityCreateCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityCreateCommand.java index 93d69633c..5d4e52235 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityCreateCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityCreateCommand.java @@ -29,37 +29,47 @@ public class CommunityCreateCommand extends CommandBase UtilPlayer.message(caller, F.help("/com create ", "Creates a new community", ChatColor.DARK_AQUA)); return; } + if (Plugin.Get(caller).ownsCommunity()) { UtilPlayer.message(caller, F.main(Plugin.getName(), "You already own a community!")); return; } - if (args[0].length() > 15 || Plugin.ALPHA_NUMERIC_PATTERN.matcher(args[0]).find()) + + String communityName = args[0]; + + if (!Plugin.isNameValid(communityName)) { UtilPlayer.message(caller, F.main(Plugin.getName(), "A community name cannot be longer than 15 characters and must be alphanumeric!")); return; } - if (Arrays.asList(Plugin.BLOCKED_NAMES).contains(args[0].toLowerCase())) + + if (Plugin.BLOCKED_NAMES.contains(communityName.toLowerCase())) { UtilPlayer.message(caller, F.main(Plugin.getName(), "That name is not allowed!")); return; } + final int accountId = Managers.get(CoreClientManager.class).getAccountId(caller); final String senderName = Managers.get(CoreClientManager.class).Get(caller).getName(); + Plugin.runAsync(() -> { - Plugin.communityExists(args[0], () -> // onTrue + Plugin.communityExists(communityName, (exists) -> { - UtilPlayer.message(caller, F.main(Plugin.getName(), "A community with that name already exists!")); - }, () -> // onFalse - { - if (Managers.get(Chat.class).getFilteredMessage(caller, args[0]).contains("*")) + if (exists) + { + UtilPlayer.message(caller, F.main(Plugin.getName(), "A community with that name already exists!")); + return; + } + + if (!Plugin.isNameAllowed(caller, communityName)) { UtilPlayer.message(caller, F.main(Plugin.getName(), "That name is not allowed!")); } else { - Plugin.runSync(() -> Plugin.handleCreate(caller, senderName, accountId, args[0])); + Plugin.runSync(() -> Plugin.handleCreate(caller, senderName, accountId, communityName)); } }); }); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityDescriptionCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityDescriptionCommand.java index bd6fd73e4..be099ef91 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityDescriptionCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityDescriptionCommand.java @@ -54,7 +54,7 @@ public class CommunityDescriptionCommand extends CommandBase UtilPlayer.message(caller, F.main(Plugin.getName(), "A community description cannot be longer than 30 characters!")); return; } - if (Plugin.ALPHA_NUMERIC_PATTERN.matcher(desc.replace(" ", "").replace("!", "").replace("?", "").replace(".", "").replace("'", "").replace("\"", "")).find()) + if (Plugin.NON_ALPHANUMERIC_PATTERN.matcher(desc.replace(" ", "").replace("!", "").replace("?", "").replace(".", "").replace("'", "").replace("\"", "")).find()) { UtilPlayer.message(caller, F.main(Plugin.getName(), "A community description must be alphanumeric!")); return; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityRenameCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityRenameCommand.java index 642a0b3c8..9c647fd88 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityRenameCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/communities/commands/CommunityRenameCommand.java @@ -31,13 +31,16 @@ public class CommunityRenameCommand extends CommandBase UtilPlayer.message(caller, F.help("/com rename ", "Changes the name of a community you own", ChatColor.DARK_AQUA)); return; } + Community c = Plugin.getLoadedCommunity(args[0]); String newName = args[1]; + if (c == null) { UtilPlayer.message(caller, F.main(Plugin.getName(), "That community was not found!")); return; } + if (c.getMembers().getOrDefault(caller.getUniqueId(), new CommunityMemberInfo(caller.getName(), caller.getUniqueId(), -1, CommunityRole.MEMBER, -1L)).Role != CommunityRole.LEADER) { if (!Managers.get(CoreClientManager.class).Get(caller).hasPermission(CommunityManager.Perm.COMMUNITY_RENAME_STAFF_COMMAND)) @@ -46,24 +49,30 @@ public class CommunityRenameCommand extends CommandBase return; } } - if (newName.length() > 15 || Plugin.ALPHA_NUMERIC_PATTERN.matcher(newName).find()) + + if (!Plugin.isNameValid(newName)) { UtilPlayer.message(caller, F.main(Plugin.getName(), "A community name cannot be longer than 15 characters and must be alphanumeric!")); return; } - if (Arrays.asList(Plugin.BLOCKED_NAMES).contains(newName.toLowerCase())) + + if (Plugin.BLOCKED_NAMES.contains(newName.toLowerCase())) { UtilPlayer.message(caller, F.main(Plugin.getName(), "That name is not allowed!")); return; } + Plugin.runAsync(() -> { - Plugin.communityExists(newName, () -> // onTrue - community already exists + Plugin.communityExists(newName, (exists) -> { - UtilPlayer.message(caller, F.main(Plugin.getName(), "A community with that name already exists!")); - }, () -> // onFalse - we're good - { - if (Managers.get(Chat.class).getFilteredMessage(caller, newName).contains("*")) + if (exists) + { + UtilPlayer.message(caller, F.main(Plugin.getName(), "A community with that name already exists!")); + return; + } + + if (!Plugin.isNameAllowed(caller, newName)) { UtilPlayer.message(caller, F.main(Plugin.getName(), "That name is not allowed!")); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/communities/storage/CommunityRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/communities/storage/CommunityRepository.java index af2c611b1..d8a63c213 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/communities/storage/CommunityRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/communities/storage/CommunityRepository.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -65,20 +66,14 @@ public class CommunityRepository extends RepositoryBase _us = us; } - public void communityExists(String name, Runnable onTrue, Runnable onFalse) + public void communityExists(String name, Consumer result) { try (Connection connection = getConnection()) { - executeQuery(connection, "SELECT name FROM communities WHERE name=?", resultSet -> - { - if (resultSet.next()) - { - onTrue.run(); - } else - { - onFalse.run(); - } - }, new ColumnVarChar("name", 15, name)); + executeQuery(connection, + "SELECT name FROM communities WHERE name=?", + resultSet -> result.accept(resultSet.next()), + new ColumnVarChar("name", 15, name)); } catch (Exception ex) { throw new RuntimeException("Failed to determine if community exists", ex); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/customdata/CorePlayer.java b/Plugins/Mineplex.Core/src/mineplex/core/customdata/CorePlayer.java deleted file mode 100644 index b8ef68149..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/customdata/CorePlayer.java +++ /dev/null @@ -1,18 +0,0 @@ -package mineplex.core.customdata; - -import org.bukkit.entity.Player; - -public class CorePlayer extends MineplexPlayer -{ - - CorePlayer(Player player, CustomDataManager customDataManager) - { - super(player, customDataManager); - } - - @Override - public String getKeyPrefix() - { - return "core."; - } -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/customdata/CustomData.java b/Plugins/Mineplex.Core/src/mineplex/core/customdata/CustomData.java deleted file mode 100644 index 6a773f9e6..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/customdata/CustomData.java +++ /dev/null @@ -1,25 +0,0 @@ -package mineplex.core.customdata; - -public class CustomData -{ - - private final int _id; - private final String _key; - - public CustomData(int id, String key) - { - _id = id; - _key = key; - } - - public int getId() - { - return _id; - } - - public String getKey() - { - return _key; - } - -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/customdata/CustomDataManager.java b/Plugins/Mineplex.Core/src/mineplex/core/customdata/CustomDataManager.java index 353b4f76a..a95a80cbc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/customdata/CustomDataManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/customdata/CustomDataManager.java @@ -2,20 +2,19 @@ package mineplex.core.customdata; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.MiniDbClientPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; -import mineplex.core.account.CoreClientManager; import mineplex.core.customdata.repository.CustomDataRepository; @ReflectivelyCreateMiniPlugin -public class CustomDataManager extends MiniDbClientPlugin +public class CustomDataManager extends MiniDbClientPlugin> { - private final CustomDataRepository _repository; private CustomDataManager() @@ -25,14 +24,19 @@ public class CustomDataManager extends MiniDbClientPlugin _repository = new CustomDataRepository(ClientManager, this); } + public CustomDataRepository getRepository() + { + return _repository; + } + @Override public void processLoginResultSet(String playerName, UUID uuid, int accountId, ResultSet resultSet) throws SQLException { - PlayerCustomData data = new PlayerCustomData(_repository); + Map data = new HashMap<>(); while (resultSet.next()) { - data.setData(_repository.getKey(resultSet.getInt("customDataId")), resultSet.getInt("data")); + data.put(_repository.getKey(resultSet.getInt("customDataId")), resultSet.getInt("data")); } Set(uuid, data); @@ -44,13 +48,12 @@ public class CustomDataManager extends MiniDbClientPlugin return "SELECT accountId, customDataId, data FROM accountCustomData INNER JOIN customData ON customData.id = accountCustomData.customDataId WHERE accountId = " + accountId + ";"; } - @Override - protected PlayerCustomData addPlayer(UUID uuid) + protected Map addPlayer(UUID uuid) { - return new PlayerCustomData(_repository); + return new HashMap<>(); } - void saveAsync(Player player) + public void saveData(Player player) { final int accountId = getClientManager().getAccountId(player); @@ -62,8 +65,8 @@ public class CustomDataManager extends MiniDbClientPlugin runAsync(() -> _repository.saveData(player.getUniqueId(), accountId)); } - public CorePlayer getCorePlayer(Player player) + public int getData(Player player, String key) { - return new CorePlayer(player, this); + return Get(player).getOrDefault(key, -1); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/customdata/MineplexPlayer.java b/Plugins/Mineplex.Core/src/mineplex/core/customdata/MineplexPlayer.java deleted file mode 100644 index e8ed94230..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/customdata/MineplexPlayer.java +++ /dev/null @@ -1,42 +0,0 @@ -package mineplex.core.customdata; - -import org.bukkit.entity.Player; - -public abstract class MineplexPlayer -{ - - private final Player _player; - private final CustomDataManager _customDataManager; - - public MineplexPlayer(Player player, CustomDataManager customDataManager) - { - _player = player; - _customDataManager = customDataManager; - } - - public Player getPlayer() - { - return _player; - } - - public String getKeyPrefix() - { - return ""; - } - - public void put(String key, int data, boolean save) - { - key = getKeyPrefix() + key; - _customDataManager.Get(getPlayer()).setData(key, data); - if (save) - { - _customDataManager.saveAsync(_player); - } - } - - public int get(String key) - { - key = getKeyPrefix() + key; - return _customDataManager.Get(getPlayer()).getData(key); - } -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/customdata/PlayerCustomData.java b/Plugins/Mineplex.Core/src/mineplex/core/customdata/PlayerCustomData.java deleted file mode 100644 index ff9f7c6dc..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/customdata/PlayerCustomData.java +++ /dev/null @@ -1,56 +0,0 @@ -package mineplex.core.customdata; - -import java.util.HashMap; -import java.util.Map; - -import mineplex.core.customdata.repository.CustomDataRepository; - -public class PlayerCustomData -{ - - private final Map _data; - private final CustomDataRepository _repository; - - PlayerCustomData(CustomDataRepository repository) - { - _data = new HashMap<>(); - _repository = repository; - } - - public Map getDataMap() - { - return _data; - } - - public void setData(CustomData cd, int amount) - { - _data.put(cd, amount); - } - - public void setData(String key, int amount) - { - if (_repository.doesKeyExist(key)) - { - setData(_repository.getKey(key), amount); - return; - } - - _repository.getCustomDataManager().runAsync(() -> - { - _repository.registerKey(key); // Make sure it's in the DB. - - setData(_repository.getKey(key), amount); // Input - }); - } - - public int getData(String key) - { - if (_data.containsKey(_repository.getKey(key))) - { - return _data.get(_repository.getKey(key)); - } - - return -1; - } - -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/customdata/repository/CustomDataRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/customdata/repository/CustomDataRepository.java index e586e7d6c..ade837448 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/customdata/repository/CustomDataRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/customdata/repository/CustomDataRepository.java @@ -1,14 +1,11 @@ package mineplex.core.customdata.repository; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; import java.util.Map; import java.util.UUID; import mineplex.core.account.CoreClientManager; -import mineplex.core.customdata.CustomData; import mineplex.core.customdata.CustomDataManager; -import mineplex.core.customdata.PlayerCustomData; import mineplex.serverdata.database.DBPool; import mineplex.serverdata.database.RepositoryBase; import mineplex.serverdata.database.column.ColumnInt; @@ -25,7 +22,7 @@ public class CustomDataRepository extends RepositoryBase private final CoreClientManager _clientManager; private final CustomDataManager _customDataManager; - private final List _dataKeys; + private final Map _dataKeys; public CustomDataRepository(CoreClientManager clientManager, CustomDataManager customDataManager) { @@ -34,7 +31,7 @@ public class CustomDataRepository extends RepositoryBase _clientManager = clientManager; _customDataManager = customDataManager; - _dataKeys = new ArrayList<>(); + _dataKeys = new HashMap<>(); } @Override @@ -51,29 +48,32 @@ public class CustomDataRepository extends RepositoryBase while (resultSet.next()) { - _dataKeys.add(new CustomData(resultSet.getInt("id"), resultSet.getString("name"))); + _dataKeys.put(resultSet.getString("name"), resultSet.getInt("id")); } }); } public void saveData(UUID uuid, int accountId) { - PlayerCustomData data = _customDataManager.Get(uuid); + Map data = _customDataManager.Get(uuid); - for (Map.Entry entry : data.getDataMap().entrySet()) + for (String dataKey : data.keySet()) { + int dataId = _dataKeys.get(dataKey); + int dataVal = data.get(dataKey); + if (executeUpdate( UPDATE_DATA, - new ColumnInt("data", entry.getValue()), + new ColumnInt("data", dataVal), new ColumnInt("account", accountId), - new ColumnInt("customData", entry.getKey().getId())) < 1) + new ColumnInt("customData", dataId)) < 1) { // Not already in the DB executeUpdate( INSERT_DATA, new ColumnInt("account", accountId), - new ColumnInt("customData", entry.getKey().getId()), - new ColumnInt("data", entry.getValue()) + new ColumnInt("customData", dataId), + new ColumnInt("data", dataVal) ); } } @@ -81,7 +81,7 @@ public class CustomDataRepository extends RepositoryBase public void registerKey(String key) { - if (doesKeyExist(key)) + if (_dataKeys.containsKey(key)) { return; } @@ -90,39 +90,13 @@ public class CustomDataRepository extends RepositoryBase downloadDataKeys(); } - public boolean doesKeyExist(String key) + public String getKey(int id) { - for (CustomData cur : _dataKeys) + for (Map.Entry cur : _dataKeys.entrySet()) { - if (cur.getKey().equals(key)) + if (cur.getValue() == id) { - return true; - } - } - - return false; - } - - public CustomData getKey(int id) - { - for (CustomData cur : _dataKeys) - { - if (cur.getId() == id) - { - return cur; - } - } - - return null; - } - - public CustomData getKey(String key) - { - for (CustomData cur : _dataKeys) - { - if (cur.getKey().equals(key)) - { - return cur; + return cur.getKey(); } } @@ -133,9 +107,4 @@ public class CustomDataRepository extends RepositoryBase { return _clientManager; } - - public CustomDataManager getCustomDataManager() - { - return _customDataManager; - } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/BalloonGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/BalloonGadget.java index 553dfab4e..5cb147380 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/BalloonGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/BalloonGadget.java @@ -62,7 +62,7 @@ public class BalloonGadget extends Gadget if (active >= MAX_BALLOONS) { Manager.removeActive(player, this); - player.sendMessage(F.main(Manager.getName(), "You already have the maximum about of balloons active!")); + player.sendMessage(F.main(Manager.getName(), "You already have the maximum amount of balloons active!")); return; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java index af9eca1d0..078e123b5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java @@ -56,4 +56,18 @@ public enum GadgetType { return _disableForGame; } + + /** + * @return The name of this category type, without the s at the end, + * if it has an s at the end. e.g. "Hats" will return "Hat" instead. + */ + public String getSingularType() + { + if (!_name.toLowerCase().endsWith("s")) + { + return _name; + } + + return _name.substring(0, _name.length() - 1); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index aecc13184..5d68d7423 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -189,6 +189,8 @@ public enum GameDisplay return _lobbyName; } + public String getCustomDataKeyName() { return "arcade." + _name.toLowerCase().replaceAll(" ", ".") + "."; } + private static final Map BY_ID; static diff --git a/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java b/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java index a9ad3979d..0ca3d99e5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java @@ -271,12 +271,19 @@ public class MessageManager extends MiniClientPlugin // Inform UtilPlayer.message(from, C.cGold + "§l" + from.getName() + " > " + to.getName() + C.cYellow + " §l" + message); + if (!_preferences.get(from).isActive(Preference.PRIVATE_MESSAGING)) + { + UtilPlayer.message(from, C.cPurple + to.getName() + " won't be able to reply, because you have private messaging disabled."); + UtilPlayer.message(from, C.cPurple + "You can re-enable it in your preferences."); + } + // Save Get(from).LastTo = to.getName(); Get(from).LastToTime = System.currentTimeMillis(); if (GetClientManager().Get(to).getRealOrDisguisedPrimaryGroup() == PermissionGroup.DEV) { + UtilPlayer.message(from, ""); UtilPlayer.message(from, C.cPurple + to.getName() + " is often AFK or minimized, due to plugin development."); UtilPlayer.message(from, C.cPurple + "Please be patient if they do not reply instantly."); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/poll/PollManager.java b/Plugins/Mineplex.Core/src/mineplex/core/poll/PollManager.java index dd3959281..6f19f4405 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/poll/PollManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/poll/PollManager.java @@ -186,7 +186,7 @@ public class PollManager extends MiniDbClientPlugin { if (completed) { - UtilPlayer.message(player, F.main("Carl", "You received " + F.elem(poll.getCoinReward() + "") + " Coins!")); + UtilPlayer.message(player, F.main("Carl", "You received " + F.elem(poll.getCoinReward() + "") + " Shards!")); } }); }); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardType.java b/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardType.java index 01a4352ff..08f8fbc01 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardType.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardType.java @@ -25,8 +25,8 @@ public enum RewardType SPRING( 0, 6, 18, 0, 0), MOBA( 0, 5, 20, 30, 0), - SPINNER_FILLER( 0.1, 1, 4, 20, 30), - SPINNER_REAL( 0.000001, 0.05, 0.4, 5, 20); + SPINNER_FILLER( 0.1, 1, 5, 20, 28), + SPINNER_REAL( 0.000005, 0.15, 1.2, 6, 18); private final Rarity[] _rarities; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/GadgetReward.java b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/GadgetReward.java index ad2f0141d..d6387b86d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/GadgetReward.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/GadgetReward.java @@ -33,6 +33,11 @@ public class GadgetReward extends Reward } } + public Gadget getGadget() + { + return _gadget; + } + @Override protected RewardData giveRewardCustom(Player player) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/TreasureShardReward.java b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/TreasureShardReward.java index 922d86bba..f904836bc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/TreasureShardReward.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/TreasureShardReward.java @@ -39,6 +39,11 @@ public class TreasureShardReward extends Reward _shardsMax = max; } + public Reward getOtherReward() + { + return _otherReward; + } + @Override public RewardData giveRewardCustom(Player player) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teamspeak/TeamspeakManager.java b/Plugins/Mineplex.Core/src/mineplex/core/teamspeak/TeamspeakManager.java index add9e93ac..205efbf2e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teamspeak/TeamspeakManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teamspeak/TeamspeakManager.java @@ -130,10 +130,10 @@ public class TeamspeakManager extends MiniClientPlugin impl private void generatePermissions() { - PermissionGroup.PLAYER.setPermission(Perm.LINK_COMMAND, true, true); - PermissionGroup.PLAYER.setPermission(Perm.LIST_COMMAND, true, true); - PermissionGroup.PLAYER.setPermission(Perm.TEAMSPEAK_COMMAND, true, true); - PermissionGroup.PLAYER.setPermission(Perm.UNLINK_COMMAND, true, true); + PermissionGroup.ADMIN.setPermission(Perm.LINK_COMMAND, true, true); + PermissionGroup.ADMIN.setPermission(Perm.LIST_COMMAND, true, true); + PermissionGroup.ADMIN.setPermission(Perm.TEAMSPEAK_COMMAND, true, true); + PermissionGroup.ADMIN.setPermission(Perm.UNLINK_COMMAND, true, true); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java index 52b4d8ab1..d29d823da 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java @@ -69,7 +69,7 @@ public class Teleport extends MiniPlugin _serverName = getPlugin().getConfig().getString("serverstatus.name"); _clientManager = clientManager; - + ServerCommandManager.getInstance().registerCommandType(RankLocate.class, command -> { runSync(() -> @@ -94,26 +94,26 @@ public class Teleport extends MiniPlugin runSync(() -> { Player p = Bukkit.getPlayer(command.getReceivingPlayerUUID()); - + Integer taskId = _failedRankLocates.remove(command.getUUID()); if (taskId != null) { getScheduler().cancelTask(taskId); UtilPlayer.message(p, F.main("Locate", "All Online:")); } - + if (p == null) { return; } - + UtilPlayer.message(p, C.cBlue + "- " + C.cGray + command.getServerName()); for (String on : command.getOnline()) { ChildJsonMessage message = new JsonMessage("").extra(C.cGold + " - " + C.cYellow + on); message.click(ClickEvent.RUN_COMMAND, "/server " + command.getServerName()); message.hover(HoverEvent.SHOW_TEXT, "Teleport to " + command.getServerName()); - + message.sendToPlayer(p); } }); @@ -139,27 +139,27 @@ public class Teleport extends MiniPlugin { getScheduler().cancelTask(taskId); } - + Player player = Bukkit.getPlayer(callback.getReceivingPlayerId()); - + if (player != null) { ChildJsonMessage message = new JsonMessage("").extra(C.mHead + "Locate" + "> " + C.mBody + "Located [" + C.mElem + callback.getLocatedPlayer() + C.mBody + "] at "); - + message.add(C.cBlue + callback.getServer()).click(ClickEvent.RUN_COMMAND, "/server " + callback.getServer()); - + message.hover(HoverEvent.SHOW_TEXT, "Teleport to " + callback.getServer()); - + message.sendToPlayer(player); } }); }); - + generatePermissions(); } - + private void generatePermissions() { PermissionGroup.TRAINEE.setPermission(Perm.FIND_COMMAND, true, true); @@ -167,7 +167,7 @@ public class Teleport extends MiniPlugin PermissionGroup.ADMIN.setPermission(Perm.FIND_MOD_COMMAND, true, true); PermissionGroup.TM.setPermission(Perm.FIND_TRAINEE_COMMAND, false, true); PermissionGroup.ADMIN.setPermission(Perm.FIND_TRAINEE_COMMAND, true, true); - PermissionGroup.MOD.setPermission(Perm.TELEPORT_COMMAND, true, true); + PermissionGroup.TRAINEE.setPermission(Perm.TELEPORT_COMMAND, true, true); PermissionGroup.ADMIN.setPermission(Perm.TELEPORT_LOCATION_COMMAND, true, true); PermissionGroup.ADMIN.setPermission(Perm.TELEPORT_OTHER_COMMAND, true, true); PermissionGroup.ADMIN.setPermission(Perm.TELEPORT_ALL_COMMAND, true, true); @@ -203,7 +203,7 @@ public class Teleport extends MiniPlugin _failedRedisLocates.put(locate.getUUID(), id); } - + public void locateRank(final Player sender, final PermissionGroup group) { if (group == null) @@ -211,7 +211,7 @@ public class Teleport extends MiniPlugin UtilPlayer.message(sender, F.main("Locate", "That group does not exist!")); return; } - + RankLocate locate = new RankLocate(_serverName, sender.getName(), sender.getUniqueId(), group.name()); locate.publish(); int id = getScheduler().runTaskLater(_plugin, () -> @@ -219,7 +219,7 @@ public class Teleport extends MiniPlugin _failedRankLocates.remove(locate.getUUID()); UtilPlayer.message(sender, F.main("Locate", "There are no members of that group online!")); }, 60L).getTaskId(); - + _failedRankLocates.put(locate.getUUID(), id); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureSession.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureSession.java index bf6c3a7fa..c4d598347 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureSession.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureSession.java @@ -1,6 +1,7 @@ package mineplex.core.treasure; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -16,6 +17,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; +import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; @@ -26,8 +28,12 @@ import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilTime; +import mineplex.core.gadget.types.GadgetType; import mineplex.core.reward.Reward; import mineplex.core.reward.RewardData; +import mineplex.core.reward.rewards.GadgetReward; +import mineplex.core.reward.rewards.TitleReward; +import mineplex.core.reward.rewards.TreasureShardReward; import mineplex.core.treasure.animation.TreasureAnimation; import mineplex.core.treasure.animation.TreasureRewardAnimation; import mineplex.core.treasure.reward.RewardRarity; @@ -109,6 +115,7 @@ public class TreasureSession implements Listener } RewardData rewardData = _rewardData.get(_openedChests.size()); + Reward reward = _rewards.get(_openedChests.size()); RewardRarity rarity = rewardData.getRarity(); TreasureRewardAnimation rewardAnimation = TreasureRewardAnimation.getAnimationFor(_treasure, _treasureLocation, location.clone().add(0.5, 1, 0.5), rewardData); @@ -124,7 +131,47 @@ public class TreasureSession implements Listener if (rarity.ordinal() >= RewardRarity.RARE.ordinal()) { boolean an = UtilText.startsWithVowel(rewardData.getFriendlyName()); - Bukkit.broadcastMessage(F.main(_treasureLocation.getManager().getName(), F.name(player.getName()) + " found " + (an ? "an" : "a") + " " + F.name(rarity.getColor() + rarity.getName()) + " " + F.name(rewardData.getFriendlyName()) + ".")); + + String message = F.name(player.getName()) + " found " + (an ? "an" : "a") + " " + F.name(rarity.getColor() + rarity.getName()) + " " + F.name(rewardData.getFriendlyName()); + + Reward actualReward = reward; + String type = null; + + if (reward instanceof TreasureShardReward) + { + actualReward = ((TreasureShardReward) reward).getOtherReward(); + } + + // Add reward type to chat where possible + if (actualReward instanceof GadgetReward) + { + GadgetType gadgetType = ((GadgetReward) actualReward).getGadget().getGadgetType(); + + // Don't set type if the reward contains the first word in the gadget's singular name. + // This will catch "arrow" from "arrow trail", "death" from "death effect", etc. + // It's possible this will have some false positives. + if (rewardData.getFriendlyName().toLowerCase().contains(gadgetType.getSingularType().toLowerCase().split(" ")[0])) + { + type = null; + } + else + { + type = gadgetType.getSingularType(); + } + } + else if (actualReward instanceof TitleReward) + { + type = "Title"; + } + + if (type != null && !rewardData.getFriendlyName().toLowerCase().contains(type.toLowerCase())) + { + message += C.cGray + " (" + C.cAqua + type + C.cGray + ")"; + } + + message += C.cGray + "."; + + Bukkit.broadcastMessage(F.main(_treasureLocation.getManager().getName(), message)); } if (rewardAnimation != null) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/reward/TreasureRewardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/reward/TreasureRewardManager.java index 4f89b35e6..2812dbc5a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/reward/TreasureRewardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/reward/TreasureRewardManager.java @@ -3,6 +3,7 @@ package mineplex.core.treasure.reward; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/types/MythicalTreasure.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/types/MythicalTreasure.java index 139a2bdad..d377f6b1c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/types/MythicalTreasure.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/types/MythicalTreasure.java @@ -1,5 +1,10 @@ package mineplex.core.treasure.types; +import mineplex.core.gadget.gadgets.item.ItemCoinBomb; +import mineplex.core.gadget.gadgets.kitselector.HaloKitSelector; +import mineplex.core.gadget.gadgets.kitselector.RainbowDanceKitSelector; +import mineplex.core.gadget.gadgets.kitselector.ShimmeringRingKitSelector; +import mineplex.core.gadget.gadgets.kitselector.SingleParticleKitSelector; import mineplex.core.reward.RewardType; import mineplex.core.treasure.animation.animations.MythicalChestAnimation; import mineplex.core.treasure.reward.RewardRarity; @@ -20,6 +25,15 @@ public class MythicalTreasure extends NormalTreasure enabledByDefault(); } + @Override + protected void addRare(RewardRarity rarity) + { + super.addRare(rarity); + + // Shard bomb + addGadgetReward(getGadget(ItemCoinBomb.class), rarity, 25, 1, 1); + } + @Override protected void addMythical(RewardRarity rarity) { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index c0703077c..da59a5064 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -9,6 +9,7 @@ import mineplex.core.PacketsInteractionFix; import mineplex.core.TwitchIntegrationFix; import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.AchievementManager; +import mineplex.core.admin.command.AdminCommands; import mineplex.core.antihack.AntiHack; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.boosters.BoosterManager; @@ -204,6 +205,8 @@ public class Hub extends JavaPlugin implements IRelation require(TeamspeakManager.class); new WebsiteLinkManager(this, clientManager); require(TwitchIntegrationFix.class); + + new AdminCommands(); } @Override diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/player/HubPlayer.java b/Plugins/Mineplex.Hub/src/mineplex/hub/player/HubPlayer.java deleted file mode 100644 index ce0fad38d..000000000 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/player/HubPlayer.java +++ /dev/null @@ -1,21 +0,0 @@ -package mineplex.hub.player; - -import org.bukkit.entity.Player; - -import mineplex.core.customdata.CustomDataManager; -import mineplex.core.customdata.MineplexPlayer; - -public class HubPlayer extends MineplexPlayer -{ - - HubPlayer(Player player, CustomDataManager customDataManager) - { - super(player, customDataManager); - } - - @Override - public String getKeyPrefix() - { - return "hub."; - } -} diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CheckOwnsPackageCommand.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CheckOwnsPackageCommand.java index 74d5adc54..396370785 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CheckOwnsPackageCommand.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CheckOwnsPackageCommand.java @@ -43,8 +43,8 @@ public class CheckOwnsPackageCommand extends CommandBase caller.sendMessage(F.main(Plugin.getName(), "Package " + C.cYellow + salesPackage - + C.mBody + ": " - + (Plugin.getDonationManager().Get(client.getUniqueId()).ownsUnknownSalesPackage(salesPackage) ? C.cGreen + "Unlocked" : C.cRed + "Locked") + + C.mBody + " unlocked for " + F.name(playerName) + ": " + + (Plugin.getDonationManager().Get(client.getUniqueId()).ownsUnknownSalesPackage(salesPackage) ? C.cGreen + "YES" : C.cRed + "NO") )); } else diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index d3b3a0e2c..43ba0df32 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -21,6 +21,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; +import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockFadeEvent; import org.bukkit.event.block.BlockSpreadEvent; @@ -29,6 +30,7 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -44,6 +46,7 @@ import mineplex.core.account.CoreClientManager; import mineplex.core.account.permissions.Permission; import mineplex.core.account.permissions.PermissionGroup; import mineplex.core.achievement.AchievementManager; +import mineplex.core.admin.command.AdminCommands; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.blood.Blood; import mineplex.core.bonuses.BonusManager; @@ -137,6 +140,7 @@ import nautilus.game.arcade.command.CancelNextGameCommand; import nautilus.game.arcade.command.GameCommand; import nautilus.game.arcade.command.GoToNextGameCommand; import nautilus.game.arcade.command.KitUnlockCommand; +import nautilus.game.arcade.command.ReturnToHubCommand; import nautilus.game.arcade.command.TauntCommand; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; @@ -159,14 +163,12 @@ import nautilus.game.arcade.managers.GameStatManager; import nautilus.game.arcade.managers.GameTournamentManager; import nautilus.game.arcade.managers.GameWorldManager; import nautilus.game.arcade.managers.IdleManager; -import nautilus.game.arcade.managers.MiscManager; import nautilus.game.arcade.managers.NextBestGameManager; import nautilus.game.arcade.managers.ServerUptimeManager; import nautilus.game.arcade.managers.chat.GameChatManager; import nautilus.game.arcade.managers.lobby.LobbyManager; import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; import nautilus.game.arcade.managers.lobby.legacy.LegacyGameLobbyManager; -import nautilus.game.arcade.player.ArcadePlayer; public class ArcadeManager extends MiniPlugin implements IRelation { @@ -184,6 +186,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation JOIN_FULL_STAFF, BYPASS_WHITELIST, BYPASS_MPS_WHITELIST, + RETURN_TO_HUB_COMMAND } private static final List TOURNAMENT_CONTROLLERS = Arrays.asList("Malfunction", "adeelzee", "gr8p", "HelloItsMeJack", "Aussi", "Jesusman3", "TyTy2017", "KingShook", "Sw1ck", "doodzee", "Chr1mz", "Giovanna", "xApolloJustice", "bawzee", "MessedUpLogic", "dehfi", "Geothermal", "captainfence", "Ecal", "Raydnn", "Otisdiver", "AussieFighter", "snevahmadaa", "eMoa", "Vilare", "xLouis", "PizzaMan319"); @@ -346,7 +349,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation new GameLootManager(this, petManager); _spectatorManager = new GameSpectatorManager(this); _gameWorldManager = new GameWorldManager(this); - new MiscManager(this); _hologramManager = hologramManager; _idleManager = new IdleManager(this); TitanGiveawayManager titanGiveaway = new TitanGiveawayManager(getPlugin(), clientManager, serverStatusManager); @@ -398,6 +400,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation addCommand(new GoToNextGameCommand(this)); addCommand(new CancelNextGameCommand(this)); addCommand(new TauntCommand(this)); + addCommand(new ReturnToHubCommand(this)); require(PersonalServerManager.class); require(CommunityManager.class); @@ -597,12 +600,14 @@ public class ArcadeManager extends MiniPlugin implements IRelation _winStreakManager = require(WinStreakManager.class); _mineplexGameManager = require(MineplexGameManager.class); + new AdminCommands(); + generatePermissions(); } private void generatePermissions() { - + PermissionGroup.PLAYER.setPermission(Perm.RETURN_TO_HUB_COMMAND, true, true); PermissionGroup.CONTENT.setPermission(Perm.USE_MENU_DURING_GAME, true, true); PermissionGroup.BUILDER.setPermission(Perm.USE_MENU_DURING_GAME, true, true); PermissionGroup.PLAYER.setPermission(Perm.NEXT_BEST_GAME, true, true); @@ -1910,11 +1915,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation } } - public ArcadePlayer getArcadePlayer(Player player) - { - return new ArcadePlayer(player, getCustomDataManager(), this); - } - @EventHandler public void clearDisguises(GameStateChangeEvent event) { @@ -2003,6 +2003,39 @@ public class ArcadeManager extends MiniPlugin implements IRelation } } + @EventHandler(priority = EventPriority.LOWEST) + public void InteractActive(PlayerInteractEvent event) + { + event.setCancelled(false); + } + + @EventHandler(priority = EventPriority.LOW) + public void InteractClickCancel(PlayerInteractEvent event) + { + if (GetGame() == null) + return; + + Player player = event.getPlayer(); + + //BoneMeal + if (!GetGame().WorldBoneMeal && + event.getAction() == Action.RIGHT_CLICK_BLOCK && + player.getItemInHand().getType() == Material.INK_SACK && + player.getItemInHand().getData().getData() == (byte)15) + { + event.setCancelled(true); + + runSyncLater(player::updateInventory, 1L); + } + else if (GetGame().GetState() != GameState.Live) + { + event.setCancelled(true); + + runSyncLater(player::updateInventory, 1L); + } + } + + public KitProgressionManager getKitProgressionManager() { return _kitProgressionManager; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/booster/GameBoosterManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/booster/GameBoosterManager.java index 832ba44f4..3ad21529b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/booster/GameBoosterManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/booster/GameBoosterManager.java @@ -1,5 +1,8 @@ package nautilus.game.arcade.booster; +import java.util.Collections; +import java.util.List; + import mineplex.core.Managers; import mineplex.core.MiniPlugin; import mineplex.core.boosters.Booster; @@ -30,6 +33,8 @@ import org.bukkit.plugin.java.JavaPlugin; */ public class GameBoosterManager extends MiniPlugin { + private static final List TESTING_GROUPS = Collections.singletonList("testing"); + private String _boosterGroup; private BoosterManager _boosterManager; @@ -86,16 +91,21 @@ public class GameBoosterManager extends MiniPlugin boolean isTesting = UtilServer.isTestServer(); + boolean canShowGroup = !isTesting && !TESTING_GROUPS.contains(event.getBoosterGroup().toLowerCase()); + + // If the booster is for the server the player is currently on if (event.getBoosterGroup().equals(_boosterGroup)) { Bukkit.broadcastMessage(F.main("Amplifier", F.name(booster.getPlayerName()) + " has activated a Game Amplifier for " + booster.getMultiplier() + "x Shards!")); } - else if (!isTesting) + // If this is not currently a test server and the booster group is not blacklisted from + // displaying on non-test servers + else if (canShowGroup) { Bukkit.broadcastMessage(F.main("Amplifier", F.name(booster.getPlayerName()) + " has activated a Game Amplifier on " + F.elem(event.getBoosterGroup().replaceAll("_", " ")) + "!")); } - if (event.getBoosterGroup().equals(_boosterGroup) || !isTesting) + if (event.getBoosterGroup().equals(_boosterGroup) || canShowGroup) { JsonMessage message = new JsonMessage(F.main("Amplifier", F.elem("Click here") + " to thank them and get " + F.currency(GlobalCurrency.TREASURE_SHARD, BoosterThankManager.TIP_FOR_TIPPER) + "!")); message.click(ClickEvent.RUN_COMMAND, "/amplifier thank " + event.getBoosterGroup()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/GoToNextGameCommand.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/GoToNextGameCommand.java index f73e75762..2c7a828cc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/GoToNextGameCommand.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/GoToNextGameCommand.java @@ -12,7 +12,7 @@ public class GoToNextGameCommand extends CommandBase { public GoToNextGameCommand(ArcadeManager plugin) { - super(plugin, ArcadeManager.Perm.NEXT_BEST_GAME, "gotonextbestgame"); + super(plugin, ArcadeManager.Perm.NEXT_BEST_GAME, "gotonextbestgame", "nextgame", "nbg"); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/ReturnToHubCommand.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/ReturnToHubCommand.java new file mode 100644 index 000000000..7fe8379d3 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/ReturnToHubCommand.java @@ -0,0 +1,24 @@ +package nautilus.game.arcade.command; + +import org.bukkit.entity.Player; + +import mineplex.core.account.permissions.Permission; +import mineplex.core.command.CommandBase; +import mineplex.core.portal.GenericServer; +import mineplex.core.portal.Intent; + +import nautilus.game.arcade.ArcadeManager; + +public class ReturnToHubCommand extends CommandBase +{ + public ReturnToHubCommand(ArcadeManager plugin) + { + super(plugin, ArcadeManager.Perm.RETURN_TO_HUB_COMMAND, "hub", "lobby", "leave", "takemebacktoparadisecity"); + } + + @Override + public void Execute(Player caller, String[] args) + { + Plugin.GetPortal().sendPlayerToGenericServer(caller, GenericServer.HUB, Intent.PLAYER_REQUEST); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 8d17a56c0..49ac4b118 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -99,6 +99,7 @@ import nautilus.game.arcade.events.PlayerPrepareTeleportEvent; import nautilus.game.arcade.events.PlayerStateChangeEvent; import nautilus.game.arcade.game.GameTeam.PlayerState; import nautilus.game.arcade.game.modules.AntiExpOrbModule; +import nautilus.game.arcade.game.modules.HubClockModule; import nautilus.game.arcade.game.modules.Module; import nautilus.game.arcade.game.modules.gamesummary.GameSummaryModule; import nautilus.game.arcade.kit.ChampionsKit; @@ -520,6 +521,12 @@ public abstract class Game extends ListenerComponent implements Lifetimed new GameSummaryModule() .register(this); + if (getArcadeManager().IsHotbarHubClock()) + { + new HubClockModule() + .register(this); + } + registerDebugCommand("kit", Perm.DEBUG_KIT_COMMAND, PermissionGroup.ADMIN, (caller, args) -> { String kit = Arrays.stream(args).collect(Collectors.joining(" ")); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/BaconBrawl.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/BaconBrawl.java index 681a0b409..cdd365af7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/BaconBrawl.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/BaconBrawl.java @@ -1,5 +1,6 @@ package nautilus.game.arcade.game.games.baconbrawl; +import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; @@ -58,6 +59,8 @@ public class BaconBrawl extends SoloGame .register(this); StrictAntiHack = true; + + PlayerGameMode = GameMode.ADVENTURE; } @EventHandler diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/deathtag/DeathTag.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/deathtag/DeathTag.java index 486b62291..17d500440 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/deathtag/DeathTag.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/deathtag/DeathTag.java @@ -28,6 +28,7 @@ import nautilus.game.arcade.stats.ComeAtMeBroStatTracker; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.ItemFrame; @@ -83,6 +84,8 @@ public class DeathTag extends SoloGame this.PrepareFreeze = false; + this.PlayerGameMode = GameMode.ADVENTURE; + SplitKitXP = true; registerStatTrackers(new ComeAtMeBroStatTracker(this)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragonescape/DragonEscape.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragonescape/DragonEscape.java index aa4e02353..42755f5b4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragonescape/DragonEscape.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragonescape/DragonEscape.java @@ -30,6 +30,8 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.Team; import org.bukkit.util.Vector; @@ -241,7 +243,7 @@ public class DragonEscape extends SoloGame @EventHandler public void Invisibility(PlayerKitGiveEvent event) { - Manager.GetCondition().Factory().Invisible(GetName(), event.getPlayer(), event.getPlayer(), 40, 0, false, false, false); + event.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1, false, false)); } @EventHandler diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragons/Dragons.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragons/Dragons.java index c373d1df4..6b14e5e08 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragons/Dragons.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragons/Dragons.java @@ -3,8 +3,10 @@ package nautilus.game.arcade.game.games.dragons; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import org.bukkit.EntityEffect; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.entity.EnderDragon; @@ -72,6 +74,7 @@ public class Dragons extends SoloGame this.DamagePvP = false; this.HungerSet = 20; this.WorldWaterDamage = 4; + this.PlayerGameMode = GameMode.ADVENTURE; registerStatTrackers( new SparklezStatTracker(this) @@ -138,18 +141,34 @@ public class Dragons extends SoloGame } } } + + private void giveSurvivedGems(Player player) + { + long time = (System.currentTimeMillis() - GetStateTime()); + double gems = time/10000d; + String reason = "Survived for " + UtilTime.MakeStr(time); + + this.AddGems(player, gems, reason, false, false); + } + + @Override + public void AnnounceEnd(List places) + { + // Give the winner gems for surviving the latest + giveSurvivedGems(places.get(0)); + + super.AnnounceEnd(places); + } @EventHandler public void Death(PlayerStateChangeEvent event) { if (event.GetState() != PlayerState.OUT) + { return; + } - long time = (System.currentTimeMillis() - GetStateTime()); - double gems = time/10000d; - String reason = "Survived for " + UtilTime.MakeStr(time); - - this.AddGems(event.GetPlayer(), gems, reason, false, false); + giveSurvivedGems(event.GetPlayer()); } @EventHandler diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragons/DragonsTeams.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragons/DragonsTeams.java index e3b557e9f..0d86b4af5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragons/DragonsTeams.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/dragons/DragonsTeams.java @@ -3,6 +3,7 @@ package nautilus.game.arcade.game.games.dragons; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import org.bukkit.EntityEffect; import org.bukkit.Location; @@ -119,18 +120,34 @@ public class DragonsTeams extends TeamGame } } } - + + private void giveSurvivedGems(Player player) + { + long time = (System.currentTimeMillis() - GetStateTime()); + double gems = time/10000d; + String reason = "Survived for " + UtilTime.MakeStr(time); + + this.AddGems(player, gems, reason, false, false); + } + + @Override + public void AnnounceEnd(List places) + { + // Give the winner gems for surviving the latest + giveSurvivedGems(places.get(0)); + + super.AnnounceEnd(places); + } + @EventHandler public void Death(PlayerStateChangeEvent event) { if (event.GetState() != PlayerState.OUT) + { return; - - long time = (System.currentTimeMillis() - GetStateTime()); - double gems = time/10000d; - String reason = "Survived for " + UtilTime.MakeStr(time); - - this.AddGems(event.GetPlayer(), gems, reason, false, false); + } + + giveSurvivedGems(event.GetPlayer()); } @EventHandler diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java index af60e7ce3..a6f7ef731 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java @@ -143,7 +143,7 @@ public class Draw extends SoloGame "Clock", "Time", "Cyclops", "Coconut", "Hang", "Penguin", "Confused", "Bucket", "Lion", "Rubbish", "Spaceship", "Bowl", "Shark", "Pizza", "Pyramid", "Dress", "Pants", "Shorts", "Boots", "Boy", "Girl", "Math", "Sunglasses", "Frog", "Chair", "Cake", "Grapes", "Kiss", "Snorlax", "Earth", "Spaghetti", - "Couch", "Family", "Milk", "Blood", "Pig", "Giraffe", "Mouse", "Couch", "Fat", "Chocolate", "Camel", + "Couch", "Family", "Milk", "Pig", "Giraffe", "Mouse", "Couch", "Fat", "Chocolate", "Camel", "Cheese", "Beans", "Water", "Chicken", "Zipper", "Book", "Swimming", "Horse", "Paper", "Toaster", "Television", "Hammer", "Piano", "Sleeping", "Yawn", "Sheep", "Night", "Chest", "Lamp", "Redstone", "Grass", "Plane", "Ocean", "Lake", "Melon", "Pumpkin", "Gift", "Fishing", "Pirate", @@ -244,7 +244,7 @@ public class Draw extends SoloGame "Goblin", "Potion", "Treat", "Trick" }; - _tools = new HashSet(); + _tools = new HashSet<>(); _tools.add(new ToolLine(this)); _tools.add(new ToolSquare(this)); _tools.add(new ToolCircle(this)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 0738be587..15475e41d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -12,6 +12,7 @@ import java.util.UUID; import org.bukkit.Color; import org.bukkit.FireworkEffect; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; @@ -96,6 +97,8 @@ public class Gladiators extends SoloGame }, GameType.Gladiators); + this.PlayerGameMode = GameMode.ADVENTURE; + registerStatTrackers( new BrawlerTracker(this), new UntouchableTracker(this), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/hotbar/HotbarEditor.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/hotbar/HotbarEditor.java index 57de78bd1..a8001f647 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/hotbar/HotbarEditor.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/hotbar/HotbarEditor.java @@ -27,6 +27,7 @@ import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilServer; +import mineplex.core.game.GameDisplay; import mineplex.core.itemstack.ItemBuilder; import nautilus.game.arcade.events.GameStateChangeEvent; @@ -39,7 +40,8 @@ import nautilus.game.arcade.game.modules.Module; */ public class HotbarEditor extends Module { - + public static final String HOTBAR_DATA_KEY = GameDisplay.Gladiators.getCustomDataKeyName() + "hotbar"; + private final ItemStack _item; private final Listener _pageListener; @@ -103,6 +105,8 @@ public class HotbarEditor extends Module { if (event.GetState() == Game.GameState.Recruit) { + getGame().getArcadeManager().getCustomDataManager().getRepository().registerKey(HOTBAR_DATA_KEY); + for (Player player : Bukkit.getOnlinePlayers()) { player.getInventory().setItem(0, _item); @@ -139,7 +143,7 @@ public class HotbarEditor extends Module public HotbarLayout getLayout(Player player) { - int data = getGame().Manager.getArcadePlayer(player).get("hotbar"); + int data = getGame().Manager.getCustomDataManager().getData(player, HOTBAR_DATA_KEY); data = (data == -1 ? 1239 : data); List ints = new ArrayList<>(); @@ -193,7 +197,8 @@ public class HotbarEditor extends Module save.setRod(save.getEmpty()); } - getGame().Manager.getArcadePlayer(player).put("hotbar", save.toDataSaveNumber(), true); + getGame().Manager.getCustomDataManager().Get(player).put(HOTBAR_DATA_KEY, save.toDataSaveNumber()); + getGame().Manager.getCustomDataManager().saveData(player); player.sendMessage(F.main("Game", "Saved new hotbar layout!")); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java index c93fc4a4c..f0cf120fb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map.Entry; import net.minecraft.server.v1_8_R3.EntityCreature; @@ -41,6 +42,7 @@ import org.bukkit.entity.Slime; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; +import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; @@ -89,8 +91,8 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GamePrepareCountdownCommence; import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.events.PlayerPrepareTeleportEvent; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.GameTeam.PlayerState; import nautilus.game.arcade.game.TeamGame; @@ -373,11 +375,27 @@ public class HideSeek extends TeamGame } @EventHandler - public void onPlayerTeleport(PlayerPrepareTeleportEvent event) + public void onceReady(GamePrepareCountdownCommence event) { - if (_hiders.GetPlayers(false).contains(event.GetPlayer())) + List hiders = _hiders.GetPlayers(false); + + for (Player player : hiders) { - event.GetPlayer().setGameMode(GameMode.ADVENTURE); + // Apply Adventure Mode + player.setGameMode(GameMode.ADVENTURE); + + // Put initial forms in the map + Kit kit = GetKit(player); + if (!(kit instanceof KitHiderInfestor)) + { + Form form = new BlockForm(this, player, _allowedBlocks.get(UtilMath.r(_allowedBlocks.size()))); + + _forms.put(player, form); + + form.Apply(); + + Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(player, form)); + } } } @@ -534,29 +552,14 @@ public class HideSeek extends TeamGame } } - @EventHandler - public void InitialDisguise(PlayerPrepareTeleportEvent event) - { - if (_hiders.HasPlayer(event.GetPlayer().getName(), true)) - { - GameTeam team = GetTeam(event.GetPlayer()); - Kit kit = GetKit(event.GetPlayer()); - if (team.GetColor() == ChatColor.AQUA && !(kit instanceof KitHiderInfestor)) - { - Form form = new BlockForm(this, event.GetPlayer(), _allowedBlocks.get(UtilMath.r(_allowedBlocks.size()))); - - _forms.put(event.GetPlayer(), form); - - form.Apply(); - - Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(event.GetPlayer(), form)); - } - } - } - @EventHandler public void ChangeDisguise(PlayerInteractEvent event) { + if (event.getAction() == Action.PHYSICAL) + { + return; + } + if (event.getClickedBlock() == null) return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java index 98535da59..5489c1260 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java @@ -12,6 +12,7 @@ import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.PlayerInventory; import mineplex.core.common.util.C; import mineplex.core.common.util.F; @@ -202,7 +203,10 @@ public class ShopManager { if (_disabled) return; - + + if (!(event.getClickedInventory() instanceof PlayerInventory)) + return; + event.setCancelled(true); Player player = UtilPlayer.searchExact(event.getWhoClicked().getName()); @@ -219,7 +223,7 @@ public class ShopManager if (!_shop.get(player).containsKey(event.getSlot())) return; - //Prevent accidently buying multi + //Prevent accidentally buying multi if (!Recharge.Instance.use(player, "Shop Purchase", 120, false, false)) return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java index ec49f6a5f..9b4fc50a6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java @@ -64,6 +64,7 @@ import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTextTop; import mineplex.core.common.util.UtilTime; +import mineplex.core.incognito.IncognitoManager; import mineplex.core.projectile.IThrown; import mineplex.core.projectile.ProjectileUser; import mineplex.core.recharge.Recharge; @@ -1125,6 +1126,10 @@ public class BawkBawkBattles extends TeamGame implements IThrown if (player.equals(other)) continue; + // Allow staff members to go near players while vanished + if (getArcadeManager().isVanished(player) && getArcadeManager().GetClients().Get(player).hasPermission(IncognitoManager.Perm.USE_INCOGNITO)) + continue; + if (UtilMath.offset(other, player) >= SPECTATOR_KNOCKBACK_RADIUS) continue; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/paintball/Paintball.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/paintball/Paintball.java index 063a76d36..a860fe5c4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/paintball/Paintball.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/paintball/Paintball.java @@ -109,6 +109,8 @@ public class Paintball extends TeamGame InventoryClick = false; + PlayerGameMode = GameMode.ADVENTURE; + registerStatTrackers( new KillingSpreeTracker(this), new WinWithoutLosingTeammateStatTracker(this, "FlawlessVictory"), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/quiver/Quiver.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/quiver/Quiver.java index 03afda7c7..c8f26fa6c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/quiver/Quiver.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/quiver/Quiver.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import org.bukkit.ChatColor; +import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Arrow; @@ -47,7 +48,7 @@ import nautilus.game.arcade.stats.WinWithoutDyingStatTracker; public class Quiver extends SoloGame { private ArrayList _ranks = new ArrayList(); - private HashMap _combo = new HashMap(); + private HashMap _combo = new HashMap<>(); private HashMap _bestCombo = new HashMap(); private HashMap _deathTime = new HashMap(); @@ -73,6 +74,8 @@ public class Quiver extends SoloGame // new KitNecromancer(manager), }, GameType.Quiver); + this.PlayerGameMode = GameMode.ADVENTURE; + registerStatTrackers( new WinWithoutDyingStatTracker(this, "Perfectionist"), new SharpShooterStatTracker(this), @@ -205,6 +208,18 @@ public class Quiver extends SoloGame AddKill(player); } + private void updateBestCombo(Player player) + { + int combo = _combo.get(player); + + int best = 0; + if (_bestCombo.containsKey(player)) + best = _bestCombo.get(player); + + if (combo > best) + _bestCombo.put(player, combo); + } + @EventHandler public void ComboReset(CombatDeathEvent event) { @@ -216,14 +231,8 @@ public class Quiver extends SoloGame if (!_combo.containsKey(player)) return; - int combo = _combo.remove(player); - - int best = 0; - if (_bestCombo.containsKey(player)) - best = _bestCombo.get(player); - - if (combo > best) - _bestCombo.put(player, combo); + updateBestCombo(player); + _combo.remove(player); } public void AddKill(Player player) @@ -234,6 +243,7 @@ public class Quiver extends SoloGame combo += _combo.get(player); _combo.put(player, combo); + updateBestCombo(player); AnnounceCombo(player, combo); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sheep/SheepGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sheep/SheepGame.java index 302e72c3f..f885f38ac 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sheep/SheepGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sheep/SheepGame.java @@ -10,6 +10,7 @@ import org.bukkit.Color; import org.bukkit.Effect; import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Type; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; @@ -182,6 +183,8 @@ public class SheepGame extends TeamGame this.WorldTimeSet = 2000; + this.PlayerGameMode = GameMode.ADVENTURE; + new CompassModule() .setGiveCompass(true) .setGiveCompassToSpecs(true) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sneakyassassins/SneakyAssassins.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sneakyassassins/SneakyAssassins.java index d6ea372b5..257ea25f0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sneakyassassins/SneakyAssassins.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sneakyassassins/SneakyAssassins.java @@ -24,6 +24,7 @@ import nautilus.game.arcade.stats.RevealStatTracker; import nautilus.game.arcade.stats.TheMastersMasterStatTracker; import org.bukkit.*; +import org.bukkit.GameMode; import org.bukkit.entity.*; import org.bukkit.event.*; import org.bukkit.event.entity.*; @@ -83,6 +84,8 @@ public class SneakyAssassins extends SoloGame this.AllowParticles = false; + this.PlayerGameMode = GameMode.ADVENTURE; + new CompassModule() .setGiveCompassToAlive(true) .setGiveCompass(false) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/HubClockModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/HubClockModule.java new file mode 100644 index 000000000..a1361dd4b --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/HubClockModule.java @@ -0,0 +1,104 @@ +package nautilus.game.arcade.game.modules; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemStack; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.portal.GenericServer; +import mineplex.core.portal.Intent; +import mineplex.core.recharge.Recharge; + +import nautilus.game.arcade.events.PlayerStateChangeEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.managers.GameSpectatorManager; + +public class HubClockModule extends Module +{ + private static final int HUB_CLOCK_SLOT = 8; + private static final ItemStack HUB_CLOCK_ITEM = ItemStackFactory.Instance.CreateStack(Material.WATCH, (byte) 0, 1, (short) 0, C.cGreen + + "Return to Hub", new String[]{"", ChatColor.RESET + "Click while holding this", + ChatColor.RESET + "to return to the Hub."}); + + public void giveClock(Player player) + { + if (!getGame().GiveClock) + { + return; + } + + player.getInventory().setItem(HUB_CLOCK_SLOT, HUB_CLOCK_ITEM); + } + + @EventHandler + public void giveOnJoin(PlayerJoinEvent event) + { + giveClock(event.getPlayer()); + } + + @EventHandler + public void giveOnDeath(PlayerStateChangeEvent event) + { + // Only handle when the player is now out + if (event.GetState() != GameTeam.PlayerState.OUT) + { + return; + } + + getGame().getArcadeManager().runSyncLater(() -> giveClock(event.GetPlayer()), GameSpectatorManager.ITEM_GIVE_DELAY); + } + + @EventHandler + public void preventDrop(PlayerDropItemEvent event) + { + if (event.getItemDrop().getItemStack().equals(HUB_CLOCK_ITEM)) + { + event.setCancelled(true); + event.getPlayer().sendMessage(F.main("Game", "You can't drop the Hub Clock.")); + } + } + + @EventHandler + public void handleClockInteract(PlayerInteractEvent event) + { + // Don't trigger the clock when players walk on pressure plates + if (event.getAction() == Action.PHYSICAL) + { + return; + } + + Player player = event.getPlayer(); + + if (player.getItemInHand() == null) + { + return; + } + + // Only allow this exact clock to be used. + if (!player.getItemInHand().equals(HUB_CLOCK_ITEM)) + { + return; + } + + // Don't allow spamming so we don't make too many send requests + if (!Recharge.Instance.usable(event.getPlayer(), "Return to Hub")) + { + return; + } + + // Send to server + getGame() + .getArcadeManager() + .GetPortal() + .sendPlayerToGenericServer(event.getPlayer(), GenericServer.HUB, Intent.PLAYER_REQUEST); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java index 2083518f4..3de7e7bbe 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java @@ -607,7 +607,7 @@ public class GameHostManager implements Listener if (_host == null) return; - if (!event.getMessage().toLowerCase().startsWith("/whitelist")) + if (!event.getMessage().toLowerCase().startsWith("/whitelist") && !event.getMessage().toLowerCase().startsWith("/wl")) return; if (!event.getPlayer().equals(_host)) @@ -643,12 +643,8 @@ public class GameHostManager implements Listener { return PermissionGroup.ETERNAL.hasPermission(permission); } - if (_hostRank == null) - { - return false; - } - - return _hostRank.hasPermission(permission); + + return _hostRank != null && _hostRank.hasPermission(permission); } public List getGames() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index ea42d0917..a81a57f4b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -466,7 +466,7 @@ public class GameManager implements Listener event.GetGame().DeregisterKits(); event.GetGame().deRegisterStats(); } - + @EventHandler public void ScoreboardTitle(UpdateEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameSpectatorManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameSpectatorManager.java index 7655d2c8c..3ea538e31 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameSpectatorManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameSpectatorManager.java @@ -46,6 +46,10 @@ import java.util.UUID; public class GameSpectatorManager implements Listener, IPacketHandler { + // Common delay for giving items when a spectator dies, + // to prevent them from accidentally switching servers. + public final static long ITEM_GIVE_DELAY = 3 * 20L; + // A map of a player UUID to the UUID of the entity they want to spectate private final Map _pendingSpectate = Collections.synchronizedMap(new HashMap<>()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/MiscManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/MiscManager.java deleted file mode 100644 index 793b05408..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/MiscManager.java +++ /dev/null @@ -1,161 +0,0 @@ -package nautilus.game.arcade.managers; - -import java.util.ArrayList; -import java.util.List; - -import mineplex.core.common.util.UtilServer; -import mineplex.core.portal.GenericServer; -import mineplex.core.portal.Intent; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.game.Game.GameState; - -import org.bukkit.Material; -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.inventory.InventoryCloseEvent; -import org.bukkit.event.inventory.InventoryOpenEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; - -public class MiscManager implements Listener -{ - private List _dontGiveClockList = new ArrayList(); - private ArcadeManager Manager; - - public MiscManager(ArcadeManager manager) - { - Manager = manager; - - Manager.getPluginManager().registerEvents(this, Manager.getPlugin()); - } - - @EventHandler(priority = EventPriority.LOWEST) - public void InteractActive(PlayerInteractEvent event) - { - event.setCancelled(false); - } - - @EventHandler(priority = EventPriority.LOW) - public void InteractClickCancel(PlayerInteractEvent event) - { - if (Manager.GetGame() == null) - return; - - Player player = event.getPlayer(); - - //BoneMeal - if (!Manager.GetGame().WorldBoneMeal && - event.getAction() == Action.RIGHT_CLICK_BLOCK && - event.getPlayer().getItemInHand().getType() == Material.INK_SACK && - event.getPlayer().getItemInHand().getData().getData() == (byte)15) - { - event.setCancelled(true); - - Manager.runSyncLater(() -> - { - event.getPlayer().updateInventory(); - }, 1L); - } - else if (Manager.GetGame().GetState() != GameState.Live) - { - event.setCancelled(true); - - Manager.runSyncLater(() -> - { - event.getPlayer().updateInventory(); - }, 1L); - } - } - - @EventHandler - public void addClockPrevent(InventoryOpenEvent event) - { - if (event.getPlayer() instanceof Player) - { - _dontGiveClockList.add(event.getPlayer().getName()); - } - } - - @EventHandler - public void removeClockPrevent(InventoryCloseEvent event) - { - if (event.getPlayer() instanceof Player) - { - _dontGiveClockList.remove(event.getPlayer().getName()); - } - } - - @EventHandler - public void HubClockUpdate(UpdateEvent event) - { - if (!Manager.IsHotbarHubClock()) - return; - - if (event.getType() != UpdateType.FAST) - return; - - if (Manager.GetGame() == null) - return; - - for (Player player : UtilServer.getPlayers()) - { - if (Manager.GetGame().IsAlive(player)) - continue; - - if (_dontGiveClockList.contains(player.getName())) - continue; - - Manager.HubClock(player); - } - } - - @EventHandler(priority = EventPriority.LOWEST) - public void HubClockInteract(PlayerInteractEvent event) - { - if (!Manager.IsHotbarHubClock()) - return; - - if (event.getAction() == Action.PHYSICAL) - return; - - Player player = event.getPlayer(); - - if (player.getItemInHand() == null) - return; - - if (player.getItemInHand().getType() != Material.WATCH) - return; - - // Prevent players from hub warping off clock in Master Builders - if (!player.getItemInHand().hasItemMeta()) - return; - if (!player.getItemInHand().getItemMeta().hasDisplayName()) - return; - String displayName = player.getItemInHand().getItemMeta().getDisplayName(); - if (displayName == null || !displayName.contains("Hub")) - return; - - if (!Recharge.Instance.usable(event.getPlayer(), "Return to Hub")) - return; - - Manager.GetPortal().sendPlayerToGenericServer(event.getPlayer(), GenericServer.HUB, Intent.PLAYER_REQUEST); - } - - @EventHandler - public void HubCommand(PlayerCommandPreprocessEvent event) - { - if (event.getMessage().toLowerCase().equals("/lobby") || event.getMessage().toLowerCase().equals("/hub") || event.getMessage().toLowerCase().equals("/leave")) - { - Manager.GetPortal().sendPlayerToGenericServer(event.getPlayer(), GenericServer.HUB, Intent.PLAYER_REQUEST); - event.setCancelled(true); - } - } -} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/NextBestGameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/NextBestGameManager.java index abd9e4b51..a9017b473 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/NextBestGameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/NextBestGameManager.java @@ -287,7 +287,7 @@ public class NextBestGameManager implements Listener _tasks.put(player.getUniqueId(), new CountdownRunnable(player)); - player.getInventory().setItem(INVENTORY_SLOT, CANCEL_ITEM); + giveItem(player); sendMessage(player, true); @@ -298,7 +298,7 @@ public class NextBestGameManager implements Listener { sendMessage(player, false); - player.getInventory().setItem(INVENTORY_SLOT, GO_TO_NEXT_ITEM); + getGame().getArcadeManager().runSyncLater(() -> giveItem(player), GameSpectatorManager.ITEM_GIVE_DELAY); } player.sendMessage(" "); @@ -324,7 +324,7 @@ public class NextBestGameManager implements Listener Player owner = Bukkit.getPlayer(party.getOwnerName()); owner.sendMessage(F.main("Game", "All party members are dead!")); - if (_partyManager.getPreferencesManager().get(player).isActive(Preference.AUTO_JOIN_NEXT_GAME)) + if (_partyManager.getPreferencesManager().get(owner).isActive(Preference.AUTO_JOIN_NEXT_GAME)) { owner.playSound(player.getLocation(), Sound.NOTE_PLING, 1.0F, 1.0F); @@ -332,7 +332,7 @@ public class NextBestGameManager implements Listener owner.sendMessage(" "); owner.sendMessage(" "); - if (!_partyManager.getPreferencesManager().get(player).isActive(Preference.DISABLE_WARNING)) + if (!_partyManager.getPreferencesManager().get(owner).isActive(Preference.DISABLE_WARNING)) { sendWarning(owner); owner.sendMessage(" "); @@ -354,7 +354,7 @@ public class NextBestGameManager implements Listener owner.sendMessage(" "); owner.sendMessage(" "); - owner.getInventory().setItem(INVENTORY_SLOT, GO_TO_NEXT_ITEM); + giveItem(owner); owner.updateInventory(); } } @@ -424,7 +424,7 @@ public class NextBestGameManager implements Listener if (_partyManager.getPreferencesManager().get(owner).isActive(Preference.COUNTDOWN_ON_CLICK)) { _tasks.put(player.getUniqueId(), new CountdownRunnable(owner)); - player.getInventory().setItem(INVENTORY_SLOT, CANCEL_ITEM); + giveItem(player); } else { @@ -444,12 +444,11 @@ public class NextBestGameManager implements Listener if (_partyManager.getPreferencesManager().get(player).isActive(Preference.COUNTDOWN_ON_CLICK)) { _tasks.put(player.getUniqueId(), new CountdownRunnable(player)); - player.getInventory().setItem(INVENTORY_SLOT, CANCEL_ITEM); + giveItem(player); } else { MinecraftServer server = findBestGame(_partyManager.getClientManager().Get(player.getUniqueId()).hasPermission(ArcadeManager.Perm.JOIN_FULL), null); - player.getInventory().clear(); sendToServer(player, server); } } @@ -578,6 +577,16 @@ public class NextBestGameManager implements Listener _game = game; } + private void giveItem(Player player) + { + if (getGame().IsAlive(player)) + { + return; + } + + player.getInventory().setItem(INVENTORY_SLOT, GO_TO_NEXT_ITEM); + } + private int getCountdown(String motd) { int countdown; @@ -633,18 +642,20 @@ public class NextBestGameManager implements Listener if (party != null) { - party.getMembers().forEach(player1 -> + party.getMembers().forEach(partyMember -> { - player1.sendMessage(F.main("Game", "Cancelled sending your party to a new game!")); - player1.playSound(player.getLocation(), Sound.ANVIL_BREAK, 1.0F, 1.0F); - player1.getInventory().setItem(INVENTORY_SLOT, GO_TO_NEXT_ITEM); + partyMember.sendMessage(F.main("Game", "Cancelled sending your party to a new game!")); + partyMember.playSound(player.getLocation(), Sound.ANVIL_BREAK, 1.0F, 1.0F); + + giveItem(partyMember); }); } else { player.playSound(player.getLocation(), Sound.ANVIL_BREAK, 1.0F, 1.0F); - player.getInventory().setItem(INVENTORY_SLOT, GO_TO_NEXT_ITEM); player.sendMessage(F.main("Game", "Cancelled sending you to a new game!")); + + giveItem(player); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/player/ArcadePlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/player/ArcadePlayer.java deleted file mode 100644 index 73ebfaf00..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/player/ArcadePlayer.java +++ /dev/null @@ -1,29 +0,0 @@ -package nautilus.game.arcade.player; - -import org.bukkit.entity.Player; - -import mineplex.core.customdata.CustomDataManager; -import mineplex.core.customdata.MineplexPlayer; -import nautilus.game.arcade.ArcadeManager; - -/** - * Created by William (WilliamTiger). - * 16/12/15 - */ -public class ArcadePlayer extends MineplexPlayer -{ - private ArcadeManager _arcadeManager; - - public ArcadePlayer(Player player, CustomDataManager customDataManager, ArcadeManager arcadeManager) - { - super(player, customDataManager); - - _arcadeManager = arcadeManager; - } - - @Override - public String getKeyPrefix() - { - return "arcade." + _arcadeManager.GetGame().GetName().toLowerCase().replaceAll(" ", ".") + "."; - } -} diff --git a/Website/LOC.Website.Common/Models/AccountAdministrator.cs b/Website/LOC.Website.Common/Models/AccountAdministrator.cs index 1da074e07..5fd6d4398 100644 --- a/Website/LOC.Website.Common/Models/AccountAdministrator.cs +++ b/Website/LOC.Website.Common/Models/AccountAdministrator.cs @@ -418,6 +418,16 @@ return PunishmentResponse.PunishmentRemoved; } + public List GetAdminPunishments(String adminName) + { + String lowerName = adminName.ToLower(); + + using (var repository = _repositoryFactory.CreateRepository()) + { + return repository.Where(p => p.Admin.ToLower() == lowerName).ToList(); + } + } + public string PurchaseGameSalesPackage(PurchaseToken token) { try diff --git a/Website/LOC.Website.Common/Models/IAccountAdministrator.cs b/Website/LOC.Website.Common/Models/IAccountAdministrator.cs index 89778c258..b71557c2e 100644 --- a/Website/LOC.Website.Common/Models/IAccountAdministrator.cs +++ b/Website/LOC.Website.Common/Models/IAccountAdministrator.cs @@ -26,6 +26,7 @@ PunishmentResponse Punish(PunishToken punish); PunishmentResponse RemovePunishment(RemovePunishmentToken ban); + List GetAdminPunishments(String adminName); string PurchaseGameSalesPackage(PurchaseToken token); bool AccountExists(string name); diff --git a/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs b/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs index 111ad720d..3610249ec 100644 --- a/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs +++ b/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs @@ -192,5 +192,12 @@ var json = JsonConvert.SerializeObject(new ClientToken(_accountAdministrator.GetAccountByName(name))); return Content(json, "application/json"); } + + [HttpPost] + public ActionResult GetAdminPunishments(string name) + { + var json = JsonConvert.SerializeObject(_accountAdministrator.GetAdminPunishments(name)); + return Content(json, "application/json"); + } } } \ No newline at end of file diff --git a/Website/LOC.Website.Web/LOC.Website.Web.csproj b/Website/LOC.Website.Web/LOC.Website.Web.csproj index fa49ff7d8..231bed52e 100644 --- a/Website/LOC.Website.Web/LOC.Website.Web.csproj +++ b/Website/LOC.Website.Web/LOC.Website.Web.csproj @@ -1,5 +1,6 @@  - + + Debug AnyCPU @@ -15,6 +16,12 @@ v4.0 false false + true + + + + + 4.0 true @@ -366,8 +373,13 @@ + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + - + +