Header-only library for Blockland DLL developers to handle known object layouts in memory

Queuenard eac8dbf38e Added class functions, fixed typo 1 year ago
BLstructs eac8dbf38e Added class functions, fixed typo 1 year ago
README.md d594b321a6 Initial commit 2 years ago

README.md

libBLstructs

This is a header-only library for Blockland DLL developers to handle known object layouts in memory. There are also two class-checking functions, one specific to SimObject derivatives and one for all other C++ classes.

It is recommended to have an "include" folder in your project and to have these headers inside a "BLstructs" folder. The following will include everything defined by this project: #include "BLstructs/include.hpp"

As an example, 31 of the 32 fields of SimObject and all 3 fields of SimSet are known:

//0 + 52 bytes
#define ClassStruct_SimObject \
	void* vftable; \
	const char* objectName; \
	SimObject* nextNameObject; \
	SimObject* nextManagerNameObject; \
	SimObject* nextIdObject; \
	SimGroup* mGroup; \
	U32 mFlags; \
	Notify* mNotifyList; \
	U32 id; /* +32 */ \
	Namespace* mNamespace; /* +36 */ \
	unsigned int mTypeMask; \
	void* SimObject_0[1]; \
	void* mFieldDictionary; \

struct SimObject
{
	ClassStruct_SimObject
};



//52 + 12 bytes
#define ClassStruct_SimSet \
	U32 mElementCount; /* +52 */ \
	U32 mArraySize; /* +56 */ \
	SimObject* (*mArray)[]; /* +60 */ \

struct SimSet
{
	ClassStruct_SimObject
	ClassStruct_SimSet
};

You can then use these structs in functions and also test classnames. Example usage:

int get_simset_size(ADDR objADDR, int argc, const char *argv[])
{
	//There is also the option of casting directly to SimSet* but you must not forget to stop any processing if the class check fails
	SimObject* obj = (SimObject*)objADDR;

	if(NamespaceClasses_instanceOf(obj, "SimSet") <= 0)
		return -1;

	SimSet* objSimSet = (SimSet*)obj;

	return objSimSet->mElementCount;
}