2019-05-15 16:52:37 +02:00
|
|
|
#include "common.h"
|
|
|
|
#include "patcher.h"
|
|
|
|
#include "NodeName.h"
|
|
|
|
|
2019-06-12 14:35:15 +02:00
|
|
|
static int32 &gPluginOffset = *(int32*)0x64C610;
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
ID_NODENAME = MAKECHUNKID(rwVENDORID_ROCKSTAR, 0xFE),
|
|
|
|
};
|
2019-05-15 16:52:37 +02:00
|
|
|
|
|
|
|
#define NODENAMEEXT(o) (RWPLUGINOFFSET(char, o, gPluginOffset))
|
|
|
|
|
2019-06-12 14:35:15 +02:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2019-05-15 16:52:37 +02:00
|
|
|
char*
|
|
|
|
GetFrameNodeName(RwFrame *frame)
|
|
|
|
{
|
|
|
|
if(gPluginOffset < 0)
|
|
|
|
return nil;
|
|
|
|
return NODENAMEEXT(frame);
|
|
|
|
}
|