From df86086d1077226f7911332c4f02d0df0cba7db0 Mon Sep 17 00:00:00 2001 From: IonutParau Date: Sat, 18 Apr 2026 19:43:35 +0200 Subject: [PATCH] redstone I/O --- .../org/neoflock/neocomputers/block/Blocks.kt | 1 + .../neoflock/neocomputers/block/NodeBlock.kt | 14 +- .../neoflock/neocomputers/block/RedstoneIO.kt | 138 ++++++++++++++++++ .../neocomputers/entity/BlockEntities.kt | 5 + .../neocomputers/blockstates/redio.json | 7 + .../assets/neocomputers/lang/en_us.json | 3 +- .../neocomputers/models/block/redio.json | 12 ++ .../neocomputers/models/item/redio.json | 3 + .../textures/block/redio_bottom.png | Bin 0 -> 415 bytes .../textures/block/redio_east.png | Bin 0 -> 552 bytes .../textures/block/redio_north.png | Bin 0 -> 534 bytes .../textures/block/redio_south.png | Bin 0 -> 539 bytes .../neocomputers/textures/block/redio_top.png | Bin 0 -> 331 bytes .../textures/block/redio_west.png | Bin 0 -> 546 bytes 14 files changed, 176 insertions(+), 7 deletions(-) create mode 100644 src/main/kotlin/org/neoflock/neocomputers/block/RedstoneIO.kt create mode 100644 src/main/resources/assets/neocomputers/blockstates/redio.json create mode 100644 src/main/resources/assets/neocomputers/models/block/redio.json create mode 100644 src/main/resources/assets/neocomputers/models/item/redio.json create mode 100644 src/main/resources/assets/neocomputers/textures/block/redio_bottom.png create mode 100644 src/main/resources/assets/neocomputers/textures/block/redio_east.png create mode 100644 src/main/resources/assets/neocomputers/textures/block/redio_north.png create mode 100644 src/main/resources/assets/neocomputers/textures/block/redio_south.png create mode 100644 src/main/resources/assets/neocomputers/textures/block/redio_top.png create mode 100644 src/main/resources/assets/neocomputers/textures/block/redio_west.png diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/Blocks.kt b/src/main/kotlin/org/neoflock/neocomputers/block/Blocks.kt index 416c86d..b13eeb1 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/block/Blocks.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/block/Blocks.kt @@ -31,6 +31,7 @@ object Blocks { val CAPACITOR_BLOCK3: RegistrySupplier = BaseBlock.register("capacitor3") { CapacitorBlock(3) } val SOLARGEN_BLOCK: RegistrySupplier = BaseBlock.register("solargen") { SolarGeneratorBlock() } val COMBUSTGEN_BLOCK: RegistrySupplier = BaseBlock.register("combustgen") { CombustionGeneratorBlock() } + val REDSTONEIO_BLOCK: RegistrySupplier = BaseBlock.register("redio") { RedstoneIOBlock() } fun registerBlockItems() { BLOCKS.forEach(Consumer { sup: RegistrySupplier -> diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/NodeBlock.kt b/src/main/kotlin/org/neoflock/neocomputers/block/NodeBlock.kt index 7d561af..2d40a3e 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/block/NodeBlock.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/block/NodeBlock.kt @@ -190,20 +190,22 @@ abstract class NodeBlock(properties: Properties = Properties.of()): BaseBlock(pr } } - override fun setPlacedBy( + override fun onPlace( + blockState: BlockState, level: Level, blockPos: BlockPos, - blockState: BlockState, - livingEntity: LivingEntity?, - itemStack: ItemStack + blockState2: BlockState, + bl: Boolean ) { + super.onPlace(blockState, level, blockPos, blockState2, bl) if(!level.isClientSide) { val ent = level.getBlockEntity(blockPos) if(ent is NodeBlockEntity) { ent.invalidateNodeState() + ent.computeEdges().forEach { it.invalidateNodeState() } } + level.updateNeighborsAt(blockPos, this) } - super.setPlacedBy(level, blockPos, blockState, livingEntity, itemStack) } override fun neighborChanged( @@ -214,6 +216,7 @@ abstract class NodeBlock(properties: Properties = Properties.of()): BaseBlock(pr blockPos2: BlockPos, bl: Boolean ) { + super.neighborChanged(blockState, level, blockPos, block, blockPos2, bl) if(!level.isClientSide) { val ent = level.getBlockEntity(blockPos) if(ent is NodeBlockEntity) { @@ -221,6 +224,5 @@ abstract class NodeBlock(properties: Properties = Properties.of()): BaseBlock(pr } } - super.neighborChanged(blockState, level, blockPos, block, blockPos2, bl) } } \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/RedstoneIO.kt b/src/main/kotlin/org/neoflock/neocomputers/block/RedstoneIO.kt new file mode 100644 index 0000000..bb820e9 --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/block/RedstoneIO.kt @@ -0,0 +1,138 @@ +package org.neoflock.neocomputers.block + +import net.minecraft.core.BlockPos +import net.minecraft.core.Direction +import net.minecraft.world.InteractionResult +import net.minecraft.world.entity.player.Player +import net.minecraft.world.level.BlockGetter +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.RedStoneWireBlock +import net.minecraft.world.level.block.RedstoneTorchBlock +import net.minecraft.world.level.block.entity.BlockEntity +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.phys.BlockHitResult +import org.neoflock.neocomputers.NeoComputers +import org.neoflock.neocomputers.entity.BlockEntities +import org.neoflock.neocomputers.network.Networking + +fun dirToIdx(direction: Direction) = Direction.entries.indexOf(direction) + +class RedstoneIOEntity(blockPos: BlockPos, blockState: BlockState): NodeBlockEntity(BlockEntities.REDSTONEIO_ENTITY.get(), blockPos, blockState) { + val redstoneIn = Array(Direction.entries.size) {0} + val redstoneOut = Array(Direction.entries.size) {0} + + // TODO: have redstone I/O node for component and shi + override val node = object : Networking.Node() { + + } + + fun refetch(dir: Direction) { + val src = blockPos.offset(dir.stepX, dir.stepY, dir.stepZ) + val cur = level?.getSignal(src, dir) ?: 0 + val idx = dirToIdx(dir) + if(redstoneIn[idx] != cur) { + onRedstoneSignalChanged(dir, redstoneIn[idx], cur) + } + redstoneIn[idx] = cur + } + + fun refetchAll() { + Direction.entries.forEach { refetch(it) } + } + + fun onRedstoneSignalChanged(dir: Direction, oldValue: Int, newValue: Int) { + Networking.emitMessage(node, Networking.ComputerUncheckedSignal(node, "redstone_changed", arrayOf(node.address.toString(), dirToIdx(dir), oldValue, newValue))) + NeoComputers.LOGGER.info("redstone in direction ${dir.name} changed from $oldValue to $newValue") + } +} + +class RedstoneIOBlock(): NodeBlock(Properties.of().isRedstoneConductor { state, getter, pos -> true }) { + override fun newBlockEntity(blockPos: BlockPos, blockState: BlockState): BlockEntity = RedstoneIOEntity(blockPos, blockState) + + fun getRedstoneIO(level: BlockGetter, blockPos: BlockPos): RedstoneIOEntity? { + val ent = level.getBlockEntity(blockPos) + if(ent is RedstoneIOEntity) return ent + return null + } + + override fun isSignalSource(blockState: BlockState): Boolean { + return true + } + + override fun getSignal( + blockState: BlockState, + blockGetter: BlockGetter, + blockPos: BlockPos, + direction: Direction + ): Int { + val redstoneIO = getRedstoneIO(blockGetter, blockPos) + if(redstoneIO != null) { + return redstoneIO.redstoneOut[dirToIdx(direction.opposite)] + } + return super.getSignal(blockState, blockGetter, blockPos, direction) + } + + override fun onPlace( + blockState: BlockState, + level: Level, + blockPos: BlockPos, + blockState2: BlockState, + bl: Boolean + ) { + if(!level.isClientSide) { + level.updateNeighborsAt(blockPos, this) + getRedstoneIO(level, blockPos)?.refetchAll() + } + super.onPlace(blockState, level, blockPos, blockState2, bl) + } + + override fun onRemove( + blockState: BlockState, + level: Level, + blockPos: BlockPos, + blockState2: BlockState, + bl: Boolean + ) { + if(!level.isClientSide) { + level.updateNeighborsAt(blockPos, this) + } + super.onRemove(blockState, level, blockPos, blockState2, bl) + } + + override fun neighborChanged( + blockState: BlockState, + level: Level, + blockPos: BlockPos, + block: Block, + blockPos2: BlockPos, + bl: Boolean + ) { + super.neighborChanged(blockState, level, blockPos, block, blockPos2, bl) + if(!level.isClientSide) { + val dir = Direction.getNearest(blockPos2.center.subtract(blockPos.center)) + getRedstoneIO(level, blockPos)?.refetch(dir) + } + } + + override fun useWithoutItem( + blockState: BlockState, + level: Level, + blockPos: BlockPos, + player: Player, + blockHitResult: BlockHitResult + ): InteractionResult? { + if(!level.isClientSide) { + val redio = getRedstoneIO(level, blockPos) + val dir = blockHitResult.direction + if (redio != null) { + val idx = dirToIdx(dir) + redio.redstoneOut[idx]++ + redio.redstoneOut[idx] %= 16 + NeoComputers.LOGGER.info("outputting redstone level ${redio.redstoneOut[idx]} on ${dir.name}") + } + level.updateNeighborsAt(blockPos, this) + } + return super.useWithoutItem(blockState, level, blockPos, player, blockHitResult) + } +} \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/entity/BlockEntities.kt b/src/main/kotlin/org/neoflock/neocomputers/entity/BlockEntities.kt index b7563dd..2ea740f 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/entity/BlockEntities.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/entity/BlockEntities.kt @@ -70,6 +70,11 @@ object BlockEntities { ::CombustionGeneratorBlockEntity, mutableSetOf(Blocks.COMBUSTGEN_BLOCK.get()), BullshitFix() ) } + val REDSTONEIO_ENTITY: RegistrySupplier> = BLOCKENTITIES.register("redio") { + BlockEntityType( + ::CombustionGeneratorBlockEntity, mutableSetOf(Blocks.REDSTONEIO_BLOCK.get()), BullshitFix() + ) + } fun registerPowerBlocks() { PowerManager.registerPowerBlockEntity(CAPACITOR_ENTITY.get()) diff --git a/src/main/resources/assets/neocomputers/blockstates/redio.json b/src/main/resources/assets/neocomputers/blockstates/redio.json new file mode 100644 index 0000000..7c89ae4 --- /dev/null +++ b/src/main/resources/assets/neocomputers/blockstates/redio.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "neocomputers:block/redio" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/neocomputers/lang/en_us.json b/src/main/resources/assets/neocomputers/lang/en_us.json index 4bc3f36..fb06b58 100644 --- a/src/main/resources/assets/neocomputers/lang/en_us.json +++ b/src/main/resources/assets/neocomputers/lang/en_us.json @@ -1,5 +1,6 @@ { "neocomputers.confirm": "Confirm", "neocomputers.cancel": "Cancel", - "block.neocomputers.combustgen": "Combustion Generator" + "block.neocomputers.combustgen": "Combustion Generator", + "block.neocomputers.redio": "Redstone I/O" } \ No newline at end of file diff --git a/src/main/resources/assets/neocomputers/models/block/redio.json b/src/main/resources/assets/neocomputers/models/block/redio.json new file mode 100644 index 0000000..f844535 --- /dev/null +++ b/src/main/resources/assets/neocomputers/models/block/redio.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "up": "neocomputers:block/redio_top", + "down": "neocomputers:block/redio_bottom", + "north": "neocomputers:block/redio_north", + "south": "neocomputers:block/redio_south", + "west": "neocomputers:block/redio_west", + "east": "neocomputers:block/redio_east", + "particle": "minecraft:block/redstone_block" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/neocomputers/models/item/redio.json b/src/main/resources/assets/neocomputers/models/item/redio.json new file mode 100644 index 0000000..b49ffd7 --- /dev/null +++ b/src/main/resources/assets/neocomputers/models/item/redio.json @@ -0,0 +1,3 @@ +{ + "parent": "neocomputers:block/redio" +} \ No newline at end of file diff --git a/src/main/resources/assets/neocomputers/textures/block/redio_bottom.png b/src/main/resources/assets/neocomputers/textures/block/redio_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..31b32ebada722df04c532e297c5b2bb7323307ab GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf#sHrXS1~a$adB}82?shvn1FT zOLDA`p@RH7DEx2gVQsmcZK)7Vm$i}b~ecf3Tlm!LWc|DdF@0!6okL`By#~fRSIq(L&6L*9tuiVnfwd?!2At*Q&A?Qp&&rU4Fxbs@cAUYM{z!3 zqUuIEt#qQ@mUlR7K;S{P18_H!QBZV)QhDQa?Sw67>O}r zW~^2#qM0Eg6*=dOs*-cY-7zyl2>-DG$T=e-1A`Id`ue)Q7(&3zD!@p8xm3ek+Os`M#QN+G2*FfcPxO2ilkBi(u1 zL^j#@xXB!fFn<{)F9!gn zWMDAU1aAAx=K^mI0bfp0;XW+SIu4OG=32O&n>jPvtzF6MIt!SOn(A<_a4 zzU^uX%?xSV){l>mYmv;17$c<=R25Z4MCzq6-Xg+!y&f2hKkvpuN~r>-ln5HoFzoO5 q0vH(VM|n)fxl!OSS75D~aLDW(6|0F+XY)ELYlXJ==WU>X0vHJ1Ae>nr^5GuML5^%isxW| zON@7SU8cKZvmSRRBKWnHFcViE><9#yL3Zbd8JlUM*2*+ZNW$EmX__AFi$DSEfGZCI z*j*$(Zf8DJXT4qnFpeVtW@Z3P_sH)jN5FF1cqx$t*)kW=z?#&lyJ7&fK1guE#isD} zwjjZ4i2&Xuac#ypj+9cVwYE=e5=uwBkpLLfiUN2Qm0joz=4L>1p_J0S-ihGTvn{TG z7ar`;9{xB=w>>-jcYyylf2S$M?2$TW5EYB`me`$8!NR29KjWC-d=W&%pC+%+m_+ Y5B$+;)chReWdHyG07*qoM6N<$g3)^V*8l(j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/block/redio_south.png b/src/main/resources/assets/neocomputers/textures/block/redio_south.png new file mode 100644 index 0000000000000000000000000000000000000000..d867c631124ec6df2104421230f709b8ac1a7f5a GIT binary patch literal 539 zcmV+$0_6RPP)_Id!0m9pTGuFMh2yn=Jj?2 zAD(Y;4ZQGRoAKd~Wb75E4CSGLW@8Rg&V)NhM@O6-93Vsx&8jidf`C}|Ersrmx~_}e z-Q6}w?oQ5`S}SITnIWkaP4Sk*VzC$*Opn*LG+QTkk|ivS=a1(C7#Tc{@|4WSqdfsn dvoTF8z&|WLXv!! zw6wG;L6%k_)^;J*PGQ!`;_NeL&YUH|zF3lDg(SyHDUMZA9IK@`*2!?Jm*Utc$FoU} z=b#+dAt{bSKvJITFc2wlACciaqQHGrn&YT6=P@8sQoGiR>Ka9)!I zBChMQoY&>J9!hgOl;L(8$OX)8W|)b3o7ae(#8m8YRoLQMpjZbb=YSy=@YWbX`3WSD;WBFlq@)=t3_%naGV WJTICmYIuPzVDNPHb6Mw<&;$VI6KYWa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/block/redio_west.png b/src/main/resources/assets/neocomputers/textures/block/redio_west.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0883634172cbd308dafd5f6164d7b914a6ae57 GIT binary patch literal 546 zcmV+-0^R+IP)b*W5QM)O$=;%TKtQsXtHKcAA|SlT<+tzy@)`tW_Xc-dKxDw>!~szL+gnL91iF=t z6>UkYo^Exw^nLF<>s7QQT{~X%~-fq<-m;dpd1zB+sO&5)v67R0PfB>j#a0_@-Fcg=(|AY#`U&f z(K*@^hWq;_)6CFGkD1}_{Mrks!f$tG0s^Q)G~0O$qY2El<>Zp?Nm9mlZ^1F8!- z=jQdyolnp9xB{M=Gs8LT0zZRtkd2)3!vm_;9E2EgGfq!W`FwngAUNKvs*x6O@a@o2 zXl6*?_dcJ`TanC+7$c<=R25Z4MB1e(-Xg-~t<807*qoM6N<$f>K-hr~m)} literal 0 HcmV?d00001