From 55d1272238a8b1ad68df18ec059c2472a10af0af Mon Sep 17 00:00:00 2001 From: Vasco Garcia Date: Sat, 28 Mar 2026 18:05:47 +0000 Subject: [PATCH 1/9] feat: 26.1 port. Fabric: Waiting for renderer API feat: Migrate Gradle configs to Kotlin DSL chore: Bring back license file --- .github/workflows/build.yml | 2 +- LICENSE | 21 +++ build.gradle | 91 ---------- build.gradle.kts | 85 +++++++++ common/build.gradle | 16 -- common/build.gradle.kts | 16 ++ .../java/com/vsngarcia/ElevatorBlockBase.java | 6 +- .../vsngarcia/client/ColorCamoElevator.java | 38 ++-- .../vsngarcia/client/gui/ElevatorScreen.java | 41 ++--- .../vsngarcia/client/gui/FacingButton.java | 18 +- .../level/ElevatorBlockEntityBase.java | 2 +- .../com/vsngarcia/network/TeleportPacket.java | 5 +- .../main/resources/elevatormod.accesswidener | 4 - .../main/resources/elevatormod.classtweaker | 2 + fabric/build.gradle | 63 ------- fabric/build.gradle.kts | 79 ++++++++ .../com/vsngarcia/fabric/ElevatorBlock.java | 4 +- .../com/vsngarcia/fabric/FabricRegistry.java | 13 +- .../client/ElevatorModFabricClient.java | 59 +++--- .../client/render/ElevatorBakedModel.java | 170 +++++++++--------- .../fabric/network/NetworkHandler.java | 10 +- .../fabric/tile/ElevatorBlockEntity.java | 6 +- fabric/src/main/resources/fabric.mod.json | 7 +- gradle.properties | 12 +- gradle/wrapper/gradle-wrapper.properties | 5 +- neoforge/build.gradle | 61 ------- neoforge/build.gradle.kts | 67 +++++++ .../com/vsngarcia/neoforge/ElevatorBlock.java | 4 +- .../neoforge/client/ClientRegistry.java | 26 ++- .../client/render/ElevatorBakedModel.java | 26 +-- .../resources/META-INF/accesstransformer.cfg | 2 + .../resources/META-INF/neoforge.mods.toml | 4 +- settings.gradle | 14 -- settings.gradle.kts | 14 ++ 34 files changed, 507 insertions(+), 486 deletions(-) create mode 100644 LICENSE delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 common/build.gradle create mode 100644 common/build.gradle.kts delete mode 100644 common/src/main/resources/elevatormod.accesswidener create mode 100644 common/src/main/resources/elevatormod.classtweaker delete mode 100644 fabric/build.gradle create mode 100644 fabric/build.gradle.kts delete mode 100644 neoforge/build.gradle create mode 100644 neoforge/build.gradle.kts create mode 100644 neoforge/src/main/resources/META-INF/accesstransformer.cfg delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8897511..5b3fcf7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: - name: Set up JDK 21 uses: actions/setup-java@v4 with: - java-version: '21' + java-version: '25' distribution: 'temurin' - uses: gradle/actions/setup-gradle@v4 - run: ./gradlew build diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..118c78c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Vasco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/build.gradle b/build.gradle deleted file mode 100644 index bb5e2da..0000000 --- a/build.gradle +++ /dev/null @@ -1,91 +0,0 @@ -plugins { - id 'dev.architectury.loom' version '1.13-SNAPSHOT' apply false - id 'architectury-plugin' version '3.4-SNAPSHOT' - id 'com.github.johnrengelman.shadow' version '8.1.1' apply false -} - -architectury { - minecraft = project.minecraft_version -} - -allprojects { - group = rootProject.maven_group - version = rootProject.mod_version -} - -subprojects { - apply plugin: 'dev.architectury.loom' - apply plugin: 'architectury-plugin' - apply plugin: 'maven-publish' - - base { - // Set up a suffixed format for the mod jar names, e.g. `example-fabric`. - archivesName = "$rootProject.archives_name-$project.name" - } - - repositories { - // Add repositories to retrieve artifacts from in here. - // You should only use this when depending on other mods because - // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. - // See https://docs.gradle.org/current/userguide/declaring_repositories.html - // for more information about repositories. - - exclusiveContent { - forRepository { - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - } - } - filter { - includeGroup "maven.modrinth" - } - } - - maven { - name = "Fuzs Mod Resources" - url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" - } - } - - loom { - silentMojangMappingsLicense() - } - - dependencies { - minecraft "net.minecraft:minecraft:$rootProject.minecraft_version" - mappings loom.officialMojangMappings() - } - - java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() - - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 - } - - tasks.withType(JavaCompile).configureEach { - it.options.release = 21 - } - - // Configure Maven publishing. - publishing { - publications { - mavenJava(MavenPublication) { - artifactId = base.archivesName.get() - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..2be2328 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,85 @@ +plugins { + id("dev.architectury.loom-no-remap") version "1.14-SNAPSHOT" apply false + id("architectury-plugin") version "3.5-SNAPSHOT" + id("com.gradleup.shadow") version "9.4.1" apply false +} + +architectury { + minecraft = property("minecraft_version") as String +} + +allprojects { + group = property("maven_group") as String + version = property("mod_version") as String +} + +subprojects { + apply(plugin = "dev.architectury.loom-no-remap") + apply(plugin = "architectury-plugin") + apply(plugin = "maven-publish") + + configure { + archivesName = "${property("archives_name")}-${project.name}" + } + + repositories { + // Add repositories to retrieve artifacts from in here. + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html + // for more information about repositories. + + exclusiveContent { + forRepository { + maven { + name = "Modrinth" + url = uri("https://api.modrinth.com/maven") + } + } + filter { + includeGroup("maven.modrinth") + } + } + + maven { + name = "Fuzs Mod Resources" + url = uri("https://raw.githubusercontent.com/Fuzss/modresources/main/maven/") + } + } + + dependencies { + "minecraft"("net.minecraft:minecraft:${property("minecraft_version")}") + } + +// tasks.java { +// // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task +// // if it is present. +// // If you remove this line, sources will not be generated. +// withSourcesJar() +// +// sourceCompatibility = JavaVersion.VERSION_21 +// targetCompatibility = JavaVersion.VERSION_21 +// } + + tasks.withType().configureEach { + options.release = 25 + } + + // Configure Maven publishing. +// publishing { +// publications { +// mavenJava(MavenPublication) { +// artifactId = base.archivesName.get() +// from components . java +// } +// } +// +// // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. +// repositories { +// // Add repositories to publish to here. +// // Notice: This block does NOT have the same function as the block in the top level. +// // The repositories here will be used for publishing your artifact, not for +// // retrieving dependencies. +// } +// } +} diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index 3bbf43b..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -loom { - accessWidenerPath = file("src/main/resources/elevatormod.accesswidener") -} - -architectury { - common rootProject.enabled_platforms.split(',') -} - -dependencies { - // We depend on Fabric Loader here to use the Fabric @Environment annotations, - // which get remapped to the correct annotations on each platform. - // Do NOT use other classes from Fabric Loader. - modImplementation "net.fabricmc:fabric-loader:$rootProject.fabric_loader_version" - - modApi "fuzs.forgeconfigapiport:forgeconfigapiport-common-neoforgeapi:$rootProject.forge_config_api_port_version" -} diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 0000000..0bcb79e --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,16 @@ +loom { + accessWidenerPath = file("src/main/resources/elevatormod.classtweaker") +} + +architectury { + common((property("enabled_platforms") as String).split(',')) +} + +dependencies { + // We depend on Fabric Loader here to use the Fabric @Environment annotations, + // which get remapped to the correct annotations on each platform. + // Do NOT use other classes from Fabric Loader. + implementation("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") + + api("fuzs.forgeconfigapiport:forgeconfigapiport-common-neoforgeapi:${property("forge_config_api_port_version")}") +} diff --git a/common/src/main/java/com/vsngarcia/ElevatorBlockBase.java b/common/src/main/java/com/vsngarcia/ElevatorBlockBase.java index 2e9e4b6..2503a9b 100644 --- a/common/src/main/java/com/vsngarcia/ElevatorBlockBase.java +++ b/common/src/main/java/com/vsngarcia/ElevatorBlockBase.java @@ -266,12 +266,12 @@ protected boolean propagatesSkylightDown(BlockState blockState) { } @Override - protected int getLightBlock(BlockState blockState) { + protected int getLightDampening(BlockState state) { // TODO: Not dynamic - return super.getLightBlock(blockState); + return super.getLightDampening(state); } -// @Override + // @Override // public int getLightBlock(BlockState state, BlockGetter worldIn, BlockPos pos) { // return getHeldState(worldIn, pos) // .map(s -> s.getLightBlock(worldIn, pos)) diff --git a/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java b/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java index 9f7bef4..8807e84 100644 --- a/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java +++ b/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java @@ -3,30 +3,34 @@ import com.vsngarcia.ElevatorBlockBase; import com.vsngarcia.level.ElevatorBlockEntityBase; import net.minecraft.client.Minecraft; -import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.block.BlockTintSource; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -public class ColorCamoElevator implements BlockColor { +public class ColorCamoElevator implements BlockTintSource { @Override - public int getColor(BlockState state, BlockAndTintGetter lightReader, BlockPos pos, int tintIndex) { - if (lightReader == null || pos == null) { - return -1; + public int color(BlockState state) { + return 0; + } + + @Override + public int colorInWorld(BlockState state, BlockAndTintGetter level, BlockPos pos) { + if (!(level.getBlockEntity(pos) instanceof ElevatorBlockEntityBase tile)) { + return color(state); } - if (state.getBlock() instanceof ElevatorBlockBase && - lightReader.getBlockEntity(pos) instanceof ElevatorBlockEntityBase tile) { - if (tile.getHeldState() != null) { - return Minecraft.getInstance().getBlockColors().getColor( - tile.getHeldState(), - lightReader, - pos, - tintIndex - ); - } + var heldState = tile.getHeldState(); + if (heldState == null) { + return color(state); } - return -1; + + BlockTintSource tintSource = Minecraft.getInstance().getBlockColors().getTintSource(heldState, 0); + if (tintSource != null) { + return tintSource.colorInWorld(heldState, level, pos); + } + + return color(state); } } diff --git a/common/src/main/java/com/vsngarcia/client/gui/ElevatorScreen.java b/common/src/main/java/com/vsngarcia/client/gui/ElevatorScreen.java index 74faba0..f669c54 100644 --- a/common/src/main/java/com/vsngarcia/client/gui/ElevatorScreen.java +++ b/common/src/main/java/com/vsngarcia/client/gui/ElevatorScreen.java @@ -8,7 +8,7 @@ import com.vsngarcia.network.client.RemoveCamoPacket; import com.vsngarcia.network.client.SetArrowPacket; import com.vsngarcia.network.client.SetDirectionalPacket; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Checkbox; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -35,9 +35,7 @@ public class ElevatorScreen extends AbstractContainerScreen { private FacingControllerWrapper facingController; public ElevatorScreen(ElevatorContainer container, Inventory inv, Component titleIn, ClientPacketSender pktSender) { - super(container, inv, titleIn); - imageWidth = 200; - imageHeight = 100; + super(container, inv, titleIn, 200, 100); tile = container.getTile(); playerFacing = container.getPlayerFacing(); @@ -98,11 +96,6 @@ public void init() { resetCamoButton.active = tile.getHeldState() != null; } - @Override - public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) { - super.render(guiGraphics, mouseX, mouseY, partialTicks); - } - @Override public void containerTick() { super.containerTick(); @@ -121,23 +114,25 @@ public void containerTick() { } @Override - protected void renderBg(GuiGraphics guiGraphics, float v, int mouseX, int mouseY) { - guiGraphics.blit( - RenderPipelines.GUI_TEXTURED, - GUI_TEXTURE, - (this.width - this.imageWidth) / 2, - (this.height - this.imageHeight) / 2, - 0, - 0, - this.imageWidth, - this.imageHeight, - 256, - 256 + public void extractBackground(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) { + super.extractBackground(graphics, mouseX, mouseY, a); + + graphics.blit( + RenderPipelines.GUI_TEXTURED, + GUI_TEXTURE, + (this.width - this.imageWidth) / 2, + (this.height - this.imageHeight) / 2, + 0, + 0, + this.imageWidth, + this.imageHeight, + 256, + 256 ); } @Override - protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { - guiGraphics.drawString(font, title, 8, 8, 0xFFE0E0E0); + protected void extractLabels(GuiGraphicsExtractor graphics, int xm, int ym) { + graphics.text(font, title, 8, 8, 0xFFE0E0E0); } } diff --git a/common/src/main/java/com/vsngarcia/client/gui/FacingButton.java b/common/src/main/java/com/vsngarcia/client/gui/FacingButton.java index 00a6ca5..a30d3f9 100644 --- a/common/src/main/java/com/vsngarcia/client/gui/FacingButton.java +++ b/common/src/main/java/com/vsngarcia/client/gui/FacingButton.java @@ -3,7 +3,7 @@ import com.vsngarcia.network.ClientPacketSender; import com.vsngarcia.network.client.SetFacingPacket; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.Button; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -34,17 +34,17 @@ class FacingButton extends Button { } @Override - public void renderContents(GuiGraphics guiGraphics, int mouseX, int mouseY, float partial) { + protected void extractContents(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) { if (isHoveredOrFocused() && active) { - guiGraphics.fill(getX(), getY(), getX() + width, getY() + height, 0x80FFFFFF); + graphics.fill(getX(), getY(), getX() + width, getY() + height, 0x80FFFFFF); } - guiGraphics.drawCenteredString( - Minecraft.getInstance().font, - getMessage().getString(), - getX() + this.width / 2, - getY() + (this.height - 8) / 2, - active ? 0xFFE0E0E0 : 0xFF00FF00 + graphics.centeredText( + Minecraft.getInstance().font, + getMessage().getString(), + getX() + this.width / 2, + getY() + (this.height - 8) / 2, + active ? 0xFF_E0_E0_E0 : 0xFF_00_FF_00 ); } } diff --git a/common/src/main/java/com/vsngarcia/level/ElevatorBlockEntityBase.java b/common/src/main/java/com/vsngarcia/level/ElevatorBlockEntityBase.java index f6b73a5..fe425b9 100644 --- a/common/src/main/java/com/vsngarcia/level/ElevatorBlockEntityBase.java +++ b/common/src/main/java/com/vsngarcia/level/ElevatorBlockEntityBase.java @@ -98,7 +98,7 @@ public void setChanged() { direction, getBlockPos().relative(direction), level.getBlockState(getBlockPos().relative(direction)), - level.random + level.getRandom() ); } } diff --git a/common/src/main/java/com/vsngarcia/network/TeleportPacket.java b/common/src/main/java/com/vsngarcia/network/TeleportPacket.java index 2142b98..abe3bd4 100644 --- a/common/src/main/java/com/vsngarcia/network/TeleportPacket.java +++ b/common/src/main/java/com/vsngarcia/network/TeleportPacket.java @@ -54,9 +54,8 @@ public static void handle(TeleportPacket message, ServerPlayer player, SoundEven if (getPlayerExperienceProgress(player) - xpCost >= 0 || player.experienceLevel > 0) { player.giveExperiencePoints(-xpCost); } else { - player.displayClientMessage( - Component.translatable("elevatorid.message.missing_xp").withStyle(ChatFormatting.RED), - true + player.sendOverlayMessage( + Component.translatable("elevatorid.message.missing_xp").withStyle(ChatFormatting.RED) ); return; } diff --git a/common/src/main/resources/elevatormod.accesswidener b/common/src/main/resources/elevatormod.accesswidener deleted file mode 100644 index 9e78398..0000000 --- a/common/src/main/resources/elevatormod.accesswidener +++ /dev/null @@ -1,4 +0,0 @@ -accessWidener v2 named -accessible field net/minecraft/client/gui/components/Checkbox selected Z -accessible method net/minecraft/world/level/block/entity/BlockEntityType (Lnet/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier;Ljava/util/Set;)V -accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier diff --git a/common/src/main/resources/elevatormod.classtweaker b/common/src/main/resources/elevatormod.classtweaker new file mode 100644 index 0000000..bcf0182 --- /dev/null +++ b/common/src/main/resources/elevatormod.classtweaker @@ -0,0 +1,2 @@ +classTweaker v1 official +accessible field net/minecraft/client/gui/components/Checkbox selected Z diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index 5151367..0000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,63 +0,0 @@ -plugins { - id 'com.github.johnrengelman.shadow' -} - -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - -architectury { - platformSetupLoomIde() - fabric() -} - -configurations { - common { - canBeResolved = true - canBeConsumed = false - } - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common - - // Files in this configuration will be bundled into your mod using the Shadow plugin. - // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. - shadowBundle { - canBeResolved = true - canBeConsumed = false - } -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:$rootProject.fabric_loader_version" - - // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:$rootProject.fabric_api_version" - - common(project(path: ':common', configuration: 'namedElements')) { transitive false } - shadowBundle project(path: ':common', configuration: 'transformProductionFabric') - - modApi "fuzs.forgeconfigapiport:forgeconfigapiport-fabric:$rootProject.forge_config_api_port_version" - include "fuzs.forgeconfigapiport:forgeconfigapiport-fabric:$rootProject.forge_config_api_port_version" - -// modLocalRuntime "maven.modrinth:modmenu:12.0.0-beta.1" -// modLocalRuntime "maven.modrinth:sodium:mc1.21.2-0.6.0-beta.3-fabric" -} - -processResources { - inputs.property 'version', project.version - - filesMatching('fabric.mod.json') { - expand version: project.version - } -} - -shadowJar { - configurations = [project.configurations.shadowBundle] - archiveClassifier = 'dev-shadow' -} - -remapJar { - injectAccessWidener = true - input.set shadowJar.archiveFile -} diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 0000000..770c6ff --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,79 @@ +plugins { + id("com.gradleup.shadow") +} + +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath +} + +architectury { + platformSetupLoomIde() + fabric() +} + +val common by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false +} + +val shadowBundle by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false +} + +configurations { + compileClasspath.get().extendsFrom(common) + runtimeClasspath.get().extendsFrom(common) + getByName("developmentFabric").extendsFrom(common) +} + + +dependencies { + api("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") + + // Fabric API. This is technically optional, but you probably want it anyway. + api("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") + + common(project(path = ":common")) { isTransitive = false } + shadowBundle(project(path = ":common", configuration = "transformProductionFabric")) + + api("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:${property("forge_config_api_port_version")}") + include("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:${property("forge_config_api_port_version")}") + +// modLocalRuntime "maven.modrinth:modmenu:12.0.0-beta.1" +// modLocalRuntime "maven.modrinth:sodium:mc1.21.2-0.6.0-beta.3-fabric" +} + +tasks.processResources { + inputs.property("version", project.version) + + filesMatching("fabric.mod.json") { + expand("version" to project.version) + } + + // TODO: Dev workaround - copy classTweaker from common so Fabric Loader can find it at runtime. + // This may not be needed in a future Architectury release. + from(project(":common").loom.accessWidenerPath) +} + +tasks.jar { + archiveClassifier = "raw" +} + +tasks.shadowJar { + dependsOn(tasks.jar) + from(zipTree(tasks.jar.get().archiveFile)) + configurations = listOf(shadowBundle) + archiveClassifier = null + + val mainOutput = sourceSets.main.get().output + exclude { element -> + mainOutput.classesDirs.any { element.file.startsWith(it) } || + element.file.startsWith(mainOutput.resourcesDir!!) + } +} + +//remapJar { +// injectAccessWidener = true +// input.set shadowJar.archiveFile +//} diff --git a/fabric/src/main/java/com/vsngarcia/fabric/ElevatorBlock.java b/fabric/src/main/java/com/vsngarcia/fabric/ElevatorBlock.java index 33cb35f..823edc0 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/ElevatorBlock.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/ElevatorBlock.java @@ -10,7 +10,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.BlockAndLightGetter; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.HorizontalDirectionalBlock; @@ -75,7 +75,7 @@ public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { @Override public BlockState getAppearance( BlockState state, - BlockAndTintGetter renderView, + BlockAndLightGetter renderView, BlockPos pos, Direction side, @Nullable BlockState sourceState, diff --git a/fabric/src/main/java/com/vsngarcia/fabric/FabricRegistry.java b/fabric/src/main/java/com/vsngarcia/fabric/FabricRegistry.java index d828c66..b0f45f6 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/FabricRegistry.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/FabricRegistry.java @@ -4,8 +4,9 @@ import com.vsngarcia.ElevatorMod; import com.vsngarcia.fabric.tile.ElevatorBlockEntity; import com.vsngarcia.level.ElevatorContainer; -import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; -import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; +import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTab; +import net.fabricmc.fabric.api.menu.v1.ExtendedMenuType; +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; @@ -61,13 +62,13 @@ public class FabricRegistry { public static final BlockEntityType ELEVATOR_BLOCK_ENTITY_TYPE = Registry.register( BuiltInRegistries.BLOCK_ENTITY_TYPE, Identifier.fromNamespaceAndPath(ElevatorMod.ID, "elevator_tile"), - new BlockEntityType<>(ElevatorBlockEntity::new, new HashSet<>(ELEVATOR_BLOCKS.values())) + FabricBlockEntityTypeBuilder.create(ElevatorBlockEntity::new, ELEVATOR_BLOCKS.values().toArray(Block[]::new)).build() ); - public static ExtendedScreenHandlerType ELEVATOR_CONTAINER = null; + public static ExtendedMenuType ELEVATOR_CONTAINER = null; static { - ELEVATOR_CONTAINER = new ExtendedScreenHandlerType<>( + ELEVATOR_CONTAINER = new ExtendedMenuType<>( (syncId, inventory, data) -> new ElevatorContainer( ELEVATOR_CONTAINER, syncId, @@ -100,7 +101,7 @@ public class FabricRegistry { Registry.register( BuiltInRegistries.CREATIVE_MODE_TAB, Identifier.fromNamespaceAndPath(ElevatorMod.ID, "elevators_tab"), - FabricItemGroup.builder() + FabricCreativeModeTab.builder() .icon(() -> ELEVATOR_BLOCKS.get(DyeColor.WHITE).asItem().getDefaultInstance()) .displayItems((params, output) -> ELEVATOR_ITEMS.values().forEach(output::accept)) .title(Component.translatable("itemGroup.elevators_tab")) diff --git a/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java b/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java index c6447e6..ea6f204 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java @@ -1,30 +1,17 @@ package com.vsngarcia.fabric.client; import com.vsngarcia.ElevatorHandler; -import com.vsngarcia.ElevatorMod; -import com.vsngarcia.client.ColorCamoElevator; import com.vsngarcia.client.gui.ElevatorScreen; -import com.vsngarcia.fabric.ElevatorBlock; -import com.vsngarcia.fabric.client.render.ElevatorBakedModel; import com.vsngarcia.level.ElevatorContainer; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.model.loading.v1.ExtraModelKey; -import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; -import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier; -import net.fabricmc.fabric.api.client.model.loading.v1.SimpleUnbakedExtraModel; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; import net.minecraft.client.gui.screens.MenuScreens; -import net.minecraft.client.renderer.block.model.BlockStateModel; import net.minecraft.network.chat.Component; -import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.level.block.Block; -import static com.vsngarcia.fabric.FabricRegistry.ELEVATOR_BLOCKS; import static com.vsngarcia.fabric.FabricRegistry.ELEVATOR_CONTAINER; @Environment(EnvType.CLIENT) @@ -33,8 +20,8 @@ public final class ElevatorModFabricClient implements ClientModInitializer { public void onInitializeClient() { ClientTickEvents.END_CLIENT_TICK.register(client -> ElevatorHandler.handleInput(ClientPlayNetworking::send)); - ColorProviderRegistry.BLOCK.register(new ColorCamoElevator(), ELEVATOR_BLOCKS.values().toArray(new Block[0])); - ModelLoadingPlugin.register(new ElevatorModelLoadingPlugin()); +// ColorProviderRegistry.BLOCK.register(new ColorCamoElevator(), ELEVATOR_BLOCKS.values().toArray(new Block[0])); +// ModelLoadingPlugin.register(new ElevatorModelLoadingPlugin()); MenuScreens.register( ELEVATOR_CONTAINER, @@ -47,25 +34,25 @@ public void onInitializeClient() { ); } - public static class ElevatorModelLoadingPlugin implements ModelLoadingPlugin { - - public static final ExtraModelKey ARROW_MODEL_KEY = ExtraModelKey.create(() -> "arrow"); - private static final Identifier ARROW_MODEL_ID = Identifier.fromNamespaceAndPath(ElevatorMod.ID, "arrow"); - - @Override - public void initialize(Context ctx) { - ctx.modifyBlockModelAfterBake().register( - ModelModifier.WRAP_PHASE, (model, context) -> { - if (!(context.state().getBlock() instanceof ElevatorBlock)) { - return model; - } - - ElevatorMod.LOGGER.debug("Wrapping elevator model: {}", context.state()); - return new ElevatorBakedModel(model); - } - ); - - ctx.addModel(ARROW_MODEL_KEY, SimpleUnbakedExtraModel.blockStateModel(ARROW_MODEL_ID)); - } - } +// public static class ElevatorModelLoadingPlugin implements ModelLoadingPlugin { +// +// public static final ExtraModelKey ARROW_MODEL_KEY = ExtraModelKey.create(() -> "arrow"); +// private static final Identifier ARROW_MODEL_ID = Identifier.fromNamespaceAndPath(ElevatorMod.ID, "arrow"); +// +// @Override +// public void initialize(Context ctx) { +// ctx.modifyBlockModelAfterBake().register( +// ModelModifier.WRAP_PHASE, (model, context) -> { +// if (!(context.state().getBlock() instanceof ElevatorBlock)) { +// return model; +// } +// +// ElevatorMod.LOGGER.debug("Wrapping elevator model: {}", context.state()); +// return new ElevatorBakedModel(model); +// } +// ); +// +// ctx.addModel(ARROW_MODEL_KEY, SimpleUnbakedExtraModel.blockStateModel(ARROW_MODEL_ID)); +// } +// } } diff --git a/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java b/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java index 59d475b..1a16ea3 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java @@ -1,85 +1,85 @@ -package com.vsngarcia.fabric.client.render; - -import com.vsngarcia.fabric.client.ElevatorModFabricClient; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.model.loading.v1.wrapper.WrapperBlockStateModel; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; -import org.joml.Vector3f; - -import java.util.function.Predicate; - -import static com.vsngarcia.fabric.ElevatorBlock.DIRECTIONAL; -import static com.vsngarcia.fabric.ElevatorBlock.SHOW_ARROW; -import static net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING; - -@Environment(EnvType.CLIENT) -public class ElevatorBakedModel extends WrapperBlockStateModel { - private static final Minecraft MC = Minecraft.getInstance(); - - public ElevatorBakedModel(BlockStateModel originalModel) { - super(originalModel); - } - - @Override - public void emitQuads( - QuadEmitter emitter, - BlockAndTintGetter blockView, - BlockPos pos, - BlockState state, - RandomSource random, - Predicate cullTest - ) { - if (state != null && state.getValue(DIRECTIONAL) && state.getValue(SHOW_ARROW)) { - emitter.pushTransform(quad -> { - Vector3f vec = null; - for (int i = 0; i < 4; i++) { - vec = quad.copyPos(i, vec); - vec.sub(.5f, 0, .5f); - vec.rotateY((float) Math.toRadians(-state.getValue(FACING).toYRot())); - vec.add(.5f, 0, .5f); - - quad.pos(i, vec); - } - - quad.renderLayer(ChunkSectionLayer.CUTOUT); - - return true; - }); - - - var arrow = MC.getModelManager().getModel(ElevatorModFabricClient.ElevatorModelLoadingPlugin.ARROW_MODEL_KEY); - if (arrow != null) { - arrow.emitQuads(emitter, blockView, pos, state, random, cullTest); - } - - emitter.popTransform(); - } - - if (blockView.getBlockEntityRenderData(pos) instanceof BlockState heldState) { - emitter.pushTransform(quad -> { - quad.renderLayer(ItemBlockRenderTypes.getChunkRenderType(heldState)); - - return true; - }); - - MC.getBlockRenderer() - .getBlockModel(heldState) - .emitQuads(emitter, blockView, pos, heldState, random, cullTest); - - emitter.popTransform(); - return; - } - - super.emitQuads(emitter, blockView, pos, state, random, cullTest); - } -} +//package com.vsngarcia.fabric.client.render; +// +//import com.vsngarcia.fabric.client.ElevatorModFabricClient; +//import net.fabricmc.api.EnvType; +//import net.fabricmc.api.Environment; +//import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +//import net.minecraft.client.Minecraft; +//import net.minecraft.client.renderer.ItemBlockRenderTypes; +//import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +//import net.minecraft.client.renderer.block.model.BlockStateModelWrapper; +//import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +//import net.minecraft.core.BlockPos; +//import net.minecraft.core.Direction; +//import net.minecraft.util.RandomSource; +//import net.minecraft.world.level.BlockAndTintGetter; +//import net.minecraft.world.level.block.state.BlockState; +//import org.joml.Vector3f; +// +//import java.util.function.Predicate; +// +//import static com.vsngarcia.fabric.ElevatorBlock.DIRECTIONAL; +//import static com.vsngarcia.fabric.ElevatorBlock.SHOW_ARROW; +//import static net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING; +// +//@Environment(EnvType.CLIENT) +//public class ElevatorBakedModel extends BlockStateModelWrapper { +// private static final Minecraft MC = Minecraft.getInstance(); +// +// public ElevatorBakedModel(BlockStateModel originalModel) { +// super(originalModel); +// } +// +// @Override +// public void emitQuads( +// QuadEmitter emitter, +// BlockAndTintGetter blockView, +// BlockPos pos, +// BlockState state, +// RandomSource random, +// Predicate cullTest +// ) { +// if (state != null && state.getValue(DIRECTIONAL) && state.getValue(SHOW_ARROW)) { +// emitter.pushTransform(quad -> { +// Vector3f vec = null; +// for (int i = 0; i < 4; i++) { +// vec = quad.copyPos(i, vec); +// vec.sub(.5f, 0, .5f); +// vec.rotateY((float) Math.toRadians(-state.getValue(FACING).toYRot())); +// vec.add(.5f, 0, .5f); +// +// quad.pos(i, vec); +// } +// +// quad.renderLayer(ChunkSectionLayer.CUTOUT); +// +// return true; +// }); +// +// +// var arrow = MC.getModelManager().getModel(ElevatorModFabricClient.ElevatorModelLoadingPlugin.ARROW_MODEL_KEY); +// if (arrow != null) { +// arrow.emitQuads(emitter, blockView, pos, state, random, cullTest); +// } +// +// emitter.popTransform(); +// } +// +// if (blockView.getBlockEntityRenderData(pos) instanceof BlockState heldState) { +// emitter.pushTransform(quad -> { +// quad.renderLayer(ItemBlockRenderTypes.getChunkRenderType(heldState)); +// +// return true; +// }); +// +// MC.getBlockRenderer() +// .getBlockModel(heldState) +// .emitQuads(emitter, blockView, pos, heldState, random, cullTest); +// +// emitter.popTransform(); +// return; +// } +// +// super.emitQuads(emitter, blockView, pos, state, random, cullTest); +// } +//} diff --git a/fabric/src/main/java/com/vsngarcia/fabric/network/NetworkHandler.java b/fabric/src/main/java/com/vsngarcia/fabric/network/NetworkHandler.java index 8c5a4ec..6107bd8 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/network/NetworkHandler.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/network/NetworkHandler.java @@ -14,31 +14,31 @@ public class NetworkHandler { public static void init() { - PayloadTypeRegistry.playC2S().register(TeleportPacket.TYPE, TeleportPacket.STREAM_CODEC); + PayloadTypeRegistry.serverboundPlay().register(TeleportPacket.TYPE, TeleportPacket.STREAM_CODEC); ServerPlayNetworking.registerGlobalReceiver( TeleportPacket.TYPE, (pkt, ctx) -> TeleportPacket.handle(pkt, ctx.player(), FabricRegistry.TELEPORT_SOUND) ); - PayloadTypeRegistry.playC2S().register(SetDirectionalPacket.TYPE, SetDirectionalPacket.STREAM_CODEC); + PayloadTypeRegistry.serverboundPlay().register(SetDirectionalPacket.TYPE, SetDirectionalPacket.STREAM_CODEC); ServerPlayNetworking.registerGlobalReceiver( SetDirectionalPacket.TYPE, (pkt, ctx) -> SetDirectionalPacket.handle(pkt, ctx.player()) ); - PayloadTypeRegistry.playC2S().register(SetArrowPacket.TYPE, SetArrowPacket.STREAM_CODEC); + PayloadTypeRegistry.serverboundPlay().register(SetArrowPacket.TYPE, SetArrowPacket.STREAM_CODEC); ServerPlayNetworking.registerGlobalReceiver( SetArrowPacket.TYPE, (pkt, ctx) -> SetArrowPacket.handle(pkt, ctx.player()) ); - PayloadTypeRegistry.playC2S().register(RemoveCamoPacket.TYPE, RemoveCamoPacket.STREAM_CODEC); + PayloadTypeRegistry.serverboundPlay().register(RemoveCamoPacket.TYPE, RemoveCamoPacket.STREAM_CODEC); ServerPlayNetworking.registerGlobalReceiver( RemoveCamoPacket.TYPE, (pkt, ctx) -> RemoveCamoPacket.handle(pkt, ctx.player()) ); - PayloadTypeRegistry.playC2S().register(SetFacingPacket.TYPE, SetFacingPacket.STREAM_CODEC); + PayloadTypeRegistry.serverboundPlay().register(SetFacingPacket.TYPE, SetFacingPacket.STREAM_CODEC); ServerPlayNetworking.registerGlobalReceiver( SetFacingPacket.TYPE, (pkt, ctx) -> SetFacingPacket.handle(pkt, ctx.player()) diff --git a/fabric/src/main/java/com/vsngarcia/fabric/tile/ElevatorBlockEntity.java b/fabric/src/main/java/com/vsngarcia/fabric/tile/ElevatorBlockEntity.java index 0daf329..926bb0f 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/tile/ElevatorBlockEntity.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/tile/ElevatorBlockEntity.java @@ -4,8 +4,8 @@ import com.vsngarcia.fabric.FabricRegistry; import com.vsngarcia.level.ElevatorBlockEntityBase; import com.vsngarcia.level.ElevatorContainer; -import net.fabricmc.fabric.api.blockview.v2.RenderDataBlockEntity; -import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; +import net.fabricmc.fabric.api.blockgetter.v2.RenderDataBlockEntity; +import net.fabricmc.fabric.api.menu.v1.ExtendedMenuProvider; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; @@ -16,7 +16,7 @@ import org.jetbrains.annotations.Nullable; -public class ElevatorBlockEntity extends ElevatorBlockEntityBase implements RenderDataBlockEntity, ExtendedScreenHandlerFactory { +public class ElevatorBlockEntity extends ElevatorBlockEntityBase implements RenderDataBlockEntity, ExtendedMenuProvider { public ElevatorBlockEntity(BlockPos pos, BlockState state) { super(FabricRegistry.ELEVATOR_BLOCK_ENTITY_TYPE, pos, state); } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 1374140..68c688c 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -21,14 +21,15 @@ "com.vsngarcia.fabric.client.ElevatorModFabricClient" ] }, + "accessWidener": "elevatormod.classtweaker", "mixins": [ "elevatorid.mixins.json" ], "depends": { "fabricloader": ">=0.18.0", - "minecraft": "~1.21.11", - "java": ">=21", + "minecraft": "~26.1", + "java": ">=25", "fabric-api": "*", - "forgeconfigapiport": ">=21.11.0" + "forgeconfigapiport": ">=26.1.0.0" } } diff --git a/gradle.properties b/gradle.properties index 867d9b3..0279623 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,17 +2,17 @@ org.gradle.jvmargs=-Xmx2G org.gradle.parallel=true -minecraft_version=1.21.11 +minecraft_version=26.1 # Mod properties -mod_version=1.21.11-1.15.0 +mod_version=26.1-1.16.1 maven_group=com.vsngarcia archives_name=elevatorid enabled_platforms=fabric,neoforge # Dependencies -fabric_loader_version=0.18.2 -fabric_api_version=0.140.0+1.21.11 -neoforge_version=21.11.6-beta +fabric_loader_version=0.18.5 +fabric_api_version=0.144.3+26.1 +neoforge_version=26.1.0.8-beta -forge_config_api_port_version=21.11.1 +forge_config_api_port_version=26.1.0.1 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e2847c8..c04f8a9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ +#Fri Mar 27 19:53:55 WET 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip -networkTimeout=10000 -validateDistributionUrl=true +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/build.gradle b/neoforge/build.gradle deleted file mode 100644 index 1f44922..0000000 --- a/neoforge/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -plugins { - id 'com.github.johnrengelman.shadow' -} - -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - -architectury { - platformSetupLoomIde() - neoForge() -} - -configurations { - common { - canBeResolved = true - canBeConsumed = false - } - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentNeoForge.extendsFrom common - - // Files in this configuration will be bundled into your mod using the Shadow plugin. - // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. - shadowBundle { - canBeResolved = true - canBeConsumed = false - } -} - -repositories { - maven { - name = 'NeoForged' - url = 'https://maven.neoforged.net/releases' - } -} - -dependencies { - neoForge "net.neoforged:neoforge:$rootProject.neoforge_version" - - common(project(path: ':common', configuration: 'namedElements')) { transitive false } - shadowBundle project(path: ':common', configuration: 'transformProductionNeoForge') -} - -processResources { - inputs.property 'version', project.version - - filesMatching('META-INF/neoforge.mods.toml') { - expand version: project.version - } -} - -shadowJar { - configurations = [project.configurations.shadowBundle] - archiveClassifier = 'dev-shadow' -} - -remapJar { - atAccessWideners.add "elevatormod.accesswidener" - input.set shadowJar.archiveFile -} diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts new file mode 100644 index 0000000..7207a64 --- /dev/null +++ b/neoforge/build.gradle.kts @@ -0,0 +1,67 @@ +plugins { + id("com.gradleup.shadow") +} + +//loom { +// accessWidenerPath = project(":common").loom.accessWidenerPath +//} + +architectury { + platformSetupLoomIde() + neoForge() +} + +val common by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false +} + +val shadowBundle by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false +} + +configurations { + compileClasspath.get().extendsFrom(common) + runtimeClasspath.get().extendsFrom(common) + getByName("developmentNeoForge").extendsFrom(common) +} + +repositories { + maven { + name = "NeoForged" + url = uri("https://maven.neoforged.net/releases") + } +} + +dependencies { + neoForge("net.neoforged:neoforge:${property("neoforge_version")}") + + common(project(path = ":common")) { isTransitive = false } + shadowBundle(project(path = ":common", configuration = "transformProductionNeoForge")) +} + +tasks.processResources { + inputs.property("version", project.version) + + filesMatching("META-INF/neoforge.mods.toml") { + expand("version" to project.version) + } +} + +tasks.jar { + archiveClassifier = "raw" +} + +tasks.shadowJar { + dependsOn(tasks.jar) + //mainSpec.sourcePaths.clear() + from(zipTree(tasks.jar.get().archiveFile)) + configurations = listOf(shadowBundle) + archiveClassifier = null +} + +//remapJar { +// atAccessWideners.add "elevatormod.accesswidener" +// input.set shadowJar.archiveFile +//} diff --git a/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java b/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java index c28e062..b6f2ec7 100644 --- a/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java +++ b/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.BlockAndLightGetter; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.SignalGetter; @@ -73,7 +73,7 @@ public float getFriction(BlockState state, LevelReader level, BlockPos pos, Enti @Override public BlockState getAppearance( BlockState state, - BlockAndTintGetter level, + BlockAndLightGetter level, BlockPos pos, Direction side, BlockState queryState, diff --git a/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java b/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java index cbf60d1..7456e91 100644 --- a/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java +++ b/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java @@ -7,10 +7,8 @@ import com.vsngarcia.neoforge.ElevatorBlock; import com.vsngarcia.neoforge.client.render.ElevatorBakedModel; import com.vsngarcia.neoforge.init.Registry; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.client.renderer.block.dispatch.BlockModelRotation; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; @@ -19,7 +17,6 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.ModelEvent; import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; @@ -28,6 +25,7 @@ import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.registries.DeferredHolder; +import java.util.Collections; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -46,18 +44,18 @@ public static void onMenuScreensRegistry(RegisterMenuScreensEvent e) { e.register(Registry.ELEVATOR_CONTAINER.get(), (ElevatorContainer container, Inventory inv, Component title) -> new ElevatorScreen(container, inv, title, ClientPacketDistributor::sendToServer)); } - @SubscribeEvent - public static void onFMLClientSetup(FMLClientSetupEvent event) { - // HACK: As far as I was able to understand, vanilla blocks use a specific logic for determining render types - // I think that for now it can't detect mimics getAppearance - // For now we just use TRANSLUCENT, which is not ideal but covers most cases - Registry.ELEVATOR_BLOCKS.values().forEach(b -> ItemBlockRenderTypes.setRenderLayer(b.get(), ChunkSectionLayer.TRANSLUCENT)); - } +// @SubscribeEvent +// public static void onFMLClientSetup(FMLClientSetupEvent event) { +// // HACK: As far as I was able to understand, vanilla blocks use a specific logic for determining render types +// // I think that for now it can't detect mimics getAppearance +// // For now we just use TRANSLUCENT, which is not ideal but covers most cases +// Registry.ELEVATOR_BLOCKS.values().forEach(b -> ItemBlockRenderTypes.setRenderLayer(b.get(), ChunkSectionLayer.TRANSLUCENT)); +// } @SubscribeEvent - public static void onBlockColorHandlersRegistry(RegisterColorHandlersEvent.Block e) { - e.register(new ColorCamoElevator(), Registry.ELEVATOR_BLOCKS.values().stream().map(DeferredHolder::get).toArray(ElevatorBlock[]::new)); + public static void onBlockColorHandlersRegistry(RegisterColorHandlersEvent.BlockTintSources e) { + e.register(Collections.singletonList(new ColorCamoElevator()), Registry.ELEVATOR_BLOCKS.values().stream().map(DeferredHolder::get).toArray(ElevatorBlock[]::new)); } @SubscribeEvent diff --git a/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java b/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java index 36cde0c..631419a 100644 --- a/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java +++ b/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java @@ -3,17 +3,16 @@ import com.vsngarcia.neoforge.ElevatorBlock; import com.vsngarcia.neoforge.client.ClientRegistry; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.BlockModelPart; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; +import net.minecraft.client.resources.model.sprite.Material; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.model.DelegateBlockStateModel; import net.neoforged.neoforge.model.data.ModelProperty; -import javax.annotation.Nonnull; import java.util.List; @@ -25,19 +24,20 @@ public ElevatorBakedModel(BlockStateModel originalModel) { } - @Nonnull @Override - public TextureAtlasSprite particleIcon(BlockAndTintGetter level, BlockPos pos, BlockState elevator) { - BlockState state = level.getModelData(pos).get(HELD_STATE); - if (state != null) { - return Minecraft.getInstance().getBlockRenderer().getBlockModel(state).particleIcon(level, pos, state); + public Material.Baked particleMaterial(BlockAndTintGetter level, BlockPos pos, BlockState state) { + BlockState heldState = level.getModelData(pos).get(HELD_STATE); + + if (heldState != null) { + return Minecraft.getInstance().getModelManager().getBlockStateModelSet().get(heldState).particleMaterial(level, pos, heldState); } - return super.particleIcon(level, pos, elevator); + return super.particleMaterial(level, pos, state); } + @Override - public void collectParts(BlockAndTintGetter level, BlockPos pos, BlockState state, RandomSource random, List parts) { + public void collectParts(BlockAndTintGetter level, BlockPos pos, BlockState state, RandomSource random, List parts) { // Directional arrow if (state.getValue(ElevatorBlock.DIRECTIONAL) && state.getValue(ElevatorBlock.SHOW_ARROW)) { var arrowModel = Minecraft.getInstance() @@ -50,7 +50,7 @@ public void collectParts(BlockAndTintGetter level, BlockPos pos, BlockState stat BlockState heldState = level.getModelData(pos).get(HELD_STATE); if (heldState != null) { - BlockStateModel blockModel = Minecraft.getInstance().getBlockRenderer().getBlockModel(heldState); + BlockStateModel blockModel = Minecraft.getInstance().getModelManager().getBlockStateModelSet().get(heldState); blockModel.collectParts(level, pos, heldState, random, parts); diff --git a/neoforge/src/main/resources/META-INF/accesstransformer.cfg b/neoforge/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 0000000..48a42a8 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,2 @@ +# TODO: Temporarily maintain ClassTweaker for Fabric and AccessTransformer for NeoForge +public net.minecraft.client.gui.components.Checkbox selected diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index bdab609..b28011c 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -15,14 +15,14 @@ description = '''Simple port of the elevator from OpenBlocks to 1.8+''' [[dependencies.elevatorid]] modId = "neoforge" type = "required" -versionRange = "[21.11.0-beta,)" +versionRange = "[26.1.0.1-beta,)" ordering = "NONE" side = "BOTH" [[dependencies.elevatorid]] modId = "minecraft" type = "required" -versionRange = "[1.21.11,)" +versionRange = "[26.1,)" ordering = "NONE" side = "BOTH" diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 6391517..0000000 --- a/settings.gradle +++ /dev/null @@ -1,14 +0,0 @@ -pluginManagement { - repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.architectury.dev/" } - maven { url "https://files.minecraftforge.net/maven/" } - gradlePluginPortal() - } -} - -rootProject.name = 'elevatorid' - -include 'common' -include 'fabric' -include 'neoforge' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..e25913e --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,14 @@ +pluginManagement { + repositories { + maven { url = uri("https://maven.fabricmc.net/") } + maven { url = uri("https://maven.architectury.dev/") } + maven { url = uri("https://files.minecraftforge.net/maven/") } + gradlePluginPortal() + } +} + +rootProject.name = "elevatorid" + +include("common") +include("fabric") +include("neoforge") From 6297d76c14c6462f60456bba884c9f47f9dd15a5 Mon Sep 17 00:00:00 2001 From: Vasco Garcia Date: Sat, 28 Mar 2026 18:37:14 +0000 Subject: [PATCH 2/9] fix: Crash in `collectParts` due to non-ElevatorBlock being passed in --- .github/workflows/build.yml | 2 +- .../vsngarcia/neoforge/client/render/ElevatorBakedModel.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5b3fcf7..96676e7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,7 +9,7 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 21 + - name: Set up JDK uses: actions/setup-java@v4 with: java-version: '25' diff --git a/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java b/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java index 631419a..bf0ee09 100644 --- a/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java +++ b/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java @@ -38,6 +38,11 @@ public Material.Baked particleMaterial(BlockAndTintGetter level, BlockPos pos, B @Override public void collectParts(BlockAndTintGetter level, BlockPos pos, BlockState state, RandomSource random, List parts) { + if (!(state.getBlock() instanceof ElevatorBlock)) { + super.collectParts(level, pos, state, random, parts); + return; + } + // Directional arrow if (state.getValue(ElevatorBlock.DIRECTIONAL) && state.getValue(ElevatorBlock.SHOW_ARROW)) { var arrowModel = Minecraft.getInstance() From 83f905148c269517fd9f7639c81615d944a0ebc9 Mon Sep 17 00:00:00 2001 From: Vasco Garcia Date: Sat, 28 Mar 2026 18:38:01 +0000 Subject: [PATCH 3/9] chore: Bump mod version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0279623..0822823 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.parallel=true minecraft_version=26.1 # Mod properties -mod_version=26.1-1.16.1 +mod_version=26.1-1.16.2 maven_group=com.vsngarcia archives_name=elevatorid enabled_platforms=fabric,neoforge From 9a403c815426ed25fe1a10859e6fcc68e2b478b1 Mon Sep 17 00:00:00 2001 From: Vasco Garcia Date: Sat, 28 Mar 2026 20:16:24 +0000 Subject: [PATCH 4/9] refactor: Simplify Gradle configurations --- build.gradle.kts | 44 ++++++++++++++++++++++++++----------- fabric/build.gradle.kts | 46 +++------------------------------------ neoforge/build.gradle.kts | 40 ++++------------------------------ 3 files changed, 38 insertions(+), 92 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2be2328..6eb5c50 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,11 +23,8 @@ subprojects { } repositories { - // Add repositories to retrieve artifacts from in here. // You should only use this when depending on other mods because // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. - // See https://docs.gradle.org/current/userguide/declaring_repositories.html - // for more information about repositories. exclusiveContent { forRepository { @@ -51,20 +48,41 @@ subprojects { "minecraft"("net.minecraft:minecraft:${property("minecraft_version")}") } -// tasks.java { -// // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task -// // if it is present. -// // If you remove this line, sources will not be generated. -// withSourcesJar() -// -// sourceCompatibility = JavaVersion.VERSION_21 -// targetCompatibility = JavaVersion.VERSION_21 -// } - tasks.withType().configureEach { options.release = 25 } + if (project.name != "common") { + apply(plugin = "com.gradleup.shadow") + + val common by configurations.creating { isCanBeResolved = true; isCanBeConsumed = false } + val shadowBundle by configurations.creating { isCanBeResolved = true; isCanBeConsumed = false } + + configurations { + getByName("compileClasspath").extendsFrom(common) + getByName("runtimeClasspath").extendsFrom(common) + } + + tasks.named("jar") { + archiveClassifier = "raw" + } + + + tasks.named("shadowJar") { + dependsOn(tasks.named("jar")) + from(zipTree(tasks.named("jar").get().archiveFile)) + configurations = listOf(shadowBundle) + archiveClassifier = null + + val sourceSets = project.extensions.getByType() + val mainOutput = sourceSets.getByName("main").output + exclude { element -> + mainOutput.classesDirs.any { element.file.startsWith(it) } || + element.file.startsWith(mainOutput.resourcesDir!!) + } + } + } + // Configure Maven publishing. // publishing { // publications { diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 770c6ff..7ed4d98 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -1,7 +1,3 @@ -plugins { - id("com.gradleup.shadow") -} - loom { accessWidenerPath = project(":common").loom.accessWidenerPath } @@ -11,31 +7,17 @@ architectury { fabric() } -val common by configurations.creating { - isCanBeResolved = true - isCanBeConsumed = false -} - -val shadowBundle by configurations.creating { - isCanBeResolved = true - isCanBeConsumed = false -} - configurations { - compileClasspath.get().extendsFrom(common) - runtimeClasspath.get().extendsFrom(common) - getByName("developmentFabric").extendsFrom(common) + named("developmentFabric") { extendsFrom(configurations.getByName("common")) } } dependencies { api("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") - - // Fabric API. This is technically optional, but you probably want it anyway. api("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") - common(project(path = ":common")) { isTransitive = false } - shadowBundle(project(path = ":common", configuration = "transformProductionFabric")) + "common"(project(path = ":common")) { isTransitive = false } + "shadowBundle"(project(path = ":common", configuration = "transformProductionFabric")) api("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:${property("forge_config_api_port_version")}") include("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:${property("forge_config_api_port_version")}") @@ -55,25 +37,3 @@ tasks.processResources { // This may not be needed in a future Architectury release. from(project(":common").loom.accessWidenerPath) } - -tasks.jar { - archiveClassifier = "raw" -} - -tasks.shadowJar { - dependsOn(tasks.jar) - from(zipTree(tasks.jar.get().archiveFile)) - configurations = listOf(shadowBundle) - archiveClassifier = null - - val mainOutput = sourceSets.main.get().output - exclude { element -> - mainOutput.classesDirs.any { element.file.startsWith(it) } || - element.file.startsWith(mainOutput.resourcesDir!!) - } -} - -//remapJar { -// injectAccessWidener = true -// input.set shadowJar.archiveFile -//} diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 7207a64..2c885b2 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,7 +1,4 @@ -plugins { - id("com.gradleup.shadow") -} - +// TODO: Maintaining AT for now //loom { // accessWidenerPath = project(":common").loom.accessWidenerPath //} @@ -11,20 +8,8 @@ architectury { neoForge() } -val common by configurations.creating { - isCanBeResolved = true - isCanBeConsumed = false -} - -val shadowBundle by configurations.creating { - isCanBeResolved = true - isCanBeConsumed = false -} - configurations { - compileClasspath.get().extendsFrom(common) - runtimeClasspath.get().extendsFrom(common) - getByName("developmentNeoForge").extendsFrom(common) + named("developmentNeoForge") { extendsFrom(configurations.getByName("common")) } } repositories { @@ -37,8 +22,8 @@ repositories { dependencies { neoForge("net.neoforged:neoforge:${property("neoforge_version")}") - common(project(path = ":common")) { isTransitive = false } - shadowBundle(project(path = ":common", configuration = "transformProductionNeoForge")) + "common"(project(path = ":common")) { isTransitive = false } + "shadowBundle"(project(path = ":common", configuration = "transformProductionNeoForge")) } tasks.processResources { @@ -48,20 +33,3 @@ tasks.processResources { expand("version" to project.version) } } - -tasks.jar { - archiveClassifier = "raw" -} - -tasks.shadowJar { - dependsOn(tasks.jar) - //mainSpec.sourcePaths.clear() - from(zipTree(tasks.jar.get().archiveFile)) - configurations = listOf(shadowBundle) - archiveClassifier = null -} - -//remapJar { -// atAccessWideners.add "elevatormod.accesswidener" -// input.set shadowJar.archiveFile -//} From 89f2f56ad35e68222f16e819c937e8bd1821bafb Mon Sep 17 00:00:00 2001 From: Vasco Garcia Date: Sun, 29 Mar 2026 17:26:08 +0100 Subject: [PATCH 5/9] fix: Transparent pixel in arrow texture --- .../assets/elevatorid/textures/block/arrow.png | Bin 2567 -> 310 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/common/src/main/resources/assets/elevatorid/textures/block/arrow.png b/common/src/main/resources/assets/elevatorid/textures/block/arrow.png index 4da322ba7d7d2c91e124331337221228a882a2b8..0c50c872be6f76507f1cb9ab46e1bcaa4328233f 100644 GIT binary patch delta 275 zcmZn{*~TEaktF=y-Ky}XAE1l-OCO_4oeaFVdQ&MBb@0Btm9z5oCK delta 2549 zcmVr~F00#bgR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}#aU^R^B}VPU#FNOh#ii@8ZkF`$A4KM$+qN0OMfwPw~>&lC^8cYEUN$a-$wtz zp@W@B8|Q7XcEX{94l?4zPvaP+m~{W{hn{cY`lX)M8xmCtrGFZiw$9H-)SHKan+-&I zttXdfKYn&3R>%EN+%lh+Imp?OlA~VC*A!-hXrH<>|I0kPot#R_NXUxSnnBo0iDb1CHTn>6YE#G}jBWsaI<= z@+Bf6*OuiA)qh^d>G^oVueIV^tD|>OTLN5m?$pwieuf7VT&Zqm@p1S!ICuRM@bOce zGFU6U0^FtG{@nhvu^2ji56i)6$@TdMP{CPR2s&qG?cGCKf7Xxktdp}@dog)+j5 z$w}#i0FEB~L_`je%LE35AtMW-lv*hZa=hfWVdF%9RvI~~F};8YqbvrA=K%z=v^Lse zym?3{l7CS~8)K|-#+zWGRaRSLt#y{?spyo`&N%Cw^DemPmDk>Q>z(&L_!wkRn8pkR z8(i=qgc#9i)DgZSo{y+VGO47KNjACUQ%EsGK3QjzZFbq`kYkZW6-)tCY;nbxP+}Do zQmVR|YOAZhh8i2R)>PBYG}~PBEws3@HnaN5+JBb0@2rWLHQ9;c=iGxeR6Do05Imh2 z<_wHUEx@>A1|Vq3oK0S6EtxsyYzk75Qbr<5!{ijfjDbO2g)~j9+&!54$QuFOv%JZ7 z%n?)f7t9e;_r%PYn*r!|73F1)*Off?$3_mO+VM21l8WdpEtkwYjVLt}|2Qa5$-`oG<0oCmR$~!pd3?9?7{RR-ahR7Ze`i96S zJl?@UAMiM>Bsy;JU2$|=a^Dq4cYgqW#+Qyu?z`gXxa7Voj*d(2yW;2?B74Qr6+GT4 zj{ag&+c~;3$r4Tw zSVB_F6iCe2sM{Jew%M$n?th0-@1#@rGIPed8Gf);cZ2ipiBY%16aR=G7Tlj=8oQ&D zF%3OKhEFj;N0(zV&pZ+DsTZo2J@rb~GgW({UU;H)SHBW9cJ=S5LTARV`kxANIk_uL zdfVX(!lXr+cZErdGVcnL9;4-+FzGQ`?g^6?qV5WlR-$eS^X~nNgNw7S4z7YA_yOYL z>ZIr*CH^ldw10^4;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<-o+5yUY1AtER-Q%|H9 zGw>W=_we!cF3PjK&;2=imAuISpGZ8%bi*RvAfDN@bk6(4VOEk9;&bA0gDyz?$aUG} zH_ki6e@tQNECMS%2ZY#aXS?SnHnrg`vE*lIA+i z5yY{C1d`N|j2g+gyEO|_lWtNd z26VsJ_Qxm?*aez(+x|Yb?dA#Ke+I6!w!hi{WoO54hX`2A_1v zkQ~WRQ${EhfcG={rW`PE3-qkHy|wmn`T%68tK}Qu;1C!qQueyXyMvv*{d=a>-w$hg za-_J2AXESV00v@9M??Vs0RI60puMM)kuDg22XskIMF-;u8xSQJ4Arv|0002`Nkl!DInX@FyksW_URP)$mdRI^bmlbiqpq=!9<<&<)=zKmoo@fC_wn zivT6~asg`ar2-V;&CEU`@ZS#jk|#j*&X)*KhfftS0X|K@6!;VYli-gFmSu>F{0&>zBk>6s;a}tCz(UC9pNtS%t0M995A(gM`Yw ze07UVrv%#MOfah(CErR=TwzX;V9CuS(&Hqo{%3%{MhGE Date: Sun, 29 Mar 2026 17:27:05 +0100 Subject: [PATCH 6/9] chore: Minor cleanup and comment --- build.gradle.kts | 7 ++----- .../java/com/vsngarcia/client/ColorCamoElevator.java | 1 + .../java/com/vsngarcia/client/gui/ElevatorScreen.java | 4 ++-- .../com/vsngarcia/neoforge/client/ClientRegistry.java | 9 --------- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6eb5c50..9460e80 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -67,15 +67,12 @@ subprojects { archiveClassifier = "raw" } - tasks.named("shadowJar") { - dependsOn(tasks.named("jar")) from(zipTree(tasks.named("jar").get().archiveFile)) configurations = listOf(shadowBundle) - archiveClassifier = null + archiveClassifier = "" - val sourceSets = project.extensions.getByType() - val mainOutput = sourceSets.getByName("main").output + val mainOutput = project.the()["main"].output exclude { element -> mainOutput.classesDirs.any { element.file.startsWith(it) } || element.file.startsWith(mainOutput.resourcesDir!!) diff --git a/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java b/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java index 8807e84..415bfec 100644 --- a/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java +++ b/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java @@ -26,6 +26,7 @@ public int colorInWorld(BlockState state, BlockAndTintGetter level, BlockPos pos return color(state); } + // TODO: Use just layer 0 for now BlockTintSource tintSource = Minecraft.getInstance().getBlockColors().getTintSource(heldState, 0); if (tintSource != null) { return tintSource.colorInWorld(heldState, level, pos); diff --git a/common/src/main/java/com/vsngarcia/client/gui/ElevatorScreen.java b/common/src/main/java/com/vsngarcia/client/gui/ElevatorScreen.java index f669c54..9a43d2f 100644 --- a/common/src/main/java/com/vsngarcia/client/gui/ElevatorScreen.java +++ b/common/src/main/java/com/vsngarcia/client/gui/ElevatorScreen.java @@ -22,8 +22,8 @@ public class ElevatorScreen extends AbstractContainerScreen { private final Identifier GUI_TEXTURE = Identifier.fromNamespaceAndPath( - ElevatorMod.ID, - "textures/gui/elevator_gui.png" + ElevatorMod.ID, + "textures/gui/elevator_gui.png" ); private final ElevatorBlockEntityBase tile; private final Direction playerFacing; diff --git a/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java b/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java index 7456e91..e9971d7 100644 --- a/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java +++ b/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java @@ -44,15 +44,6 @@ public static void onMenuScreensRegistry(RegisterMenuScreensEvent e) { e.register(Registry.ELEVATOR_CONTAINER.get(), (ElevatorContainer container, Inventory inv, Component title) -> new ElevatorScreen(container, inv, title, ClientPacketDistributor::sendToServer)); } -// @SubscribeEvent -// public static void onFMLClientSetup(FMLClientSetupEvent event) { -// // HACK: As far as I was able to understand, vanilla blocks use a specific logic for determining render types -// // I think that for now it can't detect mimics getAppearance -// // For now we just use TRANSLUCENT, which is not ideal but covers most cases -// Registry.ELEVATOR_BLOCKS.values().forEach(b -> ItemBlockRenderTypes.setRenderLayer(b.get(), ChunkSectionLayer.TRANSLUCENT)); -// } - - @SubscribeEvent public static void onBlockColorHandlersRegistry(RegisterColorHandlersEvent.BlockTintSources e) { e.register(Collections.singletonList(new ColorCamoElevator()), Registry.ELEVATOR_BLOCKS.values().stream().map(DeferredHolder::get).toArray(ElevatorBlock[]::new)); From 260d401634f47a3046809586069c7cb3b449d55e Mon Sep 17 00:00:00 2001 From: Vasco Garcia Date: Thu, 2 Apr 2026 22:08:54 +0100 Subject: [PATCH 7/9] feat: Update to 26.1.1 & use new FRAPI --- .../client/ElevatorModFabricClient.java | 61 +++--- .../client/render/ElevatorBakedModel.java | 183 ++++++++++-------- gradle.properties | 12 +- 3 files changed, 142 insertions(+), 114 deletions(-) diff --git a/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java b/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java index ea6f204..3790a77 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java @@ -1,17 +1,32 @@ package com.vsngarcia.fabric.client; import com.vsngarcia.ElevatorHandler; +import com.vsngarcia.ElevatorMod; +import com.vsngarcia.client.ColorCamoElevator; import com.vsngarcia.client.gui.ElevatorScreen; +import com.vsngarcia.fabric.ElevatorBlock; +import com.vsngarcia.fabric.client.render.ElevatorBakedModel; import com.vsngarcia.level.ElevatorContainer; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.model.loading.v1.ExtraModelKey; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier; +import net.fabricmc.fabric.api.client.model.loading.v1.SimpleUnbakedExtraModel; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.client.rendering.v1.BlockColorRegistry; import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.level.block.Block; +import java.util.List; + +import static com.vsngarcia.fabric.FabricRegistry.ELEVATOR_BLOCKS; import static com.vsngarcia.fabric.FabricRegistry.ELEVATOR_CONTAINER; @Environment(EnvType.CLIENT) @@ -20,8 +35,8 @@ public final class ElevatorModFabricClient implements ClientModInitializer { public void onInitializeClient() { ClientTickEvents.END_CLIENT_TICK.register(client -> ElevatorHandler.handleInput(ClientPlayNetworking::send)); -// ColorProviderRegistry.BLOCK.register(new ColorCamoElevator(), ELEVATOR_BLOCKS.values().toArray(new Block[0])); -// ModelLoadingPlugin.register(new ElevatorModelLoadingPlugin()); + BlockColorRegistry.register(List.of(new ColorCamoElevator()), ELEVATOR_BLOCKS.values().toArray(new Block[0])); + ModelLoadingPlugin.register(new ElevatorModelLoadingPlugin()); MenuScreens.register( ELEVATOR_CONTAINER, @@ -34,25 +49,25 @@ public void onInitializeClient() { ); } -// public static class ElevatorModelLoadingPlugin implements ModelLoadingPlugin { -// -// public static final ExtraModelKey ARROW_MODEL_KEY = ExtraModelKey.create(() -> "arrow"); -// private static final Identifier ARROW_MODEL_ID = Identifier.fromNamespaceAndPath(ElevatorMod.ID, "arrow"); -// -// @Override -// public void initialize(Context ctx) { -// ctx.modifyBlockModelAfterBake().register( -// ModelModifier.WRAP_PHASE, (model, context) -> { -// if (!(context.state().getBlock() instanceof ElevatorBlock)) { -// return model; -// } -// -// ElevatorMod.LOGGER.debug("Wrapping elevator model: {}", context.state()); -// return new ElevatorBakedModel(model); -// } -// ); -// -// ctx.addModel(ARROW_MODEL_KEY, SimpleUnbakedExtraModel.blockStateModel(ARROW_MODEL_ID)); -// } -// } + public static class ElevatorModelLoadingPlugin implements ModelLoadingPlugin { + + public static final ExtraModelKey ARROW_MODEL_KEY = ExtraModelKey.create(() -> "arrow"); + private static final Identifier ARROW_MODEL_ID = Identifier.fromNamespaceAndPath(ElevatorMod.ID, "arrow"); + + @Override + public void initialize(Context ctx) { + ctx.modifyBlockModelAfterBake().register( + ModelModifier.WRAP_PHASE, (model, context) -> { + if (!(context.state().getBlock() instanceof ElevatorBlock)) { + return model; + } + + ElevatorMod.LOGGER.debug("Wrapping elevator model: {}", context.state()); + return new ElevatorBakedModel(model); + } + ); + + ctx.addModel(ARROW_MODEL_KEY, SimpleUnbakedExtraModel.blockStateModel(ARROW_MODEL_ID)); + } + } } diff --git a/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java b/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java index 1a16ea3..f12dbbe 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java @@ -1,85 +1,98 @@ -//package com.vsngarcia.fabric.client.render; -// -//import com.vsngarcia.fabric.client.ElevatorModFabricClient; -//import net.fabricmc.api.EnvType; -//import net.fabricmc.api.Environment; -//import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -//import net.minecraft.client.Minecraft; -//import net.minecraft.client.renderer.ItemBlockRenderTypes; -//import net.minecraft.client.renderer.block.dispatch.BlockStateModel; -//import net.minecraft.client.renderer.block.model.BlockStateModelWrapper; -//import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -//import net.minecraft.core.BlockPos; -//import net.minecraft.core.Direction; -//import net.minecraft.util.RandomSource; -//import net.minecraft.world.level.BlockAndTintGetter; -//import net.minecraft.world.level.block.state.BlockState; -//import org.joml.Vector3f; -// -//import java.util.function.Predicate; -// -//import static com.vsngarcia.fabric.ElevatorBlock.DIRECTIONAL; -//import static com.vsngarcia.fabric.ElevatorBlock.SHOW_ARROW; -//import static net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING; -// -//@Environment(EnvType.CLIENT) -//public class ElevatorBakedModel extends BlockStateModelWrapper { -// private static final Minecraft MC = Minecraft.getInstance(); -// -// public ElevatorBakedModel(BlockStateModel originalModel) { -// super(originalModel); -// } -// -// @Override -// public void emitQuads( -// QuadEmitter emitter, -// BlockAndTintGetter blockView, -// BlockPos pos, -// BlockState state, -// RandomSource random, -// Predicate cullTest -// ) { -// if (state != null && state.getValue(DIRECTIONAL) && state.getValue(SHOW_ARROW)) { -// emitter.pushTransform(quad -> { -// Vector3f vec = null; -// for (int i = 0; i < 4; i++) { -// vec = quad.copyPos(i, vec); -// vec.sub(.5f, 0, .5f); -// vec.rotateY((float) Math.toRadians(-state.getValue(FACING).toYRot())); -// vec.add(.5f, 0, .5f); -// -// quad.pos(i, vec); -// } -// -// quad.renderLayer(ChunkSectionLayer.CUTOUT); -// -// return true; -// }); -// -// -// var arrow = MC.getModelManager().getModel(ElevatorModFabricClient.ElevatorModelLoadingPlugin.ARROW_MODEL_KEY); -// if (arrow != null) { -// arrow.emitQuads(emitter, blockView, pos, state, random, cullTest); -// } -// -// emitter.popTransform(); -// } -// -// if (blockView.getBlockEntityRenderData(pos) instanceof BlockState heldState) { -// emitter.pushTransform(quad -> { -// quad.renderLayer(ItemBlockRenderTypes.getChunkRenderType(heldState)); -// -// return true; -// }); -// -// MC.getBlockRenderer() -// .getBlockModel(heldState) -// .emitQuads(emitter, blockView, pos, heldState, random, cullTest); -// -// emitter.popTransform(); -// return; -// } -// -// super.emitQuads(emitter, blockView, pos, state, random, cullTest); -// } -//} +package com.vsngarcia.fabric.client.render; + +import com.vsngarcia.fabric.ElevatorBlock; +import com.vsngarcia.fabric.client.ElevatorModFabricClient; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.model.loading.v1.wrapper.WrapperBlockStateModel; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.resources.model.sprite.Material; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; +import org.joml.Vector3f; + +import java.util.function.Predicate; + +import static com.vsngarcia.fabric.ElevatorBlock.DIRECTIONAL; +import static com.vsngarcia.fabric.ElevatorBlock.SHOW_ARROW; +import static net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING; + +@Environment(EnvType.CLIENT) +public class ElevatorBakedModel extends WrapperBlockStateModel { + private static final Minecraft MC = Minecraft.getInstance(); + + public ElevatorBakedModel(BlockStateModel originalModel) { + super(originalModel); + } + + @Override + public void emitQuads( + QuadEmitter emitter, + BlockAndTintGetter blockView, + BlockPos pos, + BlockState state, + RandomSource random, + Predicate cullTest + ) { + if (!(state.getBlock() instanceof ElevatorBlock)) { + super.emitQuads(emitter, blockView, pos, state, random, cullTest); + return; + } + + + if (state.getValue(DIRECTIONAL) && state.getValue(SHOW_ARROW)) { + emitter.pushTransform(quad -> { + Vector3f vec = null; + for (int i = 0; i < 4; i++) { + vec = quad.copyPos(i, vec); + vec.sub(.5f, 0, .5f); + vec.rotateY((float) Math.toRadians(-state.getValue(FACING).toYRot())); + vec.add(.5f, 0, .5f); + + quad.pos(i, vec); + } + + quad.chunkLayer(ChunkSectionLayer.CUTOUT); + + return true; + }); + + + var arrow = MC.getModelManager().getModel(ElevatorModFabricClient.ElevatorModelLoadingPlugin.ARROW_MODEL_KEY); + if (arrow != null) { + arrow.emitQuads(emitter, blockView, pos, state, random, cullTest); + } + + emitter.popTransform(); + } + + if (blockView.getBlockEntityRenderData(pos) instanceof BlockState heldState) { + MC.getModelManager() + .getBlockStateModelSet() + .get(heldState) + .emitQuads(emitter, blockView, pos, heldState, random, cullTest); + return; + } + + super.emitQuads(emitter, blockView, pos, state, random, cullTest); + } + + @Override + public Material.Baked particleMaterial(BlockAndTintGetter level, BlockPos pos, BlockState state) { + if (level != BlockAndTintGetter.EMPTY + && level.getBlockEntityRenderData(pos) instanceof BlockState heldState) { + return MC.getModelManager() + .getBlockStateModelSet() + .get(heldState) + .particleMaterial(level, pos, heldState); + } + + return super.particleMaterial(level, pos, state); + } +} diff --git a/gradle.properties b/gradle.properties index 0822823..b842fdd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,17 +2,17 @@ org.gradle.jvmargs=-Xmx2G org.gradle.parallel=true -minecraft_version=26.1 +minecraft_version=26.1.1 # Mod properties -mod_version=26.1-1.16.2 +mod_version=26.1.1-1.16.3 maven_group=com.vsngarcia archives_name=elevatorid enabled_platforms=fabric,neoforge # Dependencies -fabric_loader_version=0.18.5 -fabric_api_version=0.144.3+26.1 -neoforge_version=26.1.0.8-beta +fabric_loader_version=0.18.6 +fabric_api_version=0.145.2+26.1.1 +neoforge_version=26.1.1.1-beta -forge_config_api_port_version=26.1.0.1 +forge_config_api_port_version=26.1.3 From 9f826a038f351e2d18f9d2e4855cef907c1b0114 Mon Sep 17 00:00:00 2001 From: Vasco Garcia Date: Fri, 3 Apr 2026 20:57:39 +0100 Subject: [PATCH 8/9] refactor(fabric): Use pre-baked arrow models --- build.gradle.kts | 2 +- .../vsngarcia/client/ColorCamoElevator.java | 1 - .../client/ElevatorModFabricClient.java | 51 ++++++++----- .../client/render/ElevatorBakedModel.java | 51 ++++--------- gradle.properties | 4 +- .../com/vsngarcia/neoforge/ElevatorBlock.java | 71 +++++++++---------- .../neoforge/client/ClientRegistry.java | 56 ++++++++------- .../client/render/ElevatorBakedModel.java | 23 +++--- 8 files changed, 129 insertions(+), 130 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9460e80..5a44509 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -75,7 +75,7 @@ subprojects { val mainOutput = project.the()["main"].output exclude { element -> mainOutput.classesDirs.any { element.file.startsWith(it) } || - element.file.startsWith(mainOutput.resourcesDir!!) + element.file.startsWith(mainOutput.resourcesDir!!) } } } diff --git a/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java b/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java index 415bfec..d2871f2 100644 --- a/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java +++ b/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java @@ -1,6 +1,5 @@ package com.vsngarcia.client; -import com.vsngarcia.ElevatorBlockBase; import com.vsngarcia.level.ElevatorBlockEntityBase; import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockTintSource; diff --git a/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java b/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java index 3790a77..025da36 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java @@ -18,13 +18,19 @@ import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.rendering.v1.BlockColorRegistry; import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.client.renderer.block.dispatch.BlockModelRotation; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Rotation; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import static com.vsngarcia.fabric.FabricRegistry.ELEVATOR_BLOCKS; import static com.vsngarcia.fabric.FabricRegistry.ELEVATOR_CONTAINER; @@ -39,35 +45,46 @@ public void onInitializeClient() { ModelLoadingPlugin.register(new ElevatorModelLoadingPlugin()); MenuScreens.register( - ELEVATOR_CONTAINER, - (ElevatorContainer container, Inventory inv, Component title) -> new ElevatorScreen( - container, - inv, - title, - ClientPlayNetworking::send - ) + ELEVATOR_CONTAINER, + (ElevatorContainer container, Inventory inv, Component title) -> new ElevatorScreen( + container, + inv, + title, + ClientPlayNetworking::send + ) ); } public static class ElevatorModelLoadingPlugin implements ModelLoadingPlugin { + public static final Map> ARROW_MODEL_KEYS = Direction.Plane.HORIZONTAL + .stream() + .collect(Collectors.toUnmodifiableMap( + Function.identity(), + dir -> ExtraModelKey.create(() -> "arrow_" + dir.getSerializedName()) + )); - public static final ExtraModelKey ARROW_MODEL_KEY = ExtraModelKey.create(() -> "arrow"); private static final Identifier ARROW_MODEL_ID = Identifier.fromNamespaceAndPath(ElevatorMod.ID, "arrow"); @Override public void initialize(Context ctx) { - ctx.modifyBlockModelAfterBake().register( - ModelModifier.WRAP_PHASE, (model, context) -> { - if (!(context.state().getBlock() instanceof ElevatorBlock)) { - return model; - } + Direction.Plane.HORIZONTAL.forEach(dir -> ctx.addModel( + ARROW_MODEL_KEYS.get(dir), + SimpleUnbakedExtraModel.blockStateModel( + ARROW_MODEL_ID, + BlockModelRotation.get(Rotation.values()[(int) dir.toYRot() / 90].rotation()) + ) + )); - ElevatorMod.LOGGER.debug("Wrapping elevator model: {}", context.state()); - return new ElevatorBakedModel(model); + ctx.modifyBlockModelAfterBake().register( + ModelModifier.WRAP_PHASE, (model, context) -> { + if (!(context.state().getBlock() instanceof ElevatorBlock)) { + return model; } - ); - ctx.addModel(ARROW_MODEL_KEY, SimpleUnbakedExtraModel.blockStateModel(ARROW_MODEL_ID)); + ElevatorMod.LOGGER.debug("Wrapping elevator model: {}", context.state()); + return new ElevatorBakedModel(model); + } + ); } } } diff --git a/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java b/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java index f12dbbe..da70594 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java @@ -1,7 +1,6 @@ package com.vsngarcia.fabric.client.render; import com.vsngarcia.fabric.ElevatorBlock; -import com.vsngarcia.fabric.client.ElevatorModFabricClient; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.model.loading.v1.wrapper.WrapperBlockStateModel; @@ -9,18 +8,17 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.resources.model.sprite.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.state.BlockState; -import org.joml.Vector3f; import java.util.function.Predicate; import static com.vsngarcia.fabric.ElevatorBlock.DIRECTIONAL; import static com.vsngarcia.fabric.ElevatorBlock.SHOW_ARROW; +import static com.vsngarcia.fabric.client.ElevatorModFabricClient.ElevatorModelLoadingPlugin.ARROW_MODEL_KEYS; import static net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING; @Environment(EnvType.CLIENT) @@ -33,12 +31,12 @@ public ElevatorBakedModel(BlockStateModel originalModel) { @Override public void emitQuads( - QuadEmitter emitter, - BlockAndTintGetter blockView, - BlockPos pos, - BlockState state, - RandomSource random, - Predicate cullTest + QuadEmitter emitter, + BlockAndTintGetter blockView, + BlockPos pos, + BlockState state, + RandomSource random, + Predicate cullTest ) { if (!(state.getBlock() instanceof ElevatorBlock)) { super.emitQuads(emitter, blockView, pos, state, random, cullTest); @@ -47,36 +45,17 @@ public void emitQuads( if (state.getValue(DIRECTIONAL) && state.getValue(SHOW_ARROW)) { - emitter.pushTransform(quad -> { - Vector3f vec = null; - for (int i = 0; i < 4; i++) { - vec = quad.copyPos(i, vec); - vec.sub(.5f, 0, .5f); - vec.rotateY((float) Math.toRadians(-state.getValue(FACING).toYRot())); - vec.add(.5f, 0, .5f); - - quad.pos(i, vec); - } - - quad.chunkLayer(ChunkSectionLayer.CUTOUT); - - return true; - }); - - - var arrow = MC.getModelManager().getModel(ElevatorModFabricClient.ElevatorModelLoadingPlugin.ARROW_MODEL_KEY); + var arrow = MC.getModelManager().getModel(ARROW_MODEL_KEYS.get(state.getValue(FACING))); if (arrow != null) { arrow.emitQuads(emitter, blockView, pos, state, random, cullTest); } - - emitter.popTransform(); } if (blockView.getBlockEntityRenderData(pos) instanceof BlockState heldState) { MC.getModelManager() - .getBlockStateModelSet() - .get(heldState) - .emitQuads(emitter, blockView, pos, heldState, random, cullTest); + .getBlockStateModelSet() + .get(heldState) + .emitQuads(emitter, blockView, pos, heldState, random, cullTest); return; } @@ -85,12 +64,8 @@ public void emitQuads( @Override public Material.Baked particleMaterial(BlockAndTintGetter level, BlockPos pos, BlockState state) { - if (level != BlockAndTintGetter.EMPTY - && level.getBlockEntityRenderData(pos) instanceof BlockState heldState) { - return MC.getModelManager() - .getBlockStateModelSet() - .get(heldState) - .particleMaterial(level, pos, heldState); + if (level != BlockAndTintGetter.EMPTY && level.getBlockEntityRenderData(pos) instanceof BlockState heldState) { + return MC.getModelManager().getBlockStateModelSet().get(heldState).particleMaterial(level, pos, heldState); } return super.particleMaterial(level, pos, state); diff --git a/gradle.properties b/gradle.properties index b842fdd..23a247f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx2G org.gradle.parallel=true - +org.gradle.caching=true minecraft_version=26.1.1 @@ -12,7 +12,7 @@ enabled_platforms=fabric,neoforge # Dependencies fabric_loader_version=0.18.6 -fabric_api_version=0.145.2+26.1.1 +fabric_api_version=0.145.3+26.1.1 neoforge_version=26.1.1.1-beta forge_config_api_port_version=26.1.3 diff --git a/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java b/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java index b6f2ec7..a55e5d1 100644 --- a/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java +++ b/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java @@ -28,9 +28,8 @@ public class ElevatorBlock extends ElevatorBlockBase { private final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance - .group(DyeColor.CODEC.fieldOf("color").forGetter(ElevatorBlockBase::getColor)) - .apply(instance, ElevatorBlock::new) - ); + .group(DyeColor.CODEC.fieldOf("color").forGetter(ElevatorBlockBase::getColor)) + .apply(instance, ElevatorBlock::new)); public ElevatorBlock(DyeColor color) { super(color, Registry.ELEVATOR_TILE_ENTITY::get); @@ -53,36 +52,36 @@ protected void openMenu(Player player, ElevatorBlockEntityBase tile, BlockPos po @Override public boolean collisionExtendsVertically( - BlockState state, - BlockGetter level, - BlockPos pos, - Entity collidingEntity + BlockState state, + BlockGetter level, + BlockPos pos, + Entity collidingEntity ) { return getHeldState(level, pos) - .map(s -> s.collisionExtendsVertically(level, pos, collidingEntity)) - .orElse(super.collisionExtendsVertically(state, level, pos, collidingEntity)); + .map(s -> s.collisionExtendsVertically(level, pos, collidingEntity)) + .orElse(super.collisionExtendsVertically(state, level, pos, collidingEntity)); } @Override public float getFriction(BlockState state, LevelReader level, BlockPos pos, Entity entity) { return getHeldState(level, pos) - .map(s -> s.getFriction(level, pos, entity)) - .orElse(super.getFriction(state, level, pos, entity)); + .map(s -> s.getFriction(level, pos, entity)) + .orElse(super.getFriction(state, level, pos, entity)); } @Override public BlockState getAppearance( - BlockState state, - BlockAndLightGetter level, - BlockPos pos, - Direction side, - BlockState queryState, - BlockPos queryPos + BlockState state, + BlockAndLightGetter level, + BlockPos pos, + Direction side, + BlockState queryState, + BlockPos queryPos ) { if (level instanceof ServerLevel) { return getHeldState(level, pos) - .map(s -> s.getAppearance(level, pos, side, queryState, queryPos)) - .orElse(super.getAppearance(state, level, pos, side, queryState, queryPos)); + .map(s -> s.getAppearance(level, pos, side, queryState, queryPos)) + .orElse(super.getAppearance(state, level, pos, side, queryState, queryPos)); } var data = level.getModelData(pos); @@ -101,12 +100,12 @@ public BlockState getAppearance( @Override protected BlockState getAppearance( - BlockState facingState, - LevelReader worldIn, - BlockPos facingPos, - Direction opposite, - BlockState heldState, - BlockPos currentPos + BlockState facingState, + LevelReader worldIn, + BlockPos facingPos, + Direction opposite, + BlockState heldState, + BlockPos currentPos ) { return facingState.getAppearance(worldIn, facingPos, opposite, heldState, currentPos); } @@ -118,11 +117,11 @@ public boolean supportsExternalFaceHiding(BlockState state) { @Override public boolean hidesNeighborFace( - BlockGetter level, - BlockPos pos, - BlockState state, - BlockState neighborState, - Direction dir + BlockGetter level, + BlockPos pos, + BlockState state, + BlockState neighborState, + Direction dir ) { var modelData = level.getModelData(pos); if (modelData == ModelData.EMPTY) { @@ -156,21 +155,21 @@ public int getLightEmission(BlockState state, BlockGetter level, BlockPos pos) { @Override public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { return getHeldState(level, pos) - .map(s -> s.getBlock().canConnectRedstone(s, level, pos, direction)) - .orElse(super.canConnectRedstone(state, level, pos, direction)); + .map(s -> s.getBlock().canConnectRedstone(s, level, pos, direction)) + .orElse(super.canConnectRedstone(state, level, pos, direction)); } @Override public boolean shouldCheckWeakPower(BlockState state, SignalGetter level, BlockPos pos, Direction side) { return getHeldState(level, pos) - .map(s -> s.shouldCheckWeakPower(level, pos, side)) - .orElse(super.shouldCheckWeakPower(state, level, pos, side)); + .map(s -> s.shouldCheckWeakPower(level, pos, side)) + .orElse(super.shouldCheckWeakPower(state, level, pos, side)); } @Override public SoundType getSoundType(BlockState state, LevelReader level, BlockPos pos, Entity entity) { return getHeldState(level, pos) - .map(s -> s.getSoundType(level, pos, entity)) - .orElse(super.getSoundType(state, level, pos, entity)); + .map(s -> s.getSoundType(level, pos, entity)) + .orElse(super.getSoundType(state, level, pos, entity)); } } diff --git a/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java b/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java index e9971d7..2c382ae 100644 --- a/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java +++ b/neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java @@ -33,47 +33,53 @@ @EventBusSubscriber(modid = ElevatorMod.ID, value = Dist.CLIENT) public class ClientRegistry { - public static final Map> ARROW_MODEL_KEYS = - Direction.Plane.HORIZONTAL.stream().collect(Collectors.toUnmodifiableMap( - Function.identity(), - dir -> new StandaloneModelKey<>(() -> "arrow_" + dir.getSerializedName()) - )); + public static final Map> ARROW_MODEL_KEYS = Direction.Plane.HORIZONTAL.stream() + .collect(Collectors.toUnmodifiableMap( + Function.identity(), + dir -> new StandaloneModelKey<>(() -> "arrow_" + dir.getSerializedName()) + )); @SubscribeEvent public static void onMenuScreensRegistry(RegisterMenuScreensEvent e) { - e.register(Registry.ELEVATOR_CONTAINER.get(), (ElevatorContainer container, Inventory inv, Component title) -> new ElevatorScreen(container, inv, title, ClientPacketDistributor::sendToServer)); + e.register( + Registry.ELEVATOR_CONTAINER.get(), + (ElevatorContainer container, Inventory inv, Component title) -> new ElevatorScreen( + container, + inv, + title, + ClientPacketDistributor::sendToServer + ) + ); } @SubscribeEvent public static void onBlockColorHandlersRegistry(RegisterColorHandlersEvent.BlockTintSources e) { - e.register(Collections.singletonList(new ColorCamoElevator()), Registry.ELEVATOR_BLOCKS.values().stream().map(DeferredHolder::get).toArray(ElevatorBlock[]::new)); + e.register( + Collections.singletonList(new ColorCamoElevator()), + Registry.ELEVATOR_BLOCKS.values().stream().map(DeferredHolder::get).toArray(ElevatorBlock[]::new) + ); } @SubscribeEvent public static void onModelRegistry(ModelEvent.RegisterStandalone e) { - // HACK: Pre-bake all rotations - Direction.Plane.HORIZONTAL.forEach(dir -> - e.register( - ARROW_MODEL_KEYS.get(dir), - SimpleUnbakedStandaloneModel.blockStateModel( - Identifier.fromNamespaceAndPath(ElevatorMod.ID, "arrow"), - BlockModelRotation.get(Rotation.values()[(int) dir.toYRot() / 90].rotation()) - ) - ) - ); + Direction.Plane.HORIZONTAL.forEach(dir -> e.register( + ARROW_MODEL_KEYS.get(dir), + SimpleUnbakedStandaloneModel.blockStateModel( + Identifier.fromNamespaceAndPath(ElevatorMod.ID, "arrow"), + BlockModelRotation.get(Rotation.values()[(int) dir.toYRot() / 90].rotation()) + ) + )); } @SubscribeEvent public static void onModelBake(ModelEvent.ModifyBakingResult e) { e.getBakingResult() + .blockStateModels() + .entrySet() + .stream() + .filter(entry -> entry.getKey().getBlock() instanceof ElevatorBlock) + .forEach(entry -> e.getBakingResult() .blockStateModels() - .entrySet() - .stream() - .filter(entry -> entry.getKey().getBlock() instanceof ElevatorBlock) - .forEach( - entry -> e.getBakingResult() - .blockStateModels() - .put(entry.getKey(), new ElevatorBakedModel(entry.getValue())) - ); + .put(entry.getKey(), new ElevatorBakedModel(entry.getValue()))); } } diff --git a/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java b/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java index bf0ee09..722f80c 100644 --- a/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java +++ b/neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java @@ -6,6 +6,7 @@ import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; +import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.model.sprite.Material; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; @@ -18,6 +19,7 @@ public class ElevatorBakedModel extends DelegateBlockStateModel { public static final ModelProperty HELD_STATE = new ModelProperty<>(); + public static final ModelManager MODEL_MANAGER = Minecraft.getInstance().getModelManager(); public ElevatorBakedModel(BlockStateModel originalModel) { super(originalModel); @@ -29,15 +31,20 @@ public Material.Baked particleMaterial(BlockAndTintGetter level, BlockPos pos, B BlockState heldState = level.getModelData(pos).get(HELD_STATE); if (heldState != null) { - return Minecraft.getInstance().getModelManager().getBlockStateModelSet().get(heldState).particleMaterial(level, pos, heldState); + return MODEL_MANAGER.getBlockStateModelSet().get(heldState).particleMaterial(level, pos, heldState); } return super.particleMaterial(level, pos, state); } - @Override - public void collectParts(BlockAndTintGetter level, BlockPos pos, BlockState state, RandomSource random, List parts) { + public void collectParts( + BlockAndTintGetter level, + BlockPos pos, + BlockState state, + RandomSource random, + List parts + ) { if (!(state.getBlock() instanceof ElevatorBlock)) { super.collectParts(level, pos, state, random, parts); return; @@ -45,9 +52,8 @@ public void collectParts(BlockAndTintGetter level, BlockPos pos, BlockState stat // Directional arrow if (state.getValue(ElevatorBlock.DIRECTIONAL) && state.getValue(ElevatorBlock.SHOW_ARROW)) { - var arrowModel = Minecraft.getInstance() - .getModelManager() - .getStandaloneModel(ClientRegistry.ARROW_MODEL_KEYS.get(state.getValue(ElevatorBlock.FACING))); + var arrowModel = MODEL_MANAGER.getStandaloneModel(ClientRegistry.ARROW_MODEL_KEYS.get(state.getValue( + ElevatorBlock.FACING))); if (arrowModel != null) { arrowModel.collectParts(level, pos, state, random, parts); } @@ -55,10 +61,7 @@ public void collectParts(BlockAndTintGetter level, BlockPos pos, BlockState stat BlockState heldState = level.getModelData(pos).get(HELD_STATE); if (heldState != null) { - BlockStateModel blockModel = Minecraft.getInstance().getModelManager().getBlockStateModelSet().get(heldState); - - blockModel.collectParts(level, pos, heldState, random, parts); - + MODEL_MANAGER.getBlockStateModelSet().get(heldState).collectParts(level, pos, heldState, random, parts); return; } From caf83515df546d17a81dd254288f140885df4dd6 Mon Sep 17 00:00:00 2001 From: Vasco Garcia Date: Sat, 4 Apr 2026 21:59:00 +0100 Subject: [PATCH 9/9] chore: Update Github Actions --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 96676e7..bc7388a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,13 +8,13 @@ jobs: permissions: { contents: write } steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up JDK - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: '25' distribution: 'temurin' - - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@v6 - run: ./gradlew build - uses: softprops/action-gh-release@v2