[ZP][Guia] Armas con niveles por daño
#1
Solo para zp 4.2
Agarramos un zp 4.2 default
Paso 1: Ponen esto donde quieran, primero reemplazamos el menu de armas default del zp, por este
Código PHP:
#define ammount_cost_level_weapons(%1)    (%1 * %1 * 250)   
enum _:g_armas
{
    
ARMAS_NAME[90],
    
ARMAS_WEAPON[90],
    
ARMAS_CSW,
    
ARMAS_MODELS_V[90],
    
ARMAS_MODELS_P[90],
    
Float:ARMAS_DMG
}
new const 
ARMAS[][g_armas] =
{    
// Nombre        Weapon            CSW        MODEL_V            MODEL_P            DAñO
    
"Mac 10",         "weapon_mac10",        CSW_MAC10,     "default",         "default",        1.0},
    { 
"Schmidt TMP",    "weapon_tmp",         CSW_TMP,     "default",         "default",        2.0},
    { 
"UMP 45 Carng",     "weapon_ump45",     CSW_UMP45,     "default",         "default",        3.0},
    { 
"MP5 Gold",         "weapon_mp5navy",    CSW_MP5NAVY,     "default",         "default",        4.0},
    { 
"P90 Crow",         "weapon_p90",         CSW_P90,     "default",         "default",        5.0},
    { 
"M3 WINCHESTER",     "weapon_m3",         CSW_M3,     "default",         "default",        6.0},
    { 
"XM1014 BROWNING",     "weapon_xm1014",     CSW_XM1014,     "default",         "default",        7.0},
    { 
"SG552 Buffa",     "weapon_sg552",        CSW_SG552,     "default",         "default",        8.0},
    { 
"GAIL Carng",     "weapon_galil",     CSW_GALIL,     "default",         "default",        9.0},
    { 
"M4A1 Laser",     "weapon_m4a1",         CSW_M4A1,     "default",         "default",        10.0},
    { 
"M4A1 Ice",         "weapon_m4a1",         CSW_M4A1,     "default",         "default",        11.0},
    { 
"P90 Dual",         "weapon_p90",         CSW_P90,     "default",         "default",        12.0},
    { 
"P90 Lapin",         "weapon_p90",         CSW_P90,     "default",         "default",        13.0},
    { 
"Vector Green",     "weapon_p90",         CSW_P90,     "default",         "default",        14.0},
    { 
"GAILCraft",         "weapon_galil",     CSW_GALIL,     "default",         "default",        15.0}

Luego nos vamos a:
public plugin_precache()
y agregamos esto: 
Código PHP:
for(sizeof ARMAS i++) 
    {
        if(!(
equal(ARMAS[i][ARMAS_MODELS_V], "default")))
        
precache_model(ARMAS[i][ARMAS_MODELS_V])
        
        if(!(
equal(ARMAS[i][ARMAS_MODELS_P], "default")))
        
precache_model(ARMAS[i][ARMAS_MODELS_P])
    } 
