diff --git a/build.gradle b/build.gradle index 51608da..e290863 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ sourceCompatibility = 1.8 targetCompatibility = 1.8 minecraft { - version = "14.22.0.2453" + version = "14.21.1.2420" runDir = "run" replace '${version}', project.version @@ -43,14 +43,18 @@ repositories { url 'http://maven.ic2.player.to/' } maven { - name 'jared maven' - url 'http://blamejared.com/maven' + name 'jared maven' + url 'http://blamejared.com/maven' + } + maven { // Albedo Lights + url 'https://repo.elytradev.com/' } } dependencies { compile "net.industrial-craft:industrialcraft-2:2.8.+" deobfCompile "blusunrize:ImmersiveEngineering:0.12-+:deobf" + deobfCompile 'elucent:albedo:2.0-SNAPSHOT' } jar { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9397848..7b28f0a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip diff --git a/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityMarx.java b/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityMarx.java index f37c27f..a85be09 100644 --- a/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityMarx.java +++ b/src/main/java/malte0811/industrialWires/blocks/hv/TileEntityMarx.java @@ -32,12 +32,13 @@ import blusunrize.immersiveengineering.common.blocks.metal.*; import blusunrize.immersiveengineering.common.blocks.wooden.TileEntityWallmount; import blusunrize.immersiveengineering.common.util.Utils; import blusunrize.immersiveengineering.common.util.chickenbones.Matrix4; +import elucent.albedo.event.GatherLightsEvent; +import elucent.albedo.lighting.Light; import malte0811.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.hv.MarxOreHandler; import malte0811.industrialWires.network.MessageTileSyncIW; import malte0811.industrialWires.util.DualEnergyStorage; @@ -62,21 +63,26 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Optional; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.function.BiConsumer; +import static malte0811.industrialWires.blocks.hv.TileEntityMarx.FiringState.FIRE; import static malte0811.industrialWires.util.MiscUtils.getOffset; import static malte0811.industrialWires.util.MiscUtils.offset; +@Mod.EventBusSubscriber public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, ISyncReceiver, IBlockBoundsIW, IImmersiveConnectable, IIC2Connector, - IRedstoneConnector{ + IRedstoneConnector { + //Only relevant client-side. + private static final Set FIRING_GENERATORS = Collections.newSetFromMap(new WeakHashMap<>()); private static final String TYPE = "type"; private static final String STAGES = "stages"; @@ -93,7 +99,7 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, private int stageCount = 0; public FiringState state = FiringState.CHARGING; @SideOnly(Side.CLIENT) - public TileRenderMarx.Discharge dischargeData; + public Discharge dischargeData; // Voltage=100*storedEU private DualEnergyStorage storage = new DualEnergyStorage(50_000, 32_000); private boolean hasConnection; @@ -103,7 +109,7 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, private boolean loaded = false; private double leftover; - public TileEntityMarx(EnumFacing facing, IWProperties.MarxType type, boolean mirrored) { + TileEntityMarx(EnumFacing facing, IWProperties.MarxType type, boolean mirrored) { this.facing = facing; this.type = type; this.mirrored = mirrored; @@ -201,15 +207,20 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, @Override public void update() { - if (state==FiringState.FIRE) { - state = FiringState.CHARGING; - } else if (state==FiringState.NEXT_TICK) { - state = FiringState.FIRE; - if (world.isRemote) { - IndustrialWires.proxy.playMarxBang(this, getMiddle(), (float) getNormedEnergy(dischargeData.energy)); - } else { - fire(); - } + FIRING_GENERATORS.remove(this); + switch (state) { + case NEXT_TICK: + state = FIRE; + if (world.isRemote) { + FIRING_GENERATORS.add(this); + IndustrialWires.proxy.playMarxBang(this, getMiddle(), (float) getNormedEnergy(dischargeData.energy)); + } else { + fire(); + } + break; + case FIRE: + state = FiringState.CHARGING; + break; } if (!world.isRemote&&type== IWProperties.MarxType.BOTTOM) { if (capVoltages==null||capVoltages.length!=stageCount) { @@ -258,36 +269,45 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, if (!world.isRemote) { //calculate energy double energyStored = 0; + boolean failed = capVoltages[0] toBreak = new ArrayList<>(2*stageCount-2); + Vec3d origin = new Vec3d(bottom).addVector(.5, 1, .5); + Set toBreak = new HashSet<>(dischargeData.vertices.length); int ores = 0; - for (int i = 1;i0) { double energyPerOre = energyStored / ores; @@ -315,7 +335,7 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, } } - public void handleEntities(double energyStored) { + private void handleEntities(double energyStored) { Vec3d v0 = getMiddle(); AxisAlignedBB aabb = new AxisAlignedBB(v0, v0); aabb = aabb.grow(0, stageCount/2-1,0); @@ -365,9 +385,12 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, } //checks whether the given pos can't be broken because it is part of the generator - public boolean canBreak(BlockPos pos) { - BlockPos dischargePos = offset(pos, facing, mirrored, 1, 3, 0); + private boolean canBreak(BlockPos pos) { + BlockPos dischargePos = offset(this.pos, facing, mirrored, 1, 3, 0); Vec3i offset = getOffset(dischargePos, facing, mirrored, pos); + if (offset.getZ()<1||offset.getZ()>=stageCount-1) { + return false; + } return Math.abs(offset.getX())>Math.abs(offset.getY()); } @@ -379,19 +402,31 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, @Override public void onSync(NBTTagCompound nbt) { state = FiringState.NEXT_TICK; - if (dischargeData==null) { - dischargeData = new TileRenderMarx.Discharge(stageCount); + float energy = nbt.getFloat("energy"); + if (energy>0) { + genDischarge(energy, nbt.getInteger("randSeed")); + } else { + if (dischargeData==null) { + dischargeData = new Discharge(stageCount); + } + dischargeData.energy = -1; } - dischargeData.energy = nbt.getFloat("energy"); - dischargeData.diameter = (float) getNormedEnergy(dischargeData.energy); - dischargeData.genMarxPoint(0, dischargeData.vertices.length-1); } - public double getNormedEnergy(double total) { + private void genDischarge(float energy, int seed) { + if (dischargeData==null) { + dischargeData = new Discharge(stageCount); + } + dischargeData.energy = energy; + dischargeData.diameter = (float) getNormedEnergy(dischargeData.energy); + dischargeData.genMarxPoint(seed); + } + + private double getNormedEnergy(double total) { return total*2/(stageCount*MAX_VOLTAGE*MAX_VOLTAGE*CAPACITANCE); } - AxisAlignedBB renderAabb = null; + private AxisAlignedBB renderAabb = null; @Nonnull @Override public AxisAlignedBB getRenderBoundingBox() { @@ -405,7 +440,7 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, } return renderAabb; } - AxisAlignedBB collisionAabb = null; + private AxisAlignedBB collisionAabb = null; @Override public AxisAlignedBB getBoundingBox() { if (collisionAabb ==null) { @@ -602,15 +637,8 @@ public class TileEntityMarx extends TileEntityIWMultiblock implements ITickable, //yellow determines whether a lower charge- than cap0-voltage will discharge the generator master.allowSlowDischarge = master.net.channelValues[4] == 0; } - public void tryTriggeredDischarge() { - if (capVoltages[0]>=8/15D* MAX_VOLTAGE) { - state = FiringState.NEXT_TICK; - } else { - for (int i = 0;i toAdd = new ArrayList<>(te.stageCount*2-3); + if (te.dischargeData!=null&&te.dischargeData.energy>0) { + for (int i = 1;i1) { + genMarxPoint(min, toGenerate, rand); + } + if (max-toGenerate>1) { + genMarxPoint(toGenerate, max, rand); + } + } } } diff --git a/src/main/java/malte0811/industrialWires/client/ClientProxy.java b/src/main/java/malte0811/industrialWires/client/ClientProxy.java index e909b51..a515e13 100644 --- a/src/main/java/malte0811/industrialWires/client/ClientProxy.java +++ b/src/main/java/malte0811/industrialWires/client/ClientProxy.java @@ -245,7 +245,7 @@ public class ClientProxy extends CommonProxy { @Override public float getVolume() { - return .25F; + return .1F; } @Override @@ -308,6 +308,9 @@ public class ClientProxy extends CommonProxy { @Override public void playMarxBang(TileEntityMarx te, Vec3d pos, float energy) { + if (energy<0) { + energy = .05F; + } PositionedSoundRecord sound = new PositionedSoundRecord(marxBang, SoundCategory.BLOCKS, 5*energy, 1, false, 0, ISound.AttenuationType.LINEAR, (float) pos.x, (float) pos.y, (float) pos.z); ClientUtils.mc().getSoundHandler().playSound(sound); playingSounds.put(te.getPos(), sound); diff --git a/src/main/java/malte0811/industrialWires/client/render/TileRenderMarx.java b/src/main/java/malte0811/industrialWires/client/render/TileRenderMarx.java index 7ba296f..96ee385 100644 --- a/src/main/java/malte0811/industrialWires/client/render/TileRenderMarx.java +++ b/src/main/java/malte0811/industrialWires/client/render/TileRenderMarx.java @@ -18,9 +18,9 @@ package malte0811.industrialWires.client.render; -import blusunrize.immersiveengineering.common.util.chickenbones.Matrix4; import malte0811.industrialWires.blocks.IWProperties; import malte0811.industrialWires.blocks.hv.TileEntityMarx; +import malte0811.industrialWires.blocks.hv.TileEntityMarx.Discharge; import malte0811.industrialWires.util.MiscUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; @@ -29,44 +29,52 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; -import net.minecraft.world.World; import org.lwjgl.opengl.GL11; -import org.lwjgl.util.vector.Vector3f; + +import static malte0811.industrialWires.blocks.hv.TileEntityMarx.FiringState.FIRE; public class TileRenderMarx extends TileEntitySpecialRenderer { @Override public void render(TileEntityMarx te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { final boolean debug = false; //noinspection ConstantConditions,PointlessBooleanExpression - if (te.type== IWProperties.MarxType.BOTTOM&&(debug||te.state== TileEntityMarx.FiringState.FIRE)) { - prepare(x, y, z, te); + if (te.type == IWProperties.MarxType.BOTTOM && (debug || te.state == FIRE)) { Tessellator tes = Tessellator.getInstance(); BufferBuilder vb = tes.getBuffer(); - - drawDischarge(te.dischargeData, vb, tes); + prepare(x, y, z, te); + if (te.dischargeData.energy>0) { + drawDischarge(te.dischargeData, vb, tes); + } GlStateManager.popMatrix(); GlStateManager.pushMatrix(); Vec3i offset = MiscUtils.offset(BlockPos.ORIGIN, te.facing, te.mirrored, 1, 1, 0); - GlStateManager.translate(x+offset.getX(), y+offset.getY()+.75, z+offset.getZ()); + GlStateManager.translate(x + offset.getX(), y + offset.getY() + .75, z + offset.getZ()); Vec3i facing = te.facing.getDirectionVec(); final float pos = .6875F; - GlStateManager.translate(-facing.getX()*pos, 0, -facing.getZ()*pos); + GlStateManager.translate(-facing.getX() * pos, 0, -facing.getZ() * pos); //draw firing spark gaps - for (int i = 0;i { tes.draw(); } } - private void drawDischargeSection(Vector3f start, Vector3f end, float diameter, BufferBuilder vb) { + private void drawDischargeSection(Vec3d start, Vec3d end, float diameter, BufferBuilder vb) { drawPart(start, end, diameter/3, diameter/3, WHITE_TRANSPARENT, WHITE, vb); drawPart(start, end, 0, diameter/3, WHITE, WHITE, vb); drawPart(start, end, -diameter/3, diameter/3, WHITE, WHITE_TRANSPARENT, vb); } - private void drawPart(Vector3f start, Vector3f end, float offset, float width, float[] color1, float[] color2, BufferBuilder vb) { + private void drawPart(Vec3d start, Vec3d end, float offset, float width, float[] color1, float[] color2, BufferBuilder vb) { vb.setTranslation(-offset-width/2, 0, 0); vb.pos(start.x, start.y, start.z).color(color1[0], color1[1], color1[2], color1[3]).endVertex(); vb.pos(start.x+width, start.y, start.z).color(color2[0], color2[1], color2[2], color2[3]).endVertex(); @@ -112,64 +120,4 @@ public class TileRenderMarx extends TileEntitySpecialRenderer { vb.pos(end.x, end.y, end.z).color(color1[0], color1[1], color1[2], color1[3]).endVertex(); vb.setTranslation(0, 0, 0); } - public static final class Discharge { - public float energy; - public Vector3f[] vertices; - public float diameter = .25F; - public final int stageCount; - public Discharge(int stages) { - stageCount = stages; - int count = 1; - while (count1) { - genMarxPoint(min, toGenerate); - } - if (max-toGenerate>1) { - genMarxPoint(toGenerate, max); - } - } - } }