summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xPlugin.cs118
1 files changed, 118 insertions, 0 deletions
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<nint>(player.Instance + 0x2A0);
+ if (bodyArmor != 0x0)
+ {
+ nint next = bodyArmor - 0x40;
+ nint head = next;
+ nint prev = MemoryUtil.Read<nint>(next + 0x10);
+ for (;next != 0x0;)
+ {
+ ImGui.PushID(next);
+ nint vtable = MemoryUtil.Read<nint>(next + 0x40);
+ if (vtable == 0x143507A18)
+ {
+ sbyte[] n = new sbyte[4];
+ for (int i = 0; i < 4; i++)
+ {
+ n[i] = MemoryUtil.Read<sbyte>(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<sbyte>(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<sbyte>(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<sbyte>(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<sbyte>(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<sbyte>(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<sbyte>(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<sbyte>(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<int>(next + 0x58C);
+ nint baseInner = MemoryUtil.Read<nint>(next + 0x108);
+ nint offset = MemoryUtil.Read<nint>(next + 0x448);
+ for (int i = 0; i < parts; i++)
+ {
+ nint baseOffset = offset + (i * 0x4) + (parts * 0x4);
+ ref byte bIndex = ref MemoryUtil.GetRef<byte>(baseOffset);
+ ref byte bEnabled = ref MemoryUtil.GetRef<byte>(baseInner + ((bIndex + (bIndex * 4)) << 4));
+ ref byte bSub = ref MemoryUtil.GetRef<byte>(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<nint>(next + 0x10);
+ }
+ else
+ {
+ next = MemoryUtil.Read<nint>(next + 0x18);
+ if (next == 0x0)
+ {
+ head = prev;
+ next = prev;
+ }
+ }
+ }
+ }
+ }
+
nint controlsAddr = MemoryUtil.Read<nint>(player.Instance + 0x12608);
nint zoneStateAddr = MemoryUtil.Read<nint>(0x1451C42B8);
ZoneState zoneState = ZoneState.Unknown;