thaumic-machinery/src/main/java/net/anvilcraft/thaummach/tiles/TileConduit.java

283 lines
9.1 KiB
Java

package net.anvilcraft.thaummach.tiles;
import dev.tilera.auracore.api.HelperLocation;
import dev.tilera.auracore.api.machine.IConnection;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraftforge.common.util.ForgeDirection;
public class TileConduit extends TileEntity implements IConnection {
public float pureVis = 0.0F;
public float taintedVis = 0.0F;
public float maxVis = 4.0F;
float fillAmount = 4.0F;
public float prevPure;
public float prevTaint;
public int visSuction = 0;
public int taintSuction = 0;
@Override
public void updateEntity() {
if (!super.worldObj.isRemote) {
this.calculateSuction();
if (this.getSuction(null) > 0) {
this.equalizeWithNeighbours();
}
if (this.prevPure != this.pureVis || this.prevTaint != this.taintedVis) {
super.worldObj.markBlockForUpdate(
super.xCoord, super.yCoord, super.zCoord
);
this.prevPure = this.pureVis;
this.prevTaint = this.taintedVis;
}
}
}
protected void calculateSuction() {
this.setSuction(0);
for (int dir = 0; dir < 6; ++dir) {
HelperLocation loc = new HelperLocation(this);
switch (dir) {
case 0:
loc.facing = ForgeDirection.UP;
break;
case 1:
loc.facing = ForgeDirection.DOWN;
break;
case 2:
loc.facing = ForgeDirection.SOUTH;
break;
case 3:
loc.facing = ForgeDirection.NORTH;
break;
case 4:
loc.facing = ForgeDirection.EAST;
break;
case 5:
loc.facing = ForgeDirection.WEST;
}
if (this.getConnectable(loc.facing)) {
TileEntity te = loc.getConnectableTile(super.worldObj);
if (te != null && te instanceof IConnection) {
IConnection ic = (IConnection) te;
if (this.getVisSuction((HelperLocation) null)
< ic.getVisSuction(new HelperLocation(this)) - 1) {
this.setVisSuction(
ic.getVisSuction(new HelperLocation(this)) - 1
);
}
if (this.getTaintSuction((HelperLocation) null)
< ic.getTaintSuction(new HelperLocation(this)) - 1) {
this.setTaintSuction(
ic.getTaintSuction(new HelperLocation(this)) - 1
);
}
}
}
}
}
protected void equalizeWithNeighbours() {
for (int dir = 0; dir < 6; ++dir) {
HelperLocation loc = new HelperLocation(this);
switch (dir) {
case 0:
loc.facing = ForgeDirection.UP;
break;
case 1:
loc.facing = ForgeDirection.DOWN;
break;
case 2:
loc.facing = ForgeDirection.SOUTH;
break;
case 3:
loc.facing = ForgeDirection.NORTH;
break;
case 4:
loc.facing = ForgeDirection.EAST;
break;
case 5:
loc.facing = ForgeDirection.WEST;
}
if (this.getConnectable(loc.facing)) {
TileEntity te = loc.getConnectableTile(super.worldObj);
if (te != null && te instanceof IConnection) {
IConnection ent = (IConnection) te;
if (this.pureVis + this.taintedVis < this.maxVis
&& (this.getVisSuction((HelperLocation) null)
> ent.getVisSuction(new HelperLocation(this))
|| this.getTaintSuction((HelperLocation) null)
> ent.getTaintSuction(new HelperLocation(this)))) {
float qq = Math.min(
(ent.getPureVis() + ent.getTaintedVis()) / 4.0F,
this.fillAmount
);
float[] results = ent.subtractVis(
Math.min(qq, this.maxVis - (this.pureVis + this.taintedVis))
);
if (this.getVisSuction((HelperLocation) null)
> ent.getVisSuction(new HelperLocation(this))) {
this.pureVis += results[0];
} else {
ent.setPureVis(results[0] + ent.getPureVis());
}
if (this.getTaintSuction((HelperLocation) null)
> ent.getTaintSuction(new HelperLocation(this))) {
this.taintedVis += results[1];
} else {
ent.setTaintedVis(results[1] + ent.getTaintedVis());
}
}
}
}
}
this.pureVis = MathHelper.clamp_float(this.pureVis, 0.0F, this.maxVis);
this.taintedVis = MathHelper.clamp_float(this.taintedVis, 0.0F, this.maxVis);
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
this.pureVis = nbttagcompound.getFloat("pureVis");
this.taintedVis = nbttagcompound.getFloat("taintedVis");
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setFloat("pureVis", this.pureVis);
nbttagcompound.setFloat("taintedVis", this.taintedVis);
}
@Override
public Packet getDescriptionPacket() {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setFloat("pureVis", this.pureVis);
nbt.setFloat("taintedVis", this.taintedVis);
return new S35PacketUpdateTileEntity(
this.xCoord, this.yCoord, this.zCoord, this.getBlockMetadata(), nbt
);
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
NBTTagCompound nbt = pkt.func_148857_g();
this.pureVis = nbt.getFloat("pureVis");
this.taintedVis = nbt.getFloat("taintedVis");
}
@Override
public boolean getConnectable(ForgeDirection face) {
return true;
}
@Override
public boolean isVisSource() {
return false;
}
@Override
public boolean isVisConduit() {
return true;
}
@Override
public float getPureVis() {
return this.pureVis;
}
@Override
public void setPureVis(float amount) {
this.pureVis = amount;
}
@Override
public float getTaintedVis() {
return this.taintedVis;
}
@Override
public void setTaintedVis(float amount) {
this.taintedVis = amount;
}
@Override
public float getMaxVis() {
return this.maxVis;
}
@Override
public float[] subtractVis(float amount) {
float pureAmount = amount / 2.0F;
float taintAmount = amount / 2.0F;
float[] result = new float[] { 0.0F, 0.0F };
if (amount < 0.001F) {
return result;
} else {
if (this.pureVis < pureAmount) {
pureAmount = this.pureVis;
}
if (this.taintedVis < taintAmount) {
taintAmount = this.taintedVis;
}
if (pureAmount < amount / 2.0F && taintAmount == amount / 2.0F) {
taintAmount = Math.min(amount - pureAmount, this.taintedVis);
} else if (taintAmount < amount / 2.0F && pureAmount == amount / 2.0F) {
pureAmount = Math.min(amount - taintAmount, this.pureVis);
}
this.pureVis -= pureAmount;
this.taintedVis -= taintAmount;
result[0] = pureAmount;
result[1] = taintAmount;
return result;
}
}
@Override
public int getVisSuction(HelperLocation loc) {
return this.visSuction;
}
@Override
public void setVisSuction(int suction) {
this.visSuction = suction;
}
@Override
public int getTaintSuction(HelperLocation loc) {
return this.taintSuction;
}
@Override
public void setTaintSuction(int suction) {
this.taintSuction = suction;
}
@Override
public void setSuction(int suction) {
this.visSuction = suction;
this.taintSuction = suction;
}
@Override
public int getSuction(HelperLocation loc) {
return Math.max(this.visSuction, this.taintSuction);
}
}