plugins/include/entity.inc
author Phong Dang <teame06@gmail.com>
Sun Jul 29 00:26:18 2007 +0000 (2007-07-29)
changeset 1200 623603b49096
parent 1040 d6acd61136f2
child 1330 ab94316bb52b
permissions -rw-r--r--
Fixed AskPluginLoad would still allowed plugin to load even if it returned false.
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
/**
faluco@1040
    31
 * @section For more information on these, see the HL2SDK (public/edict.h)
dvander@555
    32
 */
faluco@1040
    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. */
faluco@1040
    35
#define FL_EDICT_FREE			(1<<1)	/**< this edict if free for reuse */
faluco@1040
    36
#define FL_EDICT_FULL			(1<<2)	/**< this is a full server entity */
faluco@1040
    37
#define FL_EDICT_FULLCHECK		(0<<0)  /**< call ShouldTransmit() each time, this is a fake flag */
faluco@1040
    38
#define FL_EDICT_ALWAYS			(1<<3)	/**< always transmit this entity */
faluco@1040
    39
#define FL_EDICT_DONTSEND		(1<<4)	/**< don't transmit this entity */
faluco@1040
    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)
faluco@1040
    43
#define FL_FULL_EDICT_CHANGED		(1<<8)
faluco@1040
    44
faluco@1040
    45
/**
faluco@1040
    46
 * @endsection
faluco@1040
    47
 */
dvander@555
    48
dvander@554
    49
/**
dvander@554
    50
 * Returns the maximum number of entities.
dvander@554
    51
 *
dvander@554
    52
 * @return				Maximum number of entities.
dvander@554
    53
 */
dvander@554
    54
native GetMaxEntities();
dvander@554
    55
dvander@554
    56
/**
dvander@554
    57
 * Returns the number of entities in the server.
dvander@554
    58
 *
dvander@554
    59
 * @return				Number of entities in the server.
dvander@554
    60
 */
dvander@554
    61
native GetEntityCount();
dvander@554
    62
dvander@554
    63
/**
dvander@554
    64
 * Returns whether or not an entity is valid.  Returns false
dvander@554
    65
 * if there is no matching CBaseEntity for this edict index.
dvander@554
    66
 *
dvander@555
    67
 * @param edict			Index of the entity/edict.
dvander@554
    68
 * @return				True if valid, false otherwise.
dvander@554
    69
 */
dvander@554
    70
native bool:IsValidEntity(edict);
dvander@554
    71
dvander@554
    72
/**
dvander@554
    73
 * Returns whether or not an edict index is valid.
dvander@554
    74
 *
dvander@554
    75
 * @param edict			Index of the edict.
dvander@554
    76
 * @return				True if valid, false otherwise.
dvander@554
    77
 */
dvander@554
    78
native bool:IsValidEdict(edict);
dvander@554
    79
dvander@554
    80
/**
dvander@555
    81
 * Returns whether or not an entity is a valid networkable edict.
dvander@555
    82
 *
dvander@555
    83
 * @param edict			Index of the edict.
dvander@555
    84
 * @return				True if networkable, false if invalid or not networkable.
dvander@555
    85
 */
dvander@555
    86
native bool:IsEntNetworkable(edict);
dvander@555
    87
dvander@555
    88
/**
dvander@554
    89
 * Creates a new edict (the basis of a networkable entity)
dvander@554
    90
 *
dvander@555
    91
 * @return				Index of the edict, 0 on failure.
dvander@554
    92
 */
dvander@554
    93
native CreateEdict();
dvander@554
    94
dvander@554
    95
/** 
dvander@554
    96
 * Removes an edict from the world.
dvander@554
    97
 *
dvander@555
    98
 * @param edict			Index of the edict.
dvander@554
    99
 * @noreturn
dvander@555
   100
 * @error				Invalid edict index.
dvander@554
   101
 */
dvander@554
   102
native RemoveEdict(edict);
dvander@555
   103
dvander@555
   104
