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 - 11 + 17 + 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