From 83cc43eeff8c4f3dc34fdd4df789e9b9cecaac8e Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 12 Jun 2019 14:35:15 +0200 Subject: [PATCH] added NodeName plugin --- src/NodeName.cpp | 64 +++++++++++++++++++++++++++++++++++++++++++++++- src/NodeName.h | 1 + src/main.cpp | 4 +-- 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/NodeName.cpp b/src/NodeName.cpp index c2ffe048..2aea3c83 100644 --- a/src/NodeName.cpp +++ b/src/NodeName.cpp @@ -2,10 +2,72 @@ #include "patcher.h" #include "NodeName.h" -int &gPluginOffset = *(int*)0x64C610; +static int32 &gPluginOffset = *(int32*)0x64C610; + +enum +{ + ID_NODENAME = MAKECHUNKID(rwVENDORID_ROCKSTAR, 0xFE), +}; #define NODENAMEEXT(o) (RWPLUGINOFFSET(char, o, gPluginOffset)) +void* +NodeNameConstructor(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject) +{ + if(gPluginOffset > 0) + NODENAMEEXT(object)[0] = '\0'; + return object; +} + +void* +NodeNameDestructor(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject) +{ + return object; +} + +void* +NodeNameCopy(void *dstObject, const void *srcObject, RwInt32 offsetInObject, RwInt32 sizeInObject) +{ + strncpy(NODENAMEEXT(dstObject), NODENAMEEXT(srcObject), 23); + return nil; +} + +RwStream* +NodeNameStreamRead(RwStream *stream, RwInt32 binaryLength, void *object, RwInt32 offsetInObject, RwInt32 sizeInObject) +{ + RwStreamRead(stream, NODENAMEEXT(object), binaryLength); + NODENAMEEXT(object)[binaryLength] = '\0'; + return stream; +} + +RwStream* +NodeNameStreamWrite(RwStream *stream, RwInt32 binaryLength, const void *object, RwInt32 offsetInObject, RwInt32 sizeInObject) +{ + RwStreamWrite(stream, NODENAMEEXT(object), binaryLength); + return stream; +} + +RwInt32 +NodeNameStreamGetSize(const void *object, RwInt32 offsetInObject, RwInt32 sizeInObject) +{ + // game checks for null pointer on node name extension but that really happen + return rwstrlen(NODENAMEEXT(object)); +} + +bool +NodeNamePluginAttach(void) +{ + gPluginOffset = RwFrameRegisterPlugin(24, ID_NODENAME, + NodeNameConstructor, + NodeNameDestructor, + NodeNameCopy); + RwFrameRegisterPluginStream(ID_NODENAME, + NodeNameStreamRead, + NodeNameStreamWrite, + NodeNameStreamGetSize); + return gPluginOffset != -1; +} + char* GetFrameNodeName(RwFrame *frame) { diff --git a/src/NodeName.h b/src/NodeName.h index a4dcf0cf..1a3e057b 100644 --- a/src/NodeName.h +++ b/src/NodeName.h @@ -1,3 +1,4 @@ #pragma once +bool NodeNamePluginAttach(void); char *GetFrameNodeName(RwFrame *frame); diff --git a/src/main.cpp b/src/main.cpp index e56d6938..e0fd8544 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,6 +33,7 @@ #include "Garages.h" #include "MusicManager.h" #include "VisibilityPlugins.h" +#include "NodeName.h" #include "DMAudio.h" #include "CutsceneMgr.h" #include "Lights.h" @@ -55,9 +56,6 @@ WRAPPER void CameraSize(RwCamera *camera, void *rect, float viewWindow, float aspectRatio) { EAXJMP(0x527170); } -//WRAPPER RwBool RpAnimBlendPluginAttach() { EAXJMP(0x4052D0); } -WRAPPER RwBool NodeNamePluginAttach() { EAXJMP(0x527100); } - bool &b_FoundRecentSavedGameWantToLoad = *(bool*)0x95CDA8;