Sistema de logros v2.0 + guardado nfvault
#1
Hola gente de alliedmodders estuve mucho tiempo off por temas de laburo y otras cosas... ahora que me consegui la contraseña del wifi del vecino estare mas activo para ayudarlos en lo que mas pueda.

-Esta vez vengo a aportarles un sistema de logros con 11 logros diferentes que incluye un guardado nfvault por nick/nombre, les deje un par de cosillas explicadas en el codigo si se me paso algo solo diganmelo si no funciona algo tambien diganmelo si detectan algun bug lo mismo y si quieren aportar alguna optimizacion mucho mejor aun para entragar un codigo mas optimo aclaro de una vez que no esta muy optimizado ya que optimizar no es lo mio.

Código PHP:
/************************************************************************************************************************************\
*    antes que nada decirles que esto lo hice pensando en la gente mas nueva que no sabe mucho y quiere tener algunos logros para *
*    mejorar la experiencia de juego... se que no esta optimizado para nada puesto que no conosco bien las tecnicas para una buena*
*    optimizacion, estoy abierto a criticas constructivas sobre cualquier fix a algun bug que yo no alla encontrado o alguna opti_*
*    zación ya que el checkeo de los logros no me gusto para nada como lo hise.                             *
*                                                                                         *
*    bueno... que es esto?                                                             *
*                                                                     *
*    - es un sistema con 11 logros los cuales se especifican en el enum LOGRO_TIPO que ademas contiene un sistema de guardado     *
*      nfvault en el cual los logros se guardan por nombre y se muestran en un motd escribiendo el el say: /logros.               *
*                                                                         *
*    cualquier optimizacion para mejorar el aporte sera muy bien recibida.                                                        *
*                                                                             *
*    disfrutenlo y mas adelante tratare de optimizarlo y agregarle mas logros...                                                  *
*                                                                     *
*    SALUDOS!                                                               *
\************************************************************************************************************************************/
/************************************************************************************************************************************\                                                                         *
*    Changelog:                                                                 *
*          -v1.0: Plugin creado. 10 logros.                                             *
*          -v1.1: Agregado logro por si completa todos los logros | enumeradores para contadores y logros.             *                                 *
*          -v1.2: Agregado sistema de guardado nfvault.                                         *
*          -v1.3: Fix con error en el DeathMsg (estaban mal puesto los contadores en su respectivo checkeo).             *
*          -v1.4: Cambio de menu additem por menu motd... se ve mas atractivo d:                             *
*          -v1.5: Agregada 4 forwards de fakemeta por si se cae el server de 4 formas distintas se guarden los datos. (borrado)         *
*          -v1.6: Pequeños fix's y limpieza de brazaletes que estaban demas.                             *
*          -v1.7: Corregido un error en la data del guardado.                                         *
*          -v1.8: Cambiado Playerkilled por Deathmsg.                                         *
*          -v1.9: Cambiado Client_prethink (engine) por FM_PlayerPrethink (fakemeta) y asi usar un include menos.         *
*          -v2.0: agregado hud sincronizado para evitar que desaparescan huds o no aparesca el mensaje del logro que gano.    *
*             posteo del plugin.                                                     *
\************************************************************************************************************************************/

//includes
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#include <cstrike>
#include <nfvault>

// definimos plugin, version blablabla...
#define PLUGIN "Logros"
#define VERSION "2.0"
#define AUTHOR "3MCy Daimon't~>"

// definimos un par de cosillas mas que nada por comodidad
#define TRUE 1
#define FALSE 0
#define CHECK g_conectado[id] || !is_user_bot(id) || !is_user_hltv(id)
#define LOGROS_MAXIMOS 11

// Enumeradores para saber que logros son y el contador de cada logro
enum LOGRO_TIPO // en este enum asignamos una etiqueta para cada logro y asi hacerlo mas legible
    
LOGRO_KILL_CT 0// mata 200 policias
    
LOGRO_KILL_TT// mata 200 terroristas
    
LOGRO_KILL_CT_RONDA// mata 5 policia en 1 ronda
    
LOGRO_KILL_TT_RONDA// mata 5 terroristas en 1 ronda
    
LOGRO_REVENTADOS// mata 250 ct o tt con escopeta
    
LOGRO_CANGURO// saltar 500 veces
    
LOGRO_AMO_EL_SCROLL//agacharse 500 veces
    
LOGRO_ACUCHILLADO// matar 150 jugadores con cuchillo
    
LOGRO_FRANCOTIRADOR// matar 100 jugadores de headshot
    
LOGRO_QUE_BUEN_SV// Conectarse 25 veces
    
LOGRO_CAZADOR // completa todos los logros
}

enum LOGRO_CONTADOR // en este enum asignamos una etiqueta para cada variable y asi hacer mas legible el codigo.
    
MUERTE_CT 0,
    
MUERTE_TT,
    
MUERTE_RONDA_CT,
    
MUERTE_RONDA_TT,
    
MUERTE_M3,
    
SALTOS,
    
SALTOS_ON,
    
DUCKS,
    
ACUCHILLADOS,
    
HEADSHOTS,
    
CONECCIONES,
    
LOGROS_GANADOS
}
/*-------------*/

// Variables
new Logros[33][LOGRO_TIPO], contador[33][LOGRO_CONTADOR];
new 
g_team_ct[33], g_conectado[33], g_playername[33][32];
new 
g_maxplayers,  g_roundg_msgsync;
new 
logro_completado[] = "logro_ganado.wav" // pueden poner el que quieran va en la carpeta sound

//guardado
new VaultLogros[128], szLogros[180], szKey[30]

public 
plugin_init() { // inicia el plugin
    
register_plugin(PLUGINVERSIONAUTHOR// registramos plugin, version blablabla
    
    
register_clcmd("say /logros""motd_logros"// registramos el comando para mostrarle el motd con los logros disponibles
    
    
register_event("DeathMsg",     "event_deathmsg""a"/* registramos el evento DeathMsg para sumar lo de los logros que lo 
    requieran*/
    
register_event("HLTV",         "ev_roundstart""a""1=0""2=0"/* registramos el evento cuando comiensa la ronda para
    guardar los logros cuando comiensa la misma*/
    
    
RegisterHam(Ham_Spawn,         "player",     "Ham_PlayerSpawn"1/* registramos el Ham_Spawn (cuando respawnea el player)
    para setear algunas condiciones y setear el team en una variable */
    
register_forward(FM_PlayerPreThink,     "PlayerPreThink"/* registramos la forward prethink para setear y checkear los saltos
    y los ducks*/
    
    
g_maxplayers get_maxplayers() // definimos la cantidad maxima de players en una variable
    
g_msgsync CreateHudSyncObj()  /* creamos un hud sincronizado para que no desaparescan los otros o simplemente no aparescan
    los mensajes de aviso de que gano logros */
    
    
nfv_file("Logros"VaultLogroscharsmax(VaultLogros)) // creamos el archivo en la carpeta data/nfvault con el nombre Logros 
}

public 
plugin_precache() { engfunc(EngFunc_PrecacheSoundlogro_completado); } // precacheamos un sonidito para cuando gane un logro

public client_putinserver(id) {// el cliente entro en el server
    
g_conectado[id] = TRUE// seteamos la variable en 1 osea en verdadero 
    
g_round TRUE // checkeamos la variable round en 1 para checkear los logros de matar en 1 ronda
    
get_user_nameidg_playernameid ], charsmaxg_playername[ ] ) ); /* definimos el nombre del jugador en la variable 
    g_playername*/
    
Cargar(id// cargamos datos
}

public 
client_disconnect(id) { // el cliente se desconecto
    
g_conectado[id] = FALSE // seteamos la variable en falso ya que se desconectó
    
g_round FALSE // seteamos la variable round en falso ya que se desconectó no puede hacer logros
    
    /*checkeamos si no cumplio el logro seteamos los contadores de los logros matar x en x ronda en 0*/
    
if(Logros[id][LOGRO_KILL_TT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_CT] = FALSE; } 
    if(
Logros[id][LOGRO_KILL_CT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_TT] = FALSE; }
    
    if(
CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
}

public 
ev_roundstart() { // cuando la ronda inicia
    
for(new id 1id <= g_maxplayersid++) // un loop para obtener todos los players
        
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
}


public 
motd_logros(id) { // esto no hace falta explicarlo ya que es un motd donde se muestran los logros, lo requerido y la cantidad
    
new tempstring[100], motd[1024];

    
format(motd,1024,"<html><body bgcolor=^"#000000^"><font size=^"2^" face=^"verdana^" color=^"#5CACEE^"><strong><b>Archivos del Jugador: %s</strong></b><br><br>", g_playername[id])
    
    
format(tempstring100"[Cazador de Logros - %d de %d Logros completados]<br><br>",contador[id][LOGROS_GANADOS], LOGROS_MAXIMOS-1
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_TT] == TRUE)
        
format(tempstring,100,"Agente especial         - 200/200 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Agente especial        - |Matar 200 terroristas| - %d/200<br>"contador[id][MUERTE_TT])
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_CT] == TRUE)
        
format(tempstring,100,"Come plomo, policia...    - 200/200 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Come plomo, policia...    - |Matar 200 policias| - %d/200<br>"contador[id][MUERTE_CT])
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_TT_RONDA] == TRUE)
        
format(tempstring,100,"Me gusta mi trabajo    - 5/5 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Me gusta mi trabajo    - |Matar 5 terroristas en 1 ronda| - %d/5<br>"contador[id][MUERTE_RONDA_TT])
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_CT_RONDA] == TRUE)
        
format(tempstring,100,"Ha este paso... EL MUNDO SERA NUESTRO    - 5/5 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Ha este paso... EL MUNDO SERA NUESTRO    - |Matar 5 policias en 1 ronda| - %d/5<br>"contador[id][MUERTE_RONDA_CT])
    
add(motd,1024,tempstring);
    
/*------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_REVENTADOS] == TRUE)
        
format(tempstring,100,"Reventados se ven mejor        - 250/250 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Reventados se ven mejor        - |Matar 250 ct o tt con escopeta| - %d/250<br>"contador[id][MUERTE_M3])
    
add(motd,1024,tempstring);
    
/*------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_CANGURO] == TRUE)
        
format(tempstring,100,"Los canguros me aman         - 500/500 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Los canguros me aman         - |Saltar 500 veces| - %d/500<br>"contador[id][SALTOS])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_AMO_EL_SCROLL] == TRUE)
        
format(tempstring,100,"Amo el scroll        - 500/500 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Amo el scroll        - |Agacharse 500 veces| - %d/500<br>"contador[id][DUCKS])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_ACUCHILLADO] == TRUE)
        
format(tempstring,100,"Cuchillito afilado :D    - 200/200 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Cuchillito afilado :D    - |Mata 200 jugadores con cuchillo| - %d/200<br>"contador[id][ACUCHILLADOS])
    
add(motd,1024,tempstring);
        
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_FRANCOTIRADOR] == TRUE)
        
format(tempstring,100,"Soy un francotirador!    - 100/100 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Soy un francotirador!     - |mata 100 ct o tt de headshot| - %d/25<br>"contador[id][HEADSHOTS])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_QUE_BUEN_SV] == TRUE)
        
format(tempstring,100,"Que buen mod!        - 25/25 [COMPLETADO]<br>")
    else
        
format(tempstring,100,"Que buen mod!     - |?????????| - %d/25<br>"contador[id][CONECCIONES])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
    /* se preguntaran por que el logro "Que buen mod!" aparece con ??????? es para que los users no se dediquen a salir y entrar
    del server con el fin de terminar este logro rapidamente*/
    
    
add(motd,1024,"</font></body></html>")
    
    
show_motd(id,motd,"Progreso logros");
    
}

