Merge remote-tracking branch 'concealed/mc1.20.1/feature-dev' into mc1.20.1/feature-dev
|
@ -1,4 +1,4 @@
|
|||
// 1.20.1 2024-12-27T18:05:56.7764077 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)]
|
||||
// 1.20.1 2024-12-28T14:25:56.9899499 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)]
|
||||
60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json
|
||||
6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json
|
||||
c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json
|
||||
|
@ -4711,7 +4711,7 @@ edf7390f09e622193bbc720ec51ba128ea1e96e6 data/curios/tags/items/head.json
|
|||
81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json
|
||||
e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json
|
||||
2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/blocks/ores_in_ground/stone.json
|
||||
8a5988e68f3a41341b486784c29d00e16d5272f7 data/forge/tags/blocks/relocation_not_supported.json
|
||||
2589b135c0e96ad29076569e144528fe32ea5b39 data/forge/tags/blocks/relocation_not_supported.json
|
||||
807ea01d3b028bd226ed0befc142cbd23647e998 data/forge/tags/blocks/storage_blocks.json
|
||||
7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/blocks/storage_blocks/andesite_alloy.json
|
||||
70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/blocks/storage_blocks/brass.json
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
{
|
||||
"values": [
|
||||
"create:chain_conveyor",
|
||||
"create:track"
|
||||
]
|
||||
}
|
|
@ -554,7 +554,6 @@ public class AllBlocks {
|
|||
.mapColor(MapColor.PODZOL))
|
||||
.transform(axeOrPickaxe())
|
||||
.transform(BlockStressDefaults.setImpact(1))
|
||||
.tag(AllBlockTags.RELOCATION_NOT_SUPPORTED.tag)
|
||||
.blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p)))
|
||||
.item()
|
||||
.transform(customItemModel())
|
||||
|
@ -883,7 +882,7 @@ public class AllBlocks {
|
|||
.properties(p -> p.forceSolidOn())
|
||||
.transform(pickaxeOnly())
|
||||
.blockstate(BlockStateGen.pipe())
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new))
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO))
|
||||
.item()
|
||||
.transform(customItemModel())
|
||||
.register();
|
||||
|
@ -898,7 +897,7 @@ public class AllBlocks {
|
|||
.onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(AllSpriteShifts.COPPER_CASING)))
|
||||
.onRegister(CreateRegistrate.casingConnectivity((block, cc) -> cc.make(block, AllSpriteShifts.COPPER_CASING,
|
||||
(s, f) -> !s.getValue(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(f)))))
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new))
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withAO))
|
||||
.loot((p, b) -> p.dropOther(b, FLUID_PIPE.get()))
|
||||
.transform(EncasingRegistry.addVariantTo(AllBlocks.FLUID_PIPE))
|
||||
.register();
|
||||
|
@ -922,7 +921,7 @@ public class AllBlocks {
|
|||
.build();
|
||||
}, BlockStateProperties.WATERLOGGED);
|
||||
})
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new))
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO))
|
||||
.loot((p, b) -> p.dropOther(b, FLUID_PIPE.get()))
|
||||
.register();
|
||||
|
||||
|
@ -931,7 +930,7 @@ public class AllBlocks {
|
|||
.properties(p -> p.mapColor(MapColor.STONE))
|
||||
.transform(pickaxeOnly())
|
||||
.blockstate(BlockStateGen.directionalBlockProviderIgnoresWaterlogged(true))
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new))
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO))
|
||||
.transform(BlockStressDefaults.setImpact(4.0))
|
||||
.item()
|
||||
.transform(customItemModel())
|
||||
|
@ -943,7 +942,7 @@ public class AllBlocks {
|
|||
.properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW))
|
||||
.transform(pickaxeOnly())
|
||||
.blockstate(new SmartFluidPipeGenerator()::generate)
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new))
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO))
|
||||
.item()
|
||||
.transform(customItemModel())
|
||||
.register();
|
||||
|
@ -951,10 +950,11 @@ public class AllBlocks {
|
|||
public static final BlockEntry<FluidValveBlock> FLUID_VALVE = REGISTRATE.block("fluid_valve", FluidValveBlock::new)
|
||||
.initialProperties(SharedProperties::copperMetal)
|
||||
.transform(pickaxeOnly())
|
||||
.addLayer(() -> RenderType::cutoutMipped)
|
||||
.blockstate((c, p) -> BlockStateGen.directionalAxisBlock(c, p,
|
||||
(state, vertical) -> AssetLookup.partialBaseModel(c, p, vertical ? "vertical" : "horizontal",
|
||||
state.getValue(FluidValveBlock.ENABLED) ? "open" : "closed")))
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new))
|
||||
.onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO))
|
||||
.item()
|
||||
.transform(customItemModel())
|
||||
.register();
|
||||
|
|
|
@ -24,6 +24,7 @@ import com.simibubi.create.content.decoration.steamWhistle.WhistleExtenderBlock;
|
|||
import com.simibubi.create.content.fluids.tank.FluidTankBlock;
|
||||
import com.simibubi.create.content.kinetics.crank.HandCrankBlock;
|
||||
import com.simibubi.create.content.kinetics.fan.NozzleBlock;
|
||||
import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock;
|
||||
import com.simibubi.create.content.logistics.vault.ItemVaultBlock;
|
||||
import com.simibubi.create.content.redstone.link.RedstoneLinkBlock;
|
||||
import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock;
|
||||
|
@ -237,7 +238,8 @@ public class BlockMovementChecks {
|
|||
return true;
|
||||
if (block instanceof BasePressurePlateBlock)
|
||||
return true;
|
||||
if (block instanceof FaceAttachedHorizontalDirectionalBlock && !(block instanceof GrindstoneBlock))
|
||||
if (block instanceof FaceAttachedHorizontalDirectionalBlock && !(block instanceof GrindstoneBlock)
|
||||
&& !(block instanceof PackagerLinkBlock))
|
||||
return true;
|
||||
if (block instanceof CartAssemblerBlock)
|
||||
return false;
|
||||
|
|
|
@ -61,10 +61,12 @@ import com.simibubi.create.content.kinetics.base.BlockBreakingMovementBehaviour;
|
|||
import com.simibubi.create.content.kinetics.base.IRotate;
|
||||
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
|
||||
import com.simibubi.create.content.kinetics.belt.BeltBlock;
|
||||
import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity;
|
||||
import com.simibubi.create.content.kinetics.gantry.GantryShaftBlock;
|
||||
import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock;
|
||||
import com.simibubi.create.content.kinetics.steamEngine.PoweredShaftBlockEntity;
|
||||
import com.simibubi.create.content.logistics.crate.CreativeCrateBlockEntity;
|
||||
import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockEntity;
|
||||
import com.simibubi.create.content.redstone.contact.RedstoneContactBlock;
|
||||
import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock;
|
||||
import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer;
|
||||
|
@ -338,6 +340,9 @@ public abstract class Contraption {
|
|||
&& !BlockMovementChecks.isNotSupportive(world.getBlockState(attached), offset.getOpposite()))
|
||||
frontier.add(attached);
|
||||
}
|
||||
|
||||
if (world.getBlockEntity(pos) instanceof ChainConveyorBlockEntity ccbe)
|
||||
ccbe.notifyConnectedToValidate();
|
||||
|
||||
// Double Chest halves stick together
|
||||
if (state.hasProperty(ChestBlock.TYPE) && state.hasProperty(ChestBlock.FACING)
|
||||
|
@ -626,6 +631,9 @@ public abstract class Contraption {
|
|||
BlockEntity blockEntity = world.getBlockEntity(pos);
|
||||
if (blockEntity instanceof PoweredShaftBlockEntity)
|
||||
blockEntity = AllBlockEntityTypes.BRACKETED_KINETIC.create(pos, blockstate);
|
||||
if (blockEntity instanceof FactoryPanelBlockEntity fpbe)
|
||||
fpbe.writeSafe(compoundnbt);
|
||||
|
||||
return Pair.of(new StructureBlockInfo(pos, blockstate, compoundnbt), blockEntity);
|
||||
}
|
||||
|
||||
|
|
|
@ -33,9 +33,19 @@ import net.minecraftforge.client.model.data.ModelProperty;
|
|||
public class PipeAttachmentModel extends BakedModelWrapperWithData {
|
||||
|
||||
private static final ModelProperty<PipeModelData> PIPE_PROPERTY = new ModelProperty<>();
|
||||
private boolean ao;
|
||||
|
||||
public PipeAttachmentModel(BakedModel template) {
|
||||
public static PipeAttachmentModel withAO(BakedModel template) {
|
||||
return new PipeAttachmentModel(template, true);
|
||||
}
|
||||
|
||||
public static PipeAttachmentModel withoutAO(BakedModel template) {
|
||||
return new PipeAttachmentModel(template, false);
|
||||
}
|
||||
|
||||
public PipeAttachmentModel(BakedModel template, boolean ao) {
|
||||
super(template);
|
||||
this.ao = ao;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -75,6 +85,21 @@ public class PipeAttachmentModel extends BakedModelWrapperWithData {
|
|||
}
|
||||
return quads;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useAmbientOcclusion(BlockState state, RenderType renderType) {
|
||||
return ao;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useAmbientOcclusion(BlockState state) {
|
||||
return ao;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useAmbientOcclusion() {
|
||||
return ao;
|
||||
}
|
||||
|
||||
private void addQuads(List<BakedQuad> quads, BlockState state, Direction side, RandomSource rand, ModelData data,
|
||||
PipeModelData pipeData, RenderType renderType) {
|
||||
|
|
|
@ -12,6 +12,8 @@ import java.util.function.Consumer;
|
|||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity;
|
||||
import com.simibubi.create.content.contraptions.StructureTransform;
|
||||
import com.simibubi.create.content.kinetics.base.IRotate;
|
||||
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
|
||||
import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage.ChainConveyorPackagePhysicsData;
|
||||
|
@ -20,6 +22,8 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorShape.Cha
|
|||
import com.simibubi.create.content.logistics.box.PackageEntity;
|
||||
import com.simibubi.create.content.logistics.box.PackageItem;
|
||||
import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity;
|
||||
import com.simibubi.create.content.schematics.requirement.ItemRequirement;
|
||||
import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType;
|
||||
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
|
||||
import com.simibubi.create.infrastructure.config.AllConfigs;
|
||||
|
||||
|
@ -51,7 +55,7 @@ import net.minecraft.world.phys.AABB;
|
|||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
|
||||
public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
||||
public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITransformableBlockEntity {
|
||||
|
||||
public record ConnectionStats(float tangentAngle, float chainLength, Vec3 start, Vec3 end) {
|
||||
}
|
||||
|
@ -71,11 +75,13 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
|||
|
||||
public boolean reversed;
|
||||
public boolean cancelDrops;
|
||||
public boolean checkInvalid;
|
||||
|
||||
BlockPos chainDestroyedEffectToSend;
|
||||
|
||||
public ChainConveyorBlockEntity(BlockEntityType<?> typeIn, BlockPos pos, BlockState state) {
|
||||
super(typeIn, pos, state);
|
||||
checkInvalid = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -125,6 +131,11 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
|||
public void tick() {
|
||||
super.tick();
|
||||
|
||||
if (checkInvalid && !level.isClientSide()) {
|
||||
checkInvalid = false;
|
||||
removeInvalidConnections();
|
||||
}
|
||||
|
||||
float serverSpeed = level.isClientSide() ? ServerSpeedProvider.get() : 1f;
|
||||
float speed = getSpeed() / 360f;
|
||||
float radius = 1.5f;
|
||||
|
@ -181,6 +192,8 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
|||
for (Entry<BlockPos, List<ChainConveyorPackage>> entry : travellingPackages.entrySet()) {
|
||||
BlockPos target = entry.getKey();
|
||||
ConnectionStats stats = connectionStats.get(target);
|
||||
if (stats == null)
|
||||
continue;
|
||||
|
||||
Travelling: for (Iterator<ChainConveyorPackage> iterator = entry.getValue()
|
||||
.iterator(); iterator.hasNext();) {
|
||||
|
@ -206,7 +219,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
|||
continue;
|
||||
if (!target.equals(port.connection))
|
||||
continue;
|
||||
|
||||
|
||||
boolean notAtPositionYet = box.chainPosition < chainPosition;
|
||||
if (notAtPositionYet && anticipatePosition < chainPosition)
|
||||
continue;
|
||||
|
@ -298,6 +311,33 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
|||
updateBoxWorldPositions();
|
||||
}
|
||||
|
||||
public void removeInvalidConnections() {
|
||||
boolean changed = false;
|
||||
for (Iterator<BlockPos> iterator = connections.iterator(); iterator.hasNext();) {
|
||||
BlockPos next = iterator.next();
|
||||
BlockPos target = worldPosition.offset(next);
|
||||
if (!level.isLoaded(target))
|
||||
continue;
|
||||
if (level.getBlockEntity(target) instanceof ChainConveyorBlockEntity ccbe
|
||||
&& ccbe.connections.contains(next.multiply(-1)))
|
||||
continue;
|
||||
iterator.remove();
|
||||
changed = true;
|
||||
}
|
||||
if (changed)
|
||||
notifyUpdate();
|
||||
}
|
||||
|
||||
public void notifyConnectedToValidate() {
|
||||
for (BlockPos blockPos : connections) {
|
||||
BlockPos target = worldPosition.offset(blockPos);
|
||||
if (!level.isLoaded(target))
|
||||
continue;
|
||||
if (level.getBlockEntity(target) instanceof ChainConveyorBlockEntity ccbe)
|
||||
ccbe.checkInvalid = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void tickBoxVisuals() {
|
||||
for (ChainConveyorPackage box : loopingPackages)
|
||||
tickBoxVisuals(box);
|
||||
|
@ -371,6 +411,8 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
|||
for (Entry<BlockPos, List<ChainConveyorPackage>> entry : travellingPackages.entrySet()) {
|
||||
BlockPos target = entry.getKey();
|
||||
ConnectionStats stats = connectionStats.get(target);
|
||||
if (stats == null)
|
||||
continue;
|
||||
for (ChainConveyorPackage box : entry.getValue()) {
|
||||
box.worldPosition = getPackagePosition(box.chainPosition, target);
|
||||
if (level == null || !level.isClientSide())
|
||||
|
@ -596,7 +638,8 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
|||
}
|
||||
|
||||
private void drop(ChainConveyorPackage box) {
|
||||
level.addFreshEntity(PackageEntity.fromItemStack(level, box.worldPosition.subtract(0, 0.5, 0), box.item));
|
||||
if (box.worldPosition != null)
|
||||
level.addFreshEntity(PackageEntity.fromItemStack(level, box.worldPosition.subtract(0, 0.5, 0), box.item));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -617,6 +660,12 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
|||
return super.propagateRotationTo(target, stateFrom, stateTo, diff, connectedViaAxes, connectedViaCogs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeSafe(CompoundTag tag) {
|
||||
super.writeSafe(tag);
|
||||
tag.put("Connections", NBTHelper.writeCompoundList(connections, NbtUtils::writeBlockPos));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void write(CompoundTag compound, boolean clientPacket) {
|
||||
super.write(compound, clientPacket);
|
||||
|
@ -717,4 +766,33 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity {
|
|||
return travellingPackages;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemRequirement getRequiredItems(BlockState state) {
|
||||
// Uncomment when Schematicannon is able to print these with chains
|
||||
// int totalCost = 0;
|
||||
// for (BlockPos pos : connections)
|
||||
// totalCost += getChainCost(pos);
|
||||
// if (totalCost > 0)
|
||||
// return new ItemRequirement(ItemUseType.CONSUME, new ItemStack(Items.CHAIN, Mth.ceil(totalCost / 2.0)));
|
||||
return super.getRequiredItems(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transform(StructureTransform transform) {
|
||||
if (connections == null || connections.isEmpty())
|
||||
return;
|
||||
|
||||
connections = new HashSet<>(connections.stream()
|
||||
.map(transform::applyWithoutOffset)
|
||||
.toList());
|
||||
|
||||
HashMap<BlockPos, List<ChainConveyorPackage>> newMap = new HashMap<>();
|
||||
travellingPackages.entrySet()
|
||||
.forEach(e -> newMap.put(transform.applyWithoutOffset(e.getKey()), e.getValue()));
|
||||
travellingPackages = newMap;
|
||||
|
||||
connectionStats = null;
|
||||
notifyUpdate();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -64,8 +64,8 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer<ChainConve
|
|||
}
|
||||
}
|
||||
|
||||
private void renderBox(ChainConveyorBlockEntity be, PoseStack ms, MultiBufferSource buffer, int overlay, BlockPos pos,
|
||||
ChainConveyorPackage box, float partialTicks) {
|
||||
private void renderBox(ChainConveyorBlockEntity be, PoseStack ms, MultiBufferSource buffer, int overlay,
|
||||
BlockPos pos, ChainConveyorPackage box, float partialTicks) {
|
||||
if (box.worldPosition == null)
|
||||
return;
|
||||
if (box.item == null || box.item.isEmpty())
|
||||
|
@ -126,7 +126,8 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer<ChainConve
|
|||
}
|
||||
}
|
||||
|
||||
private void renderChains(ChainConveyorBlockEntity be, PoseStack ms, MultiBufferSource buffer, int light, int overlay) {
|
||||
private void renderChains(ChainConveyorBlockEntity be, PoseStack ms, MultiBufferSource buffer, int light,
|
||||
int overlay) {
|
||||
float time = LevelTickHolder.getRenderTime(be.getLevel()) / (360f / Math.abs(be.getSpeed()));
|
||||
time %= 1;
|
||||
if (time < 0)
|
||||
|
@ -151,7 +152,8 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer<ChainConve
|
|||
.subtract(Vec3.atCenterOf(tilePos));
|
||||
|
||||
if (!BackendManager.isBackendOn()) {
|
||||
SuperByteBuffer guard = CachedBuffers.partial(AllPartialModels.CHAIN_CONVEYOR_GUARD, be.getBlockState());
|
||||
SuperByteBuffer guard =
|
||||
CachedBuffers.partial(AllPartialModels.CHAIN_CONVEYOR_GUARD, be.getBlockState());
|
||||
// guard.translate(startOffset.multiply(0, 1, 0));
|
||||
guard.center();
|
||||
guard.rotateYDegrees((float) yaw);
|
||||
|
@ -177,7 +179,7 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer<ChainConve
|
|||
int light2 = LightTexture.pack(level.getBrightness(LightLayer.BLOCK, tilePos.offset(blockPos)),
|
||||
level.getBrightness(LightLayer.SKY, tilePos.offset(blockPos)));
|
||||
|
||||
boolean far = !Minecraft.getInstance()
|
||||
boolean far = Minecraft.getInstance().level == be.getLevel() && !Minecraft.getInstance()
|
||||
.getBlockEntityRenderDispatcher().camera.getPosition()
|
||||
.closerThan(Vec3.atCenterOf(tilePos)
|
||||
.add(blockPos.getX() / 2f, blockPos.getY() / 2f, blockPos.getZ() / 2f), MIP_DISTANCE);
|
||||
|
|
|
@ -33,6 +33,7 @@ import com.simibubi.create.content.logistics.packagerLink.LogisticsManager;
|
|||
import com.simibubi.create.content.logistics.packagerLink.RequestPromise;
|
||||
import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue;
|
||||
import com.simibubi.create.content.logistics.stockTicker.PackageOrder;
|
||||
import com.simibubi.create.content.schematics.requirement.ItemRequirement;
|
||||
import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType;
|
||||
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
|
||||
import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard;
|
||||
|
@ -604,6 +605,21 @@ public class FactoryPanelBehaviour extends FilteringBehaviour {
|
|||
return promiseClearingInterval * 20 * 60;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeSafe(CompoundTag nbt) {
|
||||
if (!active)
|
||||
return;
|
||||
|
||||
CompoundTag panelTag = new CompoundTag();
|
||||
panelTag.put("Filter", getFilter().serializeNBT());
|
||||
panelTag.putInt("FilterAmount", count);
|
||||
panelTag.putUUID("Freq", network);
|
||||
panelTag.putString("RecipeAddress", recipeAddress);
|
||||
panelTag.putInt("PromiseClearingInterval", -1);
|
||||
panelTag.putInt("RecipeOutput", 1);
|
||||
nbt.put(CreateLang.asId(slot.name()), panelTag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(CompoundTag nbt, boolean clientPacket) {
|
||||
if (!active)
|
||||
|
@ -845,4 +861,10 @@ public class FactoryPanelBehaviour extends FilteringBehaviour {
|
|||
: waitingForNetwork ? 0x5B3B3B : satisfied ? 0x9EFF7F : promisedSatisfied ? 0x22AFAF : 0x3D6EBD;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemRequirement getRequiredItems() {
|
||||
return isActive() ? new ItemRequirement(ItemRequirement.ItemUseType.CONSUME, AllBlocks.FACTORY_GAUGE.asItem())
|
||||
: ItemRequirement.NONE;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -6,8 +6,10 @@ import com.simibubi.create.AllBlockEntityTypes;
|
|||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.AllShapes;
|
||||
import com.simibubi.create.AllSoundEvents;
|
||||
import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement;
|
||||
import com.simibubi.create.content.equipment.wrench.IWrenchable;
|
||||
import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem;
|
||||
import com.simibubi.create.content.schematics.requirement.ItemRequirement;
|
||||
import com.simibubi.create.foundation.block.IBE;
|
||||
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
|
||||
import com.simibubi.create.foundation.utility.CreateLang;
|
||||
|
@ -33,6 +35,7 @@ import net.minecraft.world.level.LevelAccessor;
|
|||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition.Builder;
|
||||
|
@ -51,7 +54,7 @@ import net.minecraftforge.common.MinecraftForge;
|
|||
import net.minecraftforge.event.level.BlockEvent;
|
||||
|
||||
public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock
|
||||
implements ProperWaterloggedBlock, IBE<FactoryPanelBlockEntity>, IWrenchable {
|
||||
implements ProperWaterloggedBlock, IBE<FactoryPanelBlockEntity>, IWrenchable, ISpecialBlockItemRequirement {
|
||||
|
||||
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
|
||||
|
||||
|
@ -318,19 +321,9 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock
|
|||
|
||||
@Override
|
||||
public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) {
|
||||
boolean blockChanged = !pState.is(pNewState.getBlock());
|
||||
if (!pIsMoving && blockChanged)
|
||||
if (pState.getValue(POWERED))
|
||||
updateNeighbours(pState, pLevel, pPos);
|
||||
|
||||
IBE.onRemove(pState, pLevel, pPos, pNewState);
|
||||
}
|
||||
|
||||
public static void updateNeighbours(BlockState pState, Level pLevel, BlockPos pPos) {
|
||||
pLevel.updateNeighborsAt(pPos, pState.getBlock());
|
||||
pLevel.updateNeighborsAt(pPos.relative(getConnectedDirection(pState).getOpposite()), pState.getBlock());
|
||||
}
|
||||
|
||||
public PanelSlot getTargetedSlot(BlockPos pos, BlockState blockState, Vec3 clickLocation) {
|
||||
double bestDistance = Double.MAX_VALUE;
|
||||
PanelSlot bestSlot = PanelSlot.BOTTOM_LEFT;
|
||||
|
@ -378,4 +371,9 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock
|
|||
return (face == AttachFace.CEILING ? Mth.PI : 0) + AngleHelper.rad(AngleHelper.horizontalAngle(facing));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) {
|
||||
return ItemRequirement.NONE;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -99,6 +99,14 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity {
|
|||
result++;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
for (FactoryPanelBehaviour panelBehaviour : panels.values())
|
||||
if (panelBehaviour.isActive())
|
||||
panelBehaviour.disconnectAll();
|
||||
super.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
|
|
|
@ -45,7 +45,7 @@ public class PackageFilterScreen extends AbstractFilterScreen<PackageFilterMenu>
|
|||
int x = leftPos;
|
||||
int y = topPos;
|
||||
|
||||
addressBox = new AddressEditBox(this, this.font, x + 44, y + 28, 140, 9, false);
|
||||
addressBox = new AddressEditBox(this, this.font, x + 44, y + 28, 129, 9, false);
|
||||
addressBox.setTextColor(0xffffff);
|
||||
addressBox.setValue(menu.address);
|
||||
addressBox.setResponder(this::onAddressEdited);
|
||||
|
|
|
@ -45,7 +45,7 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements
|
|||
public SmartInventory inventory;
|
||||
|
||||
protected AnimatedContainerBehaviour<PackagePortMenu> openTracker;
|
||||
|
||||
|
||||
protected LazyOptional<IItemHandler> itemHandler;
|
||||
|
||||
public PackagePortBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||
|
@ -203,7 +203,7 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements
|
|||
public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) {
|
||||
return PackagePortMenu.create(pContainerId, pPlayerInventory, this);
|
||||
}
|
||||
|
||||
|
||||
public int getComparatorOutput() {
|
||||
return ItemHandlerHelper.calcRedstoneFromInventory(inventory);
|
||||
}
|
||||
|
|
|
@ -213,7 +213,12 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour {
|
|||
public boolean isSafeNBT() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void writeSafe(CompoundTag tag) {
|
||||
tag.putUUID("Freq", freqId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(CompoundTag tag, boolean clientPacket) {
|
||||
super.write(tag, clientPacket);
|
||||
|
|
|
@ -16,6 +16,7 @@ import net.minecraft.ChatFormatting;
|
|||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.Direction.Axis;
|
||||
import net.minecraft.core.Direction.AxisDirection;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.Tag;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
@ -31,6 +32,7 @@ import net.minecraft.world.level.BlockGetter;
|
|||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.SignalGetter;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Rotation;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
||||
|
@ -176,4 +178,10 @@ public class RedstoneRequesterBlock extends Block implements IBE<RedstoneRequest
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState rotate(BlockState pState, Rotation pRotation) {
|
||||
return pState.setValue(AXIS, pRotation.rotate(Direction.get(AxisDirection.POSITIVE, pState.getValue(AXIS)))
|
||||
.getAxis());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -78,6 +78,14 @@ public class RedstoneRequesterBlockEntity extends StockCheckingBlockEntity imple
|
|||
encodedTargetAdress = tag.getString("EncodedAddress");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeSafe(CompoundTag tag) {
|
||||
super.writeSafe(tag);
|
||||
tag.putBoolean("AllowPartial", allowPartialRequests);
|
||||
tag.putString("EncodedAddress", encodedTargetAdress);
|
||||
tag.put("EncodedRequest", encodedRequest.write());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void write(CompoundTag tag, boolean clientPacket) {
|
||||
super.write(tag, clientPacket);
|
||||
|
|
|
@ -4,6 +4,8 @@ import java.util.ArrayList;
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.AllPackets;
|
||||
|
@ -25,6 +27,7 @@ import net.minecraft.client.renderer.Rect2i;
|
|||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.inventory.Slot;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraftforge.items.SlotItemHandler;
|
||||
|
||||
|
@ -128,8 +131,8 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen<Redston
|
|||
int y = getGuiTop();
|
||||
|
||||
for (int i = 0; i < amounts.size(); i++) {
|
||||
int inputX = x + 21 + i * 18;
|
||||
int inputY = y + 25;
|
||||
int inputX = x + 27 + i * 20;
|
||||
int inputY = y + 28;
|
||||
ItemStack itemStack = menu.ghostInventory.getStackInSlot(i);
|
||||
if (itemStack.isEmpty())
|
||||
continue;
|
||||
|
@ -176,8 +179,8 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen<Redston
|
|||
int y = getGuiTop();
|
||||
|
||||
for (int i = 0; i < amounts.size(); i++) {
|
||||
int inputX = x + 21 + i * 18;
|
||||
int inputY = y + 25;
|
||||
int inputX = x + 27 + i * 20;
|
||||
int inputY = y + 28;
|
||||
if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) {
|
||||
ItemStack itemStack = menu.ghostInventory.getStackInSlot(i);
|
||||
if (itemStack.isEmpty())
|
||||
|
@ -191,6 +194,15 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen<Redston
|
|||
return super.mouseScrolled(mouseX, mouseY, pDelta);
|
||||
}
|
||||
|
||||
/*
|
||||
* Fixes InventorySorter nabbing the scroll event. This screen needs it for
|
||||
* amount control
|
||||
*/
|
||||
@Override
|
||||
public @Nullable Slot getSlotUnderMouse() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Component> getTooltipFromContainerItem(ItemStack pStack) {
|
||||
List<Component> tooltip = super.getTooltipFromContainerItem(pStack);
|
||||
|
|
|
@ -301,11 +301,6 @@ public class TableClothBlockEntity extends SmartBlockEntity {
|
|||
owner = tag.contains("OwnerUUID") ? tag.getUUID("OwnerUUID") : null;
|
||||
facing = Direction.from2DDataValue(Mth.positiveModulo(tag.getInt("Facing"), 4));
|
||||
}
|
||||
//
|
||||
// @Override
|
||||
// protected AABB createRenderBoundingBox() {
|
||||
// return new AABB(worldPosition).inflate(1);
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
|
|
|
@ -41,6 +41,11 @@ public class TableClothFilteringBehaviour extends FilteringBehaviour {
|
|||
return dbe().owner == null || player.getUUID()
|
||||
.equals(dbe().owner);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSafeNBT() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MutableComponent getLabel() {
|
||||
|
|
|
@ -98,7 +98,7 @@ public abstract class SmartBlockEntity extends CachedRenderBBBlockEntity
|
|||
super.saveAdditional(tag);
|
||||
forEachBehaviour(tb -> {
|
||||
if (tb.isSafeNBT())
|
||||
tb.write(tag, false);
|
||||
tb.writeSafe(tag);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -44,6 +44,13 @@ public abstract class BlockEntityBehaviour {
|
|||
public void write(CompoundTag nbt, boolean clientPacket) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when isSafeNBT == true. Defaults to write()
|
||||
*/
|
||||
public void writeSafe(CompoundTag nbt) {
|
||||
write(nbt, false);
|
||||
}
|
||||
|
||||
public boolean isSafeNBT() {
|
||||
return false;
|
||||
|
|
|
@ -81,6 +81,11 @@ public abstract class GhostItemMenu<T> extends MenuBase<T> implements IClearable
|
|||
ghostInventory.setStackInSlot(slot, insert);
|
||||
getSlot(slotId).setChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean moveItemStackTo(ItemStack pStack, int pStartIndex, int pEndIndex, boolean pReverseDirection) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack quickMoveStack(Player playerIn, int index) {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.simibubi.create.foundation.utility;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -16,7 +15,6 @@ import com.simibubi.create.content.processing.burner.BlazeBurnerBlock;
|
|||
import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel;
|
||||
import com.simibubi.create.foundation.blockEntity.IMergeableBE;
|
||||
import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer;
|
||||
|
||||
import com.simibubi.create.impl.schematic.nbt.SchematicSafeNBTRegistryImpl;
|
||||
|
||||
import net.createmod.catnip.utility.NBTProcessors;
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"to": [16, 16, 16],
|
||||
"faces": {
|
||||
"north": {"uv": [0, 9, 1, 16], "texture": "#4"},
|
||||
"east": {"uv": [13, 0, 8, 7], "texture": "#4"},
|
||||
"east": {"uv": [16, 0, 11, 7], "texture": "#4"},
|
||||
"south": {"uv": [7, 0, 8, 7], "texture": "#4"},
|
||||
"west": {"uv": [16, 9, 11, 16], "texture": "#4"},
|
||||
"up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"},
|
||||
|
@ -35,7 +35,7 @@
|
|||
"north": {"uv": [7, 9, 8, 16], "texture": "#4"},
|
||||
"east": {"uv": [11, 9, 16, 16], "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 1, 7], "texture": "#4"},
|
||||
"west": {"uv": [8, 0, 13, 7], "texture": "#4"},
|
||||
"west": {"uv": [11, 0, 16, 7], "texture": "#4"},
|
||||
"up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"},
|
||||
"down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"}
|
||||
}
|
||||
|
@ -67,15 +67,16 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"from": [0, 0, 4],
|
||||
"to": [16, 2, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#particle"},
|
||||
"east": {"uv": [0, 0, 16, 2], "texture": "#particle"},
|
||||
"south": {"uv": [0, 0, 16, 2], "texture": "#particle"},
|
||||
"west": {"uv": [0, 0, 16, 2], "texture": "#particle"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#particle"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#particle"}
|
||||
"north": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"east": {"uv": [16, 7, 10, 8], "texture": "#4"},
|
||||
"south": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"west": {"uv": [10, 7, 16, 8], "texture": "#4"},
|
||||
"up": {"uv": [8, 10, 16, 16], "texture": "#1_7"},
|
||||
"down": {"uv": [16, 16, 8, 10], "texture": "#1_7"}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 9, 1, 16], "texture": "#4"},
|
||||
"east": {"uv": [13, 0, 8, 7], "texture": "#4"},
|
||||
"east": {"uv": [16, 0, 11, 7], "texture": "#4"},
|
||||
"south": {"uv": [7, 0, 8, 7], "texture": "#4"},
|
||||
"west": {"uv": [16, 9, 11, 16], "texture": "#4"},
|
||||
"up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"},
|
||||
|
@ -37,7 +37,7 @@
|
|||
"north": {"uv": [7, 9, 8, 16], "texture": "#4"},
|
||||
"east": {"uv": [11, 9, 16, 16], "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 1, 7], "texture": "#4"},
|
||||
"west": {"uv": [8, 0, 13, 7], "texture": "#4"},
|
||||
"west": {"uv": [11, 0, 16, 7], "texture": "#4"},
|
||||
"up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"},
|
||||
"down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"}
|
||||
}
|
||||
|
@ -90,15 +90,16 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"from": [0, 0, 4],
|
||||
"to": [16, 2, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#particle"},
|
||||
"east": {"uv": [0, 0, 16, 2], "texture": "#particle"},
|
||||
"south": {"uv": [0, 0, 16, 2], "texture": "#particle"},
|
||||
"west": {"uv": [0, 0, 16, 2], "texture": "#particle"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#particle"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#particle"}
|
||||
"north": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"east": {"uv": [16, 7, 10, 8], "texture": "#4"},
|
||||
"south": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"west": {"uv": [10, 7, 16, 8], "texture": "#4"},
|
||||
"up": {"uv": [8, 10, 16, 16], "texture": "#1_7"},
|
||||
"down": {"uv": [16, 16, 8, 10], "texture": "#1_7"}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"textures": {
|
||||
"3": "create:block/train_controller_base",
|
||||
"4": "create:block/controls_frame",
|
||||
"1_7": "create:block/controls",
|
||||
"particle": "create:block/bogey/particle"
|
||||
|
@ -13,7 +12,7 @@
|
|||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 9, 1, 16], "texture": "#4"},
|
||||
"east": {"uv": [13, 0, 8, 7], "texture": "#4"},
|
||||
"east": {"uv": [16, 0, 11, 7], "texture": "#4"},
|
||||
"south": {"uv": [7, 0, 8, 7], "texture": "#4"},
|
||||
"west": {"uv": [16, 9, 11, 16], "texture": "#4"},
|
||||
"up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"},
|
||||
|
@ -38,7 +37,7 @@
|
|||
"north": {"uv": [7, 9, 8, 16], "texture": "#4"},
|
||||
"east": {"uv": [11, 9, 16, 16], "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 1, 7], "texture": "#4"},
|
||||
"west": {"uv": [8, 0, 13, 7], "texture": "#4"},
|
||||
"west": {"uv": [11, 0, 16, 7], "texture": "#4"},
|
||||
"up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"},
|
||||
"down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"}
|
||||
}
|
||||
|
@ -64,15 +63,16 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"from": [0, 0, 4],
|
||||
"to": [16, 2, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"east": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"south": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"west": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#3"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#3"}
|
||||
"north": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"east": {"uv": [16, 7, 10, 8], "texture": "#4"},
|
||||
"south": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"west": {"uv": [10, 7, 16, 8], "texture": "#4"},
|
||||
"up": {"uv": [8, 10, 16, 16], "texture": "#1_7"},
|
||||
"down": {"uv": [8, 16, 16, 10], "texture": "#1_7"}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"textures": {
|
||||
"3": "create:block/train_controller_base",
|
||||
"4": "create:block/controls_frame",
|
||||
"1_7": "create:block/controls",
|
||||
"particle": "create:block/bogey/particle"
|
||||
|
@ -13,7 +12,7 @@
|
|||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 9, 1, 16], "texture": "#4"},
|
||||
"east": {"uv": [13, 0, 8, 7], "texture": "#4"},
|
||||
"east": {"uv": [16, 0, 11, 7], "texture": "#4"},
|
||||
"south": {"uv": [7, 0, 8, 7], "texture": "#4"},
|
||||
"west": {"uv": [16, 9, 11, 16], "texture": "#4"},
|
||||
"up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"},
|
||||
|
@ -38,7 +37,7 @@
|
|||
"north": {"uv": [7, 9, 8, 16], "texture": "#4"},
|
||||
"east": {"uv": [11, 9, 16, 16], "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 1, 7], "texture": "#4"},
|
||||
"west": {"uv": [8, 0, 13, 7], "texture": "#4"},
|
||||
"west": {"uv": [11, 0, 16, 7], "texture": "#4"},
|
||||
"up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"},
|
||||
"down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"}
|
||||
}
|
||||
|
@ -64,15 +63,16 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"from": [0, 0, 4],
|
||||
"to": [16, 2, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"east": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"south": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"west": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#3"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#3"}
|
||||
"north": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"east": {"uv": [16, 7, 10, 8], "texture": "#4"},
|
||||
"south": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"west": {"uv": [10, 7, 16, 8], "texture": "#4"},
|
||||
"up": {"uv": [8, 10, 16, 16], "texture": "#1_7"},
|
||||
"down": {"uv": [8, 16, 16, 10], "texture": "#1_7"}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"textures": {
|
||||
"3": "create:block/train_controller_base",
|
||||
"4": "create:block/controls_frame",
|
||||
"1_7": "create:block/controls",
|
||||
"particle": "create:block/bogey/particle"
|
||||
|
@ -47,7 +46,7 @@
|
|||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 9, 1, 16], "texture": "#4"},
|
||||
"east": {"uv": [13, 0, 8, 7], "texture": "#4"},
|
||||
"east": {"uv": [16, 0, 11, 7], "texture": "#4"},
|
||||
"south": {"uv": [7, 0, 8, 7], "texture": "#4"},
|
||||
"west": {"uv": [16, 9, 11, 16], "texture": "#4"},
|
||||
"up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"},
|
||||
|
@ -72,7 +71,7 @@
|
|||
"north": {"uv": [7, 9, 8, 16], "texture": "#4"},
|
||||
"east": {"uv": [11, 9, 16, 16], "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 1, 7], "texture": "#4"},
|
||||
"west": {"uv": [8, 0, 13, 7], "texture": "#4"},
|
||||
"west": {"uv": [11, 0, 16, 7], "texture": "#4"},
|
||||
"up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"},
|
||||
"down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"}
|
||||
}
|
||||
|
@ -98,15 +97,16 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"from": [0, 0, 4],
|
||||
"to": [16, 2, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"east": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"south": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"west": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#3"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#3"}
|
||||
"north": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"east": {"uv": [16, 7, 10, 8], "texture": "#4"},
|
||||
"south": {"uv": [0, 7, 8, 8], "texture": "#4"},
|
||||
"west": {"uv": [10, 7, 16, 8], "texture": "#4"},
|
||||
"up": {"uv": [8, 10, 16, 16], "texture": "#1_7"},
|
||||
"down": {"uv": [8, 16, 16, 10], "texture": "#1_7"}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 9, 1, 16], "texture": "#4"},
|
||||
"east": {"uv": [13, 0, 8, 7], "texture": "#4"},
|
||||
"east": {"uv": [16, 0, 11, 7], "texture": "#4"},
|
||||
"south": {"uv": [7, 0, 8, 7], "texture": "#4"},
|
||||
"west": {"uv": [16, 9, 11, 16], "texture": "#4"},
|
||||
"up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"},
|
||||
|
@ -72,7 +72,7 @@
|
|||
"north": {"uv": [7, 9, 8, 16], "texture": "#4"},
|
||||
"east": {"uv": [11, 9, 16, 16], "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 1, 7], "texture": "#4"},
|
||||
"west": {"uv": [8, 0, 13, 7], "texture": "#4"},
|
||||
"west": {"uv": [11, 0, 16, 7], "texture": "#4"},
|
||||
"up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"},
|
||||
"down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"}
|
||||
}
|
||||
|
@ -98,15 +98,16 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"from": [0, 0, 4],
|
||||
"to": [16, 2, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"east": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"east": {"uv": [16, 7, 10, 8], "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"west": {"uv": [0, 0, 16, 2], "texture": "#3"},
|
||||
"up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#3"},
|
||||
"down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#3"}
|
||||
"west": {"uv": [10, 7, 16, 8], "texture": "#4"},
|
||||
"up": {"uv": [8, 10, 16, 16], "texture": "#1_7"},
|
||||
"down": {"uv": [16, 16, 8, 10], "texture": "#1_7"}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
"south": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"west": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"up": {"uv": [1, 0, 15, 14], "texture": "#2"},
|
||||
"down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}
|
||||
"down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
"faces": {
|
||||
"north": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#2"},
|
||||
"east": {"uv": [1, 13, 15, 16], "rotation": 90, "texture": "#2"},
|
||||
"south": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"},
|
||||
"south": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"},
|
||||
"west": {"uv": [1, 13, 15, 16], "rotation": 270, "texture": "#2"},
|
||||
"up": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"down": {"uv": [1, 13, 15, 16], "rotation": 180, "texture": "#2"}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
"south": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"west": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"up": {"uv": [1, 0, 15, 14], "texture": "#2"},
|
||||
"down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}
|
||||
"down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
"faces": {
|
||||
"north": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#2"},
|
||||
"east": {"uv": [1, 13, 15, 16], "rotation": 90, "texture": "#2"},
|
||||
"south": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"},
|
||||
"south": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"},
|
||||
"west": {"uv": [1, 13, 15, 16], "rotation": 270, "texture": "#2"},
|
||||
"up": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"down": {"uv": [1, 13, 15, 16], "rotation": 180, "texture": "#2"}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
"south": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"west": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"up": {"uv": [1, 0, 15, 14], "texture": "#2"},
|
||||
"down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}
|
||||
"down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
"faces": {
|
||||
"north": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#2"},
|
||||
"east": {"uv": [1, 13, 15, 16], "rotation": 90, "texture": "#2"},
|
||||
"south": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"},
|
||||
"south": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"},
|
||||
"west": {"uv": [1, 13, 15, 16], "rotation": 270, "texture": "#2"},
|
||||
"up": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"down": {"uv": [1, 13, 15, 16], "rotation": 180, "texture": "#2"}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
"south": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"west": {"uv": [1, 13, 15, 16], "texture": "#2"},
|
||||
"up": {"uv": [1, 0, 15, 14], "texture": "#2"},
|
||||
"down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}
|
||||
"down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -8,11 +8,11 @@
|
|||
"elements": [
|
||||
{
|
||||
"from": [1, -5.75, -1.25],
|
||||
"to": [7, 1.25, -0.25],
|
||||
"to": [7, 1.25, 0.75],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [5, -0.75, -2.25]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 6, 7], "texture": "#1"},
|
||||
"up": {"uv": [0, 0, 6, 1], "texture": "#1"}
|
||||
"north": {"uv": [0, 1, 6, 8], "texture": "#1"},
|
||||
"up": {"uv": [0, 0, 6, 2], "texture": "#1"}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
"to": [11, 1.25, 4.75],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [5, 0.25, -1.25]},
|
||||
"faces": {
|
||||
"north": {"uv": [7, 1, 13, 2], "texture": "#1"},
|
||||
"up": {"uv": [7, 1, 13, 7], "texture": "#1"}
|
||||
"north": {"uv": [0, 1, 6, 2], "texture": "#1"},
|
||||
"up": {"uv": [0, 2, 6, 8], "texture": "#1"}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
Before Width: | Height: | Size: 460 B After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 585 B After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 7 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 809 B After Width: | Height: | Size: 808 B |
Before Width: | Height: | Size: 735 B After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 695 B After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 685 B After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 222 B After Width: | Height: | Size: 291 B |