/** * Copyright (c) Lambda Innovation, 2013-2016 * This file is part of the AcademyCraft mod. * https://github.com/LambdaInnovation/AcademyCraft * Licensed under GPLv3, see project root for more information. */ package cn.academy.energy.block; import cn.academy.core.tile.TileInventory; import cn.academy.crafting.ModuleCrafting; import cn.academy.energy.ModuleEnergy; import cn.academy.energy.api.block.IWirelessMatrix; import cn.academy.energy.client.render.block.RenderMatrix; import cn.lambdalib.annoreg.core.Registrant; import cn.lambdalib.annoreg.mc.RegTileEntity; import cn.lambdalib.multiblock.BlockMulti; import cn.lambdalib.multiblock.IMultiTile; import cn.lambdalib.multiblock.InfoBlockMulti; import cn.lambdalib.s11n.network.TargetPoints; import cn.lambdalib.s11n.network.NetworkMessage; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; /** * @author WeAthFolD */ @Registrant @RegTileEntity @RegTileEntity.HasRender public class TileMatrix extends TileInventory implements IWirelessMatrix, IMultiTile { @RegTileEntity.Render @SideOnly(Side.CLIENT) public static RenderMatrix renderer; // Client-only for display public int plateCount; int updateTicker; private String placerName = ""; public TileMatrix() { super("wireless_matrix", 4); } @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { if(stack == null) return false; if (0 <= slot && slot <= 2) { return stack.getItem() == ModuleCrafting.constPlate; } else if (slot == 3) { return stack.getItem() == ModuleEnergy.matrixCore; } else { return false; } } //InfoBlockMulti delegation InfoBlockMulti info = new InfoBlockMulti(this); public void setPlacer(EntityPlayer player) { placerName = player.getCommandSenderName(); } public String getPlacerName() { return placerName; } @Override public void updateEntity() { info.update(); if(info.getSubID() == 0) { if(!getWorldObj().isRemote && ++updateTicker == 15) { updateTicker = 0; this.sync(); } } } @Override public InfoBlockMulti getBlockInfo() { return info; } @Override public void setBlockInfo(InfoBlockMulti i) { info = i; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); info = new InfoBlockMulti(this, nbt); placerName = nbt.getString("placer"); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); info.save(nbt); nbt.setString("placer", placerName); } @Override public int getInventoryStackLimit() { return 1; } @SideOnly(Side.CLIENT) @Override public AxisAlignedBB getRenderBoundingBox() { Block block = getBlockType(); if(block instanceof BlockMulti) { return ((BlockMulti) block).getRenderBB(xCoord, yCoord, zCoord, info.getDir()); } else { return super.getRenderBoundingBox(); } } //WEN /** * Server only. */ public int getPlateCount() { int count = 0; for(int i = 0; i < 3; ++i) { if(this.getStackInSlot(i) != null) count++; } return count; } public int getCoreLevel() { ItemStack stack = getStackInSlot(3); return stack == null ? 0 : stack.getItemDamage() + 1; } @Override public int getCapacity() { return isWorking() ? 8 * getCoreLevel() : 0; } @Override public double getBandwidth() { int L = getCoreLevel(); return isWorking() ? L * L * 60 : 0; } @Override public double getRange() { return isWorking() ? 24 * Math.sqrt(getCoreLevel()) : 0; } private boolean isWorking() { return getCoreLevel() > 0 && getPlateCount() == 3; } private void sync() { NetworkMessage.sendToAllAround( TargetPoints.convert(this, 25), this, "sync", getPlateCount(), placerName); } @NetworkMessage.Listener(channel="sync", side=Side.CLIENT) private void hSync(int plateCount2, String placerName2) { plateCount = plateCount2; placerName = placerName2; } }