Witam.
W tym poradniku zaprezentuję Ci jak pisać pluginy i jeżeli nigdy nie napisałeś żadnego pluginu to będzie to twój pierwszy dobry plugin.
A teraz rozluźnij się, włącz cichą muzykę oraz zadbaj aby w twoim otoczeniu nikt Ci nie przeszkadzał.
Jeżeli chcesz naprawdę się czegoś nauczyć to przeczytaj cały post dokładnie i staraj się wszystko zrozumieć.
Gotowy? Do dzieła!
Stwórz sobie plik .sma
Aby to zrobić stwórz zwykły plik tekstowy i otwórz go po czym w lewym górnym rogu wybierz Zapisz jako.
W pole Nazwa pliku wpisz ExpMod.sma a niżej w typ zaznacz Wszystkie pliki.
Okej. Otwórz go i dodaj podstawową biblioteke
#include <amxmodx>
dalej zadefiniuj nazwę pluginu, wersję oraz autora.
#define PLUGIN "ExpMod" #define VERSION "1.0" #define AUTHOR "Nick"
Jako Nick wpisz swoją nazwę, tak ty będziesz autorem tego pluginu.
Teraz trzeba zapublikować podstawową funkcję czyli
public plugin_init() {
tutaj najpierw rejestrujemy to co zadefiniowaliśmy.
register_plugin( PLUGIN, VERSION, AUTHOR )
Okej. Jako, że to jest Exp Mod musimy też zarejestrować Zabicie gracza aby dostawać exp za zabicie.
Robimy to za pomocą tego:
register_event( "DeathMsg", "DeathMsg", "a" )
Drugie DeathMsg odnosi nas do zapublikowania tej rejestracji, więc robimy to.
public DeathMsg() {
Dobrze Ci idzie!
Teraz tworzymy zmienne przechowujące informacje o osobie która Zabija oraz Ginie.
new Zabojca = read_data( 1 ) new Ofiara = read_data( 2 )
Teraz bardzo ważna rzecz. Trzeba stworzyć warunek.
if( Zabojca == Ofiara ) return PLUGIN_HANDLED
Pytanie. Kiedy Zabójca jest Ofiarą? Jest wtedy gdy popełnia samobójstwo np. spadając z dużej wysokości lub ginie poprzez elementy na mapie jak lawa czy jakieś kolce.
A co robi return PLUGIN_HANDLED ? Linijka ta "zatrzymuje" działanie pluginu jeżeli Zabójca jest Ofiarą.
Wszystko jasne? Lecim dalej.
Teraz trzeba stworzyć warunek czy osoba zabijająca jest "Graczem". Wygląda to tak.
if( Gracz( Zabojca ) ) {
Zaraz zaraz. Skąd silnik ma to wiedzieć? Dowiesz się w dalszej części poradnika. Gracz() odpowiednio zapublikujemy!
Teraz jeżeli te warunki są spełnione możemy dodać graczowi Exp.
DodajExp( Zabojca )
To też zapublikujemy.
Ale też po dodaniu Expa trzeba sprawdzić czy czasem nie trzeba dodać poziomu. Więc dodajemy linjke
SprawdzPoziom( Zabojca )
oraz
return PLUGIN_CONTINUE }
Sprawę zabijania mamy za sobą!
Teraz publikujemy dodawanie expa.
public DodajExp( id ) {
Pokażę ci jak również dodać exp dla vipa!
if(get_user_flags(id) & ADMIN_LEVEL_H) { Exp[ id ] = Exp[ id ] + 20 } else { Exp[ id ] = Exp[ id ] + 10 } }
Jak widzisz dodaliśmy warunek, jeżeli gracz posiada flage ADMIN_LEVEL_H dostanie 20 expa.
po czym dałem "else" znaczy ono dokładnie "jeśli nie" czyli jeśli gracz nie ma tej flagi dostanie 10 expa.
Pokazała się nowa rzecz czyli Exp[ id ]
Na samej górze pod definiami dodajemy więc
new Exp[33]
Zmienna która będzie przechowywała informacje o naszym expie.
Teraz publikujemy sprawdzanie naszego expa.
public SprawdzPoziom( id ) {
pod czym dodajemy też warunek ale troszeczkę inny ale nie będę Ci nim mieszał w głowie i mówił dlaczego on tutaj się znajduje.
while( Exp[ id ] >= POZIOMY[ Poziom[ id ] ] && Poziom[ id ] < MAXPOZIOM ) Poziom[ id ] ++
Co tu się dzieje?
Oznacza to, jeśli Exp gracza jest "większy lub równy" od wymaganego poziomu to doda nam poziom w góre.
Jest też drugi warunek po && oznacza on, że doda nam poziom tylko wtedy gdy poziom ma być mniejszy niż maxymalny poziom.
Pokazały się nowe rzeczy jak m.in. Poziom[ id ]
Przechowuje on informacje o naszym poziomie więc musimy dodać zmienną. Wiesz gdzie ją dodać z przykładu zmiennej expa.
new Poziom[33]
Pokazało się nawet MAXPOZIOM
To już rzeba zadefiniować
#define MAXPOZIOM 100
Oraz coś jak POZIOMY[ Poziom[ id ] ]
Do tego też trzeba stworzyć zmienną do przechowywania tych informacji.
//Wygenerowane na amxx.pl new const POZIOMY[ MAXPOZIOM ] = { 0, 81, 102, 251, 475, 766, 1120, 1577, 2093, 2644, 3263, 4040, 4888, 5785, 6745, 7829, 8926, 10119, 11340, 12809, 14402, 16042, 17686, 19365, 21050, 22818, 24625, 26584, 28702, 30985, 33332, 35762, 38212, 40758, 43443, 46212, 49003, 51956, 54933, 58010, 61135, 64261, 67489, 70734, 74087, 77444, 80864, 84447, 88269, 92166, 96063, 100095, 104191, 108329, 112555, 116927, 121347, 125838, 130332, 134840, 139401, 144071, 148823, 153579, 158594, 163792, 169027, 174347, 179702, 185179, 190663, 196194, 201775, 207372, 213145, 218925, 224925, 230931, 237143, 243361, 249714, 256163, 262627, 269118, 275795, 282515, 289287, 296152, 303085, 310096, 317283, 324512, 331833, 339156, 346534, 354000, 361544, 369225, 376999, 384826 }
Zaraz zaraz.. tutaj mamy POZIOMY[ MAXPOZIOM ] a tam POZIOMY[ Poziom[ id ] ]
To określa jaki mamy poziom czyli np. mamy poziom expa 102 czyli poziom 2 bodajże
Teraz jescze zamykamy naszą publikacje SprawdzPoziom( id ) za pomocą tego
return PLUGIN_CONTINUE }
Okej. Mieliśmy jeszcze zapublikować Gracza.
public Gracz( id ) {
i dodajemy waruneczek
if( is_user_connected( id ) && is_user_alive( id ) ) return true return false }
Oznacza on, że jeżeli gracz jest połączony oraz gracz jest żywy to wtedy zwraca "true" czyli prawdziwość.
Po czym jeżeli to się stało zwracamy fałszywość.
Szkielet expa mamy za sobą, zmienne przechowują informacje ale chwilowo czyli na 1 mape.
Trzeba je zapisać na kolejne mapy, użyjemy do tego zapis nvault na nick.
Jest to już w innej bibliotece niż <amxmodx> więc dodajemy ją na górze.
#include <nvault>
Potem dodajemy 2 publikacje.
public client_connect( id ) { WczytajExp( id ) }
Czyli przy połączeniu się gracza z serwerem wczyta exp, oczywiście musimy to potem zapublikować.
Ale teraz dodajmy jeszcze
public client_disconnect( id ) { ZapiszExp( id ) }
Zapisujemy exp przy rozłączeniu gracza z serwerem.
Teraz nasze kochane publikacje:
public WczytajExp( id ) {
Pod czym dodajemy nasz zapis na nick
new name[ 35 ] new vaultdata[ 256 ] new vaultkey[ 64 ] get_user_name( id, name, 34 ) format( vaultkey, 63, "%s-NAME", name ) format( vaultdata,255, "%i#%i#", Poziom[ id ], Exp[ id ] ) nvault_get( vault, vaultkey, vaultdata, 255 ) replace_all( vaultdata , 255, "#", " " ) new poziom[ 32 ], exp[ 32 ] parse( vaultdata, poziom, 31, exp, 31 ) Poziom[ id ] = str_to_num( poziom ) Exp[ id ] = str_to_num( exp ) return PLUGIN_CONTINUE }
O co tutaj chodzi..
Na początku mamy zmienne które przechowają informacje o nazwie gracza oraz dane nvault po czym te informacje zostaną zapisane w pliku na serwerze.
Dalej tworzymy tzw. format czyli co ma się znajdować w tym pliku. Znajdować się będzie np. takie coś:
Wonsz żeczny-name
oraz
10#1346
czyli mamy 10 poziom i 1347 expa. (przykład)
Te informacje będą wczytywane.
Publikujemy
public ZapiszExp( id ) {
pod czym znów zmienne oraz dane do zapisywania
new name[ 35 ] get_user_name( id, name, 34 ) new vaultdata[ 256 ] new vaultkey[ 64 ] format( vaultkey, 63, "%s-NAME", name ) format( vaultdata, 255, "%i#%i#", Poziom[ id ], Exp[ id ] ) nvault_set( vault , vaultkey, vaultdata ) }
Mamy też rzecz nową czyli vault
Chwilowa informacja, musimy oczywiście stworzyć z tym zmienną na samej górze czyli
new vault
Teraz zajmiemy się utworzeniem pliku na serwerze w którym zapisywać się będą dane.
Robimy to w publikacji plugin_init
vault = nvault_open( "ZapisExpMod" )
Gdzie "ZapisExpMod" to będzie nazwa pliku.
Okej mamy piękny zapis a teraz stworzymy sobie napis na ekranie gdzie będzie pokazywany nasz poziom oraz exp.
Do tego tworzymy od razu zmienną do przechowania informacji o tym
new HUD
oraz użwamy tego
HUD = CreateHudSyncObj()
Dodajemy to do publikacji plugin_init
Publikujemy naszego huda np. tak:
public PokazHUD( id ) {
oraz dodajemy warunek aby wszystko pięknie grało:
if( !Gracz( id ) ) return PLUGIN_HANDLED
A po co tam ten wykrzyknik? Wykrzyknik przed daną rzeczą oznacza jego przeciwność. Czyli jeżeli osoba nie jest graczem to
zatrzymujemy plugin za pomocą return PLUGIN_HANDLED
Teraz tworzymy informacje o położeniu naszych napisów:
set_hudmessage(255, 0, 0, 0.03, 0.30, 0, 0.0, 0.3, 0.0, 0.0)
Informacje o tym znajdziecie tutaj: http://amxx.pl/topic...domości-na-hud/
A dalej lecimy z napisami jakie mają być na tym ekranie
ShowSyncHudMsg(id, HUD , "Poziom: %d ^nExp: %d / %d", Poziom[ id ], Exp[ id ], POZIOMY[ Poziom[ id ] ] )
%d przenosi nas poza napisy i bierze informacje z danej zmiennej.
A dlaczego nie %s ? Z literką s bierzemy "słowa" a literka %d lub %i liczby.
Zamykamy teraz naszą publikację
return PLUGIN_HANDLED }
Zatrzymujemy działanie huda, ponieważ został on wyświetlony wiec aby się nie wyświetlał on nam cały czas.
Teraz musimy pokazać ten hud w danym momencie.
My pokażemy ten hud przy odrodzeniu gracza czyli w publikacji plugin_init rejestrujemy to odrodzenie
RegisterHam( Ham_Spawn, "player", "Odrodzenie", 1 )
Pokazała się rejestracja z nowej biblioteki więc na samej górze dodajemy
#include <hamsandwich>
A teraz nasze Odrodzenie zapublikujemy:
public Odrodzenie( id ) { set_task( 0.1, "PokazHUD", id, _, _, "b" ) }
W środku znajduje się set_task czyli po 0.1 sekundzie przejdzie do publikacji PokazHUD która nam ten hud wyświetli.