Strona główna
Witaj, nieznajomy!

Helikoptery

Przed przeczytaniem tego poradnika, należy zapoznać się z poprzednimi. Ominę tutaj sekcję "MAIN", gdyż omawiana ona była w podstawach tworzenia misji. W tym poradniku nie będę też szczegółowo opisywał podstawowych rzeczy typu tworzenie pętli, pojazdów itp.

Na początek najlepiej przemyśleć cały plan wydarzeń. Ja wykombinowałem coś takiego: Jeden człowiek ma za zadanie dostarczyć paczkę w pewne miejsce. W tym celu leci tam helikopterem. Podczas lotu helikopter uległ awarii i spadł na ziemię. Postać, która miała dostarczyć paczkę zginęła w eksplozji, więc gracz będzie musiał zrobić to samemu. Jakby zmartwień było mało, zadanie utrudnia nam helikopter wojskowy (Hunter) strzelając do nas z rakiet. Gracz musi dojść do celu żywy i oddać paczkę.
Kolejnym krokiem jest zebranie wszystkich potrzebnych współrzędnych. Gdy już to wykonaliśmy, czas zająć się stroną kodową.

Kod:
:HELI
thread 
'HELI'

0247: request_model #MAVERICK
0247: request_model 60 // Dostawca

0247: request_model 50 // Pilot

0247: request_model 101 // Odbiorca

0247: request_model #craigpackage // Paczka

0247: request_model #HUNTER
038B: load_requested_models


Na początku deklarujemy naszą misję nadając jej nazwę "HELI". Później ładujemy wszystkie potrzebne nam modele.

Kod:
fade 0 0
00A5: $HELI = create_car #MAVERICK at 1765.8331 -2286.6448 26.796
0175: set_car $HELI z_angle_to 1.8056

0129: $PILOT = create_actor 24 50 in_car $HELI driverseat
00A1: put_actor $PLAYER_ACTOR at 1778.4696 -2282.0828 26.796
$PLAYER_CHAR.CanMove(False)
009A: $DOSTAWCA = create_actor 24 60 at 1776.5247 -2281.853 26.796
0639: AS_actor $PLAYER_ACTOR rotate_to_actor $DOSTAWCA
0639: AS_actor $DOSTAWCA rotate_to_actor $PLAYER_ACTOR

02A3: enable_widescreen 1
Camera.SetPosition(1776.5983, -2284.8704, 26.796, 0.0, 0.0, 0.0)
Camera.OnPed($PLAYER_ACTOR,15,2)
fade 
1 1000
gosub 
@check_fade


Na starcie zaciemniliśmy obraz, aby nie było widać tworzenia poszczególnych objektów. Teraz przygotowywujemy wszystko do początkowej scenki. Tworzenie helikopterów odbywa się identycznie jak tworzenie samochodów. To samo tyczy się funkcji manipulującymi autami. Później tworzymy aktora, który będzie pilotem helikoptera. Następnie umieszczamy gracza w określonym miejscu i uniemożliwiamy mu ruch. Kolejną tworzoną postacią jest dostawca. Potem obracamy dostawcę i gracza ku sobie nawzajem. Po tym ustawiamy kamerę w danym punkcie i obracamy ją w kierunku gracza. Ostatnimi dwoma linijkami rozjaśniamy obraz i sprawdzamy czy rozjaśnianie już się zakończyło.

Kod:
054C: use_GXT_table 'HELI'
00BC: show_text_highpriority GXT 'TXT1' time 2500 flag 1
0605: actor $PLAYER_ACTOR perform_animation_sequence "IDLE_CHAT" from_file "PED" 4.0 loop 1 0 0 0 2500 ms
wait 
2500
05CA: AS_actor $DOSTAWCA enter_car $HELI passanger_seat 0 4000 ms
Camera.OnVehicle($HELI,15,2)


Zaczynamy używać tabeli w pliku GXT o nazwie "HELI". Wyświetlamy wartość z owej tabeli. Używamy znanej już animacji rozmowy. Czekamy 2,5 sekundy, aby animacja już się zakończyła. Następnie każemy dostawcy wejść do helikoptera jako pasażer. Obracamy wcześniej ustawioną kamerę w stronę helikoptera.

Kod:
:check1
wait 
10
if
00DB: actor $DOSTAWCA in_car $HELI
jf 
@check1

0743: heli $HELI fly_to 1766.3118 -1774.8507 52.4687 altitude 60.0 0.0

