extensions/structs/natives.cpp
author Nicholas Hastings <skamonkey@gmail.com>
Mon Jul 29 10:03:18 2013 -0400 (2013-07-29)
changeset 3960 d50b36dc6821
parent 2348 befb05075881
permissions -rw-r--r--
Updated for latest hl2sdk-dota changes.
pred@2224
     1
/**
pred@2224
     2
* vim: set ts=4 :
pred@2224
     3
* =============================================================================
pred@2224
     4
* SourceMod Sample Extension
pred@2224
     5
* Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
pred@2224
     6
* =============================================================================
pred@2224
     7
*
pred@2224
     8
* This program is free software; you can redistribute it and/or modify it under
pred@2224
     9
* the terms of the GNU General Public License, version 3.0, as published by the
pred@2224
    10
* Free Software Foundation.
pred@2224
    11
* 
pred@2224
    12
* This program is distributed in the hope that it will be useful, but WITHOUT
pred@2224
    13
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
pred@2224
    14
* FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
pred@2224
    15
* details.
pred@2224
    16
*
pred@2224
    17
* You should have received a copy of the GNU General Public License along with
pred@2224
    18
* this program.  If not, see <http://www.gnu.org/licenses/>.
pred@2224
    19
*
pred@2224
    20
* As a special exception, AlliedModders LLC gives you permission to link the
pred@2224
    21
* code of this program (as well as its derivative works) to "Half-Life 2," the
pred@2224
    22
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
pred@2224
    23
* by the Valve Corporation.  You must obey the GNU General Public License in
pred@2224
    24
* all respects for all other code used.  Additionally, AlliedModders LLC grants
pred@2224
    25
* this exception to all derivative works.  AlliedModders LLC defines further
pred@2224
    26
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
pred@2224
    27
* or <http://www.sourcemod.net/license.php>.
pred@2224
    28
*
pred@2224
    29
* Version: $Id$
pred@2224
    30
*/
pred@2224
    31
pred@2224
    32
#include "extension.h"
pred@2224
    33
#include "utldict.h"
pred@2224
    34
pred@2224
    35
class FileWeaponInfo_t;
pred@2224
    36
typedef unsigned short WEAPON_FILE_INFO_HANDLE;
pred@2224
    37
pred@2224
    38
inline edict_t *GetEdict(cell_t num)
pred@2224
    39
{
pred@2224
    40
	edict_t *pEdict = engine->PEntityOfEntIndex(num);
pred@2224
    41
	if (!pEdict || pEdict->IsFree())
pred@2224
    42
	{
pred@2224
    43
		return NULL;
pred@2224
    44
	}
pred@2224
    45
pred@2224
    46
	return pEdict;
pred@2224
    47
}
pred@2224
    48
pred@2224
    49
inline edict_t *GetEntity(cell_t num, CBaseEntity **pData)
pred@2224
    50
{
pred@2224
    51
	edict_t *pEdict = engine->PEntityOfEntIndex(num);
pred@2224
    52
	if (!pEdict || pEdict->IsFree())
pred@2224
    53
	{
pred@2224
    54
		return NULL;
pred@2224
    55
	}
pred@2224
    56
pred@2224
    57
	IServerUnknown *pUnk;
pred@2224
    58
	if ((pUnk=pEdict->GetUnknown()) == NULL)
pred@2224
    59
	{
pred@2224
    60
		return NULL;
pred@2224
    61
	}
pred@2224
    62
	*pData = pUnk->GetBaseEntity();
pred@2224
    63
	return pEdict;
pred@2224
    64
}
pred@2224
    65
pred@2224
    66
