package noppes.npcs; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityXPOrb; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import noppes.npcs.entity.EntityNPCInterface; import java.util.ArrayList; import java.util.HashMap; import java.util.Random; public class DataInventory implements IInventory { public static Random random = new Random(); public HashMap items = new HashMap(); public HashMap dropchance = new HashMap(); public HashMap weapons = new HashMap(); public HashMap prevWeapons = new HashMap(); public HashMap armor = new HashMap(); public int minExp = 0; public int maxExp = 0; public int lootMode = 0; private EntityNPCInterface npc; public DataInventory(EntityNPCInterface npc){ this.npc = npc; } public NBTTagCompound writeEntityToNBT(NBTTagCompound nbttagcompound){ nbttagcompound.setInteger("MinExp", minExp); nbttagcompound.setInteger("MaxExp", maxExp); nbttagcompound.setTag("NpcInv", NBTTags.nbtItemStackList(items)); nbttagcompound.setTag("Armor", NBTTags.nbtItemStackList(getArmor())); nbttagcompound.setTag("Weapons", NBTTags.nbtItemStackList(getWeapons())); nbttagcompound.setTag("DoubleDropChance", NBTTags.nbtIntegerDoubleMap(dropchance)); nbttagcompound.setInteger("LootMode", lootMode); return nbttagcompound; } public void readEntityFromNBT(NBTTagCompound nbttagcompound){ minExp = nbttagcompound.getInteger("MinExp"); maxExp = nbttagcompound.getInteger("MaxExp"); items = NBTTags.getItemStackList(nbttagcompound.getTagList("NpcInv", 10)); setArmor(NBTTags.getItemStackList(nbttagcompound.getTagList("Armor", 10))); setWeapons(NBTTags.getItemStackList(nbttagcompound.getTagList("Weapons", 10))); if(!nbttagcompound.hasKey("DoubleDropChance")) { dropchance.clear(); HashMap oldDropChance = NBTTags.getIntegerIntegerMap(nbttagcompound.getTagList("DropChance", 10)); for(int i = 0; i < oldDropChance.entrySet().size(); i++){ dropchance.put(i, Double.valueOf(oldDropChance.get(i))); } } else { dropchance = NBTTags.getIntegerDoubleMap(nbttagcompound.getTagList("DoubleDropChance", 10)); } lootMode = nbttagcompound.getInteger("LootMode"); } public HashMap getWeapons() { return weapons; } public void setWeapons(HashMap list) { weapons = list; } public HashMap getArmor() { return armor; } public void setArmor(HashMap list) { armor = list; } public ItemStack getWeapon(){ return weapons.get(0); } public void setWeapon(ItemStack item){ weapons.put(0, item); } public ItemStack getProjectile(){ return weapons.get(1); } public void setProjectile(ItemStack item){ weapons.put(1, item); } public ItemStack getOffHand(){ return weapons.get(2); } public void setOffHand(ItemStack item){ weapons.put(2, item); } public ArrayList getDroppedItems(DamageSource damagesource) { ArrayList drops = new ArrayList<>(); ArrayList list = new ArrayList(); for (int i : items.keySet()) { ItemStack item = items.get(i); if(item == null) continue; double dchance = 100; double chance = random.nextDouble() * 100; if(dropchance.containsKey(i)) dchance = dropchance.get(i); // double chance = Math.random()*100 + dchance; if(chance < dchance){ EntityItem e = getEntityItem(item.copy()); if(e != null) list.add(e); } } for (EntityItem e : list) { drops.add(e.getEntityItem()); } int enchant = 0; if (damagesource.getEntity() instanceof EntityPlayer){ enchant = EnchantmentHelper.getLootingModifier((EntityLivingBase)damagesource.getEntity()); } if (!net.minecraftforge.common.ForgeHooks.onLivingDrops(npc, damagesource, list, enchant, true, 0)){ return drops; } else { return new ArrayList<>(); } } public int getDroppedXp() { int droppedXp = minExp; if (maxExp - minExp > 0) droppedXp += npc.worldObj.rand.nextInt(maxExp - minExp); return droppedXp; } public void dropXp(Entity entity, int droppedXp) { while (droppedXp > 0){ int var2 = EntityXPOrb.getXPSplit(droppedXp); droppedXp -= var2; if(lootMode == 1 && entity instanceof EntityPlayer){ npc.worldObj.spawnEntityInWorld(new EntityXPOrb(entity.worldObj, entity.posX, entity.posY, entity.posZ, var2)); } else{ npc.worldObj.spawnEntityInWorld(new EntityXPOrb(npc.worldObj, npc.posX, npc.posY, npc.posZ, var2)); } } } public void dropItems(Entity entity, ArrayList itemList) { ArrayList list = new ArrayList(); for (ItemStack item : itemList) { if(item == null) continue; EntityItem e = getEntityItem(item.copy()); if(e != null) list.add(e); } for (EntityItem item : list){ if(lootMode == 1 && entity instanceof EntityPlayer){ EntityPlayer player = (EntityPlayer)entity; item.delayBeforeCanPickup = 2; npc.worldObj.spawnEntityInWorld(item); ItemStack stack = item.getEntityItem(); int i = stack.stackSize; if (player.inventory.addItemStackToInventory(stack)) { npc.worldObj.playSoundAtEntity(item, "random.pop", 0.2F, ((npc.getRNG().nextFloat() - npc.getRNG().nextFloat()) * 0.7F + 1.0F) * 2.0F); player.onItemPickup(item, i); if (stack.stackSize <= 0) { item.setDead(); } } } else npc.worldObj.spawnEntityInWorld(item); } } public EntityItem getEntityItem(ItemStack itemstack) { if (itemstack == null) { return null; } EntityItem entityitem = new EntityItem(npc.worldObj, npc.posX, (npc.posY - 0.30000001192092896D) + (double) npc.getEyeHeight(), npc.posZ, itemstack); entityitem.delayBeforeCanPickup = 40; float f2 = npc.getRNG().nextFloat() * 0.5F; float f4 = npc.getRNG().nextFloat() * 3.141593F * 2.0F; entityitem.motionX = -MathHelper.sin(f4) * f2; entityitem.motionZ = MathHelper.cos(f4) * f2; entityitem.motionY = 0.20000000298023224D; return entityitem; } public ItemStack armorItemInSlot(int i) { return getArmor().get(i); } @Override public int getSizeInventory() { // TODO Auto-generated method stub return 15; } @Override public ItemStack getStackInSlot(int i) { if(i < 4) return armorItemInSlot(i); else if(i < 7) return getWeapons().get(i-4); else return items.get(i-7); } @Override public ItemStack decrStackSize(int par1, int par2) { int i =0; HashMap var3; if (par1 >= 7) { var3 = items; par1 -= 7; } else if (par1 >= 4) { var3 = getWeapons(); par1 -= 4; i = 1; } else{ var3 = getArmor(); i = 2; } ItemStack var4 = null; if (var3.get(par1) != null) { if (var3.get(par1).stackSize <= par2) { var4 = var3.get(par1); var3.put(par1,null); } else { var4 = var3.get(par1).splitStack(par2); if (var3.get(par1).stackSize == 0) { var3.put(par1,null); } } } if(i == 1) setWeapons(var3); if(i == 2) setArmor(var3); return var4; } @Override public ItemStack getStackInSlotOnClosing(int par1) { int i = 0; HashMap var2;; if (par1 >= 7) { var2 = items; par1 -= 7; } else if (par1 >= 4) { var2 = getWeapons(); par1 -= 4; i = 1; } else{ var2 = getArmor(); i = 2; } if (var2.get(par1) != null) { ItemStack var3 = var2.get(par1); var2.put(par1,null); if(i == 1) setWeapons(var2); if(i == 2) setArmor(var2); return var3; } else { return null; } } @Override public void setInventorySlotContents(int par1, ItemStack par2ItemStack) { int i = 0; HashMap var3; if (par1 >= 7) { var3 = items; par1 -= 7; } else if (par1 >= 4) { var3 = getWeapons(); par1 -= 4; i = 1; } else{ var3 = getArmor(); i = 2; } var3.put(par1,par2ItemStack); if(i == 1) setWeapons(var3); if(i == 2) setArmor(var3); } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer var1) { return true; } @Override public boolean isItemValidForSlot(int i, ItemStack itemstack) { return true; } @Override public String getInventoryName() { return "NPC Inventory"; } @Override public boolean hasCustomInventoryName() { return true; } @Override public void markDirty() { // TODO Auto-generated method stub } @Override public void openInventory() { // TODO Auto-generated method stub } @Override public void closeInventory() { // TODO Auto-generated method stub } }