Despues a: 
// Set Custom Weapon Models
public replace_models(id)
{

y agregamos esto:
Código PHP:
if (g_currentweapon[id] == ARMAS[g_primarias[id]][ARMAS_CSW])
    {
        if (!
equal(ARMAS[g_primarias[id]][ARMAS_MODELS_V], "default"))
        
set_pev(idpev_viewmodel2ARMAS[g_primarias[id]][ARMAS_MODELS_V])
        
        if (!
equal(ARMAS[g_primarias[id]][ARMAS_MODELS_P], "default"))
        
set_pev(idpev_weaponmodel2ARMAS[g_primarias[id]][ARMAS_MODELS_P])
    } 
Listo con eso ya terminamos el precache 
Ahora Cambiamos el menu de armas. Nos vamos a: 
// Buy Menu 1
public show_menu_buy1(taskid)
y cambiamos todo por esto:
Código PHP:
// Buy Menu 1
public show_menu_buy1(taskid)
{
    
// Get player id
    
static id
    
(taskid g_maxplayers) ? (id ID_SPAWN) : (id taskid);
    
    
// Zombies or survivors get no guns
    
if (g_zombie[id] || g_survivor[id] || !is_user_alive(id))
        return;
    
    
// Bots pick their weapons randomly
    
if (is_user_bot(id))
    {
        
buy_primary_weapon(idrandom_num(0sizeof g_primary_items 1))
        
menu_buy2(idrandom_num(0sizeof g_secondary_items 1))
        return;
    }
    
    
// Automatic selection enabled for player and menu called on spawn event
    
if (WPN_AUTO_ON && taskid g_maxplayers)
    {
        
buy_primary_weapon(idWPN_AUTO_PRI)
        
menu_buy2(idWPN_AUTO_SEC)
        return;
    }
    
    static 
menu[999], lenweap
    len 
0
    
    
// Title
    
len += formatex(menu[len], sizeof menu len"\rArmamento Primario\d[%d-%d]^n^n"WPN_STARTID+1min(WPN_STARTID+7WPN_MAXIDS))
    
    
// 1-7. Weapon List
    
for (weap WPN_STARTIDweap min(WPN_STARTID+7WPN_MAXIDS); weap++)
    {
    
        len 
+= formatex(menu[len], sizeof menu len"\r%d\r. \w%s^n"weap-WPN_STARTID+1ARMAS[weap][ARMAS_NAME])

    }

    
len += formatex(menu[len], sizeof menu len"^n\r8.\w %s [\%s\w]""Recodar Armamento", (WPN_AUTO_ON) ? "dSi" "rNo")

    
len += formatex(menu[len], sizeof menu len"^n\r9.\w Siguiente^n^n\r0.\w Salir")
    
    
show_menu(idKEYSMENUmenu, -1"Buy Menu 1")

despues nos vamos a 
// Buy Primary Weapon
buy_primary_weapon(id, selection)
y lo cambiamos por este:
Código PHP:
// Buy Primary Weapon
buy_primary_weapon(idselection)
{
    
// Drop previous weapons
    
drop_weapons(id1)
    
drop_weapons(id2)
    
    
// Strip off from weapons
    
fm_strip_user_weapons(id)
    
fm_give_item(id"weapon_knife")
    
    
// Get weapon index
    
static weaponid
    
    weaponid 
get_weaponid(ARMAS[selection][ARMAS_WEAPON]);

    
fm_give_item(idARMAS[selection][ARMAS_WEAPON])
    
fm_set_user_bpammo(idweaponidMAXBPAMMO[weaponid])
    
    
// Weapons bought
    
g_canbuy[id] = false
    g_primarias
[id] = selection // en esta variable guardaremos la seleccion
    
g_primarias_activo[id] = // esta variable ya la explicare para que sirve
    // Give additional items
    
static i
    
for (0sizeof g_additional_itemsi++)
        
fm_give_item(idg_additional_items[i])

Despues nos vamos a  [Global Variables] y agregamos esto
Código PHP:
new g_primarias[33// esta variable nos sirve para guardar la seleccion
new g_nivel_weapon[33][WPN_MAXIDS// aca almacenamos el nivel de cada arma 
new g_damage_weapon[33][WPN_MAXIDS// aca almacenamos el daño de cada arma
new g_primarias_activo[33// esta variable es de control, para saber cuando contar el daño y cuando mostrar el hud 
Ahora seteamos las variables en 0
Código PHP:
//Vamos a:  
// Event Round Start
// public event_round_start()
//y agregamos esto
for(new 1<= g_maxplayersi++)
{
     g_primarias_activo[i] = // la ponemos en 0 al empezar la ronda para el hud
}

// despues vamos a
// Client joins the game
//public client_putinserver(id) y agregamos

g_primarias_activo[id] = // seteamos en 0 cuando se conecte    
for(new WPN_MAXIDS i++){
    
g_nivel_weapon[id][i] = // seteamos el nivel de las armas en 1
    
g_damage_weapon[id][i] = // seteamos el daño en 0
}

// despues vamos a
// Zombie Me Function (player id, infector, turn into a nemesis, special mode)
//zombieme(id, infector, nemesis, specialmode) y agregamos
g_primarias_activo[id] = 0


// lueego a
// Function Human Me (player id, turn into a survivor)
//humanme(id, survivor) y agregamos
g_primarias_activo[id] = 0

// y por ultimo a
// Reset Player Vars
//reset_vars(id, resetall) y agregamos
g_primarias_activo[id] = 

El siguiente paso es configurar el daño, nos vamos a 
// Ham Take Damage Forward (inflictor = weapon)
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
especificamente a // Attacker is human...
y agregamos: 
Código PHP:
if(g_primarias_activo[attacker]){// si selecciono algun arma del menu, le damos el daño que tiene el arma del menu
        if (g_currentweapon[attacker] == ARMAS[g_primarias[attacker]][ARMAS_CSW]) // algo parecido xD
    
    SetHamParamFloat(4damage *= (ARMAS[g_primarias[attacker]][ARMAS_DMG]))
}else{
    
damage *= 1.0 // sino se lo seteamos en 1.0 y alv
}
        
// si el arma es igual al arma que selecciono del menu
if(get_user_weapon(attacker) == ARMAS[g_primarias[attacker]][ARMAS_CSW]){
    
//y si esta variable esta en 1, que se la activamos al darle el arma
    
if(g_primarias_activo[attacker])
    
        // aumentamos el daño de el arma que selecciono y para no trabajar con float, lo convertimos a entero
        
g_damage_weapon[attacker][g_primarias[attacker]] += floatround(damage)
    
// funcion para checkear el nivel y la seleccion(osea el arma que tiene)
    // cosa que no hace falta, realmente podria usarla en la funcion pero yo lo hice asi 
    
check_level_weapon(attacker,g_primarias[attacker])


luego nos vamos a: 
// Show HUD Task
public ShowHUD(taskid)
y lo reemplazamos por este

Código PHP:
// Show HUD Task
public ShowHUD(taskid)
{
    static 
id
    id 
ID_SHOWHUD;
    
    
// Player died?
    
if (!is_user_alive(id))
    {
        
// Get spectating target
        
id pev(idPEV_SPEC_TARGET)
        
        
// Target not alive
        
if (!is_user_alive(id)) return;
    }
    
    
// Format the classname
    
static class[32], redgreenblue
    
    
if (g_zombie[id]) // zombies
    
{
        
/* cambio el color del hud, el anterior era feo */
        
red 200 
        green 
250
        blue 
0
        
        
if (g_nemesis[id])
            
formatex(class, sizeof class - 1"%L"ID_SHOWHUD,"CLASS_NEMESIS")
        else
            
copy(class, sizeof class - 1g_zclass_name[g_zombieclass[id]])
    }
    else 
// humans
    
{
        
/* cambio el color del hud, el anterior era feo */
        
red 255
        green 
0
        blue 
255
        
        
if (g_survivor[id])
            
formatex(class, sizeof class - 1"%L"ID_SHOWHUD,"CLASS_SURVIVOR")
        else
            
formatex(class, sizeof class - 1"%L"ID_SHOWHUD,"CLASS_HUMAN")
    }
    
// str para imprimir el daño actual y daño restante para el siguiente nivel
    
new szDmgActual[15], szDmgRest[15]
    
// aca calculamos el costo del nivel anterior, eso nos va a devolver el daño acumulado que el usuario deberia tener en el nivel en el que esta
    // y le sumamos el daño que ya tiene en su variable g_damage_weapon
    
acortar(ammount_cost_level_weapons((g_nivel_weapon[id][g_primarias[id]]-1)) + g_damage_weapon[id][g_primarias[id]], szDmgActual15)
    
// luego para calcular el restante, obtenemos el daño que deberia tener para el nivel en el que esta, ( que vale aclarar QUE NO LO TIENE )
    // a este daño le restamos el daño del nivel anterior, asi obtenemos la diferencia que deberia haber entre el nivel en el que esta y el que le falta subir
    // y por ultimo le restamos el daño actual. Ejemplo
    // si es nivel 2, y para el nivel 2 el daño necesario es 120 PERO para el nivel 3 el daño necesario es 200, eso significa que le falta 80 de daño
    // pero como la variable g_damage no tiene TODO el daño hay que hacer este calculo rebuscado
    // nota: para el nivel 1 supongamos que necesitaria 60 de daño
    // seria: 120 - 60 - el daño actual
    // entonces la diferencia entre un nivel y otro nos queda de 60, y a ese 60 le vamos restando el daño que va acumulando
    
acortar(ammount_cost_level_weapons(g_nivel_weapon[id][g_primarias[id]]) - ammount_cost_level_weapons((g_nivel_weapon[id][g_primarias[id]]-1)) - g_damage_weapon[id][g_primarias[id]], szDmgRest15)
    
// variable auxiliar para imprimirle un string
    
new g_info_adicional[999]
    if(
g_primarias_activo[id]) // si eligio algun arma del menu: 
        
formatex(g_info_adicionalcharsmax(g_info_adicional), " - [Arma Actual: %s]^n - [Nivel: %d]^n - [Dmg Actual: %s]^n - [Dmg Rest: %s]^n",ARMAS[g_primarias[id]][ARMAS_NAME],g_nivel_weapon[id][g_primarias[id]],szDmgActual,szDmgRest)
    else
        
// sino :
        
formatex(g_info_adicionalcharsmax(g_info_adicional), " - Ningun arma seleccionada^n")
            
            
    
// Spectating someone else?
    
if (id != ID_SHOWHUD)
    {
        static 
name[32]
        
get_user_name(idnamesizeof name 1)
        
        
// Show name, health, class, and ammo packs
        // cambiamos las posiciones de ese hud por 0.8 para x, y 0.6 para y
        
set_hudmessage(2552552550.60.806.01.10.00.0, -1)
        
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync2" - %L %s^nHP: %d^n - %L %s^n - %L %d^n"ID_SHOWHUD"SPECTATING"namepev(idpev_health), ID_SHOWHUD"CLASS_CLASS", class, ID_SHOWHUD"AMMO_PACKS1"g_ammopacks[id])
    }
    else
    {
        
// Show health, class and ammo packs
        // cambiamos las posiciones de este hud por 0.1 para x, y 0.1 para y
        
set_hudmessage(redgreenblue0.10.106.01.10.00.0, -1)
                                
     // agregamos el %s para mostrar nuestra cadena
        
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync2" - %L: %d^n - %L %s^n - %L %d^n%s"id"ZOMBIE_ATTRIB1"pev(ID_SHOWHUDpev_health), ID_SHOWHUD"CLASS_CLASS", class, ID_SHOWHUD"AMMO_PACKS1"g_ammopacks[ID_SHOWHUD], g_info_adicional)
    }

ya por ultimo los stocks estos los ponen donde quieran
Código PHP:
stock check_level_weapon(idselection){
    if (
g_nivel_weapon[id][selection] <= 100// aca definiriamos el maximo nivel, pueden crear una variable global, en este caso yo elegi 100
    
{
        
// aca pedimos el costo del nivel anterior + el daño actual, si esto es mayor o igual al daño que se necesita para subir al nivel siguiente
        
if((ammount_cost_level_weapons((g_nivel_weapon[id][selection]-1)) + g_damage_weapon[id][selection]) >= ammount_cost_level_weapons(g_nivel_weapon[id][selection]))
        {
            
g_nivel_weapon[id][selection]++
            
client_print(idprint_center"Felicidades, subiste de nivel tu arma")
            
check_level_weapon(idselection
            
g_damage_weapon[id][selection] = // aca reinicio el daño a 0 para no sobrecargar esa variable con muchos bytes
            // y obtengo el daño total sumandole al g_damage_weapon el daño del nivel anterior. Ejemplo
            // si es nivel 2, supongamos que para estar en el nivel 2 el tendria que haber hecho de daño 120, pero su variable 
            // de daño esta en 0, entonces indirectamente tiene 120 de daño acumulado.
            // para calcular el daño restante seria cuestion de obtener el daño actual con esta formula
            // ammount_cost_level_weapons((g_nivel_weapon[id][selection]-1)) + g_damage_weapon[id][selection])
            // y ese daño, restarselo al daño necesario para el siguiente nivel
        
}
    }
    return 
PLUGIN_HANDLED
}
stock acortar(numszNum[], len// con acortador M, K
{
    if (
num <= -1000000 || num >= 1000000)
        
formatex(szNumlen"%.1fM"floatdiv(float(num), 1000000.0));
    else if (
num <= -1000 || num >= 1000)
        
formatex(szNumlen"%.1fK"floatdiv(float(num), 1000.0));
    else
        
num_to_str(numszNumlen);




Cita:Es la primera vez que publico, se puede hacer de mejor manera por supuesto, se podria trabajar con enum y asi relacionar mejor las variables, creo que esta es la mejor y mas sencilla manera para que se entienda la idea de como funcionaria un sistema como este ( segun yo )
Derechos de autor: HK-416 para el stock de acortar, y el menu de armas derechos al dueño, no se de donde lo aprendi , pero lo aprendi hace mucho tiempo de algun aporte o tutorial y me quede con esa idea de menus de armas


Dejo el zp con el sistema incorporado por si hicieron algo mal XD


Archivos adjuntos
.sma   Descargar AMXX / zombie_plague40.sma (Tamaño: 270.51 KB / Descargas: 6)
Solo se que no se nada Whatever
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)