Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

IQa - zdjęcie

IQa

Rejestracja: 26.03.2014
Aktualnie: Nieaktywny
Poza forum Ostatnio: 23.05.2014 15:12
-----

#598226 Dodawanie frakcji do Opisu Klas

Napisane przez Andrzejek w 29.12.2013 00:20

Witam pisze ten poradnik, dla osób, którym się nie chce przez chwile pomyśleć.

Dobra tak więc zaczynamy, mam nadzieje że zrobiliście to ? http://amxx.pl/topic...osoby/?p=209383 jeżeli nie to zrób to a potem przystąp do poniższego poradnika.

 

Szukamy w kodzie tego :

public OpisKlasy(id)
{
    new menu = menu_create("Wybierz klase:", "OpisKlasy_Handle");
    for(new i=1; i <= ilosc_klas; i++)
    menu_additem(menu, nazwy_klas[i]);
    menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
    menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
    menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
    menu_display(id, menu);
    
    client_cmd(id, "spk QTM_CodMod/select");
}

public OpisKlasy_Handle(id, menu, item)
{
    client_cmd(id, "spk QTM_CodMod/select");
    
    if(item++ == MENU_EXIT)
    {
        menu_destroy(menu);
        return PLUGIN_CONTINUE;
    }
    
    new bronie[320];
    for(new i=1, n=1; i <= 32; i++)
    {
        if((1<<i) & bronie_klasy[item])
        {
            new weaponname[22];
            get_weaponname(i, weaponname, 21);
            replace_all(weaponname, 21, "weapon_", " ");
            if(n > 1)    
            add(bronie, charsmax(bronie), ",");
            add(bronie, charsmax(bronie), weaponname);
            n++;
        }
    }
    
    new opis[416+MAX_WIELKOSC_OPISU];
    format(opis, charsmax(opis), "\yKlasa: \w%s^n\yInteligencja: \w%i^n\yZdrowie: \w%i^n\yWytrzymalosc: \w%i^n\yKondycja: \w%i^n\yBronie:\w%s^n\yDodatkowy opis: \w%s^n%s", nazwy_klas[item], inteligencja_klas[item], zdrowie_klas[item], wytrzymalosc_klas[item], kondycja_klas[item], bronie, opisy_klas[item], opisy_klas[item][79]);
    show_menu(id, 1023, opis);
    
    return PLUGIN_CONTINUE;
}


i podmieniamy na to :

public OpisKlasy(id)
{    
    new menu = menu_create("Wybierz klase:", "OpisKlase_Frakcje");
    for(new i=1; i <= ilosc_klas; i++)
    {
        if(!is_in_previous(frakcja_klas[i],i)){
            menu_additem(menu,frakcja_klas[i],frakcja_klas[i])
        }
    }
    
    menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
    menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
    menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
    menu_display(id, menu);
}

public OpisKlase_Frakcje(id, menu, item)
{
    if(item == MENU_EXIT){
        menu_destroy(menu);
        return PLUGIN_CONTINUE;
    }
    
    new data[65], iName[64]
    new acces, callback
    menu_item_getinfo(menu, item, acces, data,64, iName, 63, callback)
    
    new menu2 = menu_create("Wybierz klase:", "OpisKlasy_Handle");
    
    new klasa[50],szTmp[5];
    for(new i=1; i <= ilosc_klas; i++)
    {
        if(equali(data,frakcja_klas[i])){
            format(klasa, charsmax(klasa), "%s", nazwy_klas[i]);
            num_to_str(i,szTmp,charsmax(szTmp));
            menu_additem(menu2, klasa,szTmp);
        }
    }
        
    menu_setprop(menu2, MPROP_EXITNAME, "Wyjdz");
    menu_setprop(menu2, MPROP_BACKNAME, "Poprzednia strona");
    menu_setprop(menu2, MPROP_NEXTNAME, "Nastepna strona");
    menu_display(id, menu2);
    
    client_cmd(id, "spk QTM_CodMod/select");
    
    menu_destroy(menu);
    return PLUGIN_CONTINUE;
}


public OpisKlasy_Handle(id, menu, item)
{
    client_cmd(id, "spk QTM_CodMod/select");
    
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        return PLUGIN_CONTINUE;
    }
    
    new data[65], iName[64]
    new acces, callback
    menu_item_getinfo(menu, item, acces, data,64, iName, 63, callback)
    
    item = str_to_num(data);
    
    new bronie[320];
    for(new i=1, n=1; i <= 32; i++)
    {
        if((1<<i) & bronie_klasy[item])
        {
            new weaponname[22];
            get_weaponname(i, weaponname, 21);
            replace_all(weaponname, 21, "weapon_", " ");
            if(n > 1)    
            add(bronie, charsmax(bronie), ",");
            add(bronie, charsmax(bronie), weaponname);
            n++;
        }
    }
    
    new opis[416+MAX_WIELKOSC_OPISU];
    format(opis, charsmax(opis), "\yKlasa: \w%s^n\yInteligencja: \w%i^n\yZdrowie: \w%i^n\yWytrzymalosc: \w%i^n\yKondycja: \w%i^n\yBronie:\w%s^n\yDodatkowy opis: \w%s^n%s", nazwy_klas[item], inteligencja_klas[item], zdrowie_klas[item], wytrzymalosc_klas[item], kondycja_klas[item], bronie, opisy_klas[item], opisy_klas[item][79]);
    show_menu(id, 1023, opis);
    
    return PLUGIN_CONTINUE;
}

 

I powinno śmigać ^^

 

Pozdrawiam


  • +
  • -
  • 11


#189630 Call of Duty: MW Mod [UPDATE]

Napisane przez QTM. Peyote w 18.11.2010 18:56

testyq.png

Nowa wersja modyfikacji Call of Duty: MW.
Główną zmianą jest budowa moda.
Teraz wszystkie perki(przedmioty) i klasy są oddzielnymi pluginami.

Podziękowania dla:
MieTeK - za grafa.
Szyfrant - za testa.
testbs.png

say /klasa - Otwiera menu wyboru klasy.
say /klasy - Otwiera menu opisów klas.
say /perk - Pokazuje informacje o posiadanym perku.
say /perki - Otwiera menu opisów perków.
say /wyrzuc - Wyrzuca aktualny perk.
say /reset - Resetuje statystyki.
say /statystyki - Pokazuje aktualne statystyki.
say /pomoc - Tajne.
testue.png

cod_killxp 10 - Doswiadczenie za zabojstwo.
cod_winxp 50 - Doswiadczenie za wygrana.
cod_damagexp 1 - Doswiadczenie za 20 obrazen.
cod_savetype 1 - Typ zapisu 1- Nick 2-SteamID 3-IP.
cod_maxlevel 200 - Maksymalny poziom.
cod_levelratio 35 - Ustawia ile doswiadczenia potrzebne do zdobycia 1 poziomu.
cod_weaponsblocking 1 - blokowanie podnoszenia broni
testhm.png

Kopiujemy zawartość folderu cstrike z CodMod.rar do folderu cstrike na serwerze.
Nic nie trzeba dopisywać do plugins.ini!

testdi.png
(Tylko dla skrypterów)

forward cod_perk_changed(id, perk);
/*------------------------------
Forward wysylany do wszystkich pluginów w momencie zmiany perku
------------------------------*/


forward cod_class_changed(id, klasa);
/*------------------------------
Forward wysylany do wszystkich pluginów w momencie zmiany klasy
------------------------------*/


forward cod_perk_enabled(id, wartosc);
/*------------------------------
Forward wysylany do pluginu z ktorego zarejestrowany jest perk w momencie aktywacji
------------------------------*/


forward cod_perk_disabled(id);
/*------------------------------
Forward wysylany do pluginu z ktorego zarejestrowany jest perk w momencie dezaktywacji
------------------------------*/


