Strona główna
Witaj, nieznajomy!

Call Homies CLEO

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" // Animacje w samochodzie

0247: load_model #CELLPHONE // Telefon

0247: load_model 105 // Homie #1

0247: load_model 106 // Homie #2

0247: load_model 107 // Homie #3

0247: load_model 492 // Greenwood

0247: load_model 353 // MP5


: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:
:NOP
0000: NOP
0A93: end_custom_thread


Brawo, dobiegłeś do mety! Zakończenie skryptu.
Tutaj możesz pobrać gotowy skrypt.
Dodane przez: MakG
Posting comments to this article is disabled.
Created & Powered by MakG
Wszelkie prawa zastrzeżone