int CheckBaseHandle(CBaseHandle &hndl)
pred@2224
    67
{
pred@2224
    68
	if (!hndl.IsValid())
pred@2224
    69
	{
pred@2224
    70
		return -1;
pred@2224
    71
	}
pred@2224
    72
pred@2224
    73
	int index = hndl.GetEntryIndex();
pred@2224
    74
pred@2224
    75
	edict_t *pStoredEdict;
pred@2224
    76
	CBaseEntity *pStoredEntity;
pred@2224
    77
pred@2224
    78
	pStoredEdict = GetEntity(index, &pStoredEntity);
pred@2224
    79
pred@2224
    80
	if (pStoredEdict == NULL || pStoredEntity == NULL)
pred@2224
    81
	{
pred@2224
    82
		return -1;
pred@2224
    83
	}
pred@2224
    84
pred@2224
    85
	IServerEntity *pSE = pStoredEdict->GetIServerEntity();
pred@2224
    86
pred@2224
    87
	if (pSE == NULL)
pred@2224
    88
	{
pred@2224
    89
		return -1;
pred@2224
    90
	}
pred@2224
    91
pred@2224
    92
	if (pSE->GetRefEHandle() != hndl)
pred@2224
    93
	{
pred@2224
    94
		return -1;
pred@2224
    95
	}
pred@2224
    96
pred@2224
    97
	return index;
pred@2224
    98
}
pred@2224
    99
pred@2224
   100
//native GetStructInt(Handle:struct, const String:member[]);
pred@2224
   101