forward cod_perk_used(id);
/*------------------------------
Forward wysylany do pluginu z ktorego zarejestrowany jest perk w momencie uzycia perku
------------------------------*/


forward cod_class_enabled(id);
/*------------------------------
Forward wysylany do pluginu z ktorego zarejestrowana jest kasa w momencie aktywacji
------------------------------*/


forward cod_class_disabled(id);
/*------------------------------
Forward wysylany do pluginu z ktorego zarejestrowana jest kasa w momencie dezaktywacji
------------------------------*/
testkdr.png
(Tylko dla skrypterów)

native cod_get_user_xp(id);
/*------------------------------
Zwraca doswiadczenie gracza
------------------------------*/


native cod_get_user_level(id);
/*------------------------------
Zwraca poziom gracza
------------------------------*/


native cod_get_user_points(id)
/*------------------------------
Zwraca punkty gracza
------------------------------*/


native cod_set_user_xp(id, wartosc);
/*------------------------------
Ustawia doswiadczenie gracza
------------------------------*/


native cod_get_user_class(id);
/*------------------------------
Zwraca klase gracza
------------------------------*/


native cod_set_user_class(id, klasa, zmien=0);
/*------------------------------
Ustawia klase gracza,
jezeli zmien=1 zmienia ja natychmiast
------------------------------*/


native cod_get_user_perk(id, &wartosc=0);
/*------------------------------
Zwraca perk gracza,
oraz przypisuje zmiennej wartosc wartosc perku
------------------------------*/


native cod_set_user_perk(id, perk, wartosc=-1, pokaz_info=1);
/*------------------------------
Ustawia perk gracza.
Jezeli wartosc = -1,
wartosc perku bedzie losowa.
Jezeli perk = -1 perk
bedzie losowy
------------------------------*/


native cod_get_user_health(id, zdrowie_zdobyte=1, zdrowie_klasy=1, zdrowie_bonusowe=1);
/*------------------------------
Zwraca punkty statystyki zdrowie
------------------------------*/


native cod_set_user_bonus_health(id, wartosc);
/*------------------------------
Ustawia dodatkowe punkty statystyki zdrowie
------------------------------*/


native cod_get_user_intelligence(id, inteligencja_zdobyta=1, inteligencja_klasy=1, inteligencja_bonusowa=1);
/*------------------------------
Zwraca punkty statystyki inteligencja
------------------------------*/


native cod_set_user_bonus_intelligence(id, wartosc);
/*------------------------------
Ustawia dodatkowe punkty statystyki inteligencja
------------------------------*/


native cod_get_user_trim(id, kondycja_zdobyta=1, kondycja_klasy=1, kondycja_bonusowa=1);
/*------------------------------
Zwraca punkty statystyki kondycja
------------------------------*/


native cod_set_user_bonus_trim(id, wartosc);
/*------------------------------
Ustawia dodatkowe punkty statystyki kondycja
------------------------------*/


native cod_get_user_stamina(id, wytrzymalosc_zdobyta=1, wytrzymalosc_klasy=1, wytrzymalosc_bonusowa=1);
/*------------------------------
Zwraca punkty statystyki wytrzymalosc
------------------------------*/


native cod_set_user_bonus_stamina(id, wartosc);
/*------------------------------
Ustawia dodatkowe punkty statystyki wytrzymalosc
------------------------------*/


native cod_points_to_health(id, ilosc);
/*------------------------------
Przydziela punkty do statystyki zdrowie
------------------------------*/


native cod_points_to_intelligence(id, ilosc);
/*------------------------------
Przydziela punkty do statystyki inteligencja
------------------------------*/


native cod_points_to_trim(id, ilosc);
/*------------------------------
Przydziela punkty do statystyki kondycja
------------------------------*/


native cod_points_to_stamina(id, ilosc);
/*------------------------------
Przydziela punkty do statystyki wytrzymalosc
------------------------------*/


