[PEDIDO] Habilidades Carnages
#1
Hola AM, Me podrían ayudar a hacer unas habilidades carnages, solo quiero que me digan como hacerlas Las habilidad serian:

1. Aumentar el recoil
2. Aumentar el daño hecho
3. Disminuir el daño recibido


esas 3 quisiera saber si me podrían decir como las podría hacer sal2 Espero su respuesta Gran sonrisa
Responder
#2
Estan en el expmod de gonza, hasta posteo la version sin bugs (parece) en la parte de Plugins Nuevos
Responder
#3
Para el recoil (by Kiske):

Código PHP:
#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(szNameg_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_PrecacheEventg_iForwardIndex1)
    
    
// 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(flagsinvokereventid
{
    
// 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(!(<= 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(invokerEV_VEC_punchangleflPunchedAngles)
    
    
// Ahora podemos perfectamente manipular los punchangles con XS
    
xs_vec_mul_scalar(flPunchedAngles0.5flPunchedAngles)
    
    
// 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(invokerEV_VEC_punchangleflPunchedAngles)
    
    
// Devolviendo el valor con FMRES_HANDLED estamos diciendole al modulo 
    // que "hicimos algo".
    
return FMRES_HANDLED

Responder
#4
Pero como podria hacerla como habilidad?
Responder
#5
Hace una macro con la habilidad y reemplaza el 0.5 con la macro
Responder
#6
Pero el macro con cuanto lo pondria?
Responder
#7
Aumenta 0.1 con cada habilidad que sume
Responder
#8
(23/01/2014, 09:48 AM)wiD escribió: Aumenta 0.1 con cada habilidad que sume

Algo asi quedaria?
Código PHP:
#include <amxmodx>
#include <fakemeta> // detectar el evento
#include <engine> // manipulacion de la recoil
#include <xs> // uso de vectores.

new g_iForwardIndex
new g_iMaxPlayers
new g_iGunFireEventBitsum_Ak47

new const g_szGunEvent_AK47[] = "events/ak47.sc"
public plugin_precache() {
    
g_iForwardIndex register_forward(FM_PrecacheEvent"fw_PrecacheEvent_Post"1)
}

new 
g_habilidad[33][1]
#define Recoil(%1)    (%1 + 0.1)
    
public fw_PrecacheEvent_Post(type, const szName[]) 
{
    if (
equal(szNameg_szGunEvent_AK47)) 
    {
        
g_iGunFireEventBitsum_Ak47 |= (1<<get_orig_retval())
            return 
FMRES_HANDLED
    
}
    
    return 
FMRES_IGNORED
}

public 
plugin_init() {
    
register_plugin("Custom Recoil for AK-47""1.0""meTaLiCroSS")
    
    
unregister_forward(FM_PrecacheEventg_iForwardIndex1)
    
register_forward(FM_PlaybackEvent"fw_PlaybackEvent")
    
    
g_iMaxPlayers get_maxplayers()
}

public 
fw_PlaybackEvent(flagsinvokereventid
{
    if (!(
g_iGunFireEventBitsum_Ak47 & (1<<eventid)))
        return 
FMRES_IGNORED
        
    
if(!(<= invoker <= g_iMaxPlayers))
        return 
FMRES_IGNORED
        
    
static Float:flPunchedAngles[3]
    
entity_get_vector(invokerEV_VEC_punchangleflPunchedAngles)
    
    
xs_vec_mul_scalar(flPunchedAnglesRecoil(g_habilidad[attacker][0]), flPunchedAngles)

    
entity_set_vector(invokerEV_VEC_punchangleflPunchedAngles)
        return 
FMRES_HANDLED

Responder
#9
(22/01/2014, 05:11 PM)Im Author escribió: Estan en el expmod de gonza, hasta posteo la version sin bugs (parece) en la parte de Plugins Nuevos

Trate de sacarlas del mod de gonza pero no pude hacerlo compilar :S
Responder
#10
@wiD como podria hacer una habilidad de Velocidad de Recarga
Responder
#11
Cuando este en la pc te doy una mano. Pero ahora estoy con mucho laburo
Responder
#12
(24/01/2014, 10:55 PM)wiD escribió: Cuando este en la pc te doy una mano. Pero ahora estoy con mucho laburo
Dale dale gracias, te espero Gran sonrisa
Responder
#13
Te saque esto de un post de Stickp0le, yo lo adapte un poco al bb, aca tenes todo lo que pedis:

Código PHP:
//creamos constantes multidimensionales
new const g_mejoras_names[2][6][] = // como dice el nombre son los nombres de las mejoras
{
    {
        
"Daño",    
        
"Vitalidad",
        
"Velocidad",
        
"Chaleco"// MEJORAS HUMANAS
        
"Gravedad",
        
"Resistencia"
    
},
    {
        
"Daño",
        
"Vitalidad",
        
"Velocidad",    // MEJORAS ZOMBIES
        
"Gravedad",
        
"",
        
""
    
}
}

new const 
g_mejoras_names_max[][] = // las veces que se puede mejorar 
{
    {    
        
40,
        
30,
        
20,         // HUMANOS
        
30,
        
12,
        
5
    
},
    {
        
10,
        
40,
        
30// ZOMBIES
        
14
    
}
}

// creamos macros para el monto de las mejoras

// Mejoras
#define costo(%1)        (%1 * 3) + 1 // costo de mejoras
#define ammount_damage(%1)         (%1 + 3) * 0.3 // upgrade damage
#define ammount_speed(%1)         (%1 * 10) // upgrade speed
#define ammount_health(%1)         (%1 * 30) // upgrade health
#define ammount_armor(%1)         (%1 * 20) // upgrade armor
#define ammount_gravity(%1)     ((%1 * 0.01) * 4) // upgrade gravity
#define ammount_zhealth(%1)        (%1 * 10000) // upgrade zombie health
#define ammount_zspeed(%1)         (%1 * 5) // upgrade zombie speed
#define ammount_resistence(%1)        (%1 / 1.1) // resistence upgrade
#define ammount_zdamage(%1)     (%1 * 2) // zombie damage upgrade

// creamos variables multidimensionales
new g_gastados[33][2// puntos zombie/humanos gastados
new g_skill_points[33][2][6// contiene las mejoras zombies y humanas
new g_skill_points_type[33][2// puntos humanos y zombies

// nos vamos al final del zp y agregamos

public menu_mejoras_h(id)
{
    new 
menu[256], num[8], imenu2
    
    formatex
(menu255"\yMenu de mejoras humanas^n^nTienes \w%d\y puntos para gastar^n\yYa gastaste \w%d \ypuntos humanos"g_skill_points_type[id][0], g_gastados[id][0]) // titulo
    
    
menu2 menu_create(menu"show_menu_mejoras_h"// handler del menu
    
    
for (06i++) // un for para obtener el nombre de las mejoras
    
{
        if (
g_skill_points[id][0][i] < g_mejoras_names_max[0][i]) // si la mejora es menor a su cantidad maxima
        
{
            if (
g_skill_points_type[id][0] >= costo(g_skill_points[id][0][i])) // si los puntos son mayores o iguales a la cantidad de puntos que pide
            
{
                
formatex(menucharsmax(menu), "\yAumentar %s [%d/%d]\r \w(%d punto%s\w)"g_mejoras_names[0][i], g_skill_points[id][0][i], g_mejoras_names_max[0][i], costo(g_skill_points[id][0][i]), costo(g_skill_points[id][0][i]) == "" "s")        
                
num_to_str(inum7)    // pasamos de un numero a string
                
menu_additem(menu2menunum// agregamos el item al menu
            
}
            else
            {
                
formatex(menucharsmax(menu), "\dAumentar %s [%d/%d]\r \w(%d punto%s\w)"g_mejoras_names[0][i], g_skill_points[id][0][i], g_mejoras_names_max[0][i], costo(g_skill_points[id][0][i]), costo(g_skill_points[id][0][i]) == "" "s")        
                
num_to_str(inum7)    
                
menu_additem(menu2menunum)
            }
        }
        else
        {
            
formatex(menucharsmax(menu), "\dAumentar %s [%d/%d] \w(MAX\w)" g_mejoras_names[0][i], g_skill_points[id][0][i], g_mejoras_names_max[0][i])        
            
num_to_str(inum7)    
            
menu_additem(menu2menunum)
        }
    }
        
    if (
g_gastados[id][0] >= 1// si los puntos gastados humanos son mayores o iguales a 1
        
menu_additem(menu2"\yResetear Mejoras""7")
    else
        
menu_additem(menu2"\dResetear Mejoras""7")
    
    
menu_setprop(menu2MPROP_EXITNAME"Salir"// salimos
    
    
menu_display(idmenu2)
}

public 
show_menu_mejoras_h(idmenuitem// handler del menu
{
    if (
item == MENU_EXIT// si selecciona la opcion para salir
    
{
        
menu_destroy(menu// destruimos
        
return PLUGIN_HANDLED;
    }
    
    new 
Data[5], Name[33], accesscallback
    menu_item_getinfo
(menuitemaccessData4Name32callback// obtenemos datos requeridos para el menu
    
new KeyKey str_to_num(Data)
    switch (
Key)
    {
        case 
7:
        {
            if (
g_gastados[id][0] >= 1
            {
                for (new 
06i++) // un for para resetear todas las mejoras de una
                
{
                    
g_skill_points[id][0][i] = // reseteamos las mejoras
                    
g_skill_points_type[id][0] += g_gastados[id][0// le sumamos los puntos gastados
                    
g_gastados[id][0] = // reseteamos la variable
                
}
            }

            
menu_mejoras_h(id)
        }
    }
    
    if (
g_skill_points[id][0][Key] < g_mejoras_names_max[0][Key]) // si la mejora no pasa su maximo
    
{
        if (
g_skill_points_type[id][0] >= costo(g_skill_points[id][0][Key])) // si tiene los puntos necesarios
        
{
            
g_skill_points_type[id][0] -= costo(g_skill_points[id][0][Key]) // le restamos los puntos
            
g_gastados[id][0] += costo(g_skill_points[id][0][Key]) // sumamos los puntos gastados
            
g_skill_points[id][0][Key]++ // aumentas la mejora
        
}    
    }
    
menu_destroy(menu// destruimos
    
return PLUGIN_HANDLED
}

public 
menu_mejoras_z(id)
{
    new 
menu2[256], pos[8], imenu3
    
    formatex
(menu2255"\yMenu de mejoras zombies^n^nTienes \w%d\y puntos para gastar^nYa gastaste \w%d \ypuntos zombies"g_skill_points_type[id][1], g_gastados[id][1])
    
    
menu3 menu_create(menu2"show_menu_mejoras_z")
    
    for (
04i++)
    {
        if (
g_skill_points[id][1][i] < g_mejoras_names_max[1][i])
        {
            if (
g_skill_points_type[id][1] >= costo(g_skill_points[id][1][i]))
            {
                
formatex(menu2charsmax(menu2), "\yAumentar %s [%d/%d]\r \w(%d punto%s\w)"g_mejoras_names[1][i], g_skill_points[id][1][i], g_mejoras_names_max[1][i], costo(g_skill_points[id][1][i]), costo(g_skill_points[id][1][i]) == "" "s")        
                
num_to_str(ipos7)    
                
menu_additem(menu3menu2pos)
            }
            else
            {
                
formatex(menu2charsmax(menu2), "\dAumentar %s [%d/%d]\r \w(%d punto%s\w)"g_mejoras_names[1][i], g_skill_points[id][1][i], g_mejoras_names_max[1][i], costo(g_skill_points[id][1][i]), costo(g_skill_points[id][1][i]) == "" "s")        
                
num_to_str(ipos7)    
                
menu_additem(menu3menu2pos)
            }
        }
        else
        {
            
formatex(menu2charsmax(menu2), "\dAumentar %s [%d/%d] \w(MAX\w)" g_mejoras_names[1][i], g_skill_points[id][1][i], g_mejoras_names_max[1][i])        
            
num_to_str(ipos7)    
            
menu_additem(menu3menu2pos)
        }
    }
        
    if (
g_gastados[id][0] >= 1)
        
menu_additem(menu3"\yResetear Mejoras""7")
    else
        
menu_additem(menu3"\dResetear Mejoras""7")
    
menu_setprop(menu3MPROP_EXITNAME"Salir")
    
    
menu_display(idmenu3)
}

public 
show_menu_mejoras_z(idmenuitem)
{
    if (
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
Data[5], Name[33], accesscallback
    menu_item_getinfo
(menuitemaccessData4Name32callback)
    new 
KeyKey str_to_num(Data)
    
    switch (
Key)
    {
        case 
7:
        {
            if (
g_gastados[id][1] >= 1)
            {
                for (new 
06i++)
                {
                    
g_skill_points[id][1][i] = 0
                    g_skill_points_type
[id][1] += g_gastados[id][1]
                    
g_gastados[id][1] = 0
                
}
            }
            
menu_mejoras_z(id)
        }
    }
    if (
g_skill_points[id][1][Key] < g_mejoras_names_max[1][Key])
    {
        if (
g_skill_points_type[id][1] >= costo(g_skill_points[id][1][Key]))
        {
            
g_skill_points_type[id][1] -= costo(g_skill_points[id][1][Key])
            
g_gastados[id][1] += costo(g_skill_points[id][1][Key])
            
g_skill_points[id][1][Key]++
        }
    }
    
menu_destroy(menu)
    
menu_mejoras_z(id)
    return 
PLUGIN_HANDLED
}

// ahora para aplicar el daño nos vamos a fw_takedamage ahi agregamos
damage *= ammount_damage(g_skill_points[attacker][0][0]) 

// ahora mas abajo en la parte del chaleco agregamos 

// Block the attack if he has some
if (armor 0.0)
{
    
engfunc(EngFunc_EmitSoundvictimCHAN_BODYsound_armorhit1.0ATTN_NORM0PITCH_NORM)
    if (!
g_zombie[attacker])
    {
        
set_pev(victimpev_armorvalue, - floatmax(0.0armor damage/ammount_resistence(g_skill_points[attacker][0][5])))
        return 
HAM_SUPERCEDE;
                
    }
    else
    {
        
set_pev(victimpev_armorvaluefloatmax(0.0armor damage+ammount_zdamage(g_skill_points[attacker][1][0])))
        return 
HAM_SUPERCEDE;
    }
            
}
// ahora nos vamos a playerprethink 
// en la parte del zombie reemplazamos lo que esta por esto
set_pev(idpev_maxspeedfloat(g_zclass_spd[g_zombieclass[id]]) + ammount_zspeed(g_skill_points[id][1][2]))

// y en la parte del humano 
set_pev(idpev_maxspeedget_pcvar_float(cvar_humanspd) + ammount_speed(g_skill_points[id][0][2]))


// ahora nos vamos a playerspawn_post
// en la parte de setear vida/chaleco/gravedad reemplazamos eso por esto

// Set health and gravity
fm_set_user_health(idget_pcvar_num(cvar_humanhp) + ammount_health(g_skill_points[id][0][1]))
set_pev(idpev_gravityget_pcvar_float(cvar_humangravity) - ammount_gravity(g_skill_points[id][0][4]))
set_user_armor(idammount_armor(g_skill_points[id][0][3]))

// ahora nos vamos a humanme(id, survivor) y reemplazamos la parte de setear la vida al humano por esto

// Set health
fm_set_user_health(idget_pcvar_num(cvar_humanhp) + ammount_health(g_skill_points[id][0][1]))
set_pev(idpev_gravityget_pcvar_float(cvar_humangravity) - ammount_gravity(g_skill_points[id][0][4]))
set_user_armor(idammount_armor(g_skill_points[id][0][3]))
        
// Set gravity, unless frozen
if (!g_frozen[id]) set_pev(idpev_gravityget_pcvar_float(cvar_humangravity) - ammount_gravity(g_skill_points[id][0][4]))

// y por ultimo nos vamos a zombieme(id, infector)
// en la parte de setear la vida al zombie agregamos 
// Set health and gravity

fm_set_user_health(idfloatround(g_zclass_hp[g_zombieclass[id]]*get_pcvar_float(cvar_zombiefirsthp)) + ammount_zhealth(g_skill_points[id][1][1]))
set_pev(idpev_gravityg_zclass_grav[g_zombieclass[id]] * ammount_gravity(g_skill_points[id][1][3]) 
Responder
#14
(25/01/2014, 01:04 PM)wiD escribió: Te saque esto de un post de Stickp0le, yo lo adapte un poco al bb, aca tenes todo lo que pedis:

Código PHP:
//creamos constantes multidimensionales
new const g_mejoras_names[2][6][] = // como dice el nombre son los nombres de las mejoras
{
    {
        
"Daño",    
        
"Vitalidad",
        
"Velocidad",
        
"Chaleco"// MEJORAS HUMANAS
        
"Gravedad",
        
"Resistencia"
    
},
    {
        
"Daño",
        
"Vitalidad",
        
"Velocidad",    // MEJORAS ZOMBIES
        
"Gravedad",
        
"",
        
""
    
}
}

new const 
g_mejoras_names_max[][] = // las veces que se puede mejorar 
{
    {    
        
40,
        
30,
        
20,         // HUMANOS
        
30,
        
12,
        
5
    
},
    {
        
10,
        
40,
        
30// ZOMBIES
        
14
    
}
}

// creamos macros para el monto de las mejoras

// Mejoras
#define costo(%1)        (%1 * 3) + 1 // costo de mejoras
#define ammount_damage(%1)         (%1 + 3) * 0.3 // upgrade damage
#define ammount_speed(%1)         (%1 * 10) // upgrade speed
#define ammount_health(%1)         (%1 * 30) // upgrade health
#define ammount_armor(%1)         (%1 * 20) // upgrade armor
#define ammount_gravity(%1)     ((%1 * 0.01) * 4) // upgrade gravity
#define ammount_zhealth(%1)        (%1 * 10000) // upgrade zombie health
#define ammount_zspeed(%1)         (%1 * 5) // upgrade zombie speed
#define ammount_resistence(%1)        (%1 / 1.1) // resistence upgrade
#define ammount_zdamage(%1)     (%1 * 2) // zombie damage upgrade

// creamos variables multidimensionales
new g_gastados[33][2// puntos zombie/humanos gastados
new g_skill_points[33][2][6// contiene las mejoras zombies y humanas
new g_skill_points_type[33][2// puntos humanos y zombies

// nos vamos al final del zp y agregamos

public menu_mejoras_h(id)
{
    new 
menu[256], num[8], imenu2
    
    formatex
(menu255"\yMenu de mejoras humanas^n^nTienes \w%d\y puntos para gastar^n\yYa gastaste \w%d \ypuntos humanos"g_skill_points_type[id][0], g_gastados[id][0]) // titulo
    
    
menu2 menu_create(menu"show_menu_mejoras_h"// handler del menu
    
    
for (06i++) // un for para obtener el nombre de las mejoras
    
{
        if (
g_skill_points[id][0][i] < g_mejoras_names_max[0][i]) // si la mejora es menor a su cantidad maxima
        
{
            if (
g_skill_points_type[id][0] >= costo(g_skill_points[id][0][i])) // si los puntos son mayores o iguales a la cantidad de puntos que pide
            
{
                
formatex(menucharsmax(menu), "\yAumentar %s [%d/%d]\r \w(%d punto%s\w)"g_mejoras_names[0][i], g_skill_points[id][0][i], g_mejoras_names_max[0][i], costo(g_skill_points[id][0][i]), costo(g_skill_points[id][0][i]) == "" "s")        
                
num_to_str(inum7)    // pasamos de un numero a string
                
menu_additem(menu2menunum// agregamos el item al menu
            
}
            else
            {
                
formatex(menucharsmax(menu), "\dAumentar %s [%d/%d]\r \w(%d punto%s\w)"g_mejoras_names[0][i], g_skill_points[id][0][i], g_mejoras_names_max[0][i], costo(g_skill_points[id][0][i]), costo(g_skill_points[id][0][i]) == "" "s")        
                
num_to_str(inum7)    
                
menu_additem(menu2menunum)
            }
        }
        else
        {
            
formatex(menucharsmax(menu), "\dAumentar %s [%d/%d] \w(MAX\w)" g_mejoras_names[0][i], g_skill_points[id][0][i], g_mejoras_names_max[0][i])        
            
num_to_str(inum7)    
            
menu_additem(menu2menunum)
        }
    }
        
    if (
g_gastados[id][0] >= 1// si los puntos gastados humanos son mayores o iguales a 1
        
menu_additem(menu2"\yResetear Mejoras""7")
    else
        
menu_additem(menu2"\dResetear Mejoras""7")
    
    
menu_setprop(menu2MPROP_EXITNAME"Salir"// salimos
    
    
menu_display(idmenu2)
}

public 
show_menu_mejoras_h(idmenuitem// handler del menu
{
    if (
item == MENU_EXIT// si selecciona la opcion para salir
    
{
        
menu_destroy(menu// destruimos
        
return PLUGIN_HANDLED;
    }
    
    new 
Data[5], Name[33], accesscallback
    menu_item_getinfo
(menuitemaccessData4Name32callback// obtenemos datos requeridos para el menu
    
new KeyKey str_to_num(Data)
    switch (
Key)
    {
        case 
7:
        {
            if (
g_gastados[id][0] >= 1
            {
                for (new 
06i++) // un for para resetear todas las mejoras de una
                
{
                    
g_skill_points[id][0][i] = // reseteamos las mejoras
                    
g_skill_points_type[id][0] += g_gastados[id][0// le sumamos los puntos gastados
                    
g_gastados[id][0] = // reseteamos la variable
                
}
            }

            
menu_mejoras_h(id)
        }
    }
    
    if (
g_skill_points[id][0][Key] < g_mejoras_names_max[0][Key]) // si la mejora no pasa su maximo
    
{
        if (
g_skill_points_type[id][0] >= costo(g_skill_points[id][0][Key])) // si tiene los puntos necesarios
        
{
            
g_skill_points_type[id][0] -= costo(g_skill_points[id][0][Key]) // le restamos los puntos
            
g_gastados[id][0] += costo(g_skill_points[id][0][Key]) // sumamos los puntos gastados
            
g_skill_points[id][0][Key]++ // aumentas la mejora
        
}    
    }
    
menu_destroy(menu// destruimos
    
return PLUGIN_HANDLED
}

public 
menu_mejoras_z(id)
{
    new 
menu2[256], pos[8], imenu3
    
    formatex
(menu2255"\yMenu de mejoras zombies^n^nTienes \w%d\y puntos para gastar^nYa gastaste \w%d \ypuntos zombies"g_skill_points_type[id][1], g_gastados[id][1])
    
    
menu3 menu_create(menu2"show_menu_mejoras_z")
    
    for (
04i++)
    {
        if (
g_skill_points[id][1][i] < g_mejoras_names_max[1][i])
        {
            if (
g_skill_points_type[id][1] >= costo(g_skill_points[id][1][i]))
            {
                
formatex(menu2charsmax(menu2), "\yAumentar %s [%d/%d]\r \w(%d punto%s\w)"g_mejoras_names[1][i], g_skill_points[id][1][i], g_mejoras_names_max[1][i], costo(g_skill_points[id][1][i]), costo(g_skill_points[id][1][i]) == "" "s")        
                
num_to_str(ipos7)    
                
menu_additem(menu3menu2pos)
            }
            else
            {
                
formatex(menu2charsmax(menu2), "\dAumentar %s [%d/%d]\r \w(%d punto%s\w)"g_mejoras_names[1][i], g_skill_points[id][1][i], g_mejoras_names_max[1][i], costo(g_skill_points[id][1][i]), costo(g_skill_points[id][1][i]) == "" "s")        
                
num_to_str(ipos7)    
                
menu_additem(menu3menu2pos)
            }
        }
        else
        {
            
formatex(menu2charsmax(menu2), "\dAumentar %s [%d/%d] \w(MAX\w)" g_mejoras_names[1][i], g_skill_points[id][1][i], g_mejoras_names_max[1][i])        
            
num_to_str(ipos7)    
            
menu_additem(menu3menu2pos)
        }
    }
        
    if (
g_gastados[id][0] >= 1)
        
menu_additem(menu3"\yResetear Mejoras""7")
    else
        
menu_additem(menu3"\dResetear Mejoras""7")
    
menu_setprop(menu3MPROP_EXITNAME"Salir")
    
    
menu_display(idmenu3)
}

public 
show_menu_mejoras_z(idmenuitem)
{
    if (
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
Data[5], Name[33], accesscallback
    menu_item_getinfo
(menuitemaccessData4Name32callback)
    new 
KeyKey str_to_num(Data)
    
    switch (
Key)
    {
        case 
7:
        {
            if (
g_gastados[id][1] >= 1)
            {
                for (new 
06i++)
                {
                    
g_skill_points[id][1][i] = 0
                    g_skill_points_type
[id][1] += g_gastados[id][1]
                    
g_gastados[id][1] = 0
                
}
            }
            
menu_mejoras_z(id)
        }
    }
    if (
g_skill_points[id][1][Key] < g_mejoras_names_max[1][Key])
    {
        if (
g_skill_points_type[id][1] >= costo(g_skill_points[id][1][Key]))
        {
            
g_skill_points_type[id][1] -= costo(g_skill_points[id][1][Key])
            
g_gastados[id][1] += costo(g_skill_points[id][1][Key])
            
g_skill_points[id][1][Key]++
        }
    }
    
menu_destroy(menu)
    
menu_mejoras_z(id)
    return 
PLUGIN_HANDLED
}

// ahora para aplicar el daño nos vamos a fw_takedamage ahi agregamos
damage *= ammount_damage(g_skill_points[attacker][0][0]) 

// ahora mas abajo en la parte del chaleco agregamos 

// Block the attack if he has some
if (armor 0.0)
{
    
engfunc(EngFunc_EmitSoundvictimCHAN_BODYsound_armorhit1.0ATTN_NORM0PITCH_NORM)
    if (!
g_zombie[attacker])
    {
        
set_pev(victimpev_armorvalue, - floatmax(0.0armor damage/ammount_resistence(g_skill_points[attacker][0][5])))
        return 
HAM_SUPERCEDE;
                
    }
    else
    {
        
set_pev(victimpev_armorvaluefloatmax(0.0armor damage+ammount_zdamage(g_skill_points[attacker][1][0])))
        return 
HAM_SUPERCEDE;
    }
            
}
// ahora nos vamos a playerprethink 
// en la parte del zombie reemplazamos lo que esta por esto
set_pev(idpev_maxspeedfloat(g_zclass_spd[g_zombieclass[id]]) + ammount_zspeed(g_skill_points[id][1][2]))

// y en la parte del humano 
set_pev(idpev_maxspeedget_pcvar_float(cvar_humanspd) + ammount_speed(g_skill_points[id][0][2]))


// ahora nos vamos a playerspawn_post
// en la parte de setear vida/chaleco/gravedad reemplazamos eso por esto

// Set health and gravity
fm_set_user_health(idget_pcvar_num(cvar_humanhp) + ammount_health(g_skill_points[id][0][1]))
set_pev(idpev_gravityget_pcvar_float(cvar_humangravity) - ammount_gravity(g_skill_points[id][0][4]))
set_user_armor(idammount_armor(g_skill_points[id][0][3]))

// ahora nos vamos a humanme(id, survivor) y reemplazamos la parte de setear la vida al humano por esto

// Set health
fm_set_user_health(idget_pcvar_num(cvar_humanhp) + ammount_health(g_skill_points[id][0][1]))
set_pev(idpev_gravityget_pcvar_float(cvar_humangravity) - ammount_gravity(g_skill_points[id][0][4]))
set_user_armor(idammount_armor(g_skill_points[id][0][3]))
        
// Set gravity, unless frozen
if (!g_frozen[id]) set_pev(idpev_gravityget_pcvar_float(cvar_humangravity) - ammount_gravity(g_skill_points[id][0][4]))

// y por ultimo nos vamos a zombieme(id, infector)
// en la parte de setear la vida al zombie agregamos 
// Set health and gravity

fm_set_user_health(idfloatround(g_zclass_hp[g_zombieclass[id]]*get_pcvar_float(cvar_zombiefirsthp)) + ammount_zhealth(g_skill_points[id][1][1]))
set_pev(idpev_gravityg_zclass_grav[g_zombieclass[id]] * ammount_gravity(g_skill_points[id][1][3]) 

pero como puedo hacer Velocidad de Recarga?
Responder
#15
http://amxmodx-es.com/showthread.php?tid=758

Ahí lo pregunte yo y me respondieron.
Responder
#16
El macro como lo pondria?
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)