public 
event_deathmsg() { // evento cuando muere la persona
    
static idid read_data(1// definimos id como read_data(1) osea atacante
    
static victimvictim read_data(2// definimos victim como read_data(2) osea victima
    
static headshotheadshot read_data(3// definimos headshot como read_data(3) osea si fue muerte por headshot
    
static arma[24]; get_killer_weapon(idpev(victimpev_dmg_inflictor), arma23/* con el stock get_killer_weapon
    obtenemos en la variable arma la arma con la cual mató*/
    
    
if(!is_user_connected(id) || victim == id// si no esta conectado o si la vitima es igual a id
    
return HAM_IGNORED// retorna sin ocurrir nada

    /*se checkean las condiciones correspondientes y se checkea si cumplio el logro*/
    
if(headshot) { contador[id][HEADSHOTS]++, chequear_logros(id9); } // logro francotirador
    
    
if(g_team_ct[id]) { contador[id][MUERTE_TT]++, chequear_logros(id1); } // logro super agente 
    
else { contador[id][MUERTE_CT]++, chequear_logros(id2); } // logro come plomo... policia
    
    
if(equalarma"m3" )) { contador[id][MUERTE_M3]++, chequear_logros(id5); } // logro reventados
    
    
if(equalarma"knife" )) { contador[id][ACUCHILLADOS]++, chequear_logros(id8); } // logro acuchillados
    
    
if(g_team_ct[id] && g_round == TRUE) { contador[id][MUERTE_RONDA_TT]++, chequear_logros(id3); } // logro agente especial
    
else { contador[id][MUERTE_RONDA_CT]++, chequear_logros(id4); } // logro ha este paso... EL MUNDO SERA NUESTRO
    
    
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
     
    
return PLUGIN_HANDLED// retornamos sin ocurrir nada
}

public 
Ham_PlayerSpawn(id) { // cuando el jugador respawnea
    
if(is_user_alive(id)) { // si esta vivo el jugador
        /*checkeamos si no cumplio el logro seteamos los contadores de los logros matar x en x ronda(s) en 0*/ 
        
if(Logros[id][LOGRO_KILL_TT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_CT] = FALSE; }
        if(
Logros[id][LOGRO_KILL_CT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_TT] = FALSE; }
        
        
g_round TRUE // seteamos la variable round en verdadero para checkear los logros de matar x en x ronda(s)
        
g_team_ct[id] = (cs_get_user_team(id) == CS_TEAM_CT TRUE FALSE/* obtenemos en la variable g_team_ct si es 
        policia si no lo es osea !g_team_ct es terrorista*/
        
        // print que te avisa que tiene sistema de logros y como abrir el menu :D
        
client_print(idprint_chat"este server corre con: sistema de logros v2.0 (escribe /logros para el menu)")
    }
}

public 
PlayerPreThink(id) {// evento de efectos en el player
    
if(!is_user_alive(id)) return; // si no esta vivo retorna
        
    
if((pev(idpev_button) & IN_DUCK) && !(pev(idpev_oldbuttons) & IN_DUCK)) {// si el boton presionado es el de duck (ctrl)
        
contador[id][DUCKS]++; // logro amo del scroll
        
chequear_logros(id7// checkeamos logro correspondiente
    
}
    
    if(
pev(idpev_flags) & FL_ONGROUND// deverdad no lo entiendo ya que no es codigo mio pero si es necesario
    
contador[id][SALTOS_ON] = true;
    else 
contador[id][SALTOS_ON] = false;

    if((
pev(idpev_button) & IN_JUMP) && !(pev(idpev_oldbuttons) & IN_JUMP) && contador[id][SALTOS_ON]) {// si el boton presionado es el de salto (espacio)
        
contador[id][SALTOS]++; // logro canguro
        
contador[id][SALTOS_ON] = false;
        
chequear_logros(id6// checkeamos logro correspondiente
    
}
}

public 
chequear_logros(idsulogro) { /* public para checkear logros este es el que no me gusto para nada si alguien sabe optimizarlo
si puede digalo para un aporte mas optimo ( soy nulo optimizando :c ) */
    
new rgblogroganado FALSE /* variables r, g, b para setear numeros a los colores de los mensages yo los puse random ustede
    ponganle el que quieran y variable logroganado para sabes si gano el logro y asi setearle unas condiciones y repetirlas tanto*/
    
random_num(1255//se seteara un color rojo al azar entre 1 y 255
    
random_num(1255//se seteara un color verde al azar entre 1 y 255
    
random_num(1255// se seteara un color azul al azar entre 1 y 255
    
switch(sulogro) {
        case 
1: {// esto lo explicare 1 ves ya que para todas las opciones es lo mismo :c
            
if (contador[id][MUERTE_TT] == 200) {// si el valor de el contador es igual a la cantidad requerida
                
switch (Logros[id][LOGRO_KILL_TT]) {/* hacemos un switch del logro ( no se si sera necesario pero 
                funciona corriganme si no es necesario*/
                    
case FALSE: {// opcion false osea 0      
                        
Logros[id][LOGRO_KILL_TT] = TRUE// seteamos el logro en true osea 1 ya que lo ganó
                        
logroganado TRUE /* seteamos la variable logroganado en verdadero para setear 
                        algunas condiciones*/ 
                        
set_hudmessage(rgb, -1.00.3023.04.00.020.022)  //seteamos la posicion del hud
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Agente especial!"); /* mostramos el
                        mensaje que gano el logro correspondiente
                        
                        y lamentablemente como soy imbecil y no se optimizar es asi con todos los cases :c*/
                    
}
                }          
            }
        }
        case 
2: {
            if (
contador[id][MUERTE_CT] == 200) {
                switch (
Logros[id][LOGRO_KILL_CT]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_KILL_CT] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Come plomo, policia...!");
                    }
                }          
            }
        }
        case 
3: {
            if (
contador[id][MUERTE_RONDA_TT] == 5) {
                switch (
Logros[id][LOGRO_KILL_TT_RONDA]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_KILL_TT_RONDA] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Me gusta mi trabajo");
                    }
                }          
            }
        }
        case 
4: {
            if (
contador[id][MUERTE_RONDA_CT] == 5) {
                switch (
Logros[id][LOGRO_KILL_CT_RONDA]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_KILL_CT_RONDA] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Ha este paso... EL MUNDO SERA NUESTRO!");
                    }
                }          
            }
        }
        case 
5: {
            if (
contador[id][MUERTE_M3] == 250) {
                switch (
Logros[id][LOGRO_REVENTADOS]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_REVENTADOS] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Reventados se ven mejor!");
                    }
                }          
            }
        }
        case 
6: {
            if (
contador[id][SALTOS] == 500) {
                switch (
Logros[id][LOGRO_CANGURO]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_CANGURO] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Los canguros me aman!");
                    }
                }          
            }
        }
        case 
7: {
            if (
contador[id][DUCKS] == 500) {
                switch (
Logros[id][LOGRO_AMO_EL_SCROLL]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_AMO_EL_SCROLL] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Amo del scroll!");
                    }
                }          
            }
        }
        case 
8: {
            if (
contador[id][ACUCHILLADOS] == 150) {
                switch (
Logros[id][LOGRO_ACUCHILLADO]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_ACUCHILLADO] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Cuchillito afilado :D!");
                    }
                }          
            }
        }
        case 
9: {
            if (
contador[id][HEADSHOTS] == 100) {
                switch (
Logros[id][LOGRO_FRANCOTIRADOR]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_FRANCOTIRADOR] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Soy un francotirador!");
                    }
                }          
            }
        }
        case 
10: {
            if (
contador[id][CONECCIONES] == 25) {
                switch (
Logros[id][LOGRO_QUE_BUEN_SV]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_QUE_BUEN_SV] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Que buen server!^nConcreta 25 conecciones ");
                    }
                }          
            }
        }
        case 
11: {
            if (
contador[id][LOGROS_GANADOS] == LOGROS_MAXIMOS-1) {
                switch (
Logros[id][LOGRO_QUE_BUEN_SV]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_QUE_BUEN_SV] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Cazador de logros!^ndesbloquea todos los logros!");
                    }
                }          
            }
        }
    }
    if(
logroganado) { // si la variable es verdadera osea si gano el logro (si quieren dar alguna ganancia coloquenla aquí)
        
client_cmd(id"spk %s"logro_completado); // mandamos un sonidito
        
contador[id][LOGROS_GANADOS]++, chequear_logros(id11// agregamos el logro ganado y lo checkeamos
        
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
        
        
logroganado FALSE // seteamos la variable en falso ya que ya se le setearon las condiciones mencionadas al logro ganado
    
}
}

