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