31/08/2022, 04:22 PM
(Última modificación: 31/08/2022, 04:43 PM por aramayo123. Edited 3 times in total.)
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
Luego nos vamos a:
public plugin_precache()
y agregamos esto:
Despues a:
// Set Custom Weapon Models
public replace_models(id)
{
y agregamos esto:
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:
despues nos vamos a
// Buy Primary Weapon
buy_primary_weapon(id, selection)
y lo cambiamos por este:
Despues nos vamos a [Global Variables] y agregamos esto
Ahora seteamos las variables en 0
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:
luego nos vamos a:
// Show HUD Task
public ShowHUD(taskid)
y lo reemplazamos por este
ya por ultimo los stocks estos los ponen donde quieran
Dejo el zp con el sistema incorporado por si hicieron algo mal XD
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}
}
public plugin_precache()
y agregamos esto:
Código PHP:
for(i = 0 ; i < 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])
}
// 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(id, pev_viewmodel2, ARMAS[g_primarias[id]][ARMAS_MODELS_V])
if (!equal(ARMAS[g_primarias[id]][ARMAS_MODELS_P], "default"))
set_pev(id, pev_weaponmodel2, ARMAS[g_primarias[id]][ARMAS_MODELS_P])
}
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(id, random_num(0, sizeof g_primary_items - 1))
menu_buy2(id, random_num(0, sizeof 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(id, WPN_AUTO_PRI)
menu_buy2(id, WPN_AUTO_SEC)
return;
}
static menu[999], len, weap
len = 0
// Title
len += formatex(menu[len], sizeof menu - 1 - len, "\rArmamento Primario\d[%d-%d]^n^n", WPN_STARTID+1, min(WPN_STARTID+7, WPN_MAXIDS))
// 1-7. Weapon List
for (weap = WPN_STARTID; weap < min(WPN_STARTID+7, WPN_MAXIDS); weap++)
{
len += formatex(menu[len], sizeof menu - 1 - len, "\r%d\r. \w%s^n", weap-WPN_STARTID+1, ARMAS[weap][ARMAS_NAME])
}
len += formatex(menu[len], sizeof menu - 1 - len, "^n\r8.\w %s [\%s\w]", "Recodar Armamento", (WPN_AUTO_ON) ? "dSi" : "rNo")
len += formatex(menu[len], sizeof menu - 1 - len, "^n\r9.\w Siguiente^n^n\r0.\w Salir")
show_menu(id, KEYSMENU, menu, -1, "Buy Menu 1")
}
// Buy Primary Weapon
buy_primary_weapon(id, selection)
y lo cambiamos por este:
Código PHP:
// Buy Primary Weapon
buy_primary_weapon(id, selection)
{
// Drop previous weapons
drop_weapons(id, 1)
drop_weapons(id, 2)
// 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(id, ARMAS[selection][ARMAS_WEAPON])
fm_set_user_bpammo(id, weaponid, MAXBPAMMO[weaponid])
// Weapons bought
g_canbuy[id] = false
g_primarias[id] = selection // en esta variable guardaremos la seleccion
g_primarias_activo[id] = 1 // esta variable ya la explicare para que sirve
// Give additional items
static i
for (i = 0; i < sizeof g_additional_items; i++)
fm_give_item(id, g_additional_items[i])
}
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
Código PHP:
//Vamos a:
// Event Round Start
// public event_round_start()
//y agregamos esto
for(new i = 1; i <= g_maxplayers; i++)
{
g_primarias_activo[i] = 0 // 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] = 0 // seteamos en 0 cuando se conecte
for(new i = 0 ; i < WPN_MAXIDS ; i++){
g_nivel_weapon[id][i] = 1 // seteamos el nivel de las armas en 1
g_damage_weapon[id][i] = 0 // 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] = 0
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(4, damage *= (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(id, PEV_SPEC_TARGET)
// Target not alive
if (!is_user_alive(id)) return;
}
// Format the classname
static class[32], red, green, blue
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 - 1, g_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]], szDmgActual, 15)
// 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]], szDmgRest, 15)
// 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_adicional, charsmax(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_adicional, charsmax(g_info_adicional), " - Ningun arma seleccionada^n")
// Spectating someone else?
if (id != ID_SHOWHUD)
{
static name[32]
get_user_name(id, name, sizeof 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(255, 255, 255, 0.6, 0.8, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync2, " - %L %s^nHP: %d^n - %L %s^n - %L %d^n", ID_SHOWHUD, "SPECTATING", name, pev(id, pev_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(red, green, blue, 0.1, 0.1, 0, 6.0, 1.1, 0.0, 0.0, -1)
// agregamos el %s para mostrar nuestra cadena
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync2, " - %L: %d^n - %L %s^n - %L %d^n%s", id, "ZOMBIE_ATTRIB1", pev(ID_SHOWHUD, pev_health), ID_SHOWHUD, "CLASS_CLASS", class, ID_SHOWHUD, "AMMO_PACKS1", g_ammopacks[ID_SHOWHUD], g_info_adicional)
}
}
Código PHP:
stock check_level_weapon(id, selection){
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(id, print_center, "Felicidades, subiste de nivel tu arma")
check_level_weapon(id, selection)
g_damage_weapon[id][selection] = 0 // 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(num, szNum[], len) // con acortador M, K
{
if (num <= -1000000 || num >= 1000000)
formatex(szNum, len, "%.1fM", floatdiv(float(num), 1000000.0));
else if (num <= -1000 || num >= 1000)
formatex(szNum, len, "%.1fK", floatdiv(float(num), 1000.0));
else
num_to_str(num, szNum, len);
}
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
Solo se que no se nada