native cod_inflict_damage(atakujacy, ofiara, Float:obrazenia, Float:czynnik_inteligencji=1.0, byt_uszkadzajacy=0, dodatkowe_flagi=0);
/*------------------------------
Zadaje obrazenia z uwzglednieniem inteligencji
------------------------------*/


native cod_get_perkid(const nazwa_perku[]);
/*------------------------------
Zwaca numer perku o podanej nazwie
------------------------------*/


native cod_get_perks_num();
/*------------------------------
Zwaca ilosc perkow
------------------------------*/


native cod_get_perk_name(perk, Return[], len);
/*------------------------------
Kopiuje nazwe perku do Return
------------------------------*/


native cod_get_perk_desc(perk, Return[], len);
/*------------------------------
Kopiuje opis perku do Return
------------------------------*/


native cod_get_classid(const nazwa_klasy[]);
/*------------------------------
Zwaca numer klasy o podanej nazwie
------------------------------*/


native cod_get_classes_num();
/*------------------------------
Zwaca ilosc klas
------------------------------*/

native cod_get_class_name(perk, Return[], len);
/*------------------------------
Kopiuje nazwe klasy do Return
------------------------------*/


native cod_get_class_desc(perk, Return[], len);
/*------------------------------
Kopiuje opis klasy do Return
------------------------------*/


native cod_give_weapon(id, bron);
/*------------------------------
Daje okreslona bron oraz pozwala na jej posiadanie
------------------------------*/


native cod_take_weapon(id, bron);
/*------------------------------
Zabiera okreslona bron oraz zabrania jej posiadania
------------------------------*/


native cod_set_user_shield(id, wartosc);
/*------------------------------
Ustawia tarcze gracza.
------------------------------*/


native cod_set_user_nightvision(id, wartosc);
/*------------------------------
Ustawia noktowizor gracza.
------------------------------*/


native cod_register_perk(const nazwa[], const opis[], min_wartosc=0, max_wartosc=0);
/*------------------------------
Rejestruje nowy perk oraz zwraca jego numer
------------------------------*/


native cod_register_class(const nazwa[], const opis[], bronie, punkty_zdrowia, punkty_kondycji, punkty_inteligencji, punkty_wytrzymalosci);
/*------------------------------
Rejestruje nowa klase oraz zwraca jej numer
------------------------------*/    


native cod_get_level_xp(poziom);
/*------------------------------
Zwraca ilosc potrzebnego doswiadczenia do przejscia danego poziomu
------------------------------*/
testpx.png testyi.png
----------------> Link
Załączony plik  CodMod.rar   965,15 KB  39662 Ilość pobrań

Poprawiona wersja zapisu do pliku vault -> [cod nowy] Call of Duty: MW Mod %5BUPDATE%5D - post #328

Ostatnie zmiany:
  • Naprawione natywy cod_get_class_name i cod_get_class_desc i błąd z pojawiającą się informacją o zdobyciu poziomu.05.01.11-17:03
  • Usunięte bugi crashujące serwer, dodane 5 nowych natyw&#243;w, blokowanie podnoszenia broni w stylu starego CodModa12.12.10-17:00
  • Dodane param_convert do get_perk_name/desc i get_class_name/desc oraz dodane poprzednie zmiany do *.amxx24.11.10-20:03
  • Naprawiony błąd z brakiem fraga za zabicie z rakiety, miny i dynamitu21.11.10-19:07
  • Usunięty client_cmd z pętli i dodany natyw cod_get_user_level21.11.10-12:07
  • Naprawiony perk notatki sapera i poprawiona funkcja UstawPerk19.11.10-12:35
  • Naprawiony natyw cod_get_perkid19.11.10-21:44
  • Usunięty bug z niewłaściwą losową wartością perku. Od teraz cod_perk_enabled wysyła numer perku, a cod_class_enabled numer klasy19.11.10-18:51
  • Dodana klasa Admirał(dawny Rambo) i naprawiony perk Tajemnica Generała.[sup]19.11.10-16:06
  • Poprawiony plik "codmod.inc" i małe zmiany. [sup]19.11.10-15:00
