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