Guardar(id) { // funcion para guardar los datos de los usuarios
    
formatex(szKeycharsmax(szKey), "data_logros"// Le damos formato a szKey con el nombre "data_logros" para luego usarlo
    /* Lo mismo aquí pero con szData pero con la diferencia que aquí le seteamos el valor actual de cada variable.*/
    
formatex(szLogroscharsmax(szLogros), "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"contador[id][MUERTE_CT], contador[id][MUERTE_TT], contador[id][MUERTE_RONDA_CT],
    
contador[id][MUERTE_RONDA_TT], contador[id][MUERTE_M3], contador[id][SALTOS], contador[id][DUCKS], contador[id][ACUCHILLADOS], contador[id][HEADSHOTS], contador[id][CONECCIONES], contador[id][LOGROS_GANADOS],
    
Logros[id][LOGRO_KILL_CT], Logros[id][LOGRO_KILL_TT], Logros[id][LOGRO_KILL_CT_RONDA], Logros[id][LOGRO_KILL_TT_RONDA], Logros[id][LOGRO_REVENTADOS],
    
Logros[id][LOGRO_CANGURO], Logros[id][LOGRO_AMO_EL_SCROLL], Logros[id][LOGRO_ACUCHILLADO], Logros[id][LOGRO_FRANCOTIRADOR], Logros[id][LOGRO_QUE_BUEN_SV], Logros[id][LOGRO_CAZADOR])
    
    
nfv_set_data(VaultLogrosszKeyg_playername[id], szLogros// Seteamos la key, nombre del usuario y la data
}

Cargar(id) { // funcion para cargar los datos de los usuarios
    
new g_load_c1[25], g_load_c2[25], g_load_c3[25], g_load_c4[25], g_load_c5[25], g_load_c6[25], g_load_c7[25], g_load_c8[25],
    
g_load_c9[25], g_load_c10[25], g_load_c11[25], g_load_l1[25], g_load_l2[25], g_load_l3[25], g_load_l4[25], g_load_l5[25], g_load_l6[25],
    
g_load_l7[25], g_load_l8[25], g_load_l9[25], g_load_l10[25], g_load_l11[25];
    
formatex(szKeycharsmax(szKey), "data_logros"// le damos un formato a szKey con el nombre data_logros para usarlo mas abajo
    
    
if(!nfv_get_data(VaultLogrosszKeyg_playername[id], szLogrossizeof(szLogros) - 1)) return; /* si no existe la data
    y la key o si no puede obtenerlos retorna*/
   
    /* separamos los datos correspondientes y los guardamos cada cual con su variable */
    
parse(szLogrosg_load_c1charsmax(g_load_c1), g_load_c2charsmax(g_load_c2), g_load_c3charsmax(g_load_c3),
    
g_load_c4charsmax(g_load_c4), g_load_c5charsmax(g_load_c5), g_load_c6charsmax(g_load_c6), g_load_c7charsmax(g_load_c7),
    
g_load_c8charsmax(g_load_c8), g_load_c9charsmax(g_load_c9), g_load_c10charsmax(g_load_c10), g_load_c11charsmax(g_load_c11), g_load_l1charsmax(g_load_l1),
    
g_load_l2charsmax(g_load_l2), g_load_l3charsmax(g_load_l3), g_load_l4charsmax(g_load_l4), g_load_l5charsmax(g_load_l5),
    
g_load_l6charsmax(g_load_l6), g_load_l7charsmax(g_load_l7), g_load_l8charsmax(g_load_l8), g_load_l9charsmax(g_load_l9), 
    
g_load_l10charsmax(g_load_l10), g_load_l11charsmax(g_load_l11))
   
    
/* pasamos de string a numero dandole los datos del data */
    
contador[id][MUERTE_CT] = str_to_num(g_load_c1)
    
contador[id][MUERTE_TT] = str_to_num(g_load_c2)
    
contador[id][MUERTE_RONDA_CT] = str_to_num(g_load_c3)
    
contador[id][MUERTE_RONDA_TT] = str_to_num(g_load_c4)
    
contador[id][MUERTE_M3] = str_to_num(g_load_c5)
    
contador[id][SALTOS] = str_to_num(g_load_c6)
    
contador[id][DUCKS] = str_to_num(g_load_c7)
    
contador[id][ACUCHILLADOS] = str_to_num(g_load_c8)
    
contador[id][HEADSHOTS] = str_to_num(g_load_c9)
    
contador[id][CONECCIONES] = str_to_num(g_load_c10)
    
contador[id][LOGROS_GANADOS] = str_to_num(g_load_c11)
    
    
Logros[id][LOGRO_KILL_CT] = str_to_num(g_load_l1)
    
Logros[id][LOGRO_KILL_TT] = str_to_num(g_load_l2)
    
Logros[id][LOGRO_KILL_CT_RONDA] = str_to_num(g_load_l3)
    
Logros[id][LOGRO_KILL_TT_RONDA] = str_to_num(g_load_l4)
    
Logros[id][LOGRO_REVENTADOS] = str_to_num(g_load_l5)
    
Logros[id][LOGRO_CANGURO] = str_to_num(g_load_l6)
    
Logros[id][LOGRO_AMO_EL_SCROLL] = str_to_num(g_load_l7)
    
Logros[id][LOGRO_ACUCHILLADO] = str_to_num(g_load_l8)
    
Logros[id][LOGRO_FRANCOTIRADOR] = str_to_num(g_load_l9)
    
Logros[id][LOGRO_QUE_BUEN_SV] = str_to_num(g_load_l10)
    
Logros[id][LOGRO_CAZADOR] = str_to_num(g_load_l11)
    
    
contador[id][CONECCIONES]++ // agregamos una coneccion
    
chequear_logros(id10// checkeamos el logro para saver si cumplio con las conecciones correspondientes


stock get_killer_weapon(killerinflictorretVar[], retLen) { // este stock no es mio pero sirve para obtener el arma con la que mató 
    
static killer_weapon_name[32]; killer_weapon_name "world"
    if (
pev_valid(killer) && (pev(killerpev_flags) & FL_CLIENT)) {
        if (
pev_valid(inflictor)) {
            if (
inflictor == killer) {
                new 
weapon get_user_weapon(killer);
                
get_weaponname(weaponkiller_weapon_name31);
            }
            else 
pev(inflictorpev_classnamekiller_weapon_name31);
        }
    }
    else {
        if (
pev_valid(killer)) pev(inflictorpev_classnamekiller_weapon_name31);
        else if (
killer == FALSEkiller_weapon_name "worldspawn";
    }
    if (
equal(killer_weapon_name"weapon_"7))
    
format(killer_weapon_name31"%s"killer_weapon_name[7]);
    else if (
equal(killer_weapon_name"monster_"8))
    
format(killer_weapon_name31"%s"killer_weapon_name[8]);
    else if (
equal(killer_weapon_name"func_"5))
    
format(killer_weapon_name31"%s"killer_weapon_name[5]);
    
formatex(retVarretLen"%s"killer_weapon_name);
}

/* Bueno creo que no me falto explicar nada si me equivoque en algo diganmelo para no generar confusiones y repito lo hise para los 
que no saben mucho o son muy nuevos ya que vi que se estaba pidiendo arto SALUDOS!!!*/ 

tambien les adjunto un sonidito para cuando gane un logro. ustedes pueden poner otro si lo desean


.rar   sonidito.rar (Tamaño: 44.52 KB / Descargas: 258)
Responder
#2
hola men muy bueno per como lo adapto para zp 4.3, lo podes adaptar?
Tenes una pentium 4.. ami no me engañas
Responder
#3
(06/03/2014, 07:26 PM)alangomez2 escribió: hola men muy bueno per como lo adapto para zp 4.3, lo podes adaptar?

es lo mismo nada mas saca la variable g_team_ct y lo que conlleva con esta y cambialo por !zp_get_user_zombie(id) o directamente !g_zombie[id] si lo usas en el mismo plugin

EDIT: si lo agregas al plugin directamente utiliza playerkilled, prethink, playerspawn que vienen con el zp para no crear mas
Responder
#4
Me tendrias que dejar creditos , ya que yo postie lo mismo , solo cambiastes variables* , arreglastes unos bugs y le pusistes guardado ..
Thebest Niggas!

[Imagen: 67957_543474049063124_922932978_n.jpg]
-Skype: juuan.-best
Responder
#5
(06/03/2014, 07:46 PM)Thebest escribió: Me tendrias que dejar creditos , ya que yo postie lo mismo , solo cambiastes variables* , arreglastes unos bugs y le pusistes guardado ..

JAJAJAJAJAJ porfavor no es por desvirtuar pero si te refieres a lo que esta 2 threads mas abajo estas muy equivocado, no te copie nada porque no necesito copiar codigos para algo tan facil aparte creditos de que si ese sistema lo publico CSaxel en otra pagina y mas encima bugs por todos lados en tu thread celdas de mas 2 variables para lo mismo pff y quieres creditos? este codigo lo hise yo todo a exepcion del stock get_killer_weapon que deje clarito que no es mio

EDIT por lo mismo hice este porque vi ese que tu publicaste y solo sirve para generar discuciones para los usuarios mas nuevos

respetos
Responder
#6
(06/03/2014, 08:15 PM)3mcy daimont escribió:
(06/03/2014, 07:46 PM)Thebest escribió: Me tendrias que dejar creditos , ya que yo postie lo mismo , solo cambiastes variables* , arreglastes unos bugs y le pusistes guardado ..

JAJAJAJAJAJ porfavor no es por desvirtuar pero si te refieres a lo que esta 2 threads mas abajo estas muy equivocado, no te copie nada porque no necesito copiar codigos para algo tan facil aparte creditos de que si ese sistema lo publico CSaxel en otra pagina y mas encima bugs por todos lados en tu thread celdas de mas 2 variables para lo mismo pff y quieres creditos? este codigo lo hise yo todo a exepcion del stock get_killer_weapon que deje clarito que no es mio...

Este code no lo hizistes vos ni en pedo amigo , perdon que te lo diga , solo cambias variables y agregas unas cosas mas , pensas que soy retrasado? no te defiendas con CSAxel , por que el no postea aca , y yo claramente le deje creditos , pero la cosa , no va a asi ...y menos hablar de esa forma , de sarcasmo .
Thebest Niggas!

[Imagen: 67957_543474049063124_922932978_n.jpg]
-Skype: juuan.-best
Responder
#7
(06/03/2014, 08:18 PM)Thebest escribió:
(06/03/2014, 08:15 PM)3mcy daimont escribió:
(06/03/2014, 07:46 PM)Thebest escribió: Me tendrias que dejar creditos , ya que yo postie lo mismo , solo cambiastes variables* , arreglastes unos bugs y le pusistes guardado ..

JAJAJAJAJAJ porfavor no es por desvirtuar pero si te refieres a lo que esta 2 threads mas abajo estas muy equivocado, no te copie nada porque no necesito copiar codigos para algo tan facil aparte creditos de que si ese sistema lo publico CSaxel en otra pagina y mas encima bugs por todos lados en tu thread celdas de mas 2 variables para lo mismo pff y quieres creditos? este codigo lo hise yo todo a exepcion del stock get_killer_weapon que deje clarito que no es mio...

Este code no lo hizistes vos ni en pedo amigo , perdon que te lo diga , solo cambias variables y agregas unas cosas mas , pensas que soy retrasado? no te defiendas con CSAxel , por que el no postea aca , y yo claramente le deje creditos , pero la cosa , no va a asi ...y menos hablar de esa forma , de sarcasmo .


Velo de la forma que tu quieras campeon a mi me da exactamente lo mismo lo que tu piensas ese codigo no lo copie , no utilize nisiquiera 1 sola variable mejor dedicate a comparar bien los codigos antes de decir que lo copie
Responder
#8
Si tienen problemas que arreglar, háganlo por privado. No quiero banear gente. El próximo comentario offtopic lo baneo.
Responder
#9
tampoco es un metodo GUAU que digamos para que sea exclusivo de CSAXEL, cualquiera con nivel basico en pawn puede hacerlo.
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#10
fw_Shutdown no va a funcionar nunca

estás guardando datos en playerprethink?... no por favor...
(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
undefined

(07/03/2014, 09:02 AM)RauliTop escribió: fw_Shutdown no va a funcionar nunca

estás guardando datos en playerprethink?... no por favor...

Listo saque el guardado en playerprethink (no sabia que era malo)
Fw_Shutdown lo borre mejor ( pienso que no funcionaba por lo del define )

cualquier otro bug o fix diganmelo nomas

gracias
Responder
#12
(07/03/2014, 01:20 PM)3mcy daimont escribió: undefined

(07/03/2014, 09:02 AM)RauliTop escribió: fw_Shutdown no va a funcionar nunca

estás guardando datos en playerprethink?... no por favor...

Listo saque el guardado en playerprethink (no sabia que era malo)
Arregle el Fw_Shutdown (Solo sacarle el FMRES_IGNORED)

cualquier otro bug o fix diganmelo nomas

gracias
adaptalo para zp para los que no savemos :$
Tenes una pentium 4.. ami no me engañas
Responder
#13
Código PHP:
public PlayerPreThink(id) {// evento de efectos en el player 

._.
Responder
#14
@3mcy daimon't

no me entendiste, fw_ShutDown jamás va a funcionar, así que bórralo
con guardar los datos en client_disconnect (y en algún lugar más por ejemplo, cuando desbloquea algo si quieres) es suficiente
(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
#15
(07/03/2014, 02:11 PM)alangomez2 escribió:
(07/03/2014, 01:20 PM)3mcy daimont escribió: undefined

(07/03/2014, 09:02 AM)RauliTop escribió: fw_Shutdown no va a funcionar nunca

estás guardando datos en playerprethink?... no por favor...

Listo saque el guardado en playerprethink (no sabia que era malo)
Arregle el Fw_Shutdown (Solo sacarle el FMRES_IGNORED)

cualquier otro bug o fix diganmelo nomas

gracias
adaptalo para zp para los que no savemos :$

es lo mismo si o usaras dentro del plugin coloca cada cosa en su lugar y cambiar g_team_ct por !g_zombie[id]

(07/03/2014, 02:44 PM)RauliTop escribió: @3mcy daimon't

no me entendiste, fw_ShutDown jamás va a funcionar, así que bórralo
con guardar los datos en client_disconnect (y en algún lugar más por ejemplo, cuando desbloquea algo si quieres) es suficiente

de acuerdo ya lo borre pero servira si lo guardo cuando termina el plugin??
(plugin_end)
Responder
#16
(07/03/2014, 05:51 PM)3mcy daimont escribió:
(07/03/2014, 02:11 PM)alangomez2 escribió:
(07/03/2014, 01:20 PM)3mcy daimont escribió: undefined

(07/03/2014, 09:02 AM)RauliTop escribió: fw_Shutdown no va a funcionar nunca

estás guardando datos en playerprethink?... no por favor...

Listo saque el guardado en playerprethink (no sabia que era malo)
Arregle el Fw_Shutdown (Solo sacarle el FMRES_IGNORED)

cualquier otro bug o fix diganmelo nomas

gracias
adaptalo para zp para los que no savemos :$

es lo mismo si o usaras dentro del plugin coloca cada cosa en su lugar y cambiar g_team_ct por !g_zombie[id]

(07/03/2014, 02:44 PM)RauliTop escribió: @3mcy daimon't

no me entendiste, fw_ShutDown jamás va a funcionar, así que bórralo
con guardar los datos en client_disconnect (y en algún lugar más por ejemplo, cuando desbloquea algo si quieres) es suficiente

de acuerdo ya lo borre pero servira si lo guardo cuando termina el plugin??
(plugin_end)
Qué tenés en contra de guardar en el client_disconnect?
Responder
#17
No no tengo contra eso de hecho no es lo que le pregunté solo le preguntaba si servia guardarlo en plugin_end pero bueno lo pondre para que guarde en el disconnect
Responder
#18
(07/03/2014, 09:06 PM)3mcy daimont escribió: No no tengo contra eso de hecho no es lo que le pregunté solo le preguntaba si servia guardarlo en plugin_end pero bueno lo pondre para que guarde en el disconnect

adapalo para zp :$ me vais a hacer llorar e.e desde q te lo estoy pidiendo pa zp xd (desde antier) pero igual se me hace 1 año xd

Proud
Tenes una pentium 4.. ami no me engañas
Responder
#19
de acuerdo aqui lo tienes para que veas lo facil que es:
Código PHP:
/********************************************************************************?****************************************************\
*    antes que nada decirles que esto lo hice pensando en la gente mas nueva que no sabe mucho y quiere tener algunos logros para *
*    mejorar la experiencia de juego... se que no esta optimizado para nada puesto que no conosco bien las tecnicas para una buena*
*    optimizacion, estoy abierto a criticas constructivas sobre cualquier fix a algun bug que yo no alla encontrado o alguna optimi_*
*    zación ya que el checkeo de los logros no me gusto para nada como lo hise.                             *
*                                                                                         *
*    bueno... que es esto?                                                             *
*                                                                     *
*    - es un sistema con 10 logros los cuales se especifican en el enum LOGRO_TIPO que ademas contiene un sistema de guardado     *
*      nfvault en el cual los logros se guardan por nombre y se muestran en un motd escribiendo el el say: /logros.               *
*                                                                         *
*    cualquier optimizacion para mejorar el aporte sera muy bien recibida.                                                        *
*                                                                             *
*    disfrutenlo y mas adelante tratare de optimizarlo y agregarle mas logros...                                                  *
*                                                                     *
*    SALUDOS!                                                               *
\*************************************************************************************************************************************/
/*************************************************************************************************************************************\                                                                         *
*    Changelog:                                                                 *
*          -v1.0: Plugin creado. 10 logros.                                             *
*          -v1.1: Agregado logro por si completa todos los logros | enumeradores para contadores y logros.             *                                 *
*          -v1.2: Agregado sistema de guardado nfvault.                                         *
*          -v1.3: Fix con error en el DeathMsg (estaban mal puesto los contadores en su respectivo checkeo).             *
*          -v1.4: Cambio de menu additem por menu motd... se ve mas atractivo d:                             *
*          -v1.5: Agregada 4 forwards de fakemeta por si se cae el server de 4 formas distintas se guarden los datos.         *
*          -v1.6: Pequeños fix's y limpieza de brazaletes que estaban demas.                             *
*          -v1.7: Corregido un error en la data del guardado.                                         *
*          -v1.8: Cambiado Playerkilled por Deathmsg.                                         *
*          -v1.9: Cambiado Client_prethink (engine) por FM_PlayerPrethink (fakemeta) y asi usar un include menos.         *
*          -v2.0: agregado hud sincronizado para evitar que desaparescan huds o no aparesca el mensaje del logro que gano.    *
*             posteo del plugin.                                                     *
\*******************************************************************************?*****************************************************/

//includes
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#include <cstrike>
#include <nfvault>
#include <zombieplague>

// definimos plugin, version blablabla...
#define PLUGIN "Logros"
#define VERSION "2.0"
#define AUTHOR "3MCy Daimon't~>"

// definimos un par de cosillas mas que nada por comodidad
#define TRUE 1
#define FALSE 0
#define CHECK g_conectado[id] && !is_user_bot(id) && !is_user_hltv(id)
#define LOGROS_MAXIMOS 12
#define CANTIDAD 100 // esta es la ganancia por logro completado coloca la que tu quieras

// Enumeradores para saber que logros son y el contador de cada logro
enum LOGRO_TIPO // en este enum asignamos una etiqueta para cada logro y asi hacerlo mas legible
    
LOGRO_KILL_CT 0// mata 200 sobrevivientes
    
LOGRO_KILL_TT// mata 200 zombies
    
LOGRO_KILL_CT_RONDA// mata 5 sobrevivientes en 1 ronda
    
LOGRO_KILL_TT_RONDA// mata 5 zombies en 1 ronda
    
LOGRO_REVENTADOS// mata 250 ct o tt con escopeta
    
LOGRO_CANGURO// saltar 500 veces
    
LOGRO_AMO_EL_SCROLL//agacharse 500 veces
    
LOGRO_ACUCHILLADO// matar 150 jugadores con cuchillo
    
LOGRO_FRANCOTIRADOR// matar 100 jugadores de headshot
    
LOGRO_QUE_BUEN_SV// Conectarse 25 veces
    
LOGRO_CAZADOR // completa todos los logros
}

enum LOGRO_CONTADOR // en este enum asignamos una etiqueta para cada variable y asi hacer mas legible el codigo.
    
MUERTE_CT 0,
    
MUERTE_TT,
    
MUERTE_RONDA_CT,
    
MUERTE_RONDA_TT,
    
MUERTE_M3,
    
SALTOS,
    
SALTOS_ON,
    
DUCKS,
    
ACUCHILLADOS,
    
HEADSHOTS,
    
CONECCIONES,
    
LOGROS_GANADOS
}
/*-------------*/

// Variables
new Logros[33][LOGRO_TIPO], contador[33][LOGRO_CONTADOR];
new 
g_conectado[33], g_playername[33][32];
new 
g_maxplayers,  g_roundg_msgsync;
new 
logro_completado[] = "logro_ganado.wav" // pueden poner el que quieran va en la carpeta sound

//guardado
new VaultLogros[128], szLogros[180], szKey[30]

public 
plugin_init() { // inicia el plugin
    
register_plugin(PLUGINVERSIONAUTHOR// registramos plugin, version blablabla
    
    
register_clcmd("say /logros""motd_logros"// registramos el comando para mostrarle el motd con los logros disponibles
    
    
register_event("DeathMsg",     "event_deathmsg""a"/* registramos el evento DeathMsg para sumar lo de los logros que lo 
    requieran*/
    
register_event("HLTV",         "ev_roundstart""a""1=0""2=0"/* registramos el evento cuando comiensa la ronda para
    guardar los logros cuando comiensa la misma*/
    
    
RegisterHam(Ham_Spawn,         "player",     "Ham_PlayerSpawn"1/* registramos el Ham_Spawn (cuando respawnea el player)
    para setear algunas condiciones y setear el team en una variable */
    
register_forward(FM_PlayerPreThink,     "PlayerPreThink"/* registramos la forward prethink para setear y checkear los saltos
    y los ducks*/
    
    /* registramos unas forwards de fakemeta para guardar datos si el server se cae de 4 maneras diferentes*/
    
register_forward(FM_Sys_Error,         "fw_Shutdown"// si ocurre un error en el sistema
    
register_forward(FM_GameShutdown,     "fw_Shutdown"// si el juego se cae
    
register_forward(FM_ServerDeactivate ,     "fw_Shutdown"// si el server se desactiva
    
register_forward(FM_ChangeLevel,     "fw_Shutdown"// si se cambia de mapa
    
    
g_maxplayers get_maxplayers() // definimos la cantidad maxima de players en una variable
    
g_msgsync CreateHudSyncObj()  /* creamos un hud sincronizado para que no desaparescan los otros o simplemente no aparescan
    los mensajes de aviso de que gano logros */
    
    
nfv_file("Logros"VaultLogroscharsmax(VaultLogros)) // creamos el archivo en la carpeta data/nfvault con el nombre Logros 
}

public 
plugin_precache() { engfunc(EngFunc_PrecacheSoundlogro_completado); } // precacheamos un sonidito para cuando gane un logro

public client_putinserver(id) {// el cliente entro en el server
    
g_conectado[id] = TRUE// seteamos la variable en 1 osea en verdadero 
    
g_round TRUE // checkeamos la variable round en 1 para checkear los logros de matar en 1 ronda
    
get_user_nameidg_playernameid ], charsmaxg_playername[ ] ) ); /* definimos el nombre del jugador en la variable 
    g_playername*/
    
Cargar(id// cargamos datos
}

public 
client_disconnect(id) { // el cliente se desconecto
    
g_conectado[id] = FALSE // seteamos la variable en falso ya que se desconectó
    
g_round FALSE // seteamos la variable round en falso ya que se desconectó no puede hacer logros
    
    /*checkeamos si no cumplio el logro seteamos los contadores de los logros matar x en x ronda en 0*/
    
if(Logros[id][LOGRO_KILL_TT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_CT] = FALSE; } 
    if(
Logros[id][LOGRO_KILL_CT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_TT] = FALSE; }
    
    if(
CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
}

public 
ev_roundstart() { // cuando la ronda inicia
    
for(new id 1id <= g_maxplayersid++) // un loop para obtener todos los players
        
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
}


public 
motd_logros(id) { // esto no hace falta explicarlo ya que es un motd donde se muestran los logros, lo requerido y la cantidad
    
new tempstring[100], motd[1024];

    
format(motd,1024,"<html><body bgcolor=^"#000000^"><font size=^"2^" face=^"verdana^" color=^"#5CACEE^"><strong><b>Archivos del Jugador: %s</strong></b><br><br>", g_playername[id])
    
    
format(tempstring100"[Cazador de Logros - %d de %d Logros completados]<br><br>",contador[id][LOGROS_GANADOS], LOGROS_MAXIMOS-1
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_TT] == TRUE)
    
format(tempstring,100,"Agente especial         - 200/200 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Agente especial        - |Matar 200 terroristas| - %d/200<br>"contador[id][MUERTE_TT])
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_CT] == TRUE)
    
format(tempstring,100,"Come plomo, policia...    - 200/200 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Come plomo, policia...    - |Matar 200 policias| - %d/200<br>"contador[id][MUERTE_CT])
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_TT_RONDA] == TRUE)
    
format(tempstring,100,"Me gusta mi trabajo    - 5/5 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Me gusta mi trabajo    - |Matar 5 terroristas en 1 ronda| - %d/5<br>"contador[id][MUERTE_RONDA_TT])
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_CT_RONDA] == TRUE)
    
format(tempstring,100,"Ha este paso... EL MUNDO SERA NUESTRO    - 5/5 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Ha este paso... EL MUNDO SERA NUESTRO    - |Matar 5 policias en 1 ronda| - %d/5<br>"contador[id][MUERTE_RONDA_CT])
    
add(motd,1024,tempstring);
    
/*------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_REVENTADOS] == TRUE)
    
format(tempstring,100,"Reventados se ven mejor        - 250/250 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Reventados se ven mejor        - |Matar 250 ct o tt con escopeta| - %d/250<br>"contador[id][MUERTE_M3])
    
add(motd,1024,tempstring);
    
/*------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_CANGURO] == TRUE)
    
format(tempstring,100,"Los canguros me aman         - 500/500 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Los canguros me aman         - |Saltar 500 veces| - %d/500<br>"contador[id][SALTOS])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_AMO_EL_SCROLL] == TRUE)
    
format(tempstring,100,"Amo el scroll        - 500/500 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Amo el scroll        - |Agacharse 500 veces| - %d/500<br>"contador[id][DUCKS])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_ACUCHILLADO] == TRUE)
    
format(tempstring,100,"Cuchillito afilado :D    - 200/200 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Cuchillito afilado :D    - |Mata 200 jugadores con cuchillo| - %d/200<br>"contador[id][ACUCHILLADOS])
    
add(motd,1024,tempstring);
        
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_FRANCOTIRADOR] == TRUE)
    
format(tempstring,100,"Soy un francotirador!    - 100/100 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Soy un francotirador!     - |mata 100 ct o tt de headshot| - %d/25<br>"contador[id][HEADSHOTS])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_QUE_BUEN_SV] == TRUE)
    
format(tempstring,100,"Que buen mod!        - 25/25 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Que buen mod!     - |?????????| - %d/25<br>"contador[id][CONECCIONES])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
    /* se preguntaran por que el logro "Que buen mod!" aparece con ??????? es para que los users no se dediquen a salir y entrar
    del server con el fin de terminar este logro rapidamente*/
    
    
add(motd,1024,"</font></body></html>")
    
    
show_motd(id,motd,"Progreso logros");
    
}

public 
event_deathmsg() { // evento cuando muere la persona
    
static idid read_data(1// definimos id como read_data(1) osea atacante
    
static victimvictim read_data(2// definimos victim como read_data(2) osea victima
    
static headshotheadshot read_data(3// definimos headshot como read_data(3) osea si fue muerte por headshot
    
static arma[24]; get_killer_weapon(idpev(victimpev_dmg_inflictor), arma23/* con el stock get_killer_weapon
    obtenemos en la variable arma la arma con la cual mató*/
    
    
if(!is_user_connected(id) || victim == id// si no esta conectado o si la vitima es igual a id
    
return HAM_IGNORED// retorna sin ocurrir nada

    /*se checkean las condiciones correspondientes y se checkea si cumplio el logro*/
    
if(headshot) { contador[id][HEADSHOTS]++, chequear_logros(id9); } // logro francotirador
    
    
if(!zp_get_user_zombie(id)) { contador[id][MUERTE_TT]++, chequear_logros(id1); } // logro super agente 
    
else { contador[id][MUERTE_CT]++, chequear_logros(id2); } // logro come plomo... policia
    
    
if(equalarma"m3" )) { contador[id][MUERTE_M3]++, chequear_logros(id5); } // logro reventados
    
    
if(equalarma"knife" )) { contador[id][ACUCHILLADOS]++, chequear_logros(id8); } // logro acuchillados
    
    
if(!zp_get_user_zombie(id) && g_round == TRUE) { contador[id][MUERTE_RONDA_TT]++, chequear_logros(id3); } // logro agente especial
    
else { contador[id][MUERTE_RONDA_CT]++, chequear_logros(id4); } // logro ha este paso... EL MUNDO SERA NUESTRO
    
    
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
     
    
return PLUGIN_HANDLED// retornamos sin ocurrir nada
}

public 
Ham_PlayerSpawn(id) { // cuando el jugador respawnea
    
if(is_user_alive(id)) { // si esta vivo el jugador
        /*checkeamos si no cumplio el logro seteamos los contadores de los logros matar x en x ronda(s) en 0*/ 
        
if(Logros[id][LOGRO_KILL_TT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_CT] = FALSE; }
        if(
Logros[id][LOGRO_KILL_CT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_TT] = FALSE; }
        
        
g_round TRUE // seteamos la variable round en verdadero para checkear los logros de matar x en x ronda(s)
        
        // print que te avisa que tiene sistema de logros y como abrir el menu :D
        
client_print(idprint_chat"este server corre con: sistema de logros v1.0 (escribe /logros para el menu)")
    }
}

public 
PlayerPreThink(id) {// evento de efectos en el player
    
if(!is_user_alive(id)) return; // si no esta vivo retorna
        
    
if((pev(idpev_button) & IN_DUCK) && !(pev(idpev_oldbuttons) & IN_DUCK)) {// si el boton presionado es el de duck (ctrl)
        
contador[id][DUCKS]++; // logro amo del scroll
        
chequear_logros(id7// checkeamos logro correspondiente
    
}
    
    if(
pev(idpev_flags) & FL_ONGROUND// deverdad no lo entiendo ya que no es codigo mio pero si es necesario
    
contador[id][SALTOS_ON] = true;
    else 
contador[id][SALTOS_ON] = false;

    if((
pev(idpev_button) & IN_JUMP) && !(pev(idpev_oldbuttons) & IN_JUMP) && contador[id][SALTOS_ON]) {// si el boton presionado es el de salto (espacio)
        
contador[id][SALTOS]++; // logro canguro
        
contador[id][SALTOS_ON] = false;
        
chequear_logros(id6// checkeamos logro correspondiente
    
}
    if(
CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
}

public 
fw_Shutdown() {// para guardar datos si se cae de 4 diferentes formas
    
static id ;for(id 1id <= g_maxplayersid++) { // variable estatica y loop para obtener todos los players 
    
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
    
}
}

public 
chequear_logros(idsulogro) { /* public para checkear logros este es el que no me gusto para nada si alguien sabe optimizarlo
si puede digalo para un aporte mas optimo ( soy nulo optimizando :c ) */
    
new rgblogroganado FALSE /* variables r, g, b para setear numeros a los colores de los mensages yo los puse random ustede
    ponganle el que quieran y variable logroganado para sabes si gano el logro y asi setearle unas condiciones y no repetirlas tanto*/
    
random_num(1255//se seteara un color rojo al azar entre 1 y 255
    
random_num(1255//se seteara un color verde al azar entre 1 y 255
    
random_num(1255// se seteara un color azul al azar entre 1 y 255
    
switch(sulogro) {
        case 
1: {// esto lo explicare 1 ves ya que para todas las opciones es lo mismo :c
            
if (contador[id][MUERTE_TT] == 200) {// si el valor de el contador es igual a la cantidad requerida
                
switch (Logros[id][LOGRO_KILL_TT]) {/* hacemos un switch del logro ( no se si sera necesario pero 
                funciona corriganme si no es necesario*/
                    
case FALSE: {// opcion false osea 0      
                        
Logros[id][LOGRO_KILL_TT] = TRUE// seteamos el logro en true osea 1 ya que lo ganó
                        
logroganado TRUE /* seteamos la variable logroganado en verdadero para setear 
                        algunas condiciones*/ 
                        
set_hudmessage(rgb, -1.00.3023.04.00.020.022)  //seteamos la posicion del hud
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Agente especial!"); /* mostramos el
                        mensaje que gano el logro correspondiente
                        
                        y lamentablemente como soy imbecil y no se optimizar es asi con todos los cases :c*/
                    
}
                }          
            }
        }
        case 
2: {
            if (
contador[id][MUERTE_CT] == 200) {
                switch (
Logros[id][LOGRO_KILL_CT]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_KILL_CT] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Come plomo, policia...!");
                    }
                }          
            }
        }
        case 
3: {
            if (
contador[id][MUERTE_RONDA_TT] == 5) {
                switch (
Logros[id][LOGRO_KILL_TT_RONDA]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_KILL_TT_RONDA] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Me gusta mi trabajo");
                    }
                }          
            }
        }
        case 
4: {
            if (
contador[id][MUERTE_RONDA_CT] == 5) {
                switch (
Logros[id][LOGRO_KILL_CT_RONDA]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_KILL_CT_RONDA] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Ha este paso... EL MUNDO SERA NUESTRO!");
                    }
                }          
            }
        }
        case 
5: {
            if (
contador[id][MUERTE_M3] == 250) {
                switch (
Logros[id][LOGRO_REVENTADOS]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_REVENTADOS] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Reventados se ven mejor!");
                    }
                }          
            }
        }
        case 
6: {
            if (
contador[id][SALTOS] == 500) {
                switch (
Logros[id][LOGRO_CANGURO]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_CANGURO] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Los canguros me aman!");
                    }
                }          
            }
        }
        case 
7: {
            if (
contador[id][DUCKS] == 500) {
                switch (
Logros[id][LOGRO_AMO_EL_SCROLL]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_AMO_EL_SCROLL] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Amo del scroll!");
                    }
                }          
            }
        }
        case 
8: {
            if (
contador[id][ACUCHILLADOS] == 150) {
                switch (
Logros[id][LOGRO_ACUCHILLADO]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_ACUCHILLADO] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Cuchillito afilado :D!");
                    }
                }          
            }
        }
        case 
9: {
            if (
contador[id][HEADSHOTS] == 100) {
                switch (
Logros[id][LOGRO_FRANCOTIRADOR]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_FRANCOTIRADOR] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Soy un francotirador!");
                    }
                }          
            }
        }
        case 
10: {
            if (
contador[id][CONECCIONES] == 25) {
                switch (
Logros[id][LOGRO_QUE_BUEN_SV]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_QUE_BUEN_SV] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Que buen server!^nConcreta 25 conecciones ");
                    }
                }          
            }
        }
        case 
11: {
            if (
contador[id][LOGROS_GANADOS] == LOGROS_MAXIMOS-1) {
                switch (
Logros[id][LOGRO_QUE_BUEN_SV]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_QUE_BUEN_SV] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Cazador de logros!^ndesbloquea todos los logros!");
                    }
                }          
            }
        }
    }
    if(
logroganado) { // si la variable es verdadera osea si gano el logro (si quieren dar alguna ganancia coloquenla aquí)
    
client_cmd(id"spk %s"logro_completado); // mandamos un sonidito
    
contador[id][LOGROS_GANADOS]++, chequear_logros(id11// agregamos el logro ganado y lo checkeamos
    
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) + CANTIDAD/* ganancia de ammopacks puesta en el define*/
    
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
        
    
logroganado FALSE // seteamos la variable en falso ya que ya se le setearon las condiciones mencionadas al logro ganado
    
}
}

