core/HalfLife2.cpp
author Borja Ferrer <faluco@alliedmods.net>
Thu Apr 12 00:45:53 2007 +0000 (2007-04-12)
changeset 682 a70055d6d3b3
parent 678 970220a2d75f
child 685 7b768fa29f08
permissions -rw-r--r--
added datamap property offset native
added clientofuserid native for fast userid to client id translation
fixed a memory leek (some tries weren't being deleted)
added createdialog native
added 2 million inetchannelinfo wrappers
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
faluco@682
    20
namespace SourceHook
faluco@682
    21
{
faluco@682
    22
	template<>
faluco@682
    23
	int HashFunction<datamap_t *>(datamap_t * const &k)
faluco@682
    24
	{
faluco@682
    25
		return reinterpret_cast<int>(k);
faluco@682
    26
	}
faluco@682
    27
faluco@682
    28
	template<>
faluco@682
    29
	int Compare<datamap_t *>(datamap_t * const &k1, datamap_t * const &k2)
faluco@682
    30
	{
faluco@682
    31
		return (k1-k2);
faluco@682
    32
	}
faluco@682
    33
}
faluco@682
    34
dvander@592
    35
CHalfLife2::CHalfLife2()
dvander@592
    36
{
dvander@592
    37
	m_pClasses = sm_trie_create();
dvander@592
    38
}
dvander@592
    39
dvander@592
    40
CHalfLife2::~CHalfLife2()
dvander@592
    41
{
dvander@592
    42
	sm_trie_destroy(m_pClasses);
dvander@592
    43
dvander@592
    44
	List<DataTableInfo *>::iterator iter;
dvander@592
    45
	DataTableInfo *pInfo;
dvander@592
    46
	for (iter=m_Tables.begin(); iter!=m_Tables.end(); iter++)
dvander@592
    47
	{
dvander@592
    48
		pInfo = (*iter);
dvander@592
    49
		sm_trie_destroy(pInfo->lookup);
dvander@592
    50
		delete pInfo;
dvander@592
    51
	}
dvander@592
    52
dvander@592
    53
	m_Tables.clear();
faluco@682
    54
faluco@682
    55
	THash<datamap_t *, DataMapTrie>::iterator h_iter;
faluco@682
    56
	for (h_iter=m_Maps.begin(); h_iter!=m_Maps.end(); h_iter++)
faluco@682
    57
	{
faluco@682
    58
		if (h_iter->val.trie)
faluco@682
    59
		{
faluco@682
    60
			sm_trie_destroy(h_iter->val.trie);
faluco@682
    61
			h_iter->val.trie = NULL;
faluco@682
    62
		}
faluco@682
    63
	}
faluco@682
    64
faluco@682
    65
	m_Maps.clear();
dvander@592
    66
}
dvander@592
    67
dvander@677
    68
CSharedEdictChangeInfo *g_pSharedChangeInfo = NULL;
dvander@677
    69
dvander@592
    70
void CHalfLife2::OnSourceModStartup(bool late)
dvander@592
    71
{
dvander@677
    72
	if (!g_pSharedChangeInfo)
dvander@677
    73
	{
dvander@677
    74
		g_pSharedChangeInfo = engine->GetSharedEdictChangeInfo();
dvander@677
    75
	}
dvander@592
    76
}
dvander@592
    77
dvander@678
    78
IChangeInfoAccessor *CBaseEdict::GetChangeAccessor()
dvander@678
    79
{
dvander@678
    80
	return engine->GetChangeAccessor( (const edict_t *)this );
dvander@678
    81
}
dvander@678
    82
dvander@677
    83
#if 0
dvander@592
    84
void CHalfLife2::OnSourceModAllShutdown()
dvander@592
    85
{
dvander@592
    86
}
dvander@592
    87
#endif
dvander@592
    88
dvander@592
    89
SendProp *UTIL_FindInSendTable(SendTable *pTable, const char *name)
dvander@592
    90
{
dvander@592
    91
	const char *pname;
dvander@592
    92
	int props = pTable->GetNumProps();
dvander@592
    93
	SendProp *prop;
dvander@592
    94
dvander@592
    95
	for (int i=0; i<props; i++)
dvander@592
    96
	{
dvander@592
    97
		prop = pTable->GetProp(i);
dvander@592
    98
		pname = prop->GetName();
dvander@592
    99
		if (pname && strcmp(name, pname) == 0)
dvander@592
   100
		{
dvander@592
   101
			return prop;
dvander@592
   102
		}
dvander@592
   103
		if (prop->GetDataTable())
dvander@592
   104
		{
dvander@592
   105
			if ((prop=UTIL_FindInSendTable(prop->GetDataTable(), name)) != NULL)
dvander@592
   106
			{
dvander@592
   107
				return prop;
dvander@592
   108
			}
dvander@592
   109
		}
dvander@592
   110
	}
dvander@592
   111
dvander@592
   112
	return NULL;
dvander@592
   113
}
dvander@592
   114
faluco@682
   115
typedescription_t *UTIL_FindInDataMap(datamap_t *pMap, const char *name)
faluco@682
   116
{
faluco@682
   117
	while (pMap)
faluco@682
   118
	{
faluco@682
   119
		for (int i=0; i<pMap->dataNumFields; i++)
faluco@682
   120
		{
faluco@682
   121
			if (strcmp(name, pMap->dataDesc[i].fieldName) == 0)
faluco@682
   122
			{
faluco@682
   123
				return &(pMap->dataDesc[i]);
faluco@682
   124
			}
faluco@682
   125
			if (pMap->dataDesc[i].td)
faluco@682
   126
			{
faluco@682
   127
				typedescription_t *_td;
faluco@682
   128
				if ((_td=UTIL_FindInDataMap(pMap->dataDesc[i].td, name)) != NULL)
faluco@682
   129
				{
faluco@682
   130
					return _td;
faluco@682
   131
				}
faluco@682
   132
			}
faluco@682
   133
		}
faluco@682
   134
		pMap = pMap->baseMap;
faluco@682
   135
	}
faluco@682
   136
faluco@682
   137
	return NULL; 
faluco@682
   138
}
faluco@682
   139
dvander@592
   140
ServerClass *CHalfLife2::FindServerClass(const char *classname)
dvander@592
   141
{
dvander@592
   142
	DataTableInfo *pInfo = _FindServerClass(classname);
dvander@592
   143
	if (!pInfo)
dvander@592
   144
	{
dvander@592
   145
		return NULL;
dvander@592
   146
	}
dvander@592
   147
dvander@592
   148
	return pInfo->sc;
dvander@592
   149
}
dvander@592
   150
dvander@592
   151
DataTableInfo *CHalfLife2::_FindServerClass(const char *classname)
dvander@592
   152
{
dvander@592
   153
	DataTableInfo *pInfo = NULL;
dvander@592
   154
dvander@592
   155
	if (!sm_trie_retrieve(m_pClasses, classname, (void **)&pInfo))
dvander@592
   156
	{
dvander@592
   157
		ServerClass *sc = gamedll->GetAllServerClasses();
dvander@592
   158
		while (sc)
dvander@592
   159
		{
dvander@592
   160
			if (strcmp(classname, sc->GetName()) == 0)
dvander@592
   161
			{
dvander@592
   162
				pInfo = new DataTableInfo;
dvander@592
   163
				pInfo->lookup = sm_trie_create();
dvander@592
   164
				pInfo->sc = sc;
dvander@592
   165
				sm_trie_insert(m_pClasses, classname, pInfo);
faluco@682
   166
				m_Tables.push_back(pInfo);
dvander@592
   167
				break;
dvander@592
   168
			}
dvander@592
   169
			sc = sc->m_pNext;
dvander@592
   170
		}
dvander@592
   171
		if (!pInfo)
dvander@592
   172
		{
dvander@592
   173
			return NULL;
dvander@592
   174
		}
dvander@592
   175
	}
dvander@592
   176
dvander@592
   177
	return pInfo;
dvander@592
   178
}
dvander@592
   179
dvander@592
   180
SendProp *CHalfLife2::FindInSendTable(const char *classname, const char *offset)
dvander@592
   181
{
dvander@592
   182
	DataTableInfo *pInfo = _FindServerClass(classname);
dvander@592
   183
dvander@592
   184
	if (!pInfo)
dvander@592
   185
	{
dvander@592
   186
		return NULL;
dvander@592
   187
	}
dvander@592
   188
faluco@682
   189
	SendProp *pProp = NULL;
dvander@592
   190
	if (!sm_trie_retrieve(pInfo->lookup, offset, (void **)&pProp))
dvander@592
   191
	{
dvander@592
   192
		if ((pProp = UTIL_FindInSendTable(pInfo->sc->m_pTable, offset)) != NULL)
dvander@592
   193
		{
dvander@592
   194
			sm_trie_insert(pInfo->lookup, offset, pProp);
dvander@592
   195
		}
dvander@592
   196
	}
dvander@592
   197
dvander@592
   198
	return pProp;
dvander@592
   199
}
faluco@682
   200
faluco@682
   201
typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset)
faluco@682
   202
{
faluco@682
   203
	typedescription_t *td = NULL;
faluco@682
   204
	DataMapTrie &val = m_Maps[pMap];
faluco@682
   205
faluco@682
   206
	if (!val.trie)
faluco@682
   207
	{
faluco@682
   208
		val.trie = sm_trie_create();
faluco@682
   209
	}
faluco@682
   210
	if (!sm_trie_retrieve(val.trie, offset, (void **)&td))
faluco@682
   211
	{
faluco@682
   212
		if ((td = UTIL_FindInDataMap(pMap, offset)) != NULL)
faluco@682
   213
		{
faluco@682
   214
			sm_trie_insert(val.trie, offset, td);
faluco@682
   215
		}
faluco@682
   216
	}
faluco@682
   217
faluco@682
   218
	return td;
faluco@682
   219
}