diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java index 66b107d9d..c3f0efc59 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java @@ -6,20 +6,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; -import mineplex.core.MiniPlugin; -import mineplex.core.antihack.types.*; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilGear; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.portal.Portal; -import mineplex.core.punish.Punish; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; - import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; @@ -33,6 +19,24 @@ import org.bukkit.event.player.PlayerVelocityEvent; import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.MiniPlugin; +import mineplex.core.account.CoreClientManager; +import mineplex.core.antihack.types.Fly; +import mineplex.core.antihack.types.Idle; +import mineplex.core.antihack.types.Speed; +import mineplex.core.common.Rank; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.portal.Portal; +import mineplex.core.preferences.PreferencesManager; +import mineplex.core.punish.Punish; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + public class AntiHack extends MiniPlugin { private static Object _antiHackLock = new Object(); @@ -43,6 +47,8 @@ public class AntiHack extends MiniPlugin public Punish Punish; public Portal Portal; + private PreferencesManager _preferences; + private CoreClientManager _clientManager; //Record Offenses private HashMap>> _suspicion = new HashMap>>(); @@ -71,12 +77,14 @@ public class AntiHack extends MiniPlugin private AntiHackRepository _repository; - protected AntiHack(JavaPlugin plugin, Punish punish, Portal portal) + protected AntiHack(JavaPlugin plugin, Punish punish, Portal portal, PreferencesManager preferences, CoreClientManager clientManager) { super("AntiHack", plugin); Punish = punish; Portal = portal; + _preferences = preferences; + _clientManager = clientManager; _repository = new AntiHackRepository(plugin.getConfig().getString("serverstatus.name")); _repository.initialize(); @@ -88,9 +96,9 @@ public class AntiHack extends MiniPlugin _detectors.add(new Speed(this)); } - public static void Initialize(JavaPlugin plugin, Punish punish, Portal portal) + public static void Initialize(JavaPlugin plugin, Punish punish, Portal portal, PreferencesManager preferences, CoreClientManager clientManager) { - Instance = new AntiHack(plugin, punish, portal); + Instance = new AntiHack(plugin, punish, portal, preferences, clientManager); } @EventHandler @@ -248,7 +256,7 @@ public class AntiHack extends MiniPlugin } for (Player admin : UtilServer.getPlayers()) - if (admin.isOp() && UtilGear.isMat(admin.getItemInHand(), Material.PAPER)) + if (_clientManager.Get(admin).GetRank().Has(Rank.MODERATOR) && _preferences.Get(admin).ShowMacReports) UtilPlayer.message(admin, C.cRed + C.Bold + player.getName() + " suspected for " + type + "."); // Print (Debug) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java index 3f764b6f2..7e647126c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java @@ -15,10 +15,10 @@ import mineplex.core.database.column.ColumnVarChar; public class PreferencesRepository extends RepositoryBase { - private static String CREATE_ACCOUNT_TABLE = "CREATE TABLE IF NOT EXISTS accountPreferences (id INT NOT NULL AUTO_INCREMENT, uuid VARCHAR(256), games BOOL NOT NULL DEFAULT 1, visibility BOOL NOT NULL DEFAULT 1, showChat BOOL NOT NULL DEFAULT 1, friendChat BOOL NOT NULL DEFAULT 1, privateMessaging BOOL NOT NULL DEFAULT 1, partyRequests BOOL NOT NULL DEFAULT 0, invisibility BOOL NOT NULL DEFAULT 0, forcefield BOOL NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE INDEX uuid_index (uuid));"; + private static String CREATE_ACCOUNT_TABLE = "CREATE TABLE IF NOT EXISTS accountPreferences (id INT NOT NULL AUTO_INCREMENT, uuid VARCHAR(256), games BOOL NOT NULL DEFAULT 1, visibility BOOL NOT NULL DEFAULT 1, showChat BOOL NOT NULL DEFAULT 1, friendChat BOOL NOT NULL DEFAULT 1, privateMessaging BOOL NOT NULL DEFAULT 1, partyRequests BOOL NOT NULL DEFAULT 0, invisibility BOOL NOT NULL DEFAULT 0, forcefield BOOL NOT NULL DEFAULT 0, showMacReports BOOL NOT NULL DEFAULT 0, ignoreVelocity BOOL NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE INDEX uuid_index (uuid));"; private static String INSERT_ACCOUNT = "INSERT INTO accountPreferences (uuid) VALUES (?) ON DUPLICATE KEY UPDATE uuid=uuid;"; - private static String RETRIEVE_ACCOUNT_PREFERENCES = "SELECT games, visibility, showChat, friendChat, privateMessaging, partyRequests, invisibility, forcefield FROM accountPreferences WHERE uuid = ?;"; - private static String UPDATE_ACCOUNT_PREFERENCES = "UPDATE accountPreferences SET games = ?, visibility = ?, showChat = ?, friendChat = ?, privateMessaging = ?, partyRequests = ?, invisibility = ?, forcefield = ? WHERE uuid=?;"; + private static String RETRIEVE_ACCOUNT_PREFERENCES = "SELECT games, visibility, showChat, friendChat, privateMessaging, partyRequests, invisibility, forcefield, showMacReports, ignoreVelocity FROM accountPreferences WHERE uuid = ?;"; + private static String UPDATE_ACCOUNT_PREFERENCES = "UPDATE accountPreferences SET games = ?, visibility = ?, showChat = ?, friendChat = ?, privateMessaging = ?, partyRequests = ?, invisibility = ?, forcefield = ?, showMacReports = ?, ignoreVelocity = ? WHERE uuid=?;"; public PreferencesRepository(JavaPlugin plugin, String connectionString) { @@ -54,7 +54,9 @@ public class PreferencesRepository extends RepositoryBase preparedStatement.setBoolean(6, entry.getValue().PartyRequests); preparedStatement.setBoolean(7, entry.getValue().Invisibility); preparedStatement.setBoolean(8, entry.getValue().HubForcefield); - preparedStatement.setString(9, entry.getKey()); + preparedStatement.setBoolean(9, entry.getValue().ShowMacReports); + preparedStatement.setBoolean(10, entry.getValue().IgnoreVelocity); + preparedStatement.setString(11, entry.getKey()); preparedStatement.addBatch(); } @@ -103,6 +105,8 @@ public class PreferencesRepository extends RepositoryBase preferences.PartyRequests = resultSet.getBoolean(6); preferences.Invisibility = resultSet.getBoolean(7); preferences.HubForcefield = resultSet.getBoolean(8); + preferences.ShowMacReports = resultSet.getBoolean(9); + preferences.IgnoreVelocity = resultSet.getBoolean(10); } } }, new ColumnVarChar("uuid", 100, uuid.toString())); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java index 6da2a2e16..7eb95ea1f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java @@ -11,4 +11,6 @@ public class UserPreferences public boolean PartyRequests = true; public boolean Invisibility = false; public boolean HubForcefield = false; + public boolean ShowMacReports = false; + public boolean IgnoreVelocity = false; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java index 59d972c17..fc2cb8f83 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java @@ -1,5 +1,9 @@ package mineplex.core.preferences.ui; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; + import mineplex.core.account.CoreClientManager; import mineplex.core.common.Rank; import mineplex.core.donation.DonationManager; @@ -9,10 +13,6 @@ import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.ShopItem; import mineplex.core.shop.page.ShopPageBase; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.entity.Player; - public class PreferencesPage extends ShopPageBase { private IButton _toggleHubGames; @@ -22,7 +22,9 @@ public class PreferencesPage extends ShopPageBase { } + + @EventHandler + public void ignoreVelocity(PlayerVelocityEvent event) + { + if (_clientManager.Get(event.getPlayer()).GetRank().Has(Rank.MODERATOR) && _preferences.Get(event.getPlayer()).IgnoreVelocity) + { + event.setCancelled(true); + } + } } diff --git a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/WorldManager.java b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/WorldManager.java index 6f849f709..d34d0cc9e 100644 --- a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/WorldManager.java +++ b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/WorldManager.java @@ -107,7 +107,10 @@ public class WorldManager try { - FileUtils.copyFile(new File(fileName), new File(File.separator + "home" + File.separator + "mineplex" + File.separator + "update" + File.separator + "maps" + File.separator + gameType.GetName() + File.separator + fileName)); + File zipFile = new File(fileName); + FileUtils.copyFile(zipFile, new File(File.separator + "home" + File.separator + "mineplex" + File.separator + "update" + File.separator + "maps" + File.separator + gameType.GetName() + File.separator + fileName)); + // Delete the zip file in root directory once zip is copied + FileUtils.deleteQuietly(zipFile); } catch (IOException e) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java index 7ce3a65e5..8b16001b9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -104,7 +104,7 @@ public class Arcade extends JavaPlugin _damageManager = new DamageManager(this, new CombatManager(this), new NpcManager(this, creature), disguiseManager); Punish punish = new Punish(this, webServerAddress, _clientManager); - AntiHack.Initialize(this, punish, portal); + AntiHack.Initialize(this, punish, portal, preferenceManager, _clientManager); BlockRestore blockRestore = new BlockRestore(this); 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 6239ca794..20ee29ca1 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 @@ -53,11 +53,13 @@ import nautilus.game.arcade.stats.AssistsStatTracker; import nautilus.game.arcade.stats.DamageDealtStatTracker; import nautilus.game.arcade.stats.DamageTakenStatTracker; import nautilus.game.arcade.stats.DeathsStatTracker; +import nautilus.game.arcade.stats.GamesPlayedStatTracker; import nautilus.game.arcade.stats.KillsStatTracker; import nautilus.game.arcade.stats.LoseStatTracker; import nautilus.game.arcade.stats.StatTracker; import nautilus.game.arcade.stats.TeamDeathsStatTracker; import nautilus.game.arcade.stats.TeamKillsStatTracker; +import nautilus.game.arcade.stats.TimeInGameStatTracker; import nautilus.game.arcade.stats.WinStatTracker; import nautilus.game.arcade.world.WorldData; @@ -282,7 +284,9 @@ public abstract class Game implements Listener new DamageDealtStatTracker(this), new DamageTakenStatTracker(this), new TeamDeathsStatTracker(this), - new TeamKillsStatTracker(this) + new TeamKillsStatTracker(this), + new GamesPlayedStatTracker(this), + new TimeInGameStatTracker(this) ); System.out.println("Loading " + GetName() + "..."); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/GamesPlayedStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/GamesPlayedStatTracker.java new file mode 100644 index 000000000..d87d1c3db --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/GamesPlayedStatTracker.java @@ -0,0 +1,26 @@ +package nautilus.game.arcade.stats; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game; + +public class GamesPlayedStatTracker extends StatTracker +{ + public GamesPlayedStatTracker(Game game) + { + super(game); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onGameStateChange(GameStateChangeEvent event) + { + if (event.GetState() == Game.GameState.Live) + { + for (Player player : getGame().GetPlayers(true)) + getGame().AddStat(player, "GamesPlayed", 1, false, true); + } + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/TimeInGameStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/TimeInGameStatTracker.java new file mode 100644 index 000000000..0b4751c0d --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/TimeInGameStatTracker.java @@ -0,0 +1,39 @@ +package nautilus.game.arcade.stats; + +import java.util.HashMap; +import java.util.UUID; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import nautilus.game.arcade.game.Game; + +public class TimeInGameStatTracker extends StatTracker +{ + private final HashMap _joinTimes = new HashMap<>(); + + public TimeInGameStatTracker(Game game) + { + super(game); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerJoin(PlayerJoinEvent event) + { + _joinTimes.put(event.getPlayer().getUniqueId(), System.currentTimeMillis()); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) + { + Long joinTime = _joinTimes.remove(event.getPlayer().getUniqueId()); + + if (joinTime != null) + { + int timeInGame = (int) ((System.currentTimeMillis() - joinTime) / 1000); + getGame().AddStat(event.getPlayer(), "TimeInGame", timeInGame, false, true); + } + } +}