From 66f0b0d76f1763c664ac5b6f71f7138dff5e21f5 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Tue, 8 Sep 2026 16:22:09 +0200 Subject: [PATCH] feat: add mobRule to LootTables --- core/src/LootTables.cpp | 164 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git a/core/src/LootTables.cpp b/core/src/LootTables.cpp index e9853a2..44528c2 100644 --- a/core/src/LootTables.cpp +++ b/core/src/LootTables.cpp @@ -150,3 +150,167 @@ std::vector buildBlockRules() { ice.silkDrop = ItemId::Ice; add(ice); + add(barrenGatedRule(Block::Bedrock, ToolType::Pickaxe, ToolTier::Diamond)); + add(selfGatedRule(Block::Obsidian, ToolType::Pickaxe, ToolTier::Diamond)); + add(barrenRule(Block::Lava, ToolType::None)); + add(oreRule(Block::DiamondOre, ItemId::DiamondGem, 1, 1, ToolTier::Iron)); + add(oreRule(Block::RedstoneOre, ItemId::RedstoneDust, 4, 5, ToolTier::Stone)); + add(oreRule(Block::EmeraldOre, ItemId::EmeraldGem, 1, 1, ToolTier::Iron)); + add(oreRule(Block::LapisOre, ItemId::LapisLazuli, 4, 9, ToolTier::Stone)); + add(selfRule(Block::CraftingTable, ToolType::Axe)); + add(selfGatedRule(Block::Furnace, ToolType::Pickaxe, ToolTier::Wood)); + add(gatedRule(Block::FurnaceLit, ItemId::Furnace, ToolType::Pickaxe, ToolTier::Wood)); + add(selfRule(Block::Chest, ToolType::Axe)); + add(selfRule(Block::Torch, ToolType::None)); + add(plainRule(Block::RedstoneWire, ItemId::RedstoneDust, ToolType::None)); + add(selfRule(Block::RedstoneTorch, ToolType::None)); + add(selfRule(Block::RedstoneLamp, ToolType::None)); + add(plainRule(Block::RedstoneLampLit, ItemId::RedstoneLamp, ToolType::None)); + add(selfRule(Block::Lever, ToolType::None)); + add(selfRule(Block::Button, ToolType::None)); + add(selfGatedRule(Block::RedstoneBlock, ToolType::Pickaxe, ToolTier::Wood)); + add(selfRule(Block::Repeater, ToolType::None)); + add(selfRule(Block::Comparator, ToolType::None)); + add(selfGatedRule(Block::Piston, ToolType::Pickaxe, ToolTier::Wood)); + add(selfGatedRule(Block::PistonSticky, ToolType::Pickaxe, ToolTier::Wood)); + // The head is part of the body; breaking it drops the body, not itself. + add(barrenGatedRule(Block::PistonHead, ToolType::Pickaxe, ToolTier::Wood)); + add(selfRule(Block::Tnt, ToolType::None)); + add(selfRule(Block::Ladder, ToolType::Axe)); + + // Automation and logistics: crafted from iron and planks, neither of which + // the palette can hand back as a block item. + add(barrenRule(Block::Rail, ToolType::Pickaxe)); + add(barrenRule(Block::PoweredRail, ToolType::Pickaxe)); + add(barrenRule(Block::DetectorRail, ToolType::Pickaxe)); + add(barrenRule(Block::ActivatorRail, ToolType::Pickaxe)); + add(barrenGatedRule(Block::Hopper, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::Dropper, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::Dispenser, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::Observer, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::TargetBlock, ToolType::Hoe, ToolTier::None)); + add(barrenRule(Block::SlimeBlock, ToolType::None)); + add(plankSalvage(Block::NoteBlock)); + + // Farming: tilled soil goes back to dirt, crops have no seed item to give. + add(plainRule(Block::Farmland, ItemId::Dirt, ToolType::Shovel)); + add(barrenRule(Block::Wheat, ToolType::None)); + add(barrenRule(Block::Carrot, ToolType::None)); + add(barrenRule(Block::Potato, ToolType::None)); + add(barrenRule(Block::Pumpkin, ToolType::Axe)); + add(barrenRule(Block::Melon, ToolType::Axe)); + add(barrenRule(Block::PumpkinStem, ToolType::None)); + add(barrenRule(Block::MelonStem, ToolType::None)); + add(barrenRule(Block::SugarCane, ToolType::None)); + add(barrenRule(Block::Cactus, ToolType::None)); + add(barrenRule(Block::Sapling, ToolType::None)); + + BlockDropRule vine = barrenRule(Block::Vine, shearToolType); + vine.shearHarvest = true; + add(vine); + + add(plainRule(Block::SnowLayer, ItemId::Snow, ToolType::Shovel)); + add(barrenGatedRule(Block::PackedIce, ToolType::Pickaxe, ToolTier::Wood)); + + // Brewing, enchanting and combat fixtures. + add(barrenGatedRule(Block::BrewingStand, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::EnchantingTable, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::Cauldron, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::AnvilBlock, ToolType::Pickaxe, ToolTier::Wood)); + // No book in the palette, so a shelf salvages the planks of its frame. + add(plankSalvage(Block::Bookshelf, 3)); + + BlockDropRule cobweb = barrenRule(Block::Cobweb, shearToolType); + cobweb.shearHarvest = true; + add(cobweb); + + // Nether and End. + add(barrenGatedRule(Block::Netherrack, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenRule(Block::SoulSand, ToolType::Shovel)); + add(barrenRule(Block::SoulSoil, ToolType::Shovel)); + add(barrenGatedRule(Block::NetherQuartzOre, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::NetherBrick, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenRule(Block::NetherPortal, ToolType::None)); + add(barrenGatedRule(Block::Magma, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::Basalt, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::Blackstone, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::EndStone, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenRule(Block::EndPortal, ToolType::None)); + add(barrenGatedRule(Block::EndPortalFrame, ToolType::Pickaxe, ToolTier::Diamond)); + add(barrenGatedRule(Block::Purpur, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenRule(Block::ChorusPlant, ToolType::Axe)); + add(barrenRule(Block::ChorusFlower, ToolType::Axe)); + + // Village and construction. + BlockDropRule glass = barrenRule(Block::Glass, ToolType::Pickaxe); + glass.shearHarvest = false; + add(glass); + + add(barrenGatedRule(Block::Bricks, ToolType::Pickaxe, ToolTier::Wood)); + add(stoneSalvage(Block::StoneBricks)); + add(stoneSalvage(Block::MossyCobblestone)); + add(plankSalvage(Block::Door)); + add(plankSalvage(Block::Slab)); + add(plankSalvage(Block::Stairs)); + add(plankSalvage(Block::Fence)); + add(plankSalvage(Block::Bed)); + add(barrenGatedRule(Block::Bell, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenGatedRule(Block::Lantern, ToolType::Pickaxe, ToolTier::Wood)); + add(plankSalvage(Block::Composter)); + add(plankSalvage(Block::Barrel)); + add(plankSalvage(Block::SmithingTable)); + add(plankSalvage(Block::Loom)); + add(plankSalvage(Block::CartographyTable)); + add(plankSalvage(Block::Grindstone)); + add(barrenGatedRule(Block::Stonecutter, ToolType::Pickaxe, ToolTier::Wood)); + add(plankSalvage(Block::Lectern)); + add(barrenRule(Block::HayBale, ToolType::Hoe)); + + // Geology and decoration. + add(barrenRule(Block::Clay, ToolType::Shovel)); + add(barrenGatedRule(Block::Terracotta, ToolType::Pickaxe, ToolTier::Wood)); + + BlockDropRule wool = barrenRule(Block::Wool, shearToolType); + wool.shearHarvest = true; + add(wool); + + add(plainRule(Block::Mycelium, ItemId::Dirt, ToolType::Shovel)); + add(stoneSalvage(Block::Andesite)); + add(stoneSalvage(Block::Diorite)); + add(stoneSalvage(Block::Granite)); + add(stoneSalvage(Block::Deepslate)); + add(barrenGatedRule(Block::CopperOre, ToolType::Pickaxe, ToolTier::Stone)); + add(stoneSalvage(Block::Tuff)); + add(stoneSalvage(Block::Dripstone)); + add(barrenGatedRule(Block::AmethystBlock, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenRule(Block::Sculk, ToolType::Hoe)); + add(barrenGatedRule(Block::CryingObsidian, ToolType::Pickaxe, ToolTier::Diamond)); + add(barrenGatedRule(Block::Prismarine, ToolType::Pickaxe, ToolTier::Wood)); + add(barrenRule(Block::SeaLantern, ToolType::Pickaxe)); + + BlockDropRule kelp = barrenRule(Block::Kelp, shearToolType); + kelp.shearHarvest = true; + add(kelp); + + add(barrenRule(Block::Coral, ToolType::Pickaxe)); + add(barrenRule(Block::Mud, ToolType::Shovel)); + + BlockDropRule moss = barrenRule(Block::Moss, shearToolType); + moss.shearHarvest = true; + add(moss); + + return rules; +} + +MobDropRule mobRule(MobDropRule::Species species, const char* name, ItemId drop, int minCount, + int maxCount, int experience) { + MobDropRule rule; + rule.species = species; + rule.name = name; + rule.drop = drop; + rule.minCount = minCount; + rule.maxCount = maxCount; + rule.experience = experience; + return rule; +} +