1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/core/HalfLife2.cpp Sat Mar 10 21:26:04 2007 +0000
1.3 @@ -0,0 +1,134 @@
1.4 +/**
1.5 + * ===============================================================
1.6 + * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
1.7 + * ===============================================================
1.8 + *
1.9 + * This file is not open source and may not be copied without explicit
1.10 + * written permission of AlliedModders LLC. This file may not be redistributed
1.11 + * in whole or significant part.
1.12 + * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
1.13 + *
1.14 + * Version: $Id$
1.15 + */
1.16 +
1.17 +#include "HalfLife2.h"
1.18 +#include "sourcemm_api.h"
1.19 +
1.20 +CHalfLife2 g_HL2;
1.21 +
1.22 +CHalfLife2::CHalfLife2()
1.23 +{
1.24 + m_pClasses = sm_trie_create();
1.25 +}
1.26 +
1.27 +CHalfLife2::~CHalfLife2()
1.28 +{
1.29 + sm_trie_destroy(m_pClasses);
1.30 +
1.31 + List<DataTableInfo *>::iterator iter;
1.32 + DataTableInfo *pInfo;
1.33 + for (iter=m_Tables.begin(); iter!=m_Tables.end(); iter++)
1.34 + {
1.35 + pInfo = (*iter);
1.36 + sm_trie_destroy(pInfo->lookup);
1.37 + delete pInfo;
1.38 + }
1.39 +
1.40 + m_Tables.clear();
1.41 +}
1.42 +
1.43 +#if 0
1.44 +void CHalfLife2::OnSourceModStartup(bool late)
1.45 +{
1.46 +}
1.47 +
1.48 +void CHalfLife2::OnSourceModAllShutdown()
1.49 +{
1.50 +}
1.51 +#endif
1.52 +
1.53 +SendProp *UTIL_FindInSendTable(SendTable *pTable, const char *name)
1.54 +{
1.55 + const char *pname;
1.56 + int props = pTable->GetNumProps();
1.57 + SendProp *prop;
1.58 +
1.59 + for (int i=0; i<props; i++)
1.60 + {
1.61 + prop = pTable->GetProp(i);
1.62 + pname = prop->GetName();
1.63 + if (pname && strcmp(name, pname) == 0)
1.64 + {
1.65 + return prop;
1.66 + }
1.67 + if (prop->GetDataTable())
1.68 + {
1.69 + if ((prop=UTIL_FindInSendTable(prop->GetDataTable(), name)) != NULL)
1.70 + {
1.71 + return prop;
1.72 + }
1.73 + }
1.74 + }
1.75 +
1.76 + return NULL;
1.77 +}
1.78 +
1.79 +ServerClass *CHalfLife2::FindServerClass(const char *classname)
1.80 +{
1.81 + DataTableInfo *pInfo = _FindServerClass(classname);
1.82 + if (!pInfo)
1.83 + {
1.84 + return NULL;
1.85 + }
1.86 +
1.87 + return pInfo->sc;
1.88 +}
1.89 +
1.90 +DataTableInfo *CHalfLife2::_FindServerClass(const char *classname)
1.91 +{
1.92 + DataTableInfo *pInfo = NULL;
1.93 +
1.94 + if (!sm_trie_retrieve(m_pClasses, classname, (void **)&pInfo))
1.95 + {
1.96 + ServerClass *sc = gamedll->GetAllServerClasses();
1.97 + while (sc)
1.98 + {
1.99 + if (strcmp(classname, sc->GetName()) == 0)
1.100 + {
1.101 + pInfo = new DataTableInfo;
1.102 + pInfo->lookup = sm_trie_create();
1.103 + pInfo->sc = sc;
1.104 + sm_trie_insert(m_pClasses, classname, pInfo);
1.105 + break;
1.106 + }
1.107 + sc = sc->m_pNext;
1.108 + }
1.109 + if (!pInfo)
1.110 + {
1.111 + return NULL;
1.112 + }
1.113 + }
1.114 +
1.115 + return pInfo;
1.116 +}
1.117 +
1.118 +SendProp *CHalfLife2::FindInSendTable(const char *classname, const char *offset)
1.119 +{
1.120 + DataTableInfo *pInfo = _FindServerClass(classname);
1.121 +
1.122 + if (!pInfo)
1.123 + {
1.124 + return NULL;
1.125 + }
1.126 +
1.127 + SendProp *pProp;
1.128 + if (!sm_trie_retrieve(pInfo->lookup, offset, (void **)&pProp))
1.129 + {
1.130 + if ((pProp = UTIL_FindInSendTable(pInfo->sc->m_pTable, offset)) != NULL)
1.131 + {
1.132 + sm_trie_insert(pInfo->lookup, offset, pProp);
1.133 + }
1.134 + }
1.135 +
1.136 + return pProp;
1.137 +}