diff --git a/.github/workflows/java17-maven.yml b/.github/workflows/java17-maven.yml new file mode 100644 index 00000000..43d090ab --- /dev/null +++ b/.github/workflows/java17-maven.yml @@ -0,0 +1,21 @@ +name: Java17-Maven-Build + +on: [push] + +jobs: + build-java-17: + + runs-on: ubuntu-latest + + steps: + # Checkout the code + - uses: actions/checkout@v1 + + # Java 16 Builds + - name: Set up JDK 17 + uses: actions/setup-java@v2.3.0 + with: + java-version: 17 + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml diff --git a/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java b/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java index 015cb064..64700e61 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java @@ -19,6 +19,7 @@ import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; public class LoginProcess extends FreedomService { @@ -190,6 +191,22 @@ public class LoginProcess extends FreedomService final FPlayer fPlayer = plugin.pl.getPlayer(player); final PlayerData playerData = plugin.pl.getData(player); + // Sends a message to the player if they have never joined before (or simply lack player data). + if (!event.getPlayer().hasPlayedBefore() && ConfigEntry.FIRST_JOIN_INFO_ENABLED.getBoolean()) + { + new BukkitRunnable() + { + @Override + public void run() + { + for (String line : ConfigEntry.FIRST_JOIN_INFO.getStringList()) + { + player.sendMessage(FUtil.colorize(line)); + } + } + }.runTaskLater(plugin, 20); + } + player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60); player.setOp(true); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java b/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java index 217adb33..e2b621af 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java @@ -2,6 +2,7 @@ package me.totalfreedom.totalfreedommod; import com.google.common.collect.Multimap; import io.papermc.lib.PaperLib; + import java.util.Collection; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java b/src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java deleted file mode 100644 index a86320fa..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java +++ /dev/null @@ -1,98 +0,0 @@ -package me.totalfreedom.totalfreedommod; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.HashMap; -import java.util.Map; -import me.totalfreedom.totalfreedommod.util.FLog; -import static me.totalfreedom.totalfreedommod.util.FUtil.SAVED_FLAGS_FILENAME; - -public class SavedFlags extends FreedomService -{ - @Override - public void onStart() - { - } - - @Override - public void onStop() - { - } - - @SuppressWarnings("unchecked") - public Map getSavedFlags() - { - Map flags = null; - File input = new File(TotalFreedomMod.getPlugin().getDataFolder(), SAVED_FLAGS_FILENAME); - - if (input.exists()) - { - try - { - try (FileInputStream fis = new FileInputStream(input); ObjectInputStream ois = new ObjectInputStream(fis)) - { - flags = (HashMap)ois.readObject(); - } - } - catch (Exception ex) - { - FLog.severe(ex); - } - } - - return flags; - } - - public boolean getSavedFlag(String flag) throws Exception - { - Boolean flagValue = null; - - Map flags = getSavedFlags(); - - if (flags != null) - { - if (flags.containsKey(flag)) - { - flagValue = flags.get(flag); - } - } - - if (flagValue != null) - { - return flagValue; - } - else - { - throw new Exception(); - } - } - - public void setSavedFlag(String flag, boolean value) - { - Map flags = getSavedFlags(); - - if (flags == null) - { - flags = new HashMap<>(); - } - - flags.put(flag, value); - - try - { - final FileOutputStream fos = new FileOutputStream(new File(plugin.getDataFolder(), SAVED_FLAGS_FILENAME)); - final ObjectOutputStream oos = new ObjectOutputStream(fos); - oos.writeObject(flags); - oos.close(); - fos.close(); - } - catch (Exception ex) - { - FLog.severe(ex); - } - } - -} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/ServerInterface.java b/src/main/java/me/totalfreedom/totalfreedommod/ServerInterface.java index 84e68117..3821a949 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/ServerInterface.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/ServerInterface.java @@ -1,16 +1,17 @@ package me.totalfreedom.totalfreedommod; -import java.util.Collections; +import java.util.Arrays; import java.util.List; -import java.util.Set; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; +import net.minecraft.server.level.EntityPlayer; +import net.minecraft.server.MinecraftServer; import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; +import org.bukkit.craftbukkit.v1_17_R1.CraftServer; public class ServerInterface extends FreedomService { - public static final String COMPILE_NMS_VERSION = "v1_18_R1"; + public static final String COMPILE_NMS_VERSION = "v1_17_R1"; public static void warnVersion() { @@ -35,16 +36,16 @@ public class ServerInterface extends FreedomService public int purgeWhitelist() { - Set whitelisted = Bukkit.getWhitelistedPlayers(); - int size = whitelisted.size(); - for (OfflinePlayer player : Bukkit.getWhitelistedPlayers()) + String[] whitelisted = getServer().getPlayerList().getWhitelisted(); + int size = whitelisted.length; + for (EntityPlayer player : getServer().getPlayerList().getPlayers()) { - Bukkit.getServer().getWhitelistedPlayers().remove(player); + getServer().getPlayerList().getWhitelist().remove(player.getProfile()); } try { - Bukkit.reloadWhitelist(); + getServer().getPlayerList().getWhitelist().save(); } catch (Exception ex) { @@ -56,16 +57,22 @@ public class ServerInterface extends FreedomService public boolean isWhitelisted() { - return Bukkit.getServer().hasWhitelist(); + return getServer().getPlayerList().getHasWhitelist(); } public List getWhitelisted() { - return Collections.singletonList(Bukkit.getWhitelistedPlayers()); + return Arrays.asList(getServer().getPlayerList().getWhitelisted()); } public String getVersion() { - return Bukkit.getVersion(); + return getServer().getVersion(); } + + private MinecraftServer getServer() + { + return ((CraftServer)Bukkit.getServer()).getServer(); + } + } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java index d3c65197..784eee36 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java @@ -76,7 +76,6 @@ public class TotalFreedomMod extends JavaPlugin public CommandLoader cl; // Services public ServerInterface si; - public SavedFlags sf; public WorldManager wm; public LogViewer lv; public AdminList al; @@ -187,7 +186,6 @@ public class TotalFreedomMod extends JavaPlugin fsh = new FreedomServiceHandler(); config = new MainConfig(); - config.load(); if (FUtil.inDeveloperMode()) { @@ -299,7 +297,6 @@ public class TotalFreedomMod extends JavaPlugin { // Start services si = new ServerInterface(); - sf = new SavedFlags(); wm = new WorldManager(); lv = new LogViewer(); sql = new SQLite(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/blocking/SignBlocker.java b/src/main/java/me/totalfreedom/totalfreedommod/blocking/SignBlocker.java index 03b3638f..3fabc837 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/blocking/SignBlocker.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/blocking/SignBlocker.java @@ -4,7 +4,7 @@ import me.totalfreedom.totalfreedommod.FreedomService; import net.minecraft.nbt.NBTTagCompound; import org.bukkit.ChatColor; import org.bukkit.Tag; -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -27,22 +27,22 @@ public class SignBlocker extends FreedomService { } - /* @EventHandler(priority = EventPriority.NORMAL) public void onPlayerPlaceBlock(BlockPlaceEvent event) { + final Player player = event.getPlayer(); if (Tag.SIGNS.getValues().contains(event.getBlock().getType())) { ItemStack sign = event.getItemInHand(); net.minecraft.world.item.ItemStack nmsSign = CraftItemStack.asNMSCopy(sign); - NBTTagCompound compound = (nmsSign.b()) ? nmsSign.s() : new NBTTagCompound(); + NBTTagCompound compound = (nmsSign.hasTag()) ? nmsSign.getTag() : new NBTTagCompound(); assert compound != null; - NBTTagCompound bet = compound.p("BlockEntityTag"); - String line1 = bet.l("Text1"); - String line2 = bet.l("Text2"); - String line3 = bet.l("Text3"); - String line4 = bet.l("Text4"); + NBTTagCompound bet = compound.getCompound("BlockEntityTag"); + String line1 = bet.getString("Text1"); + String line2 = bet.getString("Text2"); + String line3 = bet.getString("Text3"); + String line4 = bet.getString("Text4"); if (line1.contains("run_command") || line2.contains("run_command") || line3.contains("run_command") || line4.contains("run_command")) { player.sendMessage(ChatColor.GRAY + "You are not allowed to place command signs."); @@ -50,7 +50,6 @@ public class SignBlocker extends FreedomService } } } - */ @EventHandler(priority = EventPriority.LOWEST) public void onPlayerInteractSign(PlayerInteractEvent event) diff --git a/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java b/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java index 74210100..2653c8ef 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java @@ -1,11 +1,7 @@ package me.totalfreedom.totalfreedommod.bridge; import java.io.File; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.sql.*; import java.text.DecimalFormat; import java.util.Arrays; import java.util.Collections; @@ -196,7 +192,6 @@ public class CoreProtectBridge extends FreedomService return (megabytes / 1024); } - // Wipes DB for the specified world public void clearDatabase(World world) { clearDatabase(world, false); @@ -264,12 +259,6 @@ public class CoreProtectBridge extends FreedomService { FLog.warning("Failed to delete the CoreProtect data for the " + world.getName()); } - - // This exits for flatlands wipes - if (shutdown) - { - server.shutdown(); - } } @EventHandler(priority = EventPriority.MONITOR) @@ -280,27 +269,30 @@ public class CoreProtectBridge extends FreedomService Block block = event.getClickedBlock(); final CoreProtectAPI coreProtect = getCoreProtectAPI(); + // TODO: Rewrite this if (data.hasInspection()) { + int cooldownTime = 3; + + // Cooldown check + if ((event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK) + && cooldown.containsKey(player.getName())) + { + long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime); + if (secondsLeft > 0L) + { + event.setCancelled(true); + player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query."); + return; + } + } + + // Actual lookup time if (event.getAction() == Action.LEFT_CLICK_BLOCK) { if (block != null) { event.setCancelled(true); - - int cooldownTime = 3; - - if (cooldown.containsKey(player.getName())) - { - long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime); - if (secondsLeft > 0L) - { - event.setCancelled(true); - player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query."); - return; - } - } - List lookup = coreProtect.blockLookup(block, -1); if (!plugin.al.isAdmin(player)) @@ -320,8 +312,8 @@ public class CoreProtectBridge extends FreedomService HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10)); FUtil.PaginationList paged = HISTORY_MAP.get(event.getPlayer()); - player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " - + ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")"); + player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " + + ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")"); for (String[] value : lookup) { @@ -351,8 +343,8 @@ public class CoreProtectBridge extends FreedomService int time = (int)(System.currentTimeMillis() / 1000L); - paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") - + st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase()); + paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") + + st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase()); } List page = paged.getPage(1); @@ -369,91 +361,75 @@ public class CoreProtectBridge extends FreedomService { if (block != null) { - if (data.hasInspection()) - { - BlockState blockState = block.getRelative(event.getBlockFace()).getState(); - Block placedBlock = blockState.getBlock(); - event.setCancelled(true); - List lookup = coreProtect.blockLookup(placedBlock, -1); + BlockState blockState = block.getRelative(event.getBlockFace()).getState(); + Block placedBlock = blockState.getBlock(); + event.setCancelled(true); + List lookup = coreProtect.blockLookup(placedBlock, -1); + if (lookup.isEmpty()) + { + lookup = coreProtect.blockLookup(block, -1); + } + + if (!plugin.al.isAdmin(player)) + { + cooldown.put(player.getName(), System.currentTimeMillis()); + } + + if (lookup != null) + { if (lookup.isEmpty()) { - lookup = coreProtect.blockLookup(block, -1); + player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location"); + return; } - int cooldownTime = 3; + HISTORY_MAP.remove(event.getPlayer()); + HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10)); + FUtil.PaginationList paged = HISTORY_MAP.get(event.getPlayer()); - if (cooldown.containsKey(player.getName())) + player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " + + ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")"); + + for (String[] value : lookup) { - long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime); - if (secondsLeft > 0L) + CoreProtectAPI.ParseResult result = coreProtect.parseResult(value); + BlockData bl = result.getBlockData(); + + String s; + String st = ""; + + if (result.getActionString().equals("Placement")) { - event.setCancelled(true); - player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query."); - return; + s = " placed "; } + else if (result.getActionString().equals("Removal")) + { + s = " broke "; + } + else + { + s = " interacted with "; + } + + if (result.isRolledBack()) + { + st += "§m"; + } + + int time = (int)(System.currentTimeMillis() / 1000L); + + paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") + + st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase()); } - if (!plugin.al.isAdmin(player)) + List page = paged.getPage(1); + for (String entries : page) { - cooldown.put(player.getName(), System.currentTimeMillis()); + player.sendMessage(entries); } - if (lookup != null) - { - if (lookup.isEmpty()) - { - player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location"); - return; - } - - HISTORY_MAP.remove(event.getPlayer()); - HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10)); - FUtil.PaginationList paged = HISTORY_MAP.get(event.getPlayer()); - - player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " - + ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")"); - - for (String[] value : lookup) - { - CoreProtectAPI.ParseResult result = coreProtect.parseResult(value); - BlockData bl = result.getBlockData(); - - String s; - String st = ""; - - if (result.getActionString().equals("Placement")) - { - s = " placed "; - } - else if (result.getActionString().equals("Removal")) - { - s = " broke "; - } - else - { - s = " interacted with "; - } - - if (result.isRolledBack()) - { - st += "§m"; - } - - int time = (int)(System.currentTimeMillis() / 1000L); - - paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") - + st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase()); - } - - List page = paged.getPage(1); - for (String entries : page) - { - player.sendMessage(entries); - } - - player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history "); - } + player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history "); } } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/bridge/WorldGuardBridge.java b/src/main/java/me/totalfreedom/totalfreedommod/bridge/WorldGuardBridge.java index 6bc0ab9b..ea03b670 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/bridge/WorldGuardBridge.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/bridge/WorldGuardBridge.java @@ -1,13 +1,20 @@ package me.totalfreedom.totalfreedommod.bridge; import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.util.Location; +import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.flags.Flags; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; import java.util.Map; + +import com.sk89q.worldguard.protection.regions.RegionQuery; import me.totalfreedom.totalfreedommod.FreedomService; import org.bukkit.World; +import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; public class WorldGuardBridge extends FreedomService @@ -23,6 +30,16 @@ public class WorldGuardBridge extends FreedomService { } + public boolean canEditCurrentWorld(Player player) + { + LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player); + + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + + return query.testBuild(localPlayer.getLocation(), localPlayer); + } + public RegionManager getRegionManager(World world) { RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java index c6b38381..2b0c7cc4 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java @@ -1,8 +1,8 @@ package me.totalfreedom.totalfreedommod.command; -import java.util.ArrayList; -import java.util.List; import java.util.Objects; + +import com.earth2me.essentials.User; import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.punishments.Punishment; @@ -60,28 +60,39 @@ public class Command_ban extends FreedomCommand } final String username; - final List ips = new ArrayList<>(); + final String ip; final Player player = getPlayer(args[0]); if (player == null) { - final PlayerData entry = plugin.pl.getData(args[0]); - - if (entry == null) + // Gets the IP using Essentials data if available + if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null) { - msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly."); - return true; + User essUser = plugin.esb.getEssentialsUser(args[0]); + // + username = essUser.getName(); + ip = essUser.getLastLoginAddress(); + } + // Last resort - Getting the first result from the username itself + else + { + PlayerData entry = plugin.pl.getData(args[0]); + if (entry == null) + { + msg(PLAYER_NOT_FOUND); + return true; + } + else + { + username = entry.getName(); + ip = entry.getIps().get(0); + } } - - username = entry.getName(); - ips.addAll(entry.getIps()); } else { - final PlayerData entry = plugin.pl.getData(player); username = player.getName(); - //ips.addAll(entry.getIps());/ - ips.add(FUtil.getIp(player)); + ip = FUtil.getIp(player); // Deop player.setOp(false); @@ -126,7 +137,6 @@ public class Command_ban extends FreedomCommand // Ban player Ban ban; - if (player != null) { ban = Ban.forPlayer(player, sender, null, reason); @@ -135,12 +145,8 @@ public class Command_ban extends FreedomCommand { ban = Ban.forPlayerName(username, sender, null, reason); } + ban.addIp(ip); - for (String ip : ips) - { - ban.addIp(ip); - ban.addIp(FUtil.getFuzzyIp(ip)); - } plugin.bm.addBan(ban); @@ -154,7 +160,7 @@ public class Command_ban extends FreedomCommand { bcast.append(" - Reason: ").append(ChatColor.YELLOW).append(reason); } - msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + StringUtils.join(ips, ", ")); + msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + ip); FUtil.adminAction(sender.getName(), bcast.toString(), true); } @@ -172,7 +178,7 @@ public class Command_ban extends FreedomCommand } // Log ban - plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.BAN, reason)); + plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.BAN, reason)); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java index f50b8985..3d0a812d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java @@ -9,8 +9,11 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.ArrayList; +import java.util.List; + @CommandPermissions(level = Rank.OP, source = SourceType.BOTH) -@CommandParameters(description = "Shows the amount of coins you have or another player has", usage = "/ [playername]") +@CommandParameters(description = "Shows the amount of coins you or another player has. Also allows you to give coins to other players.", usage = "/ [player] | pay ") public class Command_coins extends FreedomCommand { @Override @@ -21,34 +24,119 @@ public class Command_coins extends FreedomCommand msg("The shop is currently disabled!", ChatColor.RED); return true; } - Player p; + final String prefix = FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString() + " "); - if (args.length > 0) + + switch (args.length) { - if (getPlayer(args[0]) != null) + // Mode for seeing how many coins the sender has (doesn't work from console) + case 0: { - p = getPlayer(args[0]); - } - else - { - msg(PLAYER_NOT_FOUND); + if (senderIsConsole) + { + msg("When used from the console, you must define a target player."); + } + else + { + PlayerData playerData = getData(playerSender); + msg(prefix + ChatColor.GREEN + "You have " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + + " coins."); + } return true; } - } - else - { - if (senderIsConsole) + + // Mode for seeing how many coins a player has. + case 1: { - msg(prefix + ChatColor.RED + "You are not a player, use /coins "); + Player target = getPlayer(args[0]); + + if (target == null) + { + msg(PLAYER_NOT_FOUND); + } + else + { + PlayerData playerData = getData(target); + msg(prefix + ChatColor.GREEN + target.getName() + " has " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + " coins."); + } return true; } - else + + // Mode for paying another player coins + case 3: { - p = playerSender; + if (args[0].equalsIgnoreCase("pay")) + { + checkPlayer(); + + final Player target = getPlayer(args[1]); + final PlayerData senderData = getData(playerSender); + + int coinsToTransfer; + + // Processes args[2] + try + { + // Prevents players from trying to be cheeky with negative numbers. + coinsToTransfer = Math.max(Math.abs(Integer.parseInt(args[2])), 1); + } + catch (NumberFormatException ex) + { + msg("Invalid number: " + args[2], ChatColor.RED); + return true; + } + + // Prevents players from performing transactions they can't afford to do. + if (senderData.getCoins() < coinsToTransfer) + { + msg("You don't have enough coins to perform this transaction.", ChatColor.RED); + return true; + } + + if (target == null) + { + msg(PLAYER_NOT_FOUND); + } + else + { + PlayerData playerData = getData(target); + playerData.setCoins(playerData.getCoins() + coinsToTransfer); + senderData.setCoins(senderData.getCoins() - coinsToTransfer); + + msg(target, sender.getName() + + ChatColor.GREEN + " has given you " + + ChatColor.GOLD + coinsToTransfer + + ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "") + "!", ChatColor.GOLD); + + msg("You have given " + + ChatColor.GOLD + coinsToTransfer + + ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "") + + " to " + ChatColor.GOLD + target.getName() + ChatColor.GREEN + ".", ChatColor.GREEN); + } + + return true; + } + } + + default: + { + return false; } } - PlayerData playerData = plugin.pl.getData(p); - msg(prefix + ChatColor.GREEN + (args.length > 0 ? p.getName() + " has " : "You have ") + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + " coins."); - return true; + } + + @Override + public List getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args) + { + if (args.length == 1) + { + List options = new ArrayList<>(FUtil.getPlayerList()); + + options.add("pay"); + + return options; + } + + return FUtil.getPlayerList(); } } \ 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 d6711948..8e6f4187 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java @@ -1,6 +1,5 @@ package me.totalfreedom.totalfreedommod.command; -import java.util.Objects; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.config.ConfigEntry; @@ -43,7 +42,7 @@ public class Command_doom extends FreedomCommand FUtil.adminAction(sender.getName(), "Casting oblivion over " + player.getName(), true); FUtil.bcastMsg(player.getName() + " will be completely obliviated!", ChatColor.RED); - final String ip = Objects.requireNonNull(player.getAddress()).getAddress().getHostAddress().trim(); + final String ip = FUtil.getIp(player); // Remove from admin Admin admin = getAdmin(player); @@ -76,10 +75,7 @@ public class Command_doom extends FreedomCommand // Ban player Ban ban = Ban.forPlayer(player, sender); ban.setReason((reason == null ? "FUCKOFF" : reason)); - for (String playerIp : plugin.pl.getData(player).getIps()) - { - ban.addIp(playerIp); - } + ban.addIp(ip); plugin.bm.addBan(ban); // Set gamemode to survival diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_eject.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_eject.java index 9c72b8ad..693ae101 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_eject.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_eject.java @@ -1,40 +1,50 @@ package me.totalfreedom.totalfreedommod.command; -import java.util.ArrayList; -import java.util.List; import me.totalfreedom.totalfreedommod.rank.Rank; -import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) -@CommandParameters(description = "Eject players that are riding you.", usage = "/") +@CommandParameters(description = "Eject any entities that are riding you.", usage = "/") public class Command_eject extends FreedomCommand { + /* Player.getShoulderEntityLeft() and Player.getShoulderEntityRight() are deprecated, however unless + Player.getPassengers() also includes shoulders (which isn't likely, given the official documentation doesn't + state an alternative method to use instead), these methods will continue to be used here. */ + @SuppressWarnings("deprecation") @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { + // Uses the size of the return value of Player.getPassengers() as the starting number of entities ejected + int count = playerSender.getPassengers().size(); - List names = new ArrayList<>(); - - for (Entity entity : playerSender.getPassengers()) + // Removes any entities from the sender's shoulders + if (playerSender.getShoulderEntityLeft() != null) { - names.add(entity.getName()); + playerSender.setShoulderEntityLeft(null); + count++; + } + if (playerSender.getShoulderEntityRight() != null) + { + playerSender.setShoulderEntityLeft(null); + count++; } - if (names.isEmpty()) + // Removes anything riding the sender + playerSender.eject(); + + if (count != 0) + { + msg(count + " entit" + (count == 1 ? "y was" : "ies were") + " ejected.", ChatColor.GREEN); + } + else { msg("Nothing was ejected.", ChatColor.GREEN); - return true; } - msg("Ejecting " + StringUtils.join(names, ", ") + ".", ChatColor.GREEN); - playerSender.eject(); - return true; } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_makeopregion.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_makeopregion.java deleted file mode 100644 index 7cf2334f..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_makeopregion.java +++ /dev/null @@ -1,96 +0,0 @@ -package me.totalfreedom.totalfreedommod.command; - -import com.sk89q.worldedit.IncompleteRegionException; -import com.sk89q.worldedit.LocalSession; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldguard.domains.DefaultDomain; -import com.sk89q.worldguard.protection.flags.Flag; -import com.sk89q.worldguard.protection.flags.Flags; -import com.sk89q.worldguard.protection.flags.RegionGroup; -import com.sk89q.worldguard.protection.flags.StateFlag; -import com.sk89q.worldguard.protection.managers.RegionManager; -import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; -import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import java.util.HashMap; -import java.util.Map; -import me.totalfreedom.totalfreedommod.rank.Rank; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_IN_GAME) -@CommandParameters(description = "Make a WorldGuard region for an OP.", usage = "/ ", aliases = "mor") -public class Command_makeopregion extends FreedomCommand -{ - - final Map, Object> flags = new HashMap, Object>() - {{ - put(Flags.BLOCK_PLACE, StateFlag.State.ALLOW); - put(Flags.BLOCK_BREAK, StateFlag.State.ALLOW); - put(Flags.BUILD, StateFlag.State.ALLOW); - put(Flags.PLACE_VEHICLE, StateFlag.State.ALLOW); - put(Flags.DESTROY_VEHICLE, StateFlag.State.ALLOW); - put(Flags.ENTITY_ITEM_FRAME_DESTROY, StateFlag.State.ALLOW); - put(Flags.ENTITY_PAINTING_DESTROY, StateFlag.State.ALLOW); - put(net.goldtreeservers.worldguardextraflags.flags.Flags.WORLDEDIT, StateFlag.State.ALLOW); - }}; - - public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole) - { - if (args.length < 2) - { - return false; - } - - final Player player = getPlayer(args[0]); - - if (player == null) - { - msg(FreedomCommand.PLAYER_NOT_FOUND); - return true; - } - - String name = args[1]; - - LocalSession session = plugin.web.getWorldEditPlugin().getSession(playerSender); - - Region selection; - - try - { - selection = session.getSelection(session.getSelectionWorld()); - } - catch (IncompleteRegionException e) - { - msg("Please make a WorldEdit selection", ChatColor.RED); - return true; - } - - if (selection == null) - { - msg("Please make a WorldEdit selection", ChatColor.RED); - return true; - } - - ProtectedRegion region = new ProtectedCuboidRegion(name, selection.getMinimumPoint(), selection.getMaximumPoint()); - - DefaultDomain owners = new DefaultDomain(); - owners.addPlayer(playerSender.getName()); - owners.addPlayer(player.getName()); - region.setOwners(owners); - region.setFlags(flags); - - for (Flag flag : flags.keySet()) - { - region.setFlag(flag.getRegionGroupFlag(), RegionGroup.MEMBERS); - } - - RegionManager regionManager = plugin.wgb.getRegionManager(playerSender.getWorld()); - - regionManager.addRegion(region); - - msg("Successfully created the region '" + name + "' for " + player.getName(), ChatColor.GREEN); - return true; - } -} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_modifyitem.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_modifyitem.java index 1d76101b..4ba7ab88 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_modifyitem.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_modifyitem.java @@ -1,4 +1,4 @@ -/*package me.totalfreedom.totalfreedommod.command; +package me.totalfreedom.totalfreedommod.command; import java.util.ArrayList; import java.util.List; @@ -11,7 +11,7 @@ import org.apache.commons.lang.StringUtils; import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -23,6 +23,7 @@ import org.bukkit.potion.PotionEffectType; @CommandParameters(description = "Modify the current item you are holding.", usage = "/ | lore | enchant | potion | attribute | clear>", aliases = "mi") public class Command_modifyitem extends FreedomCommand { + @SuppressWarnings("deprecation") @Override public boolean run(final CommandSender sender, final Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) @@ -263,4 +264,3 @@ public class Command_modifyitem 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 0ce530d4..e66c0c73 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java @@ -130,17 +130,19 @@ public class Command_mute extends FreedomCommand { playerdata.setMuted(true); player.sendTitle(ChatColor.RED + "You've been muted.", ChatColor.YELLOW + "Be sure to follow the rules!", 20, 100, 60); + + if (quiet) + { + msg("Muted " + player.getName() + " quietly"); + return true; // doesn't announce reason + } + + FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true); + if (reason != null) { msg(player, ChatColor.RED + "Reason: " + ChatColor.YELLOW + reason); } - if (quiet) - { - msg("Muted " + player.getName() + " quietly"); - return true; - } - - FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true); if (smite) { @@ -178,4 +180,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_opall.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java index a02671cc..45ff1689 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java @@ -24,6 +24,10 @@ public class Command_opall extends FreedomCommand msg(player, YOU_ARE_OP); plugin.rm.updateDisplay(player); } + else + { + player.recalculatePermissions(); + } } return true; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_releaseparrots.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_releaseparrots.java deleted file mode 100644 index 16a25106..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_releaseparrots.java +++ /dev/null @@ -1,41 +0,0 @@ -package me.totalfreedom.totalfreedommod.command; - -import me.totalfreedom.totalfreedommod.rank.Rank; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; - -@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) -@CommandParameters(description = "Release parrots from your shoulders.", usage = "/", aliases = "removeparrots") -public class Command_releaseparrots extends FreedomCommand -{ - - @SuppressWarnings("deprecation") - @Override - public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) - { - Entity leftShoulderEntity = playerSender.getShoulderEntityLeft(); - Entity rightShoulderEntity = playerSender.getShoulderEntityRight(); - - if (rightShoulderEntity == null && leftShoulderEntity == null) - { - msg("No parrots were detected on either of your shoulders."); - return true; - } - - if (leftShoulderEntity != null && leftShoulderEntity.getType().equals(EntityType.PARROT)) - { - playerSender.setShoulderEntityLeft(null); - msg("Removed the parrot on your left shoulder."); - } - - if (rightShoulderEntity != null && rightShoulderEntity.getType().equals(EntityType.PARROT)) - { - playerSender.setShoulderEntityRight(null); - msg("Removed the parrot on your right shoulder."); - } - return true; - } -} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlevel.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlevel.java deleted file mode 100644 index 551c09d4..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlevel.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.totalfreedom.totalfreedommod.command; - -import me.totalfreedom.totalfreedommod.rank.Rank; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) -@CommandParameters(description = "Sets your experience level (XP).", usage = "/ [level]") -public class Command_setlevel extends FreedomCommand -{ - - @Override - public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) - { - if (args.length != 1) - { - return false; - } - - int new_level; - - try - { - new_level = Integer.parseInt(args[0]); - - if (new_level < 0) - { - new_level = 0; - } - else if (new_level > 50) - { - new_level = 50; - } - } - catch (NumberFormatException ex) - { - msg("Invalid level.", ChatColor.RED); - return true; - } - - playerSender.setLevel(new_level); - - msg("Your XP level is now set to " + ChatColor.GOLD + new_level); - - return true; - } -} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java index 5306ceda..2ef26e69 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java @@ -1,6 +1,8 @@ package me.totalfreedom.totalfreedommod.command; import java.util.List; + +import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.rank.Rank; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.EnumUtils; @@ -55,6 +57,7 @@ public class Command_spawnmob extends FreedomCommand return true; } + int max = ConfigEntry.SPAWNMOB_MAX.getInteger(); int amount = 1; if (args.length > 1) { @@ -69,9 +72,9 @@ public class Command_spawnmob extends FreedomCommand } } - if (amount > 10 || amount < 1) + if (amount > max || amount < 1) { - msg("Invalid amount: " + args[1] + ". Must be 1-10.", ChatColor.RED); + msg("Invalid amount: " + args[1] + ". Must be 1-" + max + ".", ChatColor.RED); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java index e851e44d..3789f40b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java @@ -1,9 +1,10 @@ package me.totalfreedom.totalfreedommod.command; -import com.earth2me.essentials.User; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Objects; + +import com.earth2me.essentials.User; import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.punishments.Punishment; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java index 44129bd4..16d82e97 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java @@ -1,11 +1,13 @@ 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.ADMIN, source = SourceType.ONLY_IN_GAME) +@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) @CommandParameters(description = "Trails rainbow wool behind you as you walk/fly.", usage = "/") public class Command_trail extends FreedomCommand { @@ -13,6 +15,12 @@ public class Command_trail 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.RAINBOW_TRAIL)) + { + msg("You didn't purchase the ability to have a " + ShopItem.RAINBOW_TRAIL.getName() + "! Purchase it from the shop.", ChatColor.RED); + return true; + } + if (plugin.tr.contains(playerSender)) { plugin.tr.remove(playerSender); @@ -21,7 +29,7 @@ public class Command_trail extends FreedomCommand else { plugin.tr.add(playerSender); - msg("Trail enabled. Use \"/trail off\" to disable."); + msg("Trail enabled. Run this command again to disable it."); } return true; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java index b6ca9452..daf3b32c 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java @@ -1,12 +1,9 @@ package me.totalfreedom.totalfreedommod.command; -import java.util.ArrayList; -import java.util.List; -import me.totalfreedom.totalfreedommod.banning.Ban; +import com.earth2me.essentials.User; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FUtil; -import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -22,20 +19,33 @@ public class Command_unban extends FreedomCommand if (args.length > 0) { String username; - final PlayerData entry = plugin.pl.getData(args[0]); + String ip; - if (entry == null) + // Gets the IP using Essentials data if available + if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null) { - msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly."); - return true; + User essUser = plugin.esb.getEssentialsUser(args[0]); + // + username = essUser.getName(); + ip = essUser.getLastLoginAddress(); + } + // Secondary method - using Essentials if available + else + { + final PlayerData entry = plugin.pl.getData(args[0]); + if (entry == null) + { + msg(PLAYER_NOT_FOUND); + return true; + } + username = entry.getName(); + ip = entry.getIps().get(0); } - username = entry.getName(); - final List ips = new ArrayList<>(entry.getIps()); - FUtil.adminAction(sender.getName(), "Unbanning " + username, true); - msg(username + " has been unbanned along with the following IPs: " + StringUtils.join(ips, ", ")); plugin.bm.removeBan(plugin.bm.getByUsername(username)); + plugin.bm.removeBan(plugin.bm.getByIp(ip)); + msg(username + " has been unbanned along with the IP: " + ip); if (args.length >= 2) { @@ -45,20 +55,6 @@ public class Command_unban extends FreedomCommand msg("Restored edits for: " + username); } } - - for (String ip : ips) - { - Ban ban = plugin.bm.getByIp(ip); - if (ban != null) - { - plugin.bm.removeBan(ban); - } - ban = plugin.bm.getByIp(FUtil.getFuzzyIp(ip)); - if (ban != null) - { - plugin.bm.removeBan(ban); - } - } return true; } return false; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java index ecdc167f..82c5c2bb 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java @@ -45,6 +45,8 @@ public enum ConfigEntry MOB_LIMITER_DISABLE_GIANT(Boolean.class, "moblimiter.disable.giant"), MOB_LIMITER_DISABLE_SLIME(Boolean.class, "moblimiter.disable.slime"), // + SPAWNMOB_MAX(Integer.class, "spawnmob.max"), + // HTTPD_ENABLED(Boolean.class, "httpd.enabled"), HTTPD_HOST(String.class, "httpd.host"), HTTPD_REVERSE_PROXY(Boolean.class, "httpd.reverse_proxy"), @@ -88,6 +90,7 @@ public enum ConfigEntry DISCORD_ASSISTANT_EXECUTIVE_ROLE_ID(String.class, "discord.assistant_executive_role_id"), DISCORD_EXECUTIVE_ROLE_ID(String.class, "discord.executive_role_id"), DISCORD_SERVER_OWNER_ROLE_ID(String.class, "discord.server_owner_role_id"), + DISCORD_INVITE_LINK(String.class, "discord.invite_link"), // PTERO_URL(String.class, "ptero.url"), PTERO_DEFAULT_EMAIL_DOMAIN(String.class, "ptero.default_email_domain"), @@ -112,6 +115,7 @@ public enum ConfigEntry SHOP_PRICES_STACKING_POTATO(Integer.class, "shop.prices.stacking_potato"), SHOP_PRICES_CLOWN_FISH(Integer.class, "shop.prices.clown_fish"), SHOP_PRICES_LOGIN_MESSAGES(Integer.class, "shop.prices.login_messages"), + SHOP_PRICES_RAINBOW_TRAIL(Integer.class, "shop.prices.rainbow_trail"), // ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"), ADMINLIST_CONSOLE_IS_ADMIN(Boolean.class, "adminlist.console_is_admin"), @@ -167,6 +171,8 @@ public enum ConfigEntry ADMIN_INFO(List.class, "admininfo"), VOTING_INFO(List.class, "votinginfo"), MASTER_BUILDER_INFO(List.class, "masterbuilderinfo"), + FIRST_JOIN_INFO(List.class, "first_join_info.text"), + FIRST_JOIN_INFO_ENABLED(Boolean.class, "first_join_info.enabled"), AUTO_ENTITY_WIPE(Boolean.class, "auto_wipe"), TOGGLE_CHAT(Boolean.class, "toggle_chat"), DEVELOPER_MODE(Boolean.class, "developer_mode"), diff --git a/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java b/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java index e0f26bff..f4adf0d9 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java @@ -10,9 +10,12 @@ import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.chat.hover.content.Text; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -28,39 +31,66 @@ public class DiscordToMinecraftListener extends ListenerAdapter { Member member = event.getMember(); String tag = getDisplay(member); - StringBuilder message = new StringBuilder(ChatColor.DARK_GRAY + "[" + ChatColor.DARK_AQUA + "Discord" + ChatColor.DARK_GRAY + "]"); Message msg = event.getMessage(); + + ComponentBuilder emsg = new ComponentBuilder(); + + // Prefix + emsg.append(ChatColor.DARK_GRAY + "["); + TextComponent inviteLink = new TextComponent("Discord"); + inviteLink.setColor(ChatColor.DARK_AQUA.asBungee()); + inviteLink.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + new Text("Click here to get the invite link!"))); + inviteLink.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, + ConfigEntry.DISCORD_INVITE_LINK.getString())); + emsg.append(inviteLink); + emsg.append(ChatColor.DARK_GRAY + "] ", ComponentBuilder.FormatRetention.NONE); + + // Tag (if they have one) if (tag != null) { - message.append(" ").append(tag); - } - message.append(" ").append(ChatColor.RED).append(ChatColor.stripColor(member.getEffectiveName())).append(ChatColor.DARK_GRAY).append(":").append(ChatColor.RESET); - ComponentBuilder builder = new ComponentBuilder(message.toString()); - if (!msg.getContentDisplay().isEmpty()) - { - builder.append(" ").append(ChatColor.stripColor(msg.getContentDisplay())); - message.append(" ").append(ChatColor.stripColor(msg.getContentDisplay())); // for logging + emsg.append(tag); } + + emsg.append(" "); + + // User + TextComponent user = new TextComponent(ChatColor.stripColor(member.getEffectiveName())); + user.setColor(ChatColor.RED.asBungee()); + emsg.append(user); + + // Message + emsg.append(ChatColor.DARK_GRAY + ": " + ChatColor.RESET + + ChatColor.stripColor(msg.getContentDisplay()), ComponentBuilder.FormatRetention.NONE); + + // Attachments if (!msg.getAttachments().isEmpty()) { + if (!msg.getContentDisplay().isEmpty()) + emsg.append(" "); + for (Message.Attachment attachment : msg.getAttachments()) { - attachment.getUrl(); - builder.append(" "); - TextComponent text = new TextComponent(ChatColor.YELLOW + "[Media]"); - text.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, attachment.getUrl())); - builder.append(text); - message.append(" [Media]"); // for logging + TextComponent media = new TextComponent("[Media] "); + media.setColor(ChatColor.YELLOW.asBungee()); + media.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, attachment.getUrl())); + media.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(attachment.getUrl()))); + + emsg.append(media, ComponentBuilder.FormatRetention.NONE); } } + + BaseComponent[] components = emsg.create(); + for (Player player : Bukkit.getOnlinePlayers()) { if (TotalFreedomMod.getPlugin().pl.getData(player).doesDisplayDiscord()) { - player.spigot().sendMessage(builder.create()); + player.spigot().sendMessage(components); } } - FLog.info(message.toString()); + + FLog.info(TextComponent.toLegacyText(components), true); } } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java b/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java index 012dc4d7..e603b242 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java @@ -4,7 +4,10 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.SplittableRandom; +import java.util.UUID; + import me.totalfreedom.totalfreedommod.FreedomService; +import me.totalfreedom.totalfreedommod.shop.ShopItem; import me.totalfreedom.totalfreedommod.util.Groups; import org.bukkit.Location; import org.bukkit.Material; @@ -18,7 +21,7 @@ import org.bukkit.event.player.PlayerMoveEvent; public class Trailer extends FreedomService { private final SplittableRandom random = new SplittableRandom(); - private final Set trailPlayers = new HashSet<>(); // player name + private final Set trailPlayers = new HashSet<>(); // player UUID @Override public void onStart() @@ -33,17 +36,17 @@ public class Trailer extends FreedomService @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent event) { - if (trailPlayers.isEmpty()) - { - return; - } - - if (!trailPlayers.contains(event.getPlayer().getName())) - { - return; - } - - if (event.getPlayer().getWorld().equals(plugin.wm.masterBuilderWorld.getWorld())) + /* Doesn't continue any further if... + * - The trail list is empty + * - The player doesn't have their trail enabled in the first place + * - The player doesn't have the trail item in the shop at all + * - The player doesn't have permission to modify blocks in their current world + */ + if (trailPlayers.isEmpty() + || !trailPlayers.contains(event.getPlayer().getUniqueId()) + || !plugin.pl.getData(event.getPlayer()).hasItem(ShopItem.RAINBOW_TRAIL) + || plugin.wr.doRestrict(event.getPlayer()) + || !plugin.wgb.canEditCurrentWorld(event.getPlayer())) { return; } @@ -69,7 +72,7 @@ public class Trailer extends FreedomService { final Location trail_pos; trail_pos = new Location(event.getPlayer().getWorld(), fromBlock.getX() + x, fromBlock.getY(), fromBlock.getZ() + z); - if (trailPlayers.contains(event.getPlayer().getName()) && plugin.cpb.isEnabled()) + if (trailPlayers.contains(event.getPlayer().getUniqueId()) && plugin.cpb.isEnabled()) { plugin.cpb.getCoreProtectAPI().logPlacement(event.getPlayer().getName(), trail_pos, material, data); } @@ -79,16 +82,16 @@ public class Trailer extends FreedomService public void remove(Player player) { - trailPlayers.remove(player.getName()); + trailPlayers.remove(player.getUniqueId()); } public void add(Player player) { - trailPlayers.add(player.getName()); + trailPlayers.add(player.getUniqueId()); } public boolean contains(Player player) { - return trailPlayers.contains(player.getName()); + return trailPlayers.contains(player.getUniqueId()); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java b/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java index 4ce94dd5..fe3bb097 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java @@ -10,19 +10,29 @@ public enum ShopItem LIGHTNING_ROD("Lightning Rod", Material.BLAZE_ROD, 12, ConfigEntry.SHOP_PRICES_LIGHTNING_ROD, ChatColor.LIGHT_PURPLE, "lightningRod", "/lightningrod"), 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"), - CLOWN_FISH("Clown Fish", Material.TROPICAL_FISH, 22, ConfigEntry.SHOP_PRICES_CLOWN_FISH, ChatColor.GOLD, "clownFish", "/clownfish"), - LOGIN_MESSAGES("Login Messages", Material.NAME_TAG, 24, ConfigEntry.SHOP_PRICES_LOGIN_MESSAGES, ChatColor.DARK_GREEN, "loginMessages", "/loginmessage"); + STACKING_POTATO("Stacking Potato", Material.POTATO, 19, ConfigEntry.SHOP_PRICES_STACKING_POTATO, ChatColor.YELLOW, "stackingPotato", "/stackingpotato"), + CLOWN_FISH("Clown Fish", Material.TROPICAL_FISH, 21, ConfigEntry.SHOP_PRICES_CLOWN_FISH, ChatColor.GOLD, "clownFish", "/clownfish"), + LOGIN_MESSAGES("Login Messages", Material.NAME_TAG, 23, ConfigEntry.SHOP_PRICES_LOGIN_MESSAGES, ChatColor.DARK_GREEN, "loginMessages", "/loginmessage"), + RAINBOW_TRAIL("Rainbow Trail", Material.RED_WOOL, 25, ConfigEntry.SHOP_PRICES_RAINBOW_TRAIL, ChatColor.DARK_RED, "rainbowTrail", "/trail"); /* 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, x = Login Messages $ = Coins} + Key: + g = Grappling Hook, + l = Lightning Rod + f = Fire Ball + r = Rideable Ender Pearl + s = Stacking Potato + c = Clown Fish + x = Login Messages + t = Rainbow Trail + $ = Coins --------- -g-l-f-r- - --s-c-x-- + -s-c-x-t- --------$ */ diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java index 2fc87036..f6988aec 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java @@ -1,34 +1,6 @@ package me.totalfreedom.totalfreedommod.util; -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.reflect.Field; -import java.net.HttpURLConnection; -import java.net.URL; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.SplittableRandom; -import java.util.TimeZone; -import java.util.UUID; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import me.totalfreedom.totalfreedommod.TotalFreedomMod; -import me.totalfreedom.totalfreedommod.admin.AdminList; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; @@ -48,12 +20,22 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import org.json.simple.JSONArray; + +import java.io.*; +import java.lang.reflect.Field; +import java.net.HttpURLConnection; +import java.net.URL; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import static org.bukkit.Bukkit.getServer; public class FUtil { - - public static final String SAVED_FLAGS_FILENAME = "savedflags.dat"; /* See https://github.com/TotalFreedom/License - None of the listed names may be removed. Leaving this list here for anyone running TFM on a cracked server: public static final List DEVELOPERS = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "Telesphoreo", "CoolJWB"); @@ -65,19 +47,17 @@ public class FUtil "604cbb51-842d-4b43-8b0a-d1d7c6cd2869", // Wild1145 "e67d77c4-fff9-4cea-94cc-9f1f1ab7806b", // aggelosQQ "0061326b-8b3d-44c8-830a-5f2d59f5dc1b", // scripthead - "78408086-1991-4c33-a571-d8fa325465b2", // Telesphoreo "67ce0e28-3d6b-469c-ab71-304eec81b614", // CoolJWB "03b41e15-d03f-4025-86f5-f1812df200fa", // elmon_ "d018f2b8-ce60-4672-a45f-e580e0331299", // speednt "458de06f-36a5-4e1b-aaa6-ec1d1751c5b6", // SupItsDillon "c8e5af82-6aba-4dd7-83e8-474381380cc9", // Paldiu - "38ea7c82-7bdc-4f48-b7fd-0e93fc26813d", // AwesomePinch "ba5aafba-9012-418f-9819-a7020d591068", // TFTWPhoenix "d6dd9740-40db-45f5-ab16-4ee16a633009", // Abhi "2e06e049-24c8-42e4-8bcf-d35372af31e6", // NotInSync "f97c0d7b-6413-4558-a409-88f09a8f9adb" // videogamesm12 ); - public static final List DEVELOPER_NAMES = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "Telesphoreo", "CoolJWB", "elmon_", "speednt", "SupItsDillon", "Paldiu", "AwesomePinch", "TFTWPhoenix", "abhithedev", "NotInSync", "videogamesm12"); + public static final List DEVELOPER_NAMES = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "CoolJWB", "elmon_", "speednt", "SupItsDillon", "Paldiu", "TFTWPhoenix", "abhithedev", "NotInSync", "videogamesm12"); public static final Map CHAT_COLOR_NAMES = new HashMap<>(); public static final List CHAT_COLOR_POOL = Arrays.asList( ChatColor.DARK_RED, @@ -267,7 +247,7 @@ public class FUtil } catch (Exception e) { - FLog.severe("Failed to convert name to UUID:\n" + e); + FLog.severe("Failed to convert name to UUID:\n" + e.toString()); } return null; } @@ -275,7 +255,7 @@ public class FUtil public static Response sendRequest(String endpoint, String method, List headers, String body) throws IOException { URL url = new URL(endpoint); - HttpURLConnection connection = (HttpURLConnection)url.openConnection(); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(method); @@ -405,17 +385,11 @@ public class FUtil add("s"); }}; - public static boolean isValidUsername(String s) - { - return s != null && s.matches("^[a-zA-Z0-9_]*$"); - } - private static long a(String parse) { StringBuilder sb = new StringBuilder(); - regxList.forEach(obj -> - { + regxList.forEach(obj -> { if (parse.endsWith(obj)) { sb.append(parse.split(obj)[0]); @@ -574,7 +548,7 @@ public class FUtil { Field field = checkClass.getDeclaredField(name); field.setAccessible(true); - return (T)field.get(from); + return (T) field.get(from); } catch (NoSuchFieldException | IllegalAccessException ignored) @@ -656,7 +630,7 @@ public class FUtil public static int randomInteger(int min, int max) { int range = max - min + 1; - return (int)(Math.random() * range) + min; + return (int) (Math.random() * range) + min; } public static String randomString(int length) @@ -778,7 +752,7 @@ public class FUtil public static String getIp(Player player) { - return Objects.requireNonNull(player.getAddress()).getAddress().getHostAddress().trim(); + return player.getAddress().getAddress().getHostAddress().trim(); } public static String getIp(PlayerLoginEvent event) @@ -794,7 +768,7 @@ public class FUtil { c1values[i] = Math.round(c1values[i] + factor * (c2values[i] - c1values[i])); } - return Color.fromRGB((int)c1values[0], (int)c1values[1], (int)c1values[2]); + return Color.fromRGB((int) c1values[0], (int) c1values[1], (int) c1values[2]); } public static boolean isValidIPv4(String ip) @@ -861,8 +835,8 @@ public class FUtil public static int getFakePlayerCount() { - int i = AdminList.vanished.size(); - for (String name : AdminList.vanished) + int i = TotalFreedomMod.getPlugin().al.vanished.size(); + for (String name : TotalFreedomMod.getPlugin().al.vanished) { if (Bukkit.getPlayer(name) == null) { @@ -892,7 +866,7 @@ public class FUtil public int getPageCount() { - return (int)Math.ceil((double)size() / (double)epp); + return (int) Math.ceil((double) size() / (double) epp); } public List getPage(int page) diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java b/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java index b0f66ded..0df27d99 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java @@ -45,140 +45,9 @@ public class Groups Material.LIGHT_GRAY_SHULKER_BOX, Material.BLACK_SHULKER_BOX); - public static final List MOB_TYPES = Arrays.asList( - EntityType.BAT, - EntityType.BEE, - EntityType.BLAZE, - EntityType.CAVE_SPIDER, - EntityType.CHICKEN, - EntityType.CAT, - EntityType.COD, - EntityType.COW, - EntityType.CREEPER, - EntityType.DOLPHIN, - EntityType.DONKEY, - EntityType.DROWNED, - EntityType.ELDER_GUARDIAN, - EntityType.ENDERMAN, - EntityType.ENDERMITE, - EntityType.EVOKER, - EntityType.FOX, - EntityType.GHAST, - EntityType.GUARDIAN, - EntityType.HOGLIN, - EntityType.HORSE, - EntityType.HUSK, - EntityType.ILLUSIONER, - EntityType.IRON_GOLEM, - EntityType.LLAMA, - EntityType.MAGMA_CUBE, - EntityType.MUSHROOM_COW, - EntityType.MULE, - EntityType.OCELOT, - EntityType.PANDA, - EntityType.PARROT, - EntityType.PHANTOM, - EntityType.PIG, - EntityType.PIGLIN, - EntityType.PIGLIN_BRUTE, - EntityType.PILLAGER, - EntityType.POLAR_BEAR, - EntityType.PUFFERFISH, - EntityType.RABBIT, - EntityType.RAVAGER, - EntityType.SALMON, - EntityType.SHEEP, - EntityType.SHULKER, - EntityType.SILVERFISH, - EntityType.SKELETON, - EntityType.SKELETON_HORSE, - EntityType.SLIME, - EntityType.SNOWMAN, - EntityType.SPIDER, - EntityType.SQUID, - EntityType.STRAY, - EntityType.STRIDER, - EntityType.TRADER_LLAMA, - EntityType.TROPICAL_FISH, - EntityType.TURTLE, - EntityType.VEX, - EntityType.VILLAGER, - EntityType.VINDICATOR, - EntityType.WANDERING_TRADER, - EntityType.WITCH, - EntityType.WITHER_SKELETON, - EntityType.WOLF, - EntityType.ZOGLIN, - EntityType.ZOMBIE, - EntityType.ZOMBIE_HORSE, - EntityType.ZOMBIFIED_PIGLIN, - EntityType.ZOMBIE_VILLAGER); + public static final List MOB_TYPES = Arrays.stream(EntityType.values()).filter(EntityType::isAlive).filter(EntityType::isSpawnable).toList(); - public static final List SPAWN_EGGS = Arrays.asList( - Material.BAT_SPAWN_EGG, - Material.BEE_SPAWN_EGG, - Material.BLAZE_SPAWN_EGG, - Material.CAVE_SPIDER_SPAWN_EGG, - Material.CHICKEN_SPAWN_EGG, - Material.CAT_SPAWN_EGG, - Material.COD_SPAWN_EGG, - Material.COW_SPAWN_EGG, - Material.CREEPER_SPAWN_EGG, - Material.DOLPHIN_SPAWN_EGG, - Material.DONKEY_SPAWN_EGG, - Material.DROWNED_SPAWN_EGG, - Material.ELDER_GUARDIAN_SPAWN_EGG, - Material.ENDERMAN_SPAWN_EGG, - Material.ENDERMITE_SPAWN_EGG, - Material.EVOKER_SPAWN_EGG, - Material.FOX_SPAWN_EGG, - Material.GHAST_SPAWN_EGG, - Material.GUARDIAN_SPAWN_EGG, - Material.HOGLIN_SPAWN_EGG, - Material.HORSE_SPAWN_EGG, - Material.HUSK_SPAWN_EGG, - Material.LLAMA_SPAWN_EGG, - Material.MAGMA_CUBE_SPAWN_EGG, - Material.MOOSHROOM_SPAWN_EGG, - Material.MULE_SPAWN_EGG, - Material.OCELOT_SPAWN_EGG, - Material.PANDA_SPAWN_EGG, - Material.PARROT_SPAWN_EGG, - Material.PHANTOM_SPAWN_EGG, - Material.PIG_SPAWN_EGG, - Material.PIGLIN_SPAWN_EGG, - Material.PIGLIN_BRUTE_SPAWN_EGG, - Material.PILLAGER_SPAWN_EGG, - Material.POLAR_BEAR_SPAWN_EGG, - Material.PUFFERFISH_SPAWN_EGG, - Material.RABBIT_SPAWN_EGG, - Material.RAVAGER_SPAWN_EGG, - Material.SALMON_SPAWN_EGG, - Material.SHEEP_SPAWN_EGG, - Material.SHULKER_SPAWN_EGG, - Material.SILVERFISH_SPAWN_EGG, - Material.SKELETON_SPAWN_EGG, - Material.SKELETON_HORSE_SPAWN_EGG, - Material.SLIME_SPAWN_EGG, - Material.SPIDER_SPAWN_EGG, - Material.SQUID_SPAWN_EGG, - Material.STRAY_SPAWN_EGG, - Material.STRIDER_SPAWN_EGG, - Material.TRADER_LLAMA_SPAWN_EGG, - Material.TROPICAL_FISH_SPAWN_EGG, - Material.TURTLE_SPAWN_EGG, - Material.VEX_SPAWN_EGG, - Material.VILLAGER_SPAWN_EGG, - Material.VINDICATOR_SPAWN_EGG, - Material.WANDERING_TRADER_SPAWN_EGG, - 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, - Material.ZOMBIE_VILLAGER_SPAWN_EGG); + public static final List SPAWN_EGGS = Arrays.stream(Material.values()).filter((mat) -> mat.name().endsWith("_SPAWN_EGG")).toList(); public static final List BANNERS = Arrays.asList( Material.BLACK_BANNER, diff --git a/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java b/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java index 32033da5..790a6f33 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java @@ -1,9 +1,6 @@ package me.totalfreedom.totalfreedommod.world; -import java.io.File; import me.totalfreedom.totalfreedommod.config.ConfigEntry; -import me.totalfreedom.totalfreedommod.util.FLog; -import org.apache.commons.io.FileUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -32,8 +29,6 @@ public class Flatlands extends CustomWorld return null; } - wipeFlatlandsIfFlagged(); - final WorldCreator worldCreator = new WorldCreator(getName()); worldCreator.generateStructures(false); worldCreator.type(WorldType.NORMAL); @@ -63,32 +58,4 @@ public class Flatlands extends CustomWorld return world; } - - - public void wipeFlatlandsIfFlagged() - { - boolean doFlatlandsWipe = false; - try - { - doFlatlandsWipe = plugin.sf.getSavedFlag("do_wipe_flatlands"); - } - catch (Exception ignored) - { - } - - if (doFlatlandsWipe) - { - if (Bukkit.getServer().getWorld("flatlands") == null) - { - FLog.info("Wiping flatlands."); - plugin.sf.setSavedFlag("do_wipe_flatlands", false); - FileUtils.deleteQuietly(new File("./flatlands")); - } - else - { - FLog.severe("Can't wipe flatlands, it is already loaded."); - } - } - } - } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a3a9b607..b61d6fd3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -84,6 +84,8 @@ discord: executive_role_id: '' # Owner role ID server_owner_role_id: '' + # Invite link for your Discord server + invite_link: 'https://discord.com/invite/PW4savJR9a' # Pterodactyl (requires Discord verification to be enabled) ptero: @@ -164,6 +166,7 @@ shop: stacking_potato: 300 clown_fish: 1500 login_messages: 5000 + rainbow_trail: 1500 # Admin list adminlist: @@ -211,7 +214,7 @@ allow: fire_spread: false fluid_spread: false lava_place: true - lava_damage: false + lava_damage: true water_place: true tnt_minecarts: false explosions: false @@ -511,6 +514,10 @@ moblimiter: slime: true giant: true +# Spawnmob +spawnmob: + max: 25 + # Flatlands flatlands: generate: true @@ -595,6 +602,14 @@ masterbuilderinfo: - ' &2- Template:' - '&9https://forum.totalfreedom.me/d/336-master-builder-application-process' +# What new players will see upon joining for the first time. +first_join_info: + enabled: true + text: + - "&6Welcome to TotalFreedom -- the original Free-OP server!" + - "&eThe server's name doesn't mean we have no rules. Do &6/rules &efor a list of them." + - "&aNeed help getting started? Do &2/help &aor a list of commands!" + # Famous players - cannot be banned by username famous_players: - honeydew