From 74a03f3583c4754099ae82d5243f114dbea86aeb Mon Sep 17 00:00:00 2001 From: Jika Date: Fri, 15 Aug 2025 18:35:37 +0200 Subject: [PATCH] Highlight synced with part block --- build.gradle | 13 +++++- gradle.properties | 5 +- .../imbgt/ibg/mixin/LevelRendererMixin.java | 46 +++++++++++++++++++ src/main/resources/ibg.mixin.json | 10 ++-- 4 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/imbgt/ibg/mixin/LevelRendererMixin.java diff --git a/build.gradle b/build.gradle index 41d229e..01c1f37 100644 --- a/build.gradle +++ b/build.gradle @@ -58,6 +58,9 @@ minecraft { client { // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. property 'forge.enabledGameTestNamespaces', mod_id + jvmArgs += [ + "-Dmixin.debug.export=true", "-Dmixin.debug.verbose=true","-Dmixin.dumpTargetOnFailure=true" + ] // arg "-mixin.config=${mod_id}.mixin.json" @@ -90,6 +93,8 @@ minecraft { sourceSets.main.resources { srcDir 'src/generated/resources' } repositories { + mavenCentral() + maven { // JEI mirror, AE2 name = "ModMaven" url = "https://modmaven.dev" @@ -136,6 +141,10 @@ dependencies { annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' testAnnotationProcessor 'org.spongepowered:mixin:0.8.5:processor' + compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.5.0")) + implementation(jarJar("io.github.llamalad7:mixinextras-forge:0.5.0")) { + jarJar.ranged(it, "[0.5.0,)") + } implementation fg.deobf("com.lowdragmc.ldlib:ldlib-forge-${minecraft_version}:${ldlib_version}") { transitive = false } implementation fg.deobf("com.gregtechceu.gtceu:gtceu-${minecraft_version}:${gtm_version}") {transitive = false} @@ -147,8 +156,8 @@ dependencies { } mixin { - add sourceSets.main, "${mod_id}.refmap.json" - config "${mod_id}.mixin.json" + add sourceSets.main, "ibg.refmap.json" + config "ibg.mixin.json" } tasks.named('processResources', ProcessResources).configure { diff --git a/gradle.properties b/gradle.properties index cfd48f5..1d66f8a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,6 @@ -org.gradle.jvmargs=-Xmx3G +org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false - ## Environment Properties minecraft_version=1.20.1 minecraft_version_range=[1.20.1,1.21) @@ -23,7 +22,7 @@ mod_description=Example mod description.\nNewline characters can be used and wil ## Deps Properties -gtm_version=7.0.0 +gtm_version=7.0.2 geckolib_version=4.7.3 ldlib_version=1.0.40.b diff --git a/src/main/java/com/imbgt/ibg/mixin/LevelRendererMixin.java b/src/main/java/com/imbgt/ibg/mixin/LevelRendererMixin.java new file mode 100644 index 0000000..f621735 --- /dev/null +++ b/src/main/java/com/imbgt/ibg/mixin/LevelRendererMixin.java @@ -0,0 +1,46 @@ +package com.imbgt.ibg.mixin; + +import javax.annotation.Nullable; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import com.imbgt.ibg.block.entity.PartBE; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +@Mixin(LevelRenderer.class) +public abstract class LevelRendererMixin { + + @Shadow + @Final + @Nullable + private ClientLevel level; + + @WrapOperation(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;renderHitOutline(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Lnet/minecraft/world/entity/Entity;DDDLnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V")) + private void ibg$wrapRenderHitOutline(LevelRenderer instance, PoseStack poseStack, VertexConsumer consumer, + Entity entity, double camX, double camY, double camZ, + BlockPos pos, BlockState state, Operation original) { + if (level != null && level.getBlockEntity(pos) instanceof PartBE part && part.getMasterPos() != null) { + BlockPos masterPos = part.getMasterPos(); + BlockEntity master = level.getBlockEntity(masterPos); + if (master != null) { + pos = masterPos; + state = level.getBlockState(masterPos); + } + } + + original.call(instance, poseStack, consumer, entity, camX, camY, camZ, pos, state); + } +} diff --git a/src/main/resources/ibg.mixin.json b/src/main/resources/ibg.mixin.json index c2e9da7..3ac5b4f 100644 --- a/src/main/resources/ibg.mixin.json +++ b/src/main/resources/ibg.mixin.json @@ -1,14 +1,16 @@ { "required": true, + "minVersion": "0.8", "package": "com.imbgt.ibg.mixin", + "refmap": "ibg.refmap.json", "compatibilityLevel": "JAVA_17", - "mixins":[], + "mixins": [], "client": [ "MetaMachineBlockMixin", - "MetaMachineBlockEntityGeoMixin" + "MetaMachineBlockEntityGeoMixin", + "LevelRendererMixin" ], "injectors": { "defaultRequire": 1 - }, - "refmap": "ibg.refmap.json" + } }