/**
* 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.client.render.block.RenderDynamicBlock;
import cn.academy.core.tile.TileInventory;
import cn.academy.energy.api.IFItemManager;
import cn.academy.energy.api.WirelessHelper;
import cn.academy.energy.api.block.IWirelessNode;
import cn.academy.energy.block.BlockNode.NodeType;
import cn.academy.energy.internal.WirelessNet;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.annoreg.mc.RegTileEntity;
import cn.lambdalib.s11n.network.TargetPoints;
import cn.lambdalib.s11n.network.NetworkMessage;
import cn.lambdalib.s11n.network.NetworkMessage.Listener;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
/**
* @author WeathFolD
*
*/
@Registrant
@RegTileEntity
@RegTileEntity.HasRender
public class TileNode extends TileInventory implements IWirelessNode, IInventory {
static IFItemManager itemManager = IFItemManager.instance;
static final String MSG_SYNC = "sync";
@SideOnly(Side.CLIENT)
@RegTileEntity.Render
public static RenderDynamicBlock renderer;
protected double energy;
private int updateTicker;
private String password = "";
/**
* Client-only flag. Only *roughly* indicates whether the block is linked.
* Used for just rendering.
*/
public boolean enabled = false;
public boolean chargingIn = false;
public boolean chargingOut = false;
private String placerName = "";
public TileNode() {
super("wireless_node", 2);
}
public void setPlacer(EntityPlayer player) {
placerName = player.getCommandSenderName();
}
public String getPlacerName() {
return placerName;
}
@Override
public void updateEntity() {
if(!getWorldObj().isRemote) {
++updateTicker;
if(updateTicker == 10) {
updateTicker = 0;
WirelessNet net = WirelessHelper.getWirelessNet(this);
enabled = net != null;
NetworkMessage.sendToAllAround(TargetPoints.convert(this, 20),
this, MSG_SYNC,
enabled, chargingIn, chargingOut, energy, name, password, placerName);
}
updateChargeIn();
updateChargeOut();
}
}
public void setPassword(String _pass) {
password = _pass;
}
private void updateChargeIn() {
ItemStack stack = this.getStackInSlot(0);
if(stack != null && itemManager.isSupported(stack)) {
//Charge into the node.
double req = Math.min(getBandwidth(), getMaxEnergy() - energy);
double pull = itemManager.pull(stack, req, false);
chargingIn = pull != 0;
this.setEnergy(energy + pull);
} else {
chargingIn = false;
}
}
private void updateChargeOut() {
ItemStack stack = this.getStackInSlot(1);
if(stack != null && itemManager.isSupported(stack)) {
double cur = getEnergy();
if(cur > 0) {
cur = Math.min(getBandwidth(), cur);
double left = itemManager.charge(stack, cur);
chargingOut = left != cur;
this.setEnergy(getEnergy() - (cur - left));
}
} else {
chargingOut = false;
}
}
@Override
public double getMaxEnergy() {
return getType().maxEnergy;
}
@Override
public double getEnergy() {
return energy;
}
@Override
public void setEnergy(double value) {
energy = value;
}
@Override
public double getBandwidth() {
return getType().bandwidth;
}
@Override
public double getRange() {
return getType().range;
}
public NodeType getType() {
return NodeType.values()[getBlockMetadata()];
}
@Override
public void readFromNBT(NBTTagCompound tag) {
super.readFromNBT(tag);
energy = tag.getDouble("energy");
name = tag.getString("nodeName");
password = tag.getString("password");
placerName = tag.getString("placer");
}
@Override
public void writeToNBT(NBTTagCompound tag) {
super.writeToNBT(tag);
tag.setDouble("energy", energy);
tag.setString("nodeName", name);
tag.setString("password", password);
tag.setString("placer", placerName);
}
String name = "Unnamed";
@Override
public String getNodeName() {
return name;
}
@Override
public String getPassword() {
return password;
}
public void setNodeName(String name) {
this.name = name;
}
@Listener(channel=MSG_SYNC, side=Side.CLIENT)
void hSync(boolean enabled, boolean chargingIn, boolean chargingOut,
double energy, String name, String pass, String placerName) {
this.enabled = enabled;
this.chargingIn = chargingIn;
this.chargingOut = chargingOut;
this.energy = energy;
this.name = name;
this.password = pass;
this.placerName = placerName;
}
@Override
public int getCapacity() {
return getType().capacity;
}
}