Strona główna
Witaj, nieznajomy!

Spray Car CLEO

Przed rozpoczęciem czytania tego poradnika, zalecam zapoznać się z podstawami użytkownika biblioteki CLEO, które możecie znaleźć tutaj.

Jeśli znasz już podstawy tworzenia skryptów w CLEO to możesz przejść dalej. Na wstępie chciałbym zaznaczyć, że będę starał się opisywać nowe opcody ogólnikowo, gdyż szczegółowe opisy można znaleźć w Naszej Polskiej Bazie Opcodów. Po kliknięciu na czteroznakowy, szesnastkowy unikalny numer opcoda można przejść do jego opisu. Dzięki temu tutorialowi poznasz kilka nowych, przydatnych funkcji i napiszesz skrypt na malowanie wozów za pomocą spraya. Let's do it!

Kod:
{$CLEO .cs}

thread 
'SPRAY'

0007: $Radius_Value_X = 3.0
0007: $Radius_Value_Y = 3.0


Zaczynamy nasz skrypt CLEO i nadajemy mu nazwę ?SPRAY?. Następnie tworzymy dwie zmienne typu float (z wartością po przecinku/kropce) i przypisujemy im wartości 3.0. Tych zmiennych użyjemy w dalszej części kodu do określenia w jakiej odległości od samochodu gracz będzie mógł się znajdować, aby pomalować wóz.

Kod:
:SPRAY_1
wait 
10
if
Player.Defined($PLAYER_CHAR)
jf 
@SPRAY_1


Tworzymy nową pętlę sprawdzającą (więcej na temat pętli tutaj). Sprawdzamy czy gracz jest zdefiniowany jako $PLAYER_CHAR. Po co? A choćby po to, żeby skrypt nie wystartował za wcześnie, bo może to spowodować błąd.

Kod:
:SPRAY_2
wait 
10
if 
and
02D8: actor $PLAYER_ACTOR current_weapon == 41
8A32: not unknown_actor $PLAYER_ACTOR in_car
00E1: player 0 pressed_key 17
jf 
@SPRAY_1


Tworzymy kolejną pętlę, w której sprawdzamy czy wszystkie podane warunki są spełnione:

Czy gracz ma aktualnie wybraną broń o ID 41 (spray) Czy gracz nie znajduje się w samochodzie Czy gracz wcisną przycisk o ID 17 (strzał)

Jeśli te zależności są spełnione, skrypt przechodzi dalej. Jeśli nie, to wracamy do poprzedniej pętli.

Kod:
0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to $CAR closest_ped_to $PED


Powyższa funkcja jest dostępna tylko w bibliotece CLEO. Przypisujemy do zmiennej $CAR najbliższy do gracza samochód, natomiast do zmiennej $PED przypisujemy najbliższego do gracza PEDa, lecz nie będziemy z niego korzystać. Interesuje nas tylko samochód.

Kod:
:SPRAY_3
wait 
10
if
8038: not $CAR == -1
jf 
@SPRAY_2

01BD: $TIME = current_time_in_ms


Kolejna pętlą, w której tym razem sprawdzamy czy zmienna $CAR nie jest równa wartości -1. Liczba -1 jest zwracana przez poprzednią funkcję w przypadku, gdy żaden pojazd nie zostanie znaleziony. Jeśli tak jest, to znaczy, że gracz nie znajduje się w pobliżu żadnego pojazdu, więc musimy jeszcze raz sprawdzić poprzednie operacje (przeskakujemy do SPRAY_2). Jeśli warunek jest prawdziwy, przechodzimy dalej, gdzie pobieramy aktualny czas w milisekundach. Będzie potrzebny do sprawdzenia, czy czas na malowanie minął.

Kod:
:SPRAY_4
wait 
10
if 
and
02D8: actor $PLAYER_ACTOR current_weapon == 41
8A32: not unknown_actor $PLAYER_ACTOR in_car
00E1: player 0 pressed_key 17
0203: actor $PLAYER_ACTOR near_car $CAR radius $Radius_Value_X $Radius_Value_Y flag 0 on_foot
jf 
@SPRAY_2


Teraz sprawdzamy te same warunki co w SPRAY_2 ale tym razem do tego dochodzi funkcja sprawdzająca, czy gracz znajduje się w odległości promienia od samochodu. Funkcja 0AB5 dała nam tylko najbliższy samochód, nie ważne w jakiej odległości by się znajdował. Dlatego musimy sprawdzić, czy odległość ta nie jest za duża, bo nie można pomalować wozu z dystansu dwudziestu metrów.

Kod:
01BD: $TIME2 = current_time_in_ms
000C: $TIME2 -= $TIME

:SPRAY_5
wait 
10
if
0019:  $TIME2 > 2000
jf 
@SPRAY_4


Ponownie pobieramy czas w milisekundach, który posłuży nam do wyliczeń. Odejmujemy od drugiego czasu, pierwszy czas. W ten sposób otrzymujemy czas, jaki gracz już maluje samochód. Następnie sprawdzamy, czy wyliczony czas jest większy niż 2000 ms (2 sekundy). Jeśli tak, to przechodzimy dalej. Jeśli nie, to przeskakujemy do sprawdzania warunków z procedury SPRAY_4.

Kod:
0099: $COLOR1 = random_int_in_ranges_0_to_126
0099: $COLOR2 = random_int_in_ranges_0_to_126

0229: set_car $CAR primary_color_to $COLOR1 secondary_color_to $COLOR2


Losujemy dwa kolory z przedziału 0-126. Domyślnie w GTA jest 126 kolorów (patrz: /data/carcols.dat). Następnie zmieniamy barwy samochodu na te wylosowane wcześniej.

Kod:
046C: $DRIVER = car $CAR driver
05E2: AS_actor $DRIVER kill_actor $PLAYER_ACTOR
Actor.Removereferences($DRIVER)
Car.Removereferences($CAR)
jump 
@SPRAY_1


Dodajmy do skryptu małe rozszerzenie. Chyba nikt nie byłby zadowolony, jeśli nagle podszedłby do nas jakiś murzyn i malowałby nam samochód sprayem... Sprawmy, że po pomalowaniu wozu, jego kierowca zaczyna atakować gracza. W tym celu najpierw przypisujemy kierowcę do zmiennej $DRIVER, następnie rozkazujemy mu zabić gracza. Później usuwamy referencje (odwołania) do aktora i samochodu. To sprawi, że aktor ?wejdzie w tłum?, tzn. będą zachowywać się jak normalni ludzie spotkani na ulicy. Na koniec przeskakujemy do początku skryptu, aby móc malować do znudzenia.

Kod:
:NOP
0000: NOP
0A93: end_custom_thread


I kończymy nasz skrypt. Gotowe.

Mam nadzieję, że po przeczytaniu tego poradnika poradzicie sobie ze stworzeniem takich i podobnych skryptów. Dla treningu, możecie spróbować dodać możliwość malowania paintjobów. Opcody, które będą Wam potrzebne:

Kod:
06ED: set_car 34@ paintjob 0
097D: get_car $CARMOD_CAR number_of_possible_paintjobs_to $10084
0988: get_car $CARMOD_CAR paintjob $10085


Przypominam, że jeśli masz jakiekolwiek problemy z pisaniem skryptów, pomoc zawsze znajdziesz na Naszym FORUM. Miłego pisania i sprayowania.

Tutaj można obejrzeć filmik prezentujący skrypt.
Dodane przez: MakG
Posting comments to this article is disabled.
Created & Powered by MakG
Wszelkie prawa zastrzeżone