plugins/include/entity.inc
author Borja Ferrer <faluco@alliedmods.net>
Sat Apr 14 02:24:23 2007 +0000 (2007-04-14)
changeset 694 b9b2cbe6352e
parent 682 a70055d6d3b3
child 823 78982602de6f
permissions -rw-r--r--
added entity string natives
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
/**
faluco@694
   237
 * Peeks into an entity's object data and sets 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
/**
faluco@694
   279
 * Peeks into an entity's object data and retrieves the string at 
faluco@694
   280
 * the given offset.
faluco@694
   281
 * 
faluco@694
   282
 * @param entity		Edict index.
faluco@694
   283
 * @param offset		Offset to use.
faluco@694
   284
 * @param buffer		Destination string buffer.
faluco@694
   285
 * @param maxlen		Maximum length of output string buffer.
faluco@694
   286
 * @return			Number of non-null bytes written.
faluco@694
   287
 * @error				Invalid entity or offset out of reasonable bounds.
faluco@694
   288
 */
faluco@694
   289
native GetEntDataString(entity, offset, String:buffer[], maxlen);
faluco@694
   290
faluco@694
   291
/**
faluco@694
   292
 * Peeks into an entity's object data and sets the string at 
faluco@694
   293
 * the given offset.
faluco@694
   294
 * 
faluco@694
   295
 * @param entity		Edict index.
faluco@694
   296
 * @param offset		Offset to use.
faluco@694
   297
 * @param buffer		String to set.
faluco@694
   298
 * @param maxlen		Maximum length of bytes to write.
faluco@694
   299
 * @param changeState	If true, change will be sent over the network.
faluco@694
   300
 * @return			Number of non-null bytes written.
faluco@694
   301
 * @error				Invalid entity or offset out of reasonable bounds.
faluco@694
   302
 */
faluco@694
   303
native SetEntDataString(entity, offset, const String:buffer[], maxlen, bool:changeState=false);
faluco@694
   304
faluco@694
   305
/**
dvander@619
   306
 * @endsection
dvander@619
   307
 */
dvander@619
   308
dvander@619
   309
/**
dvander@561
   310
 * Given a ServerClass name, finds a networkable send property offset.
dvander@561
   311
 * This information is cached for future calls.
dvander@561
   312
 *
dvander@561
   313
 * @param cls			Classname.
dvander@561
   314
 * @param prop			Property name.
dvander@561
   315
 * @return				An offset, or -1 on failure.
dvander@561
   316
 */
dvander@561
   317
native FindSendPropOffs(const String:cls[], const String:prop[]);
dvander@561
   318
dvander@561
   319
/**
faluco@682
   320
 * Given an entity, finds a datamap property offset.
faluco@682
   321
 * This information is cached for future calls.
faluco@682
   322
 *
faluco@682
   323
 * @param entity		Entity index.
faluco@682
   324
 * @param prop			Property name.
faluco@682
   325
 * @return				An offset, or -1 on failure.
faluco@682
   326
 */
faluco@682
   327
native FindDataMapOffs(entity, const String:prop[]);
faluco@682
   328
faluco@682
   329
/**
dvander@561
   330
 * Wrapper function for finding a send property for a particular entity.
dvander@561
   331
 *
dvander@561
   332
 * @param ent			Entity index.
dvander@561
   333
 * @param prop			Property name.
dvander@561
   334
 * @return				An offset, or -1 on failure.
dvander@561
   335
 */
dvander@561
   336
stock GetEntSendPropOffs(ent, const String:prop[])
dvander@561
   337
{
dvander@561
   338
	decl String:cls[64];
dvander@561
   339
	
dvander@561
   340
	if (!GetEntityNetClass(ent, cls, sizeof(cls)))
dvander@561
   341
	{
dvander@561
   342
		return -1;
dvander@561
   343
	}
dvander@561
   344
	
dvander@561
   345
	return FindSendPropOffs(cls, prop);
dvander@561
   346
}
dvander@561
   347
dvander@561
   348
/**
dvander@561
   349
 * Gets a network property as an integer; wrapper around GetEntData().
dvander@561
   350
 * 
dvander@561
   351
 * @param entity		Edict index.
dvander@610
   352
 * @param type			Property type.
dvander@561
   353
 * @param prop			Property to use.
dvander@561
   354
 * @param size			Number of bytes to read (valid values are 1, 2, or 4).
dvander@561
   355
 * @return				Value at the given property offset.
dvander@561
   356
 * @error				Invalid entity or property not found.
dvander@561
   357
 */
dvander@610
   358
stock GetEntProp(entity, PropType:type, const String:prop[], size=4)
dvander@561
   359
{
faluco@682
   360
	new offs;
faluco@682
   361
faluco@682
   362
	switch (type)
faluco@682
   363
	{
faluco@682
   364
		case Prop_Send:
faluco@682
   365
		{
faluco@682
   366
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   367
		}
faluco@682
   368
		case Prop_Data:
faluco@682
   369
		{
faluco@682
   370
			offs = FindDataMapOffs(entity, prop);
faluco@682
   371
		}
faluco@682
   372
		default:
faluco@682
   373
		{
faluco@682
   374
			ThrowError("Invalid Property type %d", type);
faluco@682
   375
		}
faluco@682
   376
	}
faluco@682
   377
dvander@561
   378
	if (offs == -1)
dvander@561
   379
	{
dvander@561
   380
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   381
	}
faluco@682
   382
dvander@561
   383
	return GetEntData(entity, offs, size);
dvander@561
   384
}
dvander@561
   385
dvander@561
   386
/**
dvander@561
   387
 * Sets a network property as an integer; wrapper around GetEntData().
dvander@561
   388
 *
dvander@561
   389
 * @param entity		Edict index.
dvander@610
   390
 * @param type			Property type.
dvander@561
   391
 * @param prop			Property to use.
dvander@561
   392
 * @param size			Number of bytes to write (valid values are 1, 2, or 4).
dvander@561
   393
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   394
 * @noreturn
dvander@561
   395
 */
dvander@610
   396
stock SetEntProp(entity, PropType:type, const String:prop[], value, size=4)
dvander@561
   397
{
faluco@682
   398
	new offs;
faluco@682
   399
faluco@682
   400
	switch (type)
faluco@682
   401
	{
faluco@682
   402
		case Prop_Send:
faluco@682
   403
		{
faluco@682
   404
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   405
		}
faluco@682
   406
		case Prop_Data:
faluco@682
   407
		{
faluco@682
   408
			offs = FindDataMapOffs(entity, prop);
faluco@682
   409
		}
faluco@682
   410
		default:
faluco@682
   411
		{
faluco@682
   412
			ThrowError("Invalid Property type %d", type);
faluco@682
   413
		}
faluco@682
   414
	}
faluco@682
   415
dvander@561
   416
	if (offs == -1)
dvander@561
   417
	{
dvander@561
   418
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   419
	}
faluco@682
   420
dvander@561
   421
	return SetEntData(entity, offs, value, size, true);
dvander@561
   422
}
dvander@561
   423
dvander@561
   424
/**
dvander@561
   425
 * Gets a network property as a float; wrapper around GetEntDataFloat().
dvander@561
   426
 * 
dvander@561
   427
 * @param entity		Edict index.
dvander@610
   428
 * @param type			Property type.
dvander@561
   429
 * @param prop			Property to use.
faluco@694
   430
 * @return				Value at the given property offset.
dvander@561
   431
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   432
 */
dvander@610
   433
stock Float:GetEntPropFloat(entity, PropType:type, const String:prop[])
dvander@561
   434
{
faluco@682
   435
	new offs;
faluco@682
   436
faluco@682
   437
	switch (type)
faluco@682
   438
	{
faluco@682
   439
		case Prop_Send:
faluco@682
   440
		{
faluco@682
   441
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   442
		}
faluco@682
   443
		case Prop_Data:
faluco@682
   444
		{
faluco@682
   445
			offs = FindDataMapOffs(entity, prop);
faluco@682
   446
		}
faluco@682
   447
		default:
faluco@682
   448
		{
faluco@682
   449
			ThrowError("Invalid Property type %d", type);
faluco@682
   450
		}
faluco@682
   451
	}
faluco@682
   452
dvander@561
   453
	if (offs == -1)
dvander@561
   454
	{
dvander@561
   455
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   456
	}
faluco@682
   457
dvander@561
   458
	return GetEntDataFloat(entity, offs);
dvander@561
   459
}
dvander@561
   460
dvander@561
   461
/**
dvander@561
   462
 * Sets a network property as a float; wrapper around SetEntDataFloat().
dvander@561
   463
 * 
dvander@561
   464
 * @param entity		Edict index.
dvander@610
   465
 * @param type			Property type.
dvander@561
   466
 * @param prop			Property to use.
dvander@561
   467
 * @param value			Value to set.
dvander@561
   468
 * @noreturn
dvander@561
   469
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   470
 */
dvander@610
   471
stock SetEntPropFloat(entity, PropType:type, const String:prop[], Float:value)
dvander@561
   472
{
faluco@682
   473
	new offs;
faluco@682
   474
faluco@682
   475
	switch (type)
faluco@682
   476
	{
faluco@682
   477
		case Prop_Send:
faluco@682
   478
		{
faluco@682
   479
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   480
		}
faluco@682
   481
		case Prop_Data:
faluco@682
   482
		{
faluco@682
   483
			offs = FindDataMapOffs(entity, prop);
faluco@682
   484
		}
faluco@682
   485
		default:
faluco@682
   486
		{
faluco@682
   487
			ThrowError("Invalid Property type %d", type);
faluco@682
   488
		}
faluco@682
   489
	}
faluco@682
   490
dvander@561
   491
	if (offs == -1)
dvander@561
   492
	{
dvander@561
   493
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   494
	}
faluco@682
   495
dvander@561
   496
	return SetEntDataFloat(entity, offs, value, true);
dvander@561
   497
}
dvander@561
   498
dvander@561
   499
/**
dvander@561
   500
 * Gets a network property as a handle entity; wrapper around GetEntDataEnt().
dvander@561
   501
 * 
dvander@561
   502
 * @param entity		Edict index.
dvander@610
   503
 * @param type			Property type.
dvander@561
   504
 * @param prop			Property to use.
dvander@561
   505
 * @return				Entity index at the given property, or 0 if none.
dvander@561
   506
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   507
 */
dvander@610
   508
stock GetEntPropEnt(entity, PropType:type, const String:prop[])
dvander@561
   509
{
faluco@682
   510
	new offs;
faluco@682
   511
faluco@682
   512
	switch (type)
faluco@682
   513
	{
faluco@682
   514
		case Prop_Send:
faluco@682
   515
		{
faluco@682
   516
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   517
		}
faluco@682
   518
		case Prop_Data:
faluco@682
   519
		{
faluco@682
   520
			offs = FindDataMapOffs(entity, prop);
faluco@682
   521
		}
faluco@682
   522
		default:
faluco@682
   523
		{
faluco@682
   524
			ThrowError("Invalid Property type %d", type);
faluco@682
   525
		}
faluco@682
   526
	}
faluco@682
   527
dvander@561
   528
	if (offs == -1)
dvander@561
   529
	{
dvander@561
   530
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   531
	}
faluco@682
   532
dvander@561
   533
	return GetEntDataEnt(entity, offs);
dvander@561
   534
}
dvander@561
   535
dvander@561
   536
/**
dvander@561
   537
 * Sets a network property as a handle entity; wrapper around SetEntDataEnt().
dvander@561
   538
 * 
dvander@561
   539
 * @param entity		Edict index.
dvander@610
   540
 * @param type			Property type.
dvander@561
   541
 * @param prop			Property to use.
dvander@561
   542
 * @param other			Entity index to set, or 0 to unset.
dvander@561
   543
 * @noreturn
dvander@561
   544
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   545
 */
dvander@610
   546
stock SetEntPropEnt(entity, PropType:type, const String:prop[], other)
dvander@561
   547
{
faluco@682
   548
	new offs;
faluco@682
   549
faluco@682
   550
	switch (type)
faluco@682
   551
	{
faluco@682
   552
		case Prop_Send:
faluco@682
   553
		{
faluco@682
   554
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   555
		}
faluco@682
   556
		case Prop_Data:
faluco@682
   557
		{
faluco@682
   558
			offs = FindDataMapOffs(entity, prop);
faluco@682
   559
		}
faluco@682
   560
		default:
faluco@682
   561
		{
faluco@682
   562
			ThrowError("Invalid Property type %d", type);
faluco@682
   563
		}
faluco@682
   564
	}
faluco@682
   565
dvander@561
   566
	if (offs == -1)
dvander@561
   567
	{
dvander@561
   568
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   569
	}
faluco@682
   570
dvander@561
   571
	return SetEntDataEnt(entity, offs, other, true);
dvander@561
   572
}
dvander@561
   573
dvander@561
   574
/**
dvander@561
   575
 * Gets a network property as a vector; wrapper around GetEntDataVector().
dvander@561
   576
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@561
   577
 * convenience function and will work with both types.
dvander@561
   578
 * 
dvander@561
   579
 * @param entity		Edict index.
dvander@610
   580
 * @param type			Property type.
dvander@561
   581
 * @param prop			Property to use.
dvander@561
   582
 * @param vec			Vector buffer to store data in.
dvander@561
   583
 * @noreturn
dvander@561
   584
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   585
 */
dvander@610
   586
stock GetEntPropVector(entity, PropType:type, const String:prop[], Float:vec[3])
dvander@561
   587
{
faluco@682
   588
	new offs;
faluco@682
   589
faluco@682
   590
	switch (type)
faluco@682
   591
	{
faluco@682
   592
		case Prop_Send:
faluco@682
   593
		{
faluco@682
   594
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   595
		}
faluco@682
   596
		case Prop_Data:
faluco@682
   597
		{
faluco@682
   598
			offs = FindDataMapOffs(entity, prop);
faluco@682
   599
		}
faluco@682
   600
		default:
faluco@682
   601
		{
faluco@682
   602
			ThrowError("Invalid Property type %d", type);
faluco@682
   603
		}
faluco@682
   604
	}
faluco@682
   605
dvander@561
   606
	if (offs == -1)
dvander@561
   607
	{
dvander@561
   608
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   609
	}
faluco@682
   610
dvander@561
   611
	return GetEntDataVector(entity, offs, vec);
dvander@561
   612
}
dvander@561
   613
dvander@561
   614
/**
dvander@561
   615
 * Sets a network property as a vector; wrapper around SetEntDataVector().
dvander@561
   616
 * @note Both a Vector and a QAngle are three floats.  This is a 
dvander@561
   617
 * convenience function and will work with both types.
dvander@561
   618
 * 
dvander@561
   619
 * @param entity		Edict index.
dvander@610
   620
 * @param type			Property type.
dvander@561
   621
 * @param prop			Property to use.
dvander@561
   622
 * @param vec			Vector to set.
dvander@561
   623
 * @noreturn
dvander@561
   624
 * @error				Invalid entity or offset out of reasonable bounds.
dvander@561
   625
 */
dvander@610
   626
stock SetEntPropVector(entity, PropType:type, const String:prop[], const Float:vec[3])
dvander@561
   627
{
faluco@682
   628
	new offs;
faluco@682
   629
faluco@682
   630
	switch (type)
faluco@682
   631
	{
faluco@682
   632
		case Prop_Send:
faluco@682
   633
		{
faluco@682
   634
			offs = GetEntSendPropOffs(entity, prop);
faluco@682
   635
		}
faluco@682
   636
		case Prop_Data:
faluco@682
   637
		{
faluco@682
   638
			offs = FindDataMapOffs(entity, prop);
faluco@682
   639
		}
faluco@682
   640
		default:
faluco@682
   641
		{
faluco@682
   642
			ThrowError("Invalid Property type %d", type);
faluco@682
   643
		}
faluco@682
   644
	}
faluco@682
   645
dvander@561
   646
	if (offs == -1)
dvander@561
   647
	{
dvander@561
   648
		ThrowError("Property \"%s\" not found for entity %d", prop, entity);
dvander@561
   649
	}
faluco@682
   650
dvander@561
   651
	return SetEntDataVector(entity, offs, vec, true);
dvander@561
   652
}
faluco@694
   653
faluco@694
   654
/**
faluco@694
   655
 * Gets a network property as a string.
faluco@694
   656
 * 
faluco@694
   657
 * @param entity		Edict index.
faluco@694
   658
 * @param type			Property type.
faluco@694
   659
 * @param prop			Property to use.
faluco@694
   660
 * @param buffer		Destination string buffer.
faluco@694
   661
 * @param maxlen		Maximum length of output string buffer.		
faluco@694
   662
 * @return				Number of non-null bytes written.
faluco@694
   663
 * @error				Invalid entity, offset out of reasonable bounds, or property is not a valid string.
faluco@694
   664
 */
faluco@694
   665
native GetEntPropString(entity, PropType:type, const String:prop[], String:buffer[], maxlen);
faluco@694
   666
faluco@694
   667
/**
faluco@694
   668
 * Sets a network property as a string.
faluco@694
   669
 * 
faluco@694
   670
 * @param entity		Edict index.
faluco@694
   671
 * @param type			Property type.
faluco@694
   672
 * @param prop			Property to use.
faluco@694
   673
 * @param buffer		String to set.		
faluco@694
   674
 * @return				Number of non-null bytes written.
faluco@694
   675
 * @error				Invalid entity, offset out of reasonable bounds, or property is not a valid string.
faluco@694
   676
 */
faluco@694
   677
native SetEntPropString(entity, PropType:type, const String:prop[], const String:buffer[]);