diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index fc5b35cc..eaf30927 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -41,7 +41,7 @@ jobs:
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
+ java-version: 17
distribution: 'adopt'
# Initializes the CodeQL tools for scanning.
diff --git a/.github/workflows/java11-maven.yml b/.github/workflows/java11-maven.yml
deleted file mode 100644
index 967abde2..00000000
--- a/.github/workflows/java11-maven.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-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/SECURITY.md b/SECURITY.md
index a18bd56e..65277440 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -9,16 +9,16 @@ In terms of plugin releases, our support matrix is as follows:
### Actively Supported
These versions are currently actively supported by our team, and you should expect security patches where appropriate for these versions.
-| Version | Supported | Support End: |
-| ------------------- | ------------------ | ------------------------------ |
-| 2021.09 | :white_check_mark: | No Earlier than December 2021 |
+| Version | Supported | Support End: |
+| ------------------- | ---------- | ------------------------------ |
+| 2022.02 | ✅ | No Earlier than May 2022 |
### 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.06 | :white_check_mark: | October 2021 |
+| Version | Supported | Support End: |
+| ------------------- | ---------- | ------------ |
+| 2021.09 | ⚠️ | April 2022 |
### No Longer Supported
@@ -26,8 +26,9 @@ These versions are no longer supported at all. It is strongly advised to update
| Version | Supported | Support Ended: |
| ------------------- | ------------------ | ------------------- |
-| 2021.05 | :white_check_mark: | September 2021 |
-| 2021.04 | :white_check_mark: | July 2021 |
+| 2021.06 | :x: | October 2021 |
+| 2021.05 | :x: | September 2021 |
+| 2021.04 | :x: | 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/nb-configuration.xml b/nb-configuration.xml
index 65f12570..08e4e03c 100644
--- a/nb-configuration.xml
+++ b/nb-configuration.xml
@@ -13,7 +13,7 @@ You can copy and paste the single properties, into the pom.xml file and the IDE
That way multiple projects can share the same settings (useful for formatting rules for example).
Any value defined here will override the pom.xml file value but is only applicable to the current project.
-->
- JDK_11
+ JDK_17
true
diff --git a/pom.xml b/pom.xml
index 77a1b10f..58c6cee0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
me.totalfreedom
TotalFreedomMod
- 2021.09
+ 2022.02
jar
@@ -142,7 +142,7 @@
org.spigotmc
spigot
- 1.16.5-R0.1-SNAPSHOT
+ 1.17.1-R0.1-SNAPSHOT
provided
@@ -163,7 +163,7 @@
com.sk89q.worldedit
worldedit-bukkit
- 7.2.4
+ 7.2.8
provided
@@ -177,14 +177,14 @@
net.coreprotect
coreprotect
- 19.5
+ 20.4
provided
com.sk89q.worldguard
worldguard-bukkit
- 7.0.4
+ 7.0.6
provided
@@ -203,10 +203,10 @@
- net.ess3
+ net.essentialsx
EssentialsX
- 2.18.2
- compile
+ 2.19.0
+ provided
@@ -227,7 +227,7 @@
me.totalfreedom
tfguilds
2021.06-RC2
- compile
+ provided
@@ -258,6 +258,13 @@
+
+
+ apache.snapshots
+ https://repository.apache.org/snapshots/
+
+
+
@@ -275,9 +282,9 @@
3.8.1
TotalFreedomMod.jar
- 11
-
- 11
+ 17
+
+ 17
@@ -401,7 +408,7 @@
org.apache.maven.plugins
maven-shade-plugin
- 3.2.4
+ 3.3.0
package
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java b/src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java
deleted file mode 100644
index a86320fa..00000000
--- a/src/main/java/me/totalfreedom/totalfreedommod/SavedFlags.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package me.totalfreedom.totalfreedommod;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.HashMap;
-import java.util.Map;
-import me.totalfreedom.totalfreedommod.util.FLog;
-import static me.totalfreedom.totalfreedommod.util.FUtil.SAVED_FLAGS_FILENAME;
-
-public class SavedFlags extends FreedomService
-{
- @Override
- public void onStart()
- {
- }
-
- @Override
- public void onStop()
- {
- }
-
- @SuppressWarnings("unchecked")
- public Map getSavedFlags()
- {
- Map flags = null;
- File input = new File(TotalFreedomMod.getPlugin().getDataFolder(), SAVED_FLAGS_FILENAME);
-
- if (input.exists())
- {
- try
- {
- try (FileInputStream fis = new FileInputStream(input); ObjectInputStream ois = new ObjectInputStream(fis))
- {
- flags = (HashMap)ois.readObject();
- }
- }
- catch (Exception ex)
- {
- FLog.severe(ex);
- }
- }
-
- return flags;
- }
-
- public boolean getSavedFlag(String flag) throws Exception
- {
- Boolean flagValue = null;
-
- Map flags = getSavedFlags();
-
- if (flags != null)
- {
- if (flags.containsKey(flag))
- {
- flagValue = flags.get(flag);
- }
- }
-
- if (flagValue != null)
- {
- return flagValue;
- }
- else
- {
- throw new Exception();
- }
- }
-
- public void setSavedFlag(String flag, boolean value)
- {
- Map flags = getSavedFlags();
-
- if (flags == null)
- {
- flags = new HashMap<>();
- }
-
- flags.put(flag, value);
-
- try
- {
- final FileOutputStream fos = new FileOutputStream(new File(plugin.getDataFolder(), SAVED_FLAGS_FILENAME));
- final ObjectOutputStream oos = new ObjectOutputStream(fos);
- oos.writeObject(flags);
- oos.close();
- fos.close();
- }
- catch (Exception ex)
- {
- FLog.severe(ex);
- }
- }
-
-}
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/ServerInterface.java b/src/main/java/me/totalfreedom/totalfreedommod/ServerInterface.java
index 40abc384..3821a949 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/ServerInterface.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/ServerInterface.java
@@ -4,14 +4,14 @@ import java.util.Arrays;
import java.util.List;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
-import net.minecraft.server.v1_16_R3.EntityPlayer;
-import net.minecraft.server.v1_16_R3.MinecraftServer;
+import net.minecraft.server.level.EntityPlayer;
+import net.minecraft.server.MinecraftServer;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_16_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_17_R1.CraftServer;
public class ServerInterface extends FreedomService
{
- public static final String COMPILE_NMS_VERSION = "v1_16_R3";
+ public static final String COMPILE_NMS_VERSION = "v1_17_R1";
public static void warnVersion()
{
@@ -34,16 +34,11 @@ public class ServerInterface extends FreedomService
{
}
- public void setOnlineMode(boolean mode)
- {
- getServer().setOnlineMode(mode);
- }
-
public int purgeWhitelist()
{
String[] whitelisted = getServer().getPlayerList().getWhitelisted();
int size = whitelisted.length;
- for (EntityPlayer player : getServer().getPlayerList().players)
+ for (EntityPlayer player : getServer().getPlayerList().getPlayers())
{
getServer().getPlayerList().getWhitelist().remove(player.getProfile());
}
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java
index 9804f730..e5593b91 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java
@@ -75,7 +75,6 @@ public class TotalFreedomMod extends JavaPlugin
public CommandLoader cl;
// Services
public ServerInterface si;
- public SavedFlags sf;
public WorldManager wm;
public LogViewer lv;
public AdminList al;
@@ -187,7 +186,6 @@ public class TotalFreedomMod extends JavaPlugin
fsh = new FreedomServiceHandler();
config = new MainConfig();
- config.load();
if (FUtil.inDeveloperMode())
{
@@ -299,7 +297,6 @@ public class TotalFreedomMod extends JavaPlugin
{
// Start services
si = new ServerInterface();
- sf = new SavedFlags();
wm = new WorldManager();
lv = new LogViewer();
sql = new SQLite();
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/blocking/SignBlocker.java b/src/main/java/me/totalfreedom/totalfreedommod/blocking/SignBlocker.java
index 261ce274..3fabc837 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/blocking/SignBlocker.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/blocking/SignBlocker.java
@@ -1,10 +1,10 @@
package me.totalfreedom.totalfreedommod.blocking;
import me.totalfreedom.totalfreedommod.FreedomService;
-import net.minecraft.server.v1_16_R3.NBTTagCompound;
+import net.minecraft.nbt.NBTTagCompound;
import org.bukkit.ChatColor;
import org.bukkit.Tag;
-import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -35,7 +35,7 @@ public class SignBlocker extends FreedomService
if (Tag.SIGNS.getValues().contains(event.getBlock().getType()))
{
ItemStack sign = event.getItemInHand();
- net.minecraft.server.v1_16_R3.ItemStack nmsSign = CraftItemStack.asNMSCopy(sign);
+ net.minecraft.world.item.ItemStack nmsSign = CraftItemStack.asNMSCopy(sign);
NBTTagCompound compound = (nmsSign.hasTag()) ? nmsSign.getTag() : new NBTTagCompound();
assert compound != null;
NBTTagCompound bet = compound.getCompound("BlockEntityTag");
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java b/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java
index c0a00e39..2653c8ef 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/bridge/CoreProtectBridge.java
@@ -192,7 +192,6 @@ public class CoreProtectBridge extends FreedomService
return (megabytes / 1024);
}
- // Wipes DB for the specified world
public void clearDatabase(World world)
{
clearDatabase(world, false);
@@ -260,12 +259,6 @@ public class CoreProtectBridge extends FreedomService
{
FLog.warning("Failed to delete the CoreProtect data for the " + world.getName());
}
-
- // This exits for flatlands wipes
- if (shutdown)
- {
- server.shutdown();
- }
}
@EventHandler(priority = EventPriority.MONITOR)
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/bridge/WorldGuardBridge.java b/src/main/java/me/totalfreedom/totalfreedommod/bridge/WorldGuardBridge.java
index 6bc0ab9b..ea03b670 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/bridge/WorldGuardBridge.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/bridge/WorldGuardBridge.java
@@ -1,13 +1,20 @@
package me.totalfreedom.totalfreedommod.bridge;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
+import com.sk89q.worldedit.util.Location;
+import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.WorldGuard;
+import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
+import com.sk89q.worldguard.protection.flags.Flags;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.sk89q.worldguard.protection.regions.RegionContainer;
import java.util.Map;
+
+import com.sk89q.worldguard.protection.regions.RegionQuery;
import me.totalfreedom.totalfreedommod.FreedomService;
import org.bukkit.World;
+import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public class WorldGuardBridge extends FreedomService
@@ -23,6 +30,16 @@ public class WorldGuardBridge extends FreedomService
{
}
+ public boolean canEditCurrentWorld(Player player)
+ {
+ LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
+
+ RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
+ RegionQuery query = container.createQuery();
+
+ return query.testBuild(localPlayer.getLocation(), localPlayer);
+ }
+
public RegionManager getRegionManager(World world)
{
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java
index f50b8985..3d0a812d 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java
@@ -9,8 +9,11 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
+import java.util.ArrayList;
+import java.util.List;
+
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
-@CommandParameters(description = "Shows the amount of coins you have or another player has", usage = "/ [playername]")
+@CommandParameters(description = "Shows the amount of coins you or another player has. Also allows you to give coins to other players.", usage = "/ [player] | pay ")
public class Command_coins extends FreedomCommand
{
@Override
@@ -21,34 +24,119 @@ public class Command_coins extends FreedomCommand
msg("The shop is currently disabled!", ChatColor.RED);
return true;
}
- Player p;
+
final String prefix = FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString() + " ");
- if (args.length > 0)
+
+ switch (args.length)
{
- if (getPlayer(args[0]) != null)
+ // Mode for seeing how many coins the sender has (doesn't work from console)
+ case 0:
{
- p = getPlayer(args[0]);
- }
- else
- {
- msg(PLAYER_NOT_FOUND);
+ if (senderIsConsole)
+ {
+ msg("When used from the console, you must define a target player.");
+ }
+ else
+ {
+ PlayerData playerData = getData(playerSender);
+ msg(prefix + ChatColor.GREEN + "You have " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN
+ + " coins.");
+ }
return true;
}
- }
- else
- {
- if (senderIsConsole)
+
+ // Mode for seeing how many coins a player has.
+ case 1:
{
- msg(prefix + ChatColor.RED + "You are not a player, use /coins ");
+ Player target = getPlayer(args[0]);
+
+ if (target == null)
+ {
+ msg(PLAYER_NOT_FOUND);
+ }
+ else
+ {
+ PlayerData playerData = getData(target);
+ msg(prefix + ChatColor.GREEN + target.getName() + " has " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + " coins.");
+ }
return true;
}
- else
+
+ // Mode for paying another player coins
+ case 3:
{
- p = playerSender;
+ if (args[0].equalsIgnoreCase("pay"))
+ {
+ checkPlayer();
+
+ final Player target = getPlayer(args[1]);
+ final PlayerData senderData = getData(playerSender);
+
+ int coinsToTransfer;
+
+ // Processes args[2]
+ try
+ {
+ // Prevents players from trying to be cheeky with negative numbers.
+ coinsToTransfer = Math.max(Math.abs(Integer.parseInt(args[2])), 1);
+ }
+ catch (NumberFormatException ex)
+ {
+ msg("Invalid number: " + args[2], ChatColor.RED);
+ return true;
+ }
+
+ // Prevents players from performing transactions they can't afford to do.
+ if (senderData.getCoins() < coinsToTransfer)
+ {
+ msg("You don't have enough coins to perform this transaction.", ChatColor.RED);
+ return true;
+ }
+
+ if (target == null)
+ {
+ msg(PLAYER_NOT_FOUND);
+ }
+ else
+ {
+ PlayerData playerData = getData(target);
+ playerData.setCoins(playerData.getCoins() + coinsToTransfer);
+ senderData.setCoins(senderData.getCoins() - coinsToTransfer);
+
+ msg(target, sender.getName()
+ + ChatColor.GREEN + " has given you "
+ + ChatColor.GOLD + coinsToTransfer
+ + ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "") + "!", ChatColor.GOLD);
+
+ msg("You have given "
+ + ChatColor.GOLD + coinsToTransfer
+ + ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "")
+ + " to " + ChatColor.GOLD + target.getName() + ChatColor.GREEN + ".", ChatColor.GREEN);
+ }
+
+ return true;
+ }
+ }
+
+ default:
+ {
+ return false;
}
}
- PlayerData playerData = plugin.pl.getData(p);
- msg(prefix + ChatColor.GREEN + (args.length > 0 ? p.getName() + " has " : "You have ") + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + " coins.");
- return true;
+ }
+
+ @Override
+ public List getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
+ {
+ if (args.length == 1)
+ {
+ List options = new ArrayList<>(FUtil.getPlayerList());
+
+ options.add("pay");
+
+ return options;
+ }
+
+ return FUtil.getPlayerList();
}
}
\ No newline at end of file
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_modifyitem.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_modifyitem.java
index bb7d6ec7..4ba7ab88 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_modifyitem.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_modifyitem.java
@@ -5,13 +5,13 @@ import java.util.List;
import java.util.SplittableRandom;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil;
-import net.minecraft.server.v1_16_R3.NBTTagCompound;
-import net.minecraft.server.v1_16_R3.NBTTagList;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
-import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@@ -151,7 +151,7 @@ public class Command_modifyitem extends FreedomCommand
{
return false;
}
- net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(item);
+ net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(item);
NBTTagCompound compound = (nmsStack.hasTag()) ? nmsStack.getTag() : new NBTTagCompound();
NBTTagList modifiers = getAttributeList(nmsStack);
NBTTagCompound cmpnd = new NBTTagCompound();
@@ -202,7 +202,7 @@ public class Command_modifyitem extends FreedomCommand
return true;
}
- private NBTTagList getAttributeList(net.minecraft.server.v1_16_R3.ItemStack stack)
+ private NBTTagList getAttributeList(net.minecraft.world.item.ItemStack stack)
{
if (stack.getTag() == null)
{
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java
index 0ce530d4..e66c0c73 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java
@@ -130,17 +130,19 @@ public class Command_mute extends FreedomCommand
{
playerdata.setMuted(true);
player.sendTitle(ChatColor.RED + "You've been muted.", ChatColor.YELLOW + "Be sure to follow the rules!", 20, 100, 60);
+
+ if (quiet)
+ {
+ msg("Muted " + player.getName() + " quietly");
+ return true; // doesn't announce reason
+ }
+
+ FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true);
+
if (reason != null)
{
msg(player, ChatColor.RED + "Reason: " + ChatColor.YELLOW + reason);
}
- if (quiet)
- {
- msg("Muted " + player.getName() + " quietly");
- return true;
- }
-
- FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true);
if (smite)
{
@@ -178,4 +180,4 @@ public class Command_mute extends FreedomCommand
return Collections.emptyList();
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java
index a02671cc..45ff1689 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java
@@ -24,6 +24,10 @@ public class Command_opall extends FreedomCommand
msg(player, YOU_ARE_OP);
plugin.rm.updateDisplay(player);
}
+ else
+ {
+ player.recalculatePermissions();
+ }
}
return true;
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java
index 5306ceda..2ef26e69 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java
@@ -1,6 +1,8 @@
package me.totalfreedom.totalfreedommod.command;
import java.util.List;
+
+import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.EnumUtils;
@@ -55,6 +57,7 @@ public class Command_spawnmob extends FreedomCommand
return true;
}
+ int max = ConfigEntry.SPAWNMOB_MAX.getInteger();
int amount = 1;
if (args.length > 1)
{
@@ -69,9 +72,9 @@ public class Command_spawnmob extends FreedomCommand
}
}
- if (amount > 10 || amount < 1)
+ if (amount > max || amount < 1)
{
- msg("Invalid amount: " + args[1] + ". Must be 1-10.", ChatColor.RED);
+ msg("Invalid amount: " + args[1] + ". Must be 1-" + max + ".", ChatColor.RED);
return true;
}
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java
index 44129bd4..16d82e97 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java
@@ -1,11 +1,13 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
+import me.totalfreedom.totalfreedommod.shop.ShopItem;
+import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_IN_GAME)
+@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Trails rainbow wool behind you as you walk/fly.", usage = "/")
public class Command_trail extends FreedomCommand
{
@@ -13,6 +15,12 @@ public class Command_trail extends FreedomCommand
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
+ if (!plugin.pl.getData(playerSender).hasItem(ShopItem.RAINBOW_TRAIL))
+ {
+ msg("You didn't purchase the ability to have a " + ShopItem.RAINBOW_TRAIL.getName() + "! Purchase it from the shop.", ChatColor.RED);
+ return true;
+ }
+
if (plugin.tr.contains(playerSender))
{
plugin.tr.remove(playerSender);
@@ -21,7 +29,7 @@ public class Command_trail extends FreedomCommand
else
{
plugin.tr.add(playerSender);
- msg("Trail enabled. Use \"/trail off\" to disable.");
+ msg("Trail enabled. Run this command again to disable it.");
}
return true;
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java
index 021f30f1..4d336882 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java
@@ -45,6 +45,8 @@ public enum ConfigEntry
MOB_LIMITER_DISABLE_GIANT(Boolean.class, "moblimiter.disable.giant"),
MOB_LIMITER_DISABLE_SLIME(Boolean.class, "moblimiter.disable.slime"),
//
+ SPAWNMOB_MAX(Integer.class, "spawnmob.max"),
+ //
HTTPD_ENABLED(Boolean.class, "httpd.enabled"),
HTTPD_HOST(String.class, "httpd.host"),
HTTPD_PORT(Integer.class, "httpd.port"),
@@ -86,6 +88,7 @@ public enum ConfigEntry
DISCORD_ASSISTANT_EXECUTIVE_ROLE_ID(String.class, "discord.assistant_executive_role_id"),
DISCORD_EXECUTIVE_ROLE_ID(String.class, "discord.executive_role_id"),
DISCORD_SERVER_OWNER_ROLE_ID(String.class, "discord.server_owner_role_id"),
+ DISCORD_INVITE_LINK(String.class, "discord.invite_link"),
//
PTERO_URL(String.class, "ptero.url"),
PTERO_DEFAULT_EMAIL_DOMAIN(String.class, "ptero.default_email_domain"),
@@ -110,6 +113,7 @@ public enum ConfigEntry
SHOP_PRICES_STACKING_POTATO(Integer.class, "shop.prices.stacking_potato"),
SHOP_PRICES_CLOWN_FISH(Integer.class, "shop.prices.clown_fish"),
SHOP_PRICES_LOGIN_MESSAGES(Integer.class, "shop.prices.login_messages"),
+ SHOP_PRICES_RAINBOW_TRAIL(Integer.class, "shop.prices.rainbow_trail"),
//
ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"),
ADMINLIST_CONSOLE_IS_ADMIN(Boolean.class, "adminlist.console_is_admin"),
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java b/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java
index e0f26bff..f4adf0d9 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/discord/DiscordToMinecraftListener.java
@@ -10,9 +10,12 @@ import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
+import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder;
+import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
+import net.md_5.bungee.api.chat.hover.content.Text;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
@@ -28,39 +31,66 @@ public class DiscordToMinecraftListener extends ListenerAdapter
{
Member member = event.getMember();
String tag = getDisplay(member);
- StringBuilder message = new StringBuilder(ChatColor.DARK_GRAY + "[" + ChatColor.DARK_AQUA + "Discord" + ChatColor.DARK_GRAY + "]");
Message msg = event.getMessage();
+
+ ComponentBuilder emsg = new ComponentBuilder();
+
+ // Prefix
+ emsg.append(ChatColor.DARK_GRAY + "[");
+ TextComponent inviteLink = new TextComponent("Discord");
+ inviteLink.setColor(ChatColor.DARK_AQUA.asBungee());
+ inviteLink.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
+ new Text("Click here to get the invite link!")));
+ inviteLink.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL,
+ ConfigEntry.DISCORD_INVITE_LINK.getString()));
+ emsg.append(inviteLink);
+ emsg.append(ChatColor.DARK_GRAY + "] ", ComponentBuilder.FormatRetention.NONE);
+
+ // Tag (if they have one)
if (tag != null)
{
- message.append(" ").append(tag);
- }
- message.append(" ").append(ChatColor.RED).append(ChatColor.stripColor(member.getEffectiveName())).append(ChatColor.DARK_GRAY).append(":").append(ChatColor.RESET);
- ComponentBuilder builder = new ComponentBuilder(message.toString());
- if (!msg.getContentDisplay().isEmpty())
- {
- builder.append(" ").append(ChatColor.stripColor(msg.getContentDisplay()));
- message.append(" ").append(ChatColor.stripColor(msg.getContentDisplay())); // for logging
+ emsg.append(tag);
}
+
+ emsg.append(" ");
+
+ // User
+ TextComponent user = new TextComponent(ChatColor.stripColor(member.getEffectiveName()));
+ user.setColor(ChatColor.RED.asBungee());
+ emsg.append(user);
+
+ // Message
+ emsg.append(ChatColor.DARK_GRAY + ": " + ChatColor.RESET
+ + ChatColor.stripColor(msg.getContentDisplay()), ComponentBuilder.FormatRetention.NONE);
+
+ // Attachments
if (!msg.getAttachments().isEmpty())
{
+ if (!msg.getContentDisplay().isEmpty())
+ emsg.append(" ");
+
for (Message.Attachment attachment : msg.getAttachments())
{
- attachment.getUrl();
- builder.append(" ");
- TextComponent text = new TextComponent(ChatColor.YELLOW + "[Media]");
- text.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, attachment.getUrl()));
- builder.append(text);
- message.append(" [Media]"); // for logging
+ TextComponent media = new TextComponent("[Media] ");
+ media.setColor(ChatColor.YELLOW.asBungee());
+ media.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, attachment.getUrl()));
+ media.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(attachment.getUrl())));
+
+ emsg.append(media, ComponentBuilder.FormatRetention.NONE);
}
}
+
+ BaseComponent[] components = emsg.create();
+
for (Player player : Bukkit.getOnlinePlayers())
{
if (TotalFreedomMod.getPlugin().pl.getData(player).doesDisplayDiscord())
{
- player.spigot().sendMessage(builder.create());
+ player.spigot().sendMessage(components);
}
}
- FLog.info(message.toString());
+
+ FLog.info(TextComponent.toLegacyText(components), true);
}
}
}
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java b/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java
index 012dc4d7..e603b242 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/fun/Trailer.java
@@ -4,7 +4,10 @@ import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.SplittableRandom;
+import java.util.UUID;
+
import me.totalfreedom.totalfreedommod.FreedomService;
+import me.totalfreedom.totalfreedommod.shop.ShopItem;
import me.totalfreedom.totalfreedommod.util.Groups;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -18,7 +21,7 @@ import org.bukkit.event.player.PlayerMoveEvent;
public class Trailer extends FreedomService
{
private final SplittableRandom random = new SplittableRandom();
- private final Set trailPlayers = new HashSet<>(); // player name
+ private final Set trailPlayers = new HashSet<>(); // player UUID
@Override
public void onStart()
@@ -33,17 +36,17 @@ public class Trailer extends FreedomService
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerMove(PlayerMoveEvent event)
{
- if (trailPlayers.isEmpty())
- {
- return;
- }
-
- if (!trailPlayers.contains(event.getPlayer().getName()))
- {
- return;
- }
-
- if (event.getPlayer().getWorld().equals(plugin.wm.masterBuilderWorld.getWorld()))
+ /* Doesn't continue any further if...
+ * - The trail list is empty
+ * - The player doesn't have their trail enabled in the first place
+ * - The player doesn't have the trail item in the shop at all
+ * - The player doesn't have permission to modify blocks in their current world
+ */
+ if (trailPlayers.isEmpty()
+ || !trailPlayers.contains(event.getPlayer().getUniqueId())
+ || !plugin.pl.getData(event.getPlayer()).hasItem(ShopItem.RAINBOW_TRAIL)
+ || plugin.wr.doRestrict(event.getPlayer())
+ || !plugin.wgb.canEditCurrentWorld(event.getPlayer()))
{
return;
}
@@ -69,7 +72,7 @@ public class Trailer extends FreedomService
{
final Location trail_pos;
trail_pos = new Location(event.getPlayer().getWorld(), fromBlock.getX() + x, fromBlock.getY(), fromBlock.getZ() + z);
- if (trailPlayers.contains(event.getPlayer().getName()) && plugin.cpb.isEnabled())
+ if (trailPlayers.contains(event.getPlayer().getUniqueId()) && plugin.cpb.isEnabled())
{
plugin.cpb.getCoreProtectAPI().logPlacement(event.getPlayer().getName(), trail_pos, material, data);
}
@@ -79,16 +82,16 @@ public class Trailer extends FreedomService
public void remove(Player player)
{
- trailPlayers.remove(player.getName());
+ trailPlayers.remove(player.getUniqueId());
}
public void add(Player player)
{
- trailPlayers.add(player.getName());
+ trailPlayers.add(player.getUniqueId());
}
public boolean contains(Player player)
{
- return trailPlayers.contains(player.getName());
+ return trailPlayers.contains(player.getUniqueId());
}
}
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/httpd/NanoHTTPD.java b/src/main/java/me/totalfreedom/totalfreedommod/httpd/NanoHTTPD.java
index c0566cc1..bd045b95 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/httpd/NanoHTTPD.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/httpd/NanoHTTPD.java
@@ -337,12 +337,12 @@ public abstract class NanoHTTPD
*/
protected String decodePercent(String str)
{
- String decoded = null;
+ String decoded = str;
try
{
decoded = URLDecoder.decode(str, "UTF8");
}
- catch (UnsupportedEncodingException ignored)
+ catch (UnsupportedEncodingException | IllegalArgumentException ignored)
{
}
return decoded;
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java b/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java
index 4ce94dd5..fe3bb097 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopItem.java
@@ -10,19 +10,29 @@ public enum ShopItem
LIGHTNING_ROD("Lightning Rod", Material.BLAZE_ROD, 12, ConfigEntry.SHOP_PRICES_LIGHTNING_ROD, ChatColor.LIGHT_PURPLE, "lightningRod", "/lightningrod"),
FIRE_BALL("Fire Ball", Material.FIRE_CHARGE, 14, ConfigEntry.SHOP_PRICES_FIRE_BALL, ChatColor.RED, "fireBall", "/fireball"),
RIDEABLE_PEARL("Rideable Ender Pearl", Material.ENDER_PEARL, 16, ConfigEntry.SHOP_PRICES_RIDEABLE_PEARL, ChatColor.DARK_PURPLE, "rideablePearl", "/rideablepearl"),
- STACKING_POTATO("Stacking Potato", Material.POTATO, 20, ConfigEntry.SHOP_PRICES_STACKING_POTATO, ChatColor.YELLOW, "stackingPotato", "/stackingpotato"),
- CLOWN_FISH("Clown Fish", Material.TROPICAL_FISH, 22, ConfigEntry.SHOP_PRICES_CLOWN_FISH, ChatColor.GOLD, "clownFish", "/clownfish"),
- LOGIN_MESSAGES("Login Messages", Material.NAME_TAG, 24, ConfigEntry.SHOP_PRICES_LOGIN_MESSAGES, ChatColor.DARK_GREEN, "loginMessages", "/loginmessage");
+ STACKING_POTATO("Stacking Potato", Material.POTATO, 19, ConfigEntry.SHOP_PRICES_STACKING_POTATO, ChatColor.YELLOW, "stackingPotato", "/stackingpotato"),
+ CLOWN_FISH("Clown Fish", Material.TROPICAL_FISH, 21, ConfigEntry.SHOP_PRICES_CLOWN_FISH, ChatColor.GOLD, "clownFish", "/clownfish"),
+ LOGIN_MESSAGES("Login Messages", Material.NAME_TAG, 23, ConfigEntry.SHOP_PRICES_LOGIN_MESSAGES, ChatColor.DARK_GREEN, "loginMessages", "/loginmessage"),
+ RAINBOW_TRAIL("Rainbow Trail", Material.RED_WOOL, 25, ConfigEntry.SHOP_PRICES_RAINBOW_TRAIL, ChatColor.DARK_RED, "rainbowTrail", "/trail");
/*
Shop GUI Layout:
Dimensions: 9x4 = 36
- Key: g = Grappling Hook, l = Lightning Rod, f = Fire Ball, r = Rideable Ender Pearl, s = Stacking Potato, c = Clown Fish, x = Login Messages $ = Coins}
+ Key:
+ g = Grappling Hook,
+ l = Lightning Rod
+ f = Fire Ball
+ r = Rideable Ender Pearl
+ s = Stacking Potato
+ c = Clown Fish
+ x = Login Messages
+ t = Rainbow Trail
+ $ = Coins
---------
-g-l-f-r-
- --s-c-x--
+ -s-c-x-t-
--------$
*/
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java
index 81bae8cc..f6988aec 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java
@@ -36,8 +36,6 @@ import static org.bukkit.Bukkit.getServer;
public class FUtil
{
-
- public static final String SAVED_FLAGS_FILENAME = "savedflags.dat";
/* See https://github.com/TotalFreedom/License - None of the listed names may be removed.
Leaving this list here for anyone running TFM on a cracked server:
public static final List DEVELOPERS = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "Telesphoreo", "CoolJWB");
@@ -754,7 +752,7 @@ public class FUtil
public static String getIp(Player player)
{
- return Objects.requireNonNull(player.getAddress()).getAddress().getHostAddress().trim();
+ return player.getAddress().getAddress().getHostAddress().trim();
}
public static String getIp(PlayerLoginEvent event)
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java b/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java
index b0f66ded..0df27d99 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java
@@ -45,140 +45,9 @@ public class Groups
Material.LIGHT_GRAY_SHULKER_BOX,
Material.BLACK_SHULKER_BOX);
- public static final List MOB_TYPES = Arrays.asList(
- EntityType.BAT,
- EntityType.BEE,
- EntityType.BLAZE,
- EntityType.CAVE_SPIDER,
- EntityType.CHICKEN,
- EntityType.CAT,
- EntityType.COD,
- EntityType.COW,
- EntityType.CREEPER,
- EntityType.DOLPHIN,
- EntityType.DONKEY,
- EntityType.DROWNED,
- EntityType.ELDER_GUARDIAN,
- EntityType.ENDERMAN,
- EntityType.ENDERMITE,
- EntityType.EVOKER,
- EntityType.FOX,
- EntityType.GHAST,
- EntityType.GUARDIAN,
- EntityType.HOGLIN,
- EntityType.HORSE,
- EntityType.HUSK,
- EntityType.ILLUSIONER,
- EntityType.IRON_GOLEM,
- EntityType.LLAMA,
- EntityType.MAGMA_CUBE,
- EntityType.MUSHROOM_COW,
- EntityType.MULE,
- EntityType.OCELOT,
- EntityType.PANDA,
- EntityType.PARROT,
- EntityType.PHANTOM,
- EntityType.PIG,
- EntityType.PIGLIN,
- EntityType.PIGLIN_BRUTE,
- EntityType.PILLAGER,
- EntityType.POLAR_BEAR,
- EntityType.PUFFERFISH,
- EntityType.RABBIT,
- EntityType.RAVAGER,
- EntityType.SALMON,
- EntityType.SHEEP,
- EntityType.SHULKER,
- EntityType.SILVERFISH,
- EntityType.SKELETON,
- EntityType.SKELETON_HORSE,
- EntityType.SLIME,
- EntityType.SNOWMAN,
- EntityType.SPIDER,
- EntityType.SQUID,
- EntityType.STRAY,
- EntityType.STRIDER,
- EntityType.TRADER_LLAMA,
- EntityType.TROPICAL_FISH,
- EntityType.TURTLE,
- EntityType.VEX,
- EntityType.VILLAGER,
- EntityType.VINDICATOR,
- EntityType.WANDERING_TRADER,
- EntityType.WITCH,
- EntityType.WITHER_SKELETON,
- EntityType.WOLF,
- EntityType.ZOGLIN,
- EntityType.ZOMBIE,
- EntityType.ZOMBIE_HORSE,
- EntityType.ZOMBIFIED_PIGLIN,
- EntityType.ZOMBIE_VILLAGER);
+ public static final List MOB_TYPES = Arrays.stream(EntityType.values()).filter(EntityType::isAlive).filter(EntityType::isSpawnable).toList();
- public static final List SPAWN_EGGS = Arrays.asList(
- Material.BAT_SPAWN_EGG,
- Material.BEE_SPAWN_EGG,
- Material.BLAZE_SPAWN_EGG,
- Material.CAVE_SPIDER_SPAWN_EGG,
- Material.CHICKEN_SPAWN_EGG,
- Material.CAT_SPAWN_EGG,
- Material.COD_SPAWN_EGG,
- Material.COW_SPAWN_EGG,
- Material.CREEPER_SPAWN_EGG,
- Material.DOLPHIN_SPAWN_EGG,
- Material.DONKEY_SPAWN_EGG,
- Material.DROWNED_SPAWN_EGG,
- Material.ELDER_GUARDIAN_SPAWN_EGG,
- Material.ENDERMAN_SPAWN_EGG,
- Material.ENDERMITE_SPAWN_EGG,
- Material.EVOKER_SPAWN_EGG,
- Material.FOX_SPAWN_EGG,
- Material.GHAST_SPAWN_EGG,
- Material.GUARDIAN_SPAWN_EGG,
- Material.HOGLIN_SPAWN_EGG,
- Material.HORSE_SPAWN_EGG,
- Material.HUSK_SPAWN_EGG,
- Material.LLAMA_SPAWN_EGG,
- Material.MAGMA_CUBE_SPAWN_EGG,
- Material.MOOSHROOM_SPAWN_EGG,
- Material.MULE_SPAWN_EGG,
- Material.OCELOT_SPAWN_EGG,
- Material.PANDA_SPAWN_EGG,
- Material.PARROT_SPAWN_EGG,
- Material.PHANTOM_SPAWN_EGG,
- Material.PIG_SPAWN_EGG,
- Material.PIGLIN_SPAWN_EGG,
- Material.PIGLIN_BRUTE_SPAWN_EGG,
- Material.PILLAGER_SPAWN_EGG,
- Material.POLAR_BEAR_SPAWN_EGG,
- Material.PUFFERFISH_SPAWN_EGG,
- Material.RABBIT_SPAWN_EGG,
- Material.RAVAGER_SPAWN_EGG,
- Material.SALMON_SPAWN_EGG,
- Material.SHEEP_SPAWN_EGG,
- Material.SHULKER_SPAWN_EGG,
- Material.SILVERFISH_SPAWN_EGG,
- Material.SKELETON_SPAWN_EGG,
- Material.SKELETON_HORSE_SPAWN_EGG,
- Material.SLIME_SPAWN_EGG,
- Material.SPIDER_SPAWN_EGG,
- Material.SQUID_SPAWN_EGG,
- Material.STRAY_SPAWN_EGG,
- Material.STRIDER_SPAWN_EGG,
- Material.TRADER_LLAMA_SPAWN_EGG,
- Material.TROPICAL_FISH_SPAWN_EGG,
- Material.TURTLE_SPAWN_EGG,
- Material.VEX_SPAWN_EGG,
- Material.VILLAGER_SPAWN_EGG,
- Material.VINDICATOR_SPAWN_EGG,
- Material.WANDERING_TRADER_SPAWN_EGG,
- Material.WITCH_SPAWN_EGG,
- Material.WITHER_SKELETON_SPAWN_EGG,
- Material.WOLF_SPAWN_EGG,
- Material.ZOGLIN_SPAWN_EGG,
- Material.ZOMBIE_SPAWN_EGG,
- Material.ZOMBIE_HORSE_SPAWN_EGG,
- Material.ZOMBIFIED_PIGLIN_SPAWN_EGG,
- Material.ZOMBIE_VILLAGER_SPAWN_EGG);
+ public static final List SPAWN_EGGS = Arrays.stream(Material.values()).filter((mat) -> mat.name().endsWith("_SPAWN_EGG")).toList();
public static final List BANNERS = Arrays.asList(
Material.BLACK_BANNER,
diff --git a/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java b/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java
index 32033da5..790a6f33 100644
--- a/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java
+++ b/src/main/java/me/totalfreedom/totalfreedommod/world/Flatlands.java
@@ -1,9 +1,6 @@
package me.totalfreedom.totalfreedommod.world;
-import java.io.File;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
-import me.totalfreedom.totalfreedommod.util.FLog;
-import org.apache.commons.io.FileUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@@ -32,8 +29,6 @@ public class Flatlands extends CustomWorld
return null;
}
- wipeFlatlandsIfFlagged();
-
final WorldCreator worldCreator = new WorldCreator(getName());
worldCreator.generateStructures(false);
worldCreator.type(WorldType.NORMAL);
@@ -63,32 +58,4 @@ public class Flatlands extends CustomWorld
return world;
}
-
-
- public void wipeFlatlandsIfFlagged()
- {
- boolean doFlatlandsWipe = false;
- try
- {
- doFlatlandsWipe = plugin.sf.getSavedFlag("do_wipe_flatlands");
- }
- catch (Exception ignored)
- {
- }
-
- if (doFlatlandsWipe)
- {
- if (Bukkit.getServer().getWorld("flatlands") == null)
- {
- FLog.info("Wiping flatlands.");
- plugin.sf.setSavedFlag("do_wipe_flatlands", false);
- FileUtils.deleteQuietly(new File("./flatlands"));
- }
- else
- {
- FLog.severe("Can't wipe flatlands, it is already loaded.");
- }
- }
- }
-
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 1530fbfa..33b4b43e 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -84,6 +84,8 @@ discord:
executive_role_id: ''
# Owner role ID
server_owner_role_id: ''
+ # Invite link for your Discord server
+ invite_link: 'https://discord.com/invite/PW4savJR9a'
# Pterodactyl
ptero:
@@ -159,6 +161,7 @@ shop:
stacking_potato: 300
clown_fish: 1500
login_messages: 5000
+ rainbow_trail: 1500
# Admin list
adminlist:
@@ -506,6 +509,10 @@ moblimiter:
slime: true
giant: true
+# Spawnmob
+spawnmob:
+ max: 25
+
# Flatlands
flatlands:
generate: true
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index d5bd702c..308beb03 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -14,4 +14,4 @@ softdepend:
- JDA
- Votifier
authors: [Madgeek1450, Prozza]
-api-version: "1.16"
\ No newline at end of file
+api-version: "1.17"
\ No newline at end of file