From c95b23e637fa1545a3ab2de0ec9b73d67332b4ad Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 9 Mar 2026 13:10:47 -0400 Subject: Very untested armor parts toggle Signed-off-by: Andrew Opalach --- Plugin.cs | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/Plugin.cs b/Plugin.cs index 2997701..860beb5 100755 --- a/Plugin.cs +++ b/Plugin.cs @@ -4371,6 +4371,124 @@ namespace MHWNewCamera { ImGui.Checkbox("Hide Weapon", ref hideWeapon); + if (ImGui.CollapsingHeader("Armor Parts")) + { + nint bodyArmor = MemoryUtil.Read(player.Instance + 0x2A0); + if (bodyArmor != 0x0) + { + nint next = bodyArmor - 0x40; + nint head = next; + nint prev = MemoryUtil.Read(next + 0x10); + for (;next != 0x0;) + { + ImGui.PushID(next); + nint vtable = MemoryUtil.Read(next + 0x40); + if (vtable == 0x143507A18) + { + sbyte[] n = new sbyte[4]; + for (int i = 0; i < 4; i++) + { + n[i] = MemoryUtil.Read(next + 0x62 + i); + } + string partName = ""; + bool armorPart = false; + if (n[0] == 'h' && n[1] == 'e' && n[2] == 'l' && n[3] == 'm') // '/helm/mod' + { + for (int i = 0; i < 4; i++) + { + n[i] = MemoryUtil.Read(next + 0x62 + 0xB + i); + } + partName = "helmet"; + armorPart = (n[0] == 'h' && n[1] == 'e' && n[2] == 'l' && n[3] == 'm'); // 'f_helm' + } + else if (n[0] == 'b' && n[1] == 'o' && n[2] == 'd' && n[3] == 'y') // 'body/mod' + { + for (int i = 0; i < 4; i++) + { + n[i] = MemoryUtil.Read(next + 0x62 + 0xB + i); + } + partName = "body"; + armorPart = (n[0] == 'b' && n[1] == 'o' && n[2] == 'd' && n[3] == 'y'); // 'f_body' + } + else if (n[0] == 'a' && n[1] == 'r' && n[2] == 'm') // '/arm/mod' + { + for (int i = 0; i < 3; i++) + { + n[i] = MemoryUtil.Read(next + 0x62 + 0xA + i); + } + partName = "arm"; + armorPart = (n[0] == 'a' && n[1] == 'r' && n[2] == 'm'); // 'f_arm' + } + else if (n[0] == 'w' && n[1] == 's' && n[2] == 't') // '/wst/mod' + { + for (int i = 0; i < 3; i++) + { + n[i] = MemoryUtil.Read(next + 0x62 + 0xA + i); + } + partName = "waist"; + armorPart = (n[0] == 'w' && n[1] == 's' && n[2] == 't'); // 'f_wst' + } + else if (n[0] == 'l' && n[1] == 'e' && n[2] == 'g') // '/leg/mod' + { + for (int i = 0; i < 3; i++) + { + n[i] = MemoryUtil.Read(next + 0x62 + 0xA + i); + } + partName = "leg"; + armorPart = (n[0] == 'l' && n[1] == 'e' && n[2] == 'g'); // 'f_leg' + } + for (int i = 0; i < 3; i++) + { + n[i] = MemoryUtil.Read(next + 0x4F + i); + } + if (n[0] == 's' && n[1] == 'l' && n[2] == 'g') // 'wp/slg' + { + for (int i = 0; i < 3; i++) + { + n[i] = MemoryUtil.Read(next + 0x53 + i); + } + partName = "slinger"; + armorPart = (n[0] == 's' && n[1] == 'l' && n[2] == 'g'); // 'slgXXX_XXXX' + } + if (armorPart) + { + ImGui.Text($"{partName}({next:x}):"); + int parts = MemoryUtil.Read(next + 0x58C); + nint baseInner = MemoryUtil.Read(next + 0x108); + nint offset = MemoryUtil.Read(next + 0x448); + for (int i = 0; i < parts; i++) + { + nint baseOffset = offset + (i * 0x4) + (parts * 0x4); + ref byte bIndex = ref MemoryUtil.GetRef(baseOffset); + ref byte bEnabled = ref MemoryUtil.GetRef(baseInner + ((bIndex + (bIndex * 4)) << 4)); + ref byte bSub = ref MemoryUtil.GetRef(baseInner + ((bIndex + (bIndex * 4)) << 4) + 0xB); + bool isVisible = bEnabled != 0x0; + if (ImGui.Checkbox($"Part #{i}", ref isVisible)) + { + (bEnabled, bSub) = (bSub, bEnabled); + } + } + ImGui.Separator(); + } + } + ImGui.PopID(); + if (head == prev) + { + next = MemoryUtil.Read(next + 0x10); + } + else + { + next = MemoryUtil.Read(next + 0x18); + if (next == 0x0) + { + head = prev; + next = prev; + } + } + } + } + } + nint controlsAddr = MemoryUtil.Read(player.Instance + 0x12608); nint zoneStateAddr = MemoryUtil.Read(0x1451C42B8); ZoneState zoneState = ZoneState.Unknown; -- cgit v1.2.3-101-g0448