diff --git a/.github/workflows/codacy-analysis.yml b/.github/workflows/codacy-analysis.yml index 6b818a9f..e5aa4641 100644 --- a/.github/workflows/codacy-analysis.yml +++ b/.github/workflows/codacy-analysis.yml @@ -25,7 +25,7 @@ jobs: # Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis - name: Run Codacy Analysis CLI - uses: codacy/codacy-analysis-cli-action@1.1.0 + uses: codacy/codacy-analysis-cli-action@4.0.0 with: # Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository # You can also omit the token and run the tools that support default configurations diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index dbeaac5d..fc5b35cc 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -38,10 +38,11 @@ jobs: uses: actions/checkout@v2 - name: Setup Java JDK - uses: actions/setup-java@v1.4.3 + uses: actions/setup-java@v2.3.0 with: # The Java version to make available on the path. Takes a whole or semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x). Early access versions can be specified in the form of e.g. 14-ea, 14.0.0-ea, or 14.0.0-ea.28 java-version: 11 + distribution: 'adopt' # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/java11-maven.yml b/.github/workflows/java11-maven.yml new file mode 100644 index 00000000..967abde2 --- /dev/null +++ b/.github/workflows/java11-maven.yml @@ -0,0 +1,21 @@ +name: Java11-Maven-Build + +on: [push] + +jobs: + build-java-11: + + runs-on: ubuntu-latest + + steps: + # Checkout the code + - uses: actions/checkout@v1 + + # Java 11 Builds + - name: Set up JDK 11 + uses: actions/setup-java@v2.3.0 + with: + java-version: 11 + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml 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/.github/workflows/maven.yml b/.github/workflows/maven.yml deleted file mode 100644 index cd7f4aee..00000000 --- a/.github/workflows/maven.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Maven-Build - -on: [push] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - # Java 11 Builds - - uses: actions/checkout@v1 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - java-version: 11 - - name: Build with Maven - run: mvn -B package --file pom.xml - - # Java 16 Builds - - uses: actions/checkout@v1 - - name: Set up JDK 16 - uses: actions/setup-java@v1 - with: - java-version: 16 - - name: Build with Maven - run: mvn -B package --file pom.xml diff --git a/SECURITY.md b/SECURITY.md index adc91e1d..a18bd56e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -11,20 +11,23 @@ These versions are currently actively supported by our team, and you should expe | Version | Supported | Support End: | | ------------------- | ------------------ | ------------------------------ | -| 2021.05 | :white_check_mark: | No Earlier than August 2021 | +| 2021.09 | :white_check_mark: | No Earlier than December 2021 | ### Legacy Supported These versions are no longer under active development, however we will look to release critical secuirty patches where appropriate. | Version | Supported | Support End: | | ------------------- | ------------------ | ------------ | -| 2021.04 | :white_check_mark: | July 2021 | +| 2021.06 | :white_check_mark: | October 2021 | + ### No Longer Supported These versions are no longer supported at all. It is strongly advised to update if you are running any of these versions. | Version | Supported | Support Ended: | | ------------------- | ------------------ | ------------------- | +| 2021.05 | :white_check_mark: | September 2021 | +| 2021.04 | :white_check_mark: | July 2021 | | 2021.02 | :x: | 6 June 2021 | | 2020.11 | :x: | 3 May 2021 | | 6.0.x (Pre-Release) | :x: | December 2020 | diff --git a/pom.xml b/pom.xml index 7c8f8d02..77a1b10f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ me.totalfreedom TotalFreedomMod - 2021.06 + 2021.09 jar @@ -39,9 +39,10 @@ + - jitpack.io - https://jitpack.io + atlas-nexus-01-totalfreedom-development + https://nexus-01.core.atlas-media.co.uk/repository/totalfreedom-development/ @@ -101,14 +102,11 @@ - papermc - https://papermc.io/repo/repository/maven-public/ - - - - ess-repo - https://ci.ender.zone/plugin/repository/everything/ + esentialsx-repo + https://repo.essentialsx.net/releases/ + + @@ -116,14 +114,14 @@ commons-io commons-io - 2.8.0 + 2.11.0 compile org.apache.commons commons-lang3 - 3.11 + 3.12.0 compile @@ -134,17 +132,10 @@ compile - - com.github.speedxx - Mojangson - 1957eef8d6 - compile - - org.bstats bstats-bukkit - 1.8 + 2.2.1 compile @@ -172,14 +163,7 @@ com.sk89q.worldedit worldedit-bukkit - 7.3.0-SNAPSHOT - provided - - - - net.ess3 - EssentialsX - 2.18.2 + 7.2.4 provided @@ -193,7 +177,7 @@ net.coreprotect coreprotect - 19.3 + 19.5 provided @@ -217,12 +201,12 @@ v1.9 provided - + - net.goldtreeservers - worldguardextraflags - 4.0.0 - provided + net.ess3 + EssentialsX + 2.18.2 + compile @@ -235,36 +219,38 @@ org.javassist javassist - 3.27.0-GA + 3.28.0-GA compile - com.github.AtlasMediaGroup - TFGuilds - master-SNAPSHOT - provided + me.totalfreedom + tfguilds + 2021.06-RC2 + compile org.jetbrains annotations - 20.1.0 + 22.0.0 compile org.apache.maven.plugins maven-checkstyle-plugin - 3.1.1 + 3.1.2 compile + org.junit.jupiter junit-jupiter - 5.4.2 + 5.8.0 compile + org.eclipse.sisu org.eclipse.sisu.inject @@ -299,7 +285,7 @@ pl.project13.maven git-commit-id-plugin - 4.0.2 + 4.9.10 get-the-git-infos @@ -340,7 +326,7 @@ org.apache.maven.plugins maven-antrun-plugin - 1.8 + 3.0.0 default-cli @@ -443,8 +429,8 @@ org.reflections:reflections org.javassist:javassist io.papermc:paperlib - com.github.speedxx:Mojangson org.bstats:bstats-bukkit + org.bstats:bstats-base org.jetbrains:annotations @@ -462,7 +448,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.1.1 + 3.1.2 checkstyle.xml true 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 c44d06c5..e2b621af 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java @@ -1,17 +1,16 @@ package me.totalfreedom.totalfreedommod; -import ca.momothereal.mojangson.ex.MojangsonParseException; -import ca.momothereal.mojangson.value.MojangsonCompound; -import ca.momothereal.mojangson.value.MojangsonValue; +import com.google.common.collect.Multimap; import io.papermc.lib.PaperLib; -import java.util.List; + +import java.util.Collection; +import java.util.Map; import java.util.Objects; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.NBTTagList; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -20,6 +19,7 @@ import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; public class MovementValidator extends FreedomService { @@ -133,55 +133,49 @@ public class MovementValidator extends FreedomService private Boolean exploitItem(ItemStack item) { - net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(item); - NBTTagList modifiers = getAttributeList(nmsStack); - MojangsonCompound compound = new MojangsonCompound(); - boolean foundNegative = false; - boolean foundPositive = false; - try + if (item == null) { - String mod = modifiers.toString(); - String fancy = ("{" + (mod.substring(1, mod.length() - 1).replace("{", "").replace("}", "")) + "}"); - compound.read(fancy); - for (String key : compound.keySet()) + return false; + } + + ItemMeta meta = item.getItemMeta(); + if (meta != null) + { + Multimap attributes = meta.getAttributeModifiers(); + if (attributes != null) { - if (Objects.equals(key, "Amount")) //null-safe .equals() + Map> attrMap = attributes.asMap(); + + // For every attribute... + for (Attribute attr : attributes.keySet()) { - @SuppressWarnings("rawtypes") - List values = compound.get(key); - for (MojangsonValue val : values) + // Default values + boolean posInf = false; + boolean negInf = false; + + // For every AttributeModifier... + for (AttributeModifier modifier : attrMap.get(attr)) { - if (val.getValue().toString().equals("Infinityd")) + // Are they ∞ or -∞? + if (modifier.getAmount() == Double.POSITIVE_INFINITY) { - foundPositive = true; + posInf = true; } - if (val.getValue().toString().equals("-Infinityd")) + else if (modifier.getAmount() == Double.NEGATIVE_INFINITY) { - foundNegative = true; + negInf = true; } } + + // Are both values set as true? + if (posInf && negInf) + { + return true; + } } } - } - catch (MojangsonParseException e) - { - e.printStackTrace(); - } - return foundNegative && foundPositive; - } - - private NBTTagList getAttributeList(net.minecraft.server.v1_16_R3.ItemStack stack) - { - if (stack.getTag() == null) - { - stack.setTag(new NBTTagCompound()); } - NBTTagList attr = stack.getTag().getList("AttributeModifiers", 10); - if (attr == null) - { - stack.getTag().set("AttributeModifiers", new NBTTagList()); - } - return stack.getTag().getList("AttributeModifiers", 10); + return false; } } \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java b/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java index dc846cd1..c0a00e39 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java @@ -276,8 +276,25 @@ 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) @@ -285,19 +302,6 @@ public class CoreProtectBridge extends FreedomService event.setCancelled(true); List lookup = coreProtect.blockLookup(block, -1); - 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; - } - } - if (!plugin.al.isAdmin(player)) { cooldown.put(player.getName(), System.currentTimeMillis()); @@ -364,91 +368,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/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_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_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_tban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tban.java deleted file mode 100644 index c4c4c62f..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tban.java +++ /dev/null @@ -1,143 +0,0 @@ -package me.totalfreedom.totalfreedommod.command; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -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.Location; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH, blockHostConsole = true) -@CommandParameters(description = "Temporarily bans a player for five minutes.", usage = "/ [-q] [reason]", aliases = "noob") -public class Command_tban extends FreedomCommand -{ - - @Override - public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) - { - if (args.length == 0) - { - return false; - } - - boolean quiet = args[0].equalsIgnoreCase("-q"); - if (quiet) - { - args = org.apache.commons.lang3.ArrayUtils.subarray(args, 1, args.length); - - if (args.length < 1) - { - return false; - } - } - - final String username; - - final Player player = getPlayer(args[0]); - final PlayerData entry; - if (player == null) - { - entry = plugin.pl.getData(args[0]); - - 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(); - } - else - { - entry = plugin.pl.getData(player); - username = player.getName(); - } - final List ips = new ArrayList<>(entry.getIps()); - - String reason = null; - if (args.length > 1) - { - reason = StringUtils.join(args, " ", 1, args.length); - } - - StringBuilder kick = new StringBuilder() - .append(ChatColor.RED) - .append("You have been temporarily banned for five minutes. Please read totalfreedom.me for more info."); - - if (!quiet) - { - // Strike with lightning - if (player != null) - { - final Location targetPos = player.getLocation(); - for (int x = -1; x <= 1; x++) - { - for (int z = -1; z <= 1; z++) - { - final Location strike_pos = new Location(targetPos.getWorld(), targetPos.getBlockX() + x, targetPos.getBlockY(), targetPos.getBlockZ() + z); - Objects.requireNonNull(targetPos.getWorld()).strikeLightning(strike_pos); - } - } - - // Kill player - player.setHealth(0.0); - - if (reason != null) - { - FUtil.adminAction(sender.getName(), "Tempbanning " + player.getName() + " for 5 minutes - Reason: " + reason, true); - kick.append("\n") - .append(ChatColor.RED) - .append("Reason: ") - .append(ChatColor.GOLD) - .append(reason); - } - else - { - FUtil.adminAction(sender.getName(), "Tempbanning " + player.getName() + " for 5 minutes", true); - } - } - } - else - { - if (player != null) - { - if (reason != null) - { - msg("Quietly temporarily banned " + player.getName() + " for 5 minutes."); - kick.append("\n") - .append(ChatColor.RED) - .append("Reason: ") - .append(ChatColor.GOLD) - .append(reason); - } - } - } - - // Ban player - Ban ban = Ban.forPlayerName(username, sender, FUtil.parseDateOffset("5m"), reason); - for (String ip : ips) - { - ban.addIp(ip); - } - plugin.bm.addBan(ban); - - // Kick player - if (player != null) - { - player.kickPlayer(kick.toString()); - } - - // Log ban - plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.TEMPBAN, reason)); - return true; - } -} \ No newline at end of file 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 dfc412ce..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,10 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; -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; @@ -21,7 +21,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH) -@CommandParameters(description = "Temporarily ban someone.", usage = "/ [-q] [duration] [reason]") +@CommandParameters(description = "Temporarily ban someone.", usage = "/ [-q] [duration] [reason]", aliases = "tban,noob") public class Command_tempban extends FreedomCommand { @@ -47,49 +47,72 @@ public class Command_tempban extends FreedomCommand } final String username; - final List ips = new ArrayList<>(); + final String ip; final Player player = getPlayer(args[0]); - final PlayerData entry; + PlayerData entry; if (player == null) { - 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 + { + 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 { - entry = plugin.pl.getData(player); username = player.getName(); - ips.add(FUtil.getIp(player)); + ip = FUtil.getIp(player); } final StringBuilder message = new StringBuilder("Temporarily banned " + username); - Date expires = FUtil.parseDateOffset("30m"); + // Default expiration date is 5 minutes + Date expires = FUtil.parseDateOffset("5m"); + + // Parses what comes after as a duration + if (args.length > 1) + { + try + { + expires = FUtil.parseDateOffset(args[1]); + } + catch (NumberFormatException error) + { + msg("Invalid duration: " + args[1], ChatColor.RED); + return true; + } + } + message.append(" until ").append(date_format.format(expires)); + // If a reason appears to exist, set it. String reason = null; - if (args.length >= 2) + if (args.length > 2) { - Date parsed_offset = FUtil.parseDateOffset(args[1]); - reason = StringUtils.join(ArrayUtils.subarray(args, parsed_offset == null ? 1 : 2, args.length), " ") + " (" + sender.getName() + ")"; - if (parsed_offset != null) - { - expires = parsed_offset; - } + reason = StringUtils.join(ArrayUtils.subarray(args, 2, args.length), " ") + " (" + sender.getName() + ")"; message.append(", Reason: \"").append(reason).append("\""); } Ban ban; - if (player != null) { ban = Ban.forPlayer(player, sender, expires, reason); @@ -98,11 +121,8 @@ public class Command_tempban extends FreedomCommand { ban = Ban.forPlayerName(username, sender, expires, reason); } + ban.addIp(ip); - for (String ip : ips) - { - ban.addIp(ip); - } plugin.bm.addBan(ban); if (!quiet) @@ -119,6 +139,8 @@ public class Command_tempban extends FreedomCommand Objects.requireNonNull(targetPos.getWorld()).strikeLightningEffect(strike_pos); } } + + player.kickPlayer(ban.bakeKickMessage()); } FUtil.adminAction(sender.getName(), message.toString(), true); @@ -128,19 +150,15 @@ public class Command_tempban extends FreedomCommand msg("Quietly temporarily banned " + username + "."); } - if (player != null) + for (Player p : Bukkit.getOnlinePlayers()) { - player.kickPlayer(ban.bakeKickMessage()); - for (Player p : Bukkit.getOnlinePlayers()) + if (FUtil.getIp(p).equals(ip)) { - if (FUtil.getIp(p).equals(FUtil.getIp(player))) - { - p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned."); - } + p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned."); } } - plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.TEMPBAN, reason)); + plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.TEMPBAN, reason)); return true; } } \ No newline at end of file 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 05051905..021f30f1 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java @@ -165,6 +165,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/util/FUtil.java b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java index a269a296..81bae8cc 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java @@ -54,13 +54,12 @@ public class FUtil "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", "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, diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 3780220d..1530fbfa 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -206,7 +206,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 @@ -590,6 +590,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