Merge remote-tracking branch 'concealed/mc1.20.1/feature-dev' into mc1.20.1/feature-dev

This commit is contained in:
IThundxr 2025-01-21 11:37:13 -05:00
commit 60076e49c1
No known key found for this signature in database
26 changed files with 732 additions and 100 deletions

View file

@ -22,12 +22,12 @@ use_parchment = true
# dependency versions
registrate_version = MC1.20-1.3.3
flywheel_minecraft_version = 1.20.1
flywheel_version = 1.0.0-beta-182
flywheel_version = 1.0.0-beta-184
jei_minecraft_version = 1.20.1
jei_version = 15.10.0.39
curios_minecraft_version = 1.20.1
curios_version = 5.3.1
ponder_version = 0.9.18
ponder_version = 0.9.19
mixin_extras_version = 0.4.1
cc_tweaked_enable = true

View file

@ -174,6 +174,7 @@ import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEnt
import com.simibubi.create.content.logistics.packagePort.postbox.PostboxRenderer;
import com.simibubi.create.content.logistics.packager.PackagerBlockEntity;
import com.simibubi.create.content.logistics.packager.PackagerRenderer;
import com.simibubi.create.content.logistics.packager.PackagerVisual;
import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlockEntity;
import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity;
import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlockEntity;
@ -497,12 +498,14 @@ public class AllBlockEntityTypes {
public static final BlockEntityEntry<PackagerBlockEntity> PACKAGER = REGISTRATE
.blockEntity("packager", PackagerBlockEntity::new)
.visual(() -> PackagerVisual::new, true)
.validBlocks(AllBlocks.PACKAGER)
.renderer(() -> PackagerRenderer::new)
.register();
public static final BlockEntityEntry<RepackagerBlockEntity> REPACKAGER = REGISTRATE
.blockEntity("repackager", RepackagerBlockEntity::new)
.visual(() -> PackagerVisual::new, true)
.validBlocks(AllBlocks.REPACKAGER)
.renderer(() -> PackagerRenderer::new)
.register();

View file

@ -16,6 +16,7 @@ import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileEntity
import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileRenderer;
import com.simibubi.create.content.logistics.box.PackageEntity;
import com.simibubi.create.content.logistics.box.PackageRenderer;
import com.simibubi.create.content.logistics.box.PackageVisual;
import com.simibubi.create.content.trains.entity.CarriageContraptionEntity;
import com.simibubi.create.content.trains.entity.CarriageContraptionEntityRenderer;
import com.simibubi.create.content.trains.entity.CarriageContraptionVisual;
@ -71,7 +72,9 @@ public class AllEntityTypes {
MobCategory.MISC, 5, Integer.MAX_VALUE, false, true, SeatEntity::build).register();
public static final EntityEntry<PackageEntity> PACKAGE = register("package", PackageEntity::new, () -> PackageRenderer::new,
MobCategory.MISC, 10, 3, true, false, PackageEntity::build).register();
MobCategory.MISC, 10, 3, true, false, PackageEntity::build)
.visual(() -> PackageVisual::new, true)
.register();
//

View file

@ -126,7 +126,8 @@ public class AllPartialModels {
EJECTOR_TOP = block("weighted_ejector/top"),
CHAIN_CONVEYOR_GUARD = block("chain_conveyor/guard"), CHAIN_CONVEYOR_SHAFT = block("chain_conveyor/shaft"),
CHAIN_CONVEYOR_WHEEL = block("chain_conveyor/wheel"), CHAIN_CONVEYOR_GUARD = block("chain_conveyor/guard"),
CHAIN_CONVEYOR_SHAFT = block("chain_conveyor/shaft"),
FROGPORT_BODY = block("package_frogport/body"), FROGPORT_HEAD = block("package_frogport/head"),
FROGPORT_TONGUE = block("package_frogport/tongue"),

View file

@ -15,6 +15,7 @@ import net.minecraft.core.Direction.Axis;
import net.minecraft.util.Mth;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.SlabBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.StairBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.Half;
@ -110,8 +111,9 @@ public class RoofBlockCTBehaviour extends ConnectedTextureBehaviour.Base {
protected boolean connects(BlockAndTintGetter reader, BlockPos pos, BlockState state, BlockState other) {
double top = state.getCollisionShape(reader, pos)
.max(Axis.Y);
double topOther = other.getCollisionShape(reader, pos)
.max(Axis.Y);
double topOther = other.getSoundType() != SoundType.COPPER ? 0
: other.getCollisionShape(reader, pos)
.max(Axis.Y);
return Mth.equal(top, topOther);
}

View file

@ -3,7 +3,6 @@ package com.simibubi.create.content.kinetics.chainConveyor;
import java.util.List;
import java.util.Map.Entry;
import net.createmod.catnip.animation.AnimationTickHolder;
import org.joml.Matrix3f;
import org.joml.Matrix4f;
@ -18,10 +17,11 @@ import com.simibubi.create.foundation.render.RenderTypes;
import dev.engine_room.flywheel.api.visualization.VisualizationManager;
import dev.engine_room.flywheel.lib.transform.TransformStack;
import net.createmod.catnip.animation.AnimationTickHolder;
import net.createmod.catnip.math.AngleHelper;
import net.createmod.catnip.math.VecHelper;
import net.createmod.catnip.render.CachedBuffers;
import net.createmod.catnip.render.SuperByteBuffer;
import net.createmod.catnip.math.VecHelper;
import net.createmod.catnip.math.AngleHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource;
@ -58,6 +58,11 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer<ChainConve
if (VisualizationManager.supportsVisualization(be.getLevel()))
return;
CachedBuffers.partial(AllPartialModels.CHAIN_CONVEYOR_WHEEL, be.getBlockState())
.light(light)
.overlay(overlay)
.renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped()));
for (ChainConveyorPackage box : be.loopingPackages)
renderBox(be, ms, buffer, overlay, pos, box, partialTicks);
for (Entry<BlockPos, List<ChainConveyorPackage>> entry : be.travellingPackages.entrySet())

