2014-09-02 06:13:03 +00:00
|
|
|
#include <cstdarg>
|
|
|
|
|
|
2014-08-18 19:22:13 +00:00
|
|
|
#include <DXAPI/SimObject.h>
|
|
|
|
|
|
2014-09-02 06:13:03 +00:00
|
|
|
#include <LinkerAPI.h>
|
|
|
|
|
|
2014-08-18 19:22:13 +00:00
|
|
|
namespace DX
|
|
|
|
|
{
|
2014-09-02 06:13:03 +00:00
|
|
|
SimObject::SimObject(unsigned int obj) : identifier(*(unsigned int*)(obj + 32)),
|
|
|
|
|
base_pointer_value(obj)
|
2014-08-18 19:22:13 +00:00
|
|
|
{
|
2014-11-16 22:53:23 +00:00
|
|
|
}
|
2014-08-18 19:22:13 +00:00
|
|
|
|
|
|
|
|
void SimObject::deleteObject(void)
|
|
|
|
|
{
|
|
|
|
|
void *pointer = (void*)this->base_pointer_value;
|
|
|
|
|
|
|
|
|
|
typedef void (__cdecl *deleteObjectFunc)(void);
|
2014-09-02 06:13:03 +00:00
|
|
|
static deleteObjectFunc function_call = (deleteObjectFunc)0x4268D0;
|
2014-08-18 19:22:13 +00:00
|
|
|
|
|
|
|
|
__asm
|
|
|
|
|
{
|
|
|
|
|
mov ecx, pointer;
|
|
|
|
|
lea eax, function_call;
|
|
|
|
|
mov eax, [eax];
|
|
|
|
|
call eax;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-09-02 06:13:03 +00:00
|
|
|
|
2014-09-03 16:57:25 +00:00
|
|
|
const char *SimObject::CallMethod(const char *name, unsigned int argc, ...)
|
2014-09-02 06:13:03 +00:00
|
|
|
{
|
|
|
|
|
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;
|
|
|
|
|
}
|
2014-08-18 19:22:13 +00:00
|
|
|
}
|