From c53f9c20791aad782457cb060cf4561e4acb8f1a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 28 May 2020 13:37:15 +0200 Subject: [PATCH] Contraption actors and blockzapper screen - Fixed harvesters and drill animating incorrectly on contraptions - Ported blockzapper and worldshaper screen --- .../components/actors/DrillRenderer.java | 19 +++-- .../components/actors/HarvesterRenderer.java | 33 ++++----- .../curiosities/zapper/ZapperScreen.java | 65 ++++++------------ .../assets/create/textures/gui/zapper.png | Bin 10761 -> 10750 bytes 4 files changed, 47 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index ef1774ad4..2ff91b4b0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -7,6 +7,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.SuperByteBuffer; @@ -16,6 +17,7 @@ import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; public class DrillRenderer extends KineticTileEntityRenderer { @@ -25,7 +27,7 @@ public class DrillRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return getRotatingModel(te.getBlockState()); + return AllBlockPartials.DRILL_HEAD.renderOnDirectional(te.getBlockState()); } protected static SuperByteBuffer getRotatingModel(BlockState state) { @@ -36,20 +38,25 @@ public class DrillRenderer extends KineticTileEntityRenderer { IRenderTypeBuffer buffer) { MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; BlockState state = context.state; - SuperByteBuffer superBuffer = getRotatingModel(state); - + SuperByteBuffer superBuffer = AllBlockPartials.DRILL_HEAD.renderOn(state); + Direction facing = state.get(DrillBlock.FACING); + float speed = (float) (context.contraption.stalled || !VecHelper.isVecPointingTowards(context.relativeMotion, state.get(FACING) .getOpposite()) ? context.getAnimationSpeed() : 0); float time = AnimationTickHolder.getRenderTick() / 20; - float angle = (float) (((time * speed) % 360) / 180 * (float) Math.PI); + float angle = (float) (((time * speed) % 360)); for (MatrixStack m : matrixStacks) MatrixStacker.of(m) .centre() - .rotateY(angle) + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)) + .rotateZ(angle) .unCentre(); - superBuffer.light(msLocal.peek() + + superBuffer + .light(msLocal.peek() .getModel()) .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 53168cf56..71ecfdbc6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; @@ -16,7 +16,6 @@ import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -30,42 +29,36 @@ public class HarvesterRenderer extends SafeTileEntityRenderer b.active = true); patternButton.active = false; - patternButton.playDownSound(Minecraft.getInstance().getSoundHandler()); + patternButton.playDownSound(Minecraft.getInstance() + .getSoundHandler()); nbt.putString("Pattern", PlacementPatterns.values()[patternButtons.indexOf(patternButton)].name()); } } @@ -129,50 +127,29 @@ public class ZapperScreen extends AbstractSimiScreen { } protected void renderZapper() { - RenderSystem.pushLightingAttributes(); - RenderSystem.pushMatrix(); - - RenderHelper.enable(); - RenderSystem.enableBlend(); - RenderSystem.enableRescaleNormal(); - RenderSystem.enableAlphaTest(); - RenderSystem.alphaFunc(516, 0.1F); - RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - - RenderSystem.translated((this.width - this.sWidth) / 2 + 260, this.height / 2 - this.sHeight / 4, 100); - RenderSystem.rotatef(90 + 0.2f * animationProgress, 0, 1, 0); - RenderSystem.rotatef(-40, .8f, 0, -.0f); - RenderSystem.scaled(100, -100, 100); - - itemRenderer.renderItem(zapper, TransformType.FIXED, 0xF000F0, OverlayTexture.DEFAULT_UV, new MatrixStack(), getMinecraft().getBufferBuilders().getEntityVertexConsumers()); - - RenderSystem.disableAlphaTest(); - RenderSystem.disableRescaleNormal(); - RenderSystem.disableLighting(); - - RenderSystem.popMatrix(); - RenderSystem.popAttributes(); + GuiGameElement.of(zapper) + .at((this.width - this.sWidth) / 2 + 210, this.height / 2 - this.sHeight / 4) + .scale(4) + .render(); } protected void renderBlock() { RenderSystem.pushMatrix(); - RenderSystem.translated(guiLeft + 1.7f, guiTop - 49, 120); + RenderSystem.translated(guiLeft + 1.7f, guiTop + 48, 120); RenderSystem.rotatef(-30f, .5f, .9f, -.1f); - RenderSystem.scaled(20, -20, 20); + RenderSystem.scaled(20, 20, 20); BlockState state = Blocks.AIR.getDefaultState(); - if (zapper.hasTag() && zapper.getTag().contains("BlockUsed")) - state = NBTUtil.readBlockState(zapper.getTag().getCompound("BlockUsed")); - - RenderSystem.translated(0, -5, 0); - - GuiGameElement.of(state).render(); + if (zapper.hasTag() && zapper.getTag() + .contains("BlockUsed")) + state = NBTUtil.readBlockState(zapper.getTag() + .getCompound("BlockUsed")); + GuiGameElement.of(state) + .render(); RenderSystem.popMatrix(); } - protected void writeAdditionalOptions(CompoundNBT nbt) { - } + protected void writeAdditionalOptions(CompoundNBT nbt) {} } diff --git a/src/main/resources/assets/create/textures/gui/zapper.png b/src/main/resources/assets/create/textures/gui/zapper.png index c7ec82c84a47636a5aa48f4213167bd3150374e1..771941d43398272902f49043a982a8f554a25af2 100644 GIT binary patch delta 9837 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 Lb=hhei_rfAWb`b`