1.1 --- a/core/HalfLife2.cpp Wed Apr 11 20:07:20 2007 +0000
1.2 +++ b/core/HalfLife2.cpp Thu Apr 12 00:45:53 2007 +0000
1.3 @@ -17,6 +17,21 @@
1.4
1.5 CHalfLife2 g_HL2;
1.6
1.7 +namespace SourceHook
1.8 +{
1.9 + template<>
1.10 + int HashFunction<datamap_t *>(datamap_t * const &k)
1.11 + {
1.12 + return reinterpret_cast<int>(k);
1.13 + }
1.14 +
1.15 + template<>
1.16 + int Compare<datamap_t *>(datamap_t * const &k1, datamap_t * const &k2)
1.17 + {
1.18 + return (k1-k2);
1.19 + }
1.20 +}
1.21 +
1.22 CHalfLife2::CHalfLife2()
1.23 {
1.24 m_pClasses = sm_trie_create();
1.25 @@ -36,6 +51,18 @@
1.26 }
1.27
1.28 m_Tables.clear();
1.29 +
1.30 + THash<datamap_t *, DataMapTrie>::iterator h_iter;
1.31 + for (h_iter=m_Maps.begin(); h_iter!=m_Maps.end(); h_iter++)
1.32 + {
1.33 + if (h_iter->val.trie)
1.34 + {
1.35 + sm_trie_destroy(h_iter->val.trie);
1.36 + h_iter->val.trie = NULL;
1.37 + }
1.38 + }
1.39 +
1.40 + m_Maps.clear();
1.41 }
1.42
1.43 CSharedEdictChangeInfo *g_pSharedChangeInfo = NULL;
1.44 @@ -85,6 +112,31 @@
1.45 return NULL;
1.46 }
1.47
1.48 +typedescription_t *UTIL_FindInDataMap(datamap_t *pMap, const char *name)
1.49 +{
1.50 + while (pMap)
1.51 + {
1.52 + for (int i=0; i<pMap->dataNumFields; i++)
1.53 + {
1.54 + if (strcmp(name, pMap->dataDesc[i].fieldName) == 0)
1.55 + {
1.56 + return &(pMap->dataDesc[i]);
1.57 + }
1.58 + if (pMap->dataDesc[i].td)
1.59 + {
1.60 + typedescription_t *_td;
1.61 + if ((_td=UTIL_FindInDataMap(pMap->dataDesc[i].td, name)) != NULL)
1.62 + {
1.63 + return _td;
1.64 + }
1.65 + }
1.66 + }
1.67 + pMap = pMap->baseMap;
1.68 + }
1.69 +
1.70 + return NULL;
1.71 +}
1.72 +
1.73 ServerClass *CHalfLife2::FindServerClass(const char *classname)
1.74 {
1.75 DataTableInfo *pInfo = _FindServerClass(classname);
1.76 @@ -111,6 +163,7 @@
1.77 pInfo->lookup = sm_trie_create();
1.78 pInfo->sc = sc;
1.79 sm_trie_insert(m_pClasses, classname, pInfo);
1.80 + m_Tables.push_back(pInfo);
1.81 break;
1.82 }
1.83 sc = sc->m_pNext;
1.84 @@ -133,7 +186,7 @@
1.85 return NULL;
1.86 }
1.87
1.88 - SendProp *pProp;
1.89 + SendProp *pProp = NULL;
1.90 if (!sm_trie_retrieve(pInfo->lookup, offset, (void **)&pProp))
1.91 {
1.92 if ((pProp = UTIL_FindInSendTable(pInfo->sc->m_pTable, offset)) != NULL)
1.93 @@ -144,3 +197,23 @@
1.94
1.95 return pProp;
1.96 }
1.97 +
1.98 +typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset)
1.99 +{
1.100 + typedescription_t *td = NULL;
1.101 + DataMapTrie &val = m_Maps[pMap];
1.102 +
1.103 + if (!val.trie)
1.104 + {
1.105 + val.trie = sm_trie_create();
1.106 + }
1.107 + if (!sm_trie_retrieve(val.trie, offset, (void **)&td))
1.108 + {
1.109 + if ((td = UTIL_FindInDataMap(pMap, offset)) != NULL)
1.110 + {
1.111 + sm_trie_insert(val.trie, offset, td);
1.112 + }
1.113 + }
1.114 +
1.115 + return td;
1.116 +}