View file

@ -147,8 +147,17 @@ public class ChainConveyorVisual extends SingleAxisRotatingVisual<ChainConveyorB
private void setupGuards() {
deleteGuards();
var wheelInstancer = instancerProvider().instancer(InstanceTypes.TRANSFORMED, SpecialModels.chunkDiffuse(AllPartialModels.CHAIN_CONVEYOR_WHEEL));
var guardInstancer = instancerProvider().instancer(InstanceTypes.TRANSFORMED, SpecialModels.chunkDiffuse(AllPartialModels.CHAIN_CONVEYOR_GUARD));
TransformedInstance wheel = wheelInstancer.createInstance();
wheel.translate(getVisualPosition())
.light(rotatingModel.light)
.setChanged();
guards.add(wheel);
for (BlockPos blockPos : blockEntity.connections) {
ChainConveyorBlockEntity.ConnectionStats stats = blockEntity.connectionStats.get(blockPos);
if (stats == null) {

View file

@ -366,11 +366,8 @@ public class PackageItem extends Item {
SoundSource.NEUTRAL, 0.5F, 0.5F);
ItemStack copy = stack.copy();
stack.shrink(1);
if (stack.isEmpty())
player.getInventory()
.removeItem(stack);
if (!player.getAbilities().instabuild)
stack.shrink(1);
Vec3 vec = new Vec3(entity.getX(), entity.getY() + entity.getBoundingBox()
.getYsize() / 2f, entity.getZ());

View file

@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllPartialModels;
import dev.engine_room.flywheel.api.backend.BackendManager;
import dev.engine_room.flywheel.lib.model.baked.PartialModel;
import net.createmod.catnip.render.CachedBuffers;
import net.createmod.catnip.render.SuperByteBuffer;
@ -28,11 +29,12 @@ public class PackageRenderer extends EntityRenderer<PackageEntity> {
@Override
public void render(PackageEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, int light) {
ItemStack box = entity.box;
if (box.isEmpty() || !PackageItem.isPackage(box))
box = AllBlocks.CARDBOARD_BLOCK.asStack();
PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem()));
renderBox(entity, yaw, ms, buffer, light, model);
if (!BackendManager.isBackendOn()) {
ItemStack box = entity.box;
if (box.isEmpty() || !PackageItem.isPackage(box)) box = AllBlocks.CARDBOARD_BLOCK.asStack();
PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem()));
renderBox(entity, yaw, ms, buffer, light, model);
}
super.render(entity, yaw, pt, ms, buffer, light);
}

View file

