summaryrefslogtreecommitdiff
path: root/sourcemod-1.5-dev/scripting/include/smlib/entities.inc
diff options
context:
space:
mode:
Diffstat (limited to 'sourcemod-1.5-dev/scripting/include/smlib/entities.inc')
-rw-r--r--sourcemod-1.5-dev/scripting/include/smlib/entities.inc2153
1 files changed, 0 insertions, 2153 deletions
diff --git a/sourcemod-1.5-dev/scripting/include/smlib/entities.inc b/sourcemod-1.5-dev/scripting/include/smlib/entities.inc
deleted file mode 100644
index 95b5cf2..0000000
--- a/sourcemod-1.5-dev/scripting/include/smlib/entities.inc
+++ /dev/null
@@ -1,2153 +0,0 @@
-#if defined _smlib_entities_included
- #endinput
-#endif
-#define _smlib_entities_included
-
-#include <sourcemod>
-#include <sdktools_entinput>
-#include <sdktools_functions>
-
-/**
- * Macro for iterating trough all children (entities it is parent of) of an entity.
- *
- * @param 1 Entity Index of the parent.
- * @param 2 Name of the children entity index variable (will be only valid in the loop).
- */
-#define LOOP_CHILDREN(%1,%2) for (new %2=Entity_GetNextChild(%1); %2 != INVALID_ENT_REFERENCE; %2=Entity_GetNextChild(%1, ++%2))
-
-/*
- * Checks if an entity is valid and exists.
- *
- * @param entity Entity Index.
- * @return True if the entity is valid, false otherwise.
- */
-stock Entity_IsValid(entity)
-{
- return IsValidEntity(entity);
-}
-
-/**
- * Finds an entity by its name.
- * You can optionally specify the classname to search for.
- * Note: If the classname is specified it uses The Sourcemod native
- * function FindEntityByClassname() which uses the engine's
- * linked entity list for finding entities. This might be
- * cheaper, use this if you call this function very often.
- *
- * @param name Name of the entity you want so search.
- * @param className Optional: Classname of the entity
- * @return Entity index or INVALID_ENT_REFERENCE if not matching entity was found.
- */
-stock Entity_FindByName(const String:name[], const String:className[]="")
-{
- if (className[0] == '\0') {
- // Hack: Double the limit to gets none-networked entities too.
- new realMaxEntities = GetMaxEntities() * 2;
- for (new entity=0; entity < realMaxEntities; entity++) {
-
- if (!IsValidEntity(entity)) {
- continue;
- }
-
- if (Entity_NameMatches(entity, name)) {
- return entity;
- }
- }
- }
- else {
- new entity = INVALID_ENT_REFERENCE;
- while ((entity = FindEntityByClassname(entity, className)) != INVALID_ENT_REFERENCE) {
-
- if (Entity_NameMatches(entity, name)) {
- return entity;
- }
- }
- }
-
- return INVALID_ENT_REFERENCE;
-}
-
-/**
- * Finds an entity by its HammerID.
- * The newer version of Valve's Hammer editor
- * sets a unique ID for each entity in a map.
- * It only finds the first occurence.
- * Note: If the classname is specified it uses The Sourcemod native
- * function FindEntityByClassname() which uses the engine's
- * linked entity list for finding entities. This might be
- * cheaper, use this if you call this function very often.
- *
- * @param hammerId Hammer editor ID
- * @param className Optional: Classname of the entity
- * @return Edict Index or INVALID_ENT_REFERENCE if no entity was found.
- */
-stock Entity_FindByHammerId(hammerId, const String:className[]="")
-{
- if (className[0] == '\0') {
- // Hack: Double the limit to gets none-networked entities too.
- new realMaxEntities = GetMaxEntities() * 2;
- for (new entity=0; entity < realMaxEntities; entity++) {
-
- if (!IsValidEntity(entity)) {
- continue;
- }
-
- if (Entity_GetHammerId(entity) == hammerId) {
- return entity;
- }
- }
- }
- else {
- new entity = INVALID_ENT_REFERENCE;
- while ((entity = FindEntityByClassname(entity, className)) != INVALID_ENT_REFERENCE) {
-
- if (Entity_GetHammerId(entity) == hammerId) {
- return entity;
- }
- }
- }
-
- return INVALID_ENT_REFERENCE;
-}
-
-/**
- * Searches for an entity by classname.
- * This is a wrapper around FindEntityByClassname
- * and has been added for completion.
- *
- * @param startEnt The entity index after which to begin searching from. Use -1 to start from the first entity.
- * @param classname Classname of the entity to find.
- * @return Entity index >= 0 if found, -1 otherwise.
- */
-
-stock Entity_FindByClassName(startEntity, const String:className[])
-{
- return FindEntityByClassname(startEntity, className);
-}
-
-/**
- * Checks if an entity (partially) matches a specific entity class.
- *
- * @param entity Entity Index.
- * @param className Classname String.
- * @partialMatch If to do a partial classname check.
- * @return True if the classname matches, false otherwise.
- */
-stock bool:Entity_ClassNameMatches(entity, const String:className[], partialMatch=false)
-{
- decl String:entity_className[64];
- Entity_GetClassName(entity, entity_className, sizeof(entity_className));
-
- if (partialMatch) {
- return (StrContains(entity_className, className) != -1);
- }
-
- return StrEqual(entity_className, className);
-}
-
-/**
- * Checks if an entity matches a name
- *
- * @param entity Entity Index.
- * @param class Name String.
- * @return True if the name matches, false otherwise.
- */
-stock bool:Entity_NameMatches(entity, const String:name[])
-{
- decl String:entity_name[128];
- Entity_GetName(entity, entity_name, sizeof(entity_name));
-
- return StrEqual(name, entity_name);
-}
-
-/**
- * Gets the Name of an entity.
- *
- * @param entity Entity index.
- * @param buffer Return/Output buffer.
- * @param size Max size of buffer.
- * @return Number of non-null bytes written.
- */
-stock Entity_GetName(entity, String:buffer[], size)
-{
- return GetEntPropString(entity, Prop_Data, "m_iName", buffer, size);
-}
-
-/**
- * Sets the Name of an entity.
- *
- * @param entity Entity index.
- * @param name The name you want to give.
- * @return True on success, false otherwise.
- */
-stock Entity_SetName(entity, const String:name[], any:...)
-{
- decl String:format[128];
- VFormat(format, sizeof(format), name, 3);
-
- return DispatchKeyValue(entity, "targetname", format);
-}
-
-/**
- * Gets the Classname of an entity.
- * This is like GetEdictClassname(), except it works for ALL
- * entities, not just edicts.
- *
- * @param entity Entity index.
- * @param buffer Return/Output buffer.
- * @param size Max size of buffer.
- * @return Number of non-null bytes written.
- */
-stock Entity_GetClassName(entity, String:buffer[], size)
-{
- return GetEntPropString(entity, Prop_Data, "m_iClassname", buffer, size);
-}
-
-/**
- * Sets the Classname of an entity.
- *
- * @param entity Entity index.
- * @param name The name you want to give.
- * @return True on success, false otherwise.
- */
-stock Entity_SetClassName(entity, const String:className[])
-{
- return DispatchKeyValue(entity, "classname", className);
-}
-
-/**
- * Gets the Target name of an other entity
- *
- * @param entity Entity index.
- * @param buffer Return/Output buffer.
- * @param size Max size of buffer.
- * @return Number of non-null bytes written.
- */
-stock Entity_GetTargetName(entity, String:buffer[], size)
-{
- return GetEntPropString(entity, Prop_Data, "m_target", buffer, size);
-}
-
-/**
- * Sets the Target name of an other Entity
- *
- * @param entity Entity index.
- * @param name The target name you want to set
- * @return True on success, false otherwise.
- */
-stock Entity_SetTargetName(entity, const String:name[], any:...)
-{
- decl String:format[128];
- VFormat(format, sizeof(format), name, 3);
-
- return DispatchKeyValue(entity, "target", format);
-}
-
-/**
- * Gets the Global Name of an entity.
- *
- * @param entity Entity index.
- * @param buffer Return/Output buffer.
- * @param size Max size of buffer.
- * @return Number of non-null bytes written.
- */
-stock Entity_GetGlobalName(entity, String:buffer[], size)
-{
- return GetEntPropString(entity, Prop_Data, "m_iGlobalname", buffer, size);
-}
-
-/**
- * Sets the Global Name of an entity.
- *
- * @param entity Entity index.
- * @param name The global name you want to set.
- * @return True on success, false otherwise.
- */
-stock Entity_SetGlobalName(entity, const String:name[], any:...)
-{
- decl String:format[128];
- VFormat(format, sizeof(format), name, 3);
-
- return DispatchKeyValue(entity, "globalname", format);
-}
-
-/**
- * Gets the Parent name of an entity.
- *
- * @param entity Entity index.
- * @param buffer Return/Output buffer.
- * @param size Max size of buffer.
- * @return Number of non-null bytes written.
- */
-stock Entity_GetParentName(entity, String:buffer[], size)
-{
- return GetEntPropString(entity, Prop_Data, "m_iParent", buffer, size);
-}
-
-/**
- * Sets the Parent name of an entity.
- *
- * @param entity Entity index.
- * @param name The parent name you want to set.
- * @return True on success, false otherwise.
- */
-stock Entity_SetParentName(entity, const String:name[], any:...)
-{
- decl String:format[128];
- VFormat(format, sizeof(format), name, 3);
-
- return DispatchKeyValue(entity, "parentname", format);
-}
-
-/**
- * Gets the Hammer-ID of an entity.
- * The Hammer Editor gives every entity a unique ID.
- * Note: Old maps don't have Hammer-ID's set for entities
- *
- * @param entity Entity index.
- * @return Hammer ID.
- */
-stock Entity_GetHammerId(entity)
-{
- return GetEntProp(entity, Prop_Data, "m_iHammerID");
-}
-
-/**
- * Gets the radius (m_flRadius) of an entity.
- *
- * @param entity Entity index.
- * @return Radius
- */
-stock Float:Entity_GetRadius(entity)
-{
- return GetEntPropFloat(entity, Prop_Data, "m_flRadius");
-}
-
-/**
- * Sets the radius (m_flRadius) of an entity.
- *
- * @param entity Entity index.
- * @param radius Radius value
- * @noreturn
- */
-stock Entity_SetRadius(entity, Float:radius)
-{
- SetEntPropFloat(entity, Prop_Data, "m_flRadius", radius);
-}
-
-/**
- * Gets the Mins of an entity.
- *
- * @param entity Entity index.
- * @param vec Vector.
- * @noreturn
- */
-stock Entity_GetMinSize(entity, Float:vec[3])
-{
- GetEntPropVector(entity, Prop_Send, "m_vecMins", vec);
-}
-
-/**
- * Sets the Mins of an entity.
- *
- * @param entity Entity index.
- * @param vec Vector.
- * @noreturn
- */
-stock Entity_SetMinSize(entity, const Float:vecMins[3])
-{
- SetEntPropVector(entity, Prop_Send, "m_vecMins", vecMins);
-}
-
-/**
- * Gets the Mins of an entity.
- * This functions isn't safe to use, use Entity_SetMinMaxSize() instead.
- *
- * @param entity Entity index
- * @param vec return vector.
- * @noreturn
- */
-stock Entity_GetMaxSize(entity, Float:vec[3])
-{
- GetEntPropVector(entity, Prop_Send, "m_vecMaxs", vec);
-}
-
-/**
- * Sets the Maxs of an entity.
- * This functions isn't safe to use, use Entity_SetMinMaxSize() instead.
- *
- * @param entity Entity index.
- * @param vec Vector.
- * @noreturn
- */
-stock Entity_SetMaxSize(entity, const Float:vecMaxs[3])
-{
- SetEntPropVector(entity, Prop_Send, "m_vecMaxs", vecMaxs);
-}
-
-/**
- * Sets the Min and Max Size of an entity.
- * Code is taken from HL2SDK and rewritten for Sourcemod.
- *
- * @param entity Entity index.
- * @param vecMins Min size Vector
- * @param vecMaxs Max size Vector
- * @noreturn
- */
-stock Entity_SetMinMaxSize(entity, Float:vecMins[3], Float:vecMaxs[3])
-{
- // Taken from hl2sdk-ob-valve\game\server\util.cpp SetMinMaxSize()
- // Todo: Replace this by a SDK call
- for (new i=0; i<3; i++) {
-
- if (vecMins[i] > vecMaxs[i]) {
- ThrowError("Error: mins[%d] > maxs[%d] of entity %d", i, i, EntRefToEntIndex(entity));
- }
- }
-
- decl Float:m_vecMins[3], Float:m_vecMaxs[3];
- Entity_GetMinSize(entity, m_vecMins);
- Entity_GetMaxSize(entity, m_vecMaxs);
-
- if (Math_VectorsEqual(m_vecMins, vecMins) && Math_VectorsEqual(m_vecMaxs, vecMaxs)) {
- return;
- }
-
- Entity_SetMinSize(entity, vecMins);
- Entity_SetMaxSize(entity, vecMaxs);
-
- decl Float:vecSize[3];
- SubtractVectors(vecMaxs, vecMins, vecSize);
- Entity_SetRadius(entity, GetVectorLength(vecSize) * 0.5);
-
- Entity_MarkSurrBoundsDirty(entity);
-}
-
-/*
- * Spawn Flags
- * Many entities define their specific spawnflags, check the HL2SDK.
- */
-
-/*
- * Phys prop spawnflags
- * Taken from hl2sdk-ob-valve\game\shared\props_shared.h
- */
-#define SF_PHYSPROP_START_ASLEEP 0x000001
-#define SF_PHYSPROP_DONT_TAKE_PHYSICS_DAMAGE 0x000002 // this prop can't be damaged by physics collisions
-#define SF_PHYSPROP_DEBRIS 0x000004
-#define SF_PHYSPROP_MOTIONDISABLED 0x000008 // motion disabled at startup (flag only valid in spawn - motion can be enabled via input)
-#define SF_PHYSPROP_TOUCH 0x000010 // can be 'crashed through' by running player (plate glass)
-#define SF_PHYSPROP_PRESSURE 0x000020 // can be broken by a player standing on it
-#define SF_PHYSPROP_ENABLE_ON_PHYSCANNON 0x000040 // enable motion only if the player grabs it with the physcannon
-#define SF_PHYSPROP_NO_ROTORWASH_PUSH 0x000080 // The rotorwash doesn't push these
-#define SF_PHYSPROP_ENABLE_PICKUP_OUTPUT 0x000100 // If set, allow the player to +USE this for the purposes of generating an output
-#define SF_PHYSPROP_PREVENT_PICKUP 0x000200 // If set, prevent +USE/Physcannon pickup of this prop
-#define SF_PHYSPROP_PREVENT_PLAYER_TOUCH_ENABLE 0x000400 // If set, the player will not cause the object to enable its motion when bumped into
-#define SF_PHYSPROP_HAS_ATTACHED_RAGDOLLS 0x000800 // Need to remove attached ragdolls on enable motion/etc
-#define SF_PHYSPROP_FORCE_TOUCH_TRIGGERS 0x001000 // Override normal debris behavior and respond to triggers anyway
-#define SF_PHYSPROP_FORCE_SERVER_SIDE 0x002000 // Force multiplayer physics object to be serverside
-#define SF_PHYSPROP_RADIUS_PICKUP 0x004000 // For Xbox, makes small objects easier to pick up by allowing them to be found
-#define SF_PHYSPROP_ALWAYS_PICK_UP 0x100000 // Physcannon can always pick this up, no matter what mass or constraints may apply.
-#define SF_PHYSPROP_NO_COLLISIONS 0x200000 // Don't enable collisions on spawn
-#define SF_PHYSPROP_IS_GIB 0x400000 // Limit # of active gibs
-
-/*
- * Physbox Spawnflags. Start at 0x01000 to avoid collision with CBreakable's
- * Taken from hl2sdk-ob-valve\game\server\physobj.h
- */
-#define SF_PHYSBOX_ASLEEP 0x01000
-#define SF_PHYSBOX_IGNOREUSE 0x02000
-#define SF_PHYSBOX_DEBRIS 0x04000
-#define SF_PHYSBOX_MOTIONDISABLED 0x08000
-#define SF_PHYSBOX_USEPREFERRED 0x10000
-#define SF_PHYSBOX_ENABLE_ON_PHYSCANNON 0x20000
-#define SF_PHYSBOX_NO_ROTORWASH_PUSH 0x40000 // The rotorwash doesn't push these
-#define SF_PHYSBOX_ENABLE_PICKUP_OUTPUT 0x80000
-#define SF_PHYSBOX_ALWAYS_PICK_UP 0x100000 // Physcannon can always pick this up, no matter what mass or constraints may apply.
-#define SF_PHYSBOX_NEVER_PICK_UP 0x200000 // Physcannon will never be able to pick this up.
-#define SF_PHYSBOX_NEVER_PUNT 0x400000 // Physcannon will never be able to punt this object.
-#define SF_PHYSBOX_PREVENT_PLAYER_TOUCH_ENABLE 0x800000 // If set, the player will not cause the object to enable its motion when bumped into
-
-/*
- * Spawnflags for func breakable
- * Taken from hl2sdk-ob-valve\game\server\func_break.h
- */
-#define SF_BREAK_TRIGGER_ONLY 0x0001 // may only be broken by trigger
-#define SF_BREAK_TOUCH 0x0002 // can be 'crashed through' by running player (plate glass)
-#define SF_BREAK_PRESSURE 0x0004 // can be broken by a player standing on it
-#define SF_BREAK_PHYSICS_BREAK_IMMEDIATELY 0x0200 // the first physics collision this breakable has will immediately break it
-#define SF_BREAK_DONT_TAKE_PHYSICS_DAMAGE 0x0400 // this breakable doesn't take damage from physics collisions
-#define SF_BREAK_NO_BULLET_PENETRATION 0x0800 // don't allow bullets to penetrate
-
-/*
- * Spawnflags for func_pushable (it's also func_breakable, so don't collide with those flags)
- * Taken from hl2sdk-ob-valve\game\server\func_break.h
- */
-#define SF_PUSH_BREAKABLE 0x0080
-#define SF_PUSH_NO_USE 0x0100 // player cannot +use pickup this ent
-
-/**
- * Gets the Spawnflags of an entity.
- *
- * @param entity Entity index.
- * @return Spawnflags value
- */
-stock Entity_GetSpawnFlags(entity)
-{
- return GetEntProp(entity, Prop_Data, "m_spawnflags");
-}
-
-/**
- * Sets the Spawnflags of an entity.
- *
- * @param entity Entity index.
- * @param flags Flags value
- * @noreturn
- */
-stock Entity_SetSpawnFlags(entity, flags)
-{
- SetEntProp(entity, Prop_Data, "m_spawnflags", flags);
-}
-
-/**
- * Adds Spawnflags to an entity.
- *
- * @param entity Entity index.
- * @param flags Flags value
- * @noreturn
- */
-stock Entity_AddSpawnFlags(entity, flags)
-{
- new spawnFlags = Entity_GetSpawnFlags(entity);
- spawnFlags |= flags;
- Entity_SetSpawnFlags(entity, spawnFlags);
-}
-
-/**
- * Removes Spawnflags from an entity.
- *
- * @param entity Entity index.
- * @param flags Flags value
- * @noreturn
- */
-stock Entity_RemoveSpawnFlags(entity, flags)
-{
- new spawnFlags = Entity_GetSpawnFlags(entity);
- spawnFlags &= ~flags;
- Entity_SetSpawnFlags(entity, spawnFlags);
-}
-
-/**
- * Clears all Spawnflags of an entity.
- *
- * @param entity Entity index.
- * @noreturn
- */
-stock Entity_ClearSpawnFlags(entity)
-{
- Entity_SetSpawnFlags(entity, 0);
-}
-
-/**
- * Returns whether the entity has specific Spawnflags.
- *
- * @param entity Entity index.
- * @param flags Flags value.
- * @return True if the entity has the spawnflags set, false otherwise.
- */
-stock bool:Entity_HasSpawnFlags(entity, flags)
-{
- return bool:(Entity_GetSpawnFlags(entity) & flags);
-}
-
-/*
- * Entity flags, CBaseEntity::m_iEFlags
- * Taken from: hl2sdk-ob-valve\game\shared\shareddefs.h
- */
-enum Entity_Flags
-{
- EFL_KILLME = (1<<0), // This entity is marked for death -- This allows the game to actually delete ents at a safe time
- EFL_DORMANT = (1<<1), // Entity is dormant, no updates to client
- EFL_NOCLIP_ACTIVE = (1<<2), // Lets us know when the noclip command is active.
- EFL_SETTING_UP_BONES = (1<<3), // Set while a model is setting up its bones.
- EFL_KEEP_ON_RECREATE_ENTITIES = (1<<4), // This is a special entity that should not be deleted when we restart entities only
-
- EFL_HAS_PLAYER_CHILD= (1<<4), // One of the child entities is a player.
-
- EFL_DIRTY_SHADOWUPDATE = (1<<5), // Client only- need shadow manager to update the shadow...
- EFL_NOTIFY = (1<<6), // Another entity is watching events on this entity (used by teleport)
-
- // The default behavior in ShouldTransmit is to not send an entity if it doesn't
- // have a model. Certain entities want to be sent anyway because all the drawing logic
- // is in the client DLL. They can set this flag and the engine will transmit them even
- // if they don't have a model.
- EFL_FORCE_CHECK_TRANSMIT = (1<<7),
-
- EFL_BOT_FROZEN = (1<<8), // This is set on bots that are frozen.
- EFL_SERVER_ONLY = (1<<9), // Non-networked entity.
- EFL_NO_AUTO_EDICT_ATTACH = (1<<10), // Don't attach the edict; we're doing it explicitly
-
- // Some dirty bits with respect to abs computations
- EFL_DIRTY_ABSTRANSFORM = (1<<11),
- EFL_DIRTY_ABSVELOCITY = (1<<12),
- EFL_DIRTY_ABSANGVELOCITY = (1<<13),
- EFL_DIRTY_SURR_COLLISION_BOUNDS = (1<<14),
- EFL_DIRTY_SPATIAL_PARTITION = (1<<15),
-// UNUSED = (1<<16),
-
- EFL_IN_SKYBOX = (1<<17), // This is set if the entity detects that it's in the skybox.
- // This forces it to pass the "in PVS" for transmission.
- EFL_USE_PARTITION_WHEN_NOT_SOL = (1<<18), // Entities with this flag set show up in the partition even when not solid
- EFL_TOUCHING_FLUID = (1<<19), // Used to determine if an entity is floating
-
- // FIXME: Not really sure where I should add this...
- EFL_IS_BEING_LIFTED_BY_BARNACLE = (1<<20),
- EFL_NO_ROTORWASH_PUSH = (1<<21), // I shouldn't be pushed by the rotorwash
- EFL_NO_THINK_FUNCTION = (1<<22),
- EFL_NO_GAME_PHYSICS_SIMULATION = (1<<23),
-
- EFL_CHECK_UNTOUCH = (1<<24),
- EFL_DONTBLOCKLOS = (1<<25), // I shouldn't block NPC line-of-sight
- EFL_DONTWALKON = (1<<26), // NPC;s should not walk on this entity
- EFL_NO_DISSOLVE = (1<<27), // These guys shouldn't dissolve
- EFL_NO_MEGAPHYSCANNON_RAGDOLL = (1<<28), // Mega physcannon can't ragdoll these guys.
- EFL_NO_WATER_VELOCITY_CHANGE = (1<<29), // Don't adjust this entity's velocity when transitioning into water
- EFL_NO_PHYSCANNON_INTERACTION = (1<<30), // Physcannon can't pick these up or punt them
- EFL_NO_DAMAGE_FORCES = (1<<31), // Doesn't accept forces from physics damage
-};
-
-/**
- * Gets the Entity flags (m_iEFlags) of an entity.
- *
- * @param entity Entity index.
- * @return Entity flags value
- */
-stock Entity_Flags:Entity_GetEFlags(entity)
-{
- return Entity_Flags:GetEntProp(entity, Prop_Data, "m_iEFlags");
-}
-
-/**
- * Sets the entity's Entity flags (m_iEFlags).
- *
- * @param entity Entity index.
- * @param flags Flags value
- * @noreturn
- */
-stock Entity_SetEFlags(entity, Entity_Flags:flags)
-{
- SetEntProp(entity, Prop_Data, "m_iEFlags", flags);
-}
-
-/**
- * Adds Entity flags (m_iEFlags) to an entity.
- *
- * @param entity Entity index.
- * @param flags Flags value
- * @noreturn
- */
-stock Entity_AddEFlags(entity, Entity_Flags:flags)
-{
- new Entity_Flags:setFlags = Entity_GetEFlags(entity);
- setFlags |= flags;
- Entity_SetEFlags(entity, setFlags);
-}
-
-/**
- * Removes Entity flags (m_iEFlags) from an entity.
- *
- * @param entity Entity index.
- * @param flags Flags value
- * @noreturn
- */
-stock Entity_RemoveEFlags(entity, Entity_Flags:flags)
-{
- new Entity_Flags:setFlags = Entity_GetEFlags(entity);
- setFlags &= ~flags;
- Entity_SetEFlags(entity, setFlags);
-}
-
-/**
- * Checks if the entity has specific Entity flags (m_iEFlags) set.
- *
- * @param entity Entity index.
- * @param flags Flags value
- * @return True if the flags are set, false otherwise.
- */
-stock bool:Entity_HasEFlags(entity, Entity_Flags:flags)
-{
- new Entity_Flags:currentEFlags = Entity_GetEFlags(entity);
-
- return bool:(currentEFlags & flags);
-}
-
-/**
- * Marks the surrounding bounds of an entity as outdated.
- * You normally call this when a collision setting has changed.
- *
- * @param entity Entity index.
- * @noreturn
- */
-stock Entity_MarkSurrBoundsDirty(entity)
-{
- Entity_AddEFlags(entity, EFL_DIRTY_SURR_COLLISION_BOUNDS);
-}
-
-/*
- * CBaseEntity::m_fFlags Functions
- * Use the FL_ Defines (FL_ONGROUND, ...) or
- * special entity specific flags.
- * Note: The flag FL_AIMTARGET probably doesn't work as
- * we have current no way of adding/removing it to the AimTarget List.
- */
-
-/**
- * Gets the Flags of an entity.
- *
- * @param entity Entity Index.
- * @return Entity Flags.
- */
-stock Entity_GetFlags(entity)
-{
- return GetEntProp(entity, Prop_Data, "m_fFlags");
-}
-
-/**
- * Sets the Flags of an entity.
- *
- * @param entity Entity index.
- * @param flags New Flags value
- * @noreturn
- */
-stock Entity_SetFlags(entity, flags)
-{
- SetEntProp(entity, Prop_Data, "m_fFlags", flags);
-}
-
-/**
- * Adds Flags to the entity
- *
- * @param entity Entity index.
- * @param flags Flags to add
- * @noreturn
- */
-stock Entity_AddFlags(entity, flags)
-{
- new setFlags = Entity_GetFlags(entity);
- setFlags |= flags;
- Entity_SetFlags(entity, flags);
-}
-
-/**
- * Removes flags from the entity
- *
- * @param entity Entity index.
- * @param flags Flags to remove
- * @noreturn
- */
-stock Entity_RemoveFlags(entity, flags)
-{
- new setFlags = Entity_GetFlags(entity);
- setFlags &= ~flags;
- Entity_SetFlags(entity, setFlags);
-}
-
-/**
- * Toggles the specified flag on the entity.
- * Adds the flag to the entity if it doesn't exists
- * or removes it otherwise.
- *
- * @param entity Entity index.
- * @param flags Flag to Toggle
- * @noreturn
- */
-stock Entity_ToggleFlag(entity, flag)
-{
- new setFlag = Entity_GetFlags(entity);
- setFlag ^= flag;
- Entity_SetFlags(entity, setFlag);
-}
-
-/**
- * Removes all flags from the entity
- *
- * @param entity Entity index.
- * @noreturn
- */
-stock Entity_ClearFlags(entity)
-{
- Entity_SetFlags(entity, 0);
-}
-
-/* edict->solid values
- * NOTE: Some movetypes will cause collisions independent of SOLID_NOT/SOLID_TRIGGER when the entity moves
- * SOLID only effects OTHER entities colliding with this one when they move - UGH!
- *
- * Solid type basically describes how the bounding volume of the object is represented
- * NOTE: These numerical values are used in the FGD by the prop code (see prop_dynamic)
- * Taken from: hl2sdk-ob-valve\public\const.h
- */
-
-enum SolidFlags_t
-{
- FSOLID_CUSTOMRAYTEST = 0x0001, // Ignore solid type + always call into the entity for ray tests
- FSOLID_CUSTOMBOXTEST = 0x0002, // Ignore solid type + always call into the entity for swept box tests
- FSOLID_NOT_SOLID = 0x0004, // Are we currently not solid?
- FSOLID_TRIGGER = 0x0008, // This is something may be collideable but fires touch functions
- // even when it's not collideable (when the FSOLID_NOT_SOLID flag is set)
- FSOLID_NOT_STANDABLE = 0x0010, // You can't stand on this
- FSOLID_VOLUME_CONTENTS = 0x0020, // Contains volumetric contents (like water)
- FSOLID_FORCE_WORLD_ALIGNED = 0x0040, // Forces the collision rep to be world-aligned even if it's SOLID_BSP or SOLID_VPHYSICS
- FSOLID_USE_TRIGGER_BOUNDS = 0x0080, // Uses a special trigger bounds separate from the normal OBB
- FSOLID_ROOT_PARENT_ALIGNED = 0x0100, // Collisions are defined in root parent's local coordinate space
- FSOLID_TRIGGER_TOUCH_DEBRIS = 0x0200, // This trigger will touch debris objects
-
- FSOLID_MAX_BITS = 10
-};
-
-/**
- * Gets the solid flags of the entity
- *
- * @param entity Entity index.
- * @return Solid Flags.
- */
-stock SolidFlags_t:Entity_GetSolidFlags(entity)
-{
- return SolidFlags_t:GetEntProp(entity, Prop_Data, "m_usSolidFlags", 2);
-}
-
-/**
- * Sets the solid flags of the entity
- *
- * @param entity Entity index.
- * @param flags Solid Flags.
- * @noreturn
- */
-stock Entity_SetSolidFlags(entity, SolidFlags_t:flags)
-{
- new SolidFlags_t:oldFlags = Entity_GetSolidFlags(entity);
- flags = flags & SolidFlags_t:0xFFFF;
-
- if (oldFlags == flags) {
- return;
- }
-
- SetEntProp(entity, Prop_Data, "m_usSolidFlags", flags, 2);
-
- // These two flags, if changed, can produce different surrounding bounds
- if ((oldFlags & (FSOLID_FORCE_WORLD_ALIGNED | FSOLID_USE_TRIGGER_BOUNDS)) !=
- (flags & (FSOLID_FORCE_WORLD_ALIGNED | FSOLID_USE_TRIGGER_BOUNDS)))
- {
- Entity_MarkSurrBoundsDirty(entity);
- }
-}
-
-/**
- * Adds solid flags to the entity
- *
- * @param entity Entity index.
- * @param flags Solid Flags.
- * @noreturn
- */
-stock Entity_AddSolidFlags(entity, SolidFlags_t:flags)
-{
- new SolidFlags_t:newFlags = Entity_GetSolidFlags(entity);
- newFlags |= flags;
- Entity_SetSolidFlags(entity, newFlags);
-}
-
-/**
- * Removes solid flags from the entity.
- *
- * @param entity Entity index.
- * @param flags Solid Flags.
- * @noreturn
- */
-stock Entity_RemoveSolidFlags(entity, SolidFlags_t:flags)
-{
- new SolidFlags_t:newFlags = Entity_GetSolidFlags(entity);
- newFlags &= ~flags;
- Entity_SetSolidFlags(entity, newFlags);
-}
-
-/**
- * Removes all solid flags from the entity.
- *
- * @param entity Entity index.
- * @noreturn
- */
-stock Entity_ClearSolidFlags(entity)
-{
- Entity_SetSolidFlags(entity, SolidFlags_t:0);
-}
-
-/**
- * Checks whether certain solid flags are set on the entity.
- *
- * @param entity Entity index.
- * @param flags Solid Flags.
- * @return True if the specified flags are set, false otherwise.
- */
-stock bool:Entity_SolidFlagsSet(entity, SolidFlags_t:flagMask)
-{
- return bool:(Entity_GetSolidFlags(entity) & flagMask);
-}
-
-enum SolidType_t
-{
- SOLID_NONE = 0, // no solid model
- SOLID_BSP = 1, // a BSP tree
- SOLID_BBOX = 2, // an AABB
- SOLID_OBB = 3, // an OBB (not implemented yet)
- SOLID_OBB_YAW = 4, // an OBB, constrained so that it can only yaw
- SOLID_CUSTOM = 5, // Always call into the entity for tests
- SOLID_VPHYSICS = 6, // solid vphysics object, get vcollide from the model and collide with that
- SOLID_LAST,
-};
-
-/**
- * Gets the solidity type of the entity
- *
- * @param entity Entity index.
- * @return Solid Type
- */
-stock SolidType_t:Entity_GetSolidType(entity)
-{
- return SolidType_t:GetEntProp(entity, Prop_Data, "m_nSolidType", 1);
-}
-
-/**
- * Sets the solidity type of the entity
- *
- * @param entity Entity index.
- * @param Solid Type value.
- * @noreturn
- */
-stock Entity_SetSolidType(entity, SolidType_t:value)
-{
- SetEntProp(entity, Prop_Send, "m_nSolidType", value, 1);
- Entity_MarkSurrBoundsDirty(entity);
-}
-
-/**
- * Checks whether the entity is solid or not.
- *
- * @param entity Entity index.
- * @return True if the entity is solid, false otherwise.
- */
-stock bool:Entity_IsSolid(entity)
-{
- return (Entity_GetSolidType(entity) != SOLID_NONE &&
- !Entity_SolidFlagsSet(entity, FSOLID_NOT_SOLID));
-}
-
-/**
- * Retrieves the model path of a given entity.
- * Returns "*num" for Brush entities.
- *
- * @param entity entity reference or index
- * @param model buffer String for the model
- * @param size max size of buffer string
- * @return Number of non-null bytes written.
- */
-stock Entity_GetModel(entity, String:buffer[], size)
-{
- return GetEntPropString(entity, Prop_Data, "m_ModelName", buffer, size);
-}
-
-/**
- * Sets the model to a given entity.
- * Be sure it has been precached.
- * This is an alias for SetEntityModel()
- *
- * @param entity Entity index
- * @param model Model name
- * @noreturn
- */
-stock Entity_SetModel(entity, const String:model[])
-{
- SetEntityModel(entity, model);
-}
-
-/**
- * Gets the entity's model index, if it has one set.
- *
- * @param entity Entity index.
- * @return The Entity's model index
- */
-stock Entity_GetModelIndex(entity)
-{
- return GetEntProp(entity, Prop_Data, "m_nModelIndex", 2);
-}
-
-/**
- * Sets the entity's model index (must be precached)
- *
- * @param entity Entity index.
- * @param index Model Index.
- * @noreturn
- */
-stock Entity_SetModelIndex(entity, index)
-{
- SetEntProp(entity, Prop_Data, "m_nModelIndex", index, 2);
-}
-
-/**
-* Sets the entity's maxspeed to the given value (in units per second)
-*
-* @param entity Entity index
-* @param maxspeed the maximum speed the entity can move
-* @noreturn
-*/
-stock Entity_SetMaxSpeed(entity, Float:value)
-{
- SetEntPropFloat(entity, Prop_Data, "m_flMaxspeed", value);
-}
-
-/*
- * Collision groups
- * Taken from hl2sdk-ob-valve/public/const.h
- */
-enum Collision_Group_t
-{
- COLLISION_GROUP_NONE = 0,
- COLLISION_GROUP_DEBRIS, // Collides with nothing but world and static stuff
- COLLISION_GROUP_DEBRIS_TRIGGER, // Same as debris, but hits triggers
- COLLISION_GROUP_INTERACTIVE_DEB, // Collides with everything except other interactive debris or debris
- COLLISION_GROUP_INTERACTIVE, // Collides with everything except interactive debris or debris
- COLLISION_GROUP_PLAYER,
- COLLISION_GROUP_BREAKABLE_GLASS,
- COLLISION_GROUP_VEHICLE,
- COLLISION_GROUP_PLAYER_MOVEMENT, // For HL2, same as Collision_Group_Player, for
- // TF2, this filters out other players and CBaseObjects
- COLLISION_GROUP_NPC, // Generic NPC group
- COLLISION_GROUP_IN_VEHICLE, // for any entity inside a vehicle
- COLLISION_GROUP_WEAPON, // for any weapons that need collision detection
- COLLISION_GROUP_VEHICLE_CLIP, // vehicle clip brush to restrict vehicle movement
- COLLISION_GROUP_PROJECTILE, // Projectiles!
- COLLISION_GROUP_DOOR_BLOCKER, // Blocks entities not permitted to get near moving doors
- COLLISION_GROUP_PASSABLE_DOOR, // Doors that the player shouldn't collide with
- COLLISION_GROUP_DISSOLVING, // Things that are dissolving are in this group
- COLLISION_GROUP_PUSHAWAY, // Nonsolid on client and server, pushaway in player code
-
- COLLISION_GROUP_NPC_ACTOR, // Used so NPCs in scripts ignore the player.
- COLLISION_GROUP_NPC_SCRIPTED // USed for NPCs in scripts that should not collide with each other
-};
-
-/**
- * Gets the collision group of an entity.
- *
- * @param entity entity index
- * @return Entity collision group.
- */
-stock Collision_Group_t:Entity_GetCollisionGroup(entity)
-{
- return Collision_Group_t:GetEntProp(entity, Prop_Data, "m_CollisionGroup");
-}
-
-/**
- * Sets the collision group of an entity.
- *
- * @param entity entity index
- * @param value the new collision group.
- * @noreturn
- */
-stock Entity_SetCollisionGroup(entity, Collision_Group_t:value)
-{
- SetEntProp(entity, Prop_Data, "m_CollisionGroup", value);
-}
-
-/**
- * Functions for getting / setting the origin (position) of an entity.
- * Go to http://developer.valvesoftware.com/wiki/Origin
- * if you want to learn more about origins
- */
-
-/**
- * Gets the Absolute Origin (position) of an entity.
- *
- * @param entity Entity index.
- * @param vec 3 dimensional vector array.
- * @noreturn
- */
-stock Entity_GetAbsOrigin(entity, Float:vec[3])
-{
- GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vec);
-}
-
-/**
- * Sets the Absolute Origin (position) of an entity.
- *
- * @param entity Entity index.
- * @param vec 3 dimensional vector array.
- * @noreturn
- */
-stock Entity_SetAbsOrigin(entity, const Float:vec[3])
-{
- // We use TeleportEntity to set the origin more safely
- // Todo: Replace this with a call to UTIL_SetOrigin() or CBaseEntity::SetLocalOrigin()
- TeleportEntity(entity, vec, NULL_VECTOR, NULL_VECTOR);
-}
-
-/**
- * Functions for getting / setting the angles (rotation) of an entity.
- * http://developer.valvesoftware.com/wiki/Angles
- * if you want to learn more about angles
- */
-
-/**
- * Gets the Angles of an entity
- *
- * @param entity Entity index.
- * @param vec 3 dimensional vector array.
- * @noreturn
- */
-stock Entity_GetAbsAngles(entity, Float:vec[3])
-{
- GetEntPropVector(entity, Prop_Data, "m_angAbsRotation", vec);
-}
-
-/**
- * Sets the Angles of an entity
- *
- * @param entity Entity index.
- * @param vec 3 dimensional vector array.
- * @noreturn
- */
-stock Entity_SetAbsAngles(entity, const Float:vec[3])
-{
- // We use TeleportEntity to set the angles more safely
- // Todo: Replace this with a call to CBaseEntity::SetLocalAngles()
- TeleportEntity(entity, NULL_VECTOR, vec, NULL_VECTOR);
-}
-
-/**
- * Functions for getting / setting the velocity of an entity.
- * Go to http://developer.valvesoftware.com/wiki/Velocity
- * if you want to learn more about the different kind of velocities.
- */
-
-/**
- * Gets the Local velocity of an entity.
- * The local velocity is the velocity generated by the entity.
- *
- * @param entity Entity index.
- * @param vel An 3 dim array
- * @noreturn
- */
-stock Entity_GetLocalVelocity(entity, Float:vec[3])
-{
- GetEntPropVector(entity, Prop_Data, "m_vecVelocity", vec);
-}
-
-/**
- * Sets the Local velocity of an entity.
- * The local velocity is the velocity generated by the entity.
- * Only use this if you know what you are doing,
- * the entity can overwrite this value on next frame.
- *
- * @param entity Entity index.
- * @param vel An 3 dim array
- * @noreturn
- */
-stock Entity_SetLocalVelocity(entity, const Float:vec[3])
-{
- SetEntPropVector(entity, Prop_Data, "m_vecVelocity", vec);
-}
-
-/**
- * Gets the Base velocity of an entity.
- * The base velocity is the velocity applied
- * to the entity from other sources .
- *
- * @param entity Entity index.
- * @param vel An 3 dim array
- * @noreturn
- */
-stock Entity_GetBaseVelocity(entity, Float:vec[3])
-{
- GetEntPropVector(entity, Prop_Data, "m_vecBaseVelocity", vec);
-}
-
-/**
- * Sets the Base velocity of an entity.
- * The base velocity is the velocity applied
- * to the entity from other sources .
- *
- * @param entity Entity index.
- * @param vel An 3 dim array
- * @noreturn
- */
-stock Entity_SetBaseVelocity(entity, const Float:vec[3])
-{
- SetEntPropVector(entity, Prop_Data, "m_vecBaseVelocity", vec);
-}
-
-/**
- * Gets the Absolute velocity of an entity.
- * The absolute velocity is the sum of the local
- * and base velocities. It's the actual value used to move.
- *
- * @param entity Entity index.
- * @param vel An 3 dim array
- * @noreturn
- */
-stock Entity_GetAbsVelocity(entity, Float:vec[3])
-{
- GetEntPropVector(entity, Prop_Data, "m_vecAbsVelocity", vec);
-}
-
-/**
- * Sets the Absolute velocity of an entity.
- * The absolute velocity is the sum of the local
- * and base velocities. It's the actual value used to move.
- *
- * @param entity Entity index.
- * @param vel An 3 dim array
- * @noreturn
- */
-stock Entity_SetAbsVelocity(entity, const Float:vec[3])
-{
- // We use TeleportEntity to set the velocity more safely
- // Todo: Replace this with a call to CBaseEntity::SetAbsVelocity()
- TeleportEntity(entity, NULL_VECTOR, NULL_VECTOR, vec);
-}
-
-/**
- * Returns true if the entity is locked.
- *
- * @param entity Entity index.
- * @return True if locked otherwise false.
- */
-stock bool:Entity_IsLocked(entity)
-{
- return bool:GetEntProp(entity, Prop_Data, "m_bLocked", 1);
-}
-
-/**
- * Locks an entity.
- *
- * @param entity Entity index.
- * @noreturn
- */
-stock Entity_Lock(entity)
-{
- SetEntProp(entity, Prop_Data, "m_bLocked", 1, 1);
-}
-/**
- * Unlocks an entity.
- *
- * @param entity Entity index.
- * @noreturn
- */
-stock Entity_UnLock(entity)
-{
- SetEntProp(entity, Prop_Data, "m_bLocked", 0, 1);
-}
-
-/**
- * Gets the health of an entity.
- *
- * @param entity entity index.
- * @return current health points
- */
-stock Entity_GetHealth(entity)
-{
- return GetEntProp(entity, Prop_Data, "m_iHealth");
-}
-
-/**
- * Sets the health of an entity.
- *
- * @param entity entity index.
- * @param value health to set (anything above 511 will overload)
- * @noreturn
- */
-stock Entity_SetHealth(entity, value, ignoreMax=false, kill=true)
-{
- new health = value;
-
- if (!ignoreMax) {
- new maxHealth = Entity_GetMaxHealth(entity);
-
- if (health > maxHealth) {
- health = maxHealth;
- }
- }
-
- if (health < 0) {
- health = 0;
- }
-
- SetEntProp(entity, Prop_Data, "m_iHealth", health);
-
- if (health <= 0) {
- Entity_Kill(entity);
- }
-
- return health;
-}
-
-/**
- * Add health to an entity
- *
- * @param entity entity index
- * @param value health to add
- * @return returns the new health value set
- */
-stock Entity_AddHealth(entity, value, ignoreMax=false, kill=true)
-{
- new health = Entity_GetHealth(entity);
-
- health += value;
-
- return Entity_SetHealth(entity, health, ignoreMax, kill);
-}
-
-/**
- * Takes health from an entity
- *
- * @param entity entity index
- * @param value health to add
- * @return returns the new health value set
- */
-stock Entity_TakeHealth(entity, value, ignoreMax=false, kill=true)
-{
- new health = Entity_GetHealth(entity);
-
- health -= value;
-
- return Entity_SetHealth(entity, health, ignoreMax, kill);
-}
-
-/**
- * Get the max health of an entity
- *
- * @param entity Entity Index
- * @return Max health points
- */
-stock Entity_GetMaxHealth(entity)
-{
- return GetEntProp(entity, Prop_Data, "m_iMaxHealth");
-}
-
-
-/**
- * Set the max health of an entity.
- *
- * @param entity Entity index
- * @param value Max health to set (anything above 511 will overload)
- * @noreturn
- */
-stock Entity_SetMaxHealth(entity, value)
-{
- SetEntProp(entity, Prop_Data, "m_iMaxHealth", value);
- return value;
-}
-
-/**
- * Returns the Float distance between an entity
- * and a vector origin.
- *
- * @param entity Entity Index.
- * @param target Vector Origin.
- * @return Distance Float value.
- */
-stock Float:Entity_GetDistanceOrigin(entity, const Float:vec[3])
-{
- new Float:entityVec[3];
- Entity_GetAbsOrigin(entity, entityVec);
-
- return GetVectorDistance(entityVec, vec);
-}
-
-/**
- * Returns the Float distance between two entities.
- * Both entities must be valid.
- *
- * @param entity Entity Index.
- * @param target Target Entity Index.
- * @return Distance Float value.
- */
-stock Float:Entity_GetDistance(entity, target)
-{
- new Float:targetVec[3];
- Entity_GetAbsOrigin(target, targetVec);
-
- return Entity_GetDistanceOrigin(entity, targetVec);
-}
-
-/**
- * Checks if the given 2 entitys are within a given range.
- *
- * @param entity Entity Index.
- * @param target Target Entity Index.
- * @param distance Max Float distance.
- * @return True if the given entities are closer than the given distance value, false otherwise.
- */
-stock bool:Entity_InRange(entity, target, Float:distance)
-{
- if (Entity_GetDistance(entity, target) > distance) {
- return false;
- }
-
- return true;
-}
-
-/**
- * Enables the motion of an entity.
- *
- * @param entity Entity index.
- * @return True on success, false otherwise
- */
-stock bool:Entity_EnableMotion(entity)
-{
- return AcceptEntityInput(entity, "enablemotion");
-}
-
-/**
- * Disables the motion of an entity.
- *
- * @param entity Entity index.
- * @return True on success, false otherwise
- */
-stock bool:Entity_DisableMotion(entity)
-{
- return AcceptEntityInput(entity, "disablemotion");
-}
-
-/**
- * Freezes an entity by setting the FL_FROZEN flag.
- *
- * @param entity Entity index.
- * @return True on success, false otherwise
- */
-stock Entity_Freeze(entity)
-{
- Entity_AddFlags(entity, FL_FROZEN);
-}
-
-/**
- * Unfreezes an entity by removing the FL_FROZEN flag.
- *
- * @param entity Entity index.
- * @return True on success, false otherwise
- */
-stock Entity_UnFreeze(entity)
-{
- Entity_RemoveFlags(entity, FL_FROZEN);
-}
-
-
-/**
- * This function points an entity to another with the targetname
- * and name. Useful for allot of entities like trigger_teleport.
- * If the name is not specified it will be generated automatically.
- *
- * @param entity Entity index.
- * @param target Target entity index.
- * @param Optional: target name
- * @noreturn
- */
-stock Entity_PointAtTarget(entity, target, const String:name[]="")
-{
- decl String:targetName[128];
- Entity_GetTargetName(entity, targetName, sizeof(targetName));
-
- if (name[0] == '\0') {
-
- if (targetName[0] == '\0') {
- // Let's generate our own name
- Format(
- targetName,
- sizeof(targetName),
- "_smlib_Entity_PointAtTarget:%d",
- target
- );
- }
- }
- else {
- strcopy(targetName, sizeof(targetName), name);
- }
-
- Entity_SetTargetName(entity, targetName);
- Entity_SetName(target, targetName);
-}
-
-/**
- * This function points a point_hurt entity to another damage target entity..
- * and name. Useful for allot of entities like trigger_teleport.
- * If the name is not specified it will be generated automatically.
- *
- * @param entity Entity index.
- * @param target Target entity index.
- * @param Optional: target name
- * @noreturn
- */
-stock Entity_PointHurtAtTarget(entity, target, const String:name[]="")
-{
- decl String:targetName[128];
- Entity_GetTargetName(entity, targetName, sizeof(targetName));
-
- if (name[0] == '\0') {
-
- if (targetName[0] == '\0') {
- // Let's generate our own name
- Format(
- targetName,
- sizeof(targetName),
- "_smlib_Entity_PointHurtAtTarget:%d",
- target
- );
- }
- }
- else {
- strcopy(targetName, sizeof(targetName), name);
- }
-
- DispatchKeyValue(entity, "DamageTarget", targetName);
- Entity_SetName(target, targetName);
-}
-
-/**
- * Checks if an entity is a player or not.
- * No checks are done if the entity is actually valid,
- * the player is connected or ingame.
- *
- * @param entity Entity index.
- * @return True if the entity is a player, false otherwise.
- */
-stock bool:Entity_IsPlayer(entity)
-{
- if (entity < 1 || entity > MaxClients) {
- return false;
- }
-
- return true;
-}
-
-/**
- * Creates an entity by classname.
- *
- * @param className Classname String.
- * @param ForceEdictIndex Edict Index to use.
- * @return Entity Index or INVALID_ENT_REFERENCE if the slot is already in use.
- */
-stock Entity_Create(const String:className[], ForceEdictIndex=-1)
-{
- if (ForceEdictIndex != -1 && Entity_IsValid(ForceEdictIndex)) {
- return INVALID_ENT_REFERENCE;
- }
-
- return CreateEntityByName(className, ForceEdictIndex);
-}
-
-/**
- * Kills an entity on the next frame (delayed).
- * It is safe to use with entity loops.
- * If the entity is is player ForcePlayerSuicide() is called.
- *
- * @param kenny Entity index.
- * @param killChildren When true, kennys children are killed too.
- * @return True on success, false otherwise.
- */
-stock bool:Entity_Kill(kenny, killChildren=false)
-{
- if (Entity_IsPlayer(kenny)) {
- // Oh My God! They Killed Kenny!!
- ForcePlayerSuicide(kenny);
- return true;
- }
-
- if(killChildren){
- return AcceptEntityInput(kenny, "KillHierarchy");
- }
- else {
- return AcceptEntityInput(kenny, "Kill");
- }
-}
-
-/**
- * Kills all entities with the given networked classname.
- * It is safe to use with entity loops.
- * If the entity is is player ForcePlayerSuicide() is called.
- *
- * @param className Entity Network Class to search for.
- * @return Number of entities killed.
- */
-stock Entity_KillAllByClassName(const String:className[])
-{
- new x = 0;
-
- new entity = INVALID_ENT_REFERENCE;
- while ((entity = FindEntityByClassname(entity, className)) != INVALID_ENT_REFERENCE) {
- AcceptEntityInput(entity, "kill");
- x++;
- }
-
- return x;
-}
-
-/**
- * Gets the owner of an entity.
- * For example the owner of a weapon entity.
- *
- * @param entity Entity index.
- * @return Ground Entity or -1
- */
-stock Entity_GetOwner(entity)
-{
- return GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
-}
-
-/**
- * Sets the owner of an entity.
- * For example the owner of a weapon entity.
- *
- * @param entity Entity index.
- * @noreturn
- */
-stock Entity_SetOwner(entity, newOwner)
-{
- SetEntPropEnt(entity, Prop_Send, "m_hOwnerEntity", newOwner);
-}
-
-/**
- * Get's the ground entity this entity stands on.
- *
- * @param entity Entity index.
- * @return Ground Entity or -1
- */
-stock Entity_GetGroundEntity(entity)
-{
- return GetEntPropEnt(entity, Prop_Data, "m_hGroundEntity");
-}
-
-/*
- * Damage definitions
- */
-
-#if !defined DMG_GENERIC
-
-#define DMG_GENERIC 0 // generic damage was done
-#define DMG_CRUSH (1 << 0) // crushed by falling or moving object.
- // NOTE: It's assumed crush damage is occurring as a result of physics collision, so no extra physics force is generated by crush damage.
- // DON'T use DMG_CRUSH when damaging entities unless it's the result of a physics collision. You probably want DMG_CLUB instead.
-#define DMG_BULLET (1 << 1) // shot
-#define DMG_SLASH (1 << 2) // cut, clawed, stabbed
-#define DMG_BURN (1 << 3) // heat burned
-#define DMG_VEHICLE (1 << 4) // hit by a vehicle
-#define DMG_FALL (1 << 5) // fell too far
-#define DMG_BLAST (1 << 6) // explosive blast damage
-#define DMG_CLUB (1 << 7) // crowbar, punch, headbutt
-#define DMG_SHOCK (1 << 8) // electric shock
-#define DMG_SONIC (1 << 9) // sound pulse shockwave
-#define DMG_ENERGYBEAM (1 << 10) // laser or other high energy beam
-#define DMG_PREVENT_PHYSICS_FORCE (1 << 11) // Prevent a physics force
-#define DMG_NEVERGIB (1 << 12) // with this bit OR'd in, no damage type will be able to gib victims upon death
-#define DMG_ALWAYSGIB (1 << 13) // with this bit OR'd in, any damage type can be made to gib victims upon death.
-#define DMG_DROWN (1 << 14) // Drowning
-
-
-#define DMG_PARALYZE (1 << 15) // slows affected creature down
-#define DMG_NERVEGAS (1 << 16) // nerve toxins, very bad
-#define DMG_POISON (1 << 17) // blood poisoning - heals over time like drowning damage
-#define DMG_RADIATION (1 << 18) // radiation exposure
-#define DMG_DROWNRECOVER (1 << 19) // drowning recovery
-#define DMG_ACID (1 << 20) // toxic chemicals or acid burns
-#define DMG_SLOWBURN (1 << 21) // in an oven
-
-#define DMG_REMOVENORAGDOLL (1<<22) // with this bit OR'd in, no ragdoll will be created, and the target will be quietly removed.
- // use this to kill an entity that you've already got a server-side ragdoll for
-
-#define DMG_PHYSGUN (1<<23) // Hit by manipulator. Usually doesn't do any damage.
-#define DMG_PLASMA (1<<24) // Shot by Cremator
-#define DMG_AIRBOAT (1<<25) // Hit by the airboat's gun
-
-#define DMG_DISSOLVE (1<<26) // Dissolving!
-#define DMG_BLAST_SURFACE (1<<27) // A blast on the surface of water that cannot harm things underwater
-#define DMG_DIRECT (1<<28)
-#define DMG_BUCKSHOT (1<<29) // not quite a bullet. Little, rounder, different.
-
-#endif
-
-/**
- * Does damage to an entity.
- * This is a powerful function that allows you to specify
- * who the attacker is, the damage type and also what weapon
- * should be displayed in the hud kill message.
- * Note that for entities that fire another entity (RPG's, Crossbow's,
- * you have to pass the bullet's class, not the weapon's class !
- * It hasn't been tested how expensive this function is, as it
- * uses the entity point_hurt.
- * If you need a cheaper function use Entity_RemoveHealth().
- *
- * @param entity Entity index.
- * @param damage Amount of damage.
- * @param attacker Entity Index of the attacker.
- * @param damageType Use the DMG_ definations.
- * @param fakeClassName Classname to fake, you can set this if you
- * want a specific weapon to be shown in the HUD kill message.
- * @return True on success, false otherwise.
- */
-stock bool:Entity_Hurt(entity, damage, attacker=0, damageType=DMG_GENERIC, const String:fakeClassName[]="")
-{
- static point_hurt = INVALID_ENT_REFERENCE;
-
- if (point_hurt == INVALID_ENT_REFERENCE || !IsValidEntity(point_hurt)) {
- point_hurt = EntIndexToEntRef(Entity_Create("point_hurt"));
-
- if (point_hurt == INVALID_ENT_REFERENCE) {
- return false;
- }
-
- DispatchSpawn(point_hurt);
- }
-
- AcceptEntityInput(point_hurt, "TurnOn");
- SetEntProp(point_hurt, Prop_Data, "m_nDamage", damage);
- SetEntProp(point_hurt, Prop_Data, "m_bitsDamageType", damageType);
- Entity_PointHurtAtTarget(point_hurt, entity);
-
- if (fakeClassName[0] != '\0') {
- Entity_SetClassName(point_hurt, fakeClassName);
- }
-
- AcceptEntityInput(point_hurt, "Hurt", attacker);
- AcceptEntityInput(point_hurt, "TurnOff");
-
- if (fakeClassName[0] != '\0') {
- Entity_SetClassName(point_hurt, "point_hurt");
- }
-
- return true;
-}
-
-/*
- * Gets the parent entity of an entity.
- *
- * @param entity Entity Index.
- * @return Entity Index of the parent.
- */
-stock Entity_GetParent(entity)
-{
- return GetEntPropEnt(entity, Prop_Data, "m_pParent");
-}
-
-/*
- * Clears the parent of an entity.
- *
- * @param entity Entity Index.
- * @noreturn
- */
-stock Entity_ClearParent(entity)
-{
- SetVariantString("");
- AcceptEntityInput(entity, "ClearParent");
-}
-
-/*
- * Sets the parent entity of an entity.
- *
- * @param entity Entity Index.
- * @param parentEntity Entity Index of the new parent.
- * @noreturn
- */
-stock Entity_SetParent(entity, parent)
-{
- SetVariantString("!activator");
- AcceptEntityInput(entity, "SetParent", parent);
-}
-
-
-/*
- * Callback for Change_OverTime.
- * Note that every parameter is a reference and can be changed during this callback.
- * You can get the elapsed time since start by multiply tick with currentCall.
- *
- * @param entity Entity Index.
- * @param interval The current interval from the current game time to execute the next call of this function.
- * @param currentCall The current call number (0 is the 1st call at 0.0 seconds, 1 the 2nd call at tick*1 seconds, ...).
- * @return When true this callback will be called again at the next defined tick, otherwise it won't.
- */
-functag Entity_ChangeOverTimeCallback bool:public(&entity, &Float:interval, &currentCall);
-
-/*
- * Creates a timer and provides a callback to change various things about an entity over time.
- *
- * @param entity Entity Index.
- * @param interval Interval from the current game time to execute the given function.
- * @noreturn
- */
-stock Entity_ChangeOverTime(entity, Float:interval=0.1, Entity_ChangeOverTimeCallback:valueCallback)
-{
- new Handle:dataPack = CreateDataPack();
- WritePackCell(dataPack, EntIndexToEntRef(entity));
- WritePackFloat(dataPack, interval);
- WritePackCell(dataPack, 0);
-#if SOURCEMOD_V_MAJOR >= 1 && SOURCEMOD_V_MINOR >= 7
- WritePackFunction(dataPack, valueCallback);
-#else
- WritePackCell(dataPack, _:valueCallback);
-#endif
- ResetPack(dataPack);
- __smlib_Timer_ChangeOverTime(INVALID_HANDLE,dataPack);
-}
-
-public Action:__smlib_Timer_ChangeOverTime(Handle:Timer, Handle:dataPack)
-{
- new entity = EntRefToEntIndex(ReadPackCell(dataPack));
- if(!Entity_IsValid(entity)){
- return Plugin_Stop;
- }
-
- new Float:interval = ReadPackFloat(dataPack);
- new currentCall = ReadPackCell(dataPack);
-#if SOURCEMOD_V_MAJOR >= 1 && SOURCEMOD_V_MINOR >= 7
- new Function:callback = ReadPackFunction(dataPack);
-#else
- new Function:callback = Function:ReadPackCell(dataPack);
-#endif
-
- new any:result;
- Call_StartFunction(INVALID_HANDLE, callback);
- Call_PushCellRef(entity);
- Call_PushFloatRef(interval);
- Call_PushCellRef(currentCall);
- Call_Finish(result);
-
- if(result == false){
- return Plugin_Stop;
- }
-
- ResetPack(dataPack,true);
- WritePackCell(dataPack, EntIndexToEntRef(entity));
- WritePackFloat(dataPack, interval);
- WritePackCell(dataPack, currentCall+1);
-#if SOURCEMOD_V_MAJOR >= 1 && SOURCEMOD_V_MINOR >= 7
- WritePackFunction(dataPack, callback);
-#else
- WritePackCell(dataPack, _:callback);
-#endif
- ResetPack(dataPack);
- CreateTimer(interval,__smlib_Timer_ChangeOverTime,dataPack);
- return Plugin_Stop;
-}
-
-
-/**
- * Gets the next child, entity is parent of.
- *
- * @param client Entity Index (of Parent)
- * @param start Start Index.
- * @return Entity Index or -1 if no entity was found.
- */
-stock Entity_GetNextChild(parent, start=0)
-{
- for (new entity=start; entity <= 2048; entity++) {
-
- if (!Entity_IsValid(entity)) {
- continue;
- }
-
- if (entity > 0 && entity <= MaxClients && !IsClientConnected(entity)) {
- continue;
- }
-
- if (Entity_GetParent(entity) == parent) {
- return entity;
- }
- }
-
- return INVALID_ENT_REFERENCE;
-}
-/**
- * Gets the move/open direction of an entity (only available for func_door*, prop_door* and func_movelinear).
- * Ex: if vec[2] is 1.0 a func_door moves straight up.
- *
- * @param entity Entity index.
- * @param vec Vector.
- * @noreturn
- */
-stock Entity_GetMoveDirection(entity, Float:vec[3])
-{
- GetEntPropVector(entity, Prop_Data, "m_vecMoveDir", vec);
-}
-/**
- * Sets the move/open direction of an entity (only available for func_door*, prop_door* and func_movelinear).
- * Ex: if vec[2] is 1.0 a func_door moves straight up.
- *
- * @param entity Entity index.
- * @param vec Vector.
- * @noreturn
- */
-stock Entity_SetMoveDirection(entity, const Float:vec[3])
-{
- SetEntPropVector(entity, Prop_Data, "m_vecMoveDir", vec);
-}
-
-/**
- * Returns if the entity will force close (won't be blockable by players and/or objects) or not when triggered to move.
- *
- * @param entity Entity index.
- * @return True if the door will force close, otherwise false.
- */
-stock bool:Entity_GetForceClose(entity)
-{
- return bool:GetEntProp(entity, Prop_Data, "m_bForceClosed");
-}
-
-/**
- * Sets if the door should force close (souldn't be blockable by players and/or objects) or not when triggered to move.
- *
- * @param entity Entity index.
- * @param forceClose If true the door will force close, otherwise it won't.
- * @noreturn
- */
-stock Entity_SetForceClose(entity, bool:forceClose)
-{
- SetEntProp(entity, Prop_Data, "m_bForceClosed", forceClose);
-}
-
-/**
- * Gets the speed of a moving entity (like doors: open close speed).
- *
- * @param entity Entity index.
- * @return Speed of the entity.
- */
-stock Float:Entity_GetSpeed(entity)
-{
- return GetEntPropFloat(entity, Prop_Data, "m_flSpeed");
-}
-
-/**
- * Sets how fast an entity moves (like doors: open close speed).
- *
- * @param entity Entity index.
- * @param speed The new speed of the entity.
- * @noreturn
- */
-stock Entity_SetSpeed(entity, Float:speed)
-{
- SetEntPropFloat(entity, Prop_Data, "m_flSpeed", speed);
-}
-
-/**
- * Gets the damage of a moving entity when blocked (like doors when open or close and players and/or objects are between the entity and something else).
- * Note: Negative values add health to the blocking entity.
- *
- * @param entity Entity index.
- * @return Damage.
- */
-stock Float:Entity_GetBlockDamage(entity)
-{
- return GetEntPropFloat(entity, Prop_Data, "m_flBlockDamage");
-}
-
-/**
- * Sets the damage of a moving entity when blocked (like doors when open or close and players and/or objects are between the entity and something else).
- * Note: Negative values add health to the blocking entity.
- *
- * @param entity Entity index.
- * @param damage Damage.
- * @noreturn
- */
-stock Entity_SetBlockDamage(entity, Float:damage)
-{
- SetEntPropFloat(entity, Prop_Data, "m_flBlockDamage", damage);
-}
-
-/**
- * Returns if the given entity is disabled or not.
- *
- * @param entity Entity index.
- * @return True if entity is disabled, otherwise false.
- */
-stock bool:Entity_IsDisabled(entity)
-{
- return bool:GetEntProp(entity, Prop_Data, "m_bDisabled", 1);
-}
-
-/**
- * Disables the given entity.
- *
- * @param entity Entity index.
- * @return True if successful otherwise false.
- */
-stock Entity_Disable(entity)
-{
- return AcceptEntityInput(entity, "Disable");
-}
-
-/**
- * Enables the given entity.
- *
- * @param entity Entity index.
- * @return True if successful otherwise false.
- */
-stock Entity_Enable(entity)
-{
- return AcceptEntityInput(entity, "Enable");
-}
-
-
-// settings for m_takedamage taken from hl2sdk-ob-valve\game\shared\shareddefs.h
-#define DAMAGE_NO 0
-#define DAMAGE_EVENTS_ONLY 1 // Call damage functions, but don't modify health
-#define DAMAGE_YES 2
-#define DAMAGE_AIM 3
-
-/**
- * Sets the mode for an entity to take damage.
- * Note: This is used to give a client god mode (DAMAGE_NO).
- *
- * @param entity Entity index.
- * @param value Mode, use DAMAGE_* defines.
- * @noreturn
- */
-stock Entity_SetTakeDamage(entity, value)
-{
- SetEntProp(entity, Prop_Data, "m_takedamage", value, 1);
-}
-
-/**
- * Gets the mode for an entity to take damage.
- * Note: When the return value is DAMAGE_NO then the client is using godmode.
- *
- * @param entity Entity index.
- * @return Take damage mode (DAMAGE_*).
- */
-stock Entity_GetTakeDamage(entity)
-{
- return GetEntProp(entity, Prop_Data, "m_takedamage", 1);
-}
-
-/**
- * Sets the minimum of damage required to hurt this entity.
- * Example: This is used to block any damage done by projectile weapons against a gun ship in Half-Life 2.
- *
- * @param entity Entity index.
- * @param minDamage Minimum required damage.
- * @noreturn
- */
-stock Entity_SetMinHealthDamage(entity, minDamage)
-{
- SetEntProp(entity, Prop_Data, "m_iMinHealthDmg", minDamage);
-}
-
-/**
- * Gets the minimum of damage required to hurt this entity.
- * Example: This is used to block any damage done by projectile weapons against a gun ship in Half-Life 2.
- *
- * @param entity Entity index.
- * @return Minimum required damage.
- */
-stock Entity_GetMinHealthDamage(entity)
-{
- return GetEntProp(entity, Prop_Data, "m_iMinHealthDmg");
-}
-
-/**
- * Gets an entity's color.
- *
- * @param entity Entity index
- * @param color 4 dimensional array where [r,g,b,a] values are stored
- * @noreturn
- * @error Invalid entity index, or lack of mod compliance.
- */
-stock Entity_GetRenderColor(entity, color[4])
-{
- static bool:gotconfig = false;
- static String:prop[32];
-
- if (!gotconfig) {
- new Handle:gc = LoadGameConfigFile("core.games");
- new bool:exists = GameConfGetKeyValue(gc, "m_clrRender", prop, sizeof(prop));
- CloseHandle(gc);
-
- if (!exists) {
- strcopy(prop, sizeof(prop), "m_clrRender");
- }
-
- gotconfig = true;
- }
-
- new offset = GetEntSendPropOffs(entity, prop);
-
- if (offset <= 0) {
- ThrowError("SetEntityRenderColor not supported by this mod");
- }
-
- for (new i=0; i < 4; i++) {
- color[i] = GetEntData(entity, offset + i + 1, 1);
- }
-}
-
-/**
- * Sets an entity's color.
- * Doesn't change the value, if set to -1.
- *
- * @param entity Entity index
- * @param r Amount of red (0-255)
- * @param g Amount of green (0-255)
- * @param b Amount of blue (0-255)
- * @param a Amount of alpha (0-255)
- * @noreturn
- * @error Invalid entity index, or lack of mod compliance.
- */
-stock Entity_SetRenderColor(entity, r=-1, g=-1, b=-1, a=-1)
-{
- static bool:gotconfig = false;
- static String:prop[32];
-
- if (!gotconfig) {
- new Handle:gc = LoadGameConfigFile("core.games");
- new bool:exists = GameConfGetKeyValue(gc, "m_clrRender", prop, sizeof(prop));
- CloseHandle(gc);
-
- if (!exists) {
- strcopy(prop, sizeof(prop), "m_clrRender");
- }
-
- gotconfig = true;
- }
-
- new offset = GetEntSendPropOffs(entity, prop);
-
- if (offset <= 0) {
- ThrowError("SetEntityRenderColor not supported by this mod");
- }
-
- if(r != -1) {
- SetEntData(entity, offset, r, 1, true);
- }
-
- if(g != -1) {
- SetEntData(entity, offset + 1, g, 1, true);
- }
-
- if(b != -1) {
- SetEntData(entity, offset + 2, b, 1, true);
- }
-
- if(a != -1) {
- SetEntData(entity, offset + 3, a, 1, true);
- }
-}
-
-/**
- * Sends the 'addouput' command to an entity.
- *
- * @param entity Entity Index.
- * @param input Input command.
- * @param activator Entity index which initiated the sequence of actions (-1 for a NULL entity).
- * @param caller Entity index from which this event is sent (-1 for a NULL entity).
- * @param outputid Unknown.
- * @return True if successful, otherwise false.
- */
-stock bool:Entity_AddOutput(entity, const String:input[], activator=-1, caller=-1, outputid=0)
-{
- SetVariantString(input);
- return AcceptEntityInput(entity, "addoutput", activator, caller, outputid);
-}
-