Prosty XP Mod

S!p

Administrator
Członek Załogi
Poradnik przeznaczony jest dla osób które już miały do czynienia z pisaniem pluginów.
Opisów jest niewiele; większość trzeba samemu wywnioskować :)
Nie jest to mój tourtial a przetłumaczony z forums.alliedmods.net

ps. Przypominam że cs nie obsługuje polskich znaków (dozwolone są one jedynie w komentarzach pluginu)

Na początek definiujemy biblioteki z których będziemy korzystać
PHP:
#include <amxmodx>
#include <amxmisc>
#include <nvault>

Teraz wpisujemy ile klas będzie miał nasz xp mod
PHP:
#define MAXCLASSES 5

Dodajemy zmienne
PHP:
new PlayerXP[33],PlayerLevel[33],PlayerClass[33]
 //Dla zabójstw
new XP_Kill,XP_Knife,XP_Hs,SaveXP
 //Do przechowywania xp
 new g_vault

Wcześniej definiowaliśmy 5 klas. Czas je nazwać...
PHP:
new const CLASSES[MAXCLASSES][] = {
    "Brak",
    "Pies",
    "Kot",
    "Kon",
    "Krowa"
}

Teraz tworzymy lvl
PHP:
new const LEVELS[7] = {
0,
100,//potrzeba 100 xp
200,//potrzeba 200 xp
400,//potrzeba 400 xp
800,//potrzeba 800 xp
1600,//potrzeba 6100 xp
3200 //potrzeba 3200 xp
}

W końcu możemy przejść do sekcji plugin_init
PHP:
public plugin_init()
{
    register_plugin("XpMod", "1.0", "Fxfighter")
 
    // To jest potrzebne do sprawdzenie levelu
    register_event("DeathMsg", "eDeath", "a")
    //Tworzymy cvar odpowiadający za włączenie lub wyłączenie zapisywania xp
    SaveXP = register_cvar("SaveXP","1")
    //Tworzymy cvar odpowiadający za ilość xp za zabicie przeciwnika
    XP_Kill=register_cvar("XP_per_kill", "20")
    //Bonus za hs
    XP_Hs=register_cvar("XP_hs_bonus","20")
    //Za zabicie z noż też przyda się bonus...
    XP_Knife=register_cvar("XP_knife_bonus","20")
    //Teraz należy utworzyć połączenie z nvalut
    g_vault = nvault_open("animod")
    // Rejestrujemy komendę odpowiedzialną da wyświetlanie klasy
    register_clcmd("say /class", "ChangeClass")
    register_clcmd("say_team /class", "ChangeClass")
    //Sprawdzanie ilości xp
    register_clcmd("say /xp", "ShowHud")
    register_clcmd("say_team /xp", "ShowHud")
}

W sekcji plugin_init zarejestrowaliśmy event register_event("DeathMsg", "eDeath", "a")
Teraz czas go wykorzystać

PHP:
public eDeath( ) //Nazwa funkcji
{ 
    // Jeżeli gracz nie wybrał klasy
    if(PlayerClass[attacker] == 0)
         return PLUGIN_CONTINUE
 
    // Jeżeli gracz został zabity
    new iVictim = read_data( 2 )
    // Jeżeli gracz został zabity HS (potrzebne do cvaru Xp_Hs)
    new headshot = read_data( 3 )
 
    //Jakiej broni użył wygrany
    new clip, ammo, weapon = get_user_weapon(id,clip,ammo);
    PlayerXP[attacker] += get_pcvar_num(XP_Kill) 
    // Sprawdźmy czy gracz został zabity strzałem w głowę
    if(headshot) 
    // jeżli tak dodaj bonus określony w cvarze XP_Hs
    PlayerXP[attacker] += get_pcvar_num(XP_Hs) 
    // Sprawdza czy gracz został zabity nożem
    if(weapon == CSW_KNIFE) 
        //Jeżli tak dodaje bonus określony cvarem XP_Knife
    PlayerXP[attacker] += get_pcvar_num(XP_Knife) 
    // this checks if the player has enough xp to advance to a new level
 
     while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]]) 
    { // Teraz czas na wiadomość
        client_print(attacker, print_chat, "[Animal Mod] Gratulacje! Twoj lvl %i Twoja klasa %s!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker]]) 
        // Dodaj zwycięzcy lvl
        PlayerLevel[attacker] += 1 
    } 
    // Wywołuje ShowHud(id) 
    ShowHud(attacker)
 
}

