Skocz do zawartości

klqs

 VIP

Aktywność reputacji

  1. Serduszko
     klqs otrzymał reputację od Inte Tillgänglig Danke:*[ZAAKCEPTOWANE]no i klops   
    Nick: klqs (czyt. ka el kiu es dla opornych :D)
    Wiek: 17
    Doświadczenie (w byciu adminem): Duże.. Pierwszy admin nawet nie pamietam kiedy, potem kilka razy adminowałem. Z 2/3 lata temu z kolega z klasy mieliśmy JB dość długo. No ogólnie doświadczenie mam
    Znajomość AMXX (W skali 1-10): 10
    Staż w CS-sie: nie pamiętam dokładnie, pierwszy raz grałem gdzieś koło 9 roku życia
    Steam / NonSteam: Steam
    Dlaczego Ty: Jestem doświadczony - rozpoznać cheatera to nie problem. Lubie pomagać czego niektóre osoby z sieci mogły już doświadczyć. Zawsze staram sie nie zawalić swoich obowiązków. Poczucie humoru też mam, czasami mi odwala ale to bardziej prywatnie  Wymagania wszystkie spełniam. Poza tym dobrej pomocy nigdy za wiele 
    Czas jaki dziennie poświęcasz na CS-a: Jak z gt można wywnioskować: 4h - 30 minut. Średnio po 1.5h uda mi się wbić. Zależy od czasu
    Kontakt: Najszybszy pewnie steam: KLIK GG też moge zapodać: 45836009.
    Link do GameTracker'a: http://www.gametracker.com/player/klqs/80.72.43.106:27032/
  2. Lubię to
     klqs przyznał reputację dla LOVASSS [ZAMKNIĘTY]Niesłuszny warn   
    Nie jesteś weteranem na forum, wprowadziłeś lekki zamęt, jednak nie zrobiłeś tego w zły sposób, chciałeś pomóc. Było upomnienie, jednak twój post nie wpłynął negatywnie na temat. Jeżeli miało by być równo, to happy również dostał by warna, bo wasze wypowiedzi są bardzo podobne. Warna zdejmuje, poleciał za szybko. 
    Jednak, wypowiedzi typu "Moderatorów nie muszę się słuchać czy coś w ten sposób, zachowaj dla siebie", nie chce słuchać takich durnot.
    Dobranoc.
     
  3. Lubię to
     klqs otrzymał reputację od koksy [ZAMKNIĘTY]Niesłuszny warn   
    Po pierwsze. "Kolejne posty niezwiązane z tematem będą nagradzane kolejnymi warnami. Proszę o przemyślenie treści merytorycznego postu związanego z turniejem."  Że tak spytam. Gdzie tu napisałeś, że nie można się wypowiadać jeśli się nie jest uczestnikiem? 
    Druga sprawa. "powodujesz zamieszanie z kłótniami, wrzucając oskarżenia, screeny i tym podobne rzeczy." Te Twoje "kłótnie" "zamieszania" "oskarżenia" to była zwykła odpowiedź do Th3Enda. Spytaj sie go czy my sie kłóciliśmy. 
    Po trzecie. Jaki punkt regulaminu złamałem? Chcesz mi powiedzieć, że złamałem "Każdy użytkownik jest równy wobec zasad."? xD
    Czwarta i ostatnia sprawa. Jakim prawem wg. Ciebie nie zasługuje na upomnienie? Regulamin mówi jasno: " Można to znieść w chwili, gdy dany użytkownik złamie kilka punktów w regulaminie za jednym razem, bądź tego samego dnia" Tego chyba nie msuze tłumaczyć
     
  4. Lubię to
     klqs otrzymał reputację od Born [ZAMKNIĘTY]Niesłuszny warn   
    Data zdarzenia: 09.08.2017 o 22.
    Nick gracza: @Bene
    Dowody: W moim profilu dla administracji.
    Świadkowie:
    Uzasadnienie: Dostałem warna z powodem "Ostrzegałem, nie komentujemy nie na temat samego turnieju i jego przebiegu, a tym bardziej jak nie gramy." Skoro wg. Ciebie to nie było na temat turnieju to ja nie wiem. Tak, nie gram w tym turnieju ale temat który poruszyłem (zmiana po 8 rundach) to czysta sprawiedliwość wobec graczy, a z tego co wiem to Th3End miał po tym poprawić to na zmiane po 15 rundach tak jak powinno być. Czy to nic nie wnosiło do tematu? Druga sprawa. Uczepiłeś się mnie tak na dobrą sprawe, że nie przeczytałem Twojego postu - a sam nie przeczytałeś tematu w którym End pisał, że temat nie jest do dyskusji i prosi moderatorów o zamknięcie. W regulaminie nie znalazłem nigdzie, że mam słuchać widzimisi moderatorów. A nawet jeśli warn słuszny. Jestem nowym użyszkodnikiem, na pewno nie świętym, ale dlaczego innym przyslugują upomnienia a mi nie? 
  5. Lubię to
     klqs otrzymał reputację od Born [ZAMKNIĘTY]Niesłuszny warn   
    Po pierwsze. "Kolejne posty niezwiązane z tematem będą nagradzane kolejnymi warnami. Proszę o przemyślenie treści merytorycznego postu związanego z turniejem."  Że tak spytam. Gdzie tu napisałeś, że nie można się wypowiadać jeśli się nie jest uczestnikiem? 
    Druga sprawa. "powodujesz zamieszanie z kłótniami, wrzucając oskarżenia, screeny i tym podobne rzeczy." Te Twoje "kłótnie" "zamieszania" "oskarżenia" to była zwykła odpowiedź do Th3Enda. Spytaj sie go czy my sie kłóciliśmy. 
    Po trzecie. Jaki punkt regulaminu złamałem? Chcesz mi powiedzieć, że złamałem "Każdy użytkownik jest równy wobec zasad."? xD
    Czwarta i ostatnia sprawa. Jakim prawem wg. Ciebie nie zasługuje na upomnienie? Regulamin mówi jasno: " Można to znieść w chwili, gdy dany użytkownik złamie kilka punktów w regulaminie za jednym razem, bądź tego samego dnia" Tego chyba nie msuze tłumaczyć
     
  6. Lubię to
     klqs otrzymał reputację od happy [ZAMKNIĘTY]Niesłuszny warn   
    Po pierwsze. "Kolejne posty niezwiązane z tematem będą nagradzane kolejnymi warnami. Proszę o przemyślenie treści merytorycznego postu związanego z turniejem."  Że tak spytam. Gdzie tu napisałeś, że nie można się wypowiadać jeśli się nie jest uczestnikiem? 
    Druga sprawa. "powodujesz zamieszanie z kłótniami, wrzucając oskarżenia, screeny i tym podobne rzeczy." Te Twoje "kłótnie" "zamieszania" "oskarżenia" to była zwykła odpowiedź do Th3Enda. Spytaj sie go czy my sie kłóciliśmy. 
    Po trzecie. Jaki punkt regulaminu złamałem? Chcesz mi powiedzieć, że złamałem "Każdy użytkownik jest równy wobec zasad."? xD
    Czwarta i ostatnia sprawa. Jakim prawem wg. Ciebie nie zasługuje na upomnienie? Regulamin mówi jasno: " Można to znieść w chwili, gdy dany użytkownik złamie kilka punktów w regulaminie za jednym razem, bądź tego samego dnia" Tego chyba nie msuze tłumaczyć
     
  7. Lubię to
     klqs otrzymał reputację od Knopa [ZAMKNIĘTY]Niesłuszny warn   
    Po pierwsze. "Kolejne posty niezwiązane z tematem będą nagradzane kolejnymi warnami. Proszę o przemyślenie treści merytorycznego postu związanego z turniejem."  Że tak spytam. Gdzie tu napisałeś, że nie można się wypowiadać jeśli się nie jest uczestnikiem? 
    Druga sprawa. "powodujesz zamieszanie z kłótniami, wrzucając oskarżenia, screeny i tym podobne rzeczy." Te Twoje "kłótnie" "zamieszania" "oskarżenia" to była zwykła odpowiedź do Th3Enda. Spytaj sie go czy my sie kłóciliśmy. 
    Po trzecie. Jaki punkt regulaminu złamałem? Chcesz mi powiedzieć, że złamałem "Każdy użytkownik jest równy wobec zasad."? xD
    Czwarta i ostatnia sprawa. Jakim prawem wg. Ciebie nie zasługuje na upomnienie? Regulamin mówi jasno: " Można to znieść w chwili, gdy dany użytkownik złamie kilka punktów w regulaminie za jednym razem, bądź tego samego dnia" Tego chyba nie msuze tłumaczyć
     
  8. Lubię to
     klqs przyznał reputację dla  DomanPiraci z Karaibów: Zemsta Salazara   
    Hejka  
    Dzisiaj przedstawię Wam ciekawy film, którego premiera niedawno była w kinach, a może dzięki tej recenzji poświęcicie czas aby go obejrzeć. Zapraszam.

    Reżyserem, który się podjął pracy nad tym filmem jest Joachim Rønning oraz Espen Sandberg. Obaj mogą się pochwalić takimi filmami na swoim koncie jak SexiPistols czy MaxManus, które w 2006 i 2008 roku miały swoją premierę.
     
    Film dość łatwy do przewidzenia, ale nieodzowną część stanowią zachowania głównego bohatera co w każdej z części było miłym akcentem.
     
    Film jak każda inna część opowiada o morskich przygodach Jacka Sparrowa, w którego wcielił się Johny Depp. Bohater początkowo napotyka na problemy w przy nadmorskim mieście. W tym mieście spotyka zarówno swoich przyszłych towarzyszy morskiej żeglugi. Początkowo celem głównego bohatera są jak zwykle pieniądze, ale dzięki zawziętości i uporowi Willa Tumera(Orlando Bloom) oraz Cariny Smyth(Kaya Scodelario) ich losy się łączą i owa dwójka obiecuje piratowi, że jeśli ten jej pomoże to Ona obdarzy go bogactwem. Celem tej dwójki jest zdobycie trójzębu posejdona i przełamanie wszelakich klątw na świecie. Pirat z racji, iż cierpiał na brak pieniędzy i kruszącą się w moralach załogę przystał na jej propozycje. Podczas przygotowań do podróży nie może obyć się bez problemów. Osobą, która czyha na życie pijanego pirata jest nie kto inny jak kapitan Salazar, który pragnie dokonać zemsty na jedynym piracie, który mu się przeciwstawił i go ośmieszył. Kapitan jak i Jego załoga to banda umarłych, która żyje dzięki klątwie rzuconej dawno temu. Ten kapitan za czasów swojego żywota dowodził Hiszpańskim potężnym okrętem, który za zadanie miał wyeliminować wszystkich piratów żeglujących na morzach. Jedynym, który przeżył i zadrwił z kapitana odpływając był nie kto inny jak sam Jack Sparrow. W filmie nie mogło zabraknąć wcześniej wspomnianych komicznych scen. Jedną z nich było otwarcie nowego banku w mieście, w którym usnął pijany pirat. Mało tego podczas otwarcia banku zza Jacka Sparrowa leżała za nim żona burmistrza. Jak dla mnie film jest fajny, warto było trochę poczekać, żeby zobaczyć tego pirata po raz kolejny w akcji.
     
    Niestety film na stronie, na której oglądałem tą produkcje został usunięty.
    Pozdrawiam, Doman  
     
  9. Lubię to
     klqs otrzymał reputację od  DomanPiraci z Karaibów: Zemsta Salazara   
    Blee. Byłem w kinie, nawet dwa razy i dla mnie beznadzieja. Bardzo lubie piratów z karaibów ale ta część mi nie przypadła do gustu. Co do recenzji, ładna, ale są lepsze filmy
  10. Lubię to
     klqs otrzymał reputację od ScoobyDooQ&A vol.7 Scooby Doo- Pytania.   
    [P] Palisz?
    [P] Jak czesto pijesz?
    [P] Ulubiona rozrywka
    [P] Ulubiony sport
    [P] Preferowany typ muzyki
    [P] Preferowany typ filmów (oprócz tych które lubi każdy facet   )
    [P] Skąd zamilowanie do Scooby Doo  
    [P] W jakim wieku i gdzie zacząłeś oglądać Scooby Doo 
    [P] Najlepszy wyjazd/urlop jaki pamiętasz - gdzie? 
  11. Lubię to
     klqs przyznał reputację dla pionteczekessaPropozycje i uwagi - FORUM   
    Uprawnienia już masz.
    Co do edycji postów, oznaczania i avatarów na chatboxie, proszę nie zgłaszać tych błędów bo to wina aktualizacji forum, pracuję nad tym.
    1. done
    2. odezwij się do super moderatora na pw
    3. to samo co punkt 2.
    4. dodane
    5. zrobione
  12. Haha
     klqs przyznał reputację dla BezziQ&A vol.7 Scooby Doo- Pytania.   
    [P] Ile jesz?
    [P] Co jesz?
    [P] Gdzie jesz?
    [P] Z kim jesz?
    [P] Podasz mi tajniki do szybkiego przybrania na wadze? <3 
  13. Lubię to
     klqs przyznał reputację dla MissiaBranża pornograficzna w pigułce! Takiego artykułu jeszcze nie było!   
    Witajcie Kochani.  Dziś przychodzę do Was z dość odważnym artykułem, tym bardziej, że pisze go dziewczyna. Stwierdziłam, że ciekawym pomysłem będzie wgłębienie się w temat branży pornograficzniej. Brzmi przerażająco?  Spokojnie, nie wrzucę żadnych filmików, będzie to czysto edukacyjny artykuł. Przyjrzymy się zarobkom, popularnością gwiazd oraz jak to wszystko przebiega. Zapraszam  
     
    1. Stosunek pornografii na świecie
    2. Informacje ogólne i ciekawostki
    3. Ile zarabia się w takim biznesie? 
    4. Czy da się utrzymać z tej pracy?
    5. Ranking najpopularniejszych gwiazd pornograficznych z 2016 roku 
    6. Ranking najpopularniejszych stron pornograficznych z 2016 roku
    7. Ranking najdroższych produkcji filmów dla dorosłych 
    8. Wywiad z Polskim Producentem Filmów Pornograficznych
     
     
    Mapa przedstawiająca gdzie pornografia jest legalna, a gdzie nie. 

    zielony - pornografia legalna
    żółty - pornografia legalna z pewnymi ograniczeniami
    bordowy - pornografia nielegalna
    szary - brak danych
     
    Informacje ogólne i ciekawostki.
    Zacznijmy od tego, że 80% chętnych to mężczyźni, więc twierdzenie, że aktorek jest więcej to tylko zwykły stereotyp. Jako, że jest aż tak ogromna różnica, to produkcje muszą przeprowadzać specjalne selekcje. Panowie porównywani są pod względem długości członka oraz wypadnięcia przed kamerą. Standardowo film powinien trwać 15-30 minut, ale aby wyszedł on dobrze, materiał musi być minimum 2 razy dłuższy. Na planie oprócz pary znajduje się również reżyser, operator kamery, scenograf oraz osoba zajmująca się makijażem. 
     
    Ciekawostki:

    1. Około 25 % wszystkich wyszukiwań w Internecie (ok. 69 mln) jest związanych właśnie z filmami dla dorosłych. 
    2. Ankiety pokazują, że jedna na trzy kobiety regularnie odwiedza strony pornograficzne.
    3. Najczęściej wyszukiwaną frazą na stronach porno jest "teen". 
    4. Stany Zjednoczone to największy producent pornografii, a na drugim miejscu plasują się Niemcy. Z kolei w Korei Północnej jakikolwiek związek z porno karany jest śmiercią.
    5. 70% mężczyzn oglądających porno mieści się w przedziale wiekowym 18-24.
    6. Pornografię ogląda około 450 milionów użytkowników miesięcznie. To średnio 15 milionów osób każdego dnia. 
    7. Około 10 % dorosłych jest uzależniona od oglądania tego typu filmów.
    8. Co roku odbywa się gala "Porno Oscary" gdzie aktorzy otrzymują nagrody za dane wyróżnienia, np. "Najlepsze piersi". 
     
    Ile zarabia się w takim biznesie? 
    CNBC przeprowadziła badania pośród autentycznych „porno pracowników”, dzięki którym mogliśmy dowiedzieć się kto mniej więcej ile zarabia na kręceniu filmów pornograficznych w Stanach Zjednoczonych.
    Aktorka, scena z mężczyzną (i kobietą): 300-1500 dolarów (1200-5900 zł)
    Aktorka, scena z kobietą: 700-1200 dolarów (2700-4700 zł)
    Aktor: 500-1500 dolarów (2000-5900 zł)
    Reżyser: 1000-3000 dolarów (4000-12000 zł)
    Operator kamery: 500-700 dolarów (2000-2700 zł)
    Dźwiękowiec: 300-400 dolarów (1200-1600)
    Asystent produkcji: 100-250 dolarów (400-1000 zł)
    Scenarzysta: 250-400 dolarów (1000-1600 zł)
    Fotograf: 500 dolarów (2000 zł)
    Makijażysta: 500 dolarów (2000 zł)
     
    Czy da się utrzymać z tej pracy? 
    "- W Polsce nie, bo jest po prostu za mało produkcji. Za granicą tak, ale przez krótki czas, bo rotacja wśród gwiazd jest dość duża. Podobnie jest w innych krajach, gdzie wiele kobiet traktuje granie w filmach erotycznych jako rodzaj promocji. Często są to dziewczyny, które występują w klubach, mają swoje własne show. Dzięki temu, że zagrały w określonej liczbie produkcji, mogą za swój występ zażądać odpowiednio wyższej kwoty. Część z tych dziewczyn pracuje również jako call girl." - mówi Krzysztof Garwatowski, dyrektor największego w Polsce wydawnictwa czasopism pornograficznych. 
     
    Ranking najpopularniejszych gwiazd pornograficznych z 2017 roku oraz statystyki ogólne

      




     
    Ranking najpopularniejszych stron pornograficznych z 2016 roku
    showup - 2 600 000 użytkowników,
    redtube- 2 200 000 użytkowników,
    bongacams - 2 200 000 użytkowników,
    pornhub - 1 900 000 użytkowników,
    xhamster - 1 800 000 użytkowników,
    xvideos - 1 200 000 użytkowników,
    datezone- 1 200 000 użytkowników,
    xnxx- 1 100 000 użytkowników,
    pornway - 1 000 000 użytkowników,
    livejasmin - 1 000 000 użytkowników.

    Ranking najdroższych produkcji filmów dla dorosłych

    10. Conquest Budżet: 150 000 dolarów
    9. Flashpoint X Budżet: 220 000 dolarów
    8. Manhunters Budżet: 250 000 dolarów
    7. Operation Desert Stormy Budżet: 250 000 dolarów
    6. Upload Budżet: 350 000 dolarów
    5. Fashionistas Budżet: 500 000 dolarów
    4. Pirates Budżet: 1 000 000 dolarów
    3. Uninhibited Budżet: 1 200 000 dolarów
    2. Pirates II: Stagnetti’s Revenge Budżet: 8 000 000 dolarów
    1. Caligula Budżet: 17 500 000
     
    Tutaj znajdziecie wywiad z polskim producentem filmów dla dorosłych: http://weekend.gazeta.pl/weekend/1,152121,19736643,polski-producent-porno-mlodzi-mezczyzni-mysla-ze-sobie-poradza.html myślę, że może to być dopełnienie informacji, które się tutaj nie znalazły. 
     


    Nie odbierajcie tego źle. Jestem zdania, że w życiu należy rozmawiać o wszystkim, niekoniecznie publicznie. Wydaję mi się, że niektórych może coś z tego artykułu zainteresować. Niekulturalne komentarze proszę zostawić dla siebie. 
    W większości są sto statystki, ale głównie to chciałam Wam przedstawić.  
    Pozdrawiam, Missia. 

    Dziękuję @^^RYBSON^^ za pomoc przy artykule, zdecydowanie ogarnia ten temat <3 
     
     Źródła: 
    http://www.gp24.pl/strefa-biznesu/wiadomosci/z-regionu/a/biznes-na-kreceniu-filmow-erotycznych-placa-100-dolarow-za-scene,10313298/
    http://joemonster.org/art/36931
  14. Lubię to
     klqs otrzymał reputację od sypkilopezPodstawy amxx   
    Cześć. Nie zauważyłem na tym forum jakiegoś dużego grona osób, które potrafią cokolwiek w amxx, więc postanowiłem się z Wami podzielić moją niewielką wiedzą. Będę się starał opisać wszystko najprościej jak potrafię, aby każdy kto chce, mógł to zrozumieć. Od razu mówię, że moje słownictwo tj. nazywanie konkretnych rzeczy nie będzie idealne i fachowe. Jest to spowodowane tym, że jestem samoukiem i nie wkuwałem teorii na pamięć tylko pobierałem pluginy i próbowałem rozgryźć jak to wszystko działa. 
    Co to wgl jest jak się do tego zabrać.
    AMXX (AMX Mod X - ulepszona i rozwijana wersja AMX Mod).
    Na tym opiera się praktycznie każdy serwer w 1.6 (z wyłączeniem mixów etc.). To dzięki temu wszystkie pluginy działają. W to zagadnienie nie ma potrzeby się głęboko zagłębiać. 
    Pliki *.sma i *.amxx.
    Zapewne nie raz o tym słyszeliście. Pierw pliki *.sma - Wszystkie projekty (tj. pluginy, silniki) w wersji możliwej do rozczytania przez człowieka są zapisywane właśnie w takim rozszerzeniu. Po co ono jest? Otóż gdy chcemy chociażby edytować istniejący już plugin to edytujemy właśnie plik *.sma. Gdy już skończymy prace, specjalnym kompilatorem który opisze później zamieniamy ten plik *.sma na plik *.amxx. Po co coś takiego robimy? AMXX rozpoznaje tylko pliki *.amxx. Do rozczytania przez człowieka są chyba niemożliwe. Kompilator zamienia to kolokwialnie mówiąc z "języka ludzkiego na język komputera". Ważne! Każdy plik *.sma można zamienić na *.amxx bez większego problemu (oczywiscie gdy nie występują errory, przy warningach kompiluje lecz zazwyczaj dana część kodu nie działa). W drugą strone jest większy problem. Istnieją dekompilatory (przeciwienstwa kompilatorów) które robią dokładnie odwrotną akcje. Niestety, nie są one zbyt dokładne. Często bywa, że większość część kodu jest nierozszyfrowana, a istnieją nawet metody które całkowicie uniemożliwiają dekompilacje. Mam nadzieje, że zrozumieliście, że pliki *.sma w FTP serwera są potrzebne tylko i wyłącznie w razie konieczności sprawdzenia działania pluginu/edycji etc., czyli z FTP można całkowicie wywalić folder "Scriptings", w którym znajdują się pliki *.sma oraz bilbioteki (o których będzie niżej) 
    Kompilacja.
    Myślę, że każdy kto prowadzi/ł serwer słyszał o czymś takim. Jest to jak już wyżej pisałem, zamiana pliku *.sma na *.amxx. Istnieją tak jakby dwie kompilacje:  lokalna i online, czym się różnią? Lokalna - kompilujemy naszym programem w którym najczęściej piszemy (w moim przypadku jest to amxx_studio, istnieje też możliwość pisania i kompilowania w notepad++ lecz to wymaga większego trudu. Można poszukać poradniki na internecie jak to zrobić.), a pliki *.amxx odrazu zapisują nam się w ustalonym miejscu na komputerze. Online - Przykładowy kompilator online: amxx.pl/kompilator. Wrzucamy tam kod albo uploadujemy plik *.sma, kompiluje a my musimy pobrać plik *.amxx który oczywiscie zapisuje się tam gdzie zapisują się pobierane pliki przez przeglądarke/ustalonym miejscu.
    Biblioteki.
    Chyba najczęsciej używaną biblioteką która nie jest domyślnie w amxx jest ColorChat. Co to takiego? Gdy piszemy to w kodzie wykorzystujemy funkcje. Zaincludowanie czyli pokazanie kompilatorowi, że ma użyć tej biblioteki, w kodzie to wygląda:
    #include <ColorChat> . Dzięki temu możemy używać funkcji które ta biblioteka zawiera, w tym przypadku jest to jedna, bardzo przydatna funkcja która pozwala w łatwy sposób kolorować wiadomosci wysyłane przez serwer (plugin) do gracza. Oczywiście, można zamiast includować to wrzucić umiejętnie to do kodu i wtedy nie trzeba - tylko po co, skoro tak jest szybciej i prościej. Biblioteki mają rozszerzenie zwykłe .inc
    Funkcje.
    Niestety, funkcje to rzecz które trzeba się nauczyć na pamięć, jednakże ich nazwy są na tyle intuicyjne, a jeśli dobrze skonfigurujemy nasz program do pisania który nam będzie podpowiadał składnie danej funkcji to z używaniem ich nie będzie większego problemu. Spis wszystkich dostepnych znajduje się tu: -> Klik <- po Polsku, a po Angielsku (więcej informacji) -> Klik <- 
    Funkcje forward. Wywoływane są one gdy się stanie coś konkretnego. Konkretniej: przykładem takiej funkcji jest 
    public plugin_init(){ //code } "public" przed funkcją jest oznajmieniem że jest to forward. Zamiast //code wpisujemy kod który w przypadku tej funkcji wykona się przy załadowaniu mapy. Używana jest ona zazwyczaj do rejestrowania pluginu (autor, wersja, nazwa), rejestrowania komend, cvarów (niżej) etc.
    Funkcje natywne. Można je umieścić np. w funkcjach forward. Przykładem takiego użycia byłoby:
    public plugin_init(){     register_plugin("Nazwa", "Wersja", "Autor"); } Po czymś takim po wpisaniu komendy amx_plugins byłby nasz plugin, nazywał by się Nazwa, przy wersji by pisało Wersja a jako autor byłby podany Autor. Po prostu rejestracja pluginu.
    Cvary.
    Najprosciej mówiąc - coś co pozwala nam sterowac pluginem przy pomocy komend/ustawien w amxx.cfg (w ftp serwera). Do zmieniania ich ustawien z poziomu admina na serwerze (oczywiscie z odpowiednimi flagami) uzywamy komendy amx_cvar. Cvary trzeba zarejestrować tam gdzie plugin, czyli w plugin_init.
    Zmienne.
    Zmienne dodajemy poprzedzajac je wyrazem "new". Służą do przechowywania, edytowania i odczytywania danych. Przykłady takich zmiennych to 
    new Zmienna //Może przechowywać max 1 literke/liczbe czyli np: "A", "a", "x" albo "1", "13", "69" etc.  new Zmienna[32] //Może przechowywać 32 literki/cyfry. Jak to działa? Każdy taki [1] to jest jedna zmienna, czyli można było by to zapisać new Zmienna0, new Zmienna1 itd. Ostatnia (32) jest to znak kończący, którego się nie edytuje czyli jak mamy 32 to mozemy wykonać operacje Zmienna[1] = 69 albo Zmienna[31] = 69.  new Float:Zmienna // Przechowuje liczby zmiennoprzecinkowe czyli np "1.69", "6.9" "1.141561" itd. Może występować również jako new Float:Zmienna[32] wtedy jest dokładnie jak przypadek wyżej new bool:Zmienna //Może ona tylko być jak true/false (True = 1, false = 0).  Formatowanie zmiennych. Dokładnie o znakach powiem niżej, ale zmienne po zadeklarowaniu na początku czyli np przed plugin_init można edytować/odczytywać w całym pluginie, czyli gdziekolwiek można napisać
    Zmienna = 1 lub
    if(zmienna == 1) Pierwszy przypadek ustawia Zmiennej wartość 1, drugi sprawdza czy zmienna równa się 1, jesli nie to zwraca 0, jeśli tak to zwraca 1.
     
    Operatory.
    W większości używane w funkcji if, for lub while oraz przy działaniach.
    a == b - Sprawdza czy lewa równa się prawej - jeśli tak zwraca 1, jeśli nie zwraca 0 a = b - Zmienna a przyjmuje wartość b, czyli jeśli b było równe 5 to a teraz tez jest równe 5 a < b - Jesli a jest mniejsze od b - zwraca 1, jeśli nie zwraca 0 a <= b - Jesli a jest mniejsze lub równe b - zwraca 1, jeśli nie zwraca 0 a != b - Jeśli a jest różne od b - zwraca 1, jeśli nie zwraca 0 a+b - a dodać b a+=5 - a dodać 5 a-b - a odjąć b a-=5 - a odjąć 5 a*b - a razy b a*=5 - to samo co a=a*5 a/b - a podzielone przez b a/=5 - to to samo co a=a/5 a%2 - zwrócenie reszty z dzielenia (przykład: 5%2 - zwróci nam 1) a++ - a użyte a potem zwiększone o 1 ++a - a zwiększone o jeden i dopeiro użyte a-- - a uzyte a potem zmniejszone o 1 --a - a zmniejszone o 1 a potem użyte is_user_connected(id) && is_user_alive(id) - jeśli jest połączony i żywy zwróci 1, jeśli nie jest żywy/nie jest połączony lub oba warunki są fałszywe to zwraca 0 is_user_connected(id) || is_user_alive(id) - jeśli jest połączony lub żywy zwróci 1, jesli żadne z tych zwróci 0. UWAGA!!
    7.0/3 = 3.5 7/3 = 3 Istnieje tez znak "?" Sprawdza on czy wartość po jego lewej jest 1, jeśli tak to wykona sie pierwszy argument, jeśli nie to drugi. Praktyka:
    is_user_alive(id) ? "Jest zywy" : "Jest martwy" Pętle oraz warunek if.
    Zawarty w nich kod wykona się określona ilość razy albo zanim zostanie wykonany wykona się sprawdzenie. Istnieja 3 pętle, trzeciej za bardzo nie rozumiem więc opisze dwie ktore się używa, jej jeszcze nie widziałem żeby ktoś uzywał, a nazywa się "do,while".
    Warunek if - sprawdza czy wyrażenie w nim jest prawdziwe (1) czy fałszywe (0) i zwraca odpowiednią cyfre. Praktyka:
    if(is_user_alive(id)){     user_kill(id) } Jeśli gracz jest zywy, zwróci 1 po czym wykona się zawarty w nim kod, czyli gracz zostanie zabity, jeśli gracz nie zyje, kod zostanei pominięty. Jeśli zostanei pominięty - czyli gracz będzie martwy, a chcemy sprawdzić skoro jest martwy to czy może jest w SPECT wiec robimy:
    if(is_user_alive(id){     user_kill(id)(id) } else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3){     cs_set_user_team(id, random(1,2)) } Juz tłumacze i objaśniam: Jak można wyczytać z dokumentacji -> Klik <- funkcja cs_get_uset_team zwraca 0 jeśli gracz nie wybrał drużyny lub 3 jesli jest na spect, więc w warunku if sprawdzamy czy jest 0 lub 3. Jeśli tak, przenosimy go do losowego teamu. W 2 argumencie funkcji cs_set_user_team wybieramy team do którego ma go przenieść. Funkcja random(1,2) losuje liczbe od 1 do 2 czyli 1 = TT, 2 = CT. Gdyby zamiast else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3) dać samo else to kod wykonał by się gdyby w pierwszym if gracz był martwy.
    Pętla for. Jest to jak sama nazwa mówi, pętla, w której kod będzie się wykonywał do pewnego momentu.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) break; } Jak widać, tworzymy zmienną i która po każdej pętli się zwieksza o 1 aż do maksymalnej ilości graczy która jest pobierana funkcją get_maxplayers(). Jak to wyglada? for(NOWA ZMIENNA; KIEDY MA SIĘ PĘTLA SKOŃCZYĆ; CO MA SIĘ ZROBIĆ PO SKOŃCZENIU PĘTLI). W pętlach między argumentami nie używamy "," tylko ";" W środku pętli: Jeśli użytkownik o id = zmiennej i jest adminem to pętla się kończy czyli dzieje się tak jakby i doszło do maksymalnej ilości graczy. Po co to? Gdy chcemy np znaleźć jednego admina i wyświetlić go komuś, wtedy po ifie a przed breakiem wysyłamy komuś wiadomosć.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) continue;     user_kill(i) //TEN KOD SIE NIE WYKONA JESLI GRACZ JEST ADMINEM, ALE PĘTLA BĘDZIE SPRAWDZAŁA DALEJ } Jeśli gracz o id = zmiennej i jest adminem to jest to pomijane i traktowane jakby pętla się skończyła, reszta kodu wtedy nie jest brane pod uwage
    Pętla while, podobna do for jednak w jej "wnętrzu" (nawiasach) nie tworzymy zmiennej.
    while(1==2){ //kod } Taka pętla nigdy się nie skończy ponieważ nigdy 1 nie będzie się równało 2.
    new zmienna new id=1 while(zmienna==5){ if(is_user_alive(id++)) zmienna++ } Ta pętla skończy się gdy będzie żyło 5 graczy
    Formatowanie.
    Czyli podmienianie np wyświetlanej wiadomosci do gracza. Załóżmy, że chcemy mu wysłać ile jest graczy online. W takim przypadku nie możemy wklepać na sztywno do kodu że jest 32 bo mijałoby się to z prawdą, dlatego robimy:
    client_print(id, print_center, "Na serwerze jest %d graczy!", ilosc_graczy) Gdzie ilosc_graczy to zmienna do której wcześniej zapisaliśmy liczbe graczy.
    Znaki formatujace:
    %s - string (ciag znaków) czyli np. "bober", "krowa", "elo" etc. %d lub %i - Liczba, czyli np "5", "15", "30". %f - float - liczba zmiennoprzecinkowa czyli np "1.3", "6.9" itd. Czasami będziemy chcieli wyświetlić tylko np. 2 cyfry po przecinku, taki problem wystepował swego czasu na niektorych codmodach gdzie po zmienieniu wymaganego doświadczenia na % wychodzilo im coś w stylu 50.4112308501%. Aby temu zapobierać zamiast %f piszemy %0.2f i wtedy wyświetli 2 cyfry po przecinku. Jeśli chcemy 5 cyfr to piszemy %0.5f. To są te najpotrzebniejsze, reszty się praktrycznie nie używa. Jeśli chcemy w jednej funkcji dodac kilka stringów to robimy to po prostu w kolejności. Jeśli chcemy wysłać zwykły znak % musimy go napisac podwójnie, czyli %%:
    client_print(id, print_center, "Na serwerze jest %d graczy, godzine temu było %d graczy a za 5 lat na 50%% bedzie %d graczy", ilosc_graczy, ilosc_graczy1hago, ilosc_graczy5y) To nam wyświetli np: "Na serwerze jest 20 graczy, godzine temu bylo 15, a za 5 lat na 50% bedzie 0 graczy"
    Dokładna rozpiska znajduje się tu: 
     
    Może w końcu po tej nudnej teorii się czymś zajmiemy? Pasowało by ogarnąć jakiś program do pisania. W tym celu pobieramy z tej strony -> Klik <-  AMX Mod X Full Installer, odpalamy go i instalujemy jak zwykły program. Potem wchodzimy w zainstalowany folder i uruchamiamy Installer.
    Klikamy Next, next, wybieramy select mod directory - next, wybieramy ścieżkę do cstrike, poniżej "Custome game addon:" wybieramy Counter-Strike i instalujemy wszystko. Teraz wracamy się do folderu w którym znajdował się pliczek Installer i wchodzimy w amxxstudio>AMXX_studio. Tam wchodzimy w Tools>settings>Compiler>Compiler settings i w Compiler (amxxpc.exe) ustalamy ścieżko do pliku amxxpc.exe który znajduje się w cstrike>addons>amxmodx>scripting. W moim przypadku jest to 
    D:\Program Files (x86)\Steam\steamapps\common\Half-Life\cstrike\addons\amxmodx\scripting\amxxpc.exe W Deafult Output directory wybieramy ścieżke gdzie mają się zapisywać pliki *.amxx.
    I Gotowe! Mamy program do pisania i dobrze skonfigurowany kompilator! Gdy skonczysz edytować lub pisać jakiś plugin, aby skompilować należy wcisnąć przycisk F9 lub na górze kliknąć Compile>Compile. 
    Jeśli pobieramy biblioteki tak jak np. ColorChat to wrzucamy je do cstrike>addons>amxmodx>scripting>include.
     
    Zaczynamy pisać
    Włączamy amxx_studio i klikamy File>new>empty plugin. Naszym oczom powinno się ukazać
    Po kolei tłumaczę. #include <amxmodx> - Podstawowa biblioteka zawierajaca podstawowe funkcje.
    #define PLUGIN "New Plug-In" - Define lubie tak śmiesznie na nie mówić - zmienna niezmienna  Jak widzimy w register_plugin zamiast nazwy pluginu jest PLUGIN. Przy kompilacji kompilator podmienia PLUGIN na "new Plug-In" Najczęściej jest to wykorzystywane przy pluginach które korzystają z jakiejś flagi admina a dla wygody uzytkownika robi się #define ADMIN_FLAG ADMIN_CHAT i jeśli w jakiejś funkcji bedziemy chcieli sprawdzić czy gracz ma flage ADMIN_FLAG to zamieni nam to na ADMIN_CHAT dzięki czemu będziemy sprawdzać czy gracz ma ADMIN_CHAT. Po co takei babranie? Po to żeby przy 2000 linijkach nie szukać i nie podmieniać flagi tylko wejść sobie na początek, zmienić, skompilować i wrzucić na serwer. 
    No to spróbujemy sobie zrobić powitanie na serwerze. Do tego potrzebujemy funkcji forward która będzie wyłapywała graczy ktorzy wchodzą na serwer. Istnieją dwie funkcje które nam to umożliwiają:
    client_putinserver(id) client_connect(id) Czym się różnią? Pierwsza wywołuje się gdy gracz wejdzie na serwer, czyli będzie miał do wyboru team. Druga wywołuje się przy kliknieciu connect! Przez co niemożliwe jest pobieranie takich danych przez tą funkcje jak uprawnienia, ponieważ one się dopiero załadują. Do tych celów używamy client_putinserver(id) My możemy sobie użyć client_connect(id) gdyż pobieramy tylko nick gracza który nie jest narzucany przez serwer i nie musi się ładować, ale wtedy może zaistnieć taka sytuacja, że wszyscy już go przywitają a on dopiero wejdzie na serwer, ponieważ np. będzie mu się długo ładowało  Wiec używamy client_putinserver(id).
    Pod } od plugin_init dopisujemy:
    public client_putinserver(id){ } Teraz przydało by się pobrać nick gracza którego chcemy przywitać, więc używamy funkcji get_user_name(id, name[], len). Już pędze z wyjaśnieniami. id - Jak wiadomo id gracza który wszedl na serwer.  name[] - nazwa zmiennej do której chcemy zapisać nick tego gracza oraz len - długość tej zmiennej. Teraz trzeba wyświetlić gdzieś te powitanie. Najlepiej do tego posłuży HUD. samodzielne konfigurowanie tego nie należy do najprzymeniejszych rzeczy wiec polecam w amxxstudio: Generators>hudmessage generator i wybranie sobie koloru i pozycji. Następnei formatujemy wiadomość. Powinno to wyglądać mniej więcej tak:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     show_hudmessage(id, "Witamy %s na serwerze!", name) } To może teraz sprawdzimy czy gracz jest vipem i odpowiednio napisać. Założymy, że VIP jest na flage t czyli w kodzie będzie to ADMIN_LEVEL_H (pełny link do tego: -> Klik <-)
    Więc robimy odpowiednie ify, czyli będzie to mniej więcej cos takiego:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     if(get_user_flags(id) & ADMIN_LEVEL_H)         show_hudmessage(0, "[VIP]Witamy %s na serwerze!", name)     else         show_hudmessage(0, "Witamy %s na serwerze!", name)     }     W funkcji show_hudmessage pierwszy argument "0" powoduje wysłanie do każdego gracza. Można też zrobić to w pętli gdy funkcja nie ma takiej możliwości.
     
    Całość:
     
     
    Zdaje sobie sprawe, że jest to mało, lecz pisanei tego poradnika troche mi zajeło. Ja wiem, że nie jestem w tym jakiś wybitny a co dopiero idealny, więc zapewne jakieś błędy się wkradły. No niestety, wszyscy jestesmy ludźmi, mam nadzieje że mi wybaczycie i uszanujecie mój czas włożony w ten poradnik, który napisałem dla Multi-Head.pl i proszę o uszanowanie tego i nie przywłaszczanie/kopiowanie na inne fora.
  15. Lubię to
     klqs otrzymał reputację od 5g_KoLoSPodstawy amxx   
    Cześć. Nie zauważyłem na tym forum jakiegoś dużego grona osób, które potrafią cokolwiek w amxx, więc postanowiłem się z Wami podzielić moją niewielką wiedzą. Będę się starał opisać wszystko najprościej jak potrafię, aby każdy kto chce, mógł to zrozumieć. Od razu mówię, że moje słownictwo tj. nazywanie konkretnych rzeczy nie będzie idealne i fachowe. Jest to spowodowane tym, że jestem samoukiem i nie wkuwałem teorii na pamięć tylko pobierałem pluginy i próbowałem rozgryźć jak to wszystko działa. 
    Co to wgl jest jak się do tego zabrać.
    AMXX (AMX Mod X - ulepszona i rozwijana wersja AMX Mod).
    Na tym opiera się praktycznie każdy serwer w 1.6 (z wyłączeniem mixów etc.). To dzięki temu wszystkie pluginy działają. W to zagadnienie nie ma potrzeby się głęboko zagłębiać. 
    Pliki *.sma i *.amxx.
    Zapewne nie raz o tym słyszeliście. Pierw pliki *.sma - Wszystkie projekty (tj. pluginy, silniki) w wersji możliwej do rozczytania przez człowieka są zapisywane właśnie w takim rozszerzeniu. Po co ono jest? Otóż gdy chcemy chociażby edytować istniejący już plugin to edytujemy właśnie plik *.sma. Gdy już skończymy prace, specjalnym kompilatorem który opisze później zamieniamy ten plik *.sma na plik *.amxx. Po co coś takiego robimy? AMXX rozpoznaje tylko pliki *.amxx. Do rozczytania przez człowieka są chyba niemożliwe. Kompilator zamienia to kolokwialnie mówiąc z "języka ludzkiego na język komputera". Ważne! Każdy plik *.sma można zamienić na *.amxx bez większego problemu (oczywiscie gdy nie występują errory, przy warningach kompiluje lecz zazwyczaj dana część kodu nie działa). W drugą strone jest większy problem. Istnieją dekompilatory (przeciwienstwa kompilatorów) które robią dokładnie odwrotną akcje. Niestety, nie są one zbyt dokładne. Często bywa, że większość część kodu jest nierozszyfrowana, a istnieją nawet metody które całkowicie uniemożliwiają dekompilacje. Mam nadzieje, że zrozumieliście, że pliki *.sma w FTP serwera są potrzebne tylko i wyłącznie w razie konieczności sprawdzenia działania pluginu/edycji etc., czyli z FTP można całkowicie wywalić folder "Scriptings", w którym znajdują się pliki *.sma oraz bilbioteki (o których będzie niżej) 
    Kompilacja.
    Myślę, że każdy kto prowadzi/ł serwer słyszał o czymś takim. Jest to jak już wyżej pisałem, zamiana pliku *.sma na *.amxx. Istnieją tak jakby dwie kompilacje:  lokalna i online, czym się różnią? Lokalna - kompilujemy naszym programem w którym najczęściej piszemy (w moim przypadku jest to amxx_studio, istnieje też możliwość pisania i kompilowania w notepad++ lecz to wymaga większego trudu. Można poszukać poradniki na internecie jak to zrobić.), a pliki *.amxx odrazu zapisują nam się w ustalonym miejscu na komputerze. Online - Przykładowy kompilator online: amxx.pl/kompilator. Wrzucamy tam kod albo uploadujemy plik *.sma, kompiluje a my musimy pobrać plik *.amxx który oczywiscie zapisuje się tam gdzie zapisują się pobierane pliki przez przeglądarke/ustalonym miejscu.
    Biblioteki.
    Chyba najczęsciej używaną biblioteką która nie jest domyślnie w amxx jest ColorChat. Co to takiego? Gdy piszemy to w kodzie wykorzystujemy funkcje. Zaincludowanie czyli pokazanie kompilatorowi, że ma użyć tej biblioteki, w kodzie to wygląda:
    #include <ColorChat> . Dzięki temu możemy używać funkcji które ta biblioteka zawiera, w tym przypadku jest to jedna, bardzo przydatna funkcja która pozwala w łatwy sposób kolorować wiadomosci wysyłane przez serwer (plugin) do gracza. Oczywiście, można zamiast includować to wrzucić umiejętnie to do kodu i wtedy nie trzeba - tylko po co, skoro tak jest szybciej i prościej. Biblioteki mają rozszerzenie zwykłe .inc
    Funkcje.
    Niestety, funkcje to rzecz które trzeba się nauczyć na pamięć, jednakże ich nazwy są na tyle intuicyjne, a jeśli dobrze skonfigurujemy nasz program do pisania który nam będzie podpowiadał składnie danej funkcji to z używaniem ich nie będzie większego problemu. Spis wszystkich dostepnych znajduje się tu: -> Klik <- po Polsku, a po Angielsku (więcej informacji) -> Klik <- 
    Funkcje forward. Wywoływane są one gdy się stanie coś konkretnego. Konkretniej: przykładem takiej funkcji jest 
    public plugin_init(){ //code } "public" przed funkcją jest oznajmieniem że jest to forward. Zamiast //code wpisujemy kod który w przypadku tej funkcji wykona się przy załadowaniu mapy. Używana jest ona zazwyczaj do rejestrowania pluginu (autor, wersja, nazwa), rejestrowania komend, cvarów (niżej) etc.
    Funkcje natywne. Można je umieścić np. w funkcjach forward. Przykładem takiego użycia byłoby:
    public plugin_init(){     register_plugin("Nazwa", "Wersja", "Autor"); } Po czymś takim po wpisaniu komendy amx_plugins byłby nasz plugin, nazywał by się Nazwa, przy wersji by pisało Wersja a jako autor byłby podany Autor. Po prostu rejestracja pluginu.
    Cvary.
    Najprosciej mówiąc - coś co pozwala nam sterowac pluginem przy pomocy komend/ustawien w amxx.cfg (w ftp serwera). Do zmieniania ich ustawien z poziomu admina na serwerze (oczywiscie z odpowiednimi flagami) uzywamy komendy amx_cvar. Cvary trzeba zarejestrować tam gdzie plugin, czyli w plugin_init.
    Zmienne.
    Zmienne dodajemy poprzedzajac je wyrazem "new". Służą do przechowywania, edytowania i odczytywania danych. Przykłady takich zmiennych to 
    new Zmienna //Może przechowywać max 1 literke/liczbe czyli np: "A", "a", "x" albo "1", "13", "69" etc.  new Zmienna[32] //Może przechowywać 32 literki/cyfry. Jak to działa? Każdy taki [1] to jest jedna zmienna, czyli można było by to zapisać new Zmienna0, new Zmienna1 itd. Ostatnia (32) jest to znak kończący, którego się nie edytuje czyli jak mamy 32 to mozemy wykonać operacje Zmienna[1] = 69 albo Zmienna[31] = 69.  new Float:Zmienna // Przechowuje liczby zmiennoprzecinkowe czyli np "1.69", "6.9" "1.141561" itd. Może występować również jako new Float:Zmienna[32] wtedy jest dokładnie jak przypadek wyżej new bool:Zmienna //Może ona tylko być jak true/false (True = 1, false = 0).  Formatowanie zmiennych. Dokładnie o znakach powiem niżej, ale zmienne po zadeklarowaniu na początku czyli np przed plugin_init można edytować/odczytywać w całym pluginie, czyli gdziekolwiek można napisać
    Zmienna = 1 lub
    if(zmienna == 1) Pierwszy przypadek ustawia Zmiennej wartość 1, drugi sprawdza czy zmienna równa się 1, jesli nie to zwraca 0, jeśli tak to zwraca 1.
     
    Operatory.
    W większości używane w funkcji if, for lub while oraz przy działaniach.
    a == b - Sprawdza czy lewa równa się prawej - jeśli tak zwraca 1, jeśli nie zwraca 0 a = b - Zmienna a przyjmuje wartość b, czyli jeśli b było równe 5 to a teraz tez jest równe 5 a < b - Jesli a jest mniejsze od b - zwraca 1, jeśli nie zwraca 0 a <= b - Jesli a jest mniejsze lub równe b - zwraca 1, jeśli nie zwraca 0 a != b - Jeśli a jest różne od b - zwraca 1, jeśli nie zwraca 0 a+b - a dodać b a+=5 - a dodać 5 a-b - a odjąć b a-=5 - a odjąć 5 a*b - a razy b a*=5 - to samo co a=a*5 a/b - a podzielone przez b a/=5 - to to samo co a=a/5 a%2 - zwrócenie reszty z dzielenia (przykład: 5%2 - zwróci nam 1) a++ - a użyte a potem zwiększone o 1 ++a - a zwiększone o jeden i dopeiro użyte a-- - a uzyte a potem zmniejszone o 1 --a - a zmniejszone o 1 a potem użyte is_user_connected(id) && is_user_alive(id) - jeśli jest połączony i żywy zwróci 1, jeśli nie jest żywy/nie jest połączony lub oba warunki są fałszywe to zwraca 0 is_user_connected(id) || is_user_alive(id) - jeśli jest połączony lub żywy zwróci 1, jesli żadne z tych zwróci 0. UWAGA!!
    7.0/3 = 3.5 7/3 = 3 Istnieje tez znak "?" Sprawdza on czy wartość po jego lewej jest 1, jeśli tak to wykona sie pierwszy argument, jeśli nie to drugi. Praktyka:
    is_user_alive(id) ? "Jest zywy" : "Jest martwy" Pętle oraz warunek if.
    Zawarty w nich kod wykona się określona ilość razy albo zanim zostanie wykonany wykona się sprawdzenie. Istnieja 3 pętle, trzeciej za bardzo nie rozumiem więc opisze dwie ktore się używa, jej jeszcze nie widziałem żeby ktoś uzywał, a nazywa się "do,while".
    Warunek if - sprawdza czy wyrażenie w nim jest prawdziwe (1) czy fałszywe (0) i zwraca odpowiednią cyfre. Praktyka:
    if(is_user_alive(id)){     user_kill(id) } Jeśli gracz jest zywy, zwróci 1 po czym wykona się zawarty w nim kod, czyli gracz zostanie zabity, jeśli gracz nie zyje, kod zostanei pominięty. Jeśli zostanei pominięty - czyli gracz będzie martwy, a chcemy sprawdzić skoro jest martwy to czy może jest w SPECT wiec robimy:
    if(is_user_alive(id){     user_kill(id)(id) } else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3){     cs_set_user_team(id, random(1,2)) } Juz tłumacze i objaśniam: Jak można wyczytać z dokumentacji -> Klik <- funkcja cs_get_uset_team zwraca 0 jeśli gracz nie wybrał drużyny lub 3 jesli jest na spect, więc w warunku if sprawdzamy czy jest 0 lub 3. Jeśli tak, przenosimy go do losowego teamu. W 2 argumencie funkcji cs_set_user_team wybieramy team do którego ma go przenieść. Funkcja random(1,2) losuje liczbe od 1 do 2 czyli 1 = TT, 2 = CT. Gdyby zamiast else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3) dać samo else to kod wykonał by się gdyby w pierwszym if gracz był martwy.
    Pętla for. Jest to jak sama nazwa mówi, pętla, w której kod będzie się wykonywał do pewnego momentu.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) break; } Jak widać, tworzymy zmienną i która po każdej pętli się zwieksza o 1 aż do maksymalnej ilości graczy która jest pobierana funkcją get_maxplayers(). Jak to wyglada? for(NOWA ZMIENNA; KIEDY MA SIĘ PĘTLA SKOŃCZYĆ; CO MA SIĘ ZROBIĆ PO SKOŃCZENIU PĘTLI). W pętlach między argumentami nie używamy "," tylko ";" W środku pętli: Jeśli użytkownik o id = zmiennej i jest adminem to pętla się kończy czyli dzieje się tak jakby i doszło do maksymalnej ilości graczy. Po co to? Gdy chcemy np znaleźć jednego admina i wyświetlić go komuś, wtedy po ifie a przed breakiem wysyłamy komuś wiadomosć.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) continue;     user_kill(i) //TEN KOD SIE NIE WYKONA JESLI GRACZ JEST ADMINEM, ALE PĘTLA BĘDZIE SPRAWDZAŁA DALEJ } Jeśli gracz o id = zmiennej i jest adminem to jest to pomijane i traktowane jakby pętla się skończyła, reszta kodu wtedy nie jest brane pod uwage
    Pętla while, podobna do for jednak w jej "wnętrzu" (nawiasach) nie tworzymy zmiennej.
    while(1==2){ //kod } Taka pętla nigdy się nie skończy ponieważ nigdy 1 nie będzie się równało 2.
    new zmienna new id=1 while(zmienna==5){ if(is_user_alive(id++)) zmienna++ } Ta pętla skończy się gdy będzie żyło 5 graczy
    Formatowanie.
    Czyli podmienianie np wyświetlanej wiadomosci do gracza. Załóżmy, że chcemy mu wysłać ile jest graczy online. W takim przypadku nie możemy wklepać na sztywno do kodu że jest 32 bo mijałoby się to z prawdą, dlatego robimy:
    client_print(id, print_center, "Na serwerze jest %d graczy!", ilosc_graczy) Gdzie ilosc_graczy to zmienna do której wcześniej zapisaliśmy liczbe graczy.
    Znaki formatujace:
    %s - string (ciag znaków) czyli np. "bober", "krowa", "elo" etc. %d lub %i - Liczba, czyli np "5", "15", "30". %f - float - liczba zmiennoprzecinkowa czyli np "1.3", "6.9" itd. Czasami będziemy chcieli wyświetlić tylko np. 2 cyfry po przecinku, taki problem wystepował swego czasu na niektorych codmodach gdzie po zmienieniu wymaganego doświadczenia na % wychodzilo im coś w stylu 50.4112308501%. Aby temu zapobierać zamiast %f piszemy %0.2f i wtedy wyświetli 2 cyfry po przecinku. Jeśli chcemy 5 cyfr to piszemy %0.5f. To są te najpotrzebniejsze, reszty się praktrycznie nie używa. Jeśli chcemy w jednej funkcji dodac kilka stringów to robimy to po prostu w kolejności. Jeśli chcemy wysłać zwykły znak % musimy go napisac podwójnie, czyli %%:
    client_print(id, print_center, "Na serwerze jest %d graczy, godzine temu było %d graczy a za 5 lat na 50%% bedzie %d graczy", ilosc_graczy, ilosc_graczy1hago, ilosc_graczy5y) To nam wyświetli np: "Na serwerze jest 20 graczy, godzine temu bylo 15, a za 5 lat na 50% bedzie 0 graczy"
    Dokładna rozpiska znajduje się tu: 
     
    Może w końcu po tej nudnej teorii się czymś zajmiemy? Pasowało by ogarnąć jakiś program do pisania. W tym celu pobieramy z tej strony -> Klik <-  AMX Mod X Full Installer, odpalamy go i instalujemy jak zwykły program. Potem wchodzimy w zainstalowany folder i uruchamiamy Installer.
    Klikamy Next, next, wybieramy select mod directory - next, wybieramy ścieżkę do cstrike, poniżej "Custome game addon:" wybieramy Counter-Strike i instalujemy wszystko. Teraz wracamy się do folderu w którym znajdował się pliczek Installer i wchodzimy w amxxstudio>AMXX_studio. Tam wchodzimy w Tools>settings>Compiler>Compiler settings i w Compiler (amxxpc.exe) ustalamy ścieżko do pliku amxxpc.exe który znajduje się w cstrike>addons>amxmodx>scripting. W moim przypadku jest to 
    D:\Program Files (x86)\Steam\steamapps\common\Half-Life\cstrike\addons\amxmodx\scripting\amxxpc.exe W Deafult Output directory wybieramy ścieżke gdzie mają się zapisywać pliki *.amxx.
    I Gotowe! Mamy program do pisania i dobrze skonfigurowany kompilator! Gdy skonczysz edytować lub pisać jakiś plugin, aby skompilować należy wcisnąć przycisk F9 lub na górze kliknąć Compile>Compile. 
    Jeśli pobieramy biblioteki tak jak np. ColorChat to wrzucamy je do cstrike>addons>amxmodx>scripting>include.
     
    Zaczynamy pisać
    Włączamy amxx_studio i klikamy File>new>empty plugin. Naszym oczom powinno się ukazać
    Po kolei tłumaczę. #include <amxmodx> - Podstawowa biblioteka zawierajaca podstawowe funkcje.
    #define PLUGIN "New Plug-In" - Define lubie tak śmiesznie na nie mówić - zmienna niezmienna  Jak widzimy w register_plugin zamiast nazwy pluginu jest PLUGIN. Przy kompilacji kompilator podmienia PLUGIN na "new Plug-In" Najczęściej jest to wykorzystywane przy pluginach które korzystają z jakiejś flagi admina a dla wygody uzytkownika robi się #define ADMIN_FLAG ADMIN_CHAT i jeśli w jakiejś funkcji bedziemy chcieli sprawdzić czy gracz ma flage ADMIN_FLAG to zamieni nam to na ADMIN_CHAT dzięki czemu będziemy sprawdzać czy gracz ma ADMIN_CHAT. Po co takei babranie? Po to żeby przy 2000 linijkach nie szukać i nie podmieniać flagi tylko wejść sobie na początek, zmienić, skompilować i wrzucić na serwer. 
    No to spróbujemy sobie zrobić powitanie na serwerze. Do tego potrzebujemy funkcji forward która będzie wyłapywała graczy ktorzy wchodzą na serwer. Istnieją dwie funkcje które nam to umożliwiają:
    client_putinserver(id) client_connect(id) Czym się różnią? Pierwsza wywołuje się gdy gracz wejdzie na serwer, czyli będzie miał do wyboru team. Druga wywołuje się przy kliknieciu connect! Przez co niemożliwe jest pobieranie takich danych przez tą funkcje jak uprawnienia, ponieważ one się dopiero załadują. Do tych celów używamy client_putinserver(id) My możemy sobie użyć client_connect(id) gdyż pobieramy tylko nick gracza który nie jest narzucany przez serwer i nie musi się ładować, ale wtedy może zaistnieć taka sytuacja, że wszyscy już go przywitają a on dopiero wejdzie na serwer, ponieważ np. będzie mu się długo ładowało  Wiec używamy client_putinserver(id).
    Pod } od plugin_init dopisujemy:
    public client_putinserver(id){ } Teraz przydało by się pobrać nick gracza którego chcemy przywitać, więc używamy funkcji get_user_name(id, name[], len). Już pędze z wyjaśnieniami. id - Jak wiadomo id gracza który wszedl na serwer.  name[] - nazwa zmiennej do której chcemy zapisać nick tego gracza oraz len - długość tej zmiennej. Teraz trzeba wyświetlić gdzieś te powitanie. Najlepiej do tego posłuży HUD. samodzielne konfigurowanie tego nie należy do najprzymeniejszych rzeczy wiec polecam w amxxstudio: Generators>hudmessage generator i wybranie sobie koloru i pozycji. Następnei formatujemy wiadomość. Powinno to wyglądać mniej więcej tak:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     show_hudmessage(id, "Witamy %s na serwerze!", name) } To może teraz sprawdzimy czy gracz jest vipem i odpowiednio napisać. Założymy, że VIP jest na flage t czyli w kodzie będzie to ADMIN_LEVEL_H (pełny link do tego: -> Klik <-)
    Więc robimy odpowiednie ify, czyli będzie to mniej więcej cos takiego:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     if(get_user_flags(id) & ADMIN_LEVEL_H)         show_hudmessage(0, "[VIP]Witamy %s na serwerze!", name)     else         show_hudmessage(0, "Witamy %s na serwerze!", name)     }     W funkcji show_hudmessage pierwszy argument "0" powoduje wysłanie do każdego gracza. Można też zrobić to w pętli gdy funkcja nie ma takiej możliwości.
     
    Całość:
     
     
    Zdaje sobie sprawe, że jest to mało, lecz pisanei tego poradnika troche mi zajeło. Ja wiem, że nie jestem w tym jakiś wybitny a co dopiero idealny, więc zapewne jakieś błędy się wkradły. No niestety, wszyscy jestesmy ludźmi, mam nadzieje że mi wybaczycie i uszanujecie mój czas włożony w ten poradnik, który napisałem dla Multi-Head.pl i proszę o uszanowanie tego i nie przywłaszczanie/kopiowanie na inne fora.
  16. Lubię to
     klqs otrzymał reputację od  SQNFUNPodstawy amxx   
    Cześć. Nie zauważyłem na tym forum jakiegoś dużego grona osób, które potrafią cokolwiek w amxx, więc postanowiłem się z Wami podzielić moją niewielką wiedzą. Będę się starał opisać wszystko najprościej jak potrafię, aby każdy kto chce, mógł to zrozumieć. Od razu mówię, że moje słownictwo tj. nazywanie konkretnych rzeczy nie będzie idealne i fachowe. Jest to spowodowane tym, że jestem samoukiem i nie wkuwałem teorii na pamięć tylko pobierałem pluginy i próbowałem rozgryźć jak to wszystko działa. 
    Co to wgl jest jak się do tego zabrać.
    AMXX (AMX Mod X - ulepszona i rozwijana wersja AMX Mod).
    Na tym opiera się praktycznie każdy serwer w 1.6 (z wyłączeniem mixów etc.). To dzięki temu wszystkie pluginy działają. W to zagadnienie nie ma potrzeby się głęboko zagłębiać. 
    Pliki *.sma i *.amxx.
    Zapewne nie raz o tym słyszeliście. Pierw pliki *.sma - Wszystkie projekty (tj. pluginy, silniki) w wersji możliwej do rozczytania przez człowieka są zapisywane właśnie w takim rozszerzeniu. Po co ono jest? Otóż gdy chcemy chociażby edytować istniejący już plugin to edytujemy właśnie plik *.sma. Gdy już skończymy prace, specjalnym kompilatorem który opisze później zamieniamy ten plik *.sma na plik *.amxx. Po co coś takiego robimy? AMXX rozpoznaje tylko pliki *.amxx. Do rozczytania przez człowieka są chyba niemożliwe. Kompilator zamienia to kolokwialnie mówiąc z "języka ludzkiego na język komputera". Ważne! Każdy plik *.sma można zamienić na *.amxx bez większego problemu (oczywiscie gdy nie występują errory, przy warningach kompiluje lecz zazwyczaj dana część kodu nie działa). W drugą strone jest większy problem. Istnieją dekompilatory (przeciwienstwa kompilatorów) które robią dokładnie odwrotną akcje. Niestety, nie są one zbyt dokładne. Często bywa, że większość część kodu jest nierozszyfrowana, a istnieją nawet metody które całkowicie uniemożliwiają dekompilacje. Mam nadzieje, że zrozumieliście, że pliki *.sma w FTP serwera są potrzebne tylko i wyłącznie w razie konieczności sprawdzenia działania pluginu/edycji etc., czyli z FTP można całkowicie wywalić folder "Scriptings", w którym znajdują się pliki *.sma oraz bilbioteki (o których będzie niżej) 
    Kompilacja.
    Myślę, że każdy kto prowadzi/ł serwer słyszał o czymś takim. Jest to jak już wyżej pisałem, zamiana pliku *.sma na *.amxx. Istnieją tak jakby dwie kompilacje:  lokalna i online, czym się różnią? Lokalna - kompilujemy naszym programem w którym najczęściej piszemy (w moim przypadku jest to amxx_studio, istnieje też możliwość pisania i kompilowania w notepad++ lecz to wymaga większego trudu. Można poszukać poradniki na internecie jak to zrobić.), a pliki *.amxx odrazu zapisują nam się w ustalonym miejscu na komputerze. Online - Przykładowy kompilator online: amxx.pl/kompilator. Wrzucamy tam kod albo uploadujemy plik *.sma, kompiluje a my musimy pobrać plik *.amxx który oczywiscie zapisuje się tam gdzie zapisują się pobierane pliki przez przeglądarke/ustalonym miejscu.
    Biblioteki.
    Chyba najczęsciej używaną biblioteką która nie jest domyślnie w amxx jest ColorChat. Co to takiego? Gdy piszemy to w kodzie wykorzystujemy funkcje. Zaincludowanie czyli pokazanie kompilatorowi, że ma użyć tej biblioteki, w kodzie to wygląda:
    #include <ColorChat> . Dzięki temu możemy używać funkcji które ta biblioteka zawiera, w tym przypadku jest to jedna, bardzo przydatna funkcja która pozwala w łatwy sposób kolorować wiadomosci wysyłane przez serwer (plugin) do gracza. Oczywiście, można zamiast includować to wrzucić umiejętnie to do kodu i wtedy nie trzeba - tylko po co, skoro tak jest szybciej i prościej. Biblioteki mają rozszerzenie zwykłe .inc
    Funkcje.
    Niestety, funkcje to rzecz które trzeba się nauczyć na pamięć, jednakże ich nazwy są na tyle intuicyjne, a jeśli dobrze skonfigurujemy nasz program do pisania który nam będzie podpowiadał składnie danej funkcji to z używaniem ich nie będzie większego problemu. Spis wszystkich dostepnych znajduje się tu: -> Klik <- po Polsku, a po Angielsku (więcej informacji) -> Klik <- 
    Funkcje forward. Wywoływane są one gdy się stanie coś konkretnego. Konkretniej: przykładem takiej funkcji jest 
    public plugin_init(){ //code } "public" przed funkcją jest oznajmieniem że jest to forward. Zamiast //code wpisujemy kod który w przypadku tej funkcji wykona się przy załadowaniu mapy. Używana jest ona zazwyczaj do rejestrowania pluginu (autor, wersja, nazwa), rejestrowania komend, cvarów (niżej) etc.
    Funkcje natywne. Można je umieścić np. w funkcjach forward. Przykładem takiego użycia byłoby:
    public plugin_init(){     register_plugin("Nazwa", "Wersja", "Autor"); } Po czymś takim po wpisaniu komendy amx_plugins byłby nasz plugin, nazywał by się Nazwa, przy wersji by pisało Wersja a jako autor byłby podany Autor. Po prostu rejestracja pluginu.
    Cvary.
    Najprosciej mówiąc - coś co pozwala nam sterowac pluginem przy pomocy komend/ustawien w amxx.cfg (w ftp serwera). Do zmieniania ich ustawien z poziomu admina na serwerze (oczywiscie z odpowiednimi flagami) uzywamy komendy amx_cvar. Cvary trzeba zarejestrować tam gdzie plugin, czyli w plugin_init.
    Zmienne.
    Zmienne dodajemy poprzedzajac je wyrazem "new". Służą do przechowywania, edytowania i odczytywania danych. Przykłady takich zmiennych to 
    new Zmienna //Może przechowywać max 1 literke/liczbe czyli np: "A", "a", "x" albo "1", "13", "69" etc.  new Zmienna[32] //Może przechowywać 32 literki/cyfry. Jak to działa? Każdy taki [1] to jest jedna zmienna, czyli można było by to zapisać new Zmienna0, new Zmienna1 itd. Ostatnia (32) jest to znak kończący, którego się nie edytuje czyli jak mamy 32 to mozemy wykonać operacje Zmienna[1] = 69 albo Zmienna[31] = 69.  new Float:Zmienna // Przechowuje liczby zmiennoprzecinkowe czyli np "1.69", "6.9" "1.141561" itd. Może występować również jako new Float:Zmienna[32] wtedy jest dokładnie jak przypadek wyżej new bool:Zmienna //Może ona tylko być jak true/false (True = 1, false = 0).  Formatowanie zmiennych. Dokładnie o znakach powiem niżej, ale zmienne po zadeklarowaniu na początku czyli np przed plugin_init można edytować/odczytywać w całym pluginie, czyli gdziekolwiek można napisać
    Zmienna = 1 lub
    if(zmienna == 1) Pierwszy przypadek ustawia Zmiennej wartość 1, drugi sprawdza czy zmienna równa się 1, jesli nie to zwraca 0, jeśli tak to zwraca 1.
     
    Operatory.
    W większości używane w funkcji if, for lub while oraz przy działaniach.
    a == b - Sprawdza czy lewa równa się prawej - jeśli tak zwraca 1, jeśli nie zwraca 0 a = b - Zmienna a przyjmuje wartość b, czyli jeśli b było równe 5 to a teraz tez jest równe 5 a < b - Jesli a jest mniejsze od b - zwraca 1, jeśli nie zwraca 0 a <= b - Jesli a jest mniejsze lub równe b - zwraca 1, jeśli nie zwraca 0 a != b - Jeśli a jest różne od b - zwraca 1, jeśli nie zwraca 0 a+b - a dodać b a+=5 - a dodać 5 a-b - a odjąć b a-=5 - a odjąć 5 a*b - a razy b a*=5 - to samo co a=a*5 a/b - a podzielone przez b a/=5 - to to samo co a=a/5 a%2 - zwrócenie reszty z dzielenia (przykład: 5%2 - zwróci nam 1) a++ - a użyte a potem zwiększone o 1 ++a - a zwiększone o jeden i dopeiro użyte a-- - a uzyte a potem zmniejszone o 1 --a - a zmniejszone o 1 a potem użyte is_user_connected(id) && is_user_alive(id) - jeśli jest połączony i żywy zwróci 1, jeśli nie jest żywy/nie jest połączony lub oba warunki są fałszywe to zwraca 0 is_user_connected(id) || is_user_alive(id) - jeśli jest połączony lub żywy zwróci 1, jesli żadne z tych zwróci 0. UWAGA!!
    7.0/3 = 3.5 7/3 = 3 Istnieje tez znak "?" Sprawdza on czy wartość po jego lewej jest 1, jeśli tak to wykona sie pierwszy argument, jeśli nie to drugi. Praktyka:
    is_user_alive(id) ? "Jest zywy" : "Jest martwy" Pętle oraz warunek if.
    Zawarty w nich kod wykona się określona ilość razy albo zanim zostanie wykonany wykona się sprawdzenie. Istnieja 3 pętle, trzeciej za bardzo nie rozumiem więc opisze dwie ktore się używa, jej jeszcze nie widziałem żeby ktoś uzywał, a nazywa się "do,while".
    Warunek if - sprawdza czy wyrażenie w nim jest prawdziwe (1) czy fałszywe (0) i zwraca odpowiednią cyfre. Praktyka:
    if(is_user_alive(id)){     user_kill(id) } Jeśli gracz jest zywy, zwróci 1 po czym wykona się zawarty w nim kod, czyli gracz zostanie zabity, jeśli gracz nie zyje, kod zostanei pominięty. Jeśli zostanei pominięty - czyli gracz będzie martwy, a chcemy sprawdzić skoro jest martwy to czy może jest w SPECT wiec robimy:
    if(is_user_alive(id){     user_kill(id)(id) } else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3){     cs_set_user_team(id, random(1,2)) } Juz tłumacze i objaśniam: Jak można wyczytać z dokumentacji -> Klik <- funkcja cs_get_uset_team zwraca 0 jeśli gracz nie wybrał drużyny lub 3 jesli jest na spect, więc w warunku if sprawdzamy czy jest 0 lub 3. Jeśli tak, przenosimy go do losowego teamu. W 2 argumencie funkcji cs_set_user_team wybieramy team do którego ma go przenieść. Funkcja random(1,2) losuje liczbe od 1 do 2 czyli 1 = TT, 2 = CT. Gdyby zamiast else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3) dać samo else to kod wykonał by się gdyby w pierwszym if gracz był martwy.
    Pętla for. Jest to jak sama nazwa mówi, pętla, w której kod będzie się wykonywał do pewnego momentu.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) break; } Jak widać, tworzymy zmienną i która po każdej pętli się zwieksza o 1 aż do maksymalnej ilości graczy która jest pobierana funkcją get_maxplayers(). Jak to wyglada? for(NOWA ZMIENNA; KIEDY MA SIĘ PĘTLA SKOŃCZYĆ; CO MA SIĘ ZROBIĆ PO SKOŃCZENIU PĘTLI). W pętlach między argumentami nie używamy "," tylko ";" W środku pętli: Jeśli użytkownik o id = zmiennej i jest adminem to pętla się kończy czyli dzieje się tak jakby i doszło do maksymalnej ilości graczy. Po co to? Gdy chcemy np znaleźć jednego admina i wyświetlić go komuś, wtedy po ifie a przed breakiem wysyłamy komuś wiadomosć.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) continue;     user_kill(i) //TEN KOD SIE NIE WYKONA JESLI GRACZ JEST ADMINEM, ALE PĘTLA BĘDZIE SPRAWDZAŁA DALEJ } Jeśli gracz o id = zmiennej i jest adminem to jest to pomijane i traktowane jakby pętla się skończyła, reszta kodu wtedy nie jest brane pod uwage
    Pętla while, podobna do for jednak w jej "wnętrzu" (nawiasach) nie tworzymy zmiennej.
    while(1==2){ //kod } Taka pętla nigdy się nie skończy ponieważ nigdy 1 nie będzie się równało 2.
    new zmienna new id=1 while(zmienna==5){ if(is_user_alive(id++)) zmienna++ } Ta pętla skończy się gdy będzie żyło 5 graczy
    Formatowanie.
    Czyli podmienianie np wyświetlanej wiadomosci do gracza. Załóżmy, że chcemy mu wysłać ile jest graczy online. W takim przypadku nie możemy wklepać na sztywno do kodu że jest 32 bo mijałoby się to z prawdą, dlatego robimy:
    client_print(id, print_center, "Na serwerze jest %d graczy!", ilosc_graczy) Gdzie ilosc_graczy to zmienna do której wcześniej zapisaliśmy liczbe graczy.
    Znaki formatujace:
    %s - string (ciag znaków) czyli np. "bober", "krowa", "elo" etc. %d lub %i - Liczba, czyli np "5", "15", "30". %f - float - liczba zmiennoprzecinkowa czyli np "1.3", "6.9" itd. Czasami będziemy chcieli wyświetlić tylko np. 2 cyfry po przecinku, taki problem wystepował swego czasu na niektorych codmodach gdzie po zmienieniu wymaganego doświadczenia na % wychodzilo im coś w stylu 50.4112308501%. Aby temu zapobierać zamiast %f piszemy %0.2f i wtedy wyświetli 2 cyfry po przecinku. Jeśli chcemy 5 cyfr to piszemy %0.5f. To są te najpotrzebniejsze, reszty się praktrycznie nie używa. Jeśli chcemy w jednej funkcji dodac kilka stringów to robimy to po prostu w kolejności. Jeśli chcemy wysłać zwykły znak % musimy go napisac podwójnie, czyli %%:
    client_print(id, print_center, "Na serwerze jest %d graczy, godzine temu było %d graczy a za 5 lat na 50%% bedzie %d graczy", ilosc_graczy, ilosc_graczy1hago, ilosc_graczy5y) To nam wyświetli np: "Na serwerze jest 20 graczy, godzine temu bylo 15, a za 5 lat na 50% bedzie 0 graczy"
    Dokładna rozpiska znajduje się tu: 
     
    Może w końcu po tej nudnej teorii się czymś zajmiemy? Pasowało by ogarnąć jakiś program do pisania. W tym celu pobieramy z tej strony -> Klik <-  AMX Mod X Full Installer, odpalamy go i instalujemy jak zwykły program. Potem wchodzimy w zainstalowany folder i uruchamiamy Installer.
    Klikamy Next, next, wybieramy select mod directory - next, wybieramy ścieżkę do cstrike, poniżej "Custome game addon:" wybieramy Counter-Strike i instalujemy wszystko. Teraz wracamy się do folderu w którym znajdował się pliczek Installer i wchodzimy w amxxstudio>AMXX_studio. Tam wchodzimy w Tools>settings>Compiler>Compiler settings i w Compiler (amxxpc.exe) ustalamy ścieżko do pliku amxxpc.exe który znajduje się w cstrike>addons>amxmodx>scripting. W moim przypadku jest to 
    D:\Program Files (x86)\Steam\steamapps\common\Half-Life\cstrike\addons\amxmodx\scripting\amxxpc.exe W Deafult Output directory wybieramy ścieżke gdzie mają się zapisywać pliki *.amxx.
    I Gotowe! Mamy program do pisania i dobrze skonfigurowany kompilator! Gdy skonczysz edytować lub pisać jakiś plugin, aby skompilować należy wcisnąć przycisk F9 lub na górze kliknąć Compile>Compile. 
    Jeśli pobieramy biblioteki tak jak np. ColorChat to wrzucamy je do cstrike>addons>amxmodx>scripting>include.
     
    Zaczynamy pisać
    Włączamy amxx_studio i klikamy File>new>empty plugin. Naszym oczom powinno się ukazać
    Po kolei tłumaczę. #include <amxmodx> - Podstawowa biblioteka zawierajaca podstawowe funkcje.
    #define PLUGIN "New Plug-In" - Define lubie tak śmiesznie na nie mówić - zmienna niezmienna  Jak widzimy w register_plugin zamiast nazwy pluginu jest PLUGIN. Przy kompilacji kompilator podmienia PLUGIN na "new Plug-In" Najczęściej jest to wykorzystywane przy pluginach które korzystają z jakiejś flagi admina a dla wygody uzytkownika robi się #define ADMIN_FLAG ADMIN_CHAT i jeśli w jakiejś funkcji bedziemy chcieli sprawdzić czy gracz ma flage ADMIN_FLAG to zamieni nam to na ADMIN_CHAT dzięki czemu będziemy sprawdzać czy gracz ma ADMIN_CHAT. Po co takei babranie? Po to żeby przy 2000 linijkach nie szukać i nie podmieniać flagi tylko wejść sobie na początek, zmienić, skompilować i wrzucić na serwer. 
    No to spróbujemy sobie zrobić powitanie na serwerze. Do tego potrzebujemy funkcji forward która będzie wyłapywała graczy ktorzy wchodzą na serwer. Istnieją dwie funkcje które nam to umożliwiają:
    client_putinserver(id) client_connect(id) Czym się różnią? Pierwsza wywołuje się gdy gracz wejdzie na serwer, czyli będzie miał do wyboru team. Druga wywołuje się przy kliknieciu connect! Przez co niemożliwe jest pobieranie takich danych przez tą funkcje jak uprawnienia, ponieważ one się dopiero załadują. Do tych celów używamy client_putinserver(id) My możemy sobie użyć client_connect(id) gdyż pobieramy tylko nick gracza który nie jest narzucany przez serwer i nie musi się ładować, ale wtedy może zaistnieć taka sytuacja, że wszyscy już go przywitają a on dopiero wejdzie na serwer, ponieważ np. będzie mu się długo ładowało  Wiec używamy client_putinserver(id).
    Pod } od plugin_init dopisujemy:
    public client_putinserver(id){ } Teraz przydało by się pobrać nick gracza którego chcemy przywitać, więc używamy funkcji get_user_name(id, name[], len). Już pędze z wyjaśnieniami. id - Jak wiadomo id gracza który wszedl na serwer.  name[] - nazwa zmiennej do której chcemy zapisać nick tego gracza oraz len - długość tej zmiennej. Teraz trzeba wyświetlić gdzieś te powitanie. Najlepiej do tego posłuży HUD. samodzielne konfigurowanie tego nie należy do najprzymeniejszych rzeczy wiec polecam w amxxstudio: Generators>hudmessage generator i wybranie sobie koloru i pozycji. Następnei formatujemy wiadomość. Powinno to wyglądać mniej więcej tak:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     show_hudmessage(id, "Witamy %s na serwerze!", name) } To może teraz sprawdzimy czy gracz jest vipem i odpowiednio napisać. Założymy, że VIP jest na flage t czyli w kodzie będzie to ADMIN_LEVEL_H (pełny link do tego: -> Klik <-)
    Więc robimy odpowiednie ify, czyli będzie to mniej więcej cos takiego:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     if(get_user_flags(id) & ADMIN_LEVEL_H)         show_hudmessage(0, "[VIP]Witamy %s na serwerze!", name)     else         show_hudmessage(0, "Witamy %s na serwerze!", name)     }     W funkcji show_hudmessage pierwszy argument "0" powoduje wysłanie do każdego gracza. Można też zrobić to w pętli gdy funkcja nie ma takiej możliwości.
     
    Całość:
     
     
    Zdaje sobie sprawe, że jest to mało, lecz pisanei tego poradnika troche mi zajeło. Ja wiem, że nie jestem w tym jakiś wybitny a co dopiero idealny, więc zapewne jakieś błędy się wkradły. No niestety, wszyscy jestesmy ludźmi, mam nadzieje że mi wybaczycie i uszanujecie mój czas włożony w ten poradnik, który napisałem dla Multi-Head.pl i proszę o uszanowanie tego i nie przywłaszczanie/kopiowanie na inne fora.
  17. Lubię to
     klqs przyznał reputację dla BezziKlops   
    My sie już zdążyliśmy poznać
    Siemka
  18. Serduszko
     klqs otrzymał reputację od `KinG`Podstawy amxx   
    Cześć. Nie zauważyłem na tym forum jakiegoś dużego grona osób, które potrafią cokolwiek w amxx, więc postanowiłem się z Wami podzielić moją niewielką wiedzą. Będę się starał opisać wszystko najprościej jak potrafię, aby każdy kto chce, mógł to zrozumieć. Od razu mówię, że moje słownictwo tj. nazywanie konkretnych rzeczy nie będzie idealne i fachowe. Jest to spowodowane tym, że jestem samoukiem i nie wkuwałem teorii na pamięć tylko pobierałem pluginy i próbowałem rozgryźć jak to wszystko działa. 
    Co to wgl jest jak się do tego zabrać.
    AMXX (AMX Mod X - ulepszona i rozwijana wersja AMX Mod).
    Na tym opiera się praktycznie każdy serwer w 1.6 (z wyłączeniem mixów etc.). To dzięki temu wszystkie pluginy działają. W to zagadnienie nie ma potrzeby się głęboko zagłębiać. 
    Pliki *.sma i *.amxx.
    Zapewne nie raz o tym słyszeliście. Pierw pliki *.sma - Wszystkie projekty (tj. pluginy, silniki) w wersji możliwej do rozczytania przez człowieka są zapisywane właśnie w takim rozszerzeniu. Po co ono jest? Otóż gdy chcemy chociażby edytować istniejący już plugin to edytujemy właśnie plik *.sma. Gdy już skończymy prace, specjalnym kompilatorem który opisze później zamieniamy ten plik *.sma na plik *.amxx. Po co coś takiego robimy? AMXX rozpoznaje tylko pliki *.amxx. Do rozczytania przez człowieka są chyba niemożliwe. Kompilator zamienia to kolokwialnie mówiąc z "języka ludzkiego na język komputera". Ważne! Każdy plik *.sma można zamienić na *.amxx bez większego problemu (oczywiscie gdy nie występują errory, przy warningach kompiluje lecz zazwyczaj dana część kodu nie działa). W drugą strone jest większy problem. Istnieją dekompilatory (przeciwienstwa kompilatorów) które robią dokładnie odwrotną akcje. Niestety, nie są one zbyt dokładne. Często bywa, że większość część kodu jest nierozszyfrowana, a istnieją nawet metody które całkowicie uniemożliwiają dekompilacje. Mam nadzieje, że zrozumieliście, że pliki *.sma w FTP serwera są potrzebne tylko i wyłącznie w razie konieczności sprawdzenia działania pluginu/edycji etc., czyli z FTP można całkowicie wywalić folder "Scriptings", w którym znajdują się pliki *.sma oraz bilbioteki (o których będzie niżej) 
    Kompilacja.
    Myślę, że każdy kto prowadzi/ł serwer słyszał o czymś takim. Jest to jak już wyżej pisałem, zamiana pliku *.sma na *.amxx. Istnieją tak jakby dwie kompilacje:  lokalna i online, czym się różnią? Lokalna - kompilujemy naszym programem w którym najczęściej piszemy (w moim przypadku jest to amxx_studio, istnieje też możliwość pisania i kompilowania w notepad++ lecz to wymaga większego trudu. Można poszukać poradniki na internecie jak to zrobić.), a pliki *.amxx odrazu zapisują nam się w ustalonym miejscu na komputerze. Online - Przykładowy kompilator online: amxx.pl/kompilator. Wrzucamy tam kod albo uploadujemy plik *.sma, kompiluje a my musimy pobrać plik *.amxx który oczywiscie zapisuje się tam gdzie zapisują się pobierane pliki przez przeglądarke/ustalonym miejscu.
    Biblioteki.
    Chyba najczęsciej używaną biblioteką która nie jest domyślnie w amxx jest ColorChat. Co to takiego? Gdy piszemy to w kodzie wykorzystujemy funkcje. Zaincludowanie czyli pokazanie kompilatorowi, że ma użyć tej biblioteki, w kodzie to wygląda:
    #include <ColorChat> . Dzięki temu możemy używać funkcji które ta biblioteka zawiera, w tym przypadku jest to jedna, bardzo przydatna funkcja która pozwala w łatwy sposób kolorować wiadomosci wysyłane przez serwer (plugin) do gracza. Oczywiście, można zamiast includować to wrzucić umiejętnie to do kodu i wtedy nie trzeba - tylko po co, skoro tak jest szybciej i prościej. Biblioteki mają rozszerzenie zwykłe .inc
    Funkcje.
    Niestety, funkcje to rzecz które trzeba się nauczyć na pamięć, jednakże ich nazwy są na tyle intuicyjne, a jeśli dobrze skonfigurujemy nasz program do pisania który nam będzie podpowiadał składnie danej funkcji to z używaniem ich nie będzie większego problemu. Spis wszystkich dostepnych znajduje się tu: -> Klik <- po Polsku, a po Angielsku (więcej informacji) -> Klik <- 
    Funkcje forward. Wywoływane są one gdy się stanie coś konkretnego. Konkretniej: przykładem takiej funkcji jest 
    public plugin_init(){ //code } "public" przed funkcją jest oznajmieniem że jest to forward. Zamiast //code wpisujemy kod który w przypadku tej funkcji wykona się przy załadowaniu mapy. Używana jest ona zazwyczaj do rejestrowania pluginu (autor, wersja, nazwa), rejestrowania komend, cvarów (niżej) etc.
    Funkcje natywne. Można je umieścić np. w funkcjach forward. Przykładem takiego użycia byłoby:
    public plugin_init(){     register_plugin("Nazwa", "Wersja", "Autor"); } Po czymś takim po wpisaniu komendy amx_plugins byłby nasz plugin, nazywał by się Nazwa, przy wersji by pisało Wersja a jako autor byłby podany Autor. Po prostu rejestracja pluginu.
    Cvary.
    Najprosciej mówiąc - coś co pozwala nam sterowac pluginem przy pomocy komend/ustawien w amxx.cfg (w ftp serwera). Do zmieniania ich ustawien z poziomu admina na serwerze (oczywiscie z odpowiednimi flagami) uzywamy komendy amx_cvar. Cvary trzeba zarejestrować tam gdzie plugin, czyli w plugin_init.
    Zmienne.
    Zmienne dodajemy poprzedzajac je wyrazem "new". Służą do przechowywania, edytowania i odczytywania danych. Przykłady takich zmiennych to 
    new Zmienna //Może przechowywać max 1 literke/liczbe czyli np: "A", "a", "x" albo "1", "13", "69" etc.  new Zmienna[32] //Może przechowywać 32 literki/cyfry. Jak to działa? Każdy taki [1] to jest jedna zmienna, czyli można było by to zapisać new Zmienna0, new Zmienna1 itd. Ostatnia (32) jest to znak kończący, którego się nie edytuje czyli jak mamy 32 to mozemy wykonać operacje Zmienna[1] = 69 albo Zmienna[31] = 69.  new Float:Zmienna // Przechowuje liczby zmiennoprzecinkowe czyli np "1.69", "6.9" "1.141561" itd. Może występować również jako new Float:Zmienna[32] wtedy jest dokładnie jak przypadek wyżej new bool:Zmienna //Może ona tylko być jak true/false (True = 1, false = 0).  Formatowanie zmiennych. Dokładnie o znakach powiem niżej, ale zmienne po zadeklarowaniu na początku czyli np przed plugin_init można edytować/odczytywać w całym pluginie, czyli gdziekolwiek można napisać
    Zmienna = 1 lub
    if(zmienna == 1) Pierwszy przypadek ustawia Zmiennej wartość 1, drugi sprawdza czy zmienna równa się 1, jesli nie to zwraca 0, jeśli tak to zwraca 1.
     
    Operatory.
    W większości używane w funkcji if, for lub while oraz przy działaniach.
    a == b - Sprawdza czy lewa równa się prawej - jeśli tak zwraca 1, jeśli nie zwraca 0 a = b - Zmienna a przyjmuje wartość b, czyli jeśli b było równe 5 to a teraz tez jest równe 5 a < b - Jesli a jest mniejsze od b - zwraca 1, jeśli nie zwraca 0 a <= b - Jesli a jest mniejsze lub równe b - zwraca 1, jeśli nie zwraca 0 a != b - Jeśli a jest różne od b - zwraca 1, jeśli nie zwraca 0 a+b - a dodać b a+=5 - a dodać 5 a-b - a odjąć b a-=5 - a odjąć 5 a*b - a razy b a*=5 - to samo co a=a*5 a/b - a podzielone przez b a/=5 - to to samo co a=a/5 a%2 - zwrócenie reszty z dzielenia (przykład: 5%2 - zwróci nam 1) a++ - a użyte a potem zwiększone o 1 ++a - a zwiększone o jeden i dopeiro użyte a-- - a uzyte a potem zmniejszone o 1 --a - a zmniejszone o 1 a potem użyte is_user_connected(id) && is_user_alive(id) - jeśli jest połączony i żywy zwróci 1, jeśli nie jest żywy/nie jest połączony lub oba warunki są fałszywe to zwraca 0 is_user_connected(id) || is_user_alive(id) - jeśli jest połączony lub żywy zwróci 1, jesli żadne z tych zwróci 0. UWAGA!!
    7.0/3 = 3.5 7/3 = 3 Istnieje tez znak "?" Sprawdza on czy wartość po jego lewej jest 1, jeśli tak to wykona sie pierwszy argument, jeśli nie to drugi. Praktyka:
    is_user_alive(id) ? "Jest zywy" : "Jest martwy" Pętle oraz warunek if.
    Zawarty w nich kod wykona się określona ilość razy albo zanim zostanie wykonany wykona się sprawdzenie. Istnieja 3 pętle, trzeciej za bardzo nie rozumiem więc opisze dwie ktore się używa, jej jeszcze nie widziałem żeby ktoś uzywał, a nazywa się "do,while".
    Warunek if - sprawdza czy wyrażenie w nim jest prawdziwe (1) czy fałszywe (0) i zwraca odpowiednią cyfre. Praktyka:
    if(is_user_alive(id)){     user_kill(id) } Jeśli gracz jest zywy, zwróci 1 po czym wykona się zawarty w nim kod, czyli gracz zostanie zabity, jeśli gracz nie zyje, kod zostanei pominięty. Jeśli zostanei pominięty - czyli gracz będzie martwy, a chcemy sprawdzić skoro jest martwy to czy może jest w SPECT wiec robimy:
    if(is_user_alive(id){     user_kill(id)(id) } else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3){     cs_set_user_team(id, random(1,2)) } Juz tłumacze i objaśniam: Jak można wyczytać z dokumentacji -> Klik <- funkcja cs_get_uset_team zwraca 0 jeśli gracz nie wybrał drużyny lub 3 jesli jest na spect, więc w warunku if sprawdzamy czy jest 0 lub 3. Jeśli tak, przenosimy go do losowego teamu. W 2 argumencie funkcji cs_set_user_team wybieramy team do którego ma go przenieść. Funkcja random(1,2) losuje liczbe od 1 do 2 czyli 1 = TT, 2 = CT. Gdyby zamiast else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3) dać samo else to kod wykonał by się gdyby w pierwszym if gracz był martwy.
    Pętla for. Jest to jak sama nazwa mówi, pętla, w której kod będzie się wykonywał do pewnego momentu.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) break; } Jak widać, tworzymy zmienną i która po każdej pętli się zwieksza o 1 aż do maksymalnej ilości graczy która jest pobierana funkcją get_maxplayers(). Jak to wyglada? for(NOWA ZMIENNA; KIEDY MA SIĘ PĘTLA SKOŃCZYĆ; CO MA SIĘ ZROBIĆ PO SKOŃCZENIU PĘTLI). W pętlach między argumentami nie używamy "," tylko ";" W środku pętli: Jeśli użytkownik o id = zmiennej i jest adminem to pętla się kończy czyli dzieje się tak jakby i doszło do maksymalnej ilości graczy. Po co to? Gdy chcemy np znaleźć jednego admina i wyświetlić go komuś, wtedy po ifie a przed breakiem wysyłamy komuś wiadomosć.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) continue;     user_kill(i) //TEN KOD SIE NIE WYKONA JESLI GRACZ JEST ADMINEM, ALE PĘTLA BĘDZIE SPRAWDZAŁA DALEJ } Jeśli gracz o id = zmiennej i jest adminem to jest to pomijane i traktowane jakby pętla się skończyła, reszta kodu wtedy nie jest brane pod uwage
    Pętla while, podobna do for jednak w jej "wnętrzu" (nawiasach) nie tworzymy zmiennej.
    while(1==2){ //kod } Taka pętla nigdy się nie skończy ponieważ nigdy 1 nie będzie się równało 2.
    new zmienna new id=1 while(zmienna==5){ if(is_user_alive(id++)) zmienna++ } Ta pętla skończy się gdy będzie żyło 5 graczy
    Formatowanie.
    Czyli podmienianie np wyświetlanej wiadomosci do gracza. Załóżmy, że chcemy mu wysłać ile jest graczy online. W takim przypadku nie możemy wklepać na sztywno do kodu że jest 32 bo mijałoby się to z prawdą, dlatego robimy:
    client_print(id, print_center, "Na serwerze jest %d graczy!", ilosc_graczy) Gdzie ilosc_graczy to zmienna do której wcześniej zapisaliśmy liczbe graczy.
    Znaki formatujace:
    %s - string (ciag znaków) czyli np. "bober", "krowa", "elo" etc. %d lub %i - Liczba, czyli np "5", "15", "30". %f - float - liczba zmiennoprzecinkowa czyli np "1.3", "6.9" itd. Czasami będziemy chcieli wyświetlić tylko np. 2 cyfry po przecinku, taki problem wystepował swego czasu na niektorych codmodach gdzie po zmienieniu wymaganego doświadczenia na % wychodzilo im coś w stylu 50.4112308501%. Aby temu zapobierać zamiast %f piszemy %0.2f i wtedy wyświetli 2 cyfry po przecinku. Jeśli chcemy 5 cyfr to piszemy %0.5f. To są te najpotrzebniejsze, reszty się praktrycznie nie używa. Jeśli chcemy w jednej funkcji dodac kilka stringów to robimy to po prostu w kolejności. Jeśli chcemy wysłać zwykły znak % musimy go napisac podwójnie, czyli %%:
    client_print(id, print_center, "Na serwerze jest %d graczy, godzine temu było %d graczy a za 5 lat na 50%% bedzie %d graczy", ilosc_graczy, ilosc_graczy1hago, ilosc_graczy5y) To nam wyświetli np: "Na serwerze jest 20 graczy, godzine temu bylo 15, a za 5 lat na 50% bedzie 0 graczy"
    Dokładna rozpiska znajduje się tu: 
     
    Może w końcu po tej nudnej teorii się czymś zajmiemy? Pasowało by ogarnąć jakiś program do pisania. W tym celu pobieramy z tej strony -> Klik <-  AMX Mod X Full Installer, odpalamy go i instalujemy jak zwykły program. Potem wchodzimy w zainstalowany folder i uruchamiamy Installer.
    Klikamy Next, next, wybieramy select mod directory - next, wybieramy ścieżkę do cstrike, poniżej "Custome game addon:" wybieramy Counter-Strike i instalujemy wszystko. Teraz wracamy się do folderu w którym znajdował się pliczek Installer i wchodzimy w amxxstudio>AMXX_studio. Tam wchodzimy w Tools>settings>Compiler>Compiler settings i w Compiler (amxxpc.exe) ustalamy ścieżko do pliku amxxpc.exe który znajduje się w cstrike>addons>amxmodx>scripting. W moim przypadku jest to 
    D:\Program Files (x86)\Steam\steamapps\common\Half-Life\cstrike\addons\amxmodx\scripting\amxxpc.exe W Deafult Output directory wybieramy ścieżke gdzie mają się zapisywać pliki *.amxx.
    I Gotowe! Mamy program do pisania i dobrze skonfigurowany kompilator! Gdy skonczysz edytować lub pisać jakiś plugin, aby skompilować należy wcisnąć przycisk F9 lub na górze kliknąć Compile>Compile. 
    Jeśli pobieramy biblioteki tak jak np. ColorChat to wrzucamy je do cstrike>addons>amxmodx>scripting>include.
     
    Zaczynamy pisać
    Włączamy amxx_studio i klikamy File>new>empty plugin. Naszym oczom powinno się ukazać
    Po kolei tłumaczę. #include <amxmodx> - Podstawowa biblioteka zawierajaca podstawowe funkcje.
    #define PLUGIN "New Plug-In" - Define lubie tak śmiesznie na nie mówić - zmienna niezmienna  Jak widzimy w register_plugin zamiast nazwy pluginu jest PLUGIN. Przy kompilacji kompilator podmienia PLUGIN na "new Plug-In" Najczęściej jest to wykorzystywane przy pluginach które korzystają z jakiejś flagi admina a dla wygody uzytkownika robi się #define ADMIN_FLAG ADMIN_CHAT i jeśli w jakiejś funkcji bedziemy chcieli sprawdzić czy gracz ma flage ADMIN_FLAG to zamieni nam to na ADMIN_CHAT dzięki czemu będziemy sprawdzać czy gracz ma ADMIN_CHAT. Po co takei babranie? Po to żeby przy 2000 linijkach nie szukać i nie podmieniać flagi tylko wejść sobie na początek, zmienić, skompilować i wrzucić na serwer. 
    No to spróbujemy sobie zrobić powitanie na serwerze. Do tego potrzebujemy funkcji forward która będzie wyłapywała graczy ktorzy wchodzą na serwer. Istnieją dwie funkcje które nam to umożliwiają:
    client_putinserver(id) client_connect(id) Czym się różnią? Pierwsza wywołuje się gdy gracz wejdzie na serwer, czyli będzie miał do wyboru team. Druga wywołuje się przy kliknieciu connect! Przez co niemożliwe jest pobieranie takich danych przez tą funkcje jak uprawnienia, ponieważ one się dopiero załadują. Do tych celów używamy client_putinserver(id) My możemy sobie użyć client_connect(id) gdyż pobieramy tylko nick gracza który nie jest narzucany przez serwer i nie musi się ładować, ale wtedy może zaistnieć taka sytuacja, że wszyscy już go przywitają a on dopiero wejdzie na serwer, ponieważ np. będzie mu się długo ładowało  Wiec używamy client_putinserver(id).
    Pod } od plugin_init dopisujemy:
    public client_putinserver(id){ } Teraz przydało by się pobrać nick gracza którego chcemy przywitać, więc używamy funkcji get_user_name(id, name[], len). Już pędze z wyjaśnieniami. id - Jak wiadomo id gracza który wszedl na serwer.  name[] - nazwa zmiennej do której chcemy zapisać nick tego gracza oraz len - długość tej zmiennej. Teraz trzeba wyświetlić gdzieś te powitanie. Najlepiej do tego posłuży HUD. samodzielne konfigurowanie tego nie należy do najprzymeniejszych rzeczy wiec polecam w amxxstudio: Generators>hudmessage generator i wybranie sobie koloru i pozycji. Następnei formatujemy wiadomość. Powinno to wyglądać mniej więcej tak:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     show_hudmessage(id, "Witamy %s na serwerze!", name) } To może teraz sprawdzimy czy gracz jest vipem i odpowiednio napisać. Założymy, że VIP jest na flage t czyli w kodzie będzie to ADMIN_LEVEL_H (pełny link do tego: -> Klik <-)
    Więc robimy odpowiednie ify, czyli będzie to mniej więcej cos takiego:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     if(get_user_flags(id) & ADMIN_LEVEL_H)         show_hudmessage(0, "[VIP]Witamy %s na serwerze!", name)     else         show_hudmessage(0, "Witamy %s na serwerze!", name)     }     W funkcji show_hudmessage pierwszy argument "0" powoduje wysłanie do każdego gracza. Można też zrobić to w pętli gdy funkcja nie ma takiej możliwości.
     
    Całość:
     
     
    Zdaje sobie sprawe, że jest to mało, lecz pisanei tego poradnika troche mi zajeło. Ja wiem, że nie jestem w tym jakiś wybitny a co dopiero idealny, więc zapewne jakieś błędy się wkradły. No niestety, wszyscy jestesmy ludźmi, mam nadzieje że mi wybaczycie i uszanujecie mój czas włożony w ten poradnik, który napisałem dla Multi-Head.pl i proszę o uszanowanie tego i nie przywłaszczanie/kopiowanie na inne fora.
  19. Lubię to
     klqs otrzymał reputację od BezziPodstawy amxx   
    Cześć. Nie zauważyłem na tym forum jakiegoś dużego grona osób, które potrafią cokolwiek w amxx, więc postanowiłem się z Wami podzielić moją niewielką wiedzą. Będę się starał opisać wszystko najprościej jak potrafię, aby każdy kto chce, mógł to zrozumieć. Od razu mówię, że moje słownictwo tj. nazywanie konkretnych rzeczy nie będzie idealne i fachowe. Jest to spowodowane tym, że jestem samoukiem i nie wkuwałem teorii na pamięć tylko pobierałem pluginy i próbowałem rozgryźć jak to wszystko działa. 
    Co to wgl jest jak się do tego zabrać.
    AMXX (AMX Mod X - ulepszona i rozwijana wersja AMX Mod).
    Na tym opiera się praktycznie każdy serwer w 1.6 (z wyłączeniem mixów etc.). To dzięki temu wszystkie pluginy działają. W to zagadnienie nie ma potrzeby się głęboko zagłębiać. 
    Pliki *.sma i *.amxx.
    Zapewne nie raz o tym słyszeliście. Pierw pliki *.sma - Wszystkie projekty (tj. pluginy, silniki) w wersji możliwej do rozczytania przez człowieka są zapisywane właśnie w takim rozszerzeniu. Po co ono jest? Otóż gdy chcemy chociażby edytować istniejący już plugin to edytujemy właśnie plik *.sma. Gdy już skończymy prace, specjalnym kompilatorem który opisze później zamieniamy ten plik *.sma na plik *.amxx. Po co coś takiego robimy? AMXX rozpoznaje tylko pliki *.amxx. Do rozczytania przez człowieka są chyba niemożliwe. Kompilator zamienia to kolokwialnie mówiąc z "języka ludzkiego na język komputera". Ważne! Każdy plik *.sma można zamienić na *.amxx bez większego problemu (oczywiscie gdy nie występują errory, przy warningach kompiluje lecz zazwyczaj dana część kodu nie działa). W drugą strone jest większy problem. Istnieją dekompilatory (przeciwienstwa kompilatorów) które robią dokładnie odwrotną akcje. Niestety, nie są one zbyt dokładne. Często bywa, że większość część kodu jest nierozszyfrowana, a istnieją nawet metody które całkowicie uniemożliwiają dekompilacje. Mam nadzieje, że zrozumieliście, że pliki *.sma w FTP serwera są potrzebne tylko i wyłącznie w razie konieczności sprawdzenia działania pluginu/edycji etc., czyli z FTP można całkowicie wywalić folder "Scriptings", w którym znajdują się pliki *.sma oraz bilbioteki (o których będzie niżej) 
    Kompilacja.
    Myślę, że każdy kto prowadzi/ł serwer słyszał o czymś takim. Jest to jak już wyżej pisałem, zamiana pliku *.sma na *.amxx. Istnieją tak jakby dwie kompilacje:  lokalna i online, czym się różnią? Lokalna - kompilujemy naszym programem w którym najczęściej piszemy (w moim przypadku jest to amxx_studio, istnieje też możliwość pisania i kompilowania w notepad++ lecz to wymaga większego trudu. Można poszukać poradniki na internecie jak to zrobić.), a pliki *.amxx odrazu zapisują nam się w ustalonym miejscu na komputerze. Online - Przykładowy kompilator online: amxx.pl/kompilator. Wrzucamy tam kod albo uploadujemy plik *.sma, kompiluje a my musimy pobrać plik *.amxx który oczywiscie zapisuje się tam gdzie zapisują się pobierane pliki przez przeglądarke/ustalonym miejscu.
    Biblioteki.
    Chyba najczęsciej używaną biblioteką która nie jest domyślnie w amxx jest ColorChat. Co to takiego? Gdy piszemy to w kodzie wykorzystujemy funkcje. Zaincludowanie czyli pokazanie kompilatorowi, że ma użyć tej biblioteki, w kodzie to wygląda:
    #include <ColorChat> . Dzięki temu możemy używać funkcji które ta biblioteka zawiera, w tym przypadku jest to jedna, bardzo przydatna funkcja która pozwala w łatwy sposób kolorować wiadomosci wysyłane przez serwer (plugin) do gracza. Oczywiście, można zamiast includować to wrzucić umiejętnie to do kodu i wtedy nie trzeba - tylko po co, skoro tak jest szybciej i prościej. Biblioteki mają rozszerzenie zwykłe .inc
    Funkcje.
    Niestety, funkcje to rzecz które trzeba się nauczyć na pamięć, jednakże ich nazwy są na tyle intuicyjne, a jeśli dobrze skonfigurujemy nasz program do pisania który nam będzie podpowiadał składnie danej funkcji to z używaniem ich nie będzie większego problemu. Spis wszystkich dostepnych znajduje się tu: -> Klik <- po Polsku, a po Angielsku (więcej informacji) -> Klik <- 
    Funkcje forward. Wywoływane są one gdy się stanie coś konkretnego. Konkretniej: przykładem takiej funkcji jest 
    public plugin_init(){ //code } "public" przed funkcją jest oznajmieniem że jest to forward. Zamiast //code wpisujemy kod który w przypadku tej funkcji wykona się przy załadowaniu mapy. Używana jest ona zazwyczaj do rejestrowania pluginu (autor, wersja, nazwa), rejestrowania komend, cvarów (niżej) etc.
    Funkcje natywne. Można je umieścić np. w funkcjach forward. Przykładem takiego użycia byłoby:
    public plugin_init(){     register_plugin("Nazwa", "Wersja", "Autor"); } Po czymś takim po wpisaniu komendy amx_plugins byłby nasz plugin, nazywał by się Nazwa, przy wersji by pisało Wersja a jako autor byłby podany Autor. Po prostu rejestracja pluginu.
    Cvary.
    Najprosciej mówiąc - coś co pozwala nam sterowac pluginem przy pomocy komend/ustawien w amxx.cfg (w ftp serwera). Do zmieniania ich ustawien z poziomu admina na serwerze (oczywiscie z odpowiednimi flagami) uzywamy komendy amx_cvar. Cvary trzeba zarejestrować tam gdzie plugin, czyli w plugin_init.
    Zmienne.
    Zmienne dodajemy poprzedzajac je wyrazem "new". Służą do przechowywania, edytowania i odczytywania danych. Przykłady takich zmiennych to 
    new Zmienna //Może przechowywać max 1 literke/liczbe czyli np: "A", "a", "x" albo "1", "13", "69" etc.  new Zmienna[32] //Może przechowywać 32 literki/cyfry. Jak to działa? Każdy taki [1] to jest jedna zmienna, czyli można było by to zapisać new Zmienna0, new Zmienna1 itd. Ostatnia (32) jest to znak kończący, którego się nie edytuje czyli jak mamy 32 to mozemy wykonać operacje Zmienna[1] = 69 albo Zmienna[31] = 69.  new Float:Zmienna // Przechowuje liczby zmiennoprzecinkowe czyli np "1.69", "6.9" "1.141561" itd. Może występować również jako new Float:Zmienna[32] wtedy jest dokładnie jak przypadek wyżej new bool:Zmienna //Może ona tylko być jak true/false (True = 1, false = 0).  Formatowanie zmiennych. Dokładnie o znakach powiem niżej, ale zmienne po zadeklarowaniu na początku czyli np przed plugin_init można edytować/odczytywać w całym pluginie, czyli gdziekolwiek można napisać
    Zmienna = 1 lub
    if(zmienna == 1) Pierwszy przypadek ustawia Zmiennej wartość 1, drugi sprawdza czy zmienna równa się 1, jesli nie to zwraca 0, jeśli tak to zwraca 1.
     
    Operatory.
    W większości używane w funkcji if, for lub while oraz przy działaniach.
    a == b - Sprawdza czy lewa równa się prawej - jeśli tak zwraca 1, jeśli nie zwraca 0 a = b - Zmienna a przyjmuje wartość b, czyli jeśli b było równe 5 to a teraz tez jest równe 5 a < b - Jesli a jest mniejsze od b - zwraca 1, jeśli nie zwraca 0 a <= b - Jesli a jest mniejsze lub równe b - zwraca 1, jeśli nie zwraca 0 a != b - Jeśli a jest różne od b - zwraca 1, jeśli nie zwraca 0 a+b - a dodać b a+=5 - a dodać 5 a-b - a odjąć b a-=5 - a odjąć 5 a*b - a razy b a*=5 - to samo co a=a*5 a/b - a podzielone przez b a/=5 - to to samo co a=a/5 a%2 - zwrócenie reszty z dzielenia (przykład: 5%2 - zwróci nam 1) a++ - a użyte a potem zwiększone o 1 ++a - a zwiększone o jeden i dopeiro użyte a-- - a uzyte a potem zmniejszone o 1 --a - a zmniejszone o 1 a potem użyte is_user_connected(id) && is_user_alive(id) - jeśli jest połączony i żywy zwróci 1, jeśli nie jest żywy/nie jest połączony lub oba warunki są fałszywe to zwraca 0 is_user_connected(id) || is_user_alive(id) - jeśli jest połączony lub żywy zwróci 1, jesli żadne z tych zwróci 0. UWAGA!!
    7.0/3 = 3.5 7/3 = 3 Istnieje tez znak "?" Sprawdza on czy wartość po jego lewej jest 1, jeśli tak to wykona sie pierwszy argument, jeśli nie to drugi. Praktyka:
    is_user_alive(id) ? "Jest zywy" : "Jest martwy" Pętle oraz warunek if.
    Zawarty w nich kod wykona się określona ilość razy albo zanim zostanie wykonany wykona się sprawdzenie. Istnieja 3 pętle, trzeciej za bardzo nie rozumiem więc opisze dwie ktore się używa, jej jeszcze nie widziałem żeby ktoś uzywał, a nazywa się "do,while".
    Warunek if - sprawdza czy wyrażenie w nim jest prawdziwe (1) czy fałszywe (0) i zwraca odpowiednią cyfre. Praktyka:
    if(is_user_alive(id)){     user_kill(id) } Jeśli gracz jest zywy, zwróci 1 po czym wykona się zawarty w nim kod, czyli gracz zostanie zabity, jeśli gracz nie zyje, kod zostanei pominięty. Jeśli zostanei pominięty - czyli gracz będzie martwy, a chcemy sprawdzić skoro jest martwy to czy może jest w SPECT wiec robimy:
    if(is_user_alive(id){     user_kill(id)(id) } else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3){     cs_set_user_team(id, random(1,2)) } Juz tłumacze i objaśniam: Jak można wyczytać z dokumentacji -> Klik <- funkcja cs_get_uset_team zwraca 0 jeśli gracz nie wybrał drużyny lub 3 jesli jest na spect, więc w warunku if sprawdzamy czy jest 0 lub 3. Jeśli tak, przenosimy go do losowego teamu. W 2 argumencie funkcji cs_set_user_team wybieramy team do którego ma go przenieść. Funkcja random(1,2) losuje liczbe od 1 do 2 czyli 1 = TT, 2 = CT. Gdyby zamiast else if(cs_get_user_team(id) == 0 || cs_get_user_team(id) == 3) dać samo else to kod wykonał by się gdyby w pierwszym if gracz był martwy.
    Pętla for. Jest to jak sama nazwa mówi, pętla, w której kod będzie się wykonywał do pewnego momentu.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) break; } Jak widać, tworzymy zmienną i która po każdej pętli się zwieksza o 1 aż do maksymalnej ilości graczy która jest pobierana funkcją get_maxplayers(). Jak to wyglada? for(NOWA ZMIENNA; KIEDY MA SIĘ PĘTLA SKOŃCZYĆ; CO MA SIĘ ZROBIĆ PO SKOŃCZENIU PĘTLI). W pętlach między argumentami nie używamy "," tylko ";" W środku pętli: Jeśli użytkownik o id = zmiennej i jest adminem to pętla się kończy czyli dzieje się tak jakby i doszło do maksymalnej ilości graczy. Po co to? Gdy chcemy np znaleźć jednego admina i wyświetlić go komuś, wtedy po ifie a przed breakiem wysyłamy komuś wiadomosć.
    for(new i; i<=get_maxplayers(), i++){     if(is_user_admin(i)) continue;     user_kill(i) //TEN KOD SIE NIE WYKONA JESLI GRACZ JEST ADMINEM, ALE PĘTLA BĘDZIE SPRAWDZAŁA DALEJ } Jeśli gracz o id = zmiennej i jest adminem to jest to pomijane i traktowane jakby pętla się skończyła, reszta kodu wtedy nie jest brane pod uwage
    Pętla while, podobna do for jednak w jej "wnętrzu" (nawiasach) nie tworzymy zmiennej.
    while(1==2){ //kod } Taka pętla nigdy się nie skończy ponieważ nigdy 1 nie będzie się równało 2.
    new zmienna new id=1 while(zmienna==5){ if(is_user_alive(id++)) zmienna++ } Ta pętla skończy się gdy będzie żyło 5 graczy
    Formatowanie.
    Czyli podmienianie np wyświetlanej wiadomosci do gracza. Załóżmy, że chcemy mu wysłać ile jest graczy online. W takim przypadku nie możemy wklepać na sztywno do kodu że jest 32 bo mijałoby się to z prawdą, dlatego robimy:
    client_print(id, print_center, "Na serwerze jest %d graczy!", ilosc_graczy) Gdzie ilosc_graczy to zmienna do której wcześniej zapisaliśmy liczbe graczy.
    Znaki formatujace:
    %s - string (ciag znaków) czyli np. "bober", "krowa", "elo" etc. %d lub %i - Liczba, czyli np "5", "15", "30". %f - float - liczba zmiennoprzecinkowa czyli np "1.3", "6.9" itd. Czasami będziemy chcieli wyświetlić tylko np. 2 cyfry po przecinku, taki problem wystepował swego czasu na niektorych codmodach gdzie po zmienieniu wymaganego doświadczenia na % wychodzilo im coś w stylu 50.4112308501%. Aby temu zapobierać zamiast %f piszemy %0.2f i wtedy wyświetli 2 cyfry po przecinku. Jeśli chcemy 5 cyfr to piszemy %0.5f. To są te najpotrzebniejsze, reszty się praktrycznie nie używa. Jeśli chcemy w jednej funkcji dodac kilka stringów to robimy to po prostu w kolejności. Jeśli chcemy wysłać zwykły znak % musimy go napisac podwójnie, czyli %%:
    client_print(id, print_center, "Na serwerze jest %d graczy, godzine temu było %d graczy a za 5 lat na 50%% bedzie %d graczy", ilosc_graczy, ilosc_graczy1hago, ilosc_graczy5y) To nam wyświetli np: "Na serwerze jest 20 graczy, godzine temu bylo 15, a za 5 lat na 50% bedzie 0 graczy"
    Dokładna rozpiska znajduje się tu: 
     
    Może w końcu po tej nudnej teorii się czymś zajmiemy? Pasowało by ogarnąć jakiś program do pisania. W tym celu pobieramy z tej strony -> Klik <-  AMX Mod X Full Installer, odpalamy go i instalujemy jak zwykły program. Potem wchodzimy w zainstalowany folder i uruchamiamy Installer.
    Klikamy Next, next, wybieramy select mod directory - next, wybieramy ścieżkę do cstrike, poniżej "Custome game addon:" wybieramy Counter-Strike i instalujemy wszystko. Teraz wracamy się do folderu w którym znajdował się pliczek Installer i wchodzimy w amxxstudio>AMXX_studio. Tam wchodzimy w Tools>settings>Compiler>Compiler settings i w Compiler (amxxpc.exe) ustalamy ścieżko do pliku amxxpc.exe który znajduje się w cstrike>addons>amxmodx>scripting. W moim przypadku jest to 
    D:\Program Files (x86)\Steam\steamapps\common\Half-Life\cstrike\addons\amxmodx\scripting\amxxpc.exe W Deafult Output directory wybieramy ścieżke gdzie mają się zapisywać pliki *.amxx.
    I Gotowe! Mamy program do pisania i dobrze skonfigurowany kompilator! Gdy skonczysz edytować lub pisać jakiś plugin, aby skompilować należy wcisnąć przycisk F9 lub na górze kliknąć Compile>Compile. 
    Jeśli pobieramy biblioteki tak jak np. ColorChat to wrzucamy je do cstrike>addons>amxmodx>scripting>include.
     
    Zaczynamy pisać
    Włączamy amxx_studio i klikamy File>new>empty plugin. Naszym oczom powinno się ukazać
    Po kolei tłumaczę. #include <amxmodx> - Podstawowa biblioteka zawierajaca podstawowe funkcje.
    #define PLUGIN "New Plug-In" - Define lubie tak śmiesznie na nie mówić - zmienna niezmienna  Jak widzimy w register_plugin zamiast nazwy pluginu jest PLUGIN. Przy kompilacji kompilator podmienia PLUGIN na "new Plug-In" Najczęściej jest to wykorzystywane przy pluginach które korzystają z jakiejś flagi admina a dla wygody uzytkownika robi się #define ADMIN_FLAG ADMIN_CHAT i jeśli w jakiejś funkcji bedziemy chcieli sprawdzić czy gracz ma flage ADMIN_FLAG to zamieni nam to na ADMIN_CHAT dzięki czemu będziemy sprawdzać czy gracz ma ADMIN_CHAT. Po co takei babranie? Po to żeby przy 2000 linijkach nie szukać i nie podmieniać flagi tylko wejść sobie na początek, zmienić, skompilować i wrzucić na serwer. 
    No to spróbujemy sobie zrobić powitanie na serwerze. Do tego potrzebujemy funkcji forward która będzie wyłapywała graczy ktorzy wchodzą na serwer. Istnieją dwie funkcje które nam to umożliwiają:
    client_putinserver(id) client_connect(id) Czym się różnią? Pierwsza wywołuje się gdy gracz wejdzie na serwer, czyli będzie miał do wyboru team. Druga wywołuje się przy kliknieciu connect! Przez co niemożliwe jest pobieranie takich danych przez tą funkcje jak uprawnienia, ponieważ one się dopiero załadują. Do tych celów używamy client_putinserver(id) My możemy sobie użyć client_connect(id) gdyż pobieramy tylko nick gracza który nie jest narzucany przez serwer i nie musi się ładować, ale wtedy może zaistnieć taka sytuacja, że wszyscy już go przywitają a on dopiero wejdzie na serwer, ponieważ np. będzie mu się długo ładowało  Wiec używamy client_putinserver(id).
    Pod } od plugin_init dopisujemy:
    public client_putinserver(id){ } Teraz przydało by się pobrać nick gracza którego chcemy przywitać, więc używamy funkcji get_user_name(id, name[], len). Już pędze z wyjaśnieniami. id - Jak wiadomo id gracza który wszedl na serwer.  name[] - nazwa zmiennej do której chcemy zapisać nick tego gracza oraz len - długość tej zmiennej. Teraz trzeba wyświetlić gdzieś te powitanie. Najlepiej do tego posłuży HUD. samodzielne konfigurowanie tego nie należy do najprzymeniejszych rzeczy wiec polecam w amxxstudio: Generators>hudmessage generator i wybranie sobie koloru i pozycji. Następnei formatujemy wiadomość. Powinno to wyglądać mniej więcej tak:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     show_hudmessage(id, "Witamy %s na serwerze!", name) } To może teraz sprawdzimy czy gracz jest vipem i odpowiednio napisać. Założymy, że VIP jest na flage t czyli w kodzie będzie to ADMIN_LEVEL_H (pełny link do tego: -> Klik <-)
    Więc robimy odpowiednie ify, czyli będzie to mniej więcej cos takiego:
    public client_putinserver(id){     new name[48];     get_user_name(id, name, 47);     set_hudmessage(0, 127, 255, 0.02, 0.13, 0, 6.0, 12.0)     if(get_user_flags(id) & ADMIN_LEVEL_H)         show_hudmessage(0, "[VIP]Witamy %s na serwerze!", name)     else         show_hudmessage(0, "Witamy %s na serwerze!", name)     }     W funkcji show_hudmessage pierwszy argument "0" powoduje wysłanie do każdego gracza. Można też zrobić to w pętli gdy funkcja nie ma takiej możliwości.
     
    Całość:
     
     
    Zdaje sobie sprawe, że jest to mało, lecz pisanei tego poradnika troche mi zajeło. Ja wiem, że nie jestem w tym jakiś wybitny a co dopiero idealny, więc zapewne jakieś błędy się wkradły. No niestety, wszyscy jestesmy ludźmi, mam nadzieje że mi wybaczycie i uszanujecie mój czas włożony w ten poradnik, który napisałem dla Multi-Head.pl i proszę o uszanowanie tego i nie przywłaszczanie/kopiowanie na inne fora.
  20. Serduszko
     klqs przyznał reputację dla Inte Tillgänglig Danke:* [ZAMKNIĘTY]Plugin na ex_interp nie działa poprawnie....   
    Nowy plugin został wgrany. Wymusza na 100% poprawny interp, celowo dałam sobie 0.1 by sprawdzić i normalnie wymusiło na 0.01. Teraz wszyscy powinni mieć główki, więc proszę nie narzekać.
     
    Z tego miejsca bardzo chciałabym podziękować Naszemu graczowi @klqs, który podjął się zadania i własnymi siłami napisał dla serwera owy plugin.
    Dziękuję w swoim jak i w imieniu wszystkich graczy i Adminów.
     
    Temat zostawiam jeszcze otwarty w razie wu.
  21. Lubię to
     klqs otrzymał reputację od Tony Montananiski ping i lagi - prośba o pomoc   
    Spróbuj koligacje zmienić. Menadzer zadan>hl.exe>ustaw koligacje i zostaw jeden rdzeń i zobacz czy bedzie dalej. Jeśli tracisz pakiety to nic nie pomożemy. Tak z ciekawości, z czego masz internet?  
  22. Lubię to
     klqs przyznał reputację dla Tomass ツKlops   
    Siemanko  Adminowaliśmy kiedyś na #2   Twoje msg też jeszcze stoi  
  23. Serduszko
     klqs przyznał reputację dla Inte Tillgänglig Danke:*Klops   
    Wojtuś, to był Mój Podopieczny CS:GO#2. Zapamiętałam go jako bardzo dobrego Admina.
    Witam ponownie i słuszny wybór jeśli chodzi o wybranie serwera!  ;*
    Oczywiście też zapraszam na wszystkie serwery MG! =)
  24. Serduszko
     klqs otrzymał reputację od Inte Tillgänglig Danke:*Klops   
    Cześć, z tej strony Wojtek aka klqs aka klops. Pochodze z podkarpacia i mam 17 lat. Gram na DD2#2. Kiedyś tu juz u was byłem ale coś konta nie moge znaleźć, w żaden sposób nie idzie. Jak coś ciekawi Was to pytajta
×
×
  • Dodaj nową pozycję...