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
 

nokiaclass - zdjęcie

nokiaclass

Rejestracja: 07.06.2012
Aktualnie: Nieaktywny
Poza forum Ostatnio: 28.05.2014 10:23
-----

#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.


#41466 Jak napisac plugin ?

Napisane przez rS. w 07.02.2009 17:10

Serdecznie witam wszystkich , tak więc zaczynamy .



Pierwsze Kroki jakie musimy zrobic to:

AMXx Studio - program do kompilacji, przerabiania i pisania własnych pluginów (można go pobrać z http://www.amxmodx.org , znajduje się w packu AMX Mod X Full Installer, lub można go pobrać samodzielnie AMX Mod X Studio)


Tutaj opiszę jak skonfigurować AMXx Studio aby można było kompilować pluginy:

Po otworzeniu AMXx Studio widzimy taki ekran:

screen1.jpg - Rozmiar oryginalny - Fotosik.pl

Wchodzimy w Tools-->Settings (F12)

screen2.jpg - Rozmiar oryginalny - Fotosik.pl

Następnie Compiler Settings w pierwszym białym polu podajemy adres do naszego pliku (amxxpc.exe - to kompilator znajduje sie w folderze tam gdzie masz CS addons/amxmodx/scripting)


screen3.jpg - Rozmiar oryginalny - Fotosik.pl


Klikamy ok i od tej pory kompilowanie pluginów nie powinno stwarzać problemu tylko otwieram i klikamy compile.

Ciekawostka:
Wybrałem amx studio ponieważ uczyłem się na nim od początku od kolegi


Tak więc zaczynamy:

Otwieramy program AMX Mod X Studio
Co gdzie i jak?:
Dołączona grafika

W tych 3 okienkach będziemy widzieć :

a/1 - W tym okienku, po zaznaczeniu danego fragmentu kodu, zobaczymy, jak zostaje sklasyfikowana poszczególna jego część (czy jest to funkcja, metoda, etc.).
b/2 - W tym okienku zobaczymy (po kliknięciu na dany folder) ile razy użyliśmy danej funkcji, metody, zmiennej, etc.
c/3 - Główne okno programu. To w nim piszemy kod plugin'u.


Teraz musimy podać ścieżkę do kompilatora. W tym celu klikamy F12.
Pojawi sie nam to :

Dołączona grafika

W Compiler (amxxpc.exe) podajemy ścieżkę do kompilatora. Znajdziesz ją w :

addons/amxmodx/scripting

W Default Output Directory podajemy miejsce, gdzie będą zapisywały się skompilowane pliki.


Tak więc przygotowaliśmy amxstudio do pracy więc można zaczynac :)

Zmienne: Zmienne są to struktury, które mają przechowywać pewne informacje przez jakiś okres czasu.

Jakie może mieć typy zmiennych:

•|1Zmienne logiczne.
•|2Integer'y.
•|3Liczby dziesiętne.


Zmienne Logiczne: Zmienne logiczne są bardzo proste wy wykonaniu i obsłudze. Można im nadać jedynie dwie wartości a mianowicie:

"true"
"false"

new bool:
CzyJestWlączone // Tworzę nową zmienną "CzyJestWlaczone", która jest automatycznie ustawiona na "false"

new bool:
JestWlaczone=true //Tworzę nową zmienną JestWlaczone i nadaje jej wartość "true".


Integer'y Są to najprostsze struktury w języku skryptowym Pawn , aby umieścić taką zmienną w kodzie, musimy użyć instrukcji new nazwa_zmiennej.


new c=5.0
//Ta zmienna jest niewłaściwa

new a
//Tworzymy pustą zmienną "a"

new b=5
//Tworzymy nową zmienną "b" i ustawiamy jej wartość na 5.

new d="siema"
//"siema" nie jest liczbą, dlatego ta zmienna też jest niewłaściwa.


Liczby dziesiętne Jeżeli chcemy w kodzie plugin'u umieścić liczbę dziesiętną, musimy określić typ zmiennej jako "float". By to wykonać musimy zrobić to w następujący sposób :

new Float
nazwa_zmiennej

new d="siema"
//Ta zmienna nadal nie jest właściwa

new Float:c=5.0
//Ta zmienna była niewłaściwa. Teraz, gdy określiliśmy typ zmiennej na "float" stała się właściwa <img src='http://img.amxx.pl/public/style_emoticons/default/wink.gif' class='bbc_emoticon' alt=';)' />.

