Skip to content

Loot Tables & Mob Drops API

The CuriosPaper API provides methods for programmatically registering loot table entries and mob drops for custom items.

Loot Tables

Registering a Loot Table Entry

import org.bg52.curiospaper.CuriosPaper;
import org.bg52.curiospaper.api.CuriosPaperAPI;
import org.bg52.curiospaper.data.LootTableData;

CuriosPaperAPI api = CuriosPaper.getInstance().getCuriosPaperAPI();

// Create a loot table entry
LootTableData lootEntry = new LootTableData(
    "minecraft:chests/simple_dungeon",  // loot table key
    0.15,                                // 15% chance
    1,                                   // min amount
    2                                    // max amount
);

// Register it on an existing item
boolean success = api.registerItemLootTable("magic_ring", lootEntry);
if (success) {
    api.saveItemData("magic_ring");
}

Creating an Item with Loot Tables

import org.bg52.curiospaper.data.ItemData;
import org.bg52.curiospaper.data.LootTableData;

// Create the item
ItemData item = api.createItem(myPlugin, "dungeon_amulet");
item.setDisplayName("§5Dungeon Amulet");
item.setMaterial("NAUTILUS_SHELL");
item.setSlotType("necklace");

// Add multiple loot table entries
item.addLootTable(new LootTableData("minecraft:chests/simple_dungeon", 0.20, 1, 1));
item.addLootTable(new LootTableData("minecraft:chests/abandoned_mineshaft", 0.10, 1, 1));
item.addLootTable(new LootTableData("minecraft:chests/stronghold_corridor", 0.30, 1, 1));

// Save
api.saveItemData("dungeon_amulet");

LootTableData Reference

Constructor Description
LootTableData(String type, double chance, int min, int max) Full constructor
LootTableData(String type, double chance) Simple constructor (amount 1–1)
Method Type Description
getLootTableType() / setLootTableType(String) String The loot table namespaced key
getChance() / setChance(double) double Drop probability (0.0–1.0)
getMinAmount() / setMinAmount(int) int Minimum item count (≥ 1)
getMaxAmount() / setMaxAmount(int) int Maximum item count (≥ min)
isValid() boolean Validates the configuration

Mob Drops

Registering a Mob Drop

import org.bg52.curiospaper.data.MobDropData;

// Create a mob drop entry
MobDropData mobDrop = new MobDropData();
mobDrop.setEntityType("ZOMBIE");
mobDrop.setChance(0.05);      // 5% chance
mobDrop.setMinAmount(1);
mobDrop.setMaxAmount(1);

// Register it
boolean success = api.registerItemMobDrop("cursed_ring", mobDrop);
if (success) {
    api.saveItemData("cursed_ring");
}

Creating an Item with Mob Drops

ItemData item = api.createItem(myPlugin, "skeleton_charm");
item.setDisplayName("§7Bone Charm");
item.setMaterial("BONE");
item.setSlotType("charm");

// Add mob drop
MobDropData drop = new MobDropData();
drop.setEntityType("SKELETON");
drop.setChance(0.08);
drop.setMinAmount(1);
drop.setMaxAmount(1);
item.getMobDrops().add(drop);

api.saveItemData("skeleton_charm");

MobDropData Reference

Method Type Description
getEntityType() / setEntityType(String) String The entity type name (e.g., ZOMBIE)
getChance() / setChance(double) double Drop probability (0.0–1.0)
getMinAmount() / setMinAmount(int) int Minimum drop count
getMaxAmount() / setMaxAmount(int) int Maximum drop count
isModelEnabled() / setModelEnabled(boolean) boolean Whether the mob wears a 3D model
getModelItem() / setModelItem(String) String Model material name
getModelCustomModelData() / setModelCustomModelData(Integer) Integer Model CMD value
getModelItemModel() / setModelItemModel(String) String Model item model component

Villager Trades

Registering a Villager Trade

import org.bg52.curiospaper.data.VillagerTradeData;

VillagerTradeData trade = new VillagerTradeData();
trade.setProfessions(Arrays.asList("CLERIC", "LIBRARIAN"));
trade.setChance(0.3);           // 30% chance the villager has this trade
trade.setTradeLevels(Arrays.asList(3, 4, 5));
trade.setCostMaterial("EMERALD");
trade.setCostMinAmount(15);
trade.setCostMaxAmount(30);

boolean success = api.registerItemVillagerTrade("holy_ring", trade);
if (success) {
    api.saveItemData("holy_ring");
}

Listening for Events

Both loot generation and mob drops fire custom events:

import org.bg52.curiospaper.event.CuriosLootGenerateEvent;
import org.bg52.curiospaper.event.CuriosMobDropEvent;

// Listen for loot table generation
@EventHandler
public void onLootGenerate(CuriosLootGenerateEvent event) {
    String tableKey = event.getLootTableKey();
    String itemId = event.getCustomItemId();
    // Cancel, modify item, etc.
}

// Listen for mob drops
@EventHandler
public void onMobDrop(CuriosMobDropEvent event) {
    LivingEntity mob = event.getEntity();
    String itemId = event.getCustomItemId();
    // Cancel, modify item, etc.
}

See the Events page for detailed event documentation and examples.