[TUT] Crear niveles por MACRO.  Hitskin_logo Hitskin.com

Isto é uma pré-visualização de um tema em Hitskin.com
Instalar o temaVoltar para a ficha do tema

Zplague

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Seu portal de Zombie Plague no Brasil

Zumbis Online

Últimos assuntos

» [ANÚNCIO] Alguem vivo ai?
por [Dk]Serial-Killer Ontem à(s) 12:46 am

» The Fen1xS CLan | Zombie Plague | [XP/LEVELS] #2024
por hevy 5/7/2024, 8:28 pm

»
por Eclipse 29/2/2024, 12:30 am

» [Plugin] /vm Com Status
por Isr7 4/6/2023, 3:24 pm

» Alguém pra manter um servidor comigo?
por Isr7 3/6/2023, 4:52 pm

» Alguém querendo criar um servidor de zp? eu pago a host quem quiser deixar o discord ai Isr7#6920
por Isr7 3/6/2023, 3:18 pm

» PEDIDO: Multijump pros VIP
por Madness 15/3/2023, 3:44 pm

» [ZP] Modo padre para 5.0
por XperitosEspetinho123 15/7/2022, 3:31 pm

» [KZ] Servidores de cs 1.6
por [Dk]Serial-Killer 7/5/2022, 4:12 am

» [PLUGIN BY SKVD & WILLIAN] SHOP DE FANTASIAS
por dushowW 23/7/2020, 5:44 pm

Os membros mais ativos da semana

Frases filosóficas Zplague:

....

Google Adsense

Estatísticas

Os nossos membros postaram um total de 38142 mensagens em 6680 assuntos

Temos 2796 usuários registrados

O último membro registrado é zmplugins - Henrique


    [TUT] Crear niveles por MACRO.

    Junin
    Junin
    Administrador


    Nick : jr_acn
    Masculino Número de Mensagens : 1988
    Ammo Packs : 4615
    Honra : 149
    Data de inscrição : 12/03/2009

    [TUT] Crear niveles por MACRO.  Empty [TUT] Crear niveles por MACRO.

    Mensagem por Junin 19/6/2012, 9:09 pm

    Bien, como nunca vi que lo hayan posteado en alguna parte, o si lo postearon no me importa, aquí les demostrare como utilizar MACRO's para realizar cuentas matemáticas útiles para diferentes tipos de ecuaciones. En este caso el conteo de la EXP, AP, Frags, necesarios para el siguiente nivel.

    Un MACRO se define de esta forma:

    Código:

    #include <amxmisc>
    #include <amxmodx>
    #include <hamsandwich>

    /* Como es una constante en el tiempo, en programación se utilizan mayúsculas en el nombre del mismo */

    /* Para declarar parámetros en un MACRO, se utiliza un '%' seguido de un número que lo identifique, los parametros deben ir sin separaciones luego de la coma, me ha pasado con diferentes MACRO's que el valor que retorna, a veces termina en basura */

    /* Luego se pasa a declarar la ecuación, o simplemente atribuirla a una variable */

    /* Como se que se van a poner a experimentar con los MACRO's (supongo o.o), alguno por ahí le va a pasar lo mismo que a mi, dentro de un macro no se pueden utilizar condicionales, no me refiero a IF o ELSE si no '?' y ':', me terminaba tirando un error de compilacion */

    /* Bien les pasare una ecuación que no es muy utilizada pero es muy buena, debido a que todos se basan en una regla de superioridad al valor anterior, en este caso ustedes imaginen que yo tengo una array como esta:*/

    /* new iValues[] = { 10, 30, 60, 100, 150, ... }; */

    /* Como ven la EXP requerida para el siguiente nivel, aumenta tipo piramide, ya que el valor que necesita actualmente para avanzar en nivel, es el valor anterior mas el actual, lo cual me rompio demasiado las bolas, hasta que encontre cuya ecuación capaz de realizar ese conteo, se llama "Sucesión de Fibonacci, se debe trabajar con floats ya que un momento el posible resultado de una parte de la ecuacion retorna decimales necesarios para la sucesión de la ecuación */

    // Experiencia para siguiente nivel.
    #define NOMBRE_DEL_MACRO(%1)        floatround( ( (%1 + 1) * float(%1 / 2) ) * 10 )

    // Experiencia del nivel anterior.
    #define NOMBRE_DEL_MACRO2(%1)        floatround( ( %1 * float((%1-1) / 2) ) * 10 )

    /* Con este MACRO, tenemos todos la EXP necesaria, sin necesidad de un Array, la cual retornara valores, si se podria decir infinitamente, lo cual no es completamente cierto, ya que todo tiene un limite */

    /* Definimos las variables necesarias para el conteo del nivel y experiencia */

    new g_level[33];    // Conteo de level
    new g_exp[33];        // Conteo de EXP

    public plugin_init()
    {
        register_plugin( "NOMBRE", "VERSION", "AUTOR" ); // Registro el plugin.
       
        // Llamo a la forward de la libreria Ham Sandwich: Ham_Killed
        /* Esta función es llamada cuando una entidad de Classname "player" muere (la vida de la entidad es igual o menor a 0) */
        /* El 4to parametro indica que la función se ejecutara posterior a la muerte de la entidad y no antes, esto se debe a no interferir con ninguna función del CS Engine */
        RegisterHam( Ham_Killed, "player", "Ham_PlayerKilled", 1 );
    }

    public client_putinserver(id)
    {
        // Reseteo valores cuando el usuario esta dentro del servidor
        g_level[id] = 1;
        g_exp[id] = 0;
    }

    /* Esta función devuelve los valores, tales como la victima, y el atacante cuando un usuario es asesinado */
    public Ham_PlayerKilled( victim, attacker )
    {
        // Si el atacante o victima no se encuentran conectados, no prosigo
        if( !is_user_connected(victim) || !is_user_connected(attacker) )
            return HAM_IGNORED;

        // Si el equipo de la victima es igual al del atacante, no prosigo
        if( get_user_team(victim) == get_user_team(attacker) )
            return HAM_IGNORED;

        // Si todo se cumple, le aumento un punto de experiencia al atacante
        update_xp(attacker, 1);
       
        // Devuelvo un valor, debido a las reglas de compilación
        return HAM_IGNORED;
    }

    /* Parametros:
        @id Es el index del usuario, el numero que identifica al cliente conectado al servidor
        @value Es el valor que puede diferir entre negativo y positivo, el cual segun su signo, aumenta o disminuye el valor de la EXP */
    public update_xp(id, value)
    {
        /* Si el valor de value es negativo, y es mayor que la EXP, no prosigo */
        if( ( g_exp[id] + value ) < 0 ) return 0;

        /* Aumento o disminuyo el valor de la EXP */
        g_exp[id] += value;

        /* Si el valor de value es positivo ... */
        if( value )
        {
            /* Mientras la experiencia que tenga sea mayor que la EXP necesaria para el
            siguiente nivel */
            while( g_exp[id] >= NOMBRE_DEL_MACRO(g_level[id]) )
            {
                /* Verifico si el usuario sigue conectado, si no devuelvo valor y no prosigo */
                if( !is_user_connected(id) ) return 0;   

                /* Le imprimo un mensaje al usuario y aumento el nivel */
                client_print(id, print_chat, "Has aumentado de nivel: %d", ++g_level[id]);
            }
        }
        else // Si el valor de value no es positivo
        {
            /* Mientras la experiencia sea menor que la EXP necesaria para el nivel anterior al actual */
            while( g_exp[id] < NOMBRE_DEL_MACRO2(g_level[id]) )
            {
                /* Verifico si el usuario sigue conectado, si no devuelvo valor y no prosigo */
                if( !is_user_connected(id) ) return 0;
                /* Le imprimo un mensaje al usuario y disminuyo el nivel */
                client_print(id, print_chat, "Has disminuido de nivel: %d", --g_level[id]);
            }
        }
       
        /* Devuelvo valor, debido a las reglas de compilación */
        return 1;
    }
               
    Saludos, cualquier duda, correcion estoy a disposición.

    by http://forums.alliedmods.net/showthread.php?t=173940


      Data/hora atual: 26/11/2024, 11:55 am