PHP:
public ShowHud(id) 
{ 
    set_hudmessage(255, 0, 0, 0.75, 0.01, 0, 6.0, 15.0) 
    show_hudmessage(id, "lvl: %i^nXP: %i^nKlasa: %s",PlayerLevel[id],PlayerXP[id],CLASSES[PlayerClass[id]]) 
}

Teraz stworzymy menu zmiany klasy.

PHP:
public ChangeClass(id) 
{
    new menu = menu_create("Class Menu" , "Class_Handle");
    menu_additem(menu ,"Pies", "1" , 0); 
    menu_additem(menu ,"kot", "2" , 0); 
    menu_additem(menu ,"kon", "3" , 0); 
    menu_additem(menu ,"Krowa", "4" , 0);
    menu_setprop(menu , MPROP_EXIT , MEXIT_ALL);
    menu_display(id , menu , 0); 
    return PLUGIN_CONTINUE; 
} 
 
public Class_Handle(id , menu , item) 
{ 
    if(item == MENU_EXIT) 
    { 
        menu_destroy(menu); 
    } 
    new szCommand[6] , szName[64]; new access , callback; 
    menu_item_getinfo(menu , item , access , szCommand , 5 , szName , 63 , callback); 
    new i = str_to_num(szCommand) 
    if(PlayerClass[id] != i) 
    { 
        PlayerClass[id] = i client_print(id,print_chat,"Jestes teraz %s",CLASSES[i]) 
    }
    else 
    { 
        client_print(id,print_chat,"Jestes ciagle %s",CLASSES[i]) 
    } 
    menu_destroy(menu); 
    return PLUGIN_CONTINUE 
}

// Jak już wspominałem plugin jest dla bardziej zaawansowanych 'pisarzy' tak więc część opisów została pominięta

Podczas wchodzenia na serwer uruchomi funkcję która załaduje nasze dane.
PHP:
public client_connect(id) 
{
    // Tylko jeżeli xp jest wlączone
    if(get_pcvar_num(SaveXP) == 1) 
    { 
        // Wywoła public LoadData(id)
        LoadData(id) 
    } 
}

Podczas wyjścia uruchomi funkcję zapisu
PHP:
public client_disconnect(id) 
{ 
     if(get_pcvar_num(SaveXP) == 1) 
     { 
          // Wywoła public SaveData(id)
          SaveData(id) 
     } 
}

PHP:
public SaveData(id) 
{ 
    // Pobierz STEAM ID gracza
    new AuthID[35] get_user_authid(id,AuthID,34) 
    new vaultkey[64],vaultdata[256] 
    // Format w jakim zapisywane są dane moda
    format(vaultkey,63,"%s-Mod",AuthID) 
    format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id]) 
    // Zapisuje 
    nvault_set(g_vault,vaultkey,vaultdata) 
    return PLUGIN_CONTINUE 
}

PHP:
public LoadData(id) 
{ 
    new AuthID[35] get_user_authid(id,AuthID,34) 
    new vaultkey[64],vaultdata[256] 
    // szuka
    format(vaultkey,63,"%s-Mod",AuthID) 
    format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id]) 
    // Ładuje dane 
    nvault_get(g_vault,vaultkey,vaultdata,255) 
    replace_all(vaultdata, 255, "#", " ") 
    new playerxp[32], playerlevel[32] 
    parse(vaultdata, playerxp, 31, playerlevel, 31) 
    PlayerXP[id] = str_to_num(playerxp) 
    PlayerLevel[id] = str_to_num(playerlevel) 
    return PLUGIN_CONTINUE 
}

