Como no vi ningun tutorial de combos para zp y muchas personas preguntando por uno, lo cree. En fin, aca les dejo una forma de crear combos.
* No esta testeado.
* Lo habia creado para zp 4.2
* Si quieren los combos solo para uso sin niveles donde dice combo_next(%1, %2) ((g_combo[%1][combo] * %2) * 300 + (g_level[%1] * %2) * 20) lo reeemplazamos por combo_next(%1, %2) ((g_combo[%1][combo] * %2) * 300 + (g_ammopacks[%1] * %2) * 20).
* Por favor, si no les gusta no hagan comentarios fuera de lugar o innecesarios.
* Si hay lago mal por favor diganlo asi lo corregimos, este es mi primer tutorial.
1) Abrir el zombie_plague.sma. Abajo de los includes agregan
PHP Code:
/* Combo AmmoPack */
enum _: COMBO_DATA // hacemos un enum que usaremos en ves de crear muchas variables. El enum tendra:
{
Float:iDamage, // aca guardaremos el danio, el danio puede tener numeros decimales por eso le pondremos Float: adelante.
Hits, // aca guardaremos los hits del combo
Headshots, // aca guardaremos los headshots del combo
eInfo, // aca guardaremos el nivel de informacion de combo
Combo // aca guardaremos la cantidad de combos realizados
}
new g_combo[33][COMBO_DATA], g_combo_msg // Creamos 2 variables globales. La primera contiene todos los datos
// del combo. La segunda es el hud en el cual el combo se mostrará.
#define combo_next(%1,%2) ((g_combo[%1][Combo] * %2) * 300 + (g_ammopacks[%1] * %2) * 20) // la condicion para que el combo aumente.
new const combo_info[][] = { "Bien", "Muy Bien", "Excelente", "Increible", "Genial", "Espectacular!", "Impresionante!!", "Sorprendente!!!", "!!!Alucinante!!!", "¡¡¡¡¡GODLIKE!!!!!" }
// creamos un const para que nos muestre en el hud, segun el nivel de la variable g_combo[id][eInfo], la info
// eg: g_combo[id][eInfo] = 4 Nos mostrara "Increible".
#define TASK_COMBO 5678 // creamos el task del combo
#define FINISH_COMBO (taskid - TASK_COMBO)
Pueden cambiar lo que salga en el hud por donde dice combo_info.
2) Buscamos la funcion plugin_init() y abajo de g_MsgSync = CreateHudSyncObj(), agregamos
PHP Code:
g_combo_msg = CreateHudSyncObj() // aca creamos el hud
Nos quedaria..
PHP Code:
// Create the HUD Sync Objects
g_MsgSync = CreateHudSyncObj()
g_MsgSync2 = CreateHudSyncObj()
g_combo_msg = CreateHudSyncObj()
3) Al final de client putinserver y client disconnect agregamos:
PHP Code:
for (new i = 0; i < COMBO_DATA; i++) // creamos un loop para setear todas los datos guardados a 0.
g_combo[id][i] = 0 // los seteamos en 0
ClearSyncHud(id, g_combo_msg) // borramos el contenido de g_combo_msg
4) Buscamos el takedamage (el public donde se obtiene el danio echo-recibido). En el .sma esta como
fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type). Donde dice if (!g_zombie[attacker]), abajo agregamos
PHP Code:
// Combos
g_combo[attacker][iDamage] += floatround(damage) // acumulamos el danio
g_combo[attacker][Hits]++ // acumulamos los hits
if (get_pdata_int(victim, 75) == HIT_HEAD) // si el disparo fue en la cabeza
g_combo[attacker][Headshots]++ // aumentamos los headshots del combo
set_hudmessage(255, 0, 0, -1.0, 0.6, 0, 3.0, 3.0, 0.01, 0.01) // le decimos la preferencias de como salga el hud,
// en este caso saldra rojo y centrado.
ShowSyncHudMsg(attacker, g_combo_msg, "Combo de %d AmmoPacks^n%d | %f Daño | %d Hits | %d HeadShots", g_combo[attacker][Combo], combo_info[g_combo[attacker][eInfo]], g_combo[attacker][iDamage], g_combo[attacker][Hits], g_combo[attacker][Headshots])
// le mostramos los combos al usuario/atacante.
while (g_combo[attacker][iDamage] > combo_next(attacker, g_combo[attacker][Combo])) // si el combo es mayor a lo pedido entonces....
{
g_combo[attacker][Combo]++ // aumentamos el combo
if (g_combo[attacker][eInfo] < 11) // si la info del combo es menor a 11
while (g_combo[attacker][iDamage] > combo_next(attacker, g_combo[attacker][Combo])) // y si el combo es mayor a lo pedido entonces....
g_combo[attacker][eInfo]++ // aumentamos la informcaion de el combo
}
remove_task(attacker+TASK_COMBO) // removemos el task
set_task(4.0, "reset_combo", attacker+TASK_COMBO) // lo volvemos a llamar
Nos quedaria..
PHP Code:
// Attacker is human...
if (!g_zombie[attacker])
{
// Armor multiplier for the final damage on normal zombies
if (!g_nemesis[victim])
{
damage *= get_pcvar_float(cvar_zombiearmor)
SetHamParamFloat(4, damage)
}
// Combos
g_combo[attacker][iDamage] += floatround(damage) // acumulamos el danio
g_combo[attacker][Hits]++ // acumulamos los hits
if (get_pdata_int(victim, 75) == HIT_HEAD) // si el disparo fue en la cabeza
g_combo[attacker][Headshots]++ // aumentamos los headshots del combo
set_hudmessage(255, 0, 0, -1.0, 0.6, 0, 3.0, 3.0, 0.01, 0.01) // le decimos la preferencias de como salga el hud,
// en este caso saldra rojo y centrado.
ShowSyncHudMsg(attacker, g_combo_msg, "Combo de %d AmmoPacks^n%d | %f Daño | %d Hits | %d HeadShots", g_combo[attacker][Combo], combo_info[g_combo[attacker][eInfo]], g_combo[attacker][iDamage], g_combo[attacker][Hits], g_combo[attacker][Headshots])
// le mostramos los combos al usuario/atacante.
while (g_combo[attacker][iDamage] > combo_next(attacker, g_combo[attacker][Combo])) // si el combo es mayor a lo pedido (next_combo) entonces....
{
g_combo[attacker][Combo]++ // aumentamos el combo
if (g_combo[attacker][eInfo] < 11) // si la info del combo es menor a 11
while (g_combo[attacker][iDamage] > combo_next(attacker, g_combo[attacker][Combo])) // y si el combo es mayor a lo pedido entonces....
g_combo[attacker][eInfo]++ // aumentamos la informcaion de el combo
}
remove_task(attacker+TASK_COMBO) // removemos el task
set_task(4.0, "reset_combo", attacker+TASK_COMBO) // lo volvemos a llamar
// Reward ammo packs
if (!g_survivor[attacker] || !get_pcvar_num(cvar_survignoreammo))
{
// Store damage dealt
g_damagedealt[attacker] += floatround(damage)
// Get damage required to get an ammo pack
static ammodamage
ammodamage = get_pcvar_num(cvar_ammodamage)
// Reward ammo packs for every [ammo damage] dealt
while (g_damagedealt[attacker] >= ammodamage)
{
g_ammopacks[attacker]++
g_damagedealt[attacker] -= ammodamage
}
}
return HAM_IGNORED;
}
5) Por ultimo, vamos al final del zp y agregamos
PHP Code:
public reset_combo(taskid) // aca se termina el combo
{
static id, gBonificacion
id = FINISH_COMBO
gBonificacion = ((g_combo[id][Combo] * 2) * g_combo[id][eInfo]) // esta bonificacion es un ejemplo, le
// pueden poner como se les ocurra. Aca daria: si el combo es de 20. 20*2= 40*11= 440. Le daria 440 ammopacks extras
set_hudmessage(255, 255, 255, -1.0, 0.11, 0, 6.0, 5.0)// le decimos la preferencias de como salga el hud de
// finalizacion de combo, en este caso saldra blanco.
ShowSyncHudMsg(id, g_combo_msg, "Combo %d Finalizado!^nExtra de %d AmmoPacks^n", g_combo[id][Combo], g_combo[id][Combo] * 2)
// le mostramos la bonificacion al usuario.
for (new i = 0; i < COMBO_DATA; i++) // Creamos un loop para setear todas los datos guardados a 0.
g_combo[id][i] = 0 // los seteamos en 0
ClearSyncHud(id, g_combo_msg) // borramos el contenido de g_combo_msg
/*check_level(id)*/
// En este lugar tienen que poner el public donde checkean el nivel si es que tienen, sino agregan
// g_ammopacks[id] += gBonificacion
}
Creditos:
Neeeeeeeeeeeel.- -> vi una parte de combo_info en un post y la adapte
fearAR -> por el tut de macros y apartir de ahí creee el combo_next
L//
Les dejo un zp con combos ya puestos, ese zp no tiene niveles asique reemplaze las partes que dice g_level por g_ammopacks.