Zgłaszajcie bugi i zaglądajcie co jakiś czas czy nie ma łatek.
  • +
  • -
  • 323


#477125 Informacje wstępne, czyli Jak zacząć Scripting AMXX

Napisane przez Gość w 09.11.2012 19:47

Tutorial dla początkujących
Informacje wstępne
Scripting AMXX


[kotwica='cel']Cel[/kotwica]
Nauka tworzenia pluginów AMXX

Wymagania
  • Znajomość obsługi AMXX
  • Umiejętność programowania
  • Podstawowa znajomość Pawna
  • Racjonalne tworzenie algorytmów
  • Umiejętność korzystania z manuala
  • Edytor Pawna wraz z kompilatorem AMXX
[kotwica='wstep']Wstęp[/kotwica]
Na samym początku zadajmy sobie pytanie: czym są pluginy AMXX i jak działają.

Pluginy AMXX to algorytmy modyfikacji rozgrywki na serwerach HLDS, pisane w języku Pawn,
zrozumiałym dla ludzi i zapisywane pod postacią plików SMA, które w wyniku kompilacji przybierają
postać kodu niezrozumiałego dla człowieka, ale zrozumiałego dla AMXX, zapisywane pod postacią
plików AMXX, które komunikują się z serwerem HLDS poprzez Metamoda:P, zmieniając rozgrywkę.

[kotwica='istota']Istota[/kotwica]
Tym samym, plugin komunikuje się z Metamodem:P, a Metamod:P z silnikiem gry (serwerem HLDS).
Musimy pamiętać, że każda wymiana informacji pomiędzy serwerem a silnikiem gry, zużywa liczne
zasoby sprzętowe i należy zadawać możliwie jak najmniej zapytań do silnika gry poprzez Metamoda:P.

[kotwica='plugins_ini']Plugins.ini[/kotwica]
Plik plugins.ini zawiera listę pluginów, które zostaną załadowane do AMXX i będą wykonywać swoje
algorytmy, komunikując się z serwerem HLDS poprzez MetaModa:P, modyfikując przebieg gry.

Jednak kolejność pluginów wpisanych w pliku plugins.ini nie jest bez znaczenia.
Zwróćmy teraz uwagę na sposób działania AMXX, czyli interakcję z serwerem gry.
AMXX pozwala nam, poprzez MetaModa:P, na następujące operacje:
  • Zarejestrowanie danego zdarzenia czy wartości (np. odczytanie liczby pieniędzy danego gracza, czy zaobserwowanie wybuchu bomby)
  • Modyfikowanie danego zdarzenia czy wartości (np. zmiana punktów życia danego gracza, czy przedłużenia czasu trwania oślepienia)
  • Zablokowanie danego zdarzenia czy usunięcie wartości (np. brak obrażeń od granatów, czy usunięcie limitu posiadanych dolarów)
  • Wywołanie danego zdarzenia (np. zabicie gracz, teleportacja gracza na respawn wrogów, czy pozbawienie gracza jego broni)
  • Tworzenie danego zdarzenia czy wartości (np. zabicie vipa lub ucieczka terrorystów, czy stworzenie nowych cvarów)
Tym samym, poszczególne pluginy mogą być od siebie zależne, a ich kolejność ma znaczenie.
Należy zatem zwracać uwagę na kolejność pluginów w pliku plugins.ini, przy czym algorytmy
kolejnych pluginów, od góry pliku plugins.ini, wykonywane są proporcjonalnie sekwencyjnie.

Przykładowo, jeśli w pluginie pierwszym od góry pliku plugins.ini, zablokujemy możliwość mówienia,
to w pluginie drugim od góry, nie zostanie zarejestrowane powiedzenie na sayu określonej wartości.
W odwrotnej kolejności tych pluginów w pliku plugins.ini zaś, będzie to z kolei możliwe do wykonania.

[kotwica='AMXMODX']AMXMODX[/kotwica]
Pierwszą, podstawową biblioteką, jaką będziemy musieli załączyć do naszego pluginu, jest AMXMODX.
W tym celu, dodajemy na samej górze naszego kodu SMA następującą linijkę kodu
#include <amxmodx>


