mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
115 lines
3.6 KiB
Java
115 lines
3.6 KiB
Java
package api.hbm.energy;
|
|
|
|
import com.hbm.packet.AuxParticlePacketNT;
|
|
import com.hbm.packet.PacketDispatcher;
|
|
|
|
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
|
|
/**
|
|
* For machines and things that have an energy buffer and are affected by EMPs
|
|
* @author hbm
|
|
*/
|
|
public interface IEnergyUser extends IEnergyConnector {
|
|
|
|
/**
|
|
* Not to be used for actual energy transfer, rather special external things like EMPs and sync packets
|
|
*/
|
|
public void setPower(long power);
|
|
|
|
/**
|
|
* Standard implementation for power transfer.
|
|
* Turns out you can override interfaces to provide a default implementation. Neat.
|
|
* @param long power
|
|
*/
|
|
@Override
|
|
public default long transferPower(long power) {
|
|
|
|
if(this.getPower() + power > this.getMaxPower()) {
|
|
|
|
long overshoot = this.getPower() + power - this.getMaxPower();
|
|
this.setPower(this.getMaxPower());
|
|
return overshoot;
|
|
}
|
|
|
|
if(this.getPower() + power < 0) return 0; //safeguard for negative energy or overflows
|
|
|
|
this.setPower(this.getPower() + power);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Standard implementation of sending power
|
|
* @param world
|
|
* @param x
|
|
* @param y
|
|
* @param z
|
|
* @param dir
|
|
*/
|
|
public default void sendPower(World world, int x, int y, int z, ForgeDirection dir) {
|
|
|
|
TileEntity te = world.getTileEntity(x, y, z);
|
|
boolean wasSubscribed = false;
|
|
boolean red = false;
|
|
|
|
// first we make sure we're not subscribed to the network that we'll be supplying
|
|
if(te instanceof IEnergyConductor) {
|
|
IEnergyConductor con = (IEnergyConductor) te;
|
|
|
|
if(con.canConnect(dir.getOpposite()) && con.getPowerNet() != null && con.getPowerNet().isSubscribed(this)) {
|
|
con.getPowerNet().unsubscribe(this);
|
|
wasSubscribed = true;
|
|
}
|
|
}
|
|
|
|
//then we add energy
|
|
if(te instanceof IEnergyConnector) {
|
|
IEnergyConnector con = (IEnergyConnector) te;
|
|
|
|
if(con.canConnect(dir.getOpposite())) {
|
|
long oldPower = this.getPower();
|
|
long transfer = oldPower - con.transferPower(oldPower);
|
|
this.setPower(oldPower - transfer);
|
|
red = true;
|
|
}
|
|
}
|
|
|
|
//then we subscribe if possible
|
|
if(wasSubscribed && te instanceof IEnergyConductor) {
|
|
IEnergyConductor con = (IEnergyConductor) te;
|
|
|
|
if(con.getPowerNet() != null && !con.getPowerNet().isSubscribed(this)) {
|
|
con.getPowerNet().subscribe(this);
|
|
}
|
|
}
|
|
|
|
if(particleDebug) {
|
|
NBTTagCompound data = new NBTTagCompound();
|
|
data.setString("type", "network");
|
|
data.setString("mode", "power");
|
|
double posX = x + 0.5 - dir.offsetX * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
|
|
double posY = y + 0.5 - dir.offsetY * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
|
|
double posZ = z + 0.5 - dir.offsetZ * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
|
|
data.setDouble("mX", dir.offsetX * (red ? 0.025 : 0.1));
|
|
data.setDouble("mY", dir.offsetY * (red ? 0.025 : 0.1));
|
|
data.setDouble("mZ", dir.offsetZ * (red ? 0.025 : 0.1));
|
|
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25));
|
|
}
|
|
}
|
|
|
|
public default void updateStandardConnections(World world, TileEntity te) {
|
|
updateStandardConnections(world, te.xCoord, te.yCoord, te.zCoord);
|
|
}
|
|
|
|
public default void updateStandardConnections(World world, int x, int y, int z) {
|
|
|
|
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
|
|
this.trySubscribe(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir);
|
|
}
|
|
}
|
|
}
|