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