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