feat: add zombieTable and skeletonTable to Loot
This commit is contained in:
1 parent
d234f6a884
commit
ff147c2440
1 file changed
+158
@@ -156,3 +156,161 @@ LootTable leavesTable() {
|
|||||||
LootEntry silk = fixedDrop(ItemId::Leaves);
|
LootEntry silk = fixedDrop(ItemId::Leaves);
|
||||||
silk.conditions = LootEntry::SilkTouched;
|
silk.conditions = LootEntry::SilkTouched;
|
||||||
|
|
||||||
|
// The item palette has no sapling, so a wood cutting stands in as the
|
||||||
|
// replantable drop; Fortune improves its odds the way vanilla does.
|
||||||
|
LootEntry cutting = chanceDrop(ItemId::Wood, 0.05f, 0.04f, LootEntry::ChanceFortune);
|
||||||
|
cutting.conditions = LootEntry::NotSilkTouched;
|
||||||
|
|
||||||
|
LootEntry apple = chanceDrop(ItemId::Apple, 0.005f, 0.0f, 0);
|
||||||
|
apple.conditions = LootEntry::NotSilkTouched;
|
||||||
|
|
||||||
|
LootEntry sticks = rangedDrop(ItemId::Stick, 1, 2);
|
||||||
|
sticks.chance = 0.02f;
|
||||||
|
sticks.conditions = LootEntry::NotSilkTouched;
|
||||||
|
|
||||||
|
LootTable table;
|
||||||
|
addPool(table, silk);
|
||||||
|
addPool(table, cutting);
|
||||||
|
addPool(table, apple);
|
||||||
|
addPool(table, sticks);
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
LootTable zombieTable() {
|
||||||
|
LootEntry flesh = rangedDrop(ItemId::RottenFlesh, 0, 2);
|
||||||
|
flesh.functions = LootEntry::CountRange | LootEntry::LootingBonus;
|
||||||
|
|
||||||
|
LootEntry ingot = chanceDrop(ItemId::IronIngot, 0.025f, 0.01f, LootEntry::ChanceLooting);
|
||||||
|
ingot.conditions = LootEntry::PlayerKill;
|
||||||
|
|
||||||
|
LootTable table;
|
||||||
|
addPool(table, flesh);
|
||||||
|
addPool(table, ingot);
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
LootTable skeletonTable() {
|
||||||
|
LootEntry shafts = rangedDrop(ItemId::Stick, 0, 2);
|
||||||
|
shafts.functions = LootEntry::CountRange | LootEntry::LootingBonus;
|
||||||
|
|
||||||
|
LootEntry coal = chanceDrop(ItemId::CoalLump, 0.05f, 0.01f, LootEntry::ChanceLooting);
|
||||||
|
coal.conditions = LootEntry::PlayerKill;
|
||||||
|
|
||||||
|
LootTable table;
|
||||||
|
addPool(table, shafts);
|
||||||
|
addPool(table, coal);
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
LootTable creeperTable() {
|
||||||
|
LootEntry powder = rangedDrop(ItemId::Gunpowder, 0, 2);
|
||||||
|
powder.functions = LootEntry::CountRange | LootEntry::LootingBonus;
|
||||||
|
|
||||||
|
LootTable table;
|
||||||
|
addPool(table, powder);
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
LootTable meatTable(ItemId rawMeat, int minCount, int maxCount) {
|
||||||
|
LootEntry meat = rangedDrop(rawMeat, minCount, maxCount);
|
||||||
|
meat.functions = LootEntry::CountRange | LootEntry::LootingBonus | LootEntry::SmeltIfFiery;
|
||||||
|
|
||||||
|
LootTable table;
|
||||||
|
addPool(table, meat);
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
LootTable dungeonChestTable() {
|
||||||
|
LootPool pool;
|
||||||
|
pool.minRolls = 2;
|
||||||
|
pool.maxRolls = 4;
|
||||||
|
pool.entries = {
|
||||||
|
weightedDrop(ItemId::IronIngot, 10, 1, 4), weightedDrop(ItemId::Bread, 10, 1, 1),
|
||||||
|
weightedDrop(ItemId::CoalLump, 10, 1, 4), weightedDrop(ItemId::RedstoneDust, 5, 1, 4),
|
||||||
|
weightedDrop(ItemId::GoldIngot, 5, 1, 4), weightedDrop(ItemId::LapisLazuli, 5, 1, 3),
|
||||||
|
weightedDrop(ItemId::Apple, 8, 1, 3), weightedDrop(ItemId::DiamondGem, 1, 1, 2),
|
||||||
|
};
|
||||||
|
LootTable table;
|
||||||
|
table.pools.push_back(pool);
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
LootTable villageChestTable() {
|
||||||
|
LootPool pool;
|
||||||
|
pool.minRolls = 3;
|
||||||
|
pool.maxRolls = 5;
|
||||||
|
pool.entries = {
|
||||||
|
weightedDrop(ItemId::Bread, 10, 1, 3), weightedDrop(ItemId::Apple, 8, 1, 3),
|
||||||
|
weightedDrop(ItemId::Stick, 6, 1, 4), weightedDrop(ItemId::IronIngot, 5, 1, 2),
|
||||||
|
weightedDrop(ItemId::WoodHoe, 3, 1, 1), weightedDrop(ItemId::EmeraldGem, 2, 1, 2),
|
||||||
|
};
|
||||||
|
LootTable table;
|
||||||
|
table.pools.push_back(pool);
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
LootTable templeChestTable() {
|
||||||
|
LootPool pool;
|
||||||
|
pool.minRolls = 2;
|
||||||
|
pool.maxRolls = 4;
|
||||||
|
pool.entries = {
|
||||||
|
weightedDrop(ItemId::Gunpowder, 5, 1, 8), weightedDrop(ItemId::RottenFlesh, 5, 3, 7),
|
||||||
|
weightedDrop(ItemId::GoldIngot, 5, 1, 3), weightedDrop(ItemId::Bread, 5, 1, 1),
|
||||||
|
weightedDrop(ItemId::LapisLazuli, 2, 1, 3), weightedDrop(ItemId::DiamondGem, 1, 1, 3),
|
||||||
|
weightedDrop(ItemId::EmeraldGem, 1, 1, 3),
|
||||||
|
};
|
||||||
|
LootTable table;
|
||||||
|
table.pools.push_back(pool);
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<LootTable> buildBlockTables() {
|
||||||
|
std::size_t blockCount = static_cast<std::size_t>(Block::Count);
|
||||||
|
std::vector<LootTable> tables(blockCount);
|
||||||
|
for (std::size_t i = 0; i < blockCount; ++i) {
|
||||||
|
tables[i] = selfDropTable(static_cast<Block>(i));
|
||||||
|
}
|
||||||
|
tables[static_cast<std::size_t>(Block::Bedrock)] = LootTable{};
|
||||||
|
tables[static_cast<std::size_t>(Block::Stone)] = stoneTable();
|
||||||
|
tables[static_cast<std::size_t>(Block::Grass)] = selfDropTable(Block::Dirt);
|
||||||
|
tables[static_cast<std::size_t>(Block::Leaves)] = leavesTable();
|
||||||
|
tables[static_cast<std::size_t>(Block::CoalOre)] =
|
||||||
|
oreTable(Block::CoalOre, ItemId::CoalLump, 1, 1);
|
||||||
|
tables[static_cast<std::size_t>(Block::IronOre)] =
|
||||||
|
oreTable(Block::IronOre, ItemId::IronOre, 1, 1);
|
||||||
|
tables[static_cast<std::size_t>(Block::GoldOre)] =
|
||||||
|
oreTable(Block::GoldOre, ItemId::GoldOre, 1, 1);
|
||||||
|
tables[static_cast<std::size_t>(Block::DiamondOre)] =
|
||||||
|
oreTable(Block::DiamondOre, ItemId::DiamondGem, 1, 1);
|
||||||
|
tables[static_cast<std::size_t>(Block::EmeraldOre)] =
|
||||||
|
oreTable(Block::EmeraldOre, ItemId::EmeraldGem, 1, 1);
|
||||||
|
tables[static_cast<std::size_t>(Block::LapisOre)] =
|
||||||
|
oreTable(Block::LapisOre, ItemId::LapisLazuli, 4, 9);
|
||||||
|
tables[static_cast<std::size_t>(Block::RedstoneOre)] =
|
||||||
|
oreTable(Block::RedstoneOre, ItemId::RedstoneDust, 4, 5);
|
||||||
|
tables[static_cast<std::size_t>(Block::Glowstone)] =
|
||||||
|
oreTable(Block::Glowstone, ItemId::Glowstone, 2, 4);
|
||||||
|
return tables;
|
||||||
|
}
|
||||||
|
|
||||||
|
const LootTable& emptyTable() {
|
||||||
|
static const LootTable table;
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
int LootRoll::countOf(ItemId item) const {
|
||||||
|
int total = 0;
|
||||||
|
for (const ItemSlot& stack : items) {
|
||||||
|
if (stack.item == item) total += stack.count;
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LootRoll::totalCount() const {
|
||||||
|
int total = 0;
|
||||||
|
for (const ItemSlot& stack : items) total += stack.count;
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in new issue
Block a user