Veteran Member
|
11-28-2009
, 15:22
[ES][TUT] Como cambiar el Recoil / Speed de un Arma. [By meTaLiCroSS]
|
#1
|
Requerimientos: Nivel ALTO de Scripting.
Todo esta explicado en el PHP [By MeTaLiCroSS ^^].
Speed del Arma:
PHP Code:
#include <amxmodx> #include <fakemeta> // detectar el evento, y manipulacion de offsets #include <engine> // obtener el index de la ak-47 #include <xs> // uso de vectores.
// Con esta variable obtendremos el index de la forward FM_PrecacheEvent para despues en el init // deje de ser llamada, ya que sera llamada en el Precache (antes del init, cuando empiesa el server // despues de un cambio de mapa). new g_iForwardIndex
// En esta variable se guardaran los maxPlayers del Server new g_iMaxPlayers
// Aqui se guardara el index del evento en el cual la AK-47 es disparada new g_iGunFireEventBitsum_Ak47
// Este es el nombre del evento cuando el arma dispara, el cual esta guardado en la carpeta events new const g_szGunEvent_AK47[] = "events/ak47.sc"
// Estos son los offsets que se usaran con fakemeta para manipularlos. const m_flNextPrimaryAttack = 46 // siguente valor para el ataque primario const m_flNextSecondaryAttack = 47 // siguiente valor para el ataque segundario (sea zoom, o burst-fire, whatever) const m_flTimeWeaponIdle = 48 // delay del arma, actualmente al uso de la animacion idle, y cuando un arma termina de recargar.
// Precache public plugin_precache() { // Guardamos el ID y registramos la forward en el cual los eventos son pre-cacheados. g_iForwardIndex = register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1) // PrecacheEvent Post. }
// Cuando los eventos son pre-cacheados. public fw_PrecacheEvent_Post(type, const szName[]) { // El nombre del evento equivale al del ataque de la ak-47? if (equal(szName, g_szGunEvent_AK47)) { // Guardamos el id del ataque en un bitsum. Por ende necesitamos obtener // el valor original del evento, para eso se usa "get_orig_retval" que solamente // funciona en forwards que son llamadas despues de lo real, osea, Post g_iGunFireEventBitsum_Ak47 |= (1<<get_orig_retval()) // Devolviendo el valor con FMRES_HANDLED estamos diciendole al modulo // que "hicimos algo". return FMRES_HANDLED } return FMRES_IGNORED }
// Despues del init, cuando el mapa empiesa a ponerse de pie public plugin_init() { // info del plugin register_plugin("Custom Fire-Rate for AK-47", "1.0", "meTaLiCroSS") // Desactivamos la forward para que deje de ser llamada. unregister_forward(FM_PrecacheEvent, g_iForwardIndex, 1) // Registramos la forward en el cual "un evento" es llamado. register_forward(FM_PlaybackEvent, "fw_PlaybackEvent") g_iMaxPlayers = get_maxplayers() }
// Vean atras :P // flags = los flags del evento, si supiera se los diria // invoker = la entidad que iso llamar el evento // eventid = el index del evento public fw_PlaybackEvent(flags, invoker, eventid) { // No es el evento del cual dispara la AK-47? (mediante bitsums) if (!(g_iGunFireEventBitsum_Ak47 & (1<<eventid))) return FMRES_IGNORED // El invocador no esta en el rango "1-32(by default)", osea, es un player? if(!(1 <= invoker <= g_iMaxPlayers)) return FMRES_IGNORED // Aqui esta el evento en el cual es el arma disparada por un player, en este caso // la AK-47. Este evento es llamado "despues", osea, "post" al original, asi que // perfectamente podremos obtener los datos actuales del player. // Obtenemos el index de la AK el cual el user esta obteniendo, para eso usamos find_ent_by_owner // el cual busca una entidad en otra entidad con el classname indicado. en este caso es "weapon_ak47". static iAK47_WeaponIndex iAK47_WeaponIndex = find_ent_by_owner(-1, "weapon_ak47", invoker) // Ahora podemos perfectamente manipular el tiempo en el cual sea disparado. set_pdata_float(iAK47_WeaponIndex, m_flNextPrimaryAttack, 1.0, 4) set_pdata_float(iAK47_WeaponIndex, m_flNextSecondaryAttack, 1.0, 4) set_pdata_float(iAK47_WeaponIndex, m_flTimeWeaponIdle, 1.0, 4) // iAK47_WeaponIndex = el index de la entidad al cual modificaremos sus offsets // m_fl* = el nombre del offset o integer del offset, whatever // 1.0 = el valor en el cual sera el proximo ataque, en este caso la ak atacaria cada 1 segundo, perfectamente puede ser modificado. // 4 = es el "linuxdiff" de las "armas", lo por casos obvio y que para mi son desconosidos son exclusivamente para armas. (5 = players) // Como este evento es llamado "despues" que un arma ataque, no habria problemas con // otros valores. // Devolviendo el valor con FMRES_HANDLED estamos diciendole al modulo // que "hicimos algo". return FMRES_HANDLED }
Recoil del Arma:
PHP Code:
#include <amxmodx> #include <fakemeta> // detectar el evento #include <engine> // manipulacion de la recoil #include <xs> // uso de vectores.
// Con esta variable obtendremos el index de la forward FM_PrecacheEvent para despues en el init // deje de ser llamada, ya que sera llamada en el Precache (antes del init, cuando empiesa el server // despues de un cambio de mapa). new g_iForwardIndex
// En esta variable se guardaran los maxPlayers del Server new g_iMaxPlayers
// Aqui se guardara el index del evento en el cual la AK-47 es disparada new g_iGunFireEventBitsum_Ak47
// Este es el nombre del evento en donde la ak dispara, el cual esta guardado en la carpeta events new const g_szGunEvent_AK47[] = "events/ak47.sc"
// Precache public plugin_precache() { // Guardamos el ID y registramos la forward en el cual los eventos son pre-cacheados. g_iForwardIndex = register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1) // PrecacheEvent Post. }
// Cuando los eventos son pre-cacheados. public fw_PrecacheEvent_Post(type, const szName[]) { // El nombre del evento equivale al del ataque de la ak-47? if (equal(szName, g_szGunEvent_AK47)) { // Guardamos el id del ataque en un bitsum. Por ende necesitamos obtener // el valor original del evento, para eso se usa "get_orig_retval" que solamente // funciona en forwards que son llamadas despues de lo real, osea, Post g_iGunFireEventBitsum_Ak47 |= (1<<get_orig_retval()) // Devolviendo el valor con FMRES_HANDLED estamos diciendole al modulo // que "hicimos algo". return FMRES_HANDLED } return FMRES_IGNORED }
// Despues del init, cuando el mapa empiesa a ponerse de pie public plugin_init() { // info del plugin register_plugin("Custom Recoil for AK-47", "1.0", "meTaLiCroSS") // Desactivamos la forward para que deje de ser llamada. unregister_forward(FM_PrecacheEvent, g_iForwardIndex, 1) // Registramos la forward en el cual "un evento" es llamado. register_forward(FM_PlaybackEvent, "fw_PlaybackEvent") g_iMaxPlayers = get_maxplayers() }
// Vean atras :P // flags = los flags del evento, si supiera se los diria // invoker = la entidad que iso llamar el evento // eventid = el index del evento public fw_PlaybackEvent(flags, invoker, eventid) { // No es el evento del cual dispara la AK-47? (mediante bitsums) if (!(g_iGunFireEventBitsum_Ak47 & (1<<eventid))) return FMRES_IGNORED // El invocador no esta en el rango "1-32(by default)", osea, es un player? if(!(1 <= invoker <= g_iMaxPlayers)) return FMRES_IGNORED // Aqui esta el evento en el cual es el arma disparada por un player, en este caso // la AK-47. Este evento es llamado "despues", osea, "post" al original, asi que // perfectamente podremos obtener los datos actuales del player. // Obtenemos los "punchangles" del player, que vendrian siendo en el cual se guardo // la ultima movida de los angulos del player, osea, recoil. static Float:flPunchedAngles[3] entity_get_vector(invoker, EV_VEC_punchangle, flPunchedAngles) // Ahora podemos perfectamente manipular los punchangles con XS xs_vec_mul_scalar(flPunchedAngles, 0.5, flPunchedAngles) // 0.5 seria el valor float con el cual los punchangles serian manipulados. // En este caso usamos 0.5 para obtener la mitad del valor, con xs_vec_mul_scalar // aplicamos una multiplicacion en las 3 dimensiones de un vector, en este caso // con 0.5 se obtendria la mitad, osea, semirecoil. Con el mismo vector se obtiene y se saca el valor // Perfectamente podemos ponerle el nuevo valor de punchangle al player, no se notara // ninguna diferencia porque es una diferencia de menos de 0.1 segundos al disparar. entity_set_vector(invoker, EV_VEC_punchangle, flPunchedAngles) // Devolviendo el valor con FMRES_HANDLED estamos diciendole al modulo // que "hicimos algo". return FMRES_HANDLED }
__________________
Last edited by Kiske; 11-28-2009 at 18:18.
|
|