From 0745e4451859c6f9c90d22cbb700391abc8a1c51 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 6 May 2022 22:04:36 +0200 Subject: [PATCH] Taller stations - Updates to station and signal assets by Kryppers - Modified stations to behave like depots in their item handling --- .../java/com/simibubi/create/AllShapes.java | 2 +- .../logistics/block/depot/DepotBehaviour.java | 23 ++++ .../block/depot/DepotItemHandler.java | 2 +- .../mechanicalArm/ArmInteractionPoint.java | 35 ++++--- .../edgePoint/station/StationBlock.java | 16 ++- .../edgePoint/station/StationRenderer.java | 43 +------- .../edgePoint/station/StationTileEntity.java | 44 ++------ .../models/block/track_station/block.json | 49 ++++----- .../block/track_station/flag_assemble.json | 85 +++++---------- .../models/block/track_station/flag_off.json | 54 +++++----- .../models/block/track_station/flag_on.json | 54 +++++----- .../models/block/track_station/item.json | 98 ++++++++---------- .../textures/block/chain_signal_box.png | Bin 308 -> 6374 bytes .../create/textures/block/signal_box.png | Bin 284 -> 6264 bytes .../assets/create/textures/block/station.png | Bin 0 -> 3286 bytes 15 files changed, 224 insertions(+), 281 deletions(-) create mode 100644 src/main/resources/assets/create/textures/block/station.png diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index d832e4109..909b9c9a0 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -249,7 +249,7 @@ public class AllShapes { .build(), DEPOT = shape(CASING_11PX.get(Direction.UP)).add(1, 11, 1, 15, 13, 15) .build(), - STATION = shape(0, 0, 0, 16, 2, 16).add(1, 0, 1, 15, 8, 15) + STATION = shape(0, 0, 0, 16, 2, 16).add(1, 0, 1, 15, 13, 15) .build() ; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java index f2f5e3e59..9c730da0e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.block.depot; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; @@ -51,6 +52,8 @@ public class DepotBehaviour extends TileEntityBehaviour { Supplier maxStackSize; Supplier canAcceptItems; Predicate canFunnelsPullFrom; + Consumer onHeldInserted; + Predicate acceptedItems; boolean allowMerge; public DepotBehaviour(SmartTileEntity te) { @@ -58,6 +61,9 @@ public class DepotBehaviour extends TileEntityBehaviour { maxStackSize = () -> 64; canAcceptItems = () -> true; canFunnelsPullFrom = $ -> true; + acceptedItems = $ -> true; + onHeldInserted = $ -> { + }; incoming = new ArrayList<>(); itemHandler = new DepotItemHandler(this); lazyItemHandler = LazyOptional.of(() -> itemHandler); @@ -71,6 +77,16 @@ public class DepotBehaviour extends TileEntityBehaviour { public void enableMerging() { allowMerge = true; } + + public DepotBehaviour withCallback(Consumer changeListener) { + onHeldInserted = changeListener; + return this; + } + + public DepotBehaviour onlyAccepts(Predicate filter) { + acceptedItems = filter; + return this; + } @Override public void tick() { @@ -245,6 +261,8 @@ public class DepotBehaviour extends TileEntityBehaviour { public ItemStack insert(TransportedItemStack heldItem, boolean simulate) { if (!canAcceptItems.get()) return heldItem.stack; + if (!acceptedItems.test(heldItem.stack)) + return heldItem.stack; if (canMergeItems()) { int remainingSpace = getRemainingSpace(); @@ -285,6 +303,7 @@ public class DepotBehaviour extends TileEntityBehaviour { AllSoundEvents.DEPOT_PLOP.playOnServer(getWorld(), getPos()); } this.heldItem = heldItem; + onHeldInserted.accept(heldItem.stack); } return ItemStack.EMPTY; } @@ -385,4 +404,8 @@ public class DepotBehaviour extends TileEntityBehaviour { return TYPE; } + public boolean isItemValid(ItemStack stack) { + return acceptedItems.test(stack); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotItemHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotItemHandler.java index f5836b752..e7b9a4473 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotItemHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotItemHandler.java @@ -66,7 +66,7 @@ public class DepotItemHandler implements IItemHandler { @Override public boolean isItemValid(int slot, ItemStack stack) { - return slot == MAIN_SLOT; + return slot == MAIN_SLOT && te.isItemValid(stack); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index 4b3a50475..e96e3520d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -96,7 +96,8 @@ public abstract class ArmInteractionPoint { public static void addPoint(ArmInteractionPoint instance, Supplier factory) { if (POINTS.containsKey(instance)) - Create.LOGGER.warn("Point for " + instance.getClass().getSimpleName() + " was overridden"); + Create.LOGGER.warn("Point for " + instance.getClass() + .getSimpleName() + " was overridden"); POINTS.put(instance, factory); } @@ -223,7 +224,8 @@ public abstract class ArmInteractionPoint { @Override protected Vec3 getInteractionPositionVector() { - return Vec3.atLowerCornerOf(pos).add(.5f, 1, .5f); + return Vec3.atLowerCornerOf(pos) + .add(.5f, 1, .5f); } } @@ -232,12 +234,14 @@ public abstract class ArmInteractionPoint { @Override protected Vec3 getInteractionPositionVector() { - return Vec3.atLowerCornerOf(pos).add(.5f, 14 / 16f, .5f); + return Vec3.atLowerCornerOf(pos) + .add(.5f, 14 / 16f, .5f); } @Override protected boolean isValid(BlockGetter reader, BlockPos pos, BlockState state) { - return AllBlocks.DEPOT.has(state) || AllBlocks.WEIGHTED_EJECTOR.has(state); + return AllBlocks.DEPOT.has(state) || AllBlocks.WEIGHTED_EJECTOR.has(state) + || AllBlocks.TRACK_STATION.has(state); } } @@ -274,7 +278,8 @@ public abstract class ArmInteractionPoint { @Override protected Vec3 getInteractionPositionVector() { - return Vec3.atLowerCornerOf(pos).add(.5f, 13 / 16f, .5f); + return Vec3.atLowerCornerOf(pos) + .add(.5f, 13 / 16f, .5f); } @Override @@ -305,8 +310,8 @@ public abstract class ArmInteractionPoint { @Override protected Vec3 getInteractionPositionVector() { - return super.getInteractionPositionVector() - .add(Vec3.atLowerCornerOf(getInteractionDirection().getNormal()).scale(.65f)); + return super.getInteractionPositionVector().add(Vec3.atLowerCornerOf(getInteractionDirection().getNormal()) + .scale(.65f)); } } @@ -326,7 +331,8 @@ public abstract class ArmInteractionPoint { @Override protected ItemStack insert(Level world, ItemStack stack, boolean simulate) { ItemStack input = stack.copy(); - InteractionResultHolder res = BlazeBurnerBlock.tryInsert(state, world, pos, input, false, false, simulate); + InteractionResultHolder res = + BlazeBurnerBlock.tryInsert(state, world, pos, input, false, false, simulate); ItemStack remainder = res.getObject(); if (input.isEmpty()) { return remainder; @@ -370,8 +376,8 @@ public abstract class ArmInteractionPoint { @Override protected Vec3 getInteractionPositionVector() { - return super.getInteractionPositionVector() - .add(Vec3.atLowerCornerOf(getInteractionDirection().getNormal()).scale(.5f)); + return super.getInteractionPositionVector().add(Vec3.atLowerCornerOf(getInteractionDirection().getNormal()) + .scale(.5f)); } } @@ -486,7 +492,8 @@ public abstract class ArmInteractionPoint { protected Vec3 getInteractionPositionVector() { return VecHelper.getCenterOf(pos) .add(Vec3.atLowerCornerOf(FunnelBlock.getFunnelFacing(state) - .getNormal()).scale(-.15f)); + .getNormal()) + .scale(-.15f)); } @Override @@ -510,7 +517,8 @@ public abstract class ArmInteractionPoint { FilteringBehaviour filtering = TileEntityBehaviour.get(world, pos, FilteringBehaviour.TYPE); InvManipulationBehaviour inserter = TileEntityBehaviour.get(world, pos, InvManipulationBehaviour.TYPE); BlockState state = world.getBlockState(pos); - if (state.getOptionalValue(BlockStateProperties.POWERED).orElse(false)) + if (state.getOptionalValue(BlockStateProperties.POWERED) + .orElse(false)) return stack; if (inserter == null) return stack; @@ -535,7 +543,8 @@ public abstract class ArmInteractionPoint { protected boolean isValid(BlockGetter reader, BlockPos pos, BlockState state) { return state.getBlock() instanceof AbstractFunnelBlock && !(state.hasProperty(FunnelBlock.EXTRACTING) && state.getValue(FunnelBlock.EXTRACTING)) - && !(state.hasProperty(BeltFunnelBlock.SHAPE) && state.getValue(BeltFunnelBlock.SHAPE) == Shape.PUSHING); + && !(state.hasProperty(BeltFunnelBlock.SHAPE) + && state.getValue(BeltFunnelBlock.SHAPE) == Shape.PUSHING); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationBlock.java index a0732338f..eca9e95cc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationBlock.java @@ -4,6 +4,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.logistics.block.depot.SharedDepotBlockMethods; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.gui.ScreenOpener; @@ -12,6 +13,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; @@ -61,6 +63,17 @@ public class StationBlock extends Block implements ITE { super.fillItemCategory(pTab, pItems); } + @Override + public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving); + } + + @Override + public void updateEntityAfterFallOn(BlockGetter worldIn, Entity entityIn) { + super.updateEntityAfterFallOn(worldIn, entityIn); + SharedDepotBlockMethods.onLanded(worldIn, entityIn); + } + @Override public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { @@ -79,7 +92,8 @@ public class StationBlock extends Block implements ITE { return InteractionResult.SUCCESS; pPlayer.getInventory() .placeItemBackInInventory(autoSchedule.copy()); - station.autoSchedule.setStackInSlot(0, ItemStack.EMPTY); + station.depotBehaviour.removeHeldItem(); + station.notifyUpdate(); AllSoundEvents.playItemPickup(pPlayer); return InteractionResult.SUCCESS; }); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java index 44520fafd..396bc5ccc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java @@ -2,11 +2,10 @@ package com.simibubi.create.content.logistics.trains.management.edgePoint.statio import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.util.transform.Transform; -import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.logistics.block.depot.DepotRenderer; import com.simibubi.create.content.logistics.trains.ITrackBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour.RenderedTrackOverlayType; @@ -14,23 +13,17 @@ import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec3; public class StationRenderer extends SafeTileEntityRenderer { @@ -44,10 +37,8 @@ public class StationRenderer extends SafeTileEntityRenderer { TrackTargetingBehaviour target = te.edgePoint; BlockPos targetPosition = target.getGlobalPosition(); Level level = te.getLevel(); - ItemStack autoSchedule = te.getAutoSchedule(); - if (!autoSchedule.isEmpty()) - renderItem(autoSchedule, te, partialTicks, ms, buffer, light, overlay); + DepotRenderer.renderItemsOf(te, partialTicks, ms, buffer, light, overlay, te.depotBehaviour); BlockState trackState = level.getBlockState(targetPosition); Block block = trackState.getBlock(); @@ -114,31 +105,6 @@ public class StationRenderer extends SafeTileEntityRenderer { ms.popPose(); } - public static void renderItem(ItemStack itemStack, StationTileEntity te, float partialTicks, PoseStack ms, - MultiBufferSource buffer, int light, int overlay) { - ItemRenderer itemRenderer = Minecraft.getInstance() - .getItemRenderer(); - TransformStack msr = TransformStack.cast(ms); - - ms.pushPose(); - msr.centre(); - - Entity renderViewEntity = Minecraft.getInstance().cameraEntity; - if (renderViewEntity != null) { - Vec3 positionVec = renderViewEntity.position(); - Vec3 vectorForOffset = Vec3.atCenterOf(te.getBlockPos()); - Vec3 diff = vectorForOffset.subtract(positionVec); - float yRot = (float) (Mth.atan2(diff.x, diff.z) + Math.PI); - ms.mulPose(Vector3f.YP.rotation(yRot)); - } - - ms.translate(0, 10 / 32d, 0); - ms.scale(.75f, .75f, .75f); - itemRenderer.renderStatic(itemStack, TransformType.FIXED, light, overlay, ms, buffer, 0); - - ms.popPose(); - } - public static void renderFlag(PartialModel flag, StationTileEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { if (!te.resolveFlagAngle()) @@ -161,11 +127,12 @@ public class StationRenderer extends SafeTileEntityRenderer { progress += (Math.sin(wiggleProgress * (2 * Mth.PI) * 4) / 8f) / Math.max(1, 8f * wiggleProgress); } + float nudge = 1 / 512f; flag.centre() .rotateY(yRot) - .translate(1 / 64f, 4.5f / 16f, flipped ? 13.5f / 16f : 2.5f / 16f) + .translate(nudge, 9.5f / 16f, flipped ? 14f / 16f - nudge : 2f / 16f + nudge) .unCentre() - .rotateX((flipped ? 1 : -1) * (progress * 60 + 300)); + .rotateX((flipped ? 1 : -1) * (progress * 90 + 270)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java index 1d9c434b3..6d62c1a0f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java @@ -16,6 +16,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; +import com.simibubi.create.content.logistics.block.depot.DepotBehaviour; import com.simibubi.create.content.logistics.trains.IBogeyBlock; import com.simibubi.create.content.logistics.trains.ITrackBlock; import com.simibubi.create.content.logistics.trains.TrackEdge; @@ -64,9 +65,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.network.PacketDistributor; public class StationTileEntity extends SmartTileEntity { @@ -76,8 +74,7 @@ public class StationTileEntity extends SmartTileEntity { protected int failedCarriageIndex; protected AssemblyException lastException; - protected IItemHandlerModifiable autoSchedule; - protected LazyOptional capability; + protected DepotBehaviour depotBehaviour; // for display UUID imminentTrain; @@ -95,16 +92,16 @@ public class StationTileEntity extends SmartTileEntity { setLazyTickRate(20); lastException = null; failedCarriageIndex = -1; - autoSchedule = new StationInventory(); - capability = LazyOptional.of(() -> autoSchedule); flag = LerpedFloat.linear() .startWithValue(0); } @Override public void addBehaviours(List behaviours) { - edgePoint = new TrackTargetingBehaviour<>(this, EdgePointType.STATION); - behaviours.add(edgePoint); + behaviours.add(edgePoint = new TrackTargetingBehaviour<>(this, EdgePointType.STATION)); + behaviours.add(depotBehaviour = new DepotBehaviour(this).onlyAccepts(AllItems.SCHEDULE::isIn) + .withCallback(s -> applyAutoSchedule())); + depotBehaviour.addSubBehaviours(behaviours); } @Override @@ -114,8 +111,6 @@ public class StationTileEntity extends SmartTileEntity { super.read(tag, clientPacket); invalidateRenderBoundingBox(); - autoSchedule.setStackInSlot(0, ItemStack.of(tag.getCompound("HeldItem"))); - if (!clientPacket) return; if (!tag.contains("ImminentTrain")) { @@ -138,8 +133,6 @@ public class StationTileEntity extends SmartTileEntity { protected void write(CompoundTag tag, boolean clientPacket) { AssemblyException.write(tag, lastException); tag.putInt("FailedCarriageIndex", failedCarriageIndex); - tag.put("HeldItem", autoSchedule.getStackInSlot(0) - .serializeNBT()); super.write(tag, clientPacket); @@ -620,13 +613,13 @@ public class StationTileEntity extends SmartTileEntity { } public ItemStack getAutoSchedule() { - return autoSchedule.getStackInSlot(0); + return depotBehaviour.getHeldItemStack(); } @Override public LazyOptional getCapability(Capability cap, Direction side) { if (isItemHandlerCap(cap)) - return capability.cast(); + return depotBehaviour.getItemCapability(cap, side); return super.getCapability(cap, side); } @@ -649,7 +642,7 @@ public class StationTileEntity extends SmartTileEntity { if (!(level instanceof ServerLevel server)) return; - Vec3 v = Vec3.atCenterOf(worldPosition); + Vec3 v = Vec3.atBottomCenterOf(worldPosition.above()); server.sendParticles(ParticleTypes.HAPPY_VILLAGER, v.x, v.y, v.z, 8, 0.35, 0.05, 0.35, 1); server.sendParticles(ParticleTypes.END_ROD, v.x, v.y + .25f, v.z, 10, 0.05, 1, 0.05, 0.005f); } @@ -684,23 +677,4 @@ public class StationTileEntity extends SmartTileEntity { return true; } - private class StationInventory extends ItemStackHandler { - - public StationInventory() { - super(1); - } - - @Override - protected void onContentsChanged(int slot) { - applyAutoSchedule(); - sendData(); - } - - @Override - public boolean isItemValid(int slot, ItemStack stack) { - return super.isItemValid(slot, stack) && AllItems.SCHEDULE.isIn(stack); - } - - } - } diff --git a/src/main/resources/assets/create/models/block/track_station/block.json b/src/main/resources/assets/create/models/block/track_station/block.json index 889392c67..fe22a3fe5 100644 --- a/src/main/resources/assets/create/models/block/track_station/block.json +++ b/src/main/resources/assets/create/models/block/track_station/block.json @@ -1,45 +1,40 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "6": "create:block/bogey/frame", - "1_1": "create:block/signal_box_top", - "particle": "create:block/signal_box", - "1_0": "create:block/signal_box" + "0": "create:block/station", + "particle": "create:block/station" }, "elements": [ - { - "from": [1, 6, 1], - "to": [15, 8, 15], - "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "east": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "west": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "up": {"uv": [1, 1, 15, 15], "texture": "#1_1"} - } - }, { "from": [1, 2, 1], - "to": [15, 6, 15], + "to": [15, 13, 15], "faces": { - "north": {"uv": [0, 4, 7, 6], "texture": "#6"}, - "east": {"uv": [0, 4, 7, 6], "texture": "#6"}, - "south": {"uv": [0, 4, 7, 6], "texture": "#6"}, - "west": {"uv": [0, 4, 7, 6], "texture": "#6"} + "north": {"uv": [0.5, 1.5, 7.5, 7], "texture": "#0"}, + "east": {"uv": [0.5, 1.5, 7.5, 7], "texture": "#0"}, + "south": {"uv": [0.5, 1.5, 7.5, 7], "texture": "#0"}, + "west": {"uv": [0.5, 1.5, 7.5, 7], "texture": "#0"}, + "up": {"uv": [8.5, 0.5, 15.5, 7.5], "texture": "#0"} } }, { "from": [0, 0, 0], "to": [16, 2, 16], "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "east": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "west": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#1_1"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#1_1"} + "north": {"uv": [0, 7, 8, 8], "texture": "#0"}, + "east": {"uv": [8, 7, 0, 8], "texture": "#0"}, + "south": {"uv": [0, 7, 8, 8], "texture": "#0"}, + "west": {"uv": [0, 7, 8, 8], "texture": "#0"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#0"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#0"} } } + ], + "groups": [ + { + "name": "Base", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] + } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track_station/flag_assemble.json b/src/main/resources/assets/create/models/block/track_station/flag_assemble.json index a446c4c1c..4c0bf099f 100644 --- a/src/main/resources/assets/create/models/block/track_station/flag_assemble.json +++ b/src/main/resources/assets/create/models/block/track_station/flag_assemble.json @@ -1,76 +1,43 @@ { "credit": "Made with Blockbench", - "parent": "block/block", - "ambientocclusion": false, - "texture_size": [32, 32], "textures": { - "2": "create:entity/blueprint_small", - "6": "create:block/bogey/frame", - "particle": "create:block/signal_box", - "1_0": "create:block/signal_box" + "0": "create:block/station", + "1": "create:entity/blueprint_small", + "particle": "create:block/station" }, "elements": [ { - "from": [0, 1, -1], - "to": [1, 13, 1], - "faces": { - "north": {"uv": [3.5, 7, 4, 13], "texture": "#6"}, - "east": {"uv": [4.5, 7, 3.5, 13], "texture": "#6"}, - "south": {"uv": [4, 7, 4.5, 13], "texture": "#6"}, - "west": {"uv": [3.5, 7, 4.5, 13], "texture": "#6"}, - "up": {"uv": [3.5, 7.5, 4.5, 7], "rotation": 90, "texture": "#6"} - } - }, - { + "name": "Flag Pole", "from": [0, -1, -1], - "to": [1, 1, 1], + "to": [1, 13, 1], + "rotation": {"angle": 0, "axis": "x", "origin": [14, 0, 0]}, "faces": { - "north": {"uv": [4, 7, 3.5, 8], "texture": "#6"}, - "east": {"uv": [4.5, 7, 3.5, 8], "texture": "#6"}, - "south": {"uv": [4.5, 7, 4, 8], "texture": "#6"}, - "west": {"uv": [4.5, 7, 3.5, 8], "texture": "#6"}, - "down": {"uv": [3.5, 8, 4.5, 7.5], "rotation": 270, "texture": "#6"} + "north": {"uv": [0.5, 1, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "east": {"uv": [0.5, 0.5, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0.5, 0.5, 7.5, 1], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0.5, 0.5, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [7.5, 0.5, 7, 1.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 0.5, 0.5, 1.5], "texture": "#0"} } }, { - "from": [0.5, 9, -7], - "to": [0.5, 13, 0], + "name": "Flag", + "from": [0.5, 9, -6.5], + "to": [0.5, 13, -0.5], + "rotation": {"angle": 0, "axis": "x", "origin": [14, 0, 0]}, "faces": { - "east": {"uv": [1, 9, 5, 2], "rotation": 90, "texture": "#2"}, - "west": {"uv": [1, 2, 5, 9], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 14, 4, 14], "rotation": 270, "texture": "#1_0"} + "east": {"uv": [2, 1, 6, 7], "rotation": 270, "texture": "#1"}, + "west": {"uv": [2, 1, 6, 7], "rotation": 90, "texture": "#1"} } } ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 225, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 225, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "scale": [0.5, 0.5, 0.5] + "display": {}, + "groups": [ + { + "name": "Flag", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] } - } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track_station/flag_off.json b/src/main/resources/assets/create/models/block/track_station/flag_off.json index 88bda60ee..ca216e14f 100644 --- a/src/main/resources/assets/create/models/block/track_station/flag_off.json +++ b/src/main/resources/assets/create/models/block/track_station/flag_off.json @@ -1,43 +1,43 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "2": "create:block/indicator/0", - "6": "create:block/bogey/frame", - "particle": "create:block/signal_box", - "1_0": "create:block/signal_box" + "0": "create:block/station", + "1": "create:block/indicator/0", + "particle": "create:block/station" }, "elements": [ { - "from": [0, 1, -1], - "to": [1, 13, 1], - "faces": { - "north": {"uv": [3.5, 7, 4, 13], "texture": "#6"}, - "east": {"uv": [4.5, 7, 3.5, 13], "texture": "#6"}, - "south": {"uv": [4, 7, 4.5, 13], "texture": "#6"}, - "west": {"uv": [3.5, 7, 4.5, 13], "texture": "#6"}, - "up": {"uv": [3.5, 7.5, 4.5, 7], "rotation": 90, "texture": "#6"} - } - }, - { + "name": "Flag Pole", "from": [0, -1, -1], - "to": [1, 1, 1], + "to": [1, 13, 1], + "rotation": {"angle": 0, "axis": "x", "origin": [14, 0, 0]}, "faces": { - "north": {"uv": [4, 7, 3.5, 8], "texture": "#6"}, - "east": {"uv": [4.5, 7, 3.5, 8], "texture": "#6"}, - "south": {"uv": [4.5, 7, 4, 8], "texture": "#6"}, - "west": {"uv": [4.5, 7, 3.5, 8], "texture": "#6"}, - "down": {"uv": [3.5, 8, 4.5, 7.5], "rotation": 270, "texture": "#6"} + "north": {"uv": [0.5, 1, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "east": {"uv": [0.5, 0.5, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0.5, 0.5, 7.5, 1], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0.5, 0.5, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [7.5, 0.5, 7, 1.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 0.5, 0.5, 1.5], "texture": "#0"} } }, { - "from": [0.5, 9, -7], - "to": [0.5, 13, 0], + "name": "Flag", + "from": [0.5, 9, -6.5], + "to": [0.5, 13, -0.5], + "rotation": {"angle": 0, "axis": "x", "origin": [14, 0, 0]}, "faces": { - "east": {"uv": [0, 0, 4, 7], "rotation": 90, "texture": "#2"}, - "west": {"uv": [0, 0, 4, 7], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 14, 4, 14], "rotation": 270, "texture": "#1_0"} + "east": {"uv": [0, 0, 4, 6], "rotation": 270, "texture": "#1"}, + "west": {"uv": [0, 0, 4, 6], "rotation": 90, "texture": "#1"} } } + ], + "display": {}, + "groups": [ + { + "name": "Flag", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] + } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track_station/flag_on.json b/src/main/resources/assets/create/models/block/track_station/flag_on.json index 567a9010a..8d25192d1 100644 --- a/src/main/resources/assets/create/models/block/track_station/flag_on.json +++ b/src/main/resources/assets/create/models/block/track_station/flag_on.json @@ -1,43 +1,43 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "2": "create:block/indicator/6", - "6": "create:block/bogey/frame", - "particle": "create:block/signal_box", - "1_0": "create:block/signal_box" + "0": "create:block/station", + "1": "create:block/indicator/6", + "particle": "create:block/station" }, "elements": [ { - "from": [0, 1, -1], - "to": [1, 13, 1], - "faces": { - "north": {"uv": [3.5, 7, 4, 13], "texture": "#6"}, - "east": {"uv": [4.5, 7, 3.5, 13], "texture": "#6"}, - "south": {"uv": [4, 7, 4.5, 13], "texture": "#6"}, - "west": {"uv": [3.5, 7, 4.5, 13], "texture": "#6"}, - "up": {"uv": [3.5, 7.5, 4.5, 7], "rotation": 90, "texture": "#6"} - } - }, - { + "name": "Flag Pole", "from": [0, -1, -1], - "to": [1, 1, 1], + "to": [1, 13, 1], + "rotation": {"angle": 0, "axis": "x", "origin": [14, 0, 0]}, "faces": { - "north": {"uv": [4, 7, 3.5, 8], "texture": "#6"}, - "east": {"uv": [4.5, 7, 3.5, 8], "texture": "#6"}, - "south": {"uv": [4.5, 7, 4, 8], "texture": "#6"}, - "west": {"uv": [4.5, 7, 3.5, 8], "texture": "#6"}, - "down": {"uv": [3.5, 8, 4.5, 7.5], "rotation": 270, "texture": "#6"} + "north": {"uv": [0.5, 1, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "east": {"uv": [0.5, 0.5, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0.5, 0.5, 7.5, 1], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0.5, 0.5, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [7.5, 0.5, 7, 1.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 0.5, 0.5, 1.5], "texture": "#0"} } }, { - "from": [0.5, 9, -7], - "to": [0.5, 13, 0], + "name": "Flag", + "from": [0.5, 9, -6.5], + "to": [0.5, 13, -0.5], + "rotation": {"angle": 0, "axis": "x", "origin": [14, 0, 0]}, "faces": { - "east": {"uv": [0, 0, 4, 7], "rotation": 90, "texture": "#2"}, - "west": {"uv": [0, 0, 4, 7], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 14, 4, 14], "rotation": 270, "texture": "#1_0"} + "east": {"uv": [0, 0, 4, 6], "rotation": 270, "texture": "#1"}, + "west": {"uv": [0, 0, 4, 6], "rotation": 90, "texture": "#1"} } } + ], + "display": {}, + "groups": [ + { + "name": "Flag", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] + } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track_station/item.json b/src/main/resources/assets/create/models/block/track_station/item.json index aa85942ca..8bd97edfe 100644 --- a/src/main/resources/assets/create/models/block/track_station/item.json +++ b/src/main/resources/assets/create/models/block/track_station/item.json @@ -1,76 +1,56 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "2": "create:block/indicator/6", - "6": "create:block/bogey/frame", - "1_1": "create:block/signal_box_top", - "particle": "create:block/signal_box", - "1_0": "create:block/signal_box" + "0": "create:block/station", + "1": "create:block/indicator/6", + "particle": "create:block/station" }, "elements": [ - { - "from": [1, 6, 1], - "to": [15, 8, 15], - "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "east": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "west": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "up": {"uv": [1, 1, 15, 15], "texture": "#1_1"} - } - }, { "from": [1, 2, 1], - "to": [15, 6, 15], + "to": [15, 13, 15], "faces": { - "north": {"uv": [0, 4, 7, 6], "texture": "#6"}, - "east": {"uv": [0, 4, 7, 6], "texture": "#6"}, - "south": {"uv": [0, 4, 7, 6], "texture": "#6"}, - "west": {"uv": [0, 4, 7, 6], "texture": "#6"} + "north": {"uv": [0.5, 1.5, 7.5, 7], "texture": "#0"}, + "east": {"uv": [0.5, 1.5, 7.5, 7], "texture": "#0"}, + "south": {"uv": [0.5, 1.5, 7.5, 7], "texture": "#0"}, + "west": {"uv": [0.5, 1.5, 7.5, 7], "texture": "#0"}, + "up": {"uv": [8.5, 0.5, 15.5, 7.5], "texture": "#0"} } }, { "from": [0, 0, 0], "to": [16, 2, 16], "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "east": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "west": {"uv": [0, 14, 16, 16], "texture": "#1_0"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#1_1"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#1_1"} + "north": {"uv": [0, 7, 8, 8], "texture": "#0"}, + "east": {"uv": [8, 7, 0, 8], "texture": "#0"}, + "south": {"uv": [0, 7, 8, 8], "texture": "#0"}, + "west": {"uv": [0, 7, 8, 8], "texture": "#0"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#0"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#0"} } }, { - "from": [15, 5.5, 12.5], - "to": [16, 17.5, 14.5], + "name": "Flag Pole", + "from": [15, 8.5, 13], + "to": [16, 22.5, 15], + "rotation": {"angle": 0, "axis": "x", "origin": [14, 8.5, 14]}, "faces": { - "north": {"uv": [3.5, 7, 4, 13], "texture": "#6"}, - "east": {"uv": [4.5, 7, 3.5, 13], "texture": "#6"}, - "south": {"uv": [4, 7, 4.5, 13], "texture": "#6"}, - "west": {"uv": [3.5, 7, 4.5, 13], "texture": "#6"}, - "up": {"uv": [3.5, 7.5, 4.5, 7], "rotation": 90, "texture": "#6"} + "north": {"uv": [0.5, 0.5, 7.5, 1], "rotation": 270, "texture": "#0"}, + "east": {"uv": [0.5, 0.5, 7.5, 1.5], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0.5, 0.5, 7.5, 1], "rotation": 270, "texture": "#0"}, + "west": {"uv": [0.5, 0.5, 7.5, 1.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [7.5, 0.5, 7, 1.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 0.5, 0.5, 1.5], "texture": "#0"} } }, { - "from": [15, 3.5, 12.5], - "to": [16, 5.5, 14.5], + "name": "Flag", + "from": [15.5, 18.5, 7.5], + "to": [15.5, 22.5, 13.5], + "rotation": {"angle": 0, "axis": "x", "origin": [14, 8.5, 14]}, "faces": { - "north": {"uv": [4, 7, 3.5, 8], "texture": "#6"}, - "east": {"uv": [4.5, 7, 3.5, 8], "texture": "#6"}, - "south": {"uv": [4.5, 7, 4, 8], "texture": "#6"}, - "west": {"uv": [4.5, 7, 3.5, 8], "texture": "#6"}, - "down": {"uv": [3.5, 8, 4.5, 7.5], "rotation": 270, "texture": "#6"} - } - }, - { - "from": [15.5, 13.5, 6.5], - "to": [15.5, 17.5, 13.5], - "faces": { - "east": {"uv": [0, 0, 4, 7], "rotation": 90, "texture": "#2"}, - "west": {"uv": [0, 0, 4, 7], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 14, 4, 14], "rotation": 270, "texture": "#1_0"} + "east": {"uv": [0, 0, 4, 6], "rotation": 270, "texture": "#1"}, + "west": {"uv": [0, 0, 4, 6], "rotation": 90, "texture": "#1"} } } ], @@ -104,5 +84,19 @@ "fixed": { "scale": [0.5, 0.5, 0.5] } - } + }, + "groups": [ + { + "name": "Base", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] + }, + { + "name": "Flag", + "origin": [8, 8, 8], + "color": 0, + "children": [2, 3] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/chain_signal_box.png b/src/main/resources/assets/create/textures/block/chain_signal_box.png index 0ef4b4f1a4cc406753a5937e620be7c7189645cd..ba9cae8fa89d5ac8441fc5949d92aaae545ee2c9 100644 GIT binary patch literal 6374 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 delta 292 zcmaE6xP@tgWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE0FIL;1l9n zMz}B8wRq_zu*A2*#{yot!|?YEKu(5RKs4{?~km z6*$}$zO9Pp?)vd>{Vx9A>`n64SxoMo4o5EU*<so+({3Q3Bwbk;6Lp(IRyA}h_tmaROu^Nju5oQ0;{T84doJca{UbGCaev0+ZtIV= mwwL8(t%Y-68^1mBh4IB_eo4jCGXH_@VDNPHb6Mw<&;$V6xN1-U diff --git a/src/main/resources/assets/create/textures/block/signal_box.png b/src/main/resources/assets/create/textures/block/signal_box.png index 1389b0c3c4a66d4e660d44650b7dd88e30a3b75f..8b3c82e53fdafd6bb685d5842dab1eca5f4c92c3 100644 GIT binary patch literal 6264 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 YJqfkMU${Z1p?!e4I(a%)EDullUqNhwjQ{`u delta 248 zcmVAtppiOuE;DFq6*~7=Ld`L_t(2Q-zN~62u?~1ljB+Dk#GLKbt|<9CAont-{tR zk?6C1f7_q^AWA8hyeK&lOKmk4hE!ovR^~onluFt{COq7O*i%cQnh;$gA y5y!qS5jUR2Ju;X=8(vv>^bu`bn7#crrxO{#3$;m)Z2CNiunj39kepLLi0+C@M^5CNPp@LNbu(_V@s; zOVv|*To$Y1f{)tPM^~&x!L{}Pu2ol5v~-WUKC5;ui_gW~s_Zu*P_%aI**RyDeBb=< z@4NTTz2BEgLqYK`C<;_kQn!KZe|d&hY^zm>E`W6)_dkip4VXe-6z zO=+w8K%Ls05Z;>KJ}Wu4yc4>yz79JG#om}QdwTh*^Vvlgzq)l^SY%E$&JQ2bQC<mBEa^9~p^6);-v*U+v)gO~YTV(2#@TjqA6ZWvkw9TOp#*~;YvM0wmBX)0T zP!wMbEw0&c6)~NymdxL!EFV1f18pFG%mqVYuAak-3sOPiK}92@3fZ0&0KL!aCXm(Gu``dqM5uNiDPHO^RS?T+Z!G) z$y*cQ=YQ!~YiVBAzm}hxP;mF__4>b6JwsQS-}c0BFFfggJ+GFzcyI5)_uB)Yv<2`L zUcl;Oxs~-DjhCAm4m8B~l>Aun*nfS6^8hw;SsQpQyAA24!cVQki-wVdTZ*E%1hrANDSk2GX8z2qiq##s)3J^HiLzjv900KcOCuzZq z+L=BG7^(S1EbG98Lbuy3a7zS?vrs5fDwRS+EEJ1jpnzSA?JVwr?XKuvh!3NsT!fQ$ zury{^oD*tm$gFL=J2XHWuJ;9`ZbPHr`7wMB!rZevVp~2 zfGFzMvb5!=_wbVc+>@6U2TSyGUsCqvgL|z6eTPa0!uA&1V$|+0xMAq1&d`0 zR3=fPs7x;BLtMVGM1xMv7Yh*I&|t+`3*)qbuA%KD<97MxO|*^5VsS1>BAFBcL5iiQ zR3?!qWj;kV<#d6HlE7vH6b?#=w&8`8&|xp+LtN%D;5>l3Hv8i!e2A{88@ql zaohU=zNY*&>dQv`%tR;aW}L;D&P?+nieTTA`b%d0TqD@yTk?v2BLjfJYWqEi8h zaV~zhEcQF>$jXSBtLQpTDEI`9~%L1C>tIw%@N_P>( z6(0ijRs@AbN)v)$QaL6;`2(r}L?Pt1)Pb?7xQz%j_N!@7ahnyU<0?0+)Zwtwlyg8n zyrl*(1K=v*|F9T9^A-A=!(KJ$Woa14Vz37kv6*iB8@l!jCcV6LnxO11=FNh9MckX! z0SA{ixZYWCDuNNna^FGAjrtF3$_~oK36A2{cRD}e@dkzJw23A~<^p4odowcf(ZP`o z%WaO)?x2{Fo7m3!uDxMBJ=Ne{{44C#vETN)eBJgnlk?b|mw`kT;G zyK=um+W%_X9~->;#_h4ev3F`lEbp%JOWbo{$+f)=;_>&?Wg8XSPng!AdVlE|Y0S0@ zqx=Mel9o0sWa_t_kllN-VEE8G6A$0oFs`eBitTbapQ2w1r(QP)MrhvIrXBiY_3YTF z*1`U9EyJRgH3tsfU|dNX5)75%9>@4uju%O(TUS~$=$Rjl+9nFo;geKHf<`@-2A?Xn zZ0>9>?|e6S{;V@YPDd#>O|Q2$L8so+jg;~S`&Z^O<^zk4 zAJOh@JehkeC~%_r!%L0#$`W$?b3-d09$hsl$2087aGQCz)*RMdb1tR&#f%QwM;$@k znq_zOVZ^2Kw%=~t8E?9&Slf)Oy_u_ySl4`S&=zRaepST|U^ZV$D-zvYY-T3Ir z)+d&hr_am@E&8jUrd@vin2prDr)bUdzAB62~>7cQ$`?k8Ioyyg9^?w>X;zGxZoAWc&#uh5Ddvaaj7lV}dV^-Q%pU(UE s;pC>_e}sO2X9Aq6c87J|zWn@oKu}0RM_AfMhWodtOU}^lODZV;FCs9cF#rGn literal 0 HcmV?d00001