From 522915a76a9ae76b487c50a5d9a25c3d8ebde099 Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 30 Mar 2022 20:40:07 -0300 Subject: [PATCH] Merge vanish and coreprotect-switch into main --- .../commands/Command_gtfo.java | 4 +- .../commands/Command_rollback.java | 77 - .../TotalFreedomMod/commands/Commands.java | 213 +- .../listener/BlockListener.java | 19 - .../listener/PlayerListener.java | 1755 ++++++++--------- .../world/RollbackManager.java | 316 --- src/main/resources/plugin.yml | 4 - 7 files changed, 979 insertions(+), 1409 deletions(-) delete mode 100644 src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_rollback.java delete mode 100644 src/main/java/me/StevenLawson/TotalFreedomMod/world/RollbackManager.java diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_gtfo.java b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_gtfo.java index 46a35ca..ec21987 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_gtfo.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_gtfo.java @@ -5,7 +5,6 @@ import me.StevenLawson.TotalFreedomMod.ban.BanManager; import me.StevenLawson.TotalFreedomMod.bridge.WorldEditBridge; import me.StevenLawson.TotalFreedomMod.manager.UUIDManager; import me.StevenLawson.TotalFreedomMod.util.Utilities; -import me.StevenLawson.TotalFreedomMod.world.RollbackManager; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.bukkit.ChatColor; @@ -48,7 +47,8 @@ public class Command_gtfo extends FreedomCommand { } // rollback - RollbackManager.rollback(player.getName()); + // RollbackManager.rollback(player.getName()); + // TODO: Use coreprotect API calls // deop player.setOp(false); diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_rollback.java b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_rollback.java deleted file mode 100644 index 0611a91..0000000 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_rollback.java +++ /dev/null @@ -1,77 +0,0 @@ -package me.StevenLawson.TotalFreedomMod.commands; - -import me.StevenLawson.TotalFreedomMod.util.Utilities; -import me.StevenLawson.TotalFreedomMod.world.RollbackManager; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -@CommandPermissions(level = AdminLevel.SUPER, source = SourceType.BOTH, blockHostConsole = true) -public class Command_rollback extends FreedomCommand { - @Override - public boolean run(CommandSender sender, org.bukkit.entity.Player sender_p, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (args.length == 0 || args.length > 2) { - return false; - } - - if (args.length == 1) { - if ("purgeall".equals(args[0])) { - Utilities.adminAction(sender.getName(), "Purging all rollback history", false); - playerMsg(sender, "Purged all rollback history for " + RollbackManager.purgeEntries() + " players."); - } - else - { - final String playerName = RollbackManager.findPlayer(args[0]); - - if (playerName == null) - { - playerMsg(sender, "That player has no entries stored."); - return true; - } - - if (RollbackManager.canUndoRollback(playerName)) - { - playerMsg(sender, "That player has just been rolled back."); - } - - Utilities.adminAction(sender.getName(), "Rolling back player: " + playerName, false); - playerMsg(sender, "Rolled back " + RollbackManager.rollback(playerName) + " edits for " + playerName + "."); - playerMsg(sender, "If this rollback was a mistake, use /rollback undo " + playerName + " within 40 seconds to reverse the rollback."); - } - return true; - } - - if (args.length == 2) - { - if ("purge".equalsIgnoreCase(args[0])) - { - final String playerName = RollbackManager.findPlayer(args[1]); - - if (playerName == null) - { - playerMsg(sender, "That player has no entries stored."); - return true; - } - - playerMsg(sender, "Purged " + RollbackManager.purgeEntries(playerName) + " rollback history entries for " + playerName + "."); - return true; - } - - if ("undo".equalsIgnoreCase(args[0])) - { - final String playerName = RollbackManager.findPlayer(args[1]); - - if (playerName == null) - { - playerMsg(sender, "That player hasn't been rolled back recently."); - return true; - } - - Utilities.adminAction(sender.getName(), "Reverting rollback for player: " + playerName, false); - playerMsg(sender, "Reverted " + RollbackManager.undoRollback(playerName) + " edits for " + playerName + "."); - return true; - } - } - - return false; - } -} diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Commands.java b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Commands.java index 90b0e9d..681bbbd 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Commands.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Commands.java @@ -3,112 +3,109 @@ package me.StevenLawson.TotalFreedomMod.commands; import org.bukkit.plugin.java.JavaPlugin; public class Commands { - - public static void registerCommands(JavaPlugin plugin) { - plugin.getCommand("adminmode").setExecutor(new Command_adminmode()); - plugin.getCommand("adminworld").setExecutor(new Command_adminworld()); - plugin.getCommand("blockcmd").setExecutor(new Command_blockcmd()); - plugin.getCommand("cage").setExecutor(new Command_cage()); - plugin.getCommand("cake").setExecutor(new Command_cake()); - plugin.getCommand("cartsit").setExecutor(new Command_cartsit()); - plugin.getCommand("cbtool").setExecutor(new Command_cbtool()); - plugin.getCommand("cmdlist").setExecutor(new Command_cmdlist()); - plugin.getCommand("cmdspy").setExecutor(new Command_cmdspy()); - plugin.getCommand("colorme").setExecutor(new Command_colorme()); - plugin.getCommand("creative").setExecutor(new Command_creative()); - plugin.getCommand("csay").setExecutor(new Command_csay()); - plugin.getCommand("deafen").setExecutor(new Command_deafen()); - plugin.getCommand("debug").setExecutor(new Command_debug()); - plugin.getCommand("denick").setExecutor(new Command_denick()); - plugin.getCommand("deop").setExecutor(new Command_deop()); - plugin.getCommand("deopall").setExecutor(new Command_deopall()); - plugin.getCommand("dispfill").setExecutor(new Command_dispfill()); - plugin.getCommand("doom").setExecutor(new Command_doom()); - plugin.getCommand("enchant").setExecutor(new Command_enchant()); - plugin.getCommand("ender").setExecutor(new Command_ender()); - plugin.getCommand("expel").setExecutor(new Command_expel()); - plugin.getCommand("findip").setExecutor(new Command_findip()); - plugin.getCommand("flatlands").setExecutor(new Command_flatlands()); - plugin.getCommand("fr").setExecutor(new Command_fr()); - plugin.getCommand("fuckoff").setExecutor(new Command_fuckoff()); - plugin.getCommand("gadmin").setExecutor(new Command_gadmin()); - plugin.getCommand("gcmd").setExecutor(new Command_gcmd()); - plugin.getCommand("glist").setExecutor(new Command_glist()); - plugin.getCommand("gtfo").setExecutor(new Command_gtfo()); - plugin.getCommand("halt").setExecutor(new Command_halt()); - plugin.getCommand("health").setExecutor(new Command_health()); - plugin.getCommand("invis").setExecutor(new Command_invis()); - plugin.getCommand("jumppads").setExecutor(new Command_jumppads()); - plugin.getCommand("kicknoob").setExecutor(new Command_kicknoob()); - plugin.getCommand("landmine").setExecutor(new Command_landmine()); - plugin.getCommand("lastcmd").setExecutor(new Command_lastcmd()); - plugin.getCommand("list").setExecutor(new Command_list()); - plugin.getCommand("localspawn").setExecutor(new Command_localspawn()); - plugin.getCommand("lockup").setExecutor(new Command_lockup()); - plugin.getCommand("logs").setExecutor(new Command_logs()); - plugin.getCommand("moblimiter").setExecutor(new Command_moblimiter()); - plugin.getCommand("mp").setExecutor(new Command_mp()); - plugin.getCommand("mp44").setExecutor(new Command_mp44()); - plugin.getCommand("myadmin").setExecutor(new Command_myadmin()); - plugin.getCommand("nether").setExecutor(new Command_nether()); - plugin.getCommand("nf").setExecutor(new Command_nf()); - plugin.getCommand("nickclean").setExecutor(new Command_nickclean()); - plugin.getCommand("nicknyan").setExecutor(new Command_nicknyan()); - plugin.getCommand("o").setExecutor(new Command_o()); - plugin.getCommand("onlinemode").setExecutor(new Command_onlinemode()); - plugin.getCommand("op").setExecutor(new Command_op()); - plugin.getCommand("opall").setExecutor(new Command_opall()); - plugin.getCommand("opme").setExecutor(new Command_opme()); - plugin.getCommand("ops").setExecutor(new Command_ops()); - plugin.getCommand("orbit").setExecutor(new Command_orbit()); - plugin.getCommand("overlord").setExecutor(new Command_overlord()); - plugin.getCommand("permban").setExecutor(new Command_permban()); - plugin.getCommand("plugincontrol").setExecutor(new Command_plugincontrol()); - plugin.getCommand("potion").setExecutor(new Command_potion()); - plugin.getCommand("premium").setExecutor(new Command_premium()); - plugin.getCommand("protectarea").setExecutor(new Command_protectarea()); - plugin.getCommand("purgeall").setExecutor(new Command_purgeall()); - plugin.getCommand("qdeop").setExecutor(new Command_qdeop()); - plugin.getCommand("qop").setExecutor(new Command_qop()); - plugin.getCommand("radar").setExecutor(new Command_radar()); - plugin.getCommand("rank").setExecutor(new Command_rank()); - plugin.getCommand("rawsay").setExecutor(new Command_rawsay()); - plugin.getCommand("rd").setExecutor(new Command_rd()); - plugin.getCommand("report").setExecutor(new Command_report()); - plugin.getCommand("ro").setExecutor(new Command_ro()); - plugin.getCommand("rollback").setExecutor(new Command_rollback()); - plugin.getCommand("saconfig").setExecutor(new Command_saconfig()); - plugin.getCommand("say").setExecutor(new Command_say()); - plugin.getCommand("setl").setExecutor(new Command_setl()); - plugin.getCommand("setlevel").setExecutor(new Command_setlevel()); - plugin.getCommand("setlever").setExecutor(new Command_setlever()); - plugin.getCommand("setspawnworld").setExecutor(new Command_setspawnworld()); - plugin.getCommand("smite").setExecutor(new Command_smite()); - plugin.getCommand("spectator").setExecutor(new Command_spectator()); - plugin.getCommand("status").setExecutor(new Command_status()); - plugin.getCommand("stfu").setExecutor(new Command_stfu()); - plugin.getCommand("stop").setExecutor(new Command_stop()); - plugin.getCommand("survival").setExecutor(new Command_survival()); - plugin.getCommand("tag").setExecutor(new Command_tag()); - plugin.getCommand("tagnyan").setExecutor(new Command_tagnyan()); - plugin.getCommand("tban").setExecutor(new Command_tban()); - plugin.getCommand("tempban").setExecutor(new Command_tempban()); - plugin.getCommand("tfbanlist").setExecutor(new Command_tfbanlist()); - plugin.getCommand("tfipbanlist").setExecutor(new Command_tfipbanlist()); - plugin.getCommand("tfm").setExecutor(new Command_tfm()); - plugin.getCommand("toggle").setExecutor(new Command_toggle()); - plugin.getCommand("tossmob").setExecutor(new Command_tossmob()); - plugin.getCommand("trail").setExecutor(new Command_trail()); - plugin.getCommand("updatetfm").setExecutor(new Command_updatetfm()); - plugin.getCommand("uuid").setExecutor(new Command_uuid()); - plugin.getCommand("warn").setExecutor(new Command_warn()); - plugin.getCommand("whitelist").setExecutor(new Command_whitelist()); - plugin.getCommand("whohas").setExecutor(new Command_whohas()); - plugin.getCommand("wildcard").setExecutor(new Command_wildcard()); - plugin.getCommand("wipeflatlands").setExecutor(new Command_wipeflatlands()); - plugin.getCommand("wipeuserdata").setExecutor(new Command_wipeuserdata()); - plugin.getCommand("whoami").setExecutor(new Command_whoami()); - plugin.getCommand("resetplayer").setExecutor(new Command_resetplayer()); - plugin.getCommand("vanish").setExecutor(new Command_vanish()); - } + public static void registerCommands(JavaPlugin plugin) { + plugin.getCommand("adminmode").setExecutor(new Command_adminmode()); + plugin.getCommand("adminworld").setExecutor(new Command_adminworld()); + plugin.getCommand("blockcmd").setExecutor(new Command_blockcmd()); + plugin.getCommand("cage").setExecutor(new Command_cage()); + plugin.getCommand("cake").setExecutor(new Command_cake()); + plugin.getCommand("cartsit").setExecutor(new Command_cartsit()); + plugin.getCommand("cbtool").setExecutor(new Command_cbtool()); + plugin.getCommand("cmdlist").setExecutor(new Command_cmdlist()); + plugin.getCommand("cmdspy").setExecutor(new Command_cmdspy()); + plugin.getCommand("colorme").setExecutor(new Command_colorme()); + plugin.getCommand("creative").setExecutor(new Command_creative()); + plugin.getCommand("csay").setExecutor(new Command_csay()); + plugin.getCommand("deafen").setExecutor(new Command_deafen()); + plugin.getCommand("debug").setExecutor(new Command_debug()); + plugin.getCommand("denick").setExecutor(new Command_denick()); + plugin.getCommand("deop").setExecutor(new Command_deop()); + plugin.getCommand("deopall").setExecutor(new Command_deopall()); + plugin.getCommand("dispfill").setExecutor(new Command_dispfill()); + plugin.getCommand("doom").setExecutor(new Command_doom()); + plugin.getCommand("enchant").setExecutor(new Command_enchant()); + plugin.getCommand("ender").setExecutor(new Command_ender()); + plugin.getCommand("expel").setExecutor(new Command_expel()); + plugin.getCommand("findip").setExecutor(new Command_findip()); + plugin.getCommand("flatlands").setExecutor(new Command_flatlands()); + plugin.getCommand("fr").setExecutor(new Command_fr()); + plugin.getCommand("fuckoff").setExecutor(new Command_fuckoff()); + plugin.getCommand("gadmin").setExecutor(new Command_gadmin()); + plugin.getCommand("gcmd").setExecutor(new Command_gcmd()); + plugin.getCommand("glist").setExecutor(new Command_glist()); + plugin.getCommand("gtfo").setExecutor(new Command_gtfo()); + plugin.getCommand("halt").setExecutor(new Command_halt()); + plugin.getCommand("health").setExecutor(new Command_health()); + plugin.getCommand("invis").setExecutor(new Command_invis()); + plugin.getCommand("jumppads").setExecutor(new Command_jumppads()); + plugin.getCommand("kicknoob").setExecutor(new Command_kicknoob()); + plugin.getCommand("landmine").setExecutor(new Command_landmine()); + plugin.getCommand("lastcmd").setExecutor(new Command_lastcmd()); + plugin.getCommand("list").setExecutor(new Command_list()); + plugin.getCommand("localspawn").setExecutor(new Command_localspawn()); + plugin.getCommand("lockup").setExecutor(new Command_lockup()); + plugin.getCommand("logs").setExecutor(new Command_logs()); + plugin.getCommand("moblimiter").setExecutor(new Command_moblimiter()); + plugin.getCommand("mp").setExecutor(new Command_mp()); + plugin.getCommand("mp44").setExecutor(new Command_mp44()); + plugin.getCommand("myadmin").setExecutor(new Command_myadmin()); + plugin.getCommand("nether").setExecutor(new Command_nether()); + plugin.getCommand("nf").setExecutor(new Command_nf()); + plugin.getCommand("nickclean").setExecutor(new Command_nickclean()); + plugin.getCommand("nicknyan").setExecutor(new Command_nicknyan()); + plugin.getCommand("o").setExecutor(new Command_o()); + plugin.getCommand("onlinemode").setExecutor(new Command_onlinemode()); + plugin.getCommand("op").setExecutor(new Command_op()); + plugin.getCommand("opall").setExecutor(new Command_opall()); + plugin.getCommand("opme").setExecutor(new Command_opme()); + plugin.getCommand("ops").setExecutor(new Command_ops()); + plugin.getCommand("orbit").setExecutor(new Command_orbit()); + plugin.getCommand("overlord").setExecutor(new Command_overlord()); + plugin.getCommand("permban").setExecutor(new Command_permban()); + plugin.getCommand("plugincontrol").setExecutor(new Command_plugincontrol()); + plugin.getCommand("potion").setExecutor(new Command_potion()); + plugin.getCommand("premium").setExecutor(new Command_premium()); + plugin.getCommand("protectarea").setExecutor(new Command_protectarea()); + plugin.getCommand("purgeall").setExecutor(new Command_purgeall()); + plugin.getCommand("qdeop").setExecutor(new Command_qdeop()); + plugin.getCommand("qop").setExecutor(new Command_qop()); + plugin.getCommand("radar").setExecutor(new Command_radar()); + plugin.getCommand("rank").setExecutor(new Command_rank()); + plugin.getCommand("rawsay").setExecutor(new Command_rawsay()); + plugin.getCommand("rd").setExecutor(new Command_rd()); + plugin.getCommand("report").setExecutor(new Command_report()); + plugin.getCommand("ro").setExecutor(new Command_ro()); + plugin.getCommand("saconfig").setExecutor(new Command_saconfig()); + plugin.getCommand("say").setExecutor(new Command_say()); + plugin.getCommand("setl").setExecutor(new Command_setl()); + plugin.getCommand("setlevel").setExecutor(new Command_setlevel()); + plugin.getCommand("setlever").setExecutor(new Command_setlever()); + plugin.getCommand("setspawnworld").setExecutor(new Command_setspawnworld()); + plugin.getCommand("smite").setExecutor(new Command_smite()); + plugin.getCommand("spectator").setExecutor(new Command_spectator()); + plugin.getCommand("status").setExecutor(new Command_status()); + plugin.getCommand("stfu").setExecutor(new Command_stfu()); + plugin.getCommand("stop").setExecutor(new Command_stop()); + plugin.getCommand("survival").setExecutor(new Command_survival()); + plugin.getCommand("tag").setExecutor(new Command_tag()); + plugin.getCommand("tagnyan").setExecutor(new Command_tagnyan()); + plugin.getCommand("tban").setExecutor(new Command_tban()); + plugin.getCommand("tempban").setExecutor(new Command_tempban()); + plugin.getCommand("tfbanlist").setExecutor(new Command_tfbanlist()); + plugin.getCommand("tfipbanlist").setExecutor(new Command_tfipbanlist()); + plugin.getCommand("tfm").setExecutor(new Command_tfm()); + plugin.getCommand("toggle").setExecutor(new Command_toggle()); + plugin.getCommand("tossmob").setExecutor(new Command_tossmob()); + plugin.getCommand("trail").setExecutor(new Command_trail()); + plugin.getCommand("updatetfm").setExecutor(new Command_updatetfm()); + plugin.getCommand("uuid").setExecutor(new Command_uuid()); + plugin.getCommand("warn").setExecutor(new Command_warn()); + plugin.getCommand("whitelist").setExecutor(new Command_whitelist()); + plugin.getCommand("whohas").setExecutor(new Command_whohas()); + plugin.getCommand("wildcard").setExecutor(new Command_wildcard()); + plugin.getCommand("wipeflatlands").setExecutor(new Command_wipeflatlands()); + plugin.getCommand("wipeuserdata").setExecutor(new Command_wipeuserdata()); + plugin.getCommand("whoami").setExecutor(new Command_whoami()); + plugin.getCommand("resetplayer").setExecutor(new Command_resetplayer()); + } } diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/BlockListener.java b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/BlockListener.java index c47fc88..61c17f1 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/BlockListener.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/BlockListener.java @@ -8,7 +8,6 @@ import me.StevenLawson.TotalFreedomMod.player.HeartBeat; import me.StevenLawson.TotalFreedomMod.player.PlayerData; import me.StevenLawson.TotalFreedomMod.util.Utilities; import me.StevenLawson.TotalFreedomMod.world.ProtectedArea; -import me.StevenLawson.TotalFreedomMod.world.RollbackManager; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -251,24 +250,6 @@ public class BlockListener implements Listener { } } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onRollbackBlockBreak(BlockBreakEvent event) - { - if (!AdminList.isSuperAdmin(event.getPlayer())) - { - RollbackManager.blockBreak(event); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onRollbackBlockPlace(BlockPlaceEvent event) - { - if (!AdminList.isSuperAdmin(event.getPlayer())) - { - RollbackManager.blockPlace(event); - } - } - @EventHandler(priority = EventPriority.HIGH) public void onBlockFromTo(BlockFromToEvent event) { diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java index 45958c8..294ad4b 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java @@ -1,47 +1,25 @@ package me.StevenLawson.TotalFreedomMod.listener; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; -import java.util.Random; -import java.util.regex.Pattern; import me.StevenLawson.TotalFreedomMod.Log; import me.StevenLawson.TotalFreedomMod.Server; import me.StevenLawson.TotalFreedomMod.TotalFreedomMod; import me.StevenLawson.TotalFreedomMod.admin.AdminList; import me.StevenLawson.TotalFreedomMod.ban.BanManager; +import me.StevenLawson.TotalFreedomMod.config.TagConfiguration; +import me.StevenLawson.TotalFreedomMod.discord.bridge.DiscordBridge; import me.StevenLawson.TotalFreedomMod.command.CommandBlocker; -import me.StevenLawson.TotalFreedomMod.commands.Command_doom; import me.StevenLawson.TotalFreedomMod.commands.Command_landmine; import me.StevenLawson.TotalFreedomMod.config.ConfigurationEntry; import me.StevenLawson.TotalFreedomMod.config.MainConfig; -import me.StevenLawson.TotalFreedomMod.config.TagConfiguration; -import me.StevenLawson.TotalFreedomMod.discord.bridge.DiscordBridge; import me.StevenLawson.TotalFreedomMod.fun.JumpPads; -import me.StevenLawson.TotalFreedomMod.manager.UUIDManager; -import me.StevenLawson.TotalFreedomMod.manager.VanishManager; -import me.StevenLawson.TotalFreedomMod.player.HeartBeat; -import me.StevenLawson.TotalFreedomMod.player.Player; -import me.StevenLawson.TotalFreedomMod.player.PlayerData; -import me.StevenLawson.TotalFreedomMod.player.PlayerList; -import me.StevenLawson.TotalFreedomMod.player.PlayerRank; +import me.StevenLawson.TotalFreedomMod.player.*; import me.StevenLawson.TotalFreedomMod.util.DeprecationUtil; import me.StevenLawson.TotalFreedomMod.util.SynchronousUtil; import me.StevenLawson.TotalFreedomMod.util.Utilities; import me.StevenLawson.TotalFreedomMod.world.AdminWorld; -import me.StevenLawson.TotalFreedomMod.world.RollbackManager; -import me.StevenLawson.TotalFreedomMod.world.RollbackManager.RollbackEntry; import net.md_5.bungee.api.chat.TextComponent; import org.apache.commons.lang3.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.TNTPrimed; @@ -50,866 +28,877 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.block.LeavesDecayEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerKickEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; +import java.util.*; +import java.util.List; +import java.util.Map.Entry; +import java.util.regex.Pattern; + public class PlayerListener implements Listener { - - public static final List BLOCKED_MUTED_CMDS = Arrays.asList( - StringUtils.split("say,main.java.me,msg,m,tell,r,reply,mail,email", ",")); - public static final List MOCK_THE_MOLES_FOREVER = Arrays.asList( - "%s advocates for doxxing of children.", "%s is fat.", "%s has no real friends.", - "%s's parents don't love them.", "%s doesn't go outside.", "%s doesn't have a life.", - "%s is a virgin.", "%s wants a cupcake.", "%s glows in the dark.", - "%s is friends with F_x.", "%s should take a seat."); - public static final List BY_BEING_A_MOLE_YOU_MOCK_YOURSELF = Arrays.asList( - "I love kissing children!", "Can I have a cupcake?", - "Officer, it was just a silly goof! Why aren't you laughing?", "I love MCFreedom!", - "I love FreedomForever!", "I'm here to collect my cupcake.", "Do you have any cupcakes?", - "I like pineapple pizza.", "Do you have any pineapple pizza?", - "I dislike Cherry Pepsi Max.", - "Guys, did you know my father is getting milk? He hasn't been back for hours, I'm worried...", - "My wife's boyfriend is a nice guy.", "My wife's boyfriend got me a new Switch!", - "My wife's boyfriend got me a new PS5!"); - public static final int MSG_PER_HEARTBEAT = 10; - public static final int DEFAULT_PORT = 25565; - public static final int MAX_XY_COORD = 30000000; - - @EventHandler(priority = EventPriority.HIGH) - public void onPlayerInteract(PlayerInteractEvent event) { - final org.bukkit.entity.Player player = event.getPlayer(); - final PlayerData playerdata = PlayerData.getPlayerData(player); - - switch (event.getAction()) { - case RIGHT_CLICK_AIR: - case RIGHT_CLICK_BLOCK: { - switch (event.getMaterial()) { - case WATER_BUCKET: { - if (ConfigurationEntry.ALLOW_WATER_PLACE.getBoolean()) { - break; - } - - player.getInventory().setItem(player.getInventory().getHeldItemSlot(), - new ItemStack(Material.COOKIE, 1)); - player.sendMessage( - ChatColor.GRAY + "Water buckets are currently disabled."); - event.setCancelled(true); - break; - } - - case LAVA_BUCKET: { - if (ConfigurationEntry.ALLOW_LAVA_PLACE.getBoolean()) { - break; - } - - player.getInventory().setItem(player.getInventory().getHeldItemSlot(), - new ItemStack(Material.COOKIE, 1)); - player.sendMessage(ChatColor.GRAY + "Lava buckets are currently disabled."); - event.setCancelled(true); - break; - } - - case EXPLOSIVE_MINECART: { - if (ConfigurationEntry.ALLOW_TNT_MINECARTS.getBoolean()) { - break; - } - - player.getInventory().clear(player.getInventory().getHeldItemSlot()); - player.sendMessage( - ChatColor.GRAY + "TNT minecarts are currently disabled."); - event.setCancelled(true); - break; - } - } - break; - } - - case LEFT_CLICK_AIR: - case LEFT_CLICK_BLOCK: { - switch (event.getMaterial()) { - case STICK: { - if (!AdminList.isSuperAdmin(player)) { - break; - } - - event.setCancelled(true); - - final Location location = DeprecationUtil.getTargetBlock(player, null, 5) - .getLocation(); - final List entries = RollbackManager.getEntriesAtLocation( - location); - - if (entries.isEmpty()) { - Utilities.playerMsg(player, "No block edits at that location."); - break; - } - - Utilities.playerMsg(player, "Block edits at (" - + ChatColor.WHITE + "x" + location.getBlockX() - + ", y" + location.getBlockY() - + ", z" + location.getBlockZ() - + ChatColor.BLUE + ")" + ChatColor.WHITE + ":", ChatColor.BLUE); - for (RollbackEntry entry : entries) { - Utilities.playerMsg(player, - " - " + ChatColor.BLUE + entry.author + " " + entry.getType() + " " - + StringUtils.capitalize( - entry.getMaterial().toString().toLowerCase()) + (entry.data == 0 - ? "" : ":" + entry.data)); - } - - break; - } - - case BONE: { - if (!playerdata.mobThrowerEnabled()) { - break; - } - - Location player_pos = player.getLocation(); - Vector direction = player_pos.getDirection().normalize(); - - LivingEntity rezzed_mob = (LivingEntity) player.getWorld() - .spawnEntity(player_pos.add(direction.multiply(2.0)), - playerdata.mobThrowerCreature()); - rezzed_mob.setVelocity(direction.multiply(playerdata.mobThrowerSpeed())); - playerdata.enqueueMob(rezzed_mob); - - event.setCancelled(true); - break; - } - - case SULPHUR: { - if (!playerdata.isMP44Armed()) { - break; - } - - event.setCancelled(true); - - if (playerdata.toggleMP44Firing()) { - playerdata.startArrowShooter(TotalFreedomMod.plugin); - } else { - playerdata.stopArrowShooter(); - } - break; - } - - case BLAZE_ROD: { - if (!ConfigurationEntry.ALLOW_EXPLOSIONS.getBoolean()) { - break; - } - - if (!AdminList.isSeniorAdmin(player, true)) { - break; - } - - event.setCancelled(true); - Block targetBlock; - - if (event.getAction().equals(Action.LEFT_CLICK_AIR)) { - targetBlock = DeprecationUtil.getTargetBlock(player, null, 120); - } else { - targetBlock = event.getClickedBlock(); - } - - if (targetBlock == null) { - player.sendMessage("Can't resolve target block."); - break; - } - - player.getWorld().createExplosion(targetBlock.getLocation(), 4F, true); - player.getWorld().strikeLightning(targetBlock.getLocation()); - - break; - } - - case CARROT: { - if (!ConfigurationEntry.ALLOW_EXPLOSIONS.getBoolean()) { - break; - } - - if (!AdminList.isSeniorAdmin(player, true)) { - break; - } - - Location location = player.getLocation().clone(); - - Vector playerPostion = location.toVector().add(new Vector(0.0, 1.65, 0.0)); - Vector playerDirection = location.getDirection().normalize(); - - double distance = 150.0; - Block targetBlock = DeprecationUtil.getTargetBlock(player, null, - Math.round((float) distance)); - if (targetBlock != null) { - distance = location.distance(targetBlock.getLocation()); - } - - final List affected = new ArrayList(); - - Block lastBlock = null; - for (double offset = 0.0; offset <= distance; offset += (distance / 25.0)) { - Block block = playerPostion.clone() - .add(playerDirection.clone().multiply(offset)) - .toLocation(player.getWorld()).getBlock(); - - if (!block.equals(lastBlock)) { - if (block.isEmpty()) { - affected.add(block); - block.setType(Material.TNT); - } else { - break; - } - } - - lastBlock = block; - } - - new BukkitRunnable() { - @Override - public void run() { - for (Block tntBlock : affected) { - TNTPrimed tnt = tntBlock.getWorld() - .spawn(tntBlock.getLocation(), TNTPrimed.class); - tnt.setFuseTicks(5); - tntBlock.setType(Material.AIR); - } - } - }.runTaskLater(TotalFreedomMod.plugin, 30L); - - event.setCancelled(true); - break; - } - - case RAW_FISH: { - final int RADIUS_HIT = 5; - final int STRENGTH = 4; - - // Clownfish - if (DeprecationUtil.getData_MaterialData(event.getItem().getData()) == 2) { - if (AdminList.isSeniorAdmin(player, true) || AdminList.isTelnetAdmin( - player, true)) { - boolean didHit = false; - - final Location playerLoc = player.getLocation(); - final Vector playerLocVec = playerLoc.toVector(); - - final List players = player.getWorld() - .getPlayers(); - for (final org.bukkit.entity.Player target : players) { - if (target == player) { - continue; - } - - final Location targetPos = target.getLocation(); - final Vector targetPosVec = targetPos.toVector(); - - try { - if (targetPosVec.distanceSquared(playerLocVec) < (RADIUS_HIT - * RADIUS_HIT)) { - Utilities.setFlying(player, false); - target.setVelocity( - targetPosVec.subtract(playerLocVec).normalize() - .multiply(STRENGTH)); - didHit = true; - } - } catch (IllegalArgumentException ex) { - } - } - - if (didHit) { - final Sound[] sounds = Sound.values(); - for (Sound sound : sounds) { - if (sound.toString().contains("HIT")) { - playerLoc.getWorld() - .playSound(randomOffset(playerLoc, 5.0), sound, - 100.0f, - randomDoubleRange(0.5, 2.0).floatValue()); - } - } - } - } else { - final StringBuilder msg = new StringBuilder(); - final char[] chars = (player.getName() - + " is a clown.").toCharArray(); - for (char c : chars) { - msg.append(Utilities.randomChatColor()).append(c); - } - Utilities.bcastMsg(msg.toString()); - - player.getInventory().getItemInHand().setType(Material.POTATO_ITEM); - } - - event.setCancelled(true); - break; - } - } - } - break; - } - } - } - - private static final Random RANDOM = new Random(); - - private static Location randomOffset(Location a, double magnitude) { - return a.clone() - .add(randomDoubleRange(-1.0, 1.0) * magnitude, randomDoubleRange(-1.0, 1.0) * magnitude, - randomDoubleRange(-1.0, 1.0) * magnitude); - } - - private static Double randomDoubleRange(double min, double max) { - return min + (RANDOM.nextDouble() * ((max - min) + 1.0)); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerTeleport(PlayerTeleportEvent event) { - final org.bukkit.entity.Player player = event.getPlayer(); - final PlayerData playerdata = PlayerData.getPlayerData(player); - // Check absolute value to account for negatives - if (Math.abs(event.getTo().getX()) >= MAX_XY_COORD - || Math.abs(event.getTo().getZ()) >= MAX_XY_COORD) { - event.setCancelled(true); // illegal position, cancel it - } - - if (!AdminList.isSuperAdmin(player) && playerdata.isFrozen()) { - Utilities.setFlying(player, true); - event.setTo(playerdata.getFreezeLocation()); - return; // Don't process adminworld validation - } - - AdminWorld.getInstance().validateMovement(event); - } - - @EventHandler(priority = EventPriority.NORMAL) - public void onPlayerMove(PlayerMoveEvent event) { - final Location from = event.getFrom(); - final Location to = event.getTo(); - try { - if (from.getWorld() == to.getWorld() && from.distanceSquared(to) < (0.0001 * 0.0001)) { - // If player just rotated, but didn't move, don't process this event. - return; - } - } catch (IllegalArgumentException ex) { - } - - if (!AdminWorld.getInstance().validateMovement(event)) { - return; - } - - final org.bukkit.entity.Player player = event.getPlayer(); - final PlayerData playerdata = PlayerData.getPlayerData(player); - - for (Entry fuckoff : TotalFreedomMod.fuckoffEnabledFor.entrySet()) { - org.bukkit.entity.Player fuckoffPlayer = fuckoff.getKey(); - - if (fuckoffPlayer.equals(player) || !fuckoffPlayer.isOnline()) { - continue; - } - - double fuckoffRange = fuckoff.getValue(); - - Location playerLocation = player.getLocation(); - Location fuckoffLocation = fuckoffPlayer.getLocation(); - - double distanceSquared; - try { - distanceSquared = playerLocation.distanceSquared(fuckoffLocation); - } catch (IllegalArgumentException ex) { - continue; - } - - if (distanceSquared < (fuckoffRange * fuckoffRange)) { - event.setTo(fuckoffLocation.clone().add( - playerLocation.subtract(fuckoffLocation).toVector().normalize() - .multiply(fuckoffRange * 1.1))); - break; - } - } - - // Freeze - if (!AdminList.isSuperAdmin(player) && playerdata.isFrozen()) { - Utilities.setFlying(player, true); - event.setTo(playerdata.getFreezeLocation()); - } - - if (playerdata.isCaged()) { - Location targetPos = player.getLocation().add(0, 1, 0); - - boolean outOfCage; - if (!targetPos.getWorld().equals(playerdata.getCagePos().getWorld())) { - outOfCage = true; - } else { - outOfCage = targetPos.distanceSquared(playerdata.getCagePos()) > (2.5 * 2.5); - } - - if (outOfCage) { - playerdata.setCaged(true, targetPos, - playerdata.getCageMaterial(PlayerData.CageLayer.OUTER), - playerdata.getCageMaterial(PlayerData.CageLayer.INNER)); - playerdata.regenerateHistory(); - playerdata.clearHistory(); - Utilities.buildHistory(targetPos, 2, playerdata); - Utilities.generateHollowCube(targetPos, 2, - playerdata.getCageMaterial(PlayerData.CageLayer.OUTER)); - Utilities.generateCube(targetPos, 1, - playerdata.getCageMaterial(PlayerData.CageLayer.INNER)); - } - } - - if (playerdata.isOrbiting()) { - if (player.getVelocity().length() < playerdata.orbitStrength() * (2.0 / 3.0)) { - player.setVelocity(new Vector(0, playerdata.orbitStrength(), 0)); - } - } - - if (JumpPads.getMode().isOn()) { - JumpPads.PlayerMoveEvent(event); - } - - if (!(ConfigurationEntry.LANDMINES_ENABLED.getBoolean() - && ConfigurationEntry.ALLOW_EXPLOSIONS.getBoolean())) { - return; - } - - final Iterator landmines = Command_landmine.TFM_LandmineData.landmines.iterator(); - while (landmines.hasNext()) { - final Command_landmine.TFM_LandmineData landmine = landmines.next(); - - final Location location = landmine.location; - if (location.getBlock().getType() != Material.TNT) { - landmines.remove(); - continue; - } - - if (landmine.player.equals(player)) { - break; - } - - if (!player.getWorld().equals(location.getWorld())) { - continue; - } - - if (!(player.getLocation().distanceSquared(location) <= (landmine.radius - * landmine.radius))) { - break; - } - - landmine.location.getBlock().setType(Material.AIR); - - final TNTPrimed tnt1 = location.getWorld().spawn(location, TNTPrimed.class); - tnt1.setFuseTicks(40); - tnt1.setPassenger(player); - tnt1.setVelocity(new Vector(0.0, 2.0, 0.0)); - - final TNTPrimed tnt2 = location.getWorld().spawn(player.getLocation(), TNTPrimed.class); - tnt2.setFuseTicks(1); - - player.setGameMode(GameMode.SURVIVAL); - landmines.remove(); - } - } - - @EventHandler(priority = EventPriority.NORMAL) - public void onLeavesDecay(LeavesDecayEvent event) { - event.setCancelled(true); - } - - @EventHandler(priority = EventPriority.NORMAL) - public void onPlayerChat(AsyncPlayerChatEvent event) { - try { - final org.bukkit.entity.Player player = event.getPlayer(); - String message = event.getMessage().trim(); - - final PlayerData playerdata = PlayerData.getPlayerDataSync(player); - - // Check for spam - final Long lastRan = HeartBeat.getLastRan(); - if (lastRan == null - || lastRan + TotalFreedomMod.HEARTBEAT_RATE * 1000L < System.currentTimeMillis()) { - //Log.warning("Heartbeat service timeout - can't check block place/break rates."); - } else { - if (playerdata.incrementAndGetMsgCount() > MSG_PER_HEARTBEAT) { - SynchronousUtil.bcastMsg( - player.getName() + " was automatically kicked for spamming chat.", - ChatColor.RED); - SynchronousUtil.autoEject(player, "Kicked for spamming chat."); - - playerdata.resetMsgCount(); - - event.setCancelled(true); - return; - } - } - - // Check for message repeat - if (playerdata.getLastMessage().equalsIgnoreCase(message)) { - SynchronousUtil.playerMsg(player, "Please do not repeat messages."); - event.setCancelled(true); - return; - } - - playerdata.setLastMessage(message); - - // Check for muted - if (playerdata.isMuted()) { - if (!AdminList.isSuperAdminSync(player)) { - SynchronousUtil.playerMsg(player, - ChatColor.RED + "You are muted, STFU! - You will be unmuted in 5 minutes."); - event.setCancelled(true); - return; - } - - playerdata.setMuted(false); - } - - // Strip color from messages - message = ChatColor.stripColor(message); - - // Truncate messages that are too long - 100 characters is vanilla client max - if (message.length() > 100) { - message = message.substring(0, 100); - SynchronousUtil.playerMsg(player, - "Message was shortened because it was too long to send."); - } - - // Check for caps - if (message.length() >= 6) { - int caps = 0; - for (char c : message.toCharArray()) { - if (Character.isUpperCase(c)) { - caps++; - } - } - if (((float) caps / (float) message.length()) - > 0.65) //Compute a ratio so that longer sentences can have more caps. - { - message = message.toLowerCase(); - } - } - - // Check for adminchat - if (playerdata.inAdminChat()) { - SynchronousUtil.adminChatMessage(player, message, false); - event.setCancelled(true); - return; - } - - // Finally, set message - event.setMessage(ChatColor.translateAlternateColorCodes('&', message)); - - if (message.toLowerCase().contains("molesllc") || message.toLowerCase() - .contains("moles llc")) { - SecureRandom secureRandom = new SecureRandom(); - Utilities.bcastMsg(String.format(MOCK_THE_MOLES_FOREVER.get( - secureRandom.nextInt(MOCK_THE_MOLES_FOREVER.size())), - player.getName() + ChatColor.RED), ChatColor.RED); - Command_doom.doom(Bukkit.getConsoleSender(), player); - event.setMessage(BY_BEING_A_MOLE_YOU_MOCK_YOURSELF.get( - secureRandom.nextInt(BY_BEING_A_MOLE_YOU_MOCK_YOURSELF.size()))); - return; - } - - // Set the tag - if (playerdata.getTag() != null) { - event.setFormat(ChatColor.translateAlternateColorCodes('&', - MainConfig.getString(ConfigurationEntry.CHAT_FORMAT)) - .replace("{RANK}", playerdata.getTag().replaceAll("%", "%%"))); - } - - DiscordBridge.transmitMessage(DiscordBridge.fullySanitizeDiscordMessage( - String.format(event.getFormat(), event.getPlayer().getDisplayName(), - event.getMessage()))); - } catch (Exception ex) { - Log.severe(ex); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { - String command = event.getMessage(); - final org.bukkit.entity.Player player = event.getPlayer(); - - final PlayerData playerdata = PlayerData.getPlayerData(player); - playerdata.setLastCommand(command); - - if (playerdata.incrementAndGetMsgCount() > MSG_PER_HEARTBEAT) { - Utilities.bcastMsg( - player.getName() + " was automatically kicked for spamming commands.", - ChatColor.RED); - Utilities.autoEject(player, "Kicked for spamming commands."); - - playerdata.resetMsgCount(); - - Utilities.TFM_EntityWiper.wipeEntities(true, true); - - event.setCancelled(true); - return; - } - - if (playerdata.allCommandsBlocked()) { - Utilities.playerMsg(player, "Your commands have been blocked by an admin.", - ChatColor.RED); - event.setCancelled(true); - return; - } - - // Block commands if player is muted - if (playerdata.isMuted()) { - if (!AdminList.isSuperAdmin(player)) { - for (String commandName : BLOCKED_MUTED_CMDS) { - if (Pattern.compile("^/" + commandName.toLowerCase() + " ") - .matcher(command.toLowerCase()).find()) { - player.sendMessage( - ChatColor.RED + "That command is blocked while you are muted."); - event.setCancelled(true); - return; - } - } - } else { - playerdata.setMuted(false); - } - } - - if (ConfigurationEntry.ENABLE_PREPROCESS_LOG.getBoolean()) { - Log.info(String.format("[PREPROCESS_COMMAND] %s(%s): %s", player.getName(), - ChatColor.stripColor(player.getDisplayName()), command), true); - } - - // Blocked commands - if (CommandBlocker.isCommandBlocked(command, player, true)) { - // CommandBlocker handles messages and broadcasts - event.setCancelled(true); - } - - if (!AdminList.isSuperAdmin(player)) { - for (org.bukkit.entity.Player pl : Bukkit.getOnlinePlayers()) { - if (AdminList.isSuperAdmin(pl) && PlayerData.getPlayerData(pl).cmdspyEnabled()) { - Utilities.playerMsg(pl, player.getName() + ": " + command); - } - } - } - } - - @EventHandler(priority = EventPriority.NORMAL) - public void onPlayerDropItem(PlayerDropItemEvent event) { - if (ConfigurationEntry.AUTO_ENTITY_WIPE.getBoolean()) { - if (event.getPlayer().getWorld().getEntities().size() > 750) { - event.setCancelled(true); - } else { - event.getItemDrop().remove(); - } - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerKick(PlayerKickEvent event) { - playerLeave(event.getPlayer()); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerQuit(PlayerQuitEvent event) { - final org.bukkit.entity.Player player = event.getPlayer(); - - if (VanishManager.isVanished(player)) { - event.setQuitMessage(null); - VanishManager.unvanishPlayer(player); - } - - playerLeave(event.getPlayer()); - } - - private void playerLeave(org.bukkit.entity.Player player) { - TotalFreedomMod.fuckoffEnabledFor.remove(player); - - final PlayerData playerdata = PlayerData.getPlayerData(player); - - playerdata.disarmMP44(); - - if (playerdata.isCaged()) { - playerdata.regenerateHistory(); - playerdata.clearHistory(); - } - - if (PlayerList.existsEntry(player)) { - DiscordBridge.transmitMessage(String.format("**%s left the server**", - DiscordBridge.fullySanitizeDiscordMessage(player.getDisplayName()))); - } - - PlayerList.removeEntry(player); - Log.info("[EXIT] " + player.getName() + " left the game.", true); - - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerJoin(PlayerJoinEvent event) { - VanishManager.loadVanishedPlayers(event.getPlayer()); - - final org.bukkit.entity.Player player = event.getPlayer(); - final String ip = Utilities.getIp(player); - final Player playerEntry; - Log.info( - "[JOIN] " + Utilities.formatPlayer(player) + " joined the game with IP address: " + ip, - true); - TextComponent textComponent = new TextComponent( - String.format("%s is joining with IP %s.", player.getName(), Utilities.getFuzzyIp(ip))); - textComponent.setColor(ChatColor.GRAY.asBungee()); - - for (org.bukkit.entity.Player onlinePlayer : Bukkit.getOnlinePlayers()) { - if (AdminList.isSuperAdmin(player)) { - onlinePlayer.spigot().sendMessage(textComponent); - } - } - - DiscordBridge.transmitAdminMessage( - DiscordBridge.fullySanitizeDiscordMessage(textComponent.getText())); - - // Check absolute value to account for negatives - if (Math.abs(player.getLocation().getX()) >= MAX_XY_COORD - || Math.abs(player.getLocation().getZ()) >= MAX_XY_COORD) { - player.teleport( - player.getWorld().getSpawnLocation()); // Illegal position, teleport to spawn - } - // Handle PlayerList entry (persistent) - if (PlayerList.existsEntry(player)) { - playerEntry = PlayerList.getEntry(player); - playerEntry.setLastLoginUnix(Utilities.getUnixTime()); - playerEntry.setLastLoginName(player.getName()); - playerEntry.addIp(ip); - playerEntry.save(); - } else { - playerEntry = PlayerList.getEntry(player); - Log.info("Added new player: " + Utilities.formatPlayer(player)); - } - - // Generate PlayerData (non-persistent) - final PlayerData playerdata = PlayerData.getPlayerData(player); - playerdata.setSuperadminIdVerified(false); - - if (AdminList.isSuperAdmin(player)) { - for (String storedIp : playerEntry.getIps()) { - BanManager.unbanIp(storedIp); - BanManager.unbanIp(Utilities.getFuzzyIp(storedIp)); - } - - BanManager.unbanUuid(UUIDManager.getUniqueId(player)); - - player.setOp(true); - - // Verify strict IP match - if (!AdminList.isIdentityMatched(player)) { - playerdata.setSuperadminIdVerified(false); - Utilities.bcastMsg("Warning: " + player.getName() - + " is an admin, but is using an account not registered to one of their ip-list.", - ChatColor.RED); - } else { - playerdata.setSuperadminIdVerified(true); - AdminList.updateLastLogin(player); - } - } - - // Handle admin impostors - if (AdminList.isAdminImpostor(player)) { - Utilities.bcastMsg("Warning: " + player.getName() - + " has been flagged as an impostor and has been frozen!", ChatColor.RED); - - player.getInventory().clear(); - player.setOp(false); - player.setGameMode(GameMode.SURVIVAL); - PlayerData.getPlayerData(player).setFrozen(true); - } - - // Be the same as vanish - TextComponent component = Utilities.fromBaseComponents( - TextComponent.fromLegacyText( - String.format(net.md_5.bungee.api.ChatColor.AQUA + "%s is %s", player.getName(), - Utilities.colorize(PlayerRank.getLoginMessage(player))))); - - Bukkit.spigot().broadcast(component); - - //TODO: Cleanup - String name = player.getName(); - if (AdminList.isSuperAdmin(player)) { - if (ConfigurationEntry.SERVER_OWNERS.getList().contains(name)) { - name = ChatColor.BLUE + name; - PlayerData.getPlayerData(player).setTag("&8[&9Owner&8]"); - } else if (AdminList.isSeniorAdmin(player)) { - name = ChatColor.LIGHT_PURPLE + name; - PlayerData.getPlayerData(player).setTag("&8[&dSenior Admin&8]"); - } else if (AdminList.isTelnetAdmin(player, true)) { - name = ChatColor.DARK_GREEN + name; - PlayerData.getPlayerData(player).setTag("&8[&2Telnet Admin&8]"); - } else { - name = ChatColor.AQUA + name; - PlayerData.getPlayerData(player).setTag("&8[&BSuper Admin&8]"); - } - - if (Utilities.DEVELOPERS.contains(player.getName())) { - PlayerData.getPlayerData(player) - .setTag("&8[&5Developer&8] " + PlayerData.getPlayerData(player).getTag()); - } - } else if (Utilities.DEVELOPERS.contains(player.getName())) { - name = ChatColor.DARK_PURPLE + name; - PlayerData.getPlayerData(player).setTag("&8[&5Developer&8]"); - } - - try { - player.setPlayerListName(StringUtils.substring(name, 0, 16)); - } catch (IllegalArgumentException ex) { - } - - new BukkitRunnable() { - @Override - public void run() { - if (ConfigurationEntry.ADMIN_ONLY_MODE.getBoolean()) { - player.sendMessage( - ChatColor.RED + "Server is currently closed to non-superadmins."); - } - - if (TotalFreedomMod.lockdownEnabled) { - Utilities.playerMsg(player, - "Warning: Server is currenty in lockdown-mode, new players will not be able to join!", - ChatColor.RED); - } - } - }.runTaskLater(TotalFreedomMod.plugin, 20L * 1L); - - if (!player.hasPlayedBefore()) { - if (Boolean.TRUE.equals(MainConfig.getBoolean(ConfigurationEntry.SERVER_OP_ON_JOIN))) { - PlayerRank rank = PlayerRank.fromSender(player); - - if (rank.equals(PlayerRank.NON_OP)) { - player.setOp(true); - } - } - } - if (TagConfiguration.getTag(player.getUniqueId().toString()) != null) { - String playerTag = TagConfiguration.getTag(player.getUniqueId().toString()); - if (!"".equalsIgnoreCase(playerTag)) { - PlayerData.getPlayerData(player).setTag(playerTag); - } - } - DiscordBridge.transmitMessage(String.format("**%s joined the server**", - DiscordBridge.fullySanitizeDiscordMessage(player.getDisplayName()))); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event) { - Server.handlePlayerPreLogin(event); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerLogin(PlayerLoginEvent event) { - Server.handlePlayerLogin(event); - } + public static final List BLOCKED_MUTED_CMDS = Arrays.asList(StringUtils.split("say,main.java.me,msg,m,tell,r,reply,mail,email", ",")); + public static final int MSG_PER_HEARTBEAT = 10; + public static final int DEFAULT_PORT = 25565; + public static final int MAX_XY_COORD = 30000000; + + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerInteract(PlayerInteractEvent event) { + final org.bukkit.entity.Player player = event.getPlayer(); + final PlayerData playerdata = PlayerData.getPlayerData(player); + + switch (event.getAction()) + { + case RIGHT_CLICK_AIR: + case RIGHT_CLICK_BLOCK: + { + switch (event.getMaterial()) + { + case WATER_BUCKET: + { + if (ConfigurationEntry.ALLOW_WATER_PLACE.getBoolean()) + { + break; + } + + player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1)); + player.sendMessage(ChatColor.GRAY + "Water buckets are currently disabled."); + event.setCancelled(true); + break; + } + + case LAVA_BUCKET: + { + if (ConfigurationEntry.ALLOW_LAVA_PLACE.getBoolean()) + { + break; + } + + player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1)); + player.sendMessage(ChatColor.GRAY + "Lava buckets are currently disabled."); + event.setCancelled(true); + break; + } + + case EXPLOSIVE_MINECART: + { + if (ConfigurationEntry.ALLOW_TNT_MINECARTS.getBoolean()) + { + break; + } + + player.getInventory().clear(player.getInventory().getHeldItemSlot()); + player.sendMessage(ChatColor.GRAY + "TNT minecarts are currently disabled."); + event.setCancelled(true); + break; + } + } + break; + } + + case LEFT_CLICK_AIR: + case LEFT_CLICK_BLOCK: + { + switch (event.getMaterial()) + { + case BONE: + { + if (!playerdata.mobThrowerEnabled()) + { + break; + } + + Location player_pos = player.getLocation(); + Vector direction = player_pos.getDirection().normalize(); + + LivingEntity rezzed_mob = (LivingEntity) player.getWorld().spawnEntity(player_pos.add(direction.multiply(2.0)), playerdata.mobThrowerCreature()); + rezzed_mob.setVelocity(direction.multiply(playerdata.mobThrowerSpeed())); + playerdata.enqueueMob(rezzed_mob); + + event.setCancelled(true); + break; + } + + case SULPHUR: + { + if (!playerdata.isMP44Armed()) + { + break; + } + + event.setCancelled(true); + + if (playerdata.toggleMP44Firing()) + { + playerdata.startArrowShooter(TotalFreedomMod.plugin); + } + else + { + playerdata.stopArrowShooter(); + } + break; + } + + case BLAZE_ROD: + { + if (!ConfigurationEntry.ALLOW_EXPLOSIONS.getBoolean()) + { + break; + } + + if (!AdminList.isSeniorAdmin(player, true)) + { + break; + } + + event.setCancelled(true); + Block targetBlock; + + if (event.getAction().equals(Action.LEFT_CLICK_AIR)) + { + targetBlock = DeprecationUtil.getTargetBlock(player, null, 120); + } + else + { + targetBlock = event.getClickedBlock(); + } + + if (targetBlock == null) + { + player.sendMessage("Can't resolve target block."); + break; + } + + player.getWorld().createExplosion(targetBlock.getLocation(), 4F, true); + player.getWorld().strikeLightning(targetBlock.getLocation()); + + break; + } + + case CARROT: + { + if (!ConfigurationEntry.ALLOW_EXPLOSIONS.getBoolean()) + { + break; + } + + if (!AdminList.isSeniorAdmin(player, true)) + { + break; + } + + Location location = player.getLocation().clone(); + + Vector playerPostion = location.toVector().add(new Vector(0.0, 1.65, 0.0)); + Vector playerDirection = location.getDirection().normalize(); + + double distance = 150.0; + Block targetBlock = DeprecationUtil.getTargetBlock(player, null, Math.round((float) distance)); + if (targetBlock != null) + { + distance = location.distance(targetBlock.getLocation()); + } + + final List affected = new ArrayList(); + + Block lastBlock = null; + for (double offset = 0.0; offset <= distance; offset += (distance / 25.0)) + { + Block block = playerPostion.clone().add(playerDirection.clone().multiply(offset)).toLocation(player.getWorld()).getBlock(); + + if (!block.equals(lastBlock)) + { + if (block.isEmpty()) + { + affected.add(block); + block.setType(Material.TNT); + } + else + { + break; + } + } + + lastBlock = block; + } + + new BukkitRunnable() + { + @Override + public void run() + { + for (Block tntBlock : affected) + { + TNTPrimed tnt = tntBlock.getWorld().spawn(tntBlock.getLocation(), TNTPrimed.class); + tnt.setFuseTicks(5); + tntBlock.setType(Material.AIR); + } + } + }.runTaskLater(TotalFreedomMod.plugin, 30L); + + event.setCancelled(true); + break; + } + + case RAW_FISH: + { + final int RADIUS_HIT = 5; + final int STRENGTH = 4; + + // Clownfish + if (DeprecationUtil.getData_MaterialData(event.getItem().getData()) == 2) + { + if (AdminList.isSeniorAdmin(player, true) || AdminList.isTelnetAdmin(player, true)) + { + boolean didHit = false; + + final Location playerLoc = player.getLocation(); + final Vector playerLocVec = playerLoc.toVector(); + + final List players = player.getWorld().getPlayers(); + for (final org.bukkit.entity.Player target : players) + { + if (target == player) + { + continue; + } + + final Location targetPos = target.getLocation(); + final Vector targetPosVec = targetPos.toVector(); + + try + { + if (targetPosVec.distanceSquared(playerLocVec) < (RADIUS_HIT * RADIUS_HIT)) + { + Utilities.setFlying(player, false); + target.setVelocity(targetPosVec.subtract(playerLocVec).normalize().multiply(STRENGTH)); + didHit = true; + } + } + catch (IllegalArgumentException ex) + { + } + } + + if (didHit) + { + final Sound[] sounds = Sound.values(); + for (Sound sound : sounds) + { + if (sound.toString().contains("HIT")) + { + playerLoc.getWorld().playSound(randomOffset(playerLoc, 5.0), sound, 100.0f, randomDoubleRange(0.5, 2.0).floatValue()); + } + } + } + } + else + { + final StringBuilder msg = new StringBuilder(); + final char[] chars = (player.getName() + " is a clown.").toCharArray(); + for (char c : chars) + { + msg.append(Utilities.randomChatColor()).append(c); + } + Utilities.bcastMsg(msg.toString()); + + player.getInventory().getItemInHand().setType(Material.POTATO_ITEM); + } + + event.setCancelled(true); + break; + } + } + } + break; + } + } + } + private static final Random RANDOM = new Random(); + + private static Location randomOffset(Location a, double magnitude) + { + return a.clone().add(randomDoubleRange(-1.0, 1.0) * magnitude, randomDoubleRange(-1.0, 1.0) * magnitude, randomDoubleRange(-1.0, 1.0) * magnitude); + } + + private static Double randomDoubleRange(double min, double max) + { + return min + (RANDOM.nextDouble() * ((max - min) + 1.0)); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerTeleport(PlayerTeleportEvent event) + { + final org.bukkit.entity.Player player = event.getPlayer(); + final PlayerData playerdata = PlayerData.getPlayerData(player); + // Check absolute value to account for negatives + if (Math.abs(event.getTo().getX()) >= MAX_XY_COORD || Math.abs(event.getTo().getZ()) >= MAX_XY_COORD) + { + event.setCancelled(true); // illegal position, cancel it + } + + if (!AdminList.isSuperAdmin(player) && playerdata.isFrozen()) + { + Utilities.setFlying(player, true); + event.setTo(playerdata.getFreezeLocation()); + return; // Don't process adminworld validation + } + + AdminWorld.getInstance().validateMovement(event); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onPlayerMove(PlayerMoveEvent event) + { + final Location from = event.getFrom(); + final Location to = event.getTo(); + try + { + if (from.getWorld() == to.getWorld() && from.distanceSquared(to) < (0.0001 * 0.0001)) + { + // If player just rotated, but didn't move, don't process this event. + return; + } + } + catch (IllegalArgumentException ex) + { + } + + if (!AdminWorld.getInstance().validateMovement(event)) + { + return; + } + + final org.bukkit.entity.Player player = event.getPlayer(); + final PlayerData playerdata = PlayerData.getPlayerData(player); + + for (Entry fuckoff : TotalFreedomMod.fuckoffEnabledFor.entrySet()) + { + org.bukkit.entity.Player fuckoffPlayer = fuckoff.getKey(); + + if (fuckoffPlayer.equals(player) || !fuckoffPlayer.isOnline()) + { + continue; + } + + double fuckoffRange = fuckoff.getValue(); + + Location playerLocation = player.getLocation(); + Location fuckoffLocation = fuckoffPlayer.getLocation(); + + double distanceSquared; + try + { + distanceSquared = playerLocation.distanceSquared(fuckoffLocation); + } + catch (IllegalArgumentException ex) + { + continue; + } + + if (distanceSquared < (fuckoffRange * fuckoffRange)) + { + event.setTo(fuckoffLocation.clone().add(playerLocation.subtract(fuckoffLocation).toVector().normalize().multiply(fuckoffRange * 1.1))); + break; + } + } + + // Freeze + if (!AdminList.isSuperAdmin(player) && playerdata.isFrozen()) + { + Utilities.setFlying(player, true); + event.setTo(playerdata.getFreezeLocation()); + } + + if (playerdata.isCaged()) + { + Location targetPos = player.getLocation().add(0, 1, 0); + + boolean outOfCage; + if (!targetPos.getWorld().equals(playerdata.getCagePos().getWorld())) + { + outOfCage = true; + } + else + { + outOfCage = targetPos.distanceSquared(playerdata.getCagePos()) > (2.5 * 2.5); + } + + if (outOfCage) + { + playerdata.setCaged(true, targetPos, playerdata.getCageMaterial(PlayerData.CageLayer.OUTER), playerdata.getCageMaterial(PlayerData.CageLayer.INNER)); + playerdata.regenerateHistory(); + playerdata.clearHistory(); + Utilities.buildHistory(targetPos, 2, playerdata); + Utilities.generateHollowCube(targetPos, 2, playerdata.getCageMaterial(PlayerData.CageLayer.OUTER)); + Utilities.generateCube(targetPos, 1, playerdata.getCageMaterial(PlayerData.CageLayer.INNER)); + } + } + + if (playerdata.isOrbiting()) + { + if (player.getVelocity().length() < playerdata.orbitStrength() * (2.0 / 3.0)) + { + player.setVelocity(new Vector(0, playerdata.orbitStrength(), 0)); + } + } + + if (JumpPads.getMode().isOn()) + { + JumpPads.PlayerMoveEvent(event); + } + + if (!(ConfigurationEntry.LANDMINES_ENABLED.getBoolean() && ConfigurationEntry.ALLOW_EXPLOSIONS.getBoolean())) + { + return; + } + + final Iterator landmines = Command_landmine.TFM_LandmineData.landmines.iterator(); + while (landmines.hasNext()) + { + final Command_landmine.TFM_LandmineData landmine = landmines.next(); + + final Location location = landmine.location; + if (location.getBlock().getType() != Material.TNT) + { + landmines.remove(); + continue; + } + + if (landmine.player.equals(player)) + { + break; + } + + if (!player.getWorld().equals(location.getWorld())) + { + continue; + } + + if (!(player.getLocation().distanceSquared(location) <= (landmine.radius * landmine.radius))) + { + break; + } + + landmine.location.getBlock().setType(Material.AIR); + + final TNTPrimed tnt1 = location.getWorld().spawn(location, TNTPrimed.class); + tnt1.setFuseTicks(40); + tnt1.setPassenger(player); + tnt1.setVelocity(new Vector(0.0, 2.0, 0.0)); + + final TNTPrimed tnt2 = location.getWorld().spawn(player.getLocation(), TNTPrimed.class); + tnt2.setFuseTicks(1); + + player.setGameMode(GameMode.SURVIVAL); + landmines.remove(); + } + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onLeavesDecay(LeavesDecayEvent event) + { + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onPlayerChat(AsyncPlayerChatEvent event) + { + try + { + final org.bukkit.entity.Player player = event.getPlayer(); + String message = event.getMessage().trim(); + + final PlayerData playerdata = PlayerData.getPlayerDataSync(player); + + // Check for spam + final Long lastRan = HeartBeat.getLastRan(); + if (lastRan == null || lastRan + TotalFreedomMod.HEARTBEAT_RATE * 1000L < System.currentTimeMillis()) + { + //Log.warning("Heartbeat service timeout - can't check block place/break rates."); + } + else + { + if (playerdata.incrementAndGetMsgCount() > MSG_PER_HEARTBEAT) + { + SynchronousUtil.bcastMsg(player.getName() + " was automatically kicked for spamming chat.", ChatColor.RED); + SynchronousUtil.autoEject(player, "Kicked for spamming chat."); + + playerdata.resetMsgCount(); + + event.setCancelled(true); + return; + } + } + + // Check for message repeat + if (playerdata.getLastMessage().equalsIgnoreCase(message)) + { + SynchronousUtil.playerMsg(player, "Please do not repeat messages."); + event.setCancelled(true); + return; + } + + playerdata.setLastMessage(message); + + // Check for muted + if (playerdata.isMuted()) + { + if (!AdminList.isSuperAdminSync(player)) + { + SynchronousUtil.playerMsg(player, ChatColor.RED + "You are muted, STFU! - You will be unmuted in 5 minutes."); + event.setCancelled(true); + return; + } + + playerdata.setMuted(false); + } + + // Strip color from messages + message = ChatColor.stripColor(message); + + // Truncate messages that are too long - 100 characters is vanilla client max + if (message.length() > 100) + { + message = message.substring(0, 100); + SynchronousUtil.playerMsg(player, "Message was shortened because it was too long to send."); + } + + // Check for caps + if (message.length() >= 6) + { + int caps = 0; + for (char c : message.toCharArray()) + { + if (Character.isUpperCase(c)) + { + caps++; + } + } + if (((float) caps / (float) message.length()) > 0.65) //Compute a ratio so that longer sentences can have more caps. + { + message = message.toLowerCase(); + } + } + + // Check for adminchat + if (playerdata.inAdminChat()) + { + SynchronousUtil.adminChatMessage(player, message, false); + event.setCancelled(true); + return; + } + + // Finally, set message + event.setMessage(ChatColor.translateAlternateColorCodes('&', message)); + + // Set the tag + if (playerdata.getTag() != null) { + event.setFormat(ChatColor.translateAlternateColorCodes('&', MainConfig.getString(ConfigurationEntry.CHAT_FORMAT)).replace("{RANK}", playerdata.getTag().replaceAll("%", "%%"))); + } + + DiscordBridge.transmitMessage(DiscordBridge.fullySanitizeDiscordMessage(String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()))); + } + catch (Exception ex) + { + Log.severe(ex); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) + { + String command = event.getMessage(); + final org.bukkit.entity.Player player = event.getPlayer(); + + final PlayerData playerdata = PlayerData.getPlayerData(player); + playerdata.setLastCommand(command); + + if (playerdata.incrementAndGetMsgCount() > MSG_PER_HEARTBEAT) + { + Utilities.bcastMsg(player.getName() + " was automatically kicked for spamming commands.", ChatColor.RED); + Utilities.autoEject(player, "Kicked for spamming commands."); + + playerdata.resetMsgCount(); + + Utilities.TFM_EntityWiper.wipeEntities(true, true); + + event.setCancelled(true); + return; + } + + if (playerdata.allCommandsBlocked()) + { + Utilities.playerMsg(player, "Your commands have been blocked by an admin.", ChatColor.RED); + event.setCancelled(true); + return; + } + + // Block commands if player is muted + if (playerdata.isMuted()) + { + if (!AdminList.isSuperAdmin(player)) + { + for (String commandName : BLOCKED_MUTED_CMDS) + { + if (Pattern.compile("^/" + commandName.toLowerCase() + " ").matcher(command.toLowerCase()).find()) + { + player.sendMessage(ChatColor.RED + "That command is blocked while you are muted."); + event.setCancelled(true); + return; + } + } + } + else + { + playerdata.setMuted(false); + } + } + + if (ConfigurationEntry.ENABLE_PREPROCESS_LOG.getBoolean()) + { + Log.info(String.format("[PREPROCESS_COMMAND] %s(%s): %s", player.getName(), ChatColor.stripColor(player.getDisplayName()), command), true); + } + + // Blocked commands + if (CommandBlocker.isCommandBlocked(command, player, true)) + { + // CommandBlocker handles messages and broadcasts + event.setCancelled(true); + } + + if (!AdminList.isSuperAdmin(player)) + { + for (org.bukkit.entity.Player pl : Bukkit.getOnlinePlayers()) + { + if (AdminList.isSuperAdmin(pl) && PlayerData.getPlayerData(pl).cmdspyEnabled()) + { + Utilities.playerMsg(pl, player.getName() + ": " + command); + } + } + } + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onPlayerDropItem(PlayerDropItemEvent event) + { + if (ConfigurationEntry.AUTO_ENTITY_WIPE.getBoolean()) + { + if (event.getPlayer().getWorld().getEntities().size() > 750) + { + event.setCancelled(true); + } + else + { + event.getItemDrop().remove(); + } + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerKick(PlayerKickEvent event) + { + playerLeave(event.getPlayer()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerQuit(PlayerQuitEvent event) + { + playerLeave(event.getPlayer()); + } + + private void playerLeave(org.bukkit.entity.Player player) + { + TotalFreedomMod.fuckoffEnabledFor.remove(player); + + final PlayerData playerdata = PlayerData.getPlayerData(player); + + playerdata.disarmMP44(); + + if (playerdata.isCaged()) { + playerdata.regenerateHistory(); + playerdata.clearHistory(); + } + + if (PlayerList.existsEntry(player)) { + DiscordBridge.transmitMessage(String.format("**%s left the server**", DiscordBridge.fullySanitizeDiscordMessage(player.getDisplayName()))); + } + + PlayerList.removeEntry(player); + Log.info("[EXIT] " + player.getName() + " left the game.", true); + + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerJoin(PlayerJoinEvent event) + { + final org.bukkit.entity.Player player = event.getPlayer(); + final String ip = Utilities.getIp(player); + final Player playerEntry; + Log.info("[JOIN] " + Utilities.formatPlayer(player) + " joined the game with IP address: " + ip, true); + TextComponent textComponent = new TextComponent(String.format("%s is joining with IP %s.", player.getName(), Utilities.getFuzzyIp(ip))); + textComponent.setColor(ChatColor.GRAY.asBungee()); + + for (org.bukkit.entity.Player onlinePlayer : Bukkit.getOnlinePlayers()) + { + if (AdminList.isSuperAdmin(player)) + { + onlinePlayer.spigot().sendMessage(textComponent); + } + } + + DiscordBridge.transmitAdminMessage(DiscordBridge.fullySanitizeDiscordMessage(textComponent.getText())); + + // Check absolute value to account for negatives + if (Math.abs(player.getLocation().getX()) >= MAX_XY_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XY_COORD) + { + player.teleport(player.getWorld().getSpawnLocation()); // Illegal position, teleport to spawn + } + // Handle PlayerList entry (persistent) + if (PlayerList.existsEntry(player)) + { + playerEntry = PlayerList.getEntry(player); + playerEntry.setLastLoginUnix(Utilities.getUnixTime()); + playerEntry.setLastLoginName(player.getName()); + playerEntry.addIp(ip); + playerEntry.save(); + } + else + { + playerEntry = PlayerList.getEntry(player); + Log.info("Added new player: " + Utilities.formatPlayer(player)); + } + + // Generate PlayerData (non-persistent) + final PlayerData playerdata = PlayerData.getPlayerData(player); + playerdata.setSuperadminIdVerified(false); + + if (AdminList.isSuperAdmin(player)) + { + for (String storedIp : playerEntry.getIps()) + { + BanManager.unbanIp(storedIp); + BanManager.unbanIp(Utilities.getFuzzyIp(storedIp)); + } + + BanManager.unbanUuid(UUIDManager.getUniqueId(player)); + + player.setOp(true); + + // Verify strict IP match + if (!AdminList.isIdentityMatched(player)) + { + playerdata.setSuperadminIdVerified(false); + Utilities.bcastMsg("Warning: " + player.getName() + " is an admin, but is using an account not registered to one of their ip-list.", ChatColor.RED); + } + else + { + playerdata.setSuperadminIdVerified(true); + AdminList.updateLastLogin(player); + } + } + + // Handle admin impostors + if (AdminList.isAdminImpostor(player)) + { + Utilities.bcastMsg("Warning: " + player.getName() + " has been flagged as an impostor and has been frozen!", ChatColor.RED); + Utilities.bcastMsg(ChatColor.AQUA + player.getName() + " is " + PlayerRank.getLoginMessage(player)); + player.getInventory().clear(); + player.setOp(false); + player.setGameMode(GameMode.SURVIVAL); + PlayerData.getPlayerData(player).setFrozen(true); + } + else if (AdminList.isSuperAdmin(player) || Utilities.DEVELOPERS.contains(player.getName())) + { + Utilities.bcastMsg(ChatColor.AQUA + player.getName() + " is " + PlayerRank.getLoginMessage(player)); + } + + //TODO: Cleanup + String name = player.getName(); + if (AdminList.isSuperAdmin(player)) + { + if (ConfigurationEntry.SERVER_OWNERS.getList().contains(name)) + { + name = ChatColor.BLUE + name; + PlayerData.getPlayerData(player).setTag("&8[&9Owner&8]"); + } + else if (AdminList.isSeniorAdmin(player)) + { + name = ChatColor.LIGHT_PURPLE + name; + PlayerData.getPlayerData(player).setTag("&8[&dSenior Admin&8]"); + } + else if (AdminList.isTelnetAdmin(player, true)) + { + name = ChatColor.DARK_GREEN + name; + PlayerData.getPlayerData(player).setTag("&8[&2Telnet Admin&8]"); + } + else + { + name = ChatColor.AQUA + name; + PlayerData.getPlayerData(player).setTag("&8[&BSuper Admin&8]"); + } + + if (Utilities.DEVELOPERS.contains(player.getName())) { + PlayerData.getPlayerData(player).setTag("&8[&5Developer&8] " + PlayerData.getPlayerData(player).getTag()); + } + } else if (Utilities.DEVELOPERS.contains(player.getName())) + { + name = ChatColor.DARK_PURPLE + name; + PlayerData.getPlayerData(player).setTag("&8[&5Developer&8]"); + } + + try + { + player.setPlayerListName(StringUtils.substring(name, 0, 16)); + } + catch (IllegalArgumentException ex) + { + } + + new BukkitRunnable() + { + @Override + public void run() + { + if (ConfigurationEntry.ADMIN_ONLY_MODE.getBoolean()) { + player.sendMessage(ChatColor.RED + "Server is currently closed to non-superadmins."); + } + + if (TotalFreedomMod.lockdownEnabled) { + Utilities.playerMsg(player, "Warning: Server is currenty in lockdown-mode, new players will not be able to join!", ChatColor.RED); + } + } + }.runTaskLater(TotalFreedomMod.plugin, 20L * 1L); + + if (!player.hasPlayedBefore()) { + if (Boolean.TRUE.equals(MainConfig.getBoolean(ConfigurationEntry.SERVER_OP_ON_JOIN))) { + PlayerRank rank = PlayerRank.fromSender(player); + + if (rank.equals(PlayerRank.NON_OP)) { + player.setOp(true); + } + } + } + if(TagConfiguration.getTag(player.getUniqueId().toString()) != null){ + String playerTag = TagConfiguration.getTag(player.getUniqueId().toString()); + if(!"".equalsIgnoreCase(playerTag)){ + PlayerData.getPlayerData(player).setTag(playerTag); + } + } + DiscordBridge.transmitMessage(String.format("**%s joined the server**", DiscordBridge.fullySanitizeDiscordMessage(player.getDisplayName()))); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event) + { + Server.handlePlayerPreLogin(event); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerLogin(PlayerLoginEvent event) + { + Server.handlePlayerLogin(event); + } } diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/world/RollbackManager.java b/src/main/java/me/StevenLawson/TotalFreedomMod/world/RollbackManager.java deleted file mode 100644 index 48fb097..0000000 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/world/RollbackManager.java +++ /dev/null @@ -1,316 +0,0 @@ -package me.StevenLawson.TotalFreedomMod.world; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; - -import me.StevenLawson.TotalFreedomMod.Log; -import me.StevenLawson.TotalFreedomMod.TotalFreedomMod; -import me.StevenLawson.TotalFreedomMod.util.DeprecationUtil; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -public class RollbackManager -{ - private static final Map> PLAYER_HISTORY = new HashMap>(); - private static final List REMOVE_ROLLBACK_HISTORY = new ArrayList(); - - private RollbackManager() - { - throw new AssertionError(); - } - - public static void blockPlace(org.bukkit.event.block.BlockPlaceEvent event) - { - storeEntry(event.getPlayer(), new RollbackEntry(event.getPlayer().getName(), event.getBlock(), EntryType.BLOCK_PLACE)); - } - - public static void blockBreak(org.bukkit.event.block.BlockBreakEvent event) - { - storeEntry(event.getPlayer(), new RollbackEntry(event.getPlayer().getName(), event.getBlock(), EntryType.BLOCK_BREAK)); - } - - private static void storeEntry(Player player, RollbackEntry entry) - { - List playerEntryList = getEntriesByPlayer(player.getName()); - - if (playerEntryList != null) - { - playerEntryList.add(0, entry); - } - } - - // May return null - public static String findPlayer(String partial) - { - partial = partial.toLowerCase(); - - for (String player : PLAYER_HISTORY.keySet()) - { - if (player.toLowerCase().equals(partial)) - { - return player; - } - } - - for (String player : PLAYER_HISTORY.keySet()) - { - if (player.toLowerCase().contains(partial)) - { - return player; - } - } - - return null; - } - - public static int purgeEntries() - { - Iterator> it = PLAYER_HISTORY.values().iterator(); - while (it.hasNext()) - { - List playerEntryList = it.next(); - if (playerEntryList != null) - { - playerEntryList.clear(); - } - } - return PLAYER_HISTORY.size(); - } - - public static int purgeEntries(String playerName) - { - List playerEntryList = getEntriesByPlayer(playerName); - - if (playerEntryList == null) - { - return 0; - } - - int count = playerEntryList.size(); - playerEntryList.clear(); - return count; - - } - - public static boolean canRollback(String playerName) - { - return PLAYER_HISTORY.containsKey(playerName.toLowerCase()) && !PLAYER_HISTORY.get(playerName.toLowerCase()).isEmpty(); - } - - public static boolean canUndoRollback(String playerName) - { - return REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase()); - } - - public static int rollback(final String playerName) - { - final List entries = getEntriesByPlayer(playerName); - if (entries == null) - { - return 0; - } - - int count = entries.size(); - for (RollbackEntry entry : entries) - { - if (entry != null) - { - entry.restore(); - } - } - - if (!REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase())) - { - REMOVE_ROLLBACK_HISTORY.add(playerName.toLowerCase()); - } - - new BukkitRunnable() - { - @Override - public void run() - { - if (REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase())) - { - REMOVE_ROLLBACK_HISTORY.remove(playerName.toLowerCase()); - purgeEntries(playerName); - } - } - }.runTaskLater(TotalFreedomMod.plugin, 40L * 20L); - return count; - } - - public static int undoRollback(String playerName) - { - final List entries = getEntriesByPlayer(playerName); - - if (entries == null) - { - return 0; - } - - final int count = entries.size(); - - final ListIterator it = entries.listIterator(count); - while (it.hasPrevious()) - { - RollbackEntry entry = it.previous(); - if (entry != null) - { - entry.redo(); - } - } - - REMOVE_ROLLBACK_HISTORY.remove(playerName.toLowerCase()); - - return count; - } - - public static List getEntriesAtLocation(final Location location) - { - final int testX = location.getBlockX(); - final short testY = (short) location.getBlockY(); - final int testZ = location.getBlockZ(); - final String testWorldName = location.getWorld().getName(); - - List entries = new ArrayList(); - for (String playername : PLAYER_HISTORY.keySet()) - { - for (RollbackEntry entry : PLAYER_HISTORY.get(playername.toLowerCase())) - { - if (testX == entry.x && testY == entry.y && testZ == entry.z && testWorldName.equals(entry.worldName)) - { - entries.add(0, entry); - } - } - } - - return entries; - } - - private static List getEntriesByPlayer(String playerName) - { - playerName = playerName.toLowerCase(); - List playerEntryList = PLAYER_HISTORY.get(playerName.toLowerCase()); - if (playerEntryList == null) - { - playerEntryList = new ArrayList(); - PLAYER_HISTORY.put(playerName.toLowerCase(), playerEntryList); - } - return playerEntryList; - } - - public enum EntryType - { - BLOCK_PLACE("placed"), - BLOCK_BREAK("broke"); - private final String action; - - EntryType(String action) - { - this.action = action; - } - - @Override - public String toString() - { - return this.action; - } - } - - public static class RollbackEntry - { - // Use of primitives to decrease overhead - public final String author; - public final String worldName; - public final int x; - public final short y; - public final int z; - public final byte data; - public final Material blockMaterial; - private final boolean isBreak; - - private RollbackEntry(String author, Block block, EntryType entryType) - { - final Location location = block.getLocation(); - - this.x = location.getBlockX(); - this.y = (short) location.getBlockY(); - this.z = location.getBlockZ(); - this.worldName = location.getWorld().getName(); - this.author = author; - - if (entryType == EntryType.BLOCK_BREAK) - { - this.blockMaterial = block.getType(); - this.data = DeprecationUtil.getData_Block(block); - this.isBreak = true; - } - else - { - this.blockMaterial = block.getType(); - this.data = DeprecationUtil.getData_Block(block); - this.isBreak = false; - } - } - - public Location getLocation() - { - try - { - return new Location(Bukkit.getWorld(worldName), x, (int) y, z); - } - catch (Exception ex) - { - Log.warning("Could not get location of rollback entry at (" + worldName + ":" + x + "," + y + "," + x + ")!"); - } - return null; - } - - public Material getMaterial() - { - return blockMaterial; - } - - public EntryType getType() - { - return (isBreak ? EntryType.BLOCK_BREAK : EntryType.BLOCK_PLACE); - } - - public void restore() - { - final Block block = Bukkit.getWorld(worldName).getBlockAt(x, y, z); - if (isBreak) - { - block.setType(getMaterial()); - DeprecationUtil.setData_Block(block, data); - } - else - { - block.setType(Material.AIR); - } - } - - public void redo() - { - final Block block = Bukkit.getWorld(worldName).getBlockAt(x, y, z); - - if (isBreak) - { - block.setType(Material.AIR); - } - else - { - block.setType(getMaterial()); - DeprecationUtil.setData_Block(block, data); - } - } - } -} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 29a72b5..564edac 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -287,10 +287,6 @@ commands: description: 'Mutes a player with brute force.' usage: '/ [ [-s] | list | purge | all]' aliases: 'mute' - rollback: - description: 'Issues a rollback on a player' - usage: '/ <[partialname] | undo [partialname] purge [partialname] | purgeall>' - aliases: 'rb' nickclean: description: 'Essentials Interface Command - Remove distracting things from nicknames of all players on server.' usage: '/'