AMXX posiada parę publicznych, predefiniowanych funkcji, a oto one:

[kotwica='plugin_natives']plugin_natives[/kotwica]
Ta funkcja wywoływana jest jako pierwsza, tuż po załadowaniu pluginu do pamięci AMXX.
W niej należy zainicjować wszelkie natywy do współpracy z innymi pluginami, czyli sprawić,
by możliwa była kompleksowa komunikacja pomiędzy funkcjami poszczególnych pluginów.

Jak już pisałem, funkcje ładowane są kolejno, od góry pliku plugins.ini, tak więc kolejność jest istotna.

[kotwica='plugin_precache']plugin_precache[/kotwica]
Ta funkcja wywoływana jest po załadowaniu wszytkich pluinów z natywami, lecz jeszcze przed pełnym zainicjowaniem
serwera HLDS i to w niej należy zarejestrować wszelkie wymagane do pobrania przez Użytkowników pliki niestandardowe,
z których będzie korzystał plugin, by powiadomić klienta gry o konieczności pobrania tych plików przed ustaleniem połączenia.

W tej właśnie funkcji należy zarejestrować wszelkie modyfikatory skryptów startowych serwera HLDS, by móc
w nie ingerować, zanim zostaną załadowane i wykonane skrypty startowe, uniemożliwiając ich identyfikację.

[kotwica='plugin_init']plugin_init[/kotwica]
Ta funkcja wywoływana jest podczas inicjalizacji pluginu, po pełnym załadowaniu funkcji startowych serwera.
W tej funkcji należy zarejestrować nasz plugin przy użyciu funkcji register_plugin o następujących parametrach
register_plugin(const plugin_name[], const version[], const author[])

Warto zidentyfikować plugin w celu późniejszego testowania stanu pluginu i odnalezienia go na liście pluginów.
Składnia argumentów funkcji nie wymaga chyba większego komentarza, w przypadku wątpliwości zapraszam do manuala.

[kotwica='przyklad']Przykład[/kotwica]
Na tym etapie, potrafimy już stworzyć i zarejestrować pierwszy plugin, nie robiący praktycznie nic.
#include <amxmodx>

public plugin_init(){
register_plugin("Nauka AMXX", "0.1", "benio101");
}
Przypomnijmy, w pierwszej linijce zaimportowaliśmy wymaganą zawsze dla AMXX, bibliotekę amxmodx.
W trzeciej linijce zainicjowaliśmy publiczną funkcję plugin_init, wykonywaną po pełnym załadowaniu skryptów startowych HLDS.
Przypominam, że funkcja plugin_init winna być funkcją publiczną, inaczej może nie zostać ona wykonana w oczekiwanym momencie.
W czwartej linijce, rejestruję plugin i na tym kończy się działanie naszego testowego pluginu, który praktycznie nie zmienia rozgrywki.

W funkcji plugin_init należy także zarejestrować wszelkie nasłuchiwacze zdarzeń, jak śmierć gracza, czy nowa runda.

[kotwica='plugin_cfg']plugin_cfg[/kotwica]
Ta funkcja wywoływana jest tuż po plugin_init i służy konfiguracji pluginu, m.in. pobraniu zmiennych globalnych z silnika gry,
ustanowieniu połączenia z bazą danych, czy pobrania innych, istotnych danych do współpracy pluginu z zasobami zewnętrznymi.

[kotwica='register_event']register_event[/kotwica]
Pierwsza z funkcji, którą poznamy, pozwala na przechwycenie wybranych zdarzeń, które dokonywane są na serwerze.
Tutaj odwołuję do niezwykle istotnej strony, na której wypisane są zdarzenia silnika HLDS wraz z argumentami:

Half-Life 1 Game Events

