Send controller nodes again with the new system

This commit is contained in:
Raoul Van den Berge
2016-08-07 22:04:55 +02:00
parent 4e0a0de509
commit 257e5650ae
7 changed files with 167 additions and 121 deletions

View File

@@ -3,6 +3,7 @@ package refinedstorage.tile;
import cofh.api.energy.EnergyStorage;
import cofh.api.energy.IEnergyReceiver;
import net.darkhax.tesla.capability.TeslaCapabilities;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
@@ -45,6 +46,7 @@ import refinedstorage.network.MessageGridUpdate;
import refinedstorage.tile.config.IRedstoneConfigurable;
import refinedstorage.tile.config.RedstoneMode;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.RefinedStorageSerializers;
import refinedstorage.tile.data.TileDataManager;
import refinedstorage.tile.data.TileDataParameter;
import refinedstorage.tile.externalstorage.ExternalStorage;
@@ -75,6 +77,41 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
}
});
public static final TileDataParameter<List<ClientNode>> NODES = TileDataManager.createParameter(RefinedStorageSerializers.CLIENT_NODE_SERIALIZER, new ITileDataProducer<List<ClientNode>, TileController>() {
@Override
public List<ClientNode> getValue(TileController tile) {
List<ClientNode> nodes = new ArrayList<>();
for (INetworkNode node : tile.nodeGraph.all()) {
if (node.canUpdate()) {
IBlockState state = tile.worldObj.getBlockState(node.getPosition());
ClientNode clientNode = new ClientNode(
new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)),
1,
node.getEnergyUsage()
);
if (clientNode.getStack().getItem() != null) {
if (nodes.contains(clientNode)) {
for (ClientNode other : nodes) {
if (other.equals(clientNode)) {
other.setAmount(other.getAmount() + 1);
break;
}
}
} else {
nodes.add(clientNode);
}
}
}
}
return nodes;
}
});
public static final String NBT_ENERGY = "Energy";
public static final String NBT_ENERGY_CAPACITY = "EnergyCapacity";
@@ -122,13 +159,12 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
private List<ClientNode> clientNodes = new ArrayList<>();
public TileController() {
dataManager.addWatchedParameter(REDSTONE_MODE);
dataManager.addWatchedParameter(ENERGY_USAGE);
dataManager.addWatchedParameter(ENERGY_STORED);
dataManager.addParameter(ENERGY_CAPACITY);
dataManager.addParameter(NODES);
if (IntegrationIC2.isLoaded()) {
this.energyEU = new ControllerEnergyIC2(this);
@@ -251,10 +287,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
super.invalidate();
}
public List<ClientNode> getClientNodes() {
return clientNodes;
}
@Override
public IGridHandler getGridHandler() {
return gridHandler;
@@ -570,16 +602,16 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
return energy.getEnergyStored();
}
public int getEnergyScaled(int i) {
return (int) ((float) energy.getEnergyStored() / (float) energy.getMaxEnergyStored() * (float) i);
public static int getEnergyScaled(int stored, int capacity, int scale) {
return (int) ((float) stored / (float) capacity * (float) scale);
}
public int getEnergyScaledForDisplay() {
return getEnergyScaled(7);
return getEnergyScaled(energy.getEnergyStored(), energy.getMaxEnergyStored(), 7);
}
public int getEnergyScaledForComparator() {
return getEnergyScaled(15);
return getEnergyScaled(energy.getEnergyStored(), energy.getMaxEnergyStored(), 15);
}
@Override
@@ -625,79 +657,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
return type == null ? EnumControllerType.NORMAL : type;
}
// @TODO: Sync client nodes
/*@Override
public void readContainerData(ByteBuf buf) {
energy.setEnergyStored(buf.readInt());
this.energyUsage = buf.readInt();
this.redstoneMode = RedstoneMode.getById(buf.readInt());
List<ClientNode> nodes = new ArrayList<ClientNode>();
int size = buf.readInt();
for (int i = 0; i < size; ++i) {
ClientNode node = new ClientNode();
node.energyUsage = buf.readInt();
node.amount = buf.readInt();
node.stack = ByteBufUtils.readItemStack(buf);
nodes.add(node);
}
this.clientNodes = nodes;
}
@Override
public void writeContainerData(ByteBuf buf) {
buf.writeInt(energy.getEnergyStored());
buf.writeInt(getEnergyUsage());
buf.writeInt(redstoneMode.id);
List<ClientNode> clientNodes = new ArrayList<ClientNode>();
for (INetworkNode node : nodeGraph.all()) {
if (node.canUpdate()) {
IBlockState state = worldObj.getBlockState(node.getPosition());
ClientNode clientNode = new ClientNode();
clientNode.energyUsage = node.getEnergyUsage();
clientNode.amount = 1;
clientNode.stack = new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state));
if (clientNode.stack.getItem() != null) {
if (clientNodes.contains(clientNode)) {
for (ClientNode other : clientNodes) {
if (other.equals(clientNode)) {
other.amount++;
break;
}
}
} else {
clientNodes.add(clientNode);
}
}
}
}
buf.writeInt(clientNodes.size());
for (ClientNode node : clientNodes) {
buf.writeInt(node.energyUsage);
buf.writeInt(node.amount);
ByteBufUtils.writeItemStack(buf, node.stack);
}
}
@Override
public Class<? extends Container> getContainer() {
return ContainerController.class;
}*/
@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
if (energyTesla != null && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) {
@@ -711,30 +670,4 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
return (energyTesla != null && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) || super.hasCapability(capability, facing);
}
public class ClientNode {
public ItemStack stack;
public int amount;
public int energyUsage;
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof ClientNode)) {
return false;
}
return energyUsage == ((ClientNode) other).energyUsage && CompareUtils.compareStack(stack, ((ClientNode) other).stack);
}
@Override
public int hashCode() {
int result = stack.hashCode();
result = 31 * result + energyUsage;
return result;
}
}
}