:check2
wait 
10
if
01AD: car $HELI sphere 0 near_point 1766.7302 -2220.8354 23.6551 radius 15.0 15.0 70.0
jf 
@check2

0564: heli $HELI simulate_crash_landing
wait 
4000
fade 
0 1000
gosub 
@check_fade


Pierwsza pętla sprawdza czy dostawca jest już w helikopterze. Jeśli tak to helikopter zaczyna lecieć do wyznaczonego punktu, gdzieś tam daleko. Następna pętla sprawdza czy helikopter znajduje się nad danym punktem. Jeśli tak to wykonujemy funkcję symulującą spadanie helikoptera. Następnie czekamy 4 sekundy i zaciemniamy obraz.

Kod:
00AB: put_car $HELI at 1766.7302 -2220.8354 23.6551
0224: set_car $HELI health_to 0

0107: $PACZKA = create_object #craigpackage at 1768.9854 -2219.6375 23.2551
0188: $MARKER1 = create_marker_above_object $PACZKA

02A3: enable_widescreen 0
015A: restore_camera
fade 
1 1000
gosub 
@check_fade
00BC: show_text_highpriority GXT 'TXT2' time 5000 flag 1
$PLAYER_CHAR.CanMove(True)


Mamy zaciemniony obraz, więc gracz nie będzie widział wprowadzanych powyżej zmian. Na początku umieszczamy helikopter w danym miejscu i ustawiamy jego wytrzymałość na 0 co powoduje jego wybuch. Następnie tworzymy objekt o nazwie "PACZKA". Ustalamy jego model na #craigpackage i umieszczamy w podanym miejscu. Po utworzeniu naszej paczki tworzymy nad nią marker. Wyłączamy ekran "kinowy" i przywracamy domyślną kamerę, czyli widok zza pleców gracza. Rozjaśniamu ekran, wyświetlamy wartość z komórki "TXT2" i umożliwiamy graczowi ruch.

Kod:
:check_dead
wait 
10
if
0118: actor $PLAYER_ACTOR dead
then
jump @MISSION_FAILED
end
jf @check3

:check3
wait 
10
if 
and
0472: actor $PLAYER_ACTOR near_object_in_rectangle $PACZKA radius 2.0 2.0 flag 1 on_foot
00E1: player 0 pressed_key 15
jf 
@check_dead


W pierwszej pętli widzimy trochę inną konstrukcję "if". Sprawdzamy czy gracz nie żyje, następnie występuje słowo then (ang. po czym), więc jeśli jest martwy to przeskakujemy do procedury "MISSION_FAILED" i kończymy blok "if" słowem end. Jeśli natomiast gracz wciąż żyje to idziemy do "check3". W drugiej pętli znów mamy inną konstrukcję "if". Słowo and (ang. i) dodałem po if, dlatego że chcemy sprawdzić czy dwa poniższe warunki są prawdziwe. Jeśli gracz jest blisko objektu (w kwadracie o wymiarach 2.0 x 2.0) na nogach i przycisnął klawisz wejścia/wyjścia z pojazdy (15 - domyślnie F, ENTER) to przejdź do dalszej części misji. Jeśli nie to idziemy ponownie sprawdzić czy gracz jest martwy.

Kod:
00BC: show_text_highpriority GXT 'TXT3' time 3000 flag 1
0164: disable_marker $MARKER1
0108: destroy_object $PACZKA

00A5: $HUNTER = create_car #HUNTER at 1727.468 -2477.4246 13.5547
0724: heli $HUNTER follow_and_attack_player $PLAYER_CHAR radius 50.0
0129: $PILOT2 = create_actor 23 50 in_car $HUNTER driverseat

02A7: $CEL = create_icon_marker_and_sphere 56 at 2806.1621 -1446.0071 36.0682
009A: $ODBIORCA = create_actor 24 101 at 2806.0654 -1444.6942 36.0704
05D4: AS_actor $ODBIORCA rotate_angle 180.0


Wyświetlamy kolejny tekst. Wyłączamy marker znad objektu. Objekt także niszczymy. Następnie tworzymy kolejny helikopter, tym razem wojskowy. Po utworzeniu huntera, stosujemy funkcję, która każe helikopterowi podąrzać za graczem i go atakować w odległości od ziemi 50.0 . Kolejna linijka tworzy aktora, który będzie pilotował helikopter. Jest to konieczne, gdyż sam helikopter nie wykona poprzedniej funkcji. Następnie tworzymy pole, do którego ma dojść gracz. Obiorcę tworzymy obok tego celu i obracamy go o 180 stopni.

