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ć
Teraz wpisujemy ile klas będzie miał nasz xp mod
Dodajemy zmienne
Wcześniej definiowaliśmy 5 klas. Czas je nazwać...
Teraz tworzymy lvl
W końcu możemy przejść do sekcji plugin_init
W sekcji plugin_init zarejestrowaliśmy event register_event("DeathMsg", "eDeath", "a")
Teraz czas go wykorzystać
Teraz stworzymy menu zmiany klasy.
// 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.
Podczas wyjścia uruchomi funkcję zapisu
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:
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
}