Skip to content

API Examples

Complete working examples demonstrating common SmartSpawner API patterns.

Example 1: Inspect a Spawner Item

Check what type of spawner a player is holding.

java
import github.nighter.smartspawner.api.SmartSpawnerAPI;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;

public class SpawnerChecker implements Listener {

    private final SmartSpawnerAPI api;

    public SpawnerChecker(SmartSpawnerAPI api) {
        this.api = api;
    }

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        Player player = event.getPlayer();
        ItemStack item = event.getItem();

        if (item == null || item.getType() != Material.SPAWNER) return;

        if (api.isSmartSpawner(item)) {
            EntityType type = api.getSpawnerEntityType(item);
            player.sendMessage("§aSmartSpawner: §e" + type);
        } else if (api.isVanillaSpawner(item)) {
            EntityType type = api.getSpawnerEntityType(item);
            player.sendMessage("§7Vanilla Spawner: §e" + type);
        } else if (api.isItemSpawner(item)) {
            Material mat = api.getItemSpawnerMaterial(item);
            player.sendMessage("§6Item Spawner: §e" + mat);
        }
    }
}

Example 2: Spawner Upgrade Command

Read and upgrade the spawner the player is looking at.

java
import github.nighter.smartspawner.api.SmartSpawnerAPI;
import github.nighter.smartspawner.api.data.SpawnerDataDTO;
import github.nighter.smartspawner.api.data.SpawnerDataModifier;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class SpawnerCommand implements CommandExecutor {

    private final SmartSpawnerAPI api;

    public SpawnerCommand(SmartSpawnerAPI api) {
        this.api = api;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (!(sender instanceof Player player)) {
            sender.sendMessage("Player only!");
            return true;
        }

        SpawnerDataDTO spawner = api.getSpawnerByLocation(
            player.getTargetBlock(null, 5).getLocation()
        );

        if (spawner == null) {
            player.sendMessage("§cNo spawner found.");
            return true;
        }

        player.sendMessage("§6ID: §f" + spawner.getSpawnerId());
        player.sendMessage("§6Entity: §f" + spawner.getEntityType());
        player.sendMessage("§6Stack: §f" + spawner.getStackSize() + " (read-only)");

        if (args.length > 0 && args[0].equalsIgnoreCase("upgrade")) {
            SpawnerDataModifier mod = api.getSpawnerModifier(spawner.getSpawnerId());
            if (mod != null) {
                mod.setBaseMaxMobs(mod.getBaseMaxMobs() + 2)
                   .setBaseMinMobs(mod.getBaseMinMobs() + 1)
                   .setBaseMaxStoredExp(mod.getBaseMaxStoredExp() + 500)
                   .setBaseMaxStoragePages(mod.getBaseMaxStoragePages() + 1)
                   .applyChanges();
                player.sendMessage("§aSpawner upgraded!");
            }
        }

        return true;
    }
}

Example 3: Server-Wide Statistics

Display a breakdown of all spawners by type.

java
import github.nighter.smartspawner.api.data.SpawnerDataDTO;
import org.bukkit.entity.EntityType;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SpawnerStats {

    public void printStats(CommandSender sender, SmartSpawnerAPI api) {
        List<SpawnerDataDTO> all = api.getAllSpawners();

        Map<EntityType, Integer> counts = new HashMap<>();
        int totalStack = 0;

        for (SpawnerDataDTO s : all) {
            counts.merge(s.getEntityType(), 1, Integer::sum);
            totalStack += s.getStackSize();
        }

        sender.sendMessage("§6=== Spawner Statistics ===");
        sender.sendMessage("§eTotal blocks: §f" + all.size());
        sender.sendMessage("§eTotal stacked: §f" + totalStack);

        counts.entrySet().stream()
            .sorted((a, b) -> b.getValue() - a.getValue())
            .forEach(e -> sender.sendMessage("  §7- §f" + e.getKey() + " §7x§e" + e.getValue()));
    }
}

Example 4: Double XP Event Listener

Double the XP players receive when claiming from spawners.

java
import github.nighter.smartspawner.api.events.SpawnerExpClaimEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

public class DoubleXPListener implements Listener {

    @EventHandler
    public void onExpClaim(SpawnerExpClaimEvent event) {
        event.setExpAmount(event.getExpAmount() * 2);
    }
}