diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 10d8136e7..36b412ed4 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -291,7 +291,7 @@ c8467d55bc22d2e2256b8b732c06c9fdc64d336f assets/create/blockstates/polished_weat 5d811eab3c5e8411f98e2ea98d93d35955ce18fc assets/create/blockstates/polished_weathered_limestone_slab.json acec6cdebe772ca72de94a85d98199e827495acb assets/create/blockstates/polished_weathered_limestone_stairs.json f42ad32aefcfa7ccc6287f57ee1a5f092b65126f assets/create/blockstates/polished_weathered_limestone_wall.json -b7829c2ef2c47188713f8cab21b2c9bc7f9c5b79 assets/create/blockstates/portable_storage_interface.json +1b70b4e5792dccd2110b84e209016ac258005e28 assets/create/blockstates/portable_storage_interface.json 8296d43d5f1c2113012d127038fb319af83aaee4 assets/create/blockstates/powered_latch.json e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggle_latch.json 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets/create/blockstates/pulley_magnet.json @@ -1306,7 +1306,7 @@ e95125318055b8557afd7d108488cf0bdd81fe49 assets/create/models/item/polished_scor 68fb04f7a89c8117bb641e347df9bfc1f1248335 assets/create/models/item/polished_weathered_limestone_slab.json 6d92ee7112aa20e8a1adfe73d8933031c299bed1 assets/create/models/item/polished_weathered_limestone_stairs.json b4995fb4799f33508cd6bf2ded80c0b3e866ad43 assets/create/models/item/polished_weathered_limestone_wall.json -ef2c9dcd5f6385a0f0cdc2e9120c984827863100 assets/create/models/item/portable_storage_interface.json +3bc60b0d9884c2ee0f1dd530e90fceb699eea737 assets/create/models/item/portable_storage_interface.json d3cfc1a1137c4bc98848947d425d2972df144c95 assets/create/models/item/powdered_obsidian.json 1e501c1f2e9250aaaadcf17db62646d08177d4e1 assets/create/models/item/powered_latch.json 3a6dfc7f36e31ebfcd650c3144a7f2210e8a4f9f assets/create/models/item/powered_toggle_latch.json diff --git a/src/generated/resources/assets/create/blockstates/portable_storage_interface.json b/src/generated/resources/assets/create/blockstates/portable_storage_interface.json index 463c071a2..331749529 100644 --- a/src/generated/resources/assets/create/blockstates/portable_storage_interface.json +++ b/src/generated/resources/assets/create/blockstates/portable_storage_interface.json @@ -1,28 +1,28 @@ { "variants": { "facing=down": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 180 }, "facing=up": { - "model": "create:block/portable_storage_interface" + "model": "create:block/portable_storage_interface/block" }, "facing=north": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 90 }, "facing=south": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 90, "y": 180 }, "facing=west": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 90, "y": 270 }, "facing=east": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 90, "y": 90 } diff --git a/src/generated/resources/assets/create/models/item/portable_storage_interface.json b/src/generated/resources/assets/create/models/item/portable_storage_interface.json index 87d2165ba..3330b9ffd 100644 --- a/src/generated/resources/assets/create/models/item/portable_storage_interface.json +++ b/src/generated/resources/assets/create/models/item/portable_storage_interface.json @@ -1,3 +1,3 @@ { - "parent": "create:block/portable_storage_interface" + "parent": "create:block/portable_storage_interface/item" } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index cc08122af..492ee1335 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -68,6 +68,10 @@ public class AllBlockPartials { SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"), SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"), + + PORTABLE_STORAGE_INTERFACE_MIDDLE = get("portable_storage_interface/block_middle"), + PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED = get("portable_storage_interface/block_middle_powered"), + PORTABLE_STORAGE_INTERFACE_TOP = get("portable_storage_interface/block_top"), ARM_COG = get("mechanical_arm/cog"), ARM_BASE = get("mechanical_arm/base"), ARM_LOWER_BODY = get("mechanical_arm/lower_body"), ARM_UPPER_BODY = get("mechanical_arm/upper_body"), diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index fba5eac5b..a73c72662 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -20,6 +20,7 @@ import com.simibubi.create.content.contraptions.components.actors.HarvesterMovem import com.simibubi.create.content.contraptions.components.actors.PloughBlock; import com.simibubi.create.content.contraptions.components.actors.PloughMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceBlock; +import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceMovement; import com.simibubi.create.content.contraptions.components.actors.SawMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.SeatBlock; import com.simibubi.create.content.contraptions.components.actors.SeatMovementBehaviour; @@ -667,9 +668,10 @@ public class AllBlocks { public static final BlockEntry PORTABLE_STORAGE_INTERFACE = REGISTRATE.block("portable_storage_interface", PortableStorageInterfaceBlock::new) .initialProperties(SharedProperties::stone) -// .onRegister(addMovementBehaviour(new StorageInterfaceMovement())) - .blockstate(BlockStateGen.directionalBlockProvider(false)) - .simpleItem() + .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.partialBaseModel(c, p))) + .onRegister(addMovementBehaviour(new PortableStorageInterfaceMovement())) + .item() + .transform(customItemModel()) .register(); public static final BlockEntry MECHANICAL_HARVESTER = diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 096b9bb76..f78e208ea 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -32,8 +32,7 @@ public class AllShapes { EIGHT_VOXEL_POLE = shape(4, 0, 4, 12, 16, 12).forAxis(), FURNACE_ENGINE = shape(1, 1, 0, 15, 15, 16).add(0, 0, 9, 16, 16, 14) .forHorizontal(Direction.SOUTH), - PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 12, 16).add(3, 12, 3, 13, 16, 13) - .forDirectional(), + PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 14, 16).forDirectional(), PULLEY = shape(0, 0, 0, 16, 16, 2).add(1, 1, 2, 15, 15, 14) .add(0, 0, 14, 16, 16, 16) .forHorizontalAxis(), diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 2a1e145f2..2af986739 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -5,6 +5,8 @@ import com.simibubi.create.content.contraptions.components.actors.DrillRenderer; import com.simibubi.create.content.contraptions.components.actors.DrillTileEntity; import com.simibubi.create.content.contraptions.components.actors.HarvesterRenderer; import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; +import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceRenderer; +import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceTileEntity; import com.simibubi.create.content.contraptions.components.clock.CuckooClockRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterRenderer; @@ -106,371 +108,380 @@ public class AllTileEntities { // Schematics public static final TileEntityEntry SCHEMATICANNON = Create.registrate() - .tileEntity("schematicannon", SchematicannonTileEntity::new) - .validBlocks(AllBlocks.SCHEMATICANNON) - .renderer(() -> SchematicannonRenderer::new) - .register(); + .tileEntity("schematicannon", SchematicannonTileEntity::new) + .validBlocks(AllBlocks.SCHEMATICANNON) + .renderer(() -> SchematicannonRenderer::new) + .register(); public static final TileEntityEntry SCHEMATIC_TABLE = Create.registrate() - .tileEntity("schematic_table", SchematicTableTileEntity::new) - .validBlocks(AllBlocks.SCHEMATIC_TABLE) - //.renderer(() -> renderer) - .register(); + .tileEntity("schematic_table", SchematicTableTileEntity::new) + .validBlocks(AllBlocks.SCHEMATIC_TABLE) + // .renderer(() -> renderer) + .register(); // Kinetics public static final TileEntityEntry SIMPLE_KINETIC = Create.registrate() - .tileEntity("simple_kinetic", SimpleKineticTileEntity::new) - .validBlocks(AllBlocks.SHAFT, AllBlocks.COGWHEEL, AllBlocks.LARGE_COGWHEEL, AllBlocks.ENCASED_SHAFT) - .renderer(() -> KineticTileEntityRenderer::new) - .register(); + .tileEntity("simple_kinetic", SimpleKineticTileEntity::new) + .validBlocks(AllBlocks.SHAFT, AllBlocks.COGWHEEL, AllBlocks.LARGE_COGWHEEL, AllBlocks.ENCASED_SHAFT) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); public static final TileEntityEntry MOTOR = Create.registrate() - .tileEntity("motor", CreativeMotorTileEntity::new) - .validBlocks(AllBlocks.CREATIVE_MOTOR) - .renderer(() -> CreativeMotorRenderer::new) - .register(); + .tileEntity("motor", CreativeMotorTileEntity::new) + .validBlocks(AllBlocks.CREATIVE_MOTOR) + .renderer(() -> CreativeMotorRenderer::new) + .register(); public static final TileEntityEntry GEARBOX = Create.registrate() - .tileEntity("gearbox", GearboxTileEntity::new) - .validBlocks(AllBlocks.GEARBOX) - .renderer(() -> GearboxRenderer::new) - .register(); + .tileEntity("gearbox", GearboxTileEntity::new) + .validBlocks(AllBlocks.GEARBOX) + .renderer(() -> GearboxRenderer::new) + .register(); public static final TileEntityEntry ENCASED_SHAFT = Create.registrate() - .tileEntity("encased_shaft", EncasedShaftTileEntity::new) - .validBlocks(AllBlocks.ENCASED_SHAFT, AllBlocks.ENCASED_BELT) - .renderer(() -> EncasedShaftRenderer::new) - .register(); + .tileEntity("encased_shaft", EncasedShaftTileEntity::new) + .validBlocks(AllBlocks.ENCASED_SHAFT, AllBlocks.ENCASED_BELT) + .renderer(() -> EncasedShaftRenderer::new) + .register(); public static final TileEntityEntry ADJUSTABLE_PULLEY = Create.registrate() - .tileEntity("adjustable_pulley", AdjustablePulleyTileEntity::new) - .validBlocks(AllBlocks.ADJUSTABLE_PULLEY) - .renderer(() -> EncasedShaftRenderer::new) - .register(); + .tileEntity("adjustable_pulley", AdjustablePulleyTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_PULLEY) + .renderer(() -> EncasedShaftRenderer::new) + .register(); public static final TileEntityEntry ENCASED_FAN = Create.registrate() - .tileEntity("encased_fan", EncasedFanTileEntity::new) - .validBlocks(AllBlocks.ENCASED_FAN) - .renderer(() -> EncasedFanRenderer::new) - .register(); + .tileEntity("encased_fan", EncasedFanTileEntity::new) + .validBlocks(AllBlocks.ENCASED_FAN) + .renderer(() -> EncasedFanRenderer::new) + .register(); public static final TileEntityEntry NOZZLE = Create.registrate() - .tileEntity("nozzle", NozzleTileEntity::new) - .validBlocks(AllBlocks.NOZZLE) - //.renderer(() -> renderer) - .register(); + .tileEntity("nozzle", NozzleTileEntity::new) + .validBlocks(AllBlocks.NOZZLE) + // .renderer(() -> renderer) + .register(); public static final TileEntityEntry CLUTCH = Create.registrate() - .tileEntity("clutch", ClutchTileEntity::new) - .validBlocks(AllBlocks.CLUTCH) - .renderer(() -> SplitShaftRenderer::new) - .register(); + .tileEntity("clutch", ClutchTileEntity::new) + .validBlocks(AllBlocks.CLUTCH) + .renderer(() -> SplitShaftRenderer::new) + .register(); public static final TileEntityEntry GEARSHIFT = Create.registrate() - .tileEntity("gearshift", GearshiftTileEntity::new) - .validBlocks(AllBlocks.GEARSHIFT) - .renderer(() -> SplitShaftRenderer::new) - .register(); + .tileEntity("gearshift", GearshiftTileEntity::new) + .validBlocks(AllBlocks.GEARSHIFT) + .renderer(() -> SplitShaftRenderer::new) + .register(); public static final TileEntityEntry TURNTABLE = Create.registrate() - .tileEntity("turntable", TurntableTileEntity::new) - .validBlocks(AllBlocks.TURNTABLE) - .renderer(() -> KineticTileEntityRenderer::new) - .register(); + .tileEntity("turntable", TurntableTileEntity::new) + .validBlocks(AllBlocks.TURNTABLE) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); public static final TileEntityEntry HAND_CRANK = Create.registrate() - .tileEntity("hand_crank", HandCrankTileEntity::new) - .validBlocks(AllBlocks.HAND_CRANK) - .renderer(() -> HandCrankRenderer::new) - .register(); + .tileEntity("hand_crank", HandCrankTileEntity::new) + .validBlocks(AllBlocks.HAND_CRANK) + .renderer(() -> HandCrankRenderer::new) + .register(); public static final TileEntityEntry CUCKOO_CLOCK = Create.registrate() - .tileEntity("cuckoo_clock", CuckooClockTileEntity::new) - .validBlocks(AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK) - .renderer(() -> CuckooClockRenderer::new) - .register(); + .tileEntity("cuckoo_clock", CuckooClockTileEntity::new) + .validBlocks(AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK) + .renderer(() -> CuckooClockRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_PUMP = Create.registrate() - .tileEntity("mechanical_pump", PumpTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_PUMP) - .renderer(() -> PumpRenderer::new) - .register(); + .tileEntity("mechanical_pump", PumpTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_PUMP) + .renderer(() -> PumpRenderer::new) + .register(); public static final TileEntityEntry FLUID_PIPE = Create.registrate() - .tileEntity("fluid_pipe", FluidPipeTileEntity::new) - .validBlocks(AllBlocks.FLUID_PIPE) - .register(); + .tileEntity("fluid_pipe", FluidPipeTileEntity::new) + .validBlocks(AllBlocks.FLUID_PIPE) + .register(); public static final TileEntityEntry ENCASED_FLUID_PIPE = Create.registrate() - .tileEntity("encased_fluid_pipe", StraightPipeTileEntity::new) - .validBlocks(AllBlocks.ENCASED_FLUID_PIPE) - .register(); + .tileEntity("encased_fluid_pipe", StraightPipeTileEntity::new) + .validBlocks(AllBlocks.ENCASED_FLUID_PIPE) + .register(); public static final TileEntityEntry GLASS_FLUID_PIPE = Create.registrate() - .tileEntity("glass_fluid_pipe", StraightPipeTileEntity::new) - .validBlocks(AllBlocks.GLASS_FLUID_PIPE) - .renderer(() -> TransparentStraightPipeRenderer::new) - .register(); + .tileEntity("glass_fluid_pipe", StraightPipeTileEntity::new) + .validBlocks(AllBlocks.GLASS_FLUID_PIPE) + .renderer(() -> TransparentStraightPipeRenderer::new) + .register(); public static final TileEntityEntry FLUID_TANK = Create.registrate() - .tileEntity("fluid_tank", FluidTankTileEntity::new) - .validBlocks(AllBlocks.FLUID_TANK) - .renderer(() -> FluidTankRenderer::new) - .register(); - + .tileEntity("fluid_tank", FluidTankTileEntity::new) + .validBlocks(AllBlocks.FLUID_TANK) + .renderer(() -> FluidTankRenderer::new) + .register(); + public static final TileEntityEntry SPOUT = Create.registrate() - .tileEntity("spout", SpoutTileEntity::new) - .validBlocks(AllBlocks.SPOUT) - .renderer(() -> SpoutRenderer::new) - .register(); + .tileEntity("spout", SpoutTileEntity::new) + .validBlocks(AllBlocks.SPOUT) + .renderer(() -> SpoutRenderer::new) + .register(); public static final TileEntityEntry BELT = Create.registrate() - .tileEntity("belt", BeltTileEntity::new) - .validBlocks(AllBlocks.BELT) - .renderer(() -> BeltRenderer::new) - .register(); + .tileEntity("belt", BeltTileEntity::new) + .validBlocks(AllBlocks.BELT) + .renderer(() -> BeltRenderer::new) + .register(); public static final TileEntityEntry CHUTE = Create.registrate() - .tileEntity("chute", ChuteTileEntity::new) - .validBlocks(AllBlocks.CHUTE) - .renderer(() -> ChuteRenderer::new) - .register(); + .tileEntity("chute", ChuteTileEntity::new) + .validBlocks(AllBlocks.CHUTE) + .renderer(() -> ChuteRenderer::new) + .register(); public static final TileEntityEntry ANDESITE_TUNNEL = Create.registrate() - .tileEntity("andesite_tunnel", BeltTunnelTileEntity::new) - .validBlocks(AllBlocks.ANDESITE_TUNNEL) - .renderer(() -> BeltTunnelRenderer::new) - .register(); + .tileEntity("andesite_tunnel", BeltTunnelTileEntity::new) + .validBlocks(AllBlocks.ANDESITE_TUNNEL) + .renderer(() -> BeltTunnelRenderer::new) + .register(); public static final TileEntityEntry BRASS_TUNNEL = Create.registrate() - .tileEntity("brass_tunnel", BrassTunnelTileEntity::new) - .validBlocks(AllBlocks.BRASS_TUNNEL) - .renderer(() -> BeltTunnelRenderer::new) - .register(); + .tileEntity("brass_tunnel", BrassTunnelTileEntity::new) + .validBlocks(AllBlocks.BRASS_TUNNEL) + .renderer(() -> BeltTunnelRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_ARM = Create.registrate() - .tileEntity("mechanical_arm", ArmTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_ARM) - .renderer(() -> ArmRenderer::new) - .register(); + .tileEntity("mechanical_arm", ArmTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_ARM) + .renderer(() -> ArmRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_PISTON = Create.registrate() - .tileEntity("mechanical_piston", MechanicalPistonTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) - .renderer(() -> MechanicalPistonRenderer::new) - .register(); + .tileEntity("mechanical_piston", MechanicalPistonTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) + .renderer(() -> MechanicalPistonRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_BEARING = Create.registrate() - .tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_BEARING) - .renderer(() -> BearingRenderer::new) - .register(); + .tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_BEARING) + .renderer(() -> BearingRenderer::new) + .register(); public static final TileEntityEntry CLOCKWORK_BEARING = Create.registrate() - .tileEntity("clockwork_bearing", ClockworkBearingTileEntity::new) - .validBlocks(AllBlocks.CLOCKWORK_BEARING) - .renderer(() -> BearingRenderer::new) - .register(); + .tileEntity("clockwork_bearing", ClockworkBearingTileEntity::new) + .validBlocks(AllBlocks.CLOCKWORK_BEARING) + .renderer(() -> BearingRenderer::new) + .register(); public static final TileEntityEntry ROPE_PULLEY = Create.registrate() - .tileEntity("rope_pulley", PulleyTileEntity::new) - .validBlocks(AllBlocks.ROPE_PULLEY) - .renderer(() -> PulleyRenderer::new) - .register(); + .tileEntity("rope_pulley", PulleyTileEntity::new) + .validBlocks(AllBlocks.ROPE_PULLEY) + .renderer(() -> PulleyRenderer::new) + .register(); public static final TileEntityEntry CHASSIS = Create.registrate() - .tileEntity("chassis", ChassisTileEntity::new) - .validBlocks(AllBlocks.RADIAL_CHASSIS, AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) - //.renderer(() -> renderer) - .register(); + .tileEntity("chassis", ChassisTileEntity::new) + .validBlocks(AllBlocks.RADIAL_CHASSIS, AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) + // .renderer(() -> renderer) + .register(); public static final TileEntityEntry DRILL = Create.registrate() - .tileEntity("drill", DrillTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_DRILL) - .renderer(() -> DrillRenderer::new) - .register(); + .tileEntity("drill", DrillTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_DRILL) + .renderer(() -> DrillRenderer::new) + .register(); public static final TileEntityEntry SAW = Create.registrate() - .tileEntity("saw", SawTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_SAW) - .renderer(() -> SawRenderer::new) - .register(); + .tileEntity("saw", SawTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_SAW) + .renderer(() -> SawRenderer::new) + .register(); public static final TileEntityEntry HARVESTER = Create.registrate() - .tileEntity("harvester", HarvesterTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_HARVESTER) - .renderer(() -> HarvesterRenderer::new) + .tileEntity("harvester", HarvesterTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_HARVESTER) + .renderer(() -> HarvesterRenderer::new) + .register(); + + public static final TileEntityEntry PORTABLE_STORAGE_INTERFACE = + Create.registrate() + .tileEntity("portable_storage_interface", PortableStorageInterfaceTileEntity::new) + .validBlocks(AllBlocks.PORTABLE_STORAGE_INTERFACE) + .renderer(() -> PortableStorageInterfaceRenderer::new) .register(); public static final TileEntityEntry FLYWHEEL = Create.registrate() - .tileEntity("flywheel", FlywheelTileEntity::new) - .validBlocks(AllBlocks.FLYWHEEL) - .renderer(() -> FlywheelRenderer::new) - .register(); + .tileEntity("flywheel", FlywheelTileEntity::new) + .validBlocks(AllBlocks.FLYWHEEL) + .renderer(() -> FlywheelRenderer::new) + .register(); public static final TileEntityEntry FURNACE_ENGINE = Create.registrate() - .tileEntity("furnace_engine", FurnaceEngineTileEntity::new) - .validBlocks(AllBlocks.FURNACE_ENGINE) - .renderer(() -> EngineRenderer::new) - .register(); + .tileEntity("furnace_engine", FurnaceEngineTileEntity::new) + .validBlocks(AllBlocks.FURNACE_ENGINE) + .renderer(() -> EngineRenderer::new) + .register(); public static final TileEntityEntry MILLSTONE = Create.registrate() - .tileEntity("millstone", MillstoneTileEntity::new) - .validBlocks(AllBlocks.MILLSTONE) - .renderer(() -> MillstoneRenderer::new) - .register(); + .tileEntity("millstone", MillstoneTileEntity::new) + .validBlocks(AllBlocks.MILLSTONE) + .renderer(() -> MillstoneRenderer::new) + .register(); public static final TileEntityEntry CRUSHING_WHEEL = Create.registrate() - .tileEntity("crushing_wheel", CrushingWheelTileEntity::new) - .validBlocks(AllBlocks.CRUSHING_WHEEL) - .renderer(() -> KineticTileEntityRenderer::new) - .register(); + .tileEntity("crushing_wheel", CrushingWheelTileEntity::new) + .validBlocks(AllBlocks.CRUSHING_WHEEL) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); - public static final TileEntityEntry CRUSHING_WHEEL_CONTROLLER = Create.registrate() + public static final TileEntityEntry CRUSHING_WHEEL_CONTROLLER = + Create.registrate() .tileEntity("crushing_wheel_controller", CrushingWheelControllerTileEntity::new) .validBlocks(AllBlocks.CRUSHING_WHEEL_CONTROLLER) - //.renderer(() -> renderer) + // .renderer(() -> renderer) .register(); public static final TileEntityEntry WATER_WHEEL = Create.registrate() - .tileEntity("water_wheel", WaterWheelTileEntity::new) - .validBlocks(AllBlocks.WATER_WHEEL) - .renderer(() -> KineticTileEntityRenderer::new) - .register(); + .tileEntity("water_wheel", WaterWheelTileEntity::new) + .validBlocks(AllBlocks.WATER_WHEEL) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_PRESS = Create.registrate() - .tileEntity("mechanical_press", MechanicalPressTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_PRESS) - .renderer(() -> MechanicalPressRenderer::new) - .register(); + .tileEntity("mechanical_press", MechanicalPressTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_PRESS) + .renderer(() -> MechanicalPressRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_MIXER = Create.registrate() - .tileEntity("mechanical_mixer", MechanicalMixerTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_MIXER) - .renderer(() -> MechanicalMixerRenderer::new) - .register(); + .tileEntity("mechanical_mixer", MechanicalMixerTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_MIXER) + .renderer(() -> MechanicalMixerRenderer::new) + .register(); public static final TileEntityEntry DEPLOYER = Create.registrate() - .tileEntity("deployer", DeployerTileEntity::new) - .validBlocks(AllBlocks.DEPLOYER) - .renderer(() -> DeployerRenderer::new) - .register(); + .tileEntity("deployer", DeployerTileEntity::new) + .validBlocks(AllBlocks.DEPLOYER) + .renderer(() -> DeployerRenderer::new) + .register(); public static final TileEntityEntry BASIN = Create.registrate() - .tileEntity("basin", BasinTileEntity::new) - .validBlocks(AllBlocks.BASIN) - .renderer(() -> BasinRenderer::new) - .register(); + .tileEntity("basin", BasinTileEntity::new) + .validBlocks(AllBlocks.BASIN) + .renderer(() -> BasinRenderer::new) + .register(); public static final TileEntityEntry HEATER = Create.registrate() - .tileEntity("blaze_heater", BlazeBurnerTileEntity::new) - .validBlocks(AllBlocks.BLAZE_BURNER) - .renderer(() -> BlazeBurnerRenderer::new) - .register(); + .tileEntity("blaze_heater", BlazeBurnerTileEntity::new) + .validBlocks(AllBlocks.BLAZE_BURNER) + .renderer(() -> BlazeBurnerRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_CRAFTER = Create.registrate() - .tileEntity("mechanical_crafter", MechanicalCrafterTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_CRAFTER) - .renderer(() -> MechanicalCrafterRenderer::new) - .register(); + .tileEntity("mechanical_crafter", MechanicalCrafterTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_CRAFTER) + .renderer(() -> MechanicalCrafterRenderer::new) + .register(); public static final TileEntityEntry SEQUENCED_GEARSHIFT = Create.registrate() - .tileEntity("sequenced_gearshift", SequencedGearshiftTileEntity::new) - .validBlocks(AllBlocks.SEQUENCED_GEARSHIFT) - .renderer(() -> SplitShaftRenderer::new) - .register(); + .tileEntity("sequenced_gearshift", SequencedGearshiftTileEntity::new) + .validBlocks(AllBlocks.SEQUENCED_GEARSHIFT) + .renderer(() -> SplitShaftRenderer::new) + .register(); public static final TileEntityEntry ROTATION_SPEED_CONTROLLER = Create.registrate() - .tileEntity("rotation_speed_controller", SpeedControllerTileEntity::new) - .validBlocks(AllBlocks.ROTATION_SPEED_CONTROLLER) - .renderer(() -> SpeedControllerRenderer::new) - .register(); + .tileEntity("rotation_speed_controller", SpeedControllerTileEntity::new) + .validBlocks(AllBlocks.ROTATION_SPEED_CONTROLLER) + .renderer(() -> SpeedControllerRenderer::new) + .register(); public static final TileEntityEntry SPEEDOMETER = Create.registrate() - .tileEntity("speedometer", SpeedGaugeTileEntity::new) - .validBlocks(AllBlocks.SPEEDOMETER) - .renderer(() -> GaugeRenderer::speed) - .register(); + .tileEntity("speedometer", SpeedGaugeTileEntity::new) + .validBlocks(AllBlocks.SPEEDOMETER) + .renderer(() -> GaugeRenderer::speed) + .register(); public static final TileEntityEntry STRESSOMETER = Create.registrate() - .tileEntity("stressometer", StressGaugeTileEntity::new) - .validBlocks(AllBlocks.STRESSOMETER) - .renderer(() -> GaugeRenderer::stress) - .register(); + .tileEntity("stressometer", StressGaugeTileEntity::new) + .validBlocks(AllBlocks.STRESSOMETER) + .renderer(() -> GaugeRenderer::stress) + .register(); public static final TileEntityEntry ANALOG_LEVER = Create.registrate() - .tileEntity("analog_lever", AnalogLeverTileEntity::new) - .validBlocks(AllBlocks.ANALOG_LEVER) - .renderer(() -> AnalogLeverRenderer::new) - .register(); + .tileEntity("analog_lever", AnalogLeverTileEntity::new) + .validBlocks(AllBlocks.ANALOG_LEVER) + .renderer(() -> AnalogLeverRenderer::new) + .register(); public static final TileEntityEntry CART_ASSEMBLER = Create.registrate() - .tileEntity("cart_assembler", CartAssemblerTileEntity::new) - .validBlocks(AllBlocks.CART_ASSEMBLER) - //.renderer(() -> renderer) - .register(); + .tileEntity("cart_assembler", CartAssemblerTileEntity::new) + .validBlocks(AllBlocks.CART_ASSEMBLER) + // .renderer(() -> renderer) + .register(); // Logistics public static final TileEntityEntry REDSTONE_LINK = Create.registrate() - .tileEntity("redstone_link", RedstoneLinkTileEntity::new) - .validBlocks(AllBlocks.REDSTONE_LINK) - .renderer(() -> SmartTileEntityRenderer::new) - .register(); + .tileEntity("redstone_link", RedstoneLinkTileEntity::new) + .validBlocks(AllBlocks.REDSTONE_LINK) + .renderer(() -> SmartTileEntityRenderer::new) + .register(); public static final TileEntityEntry NIXIE_TUBE = Create.registrate() - .tileEntity("nixie_tube", NixieTubeTileEntity::new) - .validBlocks(AllBlocks.NIXIE_TUBE) - .renderer(() -> NixieTubeRenderer::new) - .register(); + .tileEntity("nixie_tube", NixieTubeTileEntity::new) + .validBlocks(AllBlocks.NIXIE_TUBE) + .renderer(() -> NixieTubeRenderer::new) + .register(); public static final TileEntityEntry STOCKPILE_SWITCH = Create.registrate() - .tileEntity("stockpile_switch", StockpileSwitchTileEntity::new) - .validBlocks(AllBlocks.STOCKPILE_SWITCH) - .renderer(() -> SmartTileEntityRenderer::new) - .register(); + .tileEntity("stockpile_switch", StockpileSwitchTileEntity::new) + .validBlocks(AllBlocks.STOCKPILE_SWITCH) + .renderer(() -> SmartTileEntityRenderer::new) + .register(); public static final TileEntityEntry ADJUSTABLE_CRATE = Create.registrate() - .tileEntity("adjustable_crate", AdjustableCrateTileEntity::new) - .validBlocks(AllBlocks.ADJUSTABLE_CRATE) - //.renderer(() -> renderer) - .register(); + .tileEntity("adjustable_crate", AdjustableCrateTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_CRATE) + // .renderer(() -> renderer) + .register(); public static final TileEntityEntry CREATIVE_CRATE = Create.registrate() - .tileEntity("creative_crate", CreativeCrateTileEntity::new) - .validBlocks(AllBlocks.CREATIVE_CRATE) - .renderer(() -> SmartTileEntityRenderer::new) - .register(); + .tileEntity("creative_crate", CreativeCrateTileEntity::new) + .validBlocks(AllBlocks.CREATIVE_CRATE) + .renderer(() -> SmartTileEntityRenderer::new) + .register(); public static final TileEntityEntry DEPOT = Create.registrate() - .tileEntity("depot", DepotTileEntity::new) - .validBlocks(AllBlocks.DEPOT) - .renderer(() -> DepotRenderer::new) - .register(); + .tileEntity("depot", DepotTileEntity::new) + .validBlocks(AllBlocks.DEPOT) + .renderer(() -> DepotRenderer::new) + .register(); public static final TileEntityEntry FUNNEL = Create.registrate() - .tileEntity("funnel", FunnelTileEntity::new) - .validBlocks(AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.ANDESITE_FUNNEL, AllBlocks.ANDESITE_BELT_FUNNEL) - .renderer(() -> FunnelRenderer::new) - .register(); + .tileEntity("funnel", FunnelTileEntity::new) + .validBlocks(AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.ANDESITE_FUNNEL, + AllBlocks.ANDESITE_BELT_FUNNEL) + .renderer(() -> FunnelRenderer::new) + .register(); public static final TileEntityEntry CONTENT_OBSERVER = Create.registrate() - .tileEntity("content_observer", ContentObserverTileEntity::new) - .validBlocks(AllBlocks.CONTENT_OBSERVER) - .renderer(() -> SmartTileEntityRenderer::new) - .register(); + .tileEntity("content_observer", ContentObserverTileEntity::new) + .validBlocks(AllBlocks.CONTENT_OBSERVER) + .renderer(() -> SmartTileEntityRenderer::new) + .register(); public static final TileEntityEntry ADJUSTABLE_REPEATER = Create.registrate() - .tileEntity("adjustable_repeater", AdjustableRepeaterTileEntity::new) - .validBlocks(AllBlocks.ADJUSTABLE_REPEATER) - .renderer(() -> AdjustableRepeaterRenderer::new) - .register(); + .tileEntity("adjustable_repeater", AdjustableRepeaterTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_REPEATER) + .renderer(() -> AdjustableRepeaterRenderer::new) + .register(); - public static final TileEntityEntry ADJUSTABLE_PULSE_REPEATER = Create.registrate() + public static final TileEntityEntry ADJUSTABLE_PULSE_REPEATER = + Create.registrate() .tileEntity("adjustable_pulse_repeater", AdjustablePulseRepeaterTileEntity::new) .validBlocks(AllBlocks.ADJUSTABLE_PULSE_REPEATER) .renderer(() -> AdjustableRepeaterRenderer::new) .register(); - public static void register() { - } + public static void register() {} } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java index a992df339..d4795c41b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java @@ -1,19 +1,20 @@ package com.simibubi.create.content.contraptions.components.actors; +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.block.ProperDirectionalBlock; +import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; - -import javax.annotation.ParametersAreNonnullByDefault; -import mcp.MethodsReturnNonnullByDefault; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class PortableStorageInterfaceBlock extends ProperDirectionalBlock { @@ -21,6 +22,16 @@ public class PortableStorageInterfaceBlock extends ProperDirectionalBlock { public PortableStorageInterfaceBlock(Properties p_i48415_1_) { super(p_i48415_1_); } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.PORTABLE_STORAGE_INTERFACE.create(); + } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java new file mode 100644 index 000000000..6ceea2f44 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java @@ -0,0 +1,167 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import java.util.function.Predicate; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.inventory.SingleTargetAutoExtractingBehaviour; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; + +public class PortableStorageInterfaceMovement extends MovementBehaviour { + + private static final String _exporting_ = "Exporting"; + private static final String _delay_ = "Delay"; + private static final String _workingPos_ = "WorkingPos"; + + @Override + public Vec3d getActiveAreaOffset(MovementContext context) { + return new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING) + .getDirectionVec()).scale(.85f); + } + + @Override + public void visitNewPosition(MovementContext context, BlockPos pos) { + Direction currentFacing = getCurrentFacing(context); + PortableStorageInterfaceTileEntity psi = + getValidStationaryInterface(context.world, pos, currentFacing.getAxis()); + if (psi == null) + return; + if (psi.isTransferring()) + return; + context.data.put(_workingPos_, NBTUtil.writeBlockPos(pos)); + context.stall = true; + } + + @Override + public void tick(MovementContext context) { + if (!context.data.contains(_workingPos_)) + return; + if (context.world.isRemote) + return; + + BlockPos pos = NBTUtil.readBlockPos(context.data.getCompound(_workingPos_)); + PortableStorageInterfaceTileEntity stationaryInterface = + getValidStationaryInterface(context.world, pos, getCurrentFacing(context).getAxis()); + if (stationaryInterface == null) { + reset(context); + return; + } + + int nextExtract = context.data.getInt(_delay_); + if (nextExtract > 0) { + nextExtract--; + context.data.putInt(_delay_, nextExtract); + return; + } + + boolean extract = context.data.getBoolean(_exporting_); + boolean success = false; + IItemHandlerModifiable inv = context.contraption.inventory; + SingleTargetAutoExtractingBehaviour extracting = + TileEntityBehaviour.get(stationaryInterface, SingleTargetAutoExtractingBehaviour.TYPE); + FilteringBehaviour filtering = TileEntityBehaviour.get(stationaryInterface, FilteringBehaviour.TYPE); + + if (extract) { + // Export from Contraption + Predicate test = extracting.getFilterTest(); + int exactAmount = extracting.getAmountFromFilter(); + ItemStack itemExtracted = ItemStack.EMPTY; + if (exactAmount != -1) + itemExtracted = ItemHelper.extract(inv, test, exactAmount, false); + else + itemExtracted = ItemHelper.extract(inv, test, stationaryInterface::amountToExtract, false); + + if (!itemExtracted.isEmpty()) { + stationaryInterface.onExtract(itemExtracted); + success = exactAmount == -1; + } + + } else { + // Import to Contraption + if (extracting != null) { + extracting.setSynchronized(false); + extracting.withAdditionalFilter(stack -> { + if (filtering.anyAmount()) + return true; + return ItemHandlerHelper.insertItemStacked(inv, stack, true) + .isEmpty(); + }); + + extracting.withAmountThreshold(stack -> { + ItemStack tester = stack.copy(); + tester.setCount(tester.getMaxStackSize()); + return stack.getCount() - ItemHandlerHelper.insertItemStacked(inv, stack, true) + .getCount(); + }); + + extracting.setCallback(stack -> { + ItemHandlerHelper.insertItemStacked(inv, stack, false); + }); + + success = extracting.extract() && filtering.anyAmount(); + extracting.setSynchronized(true); + stationaryInterface.applyFilteringCallbacks(); + extracting.setCallback(stationaryInterface::onExtract); + } + } + + if (!success) { + reset(context); + return; + } + + context.data.putInt(_delay_, AllConfigs.SERVER.logistics.defaultExtractionTimer.get()); + } + + @Override + public void stopMoving(MovementContext context) { + reset(context); + } + + public void reset(MovementContext context) { + context.data.remove(_workingPos_); + context.data.remove(_delay_); + context.data.remove(_exporting_); + context.stall = false; + } + + private PortableStorageInterfaceTileEntity getValidStationaryInterface(World world, BlockPos pos, Axis validAxis) { + TileEntity te = world.getTileEntity(pos); + if (!(te instanceof PortableStorageInterfaceTileEntity)) + return null; + BlockState blockState = world.getBlockState(pos); + if (!AllBlocks.PORTABLE_STORAGE_INTERFACE.has(blockState)) + return null; + if (blockState.get(PortableStorageInterfaceBlock.FACING) + .getAxis() != validAxis) + return null; + if (world.isBlockPowered(pos)) + return null; + return (PortableStorageInterfaceTileEntity) te; + } + + private Direction getCurrentFacing(MovementContext context) { + Vec3d directionVec = new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING) + .getDirectionVec()); + directionVec = VecHelper.rotate(directionVec, context.rotation.x, context.rotation.y, context.rotation.z); + return Direction.getFacingFromVector(directionVec.x, directionVec.y, directionVec.z); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java new file mode 100644 index 000000000..7d57fb692 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -0,0 +1,64 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.SuperByteBuffer; + +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; +import net.minecraft.util.math.MathHelper; + +public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer { + + public PortableStorageInterfaceRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(PortableStorageInterfaceTileEntity te, float partialTicks, MatrixStack ms, + IRenderTypeBuffer buffer, int light, int overlay) { + + BlockState blockState = te.getBlockState(); + SuperByteBuffer middle = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_MIDDLE.renderOn(blockState); + SuperByteBuffer top = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_TOP.renderOn(blockState); + IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + + ms.push(); + + Direction facing = blockState.get(PortableStorageInterfaceBlock.FACING); + MatrixStacker.of(ms) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .unCentre(); + + float progress = (float) ((AnimationTickHolder.getRenderTick() * .25f) % (Math.PI * 2)); + float bounce = (MathHelper.sin(progress) + 1) / 4f; + + if (bounce > 7/16f) { + middle = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED.renderOn(blockState); + } + + + ms.translate(0, bounce, 0); + + ms.push(); + ms.translate(0, 6/16f, 0); + middle.renderInto(ms, vb); + ms.pop(); + + ms.translate(0, bounce, 0); + top.renderInto(ms, vb); + + ms.pop(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java new file mode 100644 index 000000000..3e27dd173 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java @@ -0,0 +1,56 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import java.util.List; + +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; + +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; + +public class PortableStorageInterfaceTileEntity extends SmartTileEntity { + + protected int transferTimeout; + protected LazyOptional capability; + + public PortableStorageInterfaceTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + transferTimeout = 0; + capability = LazyOptional.empty(); + } + + public void startTransferringTo(Contraption contraption) { + CombinedInvWrapper inventory = contraption.inventory; + capability.invalidate(); + capability = LazyOptional.of(() -> inventory); + + } + + @Override + public void tick() { + super.tick(); + } + + public boolean isTransferring() { + return transferTimeout != 0; + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + return super.getCapability(cap, side); + } + + public void resetTimer() { + + } + + @Override + public void addBehaviours(List behaviours) {} + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java deleted file mode 100644 index c6442a00f..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java +++ /dev/null @@ -1,157 +0,0 @@ -//package com.simibubi.create.content.contraptions.components.actors; -// -//import java.util.function.Predicate; -// -//import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; -//import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -//import com.simibubi.create.content.logistics.block.transposer.TransposerBlock; -//import com.simibubi.create.content.logistics.block.transposer.TransposerTileEntity; -//import com.simibubi.create.foundation.config.AllConfigs; -//import com.simibubi.create.foundation.item.ItemHelper; -//import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -//import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -//import com.simibubi.create.foundation.tileEntity.behaviour.inventory.SingleTargetAutoExtractingBehaviour; -//import com.simibubi.create.foundation.utility.VecHelper; -// -//import net.minecraft.item.ItemStack; -//import net.minecraft.nbt.NBTUtil; -//import net.minecraft.tileentity.TileEntity; -//import net.minecraft.util.Direction; -//import net.minecraft.util.Direction.Axis; -//import net.minecraft.util.math.BlockPos; -//import net.minecraft.util.math.Vec3d; -//import net.minecraft.world.World; -//import net.minecraftforge.items.IItemHandlerModifiable; -//import net.minecraftforge.items.ItemHandlerHelper; -// -//public class StorageInterfaceMovement extends MovementBehaviour { -// -// private static final String _exporting_ = "Exporting"; -// private static final String _delay_ = "Delay"; -// private static final String _workingPos_ = "WorkingPos"; -// -// @Override -// public Vec3d getActiveAreaOffset(MovementContext context) { -// return new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING).getDirectionVec()).scale(.85f); -// } -// -// @Override -// public void visitNewPosition(MovementContext context, BlockPos pos) { -// Direction currentFacing = getCurrentFacing(context); -// TransposerTileEntity transposer = getValidTransposer(context.world, pos, currentFacing.getAxis()); -// if (transposer == null) -// return; -// context.data.put(_workingPos_, NBTUtil.writeBlockPos(pos)); -// context.data.putBoolean(_exporting_, -// TransposerBlock.getBlockFacing(transposer.getBlockState()) != currentFacing); -// context.stall = true; -// } -// -// @Override -// public void tick(MovementContext context) { -// if (!context.data.contains(_workingPos_)) -// return; -// if (context.world.isRemote) -// return; -// -// BlockPos pos = NBTUtil.readBlockPos(context.data.getCompound(_workingPos_)); -// TransposerTileEntity transposer = getValidTransposer(context.world, pos, getCurrentFacing(context).getAxis()); -// if (transposer == null) { -// reset(context); -// return; -// } -// -// int nextExtract = context.data.getInt(_delay_); -// if (nextExtract > 0) { -// nextExtract--; -// context.data.putInt(_delay_, nextExtract); -// return; -// } -// -// boolean extract = context.data.getBoolean(_exporting_); -// boolean success = false; -// IItemHandlerModifiable inv = context.contraption.inventory; -// SingleTargetAutoExtractingBehaviour extracting = -// TileEntityBehaviour.get(transposer, SingleTargetAutoExtractingBehaviour.TYPE); -// FilteringBehaviour filtering = TileEntityBehaviour.get(transposer, FilteringBehaviour.TYPE); -// -// if (extract) { -// // Export from Contraption -// Predicate test = extracting.getFilterTest(); -// int exactAmount = extracting.getAmountFromFilter(); -// ItemStack itemExtracted = ItemStack.EMPTY; -// if (exactAmount != -1) -// itemExtracted = ItemHelper.extract(inv, test, exactAmount, false); -// else -// itemExtracted = ItemHelper.extract(inv, test, transposer::amountToExtract, false); -// -// if (!itemExtracted.isEmpty()) { -// transposer.onExtract(itemExtracted); -// success = exactAmount == -1; -// } -// -// } else { -// // Import to Contraption -// if (extracting != null) { -// extracting.setSynchronized(false); -// extracting.withAdditionalFilter(stack -> { -// if (filtering.anyAmount()) -// return true; -// return ItemHandlerHelper.insertItemStacked(inv, stack, true).isEmpty(); -// }); -// -// extracting.withAmountThreshold(stack -> { -// ItemStack tester = stack.copy(); -// tester.setCount(tester.getMaxStackSize()); -// return stack.getCount() - ItemHandlerHelper.insertItemStacked(inv, stack, true).getCount(); -// }); -// -// extracting.setCallback(stack -> { -// ItemHandlerHelper.insertItemStacked(inv, stack, false); -// }); -// -// success = extracting.extract() && filtering.anyAmount(); -// extracting.setSynchronized(true); -// transposer.applyFilteringCallbacks(); -// extracting.setCallback(transposer::onExtract); -// } -// } -// -// if (!success) { -// reset(context); -// return; -// } -// -// context.data.putInt(_delay_, AllConfigs.SERVER.logistics.extractorDelay.get()); -// } -// -// @Override -// public void stopMoving(MovementContext context) { -// reset(context); -// } -// -// public void reset(MovementContext context) { -// context.data.remove(_workingPos_); -// context.data.remove(_delay_); -// context.data.remove(_exporting_); -// context.stall = false; -// } -// -// private TransposerTileEntity getValidTransposer(World world, BlockPos pos, Axis validAxis) { -// TileEntity te = world.getTileEntity(pos); -// if (!(te instanceof TransposerTileEntity)) -// return null; -// if (TransposerBlock.getBlockFacing(world.getBlockState(pos)).getAxis() != validAxis) -// return null; -// if (world.isBlockPowered(pos)) -// return null; -// return (TransposerTileEntity) te; -// } -// -// private Direction getCurrentFacing(MovementContext context) { -// Vec3d directionVec = new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING).getDirectionVec()); -// directionVec = VecHelper.rotate(directionVec, context.rotation.x, context.rotation.y, context.rotation.z); -// return Direction.getFacingFromVector(directionVec.x, directionVec.y, directionVec.z); -// } -// -//} diff --git a/src/main/java/com/simibubi/create/foundation/config/CLogistics.java b/src/main/java/com/simibubi/create/foundation/config/CLogistics.java index a784769cc..4fa8cc416 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CLogistics.java @@ -4,6 +4,7 @@ public class CLogistics extends ConfigBase { public ConfigInt defaultExtractionLimit = i(64, 1, 64, "defaultExtractionLimit", Comments.defaultExtractionLimit); public ConfigInt defaultExtractionTimer = i(8, 1, "defaultExtractionTimer", Comments.defaultExtractionTimer); + public ConfigInt psiTimeout = i(20, 1, "psiTimeout", Comments.psiTimeout); public ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange); public ConfigInt linkRange = i(128, 1, "linkRange", Comments.linkRange); @@ -18,6 +19,7 @@ public class CLogistics extends ConfigBase { static String defaultExtractionTimer = "The amount of ticks a funnel waits between item transferrals, when it is not re-activated by redstone."; static String linkRange = "Maximum possible range in blocks of redstone link connections."; + static String psiTimeout = "The amount of ticks a portable storage interface waits for transfers until letting contraptions move along."; static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; } diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/block.json b/src/main/resources/assets/create/models/block/portable_storage_interface/block.json new file mode 100644 index 000000000..79251958e --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/block.json @@ -0,0 +1,63 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/portable_storage_interface", + "1": "create:block/brass_casing", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 12, 16], + "faces": { + "north": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "east": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "south": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "west": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "from": [0, 12, 1.9], + "to": [2, 14.1, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 10]}, + "faces": { + "north": {"uv": [7, 10, 8, 11], "texture": "#0"}, + "south": {"uv": [0, 10, 1, 11], "texture": "#0"}, + "west": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "texture": "#1"} + } + }, + { + "from": [14, 12, 2], + "to": [16, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 6]}, + "faces": { + "north": {"uv": [0, 10, 1, 11], "texture": "#0"}, + "east": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "south": {"uv": [7, 10, 8, 11], "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [2, 12, 0], + "to": [14, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 20, 8]}, + "faces": { + "north": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "east": {"uv": [0, 10, 8, 11], "texture": "#0"}, + "south": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "west": {"uv": [0, 10, 8, 11], "texture": "#0"}, + "up": {"uv": [2, 0, 14, 16], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "Base", + "origin": [10, 20, 8], + "children": [0, 1, 2, 3] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle.json b/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle.json new file mode 100644 index 000000000..33d29a3ef --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/portable_storage_interface", + "particle": "create:block/portable_storage_interface" + }, + "elements": [ + { + "from": [2, 0, 2], + "to": [14, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 8, 10]}, + "faces": { + "north": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "east": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "south": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "west": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "up": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "Middle", + "origin": [10, 22, 10], + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle_powered.json b/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle_powered.json new file mode 100644 index 000000000..c64e3e1f3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle_powered.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/portable_storage_interface", + "particle": "create:block/portable_storage_interface" + }, + "elements": [ + { + "from": [2, 0, 2], + "to": [14, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 8, 10]}, + "faces": { + "north": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, + "east": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, + "south": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, + "west": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, + "up": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "Middle", + "origin": [10, 22, 10], + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/block_top.json b/src/main/resources/assets/create/models/block/portable_storage_interface/block_top.json new file mode 100644 index 000000000..88f35fcab --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/block_top.json @@ -0,0 +1,120 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/portable_storage_interface", + "particle": "create:block/portable_storage_interface" + }, + "elements": [ + { + "from": [3, 7, 3], + "to": [13, 14.1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 15, 11]}, + "faces": { + "north": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"}, + "east": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"}, + "south": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"}, + "west": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"} + } + }, + { + "from": [1, 14, 1], + "to": [15, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "east": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "south": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "west": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "up": {"uv": [8.5, 8, 15.5, 15], "texture": "#0"}, + "down": {"uv": [8.5, 8, 15.5, 15], "texture": "#0"} + } + }, + { + "from": [4, 13.1, 13], + "to": [6, 15.1, 14], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 13]}, + "faces": { + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [10, 15, 11, 16], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [10, 13.1, 2], + "to": [12, 15.1, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 3]}, + "faces": { + "north": {"uv": [10, 15, 11, 16], "texture": "#0"}, + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [2, 13.1, 4], + "to": [3, 15.1, 6], + "rotation": {"angle": 45, "axis": "z", "origin": [3, 14, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [10, 15, 11, 16], "texture": "#0"} + } + }, + { + "from": [13, 13.1, 10], + "to": [14, 15.1, 12], + "rotation": {"angle": -45, "axis": "z", "origin": [13, 14, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "east": {"uv": [10, 15, 11, 16], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [10, 13.1, 13], + "to": [12, 15.1, 14], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 13]}, + "faces": { + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [13, 15, 14, 16], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [4, 13.1, 2], + "to": [6, 15.1, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 3]}, + "faces": { + "north": {"uv": [13, 15, 14, 16], "texture": "#0"}, + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [2, 13.1, 10], + "to": [3, 15.1, 12], + "rotation": {"angle": 45, "axis": "z", "origin": [3, 14, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [13, 15, 14, 16], "texture": "#0"} + } + }, + { + "from": [13, 13.1, 4], + "to": [14, 15.1, 6], + "rotation": {"angle": -45, "axis": "z", "origin": [13, 14, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "east": {"uv": [13, 15, 14, 16], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "Top", + "origin": [10, 22, 10], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/brass_casing.png b/src/main/resources/assets/create/models/block/portable_storage_interface/brass_casing.png new file mode 100644 index 000000000..fb657ce47 Binary files /dev/null and b/src/main/resources/assets/create/models/block/portable_storage_interface/brass_casing.png differ diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/item.json b/src/main/resources/assets/create/models/block/portable_storage_interface/item.json new file mode 100644 index 000000000..2b93d6cc3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/item.json @@ -0,0 +1,238 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/portable_storage_interface", + "1": "create:block/brass_casing", + "particle": "create:block/portable_storage_interface" + }, + "elements": [ + { + "from": [2, 10, 2], + "to": [14, 19, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 18, 10]}, + "faces": { + "north": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "east": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "south": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "west": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "up": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 12, 16], + "faces": { + "north": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "east": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "south": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "west": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "from": [0, 12, 1.9], + "to": [2, 14.1, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 10]}, + "faces": { + "north": {"uv": [7, 10, 8, 11], "texture": "#0"}, + "south": {"uv": [0, 10, 1, 11], "texture": "#0"}, + "west": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "texture": "#1"} + } + }, + { + "from": [14, 12, 2], + "to": [16, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 6]}, + "faces": { + "north": {"uv": [0, 10, 1, 11], "texture": "#0"}, + "east": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "south": {"uv": [7, 10, 8, 11], "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [2, 12, 0], + "to": [14, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 20, 8]}, + "faces": { + "north": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "east": {"uv": [0, 10, 8, 11], "texture": "#0"}, + "south": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "west": {"uv": [0, 10, 8, 11], "texture": "#0"}, + "up": {"uv": [2, 0, 14, 16], "texture": "#1"} + } + }, + { + "from": [3, 16, 3], + "to": [13, 23.1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 24, 11]}, + "faces": { + "north": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"}, + "east": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"}, + "south": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"}, + "west": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"} + } + }, + { + "from": [1, 23, 1], + "to": [15, 25, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 8]}, + "faces": { + "north": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "east": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "south": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "west": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "up": {"uv": [8.5, 8, 15.5, 15], "texture": "#0"}, + "down": {"uv": [8.5, 8, 15.5, 15], "texture": "#0"} + } + }, + { + "from": [4, 22.1, 13], + "to": [6, 24.1, 14], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 23, 13]}, + "faces": { + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [10, 15, 11, 16], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [10, 22.1, 2], + "to": [12, 24.1, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 23, 3]}, + "faces": { + "north": {"uv": [10, 15, 11, 16], "texture": "#0"}, + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [2, 22.1, 4], + "to": [3, 24.1, 6], + "rotation": {"angle": 45, "axis": "z", "origin": [3, 23, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [10, 15, 11, 16], "texture": "#0"} + } + }, + { + "from": [13, 22.1, 10], + "to": [14, 24.1, 12], + "rotation": {"angle": -45, "axis": "z", "origin": [13, 23, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "east": {"uv": [10, 15, 11, 16], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [10, 22.1, 13], + "to": [12, 24.1, 14], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 23, 13]}, + "faces": { + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [13, 15, 14, 16], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [4, 22.1, 2], + "to": [6, 24.1, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 23, 3]}, + "faces": { + "north": {"uv": [13, 15, 14, 16], "texture": "#0"}, + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [2, 22.1, 10], + "to": [3, 24.1, 12], + "rotation": {"angle": 45, "axis": "z", "origin": [3, 23, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [13, 15, 14, 16], "texture": "#0"} + } + }, + { + "from": [13, 22.1, 4], + "to": [14, 24.1, 6], + "rotation": {"angle": -45, "axis": "z", "origin": [13, 23, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "east": {"uv": [13, 15, 14, 16], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + } + ], + "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], + "translation": [0, -1.75, 0], + "scale": [0.45, 0.45, 0.45] + }, + "head": { + "rotation": [-180, 0, 0], + "translation": [0, 22.25, 0] + }, + "fixed": { + "translation": [0, -1.25, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "Middle", + "origin": [10, 22, 10], + "children": [0] + }, + { + "name": "block", + "origin": [8, 8, 8], + "children": [ + { + "name": "Base", + "origin": [10, 20, 8], + "children": [1, 2, 3, 4] + } + ] + }, + { + "name": "block_top", + "origin": [8, 8, 8], + "children": [ + { + "name": "Top", + "origin": [10, 22, 10], + "children": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/portable_storage_interface.bbmodel b/src/main/resources/assets/create/models/block/portable_storage_interface/portable_storage_interface.bbmodel new file mode 100644 index 000000000..579e9291e --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/portable_storage_interface.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"3.2","model_format":"java_block","box_uv":false},"name":"item","ambientocclusion":true,"front_gui_light":false,"resolution":{"width":16,"height":16},"elements":[{"name":"cube","from":[2,10,2],"to":[14,19,14],"autouv":0,"color":4,"locked":false,"origin":[10,18,10],"faces":{"north":{"uv":[1,3.5,7,8],"texture":0},"east":{"uv":[1,3.5,7,8],"texture":0},"south":{"uv":[1,3.5,7,8],"texture":0},"west":{"uv":[1,3.5,7,8],"texture":0},"up":{"uv":[1.5,3.5,2,4],"texture":0},"down":{"uv":[0,0,12,12],"texture":null}},"uuid":"de312b34-6e0e-d92a-f0cc-2b14d972edb8"},{"name":"cube","from":[0,0,0],"to":[16,12,16],"autouv":0,"color":3,"locked":false,"origin":[8,8,8],"faces":{"north":{"uv":[0,10,8,16],"texture":0},"east":{"uv":[0,10,8,16],"texture":0},"south":{"uv":[0,10,8,16],"texture":0},"west":{"uv":[0,10,8,16],"texture":0},"up":{"uv":[0,0,16,16],"texture":1},"down":{"uv":[0,0,16,16],"texture":1}},"uuid":"d78fa319-b9a7-d009-a299-e17e3ecd7b4c"},{"name":"cube","from":[0,12,1.9],"to":[2,14.1,14.1],"autouv":0,"color":2,"locked":false,"origin":[8,20,10],"faces":{"north":{"uv":[7,10,8,11],"texture":0},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[0,10,1,11],"texture":0},"west":{"uv":[1,9,7,10],"texture":0},"up":{"uv":[0,2,2,14],"texture":1},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"e5ea8437-3bd2-3033-9cb1-bca2918ad937"},{"name":"cube","from":[14,12,2],"to":[16,14,14],"autouv":0,"color":4,"locked":false,"origin":[8,20,6],"faces":{"north":{"uv":[0,10,1,11],"texture":0},"east":{"uv":[1,9,7,10],"texture":0},"south":{"uv":[7,10,8,11],"texture":0},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[0,2,2,14],"rotation":180,"texture":1},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"ef15b8aa-40de-3212-db76-9fc6c9269236"},{"name":"cube","from":[2,12,0],"to":[14,14,16],"autouv":0,"color":0,"locked":false,"origin":[10,20,8],"faces":{"north":{"uv":[1,9,7,10],"texture":0},"east":{"uv":[0,10,8,11],"texture":0},"south":{"uv":[1,9,7,10],"texture":0},"west":{"uv":[0,10,8,11],"texture":0},"up":{"uv":[2,0,14,16],"texture":1},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"a11c9348-80ea-30fd-5b35-bf4fab00a286"},{"name":"cube","from":[3,16,3],"to":[13,23.1,13],"autouv":0,"color":2,"locked":false,"origin":[11,24,11],"faces":{"north":{"uv":[1.5,0,6.5,3.5],"texture":0},"east":{"uv":[1.5,0,6.5,3.5],"texture":0},"south":{"uv":[1.5,0,6.5,3.5],"texture":0},"west":{"uv":[1.5,0,6.5,3.5],"texture":0},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"6a52cb20-69df-718c-97da-3c42422e07e0"},{"name":"cube","from":[1,23,1],"to":[15,25,15],"autouv":0,"color":6,"locked":false,"origin":[8,24,8],"faces":{"north":{"uv":[8.5,15,15.5,16],"texture":0},"east":{"uv":[8.5,15,15.5,16],"texture":0},"south":{"uv":[8.5,15,15.5,16],"texture":0},"west":{"uv":[8.5,15,15.5,16],"texture":0},"up":{"uv":[8.5,8,15.5,15],"texture":0},"down":{"uv":[8.5,8,15.5,15],"texture":0}},"uuid":"323ba350-4ba9-9942-b94e-9918f2cb06bd"},{"name":"cube","from":[4,22.1,13],"to":[6,24.1,14],"autouv":0,"color":7,"locked":false,"rotation":[45,0,0],"origin":[8,23,13],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[7.5,10,8,10.5],"texture":0},"south":{"uv":[10,15,11,16],"texture":0},"west":{"uv":[7.5,10,8,10.5],"texture":0},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"1d3cd83e-6fc4-5767-4de6-42d59581a66b"},{"name":"cube","from":[10,22.1,2],"to":[12,24.1,3],"autouv":0,"color":5,"locked":false,"rotation":[-45,0,0],"origin":[8,23,3],"faces":{"north":{"uv":[10,15,11,16],"texture":0},"east":{"uv":[7.5,10,8,10.5],"texture":0},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[7.5,10,8,10.5],"texture":0},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"ff86b4f3-c6ea-e7e4-228a-a2b21aca7a25"},{"name":"cube","from":[2,22.1,4],"to":[3,24.1,6],"autouv":0,"color":7,"locked":false,"rotation":[0,0,45],"origin":[3,23,8],"faces":{"north":{"uv":[7.5,10,8,10.5],"texture":0},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[7.5,10,8,10.5],"texture":0},"west":{"uv":[10,15,11,16],"texture":0},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"f689fb7a-a97d-fd81-c390-380f16371935"},{"name":"cube","from":[13,22.1,10],"to":[14,24.1,12],"autouv":0,"color":6,"locked":false,"rotation":[0,0,-45],"origin":[13,23,8],"faces":{"north":{"uv":[7.5,10,8,10.5],"texture":0},"east":{"uv":[10,15,11,16],"texture":0},"south":{"uv":[7.5,10,8,10.5],"texture":0},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"848d1774-ecae-9eb6-f536-e332161c0954"},{"name":"cube","from":[10,22.1,13],"to":[12,24.1,14],"autouv":0,"color":6,"locked":false,"rotation":[45,0,0],"origin":[8,23,13],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[7.5,10,8,10.5],"texture":0},"south":{"uv":[13,15,14,16],"texture":0},"west":{"uv":[7.5,10,8,10.5],"texture":0},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"c71a2559-c9eb-ea19-f432-00ef36482906"},{"name":"cube","from":[4,22.1,2],"to":[6,24.1,3],"autouv":0,"color":7,"locked":false,"rotation":[-45,0,0],"origin":[8,23,3],"faces":{"north":{"uv":[13,15,14,16],"texture":0},"east":{"uv":[7.5,10,8,10.5],"texture":0},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[7.5,10,8,10.5],"texture":0},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"76250b0e-a72a-5cf0-e6fe-92819c986668"},{"name":"cube","from":[2,22.1,10],"to":[3,24.1,12],"autouv":0,"color":1,"locked":false,"rotation":[0,0,45],"origin":[3,23,8],"faces":{"north":{"uv":[7.5,10,8,10.5],"texture":0},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[7.5,10,8,10.5],"texture":0},"west":{"uv":[13,15,14,16],"texture":0},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"df73a796-af5b-89a2-cd8e-ba9c3babf799"},{"name":"cube","from":[13,22.1,4],"to":[14,24.1,6],"autouv":0,"color":6,"locked":false,"rotation":[0,0,-45],"origin":[13,23,8],"faces":{"north":{"uv":[7.5,10,8,10.5],"texture":0},"east":{"uv":[13,15,14,16],"texture":0},"south":{"uv":[7.5,10,8,10.5],"texture":0},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"3c79817e-58ff-9c30-ebcf-3bba7ec9e870"}],"outliner":[{"name":"Middle","uuid":"264b83b8-efae-9137-aa5e-0226a71ebafb","export":true,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"origin":[10,22,10],"children":["de312b34-6e0e-d92a-f0cc-2b14d972edb8"]},{"name":"block","uuid":"bd1a7e4e-8dfb-30c7-82be-0b25df157ef2","export":true,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"origin":[8,8,8],"children":[{"name":"Base","uuid":"2cfb4e18-3aea-9f2f-2880-12edf0e1d861","export":true,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"origin":[10,20,8],"children":["d78fa319-b9a7-d009-a299-e17e3ecd7b4c","e5ea8437-3bd2-3033-9cb1-bca2918ad937","ef15b8aa-40de-3212-db76-9fc6c9269236","a11c9348-80ea-30fd-5b35-bf4fab00a286"]}]},{"name":"block_top","uuid":"0073ff5f-cbc9-63c3-ee64-74a557d08b5f","export":true,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"origin":[8,8,8],"children":[{"name":"Top","uuid":"c293d84e-c942-8907-cf16-62a51d3e9ef3","export":true,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"origin":[10,22,10],"children":["6a52cb20-69df-718c-97da-3c42422e07e0","323ba350-4ba9-9942-b94e-9918f2cb06bd","1d3cd83e-6fc4-5767-4de6-42d59581a66b","ff86b4f3-c6ea-e7e4-228a-a2b21aca7a25","f689fb7a-a97d-fd81-c390-380f16371935","848d1774-ecae-9eb6-f536-e332161c0954","c71a2559-c9eb-ea19-f432-00ef36482906","76250b0e-a72a-5cf0-e6fe-92819c986668","df73a796-af5b-89a2-cd8e-ba9c3babf799","3c79817e-58ff-9c30-ebcf-3bba7ec9e870"]}]}],"textures":[{"path":"C:\\Users\\simon\\Desktop\\Forgespace 1.15\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\portable_storage_interface.png","name":"portable_storage_interface.png","folder":"block","namespace":"create","id":"0","particle":true,"mode":"bitmap","saved":true,"uuid":"0539e8a0-cc65-561f-c3f4-7d4ec0ab322f","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAE2UlEQVRYR61XXWgcVRT+JtmdzM7+NDHRVh9U6EMTfWhMFJpKBDGSkgRSIWCC+OZDCyJowb6V4oNoRXwR1BdfRBJh0Qaa0GqqaOgPQv6w5KdapH3QxGyan01mJ7ObjJwzOZM7yRDoNAeWe++ZPfd8c36+uVeDIi2vvOo6Tok1uh4DzWWUv9F66OpPmmon8472drdUKiEWi7FK5qqO9JcGBnz7wEa0gW07MAydjUulTcRiZTyKjjZXN1CBRLEPADjR2upalgPTJACbgQiIjgBdvnIlNAJR7AMbUQosy4ZpGuxcDaHo9kpBFPsAgJeaX3aXV1ZwIJNh52uWhaRp8ig6SsFvw7+ERiCKfWCj403Nbm5hATXV1ey0UCggkUjwKDoCdP3GcCiAKPaBjY4ebXRVp2qBCRAaJyZGQgFEsfc36unpcYvFIui3l8TjcdCvt7c3ACKqvb9JV1eX+8yRIxgdH8fq4CCSANIAFqGhCi5mAaTa2tBQX4/JmRlks9kAANX+iYEBPAfgIICnAPy+Nf+6vX2Xvb9JZ2enu7ZqgbogffMaO81vgaCxBA35Yy8ikzFRYRjo7+8PAFDt37wxjAyAWgB3ARQA/ArgVlPzLnt/EyKRlRWLmY963WOyTR6FjIQZw7ggqr0PgEiEAFCbEQiKhFCq0LHwQhgXRLX3ARCJzOfuc9+TY+IDmnsRiAV4IYwLotr7AIhEZufmuO/JMfEBzUmEjKRFw7ggqr0PgEhkdu4/xGLl7DifX+U5iXBAqbThP9/JBVHtfQBEIuTUC3k5yJlI2Pr27cldJBbFPpTR9mSikIfd3d3uaj7PdfLZ6Uoszy7h/A9AZVUV/3tpcRHnXwMOHKrEu18scU2l0mn09fVp+wJAPYgQCCnc8q2DyQafLbb10k10rtDe63jWrTQ2YCEOEx4N01xkp07W8r+Psn9o1ILyVqTf+T1RvyP0XKJF5woG8PRhE1XpciQNnf2u2Y4PYKdOXf89vYRz2Wlt6uLrLoWWQj49PQ3Lstjetm0eKyoqoGkaF3NdXR2nhFJVd/K7IICLQ/dQcjz2czbcQLbNhNcRJCdbnkR942EMfj+Bs9/c0m5+2epSzomip6am2HE+TwS+Lel0GoZhMIB12+aaOHZKiUD2xzuoSui+Y71cQ0zfouQtUJxbvQz/5gq4cOY4rl2/ywDUFIyOjmJ+fj7gXBY1NTVobGwMT0HfwF+IxTWUiq4/ssP4dp2qz1QA1AWUd5KxsbFdby8AUqkUGhoaeEnp4C6QGqAIJHWv+CTcajooIpQWGhcLDj58p8mPwL4BoBSISA0IGKuwTUzLaw6++qTNrwE1BSMjI8jlcg+eAomAWmzilN5a8k/j/LIdiIBahJOTk1hfX3/wIqQaeDRT4YdZwh3WEWtOkQH8fPXOrjYkAFQPruvCcbx2purn1Jomamtrw9tQLUK1+Kjwdq6pMFUA+0JEBODxmoTPA2FvTjopwnNvPY+R8X+4DR+aiokJBQDlXa14AaLWAfHAB6df8AE81MeI2vCxQ0lUPuIx4F6S1L1br9DxnzP3AxGge+WFN3TMLazi08s63zFJSH/mhIOD1Sm8/61395RLLvOAbniMx4WCYqSPER1g6Rx5tmOTvyWfDxl8x/QA2Hi7xWbgH18qY70cbP8HnbEaXWM9SskAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Forgespace 1.15\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\brass_casing.png","name":"brass_casing.png","folder":"block","namespace":"create","id":"1","particle":false,"mode":"bitmap","saved":true,"uuid":"4871ad15-b223-c27e-7677-628b97f293d9","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABeUlEQVQ4T4VSv0/CUBC+J6WkVKUMGn9MSqJNkITEf0MXZTAOxsXB1Tg4Mzu4mejiYuLi/0IiJuiAbhocWojlQQFr7sqjfaUpt9x7vXtfv/vuY1eVkpeFAWBkNIVyNPp8GFu3OANWrZjehmlAebdATe1ve/I+t2JI917X/xFGh/egXmv5ADvlZaje1aiQVVOUlTSD4cCjHA78hnF5WpoGKKzNU3Ho/kmP3JEHaioA+un04fxoGz4aNjDUoGjqcPv0BkuLGcDmpEAgi7twdrgFrw0nALh/foe8phJA23EnYxCjMe2crhITZHByUIDPZj/Q4PrhBbAB48visJrXJCIIKup4RoBW8zcAuHmsSwyw2XF91XU1TWfMYoTj/U0fQGgQHUEAIH08CwZTIyQBhGcQDMgr4xFIg7gtCBG77oh8IbwQHUESMazBrDWKLcSKiI+jxhGAijpHJpPWGNZAWFfsPYmJ5ANjfSHRfXHFrsPAtjmwi71isndnQP8Dd8/5n9T5ysEAAAAASUVORK5CYII="}],"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],"translation":[0,-1.75,0],"scale":[0.45,0.45,0.45]},"head":{"rotation":[-180,0,0],"translation":[0,22.25,0]},"fixed":{"translation":[0,-1.25,0],"scale":[0.5,0.5,0.5]}}} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/portable_storage_interface.png b/src/main/resources/assets/create/models/block/portable_storage_interface/portable_storage_interface.png new file mode 100644 index 000000000..0e9ade677 Binary files /dev/null and b/src/main/resources/assets/create/models/block/portable_storage_interface/portable_storage_interface.png differ diff --git a/src/main/resources/assets/create/textures/block/portable_storage_interface.png b/src/main/resources/assets/create/textures/block/portable_storage_interface.png new file mode 100644 index 000000000..0e9ade677 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/portable_storage_interface.png differ