From 5c44ee6c8669a2a53a27ebcfbb0ed92136266a2e Mon Sep 17 00:00:00 2001 From: IonutParau Date: Sun, 19 Apr 2026 15:13:27 +0200 Subject: [PATCH] EEPROMs --- .../org/neoflock/neocomputers/NeoComputers.kt | 8 --- .../neocomputers/item/DataComponents.kt | 19 +++++ .../neoflock/neocomputers/item/EEPROMItem.kt | 65 ++++++++++++++++++ .../org/neoflock/neocomputers/item/Items.kt | 28 ++++++-- .../org/neoflock/neocomputers/item/Tabs.kt | 31 ++++++--- .../assets/neocomputers/lang/en_us.json | 6 +- .../neocomputers/textures/item/eeprom0.png | Bin 0 -> 393 bytes 7 files changed, 132 insertions(+), 25 deletions(-) create mode 100644 src/main/kotlin/org/neoflock/neocomputers/item/DataComponents.kt create mode 100644 src/main/kotlin/org/neoflock/neocomputers/item/EEPROMItem.kt create mode 100644 src/main/resources/assets/neocomputers/textures/item/eeprom0.png diff --git a/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt b/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt index f321c0e..b04a65b 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt @@ -3,22 +3,15 @@ package org.neoflock.neocomputers import dev.architectury.event.events.client.ClientLifecycleEvent import dev.architectury.event.events.common.PlayerEvent import dev.architectury.event.events.common.TickEvent -import dev.architectury.impl.NetworkAggregator import dev.architectury.networking.NetworkManager import net.minecraft.resources.ResourceLocation import org.neoflock.neocomputers.block.Blocks import org.neoflock.neocomputers.entity.BlockEntities -import org.neoflock.neocomputers.gui.buffer.BufferRenderer import org.neoflock.neocomputers.gui.menu.Menus -import org.neoflock.neocomputers.gui.screen.ScreenScreen -import dev.architectury.registry.menu.MenuRegistry import dev.architectury.utils.Env import dev.architectury.utils.EnvExecutor import net.minecraft.client.Minecraft -import net.minecraft.client.player.LocalPlayer -import net.minecraft.network.protocol.common.custom.CustomPacketPayload import net.minecraft.server.level.ServerPlayer -import org.neoflock.neocomputers.block.NodeBlock import org.neoflock.neocomputers.block.NodeBlockEntity import org.neoflock.neocomputers.block.NodeSynchronizer import org.neoflock.neocomputers.gui.render.ScreenRenderer @@ -103,7 +96,6 @@ object NeoComputers { }} - LOGGER.info("Registered!") //LOGGER.info("Started mod in %s loader".formatted(NeoComputersInit.PLATFORM.getModloader())) //LOGGER.info("Kotlin: %s".formatted(NeoComputers.hello())) diff --git a/src/main/kotlin/org/neoflock/neocomputers/item/DataComponents.kt b/src/main/kotlin/org/neoflock/neocomputers/item/DataComponents.kt new file mode 100644 index 0000000..824f865 --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/item/DataComponents.kt @@ -0,0 +1,19 @@ +package org.neoflock.neocomputers.item + +import com.mojang.serialization.Codec +import net.minecraft.core.Registry +import net.minecraft.core.component.DataComponentType +import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.resources.ResourceLocation +import org.neoflock.neocomputers.NeoComputers + +object DataComponents { + val ADDRESS = Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "address"), + DataComponentType.builder().persistent(Codec.STRING).build()) + val LABEL = Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "label"), + DataComponentType.builder().persistent(Codec.STRING).build()) + val EEPROM_CODE = Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "eeprom_code"), + DataComponentType.builder().persistent(Codec.STRING).build()) + val EEPROM_DATA = Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "eeprom_data"), + DataComponentType.builder().persistent(Codec.STRING).build()) +} \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/item/EEPROMItem.kt b/src/main/kotlin/org/neoflock/neocomputers/item/EEPROMItem.kt new file mode 100644 index 0000000..459d4f2 --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/item/EEPROMItem.kt @@ -0,0 +1,65 @@ +package org.neoflock.neocomputers.item + +import net.minecraft.network.chat.Component +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.TooltipFlag +import org.neoflock.neocomputers.gui.widget.ComponentRoles +import org.neoflock.neocomputers.network.Networking +import org.neoflock.neocomputers.utils.Formatting +import java.util.UUID + +fun getEEPROMProperties(): Item.Properties = Item.Properties().component( + DataComponents.EEPROM_CODE, "").component(DataComponents.EEPROM_DATA, "").component(DataComponents.LABEL, "") + +open class EEPROMItem(val tier: Int, val codeCapacity: Int, val dataCapacity: Int): Item(getEEPROMProperties()), ComponentItem { + override fun getComponentRoles(itemStack: ItemStack): Set = setOf(ComponentRoles.FIRMWARE) + + override fun getComponentTier(itemStack: ItemStack): Int = tier + + override fun getMemoryCapacity(itemStack: ItemStack): Int = 0 + + override fun getComponentCapacity(itemStack: ItemStack): Int = 0 + + override fun whenComponentPlaced(itemStack: ItemStack, newRole: String) { + if(!itemStack.has(DataComponents.ADDRESS)) { + itemStack.set(DataComponents.ADDRESS, UUID.randomUUID().toString()) + } + } + + override fun whenComponentTaken(itemStack: ItemStack, previousRole: String) {} + + override fun toComponentNode(itemStack: ItemStack): Networking.Node? = null + + override fun appendHoverText( + itemStack: ItemStack, + tooltipContext: TooltipContext, + list: MutableList, + tooltipFlag: TooltipFlag + ) { + if(tooltipFlag.isAdvanced) { + val code = itemStack.get(DataComponents.EEPROM_CODE) ?: "" + val data = itemStack.get(DataComponents.EEPROM_DATA) ?: "" + val addr = itemStack.get(DataComponents.ADDRESS) + val codeSize = code.encodeToByteArray().size + val dataSize = data.encodeToByteArray().size + val addrComp = if(addr == null) Component.translatable("neocomputers.noaddr") else Component.literal(addr) + list.addLast(addrComp) + list.addLast(Component.translatable("neocomputers.eeprom.codeused", Formatting.formatMemory(codeSize.toLong()), + Formatting.formatMemory(codeCapacity.toLong()))) + list.addLast(Component.translatable("neocomputers.eeprom.dataused", Formatting.formatMemory(dataSize.toLong()), + Formatting.formatMemory(dataCapacity.toLong()))) + } + super.appendHoverText(itemStack, tooltipContext, list, tooltipFlag) + } + + override fun getName(itemStack: ItemStack): Component? { + if(itemStack.has(DataComponents.LABEL)) { + val label = itemStack.get(DataComponents.LABEL) ?: "" + if(label.isNotEmpty()) return Component.literal(label) + } + return super.getName(itemStack) + } +} + +class EEPROM0: EEPROMItem(1, 4096, 256) \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/item/Items.kt b/src/main/kotlin/org/neoflock/neocomputers/item/Items.kt index d453889..964720a 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/item/Items.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/item/Items.kt @@ -1,17 +1,31 @@ -package org.neoflock.neocomputers.item; +package org.neoflock.neocomputers.item import dev.architectury.registry.registries.DeferredRegister +import net.minecraft.core.Registry +import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.Registries +import net.minecraft.resources.ResourceKey +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.Item import org.neoflock.neocomputers.NeoComputers +import java.util.function.Supplier object Items { val ITEMS: DeferredRegister = DeferredRegister.create(NeoComputers.MODID, Registries.ITEM) - val MEM0 = ITEMS.register("memory0") { MemoryTier1() } - val MEM1 = ITEMS.register("memory1") { MemoryTier1_5() } - val MEM2 = ITEMS.register("memory2") { MemoryTier2() } - val MEM3 = ITEMS.register("memory3") { MemoryTier2_5() } - val MEM4 = ITEMS.register("memory4") { MemoryTier3() } - val MEM5 = ITEMS.register("memory5") { MemoryTier3_5() } + val MEM0 = register("memory0") { MemoryTier1() } + val MEM1 = register("memory1") { MemoryTier1_5() } + val MEM2 = register("memory2") { MemoryTier2() } + val MEM3 = register("memory3") { MemoryTier2_5() } + val MEM4 = register("memory4") { MemoryTier3() } + val MEM5 = register("memory5") { MemoryTier3_5() } + + val EE0 = register("eeprom0") { EEPROM0() } + + fun register(name: String, itemFac: Supplier): T { + val key = ResourceKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, name)) + val item = itemFac.get() + Registry.register(BuiltInRegistries.ITEM, key, item) + return item + } } \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/item/Tabs.kt b/src/main/kotlin/org/neoflock/neocomputers/item/Tabs.kt index 071758f..35ccb71 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/item/Tabs.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/item/Tabs.kt @@ -1,22 +1,35 @@ -package org.neoflock.neocomputers.item; +package org.neoflock.neocomputers.item import dev.architectury.registry.CreativeTabRegistry import dev.architectury.registry.registries.DeferredRegister -import dev.architectury.registry.registries.RegistrySupplier +import net.minecraft.core.Registry +import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.Registries import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.CreativeModeTab import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Items import org.neoflock.neocomputers.NeoComputers -import java.util.function.Supplier - object Tabs { val TABS: DeferredRegister = DeferredRegister.create(NeoComputers.MODID, Registries.CREATIVE_MODE_TAB) - val TAB: RegistrySupplier = TABS.register("neocomputers_tab", Supplier {CreativeTabRegistry.create( - Component.literal("NeoComputers"), - Supplier { ItemStack(Items.ACACIA_BOAT) } - )}) + val TAB: CreativeModeTab = Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, + ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "neocomputers_tab"), CreativeTabRegistry.create { + builder -> + builder.title(Component.literal("NeoComputers")) + builder.icon { + ItemStack(Items.MEM0) + } + builder.displayItems { + parameters, output -> + output.accept(ItemStack(Items.EE0)) + + val luaBios = ItemStack(Items.EE0) + luaBios.set(DataComponents.LABEL, "Lua BIOS") + luaBios.set(DataComponents.EEPROM_CODE, "error('hi')") + luaBios.set(DataComponents.EEPROM_DATA, "random garbage") + output.accept(luaBios) + } + }) } \ 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 67836e5..1009565 100644 --- a/src/main/resources/assets/neocomputers/lang/en_us.json +++ b/src/main/resources/assets/neocomputers/lang/en_us.json @@ -3,5 +3,9 @@ "neocomputers.cancel": "Cancel", "block.neocomputers.combustgen": "Combustion Generator", "block.neocomputers.redio": "Redstone I/O", - "neocomputers.memory.capacity": "Capacity: %1$s" + "item.neocomputers.eeprom0": "EEPROM (Tier 1)", + "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" } \ No newline at end of file diff --git a/src/main/resources/assets/neocomputers/textures/item/eeprom0.png b/src/main/resources/assets/neocomputers/textures/item/eeprom0.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbd8218588629037dae6706db4831ea6f75b9c4 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8(g2?jS0OoZ$D(kL`a}f_9m7y3yWC*Uh9sNJK>LDFizIK~ zjx6hpfXF$OYEC90lZ$rj*r9B#U%qL|!Gi}i+|0IY*>e7Tjek$h|NsBjty^al;d155 zm3#Ll=>^y=UcC7H`ST}EobYN+d-m+v&6`bEulBBAzkc)P0-$2|*@r`c4p1)%@(TuX zi2w}EVbgB{wUm3hIEGZ*Dmi~#sM&zWHIVc4p&b{TJk?o${P$Psj!2wQFg^Wan%tS$ z5A2`3R9EVnApO4fy6P+Ll^f6K=diBWB%W6&6mV?cOhMre>4vD+I>HK@Te)U0Ti4I@ zs`2~2`g#6L=kB&GlHeCS5bMm5`ja{H|D9E?4U7!kZzO~JDu3kzoxtGf>gTe~DWM4f D=7zXJ literal 0 HcmV?d00001