Changed crate to update every few ticks to fix some cases crates would not sync to client

This commit is contained in:
Robert S 2014-04-24 15:49:02 -04:00
parent 159e8ecc26
commit 8aab86ae3a

View file

@ -1,11 +1,5 @@
package resonantinduction.archaic.crate; package resonantinduction.archaic.crate;
import calclavia.api.resonantinduction.IFilterable;
import calclavia.lib.network.IPacketReceiver;
import calclavia.lib.network.PacketHandler;
import calclavia.lib.prefab.tile.TileExternalInventory;
import calclavia.lib.utility.inventory.IExtendedStorage;
import com.google.common.io.ByteArrayDataInput;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -14,338 +8,328 @@ import net.minecraft.network.packet.Packet;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreDictionary;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import calclavia.api.resonantinduction.IFilterable;
import calclavia.lib.network.IPacketReceiver;
import calclavia.lib.network.PacketHandler;
import calclavia.lib.prefab.tile.TileExternalInventory;
import calclavia.lib.utility.inventory.IExtendedStorage;
/** import com.google.common.io.ByteArrayDataInput;
* Basic single stack inventory.
/** Basic single stack inventory.
* <p/> * <p/>
* TODO: Add filter-locking feature. Put filter in, locks the crate to only use that item. * TODO: Add filter-locking feature. Put filter in, locks the crate to only use that item.
* *
* @author DarkGuardsman * @author DarkGuardsman */
*/ public class TileCrate extends TileExternalInventory implements IPacketReceiver, IExtendedStorage, IFilterable
public class TileCrate extends TileExternalInventory
implements IPacketReceiver, IExtendedStorage, IFilterable
{ {
/** /** max meta size of the crate */
* max meta size of the crate public static final int maxSize = 2;
*/
public static final int maxSize = 2;
/** /** delay from last click */
* delay from last click public long prevClickTime = -1000;
*/
public long prevClickTime = -1000;
/** /** Check to see if oreName items can be force stacked */
* Check to see if oreName items can be force stacked public boolean oreFilterEnabled = false;
*/
public boolean oreFilterEnabled = false;
/** /** Collective total stack of all inv slots */
* Collective total stack of all inv slots private ItemStack sampleStack;
*/ private ItemStack filterStack;
private ItemStack sampleStack;
private ItemStack filterStack;
/** private long updateTick = 1;
* Gets the slot count for the crate meta
*/
public static int getSlotCount(int metadata)
{
if (metadata >= 2)
{
return 256;
}
else if (metadata >= 1)
{
return 64;
}
return 32;
}
@Override @Override
public InventoryCrate getInventory() public void updateEntity()
{ {
if (this.inventory == null) super.updateEntity();
{ if (!worldObj.isRemote && ticks % updateTick == 0)
inventory = new InventoryCrate(this); {
} //Send desc packet, done already in onInventoryChanged()
return (InventoryCrate) this.inventory; onInventoryChanged();
} updateTick = 5 + worldObj.rand.nextInt(50);
}
}
/** /** Gets the slot count for the crate meta */
* Gets the sample stack that represent the total inventory public static int getSlotCount(int metadata)
*/ {
public ItemStack getSampleStack() if (metadata >= 2)
{ {
if (this.sampleStack == null) return 256;
{ }
this.buildSampleStack(); else if (metadata >= 1)
} {
return this.sampleStack; return 64;
} }
return 32;
}
/** @Override
* Builds the sample stack using the inventory as a point of reference. Assumes all items match public InventoryCrate getInventory()
* each other, and only takes into account stack sizes {
*/ if (this.inventory == null)
public void buildSampleStack() {
{ inventory = new InventoryCrate(this);
ItemStack newSampleStack = null; }
boolean rebuildBase = false; return (InventoryCrate) this.inventory;
}
/** Gets the sample stack that represent the total inventory */
public ItemStack getSampleStack()
{
if (this.sampleStack == null)
{
this.buildSampleStack();
}
return this.sampleStack;
}
/** Builds the sample stack using the inventory as a point of reference. Assumes all items match
* each other, and only takes into account stack sizes */
public void buildSampleStack()
{
ItemStack newSampleStack = null;
boolean rebuildBase = false;
/* Creates the sample stack that is used as a collective itemstack */ /* Creates the sample stack that is used as a collective itemstack */
for (int slot = 0; slot < this.getSizeInventory(); slot++) for (int slot = 0; slot < this.getSizeInventory(); slot++)
{ {
ItemStack slotStack = this.getInventory().getContainedItems()[slot]; ItemStack slotStack = this.getInventory().getContainedItems()[slot];
if (slotStack != null && Item.itemsList[slotStack.itemID] != null && slotStack.stackSize > 0) if (slotStack != null && Item.itemsList[slotStack.itemID] != null && slotStack.stackSize > 0)
{ {
if (newSampleStack == null) if (newSampleStack == null)
{ {
newSampleStack = slotStack.copy(); newSampleStack = slotStack.copy();
} }
else else
{ {
newSampleStack.stackSize += slotStack.stackSize; newSampleStack.stackSize += slotStack.stackSize;
} }
if (slotStack.stackSize > slotStack.getMaxStackSize()) if (slotStack.stackSize > slotStack.getMaxStackSize())
{ {
rebuildBase = true; rebuildBase = true;
} }
} }
} }
if (newSampleStack == null || newSampleStack.itemID == 0 || newSampleStack.stackSize <= 0) if (newSampleStack == null || newSampleStack.itemID == 0 || newSampleStack.stackSize <= 0)
{ {
this.sampleStack = this.getFilter() != null ? this.getFilter().copy() : null; this.sampleStack = this.getFilter() != null ? this.getFilter().copy() : null;
} }
else else
{ {
this.sampleStack = newSampleStack.copy(); this.sampleStack = newSampleStack.copy();
} }
/* Rebuild inventory if the inventory is not valid */ /* Rebuild inventory if the inventory is not valid */
if (this.sampleStack != null && (rebuildBase || this.getInventory().getContainedItems().length > this.getSizeInventory())) if (this.sampleStack != null && (rebuildBase || this.getInventory().getContainedItems().length > this.getSizeInventory()))
{ {
this.getInventory().buildInventory(this.sampleStack); this.getInventory().buildInventory(this.sampleStack);
} }
} }
@Override @Override
public ItemStack addStackToStorage(ItemStack stack) public ItemStack addStackToStorage(ItemStack stack)
{ {
return BlockCrate.addStackToCrate(this, stack); return BlockCrate.addStackToCrate(this, stack);
} }
/** /** Adds an item to the stack */
* Adds an item to the stack public void addToStack(ItemStack stack, int amount)
*/ {
public void addToStack(ItemStack stack, int amount) if (stack != null)
{ {
if (stack != null) ItemStack newStack = stack.copy();
{ newStack.stackSize = amount;
ItemStack newStack = stack.copy(); this.addToStack(newStack);
newStack.stackSize = amount; }
this.addToStack(newStack); }
}
}
/** /** Adds the stack to the sample stack */
* Adds the stack to the sample stack public void addToStack(ItemStack stack)
*/ {
public void addToStack(ItemStack stack) if (stack != null && stack.stackSize > 0)
{ {
if (stack != null && stack.stackSize > 0) if (this.getSampleStack() == null)
{ {
if (this.getSampleStack() == null) this.sampleStack = stack;
{ getInventory().buildInventory(getSampleStack());
this.sampleStack = stack; }
getInventory().buildInventory(getSampleStack()); else if (this.getSampleStack().isItemEqual(stack) || (this.oreFilterEnabled && OreDictionary.getOreID(getSampleStack()) == OreDictionary.getOreID(stack)))
} {
else if (this.getSampleStack().isItemEqual(stack) || (this.oreFilterEnabled && OreDictionary.getOreID(getSampleStack()) == OreDictionary.getOreID(stack))) getSampleStack().stackSize += stack.stackSize;
{ getInventory().buildInventory(getSampleStack());
getSampleStack().stackSize += stack.stackSize; }
getInventory().buildInventory(getSampleStack()); }
} }
}
}
@Override @Override
public ItemStack decrStackSize(int slot, int amount) public ItemStack decrStackSize(int slot, int amount)
{ {
if (sampleStack != null) if (sampleStack != null)
{ {
ItemStack var3; ItemStack var3;
if (sampleStack.stackSize <= amount) if (sampleStack.stackSize <= amount)
{ {
var3 = sampleStack; var3 = sampleStack;
sampleStack = null; sampleStack = null;
this.onInventoryChanged(); this.onInventoryChanged();
getInventory().buildInventory(getSampleStack()); getInventory().buildInventory(getSampleStack());
return var3; return var3;
} }
else else
{ {
var3 = sampleStack.splitStack(amount); var3 = sampleStack.splitStack(amount);
if (sampleStack.stackSize == 0) if (sampleStack.stackSize == 0)
{ {
sampleStack = null; sampleStack = null;
} }
getInventory().buildInventory(getSampleStack()); getInventory().buildInventory(getSampleStack());
onInventoryChanged(); onInventoryChanged();
return var3; return var3;
} }
} }
else else
{ {
return null; return null;
} }
} }
@Override @Override
public void onInventoryChanged() public void onInventoryChanged()
{ {
super.onInventoryChanged(); super.onInventoryChanged();
if (worldObj != null && !worldObj.isRemote) if (worldObj != null && !worldObj.isRemote)
{ {
PacketHandler.sendPacketToClients(getDescriptionPacket(), this.worldObj); PacketHandler.sendPacketToClients(getDescriptionPacket(), this.worldObj);
} }
} }
@Override @Override
public boolean canStore(ItemStack stack, int slot, ForgeDirection side) public boolean canStore(ItemStack stack, int slot, ForgeDirection side)
{ {
return getSampleStack() == null || stack != null && (stack.isItemEqual(getSampleStack()) || (this.oreFilterEnabled && OreDictionary.getOreID(getSampleStack()) == OreDictionary.getOreID(stack))); return getSampleStack() == null || stack != null && (stack.isItemEqual(getSampleStack()) || (this.oreFilterEnabled && OreDictionary.getOreID(getSampleStack()) == OreDictionary.getOreID(stack)));
} }
/** /** Gets the current slot count for the crate */
* Gets the current slot count for the crate public int getSlotCount()
*/ {
public int getSlotCount() if (this.worldObj == null)
{ {
if (this.worldObj == null) return TileCrate.getSlotCount(TileCrate.maxSize);
{ }
return TileCrate.getSlotCount(TileCrate.maxSize); return TileCrate.getSlotCount(this.getBlockMetadata());
} }
return TileCrate.getSlotCount(this.getBlockMetadata());
}
@Override @Override
public boolean canUpdate() public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra)
{ {
return false; if (this.worldObj.isRemote)
} {
try
{
if (data.readBoolean())
{
this.sampleStack = ItemStack.loadItemStackFromNBT(PacketHandler.readNBTTagCompound(data));
this.sampleStack.stackSize = data.readInt();
}
else
{
this.sampleStack = null;
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
@Override @Override
public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) public Packet getDescriptionPacket()
{ {
if (this.worldObj.isRemote) this.buildSampleStack();
{ ItemStack stack = this.getSampleStack();
try if (stack != null)
{ {
if (data.readBoolean()) return ResonantInduction.PACKET_TILE.getPacket(this, true, stack.writeToNBT(new NBTTagCompound()), stack.stackSize);
{ }
this.sampleStack = ItemStack.loadItemStackFromNBT(PacketHandler.readNBTTagCompound(data)); else
this.sampleStack.stackSize = data.readInt(); {
} return ResonantInduction.PACKET_TILE.getPacket(this, false);
else }
{ }
this.sampleStack = null;
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
@Override /** NBT Data */
public Packet getDescriptionPacket() @Override
{ public void readFromNBT(NBTTagCompound nbt)
this.buildSampleStack(); {
ItemStack stack = this.getSampleStack(); super.readFromNBT(nbt);
if (stack != null) /* Load current two inv methods */
{ ItemStack stack = null;
return ResonantInduction.PACKET_TILE.getPacket(this, true, stack.writeToNBT(new NBTTagCompound()), stack.stackSize); int count = nbt.getInteger("Count");
} if (nbt.hasKey("itemID"))
else {
{ stack = new ItemStack(nbt.getInteger("itemID"), count, nbt.getInteger("itemMeta"));
return ResonantInduction.PACKET_TILE.getPacket(this, false); }
} else
} {
stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("stack"));
/** if (stack != null)
* NBT Data {
*/ stack.stackSize = count;
@Override }
public void readFromNBT(NBTTagCompound nbt) }
{
super.readFromNBT(nbt);
/* Load current two inv methods */
ItemStack stack = null;
int count = nbt.getInteger("Count");
if (nbt.hasKey("itemID"))
{
stack = new ItemStack(nbt.getInteger("itemID"), count, nbt.getInteger("itemMeta"));
}
else
{
stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("stack"));
if (stack != null)
{
stack.stackSize = count;
}
}
/* Only load sample stack if the read stack is valid */ /* Only load sample stack if the read stack is valid */
if (stack != null && stack.itemID != 0 && stack.stackSize > 0) if (stack != null && stack.itemID != 0 && stack.stackSize > 0)
{ {
this.sampleStack = stack; this.sampleStack = stack;
this.getInventory().buildInventory(this.sampleStack); this.getInventory().buildInventory(this.sampleStack);
} }
this.oreFilterEnabled = nbt.getBoolean("oreFilter"); this.oreFilterEnabled = nbt.getBoolean("oreFilter");
if (nbt.hasKey("filter")) if (nbt.hasKey("filter"))
{ {
filterStack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("filter")); filterStack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("filter"));
} }
} }
@Override @Override
public void writeToNBT(NBTTagCompound nbt) public void writeToNBT(NBTTagCompound nbt)
{ {
super.writeToNBT(nbt); super.writeToNBT(nbt);
/* Re-Build sample stack for saving */ /* Re-Build sample stack for saving */
this.buildSampleStack(); this.buildSampleStack();
ItemStack stack = this.getSampleStack(); ItemStack stack = this.getSampleStack();
/* Save sample stack */ /* Save sample stack */
if (stack != null) if (stack != null)
{ {
nbt.setInteger("Count", stack.stackSize); nbt.setInteger("Count", stack.stackSize);
nbt.setCompoundTag("stack", stack.writeToNBT(new NBTTagCompound())); nbt.setCompoundTag("stack", stack.writeToNBT(new NBTTagCompound()));
} }
nbt.setBoolean("oreFilter", this.oreFilterEnabled); nbt.setBoolean("oreFilter", this.oreFilterEnabled);
if (this.filterStack != null) if (this.filterStack != null)
{ {
nbt.setCompoundTag("filter", filterStack.writeToNBT(new NBTTagCompound())); nbt.setCompoundTag("filter", filterStack.writeToNBT(new NBTTagCompound()));
} }
} }
@Override @Override
public ItemStack getFilter() public ItemStack getFilter()
{ {
return this.filterStack; return this.filterStack;
} }
@Override @Override
public void setFilter(ItemStack filter) public void setFilter(ItemStack filter)
{ {
this.filterStack = filter; this.filterStack = filter;
this.onInventoryChanged(); this.onInventoryChanged();
} }
} }