From 4a2e3db2d0df64eb8e0159b442a58c99cff3886e Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Wed, 29 Oct 2025 15:25:16 +0000 Subject: [PATCH 1/4] Added HighlightModelOverride option --- src/main/java/rs117/hd/HdPlugin.java | 1 + .../rs117/hd/opengl/uniforms/UBOGlobal.java | 2 ++ .../hd/opengl/uniforms/UniformBuffer.java | 2 ++ .../hd/renderer/legacy/LegacyRenderer.java | 5 +++++ .../rs117/hd/renderer/zone/ZoneRenderer.java | 5 +++++ .../rs117/hd/scene/materials/Material.java | 3 ++- .../java/rs117/hd/utils/DeveloperTools.java | 10 ++++++++++ src/main/resources/rs117/hd/scene_frag.glsl | 20 +++++++++++++++---- .../resources/rs117/hd/uniforms/global.glsl | 2 ++ .../resources/rs117/hd/utils/constants.glsl | 5 +++-- src/main/resources/rs117/hd/utils/misc.glsl | 5 +++++ 11 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/main/java/rs117/hd/HdPlugin.java b/src/main/java/rs117/hd/HdPlugin.java index cb715fd25a..f8243afe1f 100644 --- a/src/main/java/rs117/hd/HdPlugin.java +++ b/src/main/java/rs117/hd/HdPlugin.java @@ -907,6 +907,7 @@ public ShaderIncludes getShaderIncludes() { var includes = new ShaderIncludes() .addIncludePath(SHADER_PATH) .addInclude("VERSION_HEADER", OSType.getOSType() == OSType.Linux ? LINUX_VERSION_HEADER : WINDOWS_VERSION_HEADER) + .define("DEVELOPMENT", Props.DEVELOPMENT) .define("UI_SCALING_MODE", config.uiScalingMode()) .define("COLOR_BLINDNESS", config.colorBlindness()) .define("APPLY_COLOR_FILTER", configColorFilter != ColorFilter.NONE) diff --git a/src/main/java/rs117/hd/opengl/uniforms/UBOGlobal.java b/src/main/java/rs117/hd/opengl/uniforms/UBOGlobal.java index 1343819ecc..649553cf6e 100644 --- a/src/main/java/rs117/hd/opengl/uniforms/UBOGlobal.java +++ b/src/main/java/rs117/hd/opengl/uniforms/UBOGlobal.java @@ -35,6 +35,8 @@ public void initialize() { public Property underglowColor = addProperty(PropertyType.FVec3, "underglowColor"); public Property underglowStrength = addProperty(PropertyType.Float, "underglowStrength"); + public Property highlightModelOverrides = addProperty(PropertyType.Int, "highlightModelOverrides"); + public Property useFog = addProperty(PropertyType.Int, "useFog"); public Property fogDepth = addProperty(PropertyType.Float, "fogDepth"); public Property fogColor = addProperty(PropertyType.FVec3, "fogColor"); diff --git a/src/main/java/rs117/hd/opengl/uniforms/UniformBuffer.java b/src/main/java/rs117/hd/opengl/uniforms/UniformBuffer.java index 0d1ca3104f..c0496de0a5 100644 --- a/src/main/java/rs117/hd/opengl/uniforms/UniformBuffer.java +++ b/src/main/java/rs117/hd/opengl/uniforms/UniformBuffer.java @@ -84,6 +84,8 @@ public final void set(int... values) { owner.markWaterLine(position, type.size); } + public final void set(boolean val) { set(val ? 1 : 0); } + public final void set(int x) { if (isUninitialized()) return; diff --git a/src/main/java/rs117/hd/renderer/legacy/LegacyRenderer.java b/src/main/java/rs117/hd/renderer/legacy/LegacyRenderer.java index 41ce789d62..1cf4cc8e8b 100644 --- a/src/main/java/rs117/hd/renderer/legacy/LegacyRenderer.java +++ b/src/main/java/rs117/hd/renderer/legacy/LegacyRenderer.java @@ -51,6 +51,7 @@ import rs117.hd.scene.lights.Light; import rs117.hd.scene.model_overrides.ModelOverride; import rs117.hd.utils.ColorUtils; +import rs117.hd.utils.DeveloperTools; import rs117.hd.utils.HDUtils; import rs117.hd.utils.Mat4; import rs117.hd.utils.ModelHash; @@ -94,6 +95,9 @@ public class LegacyRenderer implements Renderer { @Inject private HdPluginConfig config; + @Inject + private DeveloperTools developerTools; + @Inject private OpenCLManager clManager; @@ -999,6 +1003,7 @@ public void draw(int overlayColor) { break; } fogDepth *= min(plugin.getDrawDistance(), 90) / 10.f; + plugin.uboGlobal.highlightModelOverrides.set(developerTools.isHighlightModelOverridesEnabled()); plugin.uboGlobal.useFog.set(fogDepth > 0 ? 1 : 0); plugin.uboGlobal.fogDepth.set(fogDepth); plugin.uboGlobal.fogColor.set(fogColor); diff --git a/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java b/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java index 39c6412acf..ad5fe89378 100644 --- a/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java +++ b/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java @@ -61,6 +61,7 @@ import rs117.hd.utils.Camera; import rs117.hd.utils.ColorUtils; import rs117.hd.utils.CommandBuffer; +import rs117.hd.utils.DeveloperTools; import rs117.hd.utils.HDUtils; import rs117.hd.utils.Mat4; import rs117.hd.utils.RenderState; @@ -116,6 +117,9 @@ public class ZoneRenderer implements Renderer { @Inject private HdPluginConfig config; + @Inject + private DeveloperTools developerTools; + @Inject private LightManager lightManager; @@ -573,6 +577,7 @@ private void preSceneDrawTopLevel( } fogDepth *= min(plugin.getDrawDistance(), 90) / 10.f; } + plugin.uboGlobal.highlightModelOverrides.set(developerTools.isHighlightModelOverridesEnabled()); plugin.uboGlobal.useFog.set(fogDepth > 0 ? 1 : 0); plugin.uboGlobal.fogDepth.set(fogDepth); plugin.uboGlobal.fogColor.set(ColorUtils.linearToSrgb(environmentManager.currentFogColor)); diff --git a/src/main/java/rs117/hd/scene/materials/Material.java b/src/main/java/rs117/hd/scene/materials/Material.java index a09194b73e..7aa3fe35d6 100644 --- a/src/main/java/rs117/hd/scene/materials/Material.java +++ b/src/main/java/rs117/hd/scene/materials/Material.java @@ -186,7 +186,8 @@ public final int packMaterialData(@Nonnull ModelOverride modelOverride, UvType u | ((modelOverride.windDisplacementModifier + 3) & 0x7) << 12 | (modelOverride.windDisplacementMode.ordinal() & 0x7) << 9 | (modelOverride.invertDisplacementStrength ? 1 : 0) << 8 - | (modelOverride.terrainVertexSnap ? 1 : 0) << 6 + | (modelOverride.terrainVertexSnap ? 1 : 0) << 7 + | (modelOverride == ModelOverride.NONE ? 1 : 0) << 6 | (!modelOverride.receiveShadows ? 1 : 0) << 5 | (modelOverride.upwardsNormals ? 1 : 0) << 4 | (modelOverride.flatNormals ? 1 : 0) << 3 diff --git a/src/main/java/rs117/hd/utils/DeveloperTools.java b/src/main/java/rs117/hd/utils/DeveloperTools.java index 091d7e834f..8dc3e7de50 100644 --- a/src/main/java/rs117/hd/utils/DeveloperTools.java +++ b/src/main/java/rs117/hd/utils/DeveloperTools.java @@ -2,6 +2,7 @@ import java.awt.event.KeyEvent; import javax.inject.Inject; +import javax.inject.Singleton; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.events.*; @@ -22,9 +23,11 @@ import static java.awt.event.InputEvent.SHIFT_DOWN_MASK; @Slf4j +@Singleton public class DeveloperTools implements KeyListener { // This could be part of the config if we had developer mode config sections private static final Keybind KEY_TOGGLE_TILE_INFO = new Keybind(KeyEvent.VK_F3, CTRL_DOWN_MASK); + private static final Keybind KEY_TOGGLE_HIGHLIGHT = new Keybind(KeyEvent.VK_H, CTRL_DOWN_MASK | SHIFT_DOWN_MASK); private static final Keybind KEY_TOGGLE_FRAME_TIMINGS = new Keybind(KeyEvent.VK_F4, CTRL_DOWN_MASK); private static final Keybind KEY_RECORD_TIMINGS_SNAPSHOT = new Keybind(KeyEvent.VK_F4, CTRL_DOWN_MASK | SHIFT_DOWN_MASK); private static final Keybind KEY_TOGGLE_SHADOW_MAP_OVERLAY = new Keybind(KeyEvent.VK_F5, CTRL_DOWN_MASK); @@ -68,6 +71,8 @@ public class DeveloperTools implements KeyListener { private boolean keyBindingsEnabled; private boolean tileInfoOverlayEnabled; @Getter + private boolean highlightModelOverridesEnabled; + @Getter private boolean frameTimingsOverlayEnabled; private boolean shadowMapOverlayEnabled; private boolean lightGizmoOverlayEnabled; @@ -121,6 +126,9 @@ public void onCommandExecuted(CommandExecuted commandExecuted) { case "tileinfo": tileInfoOverlay.setActive(tileInfoOverlayEnabled = !tileInfoOverlayEnabled); break; + case "highlight": + highlightModelOverridesEnabled = !highlightModelOverridesEnabled; + break; case "timers": case "timings": frameTimerOverlay.setActive(frameTimingsOverlayEnabled = !frameTimingsOverlayEnabled); @@ -160,6 +168,8 @@ public void onCommandExecuted(CommandExecuted commandExecuted) { public void keyPressed(KeyEvent e) { if (KEY_TOGGLE_TILE_INFO.matches(e)) { tileInfoOverlay.setActive(tileInfoOverlayEnabled = !tileInfoOverlayEnabled); + } else if (KEY_TOGGLE_HIGHLIGHT.matches(e)) { + highlightModelOverridesEnabled = !highlightModelOverridesEnabled; } else if (KEY_TOGGLE_FRAME_TIMINGS.matches(e)) { frameTimerOverlay.setActive(frameTimingsOverlayEnabled = !frameTimingsOverlayEnabled); } else if (KEY_RECORD_TIMINGS_SNAPSHOT.matches(e)) { diff --git a/src/main/resources/rs117/hd/scene_frag.glsl b/src/main/resources/rs117/hd/scene_frag.glsl index a4bacf0f40..157549bad3 100644 --- a/src/main/resources/rs117/hd/scene_frag.glsl +++ b/src/main/resources/rs117/hd/scene_frag.glsl @@ -87,6 +87,7 @@ void main() { // View & light directions are from the fragment to the camera/light vec3 viewDir = normalize(cameraPos - IN.position); + int combinedMaterialData = fMaterialData[0] | fMaterialData[1] | fMaterialData[2]; Material material1 = getMaterial(fMaterialData[0] >> MATERIAL_INDEX_SHIFT & MATERIAL_INDEX_MASK); Material material2 = getMaterial(fMaterialData[1] >> MATERIAL_INDEX_SHIFT & MATERIAL_INDEX_MASK); Material material3 = getMaterial(fMaterialData[2] >> MATERIAL_INDEX_SHIFT & MATERIAL_INDEX_MASK); @@ -125,7 +126,7 @@ void main() { // Vanilla tree textures rely on UVs being clamped horizontally, which HD doesn't do at the texture level. // Instead we manually clamp vanilla textures with transparency here. Including the transparency check // allows texture wrapping to work correctly for the mirror shield. - if ((fMaterialData[0] >> MATERIAL_FLAG_VANILLA_UVS & 1) == 1 && getMaterialHasTransparency(material1)) + if ((combinedMaterialData >> MATERIAL_FLAG_VANILLA_UVS & 1) == 1 && getMaterialHasTransparency(material1)) blendedUv.x = clamp(blendedUv.x, 0, .984375); vec2 uv1 = blendedUv; @@ -315,7 +316,7 @@ void main() { // normals vec3 normals; - if ((fMaterialData[0] >> MATERIAL_FLAG_UPWARDS_NORMALS & 1) == 1) { + if ((combinedMaterialData >> MATERIAL_FLAG_UPWARDS_NORMALS & 1) == 1) { normals = vec3(0, -1, 0); } else { vec3 n1 = sampleNormalMap(material1, uv1, TBN); @@ -333,7 +334,7 @@ void main() { #endif float shadow = 0; - if ((fMaterialData[0] >> MATERIAL_FLAG_DISABLE_SHADOW_RECEIVING & 1) == 0) + if ((combinedMaterialData >> MATERIAL_FLAG_DISABLE_SHADOW_RECEIVING & 1) == 0) shadow = sampleShadowMap(fragPos, vec2(0), lightDotNormals); shadow = max(shadow, selfShadowing); float inverseShadow = 1 - shadow; @@ -453,7 +454,7 @@ void main() { getMaterialIsUnlit(material3) )); - #if VANILLA_COLOR_BANDING + #if VANILLA_adjustedWorldPosCOLOR_BANDING outputColor.rgb = linearToSrgb(outputColor.rgb); outputColor.rgb = srgbToHsv(outputColor.rgb); outputColor.b = floor(outputColor.b * 127) / 127; @@ -471,6 +472,17 @@ void main() { if (isUnderwater) { sampleUnderwater(outputColor.rgb, waterType, waterDepth, lightDotNormals); } + + #if DEVELOPMENT + if(!isTerrain && highlightModelOverrides == 1 && (combinedMaterialData >> MATERIAL_FLAG_HIGHLIGHT_MODELS_WITHOUT_OVERRIDE & 1) == 1) { + float offset = elapsedTime * 25.0; + float mask = checkerboard(floor((IN.position + vec3(offset)) / 20.0), 1.0); + + vec3 highlightColor = mix(vec3(0.59, 0.58, 0.94), vec3(0.98, 0.78, 0.83), mask); + float str = sin(((mod(elapsedTime, 10)) / 10.0 ) * PI) * 0.5; + outputColor.rgb += highlightColor * str; + } + #endif } #if LEGACY_RENDERER diff --git a/src/main/resources/rs117/hd/uniforms/global.glsl b/src/main/resources/rs117/hd/uniforms/global.glsl index a50e951d99..c409d95ac7 100644 --- a/src/main/resources/rs117/hd/uniforms/global.glsl +++ b/src/main/resources/rs117/hd/uniforms/global.glsl @@ -24,6 +24,8 @@ layout(std140) uniform UBOGlobal { vec3 underglowColor; float underglowStrength; + int highlightModelOverrides; + int useFog; float fogDepth; vec3 fogColor; diff --git a/src/main/resources/rs117/hd/utils/constants.glsl b/src/main/resources/rs117/hd/utils/constants.glsl index 1ef390944e..fb7ab9caef 100644 --- a/src/main/resources/rs117/hd/utils/constants.glsl +++ b/src/main/resources/rs117/hd/utils/constants.glsl @@ -10,6 +10,7 @@ #include SHADER_TYPE #include LEGACY_RENDERER #include ZONE_RENDERER +#include DEVELOPMENT // Any changes here may need to be reflected in OpenCL's constants.cl // They are kept separate to avoid accidentally breaking OpenCL compatibility @@ -19,8 +20,8 @@ #define MATERIAL_FLAG_WIND_MODIFIER 12 #define MATERIAL_FLAG_WIND_SWAYING 9 #define MATERIAL_FLAG_INVERT_DISPLACEMENT_STRENGTH 8 -#define MATERIAL_FLAG_UNDO_VANILLA_SHADING 7 -#define MATERIAL_FLAG_TERRAIN_VERTEX_SNAPPING 6 +#define MATERIAL_FLAG_TERRAIN_VERTEX_SNAPPING 7 +#define MATERIAL_FLAG_HIGHLIGHT_MODELS_WITHOUT_OVERRIDE 6 #define MATERIAL_FLAG_DISABLE_SHADOW_RECEIVING 5 #define MATERIAL_FLAG_UPWARDS_NORMALS 4 #define MATERIAL_FLAG_FLAT_NORMALS 3 diff --git a/src/main/resources/rs117/hd/utils/misc.glsl b/src/main/resources/rs117/hd/utils/misc.glsl index 6e5406693b..91de076aa5 100644 --- a/src/main/resources/rs117/hd/utils/misc.glsl +++ b/src/main/resources/rs117/hd/utils/misc.glsl @@ -210,3 +210,8 @@ vec2 getPoissonDisk(int idx) { default: return vec2( 0.14383161, -0.14100790); } } + +float checkerboard(vec3 fragPos, float size) { + vec2 p = floor(fragPos.xz / size); + return mod(p.x + mod(p.y, 2.0), 2.0); +} \ No newline at end of file From 1596e946c4b7916d24aa9fef321eaa3856769ba4 Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:30:18 +0100 Subject: [PATCH 2/4] Disable Highlighting for Actors --- .../rs117/hd/renderer/zone/ModelStreamingManager.java | 2 ++ src/main/java/rs117/hd/renderer/zone/SceneUploader.java | 4 +++- src/main/java/rs117/hd/scene/materials/Material.java | 8 ++++++-- src/main/resources/rs117/hd/scene_frag.glsl | 8 +++----- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/rs117/hd/renderer/zone/ModelStreamingManager.java b/src/main/java/rs117/hd/renderer/zone/ModelStreamingManager.java index a0b1b3ba06..1df9db9bbd 100644 --- a/src/main/java/rs117/hd/renderer/zone/ModelStreamingManager.java +++ b/src/main/java/rs117/hd/renderer/zone/ModelStreamingManager.java @@ -395,6 +395,7 @@ public void uploadTempModel( final DynamicModelVAO.View shadowView = ctx.beginDraw(VAO_SHADOW, culledFaces.length); sceneUploader.uploadTempModel( culledFaces, + renderable, m, modelOverride, preOrientation, @@ -421,6 +422,7 @@ public void uploadTempModel( sceneUploader.uploadTempModel( visibleFaces, + renderable, m, modelOverride, preOrientation, diff --git a/src/main/java/rs117/hd/renderer/zone/SceneUploader.java b/src/main/java/rs117/hd/renderer/zone/SceneUploader.java index 61f8d89370..1241b951e8 100644 --- a/src/main/java/rs117/hd/renderer/zone/SceneUploader.java +++ b/src/main/java/rs117/hd/renderer/zone/SceneUploader.java @@ -2118,6 +2118,7 @@ public boolean preprocessTempModel( // temp draw public void uploadTempModel( PrimitiveCharArray faces, + Renderable renderable, Model model, ModelOverride modelOverride, int preOrientation, @@ -2168,6 +2169,7 @@ public void uploadTempModel( final byte modelTransparency = model.getTransparency(); final boolean isVanillaTextured = faceTextures != null; + final boolean isActor = renderable instanceof Actor; int orientSin = 0; int orientCos = 0; @@ -2207,7 +2209,7 @@ else if (color3 == -1) color3 = faceOverride.modifyColor(color3); } - final int materialData = material.packMaterialData(faceOverride, uvType, false); + final int materialData = material.packMaterialData(faceOverride, uvType, false, isActor); final int triangleA = indices1[face]; final int vertexOffsetA = triangleA * 3; diff --git a/src/main/java/rs117/hd/scene/materials/Material.java b/src/main/java/rs117/hd/scene/materials/Material.java index 7aa3fe35d6..02290d0992 100644 --- a/src/main/java/rs117/hd/scene/materials/Material.java +++ b/src/main/java/rs117/hd/scene/materials/Material.java @@ -176,7 +176,7 @@ public boolean replaces(String name, HDVariables vars) { return replacementCondition.test(vars); } - public final int packMaterialData(@Nonnull ModelOverride modelOverride, UvType uvType, boolean isOverlay) { + public final int packMaterialData(@Nonnull ModelOverride modelOverride, UvType uvType, boolean isOverlay, boolean isActor) { // This needs to return zero by default, since we often fall back to writing all zeroes to UVs assert isValid : String.format("Material %s used after invalidation", this); int materialIndex = uboIndex; @@ -187,7 +187,7 @@ public final int packMaterialData(@Nonnull ModelOverride modelOverride, UvType u | (modelOverride.windDisplacementMode.ordinal() & 0x7) << 9 | (modelOverride.invertDisplacementStrength ? 1 : 0) << 8 | (modelOverride.terrainVertexSnap ? 1 : 0) << 7 - | (modelOverride == ModelOverride.NONE ? 1 : 0) << 6 + | (modelOverride == ModelOverride.NONE && !isActor ? 1 : 0) << 6 | (!modelOverride.receiveShadows ? 1 : 0) << 5 | (modelOverride.upwardsNormals ? 1 : 0) << 4 | (modelOverride.flatNormals ? 1 : 0) << 3 @@ -196,6 +196,10 @@ public final int packMaterialData(@Nonnull ModelOverride modelOverride, UvType u | (isOverlay ? 1 : 0); } + public final int packMaterialData(@Nonnull ModelOverride modelOverride, UvType uvType, boolean isOverlay) { + return packMaterialData(modelOverride, uvType, isOverlay, false); + } + public void fillMaterialStruct( UBOMaterials.MaterialStruct struct, float vanillaScrollX, diff --git a/src/main/resources/rs117/hd/scene_frag.glsl b/src/main/resources/rs117/hd/scene_frag.glsl index 157549bad3..edfa7f8b96 100644 --- a/src/main/resources/rs117/hd/scene_frag.glsl +++ b/src/main/resources/rs117/hd/scene_frag.glsl @@ -475,12 +475,10 @@ void main() { #if DEVELOPMENT if(!isTerrain && highlightModelOverrides == 1 && (combinedMaterialData >> MATERIAL_FLAG_HIGHLIGHT_MODELS_WITHOUT_OVERRIDE & 1) == 1) { - float offset = elapsedTime * 25.0; - float mask = checkerboard(floor((IN.position + vec3(offset)) / 20.0), 1.0); + float mask = checkerboard(IN.position + vec3(elapsedTime * 25.0), 16.0); + float str = sin(((mod(elapsedTime, 10)) / 10.0) * PI) * 0.5; - vec3 highlightColor = mix(vec3(0.59, 0.58, 0.94), vec3(0.98, 0.78, 0.83), mask); - float str = sin(((mod(elapsedTime, 10)) / 10.0 ) * PI) * 0.5; - outputColor.rgb += highlightColor * str; + outputColor.rgb += mix(vec3(0.59, 0.58, 0.94), vec3(0.98, 0.78, 0.83), mask) * str; } #endif } From cc5c9aa3b60243d744de96cd36a2bb37fe2c8b34 Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Tue, 4 Aug 2026 23:04:38 +0100 Subject: [PATCH 3/4] Increased Cycle Speed --- src/main/resources/rs117/hd/scene_frag.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/rs117/hd/scene_frag.glsl b/src/main/resources/rs117/hd/scene_frag.glsl index edfa7f8b96..55bda9ca28 100644 --- a/src/main/resources/rs117/hd/scene_frag.glsl +++ b/src/main/resources/rs117/hd/scene_frag.glsl @@ -475,8 +475,8 @@ void main() { #if DEVELOPMENT if(!isTerrain && highlightModelOverrides == 1 && (combinedMaterialData >> MATERIAL_FLAG_HIGHLIGHT_MODELS_WITHOUT_OVERRIDE & 1) == 1) { - float mask = checkerboard(IN.position + vec3(elapsedTime * 25.0), 16.0); - float str = sin(((mod(elapsedTime, 10)) / 10.0) * PI) * 0.5; + float mask = checkerboard(IN.position + vec3(elapsedTime * 50.0), 16.0); + float str = sin(((mod(elapsedTime, 2.5)) / 2.5) * PI) * 0.5; outputColor.rgb += mix(vec3(0.59, 0.58, 0.94), vec3(0.98, 0.78, 0.83), mask) * str; } From 333a9b5c013f0cf6722808cd0a7619cb04da60ba Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Tue, 4 Aug 2026 23:15:40 +0100 Subject: [PATCH 4/4] Added Message when Model Highlighter is enabled/disabled --- .../java/rs117/hd/utils/DeveloperTools.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/rs117/hd/utils/DeveloperTools.java b/src/main/java/rs117/hd/utils/DeveloperTools.java index 8dc3e7de50..5e9c8a6681 100644 --- a/src/main/java/rs117/hd/utils/DeveloperTools.java +++ b/src/main/java/rs117/hd/utils/DeveloperTools.java @@ -5,6 +5,7 @@ import javax.inject.Singleton; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.*; import net.runelite.api.events.*; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.Keybind; @@ -38,6 +39,9 @@ public class DeveloperTools implements KeyListener { private static final Keybind KEY_TOGGLE_HIDE_UI = new Keybind(KeyEvent.VK_H, CTRL_DOWN_MASK); private static final Keybind KEY_RELOAD_SCENE = new Keybind(KeyEvent.VK_R, CTRL_DOWN_MASK); + @Inject + private Client client; + @Inject private ClientThread clientThread; @@ -112,6 +116,16 @@ public void deactivate() { hideUiEnabled = false; } + private void toggleModelOverrideHighlighter() { + highlightModelOverridesEnabled = !highlightModelOverridesEnabled; + clientThread.invoke(() -> client.addChatMessage( + ChatMessageType.GAMEMESSAGE, + "117 HD", + "