From 15b6b2c5ad7048320902bf32da92a935cf75e492 Mon Sep 17 00:00:00 2001 From: mewhenthe Date: Sat, 18 Apr 2026 19:48:40 +0200 Subject: [PATCH] Dynamic slot --- .../org/neoflock/neocomputers/block/Blocks.kt | 1 + .../neoflock/neocomputers/block/CaseBlock.kt | 44 +++++++++++++++++ .../neocomputers/gui/menu/CaseMenu.kt | 36 ++++++++++++++ .../gui/menu/CombustionGeneratorMenu.kt | 3 +- .../neoflock/neocomputers/gui/menu/Menus.kt | 5 +- .../neocomputers/gui/menu/ScreenMenu.kt | 3 +- .../neocomputers/gui/render/BufferRenderer.kt | 2 +- .../neocomputers/gui/screen/CaseScreen.kt | 39 +++++++++++++++ .../gui/screen/CombustionGeneratorScreen.kt | 2 +- .../neocomputers/gui/screen/ScreenScreen.kt | 2 +- .../neocomputers/gui/widget/DynamicSlot.kt | 45 ++++++++++++++++++ .../neocomputers/utils/GenericContainer.kt | 18 +++++-- .../neocomputers/textures/gui/background.png | Bin 0 -> 542 bytes .../textures/gui/button_power.png | Bin 0 -> 342 bytes .../neocomputers/textures/gui/computer.png | Bin 0 -> 1642 bytes .../neocomputers/textures/gui/slots/card.png | Bin 0 -> 352 bytes .../neocomputers/textures/gui/slots/cpu.png | Bin 0 -> 384 bytes .../textures/gui/slots/eeprom.png | Bin 0 -> 391 bytes .../neocomputers/textures/gui/slots/hdd.png | Bin 0 -> 338 bytes .../textures/gui/slots/memory.png | Bin 0 -> 418 bytes .../neocomputers/textures/gui/slots/na.png | Bin 0 -> 179 bytes .../neocomputers/textures/gui/slots/slot.png | Bin 0 -> 143 bytes .../neocomputers/textures/gui/slots/tier0.png | Bin 0 -> 157 bytes .../neocomputers/textures/gui/slots/tier1.png | Bin 0 -> 156 bytes .../neocomputers/textures/gui/slots/tier2.png | Bin 0 -> 157 bytes 25 files changed, 188 insertions(+), 12 deletions(-) create mode 100644 src/main/kotlin/org/neoflock/neocomputers/block/CaseBlock.kt create mode 100644 src/main/kotlin/org/neoflock/neocomputers/gui/menu/CaseMenu.kt create mode 100644 src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt create mode 100644 src/main/kotlin/org/neoflock/neocomputers/gui/widget/DynamicSlot.kt create mode 100644 src/main/resources/assets/neocomputers/textures/gui/background.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/button_power.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/computer.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/card.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/cpu.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/eeprom.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/hdd.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/memory.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/na.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/slot.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/tier0.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/tier1.png create mode 100644 src/main/resources/assets/neocomputers/textures/gui/slots/tier2.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..54c2f9c 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 CASE_BLOCK: RegistrySupplier = BaseBlock.register("case") { CaseBlock() } fun registerBlockItems() { BLOCKS.forEach(Consumer { sup: RegistrySupplier -> diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/CaseBlock.kt b/src/main/kotlin/org/neoflock/neocomputers/block/CaseBlock.kt new file mode 100644 index 0000000..8d9e811 --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/block/CaseBlock.kt @@ -0,0 +1,44 @@ +package org.neoflock.neocomputers.block; + +import dev.architectury.registry.menu.MenuRegistry +import net.minecraft.core.BlockPos +import net.minecraft.network.chat.Component +import net.minecraft.server.level.ServerPlayer +import net.minecraft.world.InteractionHand +import net.minecraft.world.InteractionResult +import net.minecraft.world.MenuProvider +import net.minecraft.world.entity.player.Inventory +import net.minecraft.world.entity.player.Player +import net.minecraft.world.inventory.AbstractContainerMenu +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.EntityBlock +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.entity.ScreenEntity +import org.neoflock.neocomputers.gui.menu.Menus +import org.neoflock.neocomputers.gui.menu.ScreenMenu +import org.neoflock.neocomputers.network.Networking + +class CaseBlock() : BaseBlock() { // placeholder stuff + override fun useWithoutItem( + blockState: BlockState, + level: Level, + blockPos: BlockPos, + player: Player, + blockHitResult: BlockHitResult + ): InteractionResult { + if(!level.isClientSide) { + MenuRegistry.openMenu(player as ServerPlayer, object : MenuProvider { + override fun getDisplayName(): Component = Component.literal("Computer") + override fun createMenu(i: Int, inventory: Inventory, player: Player): AbstractContainerMenu { + return Menus.CASE_MENU.get().create(i, inventory); + } + }) + } + return InteractionResult.SUCCESS + } +} \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/menu/CaseMenu.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/CaseMenu.kt new file mode 100644 index 0000000..068a2ed --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/CaseMenu.kt @@ -0,0 +1,36 @@ +package org.neoflock.neocomputers.gui.menu; + +import net.minecraft.world.SimpleContainer +import net.minecraft.world.entity.player.Inventory +import org.neoflock.neocomputers.gui.menu.Menus; +import net.minecraft.world.entity.player.Player +import net.minecraft.world.inventory.AbstractContainerMenu +import net.minecraft.world.inventory.MenuType +import net.minecraft.world.item.ItemStack +import org.neoflock.neocomputers.gui.widget.DynamicSlot +import org.neoflock.neocomputers.utils.GenericContainerMenu + +class CaseMenu : GenericContainerMenu { + + constructor(i: Int, inv: Inventory) : super(Menus.CASE_MENU.get(), i, SimpleContainer(10)) { + this.addInventorySlots(inv, 8, 84) + + for (col in 0..2) { + for (row in 0..2) { + var i = col*3+row + this.addSlot(DynamicSlot(this.container!!, i, 98+(col*22), 18*(row+1)-2)) + } + } + // for (int col=1; col<4; col++) { + // for (int row=1; row<4; row++) { + // int i = (row-1)*3+(col-1); + // if(slotmap[tier][i] != null) { + // this.addSlot(new ComponentSlot(entity.getContainer(), ((col-1)*3)+row, 98+((col-1)*22), 18*row-2, slotmap[tier][i], tiermap[tier][i])); + // } + // } + // } + } + + override fun stillValid(player: Player) = true // TODO: implement this properly + override fun quickMoveStack(player: Player, i: Int): ItemStack = ItemStack.EMPTY // there's no container here anyways +} \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/menu/CombustionGeneratorMenu.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/CombustionGeneratorMenu.kt index 31d9318..9e8fc38 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/gui/menu/CombustionGeneratorMenu.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/CombustionGeneratorMenu.kt @@ -7,10 +7,11 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.inventory.Slot import net.minecraft.world.item.ItemStack +import org.neoflock.neocomputers.gui.widget.DynamicSlot import org.neoflock.neocomputers.utils.ContainerUtils import org.neoflock.neocomputers.utils.GenericContainerMenu -class CombustionFuelSlot(container: Container, slot: Int, x: Int, y: Int): Slot(container, slot, x, y) { +class CombustionFuelSlot(container: Container, slot: Int, x: Int, y: Int): DynamicSlot(container, slot, x, y) { override fun mayPlace(itemStack: ItemStack): Boolean { return ContainerUtils.isBurningFuel(itemStack) } diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/menu/Menus.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/Menus.kt index d4bc758..cd2cff9 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/gui/menu/Menus.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/Menus.kt @@ -10,6 +10,7 @@ import net.minecraft.world.flag.FeatureFlags import net.minecraft.world.inventory.MenuType import org.neoflock.neocomputers.NeoComputers import org.neoflock.neocomputers.gui.menu.ScreenMenu +import org.neoflock.neocomputers.gui.screen.CaseScreen import org.neoflock.neocomputers.gui.screen.CombustionGeneratorScreen import org.neoflock.neocomputers.gui.screen.ScreenScreen @@ -18,9 +19,11 @@ object Menus { val SCREEN_MENU: RegistrySupplier> = MENUS.register("screen_menu") { MenuType(::ScreenMenu, FeatureFlagSet.of()) } val COMBUSTGEN_MENU: RegistrySupplier> = MENUS.register("combustgen_menu") { MenuType(::CombustionGeneratorMenu, FeatureFlagSet.of() ) } + val CASE_MENU: RegistrySupplier> = MENUS.register("case_menu") { MenuType(::CaseMenu, FeatureFlagSet.of() )} fun registerScreens() { - MenuScreens.register(Menus.COMBUSTGEN_MENU.get(), {m: CombustionGeneratorMenu, u, comp -> CombustionGeneratorScreen(m, u, comp)}) + MenuScreens.register(Menus.COMBUSTGEN_MENU.get()) { m: CombustionGeneratorMenu, u, comp ->CombustionGeneratorScreen(m,u,comp)} MenuScreens.register(Menus.SCREEN_MENU.get(), ::ScreenScreen) + MenuScreens.register(Menus.CASE_MENU.get(), ::CaseScreen) } } \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/menu/ScreenMenu.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/ScreenMenu.kt index 5eeb5fb..c90bb1a 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/gui/menu/ScreenMenu.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/ScreenMenu.kt @@ -6,9 +6,8 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.inventory.MenuType import net.minecraft.world.item.ItemStack -import org.neoflock.neocomputers.utils.GenericContainerMenu -class ScreenMenu(i: Int, inv: Inventory) : GenericContainerMenu(Menus.SCREEN_MENU.get(), i, null) { +class ScreenMenu(i: Int, inv: Inventory) : AbstractContainerMenu(Menus.SCREEN_MENU.get(), i) { override fun stillValid(player: Player) = true // TODO: implement this properly override fun quickMoveStack(player: Player, i: Int): ItemStack = ItemStack.EMPTY // there's no container here anyways diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/render/BufferRenderer.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/render/BufferRenderer.kt index d4aee33..771fe59 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/gui/render/BufferRenderer.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/render/BufferRenderer.kt @@ -64,9 +64,9 @@ class BufferRenderer(private var width: Int, private var height: Int, private va } fun clean() { + Minecraft.getInstance().textureManager.release(this.id) image.close() tex.close() - Minecraft.getInstance().textureManager.release(this.id) } data class GPUChar(val c: Char, val fg: Int =0xFFFFFF, val bg: Int = 0) diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt new file mode 100644 index 0000000..bfc23c1 --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt @@ -0,0 +1,39 @@ +package org.neoflock.neocomputers.gui.screen; + +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 net.minecraft.client.gui.GuiGraphics +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen +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.gui.menu.CaseMenu +import org.neoflock.neocomputers.gui.widget.DynamicSlot +import org.neoflock.neocomputers.utils.GenericContainerScreen + +class CaseScreen : GenericContainerScreen { + private val PCB: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/computer.png") + + constructor(abstractContainerMenu: CaseMenu, inventory: Inventory, component: Component) : super(abstractContainerMenu, inventory, component) + 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) + + } + + // 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/gui/screen/CombustionGeneratorScreen.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CombustionGeneratorScreen.kt index 0d833bf..9ef3637 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CombustionGeneratorScreen.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CombustionGeneratorScreen.kt @@ -13,7 +13,7 @@ import org.neoflock.neocomputers.utils.GenericContainerScreen class CombustionGeneratorScreen(abstractContainerMenu: CombustionGeneratorMenu, inventory: Inventory, component: Component) : GenericContainerScreen(abstractContainerMenu, inventory, component) { // override fun findMenuTexture(): ResourceLocation = ResourceLocation.withDefaultNamespace("textures/gui/container/dispenser.png") - override fun findMenuTexture(): ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/combustgui.png") + override fun findMenuTexture(): ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/background.png") var energy: Long = 0 var energyCapacity: Long = 1 diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/screen/ScreenScreen.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/ScreenScreen.kt index 45b6773..4a328dd 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/gui/screen/ScreenScreen.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/ScreenScreen.kt @@ -28,7 +28,6 @@ class ScreenScreen : AbstractContainerScreen{ bufferRenderer!!.drawBuffer() renderer.bind(ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "screen/test")) - NeoComputers.LOGGER.info("created") } override fun renderBg(guiGraphics: GuiGraphics, f: Float, i: Int, j: Int) {} override fun render(graphics: GuiGraphics, mouseX: Int, mouseY: Int, something: Float) { @@ -37,6 +36,7 @@ class ScreenScreen : AbstractContainerScreen{ } override fun onClose() { + super.onClose() bufferRenderer!!.clean() } } \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/widget/DynamicSlot.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/widget/DynamicSlot.kt new file mode 100644 index 0000000..005d2fc --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/widget/DynamicSlot.kt @@ -0,0 +1,45 @@ +package org.neoflock.neocomputers.gui.widget + +import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.vertex.BufferBuilder +import com.mojang.blaze3d.vertex.BufferUploader +import com.mojang.blaze3d.vertex.DefaultVertexFormat +import com.mojang.blaze3d.vertex.Tesselator +import com.mojang.blaze3d.vertex.VertexFormat +import net.minecraft.client.gui.GuiGraphics +import net.minecraft.client.renderer.GameRenderer +import net.minecraft.client.renderer.RenderType +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.Container +import net.minecraft.world.inventory.Slot +import org.neoflock.neocomputers.NeoComputers + +open class DynamicSlot(container: Container, slot: Int, x: Int, y: Int) : Slot(container, slot, x, y) { + + val BACKGROUND: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/slots/slot.png") + + fun draw(graphics: GuiGraphics, relX: Int, relY: Int, mouseX: Int, mouseY: Int) { + RenderSystem.enableBlend() // background + RenderSystem.setShaderTexture(0, BACKGROUND) + RenderSystem.setShader { GameRenderer.getPositionTexShader() } + drawQuad(relX+x-1, relY+y-1, 18, 18, 0F, 0F, 15F, 15F) + RenderSystem.disableBlend() + } + + private fun drawQuad(x: Int, y: Int, width: Int, height: Int, u1: Float, v1: Float, u2: Float, v2: Float) { + var t: Tesselator = Tesselator.getInstance() + var builder: BufferBuilder = t.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX) + + builder.addVertex(x.toFloat(), (y+height).toFloat(), 1f).setUv(u1/15F, v2/15F) + builder.addVertex((x+width).toFloat(), (y+height).toFloat(), 1f).setUv(u2/15F, v2/15F) + builder.addVertex((x+width).toFloat(), y.toFloat(), 1f).setUv(u2/15F, v1/15F) + builder.addVertex(x.toFloat(), y.toFloat(), 1f).setUv(u1/15F,v1/15F) + + BufferUploader.drawWithShader(builder.build()!!) + } + + // private fun renderSlotHighlight(guiGraphics: GuiGraphics, x: Int, y: Int, k: Int) { // im not sure but i tihnk i copied this from mc source code + // guiGraphics.fillGradient(RenderType.guiOverlay(), x, y, x + 16, y + 16, -2130706433, -2130706433, k); + // } + +} \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/utils/GenericContainer.kt b/src/main/kotlin/org/neoflock/neocomputers/utils/GenericContainer.kt index 140d5bf..7112ad8 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/utils/GenericContainer.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/utils/GenericContainer.kt @@ -18,6 +18,8 @@ import net.minecraft.world.inventory.MenuType import net.minecraft.world.inventory.Slot import net.minecraft.world.item.ItemStack import net.minecraft.world.level.block.entity.BlockEntityType +import org.neoflock.neocomputers.NeoComputers +import org.neoflock.neocomputers.gui.widget.DynamicSlot // Common container interface, assumes the entire purpose is purely raw item storage interface GenericContainer : Container { @@ -113,7 +115,7 @@ abstract class GenericContainerMenu(menuType: MenuType<*>, id: Int, var containe abstract class GenericContainerScreen(menu: T, inventory: Inventory, component: Component): AbstractContainerScreen(menu, inventory, component) { open fun shouldCenterTitle() = true open fun shouldRenderTooltip() = true - open fun findMenuTexture(): ResourceLocation? = null + open fun findMenuTexture(): ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/background.png") open fun getBoundBlockEntityType(): Set> = setOf() @@ -133,16 +135,22 @@ abstract class GenericContainerScreen(menu: T, inventor override fun renderBg(guiGraphics: GuiGraphics, f: Float, i: Int, j: Int) { val menuTex = findMenuTexture() - if(menuTex != null) { - val cx = (width - imageWidth) / 2 - val cy = (height - imageHeight) / 2 + val cx = (width - imageWidth) / 2 + val cy = (height - imageHeight) / 2 - guiGraphics.blit(menuTex, imageX, imageY, 0, 0, imageWidth, imageHeight) + guiGraphics.blit(menuTex, imageX, imageY, 0, 0, imageWidth, imageHeight) + + for (slot in menu.slots) { + if (slot is DynamicSlot) { + // NeoComputers.LOGGER.info("slot") + slot.draw(guiGraphics, cx, cy, i, j) + } } } override fun render(graphics: GuiGraphics, mouseX: Int, mouseY: Int, something: Float) { super.render(graphics, mouseX, mouseY, something) + if(shouldRenderTooltip()) super.renderTooltip(graphics, mouseX, mouseY) } } \ No newline at end of file diff --git a/src/main/resources/assets/neocomputers/textures/gui/background.png b/src/main/resources/assets/neocomputers/textures/gui/background.png new file mode 100644 index 0000000000000000000000000000000000000000..78c467424f04097e63959dc9afd402cf1c00000e GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5FjO4;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$Hzl2B=6hz$e7@*s){X-QEBH|2H=`2a1J;h635XR()H69QKkR zzhEF22pFWincaZ4^mw{BhE&{obJvjThyf3agXQuU|NZSQJv-HXKxy;Rt_C)q#Df;A ziu_*vba`s1&dX$&`CoYxyTY<3Hk+9hfJV{+G|Xg}Uwtiaa$ZB}>5aEp(5?7ja^P3x z*~IOgZYKoM-jBus2jUGcfG1TqXKV9$h}8b?YH3M+Sy(xArqG`1I@D x3=@WseU<;Y7ZmxeVtsHG6dg1M5|h_6Ff-g|U;Qm(ee@=fWuC5nF6*2UngGxJa;^XX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/gui/button_power.png b/src/main/resources/assets/neocomputers/textures/gui/button_power.png new file mode 100644 index 0000000000000000000000000000000000000000..ed1d380562ac32ae91fef1a94d8588bec671d580 GIT binary patch literal 342 zcmV-c0jd6pP)rEIQ zj-}o}nuH|H!XbUY#6eJcf|-Npl5oZ%OE_auq)TM!SK>Y?RiqMd5)p~aS^<#?h?HrZ oWg0zF%L6xjm3{Hlo4)`908_ymvxMU5b^rhX07*qoM6N<$f=ynItpET3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/gui/computer.png b/src/main/resources/assets/neocomputers/textures/gui/computer.png new file mode 100644 index 0000000000000000000000000000000000000000..3d055eabc91d1b2a5995163f46f2dfea3f78c7e6 GIT binary patch literal 1642 zcmds1>o?SS9RB`(h9*Zst@lS@dX$t6bHnqQ(!Sly_s zpU-*DbI$YT;kr80RTQ-q0RSqD z<1}{wplt~OwA?m@mwS6|lU9tAcZ>%sBqlB(Di|CIVg&{h84&?zgWZDzg5o3p2&QbC zOkKb8bRt=jEJG}TCHU|mv85#vkU&yWQfg`{4u{*e&}g*7hYyoTr0(wSt*xz)_9gW8 z7Zc;|?6H0R2jIQKcdsUEfdetnCxu*ZOGEt>5SuTGY? z%*Dp}Jke*9Q0SV?E3*3S#DBrp57i$NR4Vgwgf?}4n;X)tE1L}m__F(;w61*zTNCLu zrcj=VEvxE3@*{^0L2BJiFb7CM4+IZo9B2A;`e!y5W8M z6K{X$pe!!coE!R7>ke3Gf(f z!lq=&5CxuN);X&Hx>M*)aJwn))FCe9KkoBWF+M*=HqV;(w#U;u;$X+m22_;TYH`4V ze@U~X)wbf7sHZjPzH=5dRU^@0;ycuGzP%Ya_NiDVBu; z&QA({Mw?jjt0}Lg1UT5L#R_3}M#CkI5fLXxzKu?)Cp~&dOF_nfcthhO{$+Ix0VY1K zq|^>9YCx|g8FWNfEicn?_IapCUgJ6&Smnw}&2l1)Cf2D!Gs&crTl`*7is{AiTD(v} zy z8!g@H&w)?=eib{J&Fvf@xEQ3X;D0W8cUiQFOY^=j)(hzqm&t+jqGpZ`f=Wf|58b(} zUhwO2mjoNF;b$Y-%{B;Ib?Im?#M|efQ_A2k%4wwRfr~0{1%mFU`~t^j!{=6VY_sV) z-b8Z|8VJg+s`K5}X4`AL-u!88+-O7f6`viGoAG-?2|X0aNU*F=c3gFDFwG>e!F}tDtF^<-<&oJVmz;G^pV#TYg6y5XkG4u;wW+OmuR)6a z{=sRNmnWmsbV%VgGn={N%WU%(lP~LctQvQ;nJdG6*ZIcORolo}Y3Cl0Ro}Cyl&eY{ zAAH8d2+-60Ne<}{*$?|R_V~12u4=|yA9e7Q4F*M&btPw2Ie0#72~v|ddR%t!k5>g> zPw`&8(JPgni5?#jDEZynq;O(ZS3C-5t9+BtYn2!mKZ0Z`gLQ6~0E&{vgudhS|3A}*00RJ0^j+zT8#*um0000Brdl8^U&4SzBqX;u91E!RyG)kgV?IE<2z&(Bj*@+AV%`FAl*)1~&f1Hzu~qHWuI0`and+wTGljH2jj;$3$z zj7x^j-2K~A5LLiA18AOS;&~ndp)=Iib(IJxoNpY*rsFst4H1yxEWk|+!;rYH`|&i= eZ^!vZfB^t{#G>mpfXib50000^@RCwCNQ@x6VKp6ZyuCPfJ5G1u= z8AxLzM#vjz?@Rb1Rz8VcAb}ui8|-ZaF-GwR{6WFH{osTgN#wA&g=J<3b{ywpsc{@( z$@+kW>+_kY>-s(jf(NZAiisbO$MZ`Aaybk`;CX)1s;Yv`W&?FygXej#e?d_cyu4no z;dZ;>-tBg9zu!R+g!v9gOi>h(tE!6Fwk;wtnKg*x7%rC!@~-O;Pp1>2>$*>ksNZ8` zS#~eWG7Q5oX+J3#h5^g6Ac~^%(*%dZVJ}J2vN4hlY}*D+)9}1ntq{{R#jn3LARSz< zSL9@D+wB(lcVwK5X`1s1k|aU&eIJX=^Bm7j(?D64?+r-99LGVHWndV_r1yP~NYnIu l0>^RwR3i27uklNO0RYt*hvIRu!AAf9002ovPDHLkV1lH?swn^f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/gui/slots/hdd.png b/src/main/resources/assets/neocomputers/textures/gui/slots/hdd.png new file mode 100644 index 0000000000000000000000000000000000000000..c973418c4b8bd4e34acb3a360da8ba4359316bff GIT binary patch literal 338 zcmV-Y0j>UtP)QMh_`ZLeLFu9`JZzdKbX_M*r2hj`wQc)sz`{+_Kv5Lr z{kCl|j^ncdySeZC3%o3gx&;&)JBp$UJWZ220air+HoqC+JkQCD)PPpxd7cm!)o6&S z$+C kmSw3tOsurG$N49~0C7c((>6$*ApigX07*qoM6N<$f`J8#p8x;= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/gui/slots/memory.png b/src/main/resources/assets/neocomputers/textures/gui/slots/memory.png new file mode 100644 index 0000000000000000000000000000000000000000..d13f3b9c5cbbfba2cecbab8a354bb9acf93f7d2e GIT binary patch literal 418 zcmV;T0bTxyP)H6L;q&Y+Qd3vtKfqmtp2(-Z%3) z*XtGk!PkAjG)=2MpH3%~Wy#LHUJr2`BT16=ZGQI|D;1LYz7J6pF_}z2old9Ihuo(G ztJMmUBw;q2;e0-0JRUPbS(e`uP~vbn#Nlv2Q54LwEMwo&G<~lDAqWE4w*6a3AT3&T zKyY0bhGAenpJOl>F#oE9ZqtaOC}KVg!#cEXO;A-8IF4f`2m*MXr?B-=2aevFlo<#NGdv3RLL=YExSUAHt%L!ResgoNF0hkn10&1Tb1gVAV&{eI61$q2{e zkrvEqwMd@lK~WSoK2=p4$M|rCpZ2Z#0o{VGu-$H{lXWA(r}!3N0BYr&=~t;Q#sB~S M07*qoM6N<$f+ZZV`~Uy| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/gui/slots/na.png b/src/main/resources/assets/neocomputers/textures/gui/slots/na.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f35bfaa2aa6c7357f02f4b7657b2508d47611d GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!fo&H$ef*U->Vb93|V?(Y9Zt7ZZP9XwqeLn?0N_r z_y2`j@DfG8h8?aojV&*xHoOpC5X>`I@NQ3OPvPg}5PRMT^XK1Yx&KbA+hxD}1``iM YrUApznRTAYK(iP;UHx3vIVCg!0C{jaw*UYD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/gui/slots/slot.png b/src/main/resources/assets/neocomputers/textures/gui/slots/slot.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9164f6de0a3bd36e46d062d231c07bd4261591 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaG}WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!fo&H$ef*Y57_|NsA+o105Xobdz-%6PgshE&{2N^oN5;c;l; ll5lVRz-ef(h`E7*nZfTMLrQ4jl*d4I44$rjF6*2UngHI~CrJPR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/gui/slots/tier0.png b/src/main/resources/assets/neocomputers/textures/gui/slots/tier0.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd7ebce68877213b3795dad983f7d376b4bfc56 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!fowg8_HS95do|Ns9Viso?xiZGP~`33)Hc)H!d3&@lAba4!+ yxRsRP!p!6B)X><-=*!Biypm}~8Uv$410zGb7Q+tUj5PLg0jgy1boFyt=akR{0CPtu!~g&Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/neocomputers/textures/gui/slots/tier2.png b/src/main/resources/assets/neocomputers/textures/gui/slots/tier2.png new file mode 100644 index 0000000000000000000000000000000000000000..2a45d446f12ed11638fcf65765e979654c22f7f8 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!fowg8_HS95do|Ns9Viso?xiZGP~`33)Hc)H!d3&@lAba4!+ zxRsRP!pzeg*TBd$A;h3TQIly#nggRl10zEV2g9r1f8Q_yl`?p``njxgN@xNA&1@@L literal 0 HcmV?d00001