package pneumaticCraft.client.render.pneumaticArmor.blockTracker;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import pneumaticCraft.api.client.pneumaticHelmet.IBlockTrackEntry;
import pneumaticCraft.api.client.pneumaticHelmet.InventoryTrackEvent;
import pneumaticCraft.client.render.pneumaticArmor.HUDHandler;
import pneumaticCraft.common.network.NetworkHandler;
import pneumaticCraft.common.network.PacketDescriptionPacketRequest;
import pneumaticCraft.common.util.IOHelper;
import pneumaticCraft.common.util.PneumaticCraftUtils;
import pneumaticCraft.lib.Log;
import cpw.mods.fml.relauncher.ReflectionHelper;
public class BlockTrackEntryInventory implements IBlockTrackEntry{
public static Map tileEntityClassToNameMapping;
private static List<String> invBlackList = new ArrayList<String>();// list of all inventories that could have crashed the helmet.
public static void addTileEntityToBlackList(TileEntity te, Throwable e){
e.printStackTrace();
String title = te.getWorldObj().getBlock(te.xCoord, te.yCoord, te.zCoord).getLocalizedName();
HUDHandler.instance().addMessage("Block tracking failed for " + title + "! A stacktrace can be found in the log.", new ArrayList<String>(), 60, 0xFFFF0000);
invBlackList.add((String)BlockTrackEntryInventory.tileEntityClassToNameMapping.get(te.getClass()));
}
@Override
public boolean shouldTrackWithThisEntry(IBlockAccess world, int x, int y, int z, Block block, TileEntity te){
if(tileEntityClassToNameMapping == null) {
try {
tileEntityClassToNameMapping = (Map)ReflectionHelper.findField(TileEntity.class, "field_145853_j", "classToNameMap").get(null);
} catch(Exception e) {
Log.error("[BlockTrackEntryInventory.class] Uhm reflection failed here!");
e.printStackTrace();
}
}
if(te instanceof TileEntityChest) {
TileEntityChest chest = (TileEntityChest)te;
if(chest.adjacentChestXNeg != null || chest.adjacentChestZNeg != null) return false;
}
return te != null && !invBlackList.contains(tileEntityClassToNameMapping.get(te.getClass())) && te instanceof IInventory && ((IInventory)te).getSizeInventory() > 0 && !MinecraftForge.EVENT_BUS.post(new InventoryTrackEvent(te));
}
@Override
public boolean shouldBeUpdatedFromServer(TileEntity te){
if(te instanceof TileEntityChest) {
TileEntityChest chest = (TileEntityChest)te;
if(chest.adjacentChestXPos != null) NetworkHandler.sendToServer(new PacketDescriptionPacketRequest(chest.adjacentChestXPos.xCoord, chest.adjacentChestXPos.yCoord, chest.adjacentChestXPos.zCoord));
if(chest.adjacentChestZPos != null) NetworkHandler.sendToServer(new PacketDescriptionPacketRequest(chest.adjacentChestZPos.xCoord, chest.adjacentChestZPos.yCoord, chest.adjacentChestZPos.zCoord));
}
return true;
}
@Override
public int spamThreshold(){
return 6;
}
@Override
public void addInformation(World world, int x, int y, int z, TileEntity te, List<String> infoList){
try {
IInventory inventory = IOHelper.getInventoryForTE(te);
if(inventory != null) {
boolean empty = true;
ItemStack[] inventoryStacks = new ItemStack[inventory.getSizeInventory()];
for(int i = 0; i < inventory.getSizeInventory(); i++) {
ItemStack iStack = inventory.getStackInSlot(i);
if(iStack != null) empty = false;
inventoryStacks[i] = iStack;
}
if(empty) {
infoList.add("Contents: Empty");
} else {
infoList.add("Contents:");
PneumaticCraftUtils.sortCombineItemStacksAndToString(infoList, inventoryStacks);
}
}
} catch(Throwable e) {
addTileEntityToBlackList(te, e);
}
}
@Override
public String getEntryName(){
return "blockTracker.module.inventories";
}
}