Skocz do zawartości
Kaz

[Filterscript/Include] System pożarów

Rekomendowane odpowiedzi

Cześć, ostatnio dość sporo osób miało z tym problem, sam przeszukałem trochę forów w poszukiwaniu takiego skryptu, ale niestety nie znalazłem. A, że ostatnio więcej wolnego to postanowiłem coś takiego sam zrobić. Na czym polega? Jest to biblioteka/skrypt (łatwa możliwość edycji prosto na skrypt).

 

Dlaczego biblioteka?

- Odpowiedź jest prosta, to użytkownik/programista sam ustala co ma się dziać w dowolnym momencie. Aktualnie skrypt ma możliwość dokonania wyboru w 4 krokach, które według mnie w zupełności wystarczą, a są to:

 

 

1.

forward OnPlayerPutOutFire(playerid, id, success);
public OnPlayerPutOutFire(playerid, id, success)

Ta prosta funkcja aktywuje się kiedy gracz gasi pożar lub go całkowicie ugasił. Żeby to odróżnić dodałem parametr success, który za to odpowiada, a wszystkie parametry to:

 

 

playerid - id gracza, który gasi

id - id pożaru, który jest gaszony

success == 0 | gracz w dalszym ciągu gasi pożar

success == 1 | gracz ugasił pożar (automatycznie on się usuwa)

 

Teraz pytanie, czy to się przyda? Tak i to bardzo. Przykładem może być tutaj informowanie gracza o tym, że ciągle gasi pożar, a na koniec jeśli go ugasił dać nagrodę, czy dodać życie.

BARDZO WAŻNE! TA FUNKCJA DZIAŁA TYLKO WTEDY JEŚLI GRACZ MA BROŃ O ID 42 (gaśnica) I BEZPOŚREDNIO GASI POŻAR (tzn. patrzy na ogień i naciska PPM+LPM), JEŻELI CHCESZ, ABY DZIAŁAŁO NA WSZYSTKICH SPÓJRZ NA PUNKT 2.



Przykładowy kod

forward OnPlayerPutOutFire(playerid, id, success);
public OnPlayerPutOutFire(playerid, id, success){ 
    if(succes) { 
        SendClientMessage(playerid, -1, "ugasiłeś pożar! gratulacje!"); 
        GivePlayerMoney(playerid, Fire[id][Health]*500); 
    } 
    else{ 
        SendClientMessage(playerid, -1, "Gasisz pożar."); 
    } 
    return 1;
}

2.

forward OnPlayerNearFire(playerid, id);
public OnPlayerNearFire(playerid, id)

Z kolei ta funkcja aktywuje się kiedy gracz znajdzie się w pobliżu ognia. Parametry tej funkcji:
 

 

 

playerid - id gracza, który znajduje się blisko ognia

id - id pożaru

Przykładowe użycie? Zmniejszanie życia gracza, jego spłonięcie, dodawanie efektów (np. textdrawy itp.) Ważne jest to, że timer wykonuje się co 500ms (czyli 1/2 sekundy), więc jeżeli chcesz, aby zabierało rzadziej zdrowie gracza to po prostu należy zwiększyć cykl odświeżania lub dodać tam warunek z użyciem gettime (tak jak czasowe zablokowanie komendy).



Przykładowy kod

forward OnPlayerNearFire(playerid, id);
public OnPlayerNearFire(playerid, id){ 
    new Float:hh; 
    GetPlayerHealth(playerid,hh); 
    SetPlayerHealth(playerid, hh-5); 
    return 1;
}

3.

forward OnFireAdd(id);
public OnFireAdd(id)

Kolejna funkcja aktywuje się w momencie utworzeniu nowego pożaru, a ma z kolei tylko jeden parametr:

 

 

id - id nowego, utworzonego pożaru

 

Do czego może się przydać? Sprawa tutaj jest bardziej skierowana do frakcji/administratorów. Można ich poinformować, że wybuchł nowy pożar.
 

Przykładowy kod

forward OnFireAdd(id);
public OnFireAdd(id){ 
    printf("utworzono pożar o id: %d", id); 
    return 1;
}

4.

forward OnFireDelete(id);
public OnFireDelete(id)

Ostatnia funkcja jest bardzo podobna do tej poprzedniej, a jej parametry są takie same. Oferuje to samo, a mianowicie poinformowanie o usunięciu pożaru.
 

 

Przykładowy kod

forward OnFireDelete(id);
public OnFireDelete(id){ 
    printf("usunięto pożar o id: %d"); 
    return 1;
}
stock AddFire(Float:X, Float:Y, Float:Z, hh, delh)

Z kolei jej można używać w dowolnym miejscu, dodaje ona pożar na określonej pozycji. Dlaczego nie zrobiłem tego automatycznego? Po pierwsze niektóre serwery nie chcą, aby ogień był w danym mieście, na danym miejscu. Po drugie sam nie posiadam tyle pozycji, aby okropnie to zróżnicować, więc nawet nie było sensu. Jeżeli chcesz zrobić, aby ogień pojawiał się w losowym miejscu co określony czas musisz stworzyć timer, a następnie wylosować pozycje i stworzyć pożar, według wyżej podanej funkcji.

 

DOWNLOAD

 

http://pastebin.com/mCmzxBQC

 

NOWA WERSJA PARĘ POSTÓW NIŻEJ!

 

