plugins/include/entity.inc
author Borja Ferrer <faluco@alliedmods.net>
Thu Apr 12 00:45:53 2007 +0000 (2007-04-12)
changeset 682 a70055d6d3b3
parent 619 6934bf39171e
child 694 b9b2cbe6352e
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@554
     1
/**
dvander@554
     2
 * vim: set ts=4 :
dvander@554
     3
 * ===============================================================
dvander@554
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@554
     5
 * ===============================================================
dvander@554
     6
 *
dvander@554
     7
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be used 
dvander@554
     8
 * or modified under the Terms and Conditions of its License Agreement, which is found 
dvander@554
     9
 * in LICENSE.txt.  The Terms and Conditions for making SourceMod extensions/plugins 
dvander@554
    10
 * may change at any time.  To view the latest information, see:
dvander@554
    11
 *   http://www.sourcemod.net/license.php
dvander@554
    12
 *
dvander@554
    13
 * Version: $Id$
dvander@554
    14
 */
dvander@554
    15
 
dvander@554
    16
#if defined _entity_included
dvander@554
    17
 #endinput
dvander@554
    18
#endif
dvander@554
    19
#define _entity_included
dvander@554
    20
dvander@610
    21
/**
dvander@610
    22
 * Property types for entities.
dvander@610
    23
 */
dvander@610
    24
enum PropType
dvander@610
    25
{
dvander@610
    26
	Prop_Send = 0,	/**< This property is networked. */
dvander@610
    27
	Prop_Data = 1,	/**< This property is for saved game files. */
dvander@610
    28
};
dvander@555
    29
dvander@555
    30
/**
dvander@555
    31
 * For more information on these, see the HL2SDK (public/edict.h)
dvander@555
    32
 */
dvander@555
    33
#define FL_EDICT_CHANGED	(1<<0)	/**< Game DLL sets this when the entity state changes
dvander@555
    34
										 Mutually exclusive with FL_EDICT_PARTIAL_CHANGE. */
dvander@555
    35
#define FL_EDICT_FREE		(1<<1)	/**< this edict if free for reuse */
dvander@555
    36
#define FL_EDICT_FULL		(1<<2)	/**< this is a full server entity */
dvander@555
    37
#define FL_EDICT_FULLCHECK	(0<<0)  /**< call ShouldTransmit() each time, this is a fake flag */
dvander@555
    38
#define FL_EDICT_ALWAYS		(1<<3)	/**< always transmit this entity */
dvander@555
    39
#define FL_EDICT_DONTSEND	(1<<4)	/**< don't transmit this entity */
dvander@555
    40
#define FL_EDICT_PVSCHECK	(1<<5)	/**< always transmit entity, but cull against PVS */
dvander@555
    41
#define FL_EDICT_PENDING_DORMANT_CHECK	(1<<6)
dvander@555
    42
#define FL_EDICT_DIRTY_PVS_INFORMATION	(1<<7)
dvander@555
    43
#define FL_FULL_EDICT_CHANGED			(1<<8)
dvander@555
    44
dvander@554
    45
/**
dvander@554
    46
 * Returns the maximum number of entities.
dvander@554
    47
 *
dvander@554
    48
 * @return				Maximum number of entities.
dvander@554
    49
 */
dvander@554
    50
native GetMaxEntities();
dvander@554
    51
dvander@554
    52
/**
dvander@554
    53
 * Returns the number of entities in the server.
dvander@554
    54
 *
dvander@554
    55
 * @return				Number of entities in the server.
dvander@554
    56
 */
dvander@554
    57
native GetEntityCount();
dvander@554
    58
dvander@554
    59
/**
dvander@554
    60
 * Returns whether or not an entity is valid.  Returns false
dvander@554
    61
 * if there is no matching CBaseEntity for this edict index.
dvander@554
    62
 *
dvander@555
    63
 * @param edict			Index of the entity/edict.
dvander@554
    64
 * @return				True if valid, false otherwise.
dvander@554
    65
 */
dvander@554
    66
native bool:IsValidEntity(edict);
dvander@554
    67
dvander@554
    68
