From abd83c68330fccd5f60c030b56474d740da23d7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 10 Jan 2026 12:45:16 +0100 Subject: [PATCH] Refactor and optimized BabyCreeper handling --- .../java/eu/mhsl/minecraft/BabyCreeper.java | 14 +++-- .../mhsl/minecraft/BabyCreeperListener.java | 57 ++++++++++++------- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/main/java/eu/mhsl/minecraft/BabyCreeper.java b/src/main/java/eu/mhsl/minecraft/BabyCreeper.java index 9641a60..db2c654 100644 --- a/src/main/java/eu/mhsl/minecraft/BabyCreeper.java +++ b/src/main/java/eu/mhsl/minecraft/BabyCreeper.java @@ -6,18 +6,18 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; -public final class BabyCreeper extends JavaPlugin { - @NotNull - public static final NamespacedKey babyCreeper = NamespacedKey.fromString("babycreeper"); +import java.util.Objects; - public static ConfigurationSection config; +public final class BabyCreeper extends JavaPlugin { + public static final @NotNull NamespacedKey babyCreeper = Objects.requireNonNull(NamespacedKey.fromString("babycreeper")); + private static ConfigurationSection config; @Override public void onEnable() { saveResource("config.yml", false); reloadConfig(); config = getConfig().getConfigurationSection("babyCreepers"); - if(config == null) throw new IllegalStateException("Could not load config. Root element 'babyCreepers' is missing!"); + Objects.requireNonNull(config, "Could not load config. Root element 'babyCreepers' is missing!"); if(!config.getBoolean("enabled", true)) return; Bukkit.getPluginManager().registerEvents(new BabyCreeperListener(), this); @@ -27,4 +27,8 @@ public final class BabyCreeper extends JavaPlugin { public void onDisable() { Bukkit.getScheduler().cancelTasks(this); } + + public static ConfigurationSection config() { + return config; + } } diff --git a/src/main/java/eu/mhsl/minecraft/BabyCreeperListener.java b/src/main/java/eu/mhsl/minecraft/BabyCreeperListener.java index 3c3eb79..04858d7 100644 --- a/src/main/java/eu/mhsl/minecraft/BabyCreeperListener.java +++ b/src/main/java/eu/mhsl/minecraft/BabyCreeperListener.java @@ -1,9 +1,7 @@ package eu.mhsl.minecraft; import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Creeper; -import org.bukkit.entity.EntityType; import org.bukkit.entity.WindCharge; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -16,24 +14,38 @@ import java.util.Objects; import java.util.concurrent.ThreadLocalRandom; public class BabyCreeperListener implements Listener { - @EventHandler - public void onCreeperSpawn(CreatureSpawnEvent event) { - if(!event.getEntity().getType().equals(EntityType.CREEPER)) return; - if(ThreadLocalRandom.current().nextDouble() > BabyCreeper.config.getDouble("spawnProbability", 0.1)) return; + private final double spawnProbability; + private final double scaleValue; + private final double speedValue; - Creeper creeper = (Creeper) event.getEntity(); - creeper.getPersistentDataContainer().set(BabyCreeper.babyCreeper, PersistentDataType.BOOLEAN, true); - AttributeInstance scaleAttribute = Objects.requireNonNull(creeper.getAttribute(Attribute.SCALE), "Could not find scale attribute for Entity"); - AttributeInstance speedAttribute = Objects.requireNonNull(creeper.getAttribute(Attribute.MOVEMENT_SPEED), "Could not find speed attribute for Entity"); - scaleAttribute.setBaseValue(BabyCreeper.config.getDouble("size", 0.5)); - speedAttribute.setBaseValue(BabyCreeper.config.getDouble("speed", 0.5)); + public BabyCreeperListener() { + this.spawnProbability = BabyCreeper.config().getDouble("spawnProbability", 0.1); + this.scaleValue = BabyCreeper.config().getDouble("size", 0.5); + this.speedValue = BabyCreeper.config().getDouble("speed", 0.5); } - @EventHandler + @EventHandler(ignoreCancelled = true) + public void onCreeperSpawn(CreatureSpawnEvent event) { + if(!(event.getEntity() instanceof Creeper creeper)) return; + if(ThreadLocalRandom.current().nextDouble() > spawnProbability) return; + + creeper.getPersistentDataContainer().set(BabyCreeper.babyCreeper, PersistentDataType.BOOLEAN, true); + + Objects.requireNonNull( + creeper.getAttribute(Attribute.SCALE), + "Could not find scale attribute for Entity" + ).setBaseValue(scaleValue); + + Objects.requireNonNull( + creeper.getAttribute(Attribute.MOVEMENT_SPEED), + "Could not find speed attribute for Entity" + ).setBaseValue(speedValue); + } + + @EventHandler(ignoreCancelled = true) public void onCreeperExplode(EntityExplodeEvent event) { - if(!event.getEntity().getType().equals(EntityType.CREEPER)) return; - Creeper creeper = (Creeper) event.getEntity(); - if(!creeper.getPersistentDataContainer().has(BabyCreeper.babyCreeper, PersistentDataType.BOOLEAN)) return; + if(!(event.getEntity() instanceof Creeper creeper)) return; + if(!isBabyCreeper(creeper)) return; event.setCancelled(true); @@ -45,11 +57,16 @@ public class BabyCreeperListener implements Listener { windCharge.explode(); } - @EventHandler + @EventHandler(ignoreCancelled = true) public void onCreeperDamage(EntityDamageByEntityEvent event) { - if(!event.getDamager().getType().equals(EntityType.CREEPER)) return; - Creeper creeper = (Creeper) event.getDamager(); - if(!creeper.getPersistentDataContainer().has(BabyCreeper.babyCreeper, PersistentDataType.BOOLEAN)) return; + if(!(event.getDamager() instanceof Creeper creeper)) return; + if(!isBabyCreeper(creeper)) return; + event.setCancelled(true); } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + private boolean isBabyCreeper(Creeper creeper) { + return creeper.getPersistentDataContainer().has(BabyCreeper.babyCreeper, PersistentDataType.BOOLEAN); + } }