@ -0,0 +1,69 @@
package com.simibubi.create.content.logistics.box;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllPartialModels;
import dev.engine_room.flywheel.api.visualization.VisualizationContext;
import dev.engine_room.flywheel.lib.instance.InstanceTypes;
import dev.engine_room.flywheel.lib.instance.TransformedInstance;
import dev.engine_room.flywheel.lib.model.Models;
import dev.engine_room.flywheel.lib.model.baked.PartialModel;
import dev.engine_room.flywheel.lib.transform.Translate;
import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual;
import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.registries.ForgeRegistries;
public class PackageVisual extends AbstractEntityVisual<PackageEntity> implements SimpleDynamicVisual {
public final TransformedInstance instance;
public PackageVisual(VisualizationContext ctx, PackageEntity entity, float partialTick) {
super(ctx, entity, partialTick);
ItemStack box = entity.box;
if (box.isEmpty() || !PackageItem.isPackage(box))
box = AllBlocks.CARDBOARD_BLOCK.asStack();
PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem()));
instance = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(model))
.createInstance();
animate(partialTick);
}
@Override
public void beginFrame(Context ctx) {
animate(ctx.partialTick());
}
private void animate(float partialTick) {
float yaw = Mth.lerp(partialTick, entity.yRotO, entity.getYRot());
Vec3 pos = PackageVisual.this.entity.position();
var renderOrigin = renderOrigin();
var x = (float) (Mth.lerp(partialTick, this.entity.xo, pos.x) - renderOrigin.getX());
var y = (float) (Mth.lerp(partialTick, this.entity.yo, pos.y) - renderOrigin.getY());
var z = (float) (Mth.lerp(partialTick, this.entity.zo, pos.z) - renderOrigin.getZ());
long randomBits = (long) entity.getId() * 31L * 493286711L;
randomBits = randomBits * randomBits * 4392167121L + randomBits * 98761L;
float xNudge = (((float) (randomBits >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F;
float yNudge = (((float) (randomBits >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F;
float zNudge = (((float) (randomBits >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F;
instance.setIdentityTransform()
.translate(x - 0.5 + xNudge, y + yNudge, z - 0.5 + zNudge)
.rotateYCenteredDegrees(yaw)
.light(computePackedLight(partialTick))
.setChanged();
}
@Override
protected void _delete() {
instance.delete();
}
}

View file

@ -15,8 +15,8 @@ import com.simibubi.create.foundation.block.IBE;
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
import com.simibubi.create.foundation.utility.CreateLang;
import net.createmod.catnip.math.VecHelper;
import net.createmod.catnip.math.AngleHelper;
import net.createmod.catnip.math.VecHelper;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
@ -48,6 +48,7 @@ import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.EntityCollisionContext;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.common.ForgeMod;
@ -147,7 +148,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock
Player player = context.getPlayer();
PanelSlot slot = getTargetedSlot(pos, state, context.getClickLocation());
if (!(world instanceof ServerLevel serverLevel))
if (!(world instanceof ServerLevel))
return InteractionResult.SUCCESS;
return onBlockEntityUse(world, pos, be -> {
@ -294,6 +295,8 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock
@Override
public VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos,
CollisionContext pContext) {
if (pContext instanceof EntityCollisionContext ecc && ecc.getEntity() == null)
return getShape(pState, pLevel, pPos, pContext);
return Shapes.empty();
}

View file

@ -10,7 +10,9 @@ import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Mth;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
public class FactoryPanelConnection {
@ -49,58 +51,91 @@ public class FactoryPanelConnection {
return nbt;
}
public List<Direction> getPath(BlockState state, FactoryPanelPosition to) {
public List<Direction> getPath(Level level, BlockState state, FactoryPanelPosition to) {
if (!path.isEmpty() && arrowBendModeCurrentPathUses == arrowBendMode)
return path;
boolean findSuitable = arrowBendMode == -1;
arrowBendModeCurrentPathUses = arrowBendMode;
path.clear();
Vec3 diff = calculatePathDiff(state, to);
BlockPos toTravelFirst = BlockPos.ZERO;
BlockPos toTravelLast = BlockPos.containing(diff.scale(2)
.add(0.1, 0.1, 0.1));
FactoryPanelBehaviour fromBehaviour = FactoryPanelBehaviour.at(level, to);
final Vec3 diff = calculatePathDiff(state, to);
final Vec3 start = fromBehaviour != null ? fromBehaviour.getSlotPositioning()
.getLocalOffset(level, to.pos(), state)
.add(Vec3.atLowerCornerOf(to.pos())) : Vec3.ZERO;
final float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state);
final float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state);
if (arrowBendMode > 1) {
boolean flipX = diff.x > 0 ^ (arrowBendMode % 2 == 1);
boolean flipZ = diff.z > 0 ^ (arrowBendMode % 2 == 0);
int ceilX = Mth.positiveCeilDiv(toTravelLast.getX(), 2);
int ceilZ = Mth.positiveCeilDiv(toTravelLast.getZ(), 2);
int floorZ = Mth.floorDiv(toTravelLast.getZ(), 2);
int floorX = Mth.floorDiv(toTravelLast.getX(), 2);
toTravelFirst = new BlockPos(flipX ? floorX : ceilX, 0, flipZ ? floorZ : ceilZ);
toTravelLast = new BlockPos(!flipX ? floorX : ceilX, 0, !flipZ ? floorZ : ceilZ);
}
// When mode is not locked, find one that doesnt intersect with other gauges
ModeFinder: for (int actualMode = 0; actualMode <= 4; actualMode++) {
path.clear();
if (!findSuitable && actualMode != arrowBendMode)
continue;
boolean desperateOption = actualMode == 4;
Direction lastDirection = null;
Direction currentDirection = null;
BlockPos toTravelFirst = BlockPos.ZERO;
BlockPos toTravelLast = BlockPos.containing(diff.scale(2)
.add(0.1, 0.1, 0.1));
for (BlockPos toTravel : List.of(toTravelFirst, toTravelLast)) {
boolean zIsPreferred =
arrowBendMode == -1 ? (Math.abs(toTravel.getZ()) > Math.abs(toTravel.getX())) : arrowBendMode % 2 == 1;
List<Direction> directionOrder =
zIsPreferred ? List.of(Direction.SOUTH, Direction.NORTH, Direction.WEST, Direction.EAST)
: List.of(Direction.WEST, Direction.EAST, Direction.SOUTH, Direction.NORTH);
for (int i = 0; i < 100; i++) {
if (toTravel.equals(BlockPos.ZERO))
break;
for (Direction d : directionOrder) {
if (lastDirection != null && d == lastDirection.getOpposite())
continue;
if (currentDirection == null || toTravel.relative(d)
.distManhattan(BlockPos.ZERO) < toTravel.relative(currentDirection)
.distManhattan(BlockPos.ZERO))
currentDirection = d;
}
lastDirection = currentDirection;
toTravel = toTravel.relative(currentDirection);
path.add(currentDirection);
if (actualMode > 1) {
boolean flipX = diff.x > 0 ^ (actualMode % 2 == 1);
boolean flipZ = diff.z > 0 ^ (actualMode % 2 == 0);
int ceilX = Mth.positiveCeilDiv(toTravelLast.getX(), 2);
int ceilZ = Mth.positiveCeilDiv(toTravelLast.getZ(), 2);
int floorZ = Mth.floorDiv(toTravelLast.getZ(), 2);
int floorX = Mth.floorDiv(toTravelLast.getX(), 2);
toTravelFirst = new BlockPos(flipX ? floorX : ceilX, 0, flipZ ? floorZ : ceilZ);
toTravelLast = new BlockPos(!flipX ? floorX : ceilX, 0, !flipZ ? floorZ : ceilZ);
}
}
Direction lastDirection = null;
Direction currentDirection = null;
for (BlockPos toTravel : List.of(toTravelFirst, toTravelLast)) {
boolean zIsFarther = Math.abs(toTravel.getZ()) > Math.abs(toTravel.getX());
boolean zIsPreferred = desperateOption ? zIsFarther : actualMode % 2 == 1;
List<Direction> directionOrder =
zIsPreferred ? List.of(Direction.SOUTH, Direction.NORTH, Direction.WEST, Direction.EAST)
: List.of(Direction.WEST, Direction.EAST, Direction.SOUTH, Direction.NORTH);
for (int i = 0; i < 100; i++) {
if (toTravel.equals(BlockPos.ZERO))
break;
for (Direction d : directionOrder) {
if (lastDirection != null && d == lastDirection.getOpposite())
continue;
if (currentDirection == null || toTravel.relative(d)
.distManhattan(BlockPos.ZERO) < toTravel.relative(currentDirection)
.distManhattan(BlockPos.ZERO))
currentDirection = d;
}
lastDirection = currentDirection;
toTravel = toTravel.relative(currentDirection);
path.add(currentDirection);
}
}
if (findSuitable && !desperateOption) {
BlockPos travelled = BlockPos.ZERO;
for (int i = 0; i < path.size() - 1; i++) {
Direction d = path.get(i);
travelled = travelled.relative(d);
Vec3 testOffset = Vec3.atLowerCornerOf(travelled)
.scale(0.5);
testOffset = VecHelper.rotate(testOffset, 180, Axis.Y);
testOffset = VecHelper.rotate(testOffset, xRot + 90, Axis.X);
testOffset = VecHelper.rotate(testOffset, yRot, Axis.Y);
Vec3 v = start.add(testOffset);
if (!level.noCollision(new AABB(v, v).inflate(1 / 128f)))
continue ModeFinder;
}
}
break;
}
return path;
}

View file

@ -86,7 +86,7 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer<FactoryPanelB
public static void renderPath(FactoryPanelBehaviour behaviour, FactoryPanelConnection connection,
float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) {
BlockState blockState = behaviour.blockEntity.getBlockState();
List<Direction> path = connection.getPath(blockState, behaviour.getPanelPosition());
List<Direction> path = connection.getPath(behaviour.getWorld(), blockState, behaviour.getPanelPosition());
float xRot = FactoryPanelBlock.getXRot(blockState) + Mth.PI / 2;
float yRot = FactoryPanelBlock.getYRot(blockState);

View file

@ -5,6 +5,8 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer;
import dev.engine_room.flywheel.api.backend.BackendManager;
import dev.engine_room.flywheel.api.model.Model;
import dev.engine_room.flywheel.lib.model.baked.PartialModel;
import dev.engine_room.flywheel.lib.transform.TransformStack;
import net.createmod.catnip.render.CachedBuffers;
@ -33,36 +35,35 @@ public class PackagerRenderer extends SmartBlockEntityRenderer<PackagerBlockEnti
ItemStack renderedBox = be.getRenderedBox();
float trayOffset = be.getTrayOffset(partialTicks);
boolean hatchOpen = be.animationTicks > (be.animationInward ? 1 : 5)
&& be.animationTicks < PackagerBlockEntity.CYCLE - (be.animationInward ? 5 : 1);
BlockState blockState = be.getBlockState();
Direction facing = blockState.getValue(PackagerBlock.FACING)
.getOpposite();
PartialModel hatchModel =
hatchOpen ? AllPartialModels.PACKAGER_HATCH_OPEN : AllPartialModels.PACKAGER_HATCH_CLOSED;
if (!BackendManager.isBackendOn()) {
var hatchModel = getHatchModel(be);
SuperByteBuffer sbb = CachedBuffers.partial(hatchModel, blockState);
sbb.translate(Vec3.atLowerCornerOf(facing.getNormal())
.scale(.49999f))
.rotateCentered(AngleHelper.rad(AngleHelper.horizontalAngle(facing)), Direction.UP)
.rotateCentered(AngleHelper.rad(AngleHelper.verticalAngle(facing)), Direction.EAST)
.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.solid()));
SuperByteBuffer sbb = CachedBuffers.partial(hatchModel, blockState);
sbb.translate(Vec3.atLowerCornerOf(facing.getNormal())
.scale(.49999f))
.rotateYCenteredDegrees(AngleHelper.horizontalAngle(facing))
.rotateXCenteredDegrees(AngleHelper.verticalAngle(facing))
.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.solid()));
ms.pushPose();
var msr = TransformStack.of(ms);
msr.translate(Vec3.atLowerCornerOf(facing.getNormal())
.scale(trayOffset));
sbb = CachedBuffers.partial(AllBlocks.PACKAGER.has(blockState) ? AllPartialModels.PACKAGER_TRAY_REGULAR
: AllPartialModels.PACKAGER_TRAY_DEFRAG, blockState);
sbb.rotateCentered(AngleHelper.rad(facing.toYRot()), Direction.UP)
.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped()));
sbb = CachedBuffers.partial(getTrayModel(blockState), blockState);
sbb.translate(Vec3.atLowerCornerOf(facing.getNormal())
.scale(trayOffset))
.rotateYCenteredDegrees(facing.toYRot())
.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped()));
}
if (!renderedBox.isEmpty()) {
msr.translate(.5f, .5f, .5f)
ms.pushPose();
var msr = TransformStack.of(ms);
msr.translate(Vec3.atLowerCornerOf(facing.getNormal())
.scale(trayOffset))
.translate(.5f, .5f, .5f)
.rotateYDegrees(facing.toYRot())
.translate(0, 2 / 16f, 0)
.scale(1.49f, 1.49f, 1.49f);
@ -70,9 +71,22 @@ public class PackagerRenderer extends SmartBlockEntityRenderer<PackagerBlockEnti
.getItemRenderer()
.renderStatic(null, renderedBox, ItemDisplayContext.FIXED, false, ms, buffer, be.getLevel(), light,
overlay, 0);
ms.popPose();
}
}
ms.popPose();
public static PartialModel getTrayModel(BlockState blockState) {
return AllBlocks.PACKAGER.has(blockState) ? AllPartialModels.PACKAGER_TRAY_REGULAR
: AllPartialModels.PACKAGER_TRAY_DEFRAG;
}
public static PartialModel getHatchModel(PackagerBlockEntity be) {
return isHatchOpen(be) ? AllPartialModels.PACKAGER_HATCH_OPEN : AllPartialModels.PACKAGER_HATCH_CLOSED;
}
public static boolean isHatchOpen(PackagerBlockEntity be) {
return be.animationTicks > (be.animationInward ? 1 : 5)
&& be.animationTicks < PackagerBlockEntity.CYCLE - (be.animationInward ? 5 : 1);
}
}

View file

@ -0,0 +1,102 @@
package com.simibubi.create.content.logistics.packager;
import java.util.function.Consumer;
import org.jetbrains.annotations.Nullable;
import dev.engine_room.flywheel.api.instance.Instance;
import dev.engine_room.flywheel.api.visualization.VisualizationContext;
import dev.engine_room.flywheel.lib.instance.InstanceTypes;
import dev.engine_room.flywheel.lib.instance.TransformedInstance;
import dev.engine_room.flywheel.lib.model.Models;
import dev.engine_room.flywheel.lib.model.baked.PartialModel;
import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual;
import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual;
import net.createmod.catnip.math.AngleHelper;
import net.minecraft.core.Direction;
import net.minecraft.world.phys.Vec3;
public class PackagerVisual<T extends PackagerBlockEntity> extends AbstractBlockEntityVisual<T> implements SimpleDynamicVisual {
public final TransformedInstance hatch;
public final TransformedInstance tray;
public float lastTrayOffset = Float.NaN;
public PartialModel lastHatchPartial;
public PackagerVisual(VisualizationContext ctx, T blockEntity, float partialTick) {
super(ctx, blockEntity, partialTick);
lastHatchPartial = PackagerRenderer.getHatchModel(blockEntity);
hatch = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(lastHatchPartial))
.createInstance();
tray = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(PackagerRenderer.getTrayModel(blockState)))
.createInstance();
Direction facing = blockState.getValue(PackagerBlock.FACING)
.getOpposite();
var lowerCorner = Vec3.atLowerCornerOf(facing.getNormal());
hatch.setIdentityTransform()
.translate(getVisualPosition())
.translate(lowerCorner
.scale(.49999f))
.rotateYCenteredDegrees(AngleHelper.horizontalAngle(facing))
.rotateXCenteredDegrees(AngleHelper.verticalAngle(facing))
.setChanged();
// TODO: I think we need proper ItemVisuals to handle rendering the boxes in here
animate(partialTick);
}
@Override
public void beginFrame(Context ctx) {
animate(ctx.partialTick());
}
public void animate(float partialTick) {
var hatchPartial = PackagerRenderer.getHatchModel(blockEntity);
if (hatchPartial != this.lastHatchPartial) {
instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(hatchPartial))
.stealInstance(hatch);
this.lastHatchPartial = hatchPartial;
}
float trayOffset = blockEntity.getTrayOffset(partialTick);
if (trayOffset != lastTrayOffset) {
Direction facing = blockState.getValue(PackagerBlock.FACING)
.getOpposite();
var lowerCorner = Vec3.atLowerCornerOf(facing.getNormal());
tray.setIdentityTransform()
.translate(getVisualPosition())
.translate(lowerCorner.scale(trayOffset))
.rotateYCenteredDegrees(facing.toYRot())
.setChanged();
lastTrayOffset = trayOffset;
}
}
@Override
public void updateLight(float partialTick) {
relight(hatch, tray);
}
@Override
protected void _delete() {
hatch.delete();
tray.delete();
}
@Override
public void collectCrumblingInstances(Consumer<@Nullable Instance> consumer) {
}
}