/**
dvander@555
   105
 * Returns the flags on an edict.  These are not the same as entity flags.
dvander@555
   106
 *
dvander@555
   107
 * @param edict			Index of the entity.
dvander@555
   108
 * @return				Edict flags.
dvander@555
   109
 * @error				Invalid edict index.
dvander@555
   110
 */
dvander@555
   111
native GetEdictFlags(edict);
dvander@555
   112
dvander@555
   113
/**
dvander@555
   114
 * Sets the flags on an edict.  These are not the same as entity flags.
dvander@555
   115
 *
dvander@555
   116
 * @param edict			Index of the entity.
dvander@555
   117
 * @param flags			Flags to set.
dvander@555
   118
 * @noreturn
dvander@555
   119
 * @error				Invalid edict index.
dvander@555
   120
 */
dvander@556
   121
native SetEdictFlags(edict, flags);
dvander@556
   122
dvander@556
   123
/**
dvander@556
   124
 * Retrieves an edict classname.
dvander@556
   125
 *
dvander@556
   126
 * @param edict			Index of the entity.
dvander@556
   127
 * @param clsname		Buffer to store the classname.
dvander@556
   128
 * @param maxlength		Maximum length of the buffer.
dvander@556
   129
 * @return				True on success, false if there is no classname set.
dvander@556
   130
 */
dvander@556
   131
native bool:GetEdictClassname(edict, String:clsname[], maxlength);
dvander@556
   132
dvander@556
   133
/**
dvander@556
   134
 * Retrieves an entity's networkable serverclass name.
dvander@556
   135
 * This is not the same as the classname and is used for networkable state changes.
dvander@556
   136
 *
dvander@556
   137
 * @param edict			Index of the entity.
dvander@556
   138
 * @param clsname		Buffer to store the serverclass name.
dvander@556
   139
 * @param maxlength		Maximum lnegth of the buffer.
dvander@556
   140
 * @return				True on success, false if the edict is not networkable.
dvander@556
   141
 * @error				Invalid edict index.
dvander@556
   142
 */
dvander@556
   143
native bool:GetEntityNetClass(edict, String:clsname[], maxlength);
dvander@557
   144
dvander@557
   145
/**
dvander@557
   146
 * @section Entity offset functions
dvander@557
   147
 *
dvander@557
   148
 * Offsets should be specified in byte distance from the CBaseEntity 
dvander@557
   149
 * structure, not short (double byte) or integer (four byte) multiples.  
dvander@557
   150
 * It is somewhat common practice to use offsets aligned to their final 
dvander@557
   151
 * type, and thus make sure you are not falling to this error in SourceMod.
dvander@557
   152
 * For example, if your "integer-aligned" offset was 119, your byte-aligned
dvander@557
   153
 * offset is 119*4, or 476.
dvander@557
   154
 
dvander@557
   155
 * Specifying incorrect offsets or the incorrect data type for an offset
dvander@557
   156
 * can have fatal consequences.  If you are hardcoding offsets, and the 
dvander@557
   157
 * layout of CBaseEntity does not match, you can easily crash the server.
dvander@557
   158
 *
dvander@557
   159
 * The reasonable bounds for offsets is greater than or equal to 0 and 
dvander@557
   160
 * below 32768.  Offsets out of these bounds will throw an error.  However,
dvander@557
   161
 * this does not represent any real range, it is simply a sanity check for
dvander@557
   162
 * illegal values.  Any range outside of the CBaseEntity structure's private
dvander@557
   163
 * size will cause undefined behaviour or even crash.
dvander@557
   164
 */
dvander@558
   165
 
dvander@558
   166
/**
dvander@558
   167
 * Marks an entity as state changed.  This can be useful if you set an offset 
dvander@558
   168
 * and wish for it to be immediately changed over the network.  By default this 
dvander@558
   169
 * is not done for offset setting functions.  
dvander@558
   170
 *
dvander@558
   171
 * @param edict			Index to the edict.
dvander@558
   172
 * @param offset		Offset to mark as changed.  If 0, 
dvander@558
   173
 *						the entire edict is marked as changed.
dvander@558
   174
 * @noreturn
dvander@558
   175
 * @error				Invalid entity or offset out of bounds.
dvander@558
   176
 */
