Buenas a todos
Bueno como lo indiqué en el anterior tutorial sobre modos grupales ahora voy a mostrarles y explicarles sobre los modos individuales, tipo survivor o némesis, etceterita
Bueno, vamos a hacer algo rápido y fácil de hacer, vamos a armar el modo sniper. Vamos a hacer el modo de la siguiente manera y voy a hacer de cuenta que ustedes saben lo básico de pawn.
El modo consiste en un humano (Sniper) con su awp
Le seteamos su vida, velocidad, gravedad, etc. Y demás cosas
Vamos a darle :$...
1er paso: Creamos las variables, sonidos, models, etc xD
2do paso: Vamos a las funciones plugin_ donde registramos cada comando para el modo.
3er paso: Seteamos la variable g_sniperround
4to paso: Seteamos valores de g_sniper, condiciones, etc
5to paso: Agregamos la funciones del comando
Bueno ya he terminado hasta aquí son 4 simples pero complicados pasos ! Jejeje ! Espero que les haya servido
Y para cualquier cosa, algo mal explicado, expresado, o falta algo, me dicen
Gracias a todos
Bueno como lo indiqué en el anterior tutorial sobre modos grupales ahora voy a mostrarles y explicarles sobre los modos individuales, tipo survivor o némesis, etceterita
Bueno, vamos a hacer algo rápido y fácil de hacer, vamos a armar el modo sniper. Vamos a hacer el modo de la siguiente manera y voy a hacer de cuenta que ustedes saben lo básico de pawn.
El modo consiste en un humano (Sniper) con su awp
Le seteamos su vida, velocidad, gravedad, etc. Y demás cosas
Vamos a darle :$...
Modo Sniper
1er paso: Creamos las variables, sonidos, models, etc xD
Código PHP:
new const ModelSniper[] = "zp_sniper"; /* Supongamosle que tenemos el model del sniper (Model player) llamado zp_sniper
Y si queremos podemos cambiar el model por el que nosoros queramos
Si queremos que tenga mas models, tenemos que cambiar lo siguiente
new const ModelSniper[][] = { "zp_sniper", "zp_sniper2" }; */
new const ModelWeaponSniper[] = "v_sniperawp"; /* Bueno esto es OPCIONAL para todos, si quieres que tenga algun model en especifico el arma, agregamos esta linea.
Si queremos que tenga mas models, vean lo que expliqué arriba */
new const SoundSniper[] = "zombie_plague/zp_sniper"; /* Sonido que se reproduce en el momento que se lanza el modo
Si queremos más sonidos, miremos arriba O.o */
/* Vamos al enum donde se encuentra MODE_NONE = 0, y agregamos */
MODE_SNIPER
/* Recuerda que el anterior al que agregaste (MODE_SNIPER), tiene que llevar una coma al final para que pueda compilarse bien */
new g_sniper[33]; // Variable del jugador para identificar si ese es sniper
new g_sniperround; // Variable global en donde sabemos si la ronda es sniper
/* Vamos a donde se encuentran todas las cvars y agregamos las siguiente para el modo sniper */
cvar_sniper, /* Para que se ejecute el modo */
cvar_sniperchance, /* Posibilidad para que salga le modo (Tiene relación con la cvar anterior) */
cvar_sniperminplayer, /* Cantidad de jugadores MINIMA para que se ejecute el modo */
cvar_sniperhp, /* Vida base del sniper */
cvar_sniperspd, /* Velociada base del sniper */
cvar_snipergvt, /* Gravedad base del sniper */
cvar_sniperdamage, /* Daño del sniper */
cvar_sniperaura, /* Aura del sniper (Con esto verificamos si queremos que tenga aura) */
cvar_sniperglow, /* Glow del sniper (Con esto verificamos si queremos que tenga glow */
cvar_sniperpainfree; /* Verificamos para que el sniper tenga o no Pain shock free */
Código PHP:
/* Esto es OPCIONAL para todos, si quieren no lo agregan, vamos a plugin_native(); y agregamos */
register_native("zp_get_user_sniper", "native_get_user_sniper", 1); /* Registramos la native para cuando usemos un plugin aparte,
y queramos saber si el usuario es sniper, esto hace la magia :D */
register_native("zp_get_round_sniper", "native_get_round_sniper", 1); */
Registramos la nativa cuando es RONDA sniper */
/* Al final del plugin agregamos la función de la native */
public native_get_user_sniper(id)
return g_sniper[id]; // Devuelve el valor del jugador (id) cuando es sniper
public native_get_round_sniper()
return g_sniperround;
/* Vamos a plugin_precache(); y agregamos lo siguiente */
formatex(playermodel, charsmax(playermodel), "models/player/%s/%s.mdl", ModelSniper, ModelSniper);
if (file_exists(playermodel)) precache_model(playermodel);
/* Usen este loop para cuando usan mas de un model, tal como lo expliqué con el tema del new const ModelSniper[][] = { "", "" };
for (i = 0; i < sizeof(ModelSniper); i++)
{
formatex(playermodel, charsmax(playermodel), "models/player/%s/%s.mdl", ModelSniper[i], ModelSniper[i]);
if (file_exists(playermodel)) precache_model(playermodel[i]);
} */
/* Bueno simplemente aquí precachamos el model del sniper.
Guardamos en la variable-string "playermodel" (Ya creada en el ZP),
y lo precachamos y con la condición de que si el archivo existe, entonces lo precachamos */
/* También pueden hacerlo de la manera como está tal cual en el ZP, que sería engfunc (engfunc(EngFunc_PrecacheModel, playermodel[i]); */
formatex(playermodel, charsmax(playermodel), "models/zombie_plague/%s.mdl", ModelWeaponSniper);
if (file_exists(playermodel)) precache_model(playermodel);
/* Esto tal como dije arriba si usamos mas de un model de algun arma
for (i = 0; i < sizeof(ModelWeaponSniper); i++)
{
formatex(playermodel, charsmax(playermodel), "models/zombie_plague/%s.mdl", ModelWeaponSniper[i]);
if (file_exists(playermodel)) precache_model(ModelWeaponSniper[i]);
} */
/* Precachamos el model del arma del sniper, pueden hacer como expliqué arriba */
if (file_exists(SoundSniper)) precache_sound(SoundSniper);
/* for (i = 0; i < sizeof(SoundSniper); i++)
if (file_exists(SoundSniper[i])) precache_sound(SoundSniper[i]); */
/* Precachamos el sonido cuando comienza el modo sniper, como expliqué arriba, pueden usar también (EngFunc_PrecacheSound) */
/* Vamos a plugin_init(); y agregamos lo siguiente */
register_concmd("zp_sniper", "cmdSniper", ADMIN_BAN, "<Target> Sleccionamos al jugador para que sea sniper");
/* Registramos el comando (Por consola) para convertir a un jugador en sniper (Solo los admines cuyo flag es ADMIN_BAN [Flag b]) */
// CVAR - Sniper mode
cvar_sniper = register_cvar("zp_sniper_enabled", "1");
cvar_sniperchance = register_cvar("zp_sniper_chance", "45");
cvar_sniperminplayer = register_cvar("zp_sniper_min_player", "5");
cvar_sniperhp = regsiter_cvar("zp_sniper_health", "3500");
cvar_sniperspd = register_cvar("zp_sniper_speed", "300");
cvar_snipergvt = register_cvar("zp_sniper_gravity", "0.7");
cvar_sniperdamage = register_cvar("zp_sniper_damage", "25.0");
cvar_sniperaura = register_cvar("zp_sniper_aura", "1");
cvar_sniperglow = register_cvar("zp_sniper_glow", "1");
cvar_sniperpainfree = register_cvar("zp_sniper_painshock_free", "0");
Código PHP:
/* Vamos a event_round_start(); y agregamos */
g_sniperround = false; // Cuando comienza una nueva ronda, seteamos la ronda sniper en falsa
/* Vamos a buy_extra_item(id, itemid); y agregamos */
g_sniperround /* Esto lo agregamos en las condiciones donde se "restringe" las variables
cuando sale algún modo y no se puedan comprar items. Cosa para que quede así */
if (itemid == EXTRA_ANTIDOTE /* código blablabal */ || g_survround || g_sniperround || /* mas código blablabla */
/* Y así con las demas que tengan las variables de las rondas para restringir los items. */
/* Vamos a message_teaminfo(); y hacemos lo mismo que en la anterior agregamos */
g_sniperround // Va en las condiciones donde está
case 'T': // Terrorist
/* Al lado de g_survround, ponemos nuestra variable */
/* Vamos a make_zombie(); y agregamos lo siguienteeeeeeee D: */
else if ((mode == MODE_NONE && (!get_pcvar_num(cvar_preventconsecutive) || g_lastmode != MODE_SNIPER) && random_num(1, get_pcvar_num(cvar_sniperchance)) == get_pcvar_num(cvar_sniper) && iPlayersnum >= get_pcvar_num(cvar_sniperminplayer)) || mode == MODE_SNIPER)
/* Esto lo agregamos debajo de la llave donde está el modo survivor */
/* Esta condición indica si el modo es "ninguno",
es decir, si no hay ningún modo en curso Y la cvar de prevención de modo es 0
O la variable g_lastmode no es la del modo sniper
Y elige un numero del 1 al número que contiene la cvar sniperchance y eso es igual al número de la cvar sniper
Y si la variable iPlayersnum es mayor a la cantidad minima guardada en la cvar minplayer O el modo es sniper */
/* Capaz que es poco endendible pero así podemos leer la condición para ejecutar el modo */
{
g_sniperround = true; // Seteamos la variable de la ronda en true
g_lastmode = MODE_SNIPER; // Seteamos la variable el valor del modo sniper
if (mode == MODE_NONE) id = fnGetRandomAlive(random_num(1, iPlayersnum)); // Si no hay modo, elegimos un valor en el id del 1 a la cantidad de jugadores vivos para seleccionar un jugador al azar
forward_id = id; // Seteamos el valor del id en la variable estática
humanme(id, 2); // Llamamos a la función humanme para convertir al jugador en sniper (Si usas ZP v4.3 pones humanme(id, 2, 0);
for (id = 1; id <= g_maxplayers; id++)
{
if (!is_user_alive(id)) continue; // Si entre la cantidad de jugadores en el servidor, hay un jugador muerto, retorna y continua
if (g_sniper[id] || g_zombie[id]) continue; // Si entre la cantidad de jugadores en el servidor, ya hay un sniper y ya hay zombies, retorna y continue
/* La segunda condición donde está g_zombie[id], es para que cuando los convierte en zombie, y ya hay zombies, no convierta al mismo jugador en zombie, es para evitar bugs sobre los jugadores y que otros jugadores sean humanos por "accidente" */
zombieme(id, 0, 0, 1); // Llamamos la función zombieme para convertir al jugador o jugadores en zombies (Si usas ZP v4.3 usas zombieme(id, 0, 0, 1, 0);
}
PlaySound(SoundSniper[random_num(0, charsmax(SoundSniper))]); // Ejecutamos el sonido cuando sale el modo sniper
static iName[32];
get_user_name(forward_id, iName, charsmax(iName)); // Guardamos el nombre del jugador convertido en sniper
set_hudmessage(20, 255, 255, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 5.0, 1.0, 1.0, -1); // Seteamos el HUD, en color amarillo cuando sale el modo
ShowSyncHudMsg(0, g_MsgSync, "¡ %s ES SNIPER ! ", iName); // Muestra el HUD del jugador convertido
/* Si usan ZP v4.3, reemplazan iName por g_playername[forward_id] */
ExecuteForward(g_fwRoundStart, g_fwDummyResult, MODE_SNIPER, forward_id); // Ejecutamos la forward cuando sea modo sniper.
}
/* Vamos a respawn_player(); (Si usas v4.3 es respawn_player_task) y agregamos lo siguiente */
!g_sniperround
/* Esto lo agregamos en la condición donde se encuentran las variables de las rondas (Survivor, nemesis, swarm, etc) Para evitar que respawneen los zombies cuando mueren */
/* Cosa que quede así */
if (!is_user_alive(ID_SPAW) /* Code blaksjdklnqwe */ && !g_sniperround /* codejiqweoj */ )
Código PHP:
/* Vamos a fw_PlayerKilled(); y hacemos lo siguiente */
// Agregamos
if (g_sniper[victim]) remove_task(id+TASK_AURA); // Removemos le task del aura cuando un sniper muere (El task ya existe en cualquier ZP)
/* Vamos a fw_TakeDamage(); y hacemos */
// Agregamos dentro del if (!g_zombie[id])
if (g_sniper[attacker]) // Si el atacante es sniper
{
damage *= get_pcvar_float(cvar_sniperdamage); // Seteamos el daño del sniper con la cvar del mismo
SetHamParamFloat(4, damage);
}
/* Ahora vamos a agregar DEBAJO donde el zombie ataca */
if (g_sniper[victim]) return HAM_IGNORED;
/* ¿ Esto para que sirve ?: Es para que al atacar al sniper, reciba daño y no sea infectado (Bugfix) */
/* Vamos a fw_TakeDamage_Post(); y hacemos lo siguiente */
// Agregamos en
if (g_zombie[victim])
{
// Codigo aslkdqwe
}
else
{
if (g_sniper[victim]) // Cuando es sniper
{
if (!get_pcvar_num(cvar_sniperpainfree)) return; // Si el valor de la cvar es 0, entonces retorna y sale, sino, se activa el pain shock free
}
else if (g_survivor[victim])
{
// Cvar del survi del pain free
}
}
// Codigo donde se setea el pain shock free
/* Vamos a fw_TouchWeapon(); y agregamos */
if (g_sniper[id]) return HAM_SUPERCEDE; // Esto es para que no agarre un arma del piso cuando sea sniper
/* Vamos a fw_CmdStart(); y hacemos lo siguiente */
// En la condición donde se encuentra if (g_zombie[id] || g_survivor... ), agregamos
g_sniper[id]
// Para que quede así
if (... g_survivor[id] || g_sniper[id] ||... )
// Y en la condición de abajo hacemos lo mismo pero ponemos
&& !g_sniper[id]
/* Esto es para que el jugador siendo sniper, no use la linterna */
/* Vamos a fw_PlayerPreThink(); y hacemos lo siguiente */
if (g_sniper[id])
set_pev(id, pev_maxspeed, get_pcvar_float(cvar_sniperspd));
else if (g_survivor[id])
// code kisqweqweputasiajsdoqwe
/* Seteamos la velocidad del sniper y agregamos un else donde se encuentra, si es survivor, deonde ya esta seteada su velocidad propia */
/* Ahora en las funciones menu_buy1(); menu_buy2(); agregamos esto */
if (g_sniper[id]) return PLUGIN_HANDLED; // Esto es para que el sniper no pueda comprar un arma cuando abre el menú de compras
/* Vamos a message_cur_weapon(); y agregamos lo siguiente */
// Donde se encuentra && (g_survivor[id] || get_pcvar_num(cvar_infammo) > 1) agregamos
g_sniper[id]
// Con tal que quede así
if (MAXBPAMMO[weapon] > 2 && (g_survivor[id] || g_sniper[id] || get_pcvar_num(cvar_infammo) > 1)
/* Vamos a message_ammo_x(); (Si usas v4.3 en Ammo_X o Event_AmmoX), agregamos y hacemos como como arriba */
!g_sniper[id]
// Y va a quedar así
if (!g_zombie[msg_entity] && !g_survivor[msg_entity] && !g_sniper[msg_entity])
/* Vamos en message_flashbat(); y agregamos */
if (g_sniper[msg_entity]) return PLUGIN_HANDLED;
// Evitamos los mensajes de la bateria de la linterna
/* Vamos a zombieme(); y al principio de la función agregamos */
g_sniper[id] = false; // Evitamos bugs, seteamos la variable del sniper (ID) en falso (0)
/* Vamos a humanme(); [PARTE IMPORTANTISIMA] y hacemos lo siguiente */
// Donde se encuentra if (survivor), lo cambiamos por
else if (survivor == 1)
// Esto sirve para que, si queremos llamar al sniper, usamos humanme(id, 2).. Y al survivor usamos 1, por eso cambiamos las condiciones
// Después arriba del else if agregamos para convertir al player en sniper
if (survivor == 2) // Si el parametro survivor es 2, como lo indicamos en el paso 3, cuando seteamos el valor de g_sniperround en la función de male_zombie
{
g_sniper[id] = true; // Seteamos el valor del jugador en true
fm_set_user_health(id, get_pcvar_num(cvar_sniperhp)) // Seteamos la vida al sniper
if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_snipergvt)) // Seteamos la gravedad MIENTRAS que no esté congelado el jugador cuando es convertido (Bugfix)
fm_strip_user_weapons(id) // Les sacamos todas las armas
fm_give_item(id, "weapon_knife") // Le damos el cuchillo al jugador
fm_give_item(id, "weapon_awp") // Le damos el awp al sniper O_O
turn_off_flashlight(id) // Desactivamos la linterna xD
}
// Ejemplo: Tiene que quedar así
if (survivor == 2) // Si es sniper
{
// Estadisticas base
}
else if (survivor == 1) // Si no, si es survivor
{
// Estadisticas base
}
else
{
// Si es humano
}
// También pueden reemplazar todos los if, por un switch, asi no se gasta haciendo muchos else if
switch (survivor)
{
case 1: // Acá si es survivor
case 2: // Acá si es sniper
default: // Acá si es humano. default, significa que si es un numero de parametro que no sea ni 1, ni 2, como lo hicimos arriba
}
/* Vamos a donde se encuenra el model del survivor seteado.. (if (g_survivor[id])).. Lo reemplazan */
else if (g_survivor[id])
// Y arriba agregan
if (g_sniper[id])
{
for (i = 0; i < sizeof(ModelSniper); i++)
{
if (equal(ModelSniper[i], currentmodel)) already_has_model = true;
}
if (!already_has_model)
{
iRand = random_num(0, charsmax(ModelSniper))
copy(g_playermodel[id], charsmax(g_playermodel[]), ModelSniper[iRand])
}
}
// Cuando es convertido el sniper, le damos el model correspondiente
// Después vamos donde le setea el glow al jugador
if (g_survivor[id]) fm_set_rendering(id, kRenderFxGlowShell, 20, 20, 255, kRenderNormal, 25)
// Y hacemos lo siguiente
if (g_sniper[id] && get_pcvar_num(cvar_sniperglow)) fm_set_rendering(id, kRenderFxGlowShell, 20, 255, 255, kRenderNormal, 25)
else if (g_survivor[id]) fm_set_rendering(id, kRenderFxGlowShell, 20, 20, 255, kRenderNormal, 25)
// Más abajo agregamos
if (g_sniper[id] && get_pcvar_num(cvar_sniperaura)) set_task(0.1, "snip_aura", id+TASK_AURA, _, _, "b") // Si es sniper, entonces llamamos la función para setear el aura al jugador
/* Al final del plugin pongan la función que llama el task "snip_aura" */
public snip_aura(taskid) // Función que llama el task
{
if (!g_sniper[ID_AURA]) // Si el usuario no es sniper
{
remove_task(taskid);
return; // Removemos le task y retornamos
}
static origin[3]; // Variable estática donde gaurdamos el origin del user (Posision X, Y y Z(
get_user_origin(ID_AURA, origin) // Obtenemos el origin del usuario
message_begin(MSG_PVS, SVC_TEMPENTITY, origin, 0) // Iniciamos el mensaje para darle el color de aura al sniper
write_byte(TE_DLIGHT) // TE = id, significa luz de alrededor
write_coord(origin[0]) // Origin posición X
write_coord(origin[1]) // Origin posición Y
write_coord(origin[2]) // Origin posición Z
write_byte(20) // Radio del aura
write_byte(255) // Rojo
write_byte(255) // Verde
write_byte(0) // Azul
write_byte(2) // Ni me acuerdo :C
write_byte(0) // Ni me acuerdo :_
message_end() // Finalizamos el mensaje
}
/* Vamos a check_round(); y hacemos lo siguiente */
// En if (g_zombie[leaving_player]...) debajo del else agregamos
if (g_sniper[leaving_player]) // Si el jugador que era sniper, se fue del server
{
humanme(id, 2) // Convertimos al nuevo jugador en sniper
client_print(id, print_center, "El sniper se ha ido.. En su lugar entró: %s", name) // Ponemos el print para que nos diga que el sniper se fue
// En caso de usar v4.3.. reemplazan name por g_playername[leaving_player] y si quieren cambiar client_print por zp_colored_print, no hay drama de hacerlo.
}
/* Vamos a flashlight_charge(); y agregamos */
if (g_sniper[ID_CHARGE])
{
remove_task(taskid); // Removemos el task del jugador con linterna
return; // Retornamos
}
/* Vamos a reset_vars(); y agregamos */
g_sniper[id] = false // Seteamos la variable del sniper en falso, esto es para cuando es llamado la función reset_vars y se setean todas las variables en falso y una que otras en verdadero.
/* Vamos a ShowHUD(); y hacemos lo siguiente */
if (g_zombie[id])
{
// Seteamos el nombre de las clases en zombies
}
else
{
// Acá seteamos la del sniper en el HUD
if (g_sniper[id]) formatex(class, charsmax(class), "Sniper");
else if (g_survivor[id]) // Clases y más clases
}
/* Vamos a fnCheckLastZombie y ponemos el la condición */
// Last human
if (is_user_alive(id) && !g_zombie[id] && !g_survivor[id] && !g_sniper[id] && fnGetHumans() == 1)
{
// Si usan v4.3 verán más código, pero no influye mucho
g_lasthuman[id] = true
}
/* Vamos a set_user_flashlight */
// En la condición if (g_zombie[ID_FLASH] || g_survivor[ID_FLASH]...).. Agregamos
g_sniper[ID_FLASH]
// Dejandolo así
if (g_zombie[ID_FLASH] || g_survivor[ID_FLASH] || g_sniper[ID_FLASH] || !is_user_alive(ID_FLASH))
/* Vamos a replace_models (o replace_weapon_model) */
// Agregamos dentro del switch
case CSW_AWP:
{
if (g_sniper[id])
{
set_pev(id, pev_viewmodel2, ModelWeaponSniper)
/* en caso de tener más de un model para tu arma
set_pev(id, pev_viewmodel2, ModelWeaponSniper[random_num(1, charsmax(ModelWeaponSniper))]); */
}
}
Código PHP:
/* Si quieren pueden ponerlo en cualquier parte del plugin */
public cmdSniper(id, level, cid)
{
if (!cmd_access(id, level, cid, 2)) // Si tiene el acceso indicado en register_concmd (ADMIN_BAN)
return PLUGIN_HANDLED; // Retornamos
static iPlayer, iArg[32]; // Creamos variables para detectar al jugador y el nombre del jugador
read_argv(1, iArg, charsmax(iArg)); // Leemos y detectamos el jugador
iPlayer = cmd_target(id, iArg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF)); // Damos el "tragecto" es decir, al jugador mientras este vivo.
if (equal(iArg, "0")) // Si el admin escribe 0, en vez de algun jugador, eligira un sniper al azar.
{
iPlayer = fnGetRandomAlive(random_num(1, fnGetAlive()));
client_print(0, print_notify, "[ZP] No se ha encontrado al jugador. Por lo tanto se eligió uno al azar");
}
if (!iPlayer) return PLUGIN_HANDLED; // Si no se encontro al jugador, retorna
if (!allowed_sniper(iPlayer)) return PLUGIN_HANDLED; // Si cumple la condición en allowed_sniper, retorna
command_sniper(iPlayer); // Llamamos a la función coomand_sniper, para convertir al jugador
return PLUGIN_HANDLED; // Necesario return para que funcione el comando
}
allowed_sniper(id) // Función para saber si poemos convertir al jugador en sniper
{
if (g_endround || g_sniper[id] || !is_user_alive(id) || task_exists(TASK_WELCOMEMSG) || (!g_newround && g_zombie[id] && fnGetZombies() == 1))
return false; // Si esto sucede, retornamos en flso
return true; // Retornamos en verdadero si no se cumple la condición
}
command_sniper(id, player)
{
static iName[32], iName2[32]; // Creamos variables para llamar al nombre del jugador quien lanzó el modo y al quien convirtió
get_user_name(player, iName, charsmax(iName)); // Obtenemos el nombre del jugador convertido
get_user_name(id, iName2, charsmax(iName2)); // Obtenemos el nombre del jugador o admin quien lanzó el modo
if (get_pcvar_num(cvar_logcommands)) // Si la cvar esta activada
{
// Aquí es donde guarda al player convetrido y demás datos en los logs del zombieplague
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, charsmax(authid))
get_user_ip(id, ip, charsmax(ip), 1)
formatex(logdata, charsmax(logdata), "ADMIN %s <%s><%s> - %s convertido en sniper (Players: %d/%d)", iName2, authid, ip, iName, fnGetPlaying(), g_maxplayers)
log_to_file("zombieplague.log", logdata)
}
/* En caso de usar v4.3, borren la variable estatica iName y iName2 y cuando obtenemos el nombre (get_user_name) y reemplazamos iName por g_playername[player] y iName2 por g_playername[id] */
if (g_newround)
{
remove_task(TASK_MAKEZOMBIE)
make_a_zombie(MODE_SNIPER, player)
}
else humanme(player, 2, 0)
// Seguramente se preguntaran la diferencia de estos
// Esto significa que si g_newround esta en true, es decir, si no hay ronda, entonces llamamos a make_a_zombie, para que lance el modo, junto al sonido, HUD y demás, y en cambio en else, convertimos directamente al humano o al jugador en sniper, sin necesidad de mostrar el HUD, sonidos y demás !
}
Bueno ya he terminado hasta aquí son 4 simples pero complicados pasos ! Jejeje ! Espero que les haya servido
Y para cualquier cosa, algo mal explicado, expresado, o falta algo, me dicen
Gracias a todos
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Contactarme vía Discord >>> AtselTV#8202