Ebben a tutoriálban meg fogom mutatni, hogyan készíthetünk egy egyszerű XP-módot.
Figyelem! A tutoriál megértéséhez tisztában kell legyél egy kicsit az amxmodx szkriptinggel.
Először is adjuk hozzá a függvénykönyvtárakat, amik szükségesek.
Kód:
Definiáljuk, hogy hány db "class", faj közül lehessen választani. Jelenleg 5-el dolgozunk, de ha te hozzáakarsz még adni mondjuk egy "madár" fajt akkor írd át 6-ra.
Kód:
Deklaráljuk a változókat, amik majd a játékosok XP-it, Szintjeit, Faját tárolja. Utána létrehozunk változókat a speciális ölésekhez(pl fejlövés).
És utoljára a g_vault változót, ami az nvault mentéshez kell majd.
Kód:
new PlayerXP[33],PlayerLevel[33],PlayerClass[33]
new XP_Kill,XP_Knife,XP_Hs,SaveXP
new g_vault
Itt pedig megadjuk a fajok neveit. Én most állatokat fogok írni, de te akár Predátort is írhatsz. Fontos, hogy annyi legyen amennyi a MAXCLASSES. Tehát jelen esetben 5.
Kód:
new const CLASSES[MAXCLASSES][] = {
"Nincs",
"Kutya",
"Macska",
"Lovacska",
"Boci"
}
Most pedig létrehozzuk a szinteket, és hogy egyes szintekhez mennyi XP szükséges. Jelen esetben 7 db szint lesz.
Kód:
new const LEVELS[7] = {
0,
100,200,400,800,1600,3200 }
Most pedig jöhet a plugin_init.
Kód:
public plugin_init()
{
register_plugin("Animal-Mod", "1.0", "Te")
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("animalmod") register_clcmd("say /faj", "ChangeClass") register_clcmd("say_team /faj", "ChangeClass") register_clcmd("say /xp", "ShowHud") register_clcmd("say_team /xp", "ShowHud") }
Most pedig létrehozzuk a halál funkciót. Emlékezz, már "lehookoltuk" plugin_initben eDeath néven.
Kód:
public eDeath( ) {
new attacker = read_data( 1 ) new iVictim = read_data( 2 ) new headshot = read_data( 3 ) if(PlayerClass[attacker] == 0) return PLUGIN_CONTINUE new clip, ammo, weapon = get_user_weapon(attacker,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] Grat! Te egy %i szintu %s vagy!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker]])
PlayerLevel[attacker] += 1 }
ShowHud(attacker)
}
Jöhet a ShowHud funkció, amiben megmutatjuk neki a szintjét, xp-jét, faját.
Megjegyzés: ^n új sort jelent.
Kód:
public ShowHud(id)
{
set_hudmessage(255, 0, 0, 0.75, 0.01, 0, 6.0, 15.0)
show_hudmessage(id, "Szinted: %i^nXP-d: %i^nFajod: %s",PlayerLevel[id],PlayerXP[id],CLASSES[PlayerClass[id]])
}
Jöhet a menü, amiben kiválaszthatja a játékos a faját. Most nem mennék bele a menü részleteibe, erről bővebb infót találsz az
eredeti tutorialban.
Kód:
public ChangeClass(id)
{
new menu = menu_create("Faj Menu" , "Class_Handle");
menu_additem(menu ,"Kutya", "1" , 0);
menu_additem(menu ,"Macska", "2" , 0);
menu_additem(menu ,"Lovacska", "3" , 0);
menu_additem(menu ,"Boci", "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,"A te uj fajod: %s",CLASSES[i])
}
else {
client_print(id,print_chat,"Eddig is egy %s voltal",CLASSES[i])
}
menu_destroy(menu);
return PLUGIN_CONTINUE
}
Jöhet a client_connect funkció. Bevezetőleg annyit, hogy akkor fut le, amikor a játékos csatlakozik a szerverre.
Kód:
public client_connect(id)
{
if(get_pcvar_num(SaveXP) == 1) {
LoadData(id)
}
}
Jöhet a client_disconnect funkció. Röviden róla annyit, hogy akkor fut le, amikor a játékos lecsatlakozik a szerverről.
Kód:
public client_disconnect(id)
{
if(get_pcvar_num(SaveXP) == 1) {
SaveData(id)
}
}
Most pedig nézzük meg az XP mentést.
Kód:
public SaveData(id)
{
new name[32] get_user_name(id, name, 31)
new vaultkey[64],vaultdata[256] format(vaultkey,63,"%sANIMALMOD", name)
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
nvault_set(g_vault,vaultkey,vaultdata)
return PLUGIN_CONTINUE
}
És végül de nem utolsó sorban nézzük meg az XP betöltést.
Kód:
public LoadData(id)
{
new name[32]
get_user_name(id, name, 31)
new vaultkey[64],vaultdata[256]
format(vaultkey,63,"%sANIMALMOD", name)
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
}
Röviden tömören ennyi.
Természetesen fel turbózhatod ilyenekkel, hogy a bocinak több hpja legyen, a macska gyorsabb legyen, a kutya többet sebezzen stb. És persze ezeket szinthez is kötheted.
Ezekhez a
Kód:
PlayerXP[játékos]
és a
Kód:
PlayerLevel[játékos]
tömböket használhatod.
Most pedig a teljes kód, hozzászólások nélkül:
Kód:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#define MAXCLASSES 5
new PlayerXP[33],PlayerLevel[33],PlayerClass[33]
new XP_Kill,XP_Knife,XP_Hs,SaveXP
new g_vault
new const CLASSES[MAXCLASSES][] = {
"Nincs",
"Kutya",
"Macska",
"Lovacska",
"Boci"
}
new const LEVELS[7] = {
0,
100,
200,
400,
800,
1600,
3200
}
public plugin_init()
{
register_plugin("Animal-Mod", "1.0", "Te")
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("animalmod")
register_clcmd("say /faj", "ChangeClass")
register_clcmd("say_team /faj", "ChangeClass")
register_clcmd("say /xp", "ShowHud")
register_clcmd("say_team /xp", "ShowHud")
}
public eDeath()
{
new attacker = read_data( 1 )
new iVictim = read_data( 2 )
new headshot = read_data( 3 )
if(PlayerClass[attacker] == 0)
return PLUGIN_CONTINUE
new clip, ammo, weapon = get_user_weapon(attacker,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] Grat! Te egy %i szintu %s vagy!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker]]) //Ha igen, akkor kiírunk neki egy gratuláló üzenetet.
PlayerLevel[attacker] += 1
}
ShowHud(attacker)
}
public ShowHud(id)
{
set_hudmessage(255, 0, 0, 0.75, 0.01, 0, 6.0, 15.0)
show_hudmessage(id, "Szinted: %i^nXP-d: %i^nFajod: %s",PlayerLevel[id],PlayerXP[id],CLASSES[PlayerClass[id]])
}
public ChangeClass(id)
{
new menu = menu_create("Faj Menu" , "Class_Handle");
menu_additem(menu ,"Kutya", "1" , 0);
menu_additem(menu ,"Macska", "2" , 0);
menu_additem(menu ,"Lovacska", "3" , 0);
menu_additem(menu ,"Boci", "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,"A te uj fajod: %s",CLASSES[i])
}
else
{
client_print(id,print_chat,"Eddig is egy %s voltal",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)
}
}
public SaveData(id)
{
new name[32]
get_user_name(id, name, 31)
new vaultkey[64],vaultdata[256]
format(vaultkey,63,"%sANIMALMOD", name)
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
nvault_set(g_vault,vaultkey,vaultdata)
return PLUGIN_CONTINUE
}
public LoadData(id)
{
new name[32]
get_user_name(id, name, 31)
new vaultkey[64],vaultdata[256]
format(vaultkey,63,"%sANIMALMOD", name)
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
}