Refactor and optimized BabyCreeper handling

This commit is contained in:
2026-01-10 12:45:16 +01:00
parent 1e2b2a776b
commit abd83c6833
2 changed files with 46 additions and 25 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}
}