Filmy z polskim lektorem i dubbingiem nowoĹci rapidshare download.
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ć
#include <amxmodx>
#include <amxmisc>
#include <nvault>
Teraz wpisujemy ile klas będzie miał nasz xp mod
#define MAXCLASSES 5
Dodajemy zmienne
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ć...
new const CLASSES[MAXCLASSES][] = {
"Brak",
"Pies",
"Kot",
"Kon",
"Krowa"
}
Teraz tworzymy lvl
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
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ć
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)
}
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.
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.
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
public client_disconnect(id)
{
if(get_pcvar_num(SaveXP) == 1)
{
// Wywoła public SaveData(id)
SaveData(id)
}
}
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
}
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:
#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
}