From cd569b9914c842de30e270e01eca1a5428e5974f Mon Sep 17 00:00:00 2001 From: Logan Fick Date: Sat, 4 Jun 2022 14:26:52 -0400 Subject: [PATCH] Added ability to disable mob spawning inside of arenas. --- .../dev/logal/snowbrawl/CommandHandler.java | 19 +++++++++++++++++ .../java/dev/logal/snowbrawl/Snowbrawl.java | 2 ++ .../snowbrawl/managers/ArenaManager.java | 8 +++++-- .../java/dev/logal/snowbrawl/types/Arena.java | 21 +++++++++++++++++++ src/main/resources/commands.cmd | 7 +++++++ 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/logal/snowbrawl/CommandHandler.java b/src/main/java/dev/logal/snowbrawl/CommandHandler.java index 6fa1c93..4e0f1cf 100644 --- a/src/main/java/dev/logal/snowbrawl/CommandHandler.java +++ b/src/main/java/dev/logal/snowbrawl/CommandHandler.java @@ -404,6 +404,25 @@ public final class CommandHandler { this.snowbrawl.saveConfig(); } + @Command(hook = "set_arena_mobspawningallowed") + public void commandArenasMobSpawningAllowed(CommandSender sender, String name, boolean mobSpawningAllowed){ + Arena arena = this.snowbrawl.getArenaManager().getArenaByName(name); + if (arena == null){ + sender.sendMessage(failMessage("The specified arena does not exist.")); + return; + } + + arena.setMobSpawningAllowed(mobSpawningAllowed); + + if (mobSpawningAllowed){ + sender.sendMessage(successMessage("Mob spawning is now allowed in arena " + arena.getName() + ".")); + } else { + sender.sendMessage(successMessage("Mob spawning is now blocked in arena " + arena.getName() + ".")); + } + + this.snowbrawl.saveConfig(); + } + /** * Sets one corner of this arena's bounds to the given coordinates. * diff --git a/src/main/java/dev/logal/snowbrawl/Snowbrawl.java b/src/main/java/dev/logal/snowbrawl/Snowbrawl.java index 53920f8..17d05b8 100644 --- a/src/main/java/dev/logal/snowbrawl/Snowbrawl.java +++ b/src/main/java/dev/logal/snowbrawl/Snowbrawl.java @@ -90,6 +90,7 @@ public final class Snowbrawl extends JavaPlugin { newConfig.set("arenas." + id + ".graceTime", arena.getGraceTime()); newConfig.set("arenas." + id + ".matchTime", arena.getMatchTime()); newConfig.set("arenas." + id + ".damage", arena.getDamage()); + newConfig.set("arenas." + id + ".mobspawningallowed", arena.isMobSpawningAllowed()); newConfig.set("arenas." + id + ".world", arena.getWorld().getName()); newConfig.set("arenas." + id + ".pos1.x", arena.getPos1().getX()); @@ -161,6 +162,7 @@ public final class Snowbrawl extends JavaPlugin { arena.setGraceTime(config.getInt("arenas." + id + ".graceTime", Arena.DEFAULT_GRACE_TIME)); arena.setMatchTime(config.getInt("arenas." + id + ".matchTime", Arena.DEFAULT_MATCH_TIME)); arena.setDamage(config.getInt("arenas." + id + ".damage", Arena.DEFAULT_DAMAGE)); + arena.setMobSpawningAllowed(config.getBoolean("arenas." + id + ".mobspawningallowed", Arena.DEFAULT_MOB_SPAWNING_ALLOWED)); // The world can be null because Arena overrides it with the actual world. Only the coordinates matter. arena.setPos1(new Location(null, config.getDouble("arenas." + id + ".pos1.x", Arena.DEFAULT_POS1_X), config.getDouble("arenas." + id + ".pos1.y", Arena.DEFAULT_POS1_Y), config.getDouble("arenas." + id + ".pos1.z", Arena.DEFAULT_POS1_Z))); diff --git a/src/main/java/dev/logal/snowbrawl/managers/ArenaManager.java b/src/main/java/dev/logal/snowbrawl/managers/ArenaManager.java index a4623be..af61b23 100644 --- a/src/main/java/dev/logal/snowbrawl/managers/ArenaManager.java +++ b/src/main/java/dev/logal/snowbrawl/managers/ArenaManager.java @@ -575,13 +575,16 @@ public class ArenaManager implements Listener { } /** - * Not implemented. + * Prevents entities from spawning inside of arenas with mob spawning set to disabled. * * @param event The event. */ @EventHandler(ignoreCancelled = true) public void onEntitySpawn(final EntitySpawnEvent event){ - // TODO: Add configurable option for preventing entity spawns in arenas. + final Arena arena = this.getArenaByLocation(event.getEntity().getLocation()); + if (arena != null && !arena.isMobSpawningAllowed()){ + event.setCancelled(true); + } } /** @@ -902,6 +905,7 @@ public class ArenaManager implements Listener { logger.info(" - Grace Time: " + arena.getGraceTime() + "s"); logger.info(" - Match Time: " + arena.getMatchTime() + "s"); logger.info(" - Damage: " + arena.getDamage() + " HP"); + logger.info(" - Mob Spawning Allowed: " + arena.isMobSpawningAllowed()); logger.info(" - World: " + arena.getWorld().getName()); Location pos1 = arena.getPos1(), pos2 = arena.getPos2(); diff --git a/src/main/java/dev/logal/snowbrawl/types/Arena.java b/src/main/java/dev/logal/snowbrawl/types/Arena.java index c5114c4..58c4e3a 100644 --- a/src/main/java/dev/logal/snowbrawl/types/Arena.java +++ b/src/main/java/dev/logal/snowbrawl/types/Arena.java @@ -26,6 +26,7 @@ public class Arena { public static final int DEFAULT_GRACE_TIME = 15 * 20; public static final int DEFAULT_MATCH_TIME = 300 * 20; public static final int DEFAULT_DAMAGE = 4; + public static final boolean DEFAULT_MOB_SPAWNING_ALLOWED = false; public static final double DEFAULT_POS1_X = 0, DEFAULT_POS1_Y = 0, DEFAULT_POS1_Z = 0; public static final double DEFAULT_POS2_X = 0, DEFAULT_POS2_Y = 0, DEFAULT_POS2_Z = 0; @@ -39,6 +40,7 @@ public class Arena { private int playerLimit; // Maximum amount of players allowed in this arena in a match. private int graceTime, matchTime; private int damage; // Damage dealt to players per snowball hit. + private boolean allowMobSpawning; private World world; // Which world the coordinates apply to. private Location pos1, pos2; // Coordinates identifying the 2 corners of the arena. @@ -60,6 +62,7 @@ public class Arena { public Arena(final String name, final World world){ this.setName(name); + this.setEnabled(DEFAULT_ENABLED); this.setRefill(DEFAULT_REFILL); this.setPlayerLimit(DEFAULT_PLAYER_LIMIT); this.setGraceTime(DEFAULT_GRACE_TIME); @@ -222,6 +225,24 @@ public class Arena { this.damage = damage; } + /** + * Gets whether mobs are allowed to naturally spawn in this arena. + * + * @return True if mobs are allowed to spawn, false otherwise. + */ + public boolean isMobSpawningAllowed(){ + return this.allowMobSpawning; + } + + /** + * Sets whether mobs are allowed to naturally spawn in this arena. + * + * @param allowMobSpawning + */ + public void setMobSpawningAllowed(final boolean allowMobSpawning){ + this.allowMobSpawning = allowMobSpawning; + } + /** * Gets the position of one corner of the bounding box of this arena. * diff --git a/src/main/resources/commands.cmd b/src/main/resources/commands.cmd index a24bcb4..f6462a5 100644 --- a/src/main/resources/commands.cmd +++ b/src/main/resources/commands.cmd @@ -96,6 +96,13 @@ command snowbrawl { help Changes the amount of damage done per snowball hit in this arena.; } + allowmobspawning [boolean:mobspawningallowed] { + perm redstoner.snowbrawl.arena.config.mobspawningallowed; + run set_arena_mobspawningallowed name mobspawningallowed; + type all; + help Sets whether mobs are allowed to spawn in this arena.; + } + bounds pos1 { [block_x:x] [block_y:y] [block_z:z] { run set_arena_pos1 name x y z;