static cell_t GetStructInt(IPluginContext *pContext, const cell_t *params)
pred@2224
   102
{
pred@2224
   103
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   104
	HandleError err;
pred@2224
   105
	HandleSecurity sec;
pred@2224
   106
pred@2224
   107
	sec.pOwner = NULL;
pred@2224
   108
	sec.pIdentity = myself->GetIdentity();
pred@2224
   109
pred@2224
   110
	StructHandle *pHandle;
pred@2224
   111
	if ((err = g_pHandleSys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   112
		!= HandleError_None)
pred@2224
   113
	{
pred@2224
   114
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   115
	}
pred@2224
   116
pred@2224
   117
	char *member;
pred@2224
   118
	pContext->LocalToString(params[2], &member);
pred@2224
   119
pred@2224
   120
	int value;
pred@2224
   121
pred@2224
   122
	if (!pHandle->GetInt(member, &value))
pred@2224
   123
	{
pred@2224
   124
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   125
	}
pred@2224
   126
pred@2224
   127
	return value;
pred@2224
   128
}
pred@2224
   129
pred@2224
   130
//native SetStructInt(Handle:struct, const String:member[], value);
pred@2224
   131
static cell_t SetStructInt(IPluginContext *pContext, const cell_t *params)
pred@2224
   132
{
pred@2224
   133
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   134
	HandleError err;
pred@2224
   135
	HandleSecurity sec;
pred@2224
   136
pred@2224
   137
	sec.pOwner = NULL;
pred@2224
   138
	sec.pIdentity = myself->GetIdentity();
pred@2224
   139
pred@2224
   140
	StructHandle *pHandle;
pred@2224
   141
	if ((err = handlesys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   142
		!= HandleError_None)
pred@2224
   143
	{
pred@2224
   144
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   145
	}
pred@2224
   146
pred@2224
   147
	char *member;
pred@2224
   148
	pContext->LocalToString(params[2], &member);
pred@2224
   149
pred@2224
   150
	if (!pHandle->SetInt(member, params[3]))
pred@2224
   151
	{
pred@2224
   152
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   153
	}
pred@2224
   154
pred@2224
   155
	return 1;
pred@2224
   156
}
pred@2224
   157
pred@2224
   158
//native GetStructFloat(Handle:struct, const String:member[], &Float:value);
pred@2224
   159
static cell_t GetStructFloat(IPluginContext *pContext, const cell_t *params)
pred@2224
   160
{
pred@2224
   161
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   162
	HandleError err;
pred@2224
   163
	HandleSecurity sec;
pred@2224
   164
pred@2224
   165
	sec.pOwner = NULL;
pred@2224
   166
	sec.pIdentity = myself->GetIdentity();
pred@2224
   167
pred@2224
   168
	StructHandle *pHandle;
pred@2224
   169
	if ((err = g_pHandleSys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   170
		!= HandleError_None)
pred@2224
   171
	{
pred@2224
   172
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   173
	}
pred@2224
   174
pred@2224
   175
	char *member;
pred@2224
   176
	pContext->LocalToString(params[2], &member);
pred@2224
   177
pred@2224
   178
	float value;
pred@2224
   179
pred@2224
   180
	if (!pHandle->GetFloat(member, &value))
pred@2224
   181
	{
pred@2224
   182
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   183
	}
pred@2224
   184
pred@2224
   185
	return sp_ftoc(value);
pred@2224
   186
}	
pred@2224
   187
pred@2224
   188
//native SetStructFloat(Handle:struct, const String:member[], Float:value);
pred@2224
   189
static cell_t SetStructFloat(IPluginContext *pContext, const cell_t *params)
pred@2224
   190
{
pred@2224
   191
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   192
	HandleError err;
pred@2224
   193
	HandleSecurity sec;
pred@2224
   194
pred@2224
   195
	sec.pOwner = NULL;
pred@2224
   196
	sec.pIdentity = myself->GetIdentity();
pred@2224
   197
pred@2224
   198
	StructHandle *pHandle;
pred@2224
   199
	if ((err = g_pHandleSys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   200
		!= HandleError_None)
pred@2224
   201
	{
pred@2224
   202
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   203
	}
pred@2224
   204
pred@2224
   205
	char *member;
pred@2224
   206
	pContext->LocalToString(params[2], &member);
pred@2224
   207
pred@2224
   208
	if (!pHandle->SetFloat(member, sp_ctof(params[3])))
pred@2224
   209
	{
pred@2224
   210
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   211
	}
pred@2224
   212
pred@2224
   213
	return 1;
pred@2224
   214
}
pred@2224
   215
pred@2224
   216
//native GetStructVector(Handle:struct, const String:member[], Float:vec[3]);
pred@2224
   217
static cell_t GetStructVector(IPluginContext *pContext, const cell_t *params)
pred@2224
   218
{
pred@2224
   219
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   220
	HandleError err;
pred@2224
   221
	HandleSecurity sec;
pred@2224
   222
pred@2224
   223
	sec.pOwner = NULL;
pred@2224
   224
	sec.pIdentity = myself->GetIdentity();
pred@2224
   225
pred@2224
   226
	StructHandle *pHandle;
pred@2224
   227
	if ((err = g_pHandleSys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   228
		!= HandleError_None)
pred@2224
   229
	{
pred@2224
   230
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   231
	}
pred@2224
   232
pred@2224
   233
	char *member;
pred@2224
   234
	pContext->LocalToString(params[2], &member);
pred@2224
   235
pred@2224
   236
	cell_t *addr;
pred@2224
   237
	pContext->LocalToPhysAddr(params[3], &addr);
pred@2224
   238
pred@2224
   239
	Vector value;
pred@2224
   240
pred@2224
   241
	if (!pHandle->GetVector(member, &value))
pred@2224
   242
	{
pred@2224
   243
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   244
	}
pred@2224
   245
pred@2224
   246
	addr[0] = sp_ftoc(value.x);
pred@2224
   247
	addr[1] = sp_ftoc(value.y);
pred@2224
   248
	addr[2] = sp_ftoc(value.z);
pred@2224
   249
pred@2224
   250
	return 1;
pred@2224
   251
}
pred@2224
   252
pred@2224
   253
//native SetStructVector(Handle:struct, const String:member[], Float:vec[3]);
pred@2224
   254
static cell_t SetStructVector(IPluginContext *pContext, const cell_t *params)
pred@2224
   255
{
pred@2224
   256
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   257
	HandleError err;
pred@2224
   258
	HandleSecurity sec;
pred@2224
   259
pred@2224
   260
	sec.pOwner = NULL;
pred@2224
   261
	sec.pIdentity = myself->GetIdentity();
pred@2224
   262
pred@2224
   263
	StructHandle *pHandle;
pred@2224
   264
	if ((err = g_pHandleSys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   265
		!= HandleError_None)
pred@2224
   266
	{
pred@2224
   267
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   268
	}
pred@2224
   269
pred@2224
   270
	char *member;
pred@2224
   271
	pContext->LocalToString(params[2], &member);
pred@2224
   272
pred@2224
   273
	Vector value;
pred@2224
   274
pred@2224
   275
	cell_t *addr;
pred@2224
   276
	pContext->LocalToPhysAddr(params[3], &addr);
pred@2224
   277
pred@2224
   278
	value.x = sp_ctof(addr[0]);
pred@2224
   279
	value.y = sp_ctof(addr[1]);
pred@2224
   280
	value.z = sp_ctof(addr[2]);
pred@2224
   281
pred@2224
   282
	if (!pHandle->SetVector(member, value))
pred@2224
   283
	{
pred@2224
   284
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   285
	}
pred@2224
   286
pred@2224
   287
	return 1;
pred@2224
   288
}
pred@2224
   289
pred@2224
   290
//native GetStructString(Handle:struct, const String:member[], String:value[], maxlen);
pred@2224
   291
static cell_t GetStructString(IPluginContext *pContext, const cell_t *params)
pred@2224
   292
{
pred@2224
   293
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   294
	HandleError err;
pred@2224
   295
	HandleSecurity sec;
pred@2224
   296
pred@2224
   297
	sec.pOwner = NULL;
pred@2224
   298
	sec.pIdentity = myself->GetIdentity();
pred@2224
   299
pred@2224
   300
	StructHandle *pHandle;
pred@2224
   301
	if ((err = g_pHandleSys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   302
		!= HandleError_None)
pred@2224
   303
	{
pred@2224
   304
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   305
	}
pred@2224
   306
pred@2224
   307
	char *member;
pred@2224
   308
	pContext->LocalToString(params[2], &member);
pred@2224
   309
pred@2224
   310
	char *string;
pred@2224
   311
	if (!pHandle->GetString(member, &string))
pred@2224
   312
	{
pred@2224
   313
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   314
	}
pred@2224
   315
pred@2224
   316
	pContext->StringToLocal(params[3], params[4], string);
pred@2224
   317
pred@2224
   318
	return 1;
pred@2224
   319
}
pred@2224
   320
pred@2224
   321
//native SetStructString(Handle:struct, const String:member[], String:value[]);
pred@2224
   322
static cell_t SetStructString(IPluginContext *pContext, const cell_t *params)
pred@2224
   323
{
pred@2224
   324
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   325
	HandleError err;
pred@2224
   326
	HandleSecurity sec;
pred@2224
   327
pred@2224
   328
	sec.pOwner = NULL;
pred@2224
   329
	sec.pIdentity = myself->GetIdentity();
pred@2224
   330
pred@2224
   331
	StructHandle *pHandle;
pred@2224
   332
	if ((err = g_pHandleSys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   333
		!= HandleError_None)
pred@2224
   334
	{
pred@2224
   335
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   336
	}
pred@2224
   337
pred@2224
   338
	char *member;
pred@2224
   339
	pContext->LocalToString(params[2], &member);
pred@2224
   340
pred@2224
   341
	char *string;
pred@2224
   342
	pContext->LocalToString(params[3], &string);
pred@2224
   343
pred@2224
   344
	if (!pHandle->SetString(member, string))
pred@2224
   345
	{
pred@2224
   346
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   347
	}
pred@2224
   348
pred@2224
   349
	return 1;
pred@2224
   350
}
pred@2224
   351
pred@2224
   352
//native GetStructEnt(Handle:struct, const String:member[], &ent);
pred@2224
   353
static cell_t GetStructEnt(IPluginContext *pContext, const cell_t *params)
pred@2224
   354
{
pred@2224
   355
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   356
	HandleError err;
pred@2224
   357
	HandleSecurity sec;
pred@2224
   358
pred@2224
   359
	sec.pOwner = NULL;
pred@2224
   360
	sec.pIdentity = myself->GetIdentity();
pred@2224
   361
pred@2224
   362
	StructHandle *pHandle;
pred@2224
   363
	if ((err = g_pHandleSys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   364
		!= HandleError_None)
pred@2224
   365
	{
pred@2224
   366
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   367
	}
pred@2224
   368
pred@2224
   369
	char *member;
pred@2224
   370
	pContext->LocalToString(params[2], &member);
pred@2224
   371
pred@2224
   372
	CBaseHandle *value;
pred@2224
   373
	if (!pHandle->GetEHandle(member, &value))
pred@2224
   374
	{
pred@2224
   375
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   376
	}
pred@2224
   377
pred@2224
   378
	return CheckBaseHandle(*value);
pred@2224
   379
}
pred@2224
   380
pred@2224
   381
//native SetStructEnt(Handle:struct, const String:member[], ent);
pred@2224
   382
static cell_t SetStructEnt(IPluginContext *pContext, const cell_t *params)
pred@2224
   383
{
pred@2224
   384
	Handle_t hndl = static_cast<Handle_t>(params[1]);
pred@2224
   385
	HandleError err;
pred@2224
   386
	HandleSecurity sec;
pred@2224
   387
pred@2224
   388
	sec.pOwner = NULL;
pred@2224
   389
	sec.pIdentity = myself->GetIdentity();
pred@2224
   390
pred@2224
   391
	StructHandle *pHandle;
pred@2224
   392
	if ((err = g_pHandleSys->ReadHandle(hndl, g_StructHandle, &sec, (void **)&pHandle))
pred@2224
   393
		!= HandleError_None)
pred@2224
   394
	{
pred@2224
   395
		return pContext->ThrowNativeError("Invalid struct handle %x (error %d)", hndl, err);
pred@2224
   396
	}
pred@2224
   397
pred@2224
   398
	char *member;
pred@2224
   399
	pContext->LocalToString(params[2], &member);
pred@2224
   400
pred@2224
   401
	CBaseHandle *value;
pred@2224
   402
	if (!pHandle->GetEHandle(member, &value))
pred@2224
   403
	{
pred@2224
   404
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   405
	}
pred@2224
   406
pred@2224
   407
	edict_t *pEdict = GetEdict(params[3]);
pred@2224
   408
pred@2224
   409
	if (pEdict == NULL)
pred@2224
   410
	{
pred@2224
   411
		return pContext->ThrowNativeError("Invalid entity %i", params[3]);
pred@2224
   412
	}
pred@2224
   413
pred@2224
   414
	IServerEntity *pEntOther = pEdict->GetIServerEntity();
pred@2224
   415
	value->Set(pEntOther);
pred@2224
   416
pred@2224
   417
	if (!pHandle->SetEHandle(member, value))
pred@2224
   418
	{
pred@2224
   419
		return pContext->ThrowNativeError("Invalid member, or incorrect data type");
pred@2224
   420
	}
pred@2224
   421
pred@2224
   422
	return 1;
pred@2224
   423
}
pred@2224
   424
pred@2224
   425
static cell_t GetWeaponStruct(IPluginContext *pContext, const cell_t *params)
pred@2224
   426
{
pred@2224
   427
	char *weapon;
pred@2224
   428
	pContext->LocalToString(params[1], &weapon);
pred@2224
   429
pred@2224
   430
	void **func;
pred@2224
   431
pred@2224
   432
#if defined WIN32
pred@2224
   433
	void *addr = NULL;
pred@2224
   434
	func = &addr;
pred@2224
   435
#else
pred@2224
   436
	WEAPON_FILE_INFO_HANDLE (*LookupWeaponInfoSlot)(const char *) = NULL;
pred@2224
   437
	func = (void **)&LookupWeaponInfoSlot;
pred@2224
   438
#endif
pred@2224
   439
pred@2224
   440
	FileWeaponInfo_t *(*GetFileWeaponInfoFromHandle)( WEAPON_FILE_INFO_HANDLE handle ) = NULL;
pred@2224
   441
pred@2224
   442
	if (!conf->GetMemSig("LookupWeaponInfoSlot", func) || *func == NULL)
pred@2224
   443
	{
pred@2224
   444
		return pContext->ThrowNativeError("Failed to locate signature LookupWeaponInfoSlot");
pred@2224
   445
	}
pred@2224
   446
pred@2224
   447
	if (!conf->GetMemSig("GetFileWeaponInfoFromHandle", (void **)&GetFileWeaponInfoFromHandle) || GetFileWeaponInfoFromHandle == NULL)
pred@2224
   448
	{
pred@2224
   449
		return pContext->ThrowNativeError("Failed to locate signature GetFileWeaponInfoFromHandle");
pred@2224
   450
	}
pred@2224
   451
pred@2224
   452
#if defined WIN32
pred@2224
   453
	int offset;
pred@2224
   454
pred@2224
   455
	if (!conf->GetOffset("m_WeaponInfoDatabase", &offset))
pred@2224
   456
	{
pred@2224
   457
		return pContext->ThrowNativeError("Failed to locate offset m_WeaponInfoDatabase");
pred@2224
   458
	}
pred@2224
   459
pred@2224
   460
	addr = (unsigned char *)addr + offset;
pred@2224
   461
pred@2224
   462
	CUtlDict< FileWeaponInfo_t*, unsigned short > *m_WeaponInfoDatabase = *(CUtlDict< FileWeaponInfo_t*, unsigned short > **)addr;
pred@2224
   463
pred@2224
   464
	WEAPON_FILE_INFO_HANDLE handle = m_WeaponInfoDatabase->Find(weapon);
pred@2224
   465
pred@2224
   466
	if (handle == -1 || handle == m_WeaponInfoDatabase->InvalidIndex())
pred@2224
   467
	{
pred@2224
   468
		return pContext->ThrowNativeError("Could not find weapon %s", weapon);
pred@2224
   469
	}
pred@2224
   470
#else
pred@2224
   471
	WEAPON_FILE_INFO_HANDLE handle = LookupWeaponInfoSlot(weapon);
pred@2224
   472
#endif
pred@2224
   473
	FileWeaponInfo_t *info = GetFileWeaponInfoFromHandle(handle);
pred@2224
   474
pred@2224
   475
	//g_pSM->LogMessage(myself, "%i %i %x", handle, GetInvalidWeaponInfoHandle(), info);
pred@2224
   476
pred@2224
   477
	if (!info)
pred@2224
   478
	{
pred@2224
   479
		return pContext->ThrowNativeError("Weapon does not exist!");
pred@2224
   480
	}
pred@2224
   481
pred@2224
   482
	/* Offsets! */
pred@2224
   483
	/*
pred@2224
   484
	g_pSM->LogMessage(myself, "Offsets for FileWeaponInfo_t");
pred@2224
   485
	g_pSM->LogMessage(myself, "bParsed: %i", (unsigned char *)&(info->bParsedScript) - (unsigned char *)info);
pred@2224
   486
	g_pSM->LogMessage(myself, "bLoadedHudElements: %i", (unsigned char *)&(info->bLoadedHudElements) - (unsigned char *)info);
pred@2224
   487
	g_pSM->LogMessage(myself, "szClassName: %i", (unsigned char *)&(info->szClassName) - (unsigned char *)info);
pred@2224
   488
	g_pSM->LogMessage(myself, "szPrintName: %i", (unsigned char *)&(info->szPrintName) - (unsigned char *)info);
pred@2224
   489
	g_pSM->LogMessage(myself, "szViewModel: %i", (unsigned char *)&(info->szViewModel) - (unsigned char *)info);
pred@2224
   490
	g_pSM->LogMessage(myself, "szWorldModel: %i", (unsigned char *)&(info->szWorldModel) - (unsigned char *)info);
pred@2224
   491
	g_pSM->LogMessage(myself, "szAnimationPrefix: %i", (unsigned char *)&(info->szAnimationPrefix) - (unsigned char *)info);
pred@2224
   492
	g_pSM->LogMessage(myself, "iSlot: %i", (unsigned char *)&(info->iSlot) - (unsigned char *)info);
pred@2224
   493
	g_pSM->LogMessage(myself, "iPosition: %i", (unsigned char *)&(info->iPosition) - (unsigned char *)info);
pred@2224
   494
	g_pSM->LogMessage(myself, "iMaxClip1: %i", (unsigned char *)&(info->iMaxClip1) - (unsigned char *)info);
pred@2224
   495
	g_pSM->LogMessage(myself, "iMaxClip2: %i", (unsigned char *)&(info->iMaxClip2) - (unsigned char *)info);
pred@2224
   496
	g_pSM->LogMessage(myself, "iDefaultClip1: %i", (unsigned char *)&(info->iDefaultClip1) - (unsigned char *)info);
pred@2224
   497
	g_pSM->LogMessage(myself, "iDefaultClip2: %i", (unsigned char *)&(info->iDefaultClip2) - (unsigned char *)info);
pred@2224
   498
	g_pSM->LogMessage(myself, "iWeight: %i", (unsigned char *)&(info->iWeight) - (unsigned char *)info);
pred@2224
   499
	g_pSM->LogMessage(myself, "iRumbleEffect: %i", (unsigned char *)&(info->iRumbleEffect) - (unsigned char *)info);
pred@2224
   500
	g_pSM->LogMessage(myself, "bAutoSwitchTo: %i", (unsigned char *)&(info->bAutoSwitchTo) - (unsigned char *)info);
pred@2224
   501
	g_pSM->LogMessage(myself, "bAutoSwitchFrom: %i", (unsigned char *)&(info->bAutoSwitchFrom) - (unsigned char *)info);
pred@2224
   502
	g_pSM->LogMessage(myself, "iFlags: %i", (unsigned char *)&(info->iFlags) - (unsigned char *)info);
pred@2224
   503
	g_pSM->LogMessage(myself, "szAmmo1: %i", (unsigned char *)&(info->szAmmo1) - (unsigned char *)info);
pred@2224
   504
	g_pSM->LogMessage(myself, "szAmmo2: %i", (unsigned char *)&(info->szAmmo2) - (unsigned char *)info);
pred@2224
   505
	g_pSM->LogMessage(myself, "aShootSounds: %i", (unsigned char *)&(info->aShootSounds) - (unsigned char *)info);
pred@2224
   506
	g_pSM->LogMessage(myself, "iAmmoType: %i", (unsigned char *)&(info->iAmmoType) - (unsigned char *)info);
pred@2224
   507
	g_pSM->LogMessage(myself, "iAmmo2Type: %i", (unsigned char *)&(info->iAmmo2Type) - (unsigned char *)info);
pred@2224
   508
	g_pSM->LogMessage(myself, "m_bMeleeWeapon: %i", (unsigned char *)&(info->m_bMeleeWeapon) - (unsigned char *)info);
pred@2224
   509
	g_pSM->LogMessage(myself, "m_bBuiltRightHanded: %i", (unsigned char *)&(info->m_bBuiltRightHanded) - (unsigned char *)info);
pred@2224
   510
	g_pSM->LogMessage(myself, "m_bAllowFlipping: %i", (unsigned char *)&(info->m_bAllowFlipping) - (unsigned char *)info);
pred@2224
   511
	*/
pred@2224
   512
	return g_StructManager.CreateStructHandle("FileWeaponInfo_t", info);
pred@2224
   513
};
pred@2224
   514
pred@2224
   515
const sp_nativeinfo_t MyNatives[] = 
pred@2224
   516
{
pred@2224
   517
	{"GetStructInt",	GetStructInt},
pred@2224
   518
	{"SetStructInt",	SetStructInt},
pred@2224
   519
	{"GetStructFloat",	GetStructFloat},
pred@2224
   520
	{"SetStructFloat",	SetStructFloat},
pred@2224
   521
	{"GetStructVector",	GetStructVector},
pred@2224
   522
	{"SetStructVector",	SetStructVector},
pred@2224
   523
	{"GetStructString",	GetStructString},
pred@2224
   524
	{"SetStructString",	SetStructString},
pred@2224
   525
	{"GetStructEnt",	GetStructEnt},
pred@2224
   526
	{"SetStructEnt",	SetStructEnt},
pred@2224
   527
	{"GetWeaponStruct",	GetWeaponStruct},
pred@2224
   528
	{NULL,				NULL},
pred@2224
   529
};