Using the New Vegas Script Extender C++ API for Fallout New Vegas, I am able to write to the process' memory directly at runtime through a .dll plugin that's loaded by the NVSE injector. But it is not a debugger, like CheatEngine, so there's no automatic handling of inserting new code to an existing assembly function.
Beginning of the assembly function, TryOpenPipboy
, I want to inject code into: https://i.stack.imgur.com/xIqmA.png
EquipPlayerPipboy()
function I want to inject: https://i.stack.imgur.com/Gaujf.png
The game has a loop called MainUILoop
which runs every frame, and when the player presses tab without holding it down, TryOpenPipboy
is called.
My guess is that I need to somehow create a new empty block of memory, edit a copy of the original TryOpenPipboy
function, then replace all TryOpenPipboy
calls with my modified variant. But that would make a hard incompatibility with any other NVSE plugins that also modify the MainUILoop in any way, as well as any that edit TryOpenPipboy
.
Edit: Another possible way would be to change the jmp assembly to my C++ function, then call TryOpenPipboy
from my function. That would mean TryOpenPipboy
is still called, but is unmodified, increasing potential compatibility.
So how should I go about doing this?
TryOpenPipboy
: pastebin.com/feMycWYWTryOpenPipboy
is called: pastebin.com/mT0szzek