View file

@ -5,6 +5,7 @@ import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.logistics.BigItemStack;
import com.simibubi.create.content.logistics.packager.InventorySummary;
import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType;
import com.simibubi.create.content.logistics.packagerLink.WiFiParticle;
import com.simibubi.create.content.logistics.stockTicker.PackageOrder;
import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity;
@ -138,7 +139,7 @@ public class RedstoneRequesterBlockEntity extends StockCheckingBlockEntity imple
Vec3 vec3 = Vec3.atCenterOf(worldPosition);
if (success) {
AllSoundEvents.CONFIRM.playAt(level, worldPosition, 0.5f, 1.5f, false);
level.addParticle(ParticleTypes.NOTE, vec3.x, vec3.y + 1, vec3.z, 0, 0, 0);
level.addParticle(new WiFiParticle.Data(), vec3.x, vec3.y, vec3.z, 1, 1, 1);
} else {
AllSoundEvents.DENY.playAt(level, worldPosition, 0.5f, 1, false);
level.addParticle(ParticleTypes.ENCHANTED_HIT, vec3.x, vec3.y + 1, vec3.z, 0, 0, 0);

View file

@ -1,6 +1,128 @@
{
"parent": "create:block/chain_conveyor/textures",
"loader": "forge:obj",
"flip_v": true,
"model": "create:models/block/chain_conveyor/conveyor_casing.obj"
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/conveyor_casing",
"particle": "create:block/andesite_casing"
},
"elements": [
{
"from": [2, 15, 2],
"to": [14, 15, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [1, 15, -6]},
"faces": {
"up": {"uv": [1, 9, 7, 15], "texture": "#0"}
}
},
{
"from": [2, 13, 0],
"to": [14, 16, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [10, 14.5, 8]},
"faces": {
"north": {"uv": [1, 6.5, 7, 8], "texture": "#0"},
"south": {"uv": [1, 5, 7, 5.5], "texture": "#0"},
"up": {"uv": [1, 8, 7, 9], "texture": "#0"}
}
},
{
"from": [2, 13, 14],
"to": [14, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [10, 14.5, 8]},
"faces": {
"north": {"uv": [1, 5, 7, 5.5], "texture": "#0"},
"south": {"uv": [1, 6.5, 7, 8], "texture": "#0"},
"up": {"uv": [1, 15, 7, 16], "texture": "#0"}
}
},
{
"from": [14, 13, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [14, 13, 0]},
"faces": {
"north": {"uv": [0, 6.5, 1, 8], "texture": "#0"},
"east": {"uv": [0, 6.5, 8, 8], "texture": "#0"},
"south": {"uv": [7, 6.5, 8, 8], "texture": "#0"},
"west": {"uv": [0, 5, 8, 5.5], "texture": "#0"},
"up": {"uv": [7, 8, 8, 16], "texture": "#0"}
}
},
{
"from": [0, 13, 0],
"to": [2, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 13, 0]},
"faces": {
"north": {"uv": [7, 6.5, 8, 8], "texture": "#0"},
"east": {"uv": [0, 5, 8, 5.5], "texture": "#0"},
"south": {"uv": [0, 6.5, 1, 8], "texture": "#0"},
"west": {"uv": [0, 6.5, 8, 8], "texture": "#0"},
"up": {"uv": [0, 8, 1, 16], "texture": "#0"}
}
},
{
"from": [2, 0, 2],
"to": [14, 3, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]},
"faces": {
"north": {"uv": [15.5, 10, 14, 16], "rotation": 90, "texture": "#0"},
"east": {"uv": [14, 15, 15.5, 16], "rotation": 270, "texture": "#0"},
"south": {"uv": [15.5, 10, 16, 16], "rotation": 90, "texture": "#0"},
"west": {"uv": [14, 10, 15.5, 11], "rotation": 270, "texture": "#0"},
"down": {"uv": [8, 15, 14, 16], "texture": "#0"}
}
},
{
"from": [2, 0, 12],
"to": [14, 3, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]},
"faces": {
"north": {"uv": [15.5, 10, 16, 16], "rotation": 90, "texture": "#0"},
"east": {"uv": [14, 10, 15.5, 11], "rotation": 270, "texture": "#0"},
"south": {"uv": [15.5, 10, 14, 16], "rotation": 90, "texture": "#0"},
"west": {"uv": [14, 15, 15.5, 16], "rotation": 270, "texture": "#0"},
"down": {"uv": [8, 10, 14, 11], "texture": "#0"}
}
},
{
"from": [2, 0, 4],
"to": [4, 3, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 10]},
"faces": {
"east": {"uv": [15.5, 11, 16, 15], "rotation": 90, "texture": "#0"},
"west": {"uv": [15.5, 11, 14, 15], "rotation": 90, "texture": "#0"},
"down": {"uv": [8, 11, 9, 15], "texture": "#0"}
}
},
{
"from": [12, 0, 4],
"to": [14, 3, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 10]},
"faces": {
"east": {"uv": [15.5, 11, 14, 15], "rotation": 90, "texture": "#0"},
"west": {"uv": [15.5, 11, 16, 15], "rotation": 90, "texture": "#0"},
"down": {"uv": [13, 11, 14, 15.5], "texture": "#0"}
}
},
{
"from": [4, 1, 4],
"to": [12, 1, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 1, 4]},
"faces": {
"down": {"uv": [9, 11, 13, 15], "texture": "#0"}
}
}
],
"groups": [
{
"name": "top",
"origin": [0, 13, 0],
"color": 0,
"children": [0, 1, 2, 3, 4]
},
{
"name": "bottom",
"origin": [2, 0, 2],
"color": 0,
"children": [5, 6, 7, 8]
},
9
]
}

View file

@ -2,4 +2,11 @@
# www.blender.org
newmtl casing
# Ns 250.000000
Ka 1.000000 1.000000 1.000000
# Ks 0.500000 0.500000 0.500000
# Ke 0.000000 0.000000 0.000000
# Ni 1.500000
# d 1.000000
# illum 2
map_Kd #conveyor_casing

View file

@ -0,0 +1,6 @@
# Blender 4.3.2 MTL File: 'conveyor.blend'
# www.blender.org
newmtl casing
illum 2
map_Kd #conveyor_casing

View file

@ -0,0 +1,237 @@
# Blender 4.3.2
# www.blender.org
mtllib conveyor_wheel.mtl
o Cube.002
v 0.965990 0.875000 -0.625000
v 0.965990 0.125000 -0.625000
v 0.034010 0.875000 -0.624999
v 0.034010 0.125000 -0.624999
v 0.000000 0.875000 0.000000
v 0.062500 0.875000 0.000000
v 0.937500 0.875000 0.000000
v 1.000000 0.875000 0.000000
v 0.062500 0.875000 -0.476712
v 0.062500 0.875000 -0.556218
v 0.937500 0.875000 -0.556218
v 0.937500 0.875000 -0.476713
v -0.295495 0.875000 -0.295494
v -0.295495 0.125000 -0.295494
v -0.207106 0.875000 -0.207106
v 1.625000 0.875000 0.965990
v 1.625000 0.125000 0.965990
v 1.624999 0.875000 0.034010
v 1.624999 0.125000 0.034010
v 1.000000 0.875000 0.062500
v 1.000000 0.875000 0.937500
v 1.000000 0.875000 1.000000
v 1.476712 0.875000 0.062500
v 1.556218 0.875000 0.062500
v 1.556218 0.875000 0.937500
v 1.476713 0.875000 0.937500
v 1.295495 0.125000 1.295495
v 1.295494 0.875000 -0.295495
v 1.295494 0.125000 -0.295495
v 1.207106 0.875000 -0.207106
v 0.034010 0.875000 1.625000
v 0.034010 0.125000 1.625000
v 0.965990 0.875000 1.624999
v 0.965990 0.125000 1.624999
v 0.937500 0.875000 1.000000
v 0.062500 0.875000 1.000000
v 0.000000 0.875000 1.000000
v 0.937500 0.875000 1.476712
v 0.937500 0.875000 1.556218
v 0.062500 0.875000 1.556218
v 0.062500 0.875000 1.476713
v -0.295495 0.125000 1.295495
v 1.295494 0.875000 1.295494
v 1.207106 0.875000 1.207106
v -0.625000 0.875000 0.034010
v -0.625000 0.125000 0.034010
v -0.624999 0.875000 0.965990
v -0.624999 0.125000 0.965990
v 0.000000 0.875000 0.937500
v 0.000000 0.875000 0.062500
v -0.476712 0.875000 0.937500
v -0.556218 0.875000 0.937500
v -0.556218 0.875000 0.062500
v -0.476713 0.875000 0.062500
v -0.295494 0.875000 1.295494
v -0.207106 0.875000 1.207106
v 0.500000 0.875000 0.500000
v -0.246859 0.875000 -0.246859
v -0.246859 0.875000 1.246859
v 1.246859 0.875000 1.246859
v 1.246859 0.875000 -0.246859
v -0.499999 0.125000 0.914213
v 0.085787 0.125000 -0.499999
v 1.207106 0.125000 -0.207106
v -0.207106 0.125000 -0.207106
v 1.499999 0.125000 0.085787
v 1.207107 0.125000 1.207107
v 0.914213 0.125000 1.499999
v -0.207107 0.125000 1.207106
v -0.500000 0.125000 0.085787
v 0.914213 0.125000 -0.500000
v 1.500000 0.125000 0.914213
v 0.085787 0.125000 1.500000
v 0.500000 0.112500 0.500000
v -0.499999 0.112500 0.914213
v 0.085787 0.112500 -0.499999
v 1.207106 0.112500 -0.207106
v -0.207106 0.112500 -0.207106
v 1.499999 0.112500 0.085787
v 1.207107 0.112500 1.207107
v 0.914213 0.112500 1.499999
v -0.207107 0.112500 1.207106
v -0.500000 0.112500 0.085787
v 0.914213 0.112500 -0.500000
v 1.500000 0.112500 0.914213
v 0.085787 0.112500 1.500000
vn -0.7071 -0.0000 -0.7071
vn -0.0000 1.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn 0.7071 -0.0000 -0.7071
vn 1.0000 -0.0000 -0.0000
vn 0.7071 -0.0000 0.7071
vn -0.0000 -0.0000 1.0000
vn -0.7071 -0.0000 0.7071
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vt 0.750000 0.375000
vt 0.750000 0.750000
vt 0.517005 0.750000
vt 0.517005 0.375000
vt 0.031250 0.965610
vt 0.468750 0.965609
vt 0.482995 1.000000
vt 0.017005 1.000000
vt 0.750000 0.965610
vt 0.750000 0.937500
vt 0.940640 0.937500
vt 0.968750 0.965610
vt 0.031250 0.925857
vt 0.468750 0.925857
vt 0.982995 0.750000
vt 0.982995 0.375000
vt 0.750000 0.937500
vt 0.559359 0.937500
vt 0.727903 0.768956
vt 0.750000 0.791054
vt 0.531250 0.965609
vt 0.750000 0.965610
vt 0.772097 0.768957
vt 0.750000 0.791054
vt 0.031250 0.925857
vt 0.031250 0.687500
vt 0.468750 0.687500
vt 0.468750 0.925857
vt 0.968750 0.965609
vt 0.940641 0.937500
vt 0.750000 0.937500
vt 0.750000 0.965610
vt 0.559360 0.937500
vt 0.531250 0.965610
vt 0.750000 0.965610
vt 0.517005 1.000000
vt 0.750000 1.000000
vt 0.982995 1.000000
vt 0.017005 0.687500
vt 0.042893 0.625000
vt 0.250000 0.625000
vt 0.250000 0.687500
vt 0.000000 0.593750
vt 0.031250 0.593750
vt 0.031250 0.625000
vt 0.000000 0.625000
vt 0.482995 0.687500
vt 0.042893 0.625000
vt 0.457107 0.625000
vt 0.500000 0.609375
vt 0.000000 0.609375
s 0
usemtl casing
f 14/1/1 13/2/1 3/3/1 4/4/1
f 10/5/2 11/6/2 1/7/2 3/8/2
f 58/9/2 15/10/2 9/11/2 10/12/2
f 10/5/2 9/13/2 12/14/2 11/6/2
f 3/15/3 1/3/3 2/4/3 4/16/3
f 2/16/4 1/15/4 28/2/4 29/1/4
f 30/17/2 12/18/2 7/19/2 8/20/2
f 11/21/2 12/18/2 30/17/2 61/22/2
f 6/23/2 9/11/2 15/10/2 5/24/2
f 9/25/2 6/26/2 7/27/2 12/28/2
f 29/1/4 28/2/4 18/3/4 19/4/4
f 24/5/2 25/6/2 16/7/2 18/8/2
f 61/9/2 30/10/2 23/11/2 24/12/2
f 24/5/2 23/13/2 26/14/2 25/6/2
f 18/15/5 16/3/5 17/4/5 19/16/5
f 17/16/6 16/15/6 43/2/6 27/1/6
f 44/17/2 26/18/2 21/19/2 22/20/2
f 25/29/2 26/30/2 44/31/2 60/32/2
f 20/23/2 23/11/2 30/10/2 8/24/2
f 23/25/2 20/26/2 21/27/2 26/28/2
f 27/1/6 43/2/6 33/3/6 34/4/6
f 39/5/2 40/6/2 31/7/2 33/8/2
f 60/32/2 44/10/2 38/33/2 39/34/2
f 39/5/2 38/13/2 41/14/2 40/6/2
f 33/15/7 31/3/7 32/4/7 34/16/7
f 32/16/8 31/15/8 55/2/8 42/1/8
f 56/17/2 41/18/2 36/19/2 37/20/2
f 40/21/2 41/18/2 56/17/2 59/35/2
f 35/23/2 38/11/2 44/10/2 22/24/2
f 38/25/2 35/26/2 36/27/2 41/28/2
f 42/1/8 55/2/8 47/3/8 48/4/8
f 52/5/2 53/6/2 45/7/2 47/8/2
f 59/35/2 56/10/2 51/11/2 52/12/2
f 52/5/2 51/13/2 54/14/2 53/6/2
f 47/15/9 45/3/9 46/4/9 48/16/9
f 46/16/1 45/15/1 13/2/1 14/1/1
f 15/17/2 54/18/2 50/19/2 5/20/2
f 53/21/2 54/18/2 15/17/2 58/9/2
f 49/23/2 51/11/2 56/10/2 37/24/2
f 51/25/2 49/26/2 50/27/2 54/28/2
f 45/36/2 53/21/2 58/9/2 13/37/2
f 13/37/2 58/9/2 10/12/2 3/38/2
f 55/37/2 59/35/2 52/12/2 47/38/2
f 31/36/2 40/21/2 59/35/2 55/37/2
f 43/37/2 60/32/2 39/34/2 33/36/2
f 16/38/2 25/29/2 60/32/2 43/37/2
f 28/37/2 61/9/2 24/12/2 18/38/2
f 1/36/2 11/21/2 61/22/2 28/37/2
f 4/39/10 63/40/10 65/41/10 14/42/10
f 63/43/3 71/44/3 84/45/3 76/46/3
f 19/47/10 17/39/10 72/48/10 66/49/10
f 72/43/6 67/44/6 80/45/6 85/46/6
f 19/39/10 66/40/10 64/41/10 29/42/10
f 64/43/4 66/44/4 79/45/4 77/46/4
f 34/47/10 32/39/10 73/48/10 68/49/10
f 62/43/9 70/44/9 83/45/9 75/46/9
f 34/39/10 68/40/10 67/41/10 27/42/10
f 73/43/8 69/44/8 82/45/8 86/46/8
f 48/47/10 46/39/10 70/48/10 62/49/10
f 66/43/5 72/44/5 85/45/5 79/46/5
f 48/39/10 62/40/10 69/41/10 42/42/10
f 67/43/6 68/44/6 81/45/6 80/46/6
f 70/43/1 65/44/1 78/45/1 83/46/1
f 65/43/1 63/44/1 76/45/1 78/46/1
f 70/49/10 46/47/10 14/42/10 65/41/10
f 71/43/4 64/44/4 77/45/4 84/46/4
f 73/49/10 32/47/10 42/42/10 69/41/10
f 68/43/7 73/44/7 86/45/7 81/46/7
f 72/49/10 17/47/10 27/42/10 67/41/10
f 69/43/8 62/44/8 75/45/8 82/46/8
f 71/49/10 2/47/10 29/42/10 64/41/10
f 4/47/10 2/39/10 71/48/10 63/49/10
f 76/43/10 84/46/10 74/50/10
f 76/46/10 74/50/10 78/51/10
f 79/43/10 85/46/10 74/50/10
f 79/46/10 74/50/10 77/51/10
f 81/43/10 86/46/10 74/50/10
f 81/46/10 74/50/10 80/51/10
f 75/43/10 83/46/10 74/50/10
f 75/46/10 74/50/10 82/51/10
f 74/50/10 83/43/10 78/51/10
f 74/50/10 86/43/10 82/51/10
f 74/50/10 85/43/10 80/51/10
f 74/50/10 84/43/10 77/51/10

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/chain_conveyor/textures",
"loader": "forge:obj",
"flip_v": true,
"model": "create:models/block/chain_conveyor/conveyor_wheel.obj"
}

View file

@ -2,6 +2,7 @@
"credit": "Made with Blockbench",
"loader": "forge:composite",
"parent": "block/block",
"ambientocclusion": false,
"textures": {
"particle": "create:block/brass_casing"
},
@ -88,9 +89,10 @@
"from": [3, 12, 5],
"to": [13, 22, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 11, 5]},
"shade": false,
"faces": {
"north": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"},
"south": {"uv": [0, 3, 5, 8], "texture": "#1"}
"north": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1", "shade": false},
"south": {"uv": [0, 3, 5, 8], "texture": "#1", "shade": false}
}
}
]

View file

@ -2,6 +2,7 @@
"credit": "Made with Blockbench",
"loader": "forge:composite",
"parent": "block/block",
"ambientocclusion": false,
"textures": {
"particle": "create:block/brass_casing"
},
@ -88,9 +89,10 @@
"from": [3, 12, 5],
"to": [13, 22, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 11, 5]},
"shade": false,
"faces": {
"north": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"},
"south": {"uv": [0, 3, 5, 8], "texture": "#1"}
"north": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1", "shade": false},
"south": {"uv": [0, 3, 5, 8], "texture": "#1", "shade": false}
}
}
]

View file

@ -2,6 +2,7 @@
"credit": "Made with Blockbench",
"loader": "forge:composite",
"parent": "block/block",
"ambientocclusion": false,
"textures": {
"particle": "create:block/brass_casing"
},
@ -88,9 +89,10 @@
"from": [3, 6, 10],
"to": [13, 16, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"shade": false,
"faces": {
"north": {"uv": [0, 3, 5, 8], "texture": "#1"},
"south": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"}
"north": {"uv": [0, 3, 5, 8], "texture": "#1", "shade": false},
"south": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1", "shade": false}
}
}
]

View file

@ -2,6 +2,7 @@
"credit": "Made with Blockbench",
"loader": "forge:composite",
"parent": "block/block",
"ambientocclusion": false,
"textures": {
"particle": "create:block/brass_casing"
},
@ -88,9 +89,10 @@
"from": [3, 6, 10],
"to": [13, 16, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"shade": false,
"faces": {
"north": {"uv": [0, 3, 5, 8], "texture": "#1"},
"south": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"}
"north": {"uv": [0, 3, 5, 8], "texture": "#1", "shade": false},
"south": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1", "shade": false}
}
}
]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1 KiB