dvander@558
   177
native ChangeEdictState(edict, offset = 0);
dvander@557
   178
dvander@557
   179
/**
dvander@557
   180
 * Peeks into an entity's object data and retrieves the integer value at 
dvander@557
   181
 * the given offset.
dvander@557
   182
 * 
dvander@557
   183
 * @param entity		Edict index.
dvander@557
   184
 * @param offset		Offset to use.
dvander@557
   185
 * @param size			Number of bytes to read (valid values are 1, 2, or 4).
dvander@557
   186
 * @return				Value at the given memory location.
dvander@557
   187
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   188
 */
dvander@557
   189
native GetEntData(entity, offset, size=4);
dvander@557
   190
dvander@557
   191
/**
dvander@557
   192
 * Peeks into an entity's object data and sets the integer value at 
dvander@557
   193
 * the given offset.
dvander@557
   194
 *
dvander@557
   195
 * @param entity		Edict index.
dvander@557
   196
 * @param offset		Offset to use.
dvander@557
   197
 * @param size			Number of bytes to write (valid values are 1, 2, or 4).
dvander@561
   198
 * @param changeState	If true, change will be sent over the network.
dvander@557
   199
 * @return				Value at the given memory location.
dvander@557
   200
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   201
 * @noreturn
dvander@557
   202
 */
dvander@561
   203
native SetEntData(entity, offset, value, size=4, bool:changeState=false);
dvander@557
   204
dvander@557
   205
/**
dvander@557
   206
 * Peeks into an entity's object data and retrieves the float value at 
dvander@557
   207
 * the given offset.
dvander@557
   208
 * 
dvander@557
   209
 * @param entity		Edict index.
dvander@557
   210
 * @param offset		Offset to use.
dvander@557
   211
 * @return				Value at the given memory location.
dvander@557
   212
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   213
 */
dvander@557
   214
native Float:GetEntDataFloat(entity, offset);
dvander@557
   215
dvander@557
   216
/**
dvander@557
   217
 * Peeks into an entity's object data and sets the integer value at 
dvander@557
   218
 * the given offset.
dvander@557
   219
 *
dvander@557
   220
 * @param entity		Edict index.
dvander@557
   221
 * @param offset		Offset to use.
dvander@561
   222
 * @param changeState	If true, change will be sent over the network.
dvander@557
   223
 * @return				Value at the given memory location.
dvander@557
   224
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   225
 * @noreturn
dvander@557
   226
 */
dvander@561
   227
native SetEntDataFloat(entity, offset, Float:value, bool:changeState=false);
dvander@557
   228
dvander@557
   229
/**
dvander@557
   230
 * Peeks into an entity's object data and retrieves the entity handle
dvander@557
   231
 * info at the given offset.
dvander@557
   232
 * 
dvander@557
   233
 * @param entity		Edict index.
dvander@557
   234
 * @param offset		Offset to use.
dvander@557
   235
 * @return				Entity index at the given location, or 0 if none.
dvander@557
   236
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   237
 */
dvander@557
   238
native GetEntDataEnt(entity, offset);
dvander@557
   239
dvander@557
   240
/**
faluco@694
   241
 * Peeks into an entity's object data and sets the entity handle info
dvander@557
   242
 * at the given offset.
dvander@557
   243
 * 
dvander@557
   244
 * @param entity		Edict index.
dvander@557
   245
 * @param offset		Offset to use.
dvander@557
   246
 * @param other			Entity index to set, or 0 to clear.
dvander@561
   247
 * @param changeState	If true, change will be sent over the network.
dvander@557
   248
 * @noreturn
dvander@557
   249
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   250
 */
dvander@561
   251
native SetEntDataEnt(entity, offset, other, bool:changeState=false);
dvander@557
   252
dvander@557
   253
/**
dvander@557
   254
 * Peeks into an entity's object data and retrieves the vector at the 
dvander@557
   255
 * given offset.
dvander@557
   256
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@557
   257
 * convenience function and will work with both types.
dvander@557
   258
 * 
dvander@557
   259
 * @param entity		Edict index.
dvander@557
   260
 * @param offset		Offset to use.
dvander@557
   261
 * @param vec			Vector buffer to store data in.
dvander@557
   262
 * @noreturn
dvander@557
   263
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   264
 */
dvander@557
   265
native GetEntDataVector(entity, offset, Float:vec[3]);
dvander@557
   266
dvander@557
   267
/**
dvander@557
   268
 * Peeks into an entity's object data and sets the vector at the given 
dvander@557
   269
 * offset.
dvander@557
   270
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@557
   271
 * convenience function and will work with both types.
dvander@557
   272
 * 
dvander@557
   273
 * @param entity		Edict index.
dvander@557
   274
 * @param offset		Offset to use.
dvander@557
   275
 * @param vec			Vector to set.
dvander@561
   276
 * @param changeState	If true, change will be sent over the network.
dvander@557
   277
 * @noreturn
dvander@557
   278
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@557
   279
 */
dvander@561
   280
native SetEntDataVector(entity, offset, const Float:vec[3], bool:changeState=false);
dvander@561
   281
dvander@561
   282
/**
faluco@694
   283
 * Peeks into an entity's object data and retrieves the string at 
faluco@694
   284
 * the given offset.
faluco@694
   285
 * 
faluco@694
   286
 * @param entity		Edict index.
faluco@694
   287
 * @param offset		Offset to use.
faluco@694
   288
 * @param buffer		Destination string buffer.
faluco@694
   289
 * @param maxlen		Maximum length of output string buffer.
faluco@694
   290
 * @return			Number of non-null bytes written.
faluco@694
   291
 * @error				Invalid entity or offset out of reasonable bounds.
faluco@694
   292
 */
faluco@694
   293
native GetEntDataString(entity, offset, String:buffer[], maxlen);
faluco@694
   294
faluco@694
   295
/**
faluco@694
   296
 * Peeks into an entity's object data and sets the string at 
faluco@694
   297
 * the given offset.
faluco@694
   298
 * 
faluco@694
   299
 * @param entity		Edict index.
faluco@694
   300
 * @param offset		Offset to use.
faluco@694
   301
 * @param buffer		String to set.
faluco@694
   302
 * @param maxlen		Maximum length of bytes to write.
faluco@694
   303
 * @param changeState	If true, change will be sent over the network.
faluco@694
   304
 * @return			Number of non-null bytes written.
faluco@694
   305
 * @error				Invalid entity or offset out of reasonable bounds.
faluco@694
   306
 */
faluco@694
   307
native SetEntDataString(entity, offset, const String:buffer[], maxlen, bool:changeState=false);
faluco@694
   308
faluco@694
   309
/**
dvander@619
   310
 * @endsection
dvander@619
   311
 */
dvander@619
   312
dvander@619
   313
/**
dvander@561
   314
 * Given a ServerClass name, finds a networkable send property offset.
dvander@561
   315
 * This information is cached for future calls.
dvander@561
   316
 *
dvander@561
   317
 * @param cls			Classname.
dvander@561
   318
 * @param prop			Property name.
dvander@561
   319
 * @return				An offset, or -1 on failure.
dvander@561
   320
 */
dvander@561
   321
native FindSendPropOffs(const String:cls[], const String:prop[]);
dvander@561
   322
dvander@561
   323
/**
faluco@682
   324
 * Given an entity, finds a datamap property offset.
faluco@682
   325
 * This information is cached for future calls.
faluco@682
   326
 *
faluco@682
   327
 * @param entity		Entity index.
faluco@682
   328
 * @param prop			Property name.
faluco@682
   329
 * @return				An offset, or -1 on failure.
faluco@682
   330
 */
faluco@682
   331
native FindDataMapOffs(entity, const String:prop[]);
faluco@682
   332
faluco@682
   333
/**
dvander@561
   334
 * Wrapper function for finding a send property for a particular entity.
dvander@561
   335
 *
dvander@561
   336
 * @param ent			Entity index.
dvander@561
   337
 * @param prop			Property name.
dvander@561
   338
 * @return				An offset, or -1 on failure.
dvander@561
   339
 */
dvander@561
   340
stock GetEntSendPropOffs(ent, const String:prop[])
dvander@561
   341
{
dvander@561
   342
	decl String:cls[64];
dvander@561
   343
	
dvander@561
   344
	if (!GetEntityNetClass(ent, cls, sizeof(cls)))
dvander@561
   345
	{
dvander@561
   346
		return -1;
dvander@561
   347
	}
dvander@561
   348
	
dvander@561
   349
	return FindSendPropOffs(cls, prop);
dvander@561
   350
}
dvander@561
   351
dvander@561
   352
/**
dvander@561
   353
 * Gets a network property as an integer; wrapper around GetEntData().
dvander@561
   354
 * 
dvander@561
   355
 * @param entity		Edict index.
dvander@610
   356
 * @param type			Property type.
dvander@561
   357
 * @param prop			Property to use.
dvander@561
   358
 * @param size			Number of bytes to read (valid values are 1, 2, or 4).
dvander@561
   359
 * @return				Value at the given property offset.
dvander@561
   360
 * @error				Invalid entity or property not found.
dvander@561
   361
 */
dvander@610
   362
stock GetEntProp(entity, PropType:type, const String:prop[], size=4)
dvander@561
   363
{
faluco@682
   364
	new offs;
faluco@682
   365
faluco@682
   366
	switch (type)
faluco@682
   367
	{
faluco@682
   368
		case Prop_Send:
faluco@682
   369
		{
faluco@682
   370
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   371
		}
faluco@682
   372
		case Prop_Data:
faluco@682
   373
		{
faluco@682
   374
			offs = FindDataMapOffs(entity, prop);
faluco@682
   375
		}
faluco@682
   376
		default:
faluco@682
   377
		{
faluco@682
   378
			ThrowError("Invalid Property type %d", type);
faluco@682
   379
		}
faluco@682
   380
	}
faluco@682
   381
dvander@561
   382
	if (offs == -1)
dvander@561
   383
	{
dvander@561
   384
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   385
	}
faluco@682
   386
dvander@561
   387
	return GetEntData(entity, offs, size);
dvander@561
   388
}
dvander@561
   389
dvander@561
   390
/**
dvander@561
   391
 * Sets a network property as an integer; wrapper around GetEntData().
dvander@561
   392
 *
dvander@561
   393
 * @param entity		Edict index.
dvander@610
   394
 * @param type			Property type.
dvander@561
   395
 * @param prop			Property to use.
dvander@561
   396
 * @param size			Number of bytes to write (valid values are 1, 2, or 4).
dvander@561
   397
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   398
 * @noreturn
dvander@561
   399
 */
dvander@610
   400
stock SetEntProp(entity, PropType:type, const String:prop[], value, size=4)
dvander@561
   401
{
faluco@682
   402
	new offs;
faluco@682
   403
faluco@682
   404
	switch (type)
faluco@682
   405
	{
faluco@682
   406
		case Prop_Send:
faluco@682
   407
		{
faluco@682
   408
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   409
		}
faluco@682
   410
		case Prop_Data:
faluco@682
   411
		{
faluco@682
   412
			offs = FindDataMapOffs(entity, prop);
faluco@682
   413
		}
faluco@682
   414
		default:
faluco@682
   415
		{
faluco@682
   416
			ThrowError("Invalid Property type %d", type);
faluco@682
   417
		}
faluco@682
   418
	}
faluco@682
   419
dvander@561
   420
	if (offs == -1)
dvander@561
   421
	{
dvander@561
   422
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   423
	}
faluco@682
   424
dvander@561
   425
	return SetEntData(entity, offs, value, size, true);
dvander@561
   426
}
dvander@561
   427
dvander@561
   428
/**
dvander@561
   429
 * Gets a network property as a float; wrapper around GetEntDataFloat().
dvander@561
   430
 * 
dvander@561
   431
 * @param entity		Edict index.
dvander@610
   432
 * @param type			Property type.
dvander@561
   433
 * @param prop			Property to use.
faluco@694
   434
 * @return				Value at the given property offset.
dvander@561
   435
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   436
 */
dvander@610
   437
