diff --git a/src/main/java/de/ellpeck/actuallyadditions/api/internal/IAtomicReconstructor.java b/src/main/java/de/ellpeck/actuallyadditions/api/internal/IAtomicReconstructor.java index 4e121a0b6..202fa09bf 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/api/internal/IAtomicReconstructor.java +++ b/src/main/java/de/ellpeck/actuallyadditions/api/internal/IAtomicReconstructor.java @@ -24,4 +24,7 @@ public interface IAtomicReconstructor extends IEnergyTile { Lens getLens(); Direction getOrientation(); + + void resetBeam(int maxAge); + int getTTL(); } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditionsClient.java b/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditionsClient.java index e5dddee9b..75b0336d6 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditionsClient.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditionsClient.java @@ -87,7 +87,7 @@ public class ActuallyAdditionsClient { } private static void setupSpecialRenders() { - ClientRegistry.bindTileEntityRenderer(ActuallyBlocks.ATOMIC_RECONSTRUCTOR.getTileEntityType(), RenderReconstructorLens::new); + ClientRegistry.bindTileEntityRenderer(ActuallyBlocks.ATOMIC_RECONSTRUCTOR.getTileEntityType(), ReconstructorRenderer::new); ClientRegistry.bindTileEntityRenderer(ActuallyBlocks.DISPLAY_STAND.getTileEntityType(), RenderDisplayStand::new); ClientRegistry.bindTileEntityRenderer(ActuallyBlocks.EMPOWERER.getTileEntityType(), RenderEmpowerer::new); ClientRegistry.bindTileEntityRenderer(ActuallyBlocks.BATTERY_BOX.getTileEntityType(), RenderBatteryBox::new); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderReconstructorLens.java b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/ReconstructorRenderer.java similarity index 82% rename from src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderReconstructorLens.java rename to src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/ReconstructorRenderer.java index e98d08c97..b0f0c08b4 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderReconstructorLens.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/ReconstructorRenderer.java @@ -12,6 +12,7 @@ package de.ellpeck.actuallyadditions.mod.blocks.render; import com.mojang.blaze3d.matrix.MatrixStack; import de.ellpeck.actuallyadditions.api.lens.ILensItem; +import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; import de.ellpeck.actuallyadditions.mod.tile.TileEntityAtomicReconstructor; import de.ellpeck.actuallyadditions.mod.util.AssetUtil; import de.ellpeck.actuallyadditions.mod.util.StackUtil; @@ -20,18 +21,25 @@ import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.item.ItemStack; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; import net.minecraft.util.math.vector.Quaternion; -public class RenderReconstructorLens extends TileEntityRenderer { +public class ReconstructorRenderer extends TileEntityRenderer { - public RenderReconstructorLens(TileEntityRendererDispatcher rendererDispatcherIn) { + public ReconstructorRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { super(rendererDispatcherIn); } @Override public void render(TileEntityAtomicReconstructor tile, float partialTicks, MatrixStack matrices, IRenderTypeBuffer buffer, int combinedLight, int combinedOverlay) { ItemStack stack = tile.inv.getStackInSlot(0); + //default color 0x1b6dff + Direction direction = tile.getOrientation(); + float rot = 360.0f - direction.getOpposite().toYRot(); //Sigh... + AssetUtil.renderLaser(matrices, buffer, 0,0,0, rot, 0, 5, 0, 0x1b6dff, 0.8f * tile.getProgress(), 0.2f); + tile.decTTL(); if (!StackUtil.isValid(stack) || !(stack.getItem() instanceof ILensItem)) { return; } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderTypes.java b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderTypes.java new file mode 100644 index 000000000..38eabe2b3 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderTypes.java @@ -0,0 +1,33 @@ +package de.ellpeck.actuallyadditions.mod.blocks.render; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.renderer.RenderState; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.renderer.vertex.VertexFormat; +import org.lwjgl.opengl.GL11; + +public class RenderTypes extends RenderType { + public RenderTypes(String NameIn, VertexFormat FormatIn, int GLMode, int BufferSize, boolean useDelegate, boolean needsSorting, Runnable setupTask, Runnable ClearTask) { + super(NameIn, FormatIn, GLMode, BufferSize, useDelegate, needsSorting, setupTask, ClearTask); + } + +/* public static final RenderType LASER = create("actuallyadditions:laser", DefaultVertexFormats.POSITION_COLOR, + GL11.GL_QUADS, 256, false, true, + RenderType.State.builder() + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setTextureState(NO_TEXTURE) + .setOutputState(RenderType.OUTLINE_TARGET) + .createCompositeState(true));*/ + public static final RenderType LASER = create("actuallyadditions:laser", DefaultVertexFormats.POSITION_COLOR_LIGHTMAP, + GL11.GL_QUADS, 256, false, true, + RenderType.State.builder() + .setTransparencyState(ADDITIVE_TRANSPARENCY) + .setTextureState(NO_TEXTURE) + .setOutputState(RenderType.TRANSLUCENT_TARGET) + .setLightmapState(RenderState.LIGHTMAP) + .setAlphaState(RenderState.DEFAULT_ALPHA) + .setCullState(RenderState.NO_CULL) + .createCompositeState(true)); +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/MethodHandler.java b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/MethodHandler.java index f62aa7242..77befb71c 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/MethodHandler.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/MethodHandler.java @@ -239,7 +239,7 @@ public class MethodHandler implements IMethodHandler { BlockPos hitBlock = tile.getPosition().relative(sideToManipulate, i + 1); if (currentLens.invoke(tile.getWorldObject().getBlockState(hitBlock), hitBlock, tile) || i >= distance - 1) { - TileEntityAtomicReconstructor.shootLaser(tile.getWorldObject(), tile.getX(), tile.getY(), tile.getZ(), hitBlock.getX(), hitBlock.getY(), hitBlock.getZ(), currentLens); + TileEntityAtomicReconstructor.shootLaser(tile, tile.getWorldObject(), tile.getX(), tile.getY(), tile.getZ(), hitBlock.getX(), hitBlock.getY(), hitBlock.getZ(), currentLens); break; } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityAtomicReconstructor.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityAtomicReconstructor.java index 8cdbb5687..5a9f61c84 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityAtomicReconstructor.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityAtomicReconstructor.java @@ -43,6 +43,8 @@ public class TileEntityAtomicReconstructor extends TileEntityInventoryBase imple public int counter; private int currentTime; private int oldEnergy; + private int ttl = 0; + private int maxAge = 0; public TileEntityAtomicReconstructor() { super(ActuallyBlocks.ATOMIC_RECONSTRUCTOR.getTileEntityType(), 1); @@ -52,11 +54,34 @@ public class TileEntityAtomicReconstructor extends TileEntityInventoryBase imple this.lazyEnergy = LazyOptional.of(() -> this.storage); } - public static void shootLaser(World world, double startX, double startY, double startZ, double endX, double endY, double endZ, Lens currentLens) { + public static void shootLaser(IAtomicReconstructor tile, World world, double startX, double startY, double startZ, double endX, double endY, double endZ, Lens currentLens) { world.playSound(null, startX, startY, startZ, SoundHandler.reconstructor, SoundCategory.BLOCKS, 0.35F, 1.0F); AssetUtil.spawnLaserWithTimeServer(world, startX, startY, startZ, endX, endY, endZ, currentLens.getColor(), 25, 0, 0.2F, 0.8F); } + @Override + public int getTTL() { + return this.ttl; + } + + @Override + public void resetBeam(int maxAge) { + this.ttl = maxAge; + this.maxAge = maxAge; + } + + public float getProgress(){ + if (maxAge > 0) + return (float)ttl / (float)maxAge; + else + return 0.0f; + } + + public void decTTL() { + if (this.ttl > 0) + this.ttl--; + } + @Override public void writeSyncableNBT(CompoundNBT compound, NBTType type) { super.writeSyncableNBT(compound, type); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java b/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java index f861e90d1..fe3399fd3 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java @@ -12,23 +12,31 @@ package de.ellpeck.actuallyadditions.mod.util; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.vertex.IVertexBuilder; import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; +import de.ellpeck.actuallyadditions.mod.blocks.render.RenderTypes; import de.ellpeck.actuallyadditions.mod.network.PacketHandler; import de.ellpeck.actuallyadditions.mod.network.PacketServerToClient; import de.ellpeck.actuallyadditions.mod.particle.ParticleBeam; +import de.ellpeck.actuallyadditions.mod.tile.TileEntityAtomicReconstructor; import de.ellpeck.actuallyadditions.mod.tile.TileEntityBase; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.particle.Particle; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.model.ItemCameraTransforms; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.IParticleData; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Matrix4f; import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.vector.Vector3f; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -226,11 +234,72 @@ public final class AssetUtil { @OnlyIn(Dist.CLIENT) public static void spawnLaserWithTimeClient(double startX, double startY, double startZ, double endX, double endY, double endZ, float[] color, int maxAge, double rotationTime, float size, float alpha) { Minecraft mc = Minecraft.getInstance(); + TileEntity tile = mc.level.getBlockEntity(new BlockPos(startX, startY, startZ)); + if(tile instanceof TileEntityAtomicReconstructor) + ((TileEntityAtomicReconstructor) tile).resetBeam(maxAge); - if (mc.player.distanceToSqr(startX, startY, startZ) <= 64 || mc.player.distanceToSqr(endX, endY, endZ) <= 64) { + +/* if (mc.player.distanceToSqr(startX, startY, startZ) <= 64 || mc.player.distanceToSqr(endX, endY, endZ) <= 64) { Particle fx = new ParticleBeam(mc.level, startX, startY, startZ, endX, endY, endZ, color, maxAge, rotationTime, size, alpha); mc.level.addParticle((IParticleData) fx, startX, startY, startZ, 0, 0, 0); + }*/ + } +/* @OnlyIn(Dist.CLIENT) + public static void renderLaser(MatrixStack matrixStack, IRenderTypeBuffer buffer, float x, float y, float z, float tx, float ty, float tz, float rotation, int color, float beamWidth) { + + + }*/ + + @OnlyIn(Dist.CLIENT) + public static void renderLaser(MatrixStack matrixStack, IRenderTypeBuffer buffer, float offX, float offY, float offZ, float yaw, float pitch, float length, float rotationTime, int color, float alpha, float beamWidth) { + World world = Minecraft.getInstance().level; + int r = (color >> 16) & 0xFF; + int g = (color >> 8) & 0xFF; + int b = color & 0xFF; + int a = (int) (alpha * 255); + + int lightmap = LightTexture.pack(MAX_LIGHT_X, MAX_LIGHT_Y); + + float roll = rotationTime > 0.0f ? 360.0f * (world.getGameTime() % rotationTime / rotationTime) : 0.0f; + + IVertexBuilder builder = buffer.getBuffer(RenderTypes.LASER); + matrixStack.pushPose(); + matrixStack.translate(0.5f, 0.5f, 0.5f); + matrixStack.translate(offX, offY, offZ); + + matrixStack.mulPose(Vector3f.YP.rotationDegrees(yaw)); + matrixStack.mulPose(Vector3f.XP.rotationDegrees(pitch)); + matrixStack.mulPose(Vector3f.ZP.rotationDegrees(roll)); + + Matrix4f matrix = matrixStack.last().pose(); + + //Draw laser tube faces + for (int i = 0; i < 4; i++) { + float width = beamWidth * (i / 4.0f); + //top + builder.vertex(matrix, -width, width, 0.0f).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, width, width, 0.0f).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, width, width, -length).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, -width, width, -length).color(r, g, b, a).uv2(lightmap).endVertex(); + //bottom + builder.vertex(matrix, -width, -width, 0.0f).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, -width, -width, -length).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, width, -width, -length).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, width, -width, 0.0f).color(r, g, b, a).uv2(lightmap).endVertex(); + //left + builder.vertex(matrix, -width, width, 0.0f).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, -width, -width, 0.0f).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, -width, -width, -length).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, -width, width, -length).color(r, g, b, a).uv2(lightmap).endVertex(); + //right + builder.vertex(matrix, width, width, 0.0f).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, width, -width, 0.0f).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, width, -width, -length).color(r, g, b, a).uv2(lightmap).endVertex(); + builder.vertex(matrix, width, width, -length).color(r, g, b, a).uv2(lightmap).endVertex(); } + + + matrixStack.popPose(); } //Thanks to feldim2425 for this.