new Float:b=5.1
//Tworzymy nową zmienną "b" i ustawiamy jej wartość na 5.1.

Teraz będzie sporo czytania ze zrozumieniem musicie wszystko po kolei ładnie przeczytaj to jest najgłówniejsza rzecz , będziemy się uczyć jak działa plugin , i budową pluginu:

Włączamy AMX MOD X Studio i klikamy CTRL + N.
Otworzy nam się nowe okno z plugin'em, który wygląda tak :

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"


public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
   
    // Add your code here...
}

Teraz o budowie pluginu .

Instrukcje w pluginie zawierają się w funkcjach. Owe funkcje można porównać to spiętych kartek w zeszycie (oryginalne porównanie by Seba :] ) - instrukcje są po kolei wykonywane (tak jak zapisujemy kartki w zeszycie). Każdą funkcję w plugin'ie musimy zarejestrować w kodzie. Robimy to tak :

public nazwa_funkcji(wartości_jakie_przyjmuje_funkcja)
{
//Tutaj będzie nasz kod
}

Kod w funkcji zapisujemy między nawiasami klamrowymi. Funkcje mogą być wywoływane przez gracza (gracz zrobił coś, np. otrzymał obrażenia - nasza funkcja się wykonuje) lub przez inne funkcje.
Wiem, że możecie tego nie zrozumieć, ale przeczytajcie to jeszcze kilka razy i obraz Wam się rozjaśni. Zabieramy się za nasz plugin :) .
Na początku musimy pod nasz plugin podpiąć odpowiednie moduły.
Co to są moduły? Są to zbiory instrukcji. Jeżeli w pluginie użyjemy instrukcji, która wymaga zadeklarowania odpowiedniego modułu - plugin się nie skompiluje.
Otwórzmy okno z AMX MOD X Studio.

#include <amxmodx>
#include <amxmisc>

dopiszmy :

#include <fun>

oraz :

#include <cstrike>

Fun jest to moduł, który zawiera instrukcje związane z "zabawą" (zmienianiem HP oraz armor'a gracza, wyrzucaniem jego wszystkich broni, itp.).
Cstrikezawiera instrukcje, które pozwalają nam np. na zmienianie ilości pieniędzy gracza oraz także na zmienianie jego armor'a (jak w fun'ie) z tym, że tutaj możemy dodatkowo określić rodzaj kamizelki (sama kamizelka czy z hełmem).
Następną czynnością, jaką musimy wykonać jest zadeklarowanie zmiennej do naszej pcvark'i ( jeżeli nie wiecie jak to się robi - odsyłam Was do poprzedniej lekcji). Pcvark'i są szybsze od zwykłych cvar'ek, ale czym różni się deklarowanie pcvarek od deklarowania cvar'ek?
Pcvark'i muszą zostać przypisane do zmiennej, więc zadeklarujmy takową.
Nasza pcvark'a będzie odpowiadać za koszt skorzystania z usługi zmiany HP, więc nadajmy jej nazwę (na przykład) hp_koszt.
Zadeklarujmy zmienną. Dla czystości kodu robimy to pod :

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

new hp_koszt

Teraz musimy zadeklarować naszą pcvarkę.
Robimy to w funkcji plugin_inti(). W funkcji ten deklarujemy wszystkie event'y, cvarki, itp.
Pod :

register_plugin(PLUGIN, VERSION, AUTHOR)

dopisujemy :

hp_koszt = register_cvar("hp_koszt","6000")

Instrukcja register_cvar("nazwa_cvarki","jaką_domyślną_wartość_przypisujemy") odpowiada za rejestrowanie cvar'ek. W nawiasie musimy podać nazwę cvarki oraz domyślną wartość. Domyślny koszt skorzystania z usługi zmiany HP ustawiłem na 6000.
Teraz zarejestrujemy co musi wpisać gracz, aby mógł skorzystać z usługi zmiany HP.
Umożliwia nam to instrukcja register_clcmd("jaką_komendę_musi_wpisać_gracz","którą_funkcję_wywołuje_wpisana_komenda")
Dopisujemy w plugin_init() :

register_clcmd("say /hpme","hp")

/hpmejest to komenda, którą gracz musi wpisać w say'u. Owa komenda wywołuje funkcję hp. Musimy tą funkcję teraz stworzyć.
Za ostatnim nawiasem klamrowym w naszym pluginie (za nawiasem zamykającym funkcję plugin_init()) dopisujemy :

public hp(id){
}

Wartość id w nawiasie jest to unikalny identyfikator gracza. Można go oczywiście nazwać inaczej, jak player lub gracz, ale id jest najtrafniejsze :) .
Dodamy teraz pierwszą instrukcję warunkową, która uniemożliwi skorzystanie z usługi zmiany HP gdy gracz jest nieżywy.
W funkcji hp(id) dopisujemy :

if(!is_user_alive(id)){
}

Wykrzyknik przed instrukcją is_user_alive(id) sprawia, że dana instrukcja zostanie wykonana tylko wtedy, gdy gracz nie jest żywy. !można przetłumaczyć jako nie,a całą instrukcję jako jeżeli gracz nie jest żywy wykonaj
Teraz przydałoby się zawiadomić gracza, że nie może skorzystać z naszej usługi.
W tym celu przyda nam się instrukcja client_print(), czyli wypisz graczowi.

Wygląda ona tak :

code_print(id,rodzaj_wypisanej_wiadomości (print_chat - wypisuje ją tak jak say lub print_center - wypisuje ją tam, gdzie wiadomości "Counter Terrorist win, itp.","Co_chcemy_wypisać")

Dopiszmy w naszej instrukcji warunkowej (za nawiasem klamrowym naszej instrukcji warunkowej) instrukcję :

client_print(id,print_chat,"[Zmiana HP] Nie mozesz skorzystac z tej uslugi ziom, bo jestes niezywy ;-(")

Przydałoby się teraz zastopować plugin. Dlaczego?
Dlatego, że nasza instrukcja nie została spełniona i nie chcemy, aby to co jest po niej wykonało się.
W naszej instrukcji warunkowej dopisujemy :

return PLUGIN_HANDLED

co oznacza - zwróć zastopowany plugin lub nie wykonuj dalej.
Teraz kolejna instrukcja warunkowa, uniemożliwiająca skorzystanie z usługi gdy nasze HP już wynosi 200.
Deklarujemy kolejną instrukcję warunkową. Do sprawdzenia życia gracza przyda nam się instrukcja get_user_health(id).

    if(get_user_health(id)>=200)){
       
    }

Teraz wzorem poprzedniej funkcji zaalarmujmy użytkownika, że nie może wykonać danej czynności. Tak jak wtedy posłuży nam do tego client_print().

client_print(id,print_chat,"[Zmiana HP] Juz skorzystales z tej uslugi!")

Standardowo dodajemy też zastopowanie plugin'u :

return PLUGIN_HANDLED

Dotychczas nasz kod powinien wyglądać tak :

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <cstrike>

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

new hp_koszt

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_cvar("hp_koszt","6000")
    register_clcmd("/say hpme","hp")
}

public hp(id){
    if(!is_user_alive(id)){
        client_print(id,print_chat,"[Zmiana HP] Nie mozesz skorzystac z tej uslugi ziom, bo jestes niezywy ;-(")
        return PLUGIN_HANDLED
    }
    if(get_user_health(id)>=200){
        client_print(id,print_chat,"[Zmiana HP] Juz skorzystales z tej uslugi!")
        return PLUGIN_HANDLED
    }
}

Teraz w końcu dodamy zmianę HP :) .
Umożliwi nam to instrukcja set_user_health(id,ile_HP).
Za klamrą zamykającą ostatnią instrukcję warunkową dopisujemy :

set_user_health(id,200)

Teraz pozostaje nam tylko odjęcie odpowiedniej ilości pieniędzy.
Posłuży nam do tego instrukcja cs_set_user_money(id,ilosc_pieniedzy) oraz
cs_get_user_money(id).
Pierwsza umożliwia ustawienie ilości pieniędzy a druga pobranie ilości pieniędzy posiadanej przez gracza.
Potrzebujemy jeszcze teraz instrukcji, która pobierze z pcvark'i hp_koszt koszt naszej usługi. Posłuży nam do tego get_pcvar_num(nazwa_cvarki).Pobiera ona wartość liczbową zapisaną w cvarc'e.
Dopisujemy pod instrukcją ustawiania życia :