Guardar(id) { // funcion para guardar los datos de los usuarios
    
formatex(szKeycharsmax(szKey), "data_logros"// Le damos formato a szKey con el nombre "data_logros" para luego usarlo
    /* Lo mismo aquí pero con szData pero con la diferencia que aquí le seteamos el valor actual de cada variable.*/
    
formatex(szLogroscharsmax(szLogros), "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"contador[id][MUERTE_CT], contador[id][MUERTE_TT], contador[id][MUERTE_RONDA_CT],
    
contador[id][MUERTE_RONDA_TT], contador[id][MUERTE_M3], contador[id][SALTOS], contador[id][DUCKS], contador[id][ACUCHILLADOS], contador[id][HEADSHOTS], contador[id][CONECCIONES], contador[id][LOGROS_GANADOS],
    
Logros[id][LOGRO_KILL_CT], Logros[id][LOGRO_KILL_TT], Logros[id][LOGRO_KILL_CT_RONDA], Logros[id][LOGRO_KILL_TT_RONDA], Logros[id][LOGRO_REVENTADOS],
    
Logros[id][LOGRO_CANGURO], Logros[id][LOGRO_AMO_EL_SCROLL], Logros[id][LOGRO_ACUCHILLADO], Logros[id][LOGRO_FRANCOTIRADOR], Logros[id][LOGRO_QUE_BUEN_SV], Logros[id][LOGRO_CAZADOR])
    
    
nfv_set_data(VaultLogrosszKeyg_playername[id], szLogros// Seteamos la key, nombre del usuario y la data
}

Cargar(id) { // funcion para cargar los datos de los usuarios
    
new g_load_c1[25], g_load_c2[25], g_load_c3[25], g_load_c4[25], g_load_c5[25], g_load_c6[25], g_load_c7[25], g_load_c8[25],
    
g_load_c9[25], g_load_c10[25], g_load_c11[25], g_load_l1[25], g_load_l2[25], g_load_l3[25], g_load_l4[25], g_load_l5[25], g_load_l6[25],
    
g_load_l7[25], g_load_l8[25], g_load_l9[25], g_load_l10[25], g_load_l11[25];
    
formatex(szKeycharsmax(szKey), "data_logros"// le damos un formato a szKey con el nombre data_logros para usarlo mas abajo
    
    
if(!nfv_get_data(VaultLogrosszKeyg_playername[id], szLogrossizeof(szLogros) - 1)) return; /* si no existe la data
    y la key o si no puede obtenerlos retorna*/
   
    /* separamos los datos correspondientes y los guardamos cada cual con su variable */
    
parse(szLogrosg_load_c1charsmax(g_load_c1), g_load_c2charsmax(g_load_c2), g_load_c3charsmax(g_load_c3),
    
g_load_c4charsmax(g_load_c4), g_load_c5charsmax(g_load_c5), g_load_c6charsmax(g_load_c6), g_load_c7charsmax(g_load_c7),
    
g_load_c8charsmax(g_load_c8), g_load_c9charsmax(g_load_c9), g_load_c10charsmax(g_load_c10), g_load_c11charsmax(g_load_c11), g_load_l1charsmax(g_load_l1),
    
g_load_l2charsmax(g_load_l2), g_load_l3charsmax(g_load_l3), g_load_l4charsmax(g_load_l4), g_load_l5charsmax(g_load_l5),
    
g_load_l6charsmax(g_load_l6), g_load_l7charsmax(g_load_l7), g_load_l8charsmax(g_load_l8), g_load_l9charsmax(g_load_l9), 
    
g_load_l10charsmax(g_load_l10), g_load_l11charsmax(g_load_l11))
   
    
/* pasamos de string a numero dandole los datos del data */
    
contador[id][MUERTE_CT] = str_to_num(g_load_c1)
    
contador[id][MUERTE_TT] = str_to_num(g_load_c2)
    
contador[id][MUERTE_RONDA_CT] = str_to_num(g_load_c3)
    
contador[id][MUERTE_RONDA_TT] = str_to_num(g_load_c4)
    
contador[id][MUERTE_M3] = str_to_num(g_load_c5)
    
contador[id][SALTOS] = str_to_num(g_load_c6)
    
contador[id][DUCKS] = str_to_num(g_load_c7)
    
contador[id][ACUCHILLADOS] = str_to_num(g_load_c8)
    
contador[id][HEADSHOTS] = str_to_num(g_load_c9)
    
contador[id][CONECCIONES] = str_to_num(g_load_c10)
    
contador[id][LOGROS_GANADOS] = str_to_num(g_load_c11)
    
    
Logros[id][LOGRO_KILL_CT] = str_to_num(g_load_l1)
    
Logros[id][LOGRO_KILL_TT] = str_to_num(g_load_l2)
    
Logros[id][LOGRO_KILL_CT_RONDA] = str_to_num(g_load_l3)
    
Logros[id][LOGRO_KILL_TT_RONDA] = str_to_num(g_load_l4)
    
Logros[id][LOGRO_REVENTADOS] = str_to_num(g_load_l5)
    
Logros[id][LOGRO_CANGURO] = str_to_num(g_load_l6)
    
Logros[id][LOGRO_AMO_EL_SCROLL] = str_to_num(g_load_l7)
    
Logros[id][LOGRO_ACUCHILLADO] = str_to_num(g_load_l8)
    
Logros[id][LOGRO_FRANCOTIRADOR] = str_to_num(g_load_l9)
    
Logros[id][LOGRO_QUE_BUEN_SV] = str_to_num(g_load_l10)
    
Logros[id][LOGRO_CAZADOR] = str_to_num(g_load_l11)
    
    
contador[id][CONECCIONES]++ // agregamos una coneccion
    
chequear_logros(id10// checkeamos el logro para saver si cumplio con las conecciones correspondientes


stock get_killer_weapon(killerinflictorretVar[], retLen) { // este stock no es mio pero sirve para obtener el arma con la que mató 
    
static killer_weapon_name[32]; killer_weapon_name "world"
    if (
pev_valid(killer) && (pev(killerpev_flags) & FL_CLIENT)) {
        if (
pev_valid(inflictor)) {
            if (
inflictor == killer) {
                new 
weapon get_user_weapon(killer);
                
get_weaponname(weaponkiller_weapon_name31);
            }
            else 
pev(inflictorpev_classnamekiller_weapon_name31);
        }
    }
    else {
        if (
pev_valid(killer)) pev(inflictorpev_classnamekiller_weapon_name31);
        else if (
killer == FALSEkiller_weapon_name "worldspawn";
    }
    if (
equal(killer_weapon_name"weapon_"7))
    
format(killer_weapon_name31"%s"killer_weapon_name[7]);
    else if (
equal(killer_weapon_name"monster_"8))
    
format(killer_weapon_name31"%s"killer_weapon_name[8]);
    else if (
equal(killer_weapon_name"func_"5))
    
format(killer_weapon_name31"%s"killer_weapon_name[5]);
    
formatex(retVarretLen"%s"killer_weapon_name);
}

/* Bueno creo que no me falto explicar nada si me equivoque en algo diganmelo para no generar confusiones y repito lo hise para los 
que no saben mucho o son muy nuevos ya que vi que se estaba pidiendo arto SALUDOS!!!*/ 

pd tu le cambias el nombre a los logros en el motd
Responder
#20
(07/03/2014, 09:29 PM)3mcy daimont escribió: de acuerdo aqui lo tienes para que veas lo facil que es:
Código PHP:
/************************************************************************************************************************************\
*    antes que nada decirles que esto lo hice pensando en la gente mas nueva que no sabe mucho y quiere tener algunos logros para *
*    mejorar la experiencia de juego... se que no esta optimizado para nada puesto que no conosco bien las tecnicas para una buena*
*    optimizacion, estoy abierto a criticas constructivas sobre cualquier fix a algun bug que yo no alla encontrado o alguna opti_*
*    zación ya que el checkeo de los logros no me gusto para nada como lo hise.                             *
*                                                                                         *
*    bueno... que es esto?                                                             *
*                                                                     *
*    - es un sistema con 10 logros los cuales se especifican en el enum LOGRO_TIPO que ademas contiene un sistema de guardado     *
*      nfvault en el cual los logros se guardan por nombre y se muestran en un motd escribiendo el el say: /logros.               *
*                                                                         *
*    cualquier optimizacion para mejorar el aporte sera muy bien recibida.                                                        *
*                                                                             *
*    disfrutenlo y mas adelante tratare de optimizarlo y agregarle mas logros...                                                  *
*                                                                     *
*    SALUDOS!                                                               *
\************************************************************************************************************************************/
/************************************************************************************************************************************\                                                                         *
*    Changelog:                                                                 *
*          -v1.0: Plugin creado. 10 logros.                                             *
*          -v1.1: Agregado logro por si completa todos los logros | enumeradores para contadores y logros.             *                                 *
*          -v1.2: Agregado sistema de guardado nfvault.                                         *
*          -v1.3: Fix con error en el DeathMsg (estaban mal puesto los contadores en su respectivo checkeo).             *
*          -v1.4: Cambio de menu additem por menu motd... se ve mas atractivo d:                             *
*          -v1.5: Agregada 4 forwards de fakemeta por si se cae el server de 4 formas distintas se guarden los datos.         *
*          -v1.6: Pequeños fix's y limpieza de brazaletes que estaban demas.                             *
*          -v1.7: Corregido un error en la data del guardado.                                         *
*          -v1.8: Cambiado Playerkilled por Deathmsg.                                         *
*          -v1.9: Cambiado Client_prethink (engine) por FM_PlayerPrethink (fakemeta) y asi usar un include menos.         *
*          -v2.0: agregado hud sincronizado para evitar que desaparescan huds o no aparesca el mensaje del logro que gano.    *
*             posteo del plugin.                                                     *
\************************************************************************************************************************************/

//includes
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#include <cstrike>
#include <nfvault>
#include <zombieplague>

// definimos plugin, version blablabla...
#define PLUGIN "Logros"
#define VERSION "2.0"
#define AUTHOR "3MCy Daimon't~>"

// definimos un par de cosillas mas que nada por comodidad
#define TRUE 1
#define FALSE 0
#define CHECK g_conectado[id] && !is_user_bot(id) && !is_user_hltv(id)
#define LOGROS_MAXIMOS 12

// Enumeradores para saber que logros son y el contador de cada logro
enum LOGRO_TIPO // en este enum asignamos una etiqueta para cada logro y asi hacerlo mas legible
    
LOGRO_KILL_CT 0// mata 200 sobrevivientes
    
LOGRO_KILL_TT// mata 200 zombies
    
LOGRO_KILL_CT_RONDA// mata 5 sobrevivientes en 1 ronda
    
LOGRO_KILL_TT_RONDA// mata 5 zombies en 1 ronda
    
LOGRO_REVENTADOS// mata 250 ct o tt con escopeta
    
LOGRO_CANGURO// saltar 500 veces
    
LOGRO_AMO_EL_SCROLL//agacharse 500 veces
    
LOGRO_ACUCHILLADO// matar 150 jugadores con cuchillo
    
LOGRO_FRANCOTIRADOR// matar 100 jugadores de headshot
    
LOGRO_QUE_BUEN_SV// Conectarse 25 veces
    
LOGRO_CAZADOR// completa todos los logros
    
LOGRO_GRANADERO
}

enum LOGRO_CONTADOR // en este enum asignamos una etiqueta para cada variable y asi hacer mas legible el codigo.
    
MUERTE_CT 0,
    
MUERTE_TT,
    
MUERTE_RONDA_CT,
    
MUERTE_RONDA_TT,
    
MUERTE_M3,
    
SALTOS,
    
SALTOS_ON,
    
DUCKS,
    
ACUCHILLADOS,
    
HEADSHOTS,
    
CONECCIONES,
    
LOGROS_GANADOS,
    
GRANADAS_LANZADAS
}
/*-------------*/

// Variables
new Logros[33][LOGRO_TIPO], contador[33][LOGRO_CONTADOR];
new 
g_conectado[33], g_playername[33][32];
new 
g_maxplayers,  g_roundg_msgsync;
new 
logro_completado[] = "logro_ganado.wav" // pueden poner el que quieran va en la carpeta sound

//guardado
new VaultLogros[128], szLogros[180], szKey[30]

public 
plugin_init() { // inicia el plugin
    
register_plugin(PLUGINVERSIONAUTHOR// registramos plugin, version blablabla
    
    
register_clcmd("say /logros""motd_logros"// registramos el comando para mostrarle el motd con los logros disponibles
    
    
register_event("DeathMsg",     "event_deathmsg""a"/* registramos el evento DeathMsg para sumar lo de los logros que lo 
    requieran*/
    
register_event("HLTV",         "ev_roundstart""a""1=0""2=0"/* registramos el evento cuando comiensa la ronda para
    guardar los logros cuando comiensa la misma*/
    
    
RegisterHam(Ham_Spawn,         "player",     "Ham_PlayerSpawn"1/* registramos el Ham_Spawn (cuando respawnea el player)
    para setear algunas condiciones y setear el team en una variable */
    
register_forward(FM_PlayerPreThink,     "PlayerPreThink"/* registramos la forward prethink para setear y checkear los saltos
    y los ducks*/
    
    /* registramos unas forwards de fakemeta para guardar datos si el server se cae de 4 maneras diferentes*/
    
register_forward(FM_Sys_Error,         "fw_Shutdown"// si ocurre un error en el sistema
    
register_forward(FM_GameShutdown,     "fw_Shutdown"// si el juego se cae
    
register_forward(FM_ServerDeactivate ,     "fw_Shutdown"// si el server se desactiva
    
register_forward(FM_ChangeLevel,     "fw_Shutdown"// si se cambia de mapa
    
    
g_maxplayers get_maxplayers() // definimos la cantidad maxima de players en una variable
    
g_msgsync CreateHudSyncObj()  /* creamos un hud sincronizado para que no desaparescan los otros o simplemente no aparescan
    los mensajes de aviso de que gano logros */
    
    
nfv_file("Logros"VaultLogroscharsmax(VaultLogros)) // creamos el archivo en la carpeta data/nfvault con el nombre Logros 
}

public 
plugin_precache() { engfunc(EngFunc_PrecacheSoundlogro_completado); } // precacheamos un sonidito para cuando gane un logro

public client_putinserver(id) {// el cliente entro en el server
    
g_conectado[id] = TRUE// seteamos la variable en 1 osea en verdadero 
    
g_round TRUE // checkeamos la variable round en 1 para checkear los logros de matar en 1 ronda
    
get_user_nameidg_playernameid ], charsmaxg_playername[ ] ) ); /* definimos el nombre del jugador en la variable 
    g_playername*/
    
Cargar(id// cargamos datos
}

public 
client_disconnect(id) { // el cliente se desconecto
    
g_conectado[id] = FALSE // seteamos la variable en falso ya que se desconectó
    
g_round FALSE // seteamos la variable round en falso ya que se desconectó no puede hacer logros
    
    /*checkeamos si no cumplio el logro seteamos los contadores de los logros matar x en x ronda en 0*/
    
if(Logros[id][LOGRO_KILL_TT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_CT] = FALSE; } 
    if(
Logros[id][LOGRO_KILL_CT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_TT] = FALSE; }
    
    if(
CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
}

public 
ev_roundstart() { // cuando la ronda inicia
    
for(new id 1id <= g_maxplayersid++) // un loop para obtener todos los players
        
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
}


public 
motd_logros(id) { // esto no hace falta explicarlo ya que es un motd donde se muestran los logros, lo requerido y la cantidad
    
new tempstring[100], motd[1024];

    
format(motd,1024,"<html><body bgcolor=^"#000000^"><font size=^"2^" face=^"verdana^" color=^"#5CACEE^"><strong><b>Archivos del Jugador: %s</strong></b><br><br>", g_playername[id])
    
    
format(tempstring100"[Cazador de Logros - %d de %d Logros completados]<br><br>",contador[id][LOGROS_GANADOS], LOGROS_MAXIMOS-1
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_TT] == TRUE)
    
format(tempstring,100,"Agente especial         - 200/200 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Agente especial        - |Matar 200 terroristas| - %d/200<br>"contador[id][MUERTE_TT])
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_CT] == TRUE)
    
format(tempstring,100,"Come plomo, policia...    - 200/200 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Come plomo, policia...    - |Matar 200 policias| - %d/200<br>"contador[id][MUERTE_CT])
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_TT_RONDA] == TRUE)
    
format(tempstring,100,"Me gusta mi trabajo    - 5/5 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Me gusta mi trabajo    - |Matar 5 terroristas en 1 ronda| - %d/5<br>"contador[id][MUERTE_RONDA_TT])
    
add(motd,1024,tempstring);
    
/*-----------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_KILL_CT_RONDA] == TRUE)
    
format(tempstring,100,"Ha este paso... EL MUNDO SERA NUESTRO    - 5/5 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Ha este paso... EL MUNDO SERA NUESTRO    - |Matar 5 policias en 1 ronda| - %d/5<br>"contador[id][MUERTE_RONDA_CT])
    
add(motd,1024,tempstring);
    
/*------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_REVENTADOS] == TRUE)
    
format(tempstring,100,"Reventados se ven mejor        - 250/250 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Reventados se ven mejor        - |Matar 250 ct o tt con escopeta| - %d/250<br>"contador[id][MUERTE_M3])
    
add(motd,1024,tempstring);
    
/*------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_CANGURO] == TRUE)
    
format(tempstring,100,"Los canguros me aman         - 500/500 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Los canguros me aman         - |Saltar 500 veces| - %d/500<br>"contador[id][SALTOS])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_AMO_EL_SCROLL] == TRUE)
    
format(tempstring,100,"Amo el scroll        - 500/500 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Amo el scroll        - |Agacharse 500 veces| - %d/500<br>"contador[id][DUCKS])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_ACUCHILLADO] == TRUE)
    
format(tempstring,100,"Cuchillito afilado :D    - 200/200 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Cuchillito afilado :D    - |Mata 200 jugadores con cuchillo| - %d/200<br>"contador[id][ACUCHILLADOS])
    
add(motd,1024,tempstring);
        
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_FRANCOTIRADOR] == TRUE)
    
format(tempstring,100,"Soy un francotirador!    - 100/100 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Soy un francotirador!     - |mata 100 ct o tt de headshot| - %d/25<br>"contador[id][HEADSHOTS])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
if (Logros[id][LOGRO_QUE_BUEN_SV] == TRUE)
    
format(tempstring,100,"Que buen mod!        - 25/25 [COMPLETADO]<br>")
    else 
format(tempstring,100,"Que buen mod!     - |?????????| - %d/25<br>"contador[id][CONECCIONES])
    
add(motd,1024,tempstring);
    
/*-------------------------------------------------------------------------------------------------------------------*/
    
    /* se preguntaran por que el logro "Que buen mod!" aparece con ??????? es para que los users no se dediquen a salir y entrar
    del server con el fin de terminar este logro rapidamente*/
    
    
add(motd,1024,"</font></body></html>")
    
    
show_motd(id,motd,"Progreso logros");
    
}

public 
event_deathmsg() { // evento cuando muere la persona
    
static idid read_data(1// definimos id como read_data(1) osea atacante
    
static victimvictim read_data(2// definimos victim como read_data(2) osea victima
    
static headshotheadshot read_data(3// definimos headshot como read_data(3) osea si fue muerte por headshot
    
static arma[24]; get_killer_weapon(idpev(victimpev_dmg_inflictor), arma23/* con el stock get_killer_weapon
    obtenemos en la variable arma la arma con la cual mató*/
    
    
if(!is_user_connected(id) || victim == id// si no esta conectado o si la vitima es igual a id
    
return HAM_IGNORED// retorna sin ocurrir nada

    /*se checkean las condiciones correspondientes y se checkea si cumplio el logro*/
    
if(headshot) { contador[id][HEADSHOTS]++, chequear_logros(id9); } // logro francotirador
    
    
if(!zp_get_user_zombie(id)) { contador[id][MUERTE_TT]++, chequear_logros(id1); } // logro super agente 
    
else { contador[id][MUERTE_CT]++, chequear_logros(id2); } // logro come plomo... policia
    
    
if(equalarma"m3" )) { contador[id][MUERTE_M3]++, chequear_logros(id5); } // logro reventados
    
    
if(equalarma"knife" )) { contador[id][ACUCHILLADOS]++, chequear_logros(id8); } // logro acuchillados
    
    
if(!zp_get_user_zombie(id) && g_round == TRUE) { contador[id][MUERTE_RONDA_TT]++, chequear_logros(id3); } // logro agente especial
    
else { contador[id][MUERTE_RONDA_CT]++, chequear_logros(id4); } // logro ha este paso... EL MUNDO SERA NUESTRO
    
    
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
     
    
return PLUGIN_HANDLED// retornamos sin ocurrir nada
}

public 
Ham_PlayerSpawn(id) { // cuando el jugador respawnea
    
if(is_user_alive(id)) { // si esta vivo el jugador
        /*checkeamos si no cumplio el logro seteamos los contadores de los logros matar x en x ronda(s) en 0*/ 
        
if(Logros[id][LOGRO_KILL_TT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_CT] = FALSE; }
        if(
Logros[id][LOGRO_KILL_CT_RONDA] != TRUE) { contador[id][MUERTE_RONDA_TT] = FALSE; }
        
        
g_round TRUE // seteamos la variable round en verdadero para checkear los logros de matar x en x ronda(s)
        
        // print que te avisa que tiene sistema de logros y como abrir el menu :D
        
client_print(idprint_chat"este server corre con: sistema de logros v1.0 (escribe /logros para el menu)")
    }
}

public 
PlayerPreThink(id) {// evento de efectos en el player
    
if(!is_user_alive(id)) return; // si no esta vivo retorna
        
    
if((pev(idpev_button) & IN_DUCK) && !(pev(idpev_oldbuttons) & IN_DUCK)) {// si el boton presionado es el de duck (ctrl)
        
contador[id][DUCKS]++; // logro amo del scroll
        
chequear_logros(id7// checkeamos logro correspondiente
    
}
    
    if(
pev(idpev_flags) & FL_ONGROUND// deverdad no lo entiendo ya que no es codigo mio pero si es necesario
    
contador[id][SALTOS_ON] = true;
    else 
contador[id][SALTOS_ON] = false;

    if((
pev(idpev_button) & IN_JUMP) && !(pev(idpev_oldbuttons) & IN_JUMP) && contador[id][SALTOS_ON]) {// si el boton presionado es el de salto (espacio)
        
contador[id][SALTOS]++; // logro canguro
        
contador[id][SALTOS_ON] = false;
        
chequear_logros(id6// checkeamos logro correspondiente
    
}
    if(
CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
}

public 
fw_Shutdown() {// para guardar datos si se cae de 4 diferentes formas
    
static id ;for(id 1id <= g_maxplayersid++) { // variable estatica y loop para obtener todos los players 
    
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
    
}
}

public 
chequear_logros(idsulogro) { /* public para checkear logros este es el que no me gusto para nada si alguien sabe optimizarlo
si puede digalo para un aporte mas optimo ( soy nulo optimizando :c ) */
    
new rgblogroganado FALSE /* variables r, g, b para setear numeros a los colores de los mensages yo los puse random ustede
    ponganle el que quieran y variable logroganado para sabes si gano el logro y asi setearle unas condiciones y no repetirlas tanto*/
    
random_num(1255//se seteara un color rojo al azar entre 1 y 255
    
random_num(1255//se seteara un color verde al azar entre 1 y 255
    
random_num(1255// se seteara un color azul al azar entre 1 y 255
    
switch(sulogro) {
        case 
1: {// esto lo explicare 1 ves ya que para todas las opciones es lo mismo :c
            
if (contador[id][MUERTE_TT] == 200) {// si el valor de el contador es igual a la cantidad requerida
                
switch (Logros[id][LOGRO_KILL_TT]) {/* hacemos un switch del logro ( no se si sera necesario pero 
                funciona corriganme si no es necesario*/
                    
case FALSE: {// opcion false osea 0      
                        
Logros[id][LOGRO_KILL_TT] = TRUE// seteamos el logro en true osea 1 ya que lo ganó
                        
logroganado TRUE /* seteamos la variable logroganado en verdadero para setear 
                        algunas condiciones*/ 
                        
set_hudmessage(rgb, -1.00.3023.04.00.020.022)  //seteamos la posicion del hud
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Agente especial!"); /* mostramos el
                        mensaje que gano el logro correspondiente
                        
                        y lamentablemente como soy imbecil y no se optimizar es asi con todos los cases :c*/
                    
}
                }          
            }
        }
        case 
2: {
            if (
contador[id][MUERTE_CT] == 200) {
                switch (
Logros[id][LOGRO_KILL_CT]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_KILL_CT] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Come plomo, policia...!");
                    }
                }          
            }
        }
        case 
3: {
            if (
contador[id][MUERTE_RONDA_TT] == 5) {
                switch (
Logros[id][LOGRO_KILL_TT_RONDA]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_KILL_TT_RONDA] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Me gusta mi trabajo");
                    }
                }          
            }
        }
        case 
4: {
            if (
contador[id][MUERTE_RONDA_CT] == 5) {
                switch (
Logros[id][LOGRO_KILL_CT_RONDA]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_KILL_CT_RONDA] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Ha este paso... EL MUNDO SERA NUESTRO!");
                    }
                }          
            }
        }
        case 
5: {
            if (
contador[id][MUERTE_M3] == 250) {
                switch (
Logros[id][LOGRO_REVENTADOS]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_REVENTADOS] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Reventados se ven mejor!");
                    }
                }          
            }
        }
        case 
6: {
            if (
contador[id][SALTOS] == 500) {
                switch (
Logros[id][LOGRO_CANGURO]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_CANGURO] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Los canguros me aman!");
                    }
                }          
            }
        }
        case 
7: {
            if (
contador[id][DUCKS] == 500) {
                switch (
Logros[id][LOGRO_AMO_EL_SCROLL]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_AMO_EL_SCROLL] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Amo del scroll!");
                    }
                }          
            }
        }
        case 
8: {
            if (
contador[id][ACUCHILLADOS] == 150) {
                switch (
Logros[id][LOGRO_ACUCHILLADO]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_ACUCHILLADO] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Cuchillito afilado :D!");
                    }
                }          
            }
        }
        case 
9: {
            if (
contador[id][HEADSHOTS] == 100) {
                switch (
Logros[id][LOGRO_FRANCOTIRADOR]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_FRANCOTIRADOR] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Soy un francotirador!");
                    }
                }          
            }
        }
        case 
10: {
            if (
contador[id][CONECCIONES] == 25) {
                switch (
Logros[id][LOGRO_QUE_BUEN_SV]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_QUE_BUEN_SV] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Que buen server!^nConcreta 25 conecciones ");
                    }
                }          
            }
        }
        case 
11: {
            if (
contador[id][LOGROS_GANADOS] == LOGROS_MAXIMOS-1) {
                switch (
Logros[id][LOGRO_QUE_BUEN_SV]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_QUE_BUEN_SV] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Cazador de logros!^ndesbloquea todos los logros!");
                    }
                }          
            }
        }
        case 
12: {
            if (
contador[id][GRANADAS_LANZADAS] == 250) {
                switch (
Logros[id][LOGRO_GRANADERO]) {
                    case 
FALSE: {
                        
Logros[id][LOGRO_GRANADERO] = TRUE;
                        
logroganado TRUE
                        set_hudmessage
(rgb, -1.00.3023.04.00.020.022)
                        
ShowSyncHudMsg(idg_msgsync"Logro completado: Granadero!^nLanza 250 Granadas!");
                    }
                }          
            }
        }
    }
    if(
logroganado) { // si la variable es verdadera osea si gano el logro (si quieren dar alguna ganancia coloquenla aquí)
        
client_cmd(id"spk %s"logro_completado); // mandamos un sonidito
        
contador[id][LOGROS_GANADOS]++, chequear_logros(id11// agregamos el logro ganado y lo checkeamos
        
if(CHECK) { Guardar(id); } // checkeamos lo del define y guardamos
        
        
logroganado FALSE // seteamos la variable en falso ya que ya se le setearon las condiciones mencionadas al logro ganado
    
}
}

