Streamline Chromatics

- Crafters no longer display item sprites vertically flipped
- Crafters now arrange overlapping items less randomly
- Chromatic Compound can now absorb light emitting blocks from belts & depots
This commit is contained in:
simibubi 2021-09-02 23:08:03 +02:00
parent aecd988384
commit 31c951be65
3 changed files with 91 additions and 25 deletions

View file

@ -17,6 +17,7 @@ import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@ -43,14 +44,16 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
ms.pushPose(); ms.pushPose();
Direction facing = te.getBlockState() Direction facing = te.getBlockState()
.getValue(HORIZONTAL_FACING); .getValue(HORIZONTAL_FACING);
Vector3d vec = Vector3d.atLowerCornerOf(facing.getNormal()).scale(.58) Vector3d vec = Vector3d.atLowerCornerOf(facing.getNormal())
.scale(.58)
.add(.5, .5, .5); .add(.5, .5, .5);
if (te.phase == Phase.EXPORTING) { if (te.phase == Phase.EXPORTING) {
Direction targetDirection = MechanicalCrafterBlock.getTargetDirection(te.getBlockState()); Direction targetDirection = MechanicalCrafterBlock.getTargetDirection(te.getBlockState());
float progress = float progress =
MathHelper.clamp((1000 - te.countDown + te.getCountDownSpeed() * partialTicks) / 1000f, 0, 1); MathHelper.clamp((1000 - te.countDown + te.getCountDownSpeed() * partialTicks) / 1000f, 0, 1);
vec = vec.add(Vector3d.atLowerCornerOf(targetDirection.getNormal()).scale(progress * .75f)); vec = vec.add(Vector3d.atLowerCornerOf(targetDirection.getNormal())
.scale(progress * .75f));
} }
ms.translate(vec.x, vec.y, vec.z); ms.translate(vec.x, vec.y, vec.z);
@ -66,10 +69,12 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
public void renderItems(MechanicalCrafterTileEntity te, float partialTicks, MatrixStack ms, public void renderItems(MechanicalCrafterTileEntity te, float partialTicks, MatrixStack ms,
IRenderTypeBuffer buffer, int light, int overlay) { IRenderTypeBuffer buffer, int light, int overlay) {
if (te.phase == Phase.IDLE) { if (te.phase == Phase.IDLE) {
ItemStack stack = te.getInventory().getItem(0); ItemStack stack = te.getInventory()
.getItem(0);
if (!stack.isEmpty()) { if (!stack.isEmpty()) {
ms.pushPose(); ms.pushPose();
ms.translate(0, 0, -1 / 256f); ms.translate(0, 0, -1 / 256f);
ms.mulPose(Vector3f.YP.rotationDegrees(180));
Minecraft.getInstance() Minecraft.getInstance()
.getItemRenderer() .getItemRenderer()
.renderStatic(stack, TransformType.FIXED, light, overlay, ms, buffer); .renderStatic(stack, TransformType.FIXED, light, overlay, ms, buffer);
@ -111,9 +116,16 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
Integer x = pair.getKey(); Integer x = pair.getKey();
Integer y = pair.getValue(); Integer y = pair.getValue();
ms.translate(x * spacing, y * spacing, 0); ms.translate(x * spacing, y * spacing, 0);
int offset = 0;
if (te.phase == Phase.EXPORTING && te.getBlockState().hasProperty(MechanicalCrafterBlock.POINTING)) {
Pointing value = te.getBlockState().getValue(MechanicalCrafterBlock.POINTING);
offset = value == Pointing.UP ? -1 : value == Pointing.LEFT ? 2 : value == Pointing.RIGHT ? -2 : 1;
}
MatrixTransformStack.of(ms) MatrixTransformStack.of(ms)
.nudge(x * 13 + y + te.getBlockPos() .rotateY(180)
.hashCode()); .translate(0, 0, (x + y * 3 + offset * 9) / 1024f );
Minecraft.getInstance() Minecraft.getInstance()
.getItemRenderer() .getItemRenderer()
.renderStatic(stack, TransformType.FIXED, light, overlay, ms, buffer); .renderStatic(stack, TransformType.FIXED, light, overlay, ms, buffer);
@ -141,9 +153,12 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
|| pair.getRight() || pair.getRight()
.intValue() != 0) .intValue() != 0)
return; return;
ms.pushPose();
ms.mulPose(Vector3f.YP.rotationDegrees(180));
Minecraft.getInstance() Minecraft.getInstance()
.getItemRenderer() .getItemRenderer()
.renderStatic(stack, TransformType.FIXED, light, overlay, ms, buffer); .renderStatic(stack, TransformType.FIXED, light, overlay, ms, buffer);
ms.popPose();
}); });
} }
@ -155,10 +170,12 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
BlockState blockState = te.getBlockState(); BlockState blockState = te.getBlockState();
IVertexBuilder vb = buffer.getBuffer(RenderType.solid()); IVertexBuilder vb = buffer.getBuffer(RenderType.solid());
if (!Backend.getInstance().canUseInstancing(te.getLevel())) { if (!Backend.getInstance()
.canUseInstancing(te.getLevel())) {
SuperByteBuffer superBuffer = PartialBufferer.get(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState); SuperByteBuffer superBuffer = PartialBufferer.get(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState);
standardKineticRotationTransform(superBuffer, te, light); standardKineticRotationTransform(superBuffer, te, light);
superBuffer.rotateCentered(Direction.UP, (float) (blockState.getValue(HORIZONTAL_FACING).getAxis() != Direction.Axis.X ? 0 : Math.PI / 2)); superBuffer.rotateCentered(Direction.UP, (float) (blockState.getValue(HORIZONTAL_FACING)
.getAxis() != Direction.Axis.X ? 0 : Math.PI / 2));
superBuffer.rotateCentered(Direction.EAST, (float) (Math.PI / 2)); superBuffer.rotateCentered(Direction.EAST, (float) (Math.PI / 2));
superBuffer.renderInto(ms, vb); superBuffer.renderInto(ms, vb);
} }
@ -167,14 +184,13 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
BlockPos pos = te.getBlockPos(); BlockPos pos = te.getBlockPos();
if ((te.covered || te.phase != Phase.IDLE) && te.phase != Phase.CRAFTING && te.phase != Phase.INSERTING) { if ((te.covered || te.phase != Phase.IDLE) && te.phase != Phase.CRAFTING && te.phase != Phase.INSERTING) {
SuperByteBuffer lidBuffer = SuperByteBuffer lidBuffer = renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_LID, blockState);
renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_LID, blockState); lidBuffer.light(light)
lidBuffer.light(light).renderInto(ms, vb); .renderInto(ms, vb);
} }
if (MechanicalCrafterBlock.isValidTarget(te.getLevel(), pos.relative(targetDirection), blockState)) { if (MechanicalCrafterBlock.isValidTarget(te.getLevel(), pos.relative(targetDirection), blockState)) {
SuperByteBuffer beltBuffer = SuperByteBuffer beltBuffer = renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_BELT, blockState);
renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_BELT, blockState);
SuperByteBuffer beltFrameBuffer = SuperByteBuffer beltFrameBuffer =
renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_BELT_FRAME, blockState); renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_BELT_FRAME, blockState);
@ -183,13 +199,15 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
beltBuffer.shiftUVtoSheet(AllSpriteShifts.CRAFTER_THINGIES, (textureIndex % 4) / 4f, 0, 1); beltBuffer.shiftUVtoSheet(AllSpriteShifts.CRAFTER_THINGIES, (textureIndex % 4) / 4f, 0, 1);
} }
beltBuffer.light(light).renderInto(ms, vb); beltBuffer.light(light)
beltFrameBuffer.light(light).renderInto(ms, vb); .renderInto(ms, vb);
beltFrameBuffer.light(light)
.renderInto(ms, vb);
} else { } else {
SuperByteBuffer arrowBuffer = SuperByteBuffer arrowBuffer = renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_ARROW, blockState);
renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_ARROW, blockState); arrowBuffer.light(light)
arrowBuffer.light(light).renderInto(ms, vb); .renderInto(ms, vb);
} }
} }
@ -197,7 +215,7 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
private SuperByteBuffer renderAndTransform(PartialModel renderBlock, BlockState crafterState) { private SuperByteBuffer renderAndTransform(PartialModel renderBlock, BlockState crafterState) {
SuperByteBuffer buffer = PartialBufferer.get(renderBlock, crafterState); SuperByteBuffer buffer = PartialBufferer.get(renderBlock, crafterState);
float xRot = crafterState.getValue(MechanicalCrafterBlock.POINTING) float xRot = crafterState.getValue(MechanicalCrafterBlock.POINTING)
.getXRotation(); .getXRotation();
float yRot = AngleHelper.horizontalAngle(crafterState.getValue(HORIZONTAL_FACING)); float yRot = AngleHelper.horizontalAngle(crafterState.getValue(HORIZONTAL_FACING));
buffer.rotateCentered(Direction.UP, (float) ((yRot + 90) / 180 * Math.PI)); buffer.rotateCentered(Direction.UP, (float) ((yRot + 90) / 180 * Math.PI));
buffer.rotateCentered(Direction.EAST, (float) ((xRot) / 180 * Math.PI)); buffer.rotateCentered(Direction.EAST, (float) ((xRot) / 180 * Math.PI));

View file

@ -2,15 +2,22 @@ package com.simibubi.create.content.curiosities;
import java.util.Random; import java.util.Random;
import org.apache.commons.lang3.mutable.MutableBoolean;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.CRecipes; import com.simibubi.create.foundation.config.CRecipes;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.utility.Color; import com.simibubi.create.foundation.utility.Color;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
@ -159,6 +166,50 @@ public class ChromaticCompoundItem extends Item {
BlockPos randomOffset = new BlockPos(VecHelper.offsetRandomly(positionVec, r, range)); BlockPos randomOffset = new BlockPos(VecHelper.offsetRandomly(positionVec, r, range));
BlockState state = world.getBlockState(randomOffset); BlockState state = world.getBlockState(randomOffset);
TransportedItemStackHandlerBehaviour behaviour =
TileEntityBehaviour.get(world, randomOffset, TransportedItemStackHandlerBehaviour.TYPE);
// Find a placed light source
if (behaviour == null) {
if (checkLight(stack, entity, world, itemData, positionVec, randomOffset, state))
world.destroyBlock(randomOffset, false);
return false;
}
// Find a light source from a depot/belt (chunk rebuild safe)
MutableBoolean success = new MutableBoolean(false);
behaviour.handleProcessingOnAllItems(ts -> {
ItemStack heldStack = ts.stack;
if (!(heldStack.getItem() instanceof BlockItem))
return TransportedResult.doNothing();
BlockItem blockItem = (BlockItem) heldStack.getItem();
if (blockItem.getBlock() == null)
return TransportedResult.doNothing();
BlockState stateToCheck = blockItem.getBlock()
.defaultBlockState();
if (!success.getValue()
&& checkLight(stack, entity, world, itemData, positionVec, randomOffset, stateToCheck)) {
success.setTrue();
if (ts.stack.getCount() == 1)
return TransportedResult.removeItem();
TransportedItemStack left = ts.copy();
left.stack.shrink(1);
return TransportedResult.convertTo(left);
}
return TransportedResult.doNothing();
});
return false;
}
public boolean checkLight(ItemStack stack, ItemEntity entity, World world, CompoundNBT itemData,
Vector3d positionVec, BlockPos randomOffset, BlockState state) {
if (state.getLightValue(world, randomOffset) == 0) if (state.getLightValue(world, randomOffset) == 0)
return false; return false;
if (state.getDestroySpeed(world, randomOffset) == -1) if (state.getDestroySpeed(world, randomOffset) == -1)
@ -166,14 +217,12 @@ public class ChromaticCompoundItem extends Item {
if (state.getBlock() == Blocks.BEACON) if (state.getBlock() == Blocks.BEACON)
return false; return false;
RayTraceContext context = new RayTraceContext(positionVec, VecHelper.getCenterOf(randomOffset), RayTraceContext context = new RayTraceContext(positionVec.add(new Vector3d(0, 0.5, 0)),
BlockMode.COLLIDER, FluidMode.NONE, entity); VecHelper.getCenterOf(randomOffset), BlockMode.COLLIDER, FluidMode.NONE, entity);
if (!randomOffset.equals(world.clip(context) if (!randomOffset.equals(world.clip(context)
.getBlockPos())) .getBlockPos()))
return false; return false;
world.destroyBlock(randomOffset, false);
ItemStack newStack = stack.split(1); ItemStack newStack = stack.split(1);
newStack.getOrCreateTag() newStack.getOrCreateTag()
.putInt("CollectingLight", itemData.getInt("CollectingLight") + 1); .putInt("CollectingLight", itemData.getInt("CollectingLight") + 1);
@ -184,8 +233,7 @@ public class ChromaticCompoundItem extends Item {
entity.lifespan = 6000; entity.lifespan = 6000;
if (stack.isEmpty()) if (stack.isEmpty())
entity.remove(); entity.remove();
return true;
return false;
} }
} }

View file

@ -19,7 +19,7 @@ public class RefinedRadianceItem extends NoGravMagicalDohickyItem {
protected void onCreated(ItemEntity entity, CompoundNBT persistentData) { protected void onCreated(ItemEntity entity, CompoundNBT persistentData) {
super.onCreated(entity, persistentData); super.onCreated(entity, persistentData);
entity.setDeltaMovement(entity.getDeltaMovement() entity.setDeltaMovement(entity.getDeltaMovement()
.add(0, .15f, 0)); .add(0, .25f, 0));
} }
} }