red creeper with trident

This commit is contained in:
2025-09-04 21:27:07 -04:00
parent 2a6baf4ea9
commit dae6cb4009
3 changed files with 68 additions and 8 deletions

View File

@@ -1,12 +1,20 @@
package com.thewrightserver.bigbooms; package com.thewrightserver.bigbooms;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.entity.Trident;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Creeper; import org.bukkit.entity.Creeper;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.entity.ExplosionPrimeEvent;
import org.bukkit.scheduler.BukkitRunnable;
public final class Bigbooms extends JavaPlugin implements Listener { public final class Bigbooms extends JavaPlugin implements Listener {
@@ -15,12 +23,12 @@ public final class Bigbooms extends JavaPlugin implements Listener {
@Override @Override
public void onEnable() { public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, this); Bukkit.getPluginManager().registerEvents(this, this);
getLogger().info("BigBooms enabled! Creepers now explode 10x bigger."); getLogger().info("BigBooms enabled!");
} }
@Override @Override
public void onDisable() { public void onDisable() {
getLogger().info("BigBooms disabled."); getLogger().info("BigBooms disabled!");
} }
@EventHandler @EventHandler
@@ -29,19 +37,71 @@ public final class Bigbooms extends JavaPlugin implements Listener {
creeperCounter++; creeperCounter++;
// Every 20th creeper becomes Red // Every 20th Creeper becomes Red
if (creeperCounter % 20 == 0) { if (creeperCounter % 20 == 0) {
// Set custom name using Adventure Components // Mark it as Red Creeper
creeper.customName(Component.text("Red Creeper")); creeper.setMetadata("RedCreeper", new FixedMetadataValue(this, true));
creeper.isCustomNameVisible();
// Multiply explosion // Set custom red name using Adventure Component
creeper.customName(Component.text("Red Creeper").color(NamedTextColor.RED));
creeper.setCustomNameVisible(true);
// Give a trident visually
ItemStack trident = new ItemStack(Material.TRIDENT);
creeper.getEquipment().setItemInMainHand(trident);
// Optional: make it powered for extra threat
creeper.setPowered(true);
// Start trident-throwing task
startTridentTask(creeper);
// Multiply explosion radius
float newRadius = event.getRadius() * 10; float newRadius = event.getRadius() * 10;
event.setRadius(newRadius); event.setRadius(newRadius);
getLogger().info("Red Creeper exploded with radius " + newRadius); getLogger().info("Red Creeper exploded with radius " + newRadius);
} }
} }
} }
private void startTridentTask(Creeper creeper) {
new BukkitRunnable() {
@Override
public void run() {
if (!creeper.isValid() || creeper.isDead() || !creeper.hasMetadata("RedCreeper")) {
cancel();
return;
}
// Pick a random player
Player target = creeper.getWorld().getPlayers().stream().findAny().orElse(null);
if (target != null) {
Trident tridentProjectile = creeper.getWorld().spawn(
creeper.getLocation().add(0, 1, 0),
Trident.class
);
tridentProjectile.setShooter(creeper);
tridentProjectile.setVelocity(
target.getLocation().toVector()
.subtract(creeper.getLocation().toVector())
.normalize()
.multiply(1.5)
);
// Tag the trident so we can explode it
tridentProjectile.setMetadata("RedCreeperTrident", new FixedMetadataValue(Bigbooms.this, true));
}
}
}.runTaskTimer(this, 0L, 40L); // every 2 seconds
}
@EventHandler
public void onTridentHit(ProjectileHitEvent event) {
if (event.getEntity() instanceof Trident trident) {
if (trident.hasMetadata("RedCreeperTrident")) {
trident.getWorld().createExplosion(trident.getLocation(), 10F, false, true);
trident.remove();
}
}
}
} }