stock Float:GetEntPropFloat(entity, PropType:type, const String:prop[])
dvander@561
   438
{
faluco@682
   439
	new offs;
faluco@682
   440
faluco@682
   441
	switch (type)
faluco@682
   442
	{
faluco@682
   443
		case Prop_Send:
faluco@682
   444
		{
faluco@682
   445
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   446
		}
faluco@682
   447
		case Prop_Data:
faluco@682
   448
		{
faluco@682
   449
			offs = FindDataMapOffs(entity, prop);
faluco@682
   450
		}
faluco@682
   451
		default:
faluco@682
   452
		{
faluco@682
   453
			ThrowError("Invalid Property type %d", type);
faluco@682
   454
		}
faluco@682
   455
	}
faluco@682
   456
dvander@561
   457
	if (offs == -1)
dvander@561
   458
	{
dvander@561
   459
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   460
	}
faluco@682
   461
dvander@561
   462
	return GetEntDataFloat(entity, offs);
dvander@561
   463
}
dvander@561
   464
dvander@561
   465
/**
dvander@561
   466
 * Sets a network property as a float; wrapper around SetEntDataFloat().
dvander@561
   467
 * 
dvander@561
   468
 * @param entity		Edict index.
dvander@610
   469
 * @param type			Property type.
dvander@561
   470
 * @param prop			Property to use.
dvander@561
   471
 * @param value			Value to set.
dvander@561
   472
 * @noreturn
dvander@561
   473
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   474
 */
dvander@610
   475
stock SetEntPropFloat(entity, PropType:type, const String:prop[], Float:value)
dvander@561
   476
{
faluco@682
   477
	new offs;
faluco@682
   478
faluco@682
   479
	switch (type)
faluco@682
   480
	{
faluco@682
   481
		case Prop_Send:
faluco@682
   482
		{
faluco@682
   483
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   484
		}
faluco@682
   485
		case Prop_Data:
faluco@682
   486
		{
faluco@682
   487
			offs = FindDataMapOffs(entity, prop);
faluco@682
   488
		}
faluco@682
   489
		default:
faluco@682
   490
		{
faluco@682
   491
			ThrowError("Invalid Property type %d", type);
faluco@682
   492
		}
faluco@682
   493
	}
faluco@682
   494
dvander@561
   495
	if (offs == -1)
dvander@561
   496
	{
dvander@561
   497
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   498
	}
faluco@682
   499
dvander@561
   500
	return SetEntDataFloat(entity, offs, value, true);
dvander@561
   501
}
dvander@561
   502
dvander@561
   503
/**
dvander@561
   504
 * Gets a network property as a handle entity; wrapper around GetEntDataEnt().
dvander@561
   505
 * 
dvander@561
   506
 * @param entity		Edict index.
dvander@610
   507
 * @param type			Property type.
dvander@561
   508
 * @param prop			Property to use.
dvander@561
   509
 * @return				Entity index at the given property, or 0 if none.
dvander@561
   510
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   511
 */
dvander@610
   512
stock GetEntPropEnt(entity, PropType:type, const String:prop[])
dvander@561
   513
{
faluco@682
   514
	new offs;
faluco@682
   515
faluco@682
   516
	switch (type)
faluco@682
   517
	{
faluco@682
   518
		case Prop_Send:
faluco@682
   519
		{
faluco@682
   520
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   521
		}
faluco@682
   522
		case Prop_Data:
faluco@682
   523
		{
faluco@682
   524
			offs = FindDataMapOffs(entity, prop);
faluco@682
   525
		}
faluco@682
   526
		default:
faluco@682
   527
		{
faluco@682
   528
			ThrowError("Invalid Property type %d", type);
faluco@682
   529
		}
faluco@682
   530
	}
faluco@682
   531
dvander@561
   532
	if (offs == -1)
dvander@561
   533
	{
dvander@561
   534
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   535
	}
faluco@682
   536
dvander@561
   537
	return GetEntDataEnt(entity, offs);
dvander@561
   538
}
dvander@561
   539
dvander@561
   540
/**
dvander@561
   541
 * Sets a network property as a handle entity; wrapper around SetEntDataEnt().
dvander@561
   542
 * 
dvander@561
   543
 * @param entity		Edict index.
dvander@610
   544
 * @param type			Property type.
dvander@561
   545
 * @param prop			Property to use.
dvander@561
   546
 * @param other			Entity index to set, or 0 to unset.
dvander@561
   547
 * @noreturn
dvander@561
   548
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   549
 */
dvander@610
   550
stock SetEntPropEnt(entity, PropType:type, const String:prop[], other)
dvander@561
   551
{
faluco@682
   552
	new offs;
faluco@682
   553
faluco@682
   554
	switch (type)
faluco@682
   555
	{
faluco@682
   556
		case Prop_Send:
faluco@682
   557
		{
faluco@682
   558
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   559
		}
faluco@682
   560
		case Prop_Data:
faluco@682
   561
		{
faluco@682
   562
			offs = FindDataMapOffs(entity, prop);
faluco@682
   563
		}
faluco@682
   564
		default:
faluco@682
   565
		{
faluco@682
   566
			ThrowError("Invalid Property type %d", type);
faluco@682
   567
		}
faluco@682
   568
	}
faluco@682
   569
dvander@561
   570
	if (offs == -1)
dvander@561
   571
	{
dvander@561
   572
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   573
	}
faluco@682
   574
dvander@561
   575
	return SetEntDataEnt(entity, offs, other, true);
dvander@561
   576
}
dvander@561
   577
dvander@561
   578
/**
dvander@561
   579
 * Gets a network property as a vector; wrapper around GetEntDataVector().
dvander@561
   580
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@561
   581
 * convenience function and will work with both types.
dvander@561
   582
 * 
dvander@561
   583
 * @param entity		Edict index.
dvander@610
   584
 * @param type			Property type.
dvander@561
   585
 * @param prop			Property to use.
dvander@561
   586
 * @param vec			Vector buffer to store data in.
dvander@561
   587
 * @noreturn
dvander@561
   588
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   589
 */
dvander@610
   590
stock GetEntPropVector(entity, PropType:type, const String:prop[], Float:vec[3])
dvander@561
   591
{
faluco@682
   592
	new offs;
faluco@682
   593
faluco@682
   594
	switch (type)
faluco@682
   595
	{
faluco@682
   596
		case Prop_Send:
faluco@682
   597
		{
faluco@682
   598
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   599
		}
faluco@682
   600
		case Prop_Data:
faluco@682
   601
		{
faluco@682
   602
			offs = FindDataMapOffs(entity, prop);
faluco@682
   603
		}
faluco@682
   604
		default:
faluco@682
   605
		{
faluco@682
   606
			ThrowError("Invalid Property type %d", type);
faluco@682
   607
		}
faluco@682
   608
	}
faluco@682
   609
dvander@561
   610
	if (offs == -1)
dvander@561
   611
	{
dvander@561
   612
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   613
	}
faluco@682
   614
dvander@561
   615
	return GetEntDataVector(entity, offs, vec);
dvander@561
   616
}
dvander@561
   617
dvander@561
   618
/**
dvander@561
   619
 * Sets a network property as a vector; wrapper around SetEntDataVector().
dvander@561
   620
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@561
   621
 * convenience function and will work with both types.
dvander@561
   622
 * 
dvander@561
   623
 * @param entity		Edict index.
dvander@610
   624
 * @param type			Property type.
dvander@561
   625
 * @param prop			Property to use.
dvander@561
   626
 * @param vec			Vector to set.
dvander@561
   627
 * @noreturn
dvander@561
   628
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   629
 */
dvander@610
   630
stock SetEntPropVector(entity, PropType:type, const String:prop[], const Float:vec[3])
dvander@561
   631
{
faluco@682
   632
	new offs;
faluco@682
   633
faluco@682
   634
	switch (type)
faluco@682
   635
	{
faluco@682
   636
		case Prop_Send:
faluco@682
   637
		{
faluco@682
   638
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   639
		}
faluco@682
   640
		case Prop_Data:
faluco@682
   641
		{
faluco@682
   642
			offs = FindDataMapOffs(entity, prop);
faluco@682
   643
		}
faluco@682
   644
		default:
faluco@682
   645
		{
faluco@682
   646
			ThrowError("Invalid Property type %d", type);
faluco@682
   647
		}
faluco@682
   648
	}
faluco@682
   649
dvander@561
   650
	if (offs == -1)
dvander@561
   651
	{
dvander@561
   652
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   653
	}
faluco@682
   654
dvander@561
   655
	return SetEntDataVector(entity, offs, vec, true);
dvander@561
   656
}
faluco@694
   657
faluco@694
   658
/**
faluco@694
   659
 * Gets a network property as a string.
faluco@694
   660
 * 
faluco@694
   661
 * @param entity		Edict index.
faluco@694
   662
 * @param type			Property type.
faluco@694
   663
 * @param prop			Property to use.
faluco@694
   664
 * @param buffer		Destination string buffer.
faluco@694
   665
 * @param maxlen		Maximum length of output string buffer.		
faluco@694
   666
 * @return				Number of non-null bytes written.
faluco@694
   667
 * @error				Invalid entity, offset out of reasonable bounds, or property is not a valid string.
faluco@694
   668
 */
faluco@694
   669
native GetEntPropString(entity, PropType:type, const String:prop[], String:buffer[], maxlen);
faluco@694
   670
faluco@694
   671
/**
faluco@694
   672
 * Sets a network property as a string.
faluco@694
   673
 * 
faluco@694
   674
 * @param entity		Edict index.
faluco@694
   675
 * @param type			Property type.
faluco@694
   676
 * @param prop			Property to use.
faluco@694
   677
 * @param buffer		String to set.		
faluco@694
   678
 * @return				Number of non-null bytes written.
faluco@694
   679
 * @error				Invalid entity, offset out of reasonable bounds, or property is not a valid string.
faluco@694
   680
 */
faluco@694
   681
native SetEntPropString(entity, PropType:type, const String:prop[], const String:buffer[]);
dvander@823
   682
dvander@823
   683
/**
dvander@823
   684
 * Copies an array of cells from an entity at a given offset.
dvander@823
   685
 *
dvander@823
   686
 * @param entity		Entity index.
dvander@823
   687
 * @param offset		Offset to use.
dvander@823
   688
 * @param array			Array to read into.
dvander@823
   689
 * @param arraySize		Number of values to read.
dvander@823
   690
 * @param dataSize		Size of each value in bytes (1, 2, or 4).
dvander@823
   691
 * @noreturn
dvander@823
   692
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@823
   693
 */
dvander@827
   694
stock GetEntDataArray(entity, offset, array[], arraySize, dataSize=4)
dvander@823
   695
{
dvander@823
   696
	for (new i=0; i<arraySize; i++)
dvander@823
   697
	{
dvander@1010
   698
		array[i] = GetEntData(entity, offset + i*dataSize, dataSize)
dvander@823
   699
	}
dvander@823
   700
}
dvander@823
   701
dvander@823
   702
dvander@823
   703
/**
dvander@823
   704
 * Copies an array of cells to an entity at a given offset.
dvander@823
   705
 *
dvander@823
   706
 * @param entity		Entity index.
dvander@823
   707
 * @param offset		Offset to use.
dvander@823
   708
 * @param array			Array of values to copy.
dvander@823
   709
 * @param arraySize		Number of values to copy.
dvander@823
   710
 * @param dataSize		Size of each value in bytes (1, 2, or 4).
dvander@823
   711
 * @param changeState	True to set the network state as changed; false otherwise.
dvander@823
   712
 * @noreturn
dvander@823
   713
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@823
   714
 */
dvander@1010
   715
stock SetEntDataArray(entity, offset, const array[], arraySize, dataSize=4, bool:changeState=false)
dvander@823
   716
{
dvander@823
   717
	for (new i=0; i<arraySize; i++)
dvander@823
   718
	{
dvander@1010
   719
		SetEntData(entity, offset + i*dataSize, array[i], dataSize, changeState);
dvander@823
   720
	}
dvander@823
   721
}