cs_set_user_money(id,cs_get_user_money(id)-get_pcvar_num(hp_koszt))

Teraz dla czystej kosmetyki i poprawnego działania plugin'u dodajemy jeszcze pod ostatnią instrukcją :

return PLUGIN_HANDLED

No tak własnie ty , to koniec! CONGRATULATION . Jeżeli coś zle wypaliło napisz mi jeżeli masz z czymś problem . Jeżeli jest jakiś błąd w poradniku .

Teraz pozostaje Wam tylko skompilowanie plugin'u i zainstalowanie go na serwerze.
Finałowy kod powinien wyglądać tak :

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <cstrike>

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

new hp_koszt

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_cvar("hp_koszt","6000")
    register_clcmd("/say hpme","hp")
}

public hp(id){
    if(!is_user_alive(id)){
        client_print(id,print_chat,"[Zmiana HP] Nie mozesz skorzystac z tej uslugi ziom, bo jestes niezywy ;-(")
        return PLUGIN_HANDLED
    }
    if(get_user_health(id)>=200){
        client_print(id,print_chat,"[Zmiana HP] Juz skorzystales z tej uslugi!")
        return PLUGIN_HANDLED
    }
    set_user_health(id,200)
    cs_set_user_money(id,cs_get_user_money(id)-get_pcvar_num(hp_koszt))
    return PLUGIN_HANDLED
}



Poradnik wykonany w całości przez Paweł
  • +
  • -
  • 51


#305769 Obcy Mod

Napisane przez ExTaza?! w 10.10.2011 15:36

Witam. Chciałem przestawić swojego moda. "OBCY MOD". Chce na początku powiedzieć ze jest on nie do końca skończony. Dlaczego? Brak czasu. Nie chce żeby moje prace poszły na darmo dlatego chcę go wam przestawić.

Dołączona grafika


Na początku rundy po kilku sekundach (Ustawienia cvarem) jest wybierany jeden gracz. Staje się on OBCYM. Przenosi go do TT jezeli jest w CT. Reszta graczy przenoszona do CT.Mają oni 2 skoki w powietrzu. AntyTerrorysci mają do wyboru bronie. Karabiny i Pistolety.
Obcy: Ma on inny model z Aurą ma duzo HP.zalezy od ilosci graczy na serwerze. Ma 1/1 z tzw KOSY. Ma long jumpa co 5 sek. i obniżoną grawitację.
CT dostaje za killa PERK. Obcy też lecz inne niż CT (Mało perkow gdyż brak czasu)
Tyle chyba z opisu ;P

Dołączona grafika

nemesis_gravity", "350.0") //Grawitacja Obcego
nemesis_speed", "350.0") //Szybkosc poruszania się Obcego
nemesis_runds", "1") // Co ile rund ma być losowany Obcy
nemesis_human_jump", "2") // Ile skokow ma CT
 

Dołączona grafika

sound/muza_obcy/1.wav 
 
sound/muza_obcy/2.wav				 
sound/muza_obcy/winct1.wav		 
sound/muza_obcy/winct2.wav				 
sound/muza_obcy/wint1.wav		   
sound/muza_obcy/wint1.wav
Wszystko powyzej do Sound

models/obcy/v_rece.mdl do cstrike/models/obcy/v_rece.mdl
 
models/player/obcy.mdl do cstrike/models/player/obcy.mdl

obcy_mod.sma do adons/amxmodx/scripting
obcy_mod.amxx do adons/amxmodx/plugin

Otwieramy plugins.ini na koncu dopiuujemy
obcy_mod.amxx

Dołączona grafika

Mialem poprawić bugi. Ale jak wczesniej napiaslem nie starczylo mi czasu.

Miałem dodać w kod:
Perk za DMG
Wiecej perków
Optymalizacja kodu

Zezwalam na kopiowanie ale nie na zmiane wlasciciela MODA. Jezeli komuś się uda dokonczyć ten mod. Bedę się niezmiernie cieszyl :)

Pliki w zalacznikach

Załączone pliki


  • +
  • -
  • 8


#150856 Pisanie pluginów

Napisane przez Molthius w 11.07.2010 13:06

Witam !
Chciałbym się dowiedzieć jak pisać pluginy.
Umiem C++.

Liczę na szybkie odpowiedzi ;>!
  • +
  • -
  • 1