This commit is contained in:
2026-04-24 15:07:17 +02:00
6 changed files with 48 additions and 10 deletions

View File

@@ -64,11 +64,14 @@ class ScreenBlock() : NodeBlock() {
player.sendSystemMessage(Component.literal("Not enough power.")) player.sendSystemMessage(Component.literal("Not enough power."))
return InteractionResult.SUCCESS return InteractionResult.SUCCESS
}; };
MenuRegistry.openExtendedMenu(player as ServerPlayer, object : ExtendedMenuProvider { val sp = player as ServerPlayer
val ent = level.getBlockEntity(blockPos, BlockEntities.SCREEN_ENTITY.get()).get()
NodeSynchronizer.registerPlayerScreen(sp, ent)
MenuRegistry.openExtendedMenu(sp, object : ExtendedMenuProvider {
override fun getDisplayName(): Component = Component.literal("SCREEEEEN!") override fun getDisplayName(): Component = Component.literal("SCREEEEEN!")
override fun createMenu(i: Int, inventory: Inventory, player: Player): AbstractContainerMenu { override fun createMenu(i: Int, inventory: Inventory, player: Player): AbstractContainerMenu {
// return Menus.SCREEN_MENU.get().create(i, inventory); // return Menus.SCREEN_MENU.get().create(i, inventory);
return ScreenMenu(i, inventory, level.getBlockEntity(blockPos, BlockEntities.SCREEN_ENTITY.get()).get()) return ScreenMenu(i, inventory, ent)
} }
override fun saveExtraData(buf: FriendlyByteBuf?) { override fun saveExtraData(buf: FriendlyByteBuf?) {

View File

@@ -262,6 +262,9 @@ class CaseBlockEntity(blockPos: BlockPos, blockState: BlockState): NodeBlockEnti
super.tickNode(level) super.tickNode(level)
if(!level.isClientSide) { if(!level.isClientSide) {
if (isRunning()) { if (isRunning()) {
if(getMachineComponentsUsed() > getMachineComponentsTotal()) {
crash("too many components")
}
if (!node.consumeEnergy(1)) { if (!node.consumeEnergy(1)) {
crash("out of energy") crash("out of energy")
} }

View File

@@ -1,7 +1,9 @@
package org.neoflock.neocomputers.entity; package org.neoflock.neocomputers.entity;
import net.minecraft.core.BlockPos import net.minecraft.core.BlockPos
import net.minecraft.network.FriendlyByteBuf
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockState
import org.neoflock.neocomputers.NeoComputers import org.neoflock.neocomputers.NeoComputers
@@ -17,8 +19,17 @@ class ScreenEntity(blockPos: BlockPos, blockState: BlockState) :
var bound = "screen/unbound" var bound = "screen/unbound"
var render_on_block = false var render_on_block = false
val scrwidth: Short = 160
val scrheight: Short = 50
private var cleanrenderer: () -> Unit = { }; // TODO: THIS SUCKS, FIND A BETTER WAY private var cleanrenderer: () -> Unit = { }; // TODO: THIS SUCKS, FIND A BETTER WAY
override fun encodeScreenData(player: ServerPlayer, packet: FriendlyByteBuf) {
super.encodeScreenData(player, packet)
packet.writeShort(scrwidth.toInt())
packet.writeShort(scrheight.toInt())
}
override fun tickNode(level: Level) { override fun tickNode(level: Level) {
super.tickNode(level) super.tickNode(level)
if (bound == "screen/unbound" && level.isClientSide) { // am i epstein or am i just retarded? if (bound == "screen/unbound" && level.isClientSide) { // am i epstein or am i just retarded?
@@ -38,13 +49,13 @@ class ScreenEntity(blockPos: BlockPos, blockState: BlockState) :
if (level!!.isClientSide) { if (level!!.isClientSide) {
var buffer: MutableList<BufferRenderer.GPUChar> = mutableListOf() var buffer: MutableList<BufferRenderer.GPUChar> = mutableListOf()
for(char in node.address.toString()) { for(char in node.address.toString()) {
buffer.add(BufferRenderer.GPUChar(char, 0xFFFF00, 0x0000FF)) buffer.add(BufferRenderer.GPUChar(char))
} }
for (i in 0..((40*20)-36)) { for (i in 0..((scrwidth*scrheight)-36)) {
buffer.add(BufferRenderer.GPUChar(' ')) buffer.add(BufferRenderer.GPUChar(' '))
} }
var renderer: BufferRenderer = BufferRenderer(40, 20, ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, bound), buffer) var renderer: BufferRenderer = BufferRenderer(scrwidth.toInt(), scrheight.toInt(), ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, bound), buffer)
renderer.drawBuffer() renderer.drawBuffer()
cleanrenderer = { renderer.clean() } cleanrenderer = { renderer.clean() }
} }

View File

@@ -6,6 +6,7 @@ import com.mojang.blaze3d.vertex.Tesselator
import com.mojang.blaze3d.vertex.VertexFormat import com.mojang.blaze3d.vertex.VertexFormat
import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
import net.minecraft.network.FriendlyByteBuf
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Inventory
@@ -14,18 +15,34 @@ import org.neoflock.neocomputers.entity.ScreenEntity
import org.neoflock.neocomputers.gui.buffer.BufferRenderer import org.neoflock.neocomputers.gui.buffer.BufferRenderer
import org.neoflock.neocomputers.gui.menu.ScreenMenu import org.neoflock.neocomputers.gui.menu.ScreenMenu
import org.neoflock.neocomputers.gui.render.ScreenRenderer import org.neoflock.neocomputers.gui.render.ScreenRenderer
import org.neoflock.neocomputers.utils.GenericContainerScreen
import kotlin.math.min
class ScreenScreen : AbstractContainerScreen<ScreenMenu>{ class ScreenScreen : GenericContainerScreen<ScreenMenu>{
private var renderer: ScreenRenderer = ScreenRenderer(); private var renderer: ScreenRenderer = ScreenRenderer();
var scrWidth: Short = 0
var scrHeight: Short = 0
override fun processScreenStatePacket(buf: FriendlyByteBuf) {
super.processScreenStatePacket(buf)
scrWidth = buf.readShort()
scrHeight = buf.readShort()
}
constructor(abstractContainerMenu: ScreenMenu, inventory: Inventory, component: Component) : super(abstractContainerMenu, inventory, component) { constructor(abstractContainerMenu: ScreenMenu, inventory: Inventory, component: Component) : super(abstractContainerMenu, inventory, component) {
var ent: ScreenEntity = abstractContainerMenu.entity!!; var ent: ScreenEntity = abstractContainerMenu.entity!!;
renderer.bind(ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, ent.bound)) renderer.bind(ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, ent.bound))
// advanced graphics programming
this.titleLabelX = Int.MAX_VALUE
this.inventoryLabelX = Int.MAX_VALUE
} }
override fun renderBg(guiGraphics: GuiGraphics, f: Float, i: Int, j: Int) {} override fun renderBg(guiGraphics: GuiGraphics, f: Float, i: Int, j: Int) {
override fun render(graphics: GuiGraphics, mouseX: Int, mouseY: Int, something: Float) { if(scrWidth > 0) {
super.render(graphics, mouseX, mouseY, something) imageWidth = scrWidth * 4
renderer.render(graphics, 50, 50, 100, 200) imageHeight = scrHeight * 8
renderer.render(guiGraphics, imageX, imageY, imageWidth, imageHeight)
}
} }
// override fun onClose() { // override fun onClose() {

View File

@@ -1,6 +1,7 @@
package org.neoflock.neocomputers.utils package org.neoflock.neocomputers.utils
// based off the ImplementedContainer of https://docs.fabricmc.net/develop/blocks/block-containers // based off the ImplementedContainer of https://docs.fabricmc.net/develop/blocks/block-containers
import dev.architectury.registry.menu.MenuRegistry
import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
import net.minecraft.world.Container; import net.minecraft.world.Container;

View File

@@ -0,0 +1,3 @@
{
"parent": "neocomputers:block/case"
}