/**
dvander@554
    69
 * Returns whether or not an edict index is valid.
dvander@554
    70
 *
dvander@554
    71
 * @param edict			Index of the edict.
dvander@554
    72
 * @return				True if valid, false otherwise.
dvander@554
    73
 */
dvander@554
    74
native bool:IsValidEdict(edict);
dvander@554
    75
dvander@554
    76
/**
dvander@555
    77
 * Returns whether or not an entity is a valid networkable edict.
dvander@555
    78
 *
dvander@555
    79
 * @param edict			Index of the edict.
dvander@555
    80
 * @return				True if networkable, false if invalid or not networkable.
dvander@555
    81
 */
dvander@555
    82
native bool:IsEntNetworkable(edict);
dvander@555
    83
dvander@555
    84
/**
dvander@554
    85
 * Creates a new edict (the basis of a networkable entity)
dvander@554
    86
 *
dvander@555
    87
 * @return				Index of the edict, 0 on failure.
dvander@554
    88
 */
dvander@554
    89
native CreateEdict();
dvander@554
    90
dvander@554
    91
/** 
dvander@554
    92
 * Removes an edict from the world.
dvander@554
    93
 *
dvander@555
    94
 * @param edict			Index of the edict.
dvander@554
    95
 * @noreturn
dvander@555
    96
 * @error				Invalid edict index.
dvander@554
    97
 */
dvander@554
    98
native RemoveEdict(edict);
dvander@555
    99
dvander@555
   100
/**
dvander@555
   101
 * Returns the flags on an edict.  These are not the same as entity flags.
dvander@555
   102
 *
dvander@555
   103
 * @param edict			Index of the entity.
dvander@555
   104
 * @return				Edict flags.
dvander@555
   105
 * @error				Invalid edict index.
dvander@555
   106
 */
dvander@555
   107
native GetEdictFlags(edict);
dvander@555
   108
dvander@555
   109
/**
dvander@555
   110
 * Sets the flags on an edict.  These are not the same as entity flags.
dvander@555
   111
 *
dvander@555
   112
 * @param edict			Index of the entity.
dvander@555
   113
 * @param flags			Flags to set.
dvander@555
   114
 * @noreturn
dvander@555
   115
 * @error				Invalid edict index.
dvander@555
   116
 */
dvander@556
   117
native SetEdictFlags(edict, flags);
dvander@556
   118
dvander@556
   119
/**
dvander@556
   120
 * Retrieves an edict classname.
dvander@556
   121
 *
dvander@556
   122
 * @param edict			Index of the entity.
dvander@556
   123
 * @param clsname		Buffer to store the classname.
dvander@556
   124
 * @param maxlength		Maximum length of the buffer.
dvander@556
   125
 * @return				True on success, false if there is no classname set.
dvander@556
   126
 */
dvander@556
   127
native bool:GetEdictClassname(edict, String:clsname[], maxlength);
dvander@556
   128
dvander@556
   129
/**
dvander@556
   130
 * Retrieves an entity's networkable serverclass name.
dvander@556
   131
 * This is not the same as the classname and is used for networkable state changes.
dvander@556
   132
 *
dvander@556
   133
 * @param edict			Index of the entity.
dvander@556
   134
 * @param clsname		Buffer to store the serverclass name.
dvander@556
   135
 * @param maxlength		Maximum lnegth of the buffer.
dvander@556
   136
 * @return				True on success, false if the edict is not networkable.
dvander@556
   137
 * @error				Invalid edict index.
dvander@556
   138
 */
dvander@556
   139
native bool:GetEntityNetClass(edict, String:clsname[], maxlength);
dvander@557
   140
dvander@557
   141
