Files
WeirdUtils/IDEAS.md
T
MarcelineVQ b12fc820ef Publish source: Unlicense, public README, repo hygiene
The remote was previously a distribution-only point for pre-built DLLs.
This opens the source.

- LICENSE: Unlicense, with a GPL-3.0 carve-out for src/dpslog/WeirdDPSMate
  (a DPSMate fork that keeps its own license)
- README.md replaces the stale internal one with the user-facing docs from
  DLL_README.md, swapping the 'Why No Source Code?' section for build and
  layout notes. DLL_README.md is dropped; one README now serves both.
- RELEASING.md: drop the trim-the-README-per-release dance and the
  remote/WeirdUtils/ distribution clone, both obsolete now
- gitignore agent/editor scratch, build caches, the vendored WSBT addon,
  and the WeirdThreat/uwu-logs checkouts (separate upstream repos)
- Commit outstanding module work: superweirdo, clickthrough portal visuals,
  transform44 decompiles, worldmarkers demo presets, tools/
2026-07-27 21:47:55 -07:00

56 lines
3.3 KiB
Markdown

# Ideas
## Transmog Toggle
Add an option to the TW Options menu to disable all transmogs. Works for the
local player (we have the real item objects and can look up base entry IDs from
descriptors). Does NOT work for other players -- the server only sends the
transmogged item entry in VISIBLE_ITEM fields, and the real entry is never
transmitted to other clients. Would need server-side support (e.g. a packet
flag or CVar the server respects) to strip transmogs on other players.
## Minimap Icon Tooltips
Mouseover popups on minimap tracking blips showing NPC/object name and type.
Reference implementation already exists -- check how it's done there.
## Unusable Portal Visual + Click Blocking
Covers summoned ritual objects (type 18: healthstone, summoning portal, ritual
of refreshment/doom) and mage portals (type 22: GAMEOBJECT_TYPE_SPELLCASTER).
Three states to distinguish:
1. **Interactable** -- usable, normal rendering
2. **Not interactable** -- `CallSpellCastHandler` (0x5f8800) returns 0 (wrong faction, not in group)
3. **Interactable but locked** -- `CallSpellCastHandler` returns 1, `GAMEOBJECT_FLAGS & 0x02` (GO_FLAG_LOCKED) set
Goals:
- Prevent clicking GOs in states 2 and 3 (clickthrough module, GO filter pass)
- Render states 2/3 in greyscale or desaturated to visually distinguish from usable ones
Click blocking: DONE (portal_filter.zig in clickthrough module).
Greyscale rendering research:
- `SetModelAlpha` (0x710da0): writes float to sceneObject+0x1C4 (__thiscall). Alpha only.
- `SetAlphaValue` (0x76ac50): writes float to entity+0xBC, calls through vtable+0x8C.
- `SetModelAlpha_2` (0x76d120): reads byte at entity+0xC8, propagates to entity+0x318.
- Fade system (0x672ef0): writes alpha to entity[0x22] (entity+0x88) via SetMemoryPointer.
- D3D9 render states: outline module (d3d9_hook.zig) has full pattern for per-object
D3D state manipulation via stencil buffer.
- Greyscale options:
1. D3DRS_TEXTUREFACTOR + D3DTOP_MODULATE per draw call (set grey color before object draws)
2. Pixel shader override (D3D9 SetPixelShader to a desaturation shader)
3. Find an existing color tint field on the model instance (not found yet)
- `adjustColorSaturation` (0x74d794): client has a desaturation function built in.
Takes (outputRGBA*, inputRGBA*, saturationFactor). 0.0 = greyscale, 1.0 = full color.
Uses standard luminance weights at 0x818878/187c/1880. No xrefs found (may be unused).
- `GetModelDiffuseColor` / `SetModelDiffuseColor`: reads/writes sceneObject+0x184 (3 floats RGB).
`GetModelAmbientColor` / `SetModelAmbientColor`: sceneObject+0x190 (3 floats RGB).
`SetModelAlpha`: sceneObject+0x1C4 (1 float). These are data accessors, not code functions.
- M2 model rendering does NOT go through simple GxDevice SetTexture wrappers -- uses a
different submission path. Only RenderTextureQuads (UI) calls GxDevice::SetTexture.
- Viable approaches:
1. Write grey diffuse color (e.g. 0.3, 0.3, 0.3) to sceneObject+0x184 per frame
for targeted GOs. Need to find the GO -> scene object pointer chain.
2. Hook D3D9 DrawIndexedPrimitive (like outline module) and set D3DRS_TEXTUREFACTOR
to grey for targeted objects. Requires identifying which DIP calls belong to which GO.
3. Set alpha to 0.5 via sceneObject+0x1C4 for a simpler "faded" visual instead of greyscale.
- Next: find the GO -> entity -> scene object pointer chain so we can access +0x184.