14/12/2016, 10:20 PM
solo te dare un ejemplo no lo testee pero deberia darte una idea de como hacerla
Código PHP:
#include <amxmodx>
#include <engine>
/* C Style */
#pragma semicolon 1
public plugin_init( )
{
register_clcmd( "say /do", "LanzarEntidadExplosiva" );
register_think( "FlyingEnt", "CBaseEntity_Think" ); // Registramos la fordward que no dara a saber cuando nuestra entidad piensa
}
public LanzarEntidadExplosiva( const iIndex )
{
// Variable estatica para obtener el index de la entidad creada y setearle las configuraciones
static iEnt;
// SI cuando creamos la entidad esta es valida
if( is_valid_ent( ( iEnt = create_entity( "info_target" ) ) ) )
{
static Float:vecUtil[ 3 ]; // variable estatica tipo Float (decimal) para obtener vectores
// obtenemos los vectores dela posicion en la cual estas
entity_get_vector( iIndex, EV_VEC_origin, vecUtil );
// seteamos la posicion de nuestra entidad con los valores antes obtenidos
entity_set_origin( iEnt, vecUtil );
// seteamos que tu seas el dueño de esta entidad...
entity_set_edict( iEnt, EV_ENT_owner, iIndex );
// obtenemos la velocidad en la direccion que el jugador apunta y le multiplicamos 1000 en velocidad
velocity_by_aim( iIndex, 1000, vecUtil );
// seteamos la velocidad obtenida
entity_set_vector( iEnt, EV_VEC_velocity, vecUtil );
// seteamos un tipo de movimiento que atraviese las paredes
// info: Este movetype no tiene colision por ende no podras chequear si colisiona con alguna entidad
entity_set_int( iEnt, EV_INT_movetype, MOVETYPE_NOCLIP );
// seteamos el solido a BBOX (tipo bloque)
entity_set_int( iEnt, EV_INT_solid, SOLID_BBOX );
// le seteamos un nombre que va caracterizar nuesta entidad de las demas
entity_set_string( iEnt, EV_SZ_classname, "FlyingEnt" );
// Seteamos en tiempo en que setea en este caso la entidad piensa cada 0.2 segundos
entity_set_float( iEnt, EV_FL_nextthink, get_gametime( ) + 0.2 );
}
}
public CBaseEntity_Think( const iEnt )
{
// Esta entidad no es valida ?
if(!is_valid_ent( iEnt ))
return;
static iDistance; // variable estatica para medir la distancia entre el Owner (Dueño de la entidad) y la Entidad
static iOwner; // variable estatica para obtener el owner(Dueño de la entidad)
iOwner = entity_get_edict( iEnt, EV_ENT_owner ); // obtenemos el owner(Dueño de la entidad)
iDistance = get_entity_distance( iOwner, iEnt ); // Distancia entre Owner y Entidad
if( iDistance >= 700 ) // si la distancia entre estos es mayor o igual a 700
{
Explosion( iEnt ); // Explosion
remove_entity( iEnt ); // Removemos la entidad
}
entity_set_float( iEnt, EV_FL_nextthink, get_gametime( ) + 0.5 ); // si no ha explotado aun seteamos que piense cada 0.5 segundos mas
}
public Explosion(const iObject)
{
// esto te lo explique al principio
static iEnt;
iEnt = create_entity("env_explosion");
if(!iEnt) // Entidad no tiene index ?
return 0; // retornamos 0;
static Float:vecOrigin[3];
entity_get_vector(iObject, EV_VEC_origin, vecOrigin); // obtener origin
entity_set_vector(iEnt, EV_VEC_origin, vecOrigin); // Setear origin
// Este es el Key Value de la entidad env_explosion que es la magnitud modifica el numero en el string( cadena de texto )
DispatchKeyValue(iEnt, "iMagnitude", "200");
// le indicamos que cuando la entidad que explota aparesca esta no pueda infligir daño
entity_set_int(iEnt, EV_INT_spawnflags, SF_ENVEXPLOSION_NODAMAGE);
// Spawneamos (Revivimos o hacemos aparecer) la entidad
DispatchSpawn(iEnt);
// Forzamos el uso de la entidad para que explote
force_use(iEnt, iEnt);
// la removemos ya que lo la usamos
// no tengo claro si es necesario hacer esto puesto que no se si esta al explotar se elimina automatica mente
remove_entity(iEnt);
// return 1;
return 1;
}
~Digito ergo sum~