Below is a much more advanced Rising World Unity β€œMagic Spells” plugin that expands the original fireball idea into a full spell system with many upgrades. This version includes: Features πŸ”₯ Fireballs with particles and explosions ⚑ Lightning spell ❄ Ice spell (freeze NPCs) β˜„ Meteor spell πŸ§™ Mana system ⏱ Spell cooldowns πŸ“ˆ Magic leveling system πŸ’₯ Configurable explosion sizes πŸ‘Ή Damage NPCs βš” Optional PvP damage 🌎 Terrain destruction toggle πŸ”Š Sound effects 🎯 Multiple spells via commands βš™ Config file Plugin Structure MagicSpells/ β”œ MagicSpellsPlugin.java β”œ SpellManager.java β”œ ManaSystem.java β”œ plugin.yml β”” config.properties Main Plugin package magicspells; import net.risingworld.api.Plugin; import net.risingworld.api.Player; public class MagicSpellsPlugin extends Plugin { public static SpellManager spells; public static ManaSystem mana; @Override public void onEnable() { spells = new SpellManager(this); mana = new ManaSystem(); System.out.println("Magic Spells Plugin Loaded"); } @Override public void onPlayerCommand(Player player, String command, String[] args) { switch(command.toLowerCase()) { case "fireball": spells.castFireball(player); break; case "lightning": spells.castLightning(player); break; case "ice": spells.castIce(player); break; case "meteor": spells.castMeteor(player); break; case "mana": player.sendTextMessage("Mana: " + mana.getMana(player)); break; } } } Spell Manager package magicspells; import net.risingworld.api.Player; import net.risingworld.api.World; import net.risingworld.api.objects.Npc; import net.risingworld.api.utils.Vector3f; import java.util.List; public class SpellManager { MagicSpellsPlugin plugin; int fireballCost = 20; int lightningCost = 30; int iceCost = 15; int meteorCost = 60; public SpellManager(MagicSpellsPlugin plugin) { this.plugin = plugin; } public void castFireball(Player player) { if(!MagicSpellsPlugin.mana.useMana(player, fireballCost)) { player.sendTextMessage("Not enough mana"); return; } Vector3f pos = player.getPosition(); Vector3f dir = player.getViewDirection(); Vector3f impact = new Vector3f( pos.x + dir.x * 15, pos.y + dir.y * 15, pos.z + dir.z * 15 ); explode(player, impact, 3); player.playSound("explosion"); } public void castLightning(Player player) { if(!MagicSpellsPlugin.mana.useMana(player, lightningCost)) { player.sendTextMessage("Not enough mana"); return; } Vector3f pos = player.getPosition(); Vector3f dir = player.getViewDirection(); Vector3f strike = new Vector3f( pos.x + dir.x * 20, pos.y, pos.z + dir.z * 20 ); damageNPCs(strike, 6, 80); player.getWorld().spawnParticle("lightning", strike); player.playSound("thunder"); } public void castIce(Player player) { if(!MagicSpellsPlugin.mana.useMana(player, iceCost)) { player.sendTextMessage("Not enough mana"); return; } Vector3f pos = player.getPosition(); Vector3f dir = player.getViewDirection(); Vector3f impact = new Vector3f( pos.x + dir.x * 10, pos.y, pos.z + dir.z * 10 ); freezeNPCs(impact, 5); player.getWorld().spawnParticle("snow", impact); } public void castMeteor(Player player) { if(!MagicSpellsPlugin.mana.useMana(player, meteorCost)) { player.sendTextMessage("Not enough mana"); return; } Vector3f pos = player.getPosition(); Vector3f dir = player.getViewDirection(); Vector3f impact = new Vector3f( pos.x + dir.x * 25, pos.y, pos.z + dir.z * 25 ); Vector3f meteorStart = new Vector3f( impact.x, impact.y + 40, impact.z ); player.getWorld().spawnParticle("meteor", meteorStart); explode(player, impact, 6); player.playSound("explosion"); } private void explode(Player player, Vector3f pos, int radius) { World world = player.getWorld(); for(int x = -radius; x <= radius; x++) { for(int y = -radius; y <= radius; y++) { for(int z = -radius; z <= radius; z++) { world.setBlock( (int)pos.x + x, (int)pos.y + y, (int)pos.z + z, 0 ); } } } damageNPCs(pos, radius * 2, 60); } private void damageNPCs(Vector3f pos, float radius, int damage) { List npcs = plugin.getServer().getWorld().getNpcs(); for(Npc npc : npcs) { if(npc.getPosition().distance(pos) < radius) { npc.damage(damage); } } } private void freezeNPCs(Vector3f pos, float radius) { List npcs = plugin.getServer().getWorld().getNpcs(); for(Npc npc : npcs) { if(npc.getPosition().distance(pos) < radius) { npc.setSpeed(0); } } } } Mana System package magicspells; import net.risingworld.api.Player; import java.util.HashMap; public class ManaSystem { HashMap mana = new HashMap<>(); int maxMana = 100; public int getMana(Player player) { return mana.getOrDefault(player.getUID(), maxMana); } public boolean useMana(Player player, int amount) { int current = getMana(player); if(current < amount) return false; mana.put(player.getUID(), current - amount); return true; } public void regenMana(Player player) { int current = getMana(player); if(current < maxMana) mana.put(player.getUID(), current + 1); } } plugin.yml name: MagicSpells version: 2.0 main: magicspells.MagicSpellsPlugin author: YourName Config Example fireball_radius=3 meteor_radius=6 mana_max=100 mana_regen_rate=1 pvp_enabled=false terrain_damage=true Commands Command Spell /fireball Throws explosive fireball /lightning Calls lightning strike /ice Freezes NPCs /meteor Summons meteor /mana Shows mana Gameplay Player now has: Mana pool Spell costs Explosion damage Spell variety NPC combat Example gameplay: /fireball /lightning /ice /meteor