Jak zainstalować?

1. Kopiujemy z pastebin, otwieramy notatnik, wklejamy to i zapisujemy jako np. fire.inc

2. Następnie wrzucamy wcześniej stworzony plik do folderu z innymi includami

3. Dodajemy w GM/skrypcie #include <fire>

4. Dodajemy do OnFilterScriptInit/OnGameModeInit funkcję FireSystem_Init();

5. Gotowe

 

instrukcja nie dotyczy nowej wersji!

 

 

 

 

Dodatkowe informacje:

 

1. Biblioteka oczywiście ma swoje funkcje, które można używać manualnie: AddFire, DeleteFire, GetClosestFire, GetFreeFireID.
2. Czy skrypt posiada bugi? Tego nie jestem pewien, ale wątpie.
3. Czy skrypt jest optymalnie napisany? Nigdy jakoś nie przywracałem do tego uwagi, ale myślę, że tak.
4. Skrypt ma także własne limity i ustawienia:
- MAX_FIRE [maksymalna liczba pożarów], domyślnie jest to 20, ale łatwo to zmienić: przed #include <fire> dodaj #define MAX_FIRE [liczba]
- TXT_TEXT [tekst], tekst, który ustawia się po stworzeniu pożaru, można w tym makro dodawać argumenty, kolory itp. [zmieniamy to w include]

Edytowane przez Kaz

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Całkiem inaczej zbudowany. Wystarczy spojrzeć na kod, żeby zobaczyć ogromne różnice, no chyba chodzi Ci o to, że też są 3d teksty i obiekty takie same to uprzedzam - skrypt robiłem z myślą o jednym użytkowniku, który działał na powyższym systemie, sam nie mam czasu na takie duperelki i kolor, id obiektu po prostu użyłem taki sam :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Skrypcik fajny, prosty i przejrzysty.

Może jeszcze w pierwszym temacie w opisie napisać, że wszystkie callbacki wykonują się co 500ms.

forward OnPlayerNearFire(playerid, id);
public OnPlayerNearFire(playerid, id){
	new Float:hh;
	GetPlayerHealth(playerid,hh);
	SetPlayerHealth(playerid, hh-5);
	return 1;
}
Chodzi o to, że jak ktoś u żyje takiego kodu to żeby wiedział, żę HP będzie zabierało co 500ms.

Pozdrawiam.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Skrypcik fajny, prosty i przejrzysty.

Może jeszcze w pierwszym temacie w opisie napisać, że wszystkie callbacki wykonują się co 500ms.

forward OnPlayerNearFire(playerid, id);
public OnPlayerNearFire(playerid, id){
	new Float:hh;
	GetPlayerHealth(playerid,hh);
	SetPlayerHealth(playerid, hh-5);
	return 1;
}
Chodzi o to, że jak ktoś u żyje takiego kodu to żeby wiedział, żę HP będzie zabierało co 500ms.

Pozdrawiam.

 

 

dzięki edytowałem, w dodatku w nowszej wersji będzie możliwość wybory cyklu odświeżania, lub zainicjowania całej funkcji w swoim timerze, co spowoduje ogólne zmniejszenie się ich ilości

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Brawo! 

 

Bardzo fajna biblioteka :D

 

I może pokombinował byś coś z MapAndreas ? Złączenie tego bylo by świetne i na pewno wielu by pomogło. Chodzi mi o powstawanie losowych pożarów na całej mapie. Oczywiście to jeśli będziesz miał czas.  

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Próbuj zmieniać tutaj: if(Fire[use] == true && IsPlayerInRangeOfPoint(playerid, 1, Fire[fX], Fire[fY], Fire[fZ]))

Ale nie gwarantuje, że to będzie działać (Popatrz na funkcje od sprawdzenia czy gracz patrzy na obiekt)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ok. Zmieniłem to na 10. Jak jestem trochę dalej od pożaru tak na ok jakieś 10m to normalnie moge gasić ale jak podchodzę bliżej to nie mogę już gasić.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nowa wersja pojawi się do końca tygodnia. Wprowadzone opcje:

-manualne ustawienie hp pożaru oraz w jakim stopniu ma się gasić,
-hook ongamemodeinit/onfilterscriptinit (już nie musisz nic dodawać, aby powstał pożar)
-automatyczne dodawanie pożarów z użyciem MapAndreas,

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

UPDATE!

 

I tak właśnie zapowiedziana nowa wersja doczekała się wydania! Skrypt jest teraz bardziej samodzielny, a dla ułatwienia stworzyłem dwie wersję:

  • jako biblioteka (include) - wymaga dodania do GM/FS
  • jako osobny skrypt - nie wymaga niczego do działania

Co znajduje się w nowej wersji?

  • hook OnFilterScriptInit/OnGameModeInit (dotyczy tylko biblioteki) - nie trzeba dodawać funkcji w swojej mapie,
  • możliwość gaszenia pożaru wozem strażackim (model 407),
  • możliwość manualnego ustawienia HP pożaru + wartości jego odejmowania,
  • całkowity HIT: losowe pożary, obecnie jest ponad 20 pozycji rozmieszczonych na całej mapie, a skrypt nie wymaga dodatkowych pluginów,
  • drobne poprawki

Download

 

 

W pierwszym poście zaktualizowałem obecne funkcje i dodatkowe informacje :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×