diff --git a/.gitignore b/.gitignore index c2ccd287..931fd6fb 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ manifest.mf /.idea/discord.xml /.idea/jarRepositories.xml /.idea/workspace.xml +/.idea/uiDesigner.xml /.idea/libraries *.iml diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 00000000..e96534fb --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index c54abf06..39d73362 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ TotalFreedomMod Server modification for the TotalFreedom server - https://github.com/TotalFreedom/TotalFreedomMod + https://github.com/TFPatches/TotalFreedomMod @@ -44,6 +44,11 @@ https://jitpack.io + + CodeMC + https://repo.codemc.org/repository/maven-public + + spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -105,7 +110,7 @@ org.projectlombok lombok - 1.18.0 + 1.18.12 provided @@ -232,11 +237,16 @@ - org.projectlombok - lombok - 1.18.10 + com.github.speedxx + TFGuilds + master + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.1.1 + @@ -253,7 +263,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.7.0 + 3.8.1 TotalFreedomMod.jar 1.8 @@ -266,7 +276,7 @@ pl.project13.maven git-commit-id-plugin - 2.2.5 + 4.0.1 get-the-git-infos @@ -379,30 +389,30 @@ - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 - - - package - - shade - - - true - - - commons-io:commons-io - org.apache.commons:commons-lang3 - commons-codec:commons-codec - org.reflections:reflections - javassist:javassist - - - - - - + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + true + + + commons-io:commons-io + org.apache.commons:commons-lang3 + commons-codec:commons-codec + org.reflections:reflections + javassist:javassist + + + + + + @@ -412,7 +422,7 @@ org.apache.maven.plugins - 2.17 + 3.1.1 maven-checkstyle-plugin checkstyle.xml diff --git a/src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java b/src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java index 5c798087..e70033d3 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java @@ -2,7 +2,10 @@ package me.totalfreedom.totalfreedommod; import com.sk89q.worldedit.bukkit.BukkitConfiguration; import java.io.File; +import me.totalfreedom.totalfreedommod.banning.PermbanList; import me.totalfreedom.totalfreedommod.config.YamlConfig; +import me.totalfreedom.totalfreedommod.permissions.PermissionConfig; +import me.totalfreedom.totalfreedommod.punishments.PunishmentList; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.util.FileUtil; @@ -25,6 +28,15 @@ public class BackupManager extends FreedomService createBackups(file, false); } + public void createAllBackups() + { + createBackups(TotalFreedomMod.CONFIG_FILENAME, true); + createBackups(PermbanList.CONFIG_FILENAME); + createBackups(PermissionConfig.PERMISSIONS_FILENAME, true); + createBackups(PunishmentList.CONFIG_FILENAME); + createBackups("database.db"); + } + public void createBackups(String file, boolean onlyWeekly) { final String save = file.split("\\.")[0]; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java b/src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java index 8829ab8b..079ef884 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java @@ -1,7 +1,6 @@ package me.totalfreedom.totalfreedommod; import com.google.common.base.Strings; -import java.util.Date; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; @@ -55,7 +54,7 @@ public class ChatManager extends FreedomService message = FUtil.colorize(message); message = message.replaceAll(ChatColor.MAGIC.toString(), "&k"); - if (ConfigEntry.SHOP_REACTIONS_ENABLED.getBoolean() && !plugin.sh.reactionString.isEmpty() && message.equals(plugin.sh.reactionString)) + if (ConfigEntry.SHOP_ENABLED.getBoolean() && ConfigEntry.SHOP_REACTIONS_ENABLED.getBoolean() && !plugin.sh.reactionString.isEmpty() && message.equals(plugin.sh.reactionString)) { event.setCancelled(true); PlayerData data = plugin.pl.getData(player); @@ -73,12 +72,6 @@ public class ChatManager extends FreedomService return; } - if (message.startsWith("Connected using PickaxeChat for ")) - { - event.setCancelled(true); - return; - } - // Truncate messages that are too long - 256 characters is vanilla client max if (message.length() > 256) { @@ -86,7 +79,6 @@ public class ChatManager extends FreedomService FSync.playerMsg(player, "Message was shortened because it was too long to send."); } - final FPlayer fPlayer = plugin.pl.getPlayerSync(player); if (fPlayer.isLockedUp()) { @@ -144,7 +136,7 @@ public class ChatManager extends FreedomService event.setFormat(format); // Send to discord - if (!ConfigEntry.ADMIN_ONLY_MODE.getBoolean() && !Bukkit.hasWhitelist()) + if (!ConfigEntry.ADMIN_ONLY_MODE.getBoolean() && !Bukkit.hasWhitelist() && !plugin.pl.getPlayer(player).isMuted() && !plugin.tfg.inGuildChat(player)) { plugin.dc.messageChatChannel(plugin.dc.deformat(player.getName()) + " \u00BB " + ChatColor.stripColor(message)); } @@ -230,4 +222,4 @@ public class ChatManager extends FreedomService } } } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java b/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java index 119912b5..f921bd71 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java @@ -31,7 +31,7 @@ public class LoginProcess extends FreedomService public static final Pattern USERNAME_REGEX = Pattern.compile("^[\\w\\d_]{3,20}$"); public List TELEPORT_ON_JOIN = new ArrayList<>(); public List CLEAR_ON_JOIN = new ArrayList<>(); - // + @Getter @Setter private static boolean lockdownEnabled = false; @@ -188,7 +188,7 @@ public class LoginProcess extends FreedomService final Player player = event.getPlayer(); final FPlayer fPlayer = plugin.pl.getPlayer(player); final PlayerData playerData = plugin.pl.getData(player); - + player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60); player.setOp(true); @@ -226,14 +226,6 @@ public class LoginProcess extends FreedomService player.setPlayerListFooter(FUtil.colorize(ConfigEntry.SERVER_TABLIST_FOOTER.getString()).replace("\\n", "\n")); } - for (Player p : plugin.al.vanished) - { - if (!plugin.al.isAdmin(player)) - { - player.hidePlayer(plugin, p); - } - } - if (!plugin.al.isAdmin(player)) { String tag = playerData.getTag(); @@ -241,6 +233,7 @@ public class LoginProcess extends FreedomService { fPlayer.setTag(FUtil.colorize(tag)); } + int noteCount = playerData.getNotes().size(); if (noteCount != 0) { @@ -274,7 +267,6 @@ 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(plugin, 20L * 1L); + }.runTaskLater(plugin, 20L); } - -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/Monitors.java b/src/main/java/me/totalfreedom/totalfreedommod/Monitors.java index 7147f9a0..a74ee0aa 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/Monitors.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/Monitors.java @@ -1,26 +1,61 @@ package me.totalfreedom.totalfreedommod; -import java.text.DecimalFormat; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lombok.Getter; import me.totalfreedom.totalfreedommod.util.FUtil; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.entity.ThrownPotion; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.LingeringPotionSplashEvent; import org.bukkit.event.entity.PotionSplashEvent; -import org.bukkit.projectiles.ProjectileSource; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; public class Monitors extends FreedomService { - - private final DecimalFormat decimalFormat = new DecimalFormat("#"); - private String potionSpyPrefix = ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + "PotionSpy" + ChatColor.DARK_GRAY + "] "; + @Getter + private List> allThrownPotions = new ArrayList<>(); + private Map> recentlyThrownPotions = new HashMap<>(); + private final List badPotionEffects = new ArrayList<>(Arrays.asList(PotionEffectType.BLINDNESS, + PotionEffectType.LEVITATION, PotionEffectType.CONFUSION, PotionEffectType.SLOW, PotionEffectType.SLOW_DIGGING, PotionEffectType.HUNGER)); // A list of all effects that count as "troll". @Override public void onStart() { + Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> + { + for (Player player : recentlyThrownPotions.keySet()) + { + if (plugin.al.isAdmin(player) && plugin.al.getAdmin(player).getPotionSpy()) + { + List playerThrownPotions = recentlyThrownPotions.get(player); + ThrownPotion latestThrownPotion = playerThrownPotions.get(playerThrownPotions.size() - 1); // Get most recently thrown potion for the position. + int potionsThrown = playerThrownPotions.size(); + boolean trollPotions = false; + + for (ThrownPotion potion : playerThrownPotions) + { + if (isTrollPotion(potion)) + { + trollPotions = true; + } + } + + FUtil.playerMsg(player, ChatColor.translateAlternateColorCodes('&', String.format("&8[&ePotionSpy&8] &r%s splashed %s %s at X: %s Y: %s Z: %s in the world '%s'%s.", + player.getName(), potionsThrown, potionsThrown == 1 ? "potion" : "potions", latestThrownPotion.getLocation().getBlockX(), latestThrownPotion.getLocation().getBlockY(), latestThrownPotion.getLocation().getBlockZ(), + latestThrownPotion.getWorld().getName(), trollPotions ? " &c(most likely troll potion/potions)" : ""))); + } + } + recentlyThrownPotions.clear(); + }, 0L, 40L); } @Override @@ -31,26 +66,25 @@ public class Monitors extends FreedomService @EventHandler(priority = EventPriority.MONITOR) public void onLingeringPotionSplash(LingeringPotionSplashEvent event) { - ProjectileSource source = event.getEntity().getShooter(); - - if (!(source instanceof Player)) + if (event.getEntity().getShooter() instanceof Player) { - return; - } - Player player = (Player)source; - - if (plugin.al.isAdmin((Player)event.getEntity().getShooter())) - { - return; - } - final Material droppedItem = event.getEntity().getItem().getType(); - final Location location = player.getLocation(); - - for (Player p : server.getOnlinePlayers()) - { - if (plugin.al.isAdmin(p) && plugin.al.getAdmin(p).getPotionSpy()) + ThrownPotion potion = event.getEntity(); + if (potion.getShooter() instanceof Player) { - FUtil.playerMsg(p, potionSpyPrefix + ChatColor.WHITE + player.getName() + " splashed " + event.getEntity().getItem().getAmount() + " " + droppedItem + " at X: " + decimalFormat.format(location.getX()) + ", Y: " + decimalFormat.format(location.getY()) + ", Z: " + decimalFormat.format(location.getZ()) + ", in the world '" + location.getWorld().getName() + "'."); + Player player = (Player)potion.getShooter(); + + recentlyThrownPotions.putIfAbsent(player, new ArrayList<>()); + recentlyThrownPotions.get(player).add(potion); + allThrownPotions.add(new AbstractMap.SimpleEntry<>(potion, System.currentTimeMillis())); + + if (recentlyThrownPotions.get(player).size() > 128) + { + recentlyThrownPotions.get(player).remove(0); + } + if (allThrownPotions.size() > 1024) + { + allThrownPotions.remove(0); // Remove the first element in the set. + } } } } @@ -58,27 +92,57 @@ public class Monitors extends FreedomService @EventHandler(priority = EventPriority.MONITOR) public void onPotionSplash(PotionSplashEvent event) { - ProjectileSource source = event.getEntity().getShooter(); - - if (!(source instanceof Player)) + if (event.getEntity().getShooter() instanceof Player) { - return; - } - Player player = (Player)source; - - if (plugin.al.isAdmin((Player)event.getEntity().getShooter())) - { - return; - } - final Material droppedItem = event.getPotion().getItem().getType(); - final Location location = player.getLocation(); - - for (Player p : server.getOnlinePlayers()) - { - if (plugin.al.isAdmin(p) && plugin.al.getAdmin(p).getPotionSpy()) + ThrownPotion potion = event.getEntity(); + if (potion.getShooter() instanceof Player) { - FUtil.playerMsg(p, potionSpyPrefix + ChatColor.WHITE + player.getName() + " splashed " + event.getEntity().getItem().getAmount() + " " + droppedItem + " at X: " + decimalFormat.format(location.getX()) + ", Y: " + decimalFormat.format(location.getY()) + ", Z: " + decimalFormat.format(location.getZ()) + ", in the world '" + location.getWorld().getName() + "'."); + Player player = (Player)potion.getShooter(); + + recentlyThrownPotions.putIfAbsent(player, new ArrayList<>()); + recentlyThrownPotions.get(player).add(potion); + allThrownPotions.add(new AbstractMap.SimpleEntry<>(potion, System.currentTimeMillis())); + + if (recentlyThrownPotions.get(player).size() > 128) + { + recentlyThrownPotions.get(player).remove(0); + } + if (allThrownPotions.size() > 1024) + { + allThrownPotions.remove(0); // Remove the first element in the set. + } } } } -} \ No newline at end of file + + public List> getPlayerThrownPotions(Player player) + { + List> thrownPotions = new ArrayList<>(); + + for (Map.Entry potionEntry : allThrownPotions) + { + ThrownPotion potion = potionEntry.getKey(); + if (potion.getShooter() != null && potion.getShooter().equals(player)) + { + thrownPotions.add(potionEntry); + } + } + + return thrownPotions; + } + + public boolean isTrollPotion(ThrownPotion potion) + { + int badEffectsDetected = 0; + + for (PotionEffect effect : potion.getEffects()) + { + if (badPotionEffects.contains(effect.getType()) && effect.getAmplifier() > 2 && effect.getDuration() > 200) + { + badEffectsDetected++; + } + } + + return badEffectsDetected > 0; + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/Sitter.java b/src/main/java/me/totalfreedom/totalfreedommod/Sitter.java new file mode 100644 index 00000000..b90fd260 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/Sitter.java @@ -0,0 +1,34 @@ +package me.totalfreedom.totalfreedommod; + +import me.totalfreedom.totalfreedommod.command.Command_sit; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.event.EventHandler; +import org.spigotmc.event.entity.EntityDismountEvent; + +public class Sitter extends FreedomService +{ + @Override + public void onStart() + { + } + + @Override + public void onStop() + { + } + + @EventHandler + public void onEntityDismount(EntityDismountEvent e) + { + Entity dm = e.getDismounted(); + if (dm instanceof ArmorStand) + { + if (Command_sit.STANDS.contains(dm)) + { + Command_sit.STANDS.remove(dm); + dm.remove(); + } + } + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java index 1b3c5924..c14763a0 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java @@ -20,7 +20,9 @@ import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker; import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge; import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge; import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge; +import me.totalfreedom.totalfreedommod.bridge.FAWEBridge; import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge; +import me.totalfreedom.totalfreedommod.bridge.TFGuildsBridge; import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge; import me.totalfreedom.totalfreedommod.bridge.WorldGuardBridge; import me.totalfreedom.totalfreedommod.caging.Cager; @@ -133,6 +135,9 @@ public class TotalFreedomMod extends JavaPlugin public WorldRestrictions wr; public SignBlocker snp; public EntityWiper ew; + public Sitter st; + public VanishHandler vh; + //public HubWorldRestrictions hwr; // // Bridges @@ -140,7 +145,9 @@ public class TotalFreedomMod extends JavaPlugin public EssentialsBridge esb; public LibsDisguisesBridge ldb; public CoreProtectBridge cpb; + public TFGuildsBridge tfg; public WorldEditBridge web; + public FAWEBridge fab; public WorldGuardBridge wgb; @Override @@ -174,33 +181,20 @@ public class TotalFreedomMod extends JavaPlugin FUtil.deleteFolder(new File("./_deleteme")); fsh = new FreedomServiceHandler(); + + config = new MainConfig(); + config.load(); + cl = new CommandLoader(); - - Reflections commandDir = new Reflections("me.totalfreedom.totalfreedommod.command"); - - Set> commandClasses = commandDir.getSubTypesOf(FreedomCommand.class); - - for (Class commandClass : commandClasses) - { - try - { - cl.add(commandClass.newInstance()); - } - catch (InstantiationException | IllegalAccessException | ExceptionInInitializerError ex) - { - FLog.warning("Failed to register command: /" + commandClass.getSimpleName().replace("Command_" , "")); - } - } + cl.loadCommands(); BackupManager backups = new BackupManager(); - backups.createBackups(TotalFreedomMod.CONFIG_FILENAME, true); - backups.createBackups(PermbanList.CONFIG_FILENAME); - backups.createBackups(PermissionConfig.PERMISSIONS_FILENAME, true); - backups.createBackups(PunishmentList.CONFIG_FILENAME); - backups.createBackups("database.db"); + backups.createAllBackups(); - config = new MainConfig(this); - config.load(); + if (FUtil.inDeveloperMode()) + { + FLog.debug("Developer mode enabled."); + } permissions = new PermissionConfig(this); permissions.load(); @@ -238,6 +232,8 @@ public class TotalFreedomMod extends JavaPlugin gr = new GameRuleHandler(); snp = new SignBlocker(); ew = new EntityWiper(); + st = new Sitter(); + vh = new VanishHandler(); // Single admin utils cs = new CommandSpy(); @@ -252,7 +248,6 @@ public class TotalFreedomMod extends JavaPlugin ae = new AutoEject(); mo = new Monitors(); - mv = new MovementValidator(); sp = new ServerPing(); @@ -271,11 +266,15 @@ public class TotalFreedomMod extends JavaPlugin cpb = new CoreProtectBridge(); esb = new EssentialsBridge(); ldb = new LibsDisguisesBridge(); + tfg = new TFGuildsBridge(); web = new WorldEditBridge(); + fab = new FAWEBridge(); wgb = new WorldGuardBridge(); for (FreedomService service : fsh.getServices()) + { service.onStart(); + } FLog.info("Started " + fsh.getServiceAmount() + "services."); @@ -372,4 +371,4 @@ public class TotalFreedomMod extends JavaPlugin { return new CleanroomChunkGenerator(id); } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/VanishHandler.java b/src/main/java/me/totalfreedom/totalfreedommod/VanishHandler.java new file mode 100644 index 00000000..7d1e586d --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/VanishHandler.java @@ -0,0 +1,83 @@ +package me.totalfreedom.totalfreedommod; + +import me.totalfreedom.totalfreedommod.util.FLog; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; + +public class VanishHandler extends FreedomService +{ + + @Override + public void onStart() + { + } + + @Override + public void onStop() + { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerJoin(PlayerJoinEvent event) + { + Player player = event.getPlayer(); + + for (Player p : server.getOnlinePlayers()) + { + if (!plugin.al.isAdmin(player) && plugin.al.isVanished(p.getName())) + { + player.hidePlayer(plugin, p); + } + } + + for (Player p : server.getOnlinePlayers()) + { + if (!plugin.al.isAdmin(p) && plugin.al.isVanished(player.getName())) + { + p.hidePlayer(plugin, player); + } + } + + if (plugin.al.isVanished(player.getName())) + { + plugin.esb.setVanished(player.getName(), true); + FLog.info(player.getName() + " joined while still vanished."); + plugin.al.messageAllAdmins(ChatColor.YELLOW + player.getName() + " has joined silently."); + event.setJoinMessage(null); + + new BukkitRunnable() + { + @Override + public void run() + { + if (!plugin.al.isVanished(player.getName())) + { + this.cancel(); + } + + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(ChatColor.GOLD + "You are hidden from other players.")); + } + }.runTaskTimer(plugin, 0L, 4L); + } + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + Player player = event.getPlayer(); + + if (plugin.al.isVanished(player.getName())) + { + event.setQuitMessage(null); + FLog.info(player.getName() + " left while still vanished."); + plugin.al.messageAllAdmins(ChatColor.YELLOW + player.getName() + " has left silently."); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/admin/ActivityLogEntry.java b/src/main/java/me/totalfreedom/totalfreedommod/admin/ActivityLogEntry.java index 6ff54333..7904e35f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/admin/ActivityLogEntry.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/admin/ActivityLogEntry.java @@ -119,6 +119,19 @@ public class ActivityLogEntry implements IConfig ips.clear(); } + public int getTotalSecondsPlayed() + { + int result = 0; + for (String duration : durations) + { + String[] spl = duration.split(" "); + result += Integer.parseInt(spl[0]) * 60 * 60; + result += Integer.parseInt(spl[2]) * 60; + result += Integer.parseInt(spl[5]); + } + return result; + } + @Override public boolean isValid() { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java b/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java index ee55af72..8d2f5b54 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java @@ -31,7 +31,7 @@ public class AdminList extends FreedomService private final Map ipTable = Maps.newHashMap(); public final List verifiedNoAdmins = new ArrayList<>(); public final Map> verifiedNoAdminIps = Maps.newHashMap(); - public static ArrayList vanished = new ArrayList<>(); + public static List vanished = new ArrayList<>(); @Override public void onStart() @@ -302,8 +302,6 @@ public class AdminList extends FreedomService } } - - plugin.wm.adminworld.wipeAccessCache(); } public Set getAdminNames() @@ -364,4 +362,9 @@ public class AdminList extends FreedomService updateTables(); } -} + + public boolean isVanished(String player) + { + return vanished.contains(player); + } +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java b/src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java index 1c5b7a23..11a56c04 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java @@ -166,7 +166,20 @@ public class Ban implements IConfig { final StringBuilder message = new StringBuilder(ChatColor.GOLD + "You"); - message.append(!hasUsername() ? "r IP address is" : " are").append(" temporarily banned from this server."); + if (!hasUsername()) + { + message.append("r IP address is"); + } + else if (!hasIps()) + { + message.append("r username is"); + } + else + { + message.append(" are"); + } + + message.append(" temporarily banned from this server."); message.append("\nAppeal at ").append(ChatColor.BLUE) .append(ConfigEntry.SERVER_BAN_URL.getString()); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/blocking/EventBlocker.java b/src/main/java/me/totalfreedom/totalfreedommod/blocking/EventBlocker.java index 4b54e31e..9917d90e 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/blocking/EventBlocker.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/blocking/EventBlocker.java @@ -208,7 +208,8 @@ public class EventBlocker extends FreedomService // TODO: Revert back to old redstone block system when (or if) it is fixed in Bukkit, Spigot or Paper. private ArrayList redstoneBlocks = new ArrayList<>(Arrays.asList(Material.REDSTONE, Material.DISPENSER, Material.DROPPER, Material.REDSTONE_LAMP)); @EventHandler - public void onBlockPhysics(BlockPhysicsEvent event) { + public void onBlockPhysics(BlockPhysicsEvent event) + { if (!ConfigEntry.ALLOW_REDSTONE.getBoolean()) { // Check if the block is involved with redstone. diff --git a/src/main/java/me/totalfreedom/totalfreedommod/blocking/InteractBlocker.java b/src/main/java/me/totalfreedom/totalfreedommod/blocking/InteractBlocker.java index f227f290..f33e740b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/blocking/InteractBlocker.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/blocking/InteractBlocker.java @@ -5,9 +5,11 @@ import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.Groups; import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.block.Biome; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; @@ -53,13 +55,24 @@ public class InteractBlocker extends FreedomService } } + @EventHandler + public void onBedEnter(PlayerBedEnterEvent event) + { + Player player = event.getPlayer(); + if (Groups.EXPLOSIVE_BED_BIOMES.contains(event.getBed().getBiome())) + { + player.sendMessage(ChatColor.RED + "You may not sleep here."); + event.setCancelled(true); + } + } + private void handleRightClick(PlayerInteractEvent event) { final Player player = event.getPlayer(); if (event.getClickedBlock() != null) { - if (event.getClickedBlock().getType().equals(Material.STRUCTURE_BLOCK) || event.getClickedBlock().getType().equals(Material.JIGSAW)) + if (event.getClickedBlock().getType().equals(Material.STRUCTURE_BLOCK) || event.getClickedBlock().getType().equals(Material.JIGSAW) || event.getClickedBlock().getType().equals(Material.RESPAWN_ANCHOR)) { event.setCancelled(true); event.getPlayer().closeInventory(); @@ -74,15 +87,6 @@ public class InteractBlocker extends FreedomService return; } - // TODO: lookup new biomes that have bed explosions in 1.16 - - /*if (Groups.BED_COLORS.contains(event.getMaterial()) && event.getClickedBlock().getBiome().equals(Biome.NETHER)) - { - player.sendMessage(ChatColor.RED + "You can't sleep in hell."); - event.setCancelled(true); - return; - }*/ - switch (event.getMaterial()) { case WATER_BUCKET: diff --git a/src/main/java/me/totalfreedom/totalfreedommod/bridge/FAWEBridge.java b/src/main/java/me/totalfreedom/totalfreedommod/bridge/FAWEBridge.java new file mode 100644 index 00000000..5a7e4143 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/bridge/FAWEBridge.java @@ -0,0 +1,174 @@ +package me.totalfreedom.totalfreedommod.bridge; + +import com.google.gson.Gson; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.function.pattern.Pattern; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.world.block.BaseBlock; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import me.totalfreedom.totalfreedommod.FreedomService; +import net.coreprotect.CoreProtectAPI; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; + +public class FAWEBridge extends FreedomService +{ + private CoreProtectAPI api; + private World world = null; + private final Map, Map> blocksBroken = new HashMap<>(); + private final Map, Map.Entry>> blocksPlaced = new HashMap<>(); + + @Override + public void onStart() + { + api = plugin.cpb.getCoreProtectAPI(); + + /* + * Iterates over blocks placed by GenerationCommands (in the EditSession) and adds them to the CoreProtect logs. + */ + server.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() + { + @Override + public void run() + { + if (!(blocksBroken.isEmpty() && blocksPlaced.isEmpty())) + { + // Send all broken blocks from the last ticks to the CoreProtect API. + Map.Entry playerAndSessionEntry = null; + for (Map.Entry, Map> entry : blocksBroken.entrySet()) + { + playerAndSessionEntry = entry.getKey(); + Map dataAndVectorEntry = entry.getValue(); + List blockVector3List = new ArrayList<>(); + blockVector3List.addAll(dataAndVectorEntry.keySet()); // Deep clone the block vector to avoid a change later in the code. + + for (BlockVector3 blockVector3 : blockVector3List) + { + if (blockVector3 != null) + { + EditSession editSession = playerAndSessionEntry.getValue(); + World world = server.getWorld(editSession.getWorld().getName()); + Location location = new Location(world, blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()); + BlockData blockData = server.createBlockData(dataAndVectorEntry.get(blockVector3)); + api.logRemoval(playerAndSessionEntry.getKey(), location, blockData.getMaterial(), blockData); + } + } + } + + // Clear after broken blocks have been updated. + blocksBroken.values().clear(); + blocksBroken.putIfAbsent(playerAndSessionEntry, new HashMap<>()); + + // Send all blocks placed to the CoreProtect API (except from the air as it's only a broken block). + for (Map.Entry, Map.Entry>> entry : blocksPlaced.entrySet()) + { + playerAndSessionEntry = entry.getKey(); + Map.Entry> patternAndListEntry = entry.getValue(); + Pattern pattern = patternAndListEntry.getKey(); + List blockVector3List = new ArrayList<>(); + blockVector3List.addAll(patternAndListEntry.getValue()); // Deep clone the block vector to avoid a change later in the code. + + for (BlockVector3 blockVector3 : blockVector3List) + { + if (blockVector3 != null && !pattern.apply(blockVector3).getBlockType().getMaterial().isAir()) + { + World world = server.getWorld(playerAndSessionEntry.getValue().getWorld().getName()); + Location location = new Location(world, blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()); + BaseBlock block = pattern.apply(blockVector3); + Material material = Material.getMaterial(block.getBlockType().getId().replaceFirst("minecraft:", "").toUpperCase()); + api.logPlacement(playerAndSessionEntry.getKey(), location, material, material.createBlockData()); + } + } + } + + blocksPlaced.values().forEach(collection -> collection.getValue().clear()); + } + } + }, 0L, 40L); + } + + @Override + public void onStop() + { + + } + + + public void logBlockEdit(String playerName, EditSession editSession, Pattern pattern, BlockVector3 blockVector3) + { + // Cache the world used for the next iterations to come. + if (world == null || !world.getName().equals(editSession.getWorld().getName())) + { + world = server.getWorld(editSession.getWorld().getName()); + } + + Map.Entry playerAndSessionEntry = new AbstractMap.SimpleEntry(playerName, editSession); + Block block = world.getBlockAt(blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ()); + + // Add the broken block to CoreProtect if it's not air. + if (!block.getType().isAir()) + { + String blockData = block.getBlockData().getAsString(); + blockData = new Gson().fromJson(new Gson().toJson(blockData), blockData.getClass()); // Overwrite original with deep clones. + blockVector3 = new Gson().fromJson(new Gson().toJson(blockVector3), blockVector3.getClass()); // Overwrite original with deep clones. + blocksBroken.putIfAbsent(playerAndSessionEntry, new HashMap<>()); + blocksBroken.get(playerAndSessionEntry).put(blockVector3, blockData); + } + + // Add the placed block to CoreProtect if it's not air. + if (!pattern.apply(blockVector3).getBlockType().getMaterial().isAir()) + { + blocksPlaced.putIfAbsent(playerAndSessionEntry, new AbstractMap.SimpleEntry<>(pattern, new ArrayList<>())); + blocksPlaced.get(playerAndSessionEntry).getValue().add(new Gson().fromJson(new Gson().toJson(blockVector3), blockVector3.getClass())); + } + } + + public void logBlockEdits(String playerName, EditSession editSession, Region region, Pattern pattern) + { + // Add the broken blocks to CoreProtect. + World world = server.getWorld(region.getWorld().getName()); + List blocks = new ArrayList<>(); + + for (BlockVector3 blockVector3 : region) + { + blocks.add(world.getBlockAt(blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ())); + } + + logBlockEdit(playerName, editSession, pattern, blocks); + } + + public void logBlockEdit(String playerName, EditSession editSession, Pattern pattern, List blocks) + { + Map.Entry playerAndSessionEntry = new AbstractMap.SimpleEntry(playerName, editSession); + + server.getScheduler().scheduleSyncDelayedTask(plugin, () -> + { + for (Block block : blocks) + { + BlockVector3 blockVector3 = BlockVector3.at(block.getX(), block.getY(), block.getZ()); + + // Add the broken block to CoreProtect if it's not air. + if (!block.getType().isAir()) + { + api.logRemoval(playerAndSessionEntry.getKey(), block.getLocation(), block.getType(), block.getBlockData()); + } + + // Add the placed block to CoreProtect if it's not air. + BaseBlock baseBlock = pattern.apply(blockVector3); + if (!baseBlock.getBlockType().getMaterial().isAir()) + { + Material material = Material.getMaterial(baseBlock.getBlockType().getId().replaceFirst("minecraft:", "").toUpperCase()); + api.logPlacement(playerAndSessionEntry.getKey(), block.getLocation(), material, material.createBlockData()); + } + } + }, 0L); + } +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/bridge/TFGuildsBridge.java b/src/main/java/me/totalfreedom/totalfreedommod/bridge/TFGuildsBridge.java new file mode 100644 index 00000000..6b7dd993 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/bridge/TFGuildsBridge.java @@ -0,0 +1,59 @@ +package me.totalfreedom.totalfreedommod.bridge; + +import me.totalfreedom.tfguilds.Common; +import me.totalfreedom.tfguilds.TFGuilds; +import me.totalfreedom.totalfreedommod.FreedomService; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +public class TFGuildsBridge extends FreedomService +{ + + public boolean enabled = false; + + @Override + public void onStart() + { + } + + @Override + public void onStop() + { + } + + public boolean isTFGuildsEnabled() + { + if (enabled) + { + return true; + } + + try + { + final Plugin tfGuilds = server.getPluginManager().getPlugin("TFGuilds"); + if (tfGuilds != null && tfGuilds.isEnabled()) + { + if (tfGuilds instanceof TFGuilds) + { + enabled = true; + return true; + } + } + } + catch (NoClassDefFoundError ex) + { + return false; + } + + return false; + } + + public boolean inGuildChat(Player player) + { + if (!isTFGuildsEnabled()) + { + return false; + } + return Common.IN_GUILD_CHAT.contains(player); + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java b/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java index 02892679..9da62dee 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java @@ -3,8 +3,11 @@ package me.totalfreedom.totalfreedommod.command; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Set; import lombok.Getter; import me.totalfreedom.totalfreedommod.FreedomService; +import me.totalfreedom.totalfreedommod.util.FLog; +import org.reflections.Reflections; public class CommandLoader extends FreedomService { @@ -52,6 +55,26 @@ public class CommandLoader extends FreedomService return false; } + public void loadCommands() + { + Reflections commandDir = new Reflections("me.totalfreedom.totalfreedommod.command"); + + Set> commandClasses = commandDir.getSubTypesOf(FreedomCommand.class); + + for (Class commandClass : commandClasses) + { + try + { + FLog.debug("Loading command class " + commandClass.getSimpleName()); + add(commandClass.newInstance()); + } + catch (InstantiationException | IllegalAccessException | ExceptionInInitializerError ex) + { + FLog.warning("Failed to register command: /" + commandClass.getSimpleName().replace("Command_" , "")); + } + } + } + public int getCommandAmount() { return commands.size(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/CommandPermissions.java b/src/main/java/me/totalfreedom/totalfreedommod/command/CommandPermissions.java index 1dc0ee35..b5b00c9c 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/CommandPermissions.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/CommandPermissions.java @@ -8,9 +8,9 @@ import me.totalfreedom.totalfreedommod.rank.Rank; public @interface CommandPermissions { - Rank level(); + Rank level() default Rank.IMPOSTOR; - SourceType source(); + SourceType source() default SourceType.BOTH; boolean blockHostConsole() default false; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminworld.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminworld.java index 09a251e4..bf1406eb 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminworld.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminworld.java @@ -4,7 +4,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import me.totalfreedom.totalfreedommod.rank.Rank; -import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.world.WorldTime; import me.totalfreedom.totalfreedommod.world.WorldWeather; import org.bukkit.World; @@ -13,15 +12,15 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.OP, source = SourceType.BOTH) -@CommandParameters(description = "Allows for admins to configure guests, time, and weather of the AdminWorld, and allows for admins and guests to go to the AdminWorld.", - usage = "/ [guest < list | purge | add | remove > | time | weather ]", +@CommandParameters(description = "Allows for admins to configure time, and weather of the AdminWorld, and allows for admins and ops to go to the AdminWorld.", + usage = "/ [time | weather ]", aliases = "aw") public class Command_adminworld extends FreedomCommand { private enum CommandMode { - TELEPORT, GUEST, TIME, WEATHER + TELEPORT, TIME, WEATHER } @Override @@ -35,11 +34,7 @@ public class Command_adminworld extends FreedomCommand } else if (args.length >= 2) { - if ("guest".equalsIgnoreCase(args[0])) - { - commandMode = CommandMode.GUEST; - } - else if ("time".equalsIgnoreCase(args[0])) + if ("time".equalsIgnoreCase(args[0])) { commandMode = CommandMode.TIME; } @@ -62,7 +57,7 @@ public class Command_adminworld extends FreedomCommand { if (!(sender instanceof Player) || playerSender == null) { - return true; + return false; } World adminWorld = null; @@ -81,77 +76,8 @@ public class Command_adminworld extends FreedomCommand } else { - if (plugin.wm.adminworld.canAccessWorld(playerSender)) - { - msg("Going to the AdminWorld."); - plugin.wm.adminworld.sendToWorld(playerSender); - } - else - { - msg("You don't have permission to access the AdminWorld."); - } - } - - break; - } - case GUEST: - { - if (args.length == 2) - { - if ("list".equalsIgnoreCase(args[1])) - { - msg("AdminWorld guest list: " + plugin.wm.adminworld.guestListToString()); - } - else if ("purge".equalsIgnoreCase(args[1])) - { - assertCommandPerms(sender, playerSender); - plugin.wm.adminworld.purgeGuestList(); - FUtil.adminAction(sender.getName(), "AdminWorld guest list purged.", false); - } - else - { - return false; - } - } - else if (args.length == 3) - { - assertCommandPerms(sender, playerSender); - - if ("add".equalsIgnoreCase(args[1])) - { - final Player player = getPlayer(args[2]); - - if (player == null) - { - sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND); - return true; - } - - if (plugin.wm.adminworld.addGuest(player, playerSender)) - { - FUtil.adminAction(sender.getName(), "AdminWorld guest added: " + player.getName(), false); - } - else - { - msg("Could not add player to guest list."); - } - } - else if ("remove".equals(args[1])) - { - final Player player = plugin.wm.adminworld.removeGuest(args[2]); - if (player != null) - { - FUtil.adminAction(sender.getName(), "AdminWorld guest removed: " + player.getName(), false); - } - else - { - msg("Can't find guest entry for: " + args[2]); - } - } - else - { - return false; - } + msg("Going to the AdminWorld."); + plugin.wm.adminworld.sendToWorld(playerSender); } break; @@ -257,15 +183,11 @@ public class Command_adminworld extends FreedomCommand } if (args.length == 1) { - return Arrays.asList("guest", "time", "weather"); + return Arrays.asList("time", "weather"); } else if (args.length == 2) { - if (args[0].equals("guest")) - { - return Arrays.asList("add", "remove", "list", "purge"); - } - else if (args[0].equals("time")) + if (args[0].equals("time")) { return Arrays.asList("morning", "noon", "evening", "night"); } @@ -274,21 +196,6 @@ public class Command_adminworld extends FreedomCommand return Arrays.asList("off", "rain", "storm"); } } - else if (args.length == 3) - { - if (args[0].equals("guest")) - { - if (args[1].equals("add")) - { - return FUtil.getPlayerList(); - } - else if (args[1].equals("remove")) - { - return plugin.wm.adminworld.getGuestList(); - } - } - } return Collections.emptyList(); } - -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banip.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banip.java new file mode 100644 index 00000000..272960cc --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banip.java @@ -0,0 +1,82 @@ +package me.totalfreedom.totalfreedommod.command; + +import me.totalfreedom.totalfreedommod.banning.Ban; +import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.FLog; +import me.totalfreedom.totalfreedommod.util.FUtil; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.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, blockHostConsole = true) +@CommandParameters(description = "Bans the specified ip.", usage = "/ [reason] [-q]") +public class Command_banip extends FreedomCommand +{ + + @Override + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + if (args.length == 0) + { + return false; + } + + boolean silent = false; + + String reason = null; + + String ip = args[0]; + + if (!FUtil.isValidIPv4(ip)) + { + msg(ip + " is not a valid IP address", ChatColor.RED); + return true; + } + + if (plugin.bm.getByIp(ip) != null) + { + msg("The IP " + ip + " is already banned", ChatColor.RED); + return true; + } + + if (args[args.length - 1].equalsIgnoreCase("-q")) + { + silent = true; + + if (args.length >= 2) + { + reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); + } + } + else if (args.length > 1) + { + reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " "); + } + + // Ban player + Ban ban = Ban.forPlayerIp(ip, sender, null, reason); + plugin.bm.addBan(ban); + + // Kick player and handle others on IP + for (Player player : server.getOnlinePlayers()) + { + if (FUtil.getIp(player).equals(ip)) + { + player.kickPlayer(ban.bakeKickMessage()); + } + + if (!silent) + { + // Broadcast + FLog.info(ChatColor.RED + sender.getName() + " - Banned the IP " + ip); + String message = ChatColor.RED + sender.getName() + " - Banned " + (plugin.al.isAdmin(player) ? "the IP " + ip : "an IP"); + player.sendMessage(message); + } + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banname.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banname.java new file mode 100644 index 00000000..2c6c977d --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banname.java @@ -0,0 +1,68 @@ +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.ArrayUtils; +import org.apache.commons.lang.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, blockHostConsole = true) +@CommandParameters(description = "Bans the specified name.", usage = "/ [reason] [-q]") +public class Command_banname extends FreedomCommand +{ + + @Override + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + if (args.length == 0) + { + return false; + } + + boolean silent = false; + + String reason = null; + + String name = args[0];; + + if (plugin.bm.getByUsername(name) != null) + { + msg("The name " + name + " is already banned", ChatColor.RED); + return true; + } + + if (args[args.length - 1].equalsIgnoreCase("-q")) + { + silent = true; + + if (args.length >= 2) + { + reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); + } + } + else if (args.length > 1) + { + reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " "); + } + + // Ban player + Ban ban = Ban.forPlayerName(name, sender, null, reason); + plugin.bm.addBan(ban); + + if (!silent) + { + FUtil.adminAction(sender.getName(), "Banned the name " + name, true); + } + + Player player = getPlayer(name); + if (player != null) + { + player.kickPlayer(ban.bakeKickMessage()); + } + return true; + } +} \ No newline at end of file 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 50328c99..32a42f8f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java @@ -73,12 +73,16 @@ public class Command_blockcmd extends FreedomCommand } FPlayer playerdata = plugin.pl.getPlayer(player); - - playerdata.setCommandsBlocked(!playerdata.allCommandsBlocked()); - - FUtil.adminAction(sender.getName(), (playerdata.allCommandsBlocked() ? "B" : "Unb") + "locking all commands for " + player.getName(), true); - msg((playerdata.allCommandsBlocked() ? "B" : "Unb") + "locked all commands."); - + if (!playerdata.allCommandsBlocked()) + { + playerdata.setCommandsBlocked(true); + FUtil.adminAction(sender.getName(), "Blocking all commands for " + player.getName(), true); + msg("Blocked commands for " + player.getName() + "."); + } + else + { + msg("That players commands are already blocked.", ChatColor.RED); + } return true; } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cage.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cage.java index 2eda0ebc..df4f1eba 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cage.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cage.java @@ -47,6 +47,11 @@ public class Command_cage extends FreedomCommand } final FPlayer fPlayer = plugin.pl.getPlayer(player); + if (fPlayer.getCageData().isCaged()) + { + sender.sendMessage(ChatColor.RED + "That player is already caged."); + return true; + } Material outerMaterial = Material.GLASS; Material innerMaterial = Material.AIR; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_clearchat.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_clearchat.java index 1fee90d2..35ed9dee 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_clearchat.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_clearchat.java @@ -1,28 +1,30 @@ package me.totalfreedom.totalfreedommod.command; -import java.util.stream.IntStream; import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.FUtil; 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 = "Clears the chat for players who are not opt-out.", usage = "/", aliases = "cc") +@CommandParameters(description = "Clears the chat.", usage = "/", aliases = "cc") public class Command_clearchat extends FreedomCommand { @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - for (Player player : server.getOnlinePlayers()) { if (!plugin.al.isAdmin(player)) { - IntStream.range(0, 100).mapToObj(i -> "").forEach(player::sendMessage); + for (int i = 0; i < 100; i++) + { + player.sendMessage(""); + } } } - + FUtil.adminAction(sender.getName(), "Cleared chat", true); return true; } -} \ No newline at end of file +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cmdspy.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cmdspy.java index f1d55b0a..6a6a8f8c 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cmdspy.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cmdspy.java @@ -14,12 +14,11 @@ public class Command_cmdspy extends FreedomCommand @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - Admin admin = plugin.al.getAdmin(playerSender); admin.setCommandSpy(!admin.getCommandSpy()); + msg("CommandSpy " + (admin.getCommandSpy() ? "enabled." : "disabled.")); plugin.al.save(admin); plugin.al.updateTables(); - msg("CommandSpy " + (admin.getCommandSpy() ? "enabled." : "disabled.")); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deafen.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deafen.java index 4a38db0a..f8c2e113 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deafen.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deafen.java @@ -9,8 +9,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; -@CommandPermissions(level = Rank.OP, source = SourceType.BOTH) -@CommandParameters(description = "Makes random sounds to everyone online.", usage = "/") +@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) +@CommandParameters(description = "Makes random sounds.", usage = "/") public class Command_deafen extends FreedomCommand { @@ -48,4 +48,4 @@ public class Command_deafen extends FreedomCommand { return min + (random.nextDouble() * ((max - min) + 1.0)); } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deop.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deop.java index 29eda479..474d639f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deop.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deop.java @@ -36,7 +36,7 @@ public class Command_deop extends FreedomCommand if (player.getName().toLowerCase().contains(targetName) || player.getDisplayName().toLowerCase().contains(targetName) || player.getName().contains(targetName) || player.getDisplayName().contains(targetName)) { - if (player.isOp() && !AdminList.vanished.contains(player)) + if (player.isOp() && !AdminList.vanished.contains(player.getName())) { matchedPlayerNames.add(player.getName()); player.setOp(false); @@ -59,4 +59,4 @@ public class Command_deop extends FreedomCommand return true; } -} +} \ No newline at end of file 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 dbcac1e9..741c7c67 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java @@ -63,9 +63,16 @@ public class Command_doom extends FreedomCommand // Deop player.setOp(false); + String reason = null; + + if (args.length > 1) + { + reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " "); + } + // Ban player Ban ban = Ban.forPlayer(player, sender); - ban.setReason("&cFUCKOFF"); + ban.setReason((reason == null ? "FUCKOFF" : reason)); for (String playerIp : plugin.pl.getData(player).getIps()) { ban.addIp(playerIp); @@ -88,13 +95,6 @@ public class Command_doom extends FreedomCommand // Shoot the player in the sky player.setVelocity(player.getVelocity().clone().add(new Vector(0, 20, 0))); - String reason = null; - - if (args.length > 1) - { - reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); - } - final String kickReason = (reason == null ? "FUCKOFF, and get your shit together!" : reason); // Log doom diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_entitywipe.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_entitywipe.java index 46bf9297..e82b27c1 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_entitywipe.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_entitywipe.java @@ -64,7 +64,14 @@ public class Command_entitywipe extends FreedomCommand { count = plugin.ew.wipeEntities(bypassBlacklist); } - msg(count + " " + (type != null ? entityName : "entities") + FUtil.showS(count) + " removed."); + if (count == 1) + { + msg(count + " " + (type != null ? entityName : "entity") + " removed."); + } + else + { + msg(count + " " + (type != null ? entityName : "entitie") + FUtil.showS(count) + " removed."); + } return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glist.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glist.java deleted file mode 100644 index cf634396..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glist.java +++ /dev/null @@ -1,188 +0,0 @@ -package me.totalfreedom.totalfreedommod.command; - -import java.util.ArrayList; -import java.util.List; -import me.totalfreedom.totalfreedommod.banning.Ban; -import me.totalfreedom.totalfreedommod.player.PlayerData; -import me.totalfreedom.totalfreedommod.punishments.Punishment; -import me.totalfreedom.totalfreedommod.punishments.PunishmentType; -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.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg; - - -@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH, blockHostConsole = true) -@CommandParameters(description = "Bans or unbans any player, including those offline.", usage = "/ [reason] | unban | banip | unbanip | nameban | unbanname >") -public class Command_glist extends FreedomCommand -{ - - @Override - public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) - { - if (args.length < 2) - { - return false; - } - - String username = null; - final List ips = new ArrayList<>(); - boolean usingIp = false; - String banIp = null; - if (args[1].matches("^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$") || args[1].matches("^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([*])\\.([*])$")) - { - usingIp = true; - banIp = args[1]; - } - final Player player = getPlayer(args[1]); - if (!usingIp) - { - if (player == null) - { - final PlayerData entry = plugin.pl.getData(args[1]); - - if (entry == null) - { - msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly."); - return true; - } - - username = entry.getName(); - ips.addAll(entry.getIps()); - } - else - { - final PlayerData entry = plugin.pl.getData(player); - username = entry.getName(); - ips.addAll(entry.getIps()); - } - } - switch (args[0]) - { - case "ban": - case "gtfo": - if (usingIp) - { - msg("Please specify a player, not an ip."); - return true; - } - final String playerBanReason = args.length > 2 ? StringUtils.join(args, " ", 2, args.length) : null; - Ban playerBan = Ban.forPlayerName(username, sender, null, playerBanReason); - for (String ip : ips) - { - playerBan.addIp(ip); - playerBan.addIp(FUtil.getFuzzyIp(ip)); - } - FUtil.adminAction(sender.getName(), "Banning " + username, true); - playerMsg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + StringUtils.join(ips, ", ")); - - plugin.bm.addBan(playerBan); - - if (player != null) - { - player.kickPlayer(playerBan.bakeKickMessage()); - } - - plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.BAN, null)); - - return true; - case "unban": - case "pardon": - if (usingIp) - { - msg("Please specify a player, not an ip."); - return true; - } - FUtil.adminAction(sender.getName(), "Unbanning " + username, true); - playerMsg(sender, ChatColor.GRAY + username + " has been unbanned and IP is: " + StringUtils.join(ips, ", ")); - plugin.bm.removeBan(plugin.bm.getByUsername(username)); - - for (String ip : ips) - { - Ban playerUnban = plugin.bm.getByIp(ip); - if (playerUnban != null) - { - plugin.bm.removeBan(playerUnban); - } - playerUnban = plugin.bm.getByIp(FUtil.getFuzzyIp(ip)); - if (playerUnban != null) - { - plugin.bm.removeBan(playerUnban); - } - } - return true; - case "nameban": - case "banname": - if (usingIp) - { - msg("Please specify a name, not an ip."); - return true; - } - final String nameBanReason = args.length > 2 ? StringUtils.join(args, " ", 2, args.length) : null; - Ban nameBan = Ban.forPlayerName(username, sender, null, nameBanReason); - FUtil.adminAction(sender.getName(), "Banning IGN: " + username, true); - plugin.bm.addBan(nameBan); - - if (player != null) - { - player.kickPlayer(nameBan.bakeKickMessage()); - } - - return true; - case "unbanname": - case "nameunban": - if (usingIp) - { - msg("Please specify a name, not an ip."); - return true; - } - FUtil.adminAction(sender.getName(), "Unbanning IGN: " + username, true); - plugin.bm.removeBan(plugin.bm.getByUsername(username)); - return true; - case "banip": - case "ipban": - if (!usingIp) - { - msg("Please specify an IP."); - return true; - } - - final String ipBanReason = args.length > 2 ? StringUtils.join(args, " ", 2, args.length) : null; - Ban ipBan = Ban.forPlayerIp(banIp, sender, null, ipBanReason); - plugin.bm.addBan(ipBan); - FUtil.adminAction(sender.getName(), "Banned an IP", true); - playerMsg(sender, ChatColor.GRAY + "Banned IP: " + banIp); - return true; - case "unbanip": - case "pardonip": - if (!usingIp) - { - msg("Please specify an IP."); - return true; - } - - FUtil.adminAction(sender.getName(), "Unbanned an IP", true); - playerMsg(sender, ChatColor.GRAY + "Unbanned IP: " + banIp); - Ban ipUnban = plugin.bm.getByIp(banIp); - if (ipUnban != null) - { - plugin.bm.removeBan(ipUnban); - plugin.bm.unbanIp(banIp); - } - ipUnban = plugin.bm.getByIp(FUtil.getFuzzyIp(banIp)); - if (ipUnban != null) - { - plugin.bm.removeBan(ipUnban); - plugin.bm.unbanIp(banIp); - } - return true; - default: - return false; - } - } -} - diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_hubworld.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_hubworld.java index bacadfdc..4e9eff37 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_hubworld.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_hubworld.java @@ -57,7 +57,7 @@ public class Command_hubworld extends FreedomCommand { if (!(sender instanceof Player) || playerSender == null) { - return true; + return false; } World hubWorld = null; @@ -198,5 +198,4 @@ public class Command_hubworld extends FreedomCommand super(string); } } - -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invis.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invis.java index b2156e87..f89113d5 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invis.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invis.java @@ -16,6 +16,7 @@ import org.bukkit.potion.PotionEffectType; @CommandParameters(description = "Shows (optionally clears) invisible players", usage = "/ [clear]") public class Command_invis extends FreedomCommand { + @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { @@ -42,7 +43,7 @@ public class Command_invis extends FreedomCommand for (Player player : server.getOnlinePlayers()) { - if (player.hasPotionEffect(PotionEffectType.INVISIBILITY) && !plugin.al.vanished.contains(player)) + if (player.hasPotionEffect(PotionEffectType.INVISIBILITY) && !plugin.al.isVanished(player.getName())) { players.add(player.getName()); if (clear && !plugin.al.isAdmin(player)) @@ -75,4 +76,4 @@ public class Command_invis extends FreedomCommand return Collections.emptyList(); } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_jumppads.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_jumppads.java index 1f6e7faf..604ce9be 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_jumppads.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_jumppads.java @@ -10,7 +10,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -@CommandPermissions(level = Rank.OP, source = SourceType.BOTH) +@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) @CommandParameters(description = "Toggles jumppads on/off, view the status of jumppads, or make them sideways.", usage = "/ >", aliases = "launchpads,jp") public class Command_jumppads extends FreedomCommand { @@ -113,4 +113,4 @@ public class Command_jumppads extends FreedomCommand return Collections.emptyList(); } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java index 4b8edaf2..c18f503b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java @@ -3,7 +3,9 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; +import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; @@ -11,7 +13,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH) -@CommandParameters(description = "Kick the specified player.", usage = "/ [reason]", aliases = "k") +@CommandParameters(description = "Kick the specified player.", usage = "/ [reason] [-q]") public class Command_kick extends FreedomCommand { @Override @@ -30,10 +32,24 @@ public class Command_kick extends FreedomCommand return true; } + boolean silent = false; + String reason = null; - if (args.length > 1) + if (args[args.length - 1].equalsIgnoreCase("-q")) { - reason = StringUtils.join(args, " ", 1, args.length); + silent = true; + FLog.debug("silent"); + + if (args.length >= 2) + { + FLog.debug("set reason (silent)"); + reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); + } + } + else if (args.length > 1) + { + FLog.debug("set reason"); + reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " "); } StringBuilder builder = new StringBuilder() @@ -43,11 +59,18 @@ public class Command_kick extends FreedomCommand 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 + + if (!silent) { - FUtil.adminAction(sender.getName(), "Kicking " + player.getName(), true); + if (reason != null) + { + FUtil.adminAction(sender.getName(), "Kicking " + player.getName() + " - Reason: " + reason, true); + } + else + { + FUtil.adminAction(sender.getName(), "Kicking " + player.getName(), true); + } } player.kickPlayer(builder.toString()); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_linkdiscord.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_linkdiscord.java index 41d9d809..a6510fc0 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_linkdiscord.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_linkdiscord.java @@ -47,7 +47,7 @@ public class Command_linkdiscord extends FreedomCommand if (Discord.LINK_CODES.containsValue(data)) { - code = Discord.getCode(data); + code = plugin.dc.getCode(data); } else { 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 64b6ac07..4bced067 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java @@ -18,6 +18,7 @@ import org.bukkit.entity.Player; @CommandParameters(description = "Lists the real names of all online players.", usage = "/ [-a | -i | -f | -v]", aliases = "who,lsit") public class Command_list extends FreedomCommand { + public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole) { if (args.length > 1) @@ -108,11 +109,11 @@ public class Command_list extends FreedomCommand { continue; } - if (listFilter == ListFilter.ADMINS && AdminList.vanished.contains(p)) + if (listFilter == ListFilter.ADMINS && AdminList.vanished.contains(p.getName())) { continue; } - if (listFilter == ListFilter.VANISHED_ADMINS && !AdminList.vanished.contains(p)) + if (listFilter == ListFilter.VANISHED_ADMINS && !AdminList.vanished.contains(p.getName())) { continue; } @@ -124,7 +125,7 @@ public class Command_list extends FreedomCommand { continue; } - if (listFilter == ListFilter.PLAYERS && AdminList.vanished.contains(p)) + if (listFilter == ListFilter.PLAYERS && AdminList.vanished.contains(p.getName())) { continue; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_magicalsaddle.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_magicalsaddle.java new file mode 100644 index 00000000..7241b521 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_magicalsaddle.java @@ -0,0 +1,29 @@ +package me.totalfreedom.totalfreedommod.command; + +import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.shop.ShopItem; +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.ONLY_IN_GAME) +@CommandParameters(description = "Obtain a magical saddle.", usage = "/") +public class Command_magicalsaddle extends FreedomCommand +{ + + @Override + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + if (plugin.pl.getData(playerSender).hasItem(ShopItem.MAGICAL_SADDLE)) + { + playerSender.getInventory().addItem(plugin.sh.getMagicalSaddle()); + msg("You have been given a Magical Saddle", ChatColor.GREEN); + } + else + { + msg("You do not own a Magical Saddle! Purchase one from the shop.", ChatColor.RED); + } + return true; + } +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderworld.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderworld.java index b3d02757..b368a18b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderworld.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderworld.java @@ -57,7 +57,7 @@ public class Command_masterbuilderworld extends FreedomCommand { if (!(sender instanceof Player) || playerSender == null) { - return true; + return false; } World masterBuilderWorld = null; @@ -199,4 +199,4 @@ public class Command_masterbuilderworld extends FreedomCommand } } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java index 6a79f1ae..538ff60e 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java @@ -142,8 +142,6 @@ public class Command_mute extends FreedomCommand FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true); - msg(player, "You have been muted by " + ChatColor.YELLOW + sender.getName(), ChatColor.RED); - if (smite) { Command_smite.smite(sender, player, reason); @@ -180,4 +178,4 @@ public class Command_mute extends FreedomCommand return Collections.emptyList(); } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java index 5ad14123..7c4854b6 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java @@ -153,9 +153,9 @@ public class Command_myadmin extends FreedomCommand return true; } int length = message.replace("%name%", "").replace("%rank%", "").replace("%coloredrank%", "").length(); - if (length > 64) + if (length > 100) { - msg("Your login message cannot be more than 64 characters (excluding your rank and your name)", ChatColor.RED); + msg("Your login message cannot be more than 100 characters (excluding your rank and your name)", ChatColor.RED); return true; } FUtil.adminAction(sender.getName(), "Setting personal login message" + (init == null ? "" : " for " + targetPlayer.getName()), false); 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 78fa7015..de963d8b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import me.totalfreedom.totalfreedommod.config.ConfigEntry; @@ -7,6 +11,7 @@ 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.Color; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -15,16 +20,29 @@ import org.bukkit.entity.Player; @CommandParameters(description = "Essentials Interface Command - Remove illegal chatcodes from nicknames of one or all players on server.", usage = "/ [player]", aliases = "nc") public class Command_nickclean extends FreedomCommand { - - private static final String[] BLOCK = ConfigEntry.BLOCKED_CHATCODES.getString().split(","); - - private static final Pattern REGEX = Pattern.compile(FUtil.colorize(ChatColor.COLOR_CHAR + "[" + StringUtils.join(BLOCK, "") + "]"), Pattern.CASE_INSENSITIVE); + private Map colorCodes = new HashMap() + {{ + put("&0", Color.BLACK); + put("&1", Color.BLUE); + put("&2", Color.GREEN); + put("&3", Color.TEAL); + put("&4", Color.MAROON); + put("&5", Color.FUCHSIA); + put("&6", Color.OLIVE); + put("&7", Color.SILVER); + put("&8", Color.GRAY); + put("&9", Color.NAVY); + put("&a", Color.LIME); + put("&b", Color.AQUA); + put("&c", Color.RED); + put("&d", Color.PURPLE); + put("&e", Color.YELLOW); + put("&f", Color.WHITE); + }}; @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - FUtil.adminAction(sender.getName(), "Cleaning all nicknames", false); - if (args.length > 1) { Player player = getPlayer(args[0]); @@ -40,7 +58,6 @@ public class Command_nickclean extends FreedomCommand return true; } - FUtil.adminAction(sender.getName(), "Cleaning all nicknames", false); for (final Player player : server.getOnlinePlayers()) { @@ -53,15 +70,81 @@ public class Command_nickclean extends FreedomCommand { final String playerName = player.getName(); final String nickName = plugin.esb.getNickname(playerName); - if (nickName != null && !nickName.isEmpty() && !nickName.equalsIgnoreCase(playerName)) + StringBuilder newNick = new StringBuilder(); + boolean nickChanged = false; + + if(nickName.contains("§x")) { - final Matcher matcher = REGEX.matcher(nickName); - if (matcher.find()) + // Detects colors that are similar to blocked codes. + spliterator: + for (String split : nickName.split("§x")) { - final String newNickName = matcher.replaceAll(""); - msg(ChatColor.RESET + playerName + ": \"" + nickName + ChatColor.RESET + "\" -> \"" + newNickName + ChatColor.RESET + "\"."); - plugin.esb.setNickname(playerName, newNickName); + List colors = new ArrayList<>(); + String hexColorSub = null; + if (split.length() >= 12 && split.contains("§")) + { + hexColorSub = split.substring(0, 12); + split = String.valueOf(split.charAt(12)); + String hexColorString = "#" + hexColorSub.replaceAll("§", ""); + java.awt.Color hexColor = java.awt.Color.decode(hexColorString); + + // Get a range of nearby colors that are alike to the color blocked. + Color colorFirst; + Color colorSecond; + + colorFirst = Color.fromRGB(Math.min(hexColor.getRed() + 20, 255), Math.min(hexColor.getGreen() + 20, 255), Math.min(hexColor.getBlue() + 20, 255)); + colorSecond = Color.fromRGB(Math.max(hexColor.getRed() - 20, 0), Math.max(hexColor.getGreen() - 20, 0), Math.max(hexColor.getBlue() - 20, 0)); + colors.addAll(FUtil.createColorGradient(colorFirst, colorSecond, 40)); + + colorFirst = Color.fromRGB(Math.min(hexColor.getRed() + 20, 255), Math.min(hexColor.getGreen(), 255), Math.min(hexColor.getBlue(), 255)); + colorSecond = Color.fromRGB(Math.max(hexColor.getRed() - 20, 0), Math.max(hexColor.getGreen(), 0), Math.max(hexColor.getBlue(), 0)); + colors.addAll(FUtil.createColorGradient(colorFirst, colorSecond, 40)); + + colorFirst = Color.fromRGB(Math.min(hexColor.getRed(), 255), Math.min(hexColor.getGreen() + 20, 255), Math.min(hexColor.getBlue(), 255)); + colorSecond = Color.fromRGB(Math.max(hexColor.getRed(), 0), Math.max(hexColor.getGreen() - 20, 0), Math.max(hexColor.getBlue(), 0)); + colors.addAll(FUtil.createColorGradient(colorFirst, colorSecond, 40)); + + colorFirst = Color.fromRGB(Math.min(hexColor.getRed(), 255), Math.min(hexColor.getGreen(), 255), Math.min(hexColor.getBlue() + 20, 255)); + colorSecond = Color.fromRGB(Math.max(hexColor.getRed(), 0), Math.max(hexColor.getGreen(), 0), Math.max(hexColor.getBlue() - 20, 0)); + colors.addAll(FUtil.createColorGradient(colorFirst, colorSecond, 40)); + + for (String colorCode : ConfigEntry.BLOCKED_CHATCODES.getString().split(",")) + { + // Makes sure that there's hex colors in the split. + for (Color color : colors) + { + if (colorCodes.get(colorCode) != null && FUtil.colorClose(color, colorCodes.get(colorCode), 40)) + { + nickChanged = true; + newNick.append(split); + continue spliterator; + } + } + + } + newNick.append("§x").append(hexColorSub).append(split); + } } } + else + { + // Falls back on old code if hex isn't used. + final Pattern REGEX = Pattern.compile(FUtil.colorize(ChatColor.COLOR_CHAR + "[" + StringUtils.join(ConfigEntry.BLOCKED_CHATCODES.getString().split(","), "") + "]"), Pattern.CASE_INSENSITIVE); + if (!nickName.isEmpty() && !nickName.equalsIgnoreCase(playerName)) + { + final Matcher matcher = REGEX.matcher(nickName); + if (matcher.find()) + { + nickChanged = true; + newNick.append(matcher.replaceAll("")); + } + } + } + + if(nickChanged) + { + msg(ChatColor.RESET + playerName + ": \"" + nickName + ChatColor.RESET + "\" -> \"" + newNick.toString() + ChatColor.RESET + "\"."); + } + plugin.esb.setNickname(playerName, newNick.toString()); } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickfilter.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickfilter.java index a2e9b021..16d5375a 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickfilter.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickfilter.java @@ -41,11 +41,11 @@ public class Command_nickfilter extends FreedomCommand player = getPlayerByDisplayName(displayName); - if (player == null || plugin.al.vanished.contains(player) && !plugin.al.isAdmin(sender)) + if (player == null || plugin.al.isVanished(player.getName()) && !plugin.al.isAdmin(sender)) { player = getPlayerByDisplayNameAlt(displayName); - if (player == null || !plugin.al.vanished.contains(player) && !plugin.al.isAdmin(sender)) + if (player == null || !plugin.al.isVanished(player.getName()) && !plugin.al.isAdmin(sender)) { sender.sendMessage(ChatColor.GRAY + "Can't find player by nickname: " + displayName); return true; @@ -120,4 +120,4 @@ public class Command_nickfilter extends FreedomCommand return minEditMatch; } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickgradient.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickgradient.java index 5519be70..3063c42a 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickgradient.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickgradient.java @@ -12,7 +12,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) -@CommandParameters(description = "Essentials Interface Command - Rainbowify your nickname.", usage = "/ ") +@CommandParameters(description = "Essentials Interface Command - Rainbowify your nickname.", usage = "/ ", aliases = "nickgr") public class Command_nickgradient extends FreedomCommand { @@ -45,11 +45,26 @@ public class Command_nickgradient extends FreedomCommand } } + String from = "", to = ""; java.awt.Color awt1, awt2; try { - awt1 = java.awt.Color.decode(args[0]); - awt2 = java.awt.Color.decode(args[1]); + if (args[0].equalsIgnoreCase("random") || + args[0].equalsIgnoreCase("r")) + { + awt1 = FUtil.getRandomAWTColor(); + from = " (From: " + FUtil.getHexStringOfAWTColor(awt1) + ")"; + } + else + awt1 = java.awt.Color.decode(args[0]); + if (args[1].equalsIgnoreCase("random") || + args[1].equalsIgnoreCase("r")) + { + awt2 = FUtil.getRandomAWTColor(); + to = " (To: " + FUtil.getHexStringOfAWTColor(awt2) + ")"; + } + else + awt2 = java.awt.Color.decode(args[1]); } catch (NumberFormatException ex) { @@ -69,7 +84,7 @@ public class Command_nickgradient extends FreedomCommand plugin.esb.setNickname(sender.getName(), outputNick); - msg("Your nickname is now: " + outputNick); + msg("Your nickname is now: '" + outputNick + ChatColor.GRAY + "'" + from + to); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_op.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_op.java index 8b60beab..3d97ee36 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_op.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_op.java @@ -14,6 +14,7 @@ import org.bukkit.entity.Player; @CommandParameters(description = "OP a player", usage = "/ ") public class Command_op extends FreedomCommand { + @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { @@ -36,7 +37,7 @@ public class Command_op extends FreedomCommand if (player.getName().toLowerCase().contains(targetName) || player.getDisplayName().toLowerCase().contains(targetName) || player.getName().contains(targetName) || player.getDisplayName().contains(targetName)) { - if (!player.isOp() && !AdminList.vanished.contains(player)) + if (!player.isOp() && !AdminList.vanished.contains(player.getName())) { matchedPlayerNames.add(player.getName()); player.setOp(true); @@ -59,4 +60,4 @@ public class Command_op extends FreedomCommand return true; } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opme.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opme.java index 9928d769..eaadd8fc 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opme.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opme.java @@ -6,7 +6,7 @@ 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) +@CommandPermissions(level = Rank.NON_OP, source = SourceType.ONLY_IN_GAME) @CommandParameters(description = "OPs the command sender.", usage = "/") public class Command_opme extends FreedomCommand { @@ -17,7 +17,6 @@ public class Command_opme extends FreedomCommand FUtil.adminAction(sender.getName(), "Opping " + sender.getName(), false); sender.setOp(true); sender.sendMessage(FreedomCommand.YOU_ARE_OP); - return true; } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_playtime.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_playtime.java new file mode 100644 index 00000000..276bbd7d --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_playtime.java @@ -0,0 +1,63 @@ +package me.totalfreedom.totalfreedommod.command; + +import java.time.Instant; +import java.util.Date; +import java.util.List; +import me.totalfreedom.totalfreedommod.admin.ActivityLogEntry; +import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.FUtil; +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 = "Gets your playtime statistics.", usage = "/") +public class Command_playtime extends FreedomCommand +{ + @Override + public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole) + { + ActivityLogEntry entry = plugin.acl.getActivityLog(playerSender); + int seconds = entry.getTotalSecondsPlayed(); + int minutes = 0; + int hours = 0; + while (seconds >= 60) + { + seconds -= 60; + minutes += 1; + } + while (minutes >= 60) + { + minutes -= 60; + hours += 1; + } + if (entry.getTimestamps().size() == 0) + { + entry.addLogin(); + } + String lastLoginString = entry.getTimestamps().get(entry.getTimestamps().size() - 1); + Date currentTime = Date.from(Instant.now()); + lastLoginString = lastLoginString.replace("Login: ", ""); + Date lastLogin = FUtil.stringToDate(lastLoginString); + + long duration = currentTime.getTime() - lastLogin.getTime(); + long cseconds = duration / 1000 % 60; + long cminutes = duration / (60 * 1000) % 60; + long chours = duration / (60 * 60 * 1000); + StringBuilder sb = new StringBuilder() + .append("Playtime - " + sender.getName() + "\n") + .append("Current Session: " + chours + " hours, " + cminutes + " minutes, and " + cseconds + " seconds" + "\n") + .append("Overall: " + hours + " hours, " + minutes + " minutes, and " + seconds + " seconds" + "\n"); + List durations = entry.getDurations(); + if (durations.size() >= 3) + { + sb.append("Recent Sessions:"); + for (int i = 0; i < 3; i++) + { + sb.append("\n" + " - " + durations.get((durations.size() - 1) - i)); + } + } + msg(sb.toString()); + return true; + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potion.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potion.java index 0af3b7d3..d2c40f9d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potion.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potion.java @@ -70,20 +70,18 @@ public class Command_potion extends FreedomCommand } } - if (!target.equals(playerSender)) - { - if (!plugin.al.isAdmin(sender)) - { - msg(ChatColor.RED + "Only admins can clear potion effects from other players."); - return true; - } - } - else if (senderIsConsole) + if (senderIsConsole) { msg("You must specify a target player when using this command from the console."); return true; } + if (!plugin.al.isAdmin(sender)) + { + msg(ChatColor.RED + "Only admins can clear potion effects from other players."); + return true; + } + for (PotionEffect potion_effect : target.getActivePotionEffects()) { target.removePotionEffect(potion_effect.getType()); @@ -106,27 +104,25 @@ public class Command_potion extends FreedomCommand { target = getPlayer(args[4]); - if (target == null || plugin.al.vanished.contains(target) && !plugin.al.isAdmin(sender)) + if (target == null || plugin.al.isVanished(target.getName()) && !plugin.al.isAdmin(sender)) { msg(FreedomCommand.PLAYER_NOT_FOUND, ChatColor.RED); return true; } } - if (!target.equals(playerSender)) - { - if (!plugin.al.isAdmin(sender)) - { - sender.sendMessage(ChatColor.RED + "Only admins can apply potion effects to other players."); - return true; - } - } - else if (senderIsConsole) + if (senderIsConsole) { sender.sendMessage("You must specify a target player when using this command from the console."); return true; } + if (!plugin.al.isAdmin(sender)) + { + sender.sendMessage(ChatColor.RED + "Only admins can apply potion effects to other players."); + return true; + } + PotionEffectType potion_effect_type = PotionEffectType.getByName(args[1]); if (potion_effect_type == null) { @@ -244,5 +240,4 @@ public class Command_potion extends FreedomCommand } return types; } - -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potionspy.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potionspy.java index cd94100a..9a1e7a21 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potionspy.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potionspy.java @@ -1,24 +1,222 @@ package me.totalfreedom.totalfreedommod.command; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.FUtil; +import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.entity.ThrownPotion; @CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.ONLY_IN_GAME) -@CommandParameters(description = "Allows admins to see every time a potion is splashed.", usage = "/", aliases = "potspy") +@CommandParameters(description = "Allows admins to see potions that are thrown.", usage = "/ | history [player] ", aliases = "potspy") public class Command_potionspy extends FreedomCommand { + private String titleText = "&8&m------------------&r &ePotionSpy &8&m------------------&r"; + private String validPageText = "Please specify a valid page number between 1 and %s."; + private String noPlayerRecord = "That player has not thrown any potions yet."; + private String splashedText = "&r%s splashed a potion at &eX: %s Y: %s Z: %s&r\nin the world '&e%s&r' about &e%s &rago%s."; + private String bottomText = "&8&m--------------------&r &e%s / %s &8&m--------------------&r"; @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { Admin admin = plugin.al.getAdmin(playerSender); - admin.setPotionSpy(!admin.getPotionSpy()); + + if (args.length <= 0) + { + setPotionSpyState(admin, !admin.getPotionSpy()); + return true; + } + else + { + switch (args[0].toLowerCase()) + { + case "enable": + case "on": + setPotionSpyState(admin, true); + break; + + case "disable": + case "off": + setPotionSpyState(admin, false); + break; + + case "history": + if (args.length == 3) + { + Player player = Bukkit.getPlayer(args[1]); + if (player == null) + { + msg(sender, "Please specify a valid player name."); + return true; + } + + List> thrownPotions = new ArrayList<>(); + thrownPotions.addAll(plugin.mo.getPlayerThrownPotions(player)); // Make a copy of the list to avoid modifying the original. + + List potionThrowNotifications = new ArrayList<>(); + int lastPage = (int)Math.ceil(thrownPotions.size() / 5.0); + + if (thrownPotions.isEmpty()) + { + msg(sender, noPlayerRecord); + return true; + } + if (!NumberUtils.isNumber(args[2])) + { + msg(sender, String.format(validPageText, lastPage)); + return true; + } + + Collections.reverse(thrownPotions); + int pageIndex = Integer.parseInt(args[2]); + + for (Map.Entry potionEntry : thrownPotions) + { + ThrownPotion potion = potionEntry.getKey(); + boolean trollPotions = plugin.mo.isTrollPotion(potion); + + potionThrowNotifications.add(ChatColor.translateAlternateColorCodes('&', String.format(splashedText, player.getName(), potion.getLocation().getBlockX(), + potion.getLocation().getBlockY(), potion.getLocation().getBlockZ(), potion.getWorld().getName(), getUnixTimeDifference(potionEntry.getValue(), System.currentTimeMillis()), trollPotions ? " &c(most likely troll potion/potions)" : ""))); + } + + List page = FUtil.getPageFromList(potionThrowNotifications, 5, pageIndex - 1); + if (!page.isEmpty()) + { + msg(sender, ChatColor.translateAlternateColorCodes('&', titleText)); + for (String potionThrowNotification : page) + { + msg(sender, potionThrowNotification); + } + } + else + { + msg(sender, String.format(validPageText, lastPage)); + return true; + } + + msg(sender, ChatColor.translateAlternateColorCodes('&', String.format(bottomText, pageIndex, lastPage))); + } + else if (args.length == 2) + { + List> thrownPotions = new ArrayList<>(); + thrownPotions.addAll(plugin.mo.getAllThrownPotions()); // Make a copy of the list to avoid modifying the original. + + List potionThrowNotifications = new ArrayList<>(); + int lastPage = (int)Math.ceil(thrownPotions.size() / 5.0); + + if (thrownPotions.isEmpty()) + { + if(Bukkit.getPlayer(args[1]) != null) + { + msg(sender, noPlayerRecord); + } + else + { + msg(sender, "No potions have been thrown yet."); + } + return true; + } + if (!NumberUtils.isNumber(args[1])) + { + msg(sender, String.format(validPageText, lastPage)); + return true; + } + + Collections.reverse(thrownPotions); + int pageIndex = Integer.parseInt(args[1]); + + for (Map.Entry potionEntry : thrownPotions) + { + ThrownPotion potion = potionEntry.getKey(); + Player player = (Player)potion.getShooter(); + boolean trollPotions = plugin.mo.isTrollPotion(potion); + + if (player != null) + { + potionThrowNotifications.add(ChatColor.translateAlternateColorCodes('&', String.format(splashedText, player.getName(), potion.getLocation().getBlockX(), + potion.getLocation().getBlockY(), potion.getLocation().getBlockZ(), potion.getWorld().getName(), getUnixTimeDifference(potionEntry.getValue(), System.currentTimeMillis()), trollPotions ? " &c(most likely troll potion/potions)" : ""))); + } + } + + List page = FUtil.getPageFromList(potionThrowNotifications, 5, pageIndex - 1); + if (!page.isEmpty()) + { + msg(sender, ChatColor.translateAlternateColorCodes('&', titleText)); + for (String potionThrowNotification : page) + { + msg(sender, potionThrowNotification); + } + } + else + { + msg(sender, String.format(validPageText, lastPage)); + return true; + } + + msg(sender, ChatColor.translateAlternateColorCodes('&', String.format(bottomText, pageIndex, lastPage))); + } + else + { + return false; + } + break; + default: + return false; + } + } + return true; + } + + private void setPotionSpyState(Admin admin, boolean state) + { + admin.setPotionSpy(state); plugin.al.save(admin); plugin.al.updateTables(); msg("PotionSpy is now " + (admin.getPotionSpy() ? "enabled." : "disabled.")); - return true; + } + + /** + * Get the unix time difference in string format (1h, 30m, 15s). + * @param past The unix time at the start. + * @param now The current unix time. + * @return A string that displays the time difference between the two unix time values. + */ + private String getUnixTimeDifference(long past, long now) + { + long unix = now - past; + long seconds = Math.round(unix / 1000.0); + if (seconds < 60) + { + return seconds + "s"; + } + else + { + long minutes = Math.round(seconds / 60.0); + if (minutes < 60) + { + return minutes + "m"; + } + else + { + long hours = Math.round(minutes / 60.0); + if (hours < 24) + { + return hours + "h"; + } + else + { + return Math.round(hours / 24.0) + "d"; + } + } + } } } 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 916a564c..ab7e02bb 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java @@ -15,7 +15,7 @@ public class Command_rank extends FreedomCommand @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (isConsole() && args.length == 0) + if (senderIsConsole && args.length == 0) { for (Player player : server.getOnlinePlayers()) { @@ -72,4 +72,4 @@ public class Command_rank extends FreedomCommand return sb.toString(); } -} +} \ No newline at end of file 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 96885fe9..548b68b9 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java @@ -17,7 +17,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH, blockHostConsole = false) +@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH) @CommandParameters(description = "Remove all blocks of a certain type in the radius of certain players.", usage = "/ [radius (default=50)] [player]") public class Command_ro extends FreedomCommand { @@ -58,7 +58,7 @@ public class Command_ro extends FreedomCommand } } - int radius = 20; + int radius = 50; if (args.length >= 2) { try @@ -179,4 +179,4 @@ public class Command_ro extends FreedomCommand return affected; } -} +} \ No newline at end of file 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 7c6ea709..e2a28424 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java @@ -39,6 +39,7 @@ public class Command_saconfig extends FreedomCommand case "clean": { + checkConsole(); checkRank(Rank.SENIOR_ADMIN); FUtil.adminAction(sender.getName(), "Cleaning admin list", true); @@ -60,6 +61,7 @@ public class Command_saconfig extends FreedomCommand case "setrank": { + checkConsole(); checkRank(Rank.SENIOR_ADMIN); if (args.length < 3) @@ -70,7 +72,7 @@ public class Command_saconfig extends FreedomCommand Rank rank = Rank.findRank(args[2]); if (rank == null) { - msg("Unknown rank: " + rank); + msg("Unknown rank: " + args[2]); return true; } @@ -152,6 +154,7 @@ public class Command_saconfig extends FreedomCommand return false; } + checkConsole(); checkRank(Rank.TELNET_ADMIN); // Player already an admin? @@ -209,8 +212,10 @@ public class Command_saconfig extends FreedomCommand { String oldName = admin.getName(); if (oldName != player.getName()) - admin.setName(player.getName()); - plugin.sql.updateAdminName(oldName, admin.getName()); + { + admin.setName(player.getName()); + plugin.sql.updateAdminName(oldName, admin.getName()); + } admin.addIp(FUtil.getIp(player)); } @@ -242,7 +247,7 @@ public class Command_saconfig extends FreedomCommand if (fPlayer.getFreezeData().isFrozen()) { fPlayer.getFreezeData().setFrozen(false); - msg(player.getPlayer(), "You have been unfrozen."); + msg(player, "You have been unfrozen."); } if (!player.isOp()) @@ -261,6 +266,7 @@ public class Command_saconfig extends FreedomCommand return false; } + checkConsole(); checkRank(Rank.TELNET_ADMIN); Player player = getPlayer(args[1]); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_settotalvotes.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_settotalvotes.java index dc1450bb..2b4f6a17 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_settotalvotes.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_settotalvotes.java @@ -46,6 +46,8 @@ public class Command_settotalvotes extends FreedomCommand return true; } + msg("Set " + args[1] + "'s votes to " + args[0]); + playerData.setTotalVotes(votes); plugin.pl.save(playerData); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_sit.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_sit.java new file mode 100644 index 00000000..6ef233dd --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_sit.java @@ -0,0 +1,34 @@ +package me.totalfreedom.totalfreedommod.command; + +import java.util.ArrayList; +import java.util.List; +import me.totalfreedom.totalfreedommod.rank.Rank; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; + +@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) +@CommandParameters(description = "Sit at the current place you are at.", usage = "/") +public class Command_sit extends FreedomCommand +{ + public static List STANDS = new ArrayList<>(); + + public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole) + { + if (args.length != 0) + { + return false; + } + ArmorStand stand = (ArmorStand) playerSender.getWorld().spawnEntity(playerSender.getLocation().clone().subtract(0.0, 1.7, 0.0), EntityType.ARMOR_STAND); + stand.setGravity(false); + stand.setAI(false); + stand.setVisible(false); + stand.setInvulnerable(true); + stand.addPassenger(playerSender); + STANDS.add(stand); + msg("You are now sitting."); + return true; + } +} 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 f6066ec7..0433c692 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java @@ -28,7 +28,7 @@ public class Command_smite extends FreedomCommand } String reason = null; - Boolean silent = false; + boolean silent = false; if (args.length >= 2) { if (args[args.length - 1].equalsIgnoreCase("-q")) @@ -76,18 +76,21 @@ public class Command_smite extends FreedomCommand public static void smite(CommandSender sender, Player player, String reason, Boolean silent) { - FUtil.bcastMsg(player.getName() + " has been a naughty, naughty boy.", ChatColor.RED); player.sendTitle(ChatColor.RED + "You've been smitten.", ChatColor.YELLOW + "Be sure to follow the rules!", 20, 100, 60); - if (reason != null) - { - FUtil.bcastMsg(" Reason: " + ChatColor.YELLOW + reason, ChatColor.RED); - } - if (!silent) { + FUtil.bcastMsg(player.getName() + " has been a naughty, naughty boy.", ChatColor.RED); + if (reason != null) + { + FUtil.bcastMsg(" Reason: " + ChatColor.YELLOW + reason, ChatColor.RED); + } FUtil.bcastMsg(" Smitten by: " + ChatColor.YELLOW + sender.getName(), ChatColor.RED); } + else + { + sender.sendMessage(ChatColor.GRAY + "Smitten " + player.getName() + " quietly."); + } // Deop player.setOp(false); @@ -119,4 +122,4 @@ public class Command_smite extends FreedomCommand player.sendTitle(ChatColor.RED + "You've been smitten.", ChatColor.YELLOW + "Reason: " + reason, 20, 100, 60); } } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectate.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectate.java index 94c93620..a32179e5 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectate.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectate.java @@ -15,7 +15,6 @@ public class Command_spectate extends FreedomCommand @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (args.length == 0) { return false; @@ -39,8 +38,12 @@ public class Command_spectate extends FreedomCommand playerSender.setGameMode(GameMode.SPECTATOR); } - playerSender.setSpectatorTarget(player); + if (playerSender.getWorld() != player.getWorld()) + { + playerSender.teleport(player); + } + playerSender.setSpectatorTarget(player); return true; } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tag.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tag.java index 8795ff79..d002aa47 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tag.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tag.java @@ -48,7 +48,7 @@ public class Command_tag extends FreedomCommand for (final Player player : server.getOnlinePlayers()) { - if (plugin.al.vanished.contains(player) && !plugin.al.isAdmin(sender)) + if (plugin.al.isVanished(player.getName()) && !plugin.al.isAdmin(sender)) { continue; } @@ -138,6 +138,12 @@ public class Command_tag extends FreedomCommand } else if ("set".equalsIgnoreCase(args[0])) { + if (senderIsConsole) + { + msg("\"/tag set\" can't be used from the console."); + return true; + } + final String inputTag = StringUtils.join(args, " ", 1, args.length); final String strippedTag = StringUtils.replaceEachRepeatedly(StringUtils.strip(inputTag), new String[] @@ -183,11 +189,32 @@ public class Command_tag extends FreedomCommand } else if (args[0].equalsIgnoreCase("gradient")) { + if (senderIsConsole) + { + msg("\"/tag gradient\" can't be used from the console."); + return true; + } + + String from = "", to = ""; java.awt.Color awt1, awt2; try { - awt1 = java.awt.Color.decode(args[1]); - awt2 = java.awt.Color.decode(args[2]); + if (args[1].equalsIgnoreCase("random") || + args[1].equalsIgnoreCase("r")) + { + awt1 = FUtil.getRandomAWTColor(); + from = " (From: " + FUtil.getHexStringOfAWTColor(awt1) + ")"; + } + else + awt1 = java.awt.Color.decode(args[1]); + if (args[2].equalsIgnoreCase("random") || + args[2].equalsIgnoreCase("r")) + { + awt2 = FUtil.getRandomAWTColor(); + to = " (To: " + FUtil.getHexStringOfAWTColor(awt2) + ")"; + } + else + awt2 = java.awt.Color.decode(args[2]); } catch (NumberFormatException ex) { @@ -233,7 +260,7 @@ public class Command_tag extends FreedomCommand { save(playerSender, tag); } - msg("Tag set to '" + outputTag + ChatColor.GRAY + "'." + (save ? " (Saved)" : "")); + msg("Tag set to '" + outputTag + ChatColor.GRAY + "'." + (save ? " (Saved)" : "") + from + to); return true; } @@ -254,4 +281,4 @@ public class Command_tag extends FreedomCommand playerData.setTag(tag); plugin.pl.save(playerData); } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglediscord.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglediscord.java new file mode 100644 index 00000000..69397339 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglediscord.java @@ -0,0 +1,22 @@ +package me.totalfreedom.totalfreedommod.command; + +import me.totalfreedom.totalfreedommod.player.PlayerData; +import me.totalfreedom.totalfreedommod.rank.Rank; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) +@CommandParameters(description = "Toggle the display of Discord messages in-game.", usage = "/", aliases = "tdiscord,tdisc") +public class Command_togglediscord extends FreedomCommand +{ + @Override + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + PlayerData data = plugin.pl.getData(playerSender); + data.setDisplayDiscord(!data.doesDisplayDiscord()); + plugin.pl.save(data); + msg("Discord messages will " + (data.doesDisplayDiscord() ? "now" : "no longer") + " be shown."); + return true; + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanip.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanip.java new file mode 100644 index 00000000..4ea8e07e --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanip.java @@ -0,0 +1,62 @@ +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.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 = "Unbans the specified ip.", usage = "/ [-q]") +public class Command_unbanip extends FreedomCommand +{ + + @Override + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + if (args.length == 0) + { + return false; + } + + boolean silent = false; + + String ip = args[0]; + + if (!FUtil.isValidIPv4(ip)) + { + msg(ip + " is not a valid IP address", ChatColor.RED); + return true; + } + + Ban ban = plugin.bm.getByIp(ip); + + if (ban == null) + { + msg("The ip " + ip + " is not banned", ChatColor.RED); + return true; + } + + if (ban.hasUsername()) + { + msg("This ban is not an ip-only ban."); + return true; + } + + if (args.length > 1 && args[1].equals("-q")) + { + silent = true; + } + + plugin.bm.removeBan(ban); + + if (!silent) + { + FUtil.adminAction(sender.getName(), "Unbanned the ip " + ip, true); + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanname.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanname.java new file mode 100644 index 00000000..f2e91b4f --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanname.java @@ -0,0 +1,56 @@ +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.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 = "Unbans the specified name.", usage = "/ [-q]") +public class Command_unbanname extends FreedomCommand +{ + + @Override + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + if (args.length == 0) + { + return false; + } + + boolean silent = false; + + String name = args[0]; + + Ban ban = plugin.bm.getByUsername(name); + + if (ban == null) + { + msg("The name " + name + " is not banned", ChatColor.RED); + return true; + } + + if (ban.hasIps()) + { + msg("This ban is not a name-only ban."); + return true; + } + + if (args.length > 1 && args[1].equals("-q")) + { + silent = true; + } + + plugin.bm.removeBan(ban); + + if (!silent) + { + FUtil.adminAction(sender.getName(), "Unbanned the name " + name, true); + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unblockcmd.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unblockcmd.java new file mode 100644 index 00000000..86566985 --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unblockcmd.java @@ -0,0 +1,44 @@ +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 = "Unblocks commands for a player.", usage = "/ ", aliases = "unblockcommand,unblockcommands,ubcmds,unblockcmds,ubc") +public class Command_unblockcmd extends FreedomCommand +{ + + @Override + public 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) + { + sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND); + return true; + } + + FPlayer fPlayer = plugin.pl.getPlayer(player); + if (fPlayer.allCommandsBlocked()) + { + fPlayer.setCommandsBlocked(false); + FUtil.adminAction(sender.getName(), "Unblocking all commands for " + player.getName(), true); + msg("Unblocked commands for " + player.getName() + "."); + } + else + { + msg("That players commands aren't blocked.", ChatColor.RED); + } + return true; + } +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_uncage.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_uncage.java index d218d570..9892067e 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_uncage.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_uncage.java @@ -30,18 +30,15 @@ public class Command_uncage extends FreedomCommand } final FPlayer fPlayer = plugin.pl.getPlayer(player); - if (fPlayer.getCageData().isCaged()) { - FUtil.adminAction(sender.getName(), "Uncaging " + sender.getName(), true); - final FPlayer playerdata = plugin.pl.getPlayer(playerSender); - playerdata.getCageData().setCaged(false); + FUtil.adminAction(sender.getName(), "Uncaging " + player.getName(), true); + fPlayer.getCageData().setCaged(false); } else { msg("That player is not caged!", ChatColor.RED); } - return true; } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unmute.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unmute.java index ec329f91..a59ef189 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unmute.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unmute.java @@ -42,28 +42,25 @@ public class Command_unmute extends FreedomCommand } FPlayer playerdata = plugin.pl.getPlayer(player); - if (plugin.al.isAdmin(player)) - { - msg(player.getName() + " is an admin, and can't be muted."); - return true; - } - if (playerdata.isMuted()) { playerdata.setMuted(false); - msg(player, "You have been unmuted.", ChatColor.RED); player.sendTitle(ChatColor.RED + "You've been unmuted.", ChatColor.YELLOW + "Be sure to follow the rules!", 20, 100, 60); - if (!quiet) + + if (quiet) { - FUtil.adminAction(sender.getName(), "Unmuting " + player.getName(), true); + msg("Unmuted " + player.getName() + " quietly"); + return true; } - return true; + + FUtil.adminAction(sender.getName(), "Unmuting " + player.getName(), true); + msg("Unmuted " + player.getName()); + msg(player, "You have been unmuted.", ChatColor.RED); } else { msg(ChatColor.RED + "That player is not muted."); } - return true; } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vanish.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vanish.java index 0a50072a..82728e7b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vanish.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vanish.java @@ -1,16 +1,18 @@ package me.totalfreedom.totalfreedommod.command; -import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.rank.Displayable; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg; @CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.ONLY_IN_GAME) @@ -23,7 +25,6 @@ public class Command_vanish extends FreedomCommand Displayable display = plugin.rm.getDisplay(playerSender); String displayName = display.getColor() + playerSender.getName(); String tag = display.getColoredTag(); - Admin admin = plugin.al.getAdmin(playerSender); boolean silent = false; if (args.length > 0) { @@ -32,42 +33,70 @@ public class Command_vanish extends FreedomCommand silent = true; } } - if (plugin.al.vanished.contains(playerSender)) + + if (plugin.al.isVanished(playerSender.getName())) { - msg(ChatColor.GOLD + "You have been unvanished."); - if (!silent) + if (silent) { + msg(ChatColor.GOLD + "Silently unvanished."); + } + else + { + msg("You have unvanished.", ChatColor.GOLD); FUtil.bcastMsg(plugin.rm.craftLoginMessage(playerSender, null)); FUtil.bcastMsg(playerSender.getName() + " joined the game.", ChatColor.YELLOW); plugin.dc.messageChatChannel("**" + playerSender.getName() + " joined the server" + "**"); } + PlayerData playerData = plugin.pl.getData(playerSender); if (playerData.getTag() != null) { tag = FUtil.colorize(playerData.getTag()); } + plugin.pl.getData(playerSender).setTag(tag); FLog.info(playerSender.getName() + " is no longer vanished."); + for (Player player : server.getOnlinePlayers()) { if (plugin.al.isAdmin(player)) { playerMsg(player, ChatColor.YELLOW + sender.getName() + " has unvanished and is now visible to everyone."); + } + if (!plugin.al.isAdmin(player)) + { player.showPlayer(plugin, playerSender); } } plugin.esb.setVanished(playerSender.getName(), false); playerSender.setPlayerListName(StringUtils.substring(displayName, 0, 16)); - plugin.al.vanished.remove(playerSender); + plugin.al.vanished.remove(playerSender.getName()); } else { - msg("You have been vanished.", ChatColor.GOLD); - if (!silent) + new BukkitRunnable() { + @Override + public void run() + { + if (plugin.al.isVanished(playerSender.getName())) + { + playerSender.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(ChatColor.GOLD + "You are hidden from other players.")); + } + } + }.runTaskTimer(plugin, 0L, 4L); + + if (silent) + { + msg("Silently vanished.", ChatColor.GOLD); + } + else + { + msg ("You have vanished.", ChatColor.GOLD); FUtil.bcastMsg(playerSender.getName() + " left the game.", ChatColor.YELLOW); plugin.dc.messageChatChannel("**" + playerSender.getName() + " left the server" + "**"); } + FLog.info(playerSender.getName() + " is now vanished."); for (Player player : server.getOnlinePlayers()) { @@ -82,9 +111,10 @@ public class Command_vanish extends FreedomCommand } } } + plugin.esb.setVanished(playerSender.getName(), true); - plugin.al.vanished.add(playerSender); + plugin.al.vanished.add(playerSender.getName()); } return true; } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whohas.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whohas.java index c0f5e599..cdd2754b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whohas.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whohas.java @@ -40,7 +40,7 @@ public class Command_whohas extends FreedomCommand for (final Player player : server.getOnlinePlayers()) { - if (!plugin.al.isAdmin(sender) && plugin.al.vanished.contains(player)) + if (!plugin.al.isAdmin(sender) && plugin.al.isVanished(player.getName())) { continue; } @@ -94,4 +94,4 @@ public class Command_whohas extends FreedomCommand return Collections.emptyList(); } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java b/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java index 0b1e3dba..51194d31 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java @@ -131,7 +131,7 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter return true; } - if (perms.blockHostConsole() && FUtil.isFromHostConsole(sender.getName())) + if (perms.blockHostConsole() && FUtil.isFromHostConsole(sender.getName()) && !FUtil.inDeveloperMode()) { msg(ChatColor.RED + "Host console is not allowed to use this command!"); return true; @@ -303,9 +303,12 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter protected Player getPlayer(String name, Boolean nullVanished) { Player player = Bukkit.getPlayer(name); - if (nullVanished && plugin.al.vanished.contains(player) && !plugin.al.isAdmin(sender)) + if (player != null) { - return null; + if (nullVanished && plugin.al.isVanished(player.getName()) && !plugin.al.isAdmin(sender)) + { + return null; + } } return player; } @@ -341,4 +344,4 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter return null; } } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java index c08dd21b..7094625e 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java @@ -103,6 +103,7 @@ public enum ConfigEntry SHOP_PRICES_RIDEABLE_PEARL(Integer.class, "shop.prices.rideable_pearl"), SHOP_PRICES_STACKING_POTATO(Integer.class, "shop.prices.stacking_potato"), SHOP_PRICES_CLOWN_FISH(Integer.class, "shop.prices.clown_fish"), + SHOP_PRICES_MAGICAL_SADDLE(Integer.class, "shop.prices.magical_saddle"), // ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"), ADMINLIST_CONSOLE_IS_SENIOR(Boolean.class, "adminlist.console_is_senior"), @@ -160,7 +161,8 @@ public enum ConfigEntry VOTING_INFO(List.class, "votinginfo"), MASTER_BUILDER_INFO(List.class, "masterbuilderinfo"), AUTO_ENTITY_WIPE(Boolean.class, "auto_wipe"), - TOGGLE_CHAT(Boolean.class, "toggle_chat"); + TOGGLE_CHAT(Boolean.class, "toggle_chat"), + DEVELOPER_MODE(Boolean.class, "developer_mode"); // private final Class type; private final String configName; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/config/MainConfig.java b/src/main/java/me/totalfreedom/totalfreedommod/config/MainConfig.java index bfcf6cba..c6e7be31 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/config/MainConfig.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/config/MainConfig.java @@ -34,7 +34,7 @@ public class MainConfig extends FreedomService } - public MainConfig(TotalFreedomMod plugin) + public MainConfig() { entries = new EnumMap<>(ConfigEntry.class); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/discord/Discord.java b/src/main/java/me/totalfreedom/totalfreedommod/discord/Discord.java index f579382a..5076e395 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/discord/Discord.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/discord/Discord.java @@ -49,6 +49,7 @@ import org.bukkit.event.player.PlayerQuitEvent; public class Discord extends FreedomService { + public static HashMap LINK_CODES = new HashMap<>(); public static HashMap VERIFICATION_CODES = new HashMap<>(); public ScheduledThreadPoolExecutor RATELIMIT_EXECUTOR; @@ -253,13 +254,19 @@ public class Discord extends FreedomService @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent event) { - messageChatChannel("**" + deformat(event.getPlayer().getName()) + " joined the server" + "**"); + if (!plugin.al.isVanished(event.getPlayer().getName())) + { + messageChatChannel("**" + deformat(event.getPlayer().getName()) + " joined the server" + "**"); + } } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerLeave(PlayerQuitEvent event) { - messageChatChannel("**" + deformat(event.getPlayer().getName()) + " left the server" + "**"); + if (!plugin.al.isVanished(event.getPlayer().getName())) + { + messageChatChannel("**" + deformat(event.getPlayer().getName()) + " left the server" + "**"); + } } @EventHandler(priority = EventPriority.MONITOR) @@ -292,6 +299,12 @@ public class Discord extends FreedomService { message = StringUtils.remove(message, "@"); } + + if (message.toLowerCase().contains("discord.gg")) + { + return; + } + if (enabled && !chat_channel_id.isEmpty()) { CompletableFuture sentMessage = bot.getTextChannelById(chat_channel_id).sendMessage(message).submit(true); @@ -482,4 +495,4 @@ public class Discord extends FreedomService return false; } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java b/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java index aa4ac771..cd2c60af 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java @@ -1,14 +1,17 @@ package me.totalfreedom.totalfreedommod.discord; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Title; -import me.totalfreedom.totalfreedommod.util.FUtil; +import me.totalfreedom.totalfreedommod.util.FLog; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.entity.Player; public class DiscordToMinecraftListener extends ListenerAdapter { @@ -27,7 +30,14 @@ public class DiscordToMinecraftListener extends ListenerAdapter message += " " + tag; } message += " " + ChatColor.RED + ChatColor.stripColor(member.getEffectiveName()) + ChatColor.DARK_GRAY + ": " + ChatColor.RESET + ChatColor.stripColor(event.getMessage().getContentDisplay()); - FUtil.bcastMsg(message); + for (Player player : Bukkit.getOnlinePlayers()) + { + if (TotalFreedomMod.getPlugin().pl.getData(player).doesDisplayDiscord()) + { + player.sendMessage(message); + } + } + FLog.info(message); } } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java b/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java index b1c608bd..32a14036 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java @@ -11,7 +11,6 @@ import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.shop.ShopItem; -import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.ChatColor; import org.bukkit.Color; @@ -43,13 +42,12 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; public class ItemFun extends FreedomService { - public List explosivePlayers = new ArrayList(); + public List explosivePlayers = new ArrayList<>(); private final Random random = new Random(); @@ -71,7 +69,7 @@ public class ItemFun extends FreedomService { cooldownTracker.get(player.getName()).add(item.getDataName()); } - BukkitTask thing = new BukkitRunnable() + new BukkitRunnable() { @Override public void run() @@ -105,21 +103,35 @@ public class ItemFun extends FreedomService { Player player = event.getPlayer(); - Entity entity = event.getRightClicked(); - if (!player.getInventory().getItemInMainHand().getType().equals(Material.POTATO) || entity.getType().equals(EntityType.PLAYER)) + if (player.getInventory().getItemInMainHand().getType().equals(Material.POTATO) || entity.getType().equals(EntityType.PLAYER)) { + if (plugin.sh.isRealItem(plugin.pl.getData(player), ShopItem.STACKING_POTATO, player.getInventory().getItemInMainHand(), plugin.sh.getStackingPotato())) + { + player.addPassenger(entity); + player.sendMessage("Stacked " + entity.getName()); + } + } + + if (onCooldown(player, ShopItem.MAGICAL_SADDLE)) + { + player.sendMessage(ChatColor.RED + "You're currently on a cool-down for 15 seconds."); return; } - if (!plugin.sh.isRealItem(plugin.pl.getData(player), ShopItem.STACKING_POTATO, player.getInventory().getItemInMainHand(), plugin.sh.getStackingPotato())) + if (player.getInventory().getItemInMainHand().getType().equals(Material.SADDLE) || player.getInventory().getItemInOffHand().getType().equals(Material.SADDLE) || entity.getType().equals(EntityType.PLAYER)) { - return; + if (plugin.sh.isRealItem(plugin.pl.getData(player), ShopItem.MAGICAL_SADDLE, player.getInventory().getItemInMainHand(), plugin.sh.getMagicalSaddle()) || plugin.sh.isRealItem(plugin.pl.getData(player), ShopItem.MAGICAL_SADDLE, player.getInventory().getItemInOffHand(), plugin.sh.getMagicalSaddle())) + { + entity.addPassenger(player); + cooldown(player, ShopItem.MAGICAL_SADDLE, 15); + if (entity instanceof Player) + { + entity.sendMessage(ChatColor.GRAY + player.getName() + " is now riding you, run /eject to eject them."); + } + } } - - player.addPassenger(entity); - player.sendMessage("Stacked " + entity.getName()); } @EventHandler(priority = EventPriority.MONITOR) @@ -210,7 +222,7 @@ public class ItemFun extends FreedomService if (onCooldown(player, ShopItem.LIGHTNING_ROD)) { - player.sendMessage(ChatColor.RED + "You're are currently on a cooldown for 10 seconds."); + player.sendMessage(ChatColor.RED + "You're currently on a cool-down for 10 seconds."); break; } @@ -234,7 +246,7 @@ public class ItemFun extends FreedomService if (onCooldown(player, ShopItem.FIRE_BALL)) { - player.sendMessage(ChatColor.RED + "You're are currently on a cool-down for 5 seconds."); + player.sendMessage(ChatColor.RED + "You're currently on a cool-down for 5 seconds."); break; } @@ -245,6 +257,7 @@ public class ItemFun extends FreedomService cooldown(player, ShopItem.FIRE_BALL, 5); break; } + case TROPICAL_FISH: { final int RADIUS_HIT = 5; @@ -257,7 +270,7 @@ public class ItemFun extends FreedomService if (onCooldown(player, ShopItem.CLOWN_FISH)) { - player.sendMessage(ChatColor.RED + "You're are currently on a cool-down for 30 seconds."); + player.sendMessage(ChatColor.RED + "You're currently on a cool-down for 30 seconds."); break; } @@ -451,5 +464,4 @@ public class ItemFun extends FreedomService } } } - -} +} \ No newline at end of file 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 c2e05c43..c4bcf502 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 @@ -40,7 +40,7 @@ public class Module_list extends HTTPDModule for (Player player : Bukkit.getOnlinePlayers()) { - if (plugin.al.vanished.contains(player)) + if (plugin.al.isVanished(player.getName())) { continue; } @@ -128,7 +128,7 @@ public class Module_list extends HTTPDModule for (Player player : onlinePlayers) { - if (plugin.al.vanished.contains(player)) + if (plugin.al.isVanished(player.getName())) { continue; } @@ -167,4 +167,4 @@ public class Module_list extends HTTPDModule { return "Total Freedom - Online Players"; } -} +} \ No newline at end of file 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 fcd9a89d..effa05b5 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 @@ -36,7 +36,7 @@ public class Module_players extends HTTPDModule // All online players for (Player player : Bukkit.getOnlinePlayers()) { - if (!plugin.al.vanished.contains(player)) + if (!plugin.al.isVanished(player.getName())) { players.add(player.getName()); if (plugin.al.isAdmin(player) && !plugin.al.isAdminImpostor(player)) @@ -85,4 +85,4 @@ public class Module_players extends HTTPDModule response.addHeader("Access-Control-Allow-Origin", "*"); return response; } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java b/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java index 43963a76..60db7987 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java @@ -48,6 +48,8 @@ public class PlayerData @Getter @Setter private int totalVotes; + @Setter + private boolean displayDiscord = true; public PlayerData(ResultSet resultSet) { @@ -70,6 +72,7 @@ public class PlayerData items.clear(); items.addAll(FUtil.stringToList(resultSet.getString("items"))); totalVotes = resultSet.getInt("total_votes"); + displayDiscord = resultSet.getBoolean("display_discord"); } catch (SQLException e) { @@ -102,6 +105,7 @@ public class PlayerData .append("- Has Verification: ").append(verification).append("\n") .append("- Coins: ").append(coins).append("\n") .append("- Total Votes: ").append(totalVotes).append("\n") + .append("- Display Discord: ").append(displayDiscord).append("\n") .append("- Tag: ").append(FUtil.colorize(tag)).append(ChatColor.GRAY).append("\n") .append("- Ride Mode: ").append(rideMode).append("\n") .append("- Backup Codes: ").append(backupCodes.size()).append("/10").append("\n"); @@ -239,7 +243,13 @@ public class PlayerData put("coins", coins); put("items", FUtil.listToString(items)); put("total_votes", totalVotes); + put("display_discord", displayDiscord); }}; return map; } + + public boolean doesDisplayDiscord() + { + return displayDiscord; + } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java b/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java index 7345f900..284bcdb8 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java @@ -250,7 +250,10 @@ public class RankManager extends FreedomService // Broadcast login message if (isAdmin || FUtil.isDeveloper(player.getName()) || plugin.pl.getData(player).isMasterBuilder() || plugin.pl.getData(player).isDonator()) { - FUtil.bcastMsg(craftLoginMessage(player, null)); + if (!plugin.al.isVanished(player.getName())) + { + FUtil.bcastMsg(craftLoginMessage(player, null)); + } } // Set display @@ -312,4 +315,4 @@ public class RankManager extends FreedomService team.addPlayer(player); } } -} +} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/shop/Shop.java b/src/main/java/me/totalfreedom/totalfreedommod/shop/Shop.java index 17581ab6..5b355ece 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/shop/Shop.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/shop/Shop.java @@ -1,7 +1,5 @@ package me.totalfreedom.totalfreedommod.shop; -import com.vexsoftware.votifier.model.Vote; -import com.vexsoftware.votifier.model.VotifierEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -21,6 +19,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scheduler.BukkitRunnable; @@ -28,6 +27,7 @@ import org.bukkit.scheduler.BukkitTask; public class Shop extends FreedomService { + private BukkitTask reactions; public String reactionString = ""; public Date reactionStartTime; @@ -116,6 +116,7 @@ public class Shop extends FreedomService Date currentTime = new Date(); long seconds = (currentTime.getTime() - reactionStartTime.getTime()) / 1000; FUtil.bcastMsg(prefix + ChatColor.GREEN + winner + ChatColor.AQUA + " won in " + seconds + " seconds!", false); + startReactionTimer(); return; } @@ -247,6 +248,18 @@ public class Shop extends FreedomService return itemStack; } + public ItemStack getMagicalSaddle() + { + ItemStack itemStack = new ItemStack(Material.SADDLE); + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setDisplayName(ChatColor.DARK_GREEN + "Magical Saddle"); + itemMeta.setLore(Arrays.asList(ChatColor.GREEN + "Ride anything you want...")); + itemMeta.addEnchant(Enchantment.DURABILITY, 1, true); + itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + public boolean canAfford(int price, int coins) { if (coins >= price) diff --git a/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java b/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java index 6eac77c6..3bbcee01 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java @@ -12,17 +12,18 @@ public enum ShopItem FIRE_BALL("Fire Ball", Material.FIRE_CHARGE, 14, ConfigEntry.SHOP_PRICES_FIRE_BALL, ChatColor.RED, "fireBall", "/fireball"), RIDEABLE_PEARL("Rideable Ender Pearl", Material.ENDER_PEARL, 16, ConfigEntry.SHOP_PRICES_RIDEABLE_PEARL, ChatColor.DARK_PURPLE, "rideablePearl", "/rideablepearl"), STACKING_POTATO("Stacking Potato", Material.POTATO, 20, ConfigEntry.SHOP_PRICES_STACKING_POTATO, ChatColor.YELLOW, "stackingPotato", "/stackingpotato"), + MAGICAL_SADDLE("Magical Saddle", Material.SADDLE, 22, ConfigEntry.SHOP_PRICES_MAGICAL_SADDLE, ChatColor.DARK_GREEN, "magicalSaddle", "/magicalsaddle"), CLOWN_FISH("Clown Fish", Material.TROPICAL_FISH, 24, ConfigEntry.SHOP_PRICES_CLOWN_FISH, ChatColor.GOLD, "clownFish", "/clownfish"); /* Shop GUI Layout: Dimensions: 9x4 = 36 - Key: g = Grappling Hook, l = Lightning Rod, f = Fire Ball, r = Rideable Ender Pearl, s = Stacking Potato, c = Clown Fish, $ = Coins} + Key: g = Grappling Hook, l = Lightning Rod, f = Fire Ball, r = Rideable Ender Pearl, s = Stacking Potato, c = Clown Fish, m = Magical Saddle $ = Coins} --------- -g-l-f-r- - --s---c-- + --s-m-c-- --------$ */ diff --git a/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java b/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java index b6d91415..266fbc69 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java @@ -84,7 +84,7 @@ public class SQLite extends FreedomService { try { - connection.createStatement().execute("CREATE TABLE `admins` (`username` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `login_message` VARCHAR, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR, `old_tags` BOOLEAN NOT NULL, `log_stick` BOOLEAN NOT NULL);"); + connection.createStatement().execute("CREATE TABLE `admins` (`username` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `login_message` VARCHAR, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR, `old_tags` BOOLEAN NOT NULL, `log_stick` BOOLEAN NOT NULL, `display_discord` BOOLEAN NOT NULL,);"); } catch (SQLException e) { @@ -272,7 +272,7 @@ public class SQLite extends FreedomService { try { - PreparedStatement statement = connection.prepareStatement("INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + PreparedStatement statement = connection.prepareStatement("INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); statement.setString(1, player.getName()); statement.setString(2, FUtil.listToString(player.getIps())); statement.setString(3, FUtil.listToString(player.getNotes())); @@ -286,6 +286,7 @@ public class SQLite extends FreedomService statement.setInt(11, player.getCoins()); statement.setString(12, FUtil.listToString(player.getItems())); statement.setInt(13, player.getTotalVotes()); + statement.setBoolean(14, player.doesDisplayDiscord()); statement.executeUpdate(); } catch (SQLException e) diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/FLog.java b/src/main/java/me/totalfreedom/totalfreedommod/util/FLog.java index 0be5c19f..b8529720 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/FLog.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/FLog.java @@ -26,6 +26,15 @@ public class FLog log(Level.INFO, ex); } + // Fuck spigot for not using log4j, we would of had a debug log level if they did + public static void debug(String message) + { + if (FUtil.inDeveloperMode()) + { + log(Level.INFO, "\u001B[35m[TotalFreedomMod | DEBUG] " + message + "\u001B[0m", true); + } + } + // Level.WARNING: public static void warning(String message) { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java index 785d49bd..db9b6332 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java @@ -52,10 +52,9 @@ public class FUtil { private static final Random RANDOM = new Random(); - // public static final String SAVED_FLAGS_FILENAME = "savedflags.dat"; // See https://github.com/TotalFreedom/License - None of the listed names may be removed. - public static final List DEVELOPERS = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "supernt"); + public static final List DEVELOPERS = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "supernt", "Telesphoreo", "CoolJWB"); public static String DATE_STORAGE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z"; public static final Map CHAT_COLOR_NAMES = new HashMap<>(); public static final List CHAT_COLOR_POOL = Arrays.asList( @@ -127,6 +126,11 @@ public class FUtil return FUtil.DEVELOPERS.contains(name); } + public static boolean inDeveloperMode() + { + return ConfigEntry.DEVELOPER_MODE.getBoolean(); + } + public static String formatName(String name) { return WordUtils.capitalizeFully(name.replace("_", " ")); @@ -134,11 +138,7 @@ public class FUtil public static String showS(int count) { - if (count == 1) - { - return ""; - } - return "s"; + return (count == 1 ? "" : "s"); } public static List getPlayerList() @@ -146,7 +146,7 @@ public class FUtil List names = new ArrayList<>(); for (Player player : Bukkit.getOnlinePlayers()) { - if (!TotalFreedomMod.plugin().al.vanished.contains(player)) + if (!TotalFreedomMod.plugin().al.isVanished(player.getName())) { names.add(player.getName()); } @@ -173,6 +173,37 @@ public class FUtil return Arrays.asList(string.split(", ")); } + + /** + * A way to get a sublist with a page index and a page size. + * @param list A list of objects that should be split into pages. + * @param size The size of the pages. + * @param index The page index, if outside of bounds error will be thrown. The page index starts at 0 as with all lists. + * @return A list of objects that is the page that has been selected from the previous last parameter. + */ + public static List getPageFromList(List list, int size, int index) + { + try + { + if (size >= list.size()) + { + return list; + } + else if (size * (index + 1) <= list.size()) + { + return list.subList(size * index, size * (index + 1)); + } + else + { + return list.subList(size * index, (size * index) + (list.size() % size)); + } + } + catch (IndexOutOfBoundsException e) + { + return new ArrayList<>(); + } + } + public static List getAllMaterialNames() { List names = new ArrayList<>(); @@ -560,14 +591,17 @@ public class FUtil public static String colorize(String string) { - Matcher matcher = Pattern.compile("&#[a-f0-9A-F]{6}").matcher(string); - while (matcher.find()) + if (string != null) { - String code = matcher.group().replace("&", ""); - string = string.replace("&" + code, net.md_5.bungee.api.ChatColor.of(code) + ""); - } + Matcher matcher = Pattern.compile("&#[a-f0-9A-F]{6}").matcher(string); + while (matcher.find()) + { + String code = matcher.group().replace("&", ""); + string = string.replace("&" + code, net.md_5.bungee.api.ChatColor.of(code) + ""); + } - string = ChatColor.translateAlternateColorCodes('&', string); + string = ChatColor.translateAlternateColorCodes('&', string); + } return string; } @@ -727,6 +761,16 @@ public class FUtil return Color.fromRGB((int) c1values[0], (int) c1values[1], (int) c1values[2]); } + public static boolean isValidIPv4(String ip) + { + if (ip.matches("^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$") + || ip.matches("^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([*])\\.([*])$")) + { + return true; + } + return false; + } + public static List createColorGradient(Color c1, Color c2, int steps) { double factor = 1.0 / (steps - 1.0); @@ -738,6 +782,14 @@ public class FUtil return colors; } + public static boolean colorClose(Color first, Color second, int tresHold) + { + int redDelta = Math.abs(first.getRed() - second.getRed()); + int greenDelta = Math.abs(first.getGreen() - second.getGreen()); + int blueDelta = Math.abs(first.getBlue() - second.getBlue()); + return (redDelta + greenDelta + blueDelta) < tresHold; + } + public static Color fromAWT(java.awt.Color color) { return Color.fromRGB(color.getRed(), color.getGreen(), color.getBlue()); @@ -748,6 +800,21 @@ public class FUtil return new java.awt.Color(color.getRed(), color.getGreen(), color.getBlue()); } + public static java.awt.Color getRandomAWTColor() + { + return new java.awt.Color(randomInteger(0, 255), randomInteger(0, 255), randomInteger(0, 255)); + } + + public static String getHexStringOfAWTColor(java.awt.Color color) + { + String hex = Integer.toHexString(color.getRGB() & 0xFFFFFF); + if (hex.length() < 6) + { + hex = "0" + hex; + } + return "#" + hex; + } + public static void createExplosionOnDelay(Location location, float power, int delay) { new BukkitRunnable() diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java b/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java index 013c1d7a..bef6a17c 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java @@ -3,10 +3,12 @@ package me.totalfreedom.totalfreedommod.util; import java.util.Arrays; import java.util.List; import org.bukkit.Material; +import org.bukkit.block.Biome; import org.bukkit.entity.EntityType; public class Groups { + public static final List WOOL_COLORS = Arrays.asList( Material.WHITE_WOOL, Material.RED_WOOL, @@ -24,6 +26,7 @@ public class Groups Material.GRAY_WOOL, Material.LIGHT_GRAY_WOOL, Material.BLACK_WOOL); + public static final List SHULKER_BOXES = Arrays.asList( Material.SHULKER_BOX, Material.WHITE_SHULKER_BOX, @@ -101,6 +104,7 @@ public class Groups EntityType.WITCH, EntityType.WITHER_SKELETON, EntityType.WOLF, + EntityType.ZOGLIN, EntityType.ZOMBIE, EntityType.ZOMBIE_HORSE, EntityType.ZOMBIFIED_PIGLIN, @@ -138,6 +142,7 @@ public class Groups Material.PARROT_SPAWN_EGG, Material.PHANTOM_SPAWN_EGG, Material.PIG_SPAWN_EGG, + Material.PIGLIN_SPAWN_EGG, Material.PILLAGER_SPAWN_EGG, Material.POLAR_BEAR_SPAWN_EGG, Material.PUFFERFISH_SPAWN_EGG, @@ -164,6 +169,7 @@ public class Groups Material.WITCH_SPAWN_EGG, Material.WITHER_SKELETON_SPAWN_EGG, Material.WOLF_SPAWN_EGG, + Material.ZOGLIN_SPAWN_EGG, Material.ZOMBIE_SPAWN_EGG, Material.ZOMBIE_HORSE_SPAWN_EGG, Material.ZOMBIFIED_PIGLIN_SPAWN_EGG, @@ -203,21 +209,15 @@ public class Groups Material.YELLOW_BANNER, Material.YELLOW_WALL_BANNER); - public static final List BED_COLORS = Arrays.asList( - Material.WHITE_BED, - Material.RED_BED, - Material.ORANGE_BED, - Material.YELLOW_BED, - Material.GREEN_BED, - Material.LIME_BED, - Material.LIGHT_BLUE_BED, - Material.CYAN_BED, - Material.BLUE_BED, - Material.PURPLE_BED, - Material.MAGENTA_BED, - Material.PINK_BED, - Material.BROWN_BED, - Material.GRAY_BED, - Material.LIGHT_GRAY_BED, - Material.BLACK_BED); + public static final List EXPLOSIVE_BED_BIOMES = Arrays.asList( + Biome.NETHER_WASTES, + Biome.CRIMSON_FOREST, + Biome.SOUL_SAND_VALLEY, + Biome.WARPED_FOREST, + Biome.BASALT_DELTAS, + Biome.END_BARRENS, + Biome.END_HIGHLANDS, + Biome.END_MIDLANDS, + Biome.THE_END, + Biome.SMALL_END_ISLANDS); } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/world/AdminWorld.java b/src/main/java/me/totalfreedom/totalfreedommod/world/AdminWorld.java index 4d125792..9a5b0f5b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/world/AdminWorld.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/world/AdminWorld.java @@ -1,14 +1,9 @@ package me.totalfreedom.totalfreedommod.world; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FLog; -import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -17,7 +12,6 @@ import org.bukkit.WorldCreator; import org.bukkit.WorldType; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; @@ -29,10 +23,7 @@ public final class AdminWorld extends CustomWorld private static final String GENERATION_PARAMETERS = ConfigEntry.FLATLANDS_GENERATE_PARAMS.getString(); // private final Map teleportCooldown = new HashMap<>(); - private final Map accessCache = new HashMap<>(); // - private Long cacheLastCleared = null; - private Map guestList = new HashMap<>(); // Guest, Supervisor private WorldWeather weather = WorldWeather.OFF; private WorldTime time = WorldTime.INHERIT; @@ -44,11 +35,6 @@ public final class AdminWorld extends CustomWorld @Override public void sendToWorld(Player player) { - if (!canAccessWorld(player)) - { - return; - } - super.sendToWorld(player); } @@ -83,78 +69,6 @@ public final class AdminWorld extends CustomWorld return world; } - public boolean addGuest(Player guest, Player supervisor) - { - if (guest == supervisor || plugin.al.isAdmin(guest)) - { - return false; - } - - if (plugin.al.isAdmin(supervisor)) - { - guestList.put(guest, supervisor); - wipeAccessCache(); - return true; - } - - return false; - } - - public Player removeGuest(Player guest) - { - final Player player = guestList.remove(guest); - wipeAccessCache(); - return player; - } - - public List getGuestList() - { - List guests = new ArrayList<>(); - for (Player guest : guestList.keySet()) - { - guests.add(guest.getName()); - } - return guests; - } - - public Player removeGuest(String partialName) - { - partialName = partialName.toLowerCase(); - final Iterator it = guestList.keySet().iterator(); - - while (it.hasNext()) - { - final Player player = it.next(); - if (player.getName().toLowerCase().contains(partialName)) - { - removeGuest(player); - return player; - } - } - - return null; - } - - public String guestListToString() - { - final List output = new ArrayList<>(); - final Iterator> it = guestList.entrySet().iterator(); - while (it.hasNext()) - { - final Entry entry = it.next(); - final Player player = entry.getKey(); - final Player supervisor = entry.getValue(); - output.add(player.getName() + " (Supervisor: " + supervisor.getName() + ")"); - } - return StringUtils.join(output, ", "); - } - - public void purgeGuestList() - { - guestList.clear(); - wipeAccessCache(); - } - public boolean validateMovement(PlayerMoveEvent event) { World world; @@ -173,10 +87,6 @@ public final class AdminWorld extends CustomWorld } final Player player = event.getPlayer(); - if (canAccessWorld(player)) - { - return true; - } Long lastTP = teleportCooldown.get(player); @@ -190,40 +100,6 @@ public final class AdminWorld extends CustomWorld return false; } - public void wipeAccessCache() - { - cacheLastCleared = System.currentTimeMillis(); - accessCache.clear(); - } - - public boolean canAccessWorld(final Player player) - { - long currentTimeMillis = System.currentTimeMillis(); - if (cacheLastCleared == null || cacheLastCleared.longValue() + CACHE_CLEAR_FREQUENCY <= currentTimeMillis) - { - cacheLastCleared = currentTimeMillis; - accessCache.clear(); - } - - Boolean cached = accessCache.get(player); - if (cached == null) - { - boolean canAccess = plugin.al.isAdmin(player); - if (!canAccess) - { - Player supervisor = guestList.get(player); - canAccess = supervisor != null && supervisor.isOnline() && plugin.al.isAdmin(supervisor); - if (!canAccess) - { - guestList.remove(player); - } - } - cached = canAccess; - accessCache.put(player, cached); - } - return cached; - } - public WorldWeather getWeatherMode() { return weather; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/world/WorldManager.java b/src/main/java/me/totalfreedom/totalfreedommod/world/WorldManager.java index 57c759fd..61a95871 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/world/WorldManager.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/world/WorldManager.java @@ -63,40 +63,6 @@ public class WorldManager extends FreedomService hubworld.getWorld().save(); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onPlayerTeleport(PlayerTeleportEvent event) - { - final Player player = event.getPlayer(); - final FPlayer fPlayer = plugin.pl.getPlayer(player); - if (!plugin.al.isAdmin(player) && fPlayer.getFreezeData().isFrozen()) - { - return; // Don't process adminworld validation - } - - adminworld.validateMovement(event); - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onPlayerMove(PlayerMoveEvent event) - { - final Location from = event.getFrom(); - final Location to = event.getTo(); - - try - { - if (from.getWorld() == to.getWorld() && from.distanceSquared(to) < (0.0002 * 0.0002)) - { - // If player just rotated, but didn't move, don't process this event. - return; - } - } - catch (IllegalArgumentException ex) - { - } - - adminworld.validateMovement(event); - } - @EventHandler(priority = EventPriority.HIGH) public void onThunderChange(ThunderChangeEvent event) { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/world/WorldRestrictions.java b/src/main/java/me/totalfreedom/totalfreedommod/world/WorldRestrictions.java index 9ced82fa..73d69d81 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/world/WorldRestrictions.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/world/WorldRestrictions.java @@ -60,6 +60,11 @@ public class WorldRestrictions extends FreedomService } } + if (!plugin.al.isAdmin(player) && player.getWorld().equals(plugin.wm.adminworld.getWorld())) + { + return true; + } + return false; } @@ -131,15 +136,17 @@ public class WorldRestrictions extends FreedomService for obtaining a list of a plugin's commands are returning null for world edit. */ String command = event.getMessage().split("\\s+")[0].substring(1, event.getMessage().split("\\s+")[0].length()).toLowerCase(); + String allowed = player.getWorld().equals(plugin.wm.adminworld.getWorld()) ? "Admins" : "Master Builders"; + if (command.startsWith("/") || BLOCKED_WORLDEDIT_COMMANDS.contains(command)) { - player.sendMessage(ChatColor.RED + "Only Master Builders are allowed to use WorldEdit here."); + player.sendMessage(ChatColor.RED + "Only " + allowed + " are allowed to use WorldEdit here."); event.setCancelled(true); } if (command.equals("coreprotect") || command.equals("core") || command.equals("co")) { - player.sendMessage(ChatColor.RED + "Only Master Builders are allowed to use CoreProtect here."); + player.sendMessage(ChatColor.RED + "Only " + allowed + " are allowed to use CoreProtect here."); event.setCancelled(true); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2615457a..ec06bb09 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -124,6 +124,7 @@ shop: rideable_pearl: 700 stacking_potato: 300 clown_fish: 1500 + magical_saddle: 250 # Admin list adminlist: @@ -485,3 +486,6 @@ autokick: # Blocked Chat Codes - Use &code,&code2,&code3 (No spaces) blocked_chatcodes: '&0,&k,&m,&n' + +# Enables certain things like debug logs and console bypasses +developer_mode: false diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6dde1542..b3400b4f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -2,6 +2,6 @@ name: TotalFreedomMod main: me.totalfreedom.totalfreedommod.TotalFreedomMod version: ${project.version} description: Plugin for the Total Freedom server. -softdepend: [BukkitTelnet, Essentials, LibsDisguises, WorldEdit] +softdepend: [BukkitTelnet, Essentials, LibsDisguises, WorldEdit, WorldGuard, WorldGuardExtraFlags, TFGuilds] authors: [Madgeek1450, Prozza] -api-version: 1.15 +api-version: 1.16 \ No newline at end of file