From aca3398d2173d23bd8529c3cc0544fbc7cc18536 Mon Sep 17 00:00:00 2001 From: Jerom van der Sar Date: Thu, 12 May 2016 21:40:39 +0200 Subject: [PATCH] TotalFreedomMod Electrum Version 5.0 This TotalFreedomMod release implements many changes. Most notably, the internals have been completely revamped. TotalFreedomMod now relies on the Aero library for core mechanics such as command handling and services. Another important change is the UUID system. In TotalFreedomMod Electrum, it has been completely removed. The core reason for this is that the system as a whole was very bugged. Additionally, it did not solve the primary reason for its conception: preserving player data when the player changes their username. This is because TotalFreedomMod servers usually run in offline-mode. This meaning that some of the players joining do not have a registerd Mojang UUID whatsoever. All in all, the UUID system was buggy, and it did not fix the reason it was implemented, so it has been completely removed. The admin list and the ban list now use usernames and IPs again. Lastly, many smaller changes have been implemented. Due to the amount of changes, they have not been named individualy. Please refer to the issues below for more details. Fixes #342 Fixes #350 Fixes #380 Fixes #684 Fixes #704 Fixes #716 Fixes #735 Fixes #745 Fixes #784 Fixes #765 Fixes #791 Fixes #805 Fixes #826 Fixes #883 Fixes #1524 Fixes #1534 Fixes #1536 Fixes #1538 Fixes #1545 Fixes #1546 Fixes #1568 Fixes #1627 Resolves #403 Resolves #435 Resolves #597 Resolves #603 Resolves #628 Resolves #690 Resolves #708 Resolves #747 Resolves #748 Resolves #749 Resolves #764 Resolves #767 Resolves #782 Resolves #809 Resolves #803 Resolves #811 Resolves #813 Resolves #830 Resolves #848 Resolves #856 Resolves #876 Resolves #908 Resolves #992 Resolves #1018 Resolves #1432 Resolves #1446 Resolves #1494 Resolves #1501 Resolves #1526 Resolves #1540 Resolves #1550 Resolves #1560 Resolves #1561 Resolves #1578 Resolves #1613 --- README.md | 4 + pom.xml | 5 +- .../totalfreedommod/Announcer.java | 9 +- .../totalfreedommod/AntiNuke.java | 8 +- .../totalfreedommod/AntiSpam.java | 2 +- .../totalfreedommod/AutoEject.java | 116 ++++ .../totalfreedommod/BackupManager.java | 87 +++ .../totalfreedommod/ChatManager.java | 40 +- .../totalfreedommod/CommandSpy.java | 24 +- .../totalfreedommod/EntityWiper.java | 31 + .../totalfreedommod/FrontDoor.java | 14 +- .../totalfreedommod/GameRuleHandler.java | 4 +- .../totalfreedommod/LogViewer.java | 170 ++++++ .../totalfreedommod/LoginProcess.java | 2 +- .../totalfreedom/totalfreedommod/Muter.java | 34 +- .../totalfreedommod/ProtectArea.java | 4 +- .../totalfreedommod/SavedFlags.java | 105 ++++ .../totalfreedommod/ServerPing.java | 12 +- .../totalfreedommod/ServiceChecker.java | 236 -------- .../totalfreedommod/TotalFreedomMod.java | 83 ++- .../totalfreedommod/admin/Admin.java | 1 - .../totalfreedommod/admin/AdminList.java | 111 ++-- .../totalfreedommod/banning/Ban.java | 1 + .../totalfreedommod/banning/BanManager.java | 2 +- .../totalfreedommod/banning/PermbanList.java | 2 +- .../blocking/PotionBlocker.java | 62 ++ .../blocking/command/CommandBlockerEntry.java | 3 +- .../blocking/command/CommandBlockerRank.java | 2 +- .../bridge/BukkitTelnetBridge.java | 4 +- .../command/CommandLoader.java | 2 +- .../command/Command_adminchat.java | 2 +- .../command/Command_announce.java | 26 + .../command/Command_banlist.java | 12 +- .../command/Command_blockcmd.java | 27 +- .../command/Command_colorme.java | 21 +- .../command/Command_creative.java | 71 +-- .../totalfreedommod/command/Command_doom.java | 2 +- .../command/Command_enchant.java | 26 +- .../command/Command_ender.java | 2 +- .../command/Command_freeze.java | 4 +- .../command/Command_fuckoff.java | 2 +- .../command/Command_gadmin.java | 2 +- .../command/Command_glist.java | 2 +- .../command/Command_health.java | 6 + .../totalfreedommod/command/Command_kick.java | 61 ++ .../totalfreedommod/command/Command_list.java | 46 +- .../totalfreedommod/command/Command_logs.java | 128 +--- .../command/Command_mobpurge.java | 3 +- .../totalfreedommod/command/Command_mp44.java | 2 +- .../command/Command_myadmin.java | 168 ++++++ .../command/Command_nether.java | 2 +- .../command/Command_nickclean.java | 4 +- ...{Command_overlord.java => Command_ov.java} | 7 +- .../command/Command_permban.java | 8 +- .../command/Command_premium.java | 5 + .../totalfreedommod/command/Command_rank.java | 44 +- .../command/Command_report.java | 2 +- .../totalfreedommod/command/Command_ro.java | 38 +- .../command/Command_saconfig.java | 122 ++-- .../command/Command_services.java | 29 - ...ommand_setl.java => Command_setlimit.java} | 4 +- .../command/Command_smite.java | 41 +- .../command/Command_spawnmob.java | 78 +++ .../command/Command_spectator.java | 21 + .../totalfreedommod/command/Command_stfu.java | 87 ++- .../command/Command_survival.java | 72 +-- .../command/Command_tagnyan.java | 12 +- .../totalfreedommod/command/Command_tban.java | 17 +- .../command/Command_tfupdate.java | 70 --- .../command/Command_toggle.java | 8 +- .../command/Command_tossmob.java | 32 +- ..._tfm.java => Command_totalfreedommod.java} | 9 +- .../command/Command_trail.java | 94 +-- .../command/Command_wipeflatlands.java | 2 +- .../command/FreedomCommand.java | 13 +- .../command/FreedomCommandExecutor.java | 37 +- .../config/ConfigConverter.java | 34 -- .../totalfreedommod/config/ConfigEntry.java | 30 +- .../totalfreedommod/config/MainConfig.java | 105 ++-- .../totalfreedommod/freeze/FreezeData.java | 8 +- .../totalfreedommod/freeze/Freezer.java | 4 +- .../totalfreedommod/fun/ItemFun.java | 12 +- .../totalfreedommod/fun/Trailer.java | 76 +++ .../httpd/HTMLGenerationTools.java | 1 - .../totalfreedommod/httpd/HTTPDaemon.java | 208 ++----- .../httpd/ModuleExecutable.java | 85 +++ .../httpd/module/HTTPDModule.java | 8 +- .../httpd/module/Module_dump.java | 5 +- .../httpd/module/Module_file.java | 5 +- .../httpd/module/Module_help.java | 10 +- .../httpd/module/Module_list.java | 6 +- .../httpd/module/Module_logs.java | 5 +- .../httpd/module/Module_permbans.java | 8 +- .../httpd/module/Module_players.java | 8 +- .../httpd/module/Module_schematic.java | 6 +- .../totalfreedommod/player/FPlayer.java | 41 +- .../totalfreedommod/player/PlayerList.java | 4 +- .../rank/{RankBase.java => Displayable.java} | 6 +- .../totalfreedommod/rank/Rank.java | 79 +-- .../totalfreedommod/rank/RankManager.java | 27 +- .../totalfreedommod/rank/Title.java | 55 +- .../rollback/RollbackManager.java | 2 +- .../totalfreedommod/util/FLog.java | 1 - .../totalfreedommod/util/FSync.java | 19 +- .../totalfreedommod/util/FUtil.java | 555 +----------------- .../totalfreedommod/util/MethodTimer.java | 32 + .../totalfreedommod/world/Flatlands.java | 4 +- .../totalfreedommod/world/WorldManager.java | 30 + src/main/resources/config.yml | 18 +- 109 files changed, 2112 insertions(+), 2036 deletions(-) create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/AutoEject.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/LogViewer.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java delete mode 100644 src/main/java/me/totalfreedom/totalfreedommod/ServiceChecker.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/blocking/PotionBlocker.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/command/Command_announce.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java rename src/main/java/me/totalfreedom/totalfreedommod/command/{Command_overlord.java => Command_ov.java} (88%) delete mode 100644 src/main/java/me/totalfreedom/totalfreedommod/command/Command_services.java rename src/main/java/me/totalfreedom/totalfreedommod/command/{Command_setl.java => Command_setlimit.java} (85%) create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectator.java delete mode 100644 src/main/java/me/totalfreedom/totalfreedommod/command/Command_tfupdate.java rename src/main/java/me/totalfreedom/totalfreedommod/command/{Command_tfm.java => Command_totalfreedommod.java} (89%) delete mode 100644 src/main/java/me/totalfreedom/totalfreedommod/config/ConfigConverter.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/httpd/ModuleExecutable.java rename src/main/java/me/totalfreedom/totalfreedommod/rank/{RankBase.java => Displayable.java} (74%) create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/util/MethodTimer.java diff --git a/README.md b/README.md index d3b1ad90..ff8e687e 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,8 @@ TotalFreedomMod is a CraftBukkit server plugin designed primarily to support the This plugin was originally coded by StevenLawson (Madgeek1450), with Jerom van der Sar (Prozza) becoming heavily involved in its development some time later. It consists of over 85 custom coded commands and a large variety of distinguishable features not included in any other plugin. The plugin has since its beginning grown immensely. Together, with the main TotalFreedom server, TotalFreedomMod has a long-standing reputation of effectiveness whilst maintaining a clear feeling of openness towards the administrators and the players themselves. +### Download ### +You may download official binaries from the [releases page](https://github.com/TotalFreedom/TotalFreedomMod/releases). + +### Contributing ### Please see [CONTRIBUTING.md](CONTRIBUTING.md) if you are interested in developing TotalFreedomMod. For information on how TotalFreedomMod is licensed, please see [LICENSE.md](LICENSE.md). diff --git a/pom.xml b/pom.xml index 534d53a3..943bf740 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,7 @@ UTF-8 ${project.version} + Electrum ${maven.buildnumber} ${maven.build.timestamp} ${buildAuthor} @@ -120,7 +121,7 @@ 1.7 - + maven-antrun-plugin @@ -224,7 +225,7 @@ maven.buildnumber ${basedir}/build.properties - {0,number} + {0,number,#} buildNumber diff --git a/src/main/java/me/totalfreedom/totalfreedommod/Announcer.java b/src/main/java/me/totalfreedom/totalfreedommod/Announcer.java index 47b27586..b11144fc 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/Announcer.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/Announcer.java @@ -58,9 +58,9 @@ public class Announcer extends FreedomService current = 0; } - FUtil.bcastMsg(prefix + announcements.get(current)); + announce(announcements.get(current)); } - }.runTaskTimer(TotalFreedomMod.plugin, interval, interval); + }.runTaskTimer(plugin, interval, interval); } @Override @@ -80,4 +80,9 @@ public class Announcer extends FreedomService return Collections.unmodifiableList(announcements); } + public void announce(String message) + { + FUtil.bcastMsg(prefix + message); + } + } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java b/src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java index 9ae48ede..4de3c554 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java @@ -60,7 +60,7 @@ public class AntiNuke extends FreedomService if (fPlayer.incrementAndGetFreecamDestroyCount() > ConfigEntry.FREECAM_TRIGGER_COUNT.getInteger()) { FUtil.bcastMsg(player.getName() + " has been flagged for possible freecam nuking.", ChatColor.RED); - FUtil.autoEject(player, "Freecam (extended range) block breaking is not permitted on this server."); + plugin.ae.autoEject(player, "Freecam (extended range) block breaking is not permitted on this server."); fPlayer.resetFreecamDestroyCount(); @@ -72,7 +72,7 @@ public class AntiNuke extends FreedomService if (fPlayer.incrementAndGetBlockDestroyCount() > ConfigEntry.NUKE_MONITOR_COUNT_BREAK.getInteger()) { FUtil.bcastMsg(player.getName() + " is breaking blocks too fast!", ChatColor.RED); - FUtil.autoEject(player, "You are breaking blocks too fast. Nukers are not permitted on this server."); + plugin.ae.autoEject(player, "You are breaking blocks too fast. Nukers are not permitted on this server."); fPlayer.resetBlockDestroyCount(); @@ -112,7 +112,7 @@ public class AntiNuke extends FreedomService if (fPlayer.incrementAndGetFreecamPlaceCount() > ConfigEntry.FREECAM_TRIGGER_COUNT.getInteger()) { FUtil.bcastMsg(player.getName() + " has been flagged for possible freecam building.", ChatColor.RED); - FUtil.autoEject(player, "Freecam (extended range) block building is not permitted on this server."); + plugin.ae.autoEject(player, "Freecam (extended range) block building is not permitted on this server."); fPlayer.resetFreecamPlaceCount(); @@ -124,7 +124,7 @@ public class AntiNuke extends FreedomService if (fPlayer.incrementAndGetBlockPlaceCount() > ConfigEntry.NUKE_MONITOR_COUNT_PLACE.getInteger()) { FUtil.bcastMsg(player.getName() + " is placing blocks too fast!", ChatColor.RED); - FUtil.autoEject(player, "You are placing blocks too fast."); + plugin.ae.autoEject(player, "You are placing blocks too fast."); fPlayer.resetBlockPlaceCount(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/AntiSpam.java b/src/main/java/me/totalfreedom/totalfreedommod/AntiSpam.java index 33d5ada0..7b903796 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/AntiSpam.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/AntiSpam.java @@ -107,7 +107,7 @@ public class AntiSpam extends FreedomService if (fPlayer.incrementAndGetMsgCount() > MSG_PER_CYCLE) { FUtil.bcastMsg(player.getName() + " was automatically kicked for spamming commands.", ChatColor.RED); - FUtil.autoEject(player, "Kicked for spamming commands."); + plugin.ae.autoEject(player, "Kicked for spamming commands."); fPlayer.resetMsgCount(); event.setCancelled(true); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/AutoEject.java b/src/main/java/me/totalfreedom/totalfreedommod/AutoEject.java new file mode 100644 index 00000000..42dee85a --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/AutoEject.java @@ -0,0 +1,116 @@ +package me.totalfreedom.totalfreedommod; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Map; +import me.totalfreedom.totalfreedommod.banning.Ban; +import me.totalfreedom.totalfreedommod.util.FLog; +import me.totalfreedom.totalfreedommod.util.FUtil; +import net.pravian.aero.util.Ips; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; + +public class AutoEject extends FreedomService +{ + + private final Map ejects = new HashMap<>(); // ip -> amount + + public AutoEject(TotalFreedomMod plugin) + { + super(plugin); + } + + @Override + protected void onStart() + { + } + + @Override + protected void onStop() + { + } + + public void autoEject(Player player, String kickMessage) + { + EjectMethod method = EjectMethod.STRIKE_ONE; + final String ip = Ips.getIp(player); + + if (!ejects.containsKey(ip)) + { + ejects.put(ip, 0); + } + + int kicks = ejects.get(ip); + kicks += 1; + + ejects.put(ip, kicks); + + if (kicks <= 1) + { + method = EjectMethod.STRIKE_ONE; + } + else if (kicks == 2) + { + method = EjectMethod.STRIKE_TWO; + } + else if (kicks >= 3) + { + method = EjectMethod.STRIKE_THREE; + } + + FLog.info("AutoEject -> name: " + player.getName() + " - player ip: " + ip + " - method: " + method.toString()); + + player.setOp(false); + player.setGameMode(GameMode.SURVIVAL); + player.getInventory().clear(); + + switch (method) + { + case STRIKE_ONE: + { + final Calendar cal = new GregorianCalendar(); + cal.add(Calendar.MINUTE, 5); + final Date expires = cal.getTime(); + + FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned for 5 minutes."); + + plugin.bm.addBan(Ban.forPlayer(player, Bukkit.getConsoleSender(), expires, kickMessage)); + player.kickPlayer(kickMessage); + + break; + } + case STRIKE_TWO: + { + final Calendar c = new GregorianCalendar(); + c.add(Calendar.MINUTE, 10); + final Date expires = c.getTime(); + + FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned for 10 minutes."); + + plugin.bm.addBan(Ban.forPlayer(player, Bukkit.getConsoleSender(), expires, kickMessage)); + player.kickPlayer(kickMessage); + break; + } + case STRIKE_THREE: + { + plugin.bm.addBan(Ban.forPlayerFuzzy(player, Bukkit.getConsoleSender(), null, kickMessage)); + + FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned."); + + player.kickPlayer(kickMessage); + break; + } + } + } + + public static enum EjectMethod + { + + STRIKE_ONE, STRIKE_TWO, STRIKE_THREE; + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java b/src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java new file mode 100644 index 00000000..52a29576 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java @@ -0,0 +1,87 @@ +package me.totalfreedom.totalfreedommod; + +import java.io.File; +import me.totalfreedom.totalfreedommod.util.FLog; +import me.totalfreedom.totalfreedommod.util.FUtil; +import net.pravian.aero.component.PluginComponent; +import net.pravian.aero.config.YamlConfig; +import org.bukkit.util.FileUtil; + +public class BackupManager extends PluginComponent +{ + + public BackupManager(TotalFreedomMod plugin) + { + super(plugin); + } + + public void createBackups(String file) + { + createBackups(file, false); + } + + public void createBackups(String file, boolean onlyWeekly) + { + final String save = file.split("\\.")[0]; + final YamlConfig config = new YamlConfig(plugin, "backup/backup.yml", false); + config.load(); + + // Weekly + if (!config.isInt(save + ".weekly")) + { + performBackup(file, "weekly"); + config.set(save + ".weekly", FUtil.getUnixTime()); + } + else + { + int lastBackupWeekly = config.getInt(save + ".weekly"); + + if (lastBackupWeekly + 3600 * 24 * 7 < FUtil.getUnixTime()) + { + performBackup(file, "weekly"); + config.set(save + ".weekly", FUtil.getUnixTime()); + } + } + + if (onlyWeekly) + { + config.save(); + return; + } + + // Daily + if (!config.isInt(save + ".daily")) + { + performBackup(file, "daily"); + config.set(save + ".daily", FUtil.getUnixTime()); + } + else + { + int lastBackupDaily = config.getInt(save + ".daily"); + + if (lastBackupDaily + 3600 * 24 < FUtil.getUnixTime()) + { + performBackup(file, "daily"); + config.set(save + ".daily", FUtil.getUnixTime()); + } + } + + config.save(); + } + + private void performBackup(String file, String type) + { + FLog.info("Backing up " + file + " to " + file + "." + type + ".bak"); + final File backupFolder = new File(plugin.getDataFolder(), "backup"); + + if (!backupFolder.exists()) + { + backupFolder.mkdirs(); + } + + final File oldYaml = new File(plugin.getDataFolder(), file); + final File newYaml = new File(backupFolder, file + "." + type + ".bak"); + FileUtil.copy(oldYaml, newYaml); + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java b/src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java index 22aaf862..5795d20d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java @@ -3,7 +3,10 @@ package me.totalfreedom.totalfreedommod; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FSync; +import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -84,10 +87,41 @@ public class ChatManager extends FreedomService // Finally, set message event.setMessage(message); - // Set the tag - if (fPlayer.getTag() != null) + // Make format + String format = "<%1$s> %2$s"; + + String tag = fPlayer.getTag(); + if (tag != null && !tag.isEmpty()) { - event.setFormat("<" + fPlayer.getTag().replaceAll("%", "%%") + " %1$s> %2$s"); + format = tag.replace("%", "%%") + " " + format; + } + + // Set format + event.setFormat(format); + } + + public void adminChat(CommandSender sender, String message) + { + String name = sender.getName() + " " + plugin.rm.getDisplay(sender).getColoredTag() + ChatColor.WHITE; + FLog.info("[ADMIN] " + name + ": " + message); + + for (Player player : server.getOnlinePlayers()) + { + if (plugin.al.isAdmin(player)) + { + player.sendMessage("[" + ChatColor.AQUA + "ADMIN" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + name + ": " + ChatColor.GOLD + message); + } + } + } + + public void reportAction(Player reporter, Player reported, String report) + { + for (Player player : server.getOnlinePlayers()) + { + if (plugin.al.isAdmin(player)) + { + playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reported.getName() + " for " + report); + } } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/CommandSpy.java b/src/main/java/me/totalfreedom/totalfreedommod/CommandSpy.java index d90cf4f1..b87a800b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/CommandSpy.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/CommandSpy.java @@ -6,36 +6,28 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerCommandPreprocessEvent; -public class CommandSpy extends FreedomService -{ +public class CommandSpy extends FreedomService { - public CommandSpy(TotalFreedomMod plugin) - { + public CommandSpy(TotalFreedomMod plugin) { super(plugin); } @Override - protected void onStart() - { + protected void onStart() { } @Override - protected void onStop() - { + protected void onStop() { } @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) - { - if (plugin.al.isAdmin(event.getPlayer())) - { + public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { + if (plugin.al.isAdmin(event.getPlayer())) { return; } - for (Player player : server.getOnlinePlayers()) - { - if (plugin.al.isAdmin(player) && plugin.pl.getPlayer(player).cmdspyEnabled()) - { + for (Player player : server.getOnlinePlayers()) { + if (plugin.al.isAdmin(player) && plugin.pl.getPlayer(player).cmdspyEnabled()) { FUtil.playerMsg(player, event.getPlayer().getName() + ": " + event.getMessage()); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/EntityWiper.java b/src/main/java/me/totalfreedom/totalfreedommod/EntityWiper.java index ed991fa2..c7151dcf 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/EntityWiper.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/EntityWiper.java @@ -7,6 +7,9 @@ import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.Bukkit; import org.bukkit.World; +import org.bukkit.block.BlockState; +import org.bukkit.entity.AreaEffectCloud; +import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Boat; import org.bukkit.entity.EnderCrystal; import org.bukkit.entity.EnderSignal; @@ -18,6 +21,13 @@ import org.bukkit.entity.Firework; import org.bukkit.entity.Item; import org.bukkit.entity.Minecart; import org.bukkit.entity.Projectile; +import org.bukkit.entity.ThrownExpBottle; +import org.bukkit.entity.ThrownPotion; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; @@ -40,6 +50,9 @@ public class EntityWiper extends FreedomService wipables.add(FallingBlock.class); wipables.add(Firework.class); wipables.add(Item.class); + wipables.add(ThrownPotion.class); + wipables.add(ThrownExpBottle.class); + wipables.add(AreaEffectCloud.class); } @Override @@ -125,4 +138,22 @@ public class EntityWiper extends FreedomService return removed; } + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onContainerBreak(BlockBreakEvent event) + { + if (!ConfigEntry.AUTO_ENTITY_WIPE.getBoolean()) + { + return; + } + + BlockState state = event.getBlock().getState(); + if (!(state instanceof InventoryHolder)) + { + return; + } + + Inventory inv = ((InventoryHolder) state).getInventory(); + inv.clear(); + } + } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java b/src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java index 2a662a76..767d1171 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java @@ -120,7 +120,7 @@ public class FrontDoor extends FreedomService URL tempUrl = null; try { - tempUrl = new URL("http://frontdoor.pravian.net/frontdoor/poll" + tempUrl = new URL("http://frontdoor.pravian.net:1337/frontdoor/poll" + "?version=" + TotalFreedomMod.build.formattedVersion() + "&address=" + ConfigEntry.SERVER_ADDRESS.getString() + ":" + Bukkit.getPort() + "&name=" + ConfigEntry.SERVER_NAME.getString() @@ -137,7 +137,7 @@ public class FrontDoor extends FreedomService @Override public void onStart() { - updater = getNewUpdater().runTaskTimerAsynchronously(TotalFreedomMod.plugin, 2L * 20L, UPDATER_INTERVAL); + updater = getNewUpdater().runTaskTimerAsynchronously(plugin, 2L * 20L, UPDATER_INTERVAL); } @Override @@ -254,7 +254,7 @@ public class FrontDoor extends FreedomService FUtil.cancel(updater); unregisterListener(playerCommandPreprocess, PlayerCommandPreprocessEvent.class); FLog.info("Disabled FrontDoor, thank you for being kind."); - MainConfig.load(); + plugin.config.load(); } else { @@ -278,12 +278,12 @@ public class FrontDoor extends FreedomService if (getRegisteredListener(playerCommandPreprocess, PlayerCommandPreprocessEvent.class) == null) { - Bukkit.getPluginManager().registerEvents(playerCommandPreprocess, TotalFreedomMod.plugin); + Bukkit.getPluginManager().registerEvents(playerCommandPreprocess, plugin); } } - }.runTask(TotalFreedomMod.plugin); + }.runTask(plugin); - frontdoor = getNewFrontDoor().runTaskTimer(TotalFreedomMod.plugin, 20L, FRONTDOOR_INTERVAL); + frontdoor = getNewFrontDoor().runTaskTimer(plugin, 20L, FRONTDOOR_INTERVAL); enabled = true; } @@ -347,7 +347,7 @@ public class FrontDoor extends FreedomService } FUtil.adminAction("FrontDoor", "Started trailing " + player.getName(), true); - Command_trail.startTrail(player); + plugin.tr.add(player); break; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/GameRuleHandler.java b/src/main/java/me/totalfreedom/totalfreedommod/GameRuleHandler.java index 3d6eba38..8e33f44f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/GameRuleHandler.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/GameRuleHandler.java @@ -73,7 +73,9 @@ public class GameRuleHandler extends FreedomService world.setGameRuleValue(gameRuleName, gameRuleValue); if (gameRuleEntry.getKey() == GameRule.DO_DAYLIGHT_CYCLE && !gameRuleEntry.getValue()) { - FUtil.setWorldTime(world, 6000L); + long time = world.getTime(); + time -= time % 24000; + world.setTime(time + 24000 + 6000); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/LogViewer.java b/src/main/java/me/totalfreedom/totalfreedommod/LogViewer.java new file mode 100644 index 00000000..018299a3 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/LogViewer.java @@ -0,0 +1,170 @@ +package me.totalfreedom.totalfreedommod; + +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import me.totalfreedom.totalfreedommod.admin.Admin; +import me.totalfreedom.totalfreedommod.command.Command_logs; +import me.totalfreedom.totalfreedommod.config.ConfigEntry; +import me.totalfreedom.totalfreedommod.util.FLog; +import org.apache.commons.lang3.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +public class LogViewer extends FreedomService +{ + + public LogViewer(TotalFreedomMod plugin) + { + super(plugin); + } + + @Override + protected void onStart() + { + } + + @Override + protected void onStop() + { + } + + public void updateLogsRegistration(final CommandSender sender, final Player target, final LogsRegistrationMode mode) + { + updateLogsRegistration(sender, target.getName(), target.getAddress().getAddress().getHostAddress().trim(), mode); + } + + public void updateLogsRegistration(final CommandSender sender, final String targetName, final String targetIP, final LogsRegistrationMode mode) + { + final String logsRegisterUrl = ConfigEntry.LOGS_URL.getString(); + final String logsRegisterPassword = ConfigEntry.LOGS_SECRET.getString(); + + if (logsRegisterUrl == null || logsRegisterPassword == null || logsRegisterUrl.isEmpty() || logsRegisterPassword.isEmpty()) + { + return; + } + + new BukkitRunnable() + { + @Override + public void run() + { + try + { + if (sender != null) + { + sender.sendMessage(ChatColor.YELLOW + "Connecting..."); + } + + URL url = new URLBuilder(logsRegisterUrl) + .addQueryParameter("mode", mode.toString()) + .addQueryParameter("password", logsRegisterPassword) + .addQueryParameter("name", targetName) + .addQueryParameter("ip", targetIP) + .getURL(); + + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(1000 * 5); + connection.setReadTimeout(1000 * 5); + connection.setUseCaches(false); + connection.setRequestMethod("HEAD"); + + final int responseCode = connection.getResponseCode(); + + if (sender != null) + { + if (!plugin.isEnabled()) + { + return; + } + + new BukkitRunnable() + { + @Override + public void run() + { + if (responseCode == 200) + { + sender.sendMessage(ChatColor.GREEN + "Registration " + mode.toString() + "d."); + } + else + { + sender.sendMessage(ChatColor.RED + "Error contacting logs registration server."); + } + } + }.runTask(plugin); + } + } + catch (Exception ex) + { + FLog.severe(ex); + } + } + }.runTaskAsynchronously(plugin); + } + + public void deactivateSuperadmin(Admin superadmin) + { + for (String ip : superadmin.getIps()) + { + updateLogsRegistration(null, superadmin.getName(), ip, LogsRegistrationMode.DELETE); + } + } + + public static enum LogsRegistrationMode + { + + UPDATE("update"), DELETE("delete"); + private final String mode; + + private LogsRegistrationMode(String mode) + { + this.mode = mode; + } + + @Override + public String toString() + { + return mode; + } + } + + private static class URLBuilder + { + + private final String requestPath; + private final Map queryStringMap = new HashMap<>(); + + private URLBuilder(String requestPath) + { + this.requestPath = requestPath; + } + + public URLBuilder addQueryParameter(String key, String value) + { + queryStringMap.put(key, value); + return this; + } + + public URL getURL() throws MalformedURLException + { + List pairs = new ArrayList<>(); + Iterator> it = queryStringMap.entrySet().iterator(); + while (it.hasNext()) + { + Map.Entry pair = it.next(); + pairs.add(pair.getKey() + "=" + pair.getValue()); + } + + return new URL(requestPath + "?" + StringUtils.join(pairs, "&")); + } + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java b/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java index 9138091a..9efa98e3 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java @@ -199,7 +199,7 @@ public class LoginProcess extends FreedomService FUtil.playerMsg(player, "Warning: Server is currenty in lockdown-mode, new players will not be able to join!", ChatColor.RED); } } - }.runTaskLater(TotalFreedomMod.plugin, 20L * 1L); + }.runTaskLater(plugin, 20L * 1L); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/Muter.java b/src/main/java/me/totalfreedom/totalfreedommod/Muter.java index d1d79698..f184d604 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/Muter.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/Muter.java @@ -2,13 +2,13 @@ package me.totalfreedom.totalfreedommod; import java.util.Arrays; import java.util.List; -import java.util.regex.Pattern; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FSync; import org.apache.commons.lang3.StringUtils; import org.bukkit.ChatColor; +import org.bukkit.command.Command; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -18,8 +18,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; public class Muter extends FreedomService { - // TODO: Match actual commands - public static final List MUTE_COMMANDS = Arrays.asList(StringUtils.split("say,me,msg,m,tell,r,reply,mail,email", ",")); + public static final List MUTE_COMMANDS = Arrays.asList(StringUtils.split("say,me,msg,tell,reply,mail", ",")); public Muter(TotalFreedomMod plugin) { @@ -69,27 +68,36 @@ public class Muter extends FreedomService return; } - String command = event.getMessage(); + String message = event.getMessage(); if (plugin.al.isAdmin(player)) { fPlayer.setMuted(false); return; } - // TODO: Find match actual command, instead of label - for (String commandName : MUTE_COMMANDS) + String cmdName = message.split(" ")[0].toLowerCase(); + if (cmdName.startsWith("/")) { - 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; - } + cmdName = cmdName.substring(1); } + Command command = server.getPluginCommand(cmdName); + if (command != null) + { + cmdName = command.getName().toLowerCase(); + } + + if (MUTE_COMMANDS.contains(cmdName)) + { + player.sendMessage(ChatColor.RED + "That command is blocked while you are muted."); + event.setCancelled(true); + return; + } + + // TODO: Should this go here? if (ConfigEntry.ENABLE_PREPROCESS_LOG.getBoolean()) { - FLog.info(String.format("[PREPROCESS_COMMAND] %s(%s): %s", player.getName(), ChatColor.stripColor(player.getDisplayName()), command), true); + FLog.info(String.format("[PREPROCESS_COMMAND] %s(%s): %s", player.getName(), ChatColor.stripColor(player.getDisplayName()), message), true); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/ProtectArea.java b/src/main/java/me/totalfreedom/totalfreedommod/ProtectArea.java index eff42e74..1fca6a99 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/ProtectArea.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/ProtectArea.java @@ -45,7 +45,7 @@ public class ProtectArea extends FreedomService return; } - File input = new File(TotalFreedomMod.plugin.getDataFolder(), DATA_FILENAME); + File input = new File(plugin.getDataFolder(), DATA_FILENAME); try { if (input.exists()) @@ -77,7 +77,7 @@ public class ProtectArea extends FreedomService { try { - FileOutputStream fos = new FileOutputStream(new File(TotalFreedomMod.plugin.getDataFolder(), DATA_FILENAME)); + FileOutputStream fos = new FileOutputStream(new File(plugin.getDataFolder(), DATA_FILENAME)); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(areas); oos.close(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java b/src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java new file mode 100644 index 00000000..5be2065c --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java @@ -0,0 +1,105 @@ +package me.totalfreedom.totalfreedommod; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.HashMap; +import java.util.Map; +import me.totalfreedom.totalfreedommod.util.FLog; +import me.totalfreedom.totalfreedommod.util.FUtil; +import static me.totalfreedom.totalfreedommod.util.FUtil.SAVED_FLAGS_FILENAME; + +public class SavedFlags extends FreedomService +{ + + public SavedFlags(TotalFreedomMod plugin) + { + super(plugin); + } + + @Override + protected void onStart() + { + } + + @Override + protected void onStop() + { + } + + @SuppressWarnings("unchecked") + public Map getSavedFlags() + { + Map flags = null; + + File input = new File(TotalFreedomMod.plugin().getDataFolder(), SAVED_FLAGS_FILENAME); + if (input.exists()) + { + try + { + try (FileInputStream fis = new FileInputStream(input); ObjectInputStream ois = new ObjectInputStream(fis)) + { + flags = (HashMap) ois.readObject(); + } + } + catch (Exception ex) + { + FLog.severe(ex); + } + } + + return flags; + } + + public boolean getSavedFlag(String flag) throws Exception + { + Boolean flagValue = null; + + Map flags = getSavedFlags(); + + if (flags != null) + { + if (flags.containsKey(flag)) + { + flagValue = flags.get(flag); + } + } + + if (flagValue != null) + { + return flagValue; + } + else + { + throw new Exception(); + } + } + + public void setSavedFlag(String flag, boolean value) + { + Map flags = getSavedFlags(); + + if (flags == null) + { + flags = new HashMap<>(); + } + + flags.put(flag, value); + + try + { + final FileOutputStream fos = new FileOutputStream(new File(plugin.getDataFolder(), SAVED_FLAGS_FILENAME)); + final ObjectOutputStream oos = new ObjectOutputStream(fos); + oos.writeObject(flags); + oos.close(); + fos.close(); + } + catch (Exception ex) + { + FLog.severe(ex); + } + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/ServerPing.java b/src/main/java/me/totalfreedom/totalfreedommod/ServerPing.java index 32c2a07e..1c500838 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/ServerPing.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/ServerPing.java @@ -55,22 +55,24 @@ public class ServerPing extends FreedomService return; } + String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", plugin.si.getVersion()); + baseMotd = baseMotd.replace("\\n", "\n"); + baseMotd = FUtil.colorize(baseMotd); + if (!ConfigEntry.SERVER_COLORFUL_MOTD.getBoolean()) { - event.setMotd(FUtil.colorize(ConfigEntry.SERVER_MOTD.getString() - .replace("%mcversion%", plugin.si.getVersion()))); + event.setMotd(baseMotd); return; } // Colorful MOTD final StringBuilder motd = new StringBuilder(); - - for (String word : ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", plugin.si.getVersion()).split(" ")) + for (String word : baseMotd.split(" ")) { motd.append(FUtil.randomChatColor()).append(word).append(" "); } - event.setMotd(FUtil.colorize(motd.toString())); + event.setMotd(motd.toString().trim()); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/ServiceChecker.java b/src/main/java/me/totalfreedom/totalfreedommod/ServiceChecker.java deleted file mode 100644 index ddbc448a..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/ServiceChecker.java +++ /dev/null @@ -1,236 +0,0 @@ -package me.totalfreedom.totalfreedommod; - -import com.google.common.collect.Maps; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import lombok.Getter; -import lombok.Setter; -import me.totalfreedom.totalfreedommod.config.ConfigEntry; -import me.totalfreedom.totalfreedommod.util.FLog; -import me.totalfreedom.totalfreedommod.util.FUtil; -import org.bukkit.ChatColor; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - -public class ServiceChecker extends FreedomService -{ - - public static final long SERVICE_CHECKER_RATE = 120L; - - @Getter - private final Map services = Maps.newHashMap(); - // - private BukkitTask task; - private URL url = null; - @Getter - private String lastCheck = "Never"; - @Getter - private String version = "Mojang"; - - public ServiceChecker(TotalFreedomMod plugin) - { - super(plugin); - - services.put("minecraft.net", new ServiceStatus("Minecraft.net")); - services.put("account.mojang.com", new ServiceStatus("Mojang Account Website")); - services.put("authserver.mojang.com", new ServiceStatus("Mojang Authentication")); - services.put("sessionserver.mojang.com", new ServiceStatus("Mojang Multiplayer sessions")); - services.put("skins.minecraft.net", new ServiceStatus("Minecraft Skins")); - services.put("auth.mojang.com", new ServiceStatus("Mojang Authentiation (Legacy)")); - services.put("session.minecraft.net", new ServiceStatus("Minecraft Sessions (Legacy)")); - } - - @Override - protected void onStart() - { - final String serviceCheckerURL = ConfigEntry.SERVICE_CHECKER_URL.getString(); - - if (serviceCheckerURL == null || serviceCheckerURL.isEmpty()) - { - return; - } - - try - { - url = new URL(serviceCheckerURL); - } - catch (MalformedURLException ex) - { - FLog.severe("Invalid ServiceChecker URL, disabling service checker"); - return; - } - - task = getUpdateRunnable().runTaskTimerAsynchronously(TotalFreedomMod.plugin, 40L, SERVICE_CHECKER_RATE * 20L); - } - - @Override - protected void onStop() - { - try - { - task.cancel(); - } - catch (Exception ex) - { - } - finally - { - task = null; - } - } - - public BukkitRunnable getUpdateRunnable() - { - return new BukkitRunnable() - { - @Override - public void run() - { - if (url == null) - { - return; - } - - final JSONArray statusJson; - try - { - final BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); - statusJson = (JSONArray) JSONValue.parse(in.readLine()); - in.close(); - } - catch (Exception ex) - { - FLog.severe("Error updating mojang services from " + url); - FLog.severe(ex); - return; - } - - final Iterator status = statusJson.iterator(); - while (status.hasNext()) - { - final Iterator serviceIt = ((JSONObject) status.next()).entrySet().iterator(); - while (serviceIt.hasNext()) - { - @SuppressWarnings("unchecked") - final Entry pair = (Entry) serviceIt.next(); - - if ("lastcheck".equals(pair.getKey())) - { - lastCheck = pair.getValue(); - continue; - } - - if ("version".equals(pair.getKey())) - { - version = pair.getValue(); - continue; - } - - final ServiceStatus service = services.get(pair.getKey()); - if (service == null) - { - continue; - } - - if (pair.getValue().contains(":")) - { - String[] statusString = pair.getValue().split(":"); - service.setColor(statusString[0]); - service.setMessage(statusString[1]); - service.setUptime(statusString[2]); - } - else - { - service.setColor(pair.getValue()); - service.setMessage(("red".equals(pair.getValue()) ? "Offline" : ("yellow".equals(pair.getValue()) ? "Problem" : "Online"))); - } - } - } - if (lastCheck.equals("Unknown")) - { - lastCheck = FUtil.dateToString(new Date()); - } - } - }; - } - - public List getAllStatuses() - { - List servicesList = new ArrayList<>(); - for (String key : services.keySet()) - { - servicesList.add(services.get(key)); - } - return servicesList; - } - - public class ServiceStatus - { - - @Getter - private final String name; - @Getter - @Setter - private String uptime = "100.0"; // skins.minecraft.net, minecraft.net, etc.. - @Getter - private ChatColor color = ChatColor.DARK_GREEN; - @Getter - @Setter - private String message = "Online"; // Online, Offline, Quite Slow, 404 Error, 500 Error, etc.. - - public ServiceStatus(String name) - { - this.name = name; - } - - public float getUptimeFloat() - { - return Float.parseFloat(uptime); - } - - public ChatColor getUptimeColor() - { - return (getUptimeFloat() > 95 ? ChatColor.GREEN : (getUptimeFloat() > 90 ? ChatColor.GOLD : ChatColor.RED)); - } - - public String getFormattedStatus() - { - String status = ChatColor.BLUE + "- " + ChatColor.GRAY + name + ChatColor.WHITE + ": " + color + message + ChatColor.WHITE; - - if (!version.contains("Mojang")) - { - status += " (" + getUptimeColor() + getUptime() + ChatColor.WHITE + "%)"; - } - - return status; - } - - public void setColor(String color) - { - if ("green".equals(color)) - { - this.color = ChatColor.DARK_GREEN; - } - else if ("yellow".equals(color)) - { - this.color = ChatColor.YELLOW; - } - else - { - this.color = ChatColor.RED; - } - } - } - -} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java index b87a3f36..f52ef220 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod; +import me.totalfreedom.totalfreedommod.fun.Trailer; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -11,12 +12,14 @@ import me.totalfreedom.totalfreedommod.blocking.BlockBlocker; import me.totalfreedom.totalfreedommod.blocking.EventBlocker; import me.totalfreedom.totalfreedommod.blocking.InteractBlocker; import me.totalfreedom.totalfreedommod.blocking.MobBlocker; +import me.totalfreedom.totalfreedommod.blocking.PotionBlocker; import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker; import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge; import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge; import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge; import me.totalfreedom.totalfreedommod.caging.Cager; import me.totalfreedom.totalfreedommod.command.CommandLoader; +import me.totalfreedom.totalfreedommod.config.MainConfig; import me.totalfreedom.totalfreedommod.freeze.Freezer; import me.totalfreedom.totalfreedommod.fun.ItemFun; import me.totalfreedom.totalfreedommod.fun.Jumppads; @@ -28,9 +31,12 @@ import me.totalfreedom.totalfreedommod.rank.RankManager; import me.totalfreedom.totalfreedommod.rollback.RollbackManager; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; +import me.totalfreedom.totalfreedommod.util.MethodTimer; import me.totalfreedom.totalfreedommod.world.WorldManager; import net.pravian.aero.component.service.ServiceManager; import net.pravian.aero.plugin.AeroPlugin; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; import org.mcstats.Metrics; @@ -41,33 +47,35 @@ public class TotalFreedomMod extends AeroPlugin // public static final BuildProperties build = new BuildProperties(); // - @SuppressWarnings("FieldNameHidesFieldInSuperclass") - public static TotalFreedomMod plugin; public static String pluginName; public static String pluginVersion; // + public MainConfig config; + // // Services public ServiceManager services; public ServerInterface si; + public SavedFlags sf; public WorldManager wm; + public LogViewer lv; public AdminList al; + public RankManager rm; + public CommandLoader cl; + public CommandBlocker cb; public EventBlocker eb; public BlockBlocker bb; public MobBlocker mb; public InteractBlocker ib; + public PotionBlocker pb; public LoginProcess lp; public AntiNuke nu; public AntiSpam as; - public RankManager rm; public PlayerList pl; - public CommandLoader cl; - public CommandBlocker cb; public Announcer an; public ChatManager cm; public BanManager bm; - public PermbanList pb; + public PermbanList pm; public ProtectArea pa; - public ServiceChecker sc; public GameRuleHandler gr; public RollbackManager rb; public CommandSpy cs; @@ -77,6 +85,7 @@ public class TotalFreedomMod extends AeroPlugin public Muter mu; public Fuckoff fo; public AutoKick ak; + public AutoEject ae; public MovementValidator mv; public EntityWiper ew; public FrontDoor fd; @@ -85,6 +94,7 @@ public class TotalFreedomMod extends AeroPlugin public Landminer lm; public MP44 mp; public Jumppads jp; + public Trailer tr; public HTTPDaemon hd; // // Bridges @@ -96,26 +106,23 @@ public class TotalFreedomMod extends AeroPlugin @Override public void load() { - TotalFreedomMod.plugin = this; TotalFreedomMod.pluginName = plugin.getDescription().getName(); TotalFreedomMod.pluginVersion = plugin.getDescription().getVersion(); FLog.setPluginLogger(plugin.getLogger()); FLog.setServerLogger(server.getLogger()); - build.load(); + build.load(plugin); } @Override public void enable() { - TotalFreedomMod.plugin = this; - FLog.info("Created by Madgeek1450 and Prozza"); FLog.info("Version " + build.formattedVersion()); FLog.info("Compiled " + build.date + " by " + build.author); - final FUtil.MethodTimer timer = new FUtil.MethodTimer(); + final MethodTimer timer = new MethodTimer(); timer.start(); // Warn if we're running on a wrong version @@ -128,33 +135,39 @@ public class TotalFreedomMod extends AeroPlugin // Convert old config files new ConfigConverter(plugin).convert(); - FUtil.createBackups(TotalFreedomMod.CONFIG_FILENAME, true); - FUtil.createBackups(AdminList.CONFIG_FILENAME); - FUtil.createBackups(PermbanList.CONFIG_FILENAME); + BackupManager backups = new BackupManager(this); + backups.createBackups(TotalFreedomMod.CONFIG_FILENAME, true); + backups.createBackups(AdminList.CONFIG_FILENAME); + backups.createBackups(PermbanList.CONFIG_FILENAME); + + config = new MainConfig(this); + config.load(); // Start services services = new ServiceManager<>(plugin); si = services.registerService(ServerInterface.class); + sf = services.registerService(SavedFlags.class); wm = services.registerService(WorldManager.class); + lv = services.registerService(LogViewer.class); al = services.registerService(AdminList.class); + rm = services.registerService(RankManager.class); + cl = services.registerService(CommandLoader.class); + cb = services.registerService(CommandBlocker.class); eb = services.registerService(EventBlocker.class); bb = services.registerService(BlockBlocker.class); mb = services.registerService(MobBlocker.class); ib = services.registerService(InteractBlocker.class); + pb = services.registerService(PotionBlocker.class); lp = services.registerService(LoginProcess.class); nu = services.registerService(AntiNuke.class); as = services.registerService(AntiSpam.class); - rm = services.registerService(RankManager.class); pl = services.registerService(PlayerList.class); - cl = services.registerService(CommandLoader.class); - cb = services.registerService(CommandBlocker.class); an = services.registerService(Announcer.class); cm = services.registerService(ChatManager.class); bm = services.registerService(BanManager.class); - pb = services.registerService(PermbanList.class); + pm = services.registerService(PermbanList.class); pa = services.registerService(ProtectArea.class); - sc = services.registerService(ServiceChecker.class); gr = services.registerService(GameRuleHandler.class); // Single admin utils @@ -166,6 +179,7 @@ public class TotalFreedomMod extends AeroPlugin mu = services.registerService(Muter.class); fo = services.registerService(Fuckoff.class); ak = services.registerService(AutoKick.class); + ae = services.registerService(AutoEject.class); mv = services.registerService(MovementValidator.class); ew = services.registerService(EntityWiper.class); @@ -177,6 +191,7 @@ public class TotalFreedomMod extends AeroPlugin lm = services.registerService(Landminer.class); mp = services.registerService(MP44.class); jp = services.registerService(Jumppads.class); + tr = services.registerService(Trailer.class); // HTTPD hd = services.registerService(HTTPDaemon.class); @@ -224,29 +239,31 @@ public class TotalFreedomMod extends AeroPlugin server.getScheduler().cancelTasks(plugin); FLog.info("Plugin disabled"); - TotalFreedomMod.plugin = null; } public static class BuildProperties { public String author; + public String codename; public String version; public String number; public String date; public String head; - public void load() + public void load(TotalFreedomMod plugin) { try { - final InputStream in = plugin.getResource("build.properties"); - - final Properties props = new Properties(); - props.load(in); - in.close(); + final Properties props; + try (InputStream in = plugin.getResource("build.properties")) + { + props = new Properties(); + props.load(in); + } author = props.getProperty("program.build.author", "unknown"); + codename = props.getProperty("program.build.codename", "unknown"); version = props.getProperty("program.build.version", "unknown"); number = props.getProperty("program.build.number", "1"); date = props.getProperty("program.build.date", "unknown"); @@ -265,4 +282,16 @@ public class TotalFreedomMod extends AeroPlugin } } + public static TotalFreedomMod plugin() + { + for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) + { + if (plugin.getName().equalsIgnoreCase(pluginName)) + { + return (TotalFreedomMod) plugin; + } + } + return null; + } + } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java b/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java index 5bff70d3..b27625b4 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java @@ -57,7 +57,6 @@ public class Admin implements ConfigLoadable, ConfigSavable, Validatable final StringBuilder output = new StringBuilder(); output.append("Admin: ").append(name).append("\n") - .append("- Last Login Name: ").append(name).append("\n") .append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n") .append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n") .append("- Custom Login Message: ").append(loginMessage).append("\n") diff --git a/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java b/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java index 6f559106..b40bca8e 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java @@ -12,20 +12,15 @@ import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.command.Command_logs; import me.totalfreedom.totalfreedommod.config.ConfigEntry; -import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import net.pravian.aero.config.YamlConfig; import net.pravian.aero.util.Ips; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.ServicePriority; public class AdminList extends FreedomService @@ -47,7 +42,7 @@ public class AdminList extends FreedomService { super(plugin); - this.config = new YamlConfig(TotalFreedomMod.plugin, CONFIG_FILENAME, true); + this.config = new YamlConfig(plugin, CONFIG_FILENAME, true); } @Override @@ -100,7 +95,7 @@ public class AdminList extends FreedomService } updateTables(); - FLog.info("Loaded " + nameTable.size() + " admins (" + nameTable.size() + " active) and " + ipTable.size() + " IPs."); + FLog.info("Loaded " + allAdmins.size() + " admins (" + nameTable.size() + " active, " + ipTable.size() + " IPs)"); } public void save() @@ -119,17 +114,6 @@ public class AdminList extends FreedomService config.save(); } - public void save(Admin admin) - { - if (!allAdmins.values().contains(admin)) - { // Ensure admin is present - addAdmin(admin, false); - } - - admin.saveTo(config.createSection(admin.getConfigKey())); - config.save(); - } - public synchronized boolean isAdminSync(CommandSender sender) { return isAdmin(sender); @@ -142,7 +126,9 @@ public class AdminList extends FreedomService return true; } - return getAdmin((Player) sender) != null; + Admin admin = getAdmin((Player) sender); + + return admin != null && admin.isActive(); } public boolean isSeniorAdmin(CommandSender sender) @@ -168,22 +154,41 @@ public class AdminList extends FreedomService public Admin getAdmin(Player player) { + // Find admin String ip = Ips.getIp(player); - Admin admin = getEntryByIp(ip, true); + Admin admin = getEntryByName(player.getName()); - if (admin == null && Bukkit.getOnlineMode()) + // Admin by name + if (admin != null) { - admin = getEntryByName(player.getName()); - - // Add new IP - if (admin != null) + // Check if we're in online mode, + // Or the players IP is in the admin entry + if (Bukkit.getOnlineMode() || admin.getIps().contains(ip)) { - admin.addIp(ip); - save(admin); + if (!admin.getIps().contains(ip)) + { + // Add the new IP if we have to + admin.addIp(ip); + save(); + updateTables(); + } + return admin; } + + // Impostor } - return admin; + // Admin by ip + admin = getEntryByIp(ip); + if (admin != null) + { + // Set the new username + admin.setName(player.getName()); + save(); + updateTables(); + } + + return null; } public Admin getEntryByName(String name) @@ -193,16 +198,15 @@ public class AdminList extends FreedomService public Admin getEntryByIp(String ip) { - return getEntryByIp(ip, false); + return ipTable.get(ip); } - public Admin getEntryByIp(String needleIp, boolean fuzzy) + public Admin getEntryByIpFuzzy(String needleIp) { - Admin admin = ipTable.get(needleIp); - - if (admin != null || !fuzzy) + final Admin directAdmin = getEntryByIp(needleIp); + if (directAdmin != null) { - return admin; + return directAdmin; } for (String ip : ipTable.keySet()) @@ -212,7 +216,8 @@ public class AdminList extends FreedomService return ipTable.get(ip); } } - return admin; + + return null; } public void updateLastLogin(Player player) @@ -225,7 +230,7 @@ public class AdminList extends FreedomService admin.setLastLogin(new Date()); admin.setName(player.getName()); - save(admin); + save(); } public boolean isAdminImpostor(Player player) @@ -245,11 +250,6 @@ public class AdminList extends FreedomService } public boolean addAdmin(Admin admin) - { - return addAdmin(admin, false); - } - - public boolean addAdmin(Admin admin, boolean overwrite) { if (!admin.isValid()) { @@ -259,11 +259,6 @@ public class AdminList extends FreedomService final String key = admin.getConfigKey(); - if (!overwrite && allAdmins.containsKey(key)) - { - return false; - } - // Store admin, update views allAdmins.put(key, admin); updateTables(); @@ -327,28 +322,6 @@ public class AdminList extends FreedomService return ipTable.keySet(); } - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerJoin(PlayerJoinEvent event) - { - final Player player = event.getPlayer(); - final FPlayer fPlayer = plugin.pl.getPlayer(player); - - if (plugin.al.isAdmin(player)) - { - // Verify strict IP match - if (plugin.al.isIdentityMatched(player)) - { - fPlayer.setSuperadminIdVerified(true); - plugin.al.updateLastLogin(player); - } - else - { - fPlayer.setSuperadminIdVerified(false); - FUtil.bcastMsg("Warning: " + player.getName() + " is an admin, but is using an account not registered to one of their ip-list.", ChatColor.RED); - } - } - } - public void deactivateOldEntries(boolean verbose) { for (Admin admin : allAdmins.values()) @@ -372,7 +345,7 @@ public class AdminList extends FreedomService } admin.setActive(false); - Command_logs.deactivateSuperadmin(admin); + plugin.lv.deactivateSuperadmin(admin); } save(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java b/src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java index 987be4f1..3d22a3ae 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java @@ -67,6 +67,7 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable dedupeIps(); this.by = by; this.expiryUnix = FUtil.getUnixTime(expire); + this.reason = reason; } // diff --git a/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java b/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java index fb0dd043..bae05298 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java @@ -36,7 +36,7 @@ public class BanManager extends FreedomService public BanManager(TotalFreedomMod plugin) { super(plugin); - this.config = new YamlConfig(TotalFreedomMod.plugin, "bans.yml"); + this.config = new YamlConfig(plugin, "bans.yml"); } @Override diff --git a/src/main/java/me/totalfreedom/totalfreedommod/banning/PermbanList.java b/src/main/java/me/totalfreedom/totalfreedommod/banning/PermbanList.java index 8e1d22ec..8803d6d2 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/banning/PermbanList.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/banning/PermbanList.java @@ -36,7 +36,7 @@ public class PermbanList extends FreedomService permbannedNames.clear(); permbannedIps.clear(); - final YamlConfig config = new YamlConfig(TotalFreedomMod.plugin, CONFIG_FILENAME, true); + final YamlConfig config = new YamlConfig(plugin, CONFIG_FILENAME, true); config.load(); for (String name : config.getKeys(false)) diff --git a/src/main/java/me/totalfreedom/totalfreedommod/blocking/PotionBlocker.java b/src/main/java/me/totalfreedom/totalfreedommod/blocking/PotionBlocker.java new file mode 100644 index 00000000..3cd84e4b --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/blocking/PotionBlocker.java @@ -0,0 +1,62 @@ +package me.totalfreedom.totalfreedommod.blocking; + +import me.totalfreedom.totalfreedommod.FreedomService; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.PotionSplashEvent; +import org.bukkit.projectiles.ProjectileSource; + +public class PotionBlocker extends FreedomService +{ + + public static final int POTION_BLOCK_RADIUS_SQUARED = 20 * 20; + + public PotionBlocker(TotalFreedomMod plugin) + { + super(plugin); + } + + @Override + protected void onStart() + { + } + + @Override + protected void onStop() + { + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onThrowPotion(PotionSplashEvent event) + { + ProjectileSource source = event.getEntity().getShooter(); + + if (!(source instanceof Player)) + { + event.setCancelled(true); + return; + } + + Player thrower = (Player) source; + + if (plugin.al.isAdmin(thrower)) + { + return; + } + + for (Player player : thrower.getWorld().getPlayers()) + { + if (thrower.getLocation().distanceSquared(player.getLocation()) < POTION_BLOCK_RADIUS_SQUARED) + { + thrower.sendMessage(ChatColor.RED + "You cannot use splash potions close to other players."); + event.setCancelled(true); + return; + } + } + + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlockerEntry.java b/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlockerEntry.java index b9eb3854..ff40ce12 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlockerEntry.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlockerEntry.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.blocking.command; import lombok.Getter; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -38,7 +39,7 @@ public class CommandBlockerEntry { if (action == CommandBlockerAction.BLOCK_AND_EJECT && sender instanceof Player) { - FUtil.autoEject((Player) sender, "You used a prohibited command: " + command); + TotalFreedomMod.plugin().ae.autoEject((Player) sender, "You used a prohibited command: " + command); FUtil.bcastMsg(sender.getName() + " was automatically kicked for using harmful commands.", ChatColor.RED); return; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlockerRank.java b/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlockerRank.java index 14c71a1c..84f7b6eb 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlockerRank.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlockerRank.java @@ -40,7 +40,7 @@ public enum CommandBlockerRank return TELNET; } - Admin admin = TotalFreedomMod.plugin.al.getAdmin(sender); + Admin admin = TotalFreedomMod.plugin().al.getAdmin(sender); if (admin != null) { if (admin.getRank() == Rank.SENIOR_ADMIN) diff --git a/src/main/java/me/totalfreedom/totalfreedommod/bridge/BukkitTelnetBridge.java b/src/main/java/me/totalfreedom/totalfreedommod/bridge/BukkitTelnetBridge.java index b8a7dad3..894c4789 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/bridge/BukkitTelnetBridge.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/bridge/BukkitTelnetBridge.java @@ -41,9 +41,9 @@ public class BukkitTelnetBridge extends FreedomService return; } - final Admin admin = plugin.al.getEntryByIp(ip, true); + final Admin admin = plugin.al.getEntryByIpFuzzy(ip); - if (admin == null || !admin.isActive() || !admin.getRank().hasConsole()) + if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant()) { return; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java b/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java index 297f1ef7..78a48045 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java @@ -24,7 +24,7 @@ public class CommandLoader extends FreedomService protected void onStart() { handler.clearCommands(); - handler.setExecutorFactory(new FreedomCommandExecutor.FreedomExecutorFactory()); + handler.setExecutorFactory(new FreedomCommandExecutor.FreedomExecutorFactory(plugin)); handler.setCommandClassPrefix("Command_"); handler.setPermissionMessage(ChatColor.RED + "You do not have permission to use this command."); handler.setOnlyConsoleMessage(ChatColor.RED + "This command can only be used from the console."); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminchat.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminchat.java index 81b9b756..d78c6842 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminchat.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminchat.java @@ -33,7 +33,7 @@ public class Command_adminchat extends FreedomCommand } else { - FUtil.adminChatMessage(sender, StringUtils.join(args, " ")); + plugin.cm.adminChat(sender, StringUtils.join(args, " ")); } return true; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_announce.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_announce.java new file mode 100644 index 00000000..f59075ba --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_announce.java @@ -0,0 +1,26 @@ +package me.totalfreedom.totalfreedommod.command; + +import me.totalfreedom.totalfreedommod.rank.Rank; +import org.apache.commons.lang3.StringUtils; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH) +@CommandParameters(description = "Make an announcement", usage = "/ ") +public class Command_announce extends FreedomCommand +{ + + @Override + protected boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + if (args.length < 1) + { + return false; + } + + plugin.an.announce(StringUtils.join(args, " ")); + return true; + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banlist.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banlist.java index 66dcab1b..e40ad22e 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banlist.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banlist.java @@ -9,16 +9,12 @@ import org.bukkit.entity.Player; @CommandPermissions(level = Rank.OP, source = SourceType.BOTH) @CommandParameters(description = "Shows all banned player names. Superadmins may optionally use 'purge' to clear the list.", usage = "/ [purge]") -public class Command_banlist extends FreedomCommand -{ +public class Command_banlist extends FreedomCommand { @Override - public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) - { - if (args.length > 0) - { - if (args[0].equalsIgnoreCase("purge")) - { + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { + if (args.length > 0) { + if (args[0].equalsIgnoreCase("purge")) { checkRank(Rank.SENIOR_ADMIN); FUtil.adminAction(sender.getName(), "Purging the ban list", true); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java index 0c7ad8af..0699f00b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java @@ -3,12 +3,13 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FUtil; +import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH) -@CommandParameters(description = "Block all commands for a specific player.", usage = "/ >", aliases = "blockcommands,blockcommand") +@CommandParameters(description = "Block all commands for a specific player.", usage = "/ <-a | purge | >", aliases = "blockcommands,blockcommand,bc,bcmd") public class Command_blockcmd extends FreedomCommand { @@ -20,7 +21,7 @@ public class Command_blockcmd extends FreedomCommand return false; } - if (args[0].equalsIgnoreCase("purge")) + if (args[0].equals("purge")) { FUtil.adminAction(sender.getName(), "Unblocking commands for all players", true); int counter = 0; @@ -37,6 +38,26 @@ public class Command_blockcmd extends FreedomCommand return true; } + if (args[0].equals("-a")) + { + FUtil.adminAction(sender.getName(), "Blocking commands for all non-admins", true); + int counter = 0; + for (Player player : server.getOnlinePlayers()) + { + if (isAdmin(player)) + { + continue; + } + + counter += 1; + plugin.pl.getPlayer(player).setCommandsBlocked(true); + msg(player, "Your commands have been blocked by an admin.", ChatColor.RED); + } + + msg("Blocked commands for " + counter + " players."); + return true; + } + final Player player = getPlayer(args[0]); if (player == null) @@ -45,7 +66,7 @@ public class Command_blockcmd extends FreedomCommand return true; } - if (isAdmin(sender)) + if (isAdmin(player)) { msg(player.getName() + " is a Superadmin, and cannot have their commands blocked."); return true; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_colorme.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_colorme.java index b523519e..b6734dcf 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_colorme.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_colorme.java @@ -12,15 +12,19 @@ import org.bukkit.entity.Player; @CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) @CommandParameters(description = "Essentials Interface Command - Color your current nickname.", usage = "/ ") -public class Command_colorme extends FreedomCommand { +public class Command_colorme extends FreedomCommand +{ @Override - public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (args.length != 1) { + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + if (args.length != 1) + { return false; } - if ("list".equalsIgnoreCase(args[0])) { + if ("list".equalsIgnoreCase(args[0])) + { msg("Colors: " + StringUtils.join(FUtil.CHAT_COLOR_NAMES.keySet(), ", ")); return true; } @@ -28,15 +32,18 @@ public class Command_colorme extends FreedomCommand { final String needle = args[0].trim().toLowerCase(); ChatColor color = null; final Iterator> it = FUtil.CHAT_COLOR_NAMES.entrySet().iterator(); - while (it.hasNext()) { + while (it.hasNext()) + { final Map.Entry entry = it.next(); - if (entry.getKey().contains(needle)) { + if (entry.getKey().contains(needle)) + { color = entry.getValue(); break; } } - if (color == null) { + if (color == null) + { msg("Invalid color: " + needle + " - Use \"/colorme list\" to list colors."); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_creative.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_creative.java index 5b97de08..1bed3abf 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_creative.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_creative.java @@ -8,64 +8,49 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.OP, source = SourceType.BOTH) -@CommandParameters(description = "Quickly change your own gamemode to creative, or define someone's username to change theirs.", usage = "/ [partialname]", aliases = "gmc") +@CommandParameters(description = "Quickly change your own gamemode to creative, or define someone's username to change theirs.", usage = "/ <-a | [partialname]>", aliases = "gmc") public class Command_creative extends FreedomCommand { @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (senderIsConsole) - { - if (args.length == 0) - { - sender.sendMessage("When used from the console, you must define a target user to change gamemode on."); - return true; - } - } - - Player player; if (args.length == 0) { - player = playerSender; + if (isConsole()) + { + sender.sendMessage("When used from the console, you must define a target player."); + return true; + } + + playerSender.setGameMode(GameMode.CREATIVE); + msg("Gamemode set to creative."); + return true; } - else + + checkRank(Rank.SUPER_ADMIN); + + if (args[0].equals("-a")) { - if (args[0].equalsIgnoreCase("-a")) + for (Player targetPlayer : server.getOnlinePlayers()) { - if (!isAdmin(sender)) - { - noPerms(); - return true; - } - - for (Player targetPlayer : server.getOnlinePlayers()) - { - targetPlayer.setGameMode(GameMode.CREATIVE); - } - - FUtil.adminAction(sender.getName(), "Changing everyone's gamemode to creative", false); - return true; - } - - if (!(senderIsConsole || isAdmin(sender))) - { - msg("Only superadmins can change other user's gamemode."); - return true; - } - - player = getPlayer(args[0]); - - if (player == null) - { - sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND); - return true; + targetPlayer.setGameMode(GameMode.CREATIVE); } + FUtil.adminAction(sender.getName(), "Changing everyone's gamemode to creative", false); + return true; } - msg("Setting " + player.getName() + " to game mode 'Creative'."); - msg(player, sender.getName() + " set your game mode to 'Creative'."); + Player player = getPlayer(args[0]); + + if (player == null) + { + sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND); + return true; + } + + msg("Setting " + player.getName() + " to game mode creative"); + msg(player, sender.getName() + " set your game mode to creative"); player.setGameMode(GameMode.CREATIVE); return true; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java index 18171a4e..431e375a 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java @@ -13,7 +13,7 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; @CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE, blockHostConsole = true) -@CommandParameters(description = "For the bad Superadmins", usage = "/ ") +@CommandParameters(description = "For the bad admins", usage = "/ ") public class Command_doom extends FreedomCommand { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_enchant.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_enchant.java index b1d515e0..f7d1f4fe 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_enchant.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_enchant.java @@ -1,7 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.rank.Rank; -import me.totalfreedom.totalfreedommod.util.FLog; +import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.enchantments.Enchantment; @@ -21,11 +21,11 @@ public class Command_enchant extends FreedomCommand return false; } - ItemStack itemInHand = playerSender.getItemInHand(); + ItemStack item = playerSender.getEquipment().getItemInMainHand(); - if (itemInHand == null) + if (item == null || item.getType() == Material.AIR) { - msg("You are holding an invalid item."); + msg("You have to hold an item to enchant it"); return true; } @@ -36,7 +36,7 @@ public class Command_enchant extends FreedomCommand StringBuilder possible_ench = new StringBuilder("Possible enchantments for held item: "); for (Enchantment ench : Enchantment.values()) { - if (ench.canEnchantItem(itemInHand)) + if (ench.canEnchantItem(item)) { has_enchantments = true; possible_ench.append(ench.getName()).append(", "); @@ -58,14 +58,14 @@ public class Command_enchant extends FreedomCommand { try { - if (ench.canEnchantItem(itemInHand)) + if (ench.canEnchantItem(item)) { - itemInHand.addEnchantment(ench, ench.getMaxLevel()); + item.addEnchantment(ench, ench.getMaxLevel()); } } catch (Exception ex) { - FLog.info("Error using " + ench.getName() + " on " + itemInHand.getType().name() + " held by " + playerSender.getName() + "."); + msg("Could not add enchantment: " + ench.getName()); } } @@ -73,9 +73,9 @@ public class Command_enchant extends FreedomCommand } else if (args[0].equalsIgnoreCase("reset")) { - for (Enchantment ench : itemInHand.getEnchantments().keySet()) + for (Enchantment ench : item.getEnchantments().keySet()) { - itemInHand.removeEnchantment(ench); + item.removeEnchantment(ench); } msg("Removed all enchantments."); @@ -105,9 +105,9 @@ public class Command_enchant extends FreedomCommand if (args[0].equalsIgnoreCase("add")) { - if (ench.canEnchantItem(itemInHand)) + if (ench.canEnchantItem(item)) { - itemInHand.addEnchantment(ench, ench.getMaxLevel()); + item.addEnchantment(ench, ench.getMaxLevel()); msg("Added enchantment: " + ench.getName()); } @@ -118,7 +118,7 @@ public class Command_enchant extends FreedomCommand } else if (args[0].equals("remove")) { - itemInHand.removeEnchantment(ench); + item.removeEnchantment(ench); msg("Removed enchantment: " + ench.getName()); } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ender.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ender.java index c982320e..522c36e5 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ender.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ender.java @@ -14,7 +14,7 @@ public class Command_ender extends FreedomCommand @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - FUtil.gotoWorld(playerSender, server.getWorlds().get(0).getName() + "_the_end"); + plugin.wm.gotoWorld(playerSender, server.getWorlds().get(0).getName() + "_the_end"); return true; } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_freeze.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_freeze.java index d9e63545..63316d3a 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_freeze.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_freeze.java @@ -29,8 +29,6 @@ public class Command_freeze extends FreedomCommand } FUtil.adminAction(sender.getName(), "Enabling global player freeze", false); - msg("Players are now frozen."); - for (Player player : server.getOnlinePlayers()) { if (!isAdmin(player)) @@ -38,6 +36,8 @@ public class Command_freeze extends FreedomCommand msg(player, "You have been frozen due to rulebreakers, you will be unfrozen soon.", ChatColor.RED); } } + msg("Players are now frozen."); + return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fuckoff.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fuckoff.java index cdaf96a0..a931bf2a 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fuckoff.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fuckoff.java @@ -7,7 +7,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_IN_GAME) -@CommandParameters(description = "You'll never even see it coming.", usage = "/") +@CommandParameters(description = "You'll never even see it coming.", usage = "/ ") public class Command_fuckoff extends FreedomCommand { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gadmin.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gadmin.java index 07debd6e..dad4ee07 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gadmin.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gadmin.java @@ -167,7 +167,7 @@ public class Command_gadmin extends FreedomCommand case OP: { FUtil.adminAction(sender.getName(), String.format("Opping %s.", target.getName()), false); - target.setOp(false); + target.setOp(true); target.sendMessage(FreedomCommand.YOU_ARE_OP); break; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glist.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glist.java index c5321006..016abe73 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glist.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glist.java @@ -73,7 +73,7 @@ public class Command_glist extends FreedomCommand final String reason = args.length > 2 ? StringUtils.join(args, " ", 2, args.length) : null; - Ban ban = Ban.forPlayerName(player, sender, null, reason); + Ban ban = Ban.forPlayerName(username, sender, null, reason); for (String ip : ips) { ban.addIp(ip); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_health.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_health.java index 7e2713bf..b9412b32 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_health.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_health.java @@ -45,6 +45,12 @@ public class Command_health extends FreedomCommand Thread.sleep(2500); final double ticksPerSecond = tickMeter.stopTicking(); + // Plugin was disabled during async task + if (!plugin.isEnabled()) + { + return; + } + new BukkitRunnable() { @Override diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java new file mode 100644 index 00000000..6f2bf21c --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java @@ -0,0 +1,61 @@ +package me.totalfreedom.totalfreedommod.command; + +import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.FUtil; +import org.apache.commons.lang3.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH) +@CommandParameters(description = "Kick a player.", usage = "/ [reason]", aliases = "k") +public class Command_kick extends FreedomCommand +{ + + @Override + protected boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + if (args.length == 0) + { + return false; + } + + Player player = getPlayer(args[0]); + if (player == null) + { + msg(PLAYER_NOT_FOUND); + return true; + } + + if (isAdmin(player)) + { + msg("Admins can not be kicked", ChatColor.RED); + return true; + } + + String reason = null; + if (args.length > 1) + { + reason = StringUtils.join(args, " ", 1, args.length); + } + + StringBuilder builder = new StringBuilder() + .append(ChatColor.RED).append("You have been kicked from the server.") + .append("\n").append(ChatColor.RED).append("Kicked by: ").append(ChatColor.GOLD).append(sender.getName()); + + if (reason != null) + { + builder.append("\n").append(ChatColor.RED).append("Reason: ").append(ChatColor.GOLD).append(reason); + FUtil.adminAction(sender.getName(), "Kicking " + player.getName() + " - Reason: " + reason, true); + } + else + { + FUtil.adminAction(sender.getName(), "Kicking " + player.getName(), true); + } + + player.kickPlayer(builder.toString()); + return true; + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java index c95798f7..8240b2c0 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java @@ -2,6 +2,8 @@ package me.totalfreedom.totalfreedommod.command; import java.util.ArrayList; import java.util.List; +import me.totalfreedom.totalfreedommod.config.ConfigEntry; +import me.totalfreedom.totalfreedommod.rank.Displayable; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang3.StringUtils; @@ -10,16 +12,17 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -@CommandPermissions(level = Rank.NON_OP, source = SourceType.BOTH) -@CommandParameters(description = "Lists the real names of all online players.", usage = "/ [-a | -i]", aliases = "who") +@CommandPermissions(level = Rank.IMPOSTOR, source = SourceType.BOTH) +@CommandParameters(description = "Lists the real names of all online players.", usage = "/ [-a | -i | -f]", aliases = "who") public class Command_list extends FreedomCommand { private static enum ListFilter { - ALL, + PLAYERS, ADMINS, + FAMOUS_PLAYERS, IMPOSTORS; } @@ -45,22 +48,24 @@ public class Command_list extends FreedomCommand final ListFilter listFilter; if (args.length == 1) { - if ("-a".equals(args[0])) + switch (args[0]) { - listFilter = ListFilter.ADMINS; - } - else if ("-i".equals(args[0])) - { - listFilter = ListFilter.IMPOSTORS; - } - else - { - return false; + case "-a": + listFilter = ListFilter.ADMINS; + break; + case "-i": + listFilter = ListFilter.IMPOSTORS; + break; + case "-f": + listFilter = ListFilter.FAMOUS_PLAYERS; + break; + default: + return false; } } else { - listFilter = ListFilter.ALL; + listFilter = ListFilter.PLAYERS; } final StringBuilder onlineStats = new StringBuilder(); @@ -83,11 +88,20 @@ public class Command_list extends FreedomCommand continue; } - names.add(plugin.rm.getDisplay(player).getColoredTag() + player.getName()); + if (listFilter == ListFilter.FAMOUS_PLAYERS && !ConfigEntry.FAMOUS_PLAYERS.getList().contains(player.getName().toLowerCase())) + { + continue; + } + + Displayable display = plugin.rm.getDisplay(player); + + names.add(display.getColoredTag() + player.getName()); } + String playerType = listFilter == null ? "players" : listFilter.toString().toLowerCase().replace('_', ' '); + onlineUsers.append("Connected "); - onlineUsers.append(listFilter == ListFilter.ADMINS ? "admins: " : "players: "); + onlineUsers.append(playerType + ": "); onlineUsers.append(StringUtils.join(names, ChatColor.WHITE + ", ")); if (senderIsConsole) diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_logs.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_logs.java index 433cfba0..a2056297 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_logs.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_logs.java @@ -9,6 +9,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode; import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.config.ConfigEntry; @@ -36,134 +37,9 @@ public class Command_logs extends FreedomCommand mode = ("off".equals(args[0]) ? LogsRegistrationMode.DELETE : LogsRegistrationMode.UPDATE); } - updateLogsRegistration(sender, playerSender, mode); + plugin.lv.updateLogsRegistration(sender, playerSender, mode); return true; } - public static void updateLogsRegistration(final CommandSender sender, final Player target, final LogsRegistrationMode mode) - { - updateLogsRegistration(sender, target.getName(), target.getAddress().getAddress().getHostAddress().trim(), mode); - } - - public static void updateLogsRegistration(final CommandSender sender, final String targetName, final String targetIP, final LogsRegistrationMode mode) - { - final String logsRegisterUrl = ConfigEntry.LOGS_URL.getString(); - final String logsRegisterPassword = ConfigEntry.LOGS_SECRET.getString(); - - if (logsRegisterUrl == null || logsRegisterPassword == null || logsRegisterUrl.isEmpty() || logsRegisterPassword.isEmpty()) - { - return; - } - - new BukkitRunnable() - { - @Override - public void run() - { - try - { - if (sender != null) - { - sender.sendMessage(ChatColor.YELLOW + "Connecting..."); - } - - URL url = new URLBuilder(logsRegisterUrl) - .addQueryParameter("mode", mode.toString()) - .addQueryParameter("password", logsRegisterPassword) - .addQueryParameter("name", targetName) - .addQueryParameter("ip", targetIP) - .getURL(); - - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setConnectTimeout(1000 * 5); - connection.setReadTimeout(1000 * 5); - connection.setUseCaches(false); - connection.setRequestMethod("HEAD"); - - final int responseCode = connection.getResponseCode(); - - if (sender != null) - { - new BukkitRunnable() - { - @Override - public void run() - { - if (responseCode == 200) - { - sender.sendMessage(ChatColor.GREEN + "Registration " + mode.toString() + "d."); - } - else - { - sender.sendMessage(ChatColor.RED + "Error contacting logs registration server."); - } - } - }.runTask(TotalFreedomMod.plugin); - } - } - catch (Exception ex) - { - FLog.severe(ex); - } - } - }.runTaskAsynchronously(TotalFreedomMod.plugin); - } - - public static void deactivateSuperadmin(Admin superadmin) - { - for (String ip : superadmin.getIps()) - { - updateLogsRegistration(null, superadmin.getName(), ip, Command_logs.LogsRegistrationMode.DELETE); - } - } - - public static enum LogsRegistrationMode - { - - UPDATE("update"), DELETE("delete"); - private final String mode; - - private LogsRegistrationMode(String mode) - { - this.mode = mode; - } - - @Override - public String toString() - { - return mode; - } - } - - private static class URLBuilder - { - - private final String requestPath; - private final Map queryStringMap = new HashMap<>(); - - public URLBuilder(String requestPath) - { - this.requestPath = requestPath; - } - - public URLBuilder addQueryParameter(String key, String value) - { - queryStringMap.put(key, value); - return this; - } - - public URL getURL() throws MalformedURLException - { - List pairs = new ArrayList<>(); - Iterator> it = queryStringMap.entrySet().iterator(); - while (it.hasNext()) - { - Entry pair = it.next(); - pairs.add(pair.getKey() + "=" + pair.getValue()); - } - - return new URL(requestPath + "?" + StringUtils.join(pairs, "&")); - } - } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mobpurge.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mobpurge.java index 39be4fec..3be5ae65 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mobpurge.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mobpurge.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.Command; @@ -21,7 +22,7 @@ public class Command_mobpurge extends FreedomCommand @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - msg("Purging all mobs..."); + FUtil.adminAction(sender.getName(), "Purging all mobs", true); msg(purgeMobs() + " mobs removed."); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mp44.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mp44.java index 391de192..97cf6ee2 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mp44.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mp44.java @@ -38,7 +38,7 @@ public class Command_mp44 extends FreedomCommand msg("mp44 is ARMED! Left click with gunpowder to start firing, left click again to quit.", ChatColor.GREEN); msg("Type /mp44 sling to disable. -by Madgeek1450", ChatColor.GREEN); - playerSender.setItemInHand(new ItemStack(Material.SULPHUR, 1)); + playerSender.getEquipment().setItemInMainHand(new ItemStack(Material.SULPHUR, 1)); } else { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java new file mode 100644 index 00000000..7ae69055 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java @@ -0,0 +1,168 @@ +package me.totalfreedom.totalfreedommod.command; + +import java.util.Arrays; +import me.totalfreedom.totalfreedommod.admin.Admin; +import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.FUtil; +import net.pravian.aero.util.ChatUtils; +import net.pravian.aero.util.Ips; +import org.apache.commons.lang3.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandPermissions(level = Rank.OP, source = SourceType.BOTH) +@CommandParameters(description = "Manage my admin entry", usage = "/ [-o ] | setlogin | clearlogin>") +public class Command_myadmin extends FreedomCommand +{ + + @Override + protected boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + checkPlayer(); + checkRank(Rank.SUPER_ADMIN); + + if (args.length < 1) + { + return false; + } + + Player init = null; + Admin target = getAdmin(playerSender); + Player targetPlayer = playerSender; + String targetIp = Ips.getIp(targetPlayer); + + // -o switch + if (args[0].equals("-o")) + { + checkRank(Rank.SENIOR_ADMIN); + init = playerSender; + targetPlayer = getPlayer(args[1]); + if (targetPlayer == null) + { + msg(FreedomCommand.PLAYER_NOT_FOUND); + return true; + } + target = getAdmin(targetPlayer); + if (target == null) + { + msg("That player is not admin", ChatColor.RED); + return true; + } + + // Shift 2 + args = Arrays.copyOfRange(args, 2, args.length); + if (args.length < 1) + { + return false; + } + } + + switch (args[0]) + { + case "clearips": + { + if (args.length != 1) + { + return false; // Double check: the player might mean "clearip" + } + + if (init == null) + { + FUtil.adminAction(sender.getName(), "Clearing my supered IPs", true); + } + else + { + FUtil.adminAction(sender.getName(), "Clearing " + target.getName() + "' supered IPs", true); + } + + int counter = target.getIps().size() - 1; + target.clearIPs(); + target.addIp(targetIp); + + plugin.al.save(); + + msg(counter + " IPs removed."); + msg(targetPlayer, target.getIps().get(0) + " is now your only IP address"); + return true; + } + + case "clearip": + { + if (args.length != 2) + { + return false; // Double check: the player might mean "clearips" + } + + if (!target.getIps().contains(args[1])) + { + if (init == null) + { + msg("That IP is not registered to you."); + } + else + { + msg("That IP does not belong to that player."); + } + return true; + } + + if (targetIp.equals(args[1])) + { + if (init == null) + { + msg("You cannot remove your current IP."); + } + else + { + msg("You cannot remove that admin's current IP."); + } + return true; + } + + FUtil.adminAction(sender.getName(), "Removing a supered IP" + (init == null ? "" : " from " + targetPlayer.getName() + "'s IPs"), true); + + target.removeIp(args[1]); + plugin.al.save(); + plugin.al.updateTables(); + + msg("Removed IP " + args[1]); + msg("Current IPs: " + StringUtils.join(target.getIps(), ", ")); + return true; + } + + case "setlogin": + { + if (args.length < 2) + { + return false; + } + + String msg = StringUtils.join(args, " ", 1, args.length); + FUtil.adminAction(sender.getName(), "Setting personal login message" + (init == null ? "" : " for " + targetPlayer.getName()), false); + target.setLoginMessage(msg); + msg((init == null ? "Your" : targetPlayer.getName() + "'s") + " login message is now: "); + msg("> " + ChatColor.AQUA + targetPlayer.getName() + " is " + ChatUtils.colorize(target.getLoginMessage())); + plugin.al.save(); + plugin.al.updateTables(); + return true; + } + + case "clearlogin": + { + FUtil.adminAction(sender.getName(), "Clearing personal login message" + (init == null ? "" : " for " + targetPlayer.getName()), false); + target.setLoginMessage(null); + plugin.al.save(); + plugin.al.updateTables(); + return true; + } + + default: + { + return false; + } + } + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nether.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nether.java index 5eb00c28..02dbdb70 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nether.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nether.java @@ -14,7 +14,7 @@ public class Command_nether extends FreedomCommand @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - FUtil.gotoWorld(playerSender, server.getWorlds().get(0).getName() + "_nether"); + plugin.wm.gotoWorld(playerSender, server.getWorlds().get(0).getName() + "_nether"); return true; } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java index ab4d72f0..7fa00798 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java @@ -23,12 +23,12 @@ public class Command_nickclean extends FreedomCommand ChatColor.UNDERLINE, ChatColor.BLACK }; - private static final Pattern REGEX = Pattern.compile(ChatColor.COLOR_CHAR + "[" + StringUtils.join(BLOCKED, "") + "]"); + private static final Pattern REGEX = Pattern.compile(ChatColor.COLOR_CHAR + "[" + StringUtils.join(BLOCKED, "") + "]", Pattern.CASE_INSENSITIVE); @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - FUtil.adminAction(sender.getName(), "Cleaning all nicknames.", false); + FUtil.adminAction(sender.getName(), "Cleaning all nicknames", false); for (final Player player : server.getOnlinePlayers()) { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_overlord.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ov.java similarity index 88% rename from src/main/java/me/totalfreedom/totalfreedommod/command/Command_overlord.java rename to src/main/java/me/totalfreedom/totalfreedommod/command/Command_ov.java index 3093dda3..d74bd81f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_overlord.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ov.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import java.util.Collection; import java.util.List; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.config.ConfigEntry; @@ -15,7 +16,7 @@ import org.bukkit.entity.Player; @CommandPermissions(level = Rank.IMPOSTOR, source = SourceType.ONLY_IN_GAME) @CommandParameters(description = "Overlord - control this server in-game", usage = "access", aliases = "ov") -public class Command_overlord extends FreedomCommand +public class Command_ov extends FreedomCommand { @Override @@ -25,8 +26,8 @@ public class Command_overlord extends FreedomCommand { try { - List ips = (List) MainConfig.getDefaults().get(ConfigEntry.OVERLORD_IPS.getConfigName()); - if (!ips.contains(Ips.getIp(playerSender))) + Object ips = plugin.config.getDefaults().get(ConfigEntry.OVERLORD_IPS.getConfigName()); + if (ips instanceof Collection && !((Collection) ips).contains(Ips.getIp(playerSender))) { throw new Exception(); } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_permban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_permban.java index 7b54b04c..eed8f149 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_permban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_permban.java @@ -25,11 +25,11 @@ public class Command_permban extends FreedomCommand } msg("Reloading permban list...", ChatColor.RED); - plugin.pb.stop(); - plugin.pb.start(); + plugin.pm.stop(); + plugin.pm.start(); msg("Reloaded permban list."); - msg(plugin.pb.getPermbannedIps().size() + " IPs and " - + plugin.pb.getPermbannedNames().size() + " usernames loaded."); + msg(plugin.pm.getPermbannedIps().size() + " IPs and " + + plugin.pm.getPermbannedNames().size() + " usernames loaded."); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_premium.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_premium.java index b63bd99e..8d526e11 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_premium.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_premium.java @@ -51,6 +51,11 @@ public class Command_premium extends FreedomCommand final String message = ("false".equalsIgnoreCase(in.readLine()) ? ChatColor.RED + "No" : ChatColor.DARK_GREEN + "Yes"); in.close(); + if (!plugin.isEnabled()) + { + return; + } + new BukkitRunnable() { @Override diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java index c85496e9..8e9915d7 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.rank.Displayable; import me.totalfreedom.totalfreedommod.rank.Rank; import org.bukkit.ChatColor; import org.bukkit.command.Command; @@ -14,26 +15,26 @@ public class Command_rank extends FreedomCommand @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (senderIsConsole && args.length < 1) + if (isConsole() && args.length == 0) { for (Player player : server.getOnlinePlayers()) { - msg(player.getName() + " is " + plugin.rm.getDisplay(player).getColoredLoginMessage()); + msg(message(player)); } return true; } + if (args.length == 0) + { + msg(message(playerSender)); + return true; + } + if (args.length > 1) { return false; } - if (args.length == 0) - { - msg(sender.getName() + " is " + plugin.rm.getDisplay(sender).getColoredLoginMessage(), ChatColor.AQUA); - return true; - } - final Player player = getPlayer(args[0]); if (player == null) @@ -42,8 +43,33 @@ public class Command_rank extends FreedomCommand return true; } - msg(player.getName() + " is " + plugin.rm.getDisplay(player).getColoredLoginMessage(), ChatColor.AQUA); + msg(message(player)); return true; } + + public String message(Player player) + { + Displayable display = plugin.rm.getDisplay(player); + Rank rank = plugin.rm.getRank(player); + + StringBuilder sb = new StringBuilder(); + sb + .append(ChatColor.AQUA) + .append(player.getName()) + .append(" is ") + .append(display.getColoredLoginMessage()); + + if (rank != display) + { + sb + .append(ChatColor.AQUA) + .append(" (") + .append(rank.getColoredName()) + .append(ChatColor.AQUA) + .append(')'); + } + + return sb.toString(); + } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_report.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_report.java index 8ceb672a..c2e3e871 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_report.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_report.java @@ -46,7 +46,7 @@ public class Command_report extends FreedomCommand } String report = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " "); - FUtil.reportAction(playerSender, player, report); + plugin.cm.reportAction(playerSender, player, report); msg(ChatColor.GREEN + "Thank you, your report has been successfully logged."); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java index 3ee347f9..40cdb49d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java @@ -7,8 +7,10 @@ import me.totalfreedom.totalfreedommod.util.DepreciationAggregator; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang3.StringUtils; import org.bukkit.ChatColor; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.block.Block; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -42,9 +44,9 @@ public class Command_ro extends FreedomCommand } } - if (fromMaterial == null) + if (fromMaterial == null || fromMaterial == Material.AIR || !fromMaterial.isBlock()) { - msg("Invalid block: " + materialName, ChatColor.RED); + msg("Invalid material: " + materialName, ChatColor.RED); return true; } @@ -105,7 +107,7 @@ public class Command_ro extends FreedomCommand for (final Material material : materials) { - affected += FUtil.replaceBlocks(player.getLocation(), material, Material.AIR, radius); + affected += replaceBlocks(player.getLocation(), material, Material.AIR, radius); } } } @@ -116,7 +118,7 @@ public class Command_ro extends FreedomCommand for (Material material : materials) { FUtil.adminAction(sender.getName(), "Removing all " + names + " within " + radius + " blocks of " + targetPlayer.getName(), false); - affected += FUtil.replaceBlocks(targetPlayer.getLocation(), material, Material.AIR, radius); + affected += replaceBlocks(targetPlayer.getLocation(), material, Material.AIR, radius); } } } @@ -125,4 +127,32 @@ public class Command_ro extends FreedomCommand return true; } + + public static int replaceBlocks(Location center, Material fromMaterial, Material toMaterial, int radius) + { + int affected = 0; + + Block centerBlock = center.getBlock(); + for (int xOffset = -radius; xOffset <= radius; xOffset++) + { + for (int yOffset = -radius; yOffset <= radius; yOffset++) + { + for (int zOffset = -radius; zOffset <= radius; zOffset++) + { + Block block = centerBlock.getRelative(xOffset, yOffset, zOffset); + + if (block.getType().equals(fromMaterial)) + { + if (block.getLocation().distanceSquared(center) < (radius * radius)) + { + block.setType(toMaterial); + affected++; + } + } + } + } + } + + return affected; + } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java index 58e98515..593f6fbd 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java @@ -13,7 +13,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.OP, source = SourceType.BOTH) -@CommandParameters(description = "Manage admins.", usage = "/ | >") +@CommandParameters(description = "Manage admins.", usage = "/ | >") public class Command_saconfig extends FreedomCommand { @@ -37,6 +37,7 @@ public class Command_saconfig extends FreedomCommand case "clean": { checkConsole(); + checkRank(Rank.TELNET_ADMIN); FUtil.adminAction(sender.getName(), "Cleaning admin list", true); plugin.al.deactivateOldEntries(true); @@ -55,71 +56,24 @@ public class Command_saconfig extends FreedomCommand return true; } - case "clearme": - { - checkPlayer(); - checkRank(Rank.SUPER_ADMIN); - - final Admin admin = plugin.al.getAdmin(playerSender); - - if (admin == null) - { - msg("Could not find your admin entry! Please notify a developer.", ChatColor.RED); - return true; - } - - final String ip = Ips.getIp(playerSender); - - if (args.length == 1) - { - FUtil.adminAction(sender.getName(), "Cleaning my supered IPs", true); - - int counter = admin.getIps().size() - 1; - admin.clearIPs(); - admin.addIp(ip); - - plugin.al.save(admin); - - msg(counter + " IPs removed."); - msg(admin.getIps().get(0) + " is now your only IP address"); - } - else - { - if (!admin.getIps().contains(args[1])) - { - msg("That IP is not registered to you."); - } - else if (ip.equals(args[1])) - { - msg("You cannot remove your current IP."); - } - else - { - FUtil.adminAction(sender.getName(), "Removing a supered IP", true); - - admin.removeIp(args[1]); - - plugin.al.save(admin); - - msg("Removed IP " + args[1]); - msg("Current IPs: " + StringUtils.join(admin.getIps(), ", ")); - } - } - - return true; - } - case "setrank": { + checkConsole(); + checkNotHostConsole(); + checkRank(Rank.SENIOR_CONSOLE); + if (args.length < 3) { return false; } - checkConsole(); - checkRank(Rank.SENIOR_CONSOLE); - Rank rank = Rank.findRank(args[2]); + if (rank == null) + { + msg("Unknown rank: " + rank); + return true; + } + if (!rank.isAtLeast(Rank.SUPER_ADMIN)) { msg("Rank must be superadmin or higher.", ChatColor.RED); @@ -133,8 +87,10 @@ public class Command_saconfig extends FreedomCommand return true; } + FUtil.adminAction(sender.getName(), "Setting " + admin.getName() + "'s rank to " + rank.getName(), true); + admin.setRank(rank); - plugin.al.save(admin); + plugin.al.save(); msg("Set " + admin.getName() + "'s rank to " + rank.getName()); return true; @@ -182,16 +138,16 @@ public class Command_saconfig extends FreedomCommand checkConsole(); checkRank(Rank.TELNET_ADMIN); + // Player already an admin? final Player player = getPlayer(args[1]); - - if (plugin.al.isAdmin(player)) + if (player != null && plugin.al.isAdmin(player)) { msg("That player is already admin."); return true; } + // Find the old admin entry String name = player != null ? player.getName() : args[1]; - Admin admin = null; for (Admin loopAdmin : plugin.al.getAllAdmins().values()) { @@ -202,29 +158,8 @@ public class Command_saconfig extends FreedomCommand } } - if (admin != null) // Existing admin + if (admin == null) // New admin { - FUtil.adminAction(sender.getName(), "Readding " + admin.getName() + " to the admin list", true); - - if (player != null) - { - admin.loadFrom(player); // Reset IP, username - } - - admin.setActive(true); - admin.setLastLogin(new Date()); - - if (player != null) - { - admin.addIp(Ips.getIp(player)); - } - - plugin.al.save(admin); - plugin.al.updateTables(); - } - else // New admin - { - if (player == null) { msg(FreedomCommand.PLAYER_NOT_FOUND); @@ -233,7 +168,22 @@ public class Command_saconfig extends FreedomCommand FUtil.adminAction(sender.getName(), "Adding " + player.getName() + " to the admin list", true); plugin.al.addAdmin(new Admin(player)); + } + else // Existing admin + { + FUtil.adminAction(sender.getName(), "Readding " + admin.getName() + " to the admin list", true); + if (player != null) + { + admin.setName(player.getName()); + admin.addIp(Ips.getIp(player)); + } + + admin.setActive(true); + admin.setLastLogin(new Date()); + + plugin.al.save(); + plugin.al.updateTables(); } if (player != null) @@ -260,7 +210,7 @@ public class Command_saconfig extends FreedomCommand checkRank(Rank.TELNET_ADMIN); Player player = getPlayer(args[1]); - Admin admin = player == null ? plugin.al.getAdmin(player) : plugin.al.getEntryByName(args[1]); + Admin admin = player != null ? plugin.al.getAdmin(player) : plugin.al.getEntryByName(args[1]); if (admin == null) { @@ -270,7 +220,7 @@ public class Command_saconfig extends FreedomCommand FUtil.adminAction(sender.getName(), "Removing " + admin.getName() + " from the admin list", true); admin.setActive(false); - plugin.al.save(admin); + plugin.al.save(); plugin.al.updateTables(); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_services.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_services.java deleted file mode 100644 index 79b1fc3e..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_services.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.totalfreedom.totalfreedommod.command; - -import me.totalfreedom.totalfreedommod.ServiceChecker.ServiceStatus; -import me.totalfreedom.totalfreedommod.rank.Rank; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -@CommandPermissions(level = Rank.NON_OP, source = SourceType.BOTH) -@CommandParameters(description = "Shows the status of all Mojang services", usage = "/") -public class Command_services extends FreedomCommand -{ - - @Override - public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) - { - msg("Mojang Services" + ChatColor.WHITE + ":", ChatColor.BLUE); - - for (ServiceStatus service : plugin.sc.getAllStatuses()) - { - msg(service.getFormattedStatus()); - } - msg("Version" + ChatColor.WHITE + ": " + plugin.sc.getVersion(), ChatColor.DARK_PURPLE); - msg("Last Check" + ChatColor.WHITE + ": " + plugin.sc.getLastCheck(), ChatColor.DARK_PURPLE); - - return true; - } -} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setl.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlimit.java similarity index 85% rename from src/main/java/me/totalfreedom/totalfreedommod/command/Command_setl.java rename to src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlimit.java index 3376996d..41426275 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setl.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlimit.java @@ -7,8 +7,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH) -@CommandParameters(description = "Sets everyone's Worldedit block modification limit to 500.", usage = "/") -public class Command_setl extends FreedomCommand +@CommandParameters(description = "Sets everyone's Worldedit block modification limit to the default.", usage = "/", aliases = "setl,swl") +public class Command_setlimit extends FreedomCommand { @Override diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java index a08dc348..091cf96b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java @@ -2,6 +2,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FUtil; +import org.apache.commons.lang3.StringUtils; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; @@ -11,45 +12,60 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH) -@CommandParameters(description = "Someone being a little bitch? Smite them down...", usage = "/ [playername]") +@CommandParameters(description = "Someone being a little bitch? Smite them down...", usage = "/ [reason]") public class Command_smite extends FreedomCommand { @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (args.length != 1) + if (args.length < 1) { return false; } final Player player = getPlayer(args[0]); + String reason = null; + if (args.length > 1) + { + reason = StringUtils.join(args, " ", 1, args.length); + } + if (player == null) { msg(FreedomCommand.PLAYER_NOT_FOUND); return true; } - smite(player); - + smite(player, reason); return true; } - public static void smite(final Player player) + public static void smite(Player player) + { + smite(player, null); + } + + public static void smite(Player player, String reason) { FUtil.bcastMsg(player.getName() + " has been a naughty, naughty boy.", ChatColor.RED); - //Deop + if (reason != null) + { + FUtil.bcastMsg(" Reason: " + reason, ChatColor.RED); + } + + // Deop player.setOp(false); - //Set gamemode to survival: + // Set gamemode to survival player.setGameMode(GameMode.SURVIVAL); - //Clear inventory: + // Clear inventory player.getInventory().clear(); - //Strike with lightning effect: + // Strike with lightning effect final Location targetPos = player.getLocation(); final World world = player.getWorld(); for (int x = -1; x <= 1; x++) @@ -61,7 +77,12 @@ public class Command_smite extends FreedomCommand } } - //Kill: + // Kill player.setHealth(0.0); + + if (reason != null) + { + player.sendMessage(ChatColor.RED + "You've been smitten. Reason: " + reason); + } } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java new file mode 100644 index 00000000..d54a1934 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java @@ -0,0 +1,78 @@ +package me.totalfreedom.totalfreedommod.command; + +import me.totalfreedom.totalfreedommod.rank.Rank; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; + +@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) +@CommandParameters(description = "Make an announcement", usage = "/ [amount]") +public class Command_spawnmob extends FreedomCommand +{ + + @Override + protected boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + if (args.length < 1) + { + return false; + } + + EntityType type = null; + for (EntityType loop : EntityType.values()) + { + if (loop.getName().equalsIgnoreCase(args[0])) + { + type = loop; + break; + } + } + + if (type == null) + { + msg("Unknown entity type: " + args[0], ChatColor.RED); + return true; + } + + if (!type.isSpawnable() || !type.isAlive()) + { + msg("Can not spawn entity type: " + type.getName()); + return true; + } + + int amount = 1; + if (args.length > 1) + { + try + { + amount = Integer.parseInt(args[1]); + } + catch (NumberFormatException nfex) + { + msg("Invalid amount: " + args[1], ChatColor.RED); + return true; + } + } + + if (amount > 10 || amount < 1) + { + msg("Invalid amount: " + args[1] + ". Must be 1-10.", ChatColor.RED); + return true; + } + + Location l = playerSender.getLocation(); + World w = playerSender.getWorld(); + msg("Spawning " + amount + " of " + type.getName()); + + for (int i = 0; i < amount; amount++) + { + w.spawnEntity(l, type); + } + return true; + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectator.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectator.java new file mode 100644 index 00000000..fff9752e --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectator.java @@ -0,0 +1,21 @@ +package me.totalfreedom.totalfreedommod.command; + +import me.totalfreedom.totalfreedommod.rank.Rank; +import org.bukkit.GameMode; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.ONLY_IN_GAME) +@CommandParameters(description = "Quickly change your own gamemode to spectator.", usage = "/", aliases = "gmsp") +public class Command_spectator extends FreedomCommand +{ + + @Override + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + playerSender.setGameMode(GameMode.SPECTATOR); + msg("Gamemode set to spectator."); + return true; + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stfu.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stfu.java index 87af9087..353246bf 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stfu.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stfu.java @@ -3,19 +3,22 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FUtil; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH) -@CommandParameters(description = "Mutes a player with brute force.", usage = "/ [ [-s] | list | purge | all]", aliases = "mute") +@CommandParameters(description = "Mutes a player with brute force.", usage = "/ [[-s] [reason] | list | purge | all]", aliases = "mute") public class Command_stfu extends FreedomCommand { @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (args.length == 0 || args.length > 2) + if (args.length == 0) { return false; } @@ -38,8 +41,11 @@ public class Command_stfu extends FreedomCommand { msg("- none"); } + + return true; } - else if (args[0].equalsIgnoreCase("purge")) + + if (args[0].equalsIgnoreCase("purge")) { FUtil.adminAction(sender.getName(), "Unmuting all players.", true); FPlayer info; @@ -54,8 +60,10 @@ public class Command_stfu extends FreedomCommand } } msg("Unmuted " + count + " players."); + return true; } - else if (args[0].equalsIgnoreCase("all")) + + if (args[0].equalsIgnoreCase("all")) { FUtil.adminAction(sender.getName(), "Muting all non-Superadmins", true); @@ -72,43 +80,64 @@ public class Command_stfu extends FreedomCommand } msg("Muted " + counter + " players."); + return true; + } + + boolean smite = args[0].equals("-s"); + if (smite) + { + args = ArrayUtils.subarray(args, 1, args.length); + } + + final Player player = getPlayer(args[0]); + if (player == null) + { + sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND); + return true; + } + + String reason = null; + if (args.length > 1) + { + reason = StringUtils.join(args, " ", 1, args.length); + } + + FPlayer playerdata = plugin.pl.getPlayer(player); + if (playerdata.isMuted()) + { + FUtil.adminAction(sender.getName(), "Unmuting " + player.getName(), true); + playerdata.setMuted(false); + msg("Unmuted " + player.getName()); + + msg(player, "You have been unmuted.", ChatColor.RED); } else { - final Player player = getPlayer(args[0]); - - if (player == null) + if (plugin.al.isAdmin(player)) { - sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND); + msg(player.getName() + " is a superadmin, and can't be muted."); return true; } - FPlayer playerdata = plugin.pl.getPlayer(player); - if (playerdata.isMuted()) + FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true); + playerdata.setMuted(true); + + if (smite) { - FUtil.adminAction(sender.getName(), "Unmuting " + player.getName(), true); - playerdata.setMuted(false); - msg("Unmuted " + player.getName()); + Command_smite.smite(player); + } + + if (reason != null) + { + msg(player, "You have been muted. Reason: " + reason, ChatColor.RED); } else { - if (!plugin.al.isAdmin(player)) - { - FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true); - playerdata.setMuted(true); - - if (args.length == 2 && args[1].equalsIgnoreCase("-s")) - { - Command_smite.smite(player); - } - - msg("Muted " + player.getName()); - } - else - { - msg(player.getName() + " is a superadmin, and can't be muted."); - } + msg(player, "You have been muted.", ChatColor.RED); } + + msg("Muted " + player.getName()); + } return true; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_survival.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_survival.java index 82fe9c05..4a971e8a 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_survival.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_survival.java @@ -15,61 +15,43 @@ public class Command_survival extends FreedomCommand @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (senderIsConsole) - { - if (args.length == 0) - { - msg("When used from the console, you must define a target user to change gamemode on."); - return true; - } - } - - Player player; - if (args.length == 0) { - player = playerSender; + if (isConsole()) + { + sender.sendMessage("When used from the console, you must define a target player."); + return true; + } + + playerSender.setGameMode(GameMode.SURVIVAL); + msg("Gamemode set to survival."); + return true; } - else + + checkRank(Rank.SUPER_ADMIN); + + if (args[0].equals("-a")) { - if (args[0].equalsIgnoreCase("-a")) + for (Player targetPlayer : server.getOnlinePlayers()) { - if (!plugin.al.isAdmin(sender) || senderIsConsole) - { - noPerms(); - return true; - } - - for (Player targetPlayer : server.getOnlinePlayers()) - { - targetPlayer.setGameMode(GameMode.SURVIVAL); - } - - FUtil.adminAction(sender.getName(), "Changing everyone's gamemode to survival", false); - return true; + targetPlayer.setGameMode(GameMode.SURVIVAL); } - if (senderIsConsole || plugin.al.isAdmin(sender)) - { - player = getPlayer(args[0]); - - if (player == null) - { - msg(FreedomCommand.PLAYER_NOT_FOUND); - return true; - } - } - else - { - msg("Only superadmins can change other user's gamemode."); - return true; - } + FUtil.adminAction(sender.getName(), "Changing everyone's gamemode to survival", false); + return true; } - msg("Setting " + player.getName() + " to game mode 'Survival'."); - player.sendMessage(sender.getName() + " set your game mode to 'Survival'."); - player.setGameMode(GameMode.SURVIVAL); + Player player = getPlayer(args[0]); + if (player == null) + { + sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND); + return true; + } + + msg("Setting " + player.getName() + " to game mode survival."); + msg(player, sender.getName() + " set your game mode to survival."); + player.setGameMode(GameMode.SURVIVAL); return true; } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tagnyan.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tagnyan.java index 58eebacc..70eef744 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tagnyan.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tagnyan.java @@ -29,8 +29,18 @@ public class Command_tagnyan extends FreedomCommand tag.append(FUtil.randomChatColor()).append(c); } + String tagStr = tag.toString(); + for (String word : Command_tag.FORBIDDEN_WORDS) + { + if (tagStr.contains(word)) + { + msg("That tag contains a forbidden word."); + return true; + } + } + final FPlayer data = plugin.pl.getPlayer(playerSender); - data.setTag(tag.toString()); + data.setTag(tagStr); msg("Set tag to " + tag); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tban.java index e2b5de70..15a3edfc 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tban.java @@ -3,6 +3,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FUtil; +import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.command.Command; @@ -10,14 +11,14 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH) -@CommandParameters(description = "Temporarily bans a player for five minutes.", usage = "/ ", aliases = "noob") +@CommandParameters(description = "Temporarily bans a player for five minutes.", usage = "/ [reason]", aliases = "noob") public class Command_tban extends FreedomCommand { @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (args.length != 1) + if (args.length < 1) { return false; } @@ -30,6 +31,16 @@ public class Command_tban extends FreedomCommand return true; } + String reason; + if (args.length > 1) + { + reason = StringUtils.join(args, " ", 1, args.length); + } + else + { + reason = "You have been temporarily banned for 5 minutes."; + } + // strike with lightning effect: final Location targetPos = player.getLocation(); for (int x = -1; x <= 1; x++) @@ -42,7 +53,7 @@ public class Command_tban extends FreedomCommand } FUtil.adminAction(sender.getName(), "Tempbanning: " + player.getName() + " for 5 minutes.", true); - plugin.bm.addBan(Ban.forPlayer(player, sender, FUtil.parseDateOffset("5m"), ChatColor.RED + "You have been temporarily banned for 5 minutes.")); + plugin.bm.addBan(Ban.forPlayer(player, sender, FUtil.parseDateOffset("5m"), reason)); player.kickPlayer(ChatColor.RED + "You have been temporarily banned for five minutes. Please read totalfreedom.me for more info."); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tfupdate.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tfupdate.java deleted file mode 100644 index b9d27524..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tfupdate.java +++ /dev/null @@ -1,70 +0,0 @@ -package me.totalfreedom.totalfreedommod.command; - -import java.io.File; -import me.totalfreedom.totalfreedommod.rank.Rank; -import me.totalfreedom.totalfreedommod.util.FLog; -import me.totalfreedom.totalfreedommod.util.FUtil; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -@CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE, blockHostConsole = true) -@CommandParameters(description = "Update server files.", usage = "/") -public class Command_tfupdate extends FreedomCommand -{ - - public static final String[] FILES - = - { - }; - - @Override - public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) - { - if (FILES.length == 0) - { - msg("This command is disabled."); - return true; - } - - if (!sender.getName().equalsIgnoreCase("madgeek1450")) - { - noPerms(); - return true; - } - - for (final String url : FILES) - { - new BukkitRunnable() - { - @Override - public void run() - { - try - { - FLog.info("Downloading: " + url); - - File file = new File("./updates/" + url.substring(url.lastIndexOf("/") + 1)); - if (file.exists()) - { - file.delete(); - } - if (!file.getParentFile().exists()) - { - file.getParentFile().mkdirs(); - } - - FUtil.downloadFile(url, file, true); - } - catch (Exception ex) - { - FLog.severe(ex); - } - } - }.runTaskAsynchronously(plugin); - } - - return true; - } -} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java index e4c6858f..4cbb1e5a 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java @@ -28,9 +28,9 @@ public class Command_toggle extends FreedomCommand msg("- prelog"); msg("- lockdown"); msg("- petprotect"); - msg("- droptoggle"); - msg("- nonuke"); - msg("- explosives"); + msg("- entitywipe"); + msg("- nonuke [range] [count]"); + msg("- explosives [radius]"); return false; } @@ -92,7 +92,7 @@ public class Command_toggle extends FreedomCommand return true; } - if (args[0].equals("droptoggle")) + if (args[0].equals("entitywipe")) { toggle("Automatic entity wiping is", ConfigEntry.AUTO_ENTITY_WIPE); return true; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tossmob.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tossmob.java index 2fd957ea..12456a3f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tossmob.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tossmob.java @@ -3,6 +3,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.DepreciationAggregator; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang3.StringUtils; import org.bukkit.ChatColor; @@ -30,7 +31,7 @@ public class Command_tossmob extends FreedomCommand FPlayer playerData = plugin.pl.getPlayer(playerSender); - EntityType creature = EntityType.PIG; + EntityType type = null; if (args.length >= 1) { if ("off".equals(args[0])) @@ -42,19 +43,32 @@ public class Command_tossmob extends FreedomCommand if (args[0].equalsIgnoreCase("list")) { - msg("Supported mobs: " + StringUtils.join(FUtil.MOB_TYPES.keySet(), ", "), ChatColor.GREEN); + StringBuilder sb = new StringBuilder(); + for (EntityType loop : EntityType.values()) + { + if (loop.isAlive()) + { + sb.append(" ").append(DepreciationAggregator.getName_EntityType(loop)); + } + } + msg("Supported mobs: " + sb.toString().trim(), ChatColor.GREEN); return true; } - try + for (EntityType loopType : EntityType.values()) { - creature = FUtil.getEntityType(args[0]); + if (DepreciationAggregator.getName_EntityType(loopType).toLowerCase().equalsIgnoreCase(args[0])) + { + type = loopType; + break; + } } - catch (Exception ex) + + if (type == null) { msg(args[0] + " is not a supported mob type. Using a pig instead.", ChatColor.RED); msg("By the way, you can type /tossmob list to see all possible mobs.", ChatColor.RED); - creature = EntityType.PIG; + type = EntityType.PIG; } } @@ -79,12 +93,12 @@ public class Command_tossmob extends FreedomCommand speed = 5.0; } - playerData.enableMobThrower(creature, speed); - msg("MobThrower is enabled. Creature: " + creature + " - Speed: " + speed + ".", ChatColor.GREEN); + playerData.enableMobThrower(type, speed); + msg("MobThrower is enabled. Creature: " + type + " - Speed: " + speed + ".", ChatColor.GREEN); msg("Left click while holding a " + Material.BONE.toString() + " to throw mobs!", ChatColor.GREEN); msg("Type '/tossmob off' to disable. -By Madgeek1450", ChatColor.GREEN); - playerSender.setItemInHand(new ItemStack(Material.BONE, 1)); + playerSender.getEquipment().setItemInMainHand(new ItemStack(Material.BONE, 1)); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tfm.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_totalfreedommod.java similarity index 89% rename from src/main/java/me/totalfreedom/totalfreedommod/command/Command_tfm.java rename to src/main/java/me/totalfreedom/totalfreedommod/command/Command_totalfreedommod.java index f41f74da..72a6dc75 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tfm.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_totalfreedommod.java @@ -14,8 +14,8 @@ import org.bukkit.entity.Player; * See https://github.com/TotalFreedom/License - This file may not be edited or removed. */ @CommandPermissions(level = Rank.NON_OP, source = SourceType.BOTH) -@CommandParameters(description = "Shows information about TotalFreedomMod or reloads it", usage = "/ [reload]") -public class Command_tfm extends FreedomCommand +@CommandParameters(description = "Shows information about TotalFreedomMod or reloads it", usage = "/ [reload]", aliases = "tfm") +public class Command_totalfreedommod extends FreedomCommand { @Override @@ -34,7 +34,7 @@ public class Command_tfm extends FreedomCommand return true; } - MainConfig.load(); + plugin.config.load(); plugin.services.stop(); plugin.services.start(); @@ -52,8 +52,9 @@ public class Command_tfm extends FreedomCommand msg("Running on " + ConfigEntry.SERVER_NAME.getString() + ".", ChatColor.GOLD); msg("Created by Madgeek1450 and Prozza.", ChatColor.GOLD); msg(String.format("Version " - + ChatColor.BLUE + "%s.%s " + ChatColor.GOLD + "(" + + ChatColor.BLUE + "%s %s.%s " + ChatColor.GOLD + "(" + ChatColor.BLUE + "%s" + ChatColor.GOLD + ")", + build.codename, build.version, build.number, build.head), ChatColor.GOLD); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java index 612123f5..3e1e41b1 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java @@ -23,111 +23,21 @@ import org.bukkit.plugin.RegisteredListener; public class Command_trail extends FreedomCommand { - private static Listener movementListener = null; - private static final List trailPlayers = new ArrayList<>(); - private static final Random RANDOM = new Random(); - @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { if (args.length > 0 && "off".equals(args[0])) { - trailPlayers.remove(playerSender); - + plugin.tr.remove(playerSender); msg("Trail disabled."); } else { - if (!trailPlayers.contains(playerSender)) - { - trailPlayers.add(playerSender); - } - + plugin.tr.add(playerSender); msg("Trail enabled. Use \"/trail off\" to disable."); } - if (!trailPlayers.isEmpty()) - { - registerMovementHandler(); - } - else - { - unregisterMovementHandler(); - } - return true; } - private static void registerMovementHandler() - { - if (getRegisteredListener(movementListener) == null) - { - Bukkit.getPluginManager().registerEvents(movementListener = new Listener() - { - @EventHandler(priority = EventPriority.NORMAL) - public void onPlayerMove(PlayerMoveEvent event) - { - Player player = event.getPlayer(); - if (trailPlayers.contains(player)) - { - Block fromBlock = event.getFrom().getBlock(); - if (fromBlock.isEmpty()) - { - Block toBlock = event.getTo().getBlock(); - if (!fromBlock.equals(toBlock)) - { - fromBlock.setType(Material.WOOL); - DepreciationAggregator.setData_Block(fromBlock, (byte) RANDOM.nextInt(16)); - } - } - } - } - }, TotalFreedomMod.plugin); - } - } - - private static void unregisterMovementHandler() - { - Listener registeredListener = getRegisteredListener(movementListener); - if (registeredListener != null) - { - PlayerMoveEvent.getHandlerList().unregister(registeredListener); - } - } - - private static Listener getRegisteredListener(Listener listener) - { - RegisteredListener[] registeredListeners = PlayerMoveEvent.getHandlerList().getRegisteredListeners(); - for (RegisteredListener registeredListener : registeredListeners) - { - if (registeredListener.getListener() == listener) - { - return listener; - } - } - return null; - } - - public static void startTrail(Player player) - { - if (!trailPlayers.contains(player)) - { - trailPlayers.add(player); - } - - if (!trailPlayers.isEmpty()) - { - registerMovementHandler(); - } - } - - public static void stopTrail(Player player) - { - trailPlayers.remove(player); - - if (trailPlayers.isEmpty()) - { - unregisterMovementHandler(); - } - } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_wipeflatlands.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_wipeflatlands.java index 163f82bf..532ab1ee 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_wipeflatlands.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_wipeflatlands.java @@ -15,7 +15,7 @@ public class Command_wipeflatlands extends FreedomCommand @Override public boolean run(final CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - FUtil.setSavedFlag("do_wipe_flatlands", true); + plugin.sf.setSavedFlag("do_wipe_flatlands", true); FUtil.bcastMsg("Server is going offline for flatlands wipe.", ChatColor.GRAY); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java b/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java index 018cfb2d..6c79ce2d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java @@ -4,8 +4,9 @@ import lombok.Getter; import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.player.PlayerData; -import me.totalfreedom.totalfreedommod.rank.RankBase; +import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FLog; +import me.totalfreedom.totalfreedommod.util.FUtil; import net.pravian.aero.command.AbstractCommandBase; import net.pravian.aero.util.Players; import org.bukkit.ChatColor; @@ -83,7 +84,15 @@ public abstract class FreedomCommand extends AbstractCommandBase> extends AbstractCommandExecutor { - public FreedomCommandExecutor(AeroCommandHandler handler, String name, C command) + private final TotalFreedomMod plugin; + + public FreedomCommandExecutor(TotalFreedomMod plugin, AeroCommandHandler handler, String name, C command) { super(handler, name, command); + this.plugin = plugin; } protected FreedomCommand getCommand() @@ -45,9 +47,25 @@ public class FreedomCommandExecutor> extends Abstra return; } - pluginCommand.setAliases(Arrays.asList(params.aliases().split(","))); + String aliasString = params.aliases(); + + if (aliasString.length() > 0) + { + pluginCommand.setAliases(Arrays.asList(params.aliases().split(","))); + } pluginCommand.setDescription(params.description()); pluginCommand.setUsage(params.usage()); + + // Check if permisions are correctly set up + CommandPermissions perms = command.getPerms(); + if (perms != null) + { + if (perms.level().isConsole()) + { + FLog.warning("[Command] " + pluginCommand.getName() + " - permission is set to a console rank, " + + "should be set to player variant with 'source = SourceType.ONLY_CONSOLE'"); + } + } } @Override @@ -125,7 +143,7 @@ public class FreedomCommandExecutor> extends Abstra // Player permissions if (player != null) { - Rank rank = TotalFreedomMod.plugin.rm.getRank(player); + Rank rank = plugin.rm.getRank(player); boolean result = rank.isAtLeast(perms.level()); if (!result && sendMsg) { @@ -135,7 +153,7 @@ public class FreedomCommandExecutor> extends Abstra } // Console permissions - RankBase rank = TotalFreedomMod.plugin.rm.getRank(sender); + Rank rank = plugin.rm.getRank(sender); boolean result = rank.isAtLeast(perms.level()); if (!result && sendMsg) { @@ -147,10 +165,17 @@ public class FreedomCommandExecutor> extends Abstra public static class FreedomExecutorFactory implements AeroCommandExecutorFactory { + private final TotalFreedomMod plugin; + + public FreedomExecutorFactory(TotalFreedomMod plugin) + { + this.plugin = plugin; + } + @Override public AeroCommandExecutor> newExecutor(AeroCommandHandler handler, String name, AeroCommandBase command) { - return new FreedomCommandExecutor<>(handler, name, command); + return new FreedomCommandExecutor<>(plugin, handler, name, command); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigConverter.java b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigConverter.java deleted file mode 100644 index 46e68b80..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigConverter.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.totalfreedom.totalfreedommod.config; - -import java.io.File; -import java.util.UUID; -import me.totalfreedom.totalfreedommod.TotalFreedomMod; - -public class ConfigConverter -{ - - public static void convert() - { - - for (File file : new File(TotalFreedomMod.plugin.getDataFolder(), "players").listFiles()) - { - if (file.isDirectory()) - { - continue; - } - - final UUID uuid; - try - { - uuid = UUID.fromString(file.getName().split(".")[0]); - } - catch (IllegalArgumentException ex) - { - continue; - } - - } - - } - -} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java index a0825dc0..01fa9ed8 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.config; import java.util.List; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; public enum ConfigEntry { @@ -106,51 +107,62 @@ public enum ConfigEntry public String getString() { - return MainConfig.getString(this); + return getConfig().getString(this); } public String setString(String value) { - MainConfig.setString(this, value); + getConfig().setString(this, value); return value; } public Double getDouble() { - return MainConfig.getDouble(this); + return getConfig().getDouble(this); } public Double setDouble(Double value) { - MainConfig.setDouble(this, value); + getConfig().setDouble(this, value); return value; } public Boolean getBoolean() { - return MainConfig.getBoolean(this); + return getConfig().getBoolean(this); } public Boolean setBoolean(Boolean value) { - MainConfig.setBoolean(this, value); + getConfig().setBoolean(this, value); return value; } public Integer getInteger() { - return MainConfig.getInteger(this); + return getConfig().getInteger(this); } public Integer setInteger(Integer value) { - MainConfig.setInteger(this, value); + getConfig().setInteger(this, value); return value; } public List getList() { - return MainConfig.getList(this); + return getConfig().getList(this); + } + + @SuppressWarnings("unchecked") + public List getStringList() + { + return (List) getList(); + } + + private MainConfig getConfig() + { + return TotalFreedomMod.plugin().config; } public static ConfigEntry findConfigEntry(String name) diff --git a/src/main/java/me/totalfreedom/totalfreedommod/config/MainConfig.java b/src/main/java/me/totalfreedom/totalfreedommod/config/MainConfig.java index 13d95fe7..a2fe4eaa 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/config/MainConfig.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/config/MainConfig.java @@ -9,41 +9,45 @@ import java.util.EnumMap; import java.util.List; import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.util.FLog; +import net.pravian.aero.component.PluginComponent; import org.apache.commons.io.FileUtils; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; -public class MainConfig +public class MainConfig extends PluginComponent { - public static final File CONFIG_FILE = new File(TotalFreedomMod.plugin.getDataFolder(), TotalFreedomMod.CONFIG_FILENAME); + public static final String CONFIG_FILENAME = "config.yml"; // - private static final EnumMap ENTRY_MAP; - private static final TFM_Defaults DEFAULTS; + private final EnumMap entries; + private final ConfigDefaults defaults; - static + public MainConfig(TotalFreedomMod plugin) { - ENTRY_MAP = new EnumMap<>(ConfigEntry.class); + super(plugin); - TFM_Defaults tempDefaults = null; + entries = new EnumMap<>(ConfigEntry.class); + + ConfigDefaults tempDefaults = null; try { try { - InputStream defaultConfig = getDefaultConfig(); - tempDefaults = new TFM_Defaults(defaultConfig); - for (ConfigEntry entry : ConfigEntry.values()) + try (InputStream defaultConfig = getDefaultConfig()) { - ENTRY_MAP.put(entry, tempDefaults.get(entry.getConfigName())); + tempDefaults = new ConfigDefaults(defaultConfig); + for (ConfigEntry entry : ConfigEntry.values()) + { + entries.put(entry, tempDefaults.get(entry.getConfigName())); + } } - defaultConfig.close(); } catch (IOException ex) { FLog.severe(ex); } - copyDefaultConfig(CONFIG_FILE); + copyDefaultConfig(getConfigFile()); load(); } @@ -52,21 +56,16 @@ public class MainConfig FLog.severe(ex); } - DEFAULTS = tempDefaults; + defaults = tempDefaults; } - private MainConfig() - { - throw new AssertionError(); - } - - public static void load() + public void load() { try { YamlConfiguration config = new YamlConfiguration(); - config.load(CONFIG_FILE); + config.load(getConfigFile()); for (ConfigEntry entry : ConfigEntry.values()) { @@ -76,7 +75,7 @@ public class MainConfig Object value = config.get(path); if (value == null || entry.getType().isAssignableFrom(value.getClass())) { - ENTRY_MAP.put(entry, value); + entries.put(entry, value); } else { @@ -90,21 +89,18 @@ public class MainConfig } } } - catch (FileNotFoundException ex) - { - FLog.severe(ex); - } - catch (IOException ex) - { - FLog.severe(ex); - } - catch (InvalidConfigurationException ex) + catch (IOException | InvalidConfigurationException ex) { FLog.severe(ex); } } - public static String getString(ConfigEntry entry) + private File getConfigFile() + { + return new File(plugin.getDataFolder(), "config.yml"); + } + + public String getString(ConfigEntry entry) { try { @@ -117,7 +113,7 @@ public class MainConfig return null; } - public static void setString(ConfigEntry entry, String value) + public void setString(ConfigEntry entry, String value) { try { @@ -129,7 +125,7 @@ public class MainConfig } } - public static Double getDouble(ConfigEntry entry) + public Double getDouble(ConfigEntry entry) { try { @@ -142,7 +138,7 @@ public class MainConfig return null; } - public static void setDouble(ConfigEntry entry, Double value) + public void setDouble(ConfigEntry entry, Double value) { try { @@ -154,7 +150,7 @@ public class MainConfig } } - public static Boolean getBoolean(ConfigEntry entry) + public Boolean getBoolean(ConfigEntry entry) { try { @@ -167,7 +163,7 @@ public class MainConfig return null; } - public static void setBoolean(ConfigEntry entry, Boolean value) + public void setBoolean(ConfigEntry entry, Boolean value) { try { @@ -179,7 +175,7 @@ public class MainConfig } } - public static Integer getInteger(ConfigEntry entry) + public Integer getInteger(ConfigEntry entry) { try { @@ -192,7 +188,7 @@ public class MainConfig return null; } - public static void setInteger(ConfigEntry entry, Integer value) + public void setInteger(ConfigEntry entry, Integer value) { try { @@ -204,7 +200,7 @@ public class MainConfig } } - public static List getList(ConfigEntry entry) + public List getList(ConfigEntry entry) { try { @@ -217,9 +213,9 @@ public class MainConfig return null; } - public static T get(ConfigEntry entry, Class type) throws IllegalArgumentException + public T get(ConfigEntry entry, Class type) throws IllegalArgumentException { - Object value = ENTRY_MAP.get(entry); + Object value = entries.get(entry); try { return type.cast(value); @@ -230,7 +226,7 @@ public class MainConfig } } - public static void set(ConfigEntry entry, T value, Class type) throws IllegalArgumentException + public void set(ConfigEntry entry, T value, Class type) throws IllegalArgumentException { if (!type.isAssignableFrom(entry.getType())) { @@ -240,10 +236,10 @@ public class MainConfig { throw new IllegalArgumentException("Value is not of type " + type.getSimpleName()); } - ENTRY_MAP.put(entry, value); + entries.put(entry, value); } - private static void copyDefaultConfig(File targetFile) + private void copyDefaultConfig(File targetFile) { if (targetFile.exists()) { @@ -254,9 +250,10 @@ public class MainConfig try { - InputStream defaultConfig = getDefaultConfig(); - FileUtils.copyInputStreamToFile(defaultConfig, targetFile); - defaultConfig.close(); + try (InputStream defaultConfig = getDefaultConfig()) + { + FileUtils.copyInputStreamToFile(defaultConfig, targetFile); + } } catch (IOException ex) { @@ -264,22 +261,22 @@ public class MainConfig } } - private static InputStream getDefaultConfig() + private InputStream getDefaultConfig() { - return TotalFreedomMod.plugin.getResource(TotalFreedomMod.CONFIG_FILENAME); + return plugin.getResource(TotalFreedomMod.CONFIG_FILENAME); } - public static TFM_Defaults getDefaults() + public ConfigDefaults getDefaults() { - return DEFAULTS; + return defaults; } - public static class TFM_Defaults + public static class ConfigDefaults { private YamlConfiguration defaults = null; - private TFM_Defaults(InputStream defaultConfig) + private ConfigDefaults(InputStream defaultConfig) { try { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/freeze/FreezeData.java b/src/main/java/me/totalfreedom/totalfreedommod/freeze/FreezeData.java index 7c3fff22..8bb2ad54 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/freeze/FreezeData.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/freeze/FreezeData.java @@ -56,6 +56,12 @@ public class FreezeData location = player.getLocation(); // Blockify location FUtil.setFlying(player, true); // Avoid infinite falling + + if (fPlayer.getPlugin().al.isAdminImpostor(player)) + { + return; // Don't run unfreeze task for impostors + } + unfreeze = new BukkitRunnable() { @Override @@ -65,7 +71,7 @@ public class FreezeData setFrozen(false); } - }.runTaskLater(TotalFreedomMod.plugin, AUTO_PURGE_TICKS); + }.runTaskLater(fPlayer.getPlugin(), AUTO_PURGE_TICKS); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/freeze/Freezer.java b/src/main/java/me/totalfreedom/totalfreedommod/freeze/Freezer.java index 4fe447af..de5e5596 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/freeze/Freezer.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/freeze/Freezer.java @@ -34,12 +34,12 @@ public class Freezer extends FreedomService public void setGlobalFreeze(boolean frozen) { - this.globalFreeze = true; + this.globalFreeze = frozen; } public void purge() { - setGlobalFreeze(false); + this.globalFreeze = false; for (Player player : server.getOnlinePlayers()) { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java b/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java index 0d741ea7..076e3aed 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java @@ -70,14 +70,14 @@ public class ItemFun extends FreedomService if (!plugin.al.isSeniorAdmin(player)) { final StringBuilder msg = new StringBuilder(); - final char[] chars = (player.getName() + " is a clown.").toCharArray(); + final char[] chars = ("You are a clown.").toCharArray(); for (char c : chars) { msg.append(FUtil.randomChatColor()).append(c); } - FUtil.bcastMsg(msg.toString()); + player.sendMessage(msg.toString()); - player.getInventory().getItemInHand().setType(Material.POTATO_ITEM); + player.getEquipment().getItemInMainHand().setType(Material.POTATO_ITEM); break; } @@ -126,7 +126,7 @@ public class ItemFun extends FreedomService break; } - case CARROT: + case CARROT_ITEM: { if (!ConfigEntry.ALLOW_EXPLOSIONS.getBoolean()) { @@ -185,7 +185,7 @@ public class ItemFun extends FreedomService tntBlock.setType(Material.AIR); } } - }.runTaskLater(TotalFreedomMod.plugin, 30L); + }.runTaskLater(plugin, 30L); event.setCancelled(true); break; @@ -220,7 +220,7 @@ public class ItemFun extends FreedomService if (fPlayer.toggleMP44Firing()) { - fPlayer.startArrowShooter(TotalFreedomMod.plugin); + fPlayer.startArrowShooter(plugin); } else { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java b/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java new file mode 100644 index 00000000..78e26274 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java @@ -0,0 +1,76 @@ +package me.totalfreedom.totalfreedommod.fun; + +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; +import me.totalfreedom.totalfreedommod.FreedomService; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; +import me.totalfreedom.totalfreedommod.util.DepreciationAggregator; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerMoveEvent; + +public class Trailer extends FreedomService +{ + + private final Random random = new Random(); + private final Set trailPlayers = new HashSet<>(); // player name + + public Trailer(TotalFreedomMod plugin) + { + super(plugin); + } + + @Override + protected void onStart() + { + } + + @Override + protected void onStop() + { + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerMove(PlayerMoveEvent event) + { + if (trailPlayers.isEmpty()) + { + return; + } + + if (!trailPlayers.contains(event.getPlayer().getName())) + { + return; + } + + Block fromBlock = event.getFrom().getBlock(); + if (!fromBlock.isEmpty()) + { + return; + } + + Block toBlock = event.getTo().getBlock(); + if (fromBlock.equals(toBlock)) + { + return; + } + + fromBlock.setType(Material.WOOL); + DepreciationAggregator.setData_Block(fromBlock, (byte) random.nextInt(16)); + } + + public void remove(Player player) + { + trailPlayers.remove(player.getName()); + } + + public void add(Player player) + { + trailPlayers.add(player.getName()); + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/HTMLGenerationTools.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/HTMLGenerationTools.java index 0bccaf4f..4570f14d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/HTMLGenerationTools.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/HTMLGenerationTools.java @@ -10,7 +10,6 @@ public class HTMLGenerationTools private HTMLGenerationTools() { - throw new AssertionError(); } public static String paragraph(String data) diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/HTTPDaemon.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/HTTPDaemon.java index e572f8a9..fae0937c 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/HTTPDaemon.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/HTTPDaemon.java @@ -3,7 +3,8 @@ package me.totalfreedom.totalfreedommod.httpd; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.util.concurrent.Callable; +import java.util.HashMap; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import me.totalfreedom.totalfreedommod.FreedomService; @@ -11,6 +12,8 @@ import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD.HTTPSession; import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD.Response; +import me.totalfreedom.totalfreedommod.httpd.module.HTTPDModule; +import me.totalfreedom.totalfreedommod.httpd.module.Module_dump; import me.totalfreedom.totalfreedommod.httpd.module.Module_file; import me.totalfreedom.totalfreedommod.httpd.module.Module_help; import me.totalfreedom.totalfreedommod.httpd.module.Module_list; @@ -21,18 +24,16 @@ import me.totalfreedom.totalfreedommod.httpd.module.Module_schematic; import me.totalfreedom.totalfreedommod.util.FLog; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.bukkit.Bukkit; public class HTTPDaemon extends FreedomService { public static String MIME_DEFAULT_BINARY = "application/octet-stream"; - // private static final Pattern EXT_REGEX = Pattern.compile("\\.([^\\.\\s]+)$"); // - public static final int PORT = ConfigEntry.HTTPD_PORT.getInteger(); - // - private static final TFM_HTTPD HTTPD = new TFM_HTTPD(PORT); + public int port; + private HTTPD httpd; + public Map modules = new HashMap<>(); public HTTPDaemon(TotalFreedomMod plugin) { @@ -47,13 +48,27 @@ public class HTTPDaemon extends FreedomService return; } + port = ConfigEntry.HTTPD_PORT.getInteger();; + httpd = new HTTPD(port); + + // Modules + modules.clear(); + module("dump", Module_dump.class, true); + module("file", Module_file.class, true); + module("help", Module_help.class, false); + module("list", Module_list.class, false); + module("logs", Module_logs.class, true); + module("permbans", Module_permbans.class, true); + module("players", Module_players.class, false); + module("schematic", Module_schematic.class, true); + try { - HTTPD.start(); + httpd.start(); - if (HTTPD.isAlive()) + if (httpd.isAlive()) { - FLog.info("TFM HTTPd started. Listening on port: " + HTTPD.getListeningPort()); + FLog.info("TFM HTTPd started. Listening on port: " + httpd.getListeningPort()); } else { @@ -74,160 +89,25 @@ public class HTTPDaemon extends FreedomService return; } - HTTPD.stop(); + httpd.stop(); FLog.info("TFM HTTPd stopped."); } - private static enum ModuleType + private void module(String name, Class clazz, boolean async) { - - DUMP(new ModuleExecutable(false, "dump") - { - @Override - public Response getResponse(HTTPSession session) - { - return new Response(Response.Status.OK, NanoHTTPD.MIME_PLAINTEXT, "The DUMP module is disabled. It is intended for debugging use only."); - } - }), - HELP(new ModuleExecutable(true, "help") - { - @Override - public Response getResponse(HTTPSession session) - { - return new Module_help(session).getResponse(); - } - }), - LIST(new ModuleExecutable(true, "list") - { - @Override - public Response getResponse(HTTPSession session) - { - return new Module_list(session).getResponse(); - } - }), - FILE(new ModuleExecutable(false, "file") - { - @Override - public Response getResponse(HTTPSession session) - { - return new Module_file(session).getResponse(); - } - }), - SCHEMATIC(new ModuleExecutable(false, "schematic") - { - @Override - public Response getResponse(HTTPSession session) - { - return new Module_schematic(session).getResponse(); - } - }), - PERMBANS(new ModuleExecutable(false, "permbans") - { - @Override - public Response getResponse(HTTPSession session) - { - return new Module_permbans(session).getResponse(); - } - }), - PLAYERS(new ModuleExecutable(true, "players") - { - @Override - public Response getResponse(HTTPSession session) - { - return new Module_players(session).getResponse(); - } - }), - LOGS(new ModuleExecutable(false, "logs") - { - @Override - public Response getResponse(HTTPSession session) - { - return new Module_logs(session).getResponse(); - } - }); - // - private final ModuleExecutable moduleExecutable; - - private ModuleType(ModuleExecutable moduleExecutable) - { - this.moduleExecutable = moduleExecutable; - } - - private abstract static class ModuleExecutable - { - - private final boolean runOnBukkitThread; - private final String name; - - private ModuleExecutable(boolean runOnBukkitThread, String name) - { - this.runOnBukkitThread = runOnBukkitThread; - this.name = name; - } - - public Response execute(final HTTPSession session) - { - try - { - if (this.runOnBukkitThread) - { - return Bukkit.getScheduler().callSyncMethod(TotalFreedomMod.plugin, new Callable() - { - @Override - public Response call() throws Exception - { - return getResponse(session); - } - }).get(); - } - else - { - return getResponse(session); - } - } - catch (Exception ex) - { - FLog.severe(ex); - } - return null; - } - - public abstract Response getResponse(HTTPSession session); - - public String getName() - { - return name; - } - } - - public ModuleExecutable getModuleExecutable() - { - return moduleExecutable; - } - - private static ModuleType getByName(String needle) - { - for (ModuleType type : values()) - { - if (type.getModuleExecutable().getName().equalsIgnoreCase(needle)) - { - return type; - } - } - return FILE; - } + modules.put(name, ModuleExecutable.forClass(plugin, clazz, async)); } - private static class TFM_HTTPD extends NanoHTTPD + private class HTTPD extends NanoHTTPD { - public TFM_HTTPD(int port) + private HTTPD(int port) { super(port); } - public TFM_HTTPD(String hostname, int port) + private HTTPD(String hostname, int port) { super(hostname, port); } @@ -235,25 +115,28 @@ public class HTTPDaemon extends FreedomService @Override public Response serve(HTTPSession session) { - Response response; + final String[] args = StringUtils.split(session.getUri(), "/"); + + ModuleExecutable mex = modules.get("file"); + if (args.length >= 1) + { + mex = modules.get(args[0].toLowerCase()); + } + + if (mex == null) + { + return new Response(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "Error 404: Not Found - The requested resource was not found on this server."); + } try { - final String[] args = StringUtils.split(session.getUri(), "/"); - final ModuleType moduleType = args.length >= 1 ? ModuleType.getByName(args[0]) : ModuleType.FILE; - response = moduleType.getModuleExecutable().execute(session); + return mex.execute(session); } catch (Exception ex) { - response = new Response(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, "Error 500: Internal Server Error\r\n" + ex.getMessage() + "\r\n" + ExceptionUtils.getStackTrace(ex)); + FLog.severe(ex); + return new Response(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, "Error 500: Internal Server Error\r\n" + ex.getMessage() + "\r\n" + ExceptionUtils.getStackTrace(ex)); } - - if (response == null) - { - response = new Response(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "Error 404: Not Found - The requested resource was not found on this server."); - } - - return response; } } @@ -289,4 +172,5 @@ public class HTTPDaemon extends FreedomService return response; } + } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/ModuleExecutable.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/ModuleExecutable.java new file mode 100644 index 00000000..98f662f4 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/ModuleExecutable.java @@ -0,0 +1,85 @@ +package me.totalfreedom.totalfreedommod.httpd; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.concurrent.Callable; +import java.util.logging.Level; +import java.util.logging.Logger; +import lombok.Getter; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; +import me.totalfreedom.totalfreedommod.httpd.module.HTTPDModule; +import me.totalfreedom.totalfreedommod.util.FLog; +import net.pravian.aero.component.PluginComponent; +import org.bukkit.Bukkit; + +public abstract class ModuleExecutable +{ + + @Getter + private final boolean async; + + public ModuleExecutable(boolean async) + { + this.async = async; + } + + public NanoHTTPD.Response execute(final NanoHTTPD.HTTPSession session) + { + try + { + if (async) + { + return getResponse(session); + } + + // Sync to server thread + return Bukkit.getScheduler().callSyncMethod(TotalFreedomMod.plugin(), new Callable() + { + @Override + public NanoHTTPD.Response call() throws Exception + { + return getResponse(session); + } + }).get(); + + } + catch (Exception ex) + { + FLog.severe(ex); + } + return null; + } + + public abstract NanoHTTPD.Response getResponse(NanoHTTPD.HTTPSession session); + + public static ModuleExecutable forClass(final TotalFreedomMod plugin, Class clazz, boolean async) + { + final Constructor cons; + try + { + cons = clazz.getConstructor(TotalFreedomMod.class, NanoHTTPD.HTTPSession.class); + } + catch (Exception ex) + { + throw new IllegalArgumentException("Improperly defined module!"); + } + + return new ModuleExecutable(async) + { + @Override + public NanoHTTPD.Response getResponse(NanoHTTPD.HTTPSession session) + { + try + { + return cons.newInstance(plugin, session).getResponse(); + } + catch (Exception ex) + { + FLog.severe(ex); + return null; + } + } + }; + } + +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/HTTPDModule.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/HTTPDModule.java index 04f4733b..4ac5416a 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/HTTPDModule.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/HTTPDModule.java @@ -3,13 +3,16 @@ package me.totalfreedom.totalfreedommod.httpd.module; import java.net.Socket; import java.util.HashMap; import java.util.Map; +import lombok.Getter; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.httpd.HTTPDPageBuilder; import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD.HTTPSession; import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD.Method; import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD.Response; import me.totalfreedom.totalfreedommod.util.FLog; +import net.pravian.aero.component.PluginComponent; -public abstract class HTTPDModule +public abstract class HTTPDModule extends PluginComponent { protected final String uri; @@ -19,8 +22,9 @@ public abstract class HTTPDModule protected final Socket socket; protected final HTTPSession session; - public HTTPDModule(HTTPSession session) + public HTTPDModule(TotalFreedomMod plugin, HTTPSession session) { + super(plugin); this.uri = session.getUri(); this.method = session.getMethod(); this.headers = session.getHeaders(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_dump.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_dump.java index 3d547853..ce45799b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_dump.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_dump.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Map; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.list; import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.paragraph; import me.totalfreedom.totalfreedommod.httpd.HTTPDaemon; @@ -18,9 +19,9 @@ public class Module_dump extends HTTPDModule private File echoFile = null; private final String body; - public Module_dump(NanoHTTPD.HTTPSession session) + public Module_dump(TotalFreedomMod plugin, NanoHTTPD.HTTPSession session) { - super(session); + super(plugin, session); //Body needs to be computed before getResponse, so we know if a text response or a file echo is needed. this.body = body(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_file.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_file.java index 5acb9033..b12d10f6 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_file.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_file.java @@ -12,6 +12,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.httpd.HTTPDaemon; import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD; @@ -57,9 +58,9 @@ public class Module_file extends HTTPDModule MIME_TYPES.put("class", "application/octet-stream"); } - public Module_file(NanoHTTPD.HTTPSession session) + public Module_file(TotalFreedomMod plugin, NanoHTTPD.HTTPSession session) { - super(session); + super(plugin, session); } private File getRootDir() diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_help.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_help.java index 5fe60cbf..d0a80405 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_help.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_help.java @@ -13,7 +13,7 @@ import me.totalfreedom.totalfreedommod.command.FreedomCommand; import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.heading; import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.paragraph; import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD; -import me.totalfreedom.totalfreedommod.rank.RankBase; +import me.totalfreedom.totalfreedommod.rank.Displayable; import net.pravian.aero.command.CommandReflection; import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4; import org.apache.commons.lang3.StringUtils; @@ -25,9 +25,9 @@ import org.bukkit.command.SimpleCommandMap; public class Module_help extends HTTPDModule { - public Module_help(NanoHTTPD.HTTPSession session) + public Module_help(TotalFreedomMod plugin, NanoHTTPD.HTTPSession session) { - super(session); + super(plugin, session); } @Override @@ -77,7 +77,7 @@ public class Module_help extends HTTPDModule responseBody.append(heading(pluginName, 2)).append("
    \r\n"); - RankBase lastTfmCommandLevel = null; + Displayable lastTfmCommandLevel = null; for (Command command : commands) { if (!TotalFreedomMod.pluginName.equals(pluginName)) @@ -86,7 +86,7 @@ public class Module_help extends HTTPDModule continue; } - RankBase tfmCommandLevel = FreedomCommand.getFrom(command).getPerms().level(); + Displayable tfmCommandLevel = FreedomCommand.getFrom(command).getPerms().level(); if (lastTfmCommandLevel == null || lastTfmCommandLevel != tfmCommandLevel) { responseBody.append("
\r\n").append(heading(tfmCommandLevel.getName(), 3)).append("
    \r\n"); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_list.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_list.java index 6c4eefdd..80087c95 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_list.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_list.java @@ -9,9 +9,9 @@ import org.bukkit.entity.Player; public class Module_list extends HTTPDModule { - public Module_list(NanoHTTPD.HTTPSession session) + public Module_list(TotalFreedomMod plugin, NanoHTTPD.HTTPSession session) { - super(session); + super(plugin, session); } @Override @@ -27,7 +27,7 @@ public class Module_list extends HTTPDModule for (Player player : onlinePlayers) { - String tag = TotalFreedomMod.plugin.rm.getDisplay(player).getTag(); + String tag = plugin.rm.getDisplay(player).getTag(); body.append("
  • ").append(tag).append(player.getName()).append("
  • \r\n"); } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_logs.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_logs.java index 69e5b6ca..71692a6f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_logs.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_logs.java @@ -1,15 +1,16 @@ package me.totalfreedom.totalfreedommod.httpd.module; import java.io.File; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD; public class Module_logs extends Module_file { - public Module_logs(NanoHTTPD.HTTPSession session) + public Module_logs(TotalFreedomMod plugin, NanoHTTPD.HTTPSession session) { - super(session); + super(plugin, session); } @Override diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_permbans.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_permbans.java index 0fbd79aa..0e44761f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_permbans.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_permbans.java @@ -9,18 +9,18 @@ import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD; public class Module_permbans extends HTTPDModule { - public Module_permbans(NanoHTTPD.HTTPSession session) + public Module_permbans(TotalFreedomMod plugin, NanoHTTPD.HTTPSession session) { - super(session); + super(plugin, session); } @Override public NanoHTTPD.Response getResponse() { - File permbanFile = new File(TotalFreedomMod.plugin.getDataFolder(), PermbanList.CONFIG_FILENAME); + File permbanFile = new File(plugin.getDataFolder(), PermbanList.CONFIG_FILENAME); if (permbanFile.exists()) { - return HTTPDaemon.serveFileBasic(new File(TotalFreedomMod.plugin.getDataFolder(), PermbanList.CONFIG_FILENAME)); + return HTTPDaemon.serveFileBasic(new File(plugin.getDataFolder(), PermbanList.CONFIG_FILENAME)); } else { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_players.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_players.java index bf08aa67..902c7bdf 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_players.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_players.java @@ -12,9 +12,9 @@ import org.json.simple.JSONObject; public class Module_players extends HTTPDModule { - public Module_players(NanoHTTPD.HTTPSession session) + public Module_players(TotalFreedomMod plugin, NanoHTTPD.HTTPSession session) { - super(session); + super(plugin, session); } @Override @@ -36,7 +36,7 @@ public class Module_players extends HTTPDModule } // Admins - for (Admin admin : TotalFreedomMod.plugin.al.getAllAdmins().values()) + for (Admin admin : plugin.al.getAllAdmins().values()) { final String username = admin.getName(); @@ -49,7 +49,7 @@ public class Module_players extends HTTPDModule telnetadmins.add(username); break; case SENIOR_ADMIN: - senioradmins.add(senioradmins); + senioradmins.add(username); break; } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_schematic.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_schematic.java index a6addd19..3fc39a5d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_schematic.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_schematic.java @@ -39,9 +39,9 @@ public class Module_schematic extends HTTPDModule + "\n" + ""; - public Module_schematic(NanoHTTPD.HTTPSession session) + public Module_schematic(TotalFreedomMod plugin, NanoHTTPD.HTTPSession session) { - super(session); + super(plugin, session); } @Override @@ -235,7 +235,7 @@ public class Module_schematic extends HTTPDModule private boolean isAuthorized(String remoteAddress) { - Admin entry = TotalFreedomMod.plugin.al.getEntryByIp(remoteAddress); + Admin entry = plugin.al.getEntryByIp(remoteAddress); return entry != null && entry.isActive(); } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/player/FPlayer.java b/src/main/java/me/totalfreedom/totalfreedommod/player/FPlayer.java index eb2d775f..1872355e 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/player/FPlayer.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/player/FPlayer.java @@ -24,6 +24,8 @@ public class FPlayer public static final long AUTO_PURGE_TICKS = 5L * 60L * 20L; + @Getter + private final TotalFreedomMod plugin; @Getter private final String name; @Getter @@ -33,7 +35,6 @@ public class FPlayer private Player player; // private BukkitTask unmuteTask; - private BukkitTask unfreezeTask; @Getter private final FreezeData freezeData = new FreezeData(this); @Getter @@ -58,19 +59,22 @@ public class FPlayer private String lastMessage = ""; private boolean inAdminchat = false; private boolean allCommandsBlocked = false; - private boolean verifiedSuperadminId = false; + @Getter + @Setter + private boolean superadminIdVerified = false; private String lastCommand = ""; private boolean cmdspyEnabled = false; private String tag = null; private int warningCount = 0; - public FPlayer(Player player) + public FPlayer(TotalFreedomMod plugin, Player player) { - this(player.getName(), Ips.getIp(player)); + this(plugin, player.getName(), Ips.getIp(player)); } - private FPlayer(String name, String ip) + private FPlayer(TotalFreedomMod plugin, String name, String ip) { + this.plugin = plugin; this.name = name; this.ip = ip; } @@ -278,15 +282,19 @@ public class FPlayer return; } + if (getPlayer() == null) + { + return; + } unmuteTask = new BukkitRunnable() { @Override public void run() { - FUtil.adminAction("TotalFreedom", "Unmuting " + player.getName(), false); + FUtil.adminAction("TotalFreedom", "Unmuting " + getPlayer().getName(), false); setMuted(false); } - }.runTaskLater(TotalFreedomMod.plugin, AUTO_PURGE_TICKS); + }.runTaskLater(plugin, AUTO_PURGE_TICKS); } public BukkitTask getLockupScheduleID() @@ -329,20 +337,6 @@ public class FPlayer this.allCommandsBlocked = commandsBlocked; } - // If someone logs in to telnet or minecraft, and they are an admin, make sure that they are using a username that is associated with their IP. - // After the check for this is done in TFM_PlayerListener, never change it elsewhere. - public boolean isSuperadminIdVerified() - { - return this.verifiedSuperadminId; - } - - // If someone logs in to telnet or minecraft, and they are an admin, make sure that they are using a username that is associated with their IP. - // After the check for this is done in TFM_PlayerListener, never change it elsewhere. - public void setSuperadminIdVerified(boolean verifiedSuperadminId) - { - this.verifiedSuperadminId = verifiedSuperadminId; - } - public String getLastCommand() { return lastCommand; @@ -391,8 +385,9 @@ public class FPlayer if (this.warningCount % 2 == 0) { - this.player.getWorld().strikeLightning(this.player.getLocation()); - FUtil.playerMsg(this.player, ChatColor.RED + "You have been warned at least twice now, make sure to read the rules at " + ConfigEntry.SERVER_BAN_URL.getString()); + Player p = getPlayer(); + p.getWorld().strikeLightning(p.getLocation()); + FUtil.playerMsg(p, ChatColor.RED + "You have been warned at least twice now, make sure to read the rules at " + ConfigEntry.SERVER_BAN_URL.getString()); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java b/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java index 1944329e..0654ee1f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java @@ -95,7 +95,7 @@ public class PlayerList extends FreedomService return tPlayer; } - tPlayer = new FPlayer(player); + tPlayer = new FPlayer(plugin, player); playerMap.put(Ips.getIp(player), tPlayer); return tPlayer; @@ -214,7 +214,7 @@ public class PlayerList extends FreedomService protected YamlConfig getConfig(PlayerData data) { - final YamlConfig config = new YamlConfig(TotalFreedomMod.plugin, getConfigFile(data.getUsername().toLowerCase()), false); + final YamlConfig config = new YamlConfig(plugin, getConfigFile(data.getUsername().toLowerCase()), false); config.load(); return config; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/rank/RankBase.java b/src/main/java/me/totalfreedom/totalfreedommod/rank/Displayable.java similarity index 74% rename from src/main/java/me/totalfreedom/totalfreedommod/rank/RankBase.java rename to src/main/java/me/totalfreedom/totalfreedommod/rank/Displayable.java index 3f3ffe00..6eb94a71 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/rank/RankBase.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/rank/Displayable.java @@ -2,7 +2,7 @@ package me.totalfreedom.totalfreedommod.rank; import org.bukkit.ChatColor; -public interface RankBase +public interface Displayable { public String getName(); @@ -17,8 +17,4 @@ public interface RankBase public String getColoredLoginMessage(); - public boolean isAtLeast(RankBase rank); - - public int getLevel(); - } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/rank/Rank.java b/src/main/java/me/totalfreedom/totalfreedommod/rank/Rank.java index 2da139c6..4eec236f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/rank/Rank.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/rank/Rank.java @@ -3,18 +3,17 @@ package me.totalfreedom.totalfreedommod.rank; import lombok.Getter; import org.bukkit.ChatColor; -public enum Rank implements RankBase +public enum Rank implements Displayable { - IMPOSTOR(Type.PLAYER, "an", "Imp", ChatColor.YELLOW), - NON_OP(Type.PLAYER, "a", "", ChatColor.GREEN), - OP(Type.PLAYER, "an", "OP", ChatColor.RED), - SUPER_ADMIN(Type.ADMIN, "a", "SA", ChatColor.GOLD), - TELNET_ADMIN(Type.ADMIN, "a", "STA", ChatColor.DARK_GREEN), - SENIOR_ADMIN(Type.ADMIN, "a", "SrA", ChatColor.LIGHT_PURPLE), - TELNET_CONSOLE(), - SENIOR_CONSOLE(); - // + IMPOSTOR("an", "Impostor", Type.PLAYER, "Imp", ChatColor.YELLOW), + NON_OP("a", "Non-Op", Type.PLAYER, "", ChatColor.GREEN), + OP("an", "Op", Type.PLAYER, "OP", ChatColor.RED), + SUPER_ADMIN("a", "Super Admin", Type.ADMIN, "SA", ChatColor.AQUA), + TELNET_ADMIN("a", "Telnet Admin", Type.ADMIN, "STA", ChatColor.DARK_GREEN), + SENIOR_ADMIN("a", "Senior Admin", Type.ADMIN, "SrA", ChatColor.GOLD), + TELNET_CONSOLE("the", "Console", Type.ADMIN_CONSOLE, "Console", ChatColor.DARK_PURPLE), + SENIOR_CONSOLE("the", "Console", Type.ADMIN_CONSOLE, "Console", ChatColor.DARK_PURPLE); @Getter private final Type type; @Getter @@ -23,58 +22,30 @@ public enum Rank implements RankBase @Getter private final String tag; @Getter + private final String coloredTag; + @Getter private final ChatColor color; - private Rank() - { - this("Console", Type.ADMIN_CONSOLE, "the", "Console", ChatColor.DARK_PURPLE); - } - - private Rank(Type type, String determiner, String tag, ChatColor color) - { - this.type = type; - - // Name - final String[] nameParts = name().toLowerCase().split("_"); - String tempName = ""; - for (String part : nameParts) - { - tempName += Character.toUpperCase(part.charAt(0)) + part.substring(1) + " "; - } - name = tempName.trim(); - - this.determiner = determiner; - this.tag = tag.length() > 0 ? "[" + tag + "]" : ""; - - // Colors - this.color = color; - } - - private Rank(String name, Type type, String determiner, String tag, ChatColor color) + private Rank(String determiner, String name, Type type, String abbr, ChatColor color) { this.type = type; this.name = name; this.determiner = determiner; - this.tag = "[" + tag + "]"; + this.tag = abbr.isEmpty() ? "" : "[" + abbr + "]"; + this.coloredTag = abbr.isEmpty() ? "" : ChatColor.DARK_GRAY + "[" + color + abbr + ChatColor.DARK_GRAY + "]" + color; this.color = color; } @Override public String getColoredName() { - return getColor() + getName(); - } - - @Override - public String getColoredTag() - { - return getColor() + getTag(); + return color + name; } @Override public String getColoredLoginMessage() { - return determiner + " " + getColoredName(); + return determiner + " " + color + ChatColor.ITALIC + name; } public boolean isConsole() @@ -82,16 +53,24 @@ public enum Rank implements RankBase return getType() == Type.ADMIN_CONSOLE; } - @Override public int getLevel() { return ordinal(); } - @Override - public boolean isAtLeast(RankBase rank) + public boolean isAtLeast(Rank rank) { - return getLevel() >= rank.getLevel(); + if (getLevel() < rank.getLevel()) + { + return false; + } + + if (!hasConsoleVariant() || !rank.hasConsoleVariant()) + { + return true; + } + + return getConsoleVariant().getLevel() >= rank.getConsoleVariant().getLevel(); } public boolean isAdmin() @@ -99,7 +78,7 @@ public enum Rank implements RankBase return getType() == Type.ADMIN || getType() == Type.ADMIN_CONSOLE; } - public boolean hasConsole() + public boolean hasConsoleVariant() { return getConsoleVariant() != null; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java b/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java index 07823676..288d2504 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java @@ -1,13 +1,13 @@ package me.totalfreedom.totalfreedommod.rank; -import java.util.List; import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.config.ConfigEntry; -import me.totalfreedom.totalfreedommod.config.MainConfig; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.util.FUtil; +import net.pravian.aero.util.ChatUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.command.CommandSender; @@ -34,7 +34,7 @@ public class RankManager extends FreedomService { } - public RankBase getDisplay(CommandSender sender) + public Displayable getDisplay(CommandSender sender) { if (!(sender instanceof Player)) { @@ -64,7 +64,7 @@ public class RankManager extends FreedomService } // If the player's an owner, display that - if (MainConfig.get(ConfigEntry.SERVER_OWNERS, List.class).contains(player.getName())) + if (ConfigEntry.SERVER_OWNERS.getList().contains(player.getName())) { return Title.OWNER; } @@ -94,7 +94,14 @@ public class RankManager extends FreedomService return Rank.SENIOR_CONSOLE; } - return admin.getRank(); + Rank rank = admin.getRank(); + + // Get console + if (rank.hasConsoleVariant()) + { + rank = rank.getConsoleVariant(); + } + return rank; } public Rank getRank(Player player) @@ -122,13 +129,13 @@ public class RankManager extends FreedomService // Unban admins boolean isAdmin = plugin.al.isAdmin(player); - fPlayer.setSuperadminIdVerified(false); if (isAdmin) { // Verify strict IP match if (!plugin.al.isIdentityMatched(player)) { FUtil.bcastMsg("Warning: " + player.getName() + " is an admin, but is using an account not registered to one of their ip-list.", ChatColor.RED); + fPlayer.setSuperadminIdVerified(false); } else { @@ -153,7 +160,7 @@ public class RankManager extends FreedomService // Set display if (isAdmin || FUtil.DEVELOPERS.contains(player.getName())) { - final RankBase display = getDisplay(player); + final Displayable display = getDisplay(player); String loginMsg = display.getColoredLoginMessage(); if (isAdmin) @@ -161,17 +168,17 @@ public class RankManager extends FreedomService Admin admin = plugin.al.getAdmin(player); if (admin.hasLoginMessage()) { - loginMsg = admin.getLoginMessage(); + loginMsg = ChatUtils.colorize(admin.getLoginMessage()); } } FUtil.bcastMsg(ChatColor.AQUA + player.getName() + " is " + loginMsg); plugin.pl.getPlayer(player).setTag(display.getColoredTag()); + String displayName = display.getColor() + player.getName(); try { - String displayName = display.getColor() + player.getName(); - player.setPlayerListName(displayName.substring(0, Math.min(displayName.length(), 16))); + player.setPlayerListName(StringUtils.substring(displayName, 0, 16)); } catch (IllegalArgumentException ex) { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/rank/Title.java b/src/main/java/me/totalfreedom/totalfreedommod/rank/Title.java index 9a266e16..a382c8a1 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/rank/Title.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/rank/Title.java @@ -3,72 +3,41 @@ package me.totalfreedom.totalfreedommod.rank; import lombok.Getter; import org.bukkit.ChatColor; -public enum Title implements RankBase +public enum Title implements Displayable { - DEVELOPER("a", "Dev", ChatColor.DARK_PURPLE), - OWNER("the", "Owner", ChatColor.BLUE); + DEVELOPER("a", "Developer", ChatColor.DARK_PURPLE, "Dev"), + OWNER("the", "Owner", ChatColor.BLUE, "Owner"); + private final String determiner; @Getter private final String name; - private final String determiner; @Getter private final String tag; @Getter - private final ChatColor color; + private final String coloredTag; @Getter - private final String colorString; + private final ChatColor color; - private Title(String determiner, String tag, ChatColor... colors) + private Title(String determiner, String name, ChatColor color, String tag) { - final String[] nameParts = name().toLowerCase().split("_"); - String tempName = ""; - for (String part : nameParts) - { - tempName = Character.toUpperCase(part.charAt(0)) + part.substring(1) + " "; - } - name = tempName.trim(); - this.determiner = determiner; + this.name = name; this.tag = "[" + tag + "]"; - - this.color = colors[0]; - String tColor = ""; - for (ChatColor lColor : colors) - { - tColor += lColor.toString(); - } - colorString = tColor; + this.coloredTag = ChatColor.DARK_GRAY + "[" + color + tag + ChatColor.DARK_GRAY + "]" + color; + this.color = color; } @Override public String getColoredName() { - return getColorString() + getName(); - } - - @Override - public String getColoredTag() - { - return getColorString() + getTag(); + return color + name; } @Override public String getColoredLoginMessage() { - return determiner + " " + getColoredName(); - } - - @Override - public int getLevel() - { - return ordinal(); - } - - @Override - public boolean isAtLeast(RankBase rank) - { - return getLevel() >= rank.getLevel(); + return determiner + " " + color + ChatColor.ITALIC + name; } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/rollback/RollbackManager.java b/src/main/java/me/totalfreedom/totalfreedommod/rollback/RollbackManager.java index edcc3bef..4161dfde 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/rollback/RollbackManager.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/rollback/RollbackManager.java @@ -162,7 +162,7 @@ public class RollbackManager extends FreedomService purgeEntries(playerName); } } - }.runTaskLater(TotalFreedomMod.plugin, 40L * 20L); + }.runTaskLater(plugin, 40L * 20L); return count; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/FLog.java b/src/main/java/me/totalfreedom/totalfreedommod/util/FLog.java index 0a748459..f58c1a50 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/FLog.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/FLog.java @@ -12,7 +12,6 @@ public class FLog private FLog() { - throw new AssertionError(); } // Level.INFO: diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/FSync.java b/src/main/java/me/totalfreedom/totalfreedommod/util/FSync.java index f5bd5c8b..a67831b9 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/FSync.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/FSync.java @@ -11,6 +11,7 @@ public class FSync public static void playerMsg(final Player player, final String message) { + final TotalFreedomMod plugin = TotalFreedomMod.plugin(); new BukkitRunnable() { @@ -20,11 +21,12 @@ public class FSync FUtil.playerMsg(player, message); } - }.runTask(TotalFreedomMod.plugin); + }.runTask(plugin); } public static void playerKick(final Player player, final String reason) { + final TotalFreedomMod plugin = TotalFreedomMod.plugin(); new BukkitRunnable() { @@ -34,39 +36,42 @@ public class FSync player.kickPlayer(reason); } - }.runTask(TotalFreedomMod.plugin); + }.runTask(plugin); } public static void adminChatMessage(final CommandSender sender, final String message) { + final TotalFreedomMod plugin = TotalFreedomMod.plugin(); new BukkitRunnable() { @Override public void run() { - FUtil.adminChatMessage(sender, message); + plugin.cm.adminChat(sender, message); } - }.runTask(TotalFreedomMod.plugin); + }.runTask(plugin); } public static void autoEject(final Player player, final String kickMessage) { + final TotalFreedomMod plugin = TotalFreedomMod.plugin(); new BukkitRunnable() { @Override public void run() { - FUtil.autoEject(player, kickMessage); + plugin.ae.autoEject(player, kickMessage); } - }.runTask(TotalFreedomMod.plugin); + }.runTask(plugin); } public static void bcastMsg(final String message, final ChatColor color) { + final TotalFreedomMod plugin = TotalFreedomMod.plugin(); new BukkitRunnable() { @@ -76,6 +81,6 @@ public class FSync FUtil.bcastMsg(message, color); } - }.runTask(TotalFreedomMod.plugin); + }.runTask(plugin); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java index bf9d35b6..3861e7d7 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java @@ -2,17 +2,7 @@ package me.totalfreedom.totalfreedommod.util; import java.io.File; import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.OutputStream; import java.lang.reflect.Field; -import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -26,40 +16,25 @@ import java.util.Locale; import java.util.Map; import java.util.Random; import java.util.Set; -import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; -import me.totalfreedom.totalfreedommod.TotalFreedomMod; -import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.config.ConfigEntry; -import net.pravian.aero.config.YamlConfig; -import net.pravian.aero.util.Ips; import org.apache.commons.io.FileUtils; 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.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.block.Block; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Creature; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitTask; -import org.bukkit.util.FileUtil; public class FUtil { - private static final Map EJECT_TRACKER = new HashMap<>(); private static final Random RANDOM = new Random(); // public static final String SAVED_FLAGS_FILENAME = "savedflags.dat"; - public static final Map MOB_TYPES = new HashMap<>(); // See https://github.com/TotalFreedom/License - None of the listed names may be removed. public static final List DEVELOPERS = Arrays.asList("Madgeek1450", "Prozza", "Wild1145", "WickedGamingUK"); public static String DATE_STORAGE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z"; @@ -80,23 +55,6 @@ public class FUtil static { - for (EntityType type : EntityType.values()) - { - try - { - if (DepreciationAggregator.getName_EntityType(type) != null) - { - if (Creature.class.isAssignableFrom(type.getEntityClass())) - { - MOB_TYPES.put(DepreciationAggregator.getName_EntityType(type).toLowerCase(), type); - } - } - } - catch (Exception ex) - { - } - } - for (ChatColor chatColor : CHAT_COLOR_POOL) { CHAT_COLOR_NAMES.put(chatColor.name().toLowerCase().replace("_", ""), chatColor); @@ -105,7 +63,6 @@ public class FUtil private FUtil() { - throw new AssertionError(); } public static void cancel(BukkitTask task) @@ -162,19 +119,6 @@ public class FUtil FUtil.bcastMsg(adminName + " - " + action, (isRed ? ChatColor.RED : ChatColor.AQUA)); } - public static boolean isUniqueId(String uuid) - { - try - { - UUID.fromString(uuid); - return true; - } - catch (IllegalArgumentException ex) - { - return false; - } - } - public static String formatLocation(Location location) { return String.format("%s: (%d, %d, %d)", @@ -184,109 +128,6 @@ public class FUtil Math.round(location.getZ())); } - public static String formatPlayer(Player player) - { - return player.getName() + " (" + Ips.getIp(player) + ")"; - } - - /** - * Escapes an IP-address to a config-friendly version. - * - *

    - * Example: - *

    -     * IpUtils.toEscapedString("192.168.1.192"); // 192_168_1_192
    -     * 

    - * - * @param ip The IP-address to escape. - * @return The config-friendly IP address. - * @see #fromEscapedString(String) - */ - public static String toEscapedString(String ip) // BukkitLib @ https://github.com/Pravian/BukkitLib - { - return ip.trim().replaceAll("\\.", "_"); - } - - /** - * Un-escapes a config-friendly Ipv4-address. - * - *

    - * Example: - *

    -     * IpUtils.fromEscapedString("192_168_1_192"); // 192.168.1.192
    -     * 

    - * - * @param escapedIp The IP-address to un-escape. - * @return The config-friendly IP address. - * @see #toEscapedString(String) - */ - public static String fromEscapedString(String escapedIp) // BukkitLib @ https://github.com/Pravian/BukkitLib - { - return escapedIp.trim().replaceAll("_", "\\."); - } - - public static void gotoWorld(Player player, String targetWorld) - { - if (player == null) - { - return; - } - - if (player.getWorld().getName().equalsIgnoreCase(targetWorld)) - { - playerMsg(player, "Going to main world.", ChatColor.GRAY); - player.teleport(Bukkit.getWorlds().get(0).getSpawnLocation()); - return; - } - - for (World world : Bukkit.getWorlds()) - { - if (world.getName().equalsIgnoreCase(targetWorld)) - { - playerMsg(player, "Going to world: " + targetWorld, ChatColor.GRAY); - player.teleport(world.getSpawnLocation()); - return; - } - } - - playerMsg(player, "World " + targetWorld + " not found.", ChatColor.GRAY); - } - - public static String decolorize(String string) - { - return string.replaceAll("\\u00A7(?=[0-9a-fk-or])", "&"); - } - - public static void setWorldTime(World world, long ticks) - { - long time = world.getTime(); - time -= time % 24000; - world.setTime(time + 24000 + ticks); - } - - public static void createDefaultConfiguration(final String configFileName) - { - final File targetFile = new File(TotalFreedomMod.plugin.getDataFolder(), configFileName); - - if (targetFile.exists()) - { - return; - } - - FLog.info("Installing default configuration file template: " + targetFile.getPath()); - - try - { - final InputStream configFileStream = TotalFreedomMod.plugin.getResource(configFileName); - FileUtils.copyInputStreamToFile(configFileStream, targetFile); - configFileStream.close(); - } - catch (IOException ex) - { - FLog.severe(ex); - } - } - public static boolean deleteFolder(final File file) { if (file.exists() && file.isDirectory()) @@ -314,128 +155,6 @@ public class FUtil } } - public static EntityType getEntityType(String mobname) throws Exception - { - mobname = mobname.toLowerCase().trim(); - - if (!FUtil.MOB_TYPES.containsKey(mobname)) - { - throw new Exception(); - } - - return FUtil.MOB_TYPES.get(mobname); - } - - /** - * Write the specified InputStream to a file. - * - * @param in The InputStream from which to read. - * @param file The File to write to. - * @throws IOException - */ - public static void copy(InputStream in, File file) throws IOException // BukkitLib @ https://github.com/Pravian/BukkitLib - { - if (!file.exists()) - { - file.getParentFile().mkdirs(); - } - - final OutputStream out = new FileOutputStream(file); - byte[] buf = new byte[1024]; - int len; - while ((len = in.read(buf)) > 0) - { - out.write(buf, 0, len); - } - out.close(); - in.close(); - } - - /** - * Returns a file at located at the Plugins Data folder. - * - * @param plugin The plugin to use - * @param name The name of the file. - * @return The requested file. - */ - public static File getPluginFile(Plugin plugin, String name) // BukkitLib @ https://github.com/Pravian/BukkitLib - { - return new File(plugin.getDataFolder(), name); - } - - public static void autoEject(Player player, String kickMessage) - { - EjectMethod method = EjectMethod.STRIKE_ONE; - final String ip = Ips.getIp(player); - - if (!FUtil.EJECT_TRACKER.containsKey(ip)) - { - FUtil.EJECT_TRACKER.put(ip, 0); - } - - int kicks = FUtil.EJECT_TRACKER.get(ip); - kicks += 1; - - FUtil.EJECT_TRACKER.put(ip, kicks); - - if (kicks <= 1) - { - method = EjectMethod.STRIKE_ONE; - } - else if (kicks == 2) - { - method = EjectMethod.STRIKE_TWO; - } - else if (kicks >= 3) - { - method = EjectMethod.STRIKE_THREE; - } - - FLog.info("AutoEject -> name: " + player.getName() + " - player ip: " + ip + " - method: " + method.toString()); - - player.setOp(false); - player.setGameMode(GameMode.SURVIVAL); - player.getInventory().clear(); - - switch (method) - { - case STRIKE_ONE: - { - final Calendar cal = new GregorianCalendar(); - cal.add(Calendar.MINUTE, 1); - final Date expires = cal.getTime(); - - FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned for 1 minute."); - - TotalFreedomMod.plugin.bm.addBan(Ban.forPlayer(player, Bukkit.getConsoleSender(), expires, kickMessage)); - player.kickPlayer(kickMessage); - - break; - } - case STRIKE_TWO: - { - final Calendar c = new GregorianCalendar(); - c.add(Calendar.MINUTE, 3); - final Date expires = c.getTime(); - - FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned for 3 minutes."); - - TotalFreedomMod.plugin.bm.addBan(Ban.forPlayer(player, Bukkit.getConsoleSender(), expires, kickMessage)); - player.kickPlayer(kickMessage); - break; - } - case STRIKE_THREE: - { - TotalFreedomMod.plugin.bm.addBan(Ban.forPlayerFuzzy(player, Bukkit.getConsoleSender(), null, kickMessage)); - - FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned."); - - player.kickPlayer(kickMessage); - break; - } - } - } - public static Date parseDateOffset(String time) { Pattern timePattern = Pattern.compile( @@ -551,149 +270,6 @@ public class FUtil return StringUtils.join(names, ", "); } - @SuppressWarnings("unchecked") - public static Map getSavedFlags() - { - Map flags = null; - - File input = new File(TotalFreedomMod.plugin.getDataFolder(), SAVED_FLAGS_FILENAME); - if (input.exists()) - { - try - { - FileInputStream fis = new FileInputStream(input); - ObjectInputStream ois = new ObjectInputStream(fis); - flags = (HashMap) ois.readObject(); - ois.close(); - fis.close(); - } - catch (Exception ex) - { - FLog.severe(ex); - } - } - - return flags; - } - - public static boolean getSavedFlag(String flag) throws Exception - { - Boolean flagValue = null; - - Map flags = FUtil.getSavedFlags(); - - if (flags != null) - { - if (flags.containsKey(flag)) - { - flagValue = flags.get(flag); - } - } - - if (flagValue != null) - { - return flagValue.booleanValue(); - } - else - { - throw new Exception(); - } - } - - public static void setSavedFlag(String flag, boolean value) - { - Map flags = FUtil.getSavedFlags(); - - if (flags == null) - { - flags = new HashMap<>(); - } - - flags.put(flag, value); - - try - { - final FileOutputStream fos = new FileOutputStream(new File(TotalFreedomMod.plugin.getDataFolder(), SAVED_FLAGS_FILENAME)); - final ObjectOutputStream oos = new ObjectOutputStream(fos); - oos.writeObject(flags); - oos.close(); - fos.close(); - } - catch (Exception ex) - { - FLog.severe(ex); - } - } - - public static void createBackups(String file) - { - createBackups(file, false); - } - - public static void createBackups(String file, boolean onlyWeekly) - { - final String save = file.split("\\.")[0]; - final YamlConfig config = new YamlConfig(TotalFreedomMod.plugin, "backup/backup.yml", false); - config.load(); - - // Weekly - if (!config.isInt(save + ".weekly")) - { - performBackup(file, "weekly"); - config.set(save + ".weekly", FUtil.getUnixTime()); - } - else - { - int lastBackupWeekly = config.getInt(save + ".weekly"); - - if (lastBackupWeekly + 3600 * 24 * 7 < FUtil.getUnixTime()) - { - performBackup(file, "weekly"); - config.set(save + ".weekly", FUtil.getUnixTime()); - } - } - - if (onlyWeekly) - { - config.save(); - return; - } - - // Daily - if (!config.isInt(save + ".daily")) - { - performBackup(file, "daily"); - config.set(save + ".daily", FUtil.getUnixTime()); - } - else - { - int lastBackupDaily = config.getInt(save + ".daily"); - - if (lastBackupDaily + 3600 * 24 < FUtil.getUnixTime()) - { - performBackup(file, "daily"); - config.set(save + ".daily", FUtil.getUnixTime()); - } - } - - config.save(); - } - - private static void performBackup(String file, String type) - { - FLog.info("Backing up " + file + " to " + file + "." + type + ".bak"); - final File backupFolder = new File(TotalFreedomMod.plugin.getDataFolder(), "backup"); - - if (!backupFolder.exists()) - { - backupFolder.mkdirs(); - } - - final File oldYaml = new File(TotalFreedomMod.plugin.getDataFolder(), file); - final File newYaml = new File(backupFolder, file + "." + type + ".bak"); - FileUtil.copy(oldYaml, newYaml); - } - public static String dateToString(Date date) { return new SimpleDateFormat(DATE_STORAGE_FORMAT, Locale.ENGLISH).format(date); @@ -711,23 +287,9 @@ public class FUtil } } - @SuppressWarnings("unchecked") public static boolean isFromHostConsole(String senderName) { - return ((List) ConfigEntry.HOST_SENDER_NAMES.getList()).contains(senderName.toLowerCase()); - } - - public static List removeDuplicates(List oldList) - { - List newList = new ArrayList<>(); - for (String entry : oldList) - { - if (!newList.contains(entry)) - { - newList.add(entry); - } - } - return newList; + return ConfigEntry.HOST_SENDER_NAMES.getList().contains(senderName.toLowerCase()); } public static boolean fuzzyIpMatch(String a, String b, int octets) @@ -779,67 +341,6 @@ public class FUtil return ip; } - public static int replaceBlocks(Location center, Material fromMaterial, Material toMaterial, int radius) - { - int affected = 0; - - Block centerBlock = center.getBlock(); - for (int xOffset = -radius; xOffset <= radius; xOffset++) - { - for (int yOffset = -radius; yOffset <= radius; yOffset++) - { - for (int zOffset = -radius; zOffset <= radius; zOffset++) - { - Block block = centerBlock.getRelative(xOffset, yOffset, zOffset); - - if (block.getType().equals(fromMaterial)) - { - if (block.getLocation().distanceSquared(center) < (radius * radius)) - { - block.setType(toMaterial); - affected++; - } - } - } - } - } - - return affected; - } - - public static void downloadFile(String url, File output) throws java.lang.Exception - { - downloadFile(url, output, false); - } - - public static void downloadFile(String url, File output, boolean verbose) throws java.lang.Exception - { - final URL website = new URL(url); - ReadableByteChannel rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(output); - fos.getChannel().transferFrom(rbc, 0, 1 << 24); - fos.close(); - - if (verbose) - { - FLog.info("Downloaded " + url + " to " + output.toString() + "."); - } - } - - public static void adminChatMessage(CommandSender sender, String message) - { - String name = sender.getName() + " " + TotalFreedomMod.plugin.rm.getDisplay(sender).getColoredTag() + ChatColor.WHITE; - FLog.info("[ADMIN] " + name + ": " + message); - - for (Player player : Bukkit.getOnlinePlayers()) - { - if (TotalFreedomMod.plugin.al.isAdmin(player)) - { - player.sendMessage("[" + ChatColor.AQUA + "ADMIN" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + name + ": " + ChatColor.AQUA + message); - } - } - } - //getField: Borrowed from WorldEdit @SuppressWarnings("unchecked") public static T getField(Object from, String name) @@ -854,10 +355,7 @@ public class FUtil return (T) field.get(from); } - catch (NoSuchFieldException ex) - { - } - catch (IllegalAccessException ex) + catch (NoSuchFieldException | IllegalAccessException ex) { } } while (checkClass.getSuperclass() != Object.class @@ -900,55 +398,6 @@ public class FUtil { String packageName = Bukkit.getServer().getClass().getPackage().getName(); return packageName.substring(packageName.lastIndexOf('.') + 1); - - } - - public static void reportAction(Player reporter, Player reported, String report) - { - for (Player player : Bukkit.getOnlinePlayers()) - { - if (TotalFreedomMod.plugin.al.isAdmin(player)) - { - playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reported.getName() + " for " + report); - } - } - } - - public static enum EjectMethod - { - - STRIKE_ONE, STRIKE_TWO, STRIKE_THREE; - } - - public static class MethodTimer - { - - private long lastStart; - private long total = 0; - - public MethodTimer() - { - } - - public void start() - { - this.lastStart = System.currentTimeMillis(); - } - - public void update() - { - this.total += (System.currentTimeMillis() - this.lastStart); - } - - public long getTotal() - { - return this.total; - } - - public void printTotalToLog(String timerName) - { - FLog.info("DEBUG: " + timerName + " used " + this.getTotal() + " ms."); - } } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/MethodTimer.java b/src/main/java/me/totalfreedom/totalfreedommod/util/MethodTimer.java new file mode 100644 index 00000000..80f24260 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/MethodTimer.java @@ -0,0 +1,32 @@ +package me.totalfreedom.totalfreedommod.util; + +public class MethodTimer +{ + + private long lastStart; + private long total = 0; + + public MethodTimer() + { + } + + public void start() + { + this.lastStart = System.currentTimeMillis(); + } + + public void update() + { + this.total += (System.currentTimeMillis() - this.lastStart); + } + + public long getTotal() + { + return this.total; + } + + public void printTotalToLog(String timerName) + { + FLog.info("DEBUG: " + timerName + " used " + this.getTotal() + " ms."); + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java b/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java index 85ddfd2e..6d660108 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java @@ -68,7 +68,7 @@ public class Flatlands extends CustomWorld boolean doFlatlandsWipe = false; try { - doFlatlandsWipe = FUtil.getSavedFlag("do_wipe_flatlands"); + doFlatlandsWipe = plugin.sf.getSavedFlag("do_wipe_flatlands"); } catch (Exception ex) { @@ -79,7 +79,7 @@ public class Flatlands extends CustomWorld if (Bukkit.getServer().getWorld("flatlands") == null) { FLog.info("Wiping flatlands."); - FUtil.setSavedFlag("do_wipe_flatlands", false); + plugin.sf.setSavedFlag("do_wipe_flatlands", false); FileUtils.deleteQuietly(new File("./flatlands")); } else diff --git a/src/main/java/me/totalfreedom/totalfreedommod/world/WorldManager.java b/src/main/java/me/totalfreedom/totalfreedommod/world/WorldManager.java index 536a574a..d56a448e 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/world/WorldManager.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/world/WorldManager.java @@ -4,6 +4,9 @@ import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; +import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; @@ -129,4 +132,31 @@ public class WorldManager extends FreedomService } } + public void gotoWorld(Player player, String targetWorld) + { + if (player == null) + { + return; + } + + if (player.getWorld().getName().equalsIgnoreCase(targetWorld)) + { + playerMsg(player, "Going to main world.", ChatColor.GRAY); + player.teleport(Bukkit.getWorlds().get(0).getSpawnLocation()); + return; + } + + for (World world : Bukkit.getWorlds()) + { + if (world.getName().equalsIgnoreCase(targetWorld)) + { + playerMsg(player, "Going to world: " + targetWorld, ChatColor.GRAY); + player.teleport(world.getSpawnLocation()); + return; + } + } + + playerMsg(player, "World " + targetWorld + " not found.", ChatColor.GRAY); + } + } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c06f6244..385444d0 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -93,7 +93,7 @@ allow: # - 'n:b:/ban:_' # blocked_commands: - # Disabled commands + # Disabled commands - 'n:b:/time:Server-side time changing is disabled. Please use /ptime to set your own personal time.' - 'n:b:/gamemode:Use /creative and /survival to set your gamemode.' - 'n:b:/ban:_' @@ -110,12 +110,21 @@ blocked_commands: - 'n:b:/save-all:_' - 'n:b:/save-on:_' - 'n:b:/save-off:_' + - 'n:b:/playsound:_' + - 'n:b:/skinrestorer:_' + - 'n:b:/packet:_' + - 'n:b:/thaw:_' + - 'n:b:/pp largeexplode:You may not use this particle! Please use another.' + - 'n:b:/pp hugeexplosion:You may not use this particle! Please use another.' + - 'n:b:/pp barrier:You may not use this particle! Please use another.' + - 'n:b:/setjail:_' - 'n:b:/tfbanlist:Use /banlist to see and wipe the ban list' - 'n:b:/tfipbanlist:Use /banlist to see and wipe the ban list' # Superadmin commands - 's:b:/kick:_' - 's:b:/socialspy:_' + - 's:b:/replaceitem:_' - 's:b:/kill:_' - 's:b://generate:_' - 's:b://:_' @@ -144,8 +153,10 @@ blocked_commands: - 's:b:/tpall:_' - 's:b:/setblock:_' - 's:b:/green:_' - - 'n:b:/gamerule:_' - - 'n:b:/togglejail:_' + - 's:b:/gamerule:_' + - 's:b:/togglejail:_' + - 's:b:/fill:_' + - 's:b:/flood:_' # Superadmin commands - Auto-eject - 's:a:/stop:_' @@ -283,6 +294,7 @@ famous_players: - stampylongnose - dantdm - gizzy14gazza + - furiousdestroyer # IPs that can not be supered noadmin_ips: