T2-CPP/Mod Sources/TSExtension/BaseMod/DXAPI.cpp

90 lines
2.6 KiB
C++
Raw Normal View History

2014-08-05 04:46:46 +00:00
/**
* @file DXAPI.cpp
* @brief The DXAPI is an API that allows you to manipulate various game objects
* in Tribes 2 from raw C++ code. It dynamically resolves the addresses of member
* variables as you can't really trust the compiler to produce binary compatible classes,
* especially with all the inheritance involved in the original Tribes 2 codebase.
*
* This code wouldn't be possible without Linker's original gift on the-construct.net forums,
* whose files are appropriately labelled in this codebase. These files have been edited where
* appropriate in order to make that code play better with the DXAPI.
*
* @copyright (c) 2014 Robert MacGregor
*/
#include "DXAPI.h"
#include "LinkerAPI.h"
namespace DX
{
Player GetPlayerPointer(UnresolvedObject obj)
{
// Probably some way to do all this via assembly but screw me if I know
unsigned int base_tribes_pointer = (unsigned int)obj;
Player result =
{
0x00, // Object Name
*(unsigned int*)(base_tribes_pointer + 32), // Object ID
*(float*)(base_tribes_pointer + 168), // Position X
*(float*)(base_tribes_pointer + 184), // Position Y
*(float*)(base_tribes_pointer + 200), // Position Z
*(bool*)(base_tribes_pointer + 735), // Jetting State
*(bool*)(base_tribes_pointer + 734) // Jumping State
};
return result;
}
StaticShape GetStaticShapePointer(UnresolvedObject obj)
{
unsigned int base_tribes_pointer = (unsigned int)obj;
StaticShape result =
{
0x00, // Object Name
*(float*)(base_tribes_pointer + 200), // Position X
*(float*)(base_tribes_pointer + 200), // Position Y
*(float*)(base_tribes_pointer + 200) // Position Z
};
return result;
}
SimGroup GetSimGroupPointer(UnresolvedObject obj)
{
unsigned int base_tribes_pointer = (unsigned int)obj;
SimGroup result =
{
};
return result;
}
FlyingVehicle GetFlyingVehiclePointer(UnresolvedObject obj)
{
unsigned int base_tribes_pointer = (unsigned int)obj;
FlyingVehicle result =
{
*(float*)(base_tribes_pointer + 2200), // Strafing Status
};
return result;
}
void Projectile_explode(Projectile *obj, const Point3F &position, const Point3F &normal, const unsigned int collideType)
{
typedef void (__cdecl *explodeFunc)(const Point3F &position, const Point3F &normal, const unsigned int collideType);
static explodeFunc function_call = (explodeFunc)0x62DC30;
__asm {
push collideType;
push normal;
push position;
mov ecx,obj;
lea eax, function_call;
mov eax, [eax];
call eax;
}
}
}