diff --git a/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt b/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt index 16fda43..ed77ec1 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt @@ -72,6 +72,15 @@ object NeoComputers { player -> NodeSynchronizer.playerScreenClosed(player) } + + NetworkManager.registerReceiver(NetworkManager.c2s(),NodeSynchronizer.ScreenDataPayload.TYPE, NodeSynchronizer.ScreenDataPayload.CODEC, { + packet, ctx -> + val player = ctx.player + if(player is ServerPlayer) { + NodeSynchronizer.screenMap[player]?.processScreenInteraction(player, packet.buffer) + } + }) + // we have to do this because the datagen task runs in the physical server EnvExecutor.runInEnv(Env.CLIENT) {{ NetworkManager.registerReceiver(NetworkManager.s2c(),NodeSynchronizer.StatePayload.TYPE, NodeSynchronizer.StatePayload.CODEC, { @@ -94,14 +103,7 @@ object NeoComputers { EnvExecutor.runInEnv(Env.SERVER) {{ // https://github.com/architectury/architectury-api/issues/518 NetworkManager.registerS2CPayloadType(NodeSynchronizer.StatePayload.TYPE, NodeSynchronizer.StatePayload.CODEC) - - NetworkManager.registerReceiver(NetworkManager.c2s(),NodeSynchronizer.ScreenPayload.TYPE, NodeSynchronizer.ScreenPayload.CODEC, { - packet, ctx -> - val player = ctx.player - if(player is ServerPlayer) { - NodeSynchronizer.screenMap[player]?.processScreenInteraction(player, packet.buffer) - } - }) + NetworkManager.registerS2CPayloadType(NodeSynchronizer.ScreenPayload.TYPE, NodeSynchronizer.ScreenPayload.CODEC) }} LOGGER.info("Registered!") diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/NodeBlock.kt b/src/main/kotlin/org/neoflock/neocomputers/block/NodeBlock.kt index fea5ac0..5309df1 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/block/NodeBlock.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/block/NodeBlock.kt @@ -68,6 +68,27 @@ object NodeSynchronizer { override fun type() = TYPE } + class ScreenDataPayload(var entityTypeWireID: String, var buffer: FriendlyByteBuf): CustomPacketPayload { + companion object { + val SCREEN_SYNC_ID = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "screen_data") + val TYPE = CustomPacketPayload.Type(SCREEN_SYNC_ID) + val CODEC = object : StreamCodec { + override fun decode(buf: RegistryFriendlyByteBuf): ScreenDataPayload { + val id = buf.readByteArray().decodeToString() + val buffer = FriendlyByteBuf(buf.copy(buf.readerIndex(), buf.readableBytes())) + return ScreenDataPayload(id, buffer) + } + + override fun encode(buf: RegistryFriendlyByteBuf, payload: ScreenDataPayload) { + buf.writeByteArray(payload.entityTypeWireID.encodeToByteArray()) + buf.writeBytes(payload.buffer) + } + } + } + + override fun type() = TYPE + } + val screenMap = mutableMapOf() fun playerScreenClosed(player: ServerPlayer) { @@ -89,7 +110,7 @@ object NodeSynchronizer { } fun sendScreenInteraction(friendlyByteBuf: FriendlyByteBuf) { - NetworkManager.sendToServer(ScreenPayload("", friendlyByteBuf)) + NetworkManager.sendToServer(ScreenDataPayload("", friendlyByteBuf)) } } diff --git a/src/main/kotlin/org/neoflock/neocomputers/entity/CaseBlockEntity.kt b/src/main/kotlin/org/neoflock/neocomputers/entity/CaseBlockEntity.kt index 6da9eed..08d423d 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/entity/CaseBlockEntity.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/entity/CaseBlockEntity.kt @@ -20,6 +20,7 @@ import net.minecraft.world.MenuProvider import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level import net.minecraft.world.level.block.state.BlockState import org.neoflock.neocomputers.NeoComputers import org.neoflock.neocomputers.block.CaseBlock @@ -67,13 +68,8 @@ class CaseBlockEntity(blockPos: BlockPos, blockState: BlockState): NodeBlockEnti } override fun encodeScreenData(player: ServerPlayer, packet: FriendlyByteBuf) { + super.encodeScreenData(player, packet) packet.writeBoolean(isOn) - packet.writeLong(node.energy) - packet.writeLong(node.energyCapacity) - packet.writeLong(getMachineMemoryUsed()) - packet.writeLong(getMachineMemoryTotal()) - packet.writeLong(getMachineComponentsUsed()) - packet.writeLong(getMachineMemoryTotal()) } val redstoneIn = Array(Direction.entries.size) {0} @@ -110,14 +106,11 @@ class CaseBlockEntity(blockPos: BlockPos, blockState: BlockState): NodeBlockEnti // Rising edge start() } - if(newValue == 0) { - // Not accurate but whatevs - stop() - } setChanged() } - override fun getBlockPosition(): BlockPos = blockPos + override fun getMachineBlockPosition(): BlockPos = blockPos + override fun getMachineLevel(): Level = level!! override fun isRunning(): Boolean = isOn diff --git a/src/main/kotlin/org/neoflock/neocomputers/entity/MachineEntity.kt b/src/main/kotlin/org/neoflock/neocomputers/entity/MachineEntity.kt index 740b403..3d2b1be 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/entity/MachineEntity.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/entity/MachineEntity.kt @@ -2,6 +2,7 @@ package org.neoflock.neocomputers.entity import net.minecraft.core.BlockPos import net.minecraft.core.Direction +import net.minecraft.world.level.Level import org.neoflock.neocomputers.item.ComponentItem import org.neoflock.neocomputers.network.Networking import java.time.Duration @@ -15,7 +16,8 @@ data class MachinePowerEvent(override val machine: MachineEntity, val nowRunning interface MachineEntity { // Block position of machine, for wireless tech - fun getBlockPosition(): BlockPos + fun getMachineBlockPosition(): BlockPos + fun getMachineLevel(): Level fun beepAsync(frequency: Int, duration: Duration, volume: Double): Boolean diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt index e4bb314..22037cd 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt @@ -4,40 +4,74 @@ import com.mojang.blaze3d.vertex.BufferBuilder import com.mojang.blaze3d.vertex.DefaultVertexFormat import com.mojang.blaze3d.vertex.Tesselator import com.mojang.blaze3d.vertex.VertexFormat +import io.netty.buffer.Unpooled +import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiGraphics +import net.minecraft.client.gui.components.Button import net.minecraft.client.gui.components.ImageButton +import net.minecraft.client.gui.components.WidgetSprites import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen +import net.minecraft.network.FriendlyByteBuf import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.player.Inventory import org.neoflock.neocomputers.NeoComputers +import org.neoflock.neocomputers.block.NodeSynchronizer import org.neoflock.neocomputers.gui.menu.CaseMenu -import org.neoflock.neocomputers.gui.widget.DynamicSlot -import org.neoflock.neocomputers.gui.widget.ProgressBar +import org.neoflock.neocomputers.gui.widget.ButtonSprites +import org.neoflock.neocomputers.gui.widget.ImagerButton import org.neoflock.neocomputers.utils.GenericContainerScreen class CaseScreen : GenericContainerScreen { private val PCB: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/computer.png") + private val BTN: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/button_power.png") +// private val BTN_ENABLED: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/button/power/enabled.png") // gonna do this later +// private val BTN_DISABLED: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/button/power/disabled.png") +// private val BTN_ENABLED_HOVER: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/button/power/enabled_hover.png") +// private val BTN_DISABLED_HOVER: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/power/disabled_hover.png") + private var btn: ImagerButton? = null override fun shouldCenterTitle(): Boolean = false - - constructor(abstractContainerMenu: CaseMenu, inventory: Inventory, component: Component) : super(abstractContainerMenu, inventory, component) + + var isOn = false + + override fun processScreenStatePacket(buf: FriendlyByteBuf) { + super.processScreenStatePacket(buf) + isOn = buf.readBoolean() + btn?.pressed = isOn + } + + constructor(abstractContainerMenu: CaseMenu, inventory: Inventory, component: Component) : super(abstractContainerMenu, inventory, component) { + btn = ImagerButton( + 15, 15, + 18, 18, + ButtonSprites(BTN, 18, 18, 36, 36) + ) { + val buf = FriendlyByteBuf(Unpooled.buffer()) + buf.writeByte(if(isOn) 0x02 else 0x01) + NodeSynchronizer.sendScreenInteraction(buf) + } +// addRenderableWidget(btn!!) + } override fun renderBg(guiGraphics: GuiGraphics, f: Float, i: Int, j: Int) { super.renderBg(guiGraphics, f, i ,j) val relX = (this.width - this.imageWidth) / 2 val relY = (this.height - this.imageHeight) / 2 - - guiGraphics.blit(PCB, relX, relY, 0, 0, this.imageWidth, this.imageHeight) - // this.renderSlots(relX, relY) - + btn!!.x = relX+70 + btn!!.y = relY+33 + btn!!.render(guiGraphics, i, j, f) // minecraft SUCKSSS + guiGraphics.blit(PCB, relX, relY, 0, 0, this.imageWidth, this.imageHeight) + } + + override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean { // todo: make a better widget system than mojang, practically not even using the fact it's a widget atp + NeoComputers.LOGGER.info(String.format("btn: %d %d %d %d, mouse %s %s", btn!!.x, btn!!.y, btn!!.x+btn!!.width, btn!!.y+btn!!.height, mouseX.toString(), mouseY.toString())) + if (button != 0) return false + if (btn!!.x < mouseX.toInt() && mouseX.toInt() < btn!!.x+btn!!.width && btn!!.y < mouseY.toInt() && mouseY.toInt() < btn!!.y+btn!!.height) { + btn!!.playDownSound(Minecraft.getInstance().soundManager) + btn!!.onClick(mouseX, mouseY) + return true + } else return false } - // private fun renderSlots(relX: Int, relY: Int) { // TODO: put this in some generic screen class - // for (slot in menu.slots) { - // if (slot is DynamicSlot) { - // slot.draw(relX, relY) - // } - // } - // } } \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/sounds/LoopingSoundInstance.kt b/src/main/kotlin/org/neoflock/neocomputers/sounds/LoopingSoundInstance.kt index 77d6fb1..0cc7180 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/sounds/LoopingSoundInstance.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/sounds/LoopingSoundInstance.kt @@ -1,6 +1,8 @@ package org.neoflock.neocomputers.sounds import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance +import net.minecraft.client.resources.sounds.EntityBoundSoundInstance +import net.minecraft.client.resources.sounds.MinecartSoundInstance import net.minecraft.client.resources.sounds.SoundInstance import net.minecraft.sounds.SoundEvent import net.minecraft.sounds.SoundSource @@ -10,7 +12,7 @@ class ComputerRunningSoundInstance: AbstractTickableSoundInstance { val machine: MachineEntity fun updatePosition() { - val pos = machine.getBlockPosition() + val pos = machine.getMachineBlockPosition() this.x = pos.x.toDouble() + 0.5 this.y = pos.y.toDouble() + 0.5 this.z = pos.z.toDouble() + 0.5 @@ -21,7 +23,7 @@ class ComputerRunningSoundInstance: AbstractTickableSoundInstance { this.looping = true this.delay = 0 this.volume = 1.0F - this.relative = true + this.pitch = 1.0F updatePosition() } diff --git a/src/main/resources/assets/neocomputers/lang/en_us.json b/src/main/resources/assets/neocomputers/lang/en_us.json index 1c17040..10246cb 100644 --- a/src/main/resources/assets/neocomputers/lang/en_us.json +++ b/src/main/resources/assets/neocomputers/lang/en_us.json @@ -46,5 +46,6 @@ "neocomputers.noaddr": "No address assigned", "neocomputers.memory.capacity": "Capacity: %1$s", "neocomputers.eeprom.codeused": "Code Storage: %1$s / %2$s", - "neocomputers.eeprom.dataused": "Data Storage: %1$s / %2$s" + "neocomputers.eeprom.dataused": "Data Storage: %1$s / %2$s", + "sounds.neocomputers.computer_running": "Computer Fans" } \ No newline at end of file