[TUT][ZP] Crear modos individuales
#1
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 Rainbow
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 */ 
2do paso: Vamos a las funciones plugin_ donde registramos cada comando para el modo.
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(playermodelcharsmax(playermodel), "models/player/%s/%s.mdl"ModelSniperModelSniper);
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(playermodelcharsmax(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"); 
3er paso: Seteamos la variable g_sniperround
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(1get_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_NONEid fnGetRandomAlive(random_num(1iPlayersnum)); // 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(id2); // Llamamos a la función humanme para convertir al jugador en sniper (Si usas ZP v4.3 pones humanme(id, 2, 0);

    
for (id 1id <= g_maxplayersid++)
    {
        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(id001); // 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(0charsmax(SoundSniper))]); // Ejecutamos el sonido cuando sale el modo sniper

    
static iName[32];
    
get_user_name(forward_idiNamecharsmax(iName)); // Guardamos el nombre del jugador convertido en sniper

    
set_hudmessage(20255255HUD_EVENT_XHUD_EVENT_Y10.05.01.01.0, -1); // Seteamos el HUD, en color amarillo cuando sale el modo
    
ShowSyncHudMsg(0g_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_fwRoundStartg_fwDummyResultMODE_SNIPERforward_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 */ 
4to paso: Seteamos valores de g_sniper, condiciones, etc
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(4damage); 
}

/* 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(idpev_maxspeedget_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] > && (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(idget_pcvar_num(cvar_sniperhp)) // Seteamos la vida al sniper
    
if (!g_frozen[id]) set_pev(idpev_gravityget_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 (
0sizeof(ModelSniper); i++)
    {
        if (
equal(ModelSniper[i], currentmodel)) already_has_model true;
    }
    if (!
already_has_model)
    {
        
iRand random_num(0charsmax(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(idkRenderFxGlowShell2020255kRenderNormal25)
// Y hacemos lo siguiente
if (g_sniper[id] && get_pcvar_num(cvar_sniperglow)) fm_set_rendering(idkRenderFxGlowShell20255255kRenderNormal25)
else if (
g_survivor[id]) fm_set_rendering(idkRenderFxGlowShell2020255kRenderNormal25)

// 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_AURAorigin// Obtenemos el origin del usuario
    
    
message_begin(MSG_PVSSVC_TEMPENTITYorigin0// 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(id2// Convertimos al nuevo jugador en sniper
    
client_print(idprint_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(idpev_viewmodel2ModelWeaponSniper)
        
/* en caso de tener más de un model para tu arma
        set_pev(id, pev_viewmodel2, ModelWeaponSniper[random_num(1, charsmax(ModelWeaponSniper))]); */
    
}

5to paso: Agregamos la funciones del comando
Código PHP:
/* Si quieren pueden ponerlo en cualquier parte del plugin */
public cmdSniper(idlevelcid)
{
    if (!
cmd_access(idlevelcid2)) // Si tiene el acceso indicado en register_concmd (ADMIN_BAN) 
        
return PLUGIN_HANDLED// Retornamos

    
static iPlayeriArg[32]; // Creamos variables para detectar al jugador y el nombre del jugador
    
read_argv(1iArgcharsmax(iArg)); // Leemos y detectamos el jugador
    
iPlayer cmd_target(idiArg, (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(1fnGetAlive()));
        
client_print(0print_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(idplayer)
{
    static 
iName[32], iName2[32]; // Creamos variables para llamar al nombre del jugador quien lanzó el modo y al quien convirtió
    
get_user_name(playeriNamecharsmax(iName)); // Obtenemos el nombre del jugador convertido
    
get_user_name(idiName2charsmax(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(idauthidcharsmax(authid))
        
get_user_ip(idipcharsmax(ip), 1)
        
formatex(logdatacharsmax(logdata), "ADMIN %s <%s><%s> - %s convertido en sniper (Players: %d/%d)"iName2authidipiNamefnGetPlaying(), 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_SNIPERplayer)
    }
    else 
humanme(player20)
    
// 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 Gran sonrisa
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#2
Buen tuto.
Podrías agregar un menú de jugadores para volver Sniper.
Responder
#3
(26/06/2014, 01:29 AM)Mario AR. escribió: Buen tuto.
Podrías agregar un menú de jugadores para volver Sniper.
Si puede ser, pero es mas lindo usar comandos, para mi, en cambio si muchos me piden que haga un menú, lo agrego ! Guiño
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#4
Código PHP:
/* Vamos a humanme(); [PARTE IMPORTANTISIMA] y hacemos lo siguiente */
// Donde se encuentra if (survivor), lo cambiamos por
else if (survivor == 1)  no seria if???


// Después arriba de eso agregamos para convertir al player en sniper
if (survivor == 2// por que if? si no es el 1???

{
    
g_sniper[id] = true// Seteamos el valor del jugador en true

    
fm_set_user_health(idget_pcvar_num(cvar_sniperhp)) // Seteamos la vida al sniper
    
if (!g_frozen[id]) set_pev(idpev_gravityget_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


haaa?????? no entendi la verdad..... esa parte....
[Guia] Granada de Droga [actulizado 01/04/14]
[Guia] Cambio de leap zp 4.2 a 4.3

Zp 4.2 Extincion [Beta+Lvl] Edicion 0.1 (%95) terminado
Responder
#5
Es el único error que tiene o sigue mas por lo visto esta bien echo aparte de ese pequeño error Gran sonrisa sigue así Axel Gran sonrisa
Responder
#6
(26/06/2014, 11:42 AM)kirito escribió: Es el único error que tiene o sigue mas por lo visto esta bien echo aparte de ese pequeño error Gran sonrisa sigue así Axel Gran sonrisa

No es un error.
Responder
#7
Código PHP:
new const ModelSniper[] = "zp_sniper"
new const ModelWeaponSniper[] = "v_sniperawp"
new const SoundSniper[] = "zombie_plague/zp_sniper.wav"

/* Jugador */
formatex(playermodelcharsmax(playermodel), "models/player/%s/%s.mdl"ModelSniperModelSniper)
 if (
file_exists(playermodel)) precache_model(playermodel)

/* Arma */
formatex(playermodelcharsmax(playermodel), "models/zombie_plague/%s.mdl"ModelWeaponSniper)
 if (
file_exists(playermodel)) precache_model(ModelWeaponSniper)
/* Sonido */
 
if (file_exists(SoundSniper)) precache_sound(SoundSniper
o

Código PHP:
new const ModelSniper[][] = { "zp_sniper""zp_sniper2" }
new const 
ModelWeaponSniper[][] = { "v_sniperawp""p_sniér" }
new const 
SoundSniper[][] = { "zombie_plague/zp_sniper.wav" }

for (
0sizeof (ModelSniper); i++)
{
    
formatex(playermodelcharsmax(playermodel), "models/player/%s/%s.mdl"ModelSniper[i], ModelSniper[i]);
    if (
file_exists(playermodel)) precache_model(playermodel[i]);
}

for (
0sizeof (ModelWeaponSniper); i++)
{
    
formatex(playermodelcharsmax(playermodel), "models/zombie_plague/%s.mdl"ModelWeaponSniper[i]);
    if (
file_exists(playermodel)) precache_model(ModelWeaponSniper[i]); 
}

for (
0sizeof (SoundSniper); i++)
     if (
file_exists(SoundSniper[i]))
          
precache_sound(SoundSniper[i]) 
Si pones new const as[] = "v_hola.mdl" no hace falta hacer un loop, en cambio si haces new const as[][] = { "v_hola.mdl", "v_chau.mdl" }

Igual esta todo bastante bien Sonrisa
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#8
Si meto este mod a mi zp no generara bugs?
Responder
#9
(26/06/2014, 11:25 AM)Nike escribió:
Código PHP:
/* Vamos a humanme(); [PARTE IMPORTANTISIMA] y hacemos lo siguiente */
// Donde se encuentra if (survivor), lo cambiamos por
else if (survivor == 1)  no seria if???


// Después arriba de eso agregamos para convertir al player en sniper
if (survivor == 2// por que if? si no es el 1???

{
    
g_sniper[id] = true// Seteamos el valor del jugador en true

    
fm_set_user_health(idget_pcvar_num(cvar_sniperhp)) // Seteamos la vida al sniper
    
if (!g_frozen[id]) set_pev(idpev_gravityget_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


haaa?????? no entendi la verdad..... esa parte....
Es demasiado simple boludo -.-
Si el parametro survivor es igual a 1, es survivor, en cambio si es 2 va a ser sniper
En cambio quedaría así
Código PHP:
if (survivor == 2// Es sniper
{
    
// Estadísticas base
}
else if (
survivor == 1// Es survivor
{
   
// Estadisticas base
}
else
{
    
// Estadisticas bases del humano


(26/06/2014, 01:01 PM)Kane escribió:
Código PHP:
new const ModelSniper[] = "zp_sniper"
new const ModelWeaponSniper[] = "v_sniperawp"
new const SoundSniper[] = "zombie_plague/zp_sniper.wav"

/* Jugador */
formatex(playermodelcharsmax(playermodel), "models/player/%s/%s.mdl"ModelSniperModelSniper)
 if (
file_exists(playermodel)) precache_model(playermodel)

/* Arma */
formatex(playermodelcharsmax(playermodel), "models/zombie_plague/%s.mdl"ModelWeaponSniper)
 if (
file_exists(playermodel)) precache_model(ModelWeaponSniper)
/* Sonido */
 
if (file_exists(SoundSniper)) precache_sound(SoundSniper
o

Código PHP:
new const ModelSniper[][] = { "zp_sniper""zp_sniper2" }
new const 
ModelWeaponSniper[][] = { "v_sniperawp""p_sniér" }
new const 
SoundSniper[][] = { "zombie_plague/zp_sniper.wav" }

for (
0sizeof (ModelSniper); i++)
{
    
formatex(playermodelcharsmax(playermodel), "models/player/%s/%s.mdl"ModelSniper[i], ModelSniper[i]);
    if (
file_exists(playermodel)) precache_model(playermodel[i]);
}

for (
0sizeof (ModelWeaponSniper); i++)
{
    
formatex(playermodelcharsmax(playermodel), "models/zombie_plague/%s.mdl"ModelWeaponSniper[i]);
    if (
file_exists(playermodel)) precache_model(ModelWeaponSniper[i]); 
}

for (
0sizeof (SoundSniper); i++)
     if (
file_exists(SoundSniper[i]))
          
precache_sound(SoundSniper[i]) 
Si pones new const as[] = "v_hola.mdl" no hace falta hacer un loop, en cambio si haces new const as[][] = { "v_hola.mdl", "v_chau.mdl" }

Igual esta todo bastante bien Sonrisa
Con eso me di cuenta de algo para correjir, pero no le vi la "ayuda" porque ya lo expliqué creo xD. Igual gracias de todos modos

(26/06/2014, 02:27 PM)kirito escribió: Si meto este mod a mi zp no generara bugs?
Si lo haces BIEN, etonces no supondría que tendrás bugs, aparte depende como esté hecho tu ZP.. Para adaptar el modo. Pero lo saque de mi ZP y esta bien hecho el modo.
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#10
podrías hacer switch en vez de else if Whatever
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#11
Creo que es mejor utilizar give_item de fun que fm_give_item de fakemeta? La explicación no te la se dar pero eso tengo entendido
Responder
#12
metele el leap, un cuchillo para sniper y el sonido ambiente y que cierren el tema... xD


edit: si sabia como habia que poner pero la verdad esa parte no se entendiende... deja un ejemplo mas claro boluu...xD Yao mingYao mingYao mingYao ming
[Guia] Granada de Droga [actulizado 01/04/14]
[Guia] Cambio de leap zp 4.2 a 4.3

Zp 4.2 Extincion [Beta+Lvl] Edicion 0.1 (%95) terminado
Responder
#13
(26/06/2014, 07:29 PM)xPecie escribió: Creo que es mejor utilizar give_item de fun que fm_give_item de fakemeta? La explicación no te la se dar pero eso tengo entendido

Porque fm_give_item llama varias natives cuando con give_item llamas solo esa.
Al igual que todas las que están en fakemeta_util.

Por eso te recomiendo que uses fun o engine, según la función.
Por ejemplo, fm_set_rendering -> set_rendering

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#14
No voy a reemplazar nada, con el tema del switch, voy a ponerlo como comentario, asi como los otros, pero lo voy a dejar así porque funciona y para el qe quiera pueda hacerlo de tal manera.. Yo uso stocks de fakemeta pero como engine, por así decirlo y anda bien ! Jajaja !
Ahí me pongo a editar algunas cosas

Nike: Se entiende bien esa parte, Es obvio que si decis "Poner arriba del else if, este if", obviamente va a tener que agregar la condicion de abajo (La que puse yo e.e).. No le voy a meter eso, es como opcional para todos.
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#15
(26/06/2014, 08:27 PM)alan_el_more escribió: Por eso te recomiendo que uses fun o engine, según la función.
Por ejemplo, fm_set_rendering -> set_rendering

justo el ejemplo que pusiste está mal... mira engine_stocks.inc:
Código:
/*  Set rendering of an entity */
stock set_rendering(index, fx=kRenderFxNone, r=255, g=255, b=255, render=kRenderNormal, amount=16)
{
    entity_set_int(index,EV_INT_renderfx,fx);
    new Float:RenderColor[3];
    RenderColor[0] = float(r);
    RenderColor[1] = float(g);
    RenderColor[2] = float(b);
    entity_set_vector(index,EV_VEC_rendercolor,RenderColor);
    entity_set_int(index,EV_INT_rendermode,render);
    entity_set_float(index,EV_FL_renderamt,float(amount));

    return 1;
}

no hay nada de diferencia con:
Código:
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16) {
    new Float:RenderColor[3];
    RenderColor[0] = float(r);
    RenderColor[1] = float(g);
    RenderColor[2] = float(b);

    set_pev(entity, pev_renderfx, fx);
    set_pev(entity, pev_rendercolor, RenderColor);
    set_pev(entity, pev_rendermode, render);
    set_pev(entity, pev_renderamt, float(amount));

    return 1;
}

si es a un jugador, utilizad set_user_rendering (fun).

en cambio, si es a una entidad la diferencia entre fm_set_rendering y set_rendering es despreciable, aunque sigue siendo mejor engine
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#16
Siempre me confundí las dos. Gracias por corregirme

Y CSAxel, no es decir "Funciona y lo dejo así". Si estás aportando con un tutorial, tendrías que mejorar tu código lo más posible. Sino, no aportes nada

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#17
lindo tuto , bien explicado , eso me gusta.

Ya con esto tenemos para hacer todos los modos.
wesker,ninja,asasin, etc etc etc

Gracias por compartirlo, saludos
NUEVO ZOMBIE PLAGUE + LVLS!! UNETE A LA COMUNIDAD
[Imagen: b_350_20_ffad41_e98100_000000_591f11.png]


Responder
#18
(27/06/2014, 02:39 PM)Evil Spiret escribió: lindo tuto , bien explicado , eso me gusta.

Ya con esto tenemos para hacer todos los modos.
wesker,ninja,asasin, etc etc etc

Gracias por compartirlo, saludos

ya pasaron de moda...xDDDD.... meter un BOSS en medio de la ronda multi... Lol


ahora si buen tuto man.... +1


______________________________________________________
edit: me olvide de decirte que en el otro tuto de mod se mandan a todos cts en la funcion... arregla eso o testea...xD
[Guia] Granada de Droga [actulizado 01/04/14]
[Guia] Cambio de leap zp 4.2 a 4.3

Zp 4.2 Extincion [Beta+Lvl] Edicion 0.1 (%95) terminado
Responder
#19
(27/06/2014, 04:03 PM)Nike escribió:
(27/06/2014, 02:39 PM)Evil Spiret escribió: lindo tuto , bien explicado , eso me gusta.

Ya con esto tenemos para hacer todos los modos.
wesker,ninja,asasin, etc etc etc

Gracias por compartirlo, saludos

ya pasaron de moda...xDDDD.... meter un BOSS en medio de la ronda multi... Lol


ahora si buen tuto man.... +1


______________________________________________________
edit: me olvide de decirte que en el otro tuto de mod se mandan a todos cts en la funcion... arregla eso o testea...xD
Un boss en Inf. Múltiple, horrible :_ para eso sería un L4D e.e
Lo otro juré haberlo correjido, pero reviso por las dudas xD.

Alan: Yo a este modo lo apliqué como un TUTO porque se que funciona porque es de un ZP que hice y funciona bien, no debería de tener bugs, aparte es depende como este el ZP del pibe que quiera ponerle este modo.
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#20
(27/06/2014, 05:28 PM)CSAxel escribió: Alan: Yo a este modo lo apliqué como un TUTO porque se que funciona porque es de un ZP que hice y funciona bien, no debería de tener bugs, aparte es depende como este el ZP del pibe que quiera ponerle este modo.

Puede funcionar y no tener bugs, nunca dije que no lo hiciera ni que los tenga. Pero si vas a hacer un tutorial y te recomiendan mejorar el código por X razón, me parece que lo tendrías que hacer por dos razones:
- Para que mejores vos.
- Para que los que vienen a aprender algo, no aprendan un método que funciona y listo. Sino que sea lo más optimo posible ya que estás enseñando a los demás.

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#21
(27/06/2014, 05:44 PM)alan_el_more escribió:
(27/06/2014, 05:28 PM)CSAxel escribió: Alan: Yo a este modo lo apliqué como un TUTO porque se que funciona porque es de un ZP que hice y funciona bien, no debería de tener bugs, aparte es depende como este el ZP del pibe que quiera ponerle este modo.

Puede funcionar y no tener bugs, nunca dije que no lo hiciera ni que los tenga. Pero si vas a hacer un tutorial y te recomiendan mejorar el código por X razón, me parece que lo tendrías que hacer por dos razones:
- Para que mejores vos.
- Para que los que vienen a aprender algo, no aprendan un método que funciona y listo. Sino que sea lo más optimo posible ya que estás enseñando a los demás.
Claro puede que tengas razón !.. Aparte algunas cosas que me están diciendo (Para optimizar), lo voy agregando.. Y entre otras cosas. Yo soy capaz de mejorar aún más y optimizar muchas cosas.. Pero lo hago en el nivel como está hecho un mod como un survio neme en un ZP. Pero si, tendré en cuenta lo que decís.
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#22
Mi humilde opinión? Axel si estas diciendo que lo puedes hacer mejor por que no lo haces de la mejor forma? La verdad a veces no entiendo que formas de ver las cosas...si quieres te enseño a contar con abbacus en vez de usar calculadora a ver que opinas xd (que sirve para lo mismo)
Responder
#23
(27/06/2014, 06:35 PM)xPecie escribió: Mi humilde opinión? Axel si estas diciendo que lo puedes hacer mejor por que no lo haces de la mejor forma? La verdad a veces no entiendo que formas de ver las cosas...si quieres te enseño a contar con abbacus en vez de usar calculadora a ver que opinas xd (que sirve para lo mismo)
Sabes porque no la hago de la mejor forma ?
El problema de algunas personas (Para no decir boludos), van a tener miles de errores con respecto a como tienen su código en un ZP, y para colmo, no saben casi nada de pawn, por eso, hago de la forma en la que esta hecha en cualquier ZP y como esta e base a un ZP en cualquier modo. Por eso. Aparte, agregué algunos comentarios, para optimizar mejor las condiciones, y demas cosas.
Es mejor mostrarles de la forma de como viene en un ZP, y yo después (En los comentarios aparecen, algunos nomas), les muestro la manera optimizada.
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#24
¿Hay muchas diferencia en lo que es el code de un modo individual y un modo de múltiples personas?

Saludos.
[Imagen: 2qcju6x.jpg]
Responder
#25
(13/07/2014, 11:25 PM)Bolbec.- escribió: ¿Hay muchas diferencia en lo que es el code de un modo individual y un modo de múltiples personas?

Saludos.
Con respecto al ZP si..
Fijate la diferencia entre estos 2 TUTOS que hice y sabrás Guiño
Modos individuales: (Este e.e)
http://amxmodx-es.com/Thread-TUT-ZP-Crea...dividuales
Modos grupales:
http://amxmodx-es.com/Thread-Guia-ZP-Com...s-grupales
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)