mirror of
https://github.com/0TheSpy/Seaside.git
synced 2025-01-07 10:03:29 +08:00
505 lines
12 KiB
C++
505 lines
12 KiB
C++
#ifndef DATATABLE_RECV_H
|
|
#define DATATABLE_RECV_H
|
|
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "dt_common.h"
|
|
#include "dbg.h"
|
|
|
|
|
|
#define ADDRESSPROXY_NONE -1
|
|
|
|
|
|
class RecvTable;
|
|
class RecvProp;
|
|
|
|
|
|
class CRecvProxyData
|
|
{
|
|
public:
|
|
const RecvProp* m_pRecvProp;
|
|
|
|
DVariant m_Value;
|
|
|
|
int m_iElement;
|
|
|
|
int m_ObjectID;
|
|
};
|
|
|
|
|
|
typedef void (*RecvVarProxyFn)(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
|
|
typedef void (*ArrayLengthRecvProxyFn)(void* pStruct, int objectID, int currentArrayLength);
|
|
|
|
|
|
typedef void (*DataTableRecvVarProxyFn)(const RecvProp* pProp, void** pOut, void* pData, int objectID);
|
|
|
|
|
|
class CStandardRecvProxies
|
|
{
|
|
public:
|
|
CStandardRecvProxies();
|
|
|
|
RecvVarProxyFn m_Int32ToInt8;
|
|
RecvVarProxyFn m_Int32ToInt16;
|
|
RecvVarProxyFn m_Int32ToInt32;
|
|
RecvVarProxyFn m_FloatToFloat;
|
|
RecvVarProxyFn m_VectorToVector;
|
|
#ifdef SUPPORTS_INT64
|
|
RecvVarProxyFn m_Int64ToInt64;
|
|
#endif
|
|
};
|
|
extern CStandardRecvProxies g_StandardRecvProxies;
|
|
|
|
|
|
class CRecvDecoder;
|
|
|
|
|
|
class RecvProp
|
|
{
|
|
public:
|
|
RecvProp();
|
|
|
|
void InitArray(int nElements, int elementStride);
|
|
|
|
int GetNumElements() const;
|
|
void SetNumElements(int nElements);
|
|
|
|
int GetElementStride() const;
|
|
void SetElementStride(int stride);
|
|
|
|
int GetFlags() const;
|
|
|
|
const char* GetName() const;
|
|
SendPropType GetType() const;
|
|
|
|
RecvTable* GetDataTable() const;
|
|
void SetDataTable(RecvTable* pTable);
|
|
|
|
RecvVarProxyFn GetProxyFn() const;
|
|
void SetProxyFn(RecvVarProxyFn fn);
|
|
|
|
DataTableRecvVarProxyFn GetDataTableProxyFn() const;
|
|
void SetDataTableProxyFn(DataTableRecvVarProxyFn fn);
|
|
|
|
int GetOffset() const;
|
|
void SetOffset(int o);
|
|
|
|
RecvProp* GetArrayProp() const;
|
|
void SetArrayProp(RecvProp* pProp);
|
|
|
|
void SetArrayLengthProxy(ArrayLengthRecvProxyFn proxy);
|
|
ArrayLengthRecvProxyFn GetArrayLengthProxy() const;
|
|
|
|
bool IsInsideArray() const;
|
|
void SetInsideArray();
|
|
|
|
const void* GetExtraData() const;
|
|
void SetExtraData(const void* pData);
|
|
|
|
const char* GetParentArrayPropName();
|
|
void SetParentArrayPropName(const char* pArrayPropName);
|
|
|
|
public:
|
|
|
|
const char* m_pVarName;
|
|
SendPropType m_RecvType;
|
|
int m_Flags;
|
|
int m_StringBufferSize;
|
|
|
|
|
|
bool m_bInsideArray;
|
|
|
|
const void* m_pExtraData;
|
|
|
|
RecvProp* m_pArrayProp;
|
|
ArrayLengthRecvProxyFn m_ArrayLengthProxy;
|
|
|
|
RecvVarProxyFn m_ProxyFn;
|
|
DataTableRecvVarProxyFn m_DataTableProxyFn;
|
|
|
|
RecvTable* m_pDataTable;
|
|
int m_Offset;
|
|
|
|
int m_ElementStride;
|
|
int m_nElements;
|
|
|
|
const char* m_pParentArrayPropName;
|
|
};
|
|
|
|
|
|
class RecvTable
|
|
{
|
|
public:
|
|
|
|
typedef RecvProp PropType;
|
|
|
|
RecvTable();
|
|
RecvTable(RecvProp* pProps, int nProps, const char* pNetTableName);
|
|
~RecvTable();
|
|
|
|
void Construct(RecvProp* pProps, int nProps, const char* pNetTableName);
|
|
|
|
int GetNumProps();
|
|
RecvProp* GetProp(int i);
|
|
|
|
const char* GetName();
|
|
|
|
void SetInitialized(bool bInitialized);
|
|
bool IsInitialized() const;
|
|
|
|
void SetInMainList(bool bInList);
|
|
bool IsInMainList() const;
|
|
|
|
|
|
public:
|
|
|
|
RecvProp* m_pProps;
|
|
int m_nProps;
|
|
|
|
CRecvDecoder* m_pDecoder;
|
|
|
|
const char* m_pNetTableName;
|
|
|
|
|
|
bool m_bInitialized;
|
|
bool m_bInMainList;
|
|
};
|
|
|
|
|
|
inline int RecvTable::GetNumProps()
|
|
{
|
|
return m_nProps;
|
|
}
|
|
|
|
inline RecvProp* RecvTable::GetProp(int i)
|
|
{
|
|
Assert(i >= 0 && i < m_nProps);
|
|
return &m_pProps[i];
|
|
}
|
|
|
|
inline const char* RecvTable::GetName()
|
|
{
|
|
return m_pNetTableName;
|
|
}
|
|
|
|
inline void RecvTable::SetInitialized(bool bInitialized)
|
|
{
|
|
m_bInitialized = bInitialized;
|
|
}
|
|
|
|
inline bool RecvTable::IsInitialized() const
|
|
{
|
|
return m_bInitialized;
|
|
}
|
|
|
|
inline void RecvTable::SetInMainList(bool bInList)
|
|
{
|
|
m_bInMainList = bInList;
|
|
}
|
|
|
|
inline bool RecvTable::IsInMainList() const
|
|
{
|
|
return m_bInMainList;
|
|
}
|
|
|
|
|
|
#define BEGIN_RECV_TABLE(className, tableName) \
|
|
BEGIN_RECV_TABLE_NOBASE(className, tableName) \
|
|
RecvPropDataTable("baseclass", 0, 0, className::BaseClass::m_pClassRecvTable, DataTableRecvProxy_StaticDataTable),
|
|
|
|
#define BEGIN_RECV_TABLE_NOBASE(className, tableName) \
|
|
template <typename T> int ClientClassInit(T *); \
|
|
namespace tableName { \
|
|
struct ignored; \
|
|
} \
|
|
template <> int ClientClassInit<tableName::ignored>(tableName::ignored *); \
|
|
namespace tableName { \
|
|
RecvTable g_RecvTable; \
|
|
int g_RecvTableInit = ClientClassInit((tableName::ignored *)NULL); \
|
|
} \
|
|
template <> int ClientClassInit<tableName::ignored>(tableName::ignored *) \
|
|
{ \
|
|
typedef className currentRecvDTClass; \
|
|
const char *pRecvTableName = #tableName; \
|
|
RecvTable &RecvTable = tableName::g_RecvTable; \
|
|
static RecvProp RecvProps[] = { \
|
|
RecvPropInt("should_never_see_this", 0, sizeof(int)),
|
|
|
|
#define END_RECV_TABLE() \
|
|
}; \
|
|
RecvTable.Construct(RecvProps+1, sizeof(RecvProps) / sizeof(RecvProp) - 1, pRecvTableName); \
|
|
return 1; \
|
|
}
|
|
|
|
|
|
#define RECVINFO(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName)
|
|
#define RECVINFO_NAME(varName, remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName)
|
|
#define RECVINFO_STRING(varName) #varName, offsetof(currentRecvDTClass, varName), STRINGBUFSIZE(currentRecvDTClass, varName)
|
|
#define RECVINFO_BASECLASS(tableName) RecvPropDataTable("this", 0, 0, &REFERENCE_RECV_TABLE(tableName))
|
|
#define RECVINFO_ARRAY(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName[0]), sizeof(((currentRecvDTClass*)0)->varName)/sizeof(((currentRecvDTClass*)0)->varName[0])
|
|
|
|
#define RECVINFO_NOSIZE(varName) #varName, offsetof(currentRecvDTClass, varName)
|
|
#define RECVINFO_DT(varName) RECVINFO_NOSIZE(varName)
|
|
#define RECVINFO_DTNAME(varName,remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName)
|
|
|
|
|
|
void RecvProxy_FloatToFloat(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
void RecvProxy_VectorToVector(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
void RecvProxy_VectorXYToVectorXY(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
void RecvProxy_QuaternionToQuaternion(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
void RecvProxy_Int32ToInt8(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
void RecvProxy_Int32ToInt16(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
void RecvProxy_StringToString(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
void RecvProxy_Int32ToInt32(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
#ifdef SUPPORTS_INT64
|
|
void RecvProxy_Int64ToInt64(const CRecvProxyData* pData, void* pStruct, void* pOut);
|
|
#endif
|
|
|
|
void DataTableRecvProxy_StaticDataTable(const RecvProp* pProp, void** pOut, void* pData, int objectID);
|
|
|
|
void DataTableRecvProxy_PointerDataTable(const RecvProp* pProp, void** pOut, void* pData, int objectID);
|
|
|
|
|
|
RecvProp RecvPropFloat(
|
|
const char* pVarName,
|
|
int offset,
|
|
int sizeofVar = SIZEOF_IGNORE,
|
|
int flags = 0,
|
|
RecvVarProxyFn varProxy = RecvProxy_FloatToFloat
|
|
);
|
|
|
|
RecvProp RecvPropVector(
|
|
const char* pVarName,
|
|
int offset,
|
|
int sizeofVar = SIZEOF_IGNORE,
|
|
int flags = 0,
|
|
RecvVarProxyFn varProxy = RecvProxy_VectorToVector
|
|
);
|
|
|
|
RecvProp RecvPropVectorXY(
|
|
const char* pVarName,
|
|
int offset,
|
|
int sizeofVar = SIZEOF_IGNORE,
|
|
int flags = 0,
|
|
RecvVarProxyFn varProxy = RecvProxy_VectorXYToVectorXY
|
|
);
|
|
|
|
#define RecvPropQAngles RecvPropVector
|
|
|
|
#if 0
|
|
|
|
RecvProp RecvPropQuaternion(
|
|
const char* pVarName,
|
|
int offset,
|
|
int sizeofVar = SIZEOF_IGNORE,
|
|
int flags = 0,
|
|
RecvVarProxyFn varProxy = RecvProxy_QuaternionToQuaternion
|
|
);
|
|
#endif
|
|
|
|
RecvProp RecvPropInt(
|
|
const char* pVarName,
|
|
int offset,
|
|
int sizeofVar = SIZEOF_IGNORE,
|
|
int flags = 0,
|
|
RecvVarProxyFn varProxy = 0
|
|
);
|
|
|
|
RecvProp RecvPropString(
|
|
const char* pVarName,
|
|
int offset,
|
|
int bufferSize,
|
|
int flags = 0,
|
|
RecvVarProxyFn varProxy = RecvProxy_StringToString
|
|
);
|
|
|
|
RecvProp RecvPropDataTable(
|
|
const char* pVarName,
|
|
int offset,
|
|
int flags,
|
|
RecvTable* pTable,
|
|
DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable
|
|
);
|
|
|
|
RecvProp RecvPropArray3(
|
|
const char* pVarName,
|
|
int offset,
|
|
int sizeofVar,
|
|
int elements,
|
|
RecvProp pArrayProp,
|
|
DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable
|
|
);
|
|
|
|
RecvProp InternalRecvPropArray(
|
|
const int elementCount,
|
|
const int elementStride,
|
|
const char* pName,
|
|
ArrayLengthRecvProxyFn proxy
|
|
);
|
|
|
|
|
|
#define RecvPropVirtualArray( arrayLengthProxy, maxArrayLength, varTemplate, propertyName ) \
|
|
varTemplate, \
|
|
InternalRecvPropArray( \
|
|
maxArrayLength, \
|
|
0, \
|
|
#propertyName, \
|
|
arrayLengthProxy \
|
|
)
|
|
|
|
|
|
#define RecvPropVariableLengthArray( arrayLengthProxy, varTemplate, arrayName ) \
|
|
varTemplate, \
|
|
InternalRecvPropArray( \
|
|
sizeof(((currentRecvDTClass*)0)->arrayName) / PROPSIZEOF(currentRecvDTClass, arrayName[0]), \
|
|
PROPSIZEOF(currentRecvDTClass, arrayName[0]), \
|
|
#arrayName, \
|
|
arrayLengthProxy \
|
|
)
|
|
|
|
|
|
#define RecvPropArray( varTemplate, arrayName ) \
|
|
RecvPropVariableLengthArray( 0, varTemplate, arrayName )
|
|
|
|
|
|
#define RecvPropArray2( arrayLengthProxy, varTemplate, elementCount, elementStride, arrayName ) \
|
|
varTemplate, \
|
|
InternalRecvPropArray( elementCount, elementStride, #arrayName, arrayLengthProxy )
|
|
|
|
|
|
inline void RecvProp::InitArray(int nElements, int elementStride)
|
|
{
|
|
m_RecvType = DPT_Array;
|
|
m_nElements = nElements;
|
|
m_ElementStride = elementStride;
|
|
}
|
|
|
|
inline int RecvProp::GetNumElements() const
|
|
{
|
|
return m_nElements;
|
|
}
|
|
|
|
inline void RecvProp::SetNumElements(int nElements)
|
|
{
|
|
m_nElements = nElements;
|
|
}
|
|
|
|
inline int RecvProp::GetElementStride() const
|
|
{
|
|
return m_ElementStride;
|
|
}
|
|
|
|
inline void RecvProp::SetElementStride(int stride)
|
|
{
|
|
m_ElementStride = stride;
|
|
}
|
|
|
|
inline int RecvProp::GetFlags() const
|
|
{
|
|
return m_Flags;
|
|
}
|
|
|
|
inline const char* RecvProp::GetName() const
|
|
{
|
|
return m_pVarName;
|
|
}
|
|
|
|
inline SendPropType RecvProp::GetType() const
|
|
{
|
|
return m_RecvType;
|
|
}
|
|
|
|
inline RecvTable* RecvProp::GetDataTable() const
|
|
{
|
|
return m_pDataTable;
|
|
}
|
|
|
|
inline void RecvProp::SetDataTable(RecvTable* pTable)
|
|
{
|
|
m_pDataTable = pTable;
|
|
}
|
|
|
|
inline RecvVarProxyFn RecvProp::GetProxyFn() const
|
|
{
|
|
return m_ProxyFn;
|
|
}
|
|
|
|
inline void RecvProp::SetProxyFn(RecvVarProxyFn fn)
|
|
{
|
|
m_ProxyFn = fn;
|
|
}
|
|
|
|
inline DataTableRecvVarProxyFn RecvProp::GetDataTableProxyFn() const
|
|
{
|
|
return m_DataTableProxyFn;
|
|
}
|
|
|
|
inline void RecvProp::SetDataTableProxyFn(DataTableRecvVarProxyFn fn)
|
|
{
|
|
m_DataTableProxyFn = fn;
|
|
}
|
|
|
|
inline int RecvProp::GetOffset() const
|
|
{
|
|
return m_Offset;
|
|
}
|
|
|
|
inline void RecvProp::SetOffset(int o)
|
|
{
|
|
m_Offset = o;
|
|
}
|
|
|
|
inline RecvProp* RecvProp::GetArrayProp() const
|
|
{
|
|
return m_pArrayProp;
|
|
}
|
|
|
|
inline void RecvProp::SetArrayProp(RecvProp* pProp)
|
|
{
|
|
m_pArrayProp = pProp;
|
|
}
|
|
|
|
inline void RecvProp::SetArrayLengthProxy(ArrayLengthRecvProxyFn proxy)
|
|
{
|
|
m_ArrayLengthProxy = proxy;
|
|
}
|
|
|
|
inline ArrayLengthRecvProxyFn RecvProp::GetArrayLengthProxy() const
|
|
{
|
|
return m_ArrayLengthProxy;
|
|
}
|
|
|
|
inline bool RecvProp::IsInsideArray() const
|
|
{
|
|
return m_bInsideArray;
|
|
}
|
|
|
|
inline void RecvProp::SetInsideArray()
|
|
{
|
|
m_bInsideArray = true;
|
|
}
|
|
|
|
inline const void* RecvProp::GetExtraData() const
|
|
{
|
|
return m_pExtraData;
|
|
}
|
|
|
|
inline void RecvProp::SetExtraData(const void* pData)
|
|
{
|
|
m_pExtraData = pData;
|
|
}
|
|
|
|
inline const char* RecvProp::GetParentArrayPropName()
|
|
{
|
|
return m_pParentArrayPropName;
|
|
}
|
|
|
|
inline void RecvProp::SetParentArrayPropName(const char* pArrayPropName)
|
|
{
|
|
m_pParentArrayPropName = pArrayPropName;
|
|
}
|
|
|
|
#endif |