core/HalfLife2.cpp
author David Anderson <dvander@alliedmods.net>
Sat Mar 10 21:26:04 2007 +0000 (2007-03-10)
changeset 592 c2a2c38f1331
child 653 ef60870067ff
permissions -rw-r--r--
part 2 of singleton renaming
     1 /**
     2  * ===============================================================
     3  * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
     4  * ===============================================================
     5  *
     6  * This file is not open source and may not be copied without explicit
     7  * written permission of AlliedModders LLC.  This file may not be redistributed 
     8  * in whole or significant part.
     9  * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
    10  *
    11  * Version: $Id$
    12  */
    13 
    14 #include "HalfLife2.h"
    15 #include "sourcemm_api.h"
    16 
    17 CHalfLife2 g_HL2;
    18 
    19 CHalfLife2::CHalfLife2()
    20 {
    21 	m_pClasses = sm_trie_create();
    22 }
    23 
    24 CHalfLife2::~CHalfLife2()
    25 {
    26 	sm_trie_destroy(m_pClasses);
    27 
    28 	List<DataTableInfo *>::iterator iter;
    29 	DataTableInfo *pInfo;
    30 	for (iter=m_Tables.begin(); iter!=m_Tables.end(); iter++)
    31 	{
    32 		pInfo = (*iter);
    33 		sm_trie_destroy(pInfo->lookup);
    34 		delete pInfo;
    35 	}
    36 
    37 	m_Tables.clear();
    38 }
    39 
    40 #if 0
    41 void CHalfLife2::OnSourceModStartup(bool late)
    42 {
    43 }
    44 
    45 void CHalfLife2::OnSourceModAllShutdown()
    46 {
    47 }
    48 #endif
    49 
    50 SendProp *UTIL_FindInSendTable(SendTable *pTable, const char *name)
    51 {
    52 	const char *pname;
    53 	int props = pTable->GetNumProps();
    54 	SendProp *prop;
    55 
    56 	for (int i=0; i<props; i++)
    57 	{
    58 		prop = pTable->GetProp(i);
    59 		pname = prop->GetName();
    60 		if (pname && strcmp(name, pname) == 0)
    61 		{
    62 			return prop;
    63 		}
    64 		if (prop->GetDataTable())
    65 		{
    66 			if ((prop=UTIL_FindInSendTable(prop->GetDataTable(), name)) != NULL)
    67 			{
    68 				return prop;
    69 			}
    70 		}
    71 	}
    72 
    73 	return NULL;
    74 }
    75 
    76 ServerClass *CHalfLife2::FindServerClass(const char *classname)
    77 {
    78 	DataTableInfo *pInfo = _FindServerClass(classname);
    79 	if (!pInfo)
    80 	{
    81 		return NULL;
    82 	}
    83 
    84 	return pInfo->sc;
    85 }
    86 
    87 DataTableInfo *CHalfLife2::_FindServerClass(const char *classname)
    88 {
    89 	DataTableInfo *pInfo = NULL;
    90 
    91 	if (!sm_trie_retrieve(m_pClasses, classname, (void **)&pInfo))
    92 	{
    93 		ServerClass *sc = gamedll->GetAllServerClasses();
    94 		while (sc)
    95 		{
    96 			if (strcmp(classname, sc->GetName()) == 0)
    97 			{
    98 				pInfo = new DataTableInfo;
    99 				pInfo->lookup = sm_trie_create();
   100 				pInfo->sc = sc;
   101 				sm_trie_insert(m_pClasses, classname, pInfo);
   102 				break;
   103 			}
   104 			sc = sc->m_pNext;
   105 		}
   106 		if (!pInfo)
   107 		{
   108 			return NULL;
   109 		}
   110 	}
   111 
   112 	return pInfo;
   113 }
   114 
   115 SendProp *CHalfLife2::FindInSendTable(const char *classname, const char *offset)
   116 {
   117 	DataTableInfo *pInfo = _FindServerClass(classname);
   118 
   119 	if (!pInfo)
   120 	{
   121 		return NULL;
   122 	}
   123 
   124 	SendProp *pProp;
   125 	if (!sm_trie_retrieve(pInfo->lookup, offset, (void **)&pProp))
   126 	{
   127 		if ((pProp = UTIL_FindInSendTable(pInfo->sc->m_pTable, offset)) != NULL)
   128 		{
   129 			sm_trie_insert(pInfo->lookup, offset, pProp);
   130 		}
   131 	}
   132 
   133 	return pProp;
   134 }