BCLib/src/main/java/org/betterx/bclib/util/LootUtil.java
2022-06-07 22:20:54 +02:00

73 lines
3 KiB
Java

package org.betterx.bclib.util;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.BuiltInLootTables;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.LootPool;
import net.minecraft.world.level.storage.loot.LootTable;
import net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import org.betterx.bclib.BCLib;
import org.betterx.bclib.interfaces.LootPoolAccessor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class LootUtil {
public static Optional<List<ItemStack>> getDrops(BlockBehaviour block,
BlockState state,
LootContext.Builder builder) {
ResourceLocation tableID = block.getLootTable();
if (tableID == BuiltInLootTables.EMPTY) {
return Optional.empty();
}
final LootContext ctx = builder.withParameter(LootContextParams.BLOCK_STATE, state)
.create(LootContextParamSets.BLOCK);
final ServerLevel level = ctx.getLevel();
final LootTable table = level.getServer().getLootTables().get(tableID);
if (table == LootTable.EMPTY) return Optional.empty();
return Optional.of(table.getRandomItems(ctx));
}
public static boolean addToPool(LootTable.Builder table, int index, ArrayList<LootPoolEntryContainer> newEntries) {
List<LootPool> pools = new ArrayList<>(0);
try {
for (Field f : table.getClass()
.getDeclaredFields()) {
if (List.class.isAssignableFrom(f.getType())) {
f.setAccessible(true);
List<?> list = (List<?>) f.get(table);
if (list != null && list.size() > 0) {
Object first = list.get(0);
if (first != null && LootPool.class.isAssignableFrom(first.getClass())) {
pools = (List<LootPool>) list;
break;
}
}
}
}
if (pools != null && pools.size() > index) {
LootPool pool = pools.get(index);
LootPoolAccessor acc = (LootPoolAccessor) pool;
pools.set(index, acc.bcl_mergeEntries(newEntries));
return true;
}
} catch (Throwable t) {
BCLib.LOGGER.error("ERROR building loot table: " + t.getMessage());
}
return false;
}
}