Witam,
chcia?bym zrobi? system po?aru. Chc? zrobi? co? bardzo prostego. Ot?? aby po wpisaniu komendy np. /pozar wybucha? po?ar w tym miejscu gdzie stoj?. To jest bana?, ale sk?d wzi?? po?ar? To jest jaki? obiekt czy co? Jak ustali? rozmiar po?aru oraz co zrobi? aby co? wykona?o si? po jego ugaszeniu? S? jakie? funkcje za to odpowiadaj?ce?
-,- tyle ile ci powiedzia?em powinno ci starczy? na rozpocz?cie pisania skryptu. Jakie id ma po?ar ? No jak go tworzysz to p?tla b?dzie robi? id jak zrobisz enuma i max_pozarow np. 20 , twoje pytanie jakie id ma po?ar oznacza to ?e nie masz zielonego poj?cia o czym my piszemy.
Iggy, ?le zroumia?em , ehh chodzi?o mu o id po?aru czyli obiektu -,- niech napisze ?e id obiektu po?aru , zreszt? google od tego jest wszystko mo?na znale?? a po?owa na tym forum chcia?a by odrazu gotowca
Kazami, na google wszystko mo?na znale??? Tak, mo?na znale??, ale mo?na znale?? na google co? bardzo szybko dlatego ?e w?a?nie ludzie pisz? o tym samym po 50 razy na ka?dym innym forum, a jak by by? tylko 1 taki temat, i nie by?o by ?adnych s??w kluczowych? Nie znalaz? by? tego co by? chcia?. Masz do niego jakie? pretensje ?e zaczyna programowa? i potrzebuje pomocy, ogarnij cz?owieku, bo odk?d zobaczy?e? ten j?zyk to PAWN masterem nie by?e?, te? musia?e? si? nauczy?, wi?c..
Ale mu tu bardzo pomog?e?, my?lisz ?e pocz?tkuj?cy w PAWN wie jak zapisa? HP robi?c enuma w zmiennej? Nie, mog?e? mu da? jaki? link do systemu po?ar?w, czy te? jak zapisywa? dane, strasznie si? natrudzi?e?, tak mu pomog?e?, ?e a? da?e? gotowca, ogarnij cz?owieku.
Pisanie systemu po?ar?w musisz zacz?? od kuchni. SA:MP nie oferuje synchronizacji po?ar?w, jakie znasz z GTA, dlatego na og?? nie mo?esz stworzy? ognia (poza stworzeniem wybuchu, ale to nie b?dzie satysfakcjonuj?ce).
Dlatego taki system po?ar?w b?dzie trzeba napisa? zupe?nie od nowa. Je?eli nigdy nie pisa?e? tego typu rzeczy, to mo?e to by? dla Ciebie trudne. Najpierw postaw sobie problem.
Potrzebujemy systemu po?ar?w. Czym jest i co ma robi??
Potrzebujemy ognia, SA:MP daje nam obiekt ognia.
Ogie? musi zabiera? HP graczom w pobli?u.
Ogie? musi da? si? ugasi?.
Rozprzestrzenianie si? te? mo?na zrobi?, polecam do tego plugin mapandreas. O ile stworzenie obiektu ognia w danym miejscu jest proste, to do jego ugaszenia i zabierania HP potrzeba czego? wi?cej, dlatego na tym si? skupi?.
Jak wiemy, skrypty w og?le polegaj? na reakcjach. Gracz wysy?a informacj? do serwera, a serwer (zgodnie z tym, co ma zdefiniowane w skrypcie) odpowiednio reaguje na tak? informacj? i wysy?a odpowied? do gracza.
Skrypt sam nie jest inteligentny, jest algorytmem. Nie ma w nim funkcji "NiechOgienRaniGraczyWPobli?u". Otrzymanie informacji od gracza - przeanalizowanie przez skrypt - wys?anie odpowiedzi, inaczej skryptu nie wywo?asz. St?d w?a?nie callbacki, kt?re reaguj? na dan? czynno?? gracza.
Wobec tego funkcja ranienia graczy przez ogie? musi by? napisana od zera. Jak to ma dzia?a?? Zacznijmy od p?tli.
for(new i; i<MAX_PLAYERS; i++)
{
//skrypt
}
tu bym osobi?cie skorzysta? z nowej funkcji sampa daj?c? mo?liwo?? zoptymalizowania takiej p?tli, ale to teraz tylko by nakomplikowa?o ten skrypt i utrudni?o t?umaczenie.
Mamy p?tl?, kt?ra wykona "// skrypt" tyle razy, ile mo?e by? graczy na serwerze. Posiada ona te? indeks, zmienn? o nazwie i. Jak nazwa wskazuje zmienia si? ona. Przy ka?dym wykonaniu p?tli i b?dzie wynosi?o tyle, ile razy do tej pory wykona? si? kod.
Tym razem p?tla wykona si? 500 razy, i je?li gracz o id = i (razie, za kt?rym wykona?a si? petla) jest na serwerze, to wykona si? to, co mamy w miejscu //skrypt.
Teraz musimy sprawdzi?, czy gracz znajduje si? blisko, powiedzmy, 3 metry od ognia. SA:MP daje nam funkcj? IsPlayerInRangeOfPoint(id gracza, dystans, x, y, z), kt?ra sprawdzi, czy gracz znajduje si? w promieniu dystans od punktu x, y, z. Ale my nie mamy x, y, z!
Dlatego w momencie tworzenia obiektu ognia na ziemi musisz zapisa? jego pozycj? do zmiennej globalnej. Je?eli chcesz, by ognia by?o wi?cej, musisz u?y? tablicy. Je?eli nie wiesz, czym jest tablica, to ci??ko, bo nie widzi mi si? teraz Ci t?umaczy? ca?ej dokumentacji pawn. Dlatego w celach edukacyjnych zapiszemy pozycje ognia do jednej zmiennej, wi?c w jednym momencie na serwerze b?dzie m?g? by? tylko jeden ogie?, jak ogarniesz to, to sobie to kiedy? przepisz na tablice.
Gdzie? u g?ry gamemode'a, pod include'ami musisz stworzy? trzy zmienne globalne typu float. Dlaczego? Bo ze zmiennych globalnych b?d? korzysta? trzy funkcje.
- Tworzenie ognia zapisze pozycje x, y, z ognia do tych zmiennych.
- Ranienie przez ogie? b?dzie musia?o te pozycje x, y, z wykorzysta?, by sprawdza?, czy gracz jest w pobli?u ognia.
- Gaszenie tak samo.
Dlaczego float? Bo zwyk?a zmienna tworzona samym new to liczba ca?kowita (1, 12, -120, 1231). A pozycje w SA:MP s? ju? w zbiorze liczb wymiernych (0.31; 431.2131), dlatego takiego typu zmiennych potrzebujemy.
A w miejscu skrypt zapisz w zmienej lokalnej hp gracza, odejmij od niej jakie? 5hp i nadaj graczowi HP wg. tej zmiennej z tymi odj?tymi 5cioma hp. A funkcj? z p?tl? umieszczamy oczywi?cie w timerze, co sekund? wykonywanym wielokrotnie.
Jak jeste? ?ebski, to gaszenie napiszesz sam. Jak nie, to znaczy, ?e i ten m?j wyw?d wy?ej by? niepotrzebny, bo i tak by? gotowca wola?. Brak tabulator?w nieumy?lny, ale okno tekstowe w phpbb to kiepskie ?rodowisko programistyczne.
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach