[ZP][TUT] Niveles por exp de armamento
#1
Hola gente, bueno hoy me dieron ganas de aportar algo y voy a hacerles un tutorial de como hacer un sistema de experiencia para cada tipo de armas

Bueno empezamos

Código PHP:
// Creamos una variable con multidimencional (5 celdas)
// En esta variable guardaremos el nivel de cada tipo de arma, en este caso son 5 tipos de armas

new g_levelexp[33][5]

// Ahora creamos la variable de experiencia tambien con 5 dimenciones, ya que son 5 tipos de armas
// En este caso la variable la hago flotante para que pueda ir sumando en decimales y poder mostrar un porcentaje
// Cada uno la modifica asu gusto

new Floatg_exp[33][5]

// Pasamos a las constantes

// Creamos una constante para definir el nombre de cada tipo de armamento
new const g_expname[][] = {
    
"Pistolas",
    
"Gruesos calibres",
    
"Semi-automaticas",
    
"Rifles de asalto",
    
"Rifles de presicion"
}
// Bien, ahora nos dirigimos al la funcion de cuando recibimos o hacemos daño, al forward TakeDamage

public fw_TakeDamage(victiminflictorattackerFloat:damagedamage_type)
{
    static 
gWeapId // Creamos un static para guardar que tipo de arma que lleve el jugador
    
    
if (is_user_connected(attacker)) // Si el usuario esta conectado
        
gWeapId get_user_weapon(attacker// A la variable gWeapIid le asignamos una funcion que detecta que tipo de arma esta usando el jugador
    
    
    // Nos dirigimos al while que condiciona la ganancia de ammopacks con respecto al daño acumulado y agregamos lo siguiente...
    
    // Reward ammo packs for every [ammo damage] dealt
    
while (g_damagedealt[attacker] > (get_pcvar_num(cvar_ammodamage)))
    {
        
g_ammopacks[attacker]+= get_pcvar_num(cvar_ammoreward)
        
g_damagedealt[attacker] -= get_pcvar_num(cvar_ammodamage)
        switch (
gWeapId// Hacemos un switch para ver que arma esta usando y que exp sumarle
        
{
            
// En el caso de que este usando alguna de las pistolas...
            
case CSW_GLOCK18,CSW_P228,CSW_FIVESEVEN,CSW_USP,CSW_DEAGLE,CSW_ELITEg_exp[attacker][0] += 0.01 // Le sumamos 0.01 de experiencia
            // En el caso de que este usando alguna de las armas de grueso calibre.
            
case CSW_XM1014,CSW_M3,CSW_M249g_exp[attacker][1] += 0.01 // Le sumamos 0.01 de experiencia
            // En el caso de que este usando alguna de las armas semiautomaticas...
            
case CSW_TMP,CSW_MAC10,CSW_UMP45,CSW_MP5NAVY,CSW_FAMAS,CSW_GALIL,CSW_AUG,CSW_P90g_exp[attacker][2] += 0.01 // Le sumamos 0.01 de experiencia
            // En el caso de que este usando alguna de los rifles de asalto...
            
case CSW_SG552,CSW_AK47,CSW_M4A1g_exp[attacker][3] += 0.01 // Le sumamos 0.01 de experiencia
            // En el caso de que este usando alguna de los rifles de precision
            
case CSW_AWP,CSW_SCOUT,CSW_SG550,CSW_G3SG1g_exp[attacker][4] += 0.01 // Le sumamos 0.01 de experiencia
        
}
        
check_exp(attacker// Checkeamos la exp del atacante aver si es apto para subir de lvl del arma correspondiente
    
}
}

check_exp(id// Creamos la funcion para incrementar el nivel del arma
{
    for (new 
0sizeof g_expnamei++) // Hacemos un loop para saber que tipo de exp gano el atacante, el limite del loop sera la cantidad de los nombres de los tipos de armas
    
{
        if(
g_levelexp[id][i] >= 10) return; // Aca ponemos un limite para que si es el nivel es mayor o igual a 10 en el tipo de arma que gana la exp
            
        
while (g_exp[id][i] >= 100.00// Hacemos un while para que mientras la exp del tipo de arma sea mayor o igual a 100.00 o sea lleguemos a un 100%
        
{
            
g_levelexp[id][i]++ // Incrementamos el nivel del respectivo tipo de arma
            
zp_colored_print(id"^x04[ZP]^x01 Has incrementado tu habilidad con ^x04%s^x01 al Nivel ^x04%d^x01"g_expname[i], g_levelexp[id][i]) // Mandamos  un print para avisar a q nivel subio y q tipo de arma subio
            
g_exp[id][i] = 0.00 // Reseteamos la exp q llego a 100% a 0.00 %                                            
        
}                                            
        break; 
// Cerramos el loop                                            
    
}
}
    
// Vamos a la funcion reset_vars
// Reset Player Vars
reset_vars(idresetallresetpj)
{
    
    
    if (
resetall// Adentro de esta funcion se resetean algunas variables al conectarse el jugador al sv
    
{
        for (new 
0sizeof g_expnamei++) // Hacemos un loop con todas las exp y niveles de las armas
            
g_levelexp[id][i] = g_exp[id][i] = // reiniciamos todo a 0
    
}
    
    


Lo edite de milmaneras al code pero se vee horrible la parte del TakeDamage asi que les dejo el sma adjunto asi lo ven mejor

Con esto pueden crear facilmente un menu o agregar al hud el precentaje de xp de cada arma...

Todo en bandeja no se los voy a dar xD, demasiado les explique

Acepto criticas siempre y cuando sean constructivas!

Saludos...!


Archivos adjuntos
.sma   Descargar AMXX / zp_tut_exp_armas.sma (Tamaño: 4.32 KB / Descargas: 73)
Responder
#2
Buena idea, puede servir para crear algun tipo de logro en misiones, etc.
Responder
#3
el while debería ser así
Código PHP:
while (g_exp[id][i] >= 100.00 && g_levelexp[id][i] < 10

y puedes borrar el return de arriba.

Explico por qué hay que ponerlo así?
Pongamos de ejemplo que alguien sube 2 niveles de golpe, y está en nivel 9, pues subirá al 11, cambiando lo que te dije ya no Gran sonrisa

Si a lo mejor me dicen, subir 2 niveles de golpe es imposible, pero no se sabe, a lo mejor alguien hace un comando para admin y se dá exp, mejor dejarlo como lo puse yo y evitamos futuros errores.
(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
#4
Es lo mismo, siempre va a cheaquear que el nivel sea menor que 10 , si no es menor que 10 no va a proceder con el while ... xd
Responder
#5
(07/12/2013, 11:55 PM)01ctrlfreak escribió: Es lo mismo, siempre va a cheaquear que el nivel sea menor que 10 , si no es menor que 10 no va a proceder con el while ... xd

no es lo mismo, no leiste.

si soy nivel 9 pasará el primer if, pero si luego subo dos niveles de golpe con el while nunca detecta el if anterior.
(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
#6
Con ese sistema no hay forma de que suba 2 niveles de golpe... a no ser de que haya alguna ganancia extra como por ej: un combo de exp

Igual esta mejor como pusiste vos, yo lo puse asi ahora en el mio xDD
Responder
#7
Muy bueno me diste una idea como hacerlo para recoil Guiño
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)