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