Skocz do zawartości
FAME MMA 21 - ZGARNIJ PSC ×

MAGNET

Użytkownik
  • Postów

    27
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    2
  • Dotacje

    0.00 PLN 

Aktywność reputacji

  1. Super
    MAGNET otrzymał punkt reputacji od * VIP i ClanTag - co i jak *   
    Witam,
     
    zdałem sobie sprawę z tego, że zaniedbałem aspekt, jakim jest możliwość kupna VIPa. Zabiegany strasznie jestem, ale znalazłem 5 minut, aby wszystko uporządkować i wyjaśnić o co biega.
     
    Na początek może przedstawię co nam kupno takiego VIPa daje:
     
     
    - darmowe granaty
    - dodatkowa kasa na plant/defuse paki, kill, i spawn
    - dodatkowe 10HP (utrzyj snajperom nosa!)
    - napis VIP na say'u
    - WŁASNY ClanTag !*
     
    *jest to prefix przed nickiem. Nabywca może wybrać tag jaki tylko sobie zapragnie.
     
    Jak kupić VIPa:
    Skonaktuj się ze mną poprzez GG lub steam. Przed rozmową przygotuj swoje steamID, ClanTag oraz dokładny nick. Podam Tobie treść smsa, który masz wysłać, a następnie podać kod zwrotny. Kosz to 7.38zł.
    GG: 48962202
    Steam: http://steamcommunity.com/id/magnetamxx
     
    Jeśli chcesz, możesz doświadczyć namiastki VIPa już teraz! Wystarczy, że dołączysz do naszej grupy CSowiczeWRD2 i ustawisz ją sobie jako ClanTag(prefix). Dzięki temu co rundę będziesz dostawał darmowego flashbanga!
     
    Nie czekaj i wspomóż nas już teraz. Serwer musi się z czegoś utrzymywać :) Do zobaczenia!
  2. Super
    MAGNET otrzymał punkt reputacji od Mumin! * VIP i ClanTag - co i jak *   
    Witam,
     
    zdałem sobie sprawę z tego, że zaniedbałem aspekt, jakim jest możliwość kupna VIPa. Zabiegany strasznie jestem, ale znalazłem 5 minut, aby wszystko uporządkować i wyjaśnić o co biega.
     
    Na początek może przedstawię co nam kupno takiego VIPa daje:
     
     
    - darmowe granaty
    - dodatkowa kasa na plant/defuse paki, kill, i spawn
    - dodatkowe 10HP (utrzyj snajperom nosa!)
    - napis VIP na say'u
    - WŁASNY ClanTag !*
     
    *jest to prefix przed nickiem. Nabywca może wybrać tag jaki tylko sobie zapragnie.
     
    Jak kupić VIPa:
    Skonaktuj się ze mną poprzez GG lub steam. Przed rozmową przygotuj swoje steamID, ClanTag oraz dokładny nick. Podam Tobie treść smsa, który masz wysłać, a następnie podać kod zwrotny. Kosz to 7.38zł.
    GG: 48962202
    Steam: http://steamcommunity.com/id/magnetamxx
     
    Jeśli chcesz, możesz doświadczyć namiastki VIPa już teraz! Wystarczy, że dołączysz do naszej grupy CSowiczeWRD2 i ustawisz ją sobie jako ClanTag(prefix). Dzięki temu co rundę będziesz dostawał darmowego flashbanga!
     
    Nie czekaj i wspomóż nas już teraz. Serwer musi się z czegoś utrzymywać :) Do zobaczenia!
  3. Super
    MAGNET otrzymał punkt reputacji od sahusa@ Cs go   
    Hehehe trudne pytanie mi zadajesz. Nie lubię odpowiadać szablonowo jak inni, czyli "bo są super gracze", "bo miła atmosfera", "bo drop kosmiczny". Ciężko jest jakoś wyszczególnić cechy, które mogłyby pokazać, że nasz serwer jest THE BEST.
     
    Ja jednak z mojej strony mogę powiedzieć tylko tyle, że jest to coś innego, bo nikt nie stworzył serwera z 3 mapami latającymi w kółko, z czego 2 pochodzą z klimatów CS 1.6. Mogłem działać szablonowo jak inni, jednak zdecydowałem się na postawienie takiego serwera, gdyż chciałem sprawdzić reakcję innych ludzi, czy serwer się spodoba...
    Jeśli chodzi o same modyfikacje serwera, to mogę przytoczyć dwie, których nie znajdziesz nigdzie indziej:
    1. Plugin do wyboru noży został przeze mnie zmodyfikowany tak, aby kolejne kosy odblokowywały się dopiero po osiągnięciu określonej ilości fragów.
    2. Dziś dodam możliwość kupna VIPa u mnie na GG/Steam. Zaletą jego jest to, że każdy gracz, który te udogodnienie nabył, będzie mógł wybrać sobie dowolny ClanTag (oczywiście działający tylko na naszym serwerze - nie mamy władzy poza nim)
  4. Super
    MAGNET otrzymał punkt reputacji od steelzer [PRZYJĘTE] [Podanie] steelzer   
    Wiadomość wygenerowana automatycznie
    Temat został zamknięty przez moderatora.
     
    Powód: Podanie przyjęte
     
    Jeżeli się z tym nie zgadzasz raportuj ten post a moderator lub administrator rozpatrzy go ponownie.
    Z pozdrowieniami.
    Administracja CSowicze.pl
  5. Super
    MAGNET otrzymał punkt reputacji od Mumin! Wzór podania na admina + wymagania   
    Wymagania:
     
    - Minimum 15 lat
    - Minimum 10 godzin przegranych na serwerze
    - Kultura osobista
    - Poprawna polszczyzna
    - Umiejętność rozpoznawania cheaterów
    Mile widziana składka adminowska. Jest ona ważna, gdyż serwer musi się z czegoś utrzymywać. Na chwilę obecną całość kosztów pokrywam z własnej kieszeni
     
    Wzór podania:
     
    Nick:
    Wiek:
    SteamID:
    Znajomość SourceMod w skali 1/10:
    Dlaczego Ty? (min. 3 zdania):
    Czas spędzony na serwerze:
    Nick: Wiek: SteamID: Znajomość SourceMod w skali 1/10: Dlaczego Ty? (min. 3 zdania): Czas spędzony na serwerze:
  6. Super
    MAGNET otrzymał punkt reputacji od RumcajsJumper Podszywki   
    http://amxx.pl/topic/136651-register-system-inna-wersja-rejestracji-nicku/?do=findComment&comment=652357
     
    Jakby co ten plugin jest dobry. Gdyby zaszła potrzeba sprawdzenia hasła w przypadku założenia hasła przez osobę niepożądaną, zapis nvault da się rozczytac
  7. Super
    MAGNET otrzymał punkt reputacji od SoLLuffka [ZAMKNIĘTE] [AMX] Piszemy plugin, czyli TuT dla zielonych   
    Siemanko,
     
    Postanowiłem, że poświęcę parę minut i napiszę mały tutorial o pisaniu pluginów do cs 1.6. Z racji, iż ostatnio plugin z rozszerzeniem sma kompilowałem pół roku temu, proszę o wyrozumiałość i zgłaszanie ewentualnych błędów. A teraz już zaczynajmy ;)
     
    1. Przygotowanie
     
    Zanim cokolwiek napiszemy musimy mieć do tego stosowny program. Oczywiście, notatnik też mógłby temu służyć, jednak nie jest to najlepsze narzędzie do tego typu zadań. Odsyłam więc was do TEGO TEMATU, w którym skonfigurujecie swoje stanowisko pracy.
     
    2. Podstawy
     
    Teraz umieszczę niżej podstawowy plugin, który nie będzie robił absolutnie nic. Przedstawię krótko jego strukturę i znaczenie poszczególnych części:
     
     
    #include <amxmodx> #include <amxmisc>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Okej, lecimy po kolei:
     
    #include <amxmodx> #include <amxmisc> #include <codmod>  
    Są to natywy, nazywane też bibliotekami, nie bez powodu, gdyż pełnią one funkcję swoistego rodzaju książek. Plugin wyszukuje przez nie odpowiednie funkcje i ich operacje i wykonuje je. Np. jeśli chcemy ustawić graczowi życie potrzebujemy biblioteki "fun". Umieszczenie linijki "#include <fun> na górze pluginu upoważniałoby nas do korzystania z funkcji set_user_health. Pełna listę funkcji natywnych znajdziecie TUTAJ. Gdybyśmy ich nie dodali kod byłby baaardzo długi. Przedstawię to na konkretnym przykładzie:
     
    Wyobraź sobie, że nie znasz znaczenia pojęcia np. "apogeum", więc znajdujesz sobie w wikipedii znaczenie tego słowa. Od teraz wiesz, ze oznacza to jakiś moment krytyczny. Kiedy ktoś powiedziałby do Ciebie, że "jego cierpliwość dochodzi do apogeum" doskonale wiesz już o co mu chodzi. Bardzo podobna sytuacja ma miejsce tutaj. Każdy język programowania był bazowany na umyśle ludzkim. Tak więc nie wymyślamy niczego nowego, a tylko naśladujemy - taka mała dygresja ;)
    public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Tutaj na chwilę muszę się zatrzymać. Aby uświadomić sobie zasadę działania każdego pluginu niezbędna jest wiedza o funkcjach. Na sam początek wyjaśnię wam jak działa funkcja typu public. Wszystkie operacje, mające miejsce w pluginie, nie mogą sobie fruwać nie wiadomo gdzie. Ważne jest uporządkowanie całości. Dlatego też powstały funkcje, a cały przebieg operacji musi się zawierać w nich pomiędzy klamrami { }
    Doklaracja funkcji publicznej:
    public NazwaFunkcji(parametry, any...) {        //Wykonywane operacje } Myślę, że wszystko stanie się jasne w dalszej części poradnika ;)
    register_plugin(nazwa, "1.0", "amxx.pl"); Jest to rejestracja pluginu na serwerze, wykonywana przy każdej zmianie mapy. Warto tutaj wspomnieć, że funkcja plugin_init właśnie wtedy się wywołuje. Można powiedzieć, że plugin "idzie do pracy w firmie i podbija druczek obecności" xD
     
    Okej, za chwilę napiszemy sobie pierwszy plugin. Zanim jednak zaczniemy, trzebaby wspomnieć o ważnym aspekcie, jakim są zmienne.
     
    Są to obszary, przechowujące dane. Praktycznie każdy plugin je posiada, a ich konstrukcja wygląda mniej więcej tak:
    new NazwaZmiennej Wyróżniamy kilka rodzajów zmiennych:
     
    2 podstawowe podziały:
    1. Zmienna globalna, implementowana (umieszczana) na początku pluginu, tuż pod bibliotekami.
    2. Zmienna wewnętrzna, umieszczana w funkcjach (public) pomiędzy klamrami. Ich zaletą jest tworzenie na czas wykonywanej funkcji, co pozwala nam na zaoszczędzenie pamięci.
     
    Typy zmiennych:
     
    Zmienna zwykła - zwykła zmienna przechowująca określony typ pamięci.
    new NazwaZmiennej Zmienna logiczna - czyli taka, która przechowuje wartości typu true/false (prawda/fałsz)
    new bool:NazwaZmiennej Zmienna statyczna - używana zazwyczaj jako zmienna wewnętrzna. Po użyciu od jest usuwana, co pozwala na zaoszczędzenie pamięci
    static NazwaZmiennej Zmienna stała - implementowana pod bibliotekami, przechowuje zawsze tylko jeden typ danych od początku istnienia pluginu.
    #define NazwaZmiennej Przedstawione wyżej zmienne są tylko jednoelementowe, czyli nie przechowają więcej, niż jednej wartości. Na szczęście, można wprowadzać tablice i zmieniać wymiarowość zmiennych. Naturę tego opiszę później.
    new jajko[4] - zmienna o nazwie "jajko", zawierajaca 4 elementy new kotlet[32][32] - dwuwymiarowa zmienna "kotlet" zawierająca po 32 elementy w każdej tablicy 3. Pisanie pluginu
     
     
    W porządku, nareszcie możemy się zabrać za pisanie naszego pierwszego pluginu :D. Naszym pierwszym pluginem będzie modyfikacja, która daje zabójcy x HP, oraz x życia.
     
    Wróćmy zatem do naszego pluginu, który wygląda tak:
    #include <amxmodx> #include <amxmisc>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Wiemy, że chcemy odnaleźć zabójcę, ale jak to zrobić? Z pomocą przychodzi nam event DeathMsg, który jest wywoływany zawsze w momencie śmierci gracza. Event wyłapuje indexy zabójcy, ofiary, użytej broni, a nawet czy padł HeadShot. Musimy jednak wpierw to wydarzenie złapać, a robimy to w plugin_init dodając taką oto linijkę:
    register_event("DeathMsg", "DeathMsg", "a") Analogicznie, tworzymy funkcję publiczną o nazwie DeathMsg, w której będziemy wykonywali określone operacje:
    public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     //code } Jak widzicie, umieściłem tutaj od razu dwie zmienne wewnętrzne, które przechowują indexy zabójcy (kid), a także ofiary (vid). Pozostało nam tylko nagrodzić zabójcę skromnym podarunkiem w postaci HP i $. Za modyfikację zdrowia służy funkcja natywna z biblioteki cstrike - cs_set_user_money, natomiast za zdrowie funkcja natywna z biblioteki fun - set_user_health. Dodajmy więc te dwa natywy na górę naszego pluginu:
    #Include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun> Teraz przyjrzyjmy się strukturze tych dwóch funkcji:
    cs_set_user_money(index, money)
     
    Pierwszy parametr (index) oznacza ID gracza, któremu USTAWIMY określoną ilość pieniędzy, natomiast drugi (money) oznacza ile kasy będzie miał gracz z ID "index"
     
    set_user_health(index, health)
    Pierwszy parametr (index) oznacza ID gracza, któremu USTAWIMY określoną ilość HP, natomiast drugi (health) oznacza ile zdrowia będzie miał gracz z ID "index"
     
    Ale co to właściwie jest ten index? Przy łączeniu z serwerem każdy gracz dostaje unikalny klucz indentyfikacyjny, przyjmujący wartości <1;ILOŚĆ_SLOTÓW>, stąd też możliwa jest operacja kasą czy życiem na indexach.
     
    Do pełni szczęścia musimy jeszcze znać aktualną wartość zdrowia i kasy zabójcy. Do tego służą nam odpowiednio cs_get_user_health(index) i get_user_money(index). Wyjaśniać tego nie będę
     
    Teraz wystarczy dodać tylko 2 linijki pod zmiennymi:
    cs_set_user_health(kid, cs_get_user_health(kid) + 10); set_user_money(kid, get_user_money(kid) + 200); W pierwszym parametrze (index) wykorzystałem ID zabójcy (kid), które pobraliśmy wcześniej. W drugim parametrze pobieram zdrowie/kasę gracza z indexem kid, a następniej do pobranej wartości dodaję 10/200. Proste, prawda? :)
    Dodatkowo poinformuję zabójcę i  ofiarę o zaistniałej sytuacji, dodając poniżej 2 linijki:
    client_print(kid, print_chat, "Za zabojstwo otrzymales +10HP i +200$") client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +10HP i +200$ ;)"); Składnia:
    client_print(index, message_type, string:message);
     
    index - ID gracza
    message_type - typ wysyłanej wiadomości
    message - wiadomość. Musi się ona zawierać między cudzysłowiami "".
     
    Polecam zajrzeć do dokumentacji aby zobaczyć dokładniej o co chodzi.
     
    Nasz plugin wygląda już tak:
    #include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl"); register_event("DeathMsg", "DeathMsg", "a")   }   public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     cs_set_user_health(kid, cs_get_user_health(kid) + 10);     set_user_money(kid, get_user_money(kid) + 200);       client_print(kid, print_chat, "Za zabojstwo otrzymales +10HP i +200$")     client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +10HP i +200$ ;)"); } Mimo, że już bardzo mi się nie chce, dodam jeszcze dwa udogodnienia - 2 stałe zmienne, przechowujące ilość bonusowej kasy/zdrowia, a także pobiorę nicki zabójcy i ofiary i zmodyfikuję wysłaną do nich wiadomość.
     
    Dodajmy pod natywami 2 linijki:
    #define BONUS_HP 10 #define BONUS_MONEY 200 Utworzyłem dwie stałe zmienne, przechowujące wspomniane wyżej wartości. Teraz wykorzystajmy je:
    public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     cs_set_user_health(kid, cs_get_user_health(kid) + BONUS_HP);     set_user_money(kid, get_user_money(kid) + BONUS_MONEY);       client_print(kid, print_chat, "Za zabojstwo otrzymales +%iHP i +%i$", BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +%iHP i +%i$ ;)", BONUS_HP, BONUS_MONEY); } Mam nadzieję, że ustawianie HP/ZDR jest jasne, ale co to za %i ?? Są to przekaźniki, które, jak nazwa mówi, przekazują wartości zmiennych.Podam tylko 2 typy:
    %i - dla liczb
    %s - dla liter (dla wartości typu String)
     
    Uf, okej. Pobiorę jeszcze nicki. Pod new vid dopisujemy:
    new nick_zabojcy[64]; new nick_ofiary[64]; get_user_name(kid, nick_zabojcy, 63); get_user_name(vid, nick_ofiary, 63); get_user_name(index, tablica, wielkosc_tablicy);
     
    index - ID zabójcy/ofiary
    tablica - jest nazwa zmiennej, w którą zostanie wpisany nick zabójcy/ofiary
    wielkosc_tablicy - max. rozmiar tablicy
     
    Dlaczego 64? Wątpię, aby nick gracza miał więcej znaków niż 64 ;) Dlaczego w get_user_name wpisuję 63 zamiast 64? Stringi zawsze muszą mieć wolne miejsce na tzw. spację (\0)
     
    Teraz tylko zmodyfikumy wiadomości dla graczy:
       client_print(kid, print_chat, "Za zabojstwo gracza %s otrzymales +%iHP i +%i$", nick_ofiary, BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz %s otrzymal +%iHP i +%i$ ;)", nick_zabojcy, BONUS_HP, BONUS_MONEY); Po wszystkich usprawnieniach cały kod wygląda tak:
    #include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun>   #define BONUS_HP 10 #define BONUS_MONEY 200      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl"); register_event("DeathMsg", "DeathMsg", "a")   }   public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara      new nick_zabojcy[64];    new nick_ofiary[64];    get_user_name(kid, nick_zabojcy, 63);    get_user_name(vid, nick_ofiary, 63);       cs_set_user_health(kid, cs_get_user_health(kid) + BONUS_HP);     set_user_money(kid, get_user_money(kid) + BONUS_MONEY);       client_print(kid, print_chat, "Za zabojstwo gracza %s otrzymales +%iHP i +%i$", nick_ofiary, BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz %s otrzymal +%iHP i +%i$ ;)", nick_zabojcy, BONUS_HP, BONUS_MONEY); } To by było na tyle ;). W razie pytań, czy błedów, pisać pod spodem.
     
    Dzięki za poświęcony czas i strzałeczka :D
  8. Super
    MAGNET otrzymał punkt reputacji od ` izcoN (◣_◢) [ZAMKNIĘTE] [AMX] Piszemy plugin, czyli TuT dla zielonych   
    Siemanko,
     
    Postanowiłem, że poświęcę parę minut i napiszę mały tutorial o pisaniu pluginów do cs 1.6. Z racji, iż ostatnio plugin z rozszerzeniem sma kompilowałem pół roku temu, proszę o wyrozumiałość i zgłaszanie ewentualnych błędów. A teraz już zaczynajmy ;)
     
    1. Przygotowanie
     
    Zanim cokolwiek napiszemy musimy mieć do tego stosowny program. Oczywiście, notatnik też mógłby temu służyć, jednak nie jest to najlepsze narzędzie do tego typu zadań. Odsyłam więc was do TEGO TEMATU, w którym skonfigurujecie swoje stanowisko pracy.
     
    2. Podstawy
     
    Teraz umieszczę niżej podstawowy plugin, który nie będzie robił absolutnie nic. Przedstawię krótko jego strukturę i znaczenie poszczególnych części:
     
     
    #include <amxmodx> #include <amxmisc>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Okej, lecimy po kolei:
     
    #include <amxmodx> #include <amxmisc> #include <codmod>  
    Są to natywy, nazywane też bibliotekami, nie bez powodu, gdyż pełnią one funkcję swoistego rodzaju książek. Plugin wyszukuje przez nie odpowiednie funkcje i ich operacje i wykonuje je. Np. jeśli chcemy ustawić graczowi życie potrzebujemy biblioteki "fun". Umieszczenie linijki "#include <fun> na górze pluginu upoważniałoby nas do korzystania z funkcji set_user_health. Pełna listę funkcji natywnych znajdziecie TUTAJ. Gdybyśmy ich nie dodali kod byłby baaardzo długi. Przedstawię to na konkretnym przykładzie:
     
    Wyobraź sobie, że nie znasz znaczenia pojęcia np. "apogeum", więc znajdujesz sobie w wikipedii znaczenie tego słowa. Od teraz wiesz, ze oznacza to jakiś moment krytyczny. Kiedy ktoś powiedziałby do Ciebie, że "jego cierpliwość dochodzi do apogeum" doskonale wiesz już o co mu chodzi. Bardzo podobna sytuacja ma miejsce tutaj. Każdy język programowania był bazowany na umyśle ludzkim. Tak więc nie wymyślamy niczego nowego, a tylko naśladujemy - taka mała dygresja ;)
    public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Tutaj na chwilę muszę się zatrzymać. Aby uświadomić sobie zasadę działania każdego pluginu niezbędna jest wiedza o funkcjach. Na sam początek wyjaśnię wam jak działa funkcja typu public. Wszystkie operacje, mające miejsce w pluginie, nie mogą sobie fruwać nie wiadomo gdzie. Ważne jest uporządkowanie całości. Dlatego też powstały funkcje, a cały przebieg operacji musi się zawierać w nich pomiędzy klamrami { }
    Doklaracja funkcji publicznej:
    public NazwaFunkcji(parametry, any...) {        //Wykonywane operacje } Myślę, że wszystko stanie się jasne w dalszej części poradnika ;)
    register_plugin(nazwa, "1.0", "amxx.pl"); Jest to rejestracja pluginu na serwerze, wykonywana przy każdej zmianie mapy. Warto tutaj wspomnieć, że funkcja plugin_init właśnie wtedy się wywołuje. Można powiedzieć, że plugin "idzie do pracy w firmie i podbija druczek obecności" xD
     
    Okej, za chwilę napiszemy sobie pierwszy plugin. Zanim jednak zaczniemy, trzebaby wspomnieć o ważnym aspekcie, jakim są zmienne.
     
    Są to obszary, przechowujące dane. Praktycznie każdy plugin je posiada, a ich konstrukcja wygląda mniej więcej tak:
    new NazwaZmiennej Wyróżniamy kilka rodzajów zmiennych:
     
    2 podstawowe podziały:
    1. Zmienna globalna, implementowana (umieszczana) na początku pluginu, tuż pod bibliotekami.
    2. Zmienna wewnętrzna, umieszczana w funkcjach (public) pomiędzy klamrami. Ich zaletą jest tworzenie na czas wykonywanej funkcji, co pozwala nam na zaoszczędzenie pamięci.
     
    Typy zmiennych:
     
    Zmienna zwykła - zwykła zmienna przechowująca określony typ pamięci.
    new NazwaZmiennej Zmienna logiczna - czyli taka, która przechowuje wartości typu true/false (prawda/fałsz)
    new bool:NazwaZmiennej Zmienna statyczna - używana zazwyczaj jako zmienna wewnętrzna. Po użyciu od jest usuwana, co pozwala na zaoszczędzenie pamięci
    static NazwaZmiennej Zmienna stała - implementowana pod bibliotekami, przechowuje zawsze tylko jeden typ danych od początku istnienia pluginu.
    #define NazwaZmiennej Przedstawione wyżej zmienne są tylko jednoelementowe, czyli nie przechowają więcej, niż jednej wartości. Na szczęście, można wprowadzać tablice i zmieniać wymiarowość zmiennych. Naturę tego opiszę później.
    new jajko[4] - zmienna o nazwie "jajko", zawierajaca 4 elementy new kotlet[32][32] - dwuwymiarowa zmienna "kotlet" zawierająca po 32 elementy w każdej tablicy 3. Pisanie pluginu
     
     
    W porządku, nareszcie możemy się zabrać za pisanie naszego pierwszego pluginu :D. Naszym pierwszym pluginem będzie modyfikacja, która daje zabójcy x HP, oraz x życia.
     
    Wróćmy zatem do naszego pluginu, który wygląda tak:
    #include <amxmodx> #include <amxmisc>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Wiemy, że chcemy odnaleźć zabójcę, ale jak to zrobić? Z pomocą przychodzi nam event DeathMsg, który jest wywoływany zawsze w momencie śmierci gracza. Event wyłapuje indexy zabójcy, ofiary, użytej broni, a nawet czy padł HeadShot. Musimy jednak wpierw to wydarzenie złapać, a robimy to w plugin_init dodając taką oto linijkę:
    register_event("DeathMsg", "DeathMsg", "a") Analogicznie, tworzymy funkcję publiczną o nazwie DeathMsg, w której będziemy wykonywali określone operacje:
    public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     //code } Jak widzicie, umieściłem tutaj od razu dwie zmienne wewnętrzne, które przechowują indexy zabójcy (kid), a także ofiary (vid). Pozostało nam tylko nagrodzić zabójcę skromnym podarunkiem w postaci HP i $. Za modyfikację zdrowia służy funkcja natywna z biblioteki cstrike - cs_set_user_money, natomiast za zdrowie funkcja natywna z biblioteki fun - set_user_health. Dodajmy więc te dwa natywy na górę naszego pluginu:
    #Include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun> Teraz przyjrzyjmy się strukturze tych dwóch funkcji:
    cs_set_user_money(index, money)
     
    Pierwszy parametr (index) oznacza ID gracza, któremu USTAWIMY określoną ilość pieniędzy, natomiast drugi (money) oznacza ile kasy będzie miał gracz z ID "index"
     
    set_user_health(index, health)
    Pierwszy parametr (index) oznacza ID gracza, któremu USTAWIMY określoną ilość HP, natomiast drugi (health) oznacza ile zdrowia będzie miał gracz z ID "index"
     
    Ale co to właściwie jest ten index? Przy łączeniu z serwerem każdy gracz dostaje unikalny klucz indentyfikacyjny, przyjmujący wartości <1;ILOŚĆ_SLOTÓW>, stąd też możliwa jest operacja kasą czy życiem na indexach.
     
    Do pełni szczęścia musimy jeszcze znać aktualną wartość zdrowia i kasy zabójcy. Do tego służą nam odpowiednio cs_get_user_health(index) i get_user_money(index). Wyjaśniać tego nie będę
     
    Teraz wystarczy dodać tylko 2 linijki pod zmiennymi:
    cs_set_user_health(kid, cs_get_user_health(kid) + 10); set_user_money(kid, get_user_money(kid) + 200); W pierwszym parametrze (index) wykorzystałem ID zabójcy (kid), które pobraliśmy wcześniej. W drugim parametrze pobieram zdrowie/kasę gracza z indexem kid, a następniej do pobranej wartości dodaję 10/200. Proste, prawda? :)
    Dodatkowo poinformuję zabójcę i  ofiarę o zaistniałej sytuacji, dodając poniżej 2 linijki:
    client_print(kid, print_chat, "Za zabojstwo otrzymales +10HP i +200$") client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +10HP i +200$ ;)"); Składnia:
    client_print(index, message_type, string:message);
     
    index - ID gracza
    message_type - typ wysyłanej wiadomości
    message - wiadomość. Musi się ona zawierać między cudzysłowiami "".
     
    Polecam zajrzeć do dokumentacji aby zobaczyć dokładniej o co chodzi.
     
    Nasz plugin wygląda już tak:
    #include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl"); register_event("DeathMsg", "DeathMsg", "a")   }   public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     cs_set_user_health(kid, cs_get_user_health(kid) + 10);     set_user_money(kid, get_user_money(kid) + 200);       client_print(kid, print_chat, "Za zabojstwo otrzymales +10HP i +200$")     client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +10HP i +200$ ;)"); } Mimo, że już bardzo mi się nie chce, dodam jeszcze dwa udogodnienia - 2 stałe zmienne, przechowujące ilość bonusowej kasy/zdrowia, a także pobiorę nicki zabójcy i ofiary i zmodyfikuję wysłaną do nich wiadomość.
     
    Dodajmy pod natywami 2 linijki:
    #define BONUS_HP 10 #define BONUS_MONEY 200 Utworzyłem dwie stałe zmienne, przechowujące wspomniane wyżej wartości. Teraz wykorzystajmy je:
    public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     cs_set_user_health(kid, cs_get_user_health(kid) + BONUS_HP);     set_user_money(kid, get_user_money(kid) + BONUS_MONEY);       client_print(kid, print_chat, "Za zabojstwo otrzymales +%iHP i +%i$", BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +%iHP i +%i$ ;)", BONUS_HP, BONUS_MONEY); } Mam nadzieję, że ustawianie HP/ZDR jest jasne, ale co to za %i ?? Są to przekaźniki, które, jak nazwa mówi, przekazują wartości zmiennych.Podam tylko 2 typy:
    %i - dla liczb
    %s - dla liter (dla wartości typu String)
     
    Uf, okej. Pobiorę jeszcze nicki. Pod new vid dopisujemy:
    new nick_zabojcy[64]; new nick_ofiary[64]; get_user_name(kid, nick_zabojcy, 63); get_user_name(vid, nick_ofiary, 63); get_user_name(index, tablica, wielkosc_tablicy);
     
    index - ID zabójcy/ofiary
    tablica - jest nazwa zmiennej, w którą zostanie wpisany nick zabójcy/ofiary
    wielkosc_tablicy - max. rozmiar tablicy
     
    Dlaczego 64? Wątpię, aby nick gracza miał więcej znaków niż 64 ;) Dlaczego w get_user_name wpisuję 63 zamiast 64? Stringi zawsze muszą mieć wolne miejsce na tzw. spację (\0)
     
    Teraz tylko zmodyfikumy wiadomości dla graczy:
       client_print(kid, print_chat, "Za zabojstwo gracza %s otrzymales +%iHP i +%i$", nick_ofiary, BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz %s otrzymal +%iHP i +%i$ ;)", nick_zabojcy, BONUS_HP, BONUS_MONEY); Po wszystkich usprawnieniach cały kod wygląda tak:
    #include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun>   #define BONUS_HP 10 #define BONUS_MONEY 200      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl"); register_event("DeathMsg", "DeathMsg", "a")   }   public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara      new nick_zabojcy[64];    new nick_ofiary[64];    get_user_name(kid, nick_zabojcy, 63);    get_user_name(vid, nick_ofiary, 63);       cs_set_user_health(kid, cs_get_user_health(kid) + BONUS_HP);     set_user_money(kid, get_user_money(kid) + BONUS_MONEY);       client_print(kid, print_chat, "Za zabojstwo gracza %s otrzymales +%iHP i +%i$", nick_ofiary, BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz %s otrzymal +%iHP i +%i$ ;)", nick_zabojcy, BONUS_HP, BONUS_MONEY); } To by było na tyle ;). W razie pytań, czy błedów, pisać pod spodem.
     
    Dzięki za poświęcony czas i strzałeczka :D
  9. Super
    MAGNET otrzymał punkt reputacji od [ZAMKNIĘTE] [AMX] Piszemy plugin, czyli TuT dla zielonych   
    Siemanko,
     
    Postanowiłem, że poświęcę parę minut i napiszę mały tutorial o pisaniu pluginów do cs 1.6. Z racji, iż ostatnio plugin z rozszerzeniem sma kompilowałem pół roku temu, proszę o wyrozumiałość i zgłaszanie ewentualnych błędów. A teraz już zaczynajmy ;)
     
    1. Przygotowanie
     
    Zanim cokolwiek napiszemy musimy mieć do tego stosowny program. Oczywiście, notatnik też mógłby temu służyć, jednak nie jest to najlepsze narzędzie do tego typu zadań. Odsyłam więc was do TEGO TEMATU, w którym skonfigurujecie swoje stanowisko pracy.
     
    2. Podstawy
     
    Teraz umieszczę niżej podstawowy plugin, który nie będzie robił absolutnie nic. Przedstawię krótko jego strukturę i znaczenie poszczególnych części:
     
     
    #include <amxmodx> #include <amxmisc>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Okej, lecimy po kolei:
     
    #include <amxmodx> #include <amxmisc> #include <codmod>  
    Są to natywy, nazywane też bibliotekami, nie bez powodu, gdyż pełnią one funkcję swoistego rodzaju książek. Plugin wyszukuje przez nie odpowiednie funkcje i ich operacje i wykonuje je. Np. jeśli chcemy ustawić graczowi życie potrzebujemy biblioteki "fun". Umieszczenie linijki "#include <fun> na górze pluginu upoważniałoby nas do korzystania z funkcji set_user_health. Pełna listę funkcji natywnych znajdziecie TUTAJ. Gdybyśmy ich nie dodali kod byłby baaardzo długi. Przedstawię to na konkretnym przykładzie:
     
    Wyobraź sobie, że nie znasz znaczenia pojęcia np. "apogeum", więc znajdujesz sobie w wikipedii znaczenie tego słowa. Od teraz wiesz, ze oznacza to jakiś moment krytyczny. Kiedy ktoś powiedziałby do Ciebie, że "jego cierpliwość dochodzi do apogeum" doskonale wiesz już o co mu chodzi. Bardzo podobna sytuacja ma miejsce tutaj. Każdy język programowania był bazowany na umyśle ludzkim. Tak więc nie wymyślamy niczego nowego, a tylko naśladujemy - taka mała dygresja ;)
    public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Tutaj na chwilę muszę się zatrzymać. Aby uświadomić sobie zasadę działania każdego pluginu niezbędna jest wiedza o funkcjach. Na sam początek wyjaśnię wam jak działa funkcja typu public. Wszystkie operacje, mające miejsce w pluginie, nie mogą sobie fruwać nie wiadomo gdzie. Ważne jest uporządkowanie całości. Dlatego też powstały funkcje, a cały przebieg operacji musi się zawierać w nich pomiędzy klamrami { }
    Doklaracja funkcji publicznej:
    public NazwaFunkcji(parametry, any...) {        //Wykonywane operacje } Myślę, że wszystko stanie się jasne w dalszej części poradnika ;)
    register_plugin(nazwa, "1.0", "amxx.pl"); Jest to rejestracja pluginu na serwerze, wykonywana przy każdej zmianie mapy. Warto tutaj wspomnieć, że funkcja plugin_init właśnie wtedy się wywołuje. Można powiedzieć, że plugin "idzie do pracy w firmie i podbija druczek obecności" xD
     
    Okej, za chwilę napiszemy sobie pierwszy plugin. Zanim jednak zaczniemy, trzebaby wspomnieć o ważnym aspekcie, jakim są zmienne.
     
    Są to obszary, przechowujące dane. Praktycznie każdy plugin je posiada, a ich konstrukcja wygląda mniej więcej tak:
    new NazwaZmiennej Wyróżniamy kilka rodzajów zmiennych:
     
    2 podstawowe podziały:
    1. Zmienna globalna, implementowana (umieszczana) na początku pluginu, tuż pod bibliotekami.
    2. Zmienna wewnętrzna, umieszczana w funkcjach (public) pomiędzy klamrami. Ich zaletą jest tworzenie na czas wykonywanej funkcji, co pozwala nam na zaoszczędzenie pamięci.
     
    Typy zmiennych:
     
    Zmienna zwykła - zwykła zmienna przechowująca określony typ pamięci.
    new NazwaZmiennej Zmienna logiczna - czyli taka, która przechowuje wartości typu true/false (prawda/fałsz)
    new bool:NazwaZmiennej Zmienna statyczna - używana zazwyczaj jako zmienna wewnętrzna. Po użyciu od jest usuwana, co pozwala na zaoszczędzenie pamięci
    static NazwaZmiennej Zmienna stała - implementowana pod bibliotekami, przechowuje zawsze tylko jeden typ danych od początku istnienia pluginu.
    #define NazwaZmiennej Przedstawione wyżej zmienne są tylko jednoelementowe, czyli nie przechowają więcej, niż jednej wartości. Na szczęście, można wprowadzać tablice i zmieniać wymiarowość zmiennych. Naturę tego opiszę później.
    new jajko[4] - zmienna o nazwie "jajko", zawierajaca 4 elementy new kotlet[32][32] - dwuwymiarowa zmienna "kotlet" zawierająca po 32 elementy w każdej tablicy 3. Pisanie pluginu
     
     
    W porządku, nareszcie możemy się zabrać za pisanie naszego pierwszego pluginu :D. Naszym pierwszym pluginem będzie modyfikacja, która daje zabójcy x HP, oraz x życia.
     
    Wróćmy zatem do naszego pluginu, który wygląda tak:
    #include <amxmodx> #include <amxmisc>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Wiemy, że chcemy odnaleźć zabójcę, ale jak to zrobić? Z pomocą przychodzi nam event DeathMsg, który jest wywoływany zawsze w momencie śmierci gracza. Event wyłapuje indexy zabójcy, ofiary, użytej broni, a nawet czy padł HeadShot. Musimy jednak wpierw to wydarzenie złapać, a robimy to w plugin_init dodając taką oto linijkę:
    register_event("DeathMsg", "DeathMsg", "a") Analogicznie, tworzymy funkcję publiczną o nazwie DeathMsg, w której będziemy wykonywali określone operacje:
    public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     //code } Jak widzicie, umieściłem tutaj od razu dwie zmienne wewnętrzne, które przechowują indexy zabójcy (kid), a także ofiary (vid). Pozostało nam tylko nagrodzić zabójcę skromnym podarunkiem w postaci HP i $. Za modyfikację zdrowia służy funkcja natywna z biblioteki cstrike - cs_set_user_money, natomiast za zdrowie funkcja natywna z biblioteki fun - set_user_health. Dodajmy więc te dwa natywy na górę naszego pluginu:
    #Include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun> Teraz przyjrzyjmy się strukturze tych dwóch funkcji:
    cs_set_user_money(index, money)
     
    Pierwszy parametr (index) oznacza ID gracza, któremu USTAWIMY określoną ilość pieniędzy, natomiast drugi (money) oznacza ile kasy będzie miał gracz z ID "index"
     
    set_user_health(index, health)
    Pierwszy parametr (index) oznacza ID gracza, któremu USTAWIMY określoną ilość HP, natomiast drugi (health) oznacza ile zdrowia będzie miał gracz z ID "index"
     
    Ale co to właściwie jest ten index? Przy łączeniu z serwerem każdy gracz dostaje unikalny klucz indentyfikacyjny, przyjmujący wartości <1;ILOŚĆ_SLOTÓW>, stąd też możliwa jest operacja kasą czy życiem na indexach.
     
    Do pełni szczęścia musimy jeszcze znać aktualną wartość zdrowia i kasy zabójcy. Do tego służą nam odpowiednio cs_get_user_health(index) i get_user_money(index). Wyjaśniać tego nie będę
     
    Teraz wystarczy dodać tylko 2 linijki pod zmiennymi:
    cs_set_user_health(kid, cs_get_user_health(kid) + 10); set_user_money(kid, get_user_money(kid) + 200); W pierwszym parametrze (index) wykorzystałem ID zabójcy (kid), które pobraliśmy wcześniej. W drugim parametrze pobieram zdrowie/kasę gracza z indexem kid, a następniej do pobranej wartości dodaję 10/200. Proste, prawda? :)
    Dodatkowo poinformuję zabójcę i  ofiarę o zaistniałej sytuacji, dodając poniżej 2 linijki:
    client_print(kid, print_chat, "Za zabojstwo otrzymales +10HP i +200$") client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +10HP i +200$ ;)"); Składnia:
    client_print(index, message_type, string:message);
     
    index - ID gracza
    message_type - typ wysyłanej wiadomości
    message - wiadomość. Musi się ona zawierać między cudzysłowiami "".
     
    Polecam zajrzeć do dokumentacji aby zobaczyć dokładniej o co chodzi.
     
    Nasz plugin wygląda już tak:
    #include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl"); register_event("DeathMsg", "DeathMsg", "a")   }   public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     cs_set_user_health(kid, cs_get_user_health(kid) + 10);     set_user_money(kid, get_user_money(kid) + 200);       client_print(kid, print_chat, "Za zabojstwo otrzymales +10HP i +200$")     client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +10HP i +200$ ;)"); } Mimo, że już bardzo mi się nie chce, dodam jeszcze dwa udogodnienia - 2 stałe zmienne, przechowujące ilość bonusowej kasy/zdrowia, a także pobiorę nicki zabójcy i ofiary i zmodyfikuję wysłaną do nich wiadomość.
     
    Dodajmy pod natywami 2 linijki:
    #define BONUS_HP 10 #define BONUS_MONEY 200 Utworzyłem dwie stałe zmienne, przechowujące wspomniane wyżej wartości. Teraz wykorzystajmy je:
    public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     cs_set_user_health(kid, cs_get_user_health(kid) + BONUS_HP);     set_user_money(kid, get_user_money(kid) + BONUS_MONEY);       client_print(kid, print_chat, "Za zabojstwo otrzymales +%iHP i +%i$", BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +%iHP i +%i$ ;)", BONUS_HP, BONUS_MONEY); } Mam nadzieję, że ustawianie HP/ZDR jest jasne, ale co to za %i ?? Są to przekaźniki, które, jak nazwa mówi, przekazują wartości zmiennych.Podam tylko 2 typy:
    %i - dla liczb
    %s - dla liter (dla wartości typu String)
     
    Uf, okej. Pobiorę jeszcze nicki. Pod new vid dopisujemy:
    new nick_zabojcy[64]; new nick_ofiary[64]; get_user_name(kid, nick_zabojcy, 63); get_user_name(vid, nick_ofiary, 63); get_user_name(index, tablica, wielkosc_tablicy);
     
    index - ID zabójcy/ofiary
    tablica - jest nazwa zmiennej, w którą zostanie wpisany nick zabójcy/ofiary
    wielkosc_tablicy - max. rozmiar tablicy
     
    Dlaczego 64? Wątpię, aby nick gracza miał więcej znaków niż 64 ;) Dlaczego w get_user_name wpisuję 63 zamiast 64? Stringi zawsze muszą mieć wolne miejsce na tzw. spację (\0)
     
    Teraz tylko zmodyfikumy wiadomości dla graczy:
       client_print(kid, print_chat, "Za zabojstwo gracza %s otrzymales +%iHP i +%i$", nick_ofiary, BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz %s otrzymal +%iHP i +%i$ ;)", nick_zabojcy, BONUS_HP, BONUS_MONEY); Po wszystkich usprawnieniach cały kod wygląda tak:
    #include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun>   #define BONUS_HP 10 #define BONUS_MONEY 200      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl"); register_event("DeathMsg", "DeathMsg", "a")   }   public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara      new nick_zabojcy[64];    new nick_ofiary[64];    get_user_name(kid, nick_zabojcy, 63);    get_user_name(vid, nick_ofiary, 63);       cs_set_user_health(kid, cs_get_user_health(kid) + BONUS_HP);     set_user_money(kid, get_user_money(kid) + BONUS_MONEY);       client_print(kid, print_chat, "Za zabojstwo gracza %s otrzymales +%iHP i +%i$", nick_ofiary, BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz %s otrzymal +%iHP i +%i$ ;)", nick_zabojcy, BONUS_HP, BONUS_MONEY); } To by było na tyle ;). W razie pytań, czy błedów, pisać pod spodem.
     
    Dzięki za poświęcony czas i strzałeczka :D
  10. Super
    MAGNET otrzymał punkt reputacji od RumcajsJumper [ZAMKNIĘTE] [AMX] Piszemy plugin, czyli TuT dla zielonych   
    Siemanko,
     
    Postanowiłem, że poświęcę parę minut i napiszę mały tutorial o pisaniu pluginów do cs 1.6. Z racji, iż ostatnio plugin z rozszerzeniem sma kompilowałem pół roku temu, proszę o wyrozumiałość i zgłaszanie ewentualnych błędów. A teraz już zaczynajmy ;)
     
    1. Przygotowanie
     
    Zanim cokolwiek napiszemy musimy mieć do tego stosowny program. Oczywiście, notatnik też mógłby temu służyć, jednak nie jest to najlepsze narzędzie do tego typu zadań. Odsyłam więc was do TEGO TEMATU, w którym skonfigurujecie swoje stanowisko pracy.
     
    2. Podstawy
     
    Teraz umieszczę niżej podstawowy plugin, który nie będzie robił absolutnie nic. Przedstawię krótko jego strukturę i znaczenie poszczególnych części:
     
     
    #include <amxmodx> #include <amxmisc>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Okej, lecimy po kolei:
     
    #include <amxmodx> #include <amxmisc> #include <codmod>  
    Są to natywy, nazywane też bibliotekami, nie bez powodu, gdyż pełnią one funkcję swoistego rodzaju książek. Plugin wyszukuje przez nie odpowiednie funkcje i ich operacje i wykonuje je. Np. jeśli chcemy ustawić graczowi życie potrzebujemy biblioteki "fun". Umieszczenie linijki "#include <fun> na górze pluginu upoważniałoby nas do korzystania z funkcji set_user_health. Pełna listę funkcji natywnych znajdziecie TUTAJ. Gdybyśmy ich nie dodali kod byłby baaardzo długi. Przedstawię to na konkretnym przykładzie:
     
    Wyobraź sobie, że nie znasz znaczenia pojęcia np. "apogeum", więc znajdujesz sobie w wikipedii znaczenie tego słowa. Od teraz wiesz, ze oznacza to jakiś moment krytyczny. Kiedy ktoś powiedziałby do Ciebie, że "jego cierpliwość dochodzi do apogeum" doskonale wiesz już o co mu chodzi. Bardzo podobna sytuacja ma miejsce tutaj. Każdy język programowania był bazowany na umyśle ludzkim. Tak więc nie wymyślamy niczego nowego, a tylko naśladujemy - taka mała dygresja ;)
    public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Tutaj na chwilę muszę się zatrzymać. Aby uświadomić sobie zasadę działania każdego pluginu niezbędna jest wiedza o funkcjach. Na sam początek wyjaśnię wam jak działa funkcja typu public. Wszystkie operacje, mające miejsce w pluginie, nie mogą sobie fruwać nie wiadomo gdzie. Ważne jest uporządkowanie całości. Dlatego też powstały funkcje, a cały przebieg operacji musi się zawierać w nich pomiędzy klamrami { }
    Doklaracja funkcji publicznej:
    public NazwaFunkcji(parametry, any...) {        //Wykonywane operacje } Myślę, że wszystko stanie się jasne w dalszej części poradnika ;)
    register_plugin(nazwa, "1.0", "amxx.pl"); Jest to rejestracja pluginu na serwerze, wykonywana przy każdej zmianie mapy. Warto tutaj wspomnieć, że funkcja plugin_init właśnie wtedy się wywołuje. Można powiedzieć, że plugin "idzie do pracy w firmie i podbija druczek obecności" xD
     
    Okej, za chwilę napiszemy sobie pierwszy plugin. Zanim jednak zaczniemy, trzebaby wspomnieć o ważnym aspekcie, jakim są zmienne.
     
    Są to obszary, przechowujące dane. Praktycznie każdy plugin je posiada, a ich konstrukcja wygląda mniej więcej tak:
    new NazwaZmiennej Wyróżniamy kilka rodzajów zmiennych:
     
    2 podstawowe podziały:
    1. Zmienna globalna, implementowana (umieszczana) na początku pluginu, tuż pod bibliotekami.
    2. Zmienna wewnętrzna, umieszczana w funkcjach (public) pomiędzy klamrami. Ich zaletą jest tworzenie na czas wykonywanej funkcji, co pozwala nam na zaoszczędzenie pamięci.
     
    Typy zmiennych:
     
    Zmienna zwykła - zwykła zmienna przechowująca określony typ pamięci.
    new NazwaZmiennej Zmienna logiczna - czyli taka, która przechowuje wartości typu true/false (prawda/fałsz)
    new bool:NazwaZmiennej Zmienna statyczna - używana zazwyczaj jako zmienna wewnętrzna. Po użyciu od jest usuwana, co pozwala na zaoszczędzenie pamięci
    static NazwaZmiennej Zmienna stała - implementowana pod bibliotekami, przechowuje zawsze tylko jeden typ danych od początku istnienia pluginu.
    #define NazwaZmiennej Przedstawione wyżej zmienne są tylko jednoelementowe, czyli nie przechowają więcej, niż jednej wartości. Na szczęście, można wprowadzać tablice i zmieniać wymiarowość zmiennych. Naturę tego opiszę później.
    new jajko[4] - zmienna o nazwie "jajko", zawierajaca 4 elementy new kotlet[32][32] - dwuwymiarowa zmienna "kotlet" zawierająca po 32 elementy w każdej tablicy 3. Pisanie pluginu
     
     
    W porządku, nareszcie możemy się zabrać za pisanie naszego pierwszego pluginu :D. Naszym pierwszym pluginem będzie modyfikacja, która daje zabójcy x HP, oraz x życia.
     
    Wróćmy zatem do naszego pluginu, który wygląda tak:
    #include <amxmodx> #include <amxmisc>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl");   } Wiemy, że chcemy odnaleźć zabójcę, ale jak to zrobić? Z pomocą przychodzi nam event DeathMsg, który jest wywoływany zawsze w momencie śmierci gracza. Event wyłapuje indexy zabójcy, ofiary, użytej broni, a nawet czy padł HeadShot. Musimy jednak wpierw to wydarzenie złapać, a robimy to w plugin_init dodając taką oto linijkę:
    register_event("DeathMsg", "DeathMsg", "a") Analogicznie, tworzymy funkcję publiczną o nazwie DeathMsg, w której będziemy wykonywali określone operacje:
    public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     //code } Jak widzicie, umieściłem tutaj od razu dwie zmienne wewnętrzne, które przechowują indexy zabójcy (kid), a także ofiary (vid). Pozostało nam tylko nagrodzić zabójcę skromnym podarunkiem w postaci HP i $. Za modyfikację zdrowia służy funkcja natywna z biblioteki cstrike - cs_set_user_money, natomiast za zdrowie funkcja natywna z biblioteki fun - set_user_health. Dodajmy więc te dwa natywy na górę naszego pluginu:
    #Include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun> Teraz przyjrzyjmy się strukturze tych dwóch funkcji:
    cs_set_user_money(index, money)
     
    Pierwszy parametr (index) oznacza ID gracza, któremu USTAWIMY określoną ilość pieniędzy, natomiast drugi (money) oznacza ile kasy będzie miał gracz z ID "index"
     
    set_user_health(index, health)
    Pierwszy parametr (index) oznacza ID gracza, któremu USTAWIMY określoną ilość HP, natomiast drugi (health) oznacza ile zdrowia będzie miał gracz z ID "index"
     
    Ale co to właściwie jest ten index? Przy łączeniu z serwerem każdy gracz dostaje unikalny klucz indentyfikacyjny, przyjmujący wartości <1;ILOŚĆ_SLOTÓW>, stąd też możliwa jest operacja kasą czy życiem na indexach.
     
    Do pełni szczęścia musimy jeszcze znać aktualną wartość zdrowia i kasy zabójcy. Do tego służą nam odpowiednio cs_get_user_health(index) i get_user_money(index). Wyjaśniać tego nie będę
     
    Teraz wystarczy dodać tylko 2 linijki pod zmiennymi:
    cs_set_user_health(kid, cs_get_user_health(kid) + 10); set_user_money(kid, get_user_money(kid) + 200); W pierwszym parametrze (index) wykorzystałem ID zabójcy (kid), które pobraliśmy wcześniej. W drugim parametrze pobieram zdrowie/kasę gracza z indexem kid, a następniej do pobranej wartości dodaję 10/200. Proste, prawda? :)
    Dodatkowo poinformuję zabójcę i  ofiarę o zaistniałej sytuacji, dodając poniżej 2 linijki:
    client_print(kid, print_chat, "Za zabojstwo otrzymales +10HP i +200$") client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +10HP i +200$ ;)"); Składnia:
    client_print(index, message_type, string:message);
     
    index - ID gracza
    message_type - typ wysyłanej wiadomości
    message - wiadomość. Musi się ona zawierać między cudzysłowiami "".
     
    Polecam zajrzeć do dokumentacji aby zobaczyć dokładniej o co chodzi.
     
    Nasz plugin wygląda już tak:
    #include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun>      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl"); register_event("DeathMsg", "DeathMsg", "a")   }   public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     cs_set_user_health(kid, cs_get_user_health(kid) + 10);     set_user_money(kid, get_user_money(kid) + 200);       client_print(kid, print_chat, "Za zabojstwo otrzymales +10HP i +200$")     client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +10HP i +200$ ;)"); } Mimo, że już bardzo mi się nie chce, dodam jeszcze dwa udogodnienia - 2 stałe zmienne, przechowujące ilość bonusowej kasy/zdrowia, a także pobiorę nicki zabójcy i ofiary i zmodyfikuję wysłaną do nich wiadomość.
     
    Dodajmy pod natywami 2 linijki:
    #define BONUS_HP 10 #define BONUS_MONEY 200 Utworzyłem dwie stałe zmienne, przechowujące wspomniane wyżej wartości. Teraz wykorzystajmy je:
    public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara     cs_set_user_health(kid, cs_get_user_health(kid) + BONUS_HP);     set_user_money(kid, get_user_money(kid) + BONUS_MONEY);       client_print(kid, print_chat, "Za zabojstwo otrzymales +%iHP i +%i$", BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz otrzymal +%iHP i +%i$ ;)", BONUS_HP, BONUS_MONEY); } Mam nadzieję, że ustawianie HP/ZDR jest jasne, ale co to za %i ?? Są to przekaźniki, które, jak nazwa mówi, przekazują wartości zmiennych.Podam tylko 2 typy:
    %i - dla liczb
    %s - dla liter (dla wartości typu String)
     
    Uf, okej. Pobiorę jeszcze nicki. Pod new vid dopisujemy:
    new nick_zabojcy[64]; new nick_ofiary[64]; get_user_name(kid, nick_zabojcy, 63); get_user_name(vid, nick_ofiary, 63); get_user_name(index, tablica, wielkosc_tablicy);
     
    index - ID zabójcy/ofiary
    tablica - jest nazwa zmiennej, w którą zostanie wpisany nick zabójcy/ofiary
    wielkosc_tablicy - max. rozmiar tablicy
     
    Dlaczego 64? Wątpię, aby nick gracza miał więcej znaków niż 64 ;) Dlaczego w get_user_name wpisuję 63 zamiast 64? Stringi zawsze muszą mieć wolne miejsce na tzw. spację (\0)
     
    Teraz tylko zmodyfikumy wiadomości dla graczy:
       client_print(kid, print_chat, "Za zabojstwo gracza %s otrzymales +%iHP i +%i$", nick_ofiary, BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz %s otrzymal +%iHP i +%i$ ;)", nick_zabojcy, BONUS_HP, BONUS_MONEY); Po wszystkich usprawnieniach cały kod wygląda tak:
    #include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun>   #define BONUS_HP 10 #define BONUS_MONEY 200      public plugin_init() { register_plugin(nazwa, "1.0", "amxx.pl"); register_event("DeathMsg", "DeathMsg", "a")   }   public DeathMsg() {     new kid = read_data(1)    //zabojca       new vid = read_data(2)    // ofiara      new nick_zabojcy[64];    new nick_ofiary[64];    get_user_name(kid, nick_zabojcy, 63);    get_user_name(vid, nick_ofiary, 63);       cs_set_user_health(kid, cs_get_user_health(kid) + BONUS_HP);     set_user_money(kid, get_user_money(kid) + BONUS_MONEY);       client_print(kid, print_chat, "Za zabojstwo gracza %s otrzymales +%iHP i +%i$", nick_ofiary, BONUS_HP, BONUS_MONEY);     client_print(vid, print_chat, "Przez twoja smierc gracz %s otrzymal +%iHP i +%i$ ;)", nick_zabojcy, BONUS_HP, BONUS_MONEY); } To by było na tyle ;). W razie pytań, czy błedów, pisać pod spodem.
     
    Dzięki za poświęcony czas i strzałeczka :D
  11. Super
    MAGNET przyznał reputację dla Gameranger[ZAMKNIĘTE] czas?   
    ty nie musisz wiedziec tylko zeby H@ wiedzieli;D
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie