mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-03-04 06:44:40 +01:00
Merge remote-tracking branch 'concealed/mc1.20.1/feature-dev' into mc1.20.1/feature-dev
This commit is contained in:
commit
60076e49c1
26 changed files with 732 additions and 100 deletions
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
||||
//
|
||||
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
]
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
# Blender 4.3.2 MTL File: 'conveyor.blend'
|
||||
# www.blender.org
|
||||
|
||||
newmtl casing
|
||||
illum 2
|
||||
map_Kd #conveyor_casing
|
|
@ -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
|
|
@ -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"
|
||||
}
|
|
@ -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}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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 |
Loading…
Add table
Reference in a new issue