void our_trie_iterator(KTrie<IEntityFactory_CE *> *pTrie, const char *name, IEntityFactory_CE *& obj, void *data) { SourceHook::List<CEntity *> *cent_list = (SourceHook::List<CEntity *> *)data; int count = 0; SourceHook::List<CEntity *>::iterator _iter; CEntity *pInfo; for(_iter=cent_list->begin(); _iter!=cent_list->end(); _iter++) { pInfo = (*_iter); if(strcmp(name, pInfo->GetClassname()) == 0) { count++; continue; } IType *pType = GetType(pInfo->BaseEntity()); IBaseType *pBase = pType->GetBaseType(); do { const char *classname = GetTypeName(pBase->GetTypeInfo()); if(strcmp(classname, name) == 0) { count++; } } while (pBase->GetNumBaseClasses() && (pBase = pBase->GetBaseClass(0))); pType->Destroy(); } if(strlen(name) < 7) META_CONPRINTF("%s:\t\t\t\t%d\n",name,count); else if(strlen(name) < 15) META_CONPRINTF("%s:\t\t\t%d\n",name,count); else if(strlen(name) < 23) META_CONPRINTF("%s:\t\t%d\n",name,count); else META_CONPRINTF("%s:\t%d\n",name,count); }
CEntity *CEntityManager::CBaseEntityPostConstructor(CBaseEntity *pEntity, const char * szClassname ) { IServerNetworkable *pNetworkable = pEntity->GetNetworkable(); Assert(pNetworkable); edict_t *pEdict = pNetworkable->GetEdict(); if(strcmp(szClassname,"player") == 0 && engine->IndexOfEdict(pEdict) == 0) { return NULL; } IEntityFactory_CE **value = NULL; bool m_bShouldAddToCache = false; value = pCacheTrie.retrieve(szClassname); if(!value) { m_bShouldAddToCache = true; value = pFactoryTrie.retrieve(szClassname); } if (!value) { /* Attempt to do an RTTI lookup for C++ class links */ IType *pType = GetType(pEntity); IBaseType *pBase = pType->GetBaseType(); do { const char *classname = GetTypeName(pBase->GetTypeInfo()); value = pFactoryTrie.retrieve(classname); if (value) { break; } } while (pBase->GetNumBaseClasses() && (pBase = pBase->GetBaseClass(0))); pType->Destroy(); } if (!value) { /* No specific handler for this entity */ value = pFactoryTrie.retrieve("baseentity"); assert(value); } IEntityFactory_CE *pFactory = *value; assert(pFactory); if(m_bShouldAddToCache) { pCacheTrie.insert(szClassname, pFactory); } CEntity *cent = pFactory->Create(pEdict, pEntity); char vtable[20]; _snprintf(vtable, sizeof(vtable), "%x", (unsigned int) *(void **)pEntity); cent->ClearAllFlags(); cent->InitProps(); if (!pHookedTrie.retrieve(vtable)) { cent->InitHooks(); pHookedTrie.insert(vtable, true); } cent->InitDataMap(); return cent; }