/**
dvander@557
   142
 * @section Entity offset functions
dvander@557
   143
 *
dvander@557
   144
 * Offsets should be specified in byte distance from the CBaseEntity 
dvander@557
   145
 * structure, not short (double byte) or integer (four byte) multiples.  
dvander@557
   146
 * It is somewhat common practice to use offsets aligned to their final 
dvander@557
   147
 * type, and thus make sure you are not falling to this error in SourceMod.
dvander@557
   148
 * For example, if your "integer-aligned" offset was 119, your byte-aligned
dvander@557
   149
 * offset is 119*4, or 476.
dvander@557
   150
 
dvander@557
   151
 * Specifying incorrect offsets or the incorrect data type for an offset
dvander@557
   152
 * can have fatal consequences.  If you are hardcoding offsets, and the 
dvander@557
   153
 * layout of CBaseEntity does not match, you can easily crash the server.
dvander@557
   154
 *
dvander@557
   155
 * The reasonable bounds for offsets is greater than or equal to 0 and 
dvander@557
   156
 * below 32768.  Offsets out of these bounds will throw an error.  However,
dvander@557
   157
 * this does not represent any real range, it is simply a sanity check for
dvander@557
   158
 * illegal values.  Any range outside of the CBaseEntity structure's private
dvander@557
   159
 * size will cause undefined behaviour or even crash.
dvander@557
   160
 */
dvander@558
   161
 
dvander@558
   162
/**
dvander@558
   163
 * Marks an entity as state changed.  This can be useful if you set an offset 
dvander@558
   164
 * and wish for it to be immediately changed over the network.  By default this 
dvander@558
   165
 * is not done for offset setting functions.  
dvander@558
   166
 *
dvander@558
   167
 * @param edict			Index to the edict.
dvander@558
   168
 * @param offset		Offset to mark as changed.  If 0, 
dvander@558
   169
 *						the entire edict is marked as changed.
dvander@558
   170
 * @noreturn
dvander@558
   171
 * @error				Invalid entity or offset out of bounds.
dvander@558
   172
 */
dvander@558
   173
native ChangeEdictState(edict, offset = 0);
dvander@557
   174
dvander@557
   175
/**
dvander@557
   176
 * Peeks into an entity's object data and retrieves the integer value at 
dvander@557
   177
 * the given offset.
dvander@557
   178
 * 
dvander@557
   179
 * @param entity		Edict index.
dvander@557
   180
 * @param offset		Offset to use.
dvander@557
   181
 * @param size			Number of bytes to read (valid values are 1, 2, or 4).
dvander@557
   182
 * @return				Value at the given memory location.
dvander@557
   183
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   184
 */
dvander@557
   185
native GetEntData(entity, offset, size=4);
dvander@557
   186
dvander@557
   187
/**
dvander@557
   188
 * Peeks into an entity's object data and sets the integer value at 
dvander@557
   189
 * the given offset.
dvander@557
   190
 *
dvander@557
   191
 * @param entity		Edict index.
dvander@557
   192
 * @param offset		Offset to use.
dvander@557
   193
 * @param size			Number of bytes to write (valid values are 1, 2, or 4).
dvander@561
   194
 * @param changeState	If true, change will be sent over the network.
dvander@557
   195
 * @return				Value at the given memory location.
dvander@557
   196
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   197
 * @noreturn
dvander@557
   198
 */
dvander@561
   199
native SetEntData(entity, offset, value, size=4, bool:changeState=false);
dvander@557
   200
dvander@557
   201
/**
dvander@557
   202
 * Peeks into an entity's object data and retrieves the float value at 
dvander@557
   203
 * the given offset.
dvander@557
   204
 * 
dvander@557
   205
 * @param entity		Edict index.
dvander@557
   206
 * @param offset		Offset to use.
dvander@557
   207
 * @return				Value at the given memory location.
dvander@557
   208
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   209
 */
dvander@557
   210
native Float:GetEntDataFloat(entity, offset);
dvander@557
   211
dvander@557
   212
/**
dvander@557
   213
 * Peeks into an entity's object data and sets the integer value at 
dvander@557
   214
 * the given offset.
dvander@557
   215
 *
dvander@557
   216
 * @param entity		Edict index.
dvander@557
   217
 * @param offset		Offset to use.
dvander@561
   218
 * @param changeState	If true, change will be sent over the network.
dvander@557
   219
 * @return				Value at the given memory location.
dvander@557
   220
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   221
 * @noreturn
dvander@557
   222
 */
dvander@561
   223
native SetEntDataFloat(entity, offset, Float:value, bool:changeState=false);
dvander@557
   224
dvander@557
   225