Guardar(id) { // funcion para guardar los datos de los usuarios
    
formatex(szKeycharsmax(szKey), "data_logros"// Le damos formato a szKey con el nombre "data_logros" para luego usarlo
    /* Lo mismo aquí pero con szData pero con la diferencia que aquí le seteamos el valor actual de cada variable.*/
    
formatex(szLogroscharsmax(szLogros), "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"contador[id][MUERTE_CT], contador[id][MUERTE_TT], contador[id][MUERTE_RONDA_CT],
    
contador[id][MUERTE_RONDA_TT], contador[id][MUERTE_M3], contador[id][SALTOS], contador[id][DUCKS], contador[id][ACUCHILLADOS], contador[id][HEADSHOTS], contador[id][CONECCIONES], contador[id][LOGROS_GANADOS],
    
Logros[id][LOGRO_KILL_CT], Logros[id][LOGRO_KILL_TT], Logros[id][LOGRO_KILL_CT_RONDA], Logros[id][LOGRO_KILL_TT_RONDA], Logros[id][LOGRO_REVENTADOS],
    
Logros[id][LOGRO_CANGURO], Logros[id][LOGRO_AMO_EL_SCROLL], Logros[id][LOGRO_ACUCHILLADO], Logros[id][LOGRO_FRANCOTIRADOR], Logros[id][LOGRO_QUE_BUEN_SV], Logros[id][LOGRO_CAZADOR])
    
    
nfv_set_data(VaultLogrosszKeyg_playername[id], szLogros// Seteamos la key, nombre del usuario y la data
}

Cargar(id) { // funcion para cargar los datos de los usuarios
    
new g_load_c1[25], g_load_c2[25], g_load_c3[25], g_load_c4[25], g_load_c5[25], g_load_c6[25], g_load_c7[25], g_load_c8[25],
    
g_load_c9[25], g_load_c10[25], g_load_c11[25], g_load_l1[25], g_load_l2[25], g_load_l3[25], g_load_l4[25], g_load_l5[25], g_load_l6[25],
    
g_load_l7[25], g_load_l8[25], g_load_l9[25], g_load_l10[25], g_load_l11[25];
    
formatex(szKeycharsmax(szKey), "data_logros"// le damos un formato a szKey con el nombre data_logros para usarlo mas abajo
    
    
if(!nfv_get_data(VaultLogrosszKeyg_playername[id], szLogrossizeof(szLogros) - 1)) return; /* si no existe la data
    y la key o si no puede obtenerlos retorna*/
   
    /* separamos los datos correspondientes y los guardamos cada cual con su variable */
    
parse(szLogrosg_load_c1charsmax(g_load_c1), g_load_c2charsmax(g_load_c2), g_load_c3charsmax(g_load_c3),
    
g_load_c4charsmax(g_load_c4), g_load_c5charsmax(g_load_c5), g_load_c6charsmax(g_load_c6), g_load_c7charsmax(g_load_c7),
    
g_load_c8charsmax(g_load_c8), g_load_c9charsmax(g_load_c9), g_load_c10charsmax(g_load_c10), g_load_c11charsmax(g_load_c11), g_load_l1charsmax(g_load_l1),
    
g_load_l2charsmax(g_load_l2), g_load_l3charsmax(g_load_l3), g_load_l4charsmax(g_load_l4), g_load_l5charsmax(g_load_l5),
    
g_load_l6charsmax(g_load_l6), g_load_l7charsmax(g_load_l7), g_load_l8charsmax(g_load_l8), g_load_l9charsmax(g_load_l9), 
    
g_load_l10charsmax(g_load_l10), g_load_l11charsmax(g_load_l11))
   
    
/* pasamos de string a numero dandole los datos del data */
    
contador[id][MUERTE_CT] = str_to_num(g_load_c1)
    
contador[id][MUERTE_TT] = str_to_num(g_load_c2)
    
contador[id][MUERTE_RONDA_CT] = str_to_num(g_load_c3)
    
contador[id][MUERTE_RONDA_TT] = str_to_num(g_load_c4)
    
contador[id][MUERTE_M3] = str_to_num(g_load_c5)
    
contador[id][SALTOS] = str_to_num(g_load_c6)
    
contador[id][DUCKS] = str_to_num(g_load_c7)
    
contador[id][ACUCHILLADOS] = str_to_num(g_load_c8)
    
contador[id][HEADSHOTS] = str_to_num(g_load_c9)
    
contador[id][CONECCIONES] = str_to_num(g_load_c10)
    
contador[id][LOGROS_GANADOS] = str_to_num(g_load_c11)
    
    
Logros[id][LOGRO_KILL_CT] = str_to_num(g_load_l1)
    
Logros[id][LOGRO_KILL_TT] = str_to_num(g_load_l2)
    
Logros[id][LOGRO_KILL_CT_RONDA] = str_to_num(g_load_l3)
    
Logros[id][LOGRO_KILL_TT_RONDA] = str_to_num(g_load_l4)
    
Logros[id][LOGRO_REVENTADOS] = str_to_num(g_load_l5)
    
Logros[id][LOGRO_CANGURO] = str_to_num(g_load_l6)
    
Logros[id][LOGRO_AMO_EL_SCROLL] = str_to_num(g_load_l7)
    
Logros[id][LOGRO_ACUCHILLADO] = str_to_num(g_load_l8)
    
Logros[id][LOGRO_FRANCOTIRADOR] = str_to_num(g_load_l9)
    
Logros[id][LOGRO_QUE_BUEN_SV] = str_to_num(g_load_l10)
    
Logros[id][LOGRO_CAZADOR] = str_to_num(g_load_l11)
    
    
contador[id][CONECCIONES]++ // agregamos una coneccion
    
chequear_logros(id10// checkeamos el logro para saver si cumplio con las conecciones correspondientes


stock get_killer_weapon(killerinflictorretVar[], retLen) { // este stock no es mio pero sirve para obtener el arma con la que mató 
    
static killer_weapon_name[32]; killer_weapon_name "world"
    if (
pev_valid(killer) && (pev(killerpev_flags) & FL_CLIENT)) {
        if (
pev_valid(inflictor)) {
            if (
inflictor == killer) {
                new 
weapon get_user_weapon(killer);
                
get_weaponname(weaponkiller_weapon_name31);
            }
            else 
pev(inflictorpev_classnamekiller_weapon_name31);
        }
    }
    else {
        if (
pev_valid(killer)) pev(inflictorpev_classnamekiller_weapon_name31);
        else if (
killer == FALSEkiller_weapon_name "worldspawn";
    }
    if (
equal(killer_weapon_name"weapon_"7))
    
format(killer_weapon_name31"%s"killer_weapon_name[7]);
    else if (
equal(killer_weapon_name"monster_"8))
    
format(killer_weapon_name31"%s"killer_weapon_name[8]);
    else if (
equal(killer_weapon_name"func_"5))
    
format(killer_weapon_name31"%s"killer_weapon_name[5]);
    
formatex(retVarretLen"%s"killer_weapon_name);
}

/* Bueno creo que no me falto explicar nada si me equivoque en algo diganmelo para no generar confusiones y repito lo hise para los 
que no saben mucho o son muy nuevos ya que vi que se estaba pidiendo arto SALUDOS!!!*/ 

pd tu le cambias el nombre a los logros en el motd

no es solo eso y el premio que da? adaptalo para que sean ammo packs, por eso te digo no lo puedes hacer? si no bueno no hagas nada no importa ya :$ si no lo quieras hacer pues q mas
Tenes una pentium 4.. ami no me engañas
Responder
#21
Listo hay le puse una ganancia en ammopacks de 100 por cada logro terminado

edit si necesitas algo mas en el plugin para el zp dimelo nomas
Responder
#22
(07/03/2014, 10:47 PM)3mcy daimont escribió: Listo hay le puse una ganancia en ammopacks de 100 por cada logro terminado

edit si necesitas algo mas en el plugin para el zp dimelo nomas

aja donde esta no lo veo pasamelo por aki el adjunto :$ plss
Tenes una pentium 4.. ami no me engañas
Responder
#23
(08/03/2014, 12:37 AM)alangomez2 escribió:
(07/03/2014, 10:47 PM)3mcy daimont escribió: Listo hay le puse una ganancia en ammopacks de 100 por cada logro terminado

edit si necesitas algo mas en el plugin para el zp dimelo nomas

aja donde esta no lo veo pasamelo por aki el adjunto :$ plss

es el mismo que te pase mas arriba nada mas que lo edite
Responder
#24
(08/03/2014, 12:52 AM)3mcy daimont escribió:
(08/03/2014, 12:37 AM)alangomez2 escribió:
(07/03/2014, 10:47 PM)3mcy daimont escribió: Listo hay le puse una ganancia en ammopacks de 100 por cada logro terminado

edit si necesitas algo mas en el plugin para el zp dimelo nomas

aja donde esta no lo veo pasamelo por aki el adjunto :$ plss

es el mismo que te pase mas arriba nada mas que lo edite

lo hicistes todo apresurado depaso que me tira 2 warnigs de lose identation y 1 error bb_get_user_ammopacks? que significa bb?

logre quitar el error lo pongo pero nada no me abre el menu, dejalo haci busco otro sistema por hay, o si lo editas bien tal vez
Tenes una pentium 4.. ami no me engañas
Responder
#25
(08/03/2014, 01:00 AM)alangomez2 escribió:
(08/03/2014, 12:52 AM)3mcy daimont escribió:
(08/03/2014, 12:37 AM)alangomez2 escribió:
(07/03/2014, 10:47 PM)3mcy daimont escribió: Listo hay le puse una ganancia en ammopacks de 100 por cada logro terminado

edit si necesitas algo mas en el plugin para el zp dimelo nomas

aja donde esta no lo veo pasamelo por aki el adjunto :$ plss

es el mismo que te pase mas arriba nada mas que lo edite

lo hicistes todo apresurado depaso que me tira 2 warnigs de lose identation y 1 error bb_get_user_ammopacks? que significa bb?

logre quitar el error lo pongo pero nada no me abre el menu, dejalo haci busco otro sistema por hay, o si lo editas bien tal vez

Disculpame alan me di cuente y lo edite justo unos momentos antes de que pusieras este comentario pero ya lo arregle y lo testie y funciona perfecto perdon por las molestias!
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)