From da824e8b778a0c2d1d167c3cde8022f62616f95b Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Thu, 14 May 2026 22:15:34 -0400 Subject: Armor parts and wetness cleanup, misc additions Signed-off-by: Andrew Opalach --- Plugin.cs | 382 ++++++++++++++++++++++++++++---------------------------------- 1 file changed, 170 insertions(+), 212 deletions(-) diff --git a/Plugin.cs b/Plugin.cs index 7393306..a260bd3 100755 --- a/Plugin.cs +++ b/Plugin.cs @@ -1,4 +1,4 @@ -//#define ADDR_ASSERTS +#define ENABLE_ASSERTS //#define HOOK_ORDER_ASSERTS //#define LOG_DEBUG_MESSAGES #define MOUSE_AND_KEYBOARD_LAYER @@ -6,7 +6,7 @@ using System.Numerics; using System.Runtime.InteropServices; -#if ADDR_ASSERTS || HOOK_ORDER_ASSERTS +#if ENABLE_ASSERTS using System.Diagnostics; #endif @@ -48,15 +48,12 @@ using SharpPluginLoader.Core.Configuration; // @TODO: // - pCamera refactor. // - Structured tuning tool interop. -// - Facial contact shadows incorrectly move based on camera position. // - Attempt to document all test cases I can think of. // - Wasd for ignore camera direction. // - Make audio like waterfall follow camera position instead of player position. // - Audio high/lowpass? -// - Better hook for renderer params. // - Centralize all bindings to get a better idea of how to structure custom binds. // - Use GetRef<>. -// - General "A/B Graphical Settings" function. // - Save toggle state to config file. // - Include Hide Weapon. // - Hunter effects: @@ -69,8 +66,6 @@ using SharpPluginLoader.Core.Configuration; // - Option to not adjust camera position on camera change. // - Better calculation for positioning camera behind the player. // - Underwater camera crashes in The Rotten Vale. -// - Adjust SSAO in cutscenes. -// - Read LOD bias setting from in-game setting (Low, Medium or High). // - Make left stick input a curve like Wilds. // - Deadzone? MonsterHunterWorld.exe+5831DB - comiss xmm1,[MonsterHunterWorld.exe+503C438] // - Ability to lock camera to a the player/a joint. @@ -80,19 +75,8 @@ using SharpPluginLoader.Core.Configuration; // - Thoroughly test "Disable Mod". // - Improve AOB scans. // - Better name for unknownPtr. -// - Some objects still fade. -// - Glass objects in research base and on the botanical research center table. -// - Decals on floor near Astera lift. -// - Hanging objects in the Seliana Gathering Hub (some events). -// - Manully set free camera viewport index. -// - Option to override in-game viewmode. // Known Issues: -// - Broken shadow areas due to game bug (more noticeable with increased shadow bias): -// - Exit of central camp in Horfrost Reach. -// - Sporepuff area in The Ancient Forest. -// - Wildspire Waste entrence to enclosed area past the waterfall. -// - The Rotten Vale jump out of Southeast Camp. Wall on the opposite side slightly to the left. // - Camera pitch wrap around while in the tent will sometimes flicker at the point of wrapping. // - Likely due to the unpredictable position of SetCameraTentHook() in the chain of hooks. Updating // free camera state within SetCameraTentHook() is not a solution because it comes out laggy. @@ -100,7 +84,8 @@ using SharpPluginLoader.Core.Configuration; // the tent the game freezes/uses the wrong camera. // Steam proton launch command: -// env DOTNET_ROOT="" WINEDLLOVERRIDES="msvcrt,dinput8=n,b" %command% +// env DOTNET_ROOT= WINEDLLOVERRIDES="ucrtbase,dinput8=n,b" %command% +// export CMD=$(echo -n "%command%" | sed "s/\/MonsterHunterWorld.exe/\/launcher.exe/") && DOTNET_ROOT= WINEDLLOVERRIDES="winmm,dinput8=n,b" eval proton-env $CMD MonsterHunterWorld.exe winmm.dll // Test cases: // Offset Perspective: @@ -143,10 +128,9 @@ using SharpPluginLoader.Core.Configuration; // - A night time in Astera, there will eventually be 3 hunters eating at the table next to the handler. // If this is broken, two of them will be invisible. // -// 3x Shadow Resolution: -// - The shadow of the "Waterfall Bridge" lift in Astera. -// - Walk up the stairs towards the canteen and the shadow of the lift will fade-out. Move the camera -// back and forth and make sure the lower resolution shadow aligns with the higher res one. +// Player Wetness: +// - Entering Change Equipment menu. +// - Changing zones. namespace NewCamera { @@ -158,6 +142,13 @@ namespace NewCamera private const float DEFAULT_FOV = Config.DEFAULT_FOV; private const float DEFAULT_NEAR_CLIP = Config.DEFAULT_NEAR_CLIP; + private static void Assert(bool condition) + { +#if ENABLE_ASSERTS + Trace.Assert(condition); +#endif + } + private static byte ByteFlag(bool f) { return f ? (byte)0x1 : (byte)0x0; } private bool disableMod = false; @@ -215,6 +206,7 @@ namespace NewCamera private float orbitMovementRotation = 0.0f; private float orbitDistance = 350.0f; private float orbitY = 150.0f; + private float orbitRight = 0.0f; private bool enableOffsetPerspective = false; private bool offsetPerspective = false; @@ -356,6 +348,8 @@ namespace NewCamera private bool saveSlotFallback = false; private int saveSlotIndex = 0; private bool hideWeapon = false; + private bool hideKnife = false; + private bool hideSlinger = false; private bool disableCollision = false; private bool disableExtraCollision = false; @@ -454,61 +448,34 @@ namespace NewCamera private delegate void RefreshEntityParams(nint entity, nint unknownPtr2); private Hook? refreshEntityParams; - private struct Wetness - { - public float head; - public float body; - public float waist; - public float legs; - public Wetness() - { - head = 0.0f; - body = 0.0f; - waist = 0.0f; - legs = 0.0f; - } - } - - private Wetness readCharacterWetness(nint player) - { - Wetness wet; - nint wetnessAddr = player + 0x13BD0; - wet.head = MemoryUtil.Read(wetnessAddr); - wet.body = MemoryUtil.Read(wetnessAddr + 0x28); - wet.waist = MemoryUtil.Read(wetnessAddr + 0x50); - wet.legs = MemoryUtil.Read(wetnessAddr + 0x78); - return wet; - } - - private void writeCharacterWetness(nint player, Wetness wet) - { - nint wetnessAddr = player + 0x13BD0; - MemoryUtil.GetRef(wetnessAddr) = wet.head; - MemoryUtil.GetRef(wetnessAddr + 0x28) = wet.body; - MemoryUtil.GetRef(wetnessAddr + 0x50) = wet.waist; - MemoryUtil.GetRef(wetnessAddr + 0x78) = wet.legs; - } - - private bool overrideCharacterWetness = false; - private Patch noopCharacterWetnessUpdate; + private bool overridePlayerWetness = false; + private Patch noopPlayerWetnessUpdate; private Patch jmpOverChangeEquipmentWetnessUpdate_1; private Patch jmpOverChangeEquipmentWetnessUpdate_2; private float wholeBodyWetness = 0.0f; - private void overrideCharacterWetnessEnable() + private void overridePlayerWetnessEnable() { - noopCharacterWetnessUpdate.Enable(); + noopPlayerWetnessUpdate.Enable(); jmpOverChangeEquipmentWetnessUpdate_1.Enable(); jmpOverChangeEquipmentWetnessUpdate_2.Enable(); } - private void overrideCharacterWetnessDisable() + private void overridePlayerWetnessDisable() { - noopCharacterWetnessUpdate.Disable(); + noopPlayerWetnessUpdate.Disable(); jmpOverChangeEquipmentWetnessUpdate_1.Disable(); jmpOverChangeEquipmentWetnessUpdate_2.Disable(); } + private void writePlayerWholeBodyWetness(nint wetnessAddr) + { + MemoryUtil.GetRef(wetnessAddr) = wholeBodyWetness; + MemoryUtil.GetRef(wetnessAddr + 0x28) = wholeBodyWetness; + MemoryUtil.GetRef(wetnessAddr + 0x50) = wholeBodyWetness; + MemoryUtil.GetRef(wetnessAddr + 0x78) = wholeBodyWetness; + } + private static readonly MtObject sOtomo = SingletonManager.GetSingleton("sOtomo")!; // Gui strings. @@ -603,14 +570,14 @@ namespace NewCamera // Place where we can check camera state early. IntPtr addr = PatternScanner.FindFirst(Pattern.FromString("40 53 48 81 EC 80 00 00 00 8B 81 B0 17 00 00 48 8B D9 85 C0 ?? ??")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x141FA11A0); // nint + Assert(addr == 0x141FA11A0); // nint #endif setCameraHook = Hook.Create(addr, SetCameraHook); // Place where we can adjust the camera position. addr = PatternScanner.FindFirst(Pattern.FromString("48 8B C4 55 41 57 48 81 EC D8 00 00 00 44 0F 29 40 B8 45 33 FF ?? ?? ?? ?? ?? ?? ?? ?? ?? 48 8B E9")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x141FA5380); // nint + Assert(addr == 0x141FA5380); // nint #endif calculateCameraHook = Hook.Create(addr, CalculateCameraHook); @@ -660,34 +627,34 @@ namespace NewCamera // Very special case for inside tent. addr = PatternScanner.FindFirst(Pattern.FromString("48 89 5C 24 10 48 89 6C 24 18 48 89 7C 24 20 41 56 48 83 EC 60 48 8B D9 0F 57 DB ?? ?? ?? ?? ?? ?? ?? 0F 57 D2 33 D2")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x142106450); // nint + Assert(addr == 0x142106450); // nint #endif setCameraTentHook = Hook.Create(addr, SetCameraTentHook); addr = PatternScanner.FindFirst(Pattern.FromString("48 8B C4 48 89 58 10 48 89 70 18 55 57 41 54 41 56 41 57 48 8D 6C 24 80 48 81 EC 80 01 00 00 0F 29 70 C8 48 8B F9 0F 29 78 B8 0F 57 C9 44 0F 29 40 A8 0F 57 F6 44 0F 29 48 98 44 0F 29 50 88")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x141FB12D0); // nint + Assert(addr == 0x141FB12D0); // nint #endif setCameraCutsceneHook = Hook.Create(addr, SetCameraCutsceneHook); /* addr = PatternScanner.FindFirst(Pattern.FromString("48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 48 89 7C 24 20 41 54 41 56 41 57 48 81 EC 90 00 00 00 ?? ?? ?? ?? ?? ?? ?? 48 8B F9")); #if ADDR_ASSERTS - Trace.Assert(addr == 0X14228EB60); // nint + Assert(addr == 0X14228EB60); // nint #endif calculateViewHook = Hook.Create(addr, CalculateViewHook); */ addr = PatternScanner.FindFirst(Pattern.FromString("48 89 5C 24 08 57 44 8B 9A 60 01 00 00 48 8B DA 41 0F BF 40 08 4D 8B D0 89 82 80 01 00 00 BF 00 10 00 00 41 0F BF 40 0A 89 82 84 01 00 00 41 0F BF 40 0C 89 82 78 01 00 00 41 0F BF 40 0E 89 82 7C 01 00 00")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x1422A1280); // nint, nint, nint + Assert(addr == 0x1422A1280); // nint, nint, nint #endif writePadInputHook = Hook.Create(addr, WritePadInputHook); // Place where we can change the analog stick value the game uses for player movement. addr = PatternScanner.FindFirst(Pattern.FromString("66 0F 6E C1 0F 5B C0 85 C9 78 11")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x142107CB0); // int, float + Assert(addr == 0x142107CB0); // int, float #endif checkMovementHook = Hook.Create(addr, CheckMovementHook); @@ -697,19 +664,19 @@ namespace NewCamera addr = PatternScanner.FindFirst(Pattern.FromString("84 C0 0F 84 ?? ?? ?? ?? 48 8B 57 28 45 33 C0 48 8B CE E8 ?? ?? ?? ?? 48 8B 97 E0 01 00 00 41 B0 01 48 8B CE E8 ?? ?? ?? ?? 48 8B 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8B D8")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x141E55D9E); + Assert(addr == 0x141E55D9E); #endif forceMinimapFollowsCamera = new Patch(addr + 0x3, [0xE9]); // je -> jmp. addr = PatternScanner.FindFirst(Pattern.FromString("48 89 5C 24 18 48 89 6C 24 20 57 48 83 EC 20 48 8B 59 68 48 8B FA 48 8B E9 48 85 DB 0F 84 ?? ?? ?? ?? 4C 89 74 24 38 4C 8B B3 80 00 00 00 4D 85 F6")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x14234DD60); + Assert(addr == 0x14234DD60); #endif jmpOverUi = new Patch(addr + 0x1C, [0xE9, 0x65, 0x01, 0x00, 0x00, 0x90]); addr = PatternScanner.FindFirst(Pattern.FromString("CC 48 89 5C 24 18 57 48 83 EC 30 48 89 74 24 48 48 8B D9 E8 ?? ?? ?? ?? 48 8B 8B B0 0D 00 00 8B 81 54 89 00 00 C1 E8 0D A8 01")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x1411A6A9F); + Assert(addr == 0x1411A6A9F); #endif noopCharacterFade = new Patch(addr + 0x13, [0x90, 0x90, 0x90, 0x90, 0x90]); // call MonsterHunterWorld.exe+11A6D50. if (disableCharacterFade && !disableMod) @@ -731,40 +698,40 @@ namespace NewCamera refreshEntityParams = Hook.Create(0x141F605F0, RefreshEntityParamsHook); // nint, nint - noopCharacterWetnessUpdate = new Patch(new IntPtr(0x14203E893), [0x90, 0x90, 0x90, 0x90, 0x90]); + noopPlayerWetnessUpdate = new Patch(new IntPtr(0x14203E893), [0x90, 0x90, 0x90, 0x90, 0x90]); jmpOverChangeEquipmentWetnessUpdate_1 = new Patch(new IntPtr(0x14203E310), [0xEB]); // je -> jmp. jmpOverChangeEquipmentWetnessUpdate_2 = new Patch(new IntPtr(0x14203E397), [0xE9, 0xB9, 0x00, 0x00, 0x00, 0x90]); // je -> jmp. // Noop collision checks. addr = PatternScanner.FindFirst(Pattern.FromString("F3 0F 11 06 F3 0F 10 48 04 F3 0F 58 4E 04 F3 0F 11 4E 04 F3 0F 10 40 08 F3 0F 58 46 08 F3 0F 11 46 08 44 8B AF E0 0B 00 00")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x141C001B5); + Assert(addr == 0x141C001B5); #endif disableXCollision = new Patch(addr, [0x90, 0x90, 0x90, 0x90]); #if ADDR_ASSERTS - Trace.Assert(addr + 0xE == 0x141C001C3); + Assert(addr + 0xE == 0x141C001C3); #endif disableYCollision = new Patch(addr + 0xE, [0x90, 0x90, 0x90, 0x90, 0x90]); #if ADDR_ASSERTS - Trace.Assert(addr + 0x1D == 0x141C001D2); + Assert(addr + 0x1D == 0x141C001D2); #endif disableZCollision = new Patch(addr + 0x1D, [0x90, 0x90, 0x90, 0x90, 0x90]); addr = PatternScanner.FindFirst(Pattern.FromString("F3 0F 11 46 04 F3 0F 10 46 08 F3 0F 5C C2 F3 0F 11 46 08 ?? ?? F3 0F")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x141C000D2); + Assert(addr == 0x141C000D2); #endif disableSecondaryYCollision = new Patch(addr, [0x90, 0x90, 0x90, 0x90, 0x90]); addr = PatternScanner.FindFirst(Pattern.FromString("F3 0F 11 46 04 F3 0F 10 58 08 F3 0F 58 5E 08 F3 0F 11 5E 08 44 8B 87 D0 0B 00 00 41 F6 C0 03")); #if ADDR_ASSERTS - Trace.Assert(addr == 0x141BFFF90); + Assert(addr == 0x141BFFF90); #endif disableExtraYCollision = new Patch(addr, [0x90, 0x90, 0x90, 0x90, 0x90]); addr = PatternScanner.FindFirst(Pattern.FromString("F3 0F 11 83 80 00 00 00 F3 0F 11 8B 84 00 00 00 F3 0F 11 93 88 00 00 00 89 B3 8C 00 00 00 8B 83 A4 01 00 00 C1 E8 05 44 0F 29 A4 24 D0 01 00 00 44 0F 29 B4 24 B0 01 00 00 A8 01")); #if ADDR_ASSERTS - Trace.Assert(addr + 0x8 == 0x1413259ED); + Assert(addr + 0x8 == 0x1413259ED); #endif disableGravityYUpdate = new Patch(addr + 0x8, [ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, @@ -777,7 +744,7 @@ namespace NewCamera addr = PatternScanner.FindFirst(Pattern.FromString("F3 0F 11 97 54 15 00 00 F3 0F 11 8F 58 15 00 00 F3 0F 10 47 68 F3 0F 5E D8 44 89 B7 6C 15 00 00 F3 0F 5E D0 F3 0F 5E C8 F3 0F 11 9F 60 15 00 00 F3 0F 11 97 64 15 00 00 F3 0F 11 8F 68 15 00 00")); #if ADDR_ASSERTS - Trace.Assert(addr + 0x40 == 0x141BFFF75); + Assert(addr + 0x40 == 0x141BFFF75); #endif disableGravityEval = new Patch(addr + 0x40, [0x90, 0x90, 0x90, 0x90, 0x90]); // call MonsterHunterWorld.exe+1325810. @@ -995,7 +962,7 @@ namespace NewCamera } #if HOOK_ORDER_ASSERTS - Trace.Assert(hookOrder == 0 || hookOrder == 4); + Assert(hookOrder == 0 || hookOrder == 4); hookOrder = 0; if (frameTick == int.MaxValue) frameTick = 0; else frameTick++; @@ -1019,9 +986,10 @@ namespace NewCamera } #endif + Player? player = null; if (freeCameraFallback) { - Player? player = checkPlayerChange(); + player = checkPlayerChange(); checkCurrentVisibleCamera(player); // Ensure vCamera is valid. if (vCamera != null) { @@ -1059,14 +1027,14 @@ namespace NewCamera advanceFrame--; } - if (hideWeapon) + player = Player.MainPlayer; + if (player == null && saveSlotFallback) { - Player? player = Player.MainPlayer; - if (player == null && saveSlotFallback) - { - player = getPlayerFromSaveSlot(saveSlotIndex); - } - if (player != null) + player = getPlayerFromSaveSlot(saveSlotIndex); + } + if (player != null) + { + if (hideWeapon) { nint baseAddr = MemoryUtil.Read(player.Instance + 0x76B0); MemoryUtil.WriteBytes(baseAddr + 0x1A98, [0x1]); @@ -1080,6 +1048,26 @@ namespace NewCamera } } } + if (hideKnife) + { + // Emulate what Carving and Flourish emote do at + // MonsterHunterWorld.exe+1F68832 - bts eax,06 + // if set, skips + // MonsterHunterWorld.exe+203A0D2 - bts ecx,01 + MemoryUtil.GetRef(player.Instance + 0x8938) |= (1 << 6); + MemoryUtil.GetRef(player.Instance + 0x8968) |= (1 << 6); + } + nint slinger = MemoryUtil.Read(player.Instance + 0x8918); + if (slinger != 0x0) + { + ref byte sVisible = ref MemoryUtil.GetRef(slinger + 0x18); + ref byte sSub = ref MemoryUtil.GetRef(slinger + 0x19); + bool slingerHidden = sVisible == 0x0; + if (hideSlinger != slingerHidden) + { + (sVisible, sSub) = (sSub, sVisible); + } + } } resetStatePerFrame(); @@ -1300,20 +1288,30 @@ namespace NewCamera { if (playerMovementLocked) { - orbitDistance -= Ly; - if (orbitDistance < 3.00f) + if (lockVerticalAndModifySpeed) { - orbitDistance = 3.00f; + orbitRight += Lx; + } + else + { + orbitDistance -= Ly; + if (orbitDistance < 3.00f) + { + orbitDistance = 3.00f; + } } } - orbitMovementRotation += Lx / 5.0f; - if (orbitMovementRotation >= 180.0f) - { - orbitMovementRotation -= 360.0f; - } - else if (orbitMovementRotation < -180.0f) + else { - orbitMovementRotation += 360.0f; + orbitMovementRotation += Lx / 5.0f; + if (orbitMovementRotation >= 180.0f) + { + orbitMovementRotation -= 360.0f; + } + else if (orbitMovementRotation < -180.0f) + { + orbitMovementRotation += 360.0f; + } } } else @@ -1531,14 +1529,16 @@ namespace NewCamera Player? player = Player.MainPlayer; if (orbitPlayer && player != null) { - Vector3 up = new Vector3(0.0f, 1.0f, 0.0f); Quaternion rotation = new Quaternion(player.Rotation.X, player.Rotation.Y, player.Rotation.Z, player.Rotation.W); - up = Vector3.Transform(up, rotation); + Vector3 up = Vector3.Transform(new Vector3(0.0f, 1.0f, 0.0f), rotation); + Vector3 right = Vector3.Transform(new Vector3(1.0f, 0.0f, 0.0f), rotation); orbitY += cameraFrame.Y; cameraTarget = player.Position; cameraTarget.X += orbitY * up.X; cameraTarget.Y += orbitY * up.Y; cameraTarget.Z += orbitY * up.Z; + cameraTarget.X += orbitRight * right.X; + cameraTarget.Z += orbitRight * right.Z; float dist = orbitDistance; cameraPosition.X = cameraTarget.X - dist * MathF.Cos(Single.DegreesToRadians(cameraPitch)) * MathF.Cos(Single.DegreesToRadians(cameraYaw)); cameraPosition.Y = cameraTarget.Y - dist * MathF.Sin(Single.DegreesToRadians(cameraPitch)); @@ -1601,7 +1601,7 @@ namespace NewCamera #if HOOK_ORDER_ASSERTS debugLog($"SetCameraHook({cameraPointer:X}) @ {frameTick}"); - Trace.Assert(hookOrder == 0); + Assert(hookOrder == 0); hookOrder = 1; #endif @@ -1612,7 +1612,7 @@ namespace NewCamera // CalculateCameraHook() is within this function. setCameraHook!.Original(cameraPointer); #if HOOK_ORDER_ASSERTS - Trace.Assert(hookOrder == 3); + Assert(hookOrder == 3); hookOrder = 4; #endif @@ -1650,7 +1650,7 @@ namespace NewCamera #if HOOK_ORDER_ASSERTS debugLog($"CalculateCameraHook({cameraPointer:X}) @ {frameTick}"); - Trace.Assert(hookOrder == 2); + Assert(hookOrder == 2); hookOrder = 3; #endif @@ -1732,7 +1732,7 @@ namespace NewCamera #if HOOK_ORDER_ASSERTS debugLog($"CheckCameraHook({cameraPointer:X}) @ {frameTick}"); - Trace.Assert(hookOrder == 1); + Assert(hookOrder == 1); hookOrder = 2; #endif @@ -2308,11 +2308,25 @@ namespace NewCamera zoneState = ByteFlag(overrideZoneState == ZoneState.Hub); } - Wetness wet = readCharacterWetness(player); + float headWet = 0.0f, bodyWet = 0.0f, waistWet = 0.0f, legsWet = 0.0f; + nint wetnessAddr = player + 0x13BD0; + if (overridePlayerWetness) + { + headWet = MemoryUtil.Read(wetnessAddr); + bodyWet = MemoryUtil.Read(wetnessAddr + 0x28); + waistWet = MemoryUtil.Read(wetnessAddr + 0x50); + legsWet = MemoryUtil.Read(wetnessAddr + 0x78); + } setZoneStateHook!.Original(player, flags); - writeCharacterWetness(player, wet); + if (overridePlayerWetness) + { + MemoryUtil.GetRef(wetnessAddr) = headWet; + MemoryUtil.GetRef(wetnessAddr + 0x28) = bodyWet; + MemoryUtil.GetRef(wetnessAddr + 0x50) = waistWet; + MemoryUtil.GetRef(wetnessAddr + 0x78) = legsWet; + } } #endif @@ -2522,7 +2536,7 @@ namespace NewCamera } ImGui.DragFloat3("Target", ref camera.Target, 0.425f); ImGui.DragFloat3("Up", ref camera.Up, 0.425f); - ImGui.PushItemWidth(width * 0.15f); + ImGui.PushItemWidth(width * 0.3f); ImGui.InputText("##Position Name", ref typedPositionName, 99); ImGui.SameLine(); if (ImGui.Button("Save")) @@ -2558,7 +2572,7 @@ namespace NewCamera { if (j == 0) { - if (ImGui.Selectable("(Deselect)")) + if (ImGui.Selectable("(None)")) { selectedPositionName = ""; } @@ -2699,7 +2713,8 @@ namespace NewCamera ImGui.Text($" Current: {currentAnimation}"); if (debug) { - ImGui.Text($" Frame: {animationLayer.CurrentFrame:0.000}/{animationLayer.MaxFrame:0.000}"); + ImGui.Text($" Frame: {animationLayer.CurrentFrame:0.000}/{animationLayer.MaxFrame:0.000}"); + return; } else @@ -2839,6 +2854,8 @@ namespace NewCamera private void drawPlayerInfo(Player player, float width) { ImGui.Checkbox("Hide Weapon", ref hideWeapon); + ImGui.Checkbox("Hide Knife", ref hideKnife); + ImGui.Checkbox("Hide Slinger", ref hideSlinger); if (ImGui.CollapsingHeader("Armor Parts")) { @@ -2852,82 +2869,31 @@ namespace NewCamera { ImGui.PushID(next); nint vtable = MemoryUtil.Read(next + 0x40); + // Player + 0x1373C = armor, Player + 0x13D8C = slinger if (vtable == 0x143507A18) { string partName = ""; bool armorPart = false; string fullString = Marshal.PtrToStringAnsi(next + 0x4C)!; - sbyte[] n = new sbyte[4]; - for (int i = 0; i < 3; i++) - { - n[i] = MemoryUtil.Read(next + 0x4C + i); - } - if (n[0] == 'n' && n[1] == 'p' && n[2] == 'c') + if (fullString.StartsWith("pl\\f_equip")) { - partName = "npc"; + partName = fullString.Split('\\')[3]; armorPart = true; } - for (int i = 0; i < 4; i++) - { - n[i] = MemoryUtil.Read(next + 0x62 + i); - } - 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' + else if (fullString.StartsWith("wp\\slg")) { - 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' + partName = "slinger"; + armorPart = true; } - for (int i = 0; i < 3; i++) + else if (fullString.StartsWith("accessory\\acc")) { - n[i] = MemoryUtil.Read(next + 0x4F + i); + partName = fullString.Split('\\')[1]; + armorPart = true; } - if (n[0] == 's' && n[1] == 'l' && n[2] == 'g') // 'wp/slg' + else if (fullString.StartsWith("npc\\npc")) { - 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' + partName = "npc"; + armorPart = true; } if (armorPart) { @@ -2940,8 +2906,9 @@ namespace NewCamera { 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); + baseOffset = baseInner + ((bIndex + (bIndex * 4)) << 4); + ref byte bEnabled = ref MemoryUtil.GetRef(baseOffset); + ref byte bSub = ref MemoryUtil.GetRef(baseOffset + 0xB); if (toggleAll) { (bEnabled, bSub) = (bSub, bEnabled); @@ -3183,49 +3150,38 @@ namespace NewCamera if (ImGui.CollapsingHeader("Wetness")) { - Wetness wet = readCharacterWetness(player.Instance); nint wetnessAddr = player.Instance + 0x13BD0; ImGui.PushItemWidth(width * 0.25f); - if (ImGui.DragFloat("Head", ref wet.head, 0.005f)) - { - MemoryUtil.GetRef(wetnessAddr) = wet.head; - } - if (ImGui.DragFloat("Body", ref wet.body, 0.005f)) - { - MemoryUtil.GetRef(wetnessAddr + 0x28) = wet.body; - } - if (ImGui.DragFloat("Waist", ref wet.waist, 0.005f)) - { - MemoryUtil.GetRef(wetnessAddr + 0x50) = wet.waist; - } - if (ImGui.DragFloat("Legs", ref wet.legs, 0.005f)) - { - MemoryUtil.GetRef(wetnessAddr + 0x78) = wet.legs; - } + ImGui.DragFloat("Head", ref MemoryUtil.GetRef(wetnessAddr), 0.005f); + ImGui.DragFloat("Body", ref MemoryUtil.GetRef(wetnessAddr + 0x28), 0.005f); + ImGui.DragFloat("Waist", ref MemoryUtil.GetRef(wetnessAddr + 0x50), 0.005f); + ImGui.DragFloat("Legs", ref MemoryUtil.GetRef(wetnessAddr + 0x78), 0.005f); + ImGui.PopItemWidth(); + ImGui.PushItemWidth(width * 0.35f); if (ImGui.DragFloat("Whole Body", ref wholeBodyWetness, 0.005f)) { - if (overrideCharacterWetness) + if (overridePlayerWetness) { - MemoryUtil.GetRef(wetnessAddr) = wholeBodyWetness; - MemoryUtil.GetRef(wetnessAddr + 0x28) = wholeBodyWetness; - MemoryUtil.GetRef(wetnessAddr + 0x50) = wholeBodyWetness; - MemoryUtil.GetRef(wetnessAddr + 0x78) = wholeBodyWetness; + writePlayerWholeBodyWetness(wetnessAddr); } } ImGui.PopItemWidth(); - if (ImGui.Checkbox("Override Player Wetness", ref overrideCharacterWetness)) + if (ImGui.Button("Reset")) + { + wholeBodyWetness = 0.0f; + writePlayerWholeBodyWetness(wetnessAddr); + } + ImGui.SameLine(); + if (ImGui.Checkbox("Override Player Wetness", ref overridePlayerWetness)) { - if (overrideCharacterWetness) + if (overridePlayerWetness) { - overrideCharacterWetnessEnable(); - MemoryUtil.GetRef(wetnessAddr) = wholeBodyWetness; - MemoryUtil.GetRef(wetnessAddr + 0x28) = wholeBodyWetness; - MemoryUtil.GetRef(wetnessAddr + 0x50) = wholeBodyWetness; - MemoryUtil.GetRef(wetnessAddr + 0x78) = wholeBodyWetness; + overridePlayerWetnessEnable(); + writePlayerWholeBodyWetness(wetnessAddr); } else { - overrideCharacterWetnessDisable(); + overridePlayerWetnessDisable(); } } } @@ -3384,8 +3340,10 @@ namespace NewCamera debugLog($"OnImGuiRender() @ {frameTick}"); #endif - Config config = ConfigManager.GetConfig(this); float width = ImGui.GetWindowWidth(); + width /= width / 600.0f; + + Config config = ConfigManager.GetConfig(this); // If we use vCamera or pCamera here, we need to ensure they're not invalid. Player? player = checkPlayerChange(); @@ -4218,7 +4176,7 @@ namespace NewCamera ImGui.Separator(); Monster[] monsters = Monster.GetAllMonsters(); - if (monsters.Length != 0 && ImGui.CollapsingHeader("Monsters")) + if (ImGui.CollapsingHeader("Monsters")) { for (int i = monsters.Length - 1; i >= 0; i--) { @@ -4234,7 +4192,7 @@ namespace NewCamera } Animal[] animals = Animal.GetAllAnimals(); - if (animals.Length != 0 && ImGui.CollapsingHeader("Animals")) + if (ImGui.CollapsingHeader("Animals")) { for (int i = animals.Length - 1; i >= 0; i--) { @@ -4253,8 +4211,6 @@ namespace NewCamera } } - ImGui.Separator(); - #if MOUSE_AND_KEYBOARD_LAYER ImGui.PushID("Mouse/Keyboard"); ImGui.Text("Mouse:"); @@ -4314,6 +4270,8 @@ namespace NewCamera ImGui.DragFloat("Distance", ref orbitDistance, 1.0f); ImGui.SameLine(); ImGui.DragFloat("Target Y", ref orbitY, 1.0f); + ImGui.SameLine(); + ImGui.DragFloat("Target Right", ref orbitRight, 1.0f); ImGui.DragFloat("Movement Rotation", ref orbitMovementRotation, 1.0f); ImGui.PopItemWidth(); ImGui.PopID(); -- cgit v1.2.3-101-g0448