mirror of
https://github.com/Ragora/T2-CPP.git
synced 2026-01-20 10:34:45 +00:00
89 lines
2 KiB
C++
89 lines
2 KiB
C++
#include <cstdarg>
|
|
|
|
#include <DXAPI/SimObject.h>
|
|
|
|
#include <LinkerAPI.h>
|
|
|
|
namespace DX
|
|
{
|
|
SimObject::SimObject(unsigned int obj) :
|
|
identifier(MEMBER_FIELD(obj, unsigned int, 32)),
|
|
fieldDictionary(MEMBER_FIELD(obj, unsigned int, 0x2C)),
|
|
dataBlock(MEMBER_FIELD(obj, unsigned int, 0x248)),
|
|
base_pointer_value(MEMBER_FIELD(obj, unsigned int, 0)),
|
|
mName(MEMBER_FIELD(obj, char, 4)),
|
|
type(MEMBER_FIELD(obj, TypeMasks, 0x28))
|
|
{
|
|
}
|
|
|
|
void SimObject::deleteObject(void)
|
|
{
|
|
void *pointer = (void*)this->base_pointer_value;
|
|
|
|
typedef void (__cdecl *deleteObjectFunc)(void);
|
|
static deleteObjectFunc function_call = (deleteObjectFunc)0x4268D0;
|
|
|
|
__asm
|
|
{
|
|
mov ecx, pointer;
|
|
lea eax, function_call;
|
|
mov eax, [eax];
|
|
call eax;
|
|
}
|
|
}
|
|
|
|
const char *SimObject::CallMethod(const char *name, unsigned int argc, ...)
|
|
{
|
|
char **argv = (char**)malloc(sizeof(char*) * (2 + argc));
|
|
argv[0]= (char*)name;
|
|
argv[1] = "";
|
|
|
|
va_list vargs;
|
|
va_start(vargs, argc);
|
|
|
|
for (unsigned int iteration = 0; iteration < argc; iteration++)
|
|
argv[2 + iteration] = va_arg(vargs, char*);
|
|
va_end(vargs);
|
|
|
|
const char *result = Con::executem((Linker::SimObject*)this->base_pointer_value, 2 + argc, (const char**)argv);
|
|
free(argv);
|
|
|
|
return result;
|
|
}
|
|
|
|
const char *SimObject::getFieldValue(const char *slotname)
|
|
{
|
|
void * getfieldvalueptr=(void *)0x435210;
|
|
const char* retptr;
|
|
void * thisptr=(void *)this->base_pointer_value;
|
|
void * fieldDictPtr=(void*)this->fieldDictionary;
|
|
if (this->base_pointer_value!=0 && this->fieldDictionary!=0) {
|
|
__asm {
|
|
push slotname
|
|
mov ecx,fieldDictPtr
|
|
call getfieldvalueptr
|
|
mov retptr,eax
|
|
};
|
|
if (retptr != NULL) {
|
|
return retptr;
|
|
} else {
|
|
return "";
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
void SimObject::setDataField(const char *slotname, const char *array, const char *value)
|
|
{
|
|
void * setfieldptr=(void *)0x4364E0;
|
|
void * retptr;
|
|
void * thisptr=(void *)this->base_pointer_value;
|
|
__asm {
|
|
push value
|
|
push array
|
|
push slotname
|
|
mov ecx,thisptr
|
|
call setfieldptr
|
|
};
|
|
return;
|
|
}
|
|
} |