No i to na tyle jeżeli chodzi o prostego xp Mod`a
W następnym poradniku postaram się zaprezentować w jaki sposób przydzielić broń w zależności od lvl

A zapomniałbym ;p nasz gotowy plugin:
PHP:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#define MAXCLASSES 5
new const CLASSES[MAXCLASSES][] = {
    "Brak",
    "Pies",
    "Kot",
    "Kon",
    "Krowa"
}
new const LEVELS[6] = {
    100, 
    200, 
    400, 
    800,
    1600,
    3200
}
new PlayerXP[33],PlayerLevel[33],PlayerClass[33]
new XP_Kill,XP_Knife,XP_Hs,SaveXP,g_vault
public plugin_init()
{
    register_plugin("XpMod", "1.0", "Fxfighter")
 
    register_event("DeathMsg", "eDeath", "a") 
 
    SaveXP = register_cvar("SaveXP","1")
    XP_Kill=register_cvar("XP_per_kill", "20")
    XP_Hs=register_cvar("XP_hs_bonus","20")
    XP_Knife=register_cvar("XP_knife_bonus","20")
    g_vault = nvault_open("animod")
 
    register_clcmd("say /class", "ChangeClass")
    register_clcmd("say_team /class", "ChangeClass")
    register_clcmd("say /xp", "ShowHud")
    register_clcmd("say_team /xp", "ShowHud")
}
public eDeath(  ) 
{
    new iVictim = read_data( 2 )
    new headshot = read_data( 3 )
    new clip, ammo, weapon = get_user_weapon(id,clip,ammo);
 
    PlayerXP[attacker] += get_pcvar_num(XP_Kill)
 
    if(headshot)
    PlayerXP[attacker] += get_pcvar_num(XP_Hs)
 
    if(weapon == CSW_KNIFE)
    PlayerXP[attacker] += get_pcvar_num(XP_Knife)
 
 
    while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]])
    {
      client_print(attacker, print_chat, "[Animal Mod] Congratulations! You are a level %i %s!",
      PlayerLevel[attacker] += 1
    }
    ShowHud(attacker)
    SaveData(attacker)
}
public ShowHud(id)
{
    set_hudmessage(255, 0, 0, 0.75, 0.01, 0, 6.0, 15.0)
    show_hudmessage(id, "Level: %i^nXP: %i^nClass: %s",PlayerLevel[id],PlayerXP[id],CLASSES[PlayerClass[id]])
}
public ChangeClass(id)
{
    new menu = menu_create("Class Menu" , "Class_Handle");
    menu_additem(menu ,"Kot", "1" , 0);
    menu_additem(menu ,"Pies", "2" , 0);
    menu_additem(menu ,"Kon", "3" , 0);
    menu_additem(menu ,"kot", "4" , 0);
 
    menu_setprop(menu , MPROP_EXIT , MEXIT_ALL);
 
    menu_display(id , menu , 0);
 
    return PLUGIN_CONTINUE;
}
public Class_Handle(id , menu , item) 
{
    if(item == MENU_EXIT) 
    {
 
        menu_destroy(menu);
 
    }
 
    new szCommand[6] , szName[64];
    new access , callback;
 
    menu_item_getinfo(menu , item , access , szCommand , 5 , szName , 63 , callback);
 
    new i = str_to_num(szCommand)
    if(PlayerClass[id] != i)
    {
        PlayerClass[id] = i
        client_print(id,print_chat,"You are now a %s",CLASSES[i])
    }
    else
    {
        client_print(id,print_chat,"You are alredy a %s",CLASSES[i])
    }
 
    menu_destroy(menu);
    return PLUGIN_CONTINUE
}
public client_connect(id)
{
    if(get_pcvar_num(SaveXP) == 1)
    {
 
        LoadData(id)
    }
}
public client_disconnect(id)
{
    if(get_pcvar_num(SaveXP) == 1)
    {
 
        SaveData(id)
    }
    PlayerXP[id] = 0
    PlayerLevel[id] = 0
    PlayerClass[id] = 0
}
public SaveData(id)
{
    new AuthID[35]
    get_user_authid(id,AuthID,34)
 
    new vaultkey[64],vaultdata[256]
    format(vaultkey,63,"%s-Mod",AuthID)
    format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
    nvault_set(g_vault,vaultkey,vaultdata)
    return PLUGIN_CONTINUE
}
public LoadData(id)
{
    new AuthID[35]
    get_user_authid(id,AuthID,34)
 
    new vaultkey[64],vaultdata[256]
    format(vaultkey,63,"%s-Mod",AuthID)
    format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
    nvault_get(g_vault,vaultkey,vaultdata,255)
 
    replace_all(vaultdata, 255, "#", " ")
 
    new playerxp[32], playerlevel[32]
 
    parse(vaultdata, playerxp, 31, playerlevel, 31)
 
    PlayerXP[id] = str_to_num(playerxp)
    PlayerLevel[id] = str_to_num(playerlevel)
 
    return PLUGIN_CONTINUE
}
 

Create an account or login to comment

You must be a member in order to leave a comment

Create account

Create an account on our community. It's easy!

Log in

Already have an account? Log in here.

Back
Do góry