XP Based Plugin - Tutorial!

For scripting examples for learning how to use AMXX.
User avatar
Archive-Poster
Posts: 1229
Gender:
United States of America

Re: XP Based Plugin - Tutorial!

Post by Archive-Poster »

also can I do it like that?

Code: Select all

new const LEVELS[20] = {
    1000, 
    2000, 
    3000,
    4000,
    5000,
    6000,
    7000,
    8000,
    9000,
   10000,
   11000,
   12000,
   13000,
   14000,
   15000,
   16000,
   17000,
   18000,
   19000,
   20000 
That would not work.

Use this instead

Code: Select all

new const LEVELS[] = {
    1000, 
    2000, 
    3000,
    4000,
    5000,
    6000,
    7000,
    8000,
    9000,
   10000,
   11000,
   12000,
   13000,
   14000,
   15000,
   16000,
   17000,
   18000,
   19000
} 
User avatar
Archive-Poster
Posts: 1229
Gender:
United States of America

Re: XP Based Plugin - Tutorial!

Post by Archive-Poster »

I delete the classes but the plugin not work=[
This can help you;

Code: Select all

#include <amxmodx>
#include <hamsandwich>
#include <Vexd_Utilities>
#include <fakemeta>
#include <engine>
#include <fun>
#include <csx>

//Max levels
#define MAXLEVELS 9

#define OFFSET_MONEY 115
#define OFFSET_TEAM 114
#define OFFSET_MONEY 115
#define OFFSET_DEATH 444

#define h1_dam 600 // head
#define h2_dam 400  // body
#define h3_dam 350  // stomach
#define h4_dam 100  // arm
#define h6_dam 100  // leg

#define ARMOR_RATIO 0.2    // Armor Takes 80% of the damage (0.2 in the SDK)
#define ARMOR_BONUS 0.5    // Each Point of Armor is worth 1/x points of health (0.5 in the SDK)

#define get_user_money(%1)        get_offset_value(%1,OFFSET_MONEY)
#define set_user_money(%1,%2)    set_offset_value(%1,OFFSET_MONEY,%2)

//Heer you can add more levels
new const LEVELS[MAXLEVELS] = {
    200,
    300,
    400,
    500,
    600,
    700,
    800,
    900,
    1000
}

// Plugin Version
#define VERSION    "1.3"

/* Thunder sound */
new const thunder_sound[] = "ambience/thunder_clap.wav";

//Variables that store the players lv xp 
new PlayerXP[33],PlayerLevel[33], Porcentagem[33], gXPGiven[33], movel[33], checkCount[33], blinkSpot[33][3], origBlinkSpot[33][3], g_lastPosition[33][3];

//Pcvars
new XP_Kill, XP_Knife, XP_Hs, XP_Perfect, XP, XP_Defuse, XP_Plant;

// Sprites
new gSpriteSmoke, gSpriteFire, gSpriteBurning, gSpriteLightning, g_smoke, g_lightning, g_msgStatusText, g_msgclcorpse,
    g_msgDeathMsg, gmsgScoreInfo, g_msgMoney, gmsgDamage, beam;

// Constantes para verificar Players existentes em caso de linux
const OFFSET_LINUX = 5
const OFFSET_CSTEAMS = 114

public plugin_init()
{
    register_plugin("Real XP Mod |*-*|", VERSION, "Alliedmods Forum / Yokil SpyWare")
    
    // Amx_load para ADM AJuda para jogador
    register_concmd("amx_load"            ,    "darxp")
    register_clcmd("say"                ,    "cl_say")
    
    //events
    register_event("DeathMsg", "eDeath", "a")
    register_event("DeathMsg", "level3_death", "a")
    
    register_cvar("xp_version",    VERSION, FCVAR_SERVER|FCVAR_SPONLY);
    set_cvar_string("xp_version",    VERSION);
    
    RegisterHam(Ham_Spawn,"player","fwHamPlayerSpawnPost", 1)
    
    register_event("Damage", "lvl2_damage", "b", "2!0")
    register_event("Damage", "lvl5_damage", "b", "2!0")
    register_event("Damage", "lvl8_damage", "b", "2!0")
    
    // Msg's
    g_msgStatusText    = get_user_msgid("StatusText");
    g_msgclcorpse    = get_user_msgid( "ClCorpse" );
    gmsgScoreInfo    = get_user_msgid("ScoreInfo");
    g_msgDeathMsg    = get_user_msgid("DeathMsg");
    gmsgDamage         = get_user_msgid("Damage");
    g_msgMoney        = get_user_msgid("Money");
    
    // Comandos
    register_srvcmd("xp_extradamage"    ,    "svrExtraDamage")
    
    //cvars
    XP            =    register_cvar("amx_xp","0")
    XP_Kill        =    register_cvar("XP_per_kill", "10")
    XP_Hs        =    register_cvar("XP_hs_bonus","10")
    XP_Knife    =    register_cvar("XP_knife_bonus","10")
    XP_Defuse    =    register_cvar("XP_defuse","10")
    XP_Perfect    =    register_cvar("XP_perfect","10")
    XP_Plant    =    register_cvar("XP_plant","10")
    
    // Forwards
    register_forward(FM_PlayerPreThink, "fwd_PreThink");
}

public plugin_precache()
{
    g_lightning = precache_model( "sprites/lgtning.spr" );
    g_smoke = precache_model( "sprites/steam1.spr" );
    gSpriteLightning = precache_model("sprites/lgtning.spr");
    gSpriteSmoke = precache_model("sprites/steam1.spr");
    gSpriteFire = precache_model("sprites/lgtning.spr");
    gSpriteBurning = precache_model("sprites/blue_flame_big.spr");
    precache_sound("lightnin.wav");
    precache_sound("weapons/xbow_hitbod2.wav");
    precache_model("models/shell.mdl")
    precache_sound("weapons/electro5.wav")
    beam = precache_model("sprites/zbeam4.spr")
}

public cl_say(id)
{
    if(get_pcvar_num(XP) == 1)
    {
        if(!is_user_connected(id))
            return PLUGIN_HANDLED
        
        static said[192]
        read_args(said, 191)
        remove_quotes(said)
        
        new pos
        if ( said[pos] == '/' ) pos++
        
        if ( equali(said[pos], "ajuda") ) {
            
            func_ajuda(id)
            return PLUGIN_CONTINUE
        }
        else if ( equali(said[pos], "jogadores") ) {
            
            func_lista(id)
            return PLUGIN_CONTINUE
        }
    }
    
    return PLUGIN_CONTINUE
}

public func_ajuda(id)
{
    if(get_pcvar_num(XP) == 0)
        return PLUGIN_HANDLED
    
    show_motd(id,"xpmod.txt","Real XP Mod")
    
    return PLUGIN_HANDLED
}

public func_lista(id)
{
    new len = 1500
    new buffer[1501]
    new n = 0
    
    n += copy(buffer[n],len-n,"<html><head><style type=^"text/css^">pre{color:#FFB000;}body{background:#000000;margin-left:8px;margin-top:0px;}</style></head><body><pre>^n")
    n += copy(buffer[n],len-n,"Players XP:^n^n")
    
    new pid, name[32], teamName[5]
    for ( new team = 2; team >= 0; team-- )
    {
        for ( new x = 0; x < get_maxplayers(); x++ )
        {
            pid = x
            
            if ( get_user_team(pid) != team ) continue
            
            if(is_user_connected(pid))
            {
                get_user_name(pid, name, 31)
                
                teamName[0] = '^0'
                if ( get_user_team(pid) == 1 ) copy(teamName, 4, "TR :")
                else if ( get_user_team(pid) == 2 ) copy(teamName, 4, "CT :")
                else copy(teamName, 4, "SPEC :")
                
                n += formatex(buffer[n], len-n, "%s - %s (Level %d)(XP = %d)^n^n", teamName, name, PlayerLevel[pid], PlayerXP[pid])
            }
        }
    }

    n += copy(buffer[n], len-n, "</pre></body></html>")

    show_motd(id, buffer, "Xp de todos os jogadores")

    return PLUGIN_HANDLED
}

public darxp(id)
{
    if (!(get_user_flags(id)&ADMIN_SLAY) || get_pcvar_num(XP) == 0) {
    return PLUGIN_HANDLED
    }

    new cmd[32], arg[32]

    read_argv(0,cmd,31)
    read_argv(1,arg,31)

    Porcentagem[id] = 1500
    
    new lvl = str_to_num(arg)

    PlayerLevel[id] = lvl

    ShowHud(id)
    
    return PLUGIN_CONTINUE
}

// Example
public fwHamPlayerSpawnPost(id)
{
    if (is_user_alive(id) && get_pcvar_num(XP) == 1) 
    {
        Porcentagem[id] = 1500
        
        ShowHud(id)
        
        set_user_gravity(id, 1.0)
    }
}

public eDeath(  ) 
{
    if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
    
    //Get attacker ,weapon and hs
    new headshot,attacker = read_data( 1 )
    if(attacker)
    {
        new weapon = get_user_weapon(attacker,headshot,headshot)
        headshot = read_data( 3 )
        new health = get_user_health(attacker)
        
        //Increase xp
        PlayerXP[attacker] += get_pcvar_num(XP_Kill)
        
        //Give bonus xp if he got hs
        if(headshot)
            PlayerXP[attacker] += get_pcvar_num(XP_Hs)
            
        // Gives bonus if attacker has full hp
        if(health == 100)
            PlayerXP[attacker] += get_pcvar_num(XP_Perfect)
            
        //Give bonus xp if the gun is a knife
        if(weapon == CSW_KNIFE)
            PlayerXP[attacker] += get_pcvar_num(XP_Knife)
        
        //Lv up if he have enugh xp
        if(PlayerLevel[attacker] != 9)
        {
            while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]])
            {
                PlayerLevel[attacker] += 1
                client_print(attacker, print_chat, "[Real Experience Mod] Voce passou para o level %i!",PlayerLevel[attacker])
            }
        }
        
        //Show the hud and saves his data
        ShowHud(attacker)
    }
    
    return PLUGIN_CONTINUE
}

public fwd_PreThink(id)
{
    if(get_pcvar_num(XP) == 0)
    {
        set_pev(id, pev_maxspeed, 250.0)
        set_pev(id, pev_gravity, 1.0)
        return PLUGIN_HANDLED
    }
    
    new    player_min    =    get_user_time(id,1);
    player_min = player_min / 60
    
    if ( Porcentagem[id] < 1500 )
    {
        Porcentagem[id] += 1
        ShowHud(id)
    }
    
    detector(id)
    
    if(PlayerLevel[id] == 0 && movel[id] == 0 || PlayerLevel[id] == 9 && movel[id] == 0)
    {
        set_pev(id, pev_maxspeed, 320.0)
        set_pev(id, pev_gravity, 0.9)
    }
    
    if(PlayerLevel[id] == 4 && movel[id] == 0 || PlayerLevel[id] == 6 && movel[id] == 0)
    {
        set_pev(id, pev_maxspeed, 240.0)
        set_pev(id, pev_gravity, 0.6)
    }
    
    if(PlayerLevel[id] == 9 && movel[id] == 0)
    {
        set_pev(id, pev_maxspeed, 340.0)
        set_pev(id, pev_gravity, 0.7)
    }
    
    if (pev(id,pev_button) & IN_USE)
    {
        if (is_user_alive(id) && Porcentagem[id] >= 1500) 
        {
            if (PlayerLevel[id] == 4)
            {
                new aimvec[3]
                new tid, tbody
                
                // Get weapon to saving
                new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
                
                // Get position from eyes
                get_user_origin(id, aimvec, 3)
                // Get targeted player
                get_user_aiming(id, tid, tbody)
                
                if(is_user_alive(tid) && fm_get_user_team(id) != fm_get_user_team(tid))
                {
                    if(weaponID != CSW_KNIFE) {
                        // Switch weapon on knife
                        engclient_cmd(id,"weapon_knife")
                    }
                    
                    // Throw blue lightnings
                    lightningEffects(id, aimvec)
                    
                    emit_sound(tid,CHAN_BODY, "weapons/xbow_hitbod2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
                    
                    new damage
                    switch(tbody) {
                        case 1: damage = h1_dam
                        case 2: damage = h2_dam
                        case 3: damage = h3_dam
                        case 4: damage = h4_dam
                        case 5: damage = h4_dam
                        case 6: damage = h6_dam
                        case 7: damage = h6_dam
                    }
                    
                    // Make damage to target
                    shExtraDamage(tid, id, damage, "Meteoro")
                    
                    //Increase xp
                    PlayerXP[id] += get_pcvar_num(XP_Kill)
                    
                    Porcentagem[id] = 0
                    
                    ShowHud(id)
                }
            }
            
            if (PlayerLevel[id] == 5)
            {
                // Pegar origem
                get_user_origin(id,blinkSpot[id],3)
                
                // Botar cordenadas
                origBlinkSpot[id][0] = blinkSpot[id][0]
                origBlinkSpot[id][1] = blinkSpot[id][1]
                origBlinkSpot[id][2] = blinkSpot[id][2]
                
                // Botar configuração
                blinkSpot[id][2] += 45
                
                // Botar nova origem
                set_user_origin(id,blinkSpot[id])
                
                // Determina a origem padrão
                checkCount[id] = 1
                
                // Checa a posição
                positionChangeTimer(id)
                
                // evitar que use novamente
                Porcentagem[id] = 0
                
                ShowHud(id)
            }
            
            
            if (PlayerLevel[id] == 6)
            {
                new tid, tbody
                
                // Get targeted player
                get_user_aiming(id, tid, tbody)
                
                // if looking at something
                if(is_user_alive(tid))
                {
                    
                    // Get weapon to saving
                    new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
                    
                    if(weaponID != CSW_KNIFE) {
                        // Switch weapon on knife
                        engclient_cmd(id,"weapon_knife")
                    }
                    
                    if(fm_get_user_team(id) != fm_get_user_team(tid))
                    {
                        // get target's origin
                        new vorigin[ 3 ], pos[ 3 ];
                        get_user_origin( tid, vorigin );
                        
                        // modify origins
                        vorigin[ 2 ] -= 26;
                        pos[ 0 ] = vorigin[ 0 ] + 150;
                        pos[ 1 ] = vorigin[ 1 ] + 150;
                        pos[ 2 ] = vorigin[ 2 ] + 800;
                        
                        // block ClCorpse
                        set_msg_block( g_msgclcorpse, BLOCK_ONCE );
                        
                        new damage
                        switch(tbody) {
                            case 1: damage = h1_dam
                            case 2: damage = h2_dam
                            case 3: damage = h3_dam
                            case 4: damage = h4_dam
                            case 5: damage = h4_dam
                            case 6: damage = h6_dam
                            case 7: damage = h6_dam
                        }
                        
                        // Make damage to target
                        shExtraDamage(tid, id, damage, "Raio")
                        
                        // create lightning bolt
                        Thunder( pos, vorigin );
                        
                        // create smoke
                        Smoke( vorigin, 10, 10 );
                        
                        // create blood
                        Blood( vorigin );
                        
                        //Increase xp
                        PlayerXP[id] += get_pcvar_num(XP_Kill)
                        
                        Porcentagem[id] = 0
                        
                        ShowHud(id)
                    }
                }
            }
            
            if (PlayerLevel[id] == 7)
            {
                new tid, tbody
                
                // Get targeted player
                get_user_aiming(id, tid, tbody)
                
                // if looking at something
                if(is_user_alive(tid))
                {
                    // Get weapon to saving
                    new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
                    
                    if(weaponID != CSW_KNIFE) {
                        // Switch weapon on knife
                        engclient_cmd(id,"weapon_knife")
                    }
                    
                    if(fm_get_user_team(id) != fm_get_user_team(tid))
                    {
                        new Float:vOrigin[3]
                        new Float:vAngles[3]
                        entity_get_vector(id, EV_VEC_origin, vOrigin)
                        vOrigin[2] = vOrigin[2] + 12
                        entity_get_vector(id, EV_VEC_v_angle, vAngles)
                        
                        new NewEnt = create_entity("info_target")
                        entity_set_string(NewEnt, EV_SZ_classname, "RubberBullet")
                        
                        entity_set_model(NewEnt, "models/shell.mdl")
                        
                        entity_set_vector(NewEnt, EV_VEC_origin, vOrigin)
                        entity_set_vector(NewEnt, EV_VEC_angles, vAngles)
                        entity_set_vector(NewEnt, EV_VEC_v_angle, vAngles)
                        entity_set_vector(NewEnt, EV_VEC_oldorigin, vOrigin)
                        
                        entity_set_int(NewEnt, EV_INT_solid, 2)
                        entity_set_int(NewEnt, EV_INT_movetype, 5)
                        entity_set_edict(NewEnt, EV_ENT_owner, id)
                        
                        new Float:MinBox[3] = {-1.0, -1.0, -1.0}
                        new Float:MaxBox[3] = {1.0, 1.0, 1.0}
                        entity_set_vector(NewEnt, EV_VEC_mins, MinBox)
                        entity_set_vector(NewEnt, EV_VEC_maxs, MaxBox)
                        
                        new Float:fNewVelocity[3]
                        VelocityByAim(id, 3000, fNewVelocity)
                        entity_set_vector(NewEnt, EV_VEC_velocity, fNewVelocity)
                        
                        // Trail on entity. It's flawed by not being removable, so make it last long.
                        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
                        write_byte(22)        // TE_BEAMFOLLOW
                        write_short(NewEnt)    // entity:attachment to follow
                        write_short(beam)    // sprite index
                        write_byte(3)    // life in 0.1's
                        write_byte(1)        // line width in 0.1's
                        write_byte(200)    //r,g,b
                        write_byte(200)
                        write_byte(70)
                        write_byte(120)    // brightness
                        message_end()
                        
                        new damage
                        switch(tbody) {
                            case 1: damage = h1_dam
                            case 2: damage = h2_dam
                            case 3: damage = h3_dam
                            case 4: damage = h4_dam
                            case 5: damage = h4_dam
                            case 6: damage = h6_dam
                            case 7: damage = h6_dam
                        }
                        
                        // som
                        emit_sound(tid,CHAN_BODY, "weapons/deagle-1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
                        
                        // Make damage to target
                        shExtraDamage(tid, id, damage, "Bola de fogo")
                        
                        set_task(30.0, "remove_bullet", NewEnt)
                        
                        //Increase xp
                        PlayerXP[id] += get_pcvar_num(XP_Kill)
                        
                        // evitar que use novamente
                        Porcentagem[id] = 0
                        
                        ShowHud(id)
                    }
                }
            }
            
            if (PlayerLevel[id] == 9)
            {
                new rdm = random(2)
                if (rdm == 0)
                {
                    new aimvec[3]
                    new tid, tbody
                    
                    // Get weapon to saving
                    new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
                    
                    // Get position from eyes
                    get_user_origin(id, aimvec, 3)
                    // Get targeted player
                    get_user_aiming(id, tid, tbody)
                    
                    if(is_user_alive(tid) && fm_get_user_team(id) != fm_get_user_team(tid))
                    {
                        if(weaponID != CSW_KNIFE) {
                            // Switch weapon on knife
                            engclient_cmd(id,"weapon_knife")
                        }
                        
                        // Throw blue lightnings
                        lightningEffects(id, aimvec)
                        
                        emit_sound(tid,CHAN_BODY, "weapons/xbow_hitbod2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
                        
                        new damage
                        switch(tbody) {
                            case 1: damage = h1_dam
                            case 2: damage = h2_dam
                            case 3: damage = h3_dam
                            case 4: damage = h4_dam
                            case 5: damage = h4_dam
                            case 6: damage = h6_dam
                            case 7: damage = h6_dam
                        }
                        
                        // Make damage to target
                        shExtraDamage(tid, id, damage, "Meteoro")
                        
                        //Increase xp
                        PlayerXP[id] += get_pcvar_num(XP_Kill)
                        
                        Porcentagem[id] = 0
                        
                        ShowHud(id)
                    }
                }
                
                if (rdm == 1)
                {
                    new tid, tbody
                    
                    // Get targeted player
                    get_user_aiming(id, tid, tbody)
                    
                    // if looking at something
                    if(is_user_alive(tid))
                    {
                        
                        // Get weapon to saving
                        new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
                        
                        if(weaponID != CSW_KNIFE) {
                            // Switch weapon on knife
                            engclient_cmd(id,"weapon_knife")
                        }
                        
                        if(fm_get_user_team(id) != fm_get_user_team(tid))
                        {
                            // get target's origin
                            new vorigin[ 3 ], pos[ 3 ];
                            get_user_origin( tid, vorigin );
                            
                            // modify origins
                            vorigin[ 2 ] -= 26;
                            pos[ 0 ] = vorigin[ 0 ] + 150;
                            pos[ 1 ] = vorigin[ 1 ] + 150;
                            pos[ 2 ] = vorigin[ 2 ] + 800;
                            
                            // block ClCorpse
                            set_msg_block( g_msgclcorpse, BLOCK_ONCE );
                            
                            new damage
                            switch(tbody) {
                                case 1: damage = h1_dam
                                case 2: damage = h2_dam
                                case 3: damage = h3_dam
                                case 4: damage = h4_dam
                                case 5: damage = h4_dam
                                case 6: damage = h6_dam
                                case 7: damage = h6_dam
                            }
                            
                            // Make damage to target
                            shExtraDamage(tid, id, damage, "Raio")
                            
                            // create lightning bolt
                            Thunder( pos, vorigin );
                            
                            // create smoke
                            Smoke( vorigin, 10, 10 );
                            
                            // create blood
                            Blood( vorigin );
                            
                            //Increase xp
                            PlayerXP[id] += get_pcvar_num(XP_Kill)
                            
                            Porcentagem[id] = 0
                            
                            ShowHud(id)
                        }
                    }
                }
                
                if (rdm == 2)
                {
                    new tid, tbody
                    
                    // Get targeted player
                    get_user_aiming(id, tid, tbody)
                    
                    // if looking at something
                    if(is_user_alive(tid))
                    {
                        // Get weapon to saving
                        new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
                        
                        if(weaponID != CSW_KNIFE) {
                            // Switch weapon on knife
                            engclient_cmd(id,"weapon_knife")
                        }
                        
                        if(fm_get_user_team(id) != fm_get_user_team(tid))
                        {
                            new Float:vOrigin[3]
                            new Float:vAngles[3]
                            entity_get_vector(id, EV_VEC_origin, vOrigin)
                            vOrigin[2] = vOrigin[2] + 12
                            entity_get_vector(id, EV_VEC_v_angle, vAngles)
                            
                            new NewEnt = create_entity("info_target")
                            entity_set_string(NewEnt, EV_SZ_classname, "RubberBullet")
                            
                            entity_set_model(NewEnt, "models/shell.mdl")
                            
                            entity_set_vector(NewEnt, EV_VEC_origin, vOrigin)
                            entity_set_vector(NewEnt, EV_VEC_angles, vAngles)
                            entity_set_vector(NewEnt, EV_VEC_v_angle, vAngles)
                            entity_set_vector(NewEnt, EV_VEC_oldorigin, vOrigin)
                            
                            entity_set_int(NewEnt, EV_INT_solid, 2)
                            entity_set_int(NewEnt, EV_INT_movetype, 5)
                            entity_set_edict(NewEnt, EV_ENT_owner, id)
                            
                            new Float:MinBox[3] = {-1.0, -1.0, -1.0}
                            new Float:MaxBox[3] = {1.0, 1.0, 1.0}
                            entity_set_vector(NewEnt, EV_VEC_mins, MinBox)
                            entity_set_vector(NewEnt, EV_VEC_maxs, MaxBox)
                            
                            new Float:fNewVelocity[3]
                            VelocityByAim(id, 3000, fNewVelocity)
                            entity_set_vector(NewEnt, EV_VEC_velocity, fNewVelocity)
                            
                            // Trail on entity. It's flawed by not being removable, so make it last long.
                            message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
                            write_byte(22)        // TE_BEAMFOLLOW
                            write_short(NewEnt)    // entity:attachment to follow
                            write_short(beam)    // sprite index
                            write_byte(3)    // life in 0.1's
                            write_byte(1)        // line width in 0.1's
                            write_byte(200)    //r,g,b
                            write_byte(200)
                            write_byte(70)
                            write_byte(120)    // brightness
                            message_end()
                            
                            new damage
                            switch(tbody) {
                                case 1: damage = h1_dam
                                case 2: damage = h2_dam
                                case 3: damage = h3_dam
                                case 4: damage = h4_dam
                                case 5: damage = h4_dam
                                case 6: damage = h6_dam
                                case 7: damage = h6_dam
                            }
                            
                            // som
                            emit_sound(tid,CHAN_BODY, "weapons/deagle-1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
                            
                            // Make damage to target
                            shExtraDamage(tid, id, damage, "Bola de fogo")
                            
                            set_task(30.0, "remove_bullet", NewEnt)
                            
                            //Increase xp
                            PlayerXP[id] += get_pcvar_num(XP_Kill)
                            
                            // evitar que use novamente
                            Porcentagem[id] = 0
                            
                            ShowHud(id)
                        }
                    }
                }
            }
        }
    }

    return PLUGIN_CONTINUE
}

public detector(id)    //maybe    client    prethink()
{
    new    target,    body,    distance    =    999999;
    get_user_aiming(id,    target,    body,    distance);
    
    if(is_user_connected(target) || !is_user_connected(target) && is_user_alive(id))
    {
        ShowHud(id)
    }
}

public positionChangeTimer(id)
{
    if (!is_user_alive(id)) return
    
    new Float:velocity[3]
    get_user_origin(id, g_lastPosition[id])

    entity_get_vector(id, EV_VEC_velocity, velocity)
    if ( velocity[0] == 0.0 && velocity[1] == 0.0 && velocity[2] ) {
        velocity[0] = 50.0
        velocity[1] = 50.0
        entity_set_vector(id, EV_VEC_velocity, velocity)
    }

    set_task(0.1,"positionChangeCheck",id)
}

public positionChangeCheck(id)
{
    if (!is_user_alive(id)) return

    new origin[3]
    get_user_origin(id, origin)

    if ( g_lastPosition[id][0] == origin[0] && g_lastPosition[id][1] == origin[1] && g_lastPosition[id][2] == origin[2]) {
        switch(checkCount[id]) {
            case 0 : blink_movecheck(id, 0, 0, 0)            // Original
            case 1 : blink_movecheck(id, 0, 0, 80)            // Up
            case 2 : blink_movecheck(id, 0, 0, -110)        // Down
            case 3 : blink_movecheck(id, 0, 30, 0)            // Forward
            case 4 : blink_movecheck(id, 0, -30, 0)            // Back
            case 5 : blink_movecheck(id, -30, 0, 0)            // Left
            case 6 : blink_movecheck(id, 30, 0, 0)            // Right
            case 7 : blink_movecheck(id, -30, 30, 0)        // Forward-Left
            case 8 : blink_movecheck(id, 30, 30, 0)            // Forward-Right
            case 9 : blink_movecheck(id, -30, -30, 0)        // Back-Left
            case 10: blink_movecheck(id, 30, -30, 0)        // Back-Right
            case 11: blink_movecheck(id, 0, 30, 60)            // Up-Forward
            case 12: blink_movecheck(id, 0, 30, -110)        // Down-Forward
            case 13: blink_movecheck(id, 0, -30, 60)        // Up-Back
            case 14: blink_movecheck(id, 0, -30, -110)        // Down-Back
            case 15: blink_movecheck(id, -30, 0, 60)        // Up-Left
            case 16: blink_movecheck(id, 30, 0, 60)            // Up-Right
            case 17: blink_movecheck(id, -30, 0, -110)        // Down-Left
            case 18: blink_movecheck(id, 30, 0, -110)        // Down-Right
            default: user_kill(id)
        }
        return
    }
}

public blink_movecheck(id, mX, mY, mZ)
{
    blinkSpot[id][0] = origBlinkSpot[id][0] + mX
    blinkSpot[id][1] = origBlinkSpot[id][1] + mY
    blinkSpot[id][2] = origBlinkSpot[id][2] + mZ
    set_user_origin(id,blinkSpot[id])
    checkCount[id]++
    positionChangeTimer(id)
}

public bomb_defused(defuser)
{
    PlayerXP[defuser] += get_pcvar_num(XP_Defuse)
    ShowHud(defuser)
}

public bomb_planted(planter)
{
    PlayerXP[planter] += get_pcvar_num(XP_Plant)
    ShowHud(planter)
}

public level3_death()
{
    if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
    
    // Indexes (killer and victim)
    new killer = read_data(1)
    new victim = read_data(2)
    new headshot = read_data(3)

    if (PlayerLevel[killer] == 3 && killer != victim)
    {
        // Health sets
        if(is_user_connected(killer) && headshot)
        {
            PlayerXP[killer] += 10
            PlayerXP[victim] -= 5
        }
        
        if(is_user_connected(killer) && !headshot)
        {
            PlayerXP[killer] += 7
            PlayerXP[victim] -= 3
        }
    }
    
    return PLUGIN_CONTINUE
}

public lvl2_damage(id)
{
    if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED

    new attacker = get_user_attacker(id)

    new damage = read_data(2)
    
    if ( PlayerLevel[attacker] == 2 && is_user_alive(attacker) && id != attacker )
    {
        new rdm = random(10)
        
        if(rdm == 0 || rdm == 1 || rdm == 4 || rdm == 6 || rdm == 10)
        {
            // do extra damage
            new returnDamage = floatround( 5.0 * damage )
            
            if (returnDamage > 0)
            {
                shExtraDamage( id, attacker, returnDamage, "shockwave" )
                
                new iRed,iGreen,iBlue,iWidth,iNoise
                iRed = random_num(0,100)
                iGreen = random_num(0,100)
                iBlue = random_num(100,255)
                iWidth = random_num(10,40)
                iNoise = random_num(10,40)
                
                if(iRed > iBlue) iBlue = (iRed + 10)
                if(iGreen > iBlue) iBlue = (iGreen + 10)
                if(iBlue > 255) iBlue = 255
                
                message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
                write_byte( 8 )
                write_short(attacker)    // start entity
                write_short(id)    // entity
                write_short(gSpriteLightning )    // model
                write_byte( 0 ) // starting frame
                write_byte( 15 )  // frame rate
                write_byte( 10 )  // life
                write_byte( iWidth )  // line width
                write_byte( iNoise )  // noise amplitude
                write_byte( iRed )    // r, g, b
                write_byte( iGreen )    // r, g, b
                write_byte( iBlue )    // r, g, b
                write_byte( 255 )    // brightness
                write_byte( 0 )    // scroll speed
                message_end()
            }
        }
    }
    return PLUGIN_CONTINUE
}

public lvl5_damage(id)
{
    if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
    
    new weapon, bodypart, attacker = get_user_attacker(id, weapon, bodypart)
    
    if(id && PlayerLevel[attacker] == 5 || id && PlayerLevel[attacker] == 9)
    {
        if ( !is_user_alive(id) || attacker <= 0 || attacker > 32) return PLUGIN_HANDLED
        
        new headshot = (bodypart == 1) ? 1 : 0
        
        if ( weapon == CSW_KNIFE && is_user_alive(id) )
        {
            // do extra damage
            shExtraDamage( id, attacker, 150, "knife", headshot)
        }
    }
    
    return PLUGIN_CONTINUE
}

public lvl8_damage(id)
{
    if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
    
    if(id)
    {
        new attacker = get_user_attacker(id)
        
        if(PlayerLevel[attacker] == 8 && id != attacker)
        {
            set_user_gravity(id, 0.1)
            
            client_cmd(id,"+jump")
            client_cmd(id,"-jump")
            
            movel[id] = 1
            
            new parm[2]
            
            parm[0] = id
            parm[1] = attacker
            
            set_task(0.1,"verificar",0 , parm, 2, "b")
        }
    }
    
    return PLUGIN_CONTINUE
}

public verificar(parm[])
{
    new vitima = parm[0]
    new attacker = parm[1]
    
    if(!is_user_alive(attacker))
    {
        movel[vitima] = 0
        return PLUGIN_HANDLED
    }
    
    return PLUGIN_CONTINUE
}

public remove_bullet(bullet)
{
    if(is_valid_ent(bullet))
        remove_entity(bullet)
}

// Evento de morte
public EnviarDeathMsg(attacker, victim, const nome[])
{
    message_begin(MSG_BROADCAST, g_msgDeathMsg)
    write_byte(attacker)
    write_byte(victim)
    write_byte(1)
    write_string(nome)
    message_end()
}

stock shExtraDamage(id, attacker, damage, weaponDescription[], headshot = 0 )
{
    server_cmd("xp_extradamage ^"%d^" ^"%d^" ^"%d^" ^"%s^" ^"%d^"", id, attacker, damage, weaponDescription, headshot )
}

//Our hud message
public ShowHud(id)
{
    if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
    
    new ammo[64]
    
    if(PlayerLevel[id] < 8)
        formatex(ammo, 63, "Level:(%d/%d | XP:%d/%d | Karma:%d%s) ", PlayerLevel[id], MAXLEVELS, PlayerXP[id], LEVELS[PlayerLevel[id]], Porcentagem[id] / 15, "%%")
    
    if(PlayerLevel[id] > 8)
        formatex(ammo, 63, "Level:(Completo | Karma:%d%s) ", Porcentagem[id] / 15, "%%")
    
    if(!id || !is_user_connected(id))
        return PLUGIN_HANDLED;

    engfunc(EngFunc_MessageBegin,MSG_ONE_UNRELIABLE, g_msgStatusText, {0,0,0}, id) 
    write_byte(0) 
    write_string(ammo) 
    message_end();
    return PLUGIN_HANDLED;
}

//When someone leaves cheek if the xp cvar if on savexp
public client_disconnect(id)
{
    if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
    
    //After we saved we sets his values to 0 so the guy
    //ho joins later dont get his stuff
    PlayerXP[id] = 0
    PlayerLevel[id] = 0
    
    return PLUGIN_CONTINUE
}

// Publics/ Stocks para os poderes

Thunder( start[ 3 ], end[ 3 ] )
{
    message_begin( MSG_BROADCAST, SVC_TEMPENTITY ); 
    write_byte( TE_BEAMPOINTS ); 
    write_coord( start[ 0 ] ); 
    write_coord( start[ 1 ] ); 
    write_coord( start[ 2 ] ); 
    write_coord( end[ 0 ] ); 
    write_coord( end[ 1 ] ); 
    write_coord( end[ 2 ] ); 
    write_short( g_lightning ); 
    write_byte( 1 );
    write_byte( 5 );
    write_byte( 7 );
    write_byte( 20 );
    write_byte( 30 );
    write_byte( 200 ); 
    write_byte( 200 );
    write_byte( 200 );
    write_byte( 200 );
    write_byte( 200 );
    message_end();
    
    message_begin( MSG_PVS, SVC_TEMPENTITY, end );
    write_byte( TE_SPARKS );
    write_coord( end[ 0 ]  );
    write_coord( end[ 1 ]);
    write_coord( end[ 2 ] );
    message_end();
    
    emit_sound( 0 ,CHAN_ITEM, thunder_sound, 1.0, ATTN_NORM, 0, PITCH_NORM );
}

Smoke( iorigin[ 3 ], scale, framerate )
{
    message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
    write_byte( TE_SMOKE );
    write_coord( iorigin[ 0 ] );
    write_coord( iorigin[ 1 ] );
    write_coord( iorigin[ 2 ] );
    write_short( g_smoke );
    write_byte( scale );
    write_byte( framerate );
    message_end();
}

Blood( iorigin[ 3 ] )
{
    message_begin( MSG_BROADCAST, SVC_TEMPENTITY ); 
    write_byte( TE_LAVASPLASH ); 
    write_coord( iorigin[ 0 ] ); 
    write_coord( iorigin[ 1 ] ); 
    write_coord( iorigin[ 2 ] ); 
    message_end(); 
}

public localAddXP(id, xp)
{
    if (xp > 0 && PlayerXP[id] + xp < PlayerXP[id]) {
        PlayerXP[id] = 2147483647
    }
    else if (xp < 0 && (PlayerXP[id] + xp < -250000 || PlayerXP[id] + xp > PlayerXP[id])) {
        PlayerXP[id] = -250000
    }
    else {
        PlayerXP[id] += xp
    }
}


public svrExtraDamage()
{
    new szid[4],szattacker[4],szdamage[6],weaponDescription[32], szheadshot[4]
    read_argv(1,szid,3)
    read_argv(2,szattacker,3)
    read_argv(3,szdamage,5)
    read_argv(4,weaponDescription,31)
    read_argv(5,szheadshot,3)

    new id = str_to_num(szid)
    new attacker = str_to_num(szattacker)
    new damage = str_to_num(szdamage)
    new headshot = str_to_num(szheadshot)

    if ( !is_user_alive(id) || !is_user_connected(attacker) ) return
    if ( get_user_godmode(id) ) return
    if ( damage <= 0 ) return

    // *** Damage calculation due to armor from: multiplayer/dlls/player.cpp ***
    new Float:flNewDamage = float(damage) * ARMOR_RATIO
    new Float:flArmor = (float(damage) - flNewDamage) * ARMOR_BONUS
    new plrArmor = get_user_armor(id)

    // Does this use more armor than we have figured for?
    if ( flArmor > float(plrArmor) ) {
        flArmor = float(plrArmor)
        flArmor *= (1/ARMOR_BONUS)
        flNewDamage = float(damage) - flArmor
        plrArmor = 0
    }
    else {
        plrArmor = floatround(plrArmor - flArmor)
    }

    //Commenting this out so it does the orginal ammount of damage still
    //damage = floatround(flNewDamage)

    //*** End of damage-armor calculations ***

    new userHealth = get_user_health(id)
    new FFon = get_cvar_num("mp_friendlyfire")
    if (userHealth - damage <= 0 ) {
        new bool:kill = false
        if (id == attacker) {
            kill = true
        }
        else if (FFon && get_user_team(id) == get_user_team(attacker)) {
            kill = true
            localAddXP(attacker, -gXPGiven[ PlayerLevel[id] ] )
            set_user_frags(attacker, get_user_frags(attacker) - 1)
            client_print(attacker,print_center,"You killed a teammate")
            new money = get_user_money(attacker)
            if (money != 0) set_user_money(attacker,money - 150)
        }
        else if (get_user_team(id) != get_user_team(attacker)) {
            kill = true
            localAddXP(attacker, gXPGiven[ PlayerLevel[id] ] )
            set_user_frags(attacker, get_user_frags(attacker) + 1)
            new money = get_user_money(attacker)
            if (money < 16000) set_user_money(attacker,money + 300)
        }

        if (!kill) return

        //Log the Kill
        logKill(attacker, id, weaponDescription)

        //Kill the victim and block the messages
        MessageBlock(g_msgDeathMsg,BLOCK_ONCE)
        MessageBlock(gmsgScoreInfo,BLOCK_ONCE)
        user_kill(id)

        //user_kill removes a frag, this gives it back
        set_user_frags(id,get_user_frags(id) + 1)

        //Replaced HUD death message
        message_begin(MSG_ALL,g_msgDeathMsg,{0,0,0},0)
        write_byte(attacker)
        write_byte(id)
        write_byte(headshot)
        write_string(weaponDescription)
        message_end()

        //Update killers scorboard with new info
        message_begin(MSG_ALL,gmsgScoreInfo)
        write_byte(attacker)
        write_short(get_user_frags(attacker))
        write_short(get_user_deaths(attacker))
        write_short(0)
        write_short(get_user_team(attacker))
        message_end()

        //Update victims scoreboard with correct info
        message_begin(MSG_ALL,gmsgScoreInfo)
        write_byte(id)
        write_short(get_user_frags(id))
        write_short(get_user_deaths(id))
        write_short(0)
        write_short(get_user_team(id))
        message_end()

    }
    else {
        new bool:hurt = false
        if (id == attacker) {
            hurt = true
        }
        else if (FFon && get_user_team(id) == get_user_team(attacker)) {
            hurt = true
            new name[33]
            get_user_name(attacker,name,32)
            client_print(0,print_chat,"%s attacked a teammate",name)
        }
        else if (get_user_team(id) != get_user_team(attacker)) {
            hurt = true
        }

        if (!hurt) return

        set_user_health(id, userHealth - damage)
        set_user_armor(id, plrArmor)

        new aOrigin[3]
        get_user_origin(attacker, aOrigin)

        //Damage message
        message_begin(MSG_ONE, gmsgDamage, {0,0,0}, id)
        write_byte(0) // dmg_save
        write_byte(damage) // dmg_take
        write_long(0) // visibleDamageBits
        write_coord(aOrigin[0]) // damageOrigin.x
        write_coord(aOrigin[1]) // damageOrigin.y
        write_coord(aOrigin[2]) // damageOrigin.z
        message_end()
    }
}

public lightningEffects(id, aimvec[3])
{
    emit_sound(id, CHAN_ITEM, "lightnin.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)

    new origin[3]
    get_user_origin(id, origin)
    // Height + 10 (From a stomach on hands)
    origin[2] = origin[2] + 10

    // DELIGHT
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(27)
    write_coord(origin[0])
    write_coord(origin[1])
    write_coord(origin[2])
    write_byte(10)
    write_byte(19) // r, g, b
    write_byte(97) // r, g, b
    write_byte(255) // r, g, b
    write_byte(3) // life
    write_byte(1) // decay
    message_end()

    for(new i = 1; i <= 5; i++)
    {
        // BEAMENTPOINTS
        message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
        write_byte(0) // TE_BEAMENTPOINTS 0
        if(i == 1) {
            write_coord(origin[0])
        } else if(i == 2 || i == 4) {
            write_coord(origin[0] + (i * 2))
        } else {
            write_coord(origin[0] - (i * 2))
        }
        write_coord(origin[1])
        write_coord(origin[2])
        write_coord(aimvec[0])
        write_coord(aimvec[1])
        write_coord(aimvec[2])
        write_short(gSpriteFire)
        write_byte(1) // framestart
        write_byte(10) // framerate
        write_byte(3) // life
        write_byte(50) // width
        write_byte(50) // noise
        write_byte(19) // r, g, b
        write_byte(97) // r, g, b
        write_byte(255) // r, g, b
        write_byte(200) // brightness
        write_byte(200) // speed
        message_end()
    }

    // Sparks
    message_begin(MSG_PVS, SVC_TEMPENTITY)
    write_byte(9)
    write_coord(aimvec[0])
    write_coord(aimvec[1])
    write_coord(aimvec[2])
    message_end()

    // Fire
    message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    write_byte(3)
    write_coord(aimvec[0])
    write_coord(aimvec[1])
    write_coord(aimvec[2])
    write_short(gSpriteBurning)
    write_byte(22)
    write_byte(10)
    write_byte(0)
    message_end()

    // Smoke
    message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    write_byte(5)
    write_coord(aimvec[0])
    write_coord(aimvec[1])
    write_coord(aimvec[2])
    write_short(gSpriteSmoke)// short (sprite index)
    write_byte(60) // byte (scale in 0.1's)
    write_byte(15) // byte (framerate)
    message_end()

    // TE_GUNSHOTDECAL
    message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    write_byte(109) // decal and ricochet sound
    write_coord(aimvec[0]) // pos
    write_coord(aimvec[1])
    write_coord(aimvec[2])
    write_short(0) // I have no idea what thats supposed to be
    write_byte(random_num(28, 30)) // decal
    message_end()

}

// Gets offset data
get_offset_value(id, type)
{
    new key = -1
    switch(type)
    {
        case OFFSET_TEAM: key = OFFSET_TEAM
        case OFFSET_MONEY:
        {
            key = OFFSET_MONEY
        }
        case OFFSET_DEATH: key = OFFSET_DEATH
    }
    
    if(key != -1)
    {
        if(is_amd64_server()) key += 25
        return get_pdata_int(id, key, OFFSET_LINUX)
    }
    
    return -1
}

// Sets offset data
set_offset_value(id, type, value)
{
    new key = -1
    switch(type)
    {
        case OFFSET_TEAM: key = OFFSET_TEAM
        case OFFSET_MONEY:
        {
            key = OFFSET_MONEY
            
            // Send Money message to update player's HUD
            message_begin(MSG_ONE_UNRELIABLE, g_msgMoney, {0,0,0}, id)
            write_long(value)
            write_byte(1)    // Flash (difference between new and old money)
            message_end()
        }
        case OFFSET_DEATH: key = OFFSET_DEATH
    }
    
    if(key != -1)
    {
        if(is_amd64_server()) key += 25
        set_pdata_int(id, key, value, OFFSET_LINUX)
    }
    
    return PLUGIN_CONTINUE
}

stock logKill(id, victim, weaponDescription[] ) 
{
    new namea[32],namev[32],authida[35],authidv[35],teama[16],teamv[16]
    
    //Info On Attacker
    get_user_name(id,namea,31)
    get_user_team(id,teama,15)
    get_user_authid(id,authida,34)
    
    //Info On Victim
    get_user_name(victim,namev,31)
    get_user_team(victim,teamv,15)
    get_user_authid(victim,authidv,34)
    
    //Log This Kill
    if(id != victim) 
    {
        log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
        namea,get_user_userid(id),authida,teama,namev,get_user_userid(victim),authidv,teamv, weaponDescription )
    }
    else 
    {
        log_message("^"%s<%d><%s><%s>^" committed suicide with ^"%s^"",
        namea,get_user_userid(id),authida,teama, weaponDescription )
    }
}

// Get User Team
stock fm_get_user_team(id)
{
    return get_pdata_int(id, OFFSET_CSTEAMS, OFFSET_LINUX);
} 
User avatar
Archive-Poster
Posts: 1229
Gender:
United States of America

Re: XP Based Plugin - Tutorial!

Post by Archive-Poster »

Normally, you don't need to check if a variable is true or false if you're using a pcvar.

Code: Select all

    register_event("Damage", "lvl2_damage", "b", "2!0")
    register_event("Damage", "lvl5_damage", "b", "2!0")
    register_event("Damage", "lvl8_damage", "b", "2!0") 
what the hell?

What is this?

Code: Select all

if(iRed > iBlue) iBlue = (iRed + 10)
if(iGreen > iBlue) iBlue = (iGreen + 10)
if(iBlue > 255) iBlue = 255 
WHAT?

Code: Select all

if(PlayerLevel[id] < 8)
        formatex(ammo, 63, "Level:(%d/%d | XP:%d/%d | Karma:%d%s) ", PlayerLevel[id], MAXLEVELS, PlayerXP[id], LEVELS[PlayerLevel[id]], Porcentagem[id] / 15, "%%") 
more organised
Look lvl2_damage(id)

Code: Select all

if(PlayerLevel[id] < 8)
        formatex(ammo, 63, "Level:(%d/%d | XP:%d/%d | Karma:%d%s) ", PlayerLevel[id], MAXLEVELS, PlayerXP[id], LEVELS[PlayerLevel[id]], Porcentagem[id] / 15, "%%") 
Read again
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest