From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.World/WeighedTreasure.cpp | 86 +++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Minecraft.World/WeighedTreasure.cpp (limited to 'Minecraft.World/WeighedTreasure.cpp') diff --git a/Minecraft.World/WeighedTreasure.cpp b/Minecraft.World/WeighedTreasure.cpp new file mode 100644 index 00000000..d7044644 --- /dev/null +++ b/Minecraft.World/WeighedTreasure.cpp @@ -0,0 +1,86 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.item.h" +#include "WeighedRandom.h" +#include "WeighedTreasure.h" + +WeighedTreasure::WeighedTreasure(int itemId, int auxValue, int minCount, int maxCount, int weight) : WeighedRandomItem(weight) +{ + this->item = shared_ptr( new ItemInstance(itemId, 1, auxValue) ); + this->minCount = minCount; + this->maxCount = maxCount; +} + +WeighedTreasure::WeighedTreasure(shared_ptr item, int minCount, int maxCount, int weight) : WeighedRandomItem(weight) +{ + this->item = item; + this->minCount = minCount; + this->maxCount = maxCount; +} + +void WeighedTreasure::addChestItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls) +{ + for (int r = 0; r < numRolls; r++) + { + WeighedTreasure *treasure = (WeighedTreasure *) WeighedRandom::getRandomItem(random, *((WeighedRandomItemArray *)&items)); + + int count = treasure->minCount + random->nextInt(treasure->maxCount - treasure->minCount + 1); + if (treasure->item->getMaxStackSize() >= count) + { + shared_ptr copy = treasure->item->copy(); + copy->count = count; + dest->setItem(random->nextInt(dest->getContainerSize()), copy); + } + else + { + // use multiple slots + for (int c = 0; c < count; c++) + { + shared_ptr copy = treasure->item->copy(); + copy->count = 1; + dest->setItem(random->nextInt(dest->getContainerSize()), copy); + } + } + } +} + +void WeighedTreasure::addDispenserItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls) +{ + for (int r = 0; r < numRolls; r++) + { + WeighedTreasure *treasure = (WeighedTreasure *) WeighedRandom::getRandomItem(random, *((WeighedRandomItemArray *)&items)); + + int count = treasure->minCount + random->nextInt(treasure->maxCount - treasure->minCount + 1); + if (treasure->item->getMaxStackSize() >= count) + { + shared_ptr copy = treasure->item->copy(); + copy->count = count; + dest->setItem(random->nextInt(dest->getContainerSize()), copy); + } + else + { + // use multiple slots + for (int c = 0; c < count; c++) + { + shared_ptr copy = treasure->item->copy(); + copy->count = 1; + dest->setItem(random->nextInt(dest->getContainerSize()), copy); + } + } + } +} + +WeighedTreasureArray WeighedTreasure::addToTreasure(WeighedTreasureArray items, WeighedTreasure *extra) +{ + WeighedTreasureArray result(items.length + 1); + int i = 0; + + for (int j = 0; j < items.length; j++) + { + result[i++] = items[j]; + } + + result[i++] = extra; + + return result; +} \ No newline at end of file -- cgit v1.2.3