Files
CustomNPC-Plus/src/main/java/noppes/npcs/DataInventory.java
T

374 lines
11 KiB
Java
Raw Normal View History

2018-09-13 12:03:28 -04:00
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;
2023-01-12 21:33:06 -05:00
import java.util.ArrayList;
import java.util.HashMap;
2023-09-15 14:33:50 -04:00
import java.util.Random;
2023-01-12 21:33:06 -05:00
2023-09-15 14:33:50 -04:00
public class DataInventory implements IInventory {
2025-03-13 17:14:45 -04:00
public static Random random = new Random();
public HashMap<Integer, ItemStack> items = new HashMap<Integer, ItemStack>();
public HashMap<Integer, Double> dropchance = new HashMap<Integer, Double>();
public HashMap<Integer, ItemStack> weapons = new HashMap<Integer, ItemStack>();
public HashMap<Integer, ItemStack> prevWeapons = new HashMap<Integer, ItemStack>();
public HashMap<Integer, ItemStack> armor = new HashMap<Integer, ItemStack>();
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<Integer, Integer> 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<Integer, ItemStack> getWeapons() {
return weapons;
}
public void setWeapons(HashMap<Integer, ItemStack> list) {
weapons = list;
}
public HashMap<Integer, ItemStack> getArmor() {
return armor;
}
public void setArmor(HashMap<Integer, ItemStack> 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<ItemStack> getDroppedItems(DamageSource damagesource) {
ArrayList<ItemStack> drops = new ArrayList<>();
ArrayList<EntityItem> list = new ArrayList<EntityItem>();
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<ItemStack> itemList) {
ArrayList<EntityItem> list = new ArrayList<EntityItem>();
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);
2018-09-13 12:03:28 -04:00
}
2025-03-13 17:14:45 -04:00
}
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() {
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<Integer, ItemStack> var3;
if (par1 >= 7) {
var3 = items;
par1 -= 7;
} else if (par1 >= 4) {
var3 = getWeapons();
2018-09-13 12:03:28 -04:00
par1 -= 4;
i = 1;
2025-03-13 17:14:45 -04:00
} else {
var3 = getArmor();
2018-09-13 12:03:28 -04:00
i = 2;
}
2025-02-10 14:58:45 -05:00
2018-09-13 12:03:28 -04:00
ItemStack var4 = null;
2025-03-13 17:14:45 -04:00
if (var3.get(par1) != null) {
2018-09-13 12:03:28 -04:00
2025-03-13 17:14:45 -04:00
if (var3.get(par1).stackSize <= par2) {
2018-09-13 12:03:28 -04:00
var4 = var3.get(par1);
2025-03-13 17:14:45 -04:00
var3.put(par1, null);
} else {
2018-09-13 12:03:28 -04:00
var4 = var3.get(par1).splitStack(par2);
2025-03-13 17:14:45 -04:00
if (var3.get(par1).stackSize == 0) {
var3.put(par1, null);
2018-09-13 12:03:28 -04:00
}
}
}
2025-03-13 17:14:45 -04:00
if (i == 1)
setWeapons(var3);
if (i == 2)
setArmor(var3);
2018-09-13 12:03:28 -04:00
return var4;
2025-03-13 17:14:45 -04:00
}
@Override
public ItemStack getStackInSlotOnClosing(int par1) {
int i = 0;
HashMap<Integer, ItemStack> var2;
;
if (par1 >= 7) {
var2 = items;
2018-09-13 12:03:28 -04:00
par1 -= 7;
2025-03-13 17:14:45 -04:00
} else if (par1 >= 4) {
var2 = getWeapons();
2018-09-13 12:03:28 -04:00
par1 -= 4;
i = 1;
2025-03-13 17:14:45 -04:00
} else {
var2 = getArmor();
2018-09-13 12:03:28 -04:00
i = 2;
}
2025-03-13 17:14:45 -04:00
if (var2.get(par1) != null) {
2018-09-13 12:03:28 -04:00
ItemStack var3 = var2.get(par1);
2025-03-13 17:14:45 -04:00
var2.put(par1, null);
if (i == 1)
setWeapons(var2);
if (i == 2)
setArmor(var2);
2018-09-13 12:03:28 -04:00
return var3;
2025-03-13 17:14:45 -04:00
} else {
2018-09-13 12:03:28 -04:00
return null;
}
2025-03-13 17:14:45 -04:00
}
@Override
public void setInventorySlotContents(int par1, ItemStack par2ItemStack) {
int i = 0;
HashMap<Integer, ItemStack> var3;
if (par1 >= 7) {
var3 = items;
2018-09-13 12:03:28 -04:00
par1 -= 7;
2025-03-13 17:14:45 -04:00
} else if (par1 >= 4) {
var3 = getWeapons();
2018-09-13 12:03:28 -04:00
par1 -= 4;
i = 1;
2025-03-13 17:14:45 -04:00
} else {
var3 = getArmor();
2018-09-13 12:03:28 -04:00
i = 2;
}
2025-03-13 17:14:45 -04:00
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() {
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
}
2018-09-13 12:03:28 -04:00
}