Apply a bunch of changes (read description of commit)

- Replace essentials mute check with BanManager mute check
- Compact listeners
- Add @NotNull to String[] args in commands
- Add a /sky message
- Add a /skyrtp command
- Fix admins breaking floor in box
- Improve furnace place message
- Compact listener code
- Disable withers & delete wither skull land listener
- Fix players going above 319 Y level in sky
- Optimize listener registration
- Add %galaxyboxpvp_hearts% placceholder
This commit is contained in:
2025-04-07 23:57:10 -07:00
parent 12ed22f044
commit 1863fe3164
17 changed files with 143 additions and 77 deletions

20
pom.xml
View File

@@ -36,14 +36,14 @@
<id>placeholderapi-repo</id> <id>placeholderapi-repo</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url> <url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository> </repository>
<repository>
<id>essentials-releases</id>
<url>https://repo.essentialsx.net/releases/</url>
</repository>
<repository> <repository>
<id>jitpack.io</id> <id>jitpack.io</id>
<url>https://jitpack.io</url> <url>https://jitpack.io</url>
</repository> </repository>
<repository>
<id>confuser-repo</id>
<url>https://ci.frostcast.net/plugin/repository/everything</url>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency> <dependency>
@@ -58,18 +58,18 @@
<version>2.11.6</version> <version>2.11.6</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>net.essentialsx</groupId>
<artifactId>EssentialsX</artifactId>
<version>2.21.0</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>com.github.booksaw</groupId> <groupId>com.github.booksaw</groupId>
<artifactId>BetterTeams</artifactId> <artifactId>BetterTeams</artifactId>
<version>4.11.0</version> <version>4.11.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>me.confuser.banmanager</groupId>
<artifactId>BanManagerCommon</artifactId>
<version>7.9.0</version>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
<properties> <properties>
<java.version>21</java.version> <java.version>21</java.version>

View File