/**
dvander@557
   226
 * Peeks into an entity's object data and retrieves the entity handle
dvander@557
   227
 * info at the given offset.
dvander@557
   228
 * 
dvander@557
   229
 * @param entity		Edict index.
dvander@557
   230
 * @param offset		Offset to use.
dvander@557
   231
 * @return				Entity index at the given location, or 0 if none.
dvander@557
   232
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   233
 */
dvander@557
   234
native GetEntDataEnt(entity, offset);
dvander@557
   235
dvander@557
   236
/**
dvander@557
   237
 * Peeks into an entity's object data and sest the entity handle info
dvander@557
   238
 * at the given offset.
dvander@557
   239
 * 
dvander@557
   240
 * @param entity		Edict index.
dvander@557
   241
 * @param offset		Offset to use.
dvander@557
   242
 * @param other			Entity index to set, or 0 to clear.
dvander@561
   243
 * @param changeState	If true, change will be sent over the network.
dvander@557
   244
 * @noreturn
dvander@557
   245
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   246
 */
dvander@561
   247
native SetEntDataEnt(entity, offset, other, bool:changeState=false);
dvander@557
   248
dvander@557
   249
/**
dvander@557
   250
 * Peeks into an entity's object data and retrieves the vector at the 
dvander@557
   251
 * given offset.
dvander@557
   252
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@557
   253
 * convenience function and will work with both types.
dvander@557
   254
 * 
dvander@557
   255
 * @param entity		Edict index.
dvander@557
   256
 * @param offset		Offset to use.
dvander@557
   257
 * @param vec			Vector buffer to store data in.
dvander@557
   258
 * @noreturn
dvander@557
   259
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   260
 */
dvander@557
   261
native GetEntDataVector(entity, offset, Float:vec[3]);
dvander@557
   262
dvander@557
   263
/**
dvander@557
   264
 * Peeks into an entity's object data and sets the vector at the given 
dvander@557
   265
 * offset.
dvander@557
   266
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@557
   267
 * convenience function and will work with both types.
dvander@557
   268
 * 
dvander@557
   269
 * @param entity		Edict index.
dvander@557
   270
 * @param offset		Offset to use.
dvander@557
   271
 * @param vec			Vector to set.
dvander@561
   272
 * @param changeState	If true, change will be sent over the network.
dvander@557
   273
 * @noreturn
dvander@557
   274
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   275
 */
dvander@561
   276
native SetEntDataVector(entity, offset, const Float:vec[3], bool:changeState=false);
dvander@561
   277
dvander@561
   278
/**
dvander@619
   279
 * @endsection
dvander@619
   280
 */
dvander@619
   281
dvander@619
   282
/**
dvander@561
   283
 * Given a ServerClass name, finds a networkable send property offset.
dvander@561
   284
 * This information is cached for future calls.
dvander@561
   285
 *
dvander@561
   286
 * @param cls			Classname.
dvander@561
   287
 * @param prop			Property name.
dvander@561
   288
 * @return				An offset, or -1 on failure.
dvander@561
   289
 */
dvander@561
   290
native FindSendPropOffs(const String:cls[], const String:prop[]);
dvander@561
   291
dvander@561
   292
/**
faluco@682
   293
 * Given an entity, finds a datamap property offset.
faluco@682
   294
 * This information is cached for future calls.
faluco@682
   295
 *
faluco@682
   296
 * @param entity		Entity index.
faluco@682
   297
 * @param prop			Property name.
faluco@682
   298
 * @return				An offset, or -1 on failure.
faluco@682
   299
 */
faluco@682
   300
native FindDataMapOffs(entity, const String:prop[]);
faluco@682
   301
faluco@682
   302
/**
dvander@561
   303
 * Wrapper function for finding a send property for a particular entity.
dvander@561
   304
 *
dvander@561
   305
 * @param ent			Entity index.
dvander@561
   306
 * @param prop			Property name.
dvander@561
   307
 * @return				An offset, or -1 on failure.
dvander@561
   308
 */
dvander@561
   309
stock GetEntSendPropOffs(ent, const String:prop[])
dvander@561
   310
{
dvander@561
   311
	decl String:cls[64];
dvander@561
   312
	
dvander@561
   313
	if (!GetEntityNetClass(ent, cls, sizeof(cls)))
dvander@561
   314
	{
dvander@561
   315
		return -1;
dvander@561
   316
	}
dvander@561
   317
	
dvander@561
   318
	return FindSendPropOffs(cls, prop);
dvander@561
   319
}
dvander@561
   320