Kod:
:check_dead2
wait 
10
if 
or
0118: actor $PLAYER_ACTOR dead
0118: actor $ODBIORCA dead
then
jump @MISSION_FAILED
end
jf @check4

:check4
wait 
10
if
00ED: actor $PLAYER_ACTOR 0 near_point 2806.1621 -1446.0071 36.0682 radius 0.5 0.5 on_foot
jf 
@check_dead2


W pierwszej pętli znów mamy nieco inną konstrukcję if, tym razem z dopiskiem or (ang. lub). Sprawdzamy czy gracz LUB odbiorca nie żyją. Jeśli tak, to przeskocz do procedury "MISSION_FAILED". Jeśli nie to idziemy do "check4". Druga pętla sprawdza czy gracz jest w podanym miejscu na nogach. Jeśli tak, kontynuujemy misję, jesli nie to znów sprawdzamy czy choć jedna z dwóch podanych postaci jest martwa.

Kod:
02A3: enable_widescreen 1
$PLAYER_CHAR.CanMove(False)
Camera.SetPosition(2805.1621, -1447.0071, 35.0682, 0.0, 0.0, 0.0)
Camera.OnPed($ODBIORCA,15,2)
00BC: show_text_highpriority GXT 'TXT4' time 4000 flag 1
0605: actor $ODBIORCA perform_animation_sequence "IDLE_CHAT" from_file "PED" 4.0 loop 1 0 0 0 4000 ms
wait 
4000
fade 
0 500
gosub 
@check_fade
02A3: enable_widescreen 0
015A: restore_camera
$PLAYER_CHAR.CanMove(True)

jump 
@MISSION_PASSED


Włączamy ekran "kinowy". Uniemożliwiamy graczowi ruch. Ustawiamy kamerę. Wyświetlamy tekst z tabeli GXT. Animujemy odbiorcę przez 4 sekundy. Czekamy aż skończy animację i zaciemniamy ekran, gdyż później będziemy niszczyć wszystkie postacie, pojazdy i objekty. Wyłączamy ekran "kinowy". Przywracamy domyślną kamerę i umożliwiamy ruch. Na koniec przeskakujemy do procedury "MISSION_PASSED".

Kod:
:check_fade
wait 
10
if
816B: not fading
jf 
@check_fade
return

:MISSION_FAILED
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1
009B: destroy_actor $PILOT
009B: destroy_actor $PILOT2
009B: destroy_actor $DOSTAWCA
009B: destroy_actor $ODBIORCA
00A6: destroy_car $HELI
00A6: destroy_car $HUNTER
0164: disable_marker $CEL
0164: disable_marker $MARKER1
jump 
@MISJA_KONIEC

:MISSION_PASSED
009B: destroy_actor $PILOT
009B: destroy_actor $PILOT2
009B: destroy_actor $DOSTAWCA
009B: destroy_actor $ODBIORCA
00A6: destroy_car $HELI
00A6: destroy_car $HUNTER
03BD: destroy_sphere $CEL
0164: disable_marker $MARKER1
fade 
1 500
gosub 
@check_fade
01E3: show_text_1number_styled GXT 'M_PASS' number 2000 time 5000 style 1
0109: player $PLAYER_CHAR money += 2000
0394: play_music 1

:MISJA_KONIEC
end_thread


Powyżej są procedury, do których odwoływaliśmy się kilka razy. Pierwsza sprawdza czy zakończono rozjaśnianie/zaciemnianie obrazu. Druga odpowiada za wyświetlenie napisu MISSION FAILED i zniszczenie wszystkiego co stworzyliśmy w misji. Następna procedura odpowiada za zniszczenie wszystkiego, wyświetlenie napisu MISSION PASSED, dodanie pieniędzy i rozjaśnienie ekranu. Na koniec tworzymy pustą procedurę. Po co? Po to żeby nie spotkał nas przykry błąd aplikacji pod koniec mis...na dodać jeszcze jeden helikopter, gdyż z jednym jest trochę za łatwo, poziom inteligencji przeciwników nie jest za wysoki.

Filmik z misji
Dodane przez: MakG
Posting comments to this article is disabled.
Created & Powered by MakG
Wszelkie prawa zastrzeżone