Skocz do zawartości

Przemcio

Użytkownik
  • Zawartość

    24
  • Rejestracja

  • Ostatnia wizyta

    nigdy

O Przemcio

  • Tytuł
    Obserwator

Informacje profilowe

  • Płeć
    Nie określono

Ostatnie wizyty

Blok z ostatnimi odwiedzającymi dany profil jest wyłączony i nie jest wyświetlany użytkownikom.

  1. Przemcio

    Dialogi (GUI)

    Zapomniałem o tym, że przy pustym stringu strcmp zwraca 0, sorry : D
  2. Przemcio

    [PWN] Realistyczna kolczatka - Filmik

    NoGravity, jak widzę niektóre Twoje posty to mnie szlag trafia...
  3. Przemcio

    Videorecenzje horrorów

    Next - Call of Cthulhu: The Dark Corners of the Earth. Sorry, że tak długo, ale nie miałem czasu, do tego wyszedł CoD Black Ops i trochę w multi się grało : P Postarałem się poprawić 'usypiający' głos, dodałem minusy i przedstawiłem na początku trochę grę. Filmik mogłem nieco skrócić, no, ale jakoś tak wyszło... http://www.youtube.com/watch?v=RPCJcIFihbY
  4. Przemcio

    Enum

  5. Przemcio

    Dialogi (GUI)

    Co do kolorowania, to może wstrzymam się do oficjalnego wydania 0.3c, bo teraz jest na razie wersja dla skrypterów i może się kilka rzeczy zmienić.
  6. Przemcio

    [DEMO]: HorrorMode

    Już przecież napisałem co zrobić w przypadku XP, po co Ci jakiś plik msvcr71d.dll : D? Wystarczy cnpc.dll od StrickenKida, do którego dałem linka.
  7. Przemcio

    Funkcje

  8. Witam, z racji tej, że moje forum po długotrwałym hacku upadło całkowicie (niby działa, ale kto o nim jeszcze pamięta?), to wystawiam wszystkie moje poradniki z tamtego forum na te. Co zrobią ze swoimi inni, którzy pisali na tamtym forum - ich wola, więc zaczynajmy. W tym poradniku opiszę jak wywołać jakiś kod po naciśnięciu klawisza. OnPlayerKeyStateChange To nasz callback, który wykonuje się po naciśnięciu jakiegoś klawisza, całość wygląda tak: public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { //Kod return 1; } playerid - ID gracza, przez którego wywołał się ten callback, newkeys - ID klawisza/kombinacji, którą właśnie wcisnęliśmy, oldkeys - ID klawisza/kombinacji, którą właśnie puściliśmy. Należy pamiętać, że ten callback nie wykonuje się gdy naciskamy klawisze ruchu! Jeśli chcesz zrobić coś na te klawisze, musisz użyć funkcji GetPlayerKeys, o której napiszę niżej. ID klawiszy W tym callback'u możemy używać tylko klawiszy, które wykonują jakąś czynność w grze, np. strzelanie, bieganie. Lista ID z a_samp.inc: #define KEY_ACTION (1) #define KEY_CROUCH (2) #define KEY_FIRE (4) #define KEY_SPRINT (8) #define KEY_SECONDARY_ATTACK (16) #define KEY_JUMP (32) #define KEY_LOOK_RIGHT (64) #define KEY_HANDBRAKE (128) #define KEY_LOOK_LEFT (256) #define KEY_SUBMISSION (512) #define KEY_LOOK_BEHIND (512) #define KEY_WALK (1024) #define KEY_ANALOG_UP (2048) #define KEY_ANALOG_DOWN (4096) #define KEY_ANALOG_LEFT (8192) #define KEY_ANALOG_RIGHT (16384) #define KEY_UP (-128) #define KEY_DOWN (128) #define KEY_LEFT (-128) #define KEY_RIGHT (128) Jak zrobić coś na jeden klawisz? W w/w callback'u dodajemy prostą instrukcję: if(newkeys == ID_KLAWISZA) { //Kod } Za ID klawisza możemy podstawić nazwę (np. KEY_JUMP) jak i ID (w przypadku skoku będzie to 32), np.: if(newkeys == KEY_JUMP) { SendClientMessage(playerid, 0xFFFFFFFF, "Skoczyłeś! Dostajesz $1!"); GivePlayerMoney(playerid, 1); } Całość powinna wyglądać tak: public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { if(newkeys == KEY_JUMP) { SendClientMessage(playerid, 0xFFFFFFFF, "Skoczyłeś! Dostajesz $1!"); GivePlayerMoney(playerid, 1); } return 1; } W ten sposób przy każdym skoku otrzymamy $1 : ) Jednak nie zadziała nam to kiedy będziemy trzymać jakiś inny klawisz przy skoku (np. sprint). W tym celu zamiast == stawiamy &. Jak zrobić coś na kombinację klawiszy? if(newkeys == ID_Klawisza_1 + ID_Klawisza_2) { //Kod } Jak wykonać jakiś kod po puszczeniu podanego klawisza/klawiszy? Po prostu zamiast newkeys stawiamy oldkeys. GetPlayerKeys O tej funkcji wspominałem wyżej, za jej pomocą możemy pobrać jaki klawisz akcji ma wciśnięty dany gracz (np. skoku, sprintu), a ponadto jakich używa właśnie klawiszy ruchu (góra/dół i lewo/prawo). Definicja funkcji: GetPlayerKeys(playerid, &keys, &updown, &leftright); playerid - nie muszę tłumaczyć, &keys - tą referencją pobieramy klawisz akcji, który ma wciśnięty podany gracz w czasie wywoływania się funkcji, &updown - j/w, tylko, że dla klawiszy góra/dół, &leftright - j/w, tylko, że dla klawiszy lewo/prawo. Gdzie użyć GetPlayerKeys, gdy chce zrobić, że po naciśnięciu jakiegoś klawisza poruszania się coś się stanie? Zazwyczaj używa się tego w OnPlayerUpdate, albo w timerach, najlepiej w OnPlayerUpdate, bo wykonuje się bardzo często (średnio co 30 milisekund) dla każdego gracza. Przejdźmy do rzeczy, chcemy zrobić, że po naciśnięciu klawisza poruszania się do przodu coś się stanie, więc w OnPlayerUpdate, które wygląda tak: public OnPlayerUpdate(playerid) { //Kod return 1; } Tworzymy 3 zmienne, które będą przechowywać dane referencji z funkcji GetPlayerKeys new Klawisz, GoraDol, LewoPrawo; Następnie wywołujemy funkcję GetPlayerKeys: GetPlayerKeys(playerid, Klawisz, GoraDol, LewoPrawo); A potem robimy instrukcję warunkową, bardzo podobną do tej z OnPlayerKeyStateChange, czyli: if(GoraDol == KEY_UP) { //Kod } Całość powinna wyglądać tak: public OnPlayerUpdate(playerid) { new Klawisz, GoraDol, LewoPrawo; GetPlayerKeys(playerid, Klawisz, GoraDol, LewoPrawo); if(GoraDol == KEY_UP) { //Kod } return 1; } Dziękuję za uwagę.
  9. Przemcio

    Timery

    Witam, z racji tej, że moje forum po długotrwałym hacku upadło całkowicie (niby działa, ale kto o nim jeszcze pamięta?), to wystawiam wszystkie moje poradniki z tamtego forum na te. Co zrobią ze swoimi inni, którzy pisali na tamtym forum - ich wola, więc zaczynajmy. W tym poradniku opiszę 3 funkcje timerów - SetTimer, SetTimerEx i KillTimer. Czym jest timer? Timer to wywołanie funkcji po określonym przez nas czasie. Funkcja ta musi być publiczna, inaczej nie może zostać ona wywołana przez SetTimer/SetTimerEx. Jak zrobić funkcję publiczną? Opisałem to w wyżej wymienionym poradniku. SetTimer SetTimer służy do wywoływania funkcji, które nie mają żadnych argumentów. SetTimer ma 3 argumenty: funcname[] - w " " wpisujemy nazwę funkcji, interval - czas po jakim następuje wywołanie funkcji w milisekundach (1 sekunda - 1000 milisekund), repeating - jeśli damy tutaj 1, to funkcja będzie się powtarzała co określony przez nas czas. Można to zatrzymać za pomocą KillTimer, o którym napiszę niżej. Przykład użycia: SetTimer("MojaFunkcja", 3000, 0); //Za 3 sekundy wykona się funkcja o nazwie "MojaFunkcja" [...] forward MojaFunkcja(); public MojaFunkcja() { SendClientMessageToAll(0xFFFFFFFF, "Właśnie minęły 3 sekundy!"); //Wysyłamy wiadomość do wszystkich return 1; } UWAGA! Początkujący bardzo często popełniają błąd, mianowicie używają SetTimer do wywoływania funkcji z argumentami, najczęściej playerid. Pamiętaj, że: SetTimer("MojaFunkcja", 3000, 0); forward MojaFunkcja(playerid); public MojaFunkcja(playerid) { SendClientMessage(playerid, 0xFFFFFFFF, "Właśnie minęły 3 sekundy!"); return 1; } Takie coś jest błędne! playerid przyjmuje wtedy wartość 0 i zadziała to tylko na gracza o ID 0! Jeśli chcesz zrobić timer, który będzie działał na jednego gracza użyj SetTimerEx, który zaraz opiszę. Ten błąd też często jest popełniany przy próbie zrobienia timera działającego na wszystkich graczy na serwerze, w tym celu używamy pętli: forward MojaFunkcja(); public MojaFunkcja() { for(new i, Max = GetMaxPlayers(); i < Max; i++) { if(IsPlayerConnected(i)) { GivePlayerMoney(i, 1000); //Dajemy wszystkim podłączonym graczom $1000 } } return 1; } Wiem, że powyższy kod można skrócić (usunąć klamry), ale chcę uniknąć pytań od początkujących czemu mi to nie działa. SetTimerEx SetTimerEx służy do tego samego, co SetTimer, jednak ma jedną ważną funkcję - może przekazywać wartości do funkcji, czyli śmiało możemy nim wywoływać funkcje z argumentami. SetTimerEx ma 5 argumentów: funcname[] - w " " wpisujemy nazwę funkcji, interval - czas po jakim następuje wywołanie funkcji w milisekundach (1 sekunda - 1000 milisekund), repeating - jeśli damy tutaj 1, to funkcja będzie się powtarzała co określony przez nas czas. Można to zatrzymać za pomocą KillTimer, o którym napiszę niżej. const format[] - w " " wpisujemy rodzaj danych, który przekazujemy, czyli np. s, i, f. Więcej napiszę niżej, {Float,_}:... - tutaj wpisujemy dane, które chcemy przekazać (np. zmienne). Więcej napiszę niżej. Na pewno zastanawiacie się o co chodzi z dwoma ostatnimi argumentami, już tłumaczę. Najpierw musimy stworzyć funkcję z jakimś argumentem, do której będziemy chcieli się odwołać. Wyżej pisałem o funkcjach z argumentem playerid, więc stwórzmy taką funkcję: forward MojaFunkcja(playerid); public MojaFunkcja(playerid) { GivePlayerMoney(playerid, 1000); //Dajemy $1000 podanemu ID SendClientMessage(playerid, oxFFFFFFFF, "Bu!"); //Wysyłamy wiadomość do podanego ID return 1; } Teraz chcemy ją wywołać za pomocą SetTimerEx, więc robimy: //Taki kod dajemy np. do komendy, lub do jakiegoś callbacka, w którym jest playerid SetTimerEx("MojaFunkcja", 1000, 0, "i", playerid); Pierwszych trzech argumentów nie będę opisywał, bo zrobiłem to już przy SetTimer, więc zajmiemy się dwoma ostatnimi, czemu w przedostatnim jest 'i'? Bo playerid to integer (liczba całkowita), w ostatnim argumencie dałem playerid, bo taką wartość chcę przekazać do timera. Pamiętaj, że to, co wpisujesz w SetTimerEx nie musi mieć takiej samej nazwy jak argument w Twojej funkcji. Możesz sobie zrobić takie coś: SetTimerEx("MojaFunkcja", 1000, 0, "i", 3); I wtedy przekażesz wartość 3 do playerid w funkcji. Teraz zrobimy bardziej złożoną funkcję: forward MojaFunkcja(playerid, Ilosc, const Tekst[], Float:Z); public MojaFunkcja(playerid, Ilosc, const Tekst[], Float:Z) { new Koordy[3]; //Tworzymy tablicę GetPlayerPos(playerid, Koordy[0], Koordy[1], Koordy[2]); //Pobieramy pozycję gracza SetPlayerPos(playerid, Koordy[0], Koordy[1], Z); //Zmieniamy pozycję gracza zachowując przy tym jego X i Y GivePlayerMoney(playerid, Ilosc); //Dajemy określoną ilość pieniędzy SendClientMessage(playerid, 0xFFFFFFFF, Tekst); //Wysyłamy określoną wiadomość return 1; } I SetTimerEx do niej: SetTimerEx("MojaFunkcja", 1000, 0, "iisf", playerid, 1000, "Bu!", 0.2); Jak widzicie, w przedostatnim argumencie napisałem iisf, bo po kolei argumenty w naszej funkcji to integer, integer, string i float. Nie umiem dobrze tego wytłumaczyć, ale mam nadzieję, że przynajmniej trochę rozjaśniłem na czym polega SetTimerEx. KillTimer Czas na ostatnią funkcję związaną z timerami - KillTimer, ta funkcja zabija (czyli wyłącza) nasz timer i usuwa pozostałości po nim z pamięci. Ma tylko jeden argument, mianowicie ID timera. Jak zdobyć ID timera? Np. zapisać do zmiennej w taki sposób: //Tworzymy gdzieś zmienną oczywiście [...] NaszaZmienna = SetTimer(...); //To samo w przypadku SetTimerEx Potem gdy chcemy zabić timer robimy po prostu: KillTimer(NaszaZmienna); Zaleca się używanie KillTimer po każdym użyciu pojedynczego timera (czyli takiego, który w argumencie repeating ma 0), ponieważ te timery nie usuwają się do końca z pamięci, a KillTimer usunie wszystkie pozostałości po tych timerach. Dziękuję za uwagę.
  10. Przemcio

    Funkcje

    Witam, z racji tej, że moje forum po długotrwałym hacku upadło całkowicie (niby działa, ale kto o nim jeszcze pamięta?), to wystawiam wszystkie moje poradniki z tamtego forum na te. Co zrobią ze swoimi inni, którzy pisali na tamtym forum - ich wola, więc zaczynajmy. W tym poradniku opiszę funkcje i ich przeznaczenie. Czym jest funkcja? Funkcja to zbiór poleceń, które wykonują się w określonym przez nas celu. Najczęściej zwracają jakieś wartości za pomocą return, lub referencji (o czym napiszę niżej). Są dwa rodzaje funkcji – normalna i publiczna. Najpierw zajmiemy się tym pierwszym. Jak stworzyć funkcję? Funkcję tworzy się bardzo prosto Nazwa_Funkcji() { //Jakieś polecenia } W miejsce gdzie napisałem komentarz dodajemy jakiś kod, przykładowo chcemy stworzyć funkcję, która wyświetli jakiś tekst w konsoli i wyśle wszystkim graczom wiadomość na czacie: WyswietlWiadomosc() { print("Wiadomosc w konsoli"); //Funkcja print wyświetla wiadomość w konsoli SendClientMessageToAll(0xFFFFFFFF, "Wiadomość na czacie"); //Ta funkcja wyświetla wszystkim graczom na serwerze wiadomość na czacie } Pozostaje pytanie – jak tego użyć? Po prostu dodajemy gdzieś (w jakiejś komendzie, albo czymś podobnym) wywołanie funkcji, które wygląda tak: WyswietlWiadomosc(); Ale czemu obok nazwy funkcji znajduje się nawias, który jest pusty? Otóż mogą się w nim znajdować argumenty funkcji, które podstawiamy przy jej wywołaniu, na przykład chcemy zrobić funkcję, która konkretnemu graczowi doda określoną ilość pieniędzy i wyświetli jakąś wiadomość, więc robimy: WiadomoscIKasa(playerid, money) { GivePlayerMoney(playerid, money); //Dodajemy graczowi pieniądze zapisane w 'money' SendClientMessage(playerid, 0xFFFFFFFF, "Dostałeś trochę pieniędzy!"); //Wyświetlamy wiadomość } Po czym gdzieś wywołujemy tą funkcję (ja zrobię to w OnPlayerSpawn): WiadomoscIKasa(playerid, 1000); Pora na wyjaśnienia, w pierwszym argumencie wpisałem playerid, bo OnPlayerSpawn przekazuje nam tą wartość jako ID gracza, który się właśnie zespawnował, za argument 'money' podstawiam 1000, bo chcę, by gracz dostał $1000, czyli funkcja wykonuje teraz takie polecenia: GivePlayerMoney(0, 1000); //0 to przykładowe ID SendClientMessage(0, 0xFFFFFFFF, "Dostałeś trochę pieniędzy!"); Oczywiście argumenty możemy nazywać jak chcemy, nie ma żadnej ściśle określonej reguły. Zwracanie wartości przez funkcję Większość funkcji, których nazwy zaczynają się na Get zwracają jakąś wartość, np. GetVehicleModel zwraca ID modelu danego pojazdu. By napisać funkcję, która zwraca jakąś wartość musimy użyć return, pamiętaj, by po return, które zawsze się wykona (nie ogranicza go żaden warunek) nie może być żadnego kodu! Gdy przypadkiem popełnimy taki błąd, zobaczymy ostrzeżenie – unreachable code. Więc jak użyć return? Przykładowo stworzymy funkcję sprawdzającą, czy gracz aktualnie jest kierowcą jakiegoś pojazdu: IsPlayerDriver(playerid) { if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) //Sprawdzamy stan gracza { //Jeśli jego stan to kierowca pojazdu... printf("%i jest kierowca", playerid); //Wyświetlamy w konsoli wiadomość o tym, że podany gracz jest kierowcą return 1; //Zwracamy 1. W tym miejscu przerywa się dalszy kod tej funkcji. } else //Jeśli nie... { printf("%i nie jest kierowcą", playerid); //Wyświetlamy w konsoli wiadomość o tym, że podany gracz nie jest kierowcą return 0; //Zwracamy 0. W tym miejscu przerywa się dalszy kod tej funkcji. } } Potem używamy takiej funkcji, by sprawdzić czy gracz jest kierowcą if(IsPlayerDriver(playerid) == 1) //Jeśli nasza funkcja zwróci 1 { //Kod } Oczywiście nie jesteśmy uzależnieni tylko od wpisywania własnych wartości, które będzie zwracać funkcja, śmiało możemy użyć np. zmiennej, po prostu zamiast 0, czy 1 wpisujemy jej nazwę. By funkcja zwróciła wartość float, lub bool, musimy użyć tagów, a dokładniej robimy to tak: Float:Funkcja() { new Float:HP; //Tworzymy zmienną float, która będzie przechowywać nasze HP GetPlayerHealth(playerid, HP); //Pobieramy HP return HP; //Zwracamy HP (wartość zmiennoprzecinkową) } To samo tyczy się bool. Pamiętaj, że funkcje z tagami muszą zostać zdeklarowane przed ich użyciem, inaczej zobaczymy ostrzeżenie – function with tag result used before definition, forcing reparse. Referencje Referencje to tak jakby zwracanie wielu wartości jedną funkcją, które zapisujemy do zmiennych, takie coś możemy zobaczyć w funkcji np. GetPlayerPos. By stworzyć referencje przed nazwą argumentu w funkcji dodajemy '&'. Gdy argument poprzedzony '&' zostanie zmieniony w czasie wykonywania się funkcji – taka wartość nadpisze się w użytej przez nas zmiennej/tablicy przy wywołaniu funkcji. Napiszemy teraz przykładową funkcję, będzie ona zwracać nasz poziom życia i kamizelki: ZwrocHPIArm(playerid, &Float:HP, &Float:Arm) { GetPlayerHealth(playerid, HP); //Pobieramy życie gracza i zapisujemy je do zmiennej HP GetPlayerArmour(playerid, Arm); //Pobieramy kamizelkę gracza i zapisujemy ją do zmiennej Arm } Potem używamy: new Float:HP, //Zmienna, do której zapiszemy nasze HP Float:Arm; //Zmienna, do której zapiszemy naszą kamizelkę ZwrocHPIArm(playerid, HP, Arm); //Do zmiennej HP zapisany zostanie nasz poziom życia, a do Arm kamizelka Stock Co tutaj dużo pisać? Po prostu przed nazwą funkcji stawiamy 'stock' i gdy funkcja nie zostanie wywołana nie wyskoczy nam błąd – function 'Nazwa' is never used. Często używa się tego w bibliotekach. Funkcje publiczne Funkcje publiczne różnią się od normalnych tylko tym, że możemy wywoływać je za pomocą funkcji, w których jako argument wpisujemy nazwę, np. SetTimer, CallLocalFunction. Możemy też włączyć funkcję z innego skryptu za pomocą CallRemoteFunction. Ponadto warto wiedzieć, że funkcje publiczne są wolniejsze od normalnych, bo Pawn posługuje się jej nazwą, a nie adresem. Funkcja publiczna wygląda tak: public Funkcja() { //Kod return 1; } Ponadto musimy nad jej definicją zrobić forward, który służy do zapamiętywania nazwy funkcji: forward Funkcja(); //W nawiasach wpisujemy jej argumenty, o ile jakieś ma Według standardów każda funkcja publiczna musi zwracać jakąś wartość. Dziękuję za uwagę.
  11. Przemcio

    Enum

    Witam, z racji tej, że moje forum po długotrwałym hacku upadło całkowicie (niby działa, ale kto o nim jeszcze pamięta?), to wystawiam wszystkie moje poradniki z tamtego forum na te. Co zrobią ze swoimi inni, którzy pisali na tamtym forum - ich wola, więc zaczynajmy. Czym jest enum? Enumerator jest to odpowiednik typu wyliczeniowego, który definiuje zbiór stałych (nie dających się zmienić). Bardzo ułatwia prace z tablicami (zwłaszcza wielowymiarowymi) dzięki automatycznemu nadawaniu wartości poszczególnym nazwom. enum test { JEDEN, //Ma stałą wartość zero DWA, //Ma stałą wartość jeden TRZY //Ma stałą wartość dwa } Jak tworzymy enum? enum Nazwa_Enuma { Jakas_Zmienna, Float:Jakis_Float, Jakas_Tablica[3], bool:Jakis_Bool } Czyli definiujemy tak samo jak normalne zmienne/tablice, tylko, że bez new. Pamiętaj o przecinku! Po prawie każdej (oprócz ostatniej) zmiennej/tablicy stawiamy przecinek! W Pawn zmienne/tablice w enum nie mogą mieć pierwotnie przypisanej wartości, czyli takie cos: enum Nazwa_Enuma { Jakas_Zmienna, Float:Jakis_Float = 10.0, //Błąd! Jakas_Tablica[3] = "aa", //Błąd! bool:Jakis_Bool } Skończy się błędem. Teraz stworzymy jakąś tablicę, która będzie 'obsługiwać' nasz enumerator: new Tablica[Nazwa_Enuma]; Użycie tego jest bardzo proste: Tablica[Nazwa_ZmiennejLubTablicy] Czyli np. if(Tablica[Jakas_Zmienna] == 3) { //Kod } Albo Tablica[Jakas_Tablica][1] = 'b'; Możemy robić wszystko to samo co z normalnymi zmiennymi/tablicami. Ciekawostka Zamiast wpisywać nazwę zmiennej/tablicy przy używaniu tablicy z enumeratorem możemy wpisać kolejną liczbę, czyli enum Nazwa_Enuma { Jakas_Zmienna, //To jest to samo co 0 Float:Jakis_Float, //To jest to samo co 1 Jakas_Tablica[3], //To jest to samo co 2 bool:Jakis_Bool //To jest to samo co 3 //Itd. } Tablica[1] = 2.2; Jednak wyskoczy nam ostrzeżenie – tag mismatch. Dziękuję za uwagę.
  12. Przemcio

    Dialogi (GUI)

    Witam, z racji tej, że moje forum po długotrwałym hacku upadło całkowicie (niby działa, ale kto o nim jeszcze pamięta?), to wystawiam wszystkie moje poradniki z tamtego forum na te. Co zrobią ze swoimi inni, którzy pisali na tamtym forum - ich wola, więc zaczynajmy. W tym poradniku opiszę działanie okien dialogowych (GUI), które zostały wprowadzone wraz z wydaniem SA:MP 0.3. Co to jest? Raczej nie muszę tłumaczyć, więc zaczynamy! Jak stworzyć (a raczej wyświetlić) okno dialogowe? Do tego służy nam funkcja ShowPlayerDialog, jej definicja jest nastepująca: ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]); playerid - ID gracza, któremu ma wyświetlić się dialog, dialogid - ID dialogu, możemy wpisać tu co chcemy, ważne, żeby się nie powtarzał, style - styl dialogu. Poniżej znajdują się wszystkie definicje stylów (z a_samp.inc): #define DIALOG_STYLE_MSGBOX 0 #define DIALOG_STYLE_INPUT 1 #define DIALOG_STYLE_LIST 2 Opis wraz z screen'ami napiszę niżej, caption[] - nagłówek, info[] - tekst znajdujący się w 'środku' dialogu, button1[] - przycisk znajdujący się po lewej stronie, button2[] - przycisk znajdujący się po prawej stronie. Pamiętaj, że gdy wyświetlasz okno dialogowe w OnPlayerConnect - wybieranie skinów zostanie zablokowane aż do naciśnięcia jakiejś opcji. DIALOG_STYLE_MSGBOX Przykładowy dialog stworzony za pomocą tego stylu: ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "caption[] - tutaj znajduje się nagłówek", "info[] - tutaj znajduje się jakiś tekst\nPrzenosimy go do nastepnej linii za pomoca \\n", "button1", "button2"); DIALOG_STYLE_INPUT Przykładowy dialog stworzony za pomocą tego stylu: ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "caption[] - nagłówek", "info[] - jakiś dodatkowy tekst", "button1", "button2"); W tym dialogu możemy wpisać jakiś tekst (w grze oczywiście). DIALOG_STYLE_LIST Przykładowy dialog stworzony za pomocą tego stylu: ShowPlayerDialog(playerid, 0, DIALOG_STYLE_LIST, "caption[] - nagłówek", "info[] - tutaj znajdują się opcje\nOddzielamy je poprzez \\n\nKolejna opcja\nI kolejna", "button1", "button2"); W tym dialogu możemy wybrać którąś z opcji znajdujących się w info[]. OnDialogResponse Callback, który wywołuje się po nacisnięciu którejś opcji w naszym dialogu, wygląda on tak: public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { //Kod return 1; } playerid - nie muszę tłumaczyć, dialogid - ID dialogu, w którym została naciśnięta jakaś opcja, response - wynosi 1, gdy naciśnięty zostal lewy przycisk, a 0 gdy prawy, listitem - przechowuje kolejny numer naciśniętej opcji z DIALOG_STYLE_LIST (liczone od 0), inputtext - przechowuje tekst wpisany przez nas w dialogu DIALOG_STYLE_INPUT, lub opcje z dialogu DIALOG_STYLE_LIST. Zrobimy teraz jakieś proste przykłady wykorzystując wszystkie style dialogów. Przykładowy dialog z użyciem MSGBOX'a: ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Regulamin", "Regulamin!\n\n1. Nie strzelaj gdy nie masz amunicji\n2. Zgaś światło, tak, żeby było jasno\n3. Nie mocz się wchodząc do wody\n\nCzy akceptujesz regulamin?", "Tak", "Nie"); Chcemy, by po naciśnięciu 'Tak' gracz został na serwerze, w przeciwnym razie dostaje kick'a, więc w OnDialogResponse robimy: if(dialogid == 0) //0, bo taka jest wartość w drugim argumencie funkcji ShowPlayerDialog { if(response == 1) //Sprawdzamy, czy został naciśnięty lewy przycisk SendClientMessage(playerid, 0xFFFFFFFF, "Zaakceptowałeś regulamin. Od teraz wychodzisz z wody suchy."); //Jeśli tak, wysyłamy wiadomość else //Jeśli nie... { SendClientMessage(playerid, 0xFFFFFFFF, "Niestety - GTFO"); //... Wysyłamy wiadomość i... Kick(playerid); //... Wyrzucamy gracza } } Teraz przykład z użyciem INPUT'a: ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Jesteś głupkiem", "Czy się z tym zgadzasz?\nJak tak, to wpisz tutaj ''jestem glupi''.\nJak nie to ban.", "Już!", "Sam jesteś"); Chcemy, by po naciśnięciu 'Już!' sprawdzało, czy wpisany tekst to "jestem glupi", jeśli tak, wyświetla informacje, jeśli nie - ban, to samo w przypadku naciśnięcia "Sam jesteś", więc: if(dialogid == 1) //1, bo taka jest wartość w drugim argumencie funkcji ShowPlayerDialog { if(response == 1) //Sprawdzamy, czy został naciśnięty lewy przycisk { if(strcmp(inputtext, "jestem glupi", false) == 0) //Sprawdzamy, czy wpisany tekst to "jestem glupi" za pomocą funkcji strcmp SendClientMessage(playerid, 0xFFFFFFFF, "Spoko."); //Jeśli tak, wysyłamy wiadomość else //Jeśli nie... { SendClientMessage(playerid, 0xFFFFFFFF, "Ty kłamco!"); //... Wysyłamy wiadomość... Ban(playerid); //... I banujemy gracza } } else //Jeśli został naciśnięty drugi przycisk... { SendClientMessage(playerid, 0xFFFFFFFF, "Ty kłamco!"); //... Wysyłamy wiadomość... Ban(playerid); //... I banujemy gracza } } Ostatni przykład - z użyciem listy: ShowPlayerDialog(playerid, 2, DIALOG_STYLE_LIST, "Jak nazywa się Monika Brodka?", "A. Yyy, mleko?\nB. Przemcio\nC. Nie, to na pewno Destrojer", "Zrobione", "Za trudne"); Chcemy, by po naciśnięciu na jakąś opcję sprawdzało, czy jest ona poprawna (jako poprawną weźmy odpowiedź B). Jeśli jest poprawna, to wyświetli wiadomość i doda pieniędzy, jeśli nie, wyświetli tylko wiadomość, zaczynamy: if(dialogid == 2) //2, bo taka jest wartość w drugim argumencie funkcji ShowPlayerDialog { if(response == 1) //Sprawdzamy, czy został naciśnięty lewy przycisk { switch(listitem) //Switch'ujemy listitem (możemy robić tez if'y, ale to jest szybsze i łatwiejsze { case 0: //Jeśli wartość to 0... SendClientMessage(playerid, 0xFFFFFFFF, "Fail, co to ma być?"); //Wysyłamy wiadomość case 1: //Jeśli wartość to 1... { SendClientMessage(playerid, 0xFFFFFFFF, "Tak, skąd wiedziałeś? Destrojer Ci powiedział..."); //Wysyłamy wiadomość GivePlayerMoney(playerid, 5000); //Dajemy graczowi trochę kasy } case 2: //Jeśli wartość to 2... SendClientMessage(playerid, 0xFFFFFFFF, "Jak mogłeś myśleć, ze Monika Brodka nazywa się Destrojer?"); //Wysyłamy wiadomość } } else //Jeśli został naciśnięty drugi przycisk... SendClientMessage(playerid, 0xFFFFFFFF, "To spieprzaj."); //Wysyłamy wiadomość } Dziękuję za uwagę.
  13. Przemcio

    [DEMO]: HorrorMode

    Ta, a na GG mi pisałeś, że chcesz pobić moje SH 1 : D Sorry za offtop. //Edit Dorównać*
  14. Przemcio

    [DEMO]: HorrorMode

    Żeby uruchomić CNPC na XP musicie mieć jego zrekompilowaną wersję przez bodajże StrickenKid - link. Zaraz zobaczę Twoje demo i dzisiaj zaczynam robić SH 2 : D Edit za jakiś czas. //Edit Głosy straaaasznie tandetne, słychać, że pobierane z neta : D Trochę dziwny TD od napisów, takie paski robi się w cutscenkach itp. Niezbyt mi się podobało, zjadę Cię moim SH 2. Też wydam demo : P
  15. Przemcio

    Videorecenzje horrorów

    Dzięki za oceny : P Tak.
×