From 0d92d599580e406a32a079a4e360a133b423f08c Mon Sep 17 00:00:00 2001 From: mewhenthe Date: Sat, 11 Apr 2026 17:45:43 +0200 Subject: [PATCH] Why so screenious --- build.gradle.kts | 206 +----------------- .../org/neoflock/neocomputers/NeoComputers.kt | 13 +- .../neoflock/neocomputers/block/BaseBlock.kt | 20 +- .../org/neoflock/neocomputers/block/Blocks.kt | 42 +--- .../neocomputers/block/ScreenBlock.kt | 46 ++++ .../neocomputers/entity/BlockEntities.kt | 14 ++ .../neocomputers/entity/ScreenEntity.kt | 12 + .../neoflock/neocomputers/gui/menu/Menus.kt | 15 ++ .../neocomputers/gui/menu/ScreenMenu.kt | 14 ++ .../neocomputers/gui/screen/ScreenScreen.kt | 17 ++ src/main/resources/neocomputers.accesswidener | 2 + 11 files changed, 153 insertions(+), 248 deletions(-) create mode 100644 src/main/kotlin/org/neoflock/neocomputers/block/ScreenBlock.kt create mode 100644 src/main/kotlin/org/neoflock/neocomputers/entity/BlockEntities.kt create mode 100644 src/main/kotlin/org/neoflock/neocomputers/entity/ScreenEntity.kt create mode 100644 src/main/kotlin/org/neoflock/neocomputers/gui/menu/Menus.kt create mode 100644 src/main/kotlin/org/neoflock/neocomputers/gui/menu/ScreenMenu.kt create mode 100644 src/main/kotlin/org/neoflock/neocomputers/gui/screen/ScreenScreen.kt diff --git a/build.gradle.kts b/build.gradle.kts index 6c026e5..473c803 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,7 +39,6 @@ dependencies { mappings(loom.officialMojangMappings()) var archversion = "idk" - println(minecraft) when(minecraft) { // NOTE: add more entries if you want to add more versions "1.20.1" -> archversion = "9.2.14" "1.20.4" -> archversion = "11.1.17" @@ -57,7 +56,6 @@ dependencies { //some features (like automatic resource loading from non vanilla namespaces) work only with fabric API installed //for example translations from assets/modid/lang/en_us.json won't be working, same stuff with textures //but we keep runtime only to not accidentally depend on fabric's api, because it doesn't exist in neo/forge - println(archversion) modRuntimeOnly("net.fabricmc.fabric-api:fabric-api:${mod.dep("fabric_version")}") modImplementation("net.fabricmc:fabric-language-kotlin:1.13.10+kotlin.2.3.20") modApi("dev.architectury:architectury-fabric:${archversion}") @@ -238,206 +236,4 @@ tasks.processResources { tasks.build { group = "versioned" description = "Must run through 'chiseledBuild'" -} - -//import java.util.* -// -//plugins { -// id("dev.architectury.loom") -// id("architectury-plugin") -// id("me.modmuss50.mod-publish-plugin") -// id("com.gradleup.shadow") -//} -// -//val minecraft = stonecutter.current.version -//val loader = loom.platform.get().name.lowercase() -// -//version = "${mod.version}+$minecraft" -//group = mod.group -//base { -// archivesName.set("${mod.id}-$loader") -//} -// -//architectury.common(stonecutter.tree.branches.mapNotNull { -// if (stonecutter.current.project !in it) null -// else it.prop("loom.platform") -//}) -//repositories { -// maven("https://maven.neoforged.net/releases/") -// -// //modmenu -// maven("https://maven.terraformersmc.com/") -// //placeholder api (modmenu depencency) -// maven("https://maven.nucleoid.xyz/") -//} -//dependencies { -// minecraft("com.mojang:minecraft:$minecraft") -// mappings(loom.officialMojangMappings()) -// -// if (loader == "fabric") { -// modImplementation("net.fabricmc:fabric-loader:${mod.dep("fabric_loader")}") -//// mappings("net.fabricmc:yarn:$minecraft+build.${mod.dep("yarn_build")}:v2") -// modImplementation("com.terraformersmc:modmenu:${mod.dep("modmenu_version")}") -// -// //some features (like automatic resource loading from non vanilla namespaces) work only with fabric API installed -// //for example translations from assets/modid/lang/en_us.json won't be working, same stuff with textures -// //but we keep runtime only to not accidentally depend on fabric's api, because it doesn't exist in neo/forge -// modRuntimeOnly("net.fabricmc.fabric-api:fabric-api:${mod.dep("fabric_version")}") -// -// } -// if (loader == "forge") { -// "forge"("net.minecraftforge:forge:${minecraft}-${mod.dep("forge_loader")}") -//// mappings("net.fabricmc:yarn:$minecraft+build.${mod.dep("yarn_build")}:v2") -// -// "io.github.llamalad7:mixinextras-forge:${mod.dep("mixin_extras")}".let { -// implementation(it) -// include(it) -// } -// } -// if (loader == "neoforge") { -// "neoForge"("net.neoforged:neoforge:${mod.dep("neoforge_loader")}") -//// mappings(loom.layered { -//// mappings("net.fabricmc:yarn:$minecraft+build.${mod.dep("yarn_build")}:v2") -//// mod.dep("neoforge_patch").takeUnless { it.startsWith('[') }?.let { -//// mappings("dev.architectury:yarn-mappings-patch-neoforge:$it") -//// } -//// }) -// -// } -//} -// -//loom { -//// accessWidenerPath = rootProject.file("src/main/resources/template.accesswidener") -// -// decompilers { -// get("vineflower").apply { // Adds names to lambdas - useful for mixins -// options.put("mark-corresponding-synthetics", "1") -// } -// } -// if (loader == "forge") { -// forge.mixinConfigs( -// "template-common.mixins.json", -// "template-forge.mixins.json", -// ) -// } -//} -// -// -//val localProperties = Properties() -//val localPropertiesFile = rootProject.file("local.properties") -//if (localPropertiesFile.exists()) { -// localProperties.load(localPropertiesFile.inputStream()) -//} -//publishMods { -// val modrinthToken = localProperties.getProperty("publish.modrinthToken", "") -// val curseforgeToken = localProperties.getProperty("publish.curseforgeToken", "") -// -// -// file = project.tasks.remapJar.get().archiveFile -// dryRun = modrinthToken == null || curseforgeToken == null -// -// displayName = "${mod.name} ${loader.replaceFirstChar { it.uppercase() }} ${property("mod.mc_title")}-${mod.version}" -// version = mod.version -// changelog = rootProject.file("CHANGELOG.md").readText() -// type = BETA -// -// modLoaders.add(loader) -// -// val targets = property("mod.mc_targets").toString().split(' ') -// modrinth { -// projectId = property("publish.modrinth").toString() -// accessToken = modrinthToken -// targets.forEach(minecraftVersions::add) -// if (loader == "fabric") { -// requires("fabric-api") -// optional("modmenu") -// } -// } -// -// curseforge { -// projectId = property("publish.curseforge").toString() -// accessToken = curseforgeToken.toString() -// targets.forEach(minecraftVersions::add) -// if (loader == "fabric") { -// requires("fabric-api") -// optional("modmenu") -// } -// } -//} -// -//java { -// withSourcesJar() -// val java = if (stonecutter.eval(minecraft, ">=1.20.5")) JavaVersion.VERSION_21 else JavaVersion.VERSION_17 -// targetCompatibility = java -// sourceCompatibility = java -//} -// -//val shadowBundle: Configuration by configurations.creating { -// isCanBeConsumed = false -// isCanBeResolved = true -//} -// -//tasks.shadowJar { -// configurations = listOf(shadowBundle) -// archiveClassifier = "dev-shadow" -//} -// -//tasks.remapJar { -// injectAccessWidener = true -// input = tasks.shadowJar.get().archiveFile -// archiveClassifier = null -// dependsOn(tasks.shadowJar) -//} -// -//tasks.jar { -// archiveClassifier = "dev" -//} -// -//val buildAndCollect = tasks.register("buildAndCollect") { -// group = "versioned" -// description = "Must run through 'chiseledBuild'" -// from(tasks.remapJar.get().archiveFile, tasks.remapSourcesJar.get().archiveFile) -// into(rootProject.layout.buildDirectory.file("libs/${mod.version}/$loader")) -// dependsOn("build") -//} -// -//if (stonecutter.current.isActive) { -// rootProject.tasks.register("buildActive") { -// group = "project" -// dependsOn(buildAndCollect) -// } -// -// rootProject.tasks.register("runActive") { -// group = "project" -// dependsOn(tasks.named("runClient")) -// } -//} -// -//tasks.processResources { -// properties( -// listOf("fabric.mod.json"), -// "id" to mod.id, -// "name" to mod.name, -// "version" to mod.version, -// "minecraft" to mod.prop("mc_dep_fabric") -// ) -// properties( -// listOf("META-INF/mods.toml", "pack.mcmeta"), -// "id" to mod.id, -// "name" to mod.name, -// "version" to mod.version, -// "minecraft" to mod.prop("mc_dep_forgelike") -// ) -// properties( -// listOf("META-INF/neoforge.mods.toml", "pack.mcmeta"), -// "id" to mod.id, -// "name" to mod.name, -// "version" to mod.version, -// "minecraft" to mod.prop("mc_dep_forgelike") -// ) -//} -// -//tasks.build { -// group = "versioned" -// description = "Must run through 'chiseledBuild'" -//} \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt b/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt index 44fe2bc..33fbeb3 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/NeoComputers.kt @@ -1,9 +1,14 @@ package org.neoflock.neocomputers import com.google.common.base.Suppliers +import dev.architectury.event.events.client.ClientLifecycleEvent import dev.architectury.event.events.common.LifecycleEvent +import dev.architectury.registry.client.gui.MenuScreenRegistry +import dev.architectury.registry.menu.MenuRegistry import dev.architectury.registry.registries.RegistrarManager import org.neoflock.neocomputers.block.Blocks +import org.neoflock.neocomputers.gui.menu.Menus +import org.neoflock.neocomputers.gui.screen.ScreenScreen import org.neoflock.neocomputers.item.Items import org.neoflock.neocomputers.item.Tabs import org.slf4j.Logger @@ -23,9 +28,13 @@ object NeoComputers { Blocks.BLOCKS.register(); Blocks.registerBlockItems(); Items.ITEMS.register(); - Tabs.TABS.register(); - LOGGER.info("Registered!") + Menus.MENUS.register(); + + ClientLifecycleEvent.CLIENT_SETUP.register{ + MenuScreenRegistry.registerScreenFactory(Menus.SCREEN_MENU.get(), ::ScreenScreen) // TODO: this is different across different versions + } + //LOGGER.info("Started mod in %s loader".formatted(NeoComputersInit.PLATFORM.getModloader())) //LOGGER.info("Kotlin: %s".formatted(NeoComputers.hello())) LOGGER.info("Started mod in ${NeoComputers.PLATFORM?.modloader} loader") diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/BaseBlock.kt b/src/main/kotlin/org/neoflock/neocomputers/block/BaseBlock.kt index 7299515..f45c0c1 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/block/BaseBlock.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/block/BaseBlock.kt @@ -1,11 +1,23 @@ package org.neoflock.neocomputers.block +import dev.architectury.registry.registries.RegistrySupplier +import net.minecraft.core.registries.Registries +import net.minecraft.resources.Identifier +import net.minecraft.resources.ResourceKey import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.state.BlockBehaviour +import org.neoflock.neocomputers.NeoComputers +import java.util.function.Supplier -class BaseBlock : Block { - val tier: Int +open class BaseBlock : Block { // TODO: create a TieredBaseBlock class that extends this or something + // val tier: Int - constructor(tier: Int): super(Properties.of()) { - this.tier = tier + constructor(name: String):super( + BlockBehaviour.Properties.of() + .setId(ResourceKey + .create(Registries.BLOCK, Identifier.fromNamespaceAndPath(NeoComputers.MODID, name)))) + + companion object Registry { + fun register(name: String, sup: Supplier): RegistrySupplier = Blocks.BLOCKS.register(name, sup); } } \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/Blocks.kt b/src/main/kotlin/org/neoflock/neocomputers/block/Blocks.kt index 06491cf..9c3a6a6 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/block/Blocks.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/block/Blocks.kt @@ -22,47 +22,15 @@ import java.util.function.Consumer import java.util.function.Supplier object Blocks { - // val CASE: MutableList?>? = - // BaseBlock.register(intArrayOf(0, 1, 2), "case", { tier -> CaseBlock(tier) }) - val BLOCKS: DeferredRegister = DeferredRegister.create(NeoComputers.MODID, Registries.BLOCK) - // val TESTBLOCK : RegistrySupplier = registerBlock("test") - val TESTBLOCK: RegistrySupplier = BLOCKS.register("test") { Block(BlockBehaviour.Properties.of().setId(ResourceKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(NeoComputers.MODID, "test")))) } - - - // public static final RegistrySupplier CASE0 = BLOCKS.register("case0", () -> new CaseBlock(0)); - // public static final RegistrySupplier CASE1 = BLOCKS.register("case1", () -> new CaseBlock(1)); - // public static final RegistrySupplier CASE2 = BLOCKS.register("case2", () -> new CaseBlock(2)); - // public static final RegistrySupplier CABLE = BLOCKS.register("cable", () -> new CableBlock()); - // val SCREEN: RegistrySupplier? = BLOCKS.register("screen", Supplier { ScreenBlock() }) - // val CABLE: RegistrySupplier? = BLOCKS.register("cable", Supplier { CableBlock() }) - - // fun registerBlock(name: String): RegistrySupplier { - // // var Registrar items = MANAGER.get().get(Registries.ITEM); - // var blocks: Registrar = NeoComputers.MANAGER.get().get(Registries.BLOCK); - // return blocks.register(Identifier.fromNamespaceAndPath(NeoComputers.MODID, name)) { - // Block( - // BlockBehaviour.Properties.of().setId( - // ResourceKey.create( - // Registries.BLOCK, - // Identifier.fromNamespaceAndPath(NeoComputers.MODID, name) - // ) - // ) - // ) - // } - // } + val BLOCKS: DeferredRegister = DeferredRegister.create(NeoComputers.MODID, Registries.BLOCK) + val TEST_BLOCK: RegistrySupplier = BaseBlock.register("test") { BaseBlock("test") } + val SCREEN_BLOCK: RegistrySupplier = BaseBlock.register("screen") { ScreenBlock() } fun registerBlockItems() { - BLOCKS.forEach(Consumer { sup: RegistrySupplier? -> - NeoComputers.LOGGER.info("mango viagra") - // TODO: base blocks - // if (blk instanceof BaseBlock) { - // Items.ITEMS.register(sup.getId().getPath(), () -> new BaseBlock.BaseBlockItem(blk, new Item.Properties().arch$tab(Tabs.TAB))); - // } else { - // Items.ITEMS.register(sup.getId().getPath(), () -> new BlockItem(blk, new Item.Properties().arch$tab(Tabs.TAB))); - // } - Items.ITEMS.register(sup!!.id.path) { BlockItem(sup.get()!!, Item.Properties().`arch$tab`(Tabs.TAB).setId(ResourceKey.create(Registries.ITEM, sup.id)))} + BLOCKS.forEach(Consumer { sup: RegistrySupplier -> + Items.ITEMS.register(sup.id.path) { BlockItem(sup.get()!!, Item.Properties().`arch$tab`(Tabs.TAB).setId(ResourceKey.create(Registries.ITEM, sup.id)))} }) } } \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/ScreenBlock.kt b/src/main/kotlin/org/neoflock/neocomputers/block/ScreenBlock.kt new file mode 100644 index 0000000..61151a4 --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/block/ScreenBlock.kt @@ -0,0 +1,46 @@ +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.ScreenEntity +import org.neoflock.neocomputers.gui.menu.Menus + +class ScreenBlock() : BaseBlock("screen"), EntityBlock { + + override fun newBlockEntity(blockPos: BlockPos, blockState: BlockState): BlockEntity? { + return ScreenEntity(blockPos, blockState) + } + + 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("SCREEEEEN!") + override fun createMenu(i: Int, inventory: Inventory, player: Player): AbstractContainerMenu { + return Menus.SCREEN_MENU.get().create(i, inventory); + } + }) + } + return InteractionResult.SUCCESS + } +} \ 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 new file mode 100644 index 0000000..4ee11d1 --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/entity/BlockEntities.kt @@ -0,0 +1,14 @@ +package org.neoflock.neocomputers.entity; + +import dev.architectury.registry.registries.DeferredRegister +import dev.architectury.registry.registries.RegistrySupplier +import net.minecraft.core.registries.Registries +import net.minecraft.world.level.block.entity.BlockEntityType +import org.neoflock.neocomputers.NeoComputers +import org.neoflock.neocomputers.block.Blocks + +object BlockEntities { + val BLOCKENTITIES: DeferredRegister> = DeferredRegister.create(NeoComputers.MODID, Registries.BLOCK_ENTITY_TYPE); + + val SCREEN_ENTITY: RegistrySupplier> = BLOCKENTITIES.register("screen_entity") { BlockEntityType(::ScreenEntity, mutableSetOf(Blocks.SCREEN_BLOCK.get()))} +} \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/entity/ScreenEntity.kt b/src/main/kotlin/org/neoflock/neocomputers/entity/ScreenEntity.kt new file mode 100644 index 0000000..df94c12 --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/entity/ScreenEntity.kt @@ -0,0 +1,12 @@ +package org.neoflock.neocomputers.entity; + +import net.minecraft.core.BlockPos +import net.minecraft.world.level.block.entity.BlockEntity +import net.minecraft.world.level.block.entity.BlockEntityType +import net.minecraft.world.level.block.state.BlockState + +class ScreenEntity(blockPos: BlockPos, blockState: BlockState) : + BlockEntity(BlockEntities.SCREEN_ENTITY.get(), blockPos, blockState) { + + // stuff +} \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/menu/Menus.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/Menus.kt new file mode 100644 index 0000000..ee34739 --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/Menus.kt @@ -0,0 +1,15 @@ +package org.neoflock.neocomputers.gui.menu; + +import dev.architectury.registry.menu.MenuRegistry +import dev.architectury.registry.registries.DeferredRegister +import dev.architectury.registry.registries.RegistrySupplier +import net.minecraft.core.registries.Registries +import net.minecraft.world.inventory.MenuType +import org.neoflock.neocomputers.NeoComputers +import org.neoflock.neocomputers.gui.menu.ScreenMenu + +object Menus { + val MENUS: DeferredRegister> = DeferredRegister.create(NeoComputers.MODID, Registries.MENU) + + val SCREEN_MENU: RegistrySupplier> = MENUS.register("screen_menu") { MenuRegistry.of(::ScreenMenu)} // "deprecated" my ass +} \ 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 new file mode 100644 index 0000000..c90bb1a --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/menu/ScreenMenu.kt @@ -0,0 +1,14 @@ +package org.neoflock.neocomputers.gui.menu; + +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 + +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 +} \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/screen/ScreenScreen.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/ScreenScreen.kt new file mode 100644 index 0000000..b242c6c --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/ScreenScreen.kt @@ -0,0 +1,17 @@ +package org.neoflock.neocomputers.gui.screen; + +import com.mojang.blaze3d.vertex.BufferBuilder +import com.mojang.blaze3d.vertex.Tesselator +import net.minecraft.client.gui.GuiGraphics +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.player.Inventory +import org.neoflock.neocomputers.gui.menu.ScreenMenu + +class ScreenScreen(abstractContainerMenu: ScreenMenu, inventory: Inventory, component: Component) : AbstractContainerScreen(abstractContainerMenu, inventory, component) { + override fun renderBg(guiGraphics: GuiGraphics, f: Float, i: Int, j: Int) {} + + override fun getTitle(): Component { + return Component.literal("Mango Vlud!") + } +} \ No newline at end of file diff --git a/src/main/resources/neocomputers.accesswidener b/src/main/resources/neocomputers.accesswidener index 9ab2173..4981511 100644 --- a/src/main/resources/neocomputers.accesswidener +++ b/src/main/resources/neocomputers.accesswidener @@ -1 +1,3 @@ accessWidener v2 named + +accessible method net/minecraft/world/level/block/entity/BlockEntityType (Lnet/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier;Ljava/util/Set;)V \ No newline at end of file