package greymerk.roguelike.treasure.loot; import java.util.Random; import com.google.gson.JsonObject; import greymerk.roguelike.util.IWeighted; import greymerk.roguelike.util.JsonNBT; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; public class WeightedRandomLoot implements Comparable<WeightedRandomLoot>, IWeighted<ItemStack>{ private String name; private Item item; private Block block; private int damage; private int min; private int max; private int enchLevel; private int weight; private NBTTagCompound nbt; public WeightedRandomLoot(Block block, int damage, int minStackSize, int maxStackSize, int weight){ this.name = block.getUnlocalizedName(); this.block = block; this.damage = damage; this.min = minStackSize; this.max = maxStackSize; this.weight = weight; this.enchLevel = 0; } public WeightedRandomLoot(Item item, int damage, int minStackSize, int maxStackSize, int weight){ this(item, damage, minStackSize, maxStackSize, weight, 0); } public WeightedRandomLoot(Item item, int damage, int minStackSize, int maxStackSize, int weight, int ench){ this.name = item.getUnlocalizedName(); this.item = item; this.damage = damage; this.min = minStackSize; this.max = maxStackSize; this.weight = weight; this.enchLevel = ench; } public WeightedRandomLoot(Item item, int damage, int weight){ this(item, damage, 1, 1, weight, 0); } public WeightedRandomLoot(Item item, int weight){ this(item, 0, 1, 1, weight, 0); } public WeightedRandomLoot(JsonObject json, int weight) throws Exception{ this.name = json.get("name").getAsString(); ResourceLocation location = new ResourceLocation(name); this.item = (Item) Item.REGISTRY.getObject(location); try{ this.item.getUnlocalizedName(); } catch (NullPointerException e){ throw new Exception("Invalid item: " + this.name); } this.damage = json.has("meta") ? json.get("meta").getAsInt() : 0; this.weight = weight; this.enchLevel = json.has("ench") ? json.get("ench").getAsInt() : 0; if(json.has("min") && json.has("max")){ min = json.get("min").getAsInt(); max = json.get("max").getAsInt(); } else { min = 1; max = 1; } if(json.has("nbt")){ JsonObject nbtdata = json.get("nbt").getAsJsonObject(); this.nbt = JsonNBT.jsonToCompound(nbtdata); } } public WeightedRandomLoot(Block block, int i) { this(Item.getItemById(Block.getIdFromBlock(block)), i); } private int getStackSize(Random rand){ if (max == 1) return 1; return rand.nextInt(max - min) + min; } @Override public int getWeight(){ return this.weight; } @Override public ItemStack get(Random rand) { ItemStack item = null; if(this.item != null) item = new ItemStack(this.item, this.getStackSize(rand), damage); if(this.block != null) item = new ItemStack(this.block, this.getStackSize(rand), damage); try{ if(this.enchLevel > 0 && this.enchLevel <= 30) Enchant.enchantItem(rand, item, this.enchLevel); } catch (NullPointerException e){ // ignore } if(this.nbt != null) item.setTagCompound(this.nbt); return item; } @Override public int compareTo(WeightedRandomLoot other) { if (this.weight > other.weight) return -1; if (this.weight < other.weight) return 1; return 0; } }