Teraz spróbujemy przechwycić funkcję śmierci, w tym celu musimy zarejestrować w funkcji plugin_init nasłuchiwacz tego zdarzenia
register_event("DeathMsg", "DeathMsg", "a");
Pierwszy parametr, zgodnie z dokumentacją, oznacza nazwę zdarzenia.
Drugi parametr oznacza funkcję publiczną, która będzie wywoływana w momencie wystąpienia tego zdarzenia. Trzeci parametr
wynosi "a", gdyż DeathMsg jest eventem globalnym. Tym samym utworzymy sobie funkcję publiczną DeathMsg i damy zabójcy 200$.

[kotwica='read_data']read_data[/kotwica]
Jak możemy wyczytać z powyższego linku, DeathMsg posiada cztery argumenty. Nam wystarczy pierwszy argument, czyli id zabójcy.
public DeathMsg(){
	new killer=read_data(1);
}
Funkcja DeathMsg wywoływana jest w momencie wystąpienia zdarzenia śmierci.
Za pomocą funkcji read_data możemy odczytać dany parametr funkcji, ponieważ pierwszy argument
to numer identyfikacyjny zabójcy, ten właśnie numer pobierzemy i zapiszemy do nowo utworzonej zmiennej killer.
Teraz będziemy chcieli nagrodzić zabójcę, przekazując mu dodatkowe 200 dolarów za zabójstwo.
W tym celu, skorzystamy z funkcji z biblioteki cstrike, cs_set_user_money.

[kotwica='import_biblioteki']Import biblioteki[/kotwica]
Aby móc skorzystać z tej funkcji, musimy najpierw zaimportować kolejną bibliotekę,
w tym celu dodajemy do naszego kodu następującą linijkę (najlepiej pod bilioteką amxmodx)
#include <cstrike>
Przypomnijmy, jak powinien wyglądać nasz obecny, pełny kod:
#include <amxmodx>
#include <cstrike>

public plugin_init(){
register_plugin("Nauka AMXX", "0.1", "benio101");

register_event("DeathMsg", "DeathMsg", "a");
}

public DeathMsg(){
new killer=read_data(1);
}


[kotwica='sprawdzenie_obecnosci_gracza']Sprawdzenie obecności gracza[/kotwica]
Teraz dochodzimy do niezwykle istotnej rzeczy, którą musisz zapamiętać raz na zawsze!
Operując na jakimkolwiek graczu, upewnij się, że gracz może zostać danej operacji poddany.
W przykładzie, chcemy dodać pieniądze graczowi, jednak zanim to zrobimy, musimy się upewnić,
czy gracz jest jeszcze na naszym serwerze. Zawsze mógł rzucić granat, wyjść z serwera, a opiero po chwili
nastąpi zdarzenie śmierci. Co się stanie przy próbie dodania pieniędzy graczowi, którego nie ma na serwerze?
Na pewno jest to niepotrzebne zapytanie do silnika gry, dużo większe zużycie zasobów sprzętowych, a także stale
powiększające się logi błędów. Na dłuższą metę, takie właśnie błędy skutkują dużymi lagami bądź crashami serwera.

Tym samym, użyjemy funkcji is_user_connected, w celu sprawdzenia, czy gracz jest jeszcze na serwerze.
Pamiętajmy, że aktualnie killer reprezentuje numer identyfikacyjny zabójcy, jednak w różnych funkcjach, możemy różnie
identyfikować poszczególne byty czy zdarzenia. Przy okazji, każdy byt na mapie ma swój własny, unikalny numer identyfikacyjny,
jednakże numerem identyfikacyjnym gracza jest numer z zakresu od 1 do maksymalnej liczby graczy włącznie. Tym samym, numer
bytu, będący większy lub równy 1 i nie większy, niż maksymalna liczba graczy na serwerze, oznacza na pewno gracza. (niekoniecznie online!)

public DeathMsg(){
new killer=read_data(1);
if(is_user_connected(killer)){
// Dodawanie pieniedzy
}
}
Teraz skorzystamy z natywów biblioteki cstrike i dodamy zabójcy 200 dolarów.
cs_set_user_money(killer, cs_get_user_money(killer) + 200);

