Buenas tardes y noches para todos
Hoy les vengo a presentar esta guia de "Como crear un modo para ZP Grupal".. La idea es que sepan mas o menos la idea de como hacerlo.. Ya que he visto muchas consultas y ayudas sobre esto
Asi que bueno vamos a empezar con esto:
NOTA: Esto va a estar dividido por Pasos (Spoilers) Asi es mas comodo y facil de leer..
Crear un modo Grupal (Modo Armageddon):
- Primer paso: Creamos las variables y constantes correspondientes (Sounds, round, cvars, etc)
- Segundo paso: Precachamos el sonido
- Tercer paso: Agregamos comandos y cvars
- Cuarto paso: Seteamos la variable g_armaround
- Quinto paso: Ahora agregamos las funciones del comando
- Sexto paso: Agregamos codigos adicionales (Para evitar bugs)
Buenisimo ya terminamos de como crear modos grupales.. Mas adelante voy a hacer otro pero para hacer modos Individuales.. Que es un poco mas complejo pero es mas facil
Si tienen alguna duda.. Diganmela y si hay algun bug mas que les trae, se lo agregmaos a la guia sin problemas
Y si tienen problemas depende la version de su ZP lo comentamos.. Pienso que es adaptable para cualquier Version ya que no afecta demasiado..
Espero que les sirva.. Saludos :3
Hoy les vengo a presentar esta guia de "Como crear un modo para ZP Grupal".. La idea es que sepan mas o menos la idea de como hacerlo.. Ya que he visto muchas consultas y ayudas sobre esto
Asi que bueno vamos a empezar con esto:
NOTA: Esto va a estar dividido por Pasos (Spoilers) Asi es mas comodo y facil de leer..
Crear un modo Grupal (Modo Armageddon):
- Primer paso: Creamos las variables y constantes correspondientes (Sounds, round, cvars, etc)
Agregamos:
Quedaria:
Ahora agregamos:
Quedaria
Ahora agregamos:
Quedaría:
Ahora agregamos:
Quedaría:
Código PHP:
new const sound_arma[][] = { "zombie_plague/survivor1.wav" }
Código PHP:
new const sound_plague[][] = { "zombie_plague/nemesis1.wav", "zombie_plague/survivor1.wav" }
new const sound_arma[] = { "zombie_plague/survivor1.wav" }
new const grenade_infect[] = { "zombie_plague/grenade_infect.wav" }
Ahora agregamos:
Código PHP:
MODO_ARMA
Código PHP:
enum
{
MODE_NONE = 0,
MODE_INFECTION,
MODE_NEMESIS,
MODE_SURVIVOR,
MODE_SWARM,
MODE_MULTI,
MODE_PLAGUE,
MODE_ARMA
}
Ahora agregamos:
Código PHP:
new g_armaround
Código PHP:
new g_plagueround // plague round
new g_armaround
new g_lastmode // last played mode
Ahora agregamos:
Código PHP:
cvar_arma, cvar_armachance, cvar_armaminplayer, cvar_armaratio, cvar_armahpsurvi, cvar_armahpneme
Código PHP:
cvar_nvgcolor[3], cvar_nemnvgcolor[3], cvar_humnvgcolor[3], cvar_flashcolor[3],
cvar_arma, cvar_armachance, cvar_armaminplayer, cvar_armaratio, cvar_armahpsurvi, cvar_armahpneme
Agregamos en plugin_precache
Quedaría:
Código PHP:
engfunc(EngFunc_PrecacheSound, sound_arma)
Código PHP:
for (i = 0; i < sizeof sound_plague; i++)
engfunc(EngFunc_PrecacheSound, sound_plague[i])
engfunc(EngFunc_PrecacheSound, sound_arma)
for (i = 0; i < sizeof grenade_infect; i++)
engfunc(EngFunc_PrecacheSound, grenade_infect[i])
Agregamos en (plugin_init):
Quedaría:
Ahora agregamos:
Quedaría:
Código PHP:
register_concmd("zp_arma", "CmdArma", ADMIN_BAN, " - Comienzo del Modo Armageddon")
Código PHP:
register_concmd("zp_plague", "cmd_plague", ADMIN_BAN, " - Start Plague Mode")
register_concmd("zp_arma", "CmdArma", ADMIN_BAN, " - Comienzo del Modo Armageddon")
Ahora agregamos:
Código PHP:
// Cvar - Armageddon mode
cvar_arma = register_cvar("zp_arma_enable", "1")
cvar_armachance = register_cvar("zp_arma_chance", "40")
cvar_armaminplayer = register_cvar("zp_arma_min_player", "0")
cvar_armaratio = register_cvar("zp_arma_ratio", "1.5")
cvar_armahpsurvi = register_cvar("zp_arma_hp_survi", "250")
cvar_armahpneme = register_cvar("zp_arma_hp_neme", "2500")
Código PHP:
// CVARS - Plague Mode
cvar_plague = register_cvar("zp_plague_enabled", "1")
cvar_plaguechance = register_cvar("zp_plague_chance", "30")
cvar_plagueminplayers = register_cvar("zp_plague_min_players", "0")
cvar_plagueratio = register_cvar("zp_plague_ratio", "0.5")
cvar_plaguenemnum = register_cvar("zp_plague_nem_number", "1")
cvar_plaguenemhpmulti = register_cvar("zp_plague_nem_hp_multi", "0.5")
cvar_plaguesurvnum = register_cvar("zp_plague_surv_number", "1")
cvar_plaguesurvhpmulti = register_cvar("zp_plague_surv_hp_multi", "0.5")
// Cvar - Armageddon mode
cvar_arma = register_cvar("zp_arma_enable", "1")
cvar_armachance = register_cvar("zp_arma_chance", "40")
cvar_armaminplayer = register_cvar("zp_arma_min_player", "0")
cvar_armaratio = register_cvar("zp_arma_ratio", "1.5")
cvar_armahpsurvi = register_cvar("zp_arma_hp_survi", "250")
cvar_armahpneme = register_cvar("zp_arma_hp_neme", "2500")
Agregamos en (event_round_start):
Quedaría:
Ahora agregamos en (make_a_zombie):
Quedaria:
Ahora agregamos (De nuevo en make_a_zombie)
Quedaría:
ACLARACIÓN: Aquí en: fm_set_user_health(id, get_pcvar_num(cvar_armahpneme)*fnGetAlive())
Sería la vida multiplicada por la cantidad de usuarios vivos..
Ejemplo: 2500 (Vida base de la cvar) * 12 (Cantidad de usuarios vivos, puede ser cualquier número menor a 32 [Cantidad maxima de jugadores]) = 30000 (Vida que vas a tener siendo nemesis)
Código PHP:
g_armaround = false
Código PHP:
public event_round_start()
{
// New round starting
g_newround = true
g_endround = false
g_survround = false
g_nemround = false
g_swarmround = false
g_plagueround = false
g_armaround = false
// code code y mas code
}
Ahora agregamos en (make_a_zombie):
Código PHP:
g_armaround = false
Código PHP:
make_a_zombie(mode, id)
{
// code code y mas code
// Get prevent consecutive modes setting
static preventconsecutive
preventconsecutive = get_pcvar_num(cvar_preventconsecutive)
// Round starting
g_newround = false
g_survround = false
g_nemround = false
g_swarmround = false
g_plagueround = false
g_armaround = false
// code code y mas code
}
Ahora agregamos (De nuevo en make_a_zombie)
Código PHP:
else if ((mode == MODE_NONE && (!preventconsecutive || g_lastmode != MODE_ARMA) && random_num(1, get_pcvar_num(cvar_armachance)) == get_pcvar_num(cvar_arma) && floatround((iPlayersnum-2)*get_pcvar_float(cvar_armaratio), floatround_ceil) >= 1 && iPlayersnum >= get_pcvar_num(cvar_armaminplayer)) || mode == MODE_ARMA)
{
g_armaround = true
g_lastmode = MODE_ARMA
static iMaxNemesis
iMaxNemesis = (iPlayersnum / 2)
while (fnGetNemesis() < iMaxNemesis)
{
id = fnGetRandomAlive(random_num(1, iPlayersnum))
if (!is_user_alive(id) || g_nemesis[id]) continue;
zombieme(id, 0, 1, 0)
fm_set_user_health(id, get_pcvar_num(cvar_armahpneme)*fnGetAlive())
}
for (id = 1; id <= g_maxplayers; id++)
{
if (!is_user_alive(id)) continue;
if (g_nemesis[id] || g_survivor[id]) continue;
humanme(id, 1)
fm_set_user_health(id, get_pcvar_num(cvar_armahpsurvi)*fnGetAlive())
}
PlaySound(sound_arma);
set_hudmessage(255, 255, 255, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
ShowSyncHudMsg(0, g_MsgSync, "¡¡ ARMAGEDDON !!")
ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_ARMA, 0);
}
Código PHP:
// Round start forward
ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_SURVIVOR, forward_id);
}
else if ((mode == MODE_NONE && (!preventconsecutive || g_lastmode != MODE_ARMA) && random_num(1, get_pcvar_num(cvar_armachance)) == get_pcvar_num(cvar_arma) && floatround((iPlayersnum-2)*get_pcvar_float(cvar_armaratio), floatround_ceil) >= 1 && iPlayersnum >= get_pcvar_num(cvar_armaminplayer)) || mode == MODE_ARMA)
{
g_armaround = true
g_lastmode = MODE_ARMA
static iMaxNemesis
iMaxNemesis = (iPlayersnum / 2)
while (fnGetNemesis() < iMaxNemesis)
{
id = fnGetRandomAlive(random_num(1, iPlayersnum))
if (!is_user_alive(id) || g_nemesis[id]) continue;
zombieme(id, 0, 1, 0)
fm_set_user_health(id, get_pcvar_num(cvar_armahpneme)*fnGetAlive())
}
for (id = 1; id <= g_maxplayers; id++)
{
if (!is_user_alive(id)) continue;
if (g_nemesis[id] || g_survivor[id]) continue;
humanme(id, 1)
fm_set_user_health(id, get_pcvar_num(cvar_armahpsurvi)*fnGetAlive())
}
PlaySound(sound_arma);
set_hudmessage{255, 255, 255, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1)
ShowSyncHudMsg(0, g_MsgSync, "¡¡ ARMAGEDDON !!")
ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_ARMA, 0);
}
Sería la vida multiplicada por la cantidad de usuarios vivos..
Ejemplo: 2500 (Vida base de la cvar) * 12 (Cantidad de usuarios vivos, puede ser cualquier número menor a 32 [Cantidad maxima de jugadores]) = 30000 (Vida que vas a tener siendo nemesis)
Agregamos:
Quedaria:
Ahora agregamos:
Quedaría:
Ahora agregamos:
Quedaria:
Código PHP:
// zp_arma
public CmdArma(id, level, cid)
{
if (!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED;
if (!allowed_arma()) return PLUGIN_HANDLED;
EjecutarArmadeggon(id)
return PLUGIN_HANDLED;
}
Código PHP:
// zp_plague
public cmd_plague(id, level, cid)
{
// Check for access flag
if (!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED;
// Plague mode not allowed
if (!allowed_plague())
{
client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
return PLUGIN_HANDLED;
}
command_plague(id)
return PLUGIN_HANDLED;
}
// zp_arma
public CmdArma(id, level, cid)
{
if (!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED;
if (!allowed_arma()) return PLUGIN_HANDLED;
EjecutarArmadeggon(id)
return PLUGIN_HANDLED;
}
Ahora agregamos:
Código PHP:
allowed_arma()
{
if (g_endround || !g_newround || !get_pcvar_num(cvar_arma) || task_exists(TASK_WELCOMEMSG) || fnGetAlive() < get_pcvar_num(cvar_armaminplayer))
return false;
return true;
}
Código PHP:
allowed_plague()
{
if (g_endround || !g_newround || !get_pcvar_num(cvar_plague) || task_exists(TASK_WELCOMEMSG) || floatround((fnGetAlive()-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_float(cvar_plagueratio), floatround_ceil) < 1
|| fnGetAlive()-(get_pcvar_num(cvar_plaguesurvnum)+get_pcvar_num(cvar_plaguenemnum)+floatround((fnGetAlive()-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_float(cvar_plagueratio), floatround_ceil)) < 1 || fnGetAlive() < get_pcvar_num(cvar_plagueminplayers))
return false;
return true;
}
allowed_arma()
{
if (g_endround || !g_newround || !get_pcvar_num(cvar_arma) || task_exists(TASK_WELCOMEMSG) || fnGetAlive() < get_pcvar_num(cvar_armaminplayer))
return false;
return true;
}
Ahora agregamos:
Código PHP:
// Admin Command. zp_arma
EjecutarArmadeggon(id)
{
static name1[32]
get_user_name(id, name1, sizeof name1 - 1)
// Show activity?
switch (get_pcvar_num(cvar_showactivity))
{
case 1: client_print(0, print_chat, "ADMIN - Comenzo: Modo Armageddon")
case 2: client_print(0, print_chat, "ADMIN %s - Ha iniciado el Modo Armageddon", name1)
}
// Log to Zombie Plague log file?
if (get_pcvar_num(cvar_logcommands))
{
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - Comenzo: Modo Armageddon (Players: %d/%d)", name1, authid, ip, fnGetPlaying(), g_maxplayers)
log_to_file("zombieplague.log", logdata)
}
remove_task(TASK_MAKEZOMBIE)
make_a_zombie(MODE_ARMA, 0)
}
Código PHP:
// Admin Command. zp_plague
command_plague(id)
{
static name1[32]
get_user_name(id, name1, sizeof name1 - 1)
// Show activity?
switch (get_pcvar_num(cvar_showactivity))
{
case 1: client_print(0, print_chat, "ADMIN - %L", LANG_PLAYER, "CMD_PLAGUE")
case 2: client_print(0, print_chat, "ADMIN %s - %L", name1, LANG_PLAYER, "CMD_PLAGUE")
}
// Log to Zombie Plague log file?
if (get_pcvar_num(cvar_logcommands))
{
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - %L (Players: %d/%d)", name1, authid, ip, LANG_SERVER,"CMD_PLAGUE", fnGetPlaying(), g_maxplayers)
log_to_file("zombieplague.log", logdata)
}
// Call Plague Mode
remove_task(TASK_MAKEZOMBIE)
make_a_zombie(MODE_PLAGUE, 0)
}
// Admin Command. zp_arma
EjecutarArmadeggon(id)
{
static name1[32]
get_user_name(id, name1, sizeof name1 - 1)
// Show activity?
switch (get_pcvar_num(cvar_showactivity))
{
case 1: client_print(0, print_chat, "ADMIN - Comenzo: Modo Armageddon")
case 2: client_print(0, print_chat, "ADMIN %s - Ha iniciado el Modo Armageddon", name1)
}
// Log to Zombie Plague log file?
if (get_pcvar_num(cvar_logcommands))
{
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - Comenzo: Modo Armageddon (Players: %d/%d)", name1, authid, ip, fnGetPlaying(), g_maxplayers)
log_to_file("zombieplague.log", logdata)
}
remove_task(TASK_MAKEZOMBIE)
make_a_zombie(MODE_ARMA, 0)
}
Ahora agregamos en (fw_takedamage)
Quedaria asi:
EXPLICACION: Esto es para evitar infectarse, o ser infectado.. Esto es inecesario, pero para prevenir bugs lo agregamos.
Ahora agregamos en (buy_extra_item)
Quedaría:
EXPLICACION: Esto es para que ningun Survivor o Nemesis pueda comprar items extras.. Asi evitars bugs y desventajas o ventajas en el juego
Ahora agregamos en (message_teaminfo)
Y tambien agregaremos
Quedaria asi:
EXPLICACION: Esto es importante a la hora de conectarse y siendo que es modo ARMAGEDDON.. Si un usuario se conecta durante el modo en curso.. No lo va a spawnear. Asi para evitar bugs. Ya que sin esto. Al entrar con el modo en curso, te spawnearia siendo Zombie y entorpeceria el juego. Mejor setear la variable, siendo modo armageddon, "g_respawn_as_zombie" en false
Ahora agregamos en (respawn_player)
Quedaria:
EXPLICACION: Esto es para que en el modo no respawneemos todo el tiempo, asi que si quieren que el modo sea respawneando, no hace falta agregarlo, pero lo mas comun de un Modo ARMAGEDDON es agregar esto para evitarlo
Ahora agregamos en (allowed_respawn(id))
Quedaria asi:
EXPLICACION: Aca es como lo de arriba.. Es para evitar respawnear o que respawnee un player en el modo
Ahora al final del plugin agregamos esto
Código PHP:
|| g_armaround
Código PHP:
if (g_swarmround || g_plagueround || g_armaround || fnGetHumans() == 1) return HAM_IGNORED;
EXPLICACION: Esto es para evitar infectarse, o ser infectado.. Esto es inecesario, pero para prevenir bugs lo agregamos.
Ahora agregamos en (buy_extra_item)
Código PHP:
|| g_armaround
Código PHP:
// Check for hard coded items with special conditions
if ((itemid == EXTRA_ANTIDOTE && (g_endround || g_swarmround || g_armaround || g_nemround || g_survround || g_plagueround || fnGetZombies() <= 1 || (get_pcvar_num(cvar_deathmatch) && !get_pcvar_num(cvar_respawnafterlast) && fnGetHumans() == 1))) || (itemid == EXTRA_MADNESS && g_nodamage[id]) || (itemid == EXTRA_INFBOMB && (g_endround || g_swarmround || g_armaround || g_nemround || g_survround || g_plagueround)))
{
zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_CANTUSE")
return;
}
EXPLICACION: Esto es para que ningun Survivor o Nemesis pueda comprar items extras.. Asi evitars bugs y desventajas o ventajas en el juego
Ahora agregamos en (message_teaminfo)
Código PHP:
else if (g_armaround && fnGetZombies()) g_respawn_as_zombie[id] = false;
Código PHP:
else if (g_armaround && fnGetHumans()) g_respawn_as_zombie[id] = false;
Código PHP:
switch (team[0])
{
case 'C': // CT
{
if (g_survround && fnGetHumans()) // survivor alive --> switch to T and spawn as zombie
{
g_respawn_as_zombie[id] = true;
remove_task(id+TASK_TEAM)
fm_set_user_team(id, CS_TEAM_T)
set_msg_arg_string(2, "TERRORIST")
}
else if (g_armaround && fnGetZombies()) g_respawn_as_zombie[id] = false;
else if (!fnGetZombies()) // no zombies alive --> switch to T and spawn as zombie
{
g_respawn_as_zombie[id] = true;
remove_task(id+TASK_TEAM)
fm_set_user_team(id, CS_TEAM_T)
set_msg_arg_string(2, "TERRORIST")
}
}
case 'T': // Terrorist
{
if ((g_swarmround || g_survround) && fnGetHumans()) // survivor alive or swarm round w/ humans --> spawn as zombie
{
g_respawn_as_zombie[id] = true;
}
else if (g_armaround && fnGetHumans()) g_respawn_as_zombie[id] = false;
else if (fnGetZombies()) // zombies alive --> switch to CT
{
remove_task(id+TASK_TEAM)
fm_set_user_team(id, CS_TEAM_CT)
set_msg_arg_string(2, "CT")
}
}
}
EXPLICACION: Esto es importante a la hora de conectarse y siendo que es modo ARMAGEDDON.. Si un usuario se conecta durante el modo en curso.. No lo va a spawnear. Asi para evitar bugs. Ya que sin esto. Al entrar con el modo en curso, te spawnearia siendo Zombie y entorpeceria el juego. Mejor setear la variable, siendo modo armageddon, "g_respawn_as_zombie" en false
Ahora agregamos en (respawn_player)
Código PHP:
&& !g_armaround
Código PHP:
if (!g_endround && !g_survround && !g_swarmround && !g_armaround && !g_nemround && !g_plagueround && team != CS_TEAM_SPECTATOR && team != CS_TEAM_UNASSIGNED && !is_user_alive(ID_SPAWN))
EXPLICACION: Esto es para que en el modo no respawneemos todo el tiempo, asi que si quieren que el modo sea respawneando, no hace falta agregarlo, pero lo mas comun de un Modo ARMAGEDDON es agregar esto para evitarlo
Ahora agregamos en (allowed_respawn(id))
Código PHP:
|| g_armaround
Código PHP:
if (g_endround || g_survround || g_swarmround || g_armaround || g_nemround || g_plagueround || team == CS_TEAM_SPECTATOR || team == CS_TEAM_UNASSIGNED || !is_user_connected(id) || is_user_alive(id))
EXPLICACION: Aca es como lo de arriba.. Es para evitar respawnear o que respawnee un player en el modo
Ahora al final del plugin agregamos esto
Código PHP:
fnGetNemesis()
{
new iNeme = 0, i
for (i = 1; i <= g_maxplayers; i++) if (is_user_alive(id)) iNeme++
return iNeme;
}
Buenisimo ya terminamos de como crear modos grupales.. Mas adelante voy a hacer otro pero para hacer modos Individuales.. Que es un poco mas complejo pero es mas facil
Si tienen alguna duda.. Diganmela y si hay algun bug mas que les trae, se lo agregmaos a la guia sin problemas
Y si tienen problemas depende la version de su ZP lo comentamos.. Pienso que es adaptable para cualquier Version ya que no afecta demasiado..
Espero que les sirva.. Saludos :3
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Contactarme vía Discord >>> AtselTV#8202