dvander@561
   321
/**
dvander@561
   322
 * Gets a network property as an integer; wrapper around GetEntData().
dvander@561
   323
 * 
dvander@561
   324
 * @param entity		Edict index.
dvander@610
   325
 * @param type			Property type.
dvander@561
   326
 * @param prop			Property to use.
dvander@561
   327
 * @param size			Number of bytes to read (valid values are 1, 2, or 4).
dvander@561
   328
 * @return				Value at the given property offset.
dvander@561
   329
 * @error				Invalid entity or property not found.
dvander@561
   330
 */
dvander@610
   331
stock GetEntProp(entity, PropType:type, const String:prop[], size=4)
dvander@561
   332
{
faluco@682
   333
	new offs;
faluco@682
   334
faluco@682
   335
	switch (type)
faluco@682
   336
	{
faluco@682
   337
		case Prop_Send:
faluco@682
   338
		{
faluco@682
   339
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   340
		}
faluco@682
   341
		case Prop_Data:
faluco@682
   342
		{
faluco@682
   343
			offs = FindDataMapOffs(entity, prop);
faluco@682
   344
		}
faluco@682
   345
		default:
faluco@682
   346
		{
faluco@682
   347
			ThrowError("Invalid Property type %d", type);
faluco@682
   348
		}
faluco@682
   349
	}
faluco@682
   350
dvander@561
   351
	if (offs == -1)
dvander@561
   352
	{
dvander@561
   353
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   354
	}
faluco@682
   355
dvander@561
   356
	return GetEntData(entity, offs, size);
dvander@561
   357
}
dvander@561
   358
dvander@561
   359
/**
dvander@561
   360
 * Sets a network property as an integer; wrapper around GetEntData().
dvander@561
   361
 *
dvander@561
   362
 * @param entity		Edict index.
dvander@610
   363
 * @param type			Property type.
dvander@561
   364
 * @param prop			Property to use.
dvander@561
   365
 * @param size			Number of bytes to write (valid values are 1, 2, or 4).
dvander@561
   366
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   367
 * @noreturn
dvander@561
   368
 */
dvander@610
   369
stock SetEntProp(entity, PropType:type, const String:prop[], value, size=4)
dvander@561
   370
{
faluco@682
   371
	new offs;
faluco@682
   372
faluco@682
   373
	switch (type)
faluco@682
   374
	{
faluco@682
   375
		case Prop_Send:
faluco@682
   376
		{
faluco@682
   377
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   378
		}
faluco@682
   379
		case Prop_Data:
faluco@682
   380
		{
faluco@682
   381
			offs = FindDataMapOffs(entity, prop);
faluco@682
   382
		}
faluco@682
   383
		default:
faluco@682
   384
		{
faluco@682
   385
			ThrowError("Invalid Property type %d", type);
faluco@682
   386
		}
faluco@682
   387
	}
faluco@682
   388
dvander@561
   389
	if (offs == -1)
dvander@561
   390
	{
dvander@561
   391
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   392
	}
faluco@682
   393
dvander@561
   394
	return SetEntData(entity, offs, value, size, true);
dvander@561
   395
}
dvander@561
   396
dvander@561
   397
/**
dvander@561
   398
 * Gets a network property as a float; wrapper around GetEntDataFloat().
dvander@561
   399
 * 
dvander@561
   400
 * @param entity		Edict index.
dvander@610
   401
 * @param type			Property type.
dvander@561
   402
 * @param prop			Property to use.
dvander@561
   403
 * @return				Value at the given property offset..
dvander@561
   404
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   405
 */
dvander@610
   406
stock Float:GetEntPropFloat(entity, PropType:type, const String:prop[])
dvander@561
   407
{
faluco@682
   408
	new offs;
faluco@682
   409
faluco@682
   410
	switch (type)
faluco@682
   411
	{
faluco@682
   412
		case Prop_Send:
faluco@682
   413
		{
faluco@682
   414
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   415
		}
faluco@682
   416
		case Prop_Data:
faluco@682
   417
		{
faluco@682
   418
			offs = FindDataMapOffs(entity, prop);
faluco@682
   419
		}
faluco@682
   420
		default:
faluco@682
   421
		{
faluco@682
   422
			ThrowError("Invalid Property type %d", type);
faluco@682
   423
		}
faluco@682
   424
	}
faluco@682
   425
dvander@561
   426
	if (offs == -1)
dvander@561
   427
	{
dvander@561
   428
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   429
	}
faluco@682
   430
dvander@561
   431
	return GetEntDataFloat(entity, offs);
dvander@561
   432
}
dvander@561
   433
dvander@561
   434
/**
dvander@561
   435
 * Sets a network property as a float; wrapper around SetEntDataFloat().
dvander@561
   436
 * 
dvander@561
   437
 * @param entity		Edict index.
dvander@610
   438
 * @param type			Property type.
dvander@561
   439
 * @param prop			Property to use.
dvander@561
   440
 * @param value			Value to set.
dvander@561
   441
 * @noreturn
dvander@561
   442
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   443
 */
dvander@610
   444
stock SetEntPropFloat(entity, PropType:type, const String:prop[], Float:value)
dvander@561
   445
{
faluco@682
   446
	new offs;
faluco@682
   447
faluco@682
   448
	switch (type)
faluco@682
   449
	{
faluco@682
   450
		case Prop_Send:
faluco@682
   451
		{
faluco@682
   452
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   453
		}
faluco@682
   454
		case Prop_Data:
faluco@682
   455
		{
faluco@682
   456
			offs = FindDataMapOffs(entity, prop);
faluco@682
   457
		}
faluco@682
   458
		default:
faluco@682
   459
		{
faluco@682
   460
			ThrowError("Invalid Property type %d", type);
faluco@682
   461
		}
faluco@682
   462
	}
faluco@682
   463
dvander@561
   464
	if (offs == -1)
dvander@561
   465
	{
dvander@561
   466
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   467
	}
faluco@682
   468
dvander@561
   469
	return SetEntDataFloat(entity, offs, value, true);
dvander@561
   470
}
dvander@561
   471
dvander@561
   472
/**
dvander@561
   473
 * Gets a network property as a handle entity; wrapper around GetEntDataEnt().
dvander@561
   474
 * 
dvander@561
   475
 * @param entity		Edict index.
dvander@610
   476
 * @param type			Property type.
dvander@561
   477
 * @param prop			Property to use.
dvander@561
   478
 * @return				Entity index at the given property, or 0 if none.
dvander@561
   479
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   480
 */
dvander@610
   481
stock GetEntPropEnt(entity, PropType:type, const String:prop[])
dvander@561
   482
{
faluco@682
   483
	new offs;
faluco@682
   484
faluco@682
   485
	switch (type)
faluco@682
   486
	{
faluco@682
   487
		case Prop_Send:
faluco@682
   488
		{
faluco@682
   489
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   490
		}
faluco@682
   491
		case Prop_Data:
faluco@682
   492
		{
faluco@682
   493
			offs = FindDataMapOffs(entity, prop);
faluco@682
   494
		}
faluco@682
   495
		default:
faluco@682
   496
		{
faluco@682
   497
			ThrowError("Invalid Property type %d", type);
faluco@682
   498
		}
faluco@682
   499
	}
faluco@682
   500
dvander@561
   501
	if (offs == -1)
dvander@561
   502
	{
dvander@561
   503
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   504
	}
faluco@682
   505
dvander@561
   506
	return GetEntDataEnt(entity, offs);
dvander@561
   507
}
dvander@561
   508
dvander@561
   509
/**
dvander@561
   510
 * Sets a network property as a handle entity; wrapper around SetEntDataEnt().
dvander@561
   511
 * 
dvander@561
   512
 * @param entity		Edict index.
dvander@610
   513
 * @param type			Property type.
dvander@561
   514
 * @param prop			Property to use.
dvander@561
   515
 * @param other			Entity index to set, or 0 to unset.
dvander@561
   516
 * @noreturn
dvander@561
   517
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   518
 */
dvander@610
   519
stock SetEntPropEnt(entity, PropType:type, const String:prop[], other)
dvander@561
   520
{
faluco@682
   521
	new offs;
faluco@682
   522
faluco@682
   523
	switch (type)
faluco@682
   524
	{
faluco@682
   525
		case Prop_Send:
faluco@682
   526
		{
faluco@682
   527
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   528
		}
faluco@682
   529
		case Prop_Data:
faluco@682
   530
		{
faluco@682
   531
			offs = FindDataMapOffs(entity, prop);
faluco@682
   532
		}
faluco@682
   533
		default:
faluco@682
   534
		{
faluco@682
   535
			ThrowError("Invalid Property type %d", type);
faluco@682
   536
		}
faluco@682
   537
	}
faluco@682
   538
dvander@561
   539
	if (offs == -1)
dvander@561
   540
	{
dvander@561
   541
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   542
	}
faluco@682
   543
dvander@561
   544
	return SetEntDataEnt(entity, offs, other, true);
dvander@561
   545
}
dvander@561
   546
dvander@561
   547
/**
dvander@561
   548
 * Gets a network property as a vector; wrapper around GetEntDataVector().
dvander@561
   549
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@561
   550
 * convenience function and will work with both types.
dvander@561
   551
 * 
dvander@561
   552
 * @param entity		Edict index.
dvander@610
   553
 * @param type			Property type.
dvander@561
   554
 * @param prop			Property to use.
dvander@561
   555
 * @param vec			Vector buffer to store data in.
dvander@561
   556
 * @noreturn
dvander@561
   557
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   558
 */
dvander@610
   559
stock GetEntPropVector(entity, PropType:type, const String:prop[], Float:vec[3])
dvander@561
   560
{
faluco@682
   561
	new offs;
faluco@682
   562
faluco@682
   563
	switch (type)
faluco@682
   564
	{
faluco@682
   565
		case Prop_Send:
faluco@682
   566
		{
faluco@682
   567
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   568
		}
faluco@682
   569
		case Prop_Data:
faluco@682
   570
		{
faluco@682
   571
			offs = FindDataMapOffs(entity, prop);
faluco@682
   572
		}
faluco@682
   573
		default:
faluco@682
   574
		{
faluco@682
   575
			ThrowError("Invalid Property type %d", type);
faluco@682
   576
		}
faluco@682
   577
	}
faluco@682
   578
dvander@561
   579
	if (offs == -1)
dvander@561
   580
	{
dvander@561
   581
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   582
	}
faluco@682
   583
dvander@561
   584
	return GetEntDataVector(entity, offs, vec);
dvander@561
   585
}
dvander@561
   586
dvander@561
   587
/**
dvander@561
   588
 * Sets a network property as a vector; wrapper around SetEntDataVector().
dvander@561
   589
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@561
   590
 * convenience function and will work with both types.
dvander@561
   591
 * 
dvander@561
   592
 * @param entity		Edict index.
dvander@610
   593
 * @param type			Property type.
dvander@561
   594
 * @param prop			Property to use.
dvander@561
   595
 * @param vec			Vector to set.
dvander@561
   596
 * @noreturn
dvander@561
   597
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   598
 */
dvander@610
   599
stock SetEntPropVector(entity, PropType:type, const String:prop[], const Float:vec[3])
dvander@561
   600
{
faluco@682
   601
	new offs;
faluco@682
   602
faluco@682
   603
	switch (type)
faluco@682
   604
	{
faluco@682
   605
		case Prop_Send:
faluco@682
   606
		{
faluco@682
   607
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   608
		}
faluco@682
   609
		case Prop_Data:
faluco@682
   610
		{
faluco@682
   611
			offs = FindDataMapOffs(entity, prop);
faluco@682
   612
		}
faluco@682
   613
		default:
faluco@682
   614
		{
faluco@682
   615
			ThrowError("Invalid Property type %d", type);
faluco@682
   616
		}
faluco@682
   617
	}
faluco@682
   618
dvander@561
   619
	if (offs == -1)
dvander@561
   620
	{
dvander@561
   621
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   622
	}
faluco@682
   623
dvander@561
   624
	return SetEntDataVector(entity, offs, vec, true);
dvander@561
   625
}