Jak można zauważyć, nie mamy wprost funkcji dodającej pieniądze. W związku z tym,
musimy jako drugi parametr funkcji cs_set_user_money podać sumę 200
i obecnej liczby dolarów gracza, pobieranej przy użyciu funkcji cs_get_user_money

[kotwica='zwracana_wartosc']Zwracana wartość[/kotwica]
W nowo utworzonej funkcji DeathMsg, zwrócimy na końcu odpowiednią wartość.
Dostępne wartości do zwrócenia:

PLUGIN_CONTINUE
Domyślna wartość, przerywająca dalsze wywołanie funkcji, jednak przez każdy inny plugin, a także silnik gry,
zdarzenie zostanie wywołane. Po prostu nic niżej od tego polecenia nie zostanie wywołane w tej danej jednej funkcji.

PLUGIN_HANDLED_MAIN
Dalsze wywołanie funkcji nie będzie możliwe, podobnie, jak w przypadku PLUGIN_CONTINUE, dalej wszystkie
pluginy będą mogły odnotować tę funkcję, jednak event ten zostanie zablokowany dla silnika właściwego gry.

PLUGIN_HANDLED
Dalsze wywoływanie funkcji zostanie przerwane, a ani silnik gry nie odnotuje tego eventu, ani, w przeciwieństwie
do PLUGIN_HANDLED_MAIN, żaden z kolejnych pluginów, wypisanych poniżej od tego obecnego w plugins.ini.

Nam wystarczy PLUGIN_CONTINUE, bowiem nie chcemy blokować śmierci w silniku, ani pozbawiać informacji o śmierci
kolejnych pluginów. Na koniec zmienimy nazwę pluginu na odzwierciedlającą rzeczywiste zastosowanie pluginu. Gotowy kod:
#include <amxmodx>
#include <cstrike>

public plugin_init(){
register_plugin("Dodatkowe 200 dolarow za zabojstwo", "0.1", "benio101");

register_event("DeathMsg", "DeathMsg", "a");
}

public DeathMsg(){
new killer=read_data(1);
if(is_user_connected(killer)){
cs_set_user_money(killer, cs_get_user_money(killer) + 200);
}
return PLUGIN_CONTINUE;
}

Tym samym, właśnie napisaliśmy swój pierwszy plugin, który daje dodatkowe 200 dolarów za zabójstwo.


Tutorial napisany, choć z drobnym opóźnieniem, z okazji Światowego Dnia Jakości.
Jeśli przypadnie on Wam do gustu, to mogę pokusić się w wolnym czasie o napisanie kolejnych
części, jako kontynuację, z rozwinięciem wątku i coraz bardziej zaawansowanymi przykładami Scriptingu.


#601935 Czas Online

Napisane przez GwynBleidD w 05.01.2014 18:51

index.php - podmienić:
                                            echo '<td>' . time_counter( $data['time']) . '</td>';
config.php - dodać na końcu:
function time_counter($sec)
{
    $s=$sec % 60;
    $m=(($sec-$s) / 60) % 60;
    $h=floor($sec / 3600);
    return $h.":".substr("0".$m,-2).":".substr("0".$s,-2);
}

  • +
  • -
  • 4


#209264 Dodawanie frakcji - 2 sposoby

Napisane przez DarkGL w 25.01.2011 17:44

Witam
poradnik napisany w szkole także będę go jeszcze poprawiał ;)
pokaże tu dwa sposoby dodania frakcji do nowego coda
I sposób jest bardziej czasochłonny ale daje potem łatwiejszą rozbudowę (chyba)
II sposób jest chyba prostszy ale tylko chyba ;)

I sposób

Spoiler


II sposób

Spoiler



Zrobione przez DarkGL dla AMXX.PL
Zakaz używanie, kopiowania i innego wykorzystywania treści bez zgody autora. Wszelkie prawa zastrzeżone. ©

  • +
  • -
  • 126