summaryrefslogtreecommitdiff
path: root/Plugin.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Plugin.cs')
-rwxr-xr-xPlugin.cs382
1 files 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>? 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<float>(wetnessAddr);
- wet.body = MemoryUtil.Read<float>(wetnessAddr + 0x28);
- wet.waist = MemoryUtil.Read<float>(wetnessAddr + 0x50);
- wet.legs = MemoryUtil.Read<float>(wetnessAddr + 0x78);
- return wet;
- }
-
- private void writeCharacterWetness(nint player, Wetness wet)
- {
- nint wetnessAddr = player + 0x13BD0;
- MemoryUtil.GetRef<float>(wetnessAddr) = wet.head;
- MemoryUtil.GetRef<float>(wetnessAddr + 0x28) = wet.body;
- MemoryUtil.GetRef<float>(wetnessAddr + 0x50) = wet.waist;
- MemoryUtil.GetRef<float>(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<float>(wetnessAddr) = wholeBodyWetness;
+ MemoryUtil.GetRef<float>(wetnessAddr + 0x28) = wholeBodyWetness;
+ MemoryUtil.GetRef<float>(wetnessAddr + 0x50) = wholeBodyWetness;
+ MemoryUtil.GetRef<float>(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<ProcessCameraDelegate>(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<ProcessCameraDelegate>(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<SetCameraTentDelegate>(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<SetCameraCutsceneDelegate>(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<CalculateViewDelegate>(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<WritePadInputDelegate>(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<CheckMovementDelegate>(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<RefreshEntityParams>(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<nint>(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<int>(player.Instance + 0x8938) |= (1 << 6);
+ MemoryUtil.GetRef<int>(player.Instance + 0x8968) |= (1 << 6);
+ }
+ nint slinger = MemoryUtil.Read<nint>(player.Instance + 0x8918);
+ if (slinger != 0x0)
+ {
+ ref byte sVisible = ref MemoryUtil.GetRef<byte>(slinger + 0x18);
+ ref byte sSub = ref MemoryUtil.GetRef<byte>(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<float>(wetnessAddr);
+ bodyWet = MemoryUtil.Read<float>(wetnessAddr + 0x28);
+ waistWet = MemoryUtil.Read<float>(wetnessAddr + 0x50);
+ legsWet = MemoryUtil.Read<float>(wetnessAddr + 0x78);
+ }
setZoneStateHook!.Original(player, flags);
- writeCharacterWetness(player, wet);
+ if (overridePlayerWetness)
+ {
+ MemoryUtil.GetRef<float>(wetnessAddr) = headWet;
+ MemoryUtil.GetRef<float>(wetnessAddr + 0x28) = bodyWet;
+ MemoryUtil.GetRef<float>(wetnessAddr + 0x50) = waistWet;
+ MemoryUtil.GetRef<float>(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<nint>(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<sbyte>(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<sbyte>(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<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'
+ else if (fullString.StartsWith("wp\\slg"))
{
- 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'
+ partName = "slinger";
+ armorPart = true;
}
- for (int i = 0; i < 3; i++)
+ else if (fullString.StartsWith("accessory\\acc"))
{
- n[i] = MemoryUtil.Read<sbyte>(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<sbyte>(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<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);
+ baseOffset = baseInner + ((bIndex + (bIndex * 4)) << 4);
+ ref byte bEnabled = ref MemoryUtil.GetRef<byte>(baseOffset);
+ ref byte bSub = ref MemoryUtil.GetRef<byte>(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<float>(wetnessAddr) = wet.head;
- }
- if (ImGui.DragFloat("Body", ref wet.body, 0.005f))
- {
- MemoryUtil.GetRef<float>(wetnessAddr + 0x28) = wet.body;
- }
- if (ImGui.DragFloat("Waist", ref wet.waist, 0.005f))
- {
- MemoryUtil.GetRef<float>(wetnessAddr + 0x50) = wet.waist;
- }
- if (ImGui.DragFloat("Legs", ref wet.legs, 0.005f))
- {
- MemoryUtil.GetRef<float>(wetnessAddr + 0x78) = wet.legs;
- }
+ ImGui.DragFloat("Head", ref MemoryUtil.GetRef<float>(wetnessAddr), 0.005f);
+ ImGui.DragFloat("Body", ref MemoryUtil.GetRef<float>(wetnessAddr + 0x28), 0.005f);
+ ImGui.DragFloat("Waist", ref MemoryUtil.GetRef<float>(wetnessAddr + 0x50), 0.005f);
+ ImGui.DragFloat("Legs", ref MemoryUtil.GetRef<float>(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<float>(wetnessAddr) = wholeBodyWetness;
- MemoryUtil.GetRef<float>(wetnessAddr + 0x28) = wholeBodyWetness;
- MemoryUtil.GetRef<float>(wetnessAddr + 0x50) = wholeBodyWetness;
- MemoryUtil.GetRef<float>(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<float>(wetnessAddr) = wholeBodyWetness;
- MemoryUtil.GetRef<float>(wetnessAddr + 0x28) = wholeBodyWetness;
- MemoryUtil.GetRef<float>(wetnessAddr + 0x50) = wholeBodyWetness;
- MemoryUtil.GetRef<float>(wetnessAddr + 0x78) = wholeBodyWetness;
+ overridePlayerWetnessEnable();
+ writePlayerWholeBodyWetness(wetnessAddr);
}
else
{
- overrideCharacterWetnessDisable();
+ overridePlayerWetnessDisable();
}
}
}
@@ -3384,8 +3340,10 @@ namespace NewCamera
debugLog($"OnImGuiRender() @ {frameTick}");
#endif
- Config config = ConfigManager.GetConfig<Config>(this);
float width = ImGui.GetWindowWidth();
+ width /= width / 600.0f;
+
+ Config config = ConfigManager.GetConfig<Config>(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();