generated from tilera/1710mod
201 lines
5.8 KiB
Java
201 lines
5.8 KiB
Java
package com.eloraam.redpower.core;
|
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.nbt.NBTTagDouble;
|
|
import net.minecraft.nbt.NBTTagList;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.world.World;
|
|
|
|
public abstract class BluePowerConductor {
|
|
private static int[] dirmap = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 11, 14, 18, 23 };
|
|
int imask = 0;
|
|
double[] currents;
|
|
public double Vcap = 0.0;
|
|
public double Icap = 0.0;
|
|
public double Veff = 0.0;
|
|
int lastTick = 0;
|
|
public double It1 = 0.0;
|
|
public double Itot = 0.0;
|
|
|
|
public abstract TileEntity getParent();
|
|
|
|
public abstract double getInvCap();
|
|
|
|
public int getChargeScaled(int i) {
|
|
return 0;
|
|
}
|
|
|
|
public int getFlowScaled(int i) {
|
|
return 0;
|
|
}
|
|
|
|
public double getResistance() {
|
|
return 0.01;
|
|
}
|
|
|
|
public double getIndScale() {
|
|
return 0.07;
|
|
}
|
|
|
|
public double getCondParallel() {
|
|
return 0.5;
|
|
}
|
|
|
|
public void recache(int conm, int econm) {
|
|
int imo = 0;
|
|
|
|
for (int c2 = 0; c2 < 3; ++c2) {
|
|
if ((conm & RedPowerLib.getConDirMask(c2 * 2)) > 0) {
|
|
imo |= 1 << c2;
|
|
}
|
|
}
|
|
|
|
for (int var12 = 0; var12 < 12; ++var12) {
|
|
if ((econm & 1 << dirmap[var12]) > 0) {
|
|
imo |= 8 << var12;
|
|
}
|
|
}
|
|
|
|
if (this.imask != imo) {
|
|
double[] var11 = new double[Integer.bitCount(imo)];
|
|
int s = 0;
|
|
int d = 0;
|
|
|
|
for (int a = 0; a < 15; ++a) {
|
|
int m = 1 << a;
|
|
double v = 0.0;
|
|
if ((this.imask & m) > 0) {
|
|
v = this.currents[s++];
|
|
}
|
|
|
|
if ((imo & m) > 0) {
|
|
var11[d++] = v;
|
|
}
|
|
}
|
|
|
|
this.currents = var11;
|
|
this.imask = imo;
|
|
}
|
|
}
|
|
|
|
protected void computeVoltage() {
|
|
this.Itot = 0.5 * this.It1;
|
|
this.It1 = 0.0;
|
|
this.Vcap += 0.05 * this.Icap * this.getInvCap();
|
|
this.Icap = 0.0;
|
|
}
|
|
|
|
public double getVoltage() {
|
|
long lt = this.getParent().getWorldObj().getTotalWorldTime();
|
|
if ((lt & 65535L) == (long) this.lastTick) {
|
|
return this.Vcap;
|
|
} else {
|
|
this.lastTick = (int) (lt & 65535L);
|
|
this.computeVoltage();
|
|
return this.Vcap;
|
|
}
|
|
}
|
|
|
|
public void applyCurrent(double Iin) {
|
|
this.getVoltage();
|
|
this.Icap += Iin;
|
|
this.It1 += Math.abs(Iin);
|
|
}
|
|
|
|
public void drawPower(double P) {
|
|
double p1 = this.Vcap * this.Vcap - 0.1 * P * this.getInvCap();
|
|
double t = p1 < 0.0 ? 0.0 : Math.sqrt(p1) - this.Vcap;
|
|
this.applyDirect(20.0 * t / this.getInvCap());
|
|
}
|
|
|
|
public double getEnergy(double vthresh) {
|
|
double d = this.getVoltage();
|
|
double tr = 0.5 * (d * d - vthresh * vthresh) / this.getInvCap();
|
|
return tr < 0.0 ? 0.0 : tr;
|
|
}
|
|
|
|
public void applyPower(double P) {
|
|
double t
|
|
= Math.sqrt(this.Vcap * this.Vcap + 0.1 * P * this.getInvCap()) - this.Vcap;
|
|
this.applyDirect(20.0 * t / this.getInvCap());
|
|
}
|
|
|
|
public void applyDirect(double Iin) {
|
|
this.applyCurrent(Iin);
|
|
}
|
|
|
|
public void iterate() {
|
|
TileEntity parent = this.getParent();
|
|
World world = parent.getWorldObj();
|
|
this.getVoltage();
|
|
int dm = this.imask;
|
|
|
|
for (int s = 0; dm > 0; ++s) {
|
|
int d = Integer.numberOfTrailingZeros(dm);
|
|
dm &= ~(1 << d);
|
|
WorldCoord wc = new WorldCoord(parent);
|
|
int facing;
|
|
if (d < 3) {
|
|
facing = d * 2;
|
|
wc.step(facing);
|
|
} else {
|
|
int ibc = dirmap[d - 3];
|
|
wc.step(ibc >> 2);
|
|
facing = WorldCoord.getIndStepDir(ibc >> 2, ibc & 3);
|
|
wc.step(facing);
|
|
}
|
|
|
|
IBluePowerConnectable powerConnectable
|
|
= CoreLib.getTileEntity(world, wc, IBluePowerConnectable.class);
|
|
if (powerConnectable != null) {
|
|
BluePowerConductor bpc = powerConnectable.getBlueConductor(facing ^ 1);
|
|
double r = this.getResistance() + bpc.getResistance();
|
|
double I = this.currents[s];
|
|
double V = this.Vcap - bpc.getVoltage();
|
|
this.currents[s] += (V - I * r) * this.getIndScale();
|
|
I += V * this.getCondParallel();
|
|
this.applyCurrent(-I);
|
|
bpc.applyCurrent(I);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void readFromNBT(NBTTagCompound tag) {
|
|
this.imask = tag.getInteger("bpim");
|
|
int l = Integer.bitCount(this.imask);
|
|
this.currents = new double[l];
|
|
NBTTagList clist = tag.getTagList("bpil", 6);
|
|
if (clist.tagCount() == l) {
|
|
for (int i = 0; i < l; ++i) {
|
|
this.currents[i] = clist.func_150309_d(i);
|
|
}
|
|
|
|
this.Vcap = tag.getDouble("vcap");
|
|
this.Icap = tag.getDouble("icap");
|
|
this.Veff = tag.getDouble("veff");
|
|
this.It1 = tag.getDouble("it1");
|
|
this.Itot = tag.getDouble("itot");
|
|
this.lastTick = tag.getInteger("ltk");
|
|
}
|
|
}
|
|
|
|
public void writeToNBT(NBTTagCompound tag) {
|
|
tag.setInteger("bpim", this.imask);
|
|
int l = Integer.bitCount(this.imask);
|
|
NBTTagList clist = new NBTTagList();
|
|
|
|
for (int i = 0; i < l; ++i) {
|
|
NBTTagDouble val = new NBTTagDouble(this.currents[i]);
|
|
clist.appendTag(val);
|
|
}
|
|
|
|
tag.setTag("bpil", clist);
|
|
tag.setDouble("vcap", this.Vcap);
|
|
tag.setDouble("icap", this.Icap);
|
|
tag.setDouble("veff", this.Veff);
|
|
tag.setDouble("it1", this.It1);
|
|
tag.setDouble("itot", this.Itot);
|
|
tag.setInteger("ltk", this.lastTick);
|
|
}
|
|
}
|