package mcjty.rftools.blocks.spaceprojector;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;
import mcjty.lib.varia.BlockMeta;
import mcjty.lib.varia.Coordinate;
import mcjty.lib.varia.Counter;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
import java.util.List;
public class PacketGetChamberInfo implements IMessage, IMessageHandler<PacketGetChamberInfo, PacketChamberInfoReady> {
@Override
public void fromBytes(ByteBuf buf) {
}
@Override
public void toBytes(ByteBuf buf) {
}
public PacketGetChamberInfo() {
}
@Override
public PacketChamberInfoReady onMessage(PacketGetChamberInfo message, MessageContext ctx) {
EntityPlayer player = ctx.getServerHandler().playerEntity;
ItemStack cardItem = player.getHeldItem();
if (cardItem == null || cardItem.getTagCompound() == null) {
return null;
}
int channel = cardItem.getTagCompound().getInteger("channel");
if (channel == -1) {
return null;
}
SpaceChamberRepository repository = SpaceChamberRepository.getChannels(player.worldObj);
SpaceChamberRepository.SpaceChamberChannel chamberChannel = repository.getChannel(channel);
if (chamberChannel == null) {
return null;
}
int dimension = chamberChannel.getDimension();
World world = DimensionManager.getWorld(dimension);
if (world == null) {
return null;
}
Counter<BlockMeta> blocks = new Counter<BlockMeta>();
Counter<BlockMeta> costs = new Counter<BlockMeta>();
Coordinate minCorner = chamberChannel.getMinCorner();
Coordinate maxCorner = chamberChannel.getMaxCorner();
for (int x = minCorner.getX() ; x <= maxCorner.getX() ; x++) {
for (int y = minCorner.getY() ; y <= maxCorner.getY() ; y++) {
for (int z = minCorner.getZ() ; z <= maxCorner.getZ() ; z++) {
Block block = world.getBlock(x, y, z);
if (!BuilderTileEntity.isEmpty(block)) {
int meta = world.getBlockMetadata(x, y, z);
BlockMeta bm = new BlockMeta(block, meta);
blocks.increment(bm);
TileEntity te = world.getTileEntity(x, y, z);
SpaceProjectorSetup.BlockInformation info = BuilderTileEntity.getBlockInformation(world, x, y, z, block, te);
if (info.getBlockLevel() == SupportBlock.STATUS_ERROR) {
costs.put(bm, -1);
} else {
costs.increment(bm, (int) (SpaceProjectorConfiguration.builderRfPerOperation * info.getCostFactor()));
}
}
}
}
}
Counter<String> entitiesWithCount = new Counter<String>();
Counter<String> entitiesWithCost = new Counter<String>();
List entities = world.getEntitiesWithinAABBExcludingEntity(null, AxisAlignedBB.getBoundingBox(
minCorner.getX(), minCorner.getY(), minCorner.getZ(), maxCorner.getX()+1, maxCorner.getY()+1, maxCorner.getZ()+1));
for (Object o : entities) {
Entity entity = (Entity) o;
String canonicalName = entity.getClass().getCanonicalName();
entitiesWithCount.increment(canonicalName);
if (entity instanceof EntityPlayer) {
entitiesWithCost.increment(canonicalName, SpaceProjectorConfiguration.builderRfPerPlayer);
} else {
entitiesWithCost.increment(canonicalName, SpaceProjectorConfiguration.builderRfPerEntity);
}
}
return new PacketChamberInfoReady(blocks, costs, entitiesWithCount, entitiesWithCost);
}
}