diff --git a/src/main/java/com/darkona/adventurebackpack/block/BlockSleepingBag.java b/src/main/java/com/darkona/adventurebackpack/block/BlockSleepingBag.java index a24a33f4..47c0fcdf 100644 --- a/src/main/java/com/darkona/adventurebackpack/block/BlockSleepingBag.java +++ b/src/main/java/com/darkona/adventurebackpack/block/BlockSleepingBag.java @@ -361,6 +361,7 @@ public void onBlockDestroyedByExplosion(World world, int x, int y, int z, Explos @Override public void onBlockDestroyedByPlayer(World world, int x, int y, int z, int meta) { + //TODO make it work if player destroyed head block of sleeping bag (so backpack 1 more tile away) //LogHelper.info("onBlockDestroyedByPlayer() : BlockSleepingBag"); int direction = getDirection(meta); int tileZ = z; diff --git a/src/main/java/com/darkona/adventurebackpack/block/TileAdventure.java b/src/main/java/com/darkona/adventurebackpack/block/TileAdventure.java new file mode 100644 index 00000000..b14b0834 --- /dev/null +++ b/src/main/java/com/darkona/adventurebackpack/block/TileAdventure.java @@ -0,0 +1,196 @@ +package com.darkona.adventurebackpack.block; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; + +import com.darkona.adventurebackpack.inventory.IInventoryTanks; + +import static com.darkona.adventurebackpack.common.Constants.TAG_SLOT; + +/** + * Created on 26.02.2018 + * + * @author Ugachaga + */ +@SuppressWarnings("WeakerAccess") +abstract class TileAdventure extends TileEntity implements IInventoryTanks +{ + @Override + public int getSizeInventory() + { + return getInventory().length; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return getInventory()[slot]; + } + + @Nullable + @Override + public ItemStack decrStackSize(int slot, int quantity) + { + ItemStack stack = getStackInSlot(slot); + if (stack != null) + { + if (stack.stackSize <= quantity) + { + setInventorySlotContents(slot, null); + } + else + { + stack = stack.splitStack(quantity); + dirtyInventory(); + } + } + return stack; + } + + @Nullable + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + for (int s : getSlotsOnClosingArray()) + if (slot == s) + return getInventory()[slot]; + + return null; + } + + @Override + public void setInventorySlotContents(int slot, @Nullable ItemStack stack) + { + setInventorySlotContentsNoSave(slot, stack); + dirtyInventory(); + } + + @Override + public String getInventoryName() + { + return ""; + } + + @Override + public boolean hasCustomInventoryName() + { + return getInventoryName() != null && !getInventoryName().isEmpty(); + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + // we have to inherit markDirty() implemented in TileEntity.class + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this + && player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) <= 64; + } + + @Override + public void openInventory() + { + // + } + + @Override + public void closeInventory() + { + dirtyInventory(); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return false; // override when automation is allowed + } + + @Nullable + @Override + public ItemStack decrStackSizeNoSave(int slot, int quantity) + { + ItemStack stack = getStackInSlot(slot); + if (stack != null) + { + if (stack.stackSize <= quantity) + setInventorySlotContentsNoSave(slot, null); + else + stack = stack.splitStack(quantity); + } + return stack; + } + + @Override + public void setInventorySlotContentsNoSave(int slot, @Nullable ItemStack stack) + { + if (slot >= getSizeInventory()) + return; + + if (stack != null) + { + if (stack.stackSize > getInventoryStackLimit()) + stack.stackSize = getInventoryStackLimit(); + + if (stack.stackSize == 0) + stack = null; + } + + getInventory()[slot] = stack; + } + + @Override + public void dirtyInventory() + { + updateTankSlots(); + markDirty(); + } + + @Override + public void dirtyTanks() + { + // for now none is calling this for tile.backpack + // if we really want to use it, we have to re-implement it, more efficient way + dirtyInventory(); + } + + protected void setInventoryFromTagList(NBTTagList items) + { + for (int i = 0; i < items.tagCount(); i++) + { + NBTTagCompound item = items.getCompoundTagAt(i); + byte slot = item.getByte(TAG_SLOT); + if (slot >= 0 && slot < getSizeInventory()) + { + getInventory()[slot] = ItemStack.loadItemStackFromNBT(item); + } + } + } + + protected NBTTagList getInventoryTagList() + { + NBTTagList items = new NBTTagList(); + for (int i = 0; i < getSizeInventory(); i++) + { + ItemStack stack = getInventory()[i]; + if (stack != null) + { + NBTTagCompound item = new NBTTagCompound(); + item.setByte(TAG_SLOT, (byte) i); + stack.writeToNBT(item); + items.appendTag(item); + } + } + return items; + } + +} diff --git a/src/main/java/com/darkona/adventurebackpack/block/TileAdventureBackpack.java b/src/main/java/com/darkona/adventurebackpack/block/TileAdventureBackpack.java index 837b9200..c8716e75 100644 --- a/src/main/java/com/darkona/adventurebackpack/block/TileAdventureBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/block/TileAdventureBackpack.java @@ -10,7 +10,6 @@ import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; @@ -22,11 +21,10 @@ import com.darkona.adventurebackpack.config.ConfigHandler; import com.darkona.adventurebackpack.init.ModBlocks; import com.darkona.adventurebackpack.init.ModItems; -import com.darkona.adventurebackpack.inventory.IInventoryAdventureBackpack; +import com.darkona.adventurebackpack.inventory.IInventoryBackpack; import com.darkona.adventurebackpack.inventory.InventoryActions; import com.darkona.adventurebackpack.inventory.SlotBackpack; import com.darkona.adventurebackpack.inventory.SlotTool; -import com.darkona.adventurebackpack.item.ItemHose; import com.darkona.adventurebackpack.reference.BackpackTypes; import com.darkona.adventurebackpack.reference.GeneralReference; import com.darkona.adventurebackpack.util.BackpackUtils; @@ -52,105 +50,35 @@ /** * Created by Darkona on 12/10/2014. */ -public class TileAdventureBackpack extends TileEntity implements IInventoryAdventureBackpack, ISidedInventory +public class TileAdventureBackpack extends TileAdventure implements IInventoryBackpack, ISidedInventory { + private static final int[] MAIN_INVENTORY_SLOTS = Utils.createSlotArray(0, Constants.INVENTORY_MAIN_SIZE); + + private BackpackTypes type = BackpackTypes.STANDARD; private ItemStack[] inventory = new ItemStack[Constants.INVENTORY_SIZE]; private FluidTank leftTank = new FluidTank(Constants.BASIC_TANK_CAPACITY); private FluidTank rightTank = new FluidTank(Constants.BASIC_TANK_CAPACITY); + private NBTTagCompound extendedProperties = new NBTTagCompound(); - private BackpackTypes type; private NBTTagList ench; - private NBTTagCompound extendedProperties; private boolean disableCycling; private boolean disableNVision; - private int lastTime; + private int lastTime = 0; private boolean sleepingBagDeployed; private int sbdir; private int sbx; private int sby; private int sbz; - private int luminosity; private int checkTime = 0; + private int luminosity = 0; public TileAdventureBackpack() { sleepingBagDeployed = false; - setType(BackpackTypes.STANDARD); - luminosity = 0; - lastTime = 0; - checkTime = 0; - extendedProperties = new NBTTagCompound(); - } - - public int getLuminosity() - { - return luminosity; - } - - @Override - public int getLastTime() - { - return lastTime; } - @Override - public void setLastTime(int lastTime) - { - this.lastTime = lastTime; - } - - @Override - public NBTTagCompound getExtendedProperties() - { - return extendedProperties; - } - - public boolean deploySleepingBag(EntityPlayer player, World world, int meta, int cX, int cY, int cZ) - { - if (world.isRemote) - return false; - - sleepingBagDeployed = CoordsUtils.spawnSleepingBag(player, world, meta, cX, cY, cZ); - if (sleepingBagDeployed) - { - sbx = cX; - sby = cY; - sbz = cZ; - sbdir = meta; - world.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); - } - return sleepingBagDeployed; - } - - public void setSleepingBagDeployed(boolean state) - { - this.sleepingBagDeployed = state; - } - - public boolean removeSleepingBag(World world) - { - if (sleepingBagDeployed) - { - if (world.getBlock(sbx, sby, sbz) == ModBlocks.blockSleepingBag) - { - world.func_147480_a(sbx, sby, sbz, false); - this.sleepingBagDeployed = false; - markDirty(); - return true; - } - } - else - { - this.sleepingBagDeployed = false; - markDirty(); - } - return false; - } - - //=====================================================GETTERS====================================================// - @Override public BackpackTypes getType() { @@ -160,31 +88,7 @@ public BackpackTypes getType() @Override public ItemStack[] getInventory() { - return this.inventory; - } - - @Override - public int getSizeInventory() - { - return inventory.length; - } - - @Override - public ItemStack getStackInSlot(int slot) - { - return inventory[slot]; - } - - @Override - public String getInventoryName() - { - return ""; - } - - @Override - public int getInventoryStackLimit() - { - return 64; + return inventory; } @Override @@ -199,33 +103,24 @@ public FluidTank getRightTank() return rightTank; } - //=====================================================SETTERS====================================================// - - public void setType(BackpackTypes type) - { - this.type = type; - } - - //=====================================================BOOLEANS===================================================// @Override - public boolean hasCustomInventoryName() + public FluidTank[] getTanksArray() { - return false; + return new FluidTank[]{leftTank, rightTank}; } @Override - public boolean isUseableByPlayer(EntityPlayer player) + public int[] getSlotsOnClosingArray() { - return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) <= 64; + return new int[]{BUCKET_IN_LEFT, BUCKET_IN_RIGHT, BUCKET_OUT_LEFT, BUCKET_OUT_RIGHT}; } @Override - public boolean isSleepingBagDeployed() + public NBTTagCompound getExtendedProperties() { - return this.sleepingBagDeployed; + return extendedProperties; } - //=======================================================NBT======================================================// @Override public void readFromNBT(NBTTagCompound compound) { @@ -239,37 +134,6 @@ public void readFromNBT(NBTTagCompound compound) luminosity = compound.getInteger("lumen"); } - @Override - public void writeToNBT(NBTTagCompound compound) - { - super.writeToNBT(compound); - saveToNBT(compound); - compound.setBoolean("sleepingbag", sleepingBagDeployed); - compound.setInteger("sbx", sbx); - compound.setInteger("sby", sby); - compound.setInteger("sbz", sbz); - compound.setInteger("sbdir", sbdir); - compound.setInteger("lumen", luminosity); - } - - private void convertFromOldNBTFormat(NBTTagCompound compound) // backwards compatibility - { - NBTTagCompound oldBackpackTag = compound.getCompoundTag("backpackData"); - NBTTagList oldItems = oldBackpackTag.getTagList("ABPItems", NBT.TAG_COMPOUND); - leftTank.readFromNBT(oldBackpackTag.getCompoundTag("leftTank")); - rightTank.readFromNBT(oldBackpackTag.getCompoundTag("rightTank")); - type = BackpackTypes.getType(oldBackpackTag.getString("colorName")); - - NBTTagCompound newBackpackTag = new NBTTagCompound(); - newBackpackTag.setTag(TAG_INVENTORY, oldItems); - newBackpackTag.setTag(TAG_RIGHT_TANK, rightTank.writeToNBT(new NBTTagCompound())); - newBackpackTag.setTag(TAG_LEFT_TANK, leftTank.writeToNBT(new NBTTagCompound())); - newBackpackTag.setByte(TAG_TYPE, BackpackTypes.getMeta(type)); - - compound.setTag(TAG_WEARABLE_COMPOUND, newBackpackTag); - compound.removeTag("backpackData"); - } - @Override public void loadFromNBT(NBTTagCompound compound) { @@ -281,16 +145,7 @@ public void loadFromNBT(NBTTagCompound compound) NBTTagCompound backpackTag = compound.getCompoundTag(TAG_WEARABLE_COMPOUND); type = BackpackTypes.getType(backpackTag.getByte(TAG_TYPE)); - NBTTagList items = backpackTag.getTagList(TAG_INVENTORY, NBT.TAG_COMPOUND); - for (int i = 0; i < items.tagCount(); i++) - { - NBTTagCompound item = items.getCompoundTagAt(i); - byte slot = item.getByte("Slot"); - if (slot >= 0 && slot < inventory.length) - { - inventory[slot] = ItemStack.loadItemStackFromNBT(item); - } - } + setInventoryFromTagList(backpackTag.getTagList(TAG_INVENTORY, NBT.TAG_COMPOUND)); leftTank.readFromNBT(backpackTag.getCompoundTag(TAG_LEFT_TANK)); rightTank.readFromNBT(backpackTag.getCompoundTag(TAG_RIGHT_TANK)); extendedProperties = backpackTag.getCompoundTag(TAG_EXTENDED_COMPOUND); @@ -299,6 +154,19 @@ public void loadFromNBT(NBTTagCompound compound) lastTime = backpackTag.getInteger("lastTime"); } + @Override + public void writeToNBT(NBTTagCompound compound) + { + super.writeToNBT(compound); + saveToNBT(compound); + compound.setBoolean("sleepingbag", sleepingBagDeployed); + compound.setInteger("sbx", sbx); + compound.setInteger("sby", sby); + compound.setInteger("sbz", sbz); + compound.setInteger("sbdir", sbdir); + compound.setInteger("lumen", luminosity); + } + @Override public void saveToNBT(NBTTagCompound compound) { @@ -307,19 +175,7 @@ public void saveToNBT(NBTTagCompound compound) NBTTagCompound backpackTag = new NBTTagCompound(); backpackTag.setByte(TAG_TYPE, BackpackTypes.getMeta(type)); - NBTTagList items = new NBTTagList(); - for (int i = 0; i < inventory.length; i++) - { - ItemStack stack = inventory[i]; - if (stack != null) - { - NBTTagCompound item = new NBTTagCompound(); - item.setByte("Slot", (byte) i); - stack.writeToNBT(item); - items.appendTag(item); - } - } - backpackTag.setTag(TAG_INVENTORY, items); + backpackTag.setTag(TAG_INVENTORY, getInventoryTagList()); backpackTag.setTag(TAG_RIGHT_TANK, rightTank.writeToNBT(new NBTTagCompound())); backpackTag.setTag(TAG_LEFT_TANK, leftTank.writeToNBT(new NBTTagCompound())); backpackTag.setTag(TAG_EXTENDED_COMPOUND, extendedProperties); @@ -331,148 +187,175 @@ public void saveToNBT(NBTTagCompound compound) } @Override - public FluidTank[] getTanksArray() + public boolean updateTankSlots() { - return new FluidTank[]{leftTank, rightTank}; + boolean changesMade = false; + while (InventoryActions.transferContainerTank(this, getLeftTank(), BUCKET_IN_LEFT)) + changesMade = true; + while (InventoryActions.transferContainerTank(this, getRightTank(), BUCKET_IN_RIGHT)) + changesMade = true; + return changesMade; } - //====================================================INVENTORY===================================================// @Override - public void openInventory() + public void dirtyExtended() { - + // for now none is calling this for tile.backpack + // if we really want to use it, we have to re-implement it, more efficient way + dirtyInventory(); } @Override - public void closeInventory() + public void dirtyTime() { - markDirty(); + // for now none is calling this for tile.backpack + // if we really want to use it, we have to re-implement it, more efficient way + dirtyInventory(); } @Override - public boolean isItemValidForSlot(int slot, ItemStack stack) + public int getLastTime() { - if (slot <= Constants.END_OF_INVENTORY) - { - return SlotBackpack.isValidItem(stack); - } - return (slot == TOOL_UPPER || slot == TOOL_LOWER) && SlotTool.isValidTool(stack); + return lastTime; } @Override - public ItemStack decrStackSize(int i, int count) + public void setLastTime(int lastTime) { - ItemStack itemstack = getStackInSlot(i); - - if (itemstack != null) - { - if (itemstack.stackSize <= count) - { - setInventorySlotContents(i, null); - } - else - { - itemstack = itemstack.splitStack(count); - } - } - markDirty(); - return itemstack; + this.lastTime = lastTime; } @Override - public ItemStack getStackInSlotOnClosing(int slot) + public boolean hasItem(Item item) { - if (slot == BUCKET_IN_LEFT || slot == BUCKET_IN_RIGHT || slot == BUCKET_OUT_LEFT || slot == BUCKET_OUT_RIGHT) - { - return inventory[slot]; - } - return null; + return InventoryActions.hasItem(this, item); } @Override - public void setInventorySlotContents(int slot, ItemStack stack) + public void consumeInventoryItem(Item item) { - inventory[slot] = stack; - if (stack != null && stack.stackSize > getInventoryStackLimit()) - { - stack.stackSize = getInventoryStackLimit(); - } - markDirty(); + InventoryActions.consumeItemInInventory(this, item); } - @Override - public void markDirty() + // Logic: from tile to item + public boolean equip(World world, EntityPlayer player, int x, int y, int z) { - for (int i = 0; i < inventory.length; i++) + ItemStack stacky = new ItemStack(ModItems.adventureBackpack, 1); + transferToItemStack(stacky); + removeSleepingBag(world); + if (BackpackUtils.equipWearable(stacky, player) != BackpackUtils.Reasons.SUCCESSFUL) { - if (inventory[i] != null) - { - if ((i == BUCKET_IN_LEFT || i == BUCKET_IN_RIGHT) - || (i == BUCKET_OUT_LEFT || i == BUCKET_OUT_RIGHT) && inventory[i].getItem() instanceof ItemHose) - { - updateTankSlots(); - } - } + Wearing.WearableType wtype = Wearing.getWearingWearableType(player); + if (wtype != Wearing.WearableType.UNKNOWN) + player.addChatComponentMessage(new ChatComponentTranslation("adventurebackpack:messages.already.equipped." + wtype.name().toLowerCase())); + + if (!player.inventory.addItemStackToInventory(stacky)) + return drop(world, player, x, y, z); } - super.markDirty(); + return true; } - @Override - public boolean updateTankSlots() + public boolean drop(World world, EntityPlayer player, int x, int y, int z) { - boolean result = false; - while (InventoryActions.transferContainerTank(this, getLeftTank(), BUCKET_IN_LEFT)) - result = true; - while (InventoryActions.transferContainerTank(this, getRightTank(), BUCKET_IN_RIGHT)) - result = true; - return result; + removeSleepingBag(world); + if (player.capabilities.isCreativeMode) return true; + ItemStack stacky = new ItemStack(ModItems.adventureBackpack, 1); + transferToItemStack(stacky); + + float spawnX = x + world.rand.nextFloat(); + float spawnY = y + world.rand.nextFloat(); + float spawnZ = z + world.rand.nextFloat(); + EntityItem droppedItem = new EntityItem(world, spawnX, spawnY, spawnZ, stacky); + + float mult = 0.05F; + droppedItem.motionX = (-0.5F + world.rand.nextFloat()) * mult; + droppedItem.motionY = (4 + world.rand.nextFloat()) * mult; + droppedItem.motionZ = (-0.5F + world.rand.nextFloat()) * mult; + + return world.spawnEntityInWorld(droppedItem); } + private void transferToItemStack(ItemStack stack) + { + NBTTagCompound compound = new NBTTagCompound(); + saveToNBT(compound); + stack.setTagCompound(compound); + stack.setItemDamage(BackpackTypes.getMeta(type)); // save the meta, cuz why not + } + + // Sleeping Bag @Override - public void setInventorySlotContentsNoSave(int slot, ItemStack itemstack) + public boolean isSleepingBagDeployed() + { + return this.sleepingBagDeployed; + } + + public void setSleepingBagDeployed(boolean state) { - if (slot > inventory.length) return; - inventory[slot] = itemstack; - if (itemstack != null && itemstack.stackSize > getInventoryStackLimit()) + this.sleepingBagDeployed = state; + } + + public boolean deploySleepingBag(EntityPlayer player, World world, int meta, int cX, int cY, int cZ) + { + if (world.isRemote) + return false; + + sleepingBagDeployed = CoordsUtils.spawnSleepingBag(player, world, meta, cX, cY, cZ); + if (sleepingBagDeployed) { - itemstack.stackSize = getInventoryStackLimit(); + sbx = cX; + sby = cY; + sbz = cZ; + sbdir = meta; + world.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); } + return sleepingBagDeployed; + } + + public void removeSleepingBag(World world) + { + if (sleepingBagDeployed && world.getBlock(sbx, sby, sbz) == ModBlocks.blockSleepingBag) + world.func_147480_a(sbx, sby, sbz, false); + + sleepingBagDeployed = false; + markDirty(); } + // Automation @Override - public ItemStack decrStackSizeNoSave(int slot, int amount) + public int[] getAccessibleSlotsFromSide(int side) { - ItemStack stack = getStackInSlot(slot); + if (GeneralReference.isDimensionAllowed(worldObj.provider.dimensionId)) + return MAIN_INVENTORY_SLOTS; - if (stack != null) - { - if (stack.stackSize <= amount) - { - setInventorySlotContentsNoSave(slot, null); - } - else - { - stack = stack.splitStack(amount); - } - } - return stack; + return null; } @Override - public boolean hasItem(Item item) + public boolean canInsertItem(int slot, ItemStack item, int side) { - return InventoryActions.hasItem(this, item); + return this.isItemValidForSlot(slot, item); } @Override - public void consumeInventoryItem(Item item) + public boolean isItemValidForSlot(int slot, ItemStack stack) { - InventoryActions.consumeItemInInventory(this, item); + if (slot <= Constants.END_OF_INVENTORY) + return SlotBackpack.isValidItem(stack); + + return (slot == TOOL_UPPER || slot == TOOL_LOWER) && SlotTool.isValidTool(stack); } - //===================================================TILE ENTITY==================================================// + @Override + public boolean canExtractItem(int slot, ItemStack item, int side) + { + return true; + } - //SEND SYNC PACKET + /** + * Send sync packet. This is necessary for the TileEntity to load the nbt as soon as it is loaded + * and be rendered properly when the custom renderer reads it + */ @Override public Packet getDescriptionPacket() { @@ -481,8 +364,10 @@ public Packet getDescriptionPacket() return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, compound); } - //RECEIV SYNC PACKET - This is necessary for the TileEntity to load the nbt as soon as it is loaded and be rendered - //properly when the custom renderer reads it + /** + * Receive sync packet. This is necessary for the TileEntity to load the nbt as soon as it is loaded + * and be rendered properly when the custom renderer reads it + */ @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { @@ -490,10 +375,11 @@ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) readFromNBT(pkt.func_148857_g()); } + // Ticking at World.updateEntities() @Override public void updateEntity() { - //Execute this backpack's ability. No, seriously. You might not infer that from the code. Just sayin' + //Execute this backpack's TILE ability. No, seriously. You might not infer that from the code. Just sayin' if (ConfigHandler.backpackAbilities && BackpackTypes.hasProperty(type, BackpackTypes.Props.TILE)) { BackpackAbilities.backpackAbilities.executeTileAbility(this.worldObj, this); @@ -512,10 +398,10 @@ public void updateEntity() worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.blockBackpack, meta, 3); worldObj.setLightValue(EnumSkyBlock.Block, xCoord, yCoord, zCoord, luminosity); } - if (worldObj.getBlock(sbx, sby, sbz) != ModBlocks.blockSleepingBag) - { + + if (sleepingBagDeployed && worldObj.getBlock(sbx, sby, sbz) != ModBlocks.blockSleepingBag) sleepingBagDeployed = false; - } + checkTime = 20; } else @@ -524,125 +410,26 @@ public void updateEntity() } } - @Override - public TileAdventureBackpack getTile() - { - return this; - } - - @Override - public ItemStack getParentItemStack() - { - return null; - } - - private ItemStack transferToItemStack(ItemStack stack) - { - NBTTagCompound compound = new NBTTagCompound(); - saveToNBT(compound); - stack.setTagCompound(compound); - return stack; - } - - //=====================================================BACKPACK===================================================// - public boolean equip(World world, EntityPlayer player, int x, int y, int z) - { - ItemStack stacky = new ItemStack(ModItems.adventureBackpack, 1); - transferToItemStack(stacky); - removeSleepingBag(world); - if (BackpackUtils.equipWearable(stacky, player) != BackpackUtils.Reasons.SUCCESSFUL) - { - if (Wearing.isWearingWearable(player)) - { - if (Wearing.isWearingBackpack(player)) - { - player.addChatComponentMessage(new ChatComponentTranslation("adventurebackpack:messages.already.equipped.backpack")); - } - else if (Wearing.isWearingCopter(player)) - { - player.addChatComponentMessage(new ChatComponentTranslation("adventurebackpack:messages.already.equipped.copterpack")); - } - else if (Wearing.isWearingJetpack(player)) - { - player.addChatComponentMessage(new ChatComponentTranslation("adventurebackpack:messages.already.equipped.jetpack")); - } - } - if (!player.inventory.addItemStackToInventory(stacky)) - { - return drop(world, player, x, y, z); - } - } - return true; - } - - public boolean drop(World world, EntityPlayer player, int x, int y, int z) - { - removeSleepingBag(world); - if (player.capabilities.isCreativeMode) return true; - ItemStack stacky = new ItemStack(ModItems.adventureBackpack, 1); - transferToItemStack(stacky); - float spawnX = x + world.rand.nextFloat(); - float spawnY = y + world.rand.nextFloat(); - float spawnZ = z + world.rand.nextFloat(); - - EntityItem droppedItem = new EntityItem(world, spawnX, spawnY, spawnZ, stacky); - - float mult = 0.05F; - - droppedItem.motionX = (-0.5F + world.rand.nextFloat()) * mult; - droppedItem.motionY = (4 + world.rand.nextFloat()) * mult; - droppedItem.motionZ = (-0.5F + world.rand.nextFloat()) * mult; - - return world.spawnEntityInWorld(droppedItem); - } - - @Override - public void dirtyTanks() - { - - } - - @Override - public void dirtyTime() - { - - } - - @Override - public void dirtyExtended() - { - - } - - @Override - public void dirtyInventory() + public int getLuminosity() { - + return luminosity; } - //=================================================ISidedInventory================================================// - - private static final int[] SLOTS = Utils.createSlotArray(0, Constants.INVENTORY_MAIN_SIZE); - - @Override - public int[] getAccessibleSlotsFromSide(int side) + private void convertFromOldNBTFormat(NBTTagCompound compound) // backwards compatibility { - if (GeneralReference.isDimensionAllowed(this.worldObj.provider.dimensionId)) - { - return SLOTS; - } - return null; - } + NBTTagCompound oldBackpackTag = compound.getCompoundTag("backpackData"); + NBTTagList oldItems = oldBackpackTag.getTagList("ABPItems", NBT.TAG_COMPOUND); + leftTank.readFromNBT(oldBackpackTag.getCompoundTag("leftTank")); + rightTank.readFromNBT(oldBackpackTag.getCompoundTag("rightTank")); + type = BackpackTypes.getType(oldBackpackTag.getString("colorName")); - @Override - public boolean canInsertItem(int slot, ItemStack item, int side) - { - return this.isItemValidForSlot(slot, item); - } + NBTTagCompound newBackpackTag = new NBTTagCompound(); + newBackpackTag.setTag(TAG_INVENTORY, oldItems); + newBackpackTag.setTag(TAG_RIGHT_TANK, rightTank.writeToNBT(new NBTTagCompound())); + newBackpackTag.setTag(TAG_LEFT_TANK, leftTank.writeToNBT(new NBTTagCompound())); + newBackpackTag.setByte(TAG_TYPE, BackpackTypes.getMeta(type)); - @Override - public boolean canExtractItem(int slot, ItemStack item, int side) - { - return true; + compound.setTag(TAG_WEARABLE_COMPOUND, newBackpackTag); + compound.removeTag("backpackData"); } } \ No newline at end of file diff --git a/src/main/java/com/darkona/adventurebackpack/client/gui/GuiAdvBackpack.java b/src/main/java/com/darkona/adventurebackpack/client/gui/GuiAdvBackpack.java index f0989d61..0d6cc736 100644 --- a/src/main/java/com/darkona/adventurebackpack/client/gui/GuiAdvBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/client/gui/GuiAdvBackpack.java @@ -17,7 +17,7 @@ import com.darkona.adventurebackpack.config.ConfigHandler; import com.darkona.adventurebackpack.init.ModNetwork; import com.darkona.adventurebackpack.inventory.ContainerBackpack; -import com.darkona.adventurebackpack.inventory.IInventoryAdventureBackpack; +import com.darkona.adventurebackpack.inventory.IInventoryBackpack; import com.darkona.adventurebackpack.inventory.InventoryBackpack; import com.darkona.adventurebackpack.network.PlayerActionPacket; import com.darkona.adventurebackpack.network.SleepingBagPacket; @@ -42,7 +42,7 @@ public class GuiAdvBackpack extends GuiWithTanks private static GuiTank tankLeft = new GuiTank(25, 7, 100, 16, ConfigHandler.typeTankRender); private static GuiTank tankRight = new GuiTank(207, 7, 100, 16, ConfigHandler.typeTankRender); - private IInventoryAdventureBackpack inventory; + private IInventoryBackpack inventory; private boolean isHoldingSpace; diff --git a/src/main/java/com/darkona/adventurebackpack/client/models/ModelBackpackBlock.java b/src/main/java/com/darkona/adventurebackpack/client/models/ModelBackpackBlock.java index b6cbea98..5cf69fd2 100644 --- a/src/main/java/com/darkona/adventurebackpack/client/models/ModelBackpackBlock.java +++ b/src/main/java/com/darkona/adventurebackpack/client/models/ModelBackpackBlock.java @@ -12,7 +12,7 @@ import codechicken.lib.vec.Vector3; import com.darkona.adventurebackpack.common.Constants; -import com.darkona.adventurebackpack.inventory.IInventoryAdventureBackpack; +import com.darkona.adventurebackpack.inventory.IInventoryBackpack; import com.darkona.adventurebackpack.reference.BackpackTypes; import static com.darkona.adventurebackpack.reference.BackpackTypes.*; @@ -268,7 +268,7 @@ public ModelBackpackBlock() this.pigNose.addBox(0.0F, 0.0F, 0.0F, 4, 3, 1); } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float scale, IInventoryAdventureBackpack backpack) + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float scale, IInventoryBackpack backpack) { //scale*=0.9; boolean sleepingbag = backpack.isSleepingBagDeployed(); @@ -364,7 +364,7 @@ private void renderFluidsInTanks(FluidTank tankLeft, FluidTank tankRight, float } - private void renderBackpack(IInventoryAdventureBackpack backpack, float scale) + private void renderBackpack(IInventoryBackpack backpack, float scale) { BackpackTypes type = backpack.getType(); diff --git a/src/main/java/com/darkona/adventurebackpack/common/BackpackAbilities.java b/src/main/java/com/darkona/adventurebackpack/common/BackpackAbilities.java index 584f0fe0..8ff76208 100644 --- a/src/main/java/com/darkona/adventurebackpack/common/BackpackAbilities.java +++ b/src/main/java/com/darkona/adventurebackpack/common/BackpackAbilities.java @@ -741,6 +741,6 @@ public void tileMelon(World world, TileAdventureBackpack backpack) /*public void tileCow(World world, TileAdventureBackpack backpack) { - IInventoryAdventureBackpack inv = backpack; //TODO make CowBackpack (and others) working in tile form + IInventoryBackpack inv = backpack; //TODO make CowBackpack (and others) working in tile form }*/ } diff --git a/src/main/java/com/darkona/adventurebackpack/common/Constants.java b/src/main/java/com/darkona/adventurebackpack/common/Constants.java index 49cc2657..9ce11ba1 100644 --- a/src/main/java/com/darkona/adventurebackpack/common/Constants.java +++ b/src/main/java/com/darkona/adventurebackpack/common/Constants.java @@ -21,6 +21,7 @@ public enum Source //TODO move to separate class? public static final String TAG_WEARABLE_COMPOUND = "wearableData"; public static final String TAG_EXTENDED_COMPOUND = "extendedProperties"; public static final String TAG_INVENTORY = "inventory"; + public static final String TAG_SLOT = "Slot"; /** * ### Adventure Backpack ### diff --git a/src/main/java/com/darkona/adventurebackpack/entity/EntityInflatableBoat.java b/src/main/java/com/darkona/adventurebackpack/entity/EntityInflatableBoat.java index c396ecc9..e3c597b4 100644 --- a/src/main/java/com/darkona/adventurebackpack/entity/EntityInflatableBoat.java +++ b/src/main/java/com/darkona/adventurebackpack/entity/EntityInflatableBoat.java @@ -25,14 +25,13 @@ import cpw.mods.fml.relauncher.SideOnly; import com.darkona.adventurebackpack.init.ModItems; -import com.darkona.adventurebackpack.inventory.IInventoryTanks; /** * Created on 05/01/2015 * * @author Darkona */ -public class EntityInflatableBoat extends EntityBoat implements IInventoryTanks, IEntityAdditionalSpawnData +public class EntityInflatableBoat extends EntityBoat implements /*IInventoryTanks, */IEntityAdditionalSpawnData { private FluidTank fuelTank; private boolean isBoatEmpty; @@ -54,6 +53,8 @@ public class EntityInflatableBoat extends EntityBoat implements IInventoryTanks, private boolean motorized; + // boat is in EARLY ALPHA stage + public boolean isMotorized() { return motorized; @@ -469,168 +470,6 @@ public void setMotorized(boolean motorized) this.motorized = motorized; } - @Override - public boolean updateTankSlots() - { - return false; - } - - @Override - public void loadFromNBT(NBTTagCompound compound) - { - - } - - @Override - public void saveToNBT(NBTTagCompound compound) - { - - } - - @Override - public FluidTank[] getTanksArray() - { - return new FluidTank[0]; - } - - @Override - public void dirtyInventory() - { - - } - - @Override - public void dirtyTanks() - { - - } - - @Override - public void setInventorySlotContentsNoSave(int slot, ItemStack stack) - { - - } - - @Override - public ItemStack decrStackSizeNoSave(int slot, int amount) - { - return null; - } - - /** - * Returns the number of slots in the inventory. - */ - @Override - public int getSizeInventory() - { - return 0; - } - - /** - * Returns the stack in slot i - */ - @Override - public ItemStack getStackInSlot(int p_70301_1_) - { - return null; - } - - /** - * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a - * new stack. - */ - @Override - public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) - { - return null; - } - - /** - * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem - - * like when you close a workbench GUI. - */ - @Override - public ItemStack getStackInSlotOnClosing(int p_70304_1_) - { - return null; - } - - /** - * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections). - */ - @Override - public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) - { - - } - - /** - * Returns the name of the inventory - */ - @Override - public String getInventoryName() - { - return null; - } - - /** - * Returns if the inventory is named - */ - @Override - public boolean hasCustomInventoryName() - { - return false; - } - - /** - * Returns the maximum stack size for a inventory slot. - */ - @Override - public int getInventoryStackLimit() - { - return 0; - } - - /** - * For tile entities, ensures the chunk containing the tile entity is saved to disk later - the game won't think it - * hasn't changed and skip it. - */ - @Override - public void markDirty() - { - - } - - /** - * Do not make give this method the name canInteractWith because it clashes with Container - */ - @Override - public boolean isUseableByPlayer(EntityPlayer p_70300_1_) - { - return false; - } - - @Override - public void openInventory() - { - - } - - @Override - public void closeInventory() - { - - } - - /** - * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot. - */ - @Override - public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) - { - return false; - } - @Override public void writeSpawnData(ByteBuf data) { diff --git a/src/main/java/com/darkona/adventurebackpack/handlers/TooltipEventHandler.java b/src/main/java/com/darkona/adventurebackpack/handlers/TooltipEventHandler.java index e72cd703..5d88ff69 100644 --- a/src/main/java/com/darkona/adventurebackpack/handlers/TooltipEventHandler.java +++ b/src/main/java/com/darkona/adventurebackpack/handlers/TooltipEventHandler.java @@ -248,7 +248,7 @@ public static String inventoryTooltip(NBTTagList itemList) boolean toolSlotL = false; for (int i = itemCount - 1; i >= 0; i--) { - int slotAtI = itemList.getCompoundTagAt(i).getInteger("Slot"); + int slotAtI = itemList.getCompoundTagAt(i).getInteger(Constants.TAG_SLOT); if (slotAtI < Constants.TOOL_UPPER) break; else if (slotAtI == Constants.TOOL_UPPER) @@ -339,7 +339,7 @@ private static String slotStackTooltip(NBTTagList itemList, int slot) int slotID, slotMeta, slotCount = slotID = slotMeta = 0; for (int i = 0; i <= slot; i++) { - int slotAtI = itemList.getCompoundTagAt(i).getInteger("Slot"); + int slotAtI = itemList.getCompoundTagAt(i).getInteger(Constants.TAG_SLOT); if (slotAtI == slot) { slotID = itemList.getCompoundTagAt(i).getInteger("id"); diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventureBackpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventure.java similarity index 99% rename from src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventureBackpack.java rename to src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventure.java index 687d77c1..f53fc4c1 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventureBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventure.java @@ -15,7 +15,7 @@ * @author Ugachaga */ @SuppressWarnings("WeakerAccess") -abstract class ContainerAdventureBackpack extends Container +abstract class ContainerAdventure extends Container { protected static final int PLAYER_HOT_START = 0; protected static final int PLAYER_HOT_END = PLAYER_HOT_START + 8; diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerBackpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerBackpack.java index 0fef433d..b986d3f7 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerBackpack.java @@ -27,8 +27,7 @@ * * @author Darkona */ -//@invtweaks.api.container.ChestContainer (showButtons=true, rowSize=8) -public class ContainerBackpack extends ContainerAdventureBackpack +public class ContainerBackpack extends ContainerAdventure { private static final int BACK_INV_ROWS = 6; private static final int BACK_INV_COLUMNS = 8; @@ -44,13 +43,13 @@ public class ContainerBackpack extends ContainerAdventureBackpack private InventoryCraftingBackpack craftMatrix = new InventoryCraftingBackpack(this, MATRIX_DIMENSION, MATRIX_DIMENSION); private IInventory craftResult = new InventoryCraftResult(); - private IInventoryAdventureBackpack inventory; + private IInventoryBackpack inventory; private int leftAmount; private int rightAmount; private int invCount; - public ContainerBackpack(EntityPlayer player, IInventoryAdventureBackpack backpack, Source source) + public ContainerBackpack(EntityPlayer player, IInventoryBackpack backpack, Source source) { this.player = player; inventory = backpack; @@ -59,7 +58,7 @@ public ContainerBackpack(EntityPlayer player, IInventoryAdventureBackpack backpa this.source = source; } - public IInventoryAdventureBackpack getInventoryBackpack() + public IInventoryBackpack getInventoryBackpack() { return inventory; } @@ -110,11 +109,17 @@ private void makeSlots(InventoryPlayer invPlayer) } } addSlotToContainer(new SlotCraftResult(this, invPlayer.player, craftMatrix, craftResult, 0, 226, 97)); // craftResult [99] - syncCraftMatrixToInventory(); + syncCraftMatrixWithInventory(true); } @Override public void detectAndSendChanges() + { + syncCraftResultToServer(); + super.detectAndSendChanges(); + } + + private void syncCraftResultToServer() { ItemStack stackA = ((Slot) inventorySlots.get(CRAFT_RESULT)).getStack(); ItemStack stackB = (ItemStack) inventoryItemStacks.get(CRAFT_RESULT); @@ -127,8 +132,6 @@ public void detectAndSendChanges() if (player instanceof EntityPlayerMP) ((EntityPlayerMP) player).sendContainerAndContentsToPlayer(this, this.getInventory()); } - - super.detectAndSendChanges(); } @Override @@ -270,7 +273,7 @@ else if (leftStackOut == null && rightStackOut == null && SlotBackpack.isValidIt public ItemStack slotClick(int slot, int button, int flag, EntityPlayer player) { final ItemStack result = super.slotClick(slot, button, flag, player); - syncCraftMatrixToInventory(); + syncCraftMatrixWithInventory(true); return result; } @@ -298,36 +301,41 @@ public void onCraftMatrixChanged(IInventory inventory) craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(craftMatrix, player.worldObj)); } - protected void syncCraftMatrixToInventory() + protected void syncCraftMatrixWithInventory(boolean preCraft) { + boolean changesMade = false; + for (int craftSlotID = 0; craftSlotID < CRAFT_MATRIX_EMULATION.length; craftSlotID++) { int invSlotID = CRAFT_MATRIX_EMULATION[craftSlotID]; - final ItemStack invStack = inventory.getStackInSlot(invSlotID); - craftMatrix.setInventorySlotContentsNoUpdate(craftSlotID, invStack); + ItemStack invStack = inventory.getStackInSlot(invSlotID); + ItemStack craftStack = craftMatrix.getStackInSlot(craftSlotID); + + if (!ItemStack.areItemStacksEqual(invStack, craftStack)) + { + if (preCraft) + { + craftStack = invStack == null ? null : invStack.copy(); + craftMatrix.setInventorySlotContentsNoUpdate(craftSlotID, craftStack); + } + else + { + invStack = craftStack == null ? null : craftStack.copy(); + inventory.setInventorySlotContentsNoSave(invSlotID, invStack); + } + changesMade = true; + } } - onCraftMatrixChanged(craftMatrix); - } - protected void syncInventoryToCraftMatrix() - { - for (int craftSlotID = 0; craftSlotID < CRAFT_MATRIX_EMULATION.length; craftSlotID++) + if (changesMade) { - int invSlotID = CRAFT_MATRIX_EMULATION[craftSlotID]; - final ItemStack craftStack = craftMatrix.getStackInSlot(craftSlotID); - inventory.setInventorySlotContentsNoSave(invSlotID, craftStack); + if (preCraft) + onCraftMatrixChanged(craftMatrix); + else + inventory.markDirty(); } - inventory.markDirty(); } - /*@ContainerSectionCallback //TODO deal with invTweaks - public Map> getContainerSections() - { - Map> slotMap = new HashMap<>(); - slotMap.put(ContainerSection.CHEST, inventorySlots.subList(BACK_INV_START, BACK_INV_END + 1)); - return slotMap; - }*/ - /** * Returns the array of inventory slotIDs, emulates the craftMatrix in the lower right corner of the inventory. */ diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerCopter.java b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerCopter.java index 92ec38ea..56388b3b 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerCopter.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerCopter.java @@ -15,7 +15,7 @@ * * @author Darkona */ -public class ContainerCopter extends ContainerAdventureBackpack +public class ContainerCopter extends ContainerAdventure { private static final int COPTER_INV_START = PLAYER_INV_END + 1; diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerJetpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerJetpack.java index 9190ce52..c74b2f1b 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerJetpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerJetpack.java @@ -16,7 +16,7 @@ * * @author Darkona */ -public class ContainerJetpack extends ContainerAdventureBackpack +public class ContainerJetpack extends ContainerAdventure { private static final int JETPACK_INV_START = PLAYER_INV_END + 1; private static final int JETPACK_FUEL_START = PLAYER_INV_END + 3; diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/IAsynchronousInventory.java b/src/main/java/com/darkona/adventurebackpack/inventory/IAsynchronousInventory.java index 1ac1abdc..3e8a6d33 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/IAsynchronousInventory.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/IAsynchronousInventory.java @@ -1,5 +1,7 @@ package com.darkona.adventurebackpack.inventory; +import javax.annotation.Nullable; + import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -10,7 +12,7 @@ */ public interface IAsynchronousInventory extends IInventory { - void setInventorySlotContentsNoSave(int slot, ItemStack stack); //TODO rework realisations, see InventoryBackpack + void setInventorySlotContentsNoSave(int slot, @Nullable ItemStack stack); - ItemStack decrStackSizeNoSave(int slot, int amount); //TODO whats the point and diff with decrStackSize? + ItemStack decrStackSizeNoSave(int slot, int amount); } diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/IInventoryAdventureBackpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/IInventoryBackpack.java similarity index 64% rename from src/main/java/com/darkona/adventurebackpack/inventory/IInventoryAdventureBackpack.java rename to src/main/java/com/darkona/adventurebackpack/inventory/IInventoryBackpack.java index 9a45f731..7404e5dc 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/IInventoryAdventureBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/IInventoryBackpack.java @@ -1,43 +1,35 @@ package com.darkona.adventurebackpack.inventory; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidTank; -import com.darkona.adventurebackpack.block.TileAdventureBackpack; import com.darkona.adventurebackpack.reference.BackpackTypes; /** * Created by Darkona on 12/10/2014. */ -public interface IInventoryAdventureBackpack extends IInventoryTanks +public interface IInventoryBackpack extends IInventoryTanks { + BackpackTypes getType(); + FluidTank getLeftTank(); FluidTank getRightTank(); - ItemStack[] getInventory(); + NBTTagCompound getExtendedProperties(); //TODO move to IInventoryTanks to use with Copter/Jet? - TileAdventureBackpack getTile(); - - ItemStack getParentItemStack(); + void dirtyExtended(); - BackpackTypes getType(); + void dirtyTime(); int getLastTime(); - NBTTagCompound getExtendedProperties(); + void setLastTime(int time); boolean hasItem(Item item); void consumeInventoryItem(Item item); boolean isSleepingBagDeployed(); - - void setLastTime(int time); - - void dirtyTime(); - - void dirtyExtended(); } diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/IInventoryTanks.java b/src/main/java/com/darkona/adventurebackpack/inventory/IInventoryTanks.java index 97e54b5e..a11aa3fb 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/IInventoryTanks.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/IInventoryTanks.java @@ -1,5 +1,6 @@ package com.darkona.adventurebackpack.inventory; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidTank; @@ -10,15 +11,19 @@ */ public interface IInventoryTanks extends IAsynchronousInventory { - boolean updateTankSlots(); + ItemStack[] getInventory(); + + FluidTank[] getTanksArray(); + + int[] getSlotsOnClosingArray(); void loadFromNBT(NBTTagCompound compound); void saveToNBT(NBTTagCompound compound); - FluidTank[] getTanksArray(); - void dirtyInventory(); + boolean updateTankSlots(); + void dirtyTanks(); } diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryActions.java b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryActions.java index 6768c5c9..0eb43c99 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryActions.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryActions.java @@ -142,7 +142,7 @@ public static void consumeItemInInventory(IInventory backpack, Item item) } } - public static boolean hasItem(IInventoryAdventureBackpack backpack, Item item) + public static boolean hasItem(IInventoryBackpack backpack, Item item) { ItemStack[] inventory = backpack.getInventory(); for (ItemStack slotStack : inventory) @@ -155,7 +155,7 @@ public static boolean hasItem(IInventoryAdventureBackpack backpack, Item item) return false; } - public static boolean hasBlockItem(IInventoryAdventureBackpack backpack, Block item) + public static boolean hasBlockItem(IInventoryBackpack backpack, Block item) { ItemStack[] inventory = backpack.getInventory(); for (ItemStack slotStack : inventory) diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryAdventure.java b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryAdventure.java new file mode 100644 index 00000000..b5c80b24 --- /dev/null +++ b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryAdventure.java @@ -0,0 +1,195 @@ +package com.darkona.adventurebackpack.inventory; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import static com.darkona.adventurebackpack.common.Constants.TAG_INVENTORY; +import static com.darkona.adventurebackpack.common.Constants.TAG_SLOT; +import static com.darkona.adventurebackpack.common.Constants.TAG_WEARABLE_COMPOUND; + +/** + * Created on 15.07.2017 + * + * @author Ugachaga + */ +@SuppressWarnings("WeakerAccess") +abstract class InventoryAdventure implements IInventoryTanks +{ + ItemStack containerStack; + + @Override + public int getSizeInventory() + { + return getInventory().length; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return getInventory()[slot]; + } + + @Nullable + @Override + public ItemStack decrStackSize(int slot, int quantity) + { + ItemStack stack = getStackInSlot(slot); + if (stack != null) + { + if (stack.stackSize <= quantity) + setInventorySlotContents(slot, null); + else + stack = stack.splitStack(quantity); + } + return stack; + } + + @Nullable + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + for (int s : getSlotsOnClosingArray()) + if (slot == s) + return getInventory()[slot]; + + return null; + } + + @Override + public void setInventorySlotContents(int slot, @Nullable ItemStack stack) + { + setInventorySlotContentsNoSave(slot, stack); + dirtyInventory(); + } + + + @Override + public String getInventoryName() + { + return ""; //TODO name heirs + } + + @Override + public boolean hasCustomInventoryName() + { + return getInventoryName() != null && !getInventoryName().isEmpty(); + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public void markDirty() + { + saveToNBT(containerStack.stackTagCompound); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + @Override + public void openInventory() + { + loadFromNBT(containerStack.stackTagCompound); + } + + @Override + public void closeInventory() + { + saveToNBT(containerStack.stackTagCompound); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return false; + } + + @Nullable + @Override + public ItemStack decrStackSizeNoSave(int slot, int quantity) + { + ItemStack stack = getStackInSlot(slot); + if (stack != null) + { + if (stack.stackSize <= quantity) + setInventorySlotContentsNoSave(slot, null); + else + stack = stack.splitStack(quantity); + } + return stack; + } + + @Override + public void setInventorySlotContentsNoSave(int slot, @Nullable ItemStack stack) + { + if (slot >= getSizeInventory()) + return; + + if (stack != null) + { + if (stack.stackSize > getInventoryStackLimit()) + stack.stackSize = getInventoryStackLimit(); + + if (stack.stackSize == 0) + stack = null; + } + + getInventory()[slot] = stack; + } + + @Override + public void dirtyInventory() + { + if (updateTankSlots()) //TODO this can be generalized too + dirtyTanks(); //TODO and also this + + getWearableCompound().removeTag(TAG_INVENTORY); //TODO why? sync related? + getWearableCompound().setTag(TAG_INVENTORY, getInventoryTagList()); + } + + protected NBTTagCompound getWearableCompound() + { + return containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND); + } + + protected void setInventoryFromTagList(NBTTagList items) + { + for (int i = 0; i < items.tagCount(); i++) + { + NBTTagCompound item = items.getCompoundTagAt(i); + byte slot = item.getByte(TAG_SLOT); + if (slot >= 0 && slot < getSizeInventory()) + { + getInventory()[slot] = ItemStack.loadItemStackFromNBT(item); + } + } + } + + protected NBTTagList getInventoryTagList() + { + NBTTagList items = new NBTTagList(); + for (int i = 0; i < getSizeInventory(); i++) + { + ItemStack stack = getInventory()[i]; + if (stack != null) + { + NBTTagCompound item = new NBTTagCompound(); + item.setByte(TAG_SLOT, (byte) i); + stack.writeToNBT(item); + items.appendTag(item); + } + } + return items; + } +} diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryAdventureBackpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryAdventureBackpack.java deleted file mode 100644 index 34fd8758..00000000 --- a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryAdventureBackpack.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.darkona.adventurebackpack.inventory; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -/** - * Created on 15.07.2017 - * - * @author Ugachaga - */ -abstract class InventoryAdventureBackpack implements IInventoryTanks -{ - ItemStack containerStack; - - @Override - public String getInventoryName() - { - return ""; - } - - @Override - public boolean hasCustomInventoryName() - { - return false; - } - - @Override - public int getInventoryStackLimit() - { - return 64; - } - - @Override - public void markDirty() - { - saveToNBT(containerStack.stackTagCompound); - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) - { - return true; - } - - @Override - public void openInventory() - { - loadFromNBT(containerStack.stackTagCompound); - } - - @Override - public void closeInventory() - { - saveToNBT(containerStack.stackTagCompound); - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack stack) - { - return false; - } -} diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryBackpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryBackpack.java index e5a60edd..5aca48ed 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryBackpack.java @@ -1,6 +1,5 @@ package com.darkona.adventurebackpack.inventory; -import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -10,7 +9,6 @@ import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.fluids.FluidTank; -import com.darkona.adventurebackpack.block.TileAdventureBackpack; import com.darkona.adventurebackpack.common.Constants; import com.darkona.adventurebackpack.init.ModBlocks; import com.darkona.adventurebackpack.reference.BackpackTypes; @@ -34,7 +32,7 @@ * * @author Darkona */ -public class InventoryBackpack extends InventoryAdventureBackpack implements IInventoryAdventureBackpack +public class InventoryBackpack extends InventoryAdventure implements IInventoryBackpack { private static final String TAG_IS_SLEEPING_BAG = "sleepingBag"; private static final String TAG_SLEEPING_BAG_X = "sleepingBagX"; @@ -63,37 +61,10 @@ public InventoryBackpack(ItemStack backpack) openInventory(); } - private void detectAndConvertFromOldNBTFormat(NBTTagCompound compound) // backwards compatibility - { - if (compound == null || !compound.hasKey("backpackData")) - return; - - NBTTagCompound oldBackpackTag = compound.getCompoundTag("backpackData"); - NBTTagList oldItems = oldBackpackTag.getTagList("ABPItems", NBT.TAG_COMPOUND); - leftTank.readFromNBT(oldBackpackTag.getCompoundTag("leftTank")); - rightTank.readFromNBT(oldBackpackTag.getCompoundTag("rightTank")); - type = BackpackTypes.getType(oldBackpackTag.getString("colorName")); - - NBTTagCompound newBackpackTag = new NBTTagCompound(); - newBackpackTag.setTag(TAG_INVENTORY, oldItems); - newBackpackTag.setTag(TAG_RIGHT_TANK, rightTank.writeToNBT(new NBTTagCompound())); - newBackpackTag.setTag(TAG_LEFT_TANK, leftTank.writeToNBT(new NBTTagCompound())); - newBackpackTag.setByte(TAG_TYPE, BackpackTypes.getMeta(type)); - - compound.setTag(TAG_WEARABLE_COMPOUND, newBackpackTag); - compound.removeTag("backpackData"); - } - @Override - public FluidTank getLeftTank() - { - return leftTank; - } - - @Override - public FluidTank getRightTank() + public BackpackTypes getType() { - return rightTank; + return type; } @Override @@ -103,27 +74,27 @@ public ItemStack[] getInventory() } @Override - public TileAdventureBackpack getTile() + public FluidTank getLeftTank() { - return null; + return leftTank; } @Override - public ItemStack getParentItemStack() + public FluidTank getRightTank() { - return this.containerStack; + return rightTank; } @Override - public BackpackTypes getType() + public FluidTank[] getTanksArray() { - return type; + return new FluidTank[]{leftTank, rightTank}; } @Override - public int getLastTime() + public int[] getSlotsOnClosingArray() { - return this.lastTime; + return new int[]{BUCKET_IN_LEFT, BUCKET_IN_RIGHT, BUCKET_OUT_LEFT, BUCKET_OUT_RIGHT}; } @Override @@ -132,109 +103,6 @@ public NBTTagCompound getExtendedProperties() return extendedProperties; } - @Override - public boolean hasItem(Item item) - { - return InventoryActions.hasItem(this, item); - } - - @Override - public void consumeInventoryItem(Item item) - { - InventoryActions.consumeItemInInventory(this, item); - } - - @Override - public boolean isSleepingBagDeployed() - { - return sleepingBagDeployed; - } - - public boolean deploySleepingBag(EntityPlayer player, World world, int meta, int cX, int cY, int cZ) - { - if (world.isRemote) - return false; - - if (sleepingBagDeployed) - removeSleepingBag(world); - - sleepingBagDeployed = CoordsUtils.spawnSleepingBag(player, world, meta, cX, cY, cZ); - if (sleepingBagDeployed) - { - sleepingBagX = cX; - sleepingBagY = cY; - sleepingBagZ = cZ; - markDirty(); - } - return sleepingBagDeployed; - } - - public void removeSleepingBag(World world) - { - if (this.sleepingBagDeployed) - { - if (world.getBlock(sleepingBagX, sleepingBagY, sleepingBagZ) == ModBlocks.blockSleepingBag) - world.func_147480_a(sleepingBagX, sleepingBagY, sleepingBagZ, false); - } - this.sleepingBagDeployed = false; - markDirty(); - } - - @Override - public void setLastTime(int time) - { - this.lastTime = time; - } - - @Override - public void dirtyTime() - { - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setInteger("lastTime", lastTime); - } - - @Override - public void dirtyExtended() //TODO is it redundant? - { - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).removeTag(TAG_EXTENDED_COMPOUND); - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setTag(TAG_EXTENDED_COMPOUND, extendedProperties); - } - - @Override - public void setInventorySlotContentsNoSave(int slot, ItemStack stack) - { - if (slot >= this.getSizeInventory()) - return; - - if (stack != null) - { - if (stack.stackSize > this.getInventoryStackLimit()) - stack.stackSize = this.getInventoryStackLimit(); - - if (stack.stackSize == 0) - stack = null; - } - - this.inventory[slot] = stack; - } - - @Override - public ItemStack decrStackSizeNoSave(int slot, int quantity) - { - ItemStack stack = getStackInSlot(slot); - if (stack != null) - { - if (stack.stackSize <= quantity) - { - setInventorySlotContentsNoSave(slot, null); - } - else - { - stack = stack.splitStack(quantity); - } - } - return stack; - } - @Override public void loadFromNBT(NBTTagCompound compound) { @@ -243,28 +111,11 @@ public void loadFromNBT(NBTTagCompound compound) NBTTagCompound backpackTag = compound.getCompoundTag(TAG_WEARABLE_COMPOUND); type = BackpackTypes.getType(backpackTag.getByte(TAG_TYPE)); - NBTTagList items = backpackTag.getTagList(TAG_INVENTORY, NBT.TAG_COMPOUND); - for (int i = 0; i < items.tagCount(); i++) - { - NBTTagCompound item = items.getCompoundTagAt(i); - byte slot = item.getByte("Slot"); - if (slot >= 0 && slot < inventory.length) - { - inventory[slot] = ItemStack.loadItemStackFromNBT(item); - } - } + setInventoryFromTagList(backpackTag.getTagList(TAG_INVENTORY, NBT.TAG_COMPOUND)); leftTank.readFromNBT(backpackTag.getCompoundTag(TAG_LEFT_TANK)); rightTank.readFromNBT(backpackTag.getCompoundTag(TAG_RIGHT_TANK)); extendedProperties = backpackTag.getCompoundTag(TAG_EXTENDED_COMPOUND); - { - sleepingBagDeployed = extendedProperties.getBoolean(TAG_IS_SLEEPING_BAG); - if (sleepingBagDeployed) - { - sleepingBagX = extendedProperties.getInteger(TAG_SLEEPING_BAG_X); - sleepingBagY = extendedProperties.getInteger(TAG_SLEEPING_BAG_Y); - sleepingBagZ = extendedProperties.getInteger(TAG_SLEEPING_BAG_Z); - } - } + loadSleepingBag(); disableCycling = backpackTag.getBoolean(TAG_DISABLE_CYCLING); disableNVision = backpackTag.getBoolean(TAG_DISABLE_NVISION); lastTime = backpackTag.getInteger("lastTime"); @@ -275,39 +126,11 @@ public void saveToNBT(NBTTagCompound compound) { NBTTagCompound backpackTag = new NBTTagCompound(); backpackTag.setByte(TAG_TYPE, BackpackTypes.getMeta(type)); - NBTTagList items = new NBTTagList(); - for (int i = 0; i < inventory.length; i++) - { - ItemStack stack = inventory[i]; - if (stack != null) - { - NBTTagCompound item = new NBTTagCompound(); - item.setByte("Slot", (byte) i); - stack.writeToNBT(item); - items.appendTag(item); - } - } - backpackTag.removeTag(TAG_INVENTORY); - backpackTag.setTag(TAG_INVENTORY, items); + backpackTag.setTag(TAG_INVENTORY, getInventoryTagList()); backpackTag.setTag(TAG_RIGHT_TANK, rightTank.writeToNBT(new NBTTagCompound())); backpackTag.setTag(TAG_LEFT_TANK, leftTank.writeToNBT(new NBTTagCompound())); backpackTag.setTag(TAG_EXTENDED_COMPOUND, extendedProperties); - { - if (sleepingBagDeployed) - { - extendedProperties.setBoolean(TAG_IS_SLEEPING_BAG, sleepingBagDeployed); - extendedProperties.setInteger(TAG_SLEEPING_BAG_X, sleepingBagX); - extendedProperties.setInteger(TAG_SLEEPING_BAG_Y, sleepingBagY); - extendedProperties.setInteger(TAG_SLEEPING_BAG_Z, sleepingBagZ); - } - else - { - extendedProperties.removeTag(TAG_IS_SLEEPING_BAG); - extendedProperties.removeTag(TAG_SLEEPING_BAG_X); - extendedProperties.removeTag(TAG_SLEEPING_BAG_Y); - extendedProperties.removeTag(TAG_SLEEPING_BAG_Z); - } - } + saveSleepingBag(); backpackTag.setBoolean(TAG_DISABLE_CYCLING, disableCycling); backpackTag.setBoolean(TAG_DISABLE_NVISION, disableNVision); backpackTag.setInteger("lastTime", lastTime); @@ -315,115 +138,59 @@ public void saveToNBT(NBTTagCompound compound) compound.setTag(TAG_WEARABLE_COMPOUND, backpackTag); } - @Override - public FluidTank[] getTanksArray() - { - return new FluidTank[]{leftTank, rightTank}; - } - @Override public boolean updateTankSlots() { - boolean result = false; + boolean changesMade = false; while (InventoryActions.transferContainerTank(this, getLeftTank(), BUCKET_IN_LEFT)) - result = true; + changesMade = true; while (InventoryActions.transferContainerTank(this, getRightTank(), BUCKET_IN_RIGHT)) - result = true; - return result; - } - - @Override - public void dirtyInventory() - { - if (updateTankSlots()) - { - dirtyTanks(); - } - NBTTagList items = new NBTTagList(); - for (int i = 0; i < inventory.length; i++) - { - ItemStack stack = inventory[i]; - if (stack != null) - { - NBTTagCompound item = new NBTTagCompound(); - item.setByte("Slot", (byte) i); - stack.writeToNBT(item); - items.appendTag(item); - } - } - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).removeTag(TAG_INVENTORY); - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setTag(TAG_INVENTORY, items); + changesMade = true; + return changesMade; } @Override public void dirtyTanks() { - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setTag(TAG_LEFT_TANK, leftTank.writeToNBT(new NBTTagCompound())); - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setTag(TAG_RIGHT_TANK, rightTank.writeToNBT(new NBTTagCompound())); + getWearableCompound().setTag(TAG_LEFT_TANK, leftTank.writeToNBT(new NBTTagCompound())); + getWearableCompound().setTag(TAG_RIGHT_TANK, rightTank.writeToNBT(new NBTTagCompound())); } @Override - public int getSizeInventory() + public void dirtyExtended() //TODO is it redundant? { - return inventory.length; + getWearableCompound().removeTag(TAG_EXTENDED_COMPOUND); //TODO again: why? + getWearableCompound().setTag(TAG_EXTENDED_COMPOUND, extendedProperties); } @Override - public ItemStack getStackInSlot(int slot) + public void dirtyTime() { - return inventory[slot]; + getWearableCompound().setInteger("lastTime", lastTime); } @Override - public ItemStack decrStackSize(int slot, int quantity) + public int getLastTime() { - ItemStack itemstack = getStackInSlot(slot); - if (itemstack != null) - { - if (itemstack.stackSize <= quantity) - { - setInventorySlotContents(slot, null); - } - else - { - itemstack = itemstack.splitStack(quantity); - } - } - return itemstack; + return this.lastTime; } @Override - public ItemStack getStackInSlotOnClosing(int slot) + public void setLastTime(int time) { - if (slot == BUCKET_IN_LEFT || slot == BUCKET_IN_RIGHT || slot == BUCKET_OUT_LEFT || slot == BUCKET_OUT_RIGHT) - { - return inventory[slot]; - } - return null; + this.lastTime = time; } @Override - public void setInventorySlotContents(int slot, ItemStack stack) + public boolean hasItem(Item item) { - if (slot >= this.getSizeInventory()) - return; - - if (stack != null) - { - if (stack.stackSize > this.getInventoryStackLimit()) - stack.stackSize = this.getInventoryStackLimit(); - - if(stack.stackSize == 0) - stack = null; - } - - this.inventory[slot] = stack; - this.dirtyInventory(); + return InventoryActions.hasItem(this, item); } - public boolean hasBlock(Block block) + @Override + public void consumeInventoryItem(Item item) { - return InventoryActions.hasBlockItem(this, block); + InventoryActions.consumeItemInInventory(this, item); } public boolean getDisableCycling() @@ -445,4 +212,91 @@ public void setDisableNVision(boolean b) { this.disableNVision = b; } + + // Sleeping Bag + @Override + public boolean isSleepingBagDeployed() + { + return sleepingBagDeployed; + } + + private void loadSleepingBag() + { + sleepingBagDeployed = extendedProperties.getBoolean(TAG_IS_SLEEPING_BAG); + if (sleepingBagDeployed) + { + sleepingBagX = extendedProperties.getInteger(TAG_SLEEPING_BAG_X); + sleepingBagY = extendedProperties.getInteger(TAG_SLEEPING_BAG_Y); + sleepingBagZ = extendedProperties.getInteger(TAG_SLEEPING_BAG_Z); + } + } + + private void saveSleepingBag() + { + if (sleepingBagDeployed) + { + extendedProperties.setBoolean(TAG_IS_SLEEPING_BAG, sleepingBagDeployed); + extendedProperties.setInteger(TAG_SLEEPING_BAG_X, sleepingBagX); + extendedProperties.setInteger(TAG_SLEEPING_BAG_Y, sleepingBagY); + extendedProperties.setInteger(TAG_SLEEPING_BAG_Z, sleepingBagZ); + } + else + { + extendedProperties.removeTag(TAG_IS_SLEEPING_BAG); + extendedProperties.removeTag(TAG_SLEEPING_BAG_X); + extendedProperties.removeTag(TAG_SLEEPING_BAG_Y); + extendedProperties.removeTag(TAG_SLEEPING_BAG_Z); + } + } + + public boolean deploySleepingBag(EntityPlayer player, World world, int meta, int cX, int cY, int cZ) + { + if (world.isRemote) + return false; + + if (sleepingBagDeployed) + removeSleepingBag(world); + + sleepingBagDeployed = CoordsUtils.spawnSleepingBag(player, world, meta, cX, cY, cZ); + if (sleepingBagDeployed) + { + sleepingBagX = cX; + sleepingBagY = cY; + sleepingBagZ = cZ; + markDirty(); + } + return sleepingBagDeployed; + } + + public void removeSleepingBag(World world) + { + if (this.sleepingBagDeployed) + { + if (world.getBlock(sleepingBagX, sleepingBagY, sleepingBagZ) == ModBlocks.blockSleepingBag) + world.func_147480_a(sleepingBagX, sleepingBagY, sleepingBagZ, false); + } + this.sleepingBagDeployed = false; + markDirty(); + } + + private void detectAndConvertFromOldNBTFormat(NBTTagCompound compound) // backwards compatibility + { + if (compound == null || !compound.hasKey("backpackData")) + return; + + NBTTagCompound oldBackpackTag = compound.getCompoundTag("backpackData"); + NBTTagList oldItems = oldBackpackTag.getTagList("ABPItems", NBT.TAG_COMPOUND); + leftTank.readFromNBT(oldBackpackTag.getCompoundTag("leftTank")); + rightTank.readFromNBT(oldBackpackTag.getCompoundTag("rightTank")); + type = BackpackTypes.getType(oldBackpackTag.getString("colorName")); + + NBTTagCompound newBackpackTag = new NBTTagCompound(); + newBackpackTag.setTag(TAG_INVENTORY, oldItems); + newBackpackTag.setTag(TAG_RIGHT_TANK, rightTank.writeToNBT(new NBTTagCompound())); + newBackpackTag.setTag(TAG_LEFT_TANK, leftTank.writeToNBT(new NBTTagCompound())); + newBackpackTag.setByte(TAG_TYPE, BackpackTypes.getMeta(type)); + + compound.setTag(TAG_WEARABLE_COMPOUND, newBackpackTag); + compound.removeTag("backpackData"); + } } \ No newline at end of file diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryCoalJetpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryCoalJetpack.java index eada35d9..3ef396d1 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryCoalJetpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryCoalJetpack.java @@ -9,12 +9,12 @@ import com.darkona.adventurebackpack.common.Constants; -import static com.darkona.adventurebackpack.common.Constants.TAG_INVENTORY; import static com.darkona.adventurebackpack.common.Constants.Jetpack.BUCKET_IN; import static com.darkona.adventurebackpack.common.Constants.Jetpack.BUCKET_OUT; import static com.darkona.adventurebackpack.common.Constants.Jetpack.FUEL_SLOT; import static com.darkona.adventurebackpack.common.Constants.Jetpack.TAG_STEAM_TANK; import static com.darkona.adventurebackpack.common.Constants.Jetpack.TAG_WATER_TANK; +import static com.darkona.adventurebackpack.common.Constants.TAG_INVENTORY; import static com.darkona.adventurebackpack.common.Constants.TAG_WEARABLE_COMPOUND; /** @@ -22,22 +22,20 @@ * * @author Darkona */ -public class InventoryCoalJetpack extends InventoryAdventureBackpack +public class InventoryCoalJetpack extends InventoryAdventure { - public int currentItemBurnTime = 0; - private ItemStack[] inventory = new ItemStack[Constants.Jetpack.INVENTORY_SIZE]; private FluidTank waterTank = new FluidTank(Constants.Jetpack.WATER_CAPACITY); private FluidTank steamTank = new FluidTank(Constants.Jetpack.STEAM_CAPACITY); - private boolean boiling = false; private boolean inUse = false; - private boolean leaking = false; private boolean status = false; + private boolean boiling = false; + private boolean leaking = false; private int temperature = 25; private int burnTicks = 0; private int coolTicks = 5000; - private long systemTime = 0; + private int currentItemBurnTime = 0; public InventoryCoalJetpack(final ItemStack jetpack) { @@ -46,140 +44,88 @@ public InventoryCoalJetpack(final ItemStack jetpack) openInventory(); } - private void detectAndConvertFromOldNBTFormat(NBTTagCompound compound) // backwards compatibility + @Override + public ItemStack[] getInventory() { - if (compound == null || !compound.hasKey("jetpackData")) - return; - - NBTTagCompound oldJetpackTag = compound.getCompoundTag("jetpackData"); - NBTTagList oldItems = oldJetpackTag.getTagList("inventory", NBT.TAG_COMPOUND); - waterTank.readFromNBT(oldJetpackTag.getCompoundTag("waterTank")); - steamTank.readFromNBT(oldJetpackTag.getCompoundTag("steamTank")); + return inventory; + } - NBTTagCompound newJetpackTag = new NBTTagCompound(); - newJetpackTag.setTag(TAG_INVENTORY, oldItems); - newJetpackTag.setTag(TAG_WATER_TANK, waterTank.writeToNBT(new NBTTagCompound())); - newJetpackTag.setTag(TAG_STEAM_TANK, steamTank.writeToNBT(new NBTTagCompound())); + public FluidTank getWaterTank() + { + return waterTank; + } - compound.setTag(TAG_WEARABLE_COMPOUND, newJetpackTag); - compound.removeTag("jetpackData"); + public FluidTank getSteamTank() + { + return steamTank; } - public int getBurnTimeRemainingScaled(int scale) + @Override + public FluidTank[] getTanksArray() { - if (this.currentItemBurnTime == 0) - { - this.currentItemBurnTime = 200; - } + return new FluidTank[]{waterTank, steamTank}; + } - return this.burnTicks * scale / this.currentItemBurnTime; + @Override + public int[] getSlotsOnClosingArray() + { + return new int[]{BUCKET_IN, BUCKET_OUT}; } @Override public void loadFromNBT(NBTTagCompound compound) { NBTTagCompound jetpackTag = compound.getCompoundTag(TAG_WEARABLE_COMPOUND); + setInventoryFromTagList(jetpackTag.getTagList(TAG_INVENTORY, NBT.TAG_COMPOUND)); waterTank.readFromNBT(jetpackTag.getCompoundTag(TAG_WATER_TANK)); steamTank.readFromNBT(jetpackTag.getCompoundTag(TAG_STEAM_TANK)); - temperature = jetpackTag.getInteger("temperature"); - status = jetpackTag.getBoolean("status"); - burnTicks = jetpackTag.getInteger("burnTicks"); - coolTicks = jetpackTag.getInteger("coolTicks"); - systemTime = jetpackTag.getLong("systemTime"); inUse = jetpackTag.getBoolean("inUse"); + status = jetpackTag.getBoolean("status"); boiling = jetpackTag.getBoolean("boiling"); leaking = jetpackTag.getBoolean("leaking"); + temperature = jetpackTag.getInteger("temperature"); + burnTicks = jetpackTag.getInteger("burnTicks"); + coolTicks = jetpackTag.getInteger("coolTicks"); currentItemBurnTime = jetpackTag.getInteger("currentBurn"); - NBTTagList items = jetpackTag.getTagList(TAG_INVENTORY, NBT.TAG_COMPOUND); - for (int i = 0; i < items.tagCount(); i++) - { - NBTTagCompound item = items.getCompoundTagAt(i); - byte slot = item.getByte("Slot"); - if (slot >= 0 && slot < inventory.length) - { - inventory[slot] = ItemStack.loadItemStackFromNBT(item); - } - } } @Override public void saveToNBT(NBTTagCompound compound) { NBTTagCompound jetpackTag = compound.getCompoundTag(TAG_WEARABLE_COMPOUND); + jetpackTag.setTag(TAG_INVENTORY, getInventoryTagList()); jetpackTag.setTag(TAG_WATER_TANK, waterTank.writeToNBT(new NBTTagCompound())); jetpackTag.setTag(TAG_STEAM_TANK, steamTank.writeToNBT(new NBTTagCompound())); - jetpackTag.setInteger("temperature", temperature); - jetpackTag.setBoolean("status", status); - jetpackTag.setInteger("burnTicks", burnTicks); - jetpackTag.setInteger("coolTicks", coolTicks); - jetpackTag.setLong("systemTime", systemTime); jetpackTag.setBoolean("inUse", inUse); + jetpackTag.setBoolean("status", status); jetpackTag.setBoolean("boiling", boiling); jetpackTag.setBoolean("leaking", leaking); + jetpackTag.setInteger("temperature", temperature); + jetpackTag.setInteger("burnTicks", burnTicks); + jetpackTag.setInteger("coolTicks", coolTicks); jetpackTag.setInteger("currentBurn", currentItemBurnTime); - NBTTagList items = new NBTTagList(); - for (int i = 0; i < inventory.length; i++) - { - ItemStack stack = inventory[i]; - if (stack != null) - { - NBTTagCompound item = new NBTTagCompound(); - item.setByte("Slot", (byte) i); - stack.writeToNBT(item); - items.appendTag(item); - } - } - jetpackTag.setTag(TAG_INVENTORY, items); compound.setTag(TAG_WEARABLE_COMPOUND, jetpackTag); } - @Override - public FluidTank[] getTanksArray() - { - return new FluidTank[]{waterTank, steamTank}; - } - @Override public boolean updateTankSlots() { - boolean result = false; + boolean changesMade = false; while (InventoryActions.transferContainerTank(this, getWaterTank(), BUCKET_IN)) - result = true; - return result; - } - - @Override - public void dirtyInventory() - { - if (updateTankSlots()) - { - dirtyTanks(); - } - NBTTagList items = new NBTTagList(); - for (int i = 0; i < inventory.length; i++) - { - ItemStack stack = inventory[i]; - if (stack != null) - { - NBTTagCompound item = new NBTTagCompound(); - item.setByte("Slot", (byte) i); - stack.writeToNBT(item); - items.appendTag(item); - } - } - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setTag(TAG_INVENTORY, items); + changesMade = true; + return changesMade; } @Override public void dirtyTanks() { - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setTag(TAG_WATER_TANK, waterTank.writeToNBT(new NBTTagCompound())); - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setTag(TAG_STEAM_TANK, steamTank.writeToNBT(new NBTTagCompound())); + getWearableCompound().setTag(TAG_WATER_TANK, waterTank.writeToNBT(new NBTTagCompound())); + getWearableCompound().setTag(TAG_STEAM_TANK, steamTank.writeToNBT(new NBTTagCompound())); } public void dirtyBoiler() { - NBTTagCompound jetpackTag = containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND); + NBTTagCompound jetpackTag = getWearableCompound(); jetpackTag.setBoolean("boiling", boiling); jetpackTag.setBoolean("leaking", leaking); jetpackTag.setInteger("temperature", temperature); @@ -188,6 +134,14 @@ public void dirtyBoiler() jetpackTag.setInteger("currentBurn", currentItemBurnTime); } + public int getBurnTimeRemainingScaled(int scale) + { + if (this.currentItemBurnTime == 0) + this.currentItemBurnTime = 200; + + return this.burnTicks * scale / this.currentItemBurnTime; + } + public int consumeFuel() { int result = 0; @@ -209,101 +163,31 @@ private boolean isFuel(ItemStack stack) return TileEntityFurnace.isItemFuel(stack); } - @Override - public void setInventorySlotContentsNoSave(int slot, ItemStack stack) - { - if (slot > inventory.length) return; - inventory[slot] = stack; - if (stack != null && stack.stackSize > this.getInventoryStackLimit()) - { - stack.stackSize = this.getInventoryStackLimit(); - } - } - - @Override - public ItemStack decrStackSizeNoSave(int slot, int amount) - { - if (slot < inventory.length && inventory[slot] != null) - { - if (inventory[slot].stackSize > amount) - { - return inventory[slot].splitStack(amount); - } - ItemStack stack = inventory[slot]; - setInventorySlotContentsNoSave(slot, null); - return stack; - } - return null; - } - - @Override - public int getSizeInventory() - { - return inventory.length; - } - - @Override - public ItemStack getStackInSlot(int slot) - { - return inventory[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int quantity) - { - ItemStack itemstack = getStackInSlot(slot); - - if (itemstack != null) - { - if (itemstack.stackSize <= quantity) - { - if (slot == FUEL_SLOT) - { - setInventorySlotContents(slot, itemstack.getItem().getContainerItem(itemstack)); - } - else - { - setInventorySlotContents(slot, null); - } - } - else - { - itemstack = itemstack.splitStack(quantity); - } - } - return itemstack; - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) + public int getIncreasingFactor() { - return (slot == BUCKET_IN || slot == BUCKET_OUT) ? inventory[slot] : null; + if (temperature < 50) return 20; + if (temperature < 100) return 15; + if (temperature < 150) return 10; + return 5; } - @Override - public void setInventorySlotContents(int slot, ItemStack stack) + public int getDecreasingFactor() { - inventory[slot] = stack; - if (stack != null && stack.stackSize > getInventoryStackLimit()) - { - stack.stackSize = getInventoryStackLimit(); - } - dirtyInventory(); + if (temperature > 150) return 40; + if (temperature > 100) return 80; + if (temperature > 50) return 120; + return 5; } - public ItemStack getParentItemStack() - { - return containerStack; - } - public FluidTank getWaterTank() + public boolean isInUse() { - return waterTank; + return inUse; } - public FluidTank getSteamTank() + public void setInUse(boolean inUse) { - return steamTank; + this.inUse = inUse; } public boolean getStatus() @@ -316,26 +200,6 @@ public void setStatus(boolean status) this.status = status; } - public int getTemperature() - { - return temperature; - } - - public void setTemperature(int temperature) - { - this.temperature = temperature; - } - - public boolean isInUse() - { - return inUse; - } - - public void setInUse(boolean inUse) - { - this.inUse = inUse; - } - public boolean isBoiling() { return boiling; @@ -356,14 +220,14 @@ public void setLeaking(boolean leaking) this.leaking = leaking; } - public long getSystemTime() + public int getTemperature() { - return systemTime; + return temperature; } - public void setSystemTime(long systemTime) + public void setTemperature(int temperature) { - this.systemTime = systemTime; + this.temperature = temperature; } public int getBurnTicks() @@ -376,32 +240,6 @@ public void setBurnTicks(int burnTicks) this.burnTicks = burnTicks; } - public ItemStack[] getInventory() - { - return inventory; - } - - public void setInventory(ItemStack[] inventory) - { - this.inventory = inventory; //TODO wtf - } - - public int getIncreasingFactor() - { - if (temperature < 50) return 20; - if (temperature < 100) return 15; - if (temperature < 150) return 10; - return 5; - } - - public int getDecreasingFactor() - { - if (temperature > 150) return 40; - if (temperature > 100) return 80; - if (temperature > 50) return 120; - return 5; - } - public int getCoolTicks() { return coolTicks; @@ -412,18 +250,27 @@ public void setCoolTicks(int coolTicks) this.coolTicks = coolTicks; } - public ItemStack getContainerStack() + public void setCurrentItemBurnTime(int currentItemBurnTime) { - return containerStack; + this.currentItemBurnTime = currentItemBurnTime; } - public void setContainerStack(ItemStack containerStack) + private void detectAndConvertFromOldNBTFormat(NBTTagCompound compound) // backwards compatibility { - this.containerStack = containerStack; - } + if (compound == null || !compound.hasKey("jetpackData")) + return; - public void calculateLostTime() - { - long elapsedTimesince = System.currentTimeMillis() - systemTime; + NBTTagCompound oldJetpackTag = compound.getCompoundTag("jetpackData"); + NBTTagList oldItems = oldJetpackTag.getTagList("inventory", NBT.TAG_COMPOUND); + waterTank.readFromNBT(oldJetpackTag.getCompoundTag("waterTank")); + steamTank.readFromNBT(oldJetpackTag.getCompoundTag("steamTank")); + + NBTTagCompound newJetpackTag = new NBTTagCompound(); + newJetpackTag.setTag(TAG_INVENTORY, oldItems); + newJetpackTag.setTag(TAG_WATER_TANK, waterTank.writeToNBT(new NBTTagCompound())); + newJetpackTag.setTag(TAG_STEAM_TANK, steamTank.writeToNBT(new NBTTagCompound())); + + compound.setTag(TAG_WEARABLE_COMPOUND, newJetpackTag); + compound.removeTag("jetpackData"); } } \ No newline at end of file diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryCopterPack.java b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryCopterPack.java index 659bb88b..357b20f1 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/InventoryCopterPack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/InventoryCopterPack.java @@ -2,6 +2,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.fluids.FluidTank; import com.darkona.adventurebackpack.common.Constants; @@ -12,6 +13,7 @@ import static com.darkona.adventurebackpack.common.Constants.Copter.INVENTORY_SIZE; import static com.darkona.adventurebackpack.common.Constants.Copter.TAG_FUEL_TANK; import static com.darkona.adventurebackpack.common.Constants.Copter.TAG_STATUS; +import static com.darkona.adventurebackpack.common.Constants.TAG_INVENTORY; import static com.darkona.adventurebackpack.common.Constants.TAG_WEARABLE_COMPOUND; /** @@ -19,7 +21,7 @@ * * @author Darkona */ -public class InventoryCopterPack extends InventoryAdventureBackpack +public class InventoryCopterPack extends InventoryAdventure { private FluidTank fuelTank = new FluidTank(Constants.Copter.FUEL_CAPACITY); private ItemStack[] inventory = new ItemStack[INVENTORY_SIZE]; @@ -34,23 +36,10 @@ public InventoryCopterPack(ItemStack copterPack) openInventory(); } - private void detectAndConvertFromOldNBTFormat(NBTTagCompound compound) // backwards compatibility + @Override + public ItemStack[] getInventory() { - if (compound == null || compound.hasKey(TAG_WEARABLE_COMPOUND)) - return; - - if (compound.hasKey("status")) - compound.removeTag("status"); - if (compound.hasKey("tickCounter")) - compound.removeTag("tickCounter"); - - fuelTank.readFromNBT(compound.getCompoundTag("fuelTank")); - - NBTTagCompound newCopterTag = new NBTTagCompound(); - newCopterTag.setTag(TAG_FUEL_TANK, fuelTank.writeToNBT(new NBTTagCompound())); - - compound.setTag(TAG_WEARABLE_COMPOUND, newCopterTag); - compound.removeTag("fuelTank"); + return inventory; } public FluidTank getFuelTank() @@ -58,100 +47,68 @@ public FluidTank getFuelTank() return fuelTank; } - public void consumeFuel(int quantity) - { - fuelTank.drain(quantity, true); - dirtyTanks(); - } - - public boolean canConsumeFuel(int quantity) - { - return fuelTank.drain(quantity, false) != null && fuelTank.drain(quantity, false).amount > 0; - } - @Override - public int getSizeInventory() + public FluidTank[] getTanksArray() { - return inventory.length; + return new FluidTank[]{fuelTank}; } @Override - public ItemStack getStackInSlot(int i) + public int[] getSlotsOnClosingArray() { - return inventory[i]; + return new int[]{BUCKET_IN, BUCKET_OUT}; } @Override - public ItemStack decrStackSize(int slot, int quantity) + public void loadFromNBT(NBTTagCompound compound) { - ItemStack itemstack = getStackInSlot(slot); - - if (itemstack != null) - { - if (itemstack.stackSize <= quantity) - { - setInventorySlotContents(slot, null); - } - else - { - itemstack = itemstack.splitStack(quantity); - } - } - return itemstack; + NBTTagCompound copterTag = compound.getCompoundTag(TAG_WEARABLE_COMPOUND); + setInventoryFromTagList(copterTag.getTagList(TAG_INVENTORY, NBT.TAG_COMPOUND)); + fuelTank.readFromNBT(copterTag.getCompoundTag(TAG_FUEL_TANK)); + status = copterTag.getByte(TAG_STATUS); + tickCounter = copterTag.getInteger("tickCounter"); } @Override - public ItemStack getStackInSlotOnClosing(int slot) + public void saveToNBT(NBTTagCompound compound) { - return (slot == BUCKET_IN || slot == BUCKET_OUT) ? inventory[slot] : null; + NBTTagCompound copterTag = new NBTTagCompound(); + copterTag.setTag(TAG_INVENTORY, getInventoryTagList()); + copterTag.setTag(TAG_FUEL_TANK, fuelTank.writeToNBT(new NBTTagCompound())); + copterTag.setByte(TAG_STATUS, status); + copterTag.setInteger("tickCounter", this.tickCounter); + compound.setTag(TAG_WEARABLE_COMPOUND, copterTag); } @Override - public void setInventorySlotContents(int slot, ItemStack stack) + public boolean updateTankSlots() { - inventory[slot] = stack; - if (stack != null && stack.stackSize > getInventoryStackLimit()) - { - stack.stackSize = getInventoryStackLimit(); - } - dirtyInventory(); + boolean changesMade = false; + while (InventoryActions.transferContainerTank(this, getFuelTank(), BUCKET_IN)) + changesMade = true; + return changesMade; } @Override - public void setInventorySlotContentsNoSave(int slot, ItemStack stack) + public void dirtyTanks() { - if (slot > inventory.length) return; - inventory[slot] = stack; - if (stack != null && stack.stackSize > this.getInventoryStackLimit()) - { - stack.stackSize = this.getInventoryStackLimit(); - } + getWearableCompound().setTag(TAG_FUEL_TANK, fuelTank.writeToNBT(new NBTTagCompound())); } - @Override - public ItemStack decrStackSizeNoSave(int slot, int amount) + public void dirtyStatus() { - if (slot < inventory.length && inventory[slot] != null) - { - if (inventory[slot].stackSize > amount) - { - return inventory[slot].splitStack(amount); - } - ItemStack stack = inventory[slot]; - setInventorySlotContentsNoSave(slot, null); - return stack; - } - return null; + getWearableCompound().setByte(TAG_STATUS, status); } - public int getTickCounter() + public boolean canConsumeFuel(int quantity) { - return tickCounter; + return fuelTank.drain(quantity, false) != null && fuelTank.drain(quantity, false).amount > 0; } - public void setTickCounter(int ticks) + public void consumeFuel(int quantity) { - this.tickCounter = ticks; + fuelTank.drain(quantity, true); + dirtyTanks(); } public byte getStatus() @@ -164,59 +121,32 @@ public void setStatus(byte status) this.status = status; } - @Override - public void loadFromNBT(NBTTagCompound compound) - { - NBTTagCompound copterTag = compound.getCompoundTag(TAG_WEARABLE_COMPOUND); - fuelTank.readFromNBT(copterTag.getCompoundTag(TAG_FUEL_TANK)); - status = copterTag.getByte(TAG_STATUS); - tickCounter = copterTag.getInteger("tickCounter"); - } - - @Override - public void saveToNBT(NBTTagCompound compound) + public int getTickCounter() { - NBTTagCompound copterTag = new NBTTagCompound(); - copterTag.setTag(TAG_FUEL_TANK, fuelTank.writeToNBT(new NBTTagCompound())); - copterTag.setByte(TAG_STATUS, status); - copterTag.setInteger("tickCounter", this.tickCounter); - compound.setTag(TAG_WEARABLE_COMPOUND, copterTag); + return tickCounter; } - @Override - public FluidTank[] getTanksArray() + public void setTickCounter(int ticks) { - return new FluidTank[]{fuelTank}; + this.tickCounter = ticks; } - @Override - public boolean updateTankSlots() + private void detectAndConvertFromOldNBTFormat(NBTTagCompound compound) // backwards compatibility { - boolean result = false; - while (InventoryActions.transferContainerTank(this, getFuelTank(), BUCKET_IN)) - result = true; - return result; - } + if (compound == null || compound.hasKey(TAG_WEARABLE_COMPOUND)) + return; - @Override - public void dirtyInventory() - { - if (updateTankSlots()) - { - dirtyTanks(); - } - } + if (compound.hasKey("status")) + compound.removeTag("status"); + if (compound.hasKey("tickCounter")) + compound.removeTag("tickCounter"); - @Override - public void dirtyTanks() - { - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setTag(TAG_FUEL_TANK, fuelTank.writeToNBT(new NBTTagCompound())); - } + fuelTank.readFromNBT(compound.getCompoundTag("fuelTank")); - //TODO to InventoryAdventureBackpack: getWearableCompound() { return containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND);} + NBTTagCompound newCopterTag = new NBTTagCompound(); + newCopterTag.setTag(TAG_FUEL_TANK, fuelTank.writeToNBT(new NBTTagCompound())); - public void dirtyStatus() - { - containerStack.stackTagCompound.getCompoundTag(TAG_WEARABLE_COMPOUND).setByte(TAG_STATUS, status); + compound.setTag(TAG_WEARABLE_COMPOUND, newCopterTag); + compound.removeTag("fuelTank"); } } diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/SlotAdventureBackpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/SlotAdventure.java similarity index 65% rename from src/main/java/com/darkona/adventurebackpack/inventory/SlotAdventureBackpack.java rename to src/main/java/com/darkona/adventurebackpack/inventory/SlotAdventure.java index b7db9405..ef37fbcb 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/SlotAdventureBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/SlotAdventure.java @@ -8,9 +8,9 @@ * * @author Darkona */ -abstract class SlotAdventureBackpack extends Slot +abstract class SlotAdventure extends Slot { - SlotAdventureBackpack(IInventory inventory, int slotIndex, int posX, int posY) + SlotAdventure(IInventory inventory, int slotIndex, int posX, int posY) { super(inventory, slotIndex, posX, posY); } diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/SlotBackpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/SlotBackpack.java index c35b1124..2ae8a923 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/SlotBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/SlotBackpack.java @@ -8,7 +8,7 @@ /** * Created by Darkona on 12/10/2014. */ -public class SlotBackpack extends SlotAdventureBackpack +public class SlotBackpack extends SlotAdventure { private static final String[] FORBIDDEN_CLASSES = { // Adventure Backpack 2 @@ -29,7 +29,7 @@ public class SlotBackpack extends SlotAdventureBackpack // Project Red Exploration Backpacks "mrtjp.projectred.exploration.ItemBackpack",}; - SlotBackpack(IInventoryAdventureBackpack inventory, int slotIndex, int posX, int posY) + SlotBackpack(IInventoryBackpack inventory, int slotIndex, int posX, int posY) { super(inventory, slotIndex, posX, posY); } diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/SlotCraftMatrix.java b/src/main/java/com/darkona/adventurebackpack/inventory/SlotCraftMatrix.java index 98394628..6fa01d8a 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/SlotCraftMatrix.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/SlotCraftMatrix.java @@ -9,7 +9,7 @@ * * @author Ugachaga */ -public class SlotCraftMatrix extends SlotAdventureBackpack +public class SlotCraftMatrix extends SlotAdventure { SlotCraftMatrix(IInventory craftMatrix, int slotIndex, int posX, int posY) { diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/SlotCraftResult.java b/src/main/java/com/darkona/adventurebackpack/inventory/SlotCraftResult.java index 32ef03e5..dfb1352f 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/SlotCraftResult.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/SlotCraftResult.java @@ -23,8 +23,8 @@ public SlotCraftResult(ContainerBackpack container, EntityPlayer player, IInvent @Override public void onPickupFromSlot(EntityPlayer player, ItemStack stack) { - eventHandler.syncCraftMatrixToInventory(); // pre craft sync + eventHandler.syncCraftMatrixWithInventory(true); // pre craft sync super.onPickupFromSlot(player, stack); - eventHandler.syncInventoryToCraftMatrix(); // post craft sync + eventHandler.syncCraftMatrixWithInventory(false); // post craft sync } } diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/SlotFluid.java b/src/main/java/com/darkona/adventurebackpack/inventory/SlotFluid.java index 62753326..896956a5 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/SlotFluid.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/SlotFluid.java @@ -15,7 +15,7 @@ * * @author Darkona */ -public class SlotFluid extends SlotAdventureBackpack +public class SlotFluid extends SlotAdventure { SlotFluid(IInventory inventory, int slotIndex, int posX, int posY) { diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/SlotFuel.java b/src/main/java/com/darkona/adventurebackpack/inventory/SlotFuel.java index 5afb2a6c..7c6a2a8a 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/SlotFuel.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/SlotFuel.java @@ -9,7 +9,7 @@ * * @author Darkona */ -public class SlotFuel extends SlotAdventureBackpack +public class SlotFuel extends SlotAdventure { SlotFuel(IInventory inventory, int slotIndex, int posX, int posY) { diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/SlotTool.java b/src/main/java/com/darkona/adventurebackpack/inventory/SlotTool.java index fdd65d68..7772541c 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/SlotTool.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/SlotTool.java @@ -18,7 +18,7 @@ * * @author Darkona */ -public class SlotTool extends SlotAdventureBackpack +public class SlotTool extends SlotAdventure { private static final String[] VALID_TOOL_NAMES = {"axe", "crowbar", "drill", "grafter", "hammer", "scoop", "shovel", "wrench",}; diff --git a/src/main/java/com/darkona/adventurebackpack/item/ItemAdventureBackpack.java b/src/main/java/com/darkona/adventurebackpack/item/ItemAdventureBackpack.java index 740c3f57..bf7d48c9 100644 --- a/src/main/java/com/darkona/adventurebackpack/item/ItemAdventureBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/item/ItemAdventureBackpack.java @@ -281,7 +281,7 @@ private int getItemCount(ItemStack backpack) int itemCount = itemList.tagCount(); for (int i = itemCount - 1; i >= 0; i--) { - int slotAtI = itemList.getCompoundTagAt(i).getInteger("Slot"); + int slotAtI = itemList.getCompoundTagAt(i).getInteger(Constants.TAG_SLOT); if (slotAtI <= Constants.END_OF_INVENTORY) break; itemCount--; diff --git a/src/main/java/com/darkona/adventurebackpack/item/ItemCoalJetpack.java b/src/main/java/com/darkona/adventurebackpack/item/ItemCoalJetpack.java index 927ff458..39e2f368 100644 --- a/src/main/java/com/darkona/adventurebackpack/item/ItemCoalJetpack.java +++ b/src/main/java/com/darkona/adventurebackpack/item/ItemCoalJetpack.java @@ -79,7 +79,6 @@ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer pla public void onEquipped(World world, EntityPlayer player, ItemStack stack) { InventoryCoalJetpack inv = new InventoryCoalJetpack(stack); - inv.calculateLostTime(); // debug artifact if (inv.getTemperature() == 0) inv.setTemperature(getBiomeMinTemp(player, world)); } @@ -227,7 +226,7 @@ private void runFirebox(InventoryCoalJetpack inv) if (inv.getBurnTicks() <= 0) { inv.setBurnTicks(inv.consumeFuel()); - inv.currentItemBurnTime = inv.getBurnTicks(); + inv.setCurrentItemBurnTime(inv.getBurnTicks()); } inv.dirtyInventory(); } @@ -249,9 +248,9 @@ private void runHeater(InventoryCoalJetpack inv, World world, EntityPlayer playe } } } - else if (burnTicks <= 0) + else { - inv.currentItemBurnTime = 0; + inv.setCurrentItemBurnTime(0); if (coolTicks % inv.getDecreasingFactor() == 0) { temperature = (temperature - 1 >= getBiomeMinTemp(player, world)) ? temperature - 1 : 0; @@ -270,7 +269,6 @@ public void onUnequipped(World world, EntityPlayer player, ItemStack stack) inv.setInUse(false); inv.setLeaking(false); inv.setStatus(false); - inv.setSystemTime(System.currentTimeMillis()); inv.markDirty(); } diff --git a/src/main/java/com/darkona/adventurebackpack/item/ItemCopterPack.java b/src/main/java/com/darkona/adventurebackpack/item/ItemCopterPack.java index 5ad07a71..2ba978e3 100644 --- a/src/main/java/com/darkona/adventurebackpack/item/ItemCopterPack.java +++ b/src/main/java/com/darkona/adventurebackpack/item/ItemCopterPack.java @@ -46,6 +46,7 @@ public class ItemCopterPack extends ItemAB implements IBackWearableItem public static byte OFF_MODE = 0; public static byte NORMAL_MODE = 1; public static byte HOVER_MODE = 2; + private float fuelSpent; public ItemCopterPack() @@ -128,7 +129,6 @@ public void onEquippedUpdate(World world, EntityPlayer player, ItemStack stack) } if (inv.getStatus() == HOVER_MODE) { - inv.setStatus(NORMAL_MODE); inv.dirtyStatus(); if (!world.isRemote) diff --git a/src/main/java/com/darkona/adventurebackpack/network/CowAbilityPacket.java b/src/main/java/com/darkona/adventurebackpack/network/CowAbilityPacket.java index 9b68175c..a64dc148 100644 --- a/src/main/java/com/darkona/adventurebackpack/network/CowAbilityPacket.java +++ b/src/main/java/com/darkona/adventurebackpack/network/CowAbilityPacket.java @@ -13,7 +13,7 @@ import cpw.mods.fml.common.network.simpleimpl.MessageContext; import com.darkona.adventurebackpack.inventory.ContainerBackpack; -import com.darkona.adventurebackpack.inventory.IInventoryAdventureBackpack; +import com.darkona.adventurebackpack.inventory.IInventoryBackpack; /** * Created on 16/10/2014 @@ -35,7 +35,7 @@ public IMessage onMessage(CowAbilityMessage message, MessageContext ctx) { ContainerBackpack cont = ((ContainerBackpack) player.openContainer); cont.detectAndSendChanges(); - IInventoryAdventureBackpack inv = cont.getInventoryBackpack(); + IInventoryBackpack inv = cont.getInventoryBackpack(); switch (message.action) { case CONSUME_WHEAT: diff --git a/src/main/java/com/darkona/adventurebackpack/network/EquipUnequipBackWearablePacket.java b/src/main/java/com/darkona/adventurebackpack/network/EquipUnequipBackWearablePacket.java index 7e8081a2..e3194be8 100644 --- a/src/main/java/com/darkona/adventurebackpack/network/EquipUnequipBackWearablePacket.java +++ b/src/main/java/com/darkona/adventurebackpack/network/EquipUnequipBackWearablePacket.java @@ -30,27 +30,21 @@ public Message onMessage(Message message, MessageContext ctx) EntityPlayer player = ctx.getServerHandler().playerEntity; if (message.action == EQUIP_WEARABLE) { - if (Wearing.isHoldingWearable(player) && !Wearing.isWearingWearable(player)) + if (Wearing.isHoldingWearable(player)) { - if (BackpackUtils.equipWearable(player.getCurrentEquippedItem(), player) == BackpackUtils.Reasons.SUCCESSFUL) + if (Wearing.isWearingWearable(player)) { - player.inventory.setInventorySlotContents(player.inventory.currentItem, null); - player.inventoryContainer.detectAndSendChanges(); + Wearing.WearableType wtype = Wearing.getWearingWearableType(player); + if (wtype != Wearing.WearableType.UNKNOWN) + player.addChatComponentMessage(new ChatComponentTranslation("adventurebackpack:messages.already.equipped." + wtype.name().toLowerCase())); } - } - else if (Wearing.isWearingWearable(player)) - { - if (Wearing.isWearingBackpack(player)) - { - player.addChatComponentMessage(new ChatComponentTranslation("adventurebackpack:messages.already.equipped.backpack")); - } - else if (Wearing.isWearingCopter(player)) - { - player.addChatComponentMessage(new ChatComponentTranslation("adventurebackpack:messages.already.equipped.copterpack")); - } - else if (Wearing.isWearingJetpack(player)) + else { - player.addChatComponentMessage(new ChatComponentTranslation("adventurebackpack:messages.already.equipped.jetpack")); + if (BackpackUtils.equipWearable(player.getCurrentEquippedItem(), player) == BackpackUtils.Reasons.SUCCESSFUL) + { + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + player.inventoryContainer.detectAndSendChanges(); + } } } } diff --git a/src/main/java/com/darkona/adventurebackpack/network/PlayerActionPacket.java b/src/main/java/com/darkona/adventurebackpack/network/PlayerActionPacket.java index 1d1e7074..e151899c 100644 --- a/src/main/java/com/darkona/adventurebackpack/network/PlayerActionPacket.java +++ b/src/main/java/com/darkona/adventurebackpack/network/PlayerActionPacket.java @@ -10,7 +10,7 @@ import com.darkona.adventurebackpack.common.Constants; import com.darkona.adventurebackpack.entity.EntityFriendlySpider; import com.darkona.adventurebackpack.inventory.ContainerBackpack; -import com.darkona.adventurebackpack.inventory.IInventoryAdventureBackpack; +import com.darkona.adventurebackpack.inventory.IInventoryBackpack; import com.darkona.adventurebackpack.inventory.InventoryCoalJetpack; import com.darkona.adventurebackpack.util.Wearing; @@ -56,7 +56,7 @@ public IMessage onMessage(ActionMessage message, MessageContext ctx) { if (player.openContainer instanceof ContainerBackpack) { - IInventoryAdventureBackpack inv = ((ContainerBackpack) player.openContainer).getInventoryBackpack(); + IInventoryBackpack inv = ((ContainerBackpack) player.openContainer).getInventoryBackpack(); if (message.type == GUI_HOLDING_SPACE) { diff --git a/src/main/java/com/darkona/adventurebackpack/util/CoordsUtils.java b/src/main/java/com/darkona/adventurebackpack/util/CoordsUtils.java index 02f1455c..ee982146 100644 --- a/src/main/java/com/darkona/adventurebackpack/util/CoordsUtils.java +++ b/src/main/java/com/darkona/adventurebackpack/util/CoordsUtils.java @@ -209,43 +209,23 @@ private static int[] getDirectionAndCoordsForSleepingBag(int switchBy, World wor { case 0: --cZ; - if (world.isAirBlock(cX, cY, cZ) && world.getBlock(cX, cY - 1, cZ).getMaterial().isSolid()) - { - if (world.isAirBlock(cX, cY, cZ - 1) && world.getBlock(cX, cY - 1, cZ - 1).getMaterial().isSolid()) - { - direction = 2; - } - } + if (isAirAboveSolid(world, cX, cY, cZ) && isAirAboveSolid(world, cX, cY, cZ - 1)) + direction = 2; break; case 1: ++cX; - if (world.isAirBlock(cX, cY, cZ) && world.getBlock(cX, cY - 1, cZ).getMaterial().isSolid()) - { - if (world.isAirBlock(cX + 1, cY, cZ) && world.getBlock(cX + 1, cY - 1, cZ).getMaterial().isSolid()) - { - direction = 3; - } - } + if (isAirAboveSolid(world, cX, cY, cZ) && isAirAboveSolid(world, cX + 1, cY, cZ)) + direction = 3; break; case 2: ++cZ; - if (world.isAirBlock(cX, cY, cZ) && world.getBlock(cX, cY - 1, cZ).getMaterial().isSolid()) - { - if (world.isAirBlock(cX, cY, cZ + 1) && world.getBlock(cX, cY - 1, cZ + 1).getMaterial().isSolid()) - { - direction = 0; - } - } + if (isAirAboveSolid(world, cX, cY, cZ) && isAirAboveSolid(world, cX, cY, cZ + 1)) + direction = 0; break; case 3: --cX; - if (world.isAirBlock(cX, cY, cZ) && world.getBlock(cX, cY - 1, cZ).getMaterial().isSolid()) - { - if (world.isAirBlock(cX - 1, cY, cZ) && world.getBlock(cX - 1, cY - 1, cZ).getMaterial().isSolid()) - { - direction = 1; - } - } + if (isAirAboveSolid(world, cX, cY, cZ) && isAirAboveSolid(world, cX - 1, cY, cZ)) + direction = 1; break; default: break; @@ -253,6 +233,11 @@ private static int[] getDirectionAndCoordsForSleepingBag(int switchBy, World wor return new int[]{direction, cX, cY, cZ}; } + private static boolean isAirAboveSolid(World world, int cX, int cY, int cZ) + { + return world.isAirBlock(cX, cY, cZ) && world.getBlock(cX, cY - 1, cZ).getMaterial().isSolid(); + } + public static boolean spawnSleepingBag(EntityPlayer player, World world, int meta, int cX, int cY, int cZ) { Block sleepingBag = ModBlocks.blockSleepingBag; diff --git a/src/main/java/com/darkona/adventurebackpack/util/Resources.java b/src/main/java/com/darkona/adventurebackpack/util/Resources.java index 17cef1df..6e38cdc2 100644 --- a/src/main/java/com/darkona/adventurebackpack/util/Resources.java +++ b/src/main/java/com/darkona/adventurebackpack/util/Resources.java @@ -3,7 +3,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import com.darkona.adventurebackpack.inventory.IInventoryAdventureBackpack; +import com.darkona.adventurebackpack.inventory.IInventoryBackpack; import com.darkona.adventurebackpack.reference.BackpackTypes; import com.darkona.adventurebackpack.reference.ModInfo; @@ -31,7 +31,7 @@ public static ResourceLocation backpackTextureFromString(String color) return new ResourceLocation(TEXTURE_LOCATION, "textures/backpack/" + color + ".png"); } - public static ResourceLocation backpackTextureFromSkin(IInventoryAdventureBackpack adventureBackpack) + public static ResourceLocation backpackTextureFromSkin(IInventoryBackpack adventureBackpack) { return new ResourceLocation(TEXTURE_LOCATION, "textures/backpack/" + BackpackTypes.getSkinName(adventureBackpack.getType()) + ".png"); } diff --git a/src/main/java/com/darkona/adventurebackpack/util/Wearing.java b/src/main/java/com/darkona/adventurebackpack/util/Wearing.java index 9b0c23df..13ddb639 100644 --- a/src/main/java/com/darkona/adventurebackpack/util/Wearing.java +++ b/src/main/java/com/darkona/adventurebackpack/util/Wearing.java @@ -1,8 +1,12 @@ package com.darkona.adventurebackpack.util; +import javax.annotation.Nonnull; + import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import com.darkona.adventurebackpack.init.ModItems; import com.darkona.adventurebackpack.inventory.IInventoryTanks; import com.darkona.adventurebackpack.inventory.InventoryBackpack; import com.darkona.adventurebackpack.inventory.InventoryCoalJetpack; @@ -24,6 +28,23 @@ */ public class Wearing { + public enum WearableType + { + BACKPACK, COPTERPACK, JETPACK, UNKNOWN; + + public static WearableType get(@Nonnull ItemStack stack) + { + Item item = stack.getItem(); + if (item == ModItems.adventureBackpack) + return BACKPACK; + if (item == ModItems.copterPack) + return COPTERPACK; + if (item == ModItems.coalJetpack) + return JETPACK; + return UNKNOWN; + } + } + // Wearable public static boolean isWearingWearable(EntityPlayer player) { @@ -35,6 +56,11 @@ public static ItemStack getWearingWearable(EntityPlayer player) return isWearingWearable(player) ? BackpackProperty.get(player).getWearable() : null; } + public static WearableType getWearingWearableType(EntityPlayer player) + { + return isWearingWearable(player) ? WearableType.get(BackpackProperty.get(player).getWearable()) : WearableType.UNKNOWN; + } + public static IInventoryTanks getWearingWearableInv(EntityPlayer player) { ItemStack wearable = Wearing.getWearingWearable(player);