void RecurseClientTable( RecvTable *pTable, int &spacing ) { RecvTable *pRecvTable = pTable; if (pRecvTable == NULL){ spacing--; return; } char TableName[128]; int size = sizeof(TableName); memset( TableName, 0, size ); for (int i = 0; i < spacing; i++) V_strcat( TableName, " |", size ); V_strcat( TableName, pRecvTable->GetName(), size ); Msg( "%s\n", TableName ); spacing++; int num = pRecvTable->GetNumProps(); for (int i = 0; i < num; i++) { RecvProp *pProp = pRecvTable->GetProp(i); memset( TableName, 0, sizeof(TableName) ); for (int j = 0; j < spacing; j++) V_strcat( TableName, " |", size ); V_strcat( TableName, pProp->GetName(), size ); Msg( "%s\n", TableName ); RecurseClientTable( pProp->GetDataTable(), ++spacing ); } spacing-=2; }
bool Entities::RetrieveClassPropOffset(std::string className, std::vector<std::string> propertyTree) { std::string propertyString = ConvertTreeToString(propertyTree); if (classPropOffsets[className].find(propertyString) != classPropOffsets[className].end()) { return true; } ClientClass *cc = Interfaces::pClientDLL->GetAllClasses(); while (cc) { if (className.compare(cc->GetName()) == 0) { RecvTable *table = cc->m_pRecvTable; int offset = 0; RecvProp *prop = nullptr; if (table) { for (auto iterator = propertyTree.begin(); iterator != propertyTree.end(); ++iterator) { int subOffset = 0; if (prop && prop->GetType() == DPT_DataTable) { table = prop->GetDataTable(); } if (!table) { return false; } if (GetSubProp(table, iterator->c_str(), prop, subOffset)) { offset += subOffset; } else { return false; } table = nullptr; } classPropOffsets[className][propertyString] = offset; return true; } } cc = cc->m_pNext; } return false; }
bool Entities::CheckTableBaseclass(RecvTable *sTable, std::string baseclass) { if (std::string(sTable->GetName()).compare("DT_" + baseclass) == 0) { return true; } for (int i = 0; i < sTable->GetNumProps(); i++) { RecvProp *sProp = sTable->GetProp(i); if (strcmp(sProp->GetName(), "baseclass") != 0) { continue; } RecvTable *sChildTable = sProp->GetDataTable(); if (sChildTable) { return CheckTableBaseclass(sChildTable, baseclass); } } return false; }
bool Entities::GetSubProp(RecvTable *table, const char *propName, RecvProp *&prop, int &offset) { for (int i = 0; i < table->GetNumProps(); i++) { offset = 0; RecvProp *currentProp = table->GetProp(i); if (strcmp(currentProp->GetName(), propName) == 0) { prop = currentProp; offset = currentProp->GetOffset(); return true; } if (currentProp->GetType() == DPT_DataTable) { if (GetSubProp(currentProp->GetDataTable(), propName, prop, offset)) { offset += currentProp->GetOffset(); return true; } } } return false; }