@@ -2,6 +2,8 @@ package xyz.lncvrt.galaxyboxpvp;
import com.earth2me.essentials.Essentials; import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User; import com.earth2me.essentials.User;
import me.confuser.banmanager.common.BanManagerPlugin;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.TabExecutor; import org.bukkit.command.TabExecutor;
@@ -9,12 +11,14 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException; import org.json.simple.parser.ParseException;
import xyz.lncvrt.galaxyboxpvp.commands.Autocompress; import xyz.lncvrt.galaxyboxpvp.commands.Autocompress;
import xyz.lncvrt.galaxyboxpvp.commands.Sky; import xyz.lncvrt.galaxyboxpvp.commands.Sky;
import xyz.lncvrt.galaxyboxpvp.commands.Skyrtp;
import xyz.lncvrt.galaxyboxpvp.events.*; import xyz.lncvrt.galaxyboxpvp.events.*;
import java.io.File; import java.io.File;
@@ -29,21 +33,12 @@ import java.util.logging.Level;
public final class GalaxyBoxPvP extends JavaPlugin implements TabExecutor { public final class GalaxyBoxPvP extends JavaPlugin implements TabExecutor {
public final Map<UUID, Boolean> autoCompressStatus = new HashMap<>(); public final Map<UUID, Boolean> autoCompressStatus = new HashMap<>();
private Essentials essentials; public final Map<UUID, Long> skyRTPDelays = new HashMap<>();
private final PlaceholderAPIExpansion placeholderAPIExpansion = new PlaceholderAPIExpansion(); private final PlaceholderAPIExpansion placeholderAPIExpansion = new PlaceholderAPIExpansion();
public final MiniMessage miniMessage = MiniMessage.miniMessage();
@Override @Override
public void onEnable() { public void onEnable() {
Plugin essentialsPlugin = Bukkit.getServer().getPluginManager().getPlugin("Essentials");
getLogger().info("Essentials detected. Attempting to hook...");
if (essentialsPlugin instanceof Essentials) {
essentials = (Essentials) essentialsPlugin;
getLogger().info("Essentials hooked successfully.");
} else {
getLogger().info("Essentials failed to hook. Disabling plugin");
getServer().getPluginManager().disablePlugin(this);
}
if (placeholderAPIExpansion.register()) { if (placeholderAPIExpansion.register()) {
getLogger().info("Successfully registered PlaceholderAPIExpansion!"); getLogger().info("Successfully registered PlaceholderAPIExpansion!");
} else { } else {
@@ -65,23 +60,26 @@ public final class GalaxyBoxPvP extends JavaPlugin implements TabExecutor {
} }
private void registerEvents() { private void registerEvents() {
getServer().getPluginManager().registerEvents(new BlockBreakListener(this), this); PluginManager pluginManager = getServer().getPluginManager();
getServer().getPluginManager().registerEvents(new BlockPlaceListener(), this); pluginManager.registerEvents(new BlockBreakListener(this), this);
getServer().getPluginManager().registerEvents(new CraftItemListener(), this); pluginManager.registerEvents(new BlockPlaceListener(this), this);
getServer().getPluginManager().registerEvents(new EntityPickupItemListener(this), this); pluginManager.registerEvents(new CraftItemListener(), this);
getServer().getPluginManager().registerEvents(new FurnaceBurnListener(this), this); pluginManager.registerEvents(new EntityPickupItemListener(this), this);
getServer().getPluginManager().registerEvents(new FurnaceSmeltListener(this), this); pluginManager.registerEvents(new EntitySpawnListener(), this);
getServer().getPluginManager().registerEvents(new PlayerDropItemListener(this), this); pluginManager.registerEvents(new FurnaceBurnListener(this), this);
getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this); pluginManager.registerEvents(new FurnaceSmeltListener(this), this);
getServer().getPluginManager().registerEvents(new PrepareAnvilListener(), this); pluginManager.registerEvents(new PlayerDropItemListener(this), this);
getServer().getPluginManager().registerEvents(new PrepareItemEnchantListener(), this); pluginManager.registerEvents(new PlayerJoinListener(this), this);
getServer().getPluginManager().registerEvents(new ProjectileHitListener(), this); pluginManager.registerEvents(new PlayerMoveListener(), this);
getServer().getPluginManager().registerEvents(new SignChangeListener(this), this); pluginManager.registerEvents(new PrepareAnvilListener(), this);
pluginManager.registerEvents(new PrepareItemEnchantListener(), this);
pluginManager.registerEvents(new SignChangeListener(this), this);
} }
private void registerCommands() { private void registerCommands() {
Objects.requireNonNull(getCommand("autocompress")).setExecutor(new Autocompress(this)); Objects.requireNonNull(getCommand("autocompress")).setExecutor(new Autocompress(this));
Objects.requireNonNull(getCommand("sky")).setExecutor(new Sky()); Objects.requireNonNull(getCommand("sky")).setExecutor(new Sky());
Objects.requireNonNull(getCommand("skyrtp")).setExecutor(new Skyrtp(this));
} }
public boolean isRestrictedMaterial(Material material) { public boolean isRestrictedMaterial(Material material) {
@@ -194,7 +192,6 @@ public final class GalaxyBoxPvP extends JavaPlugin implements TabExecutor {
} }
public boolean isMuted(Player player) { public boolean isMuted(Player player) {
User user = essentials.getUser(player); return BanManagerPlugin.getInstance().getPlayerMuteStorage().isMuted(player.getUniqueId());
return user.isMuted();
} }
} }

View File

@@ -37,6 +37,8 @@ public final class PlaceholderAPIExpansion extends PlaceholderExpansion {
@Override @Override
public @Nullable String onPlaceholderRequest(Player player, @NotNull String identifier) { public @Nullable String onPlaceholderRequest(Player player, @NotNull String identifier) {
switch (identifier) { switch (identifier) {
case "hearts":
return String.format("%.1f", player.getHealth() / 2);
case "kills": case "kills":
return String.valueOf(player.getStatistic(Statistic.PLAYER_KILLS)); return String.valueOf(player.getStatistic(Statistic.PLAYER_KILLS));
case "deaths": case "deaths":

View File

@@ -15,7 +15,7 @@ import static org.bukkit.ChatColor.RED;
public record Autocompress(GalaxyBoxPvP plugin) implements CommandExecutor { public record Autocompress(GalaxyBoxPvP plugin) implements CommandExecutor {
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String @NotNull [] args) {
if (!(sender instanceof Player player)) { if (!(sender instanceof Player player)) {
sender.sendMessage(RED + "This command can only be executed by a player."); sender.sendMessage(RED + "This command can only be executed by a player.");
return true; return true;

View File

@@ -1,5 +1,6 @@
package xyz.lncvrt.galaxyboxpvp.commands; package xyz.lncvrt.galaxyboxpvp.commands;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@@ -8,9 +9,10 @@ import org.jetbrains.annotations.NotNull;
public class Sky implements CommandExecutor { public class Sky implements CommandExecutor {
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String @NotNull [] args) {
if (sender instanceof Player player) { if (sender instanceof Player player) {
player.performCommand("warp sky"); player.performCommand("warp sky");
player.sendMessage(MiniMessage.miniMessage().deserialize("<green>You can do <b><u><click:suggest_command:'/skyrtp'>/skyrtp</click></u></b> (click the bold text) to randomly teleport around here!"));
} }
return true; return true;
} }

View File

@@ -0,0 +1,51 @@
package xyz.lncvrt.galaxyboxpvp.commands;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import xyz.lncvrt.galaxyboxpvp.GalaxyBoxPvP;
import java.util.concurrent.ThreadLocalRandom;
public class Skyrtp implements CommandExecutor {
private final GalaxyBoxPvP plugin;
public Skyrtp(GalaxyBoxPvP plugin) {
this.plugin = plugin;
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String @NotNull [] args) {
if (sender instanceof Player player) {
Long last = plugin.skyRTPDelays.get(player.getUniqueId());
Long time = System.currentTimeMillis();
if (last != null && time - last < 30000) {
Long timeLeft = (30000 - (System.currentTimeMillis() - last)) / 1000;
player.sendMessage(plugin.miniMessage.deserialize("<red>You can't RTP in the sky world so often, please wait %s second(s)!".formatted(timeLeft)));
return true;
}
World world = plugin.getServer().getWorld("sky");
if (world == null) {
player.sendMessage(plugin.miniMessage.deserialize("<red>Failed, please try again!"));
return true;
}
int randomX = ThreadLocalRandom.current().nextInt(100, 15000);
int randomZ = ThreadLocalRandom.current().nextInt(100, 15000);
Location location = new Location(world, randomX, 100, randomZ);
Block block = world.getBlockAt(location);
if (block.getType() == Material.AIR) {
block.setType(Material.GRASS_BLOCK);
}
player.teleport(location.add(0.5f, 1, 0.5f));
player.sendMessage(plugin.miniMessage.deserialize("<green>You have been randomly teleported to <u>%s 100 %s<u>".formatted(randomX, randomZ)));
plugin.skyRTPDelays.put(player.getUniqueId(), time);
}
return true;
}
}

View File

@@ -17,5 +17,8 @@ public class BlockBreakListener implements Listener {
public void onBlockBreak(BlockBreakEvent event) { public void onBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
plugin.convertInventoryItemsPrep(player, player.getUniqueId()); plugin.convertInventoryItemsPrep(player, player.getUniqueId());
if (event.getBlock().getLocation().getY() == 100 && event.getBlock().getWorld().getName().equals("world")) {
event.setCancelled(true);
}
} }
} }

View File

@@ -1,36 +1,26 @@
package xyz.lncvrt.galaxyboxpvp.events; package xyz.lncvrt.galaxyboxpvp.events;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import xyz.lncvrt.galaxyboxpvp.GalaxyBoxPvP;
public class BlockPlaceListener implements Listener { public class BlockPlaceListener implements Listener {
private final GalaxyBoxPvP plugin;
public BlockPlaceListener(GalaxyBoxPvP plugin) {
this.plugin = plugin;
}
@EventHandler @EventHandler
public void onBlockPlace(BlockPlaceEvent event) { public void onBlockPlace(BlockPlaceEvent event) {
if (event.getBlockPlaced().getType() == Material.POLISHED_BLACKSTONE_BUTTON) { if (event.getBlockPlaced().getType() == Material.POLISHED_BLACKSTONE_BUTTON) {
if (event.getItemInHand().hasItemMeta() && event.getItemInHand().getItemMeta().hasDisplayName()) { if (event.getItemInHand().hasItemMeta() && event.getItemInHand().getItemMeta().hasDisplayName()) {
event.setCancelled(true); //temp fix event.setCancelled(true); //temp fix
} }
} else if (event.getBlockPlaced().getType() == Material.FURNACE || } else if (event.getBlockPlaced().getType() == Material.FURNACE || event.getBlockPlaced().getType() == Material.FURNACE_MINECART || event.getBlockPlaced().getType() == Material.BLAST_FURNACE) {
event.getBlockPlaced().getType() == Material.FURNACE_MINECART || event.getPlayer().sendMessage(plugin.miniMessage.deserialize("<bold><green>[TIP] </green></bold><green>If you are trying to smelt iron, gold, etc you can use the Smelter Shop. Click <underlined><click:run_command:'/warp smelter'>[HERE]</click></underlined> to teleport to the smelter shop!</green>"));
event.getBlockPlaced().getType() == Material.BLAST_FURNACE) {
Player player = event.getPlayer();
Component message = Component.text("[TIP] ", NamedTextColor.GREEN)
.decorate(TextDecoration.BOLD)
.append(Component.text("If you are trying to smelt iron, gold, etc you can use the Smelter Shop. Click ", NamedTextColor.GREEN))
.append(Component.text("[HERE]", NamedTextColor.GREEN)
.decorate(TextDecoration.UNDERLINED)
.clickEvent(ClickEvent.runCommand("/warp smelter")))
.append(Component.text(" to teleport to the smelter shop!", NamedTextColor.GREEN));
player.sendMessage(message);
} }
} }
} }

View File

@@ -16,8 +16,6 @@ public class EntityPickupItemListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onItemPickup(EntityPickupItemEvent event) { public void onItemPickup(EntityPickupItemEvent event) {
if (event.getEntity() instanceof Player player) { if (event.getEntity() instanceof Player player) plugin.convertInventoryItemsPrep(player, player.getUniqueId());
plugin.convertInventoryItemsPrep(player, player.getUniqueId());
}
} }
} }

View File

@@ -0,0 +1,13 @@
package xyz.lncvrt.galaxyboxpvp.events;
import org.bukkit.entity.EntityType;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntitySpawnEvent;
public class EntitySpawnListener implements Listener {
@EventHandler
public void onEntitySpawnEvent(EntitySpawnEvent event) {
if (event.getEntityType() == EntityType.WITHER) event.setCancelled(true);
}
}

View File

@@ -20,9 +20,6 @@ public class FurnaceBurnListener implements Listener {
public void onFurnaceBurn(FurnaceBurnEvent event) { public void onFurnaceBurn(FurnaceBurnEvent event) {
Furnace furnace = (Furnace) event.getBlock().getState(); Furnace furnace = (Furnace) event.getBlock().getState();
Material smelting = Objects.requireNonNull(furnace.getInventory().getSmelting()).getType(); Material smelting = Objects.requireNonNull(furnace.getInventory().getSmelting()).getType();
if (plugin.isRestrictedMaterial(smelting)) event.setCancelled(true);
if (plugin.isRestrictedMaterial(smelting)) {
event.setCancelled(true);
}
} }
} }

View File

@@ -16,9 +16,6 @@ public class FurnaceSmeltListener implements Listener {
@EventHandler @EventHandler
public void onFurnaceSmelt(FurnaceSmeltEvent event) { public void onFurnaceSmelt(FurnaceSmeltEvent event) {
Material smelted = event.getSource().getType(); Material smelted = event.getSource().getType();
if (plugin.isRestrictedMaterial(smelted)) event.setCancelled(true);
if (plugin.isRestrictedMaterial(smelted)) {
event.setCancelled(true);
}
} }
} }

View File

@@ -22,10 +22,7 @@ public class PlayerJoinListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
if (!plugin.autoCompressStatus.containsKey(playerId)) { if (!plugin.autoCompressStatus.containsKey(playerId)) plugin.autoCompressStatus.put(playerId, false);
plugin.autoCompressStatus.put(playerId, false);
}
player.sendMessage("%sWelcome to LncvrtBox, %s! This is a PvP arena gamemode that was originally called LncvrtBox, and is almost a year old! We reset the server for GalaxyNetwork and a fresh start".formatted(GREEN, player.getName())); player.sendMessage("%sWelcome to LncvrtBox, %s! This is a PvP arena gamemode that was originally called LncvrtBox, and is almost a year old! We reset the server for GalaxyNetwork and a fresh start".formatted(GREEN, player.getName()));
} }
} }

View File

@@ -0,0 +1,20 @@
package xyz.lncvrt.galaxyboxpvp.events;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
public class PlayerMoveListener implements Listener {
@EventHandler
private void onSignPlace(PlayerMoveEvent event) {
Player player = event.getPlayer();
int maxY = player.getWorld().getMaxHeight();
if (player.getLocation().getY() >= maxY) {
Location newLocation = player.getLocation().clone();
newLocation.setY(maxY - 1);
player.teleport(newLocation);
}
}
}

View File

@@ -10,8 +10,6 @@ public class PrepareItemEnchantListener implements Listener {
@EventHandler @EventHandler
public void onPrepareItemEnchant(PrepareItemEnchantEvent event) { public void onPrepareItemEnchant(PrepareItemEnchantEvent event) {
ItemStack item = event.getItem(); ItemStack item = event.getItem();
if (item.getType() == Material.DIAMOND_PICKAXE || item.getType() == Material.NETHERITE_PICKAXE) { if (item.getType() == Material.DIAMOND_PICKAXE || item.getType() == Material.NETHERITE_PICKAXE) event.setCancelled(true);
event.setCancelled(true);
}
} }
} }

View File

@@ -14,8 +14,6 @@ public class SignChangeListener implements Listener {
@EventHandler @EventHandler
private void onSignPlace(SignChangeEvent event) { private void onSignPlace(SignChangeEvent event) {
if (plugin.isMuted(event.getPlayer())) { if (plugin.isMuted(event.getPlayer())) event.setCancelled(true);
event.setCancelled(true);
}
} }
} }

View File

@@ -13,3 +13,6 @@ commands:
sky: sky:
description: Teleports you to sky world description: Teleports you to sky world
usage: /sky usage: /sky
skyrtp:
description: Teleports you to a random location in sky world
usage: /sky