diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8897511..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 - - name: Set up JDK 21 - uses: actions/setup-java@v4 + - uses: actions/checkout@v6 + - name: Set up JDK + uses: actions/setup-java@v5 with: - java-version: '21' + 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 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..5a44509 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,100 @@ +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 { + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + + 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.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") { + from(zipTree(tasks.named("jar").get().archiveFile)) + configurations = listOf(shadowBundle) + archiveClassifier = "" + + val mainOutput = project.the()["main"].output + exclude { element -> + mainOutput.classesDirs.any { element.file.startsWith(it) } || + element.file.startsWith(mainOutput.resourcesDir!!) + } + } + } + + // 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..d2871f2 100644 --- a/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java +++ b/common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java @@ -1,32 +1,36 @@ package com.vsngarcia.client; -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; + + // TODO: Use just layer 0 for now + 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..9a43d2f 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; @@ -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; @@ -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/assets/elevatorid/textures/block/arrow.png b/common/src/main/resources/assets/elevatorid/textures/block/arrow.png index 4da322b..0c50c87 100644 Binary files a/common/src/main/resources/assets/elevatorid/textures/block/arrow.png and b/common/src/main/resources/assets/elevatorid/textures/block/arrow.png differ 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..7ed4d98 --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,39 @@ +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath +} + +architectury { + platformSetupLoomIde() + fabric() +} + +configurations { + named("developmentFabric") { extendsFrom(configurations.getByName("common")) } +} + + +dependencies { + api("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") + 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) +} 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..025da36 100644 --- a/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java +++ b/fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java @@ -16,13 +16,21 @@ 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.fabricmc.fabric.api.client.rendering.v1.BlockColorRegistry; import net.minecraft.client.gui.screens.MenuScreens; -import net.minecraft.client.renderer.block.model.BlockStateModel; +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; @@ -33,39 +41,50 @@ 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])); + BlockColorRegistry.register(List.of(new ColorCamoElevator()), ELEVATOR_BLOCKS.values().toArray(new Block[0])); 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 59d475b..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,25 +1,24 @@ package com.vsngarcia.fabric.client.render; -import com.vsngarcia.fabric.client.ElevatorModFabricClient; +import com.vsngarcia.fabric.ElevatorBlock; 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.fabricmc.fabric.api.client.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.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +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.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 com.vsngarcia.fabric.client.ElevatorModFabricClient.ElevatorModelLoadingPlugin.ARROW_MODEL_KEYS; import static net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING; @Environment(EnvType.CLIENT) @@ -32,54 +31,43 @@ 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 != 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; - }); + if (!(state.getBlock() instanceof ElevatorBlock)) { + super.emitQuads(emitter, blockView, pos, state, random, cullTest); + return; + } - var arrow = MC.getModelManager().getModel(ElevatorModFabricClient.ElevatorModelLoadingPlugin.ARROW_MODEL_KEY); + if (state.getValue(DIRECTIONAL) && state.getValue(SHOW_ARROW)) { + 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) { - emitter.pushTransform(quad -> { - quad.renderLayer(ItemBlockRenderTypes.getChunkRenderType(heldState)); - - return true; - }); - - MC.getBlockRenderer() - .getBlockModel(heldState) - .emitQuads(emitter, blockView, pos, heldState, random, cullTest); - - emitter.popTransform(); + 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/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..23a247f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,18 +1,18 @@ org.gradle.jvmargs=-Xmx2G org.gradle.parallel=true +org.gradle.caching=true - -minecraft_version=1.21.11 +minecraft_version=26.1.1 # Mod properties -mod_version=1.21.11-1.15.0 +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.2 -fabric_api_version=0.140.0+1.21.11 -neoforge_version=21.11.6-beta +fabric_loader_version=0.18.6 +fabric_api_version=0.145.3+26.1.1 +neoforge_version=26.1.1.1-beta -forge_config_api_port_version=21.11.1 +forge_config_api_port_version=26.1.3 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..2c885b2 --- /dev/null +++ b/neoforge/build.gradle.kts @@ -0,0 +1,35 @@ +// TODO: Maintaining AT for now +//loom { +// accessWidenerPath = project(":common").loom.accessWidenerPath +//} + +architectury { + platformSetupLoomIde() + neoForge() +} + +configurations { + named("developmentNeoForge") { extendsFrom(configurations.getByName("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) + } +} diff --git a/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java b/neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java index c28e062..a55e5d1 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; @@ -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, - BlockAndTintGetter 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 cbf60d1..2c382ae 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; @@ -35,56 +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 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 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 36cde0c..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 @@ -3,46 +3,57 @@ 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.ModelManager; +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; 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); } - @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 MODEL_MANAGER.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 + ) { + 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() - .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); } @@ -50,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().getBlockRenderer().getBlockModel(heldState); - - blockModel.collectParts(level, pos, heldState, random, parts); - + MODEL_MANAGER.getBlockStateModelSet().get(heldState).collectParts(level, pos, heldState, random, parts); return; } 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")