Wstawiam go na to forum aby pomóc poszukującym takich poradników w j. polskim.
Kolejnym powodem umieszczenia jest to iż opierałem sie na innych modach, lecz nie zawsze wszystko działało.
Zostało tutaj dodane kilka ciekawych funkcji które urozmaica troche ten podstawowy MOD.
"Postanowiłem wam pokazać jak stworzyć prosty exp MOD
Przed rozpoczęciem musisz się orjętować w średnim stopniu w scriptingu
Rejestrowanie Modułów
#include <amxmodx>
#include <amxmisc>
#include <nvault>
Definiujemy Maksymalną Liczbę Postaci
W obecnej postaci kodu mamy 5 postaci, natomiast może się tu znajdować dowolna liczba np: 2 lub 7
#define MAXCLASSES 5
Tworzymy Zmienne które będą odpowiadąły za zapisanie twojego poziomu klasy i doświadczenia
new PlayerXP[33],PlayerLevel[33],PlayerClass[33]
//to jest odpowiedzialne za przyznanie dodatkowego expa za zabicia
new XP_Kill,XP_Knife,XP_Hs,SaveXP
//To jest na potrzeby nVault, aby mógł zapisac twoje osiągnięcia
new g_vault
Tutaj mamy odwołanie do wcześniej zdefiniowanej maksymalnej ilości klas, Ibecne nazwy możemy zmienić na dowolne
new const CLASSES[MAXCLASSES][] = {
"None",
"Dog",
"Cat",
"Horse",
"Cow"
}
Tutaj jest 5 Postaci, ponieważ wcześniej zdefiniowaliśmy maksymalną liczbę = 5.
Teraz tworzymy Poziomy i to ile doświadczenia potrzeba, aby osiągnąc kolejny poziom.
new const LEVELS[7] = {
0,
100,//To określa ile doświadczenia potrzebujesz do danego poziomu
200,
400,
800,
1600,
3200
}
Teraz Tworzymy plugin_init()
public plugin_init()
{
register_plugin("XpMod", "1.0", "Fxfighter")
//Potrzebujemy tego do sprawdzenia twojego poziomu po tym jak kogoś zabijesz
register_event("DeathMsg", "eDeath", "a")
//Czy się zapisuje ??
SaveXP = register_cvar("SaveXP","1")
//Ile doświadczenia dostajesz za każde zabicie ?
XP_Kill=register_cvar("XP_per_kill", "20")
//Jeżeli komuś walniesz HS ile dostaniesz doświadczenia za ten wyczyn
XP_Hs=register_cvar("XP_hs_bonus","20")
//Tutaj jest ustawione doświadczenie za zabicie
XP_Knife=register_cvar("XP_knife_bonus","20")
//Właśnie wywołaliśmy nowe połączenie nvault
// Wywołaliśmy je jako animod
g_vault = nvault_open("animod")
// Rejestruje komendę odpowiedzialną za wywołanie i zmianę klasy
register_clcmd("say /class", "ChangeClass")
register_clcmd("say_team /class", "ChangeClass")
//Pokazuje ile masz doświadczenia
register_clcmd("say /xp", "ShowHud")
register_clcmd("say_team /xp", "ShowHud")
}
Teraz zabieramy sie do stworzenia funkcji Death . Pamiętacie jak zakomentowaliśmy "eDeath" w plugin_init()?Będzie Ona śledzić doświadczenie jeżeli zdobędziesz wyższy poziom.
public eDeath( ) //Nazwa Funkcji
{
// If the player's Class is nothing, then dont bother to do any of the below
if(PlayerClass[attacker] == 0)
return PLUGIN_CONTINUE
// Tworzy zmienną do przechowywania informacji o ID atakującego
new attacker = read_data( 1 )
// Stworzyliśmy zmiennądo przechowywania informacji o zaatakowanym
// Jeżeli gracz został zabity
new iVictim = read_data( 2 )
// Jeżeli Gracz został zabity Hs'em, ta funkcja mu przyzna doświadczenie korzystając z cvaru Xp_Hs
new headshot = read_data( 3 )
// Jaka broń została użyta
new clip, ammo, weapon = get_user_weapon(attacker,clip,ammo);
PlayerXP[attacker] += get_pcvar_num(XP_Kill)
// Używamy xp_hs cvaru
// Sprawdza czy ofiara została zabita poprzez HS
if(headshot)
// Daj jemu / jej dodatkowe doświadczenie
PlayerXP[attacker] += get_pcvar_num(XP_Hs)
// Sprawdza czy ofiarazostała zabita nożem
if(weapon == CSW_KNIFE)
// Daj jemu / jej dodatkowe doświadczenie
PlayerXP[attacker] += get_pcvar_num(XP_Knife)
// Sprawdza czy gracz ma dostateczna liczbę doświadczenia do awanswania na anstępny poziom
while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]])
{ // this will create the Congratulations message.
client_print(attacker, print_chat, "[Animal Mod] Gratulacje! Jestes masz teraz poziom %i %s!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker]])
// Add his/her level
PlayerLevel[attacker] += 1
}
// Pokazuje graczowi jego poziom w HUD
ShowHud(attacker)
}
To jest funkcja odpowiadająca za wyświetlanie poziomu, doświadczenia i klasy gracza w HUD
public ShowHud(id)
{
set_hudmessage(255, 0, 0, 0.75, 0.01, 0, 6.0, 15.0)
show_hudmessage(id, "Poziom: %i^nDoswiadczenie: %i^nPostac: %s",PlayerLevel[id],PlayerXP[id],CLASSES[PlayerClass[id]])
}
Informacja: ^n Określa nową linię
Tutaj jest Menu.W nim jest możliwośc wyboru Zwierzątka jakim będziesz grać. Używa nowego systemu menu.Nie mam ochoty na dodawanie nowcyh funkcji do tego menu, here is the original tutorial on that
public ChangeClass(id)
{
new menu = menu_create("Class Menu" , "Class_Handle");
menu_additem(menu ,"Dog", "1" , 0);
menu_additem(menu ,"Cat", "2" , 0);
menu_additem(menu ,"Horse", "3" , 0);
menu_additem(menu ,"Cow", "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
}
To jest funkcja odpowiadająca za wywołanie odpowiednich działań gdy z serwerem łączy sie gracz
public client_connect(id)
{
// OTylko wtedy gdy zapis jest włączony
if(get_pcvar_num(SaveXP) == 1)
{
// Ładuje twoje dane GRACZA
LoadData(id)
}
}
To jest funkcja odpowiadająca za wywołanie odpowiednich działań gdy Gracz wychodzi z serwera
public client_disconnect(id)
{
// To się dzieje tylko gdy zapis jest włączony
if(get_pcvar_num(SaveXP) == 1)
{
// Zapiszmy danę
SaveData(id)
}
}
Teraz tworzymy funkcje odpowiedzialną za zapis danych
public SaveData(id)
{
// Wybierz Steam id gracza, potrzebujemy tego ponieważ w tym modzie zapis jest na SID
new AuthID[35] get_user_authid(id,AuthID,34)
new vaultkey[64],vaultdata[256]
// Co ma byc w animod pliku
format(vaultkey,63,"%s-Mod",AuthID)
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
// zapisuje dane
nvault_set(g_vault,vaultkey,vaultdata)
return PLUGIN_CONTINUE
}
Teraz tworzymy funkcje odpowiedzialną za ładowanie danych postaci
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
}
I teraz możemy dodać to co chcemy bo mamy szkielet
Wszystkie komentarze zostały przetłumaczone na "Mój Język"
I są one tym co chciał nam przekazać właściciel TUTORIALA.
Jeżeli są jakieś błędy w nazewnictwie ect. najmocniej przepraszam.
Jeżeli złamałem tym tematem jakiś regulamin Proszę o Wyrozumiałą Karę
TUTEK NIE MÓJ !!
Oparte na New XP Mod tutorial - AlliedModders
Mam nadzieje że komuś się przyda
Jeżeli cos pominąłem w tłumaczeniu I'm so sory but I am Only Person.
Błędów nie popełnia tylko ten kto nic nie robi
Testowałem wszystko poza zapisem.... ::Ggiel::
Użytkownik benio101 edytował ten post 24.07.2012 07:29
Usunięcie niepotrzebnych znaków nowej linii na początku niektórych fragmentów kodu SMA