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