From 649408c5092d0bcd3adbdd66948798cf884cb142 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sun, 14 Feb 2021 20:01:33 -0500 Subject: [PATCH] Add Extractor block --- .../phycon/init/PhyBlockEntities.kt | 6 + .../net/shadowfacts/phycon/init/PhyBlocks.kt | 5 + .../net/shadowfacts/phycon/init/PhyItems.kt | 5 + .../shadowfacts/phycon/network/NetworkUtil.kt | 4 + .../network/block/extractor/ExtractorBlock.kt | 110 ++++++++++++++++++ .../block/extractor/ExtractorBlockEntity.kt | 59 ++++++++++ .../netinterface/InterfaceBlockEntity.kt | 9 +- .../block/terminal/TerminalBlockEntity.kt | 12 +- .../network/component/NetworkStackProvider.kt | 9 ++ .../network/component/NetworkStackReceiver.kt | 9 ++ .../phycon/network/packet/CapacityPacket.kt | 10 +- .../network/packet/StackLocationPacket.kt | 12 +- .../assets/phycon/blockstates/extractor.json | 29 +++++ .../resources/assets/phycon/lang/en_us.json | 1 + .../assets/phycon/models/block/extractor.json | 50 ++++++++ 15 files changed, 314 insertions(+), 16 deletions(-) create mode 100644 src/main/kotlin/net/shadowfacts/phycon/network/block/extractor/ExtractorBlock.kt create mode 100644 src/main/kotlin/net/shadowfacts/phycon/network/block/extractor/ExtractorBlockEntity.kt create mode 100644 src/main/kotlin/net/shadowfacts/phycon/network/component/NetworkStackProvider.kt create mode 100644 src/main/kotlin/net/shadowfacts/phycon/network/component/NetworkStackReceiver.kt create mode 100644 src/main/resources/assets/phycon/blockstates/extractor.json create mode 100644 src/main/resources/assets/phycon/models/block/extractor.json diff --git a/src/main/kotlin/net/shadowfacts/phycon/init/PhyBlockEntities.kt b/src/main/kotlin/net/shadowfacts/phycon/init/PhyBlockEntities.kt index 171daff..db553e6 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/init/PhyBlockEntities.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/init/PhyBlockEntities.kt @@ -5,6 +5,8 @@ import net.minecraft.block.entity.BlockEntity import net.minecraft.block.entity.BlockEntityType import net.minecraft.util.Identifier import net.minecraft.util.registry.Registry +import net.shadowfacts.phycon.network.block.extractor.ExtractorBlock +import net.shadowfacts.phycon.network.block.extractor.ExtractorBlockEntity import net.shadowfacts.phycon.network.block.netinterface.InterfaceBlock import net.shadowfacts.phycon.network.block.netinterface.InterfaceBlockEntity import net.shadowfacts.phycon.network.block.netswitch.SwitchBlock @@ -24,6 +26,8 @@ object PhyBlockEntities { val INTERFACE = create(::InterfaceBlockEntity, PhyBlocks.INTERFACE) val TERMINAL = create(::TerminalBlockEntity, PhyBlocks.TERMINAL) val SWITCH = create(::SwitchBlockEntity, PhyBlocks.SWITCH) + val EXTRACTOR = create(::ExtractorBlockEntity, PhyBlocks.EXTRACTOR) + val SOURCE = create(::SourceBlockEntity, PhyBlocks.SOURCE) val DEST = create(::DestBlockEntity, PhyBlocks.DEST) @@ -35,6 +39,8 @@ object PhyBlockEntities { register(InterfaceBlock.ID, INTERFACE) register(TerminalBlock.ID, TERMINAL) register(SwitchBlock.ID, SWITCH) + register(ExtractorBlock.ID, EXTRACTOR) + register(SourceBlock.ID, SOURCE) register(DestBlock.ID, DEST) } diff --git a/src/main/kotlin/net/shadowfacts/phycon/init/PhyBlocks.kt b/src/main/kotlin/net/shadowfacts/phycon/init/PhyBlocks.kt index 1e8c1bd..8b70b77 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/init/PhyBlocks.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/init/PhyBlocks.kt @@ -4,6 +4,7 @@ import net.minecraft.block.Block import net.minecraft.util.Identifier import net.minecraft.util.registry.Registry import net.shadowfacts.phycon.network.block.cable.CableBlock +import net.shadowfacts.phycon.network.block.extractor.ExtractorBlock import net.shadowfacts.phycon.network.block.netinterface.InterfaceBlock import net.shadowfacts.phycon.network.block.netswitch.SwitchBlock import net.shadowfacts.phycon.network.block.terminal.TerminalBlock @@ -19,6 +20,8 @@ object PhyBlocks { val TERMINAL = TerminalBlock() val SWITCH = SwitchBlock() val CABLE = CableBlock() + val EXTRACTOR = ExtractorBlock() + val SOURCE = SourceBlock() val DEST = DestBlock() @@ -27,6 +30,8 @@ object PhyBlocks { register(TerminalBlock.ID, TERMINAL) register(SwitchBlock.ID, SWITCH) register(CableBlock.ID, CABLE) + register(ExtractorBlock.ID, EXTRACTOR) + register(SourceBlock.ID, SOURCE) register(DestBlock.ID, DEST) } diff --git a/src/main/kotlin/net/shadowfacts/phycon/init/PhyItems.kt b/src/main/kotlin/net/shadowfacts/phycon/init/PhyItems.kt index 6db41c5..bcb9c12 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/init/PhyItems.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/init/PhyItems.kt @@ -7,6 +7,7 @@ import net.minecraft.util.registry.Registry import net.shadowfacts.phycon.item.ConsoleItem import net.shadowfacts.phycon.item.ScrewdriverItem import net.shadowfacts.phycon.network.block.cable.CableBlock +import net.shadowfacts.phycon.network.block.extractor.ExtractorBlock import net.shadowfacts.phycon.network.block.netinterface.InterfaceBlock import net.shadowfacts.phycon.network.block.netswitch.SwitchBlock import net.shadowfacts.phycon.network.block.terminal.TerminalBlock @@ -22,6 +23,8 @@ object PhyItems { val TERMINAL = BlockItem(PhyBlocks.TERMINAL, Item.Settings()) val SWITCH = BlockItem(PhyBlocks.SWITCH, Item.Settings()) val CABLE = BlockItem(PhyBlocks.CABLE, Item.Settings()) + val EXTRACTOR = BlockItem(PhyBlocks.EXTRACTOR, Item.Settings()) + val SOURCE = BlockItem(PhyBlocks.SOURCE, Item.Settings()) val DEST = BlockItem(PhyBlocks.DEST , Item.Settings()) @@ -33,6 +36,8 @@ object PhyItems { register(TerminalBlock.ID, TERMINAL) register(SwitchBlock.ID, SWITCH) register(CableBlock.ID, CABLE) + register(ExtractorBlock.ID, EXTRACTOR) + register(SourceBlock.ID, SOURCE) register(DestBlock.ID, DEST) diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/NetworkUtil.kt b/src/main/kotlin/net/shadowfacts/phycon/network/NetworkUtil.kt index 71966c2..bf162c0 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/network/NetworkUtil.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/network/NetworkUtil.kt @@ -25,6 +25,10 @@ object NetworkUtil { if (connectedSides.size == 1) { curSide = connectedSides.first() pos = pos.offset(curSide) + if (!world.isChunkLoaded(pos)) { + // avoid loading unloaded chunks + return null + } state = world.getBlockState(pos) } else { return null diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/block/extractor/ExtractorBlock.kt b/src/main/kotlin/net/shadowfacts/phycon/network/block/extractor/ExtractorBlock.kt new file mode 100644 index 0000000..8ccb565 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/phycon/network/block/extractor/ExtractorBlock.kt @@ -0,0 +1,110 @@ +package net.shadowfacts.phycon.network.block.extractor + +import net.minecraft.block.Block +import net.minecraft.block.BlockState +import net.minecraft.block.Material +import net.minecraft.block.ShapeContext +import net.minecraft.entity.LivingEntity +import net.minecraft.item.ItemPlacementContext +import net.minecraft.item.ItemStack +import net.minecraft.state.StateManager +import net.minecraft.state.property.Properties +import net.minecraft.util.Identifier +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Direction +import net.minecraft.util.shape.VoxelShape +import net.minecraft.util.shape.VoxelShapes +import net.minecraft.world.BlockView +import net.minecraft.world.World +import net.shadowfacts.phycon.PhysicalConnectivity +import net.shadowfacts.phycon.api.Interface +import net.shadowfacts.phycon.network.DeviceBlock +import java.util.* + +/** + * @author shadowfacts + */ +class ExtractorBlock: DeviceBlock(Settings.of(Material.METAL)) { + + companion object { + val ID = Identifier(PhysicalConnectivity.MODID, "extractor") + val FACING = Properties.FACING + private val EXTRACTOR_SHAPES = mutableMapOf() + + init { + val components = arrayOf( + doubleArrayOf(0.0, 0.0, 0.0, 16.0, 2.0, 16.0), + doubleArrayOf(2.0, 2.0, 2.0, 14.0, 4.0, 14.0), + doubleArrayOf(4.0, 4.0, 4.0, 12.0, 6.0, 12.0), + doubleArrayOf(6.0, 6.0, 6.0, 10.0, 16.0, 10.0) + ) + val directions = arrayOf( + Triple(Direction.DOWN, null, false), + Triple(Direction.UP, null, true), + Triple(Direction.NORTH, 2, false), + Triple(Direction.SOUTH, 2, true), + Triple(Direction.WEST, 1, false), + Triple(Direction.EAST, 1, true), + ) + for ((dir, rotate, flip) in directions) { + val shapes = components.map { it -> + val arr = it.copyOf() + if (rotate != null) { + for (i in 0 until 3) { + arr[i] = it[(i + rotate) % 3] + arr[3 + i] = it[3 + ((i + rotate) % 3)] + } + } + if (flip) { + for (i in arr.indices) { + arr[i] = 16.0 - arr[i] + } + } + createCuboidShape(arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]) + } + EXTRACTOR_SHAPES[dir] = shapes.reduce { a, b -> VoxelShapes.union(a, b) } + } + } + } + + override fun getNetworkConnectedSides(state: BlockState, world: World, pos: BlockPos): Collection { + return EnumSet.of(state[FACING].opposite) + } + + override fun getNetworkInterfaceForSide(side: Direction, state: BlockState, world: World, pos: BlockPos): Interface? { + return if (side == state[FACING].opposite) { + getBlockEntity(world, pos) + } else { + null + } + } + + override fun appendProperties(builder: StateManager.Builder) { + super.appendProperties(builder) + builder.add(FACING) + } + + override fun createBlockEntity(world: BlockView) = ExtractorBlockEntity() + + override fun getPlacementState(context: ItemPlacementContext): BlockState { + val facing = if (context.player?.isSneaking == true) context.side.opposite else context.playerFacing.opposite + return defaultState.with(FACING, facing) + } + + override fun getOutlineShape(state: BlockState, world: BlockView, pos: BlockPos, context: ShapeContext): VoxelShape { + return EXTRACTOR_SHAPES[state[FACING]]!! + } + + override fun onPlaced(world: World, pos: BlockPos, state: BlockState, entity: LivingEntity?, stack: ItemStack) { + if (!world.isClient) { + getBlockEntity(world, pos)!!.updateInventory() + } + } + + override fun neighborUpdate(state: BlockState, world: World, pos: BlockPos, neighbor: Block, neighborPos: BlockPos, bl: Boolean) { + if (!world.isClient) { + getBlockEntity(world, pos)!!.updateInventory() + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/block/extractor/ExtractorBlockEntity.kt b/src/main/kotlin/net/shadowfacts/phycon/network/block/extractor/ExtractorBlockEntity.kt new file mode 100644 index 0000000..90f0de9 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/phycon/network/block/extractor/ExtractorBlockEntity.kt @@ -0,0 +1,59 @@ +package net.shadowfacts.phycon.network.block.extractor + +import alexiil.mc.lib.attributes.SearchOptions +import alexiil.mc.lib.attributes.item.FixedItemInv +import alexiil.mc.lib.attributes.item.GroupedItemInv +import alexiil.mc.lib.attributes.item.ItemAttributes +import net.minecraft.util.math.Direction +import net.shadowfacts.phycon.api.packet.Packet +import net.shadowfacts.phycon.api.util.IPAddress +import net.shadowfacts.phycon.init.PhyBlockEntities +import net.shadowfacts.phycon.network.DeviceBlockEntity +import net.shadowfacts.phycon.network.packet.CapacityPacket +import net.shadowfacts.phycon.network.packet.CheckCapacityPacket +import net.shadowfacts.phycon.network.packet.ItemStackPacket + +/** + * @author shadowfacts + */ +class ExtractorBlockEntity: DeviceBlockEntity(PhyBlockEntities.EXTRACTOR) { + + private val facing: Direction + get() = cachedState[ExtractorBlock.FACING] + + private var inventory: GroupedItemInv? = null + private var shouldExtract = false + + fun updateInventory() { + val offsetPos = pos.offset(facing) + val option = SearchOptions.inDirection(facing) + inventory = ItemAttributes.GROUPED_INV.getFirstOrNull(world, offsetPos, option) + } + + private fun getInventory(): GroupedItemInv? { + if (inventory == null) updateInventory() + return inventory + } + + override fun handle(packet: Packet) { + if (packet is CapacityPacket && shouldExtract) { + getInventory()?.also { inv -> + shouldExtract = false + val extracted = inv.extract(packet.stack, packet.capacity) + sendPacket(ItemStackPacket(extracted, ipAddress, packet.stackReceiver.ipAddress)) + } + } + } + + override fun tick() { + super.tick() + + if (!world!!.isClient && counter % 40 == 0L) { + getInventory()?.also { + val stack = it.storedStacks.firstOrNull() ?: return + shouldExtract = true + sendPacket(CheckCapacityPacket(stack, ipAddress, IPAddress.BROADCAST)) + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/block/netinterface/InterfaceBlockEntity.kt b/src/main/kotlin/net/shadowfacts/phycon/network/block/netinterface/InterfaceBlockEntity.kt index 46457d6..85500f6 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/network/block/netinterface/InterfaceBlockEntity.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/network/block/netinterface/InterfaceBlockEntity.kt @@ -10,16 +10,21 @@ import net.shadowfacts.phycon.api.packet.Packet import net.shadowfacts.phycon.init.PhyBlockEntities import net.shadowfacts.phycon.network.DeviceBlockEntity import net.shadowfacts.phycon.network.component.ItemStackPacketHandler +import net.shadowfacts.phycon.network.component.NetworkStackProvider +import net.shadowfacts.phycon.network.component.NetworkStackReceiver import net.shadowfacts.phycon.network.component.handleItemStack import net.shadowfacts.phycon.network.packet.* /** * @author shadowfacts */ -class InterfaceBlockEntity: DeviceBlockEntity(PhyBlockEntities.INTERFACE), ItemStackPacketHandler { +class InterfaceBlockEntity: DeviceBlockEntity(PhyBlockEntities.INTERFACE), + ItemStackPacketHandler, + NetworkStackProvider, + NetworkStackReceiver { private val facing: Direction - get() = world!!.getBlockState(pos)[InterfaceBlock.FACING] + get() = cachedState[InterfaceBlock.FACING] // todo: should this be a weak ref? private var inventory: GroupedItemInv? = null diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/block/terminal/TerminalBlockEntity.kt b/src/main/kotlin/net/shadowfacts/phycon/network/block/terminal/TerminalBlockEntity.kt index e0b3839..0a0d616 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/network/block/terminal/TerminalBlockEntity.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/network/block/terminal/TerminalBlockEntity.kt @@ -17,7 +17,6 @@ import net.minecraft.nbt.ListTag import net.minecraft.network.PacketByteBuf import net.minecraft.screen.ScreenHandler import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.text.LiteralText import net.minecraft.text.TranslatableText import net.minecraft.util.Tickable import net.minecraft.util.math.Direction @@ -27,8 +26,9 @@ import net.shadowfacts.phycon.api.util.IPAddress import net.shadowfacts.phycon.init.PhyBlockEntities import net.shadowfacts.phycon.network.DeviceBlockEntity import net.shadowfacts.phycon.network.NetworkUtil -import net.shadowfacts.phycon.network.block.netinterface.InterfaceBlockEntity import net.shadowfacts.phycon.network.component.ItemStackPacketHandler +import net.shadowfacts.phycon.network.component.NetworkStackProvider +import net.shadowfacts.phycon.network.component.NetworkStackReceiver import net.shadowfacts.phycon.network.component.handleItemStack import net.shadowfacts.phycon.network.packet.* import java.util.* @@ -96,7 +96,7 @@ class TerminalBlockEntity: DeviceBlockEntity(PhyBlockEntities.TERMINAL), Invento ItemStackUtil.areEqualIgnoreAmounts(it.stack, packet.stack) } if (request != null) { - request.results.add(packet.amount to packet.sourceInterface) + request.results.add(packet.amount to packet.stackProvider) if (request.totalResultAmount >= request.amount || counter - request.timestamp >= LOCATE_REQUEST_TIMEOUT || request.results.size >= inventoryCache.size) { stackLocateRequestCompleted(request) } @@ -119,7 +119,7 @@ class TerminalBlockEntity: DeviceBlockEntity(PhyBlockEntities.TERMINAL), Invento ItemStackUtil.areEqualIgnoreAmounts(packet.stack, it.stack) } if (insertion != null) { - insertion.results.add(packet.capacity to packet.receivingInterface) + insertion.results.add(packet.capacity to packet.stackReceiver) if (insertion.isFinishable(counter)) { finishInsertion(insertion) } @@ -325,7 +325,7 @@ data class StackLocateRequest( val stack: ItemStack, val amount: Int, val timestamp: Long, - var results: MutableSet> = mutableSetOf() + var results: MutableSet> = mutableSetOf() ) { val totalResultAmount: Int get() = results.fold(0) { acc, (amount, _) -> acc + amount } @@ -339,7 +339,7 @@ data class PendingStackInsertion( val bufferSlot: Int, val stack: ItemStack, val timestamp: Long, - val results: MutableSet> = mutableSetOf(), + val results: MutableSet> = mutableSetOf(), ) { val totalCapacity: Int get() = results.fold(0) { acc, (amount, _) -> acc + amount } diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/component/NetworkStackProvider.kt b/src/main/kotlin/net/shadowfacts/phycon/network/component/NetworkStackProvider.kt new file mode 100644 index 0000000..4397469 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/phycon/network/component/NetworkStackProvider.kt @@ -0,0 +1,9 @@ +package net.shadowfacts.phycon.network.component + +import net.shadowfacts.phycon.api.NetworkDevice + +/** + * @author shadowfacts + */ +interface NetworkStackProvider: NetworkDevice { +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/component/NetworkStackReceiver.kt b/src/main/kotlin/net/shadowfacts/phycon/network/component/NetworkStackReceiver.kt new file mode 100644 index 0000000..b9aa7d0 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/phycon/network/component/NetworkStackReceiver.kt @@ -0,0 +1,9 @@ +package net.shadowfacts.phycon.network.component + +import net.shadowfacts.phycon.api.NetworkDevice + +/** + * @author shadowfacts + */ +interface NetworkStackReceiver: NetworkDevice { +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/packet/CapacityPacket.kt b/src/main/kotlin/net/shadowfacts/phycon/network/packet/CapacityPacket.kt index 707144b..b62dc29 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/network/packet/CapacityPacket.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/network/packet/CapacityPacket.kt @@ -2,10 +2,16 @@ package net.shadowfacts.phycon.network.packet import net.minecraft.item.ItemStack import net.shadowfacts.phycon.api.util.IPAddress -import net.shadowfacts.phycon.network.block.netinterface.InterfaceBlockEntity +import net.shadowfacts.phycon.network.component.NetworkStackReceiver /** * @author shadowfacts */ -class CapacityPacket(val stack: ItemStack, val capacity: Int, val receivingInterface: InterfaceBlockEntity, source: IPAddress, destination: IPAddress): BasePacket(source, destination) { +class CapacityPacket( + val stack: ItemStack, + val capacity: Int, + val stackReceiver: NetworkStackReceiver, + source: IPAddress, + destination: IPAddress +): BasePacket(source, destination) { } \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/packet/StackLocationPacket.kt b/src/main/kotlin/net/shadowfacts/phycon/network/packet/StackLocationPacket.kt index 964db6c..a7e08f4 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/network/packet/StackLocationPacket.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/network/packet/StackLocationPacket.kt @@ -2,17 +2,17 @@ package net.shadowfacts.phycon.network.packet import net.minecraft.item.ItemStack import net.shadowfacts.phycon.api.util.IPAddress -import net.shadowfacts.phycon.network.block.netinterface.InterfaceBlockEntity +import net.shadowfacts.phycon.network.component.NetworkStackProvider /** * @author shadowfacts */ // todo: better name with LocateStackPacket class StackLocationPacket( - val stack: ItemStack, - val amount: Int, - val sourceInterface: InterfaceBlockEntity, - source: IPAddress, - destination: IPAddress + val stack: ItemStack, + val amount: Int, + val stackProvider: NetworkStackProvider, + source: IPAddress, + destination: IPAddress ): BasePacket(source, destination) { } diff --git a/src/main/resources/assets/phycon/blockstates/extractor.json b/src/main/resources/assets/phycon/blockstates/extractor.json new file mode 100644 index 0000000..67438c4 --- /dev/null +++ b/src/main/resources/assets/phycon/blockstates/extractor.json @@ -0,0 +1,29 @@ +{ + "variants": { + "facing=down": { + "model": "phycon:block/extractor" + }, + "facing=up": { + "model": "phycon:block/extractor", + "x": 180 + }, + "facing=north": { + "model": "phycon:block/extractor", + "x": 270 + }, + "facing=south": { + "model": "phycon:block/extractor", + "x": 90 + }, + "facing=west": { + "model": "phycon:block/extractor", + "x": 90, + "y": 90 + }, + "facing=east": { + "model": "phycon:block/extractor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/phycon/lang/en_us.json b/src/main/resources/assets/phycon/lang/en_us.json index 332003b..4fd4750 100644 --- a/src/main/resources/assets/phycon/lang/en_us.json +++ b/src/main/resources/assets/phycon/lang/en_us.json @@ -3,6 +3,7 @@ "block.phycon.network_interface": "Inventory Interface", "block.phycon.terminal": "Terminal", "block.phycon.cable": "Cable", + "block.phycon.extractor": "Inventory Extractor", "item.phycon.screwdriver": "Screwdriver", "item.phycon.console": "Console" diff --git a/src/main/resources/assets/phycon/models/block/extractor.json b/src/main/resources/assets/phycon/models/block/extractor.json new file mode 100644 index 0000000..fbbba21 --- /dev/null +++ b/src/main/resources/assets/phycon/models/block/extractor.json @@ -0,0 +1,50 @@ +{ + "parent": "block/block", + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "down": {"texture": "phycon:block/extractor_front"}, + "up": {"texture": "phycon:block/extractor_back"}, + "north": {"texture": "phycon:block/extractor_side"}, + "south": {"texture": "phycon:block/extractor_side"}, + "west": {"texture": "phycon:block/extractor_side"}, + "east": {"texture": "phycon:block/extractor_side"} + } + }, + { + "from": [2, 2, 2], + "to": [14, 4, 14], + "faces": { + "up": {"texture": "phycon:block/extractor_back"}, + "north": {"texture": "phycon:block/extractor_side"}, + "south": {"texture": "phycon:block/extractor_side"}, + "west": {"texture": "phycon:block/extractor_side"}, + "east": {"texture": "phycon:block/extractor_side"} + } + }, + { + "from": [4, 4, 4], + "to": [12, 6, 12], + "faces": { + "up": {"texture": "phycon:block/extractor_back"}, + "north": {"texture": "phycon:block/extractor_side"}, + "south": {"texture": "phycon:block/extractor_side"}, + "west": {"texture": "phycon:block/extractor_side"}, + "east": {"texture": "phycon:block/extractor_side"} + } + }, + { + "from": [6, 6, 6], + "to": [10, 16, 10], + "faces": { + "up": {"texture": "phycon:block/cable_side"}, + "north": {"texture": "phycon:block/cable_side"}, + "south": {"texture": "phycon:block/cable_side"}, + "west": {"texture": "phycon:block/cable_side"}, + "east": {"texture": "phycon:block/cable_side"} + } + } + ] +} \ No newline at end of file