From d65621a0b5b68658fb76e1906c916ea0b3509d9d Mon Sep 17 00:00:00 2001 From: malte0811 Date: Fri, 9 Jun 2017 11:37:23 +0200 Subject: [PATCH] Redstone control, other misc Marx generator details --- .../industrialWires/blocks/BlockIWBase.java | 12 ++ .../blocks/TileEntityIWMultiblock.java | 5 + .../blocks/hv/MultiblockMarx.java | 2 +- .../blocks/hv/TileEntityJacobsLadder.java | 2 +- .../blocks/hv/TileEntityMarx.java | 118 +++++++++++++++--- .../client/render/TileRenderMarx.java | 4 +- .../util/DualEnergyStorage.java | 8 +- 7 files changed, 129 insertions(+), 22 deletions(-) diff --git a/src/main/java/malte0811/industrialWires/blocks/BlockIWBase.java b/src/main/java/malte0811/industrialWires/blocks/BlockIWBase.java index 9c95e99..ac2e419 100644 --- a/src/main/java/malte0811/industrialWires/blocks/BlockIWBase.java +++ b/src/main/java/malte0811/industrialWires/blocks/BlockIWBase.java @@ -31,6 +31,7 @@ import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -45,7 +46,9 @@ import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.fml.common.registry.GameRegistry; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Arrays; +import java.util.List; import java.util.Set; public abstract class BlockIWBase extends Block { @@ -138,6 +141,15 @@ public abstract class BlockIWBase extends Block { return super.getBoundingBox(state, source, pos); } + @Override + public void addCollisionBoxToList(IBlockState state, @Nonnull World worldIn, @Nonnull BlockPos pos, @Nonnull AxisAlignedBB entityBox, + @Nonnull List collidingBoxes, @Nullable Entity entityIn, boolean p_185477_7_) { + AxisAlignedBB aabb = getBoundingBox(state, worldIn, pos).offset(pos); + if (entityBox.intersectsWith(aabb)) { + collidingBoxes.add(aabb); + } + } + //mostly copied from IE @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, diff --git a/src/main/java/malte0811/industrialWires/blocks/TileEntityIWMultiblock.java b/src/main/java/malte0811/industrialWires/blocks/TileEntityIWMultiblock.java index 80b650b..15d71ea 100644 --- a/src/main/java/malte0811/industrialWires/blocks/TileEntityIWMultiblock.java +++ b/src/main/java/malte0811/industrialWires/blocks/TileEntityIWMultiblock.java @@ -60,6 +60,11 @@ public abstract class TileEntityIWMultiblock extends TileEntityIWBase { } return null; } + @Nonnull + public T masterOr(T here, @Nonnull T def) { + T master = master(here); + return master!=null?master:def; + } public void disassemble() { if(formed && !world.isRemote) diff --git a/src/main/java/malte0811/industrialWires/blocks/hv/MultiblockMarx.java b/src/main/java/malte0811/industrialWires/blocks/hv/MultiblockMarx.java index 40e0afd..e87e162 100644 --- a/src/main/java/malte0811/industrialWires/blocks/hv/MultiblockMarx.java +++ b/src/main/java/malte0811/industrialWires/blocks/hv/MultiblockMarx.java @@ -253,7 +253,7 @@ public class MultiblockMarx implements IMultiblock { TileEntity te = world.getTileEntity(p); if (te instanceof TileEntityMarx) { TileEntityMarx marx = (TileEntityMarx) te; - marx.stageCount = stages; + marx.setStageCount(stages); marx.offset = p.subtract(origin); marx.formed = true; marx.markDirty(); diff --git a/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityJacobsLadder.java b/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityJacobsLadder.java index 15563cf..f550478 100644 --- a/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityJacobsLadder.java +++ b/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityJacobsLadder.java @@ -203,7 +203,7 @@ public class TileEntityJacobsLadder extends TileEntityIEBase implements ITickabl initControl(); } dummy = nbt.getInteger("dummy"); - energy = DualEnergyStorage.readFromNBT(nbt.getCompoundTag("energy")); + energy.readFromNBT(nbt.getCompoundTag("energy")); facing = EnumFacing.HORIZONTALS[nbt.getInteger("facing")]; salt = nbt.getDouble("salt"); } diff --git a/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityMarx.java b/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityMarx.java index 1bcc6ed..ad88bd4 100644 --- a/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityMarx.java +++ b/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityMarx.java @@ -31,11 +31,13 @@ import blusunrize.immersiveengineering.common.blocks.metal.*; import blusunrize.immersiveengineering.common.util.chickenbones.Matrix4; import ic2.api.item.IC2Items; import malte0811.industrialWires.IIC2Connector; +import malte0811.industrialWires.IndustrialWires; import malte0811.industrialWires.blocks.IBlockBoundsIW; import malte0811.industrialWires.blocks.ISyncReceiver; import malte0811.industrialWires.blocks.IWProperties; import malte0811.industrialWires.blocks.TileEntityIWMultiblock; import malte0811.industrialWires.client.render.TileRenderMarx; +import malte0811.industrialWires.network.MessageTileSyncIW; import malte0811.industrialWires.util.DualEnergyStorage; import malte0811.industrialWires.util.MiscUtils; import malte0811.industrialWires.wires.IC2Wiretype; @@ -44,6 +46,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; @@ -69,14 +72,24 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, private static final String TYPE = "type"; private static final String STAGES = "stages"; private static final String HAS_CONN = "hasConn"; + private static final String CAP_VOLTAGES = "capVoltages"; + private double rcTimeConst; + private double timeFactor; + private double cReciproke = 1_000_000; + private double maxVoltage = 250_000; public IWProperties.MarxType type = IWProperties.MarxType.NO_MODEL; - public int stageCount = 0; + private int stageCount = 0; public FiringState state = FiringState.CHARGING; @SideOnly(Side.CLIENT) public TileRenderMarx.Discharge dischargeData; - private DualEnergyStorage storage = new DualEnergyStorage(10000, 1000); + // Voltage=100*storedEU + private DualEnergyStorage storage = new DualEnergyStorage(10_000, 8192); private boolean hasConnection; + private double[] capVoltages; + //RS channel 1/white + private int voltageControl = 0; + private boolean loaded = false; public TileEntityMarx(EnumFacing facing, IWProperties.MarxType type, boolean mirrored) { this.facing = facing; @@ -98,8 +111,13 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, public void readNBT(NBTTagCompound in, boolean updatePacket) { super.readNBT(in, updatePacket); type = IWProperties.MarxType.values()[in.getInteger(TYPE)]; - stageCount = in.getInteger(STAGES); - storage = DualEnergyStorage.readFromNBT(in.getCompoundTag(ENERGY_TAG)); + setStageCount(in.getInteger(STAGES)); + NBTTagList voltages = in.getTagList(CAP_VOLTAGES, 6);//DOUBLE + capVoltages = new double[stageCount]; + for (int i = 0;i0;i--) { + double oldVoltage = capVoltages[i]; + double u0 = capVoltages[i-1]; + capVoltages[i] = u0-(u0-oldVoltage)*timeFactor; + capVoltages[i-1] -= capVoltages[i]-oldVoltage; + } + //charge bottom cap from storage + double u0 = 250_000*voltageControl/15D; + if (u0<=100*storage.getEnergyStoredEU()) { + double oldVoltage = capVoltages[0]; + capVoltages[0] = u0 - (u0 - oldVoltage) * timeFactor; + double energyUsed = (capVoltages[0] * capVoltages[0] - oldVoltage * oldVoltage)/cReciproke; + if (energyUsed > 0) {// energyUsed can be negative when discharging the caps + storage.extractEURaw(energyUsed); + } + double vMax = 250_000; + if (Math.round(15*oldVoltage/vMax)!=Math.round(15*capVoltages[0]/vMax)) { + net.updateValues(); + } else if (Math.round(15*oldTopVoltage/vMax)!=Math.round(15*capVoltages[stageCount-1]/vMax)) { + net.updateValues(); + } + if (capVoltages[0] > 250_000 * 14 / 15) { + state = FiringState.NEXT_TICK; + } } } } @@ -204,7 +256,7 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, dischargeData = new TileRenderMarx.Discharge(stageCount); } dischargeData.energy = nbt.getFloat("energy"); - dischargeData.diameter = dischargeData.energy/(stageCount*15*15); + dischargeData.diameter = dischargeData.energy/(stageCount*250*250); dischargeData.genMarxPoint(0, dischargeData.vertices.length-1); } @@ -225,7 +277,7 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, private AxisAlignedBB boundingAabb = null; @Override public AxisAlignedBB getBoundingBox() { - if (boundingAabb==null||true) { + if (boundingAabb==null) { int forward = getForward(); int right = getRight(); int up = offset.getY(); @@ -389,20 +441,39 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, return getRaytraceOffset(null); } - private RedstoneWireNetwork net = new RedstoneWireNetwork().add(this); + private RedstoneWireNetwork net = new RedstoneWireNetwork(); @Override public void setNetwork(RedstoneWireNetwork net) { - this.net = net; + masterOr(this, this).net = net; } @Override public RedstoneWireNetwork getNetwork() { - return net; + TileEntityMarx master = masterOr(this, this); + if (!loaded) { + master.net.add(this); + loaded = true; + } + return master.net; } @Override public void onChange() { - //TODO + TileEntityMarx master = masterOr(this, this); + master.voltageControl = master.net.channelValues[0]; + if (master.net.channelValues[3]!=0) {//light blue is firing trigger + master.tryTriggeredDischarge(); + } + } + public void tryTriggeredDischarge() { + if (capVoltages[0]>=8/15D*maxVoltage) { + state = FiringState.NEXT_TICK; + } else { + for (int i = 0;i { @Override public void renderTileEntityAt(TileEntityMarx te, double x, double y, double z, float partialTicks, int destroyStage) { final boolean debug = false; - //noinspection PointlessBooleanExpression + //noinspection ConstantConditions,PointlessBooleanExpression if (te.type== IWProperties.MarxType.BOTTOM&&(debug||te.state== TileEntityMarx.FiringState.FIRE)) { prepare(x, y, z, te); Tessellator tes = Tessellator.getInstance(); @@ -53,7 +53,7 @@ public class TileRenderMarx extends TileEntitySpecialRenderer { final float pos = .6875F; GlStateManager.translate(-facing.getX()*pos, 0, -facing.getZ()*pos); //draw firing spark gaps - for (int i = 0;i