Ten tutorial został napisany specjalnie na prośbę jednego z Naszych użytkowników. Przypominam, że propozycje na temat kolejnych tutoriali można składać w TYM temacie na forum.
Zanim przystąpisz do czytania, upewnij się czy zapoznałeś się z podstawami pisania w CLEO.
Po kliknięciu na unikalny kod opcoda można zobaczyć jego szczegółowy opis w Polskiej Bazie Opcodów.
Tutorial przedstawia kilka nowych funkcji i technik. Wszystko to jak zwykle zostanie wkomponowane w praktyczny przykład. W tym przypadku będzie to skrypt, który umożliwi Nam zadzwonienie po wsparcie w postaci członków gangu Grove Street, którzy będą za nami chodzić, wspierać nas w strzelaninach itp. Słowem, będą zachowywać się tak, jakby to gracz ich rekrutował. Oczywiście gracz będzie miał możliwość odwołania wsparcia.
Kod:
{
$CLEO .cs}
thread 'HOMIES'
0005: $Radius_X = 20.0
0005: $Radius_Y = 20.0
Rozpoczynamy skrypt o nazwie "HOMIES". Następnie tworzymy zmienne typu FLOAT. Będą one określać odległość od gracza, w której ma pojawić się samochód członków gangu.
Kod:
:LOAD
04ED: load_animation
"CAR_CHAT"
0247: load_model #CELLPHONE
0247: load_model 105
0247: load_model 106
0247: load_model 107
0247: load_model 492
0247: load_model 353
:LOAD_CHECK
wait 10
if and
04EE: animation
"CAR_CHAT" loaded
0248: model #CELLPHONE available
0248: model 105 available
0248: model 106 available
0248: model 107 available
0248: model 492 available
0248: model 353 available
jf @LOAD_CHECK
Nic nowego. Ładujemy potrzebne modele i plik z animacjami rozmowy w samochodzie, a następnie sprawdzamy czy zostały już załadowane.
Kod:
:HOMIES_1
wait 10
if
Player.Defined(
$PLAYER_CHAR)
jf @HOMIES_1
:HOMIES_2
wait 10
if
0AB0: key_pressed 0x78
jf @HOMIES_1
Najpierw sprawdzamy jak zawsze, czy gracz jest zdefiniowany, by uniknąć wczesnego uruchomienia skryptu. Następnie sprawdzamy, czy gracz wcisną klawisz F9 (kody klawiszy). Jeśli tak, to wykonujemy dalszą część skryptu, jeśli nie to sprawdzamy dalej.
Kod:
:HOMIES_3
wait 10
if
0A32: unknown_actor
$PLAYER_ACTOR in_car
jf @HOMIES_6
Teraz sprawdzamy, czy gracz znajduje się w samochodzie. Można pominąć ten fragment, gdyż obydwa przypadki (w samochodzie i na nogach) można rozwiązać w ten sam sposób, poprzez skorzystanie z opcodu 0729, który pojawi się później. Zastosuję dwie możliwe metody, po to by pokazać różne rozwiązania.
Jeśli gracza nie ma w samochodzie to idziemy do HOMIES_6 przeskakując następne operacje.
Kod:
0107: $phone = create_object #CELLPHONE at 0.0 0.0 0.0
070A: unknown_action_sequence
$PLAYER_ACTOR $phone 0.0 0.0 0.0 6 16
"NULL" "NULL" 0
0605: actor
$PLAYER_ACTOR perform_animation_sequence
"carfone_in" IFP_file
"CAR_CHAT" 4.0 loop 0 0 0 0 time -1
:HOMIES_4
wait 0
if
8611: not actor
$PLAYER_ACTOR performing_animation
"carfone_in"
jf @HOMIES_4
Tworzymy obiekt z modelem telefonu, który wcześniej załadowaliśmy. Tworzymy go byle gdzie, to nie ma znaczenia w tym przypadku, gdyż następnie przyczepiamy obiekt do gracza. Więcej o obiektach w poradniku "Obiekty". Później animujemy aktora wykorzystując animację odbierania telefonu w samochodzie. Nie zapętlamy tej animacji, gdyż CJ ma podnieść słuchawkę tylko raz. Procedura HOMIES_4 służy do sprawdzenia, czy animacja "carfone_in" jest wciąż wykonywana. Jeśli nie to idziemy dalej...
Kod:
0605: actor
$PLAYER_ACTOR perform_animation_sequence
"carfone_loopA" IFP_file
"CAR_CHAT" 4.0 loop 0 0 0 0 time 5000
wait 500
00BC: show_text_highpriority GXT
'HOMIES1' time 2000 flag 1
wait 2000
00BC: show_text_highpriority GXT
'HOMIES2' time 2000 flag 1
wait 2000
0605: actor
$PLAYER_ACTOR perform_animation_sequence
"carfone_out" IFP_file
"CAR_CHAT" 4.0 loop 0 0 0 0 time -1
:HOMIES_5
wait 0
if
8611: not actor
$PLAYER_ACTOR performing_animation
"carfone_out"
jf @HOMIES_5
jump @HOMIES_7
Teraz wykorzystujemy kolejną animację, tym razem zapętlając ją, gdyż jest to rozmowa telefoniczna po podniesieniu słuchawki. Animujemy CJ'a 5 sekund, gdyż tyle będzie trwała rozmowa. Wyświetlanie tekstów GXT to podstawy, więc ominę ich opis. Po rozmowie wykonujemy animację odkładania słuchawki w samochodzie i tworzymy podobną pętlę sprawdzającą do poprzedniej (czy animacja już się zakończyła). Jeśli warunek jest prawdziwy to przeskakujemy do procedury HOMIES_7, omijamy następną.
Kod:
:HOMIES_6
0729: AS_actor
$PLAYER_ACTOR hold_cellphone 1
wait 1500
00BC: show_text_highpriority GXT
'HOMIES1' time 2000 flag 1
wait 2000
00BC: show_text_highpriority GXT
'HOMIES2' time 2000 flag 1
wait 2000
0729: AS_actor
$PLAYER_ACTOR hold_cellphone 0
Robimy to samo, tylko wykorzystując prostszą i szybszą metodę za pomocą funkcji 0729.
Kod:
:HOMIES_7
00A0: store_actor
$PLAYER_ACTOR position_to
$Player_X $Player_Y $Player_Z
0007: $Car_Pos_X =
$Player_X
0009: $Car_Pos_X +=
$Radius_X
0007: $Car_Pos_Y =
$Player_Y
0009: $Car_Pos_Y +=
$Radius_Y
Teraz przygotujemy współrzędne, które posłużą nam do określenia miejsca stworzenia samochodu Grove. W tym celu zapisujemy współrzędne gracza do $Player_X, $Player_Y i $Player_Z. Następnie obliczamy współrzędne X i Y pojazdu. Odległość od gracza wyznacza promień ustawiony na początku skryptu.
Kod:
03D3: get_route_nearest_for
$Car_Pos_X $Car_Pos_Y $Player_Z store_to
$CarX $CarY $CarZ Z_angle_to
$CarAngle
00A5: $Homies_Car = create_car 492 at
$CarX $CarY $CarZ
00A8: set_car
$Homies_Car to_psycho_driver
0175: set_car
$Homies_Car Z_angle_to
$CarAngle
0129: $HOMIE1 = create_actor_pedtype 8 model 105 in_car
$Homies_Car driverseat
01C8: $HOMIE2 = create_actor_pedtype 8 model 106 in_car
$Homies_Car passenger_seat 0
01C8: $HOMIE3 = create_actor_pedtype 8 model 107 in_car
$Homies_Car passenger_seat 1
Teraz pobieramy współrzędne najbliższej drogi od punktu stworzenia pojazdu. $CarX, $CarY, $CarZ to zmienne przechowujące ostateczne współrzędne samochodu. Skoro już mamy wszystkie współrzędne, możemy stworzyć samochód w wyliczonym punkcie. Później ustawiamy pojazd jako psychiczny kierowca. Dla niego zasady ruchu drogowego nie istnieją. Następnie obracamy samochód, wedle kierunku drogi. Na koniec tworzymy trzech członków gangu Grove w samochodzie. Jeden z nich będzie kierowcą.
Kod:
01B2: give_actor
$HOMIE1 weapon 29 ammo 500
01B2: give_actor
$HOMIE2 weapon 29 ammo 500
01B2: give_actor
$HOMIE3 weapon 29 ammo 500
01B9: set_actor
$HOMIE1 armed_weapon_to 29
01B9: set_actor
$HOMIE2 armed_weapon_to 29
01B9: set_actor
$HOMIE3 armed_weapon_to 29
02E2: set_actor
$HOMIE1 weapon_accuracy_to 75
02E2: set_actor
$HOMIE2 weapon_accuracy_to 75
02E2: set_actor
$HOMIE3 weapon_accuracy_to 75
00A7: car
$Homies_Car drive_to
$Player_X $Player_Y $Player_Z
Teraz dajemy ziomkom wszystko, czego potrzebują: broń, amunicję i umiejętności strzelania. Pomiędzy tymi operacjami wybieramy MP5 jako aktualną broń aktorów. Ostatnią linią "rozkazujemy" samochodowi, aby pojechał w punkt, gdzie znajduje się gracz.
Kod:
:HOMIES_8
wait 10
if or
0118: actor
$HOMIE1 dead
0118: actor
$HOMIE2 dead
0118: actor
$HOMIE3 dead
jf @HOMIES_9
$FAIL = 1
jump @FAIL
:HOMIES_9
wait 10
if
0118: actor
$PLAYER_ACTOR dead
jf @HOMIES_PRESS
$FAIL = 2
jump @FAIL
:HOMIES_PRESS
wait 0
if
0AB0: key_pressed 0x7A
jf @HOMIES_11
$FAIL == 3
jump @FAIL
:HOMIES_11
wait 10
if or
00F2: actor
$HOMIE1 near_actor
$PLAYER_ACTOR radius 10.0 10.0 10.0
00F2: actor
$HOMIE2 near_actor
$PLAYER_ACTOR radius 10.0 10.0 10.0
00F2: actor
$HOMIE3 near_actor
$PLAYER_ACTOR radius 10.0 10.0 10.0
jf @HOMIES_8
Nie ma co wyjaśniać, standardowe pętle sprawdzające. Jeśli nie rozumiesz tego co jest powyżej, to odsyłam do podstaw i poradnika "Pętle sprawdzające". Dodam tylko, że ustawiamy zmienną $FAIL, po to, aby określić co poszło nie tak podczas próby dojechania do celu. Będziemy to sprawdzać w przedostatniej procedurze "FAIL".
Kod:
:HOMIES_12
07AF: $PLAYER_GROUP = player
$PLAYER_CHAR group
0631: put_actor
$HOMIE1 in_group
$PLAYER_GROUP
0631: put_actor
$HOMIE2 in_group
$PLAYER_GROUP
0631: put_actor
$HOMIE3 in_group
$PLAYER_GROUP
07CB: set_actor
$HOMIE1 supporting_fire 1
07CB: set_actor
$HOMIE2 supporting_fire 1
07CB: set_actor
$HOMIE3 supporting_fire 1
Po dojechaniu na miejsce, przydzielamy zmiennej $PLAYER_GROUP grupę gracza. Następnie wsadzamy do niej członków gangu Grove Street. To sprawi, że będą oni podążać za graczem i go wspierać. Ostatnie trzy linie powodują, że aktorzy będą atakować to co gracz. Jeśli gracz zaatakuje przechodnia X, to oni też go zaatakują...
Kod:
:HOMIES_13
wait 10
if
0118: actor
$HOMIE1 dead
jf @HOMIES_14
01C2: remove_references_to_actor
$HOMIE1
:HOMIES_14
wait 10
if
0118: actor
$HOMIE2 dead
jf @HOMIES_15
01C2: remove_references_to_actor
$HOMIE2
:HOMIES_15
wait 10
if
0118: actor
$HOMIE3 dead
jf @HOMIES_PRESS2
01C2: remove_references_to_actor
$HOMIE3
:HOMIES_PRESS2
wait 0
if
0AB0: key_pressed 0x7A
jf @HOMIES_16
$FAIL == 3
jump @FAIL
:HOMIES_16
wait 10
if
0118: actor
$PLAYER_ACTOR dead
jf @HOMIES_17
jump @CLENUP
:HOMIES_17
wait 10
if and
0118: actor
$HOMIE1 dead
0118: actor
$HOMIE2 dead
0118: actor
$HOMIE3 dead
jf @HOMIES_13
jump @CLENUP
Ponownie standardowe procedury. W przypadku porażki, śmierć ziomków lub gracza, przeskakujemy do procedury czyszczącej i rozpoczynamy wykonywanie skryptu od nowa.
Kod:
:FAIL
if
$FAIL == 1
00BC: show_text_highpriority GXT
'HOMIES3' time 3000 flag 1
if
$FAIL == 2
00BC: show_text_highpriority GXT
'HOMIES4' time 3000 flag 1
if
$FAIL == 3
00BC: show_text_highpriority GXT
'HOMIES5' time 3000 flag 1
:CLENUP
01C2: remove_references_to_actor
$HOMIE1
01C2: remove_references_to_actor
$HOMIE2
01C2: remove_references_to_actor
$HOMIE3
01C3: remove_references_to_car
$Homies_Car
jump @HOMIES_1
Ostatnie dwie procedury. FAIL jak już wcześniej wspomniałem odpowiada za wyświetlenie stosownej informacji w przypadku porażki. W tym celu sprawdzamy wartości zmiennej $FAIL. W zależności od tego czy jest to 1, 2, 3 wyświetlamy odpowiedni tekst.
CLEANUP odpowiada za posprzątanie po skrypcie. Nie niszczymy aktorów i samochodu ale usuwamy do nich referencje. W przypadku użycia "destroy", aktorzy i samochód zniknęli by od razu co nie byłoby przyjemnym dla oka widokiem. Po czyszczeniu przeskakujemy do początku skryptu.
Kod:
Brawo, dobiegłeś do mety! Zakończenie skryptu.
Tutaj możesz pobrać gotowy skrypt.
Posting comments to this article is disabled.