Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2013-03-08 22:09:57
Nie potrzeba, bo wymyśliłem trzecią, najlepszą. Spróbuj tego kodu, ja go (jak zwykle) nie testowałem.
Kod:
{
$CLEO}
0000: TRAILER
while true
0001: wait 0 ms
4@ = #ARTICT1
068D: get_camera_position_to
1@ 2@ 3@
if 0AE2: 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 300.0 find_next 0 pass_wrecked 0 repeat
0001: wait 0 ms or
0137: car
0@ model == #LINERUN
0137: car
0@ model == #RDTRAIN
0137: car
0@ model == #PETRO
then
if
8119: not car
0@ wrecked
0A97: 7@ = car
0@ struct
0A8E: 8@ =
7@ + 0x4A4
0A8E: 9@ =
7@ + 0x42F
0A8D: 10@ = read_memory
8@ size 1 virtual_protect 0
0A8D: 11@ = read_memory
9@ size 1 virtual_protect 0
if and
8039: not 10@ == 2
88B7: not test
11@ bit 4
09D0: car
0@ on_wheels
87AB: not trailer -1 attached_to_cab
0@
then
0247: load_model
4@
while 8248: not model
4@ available
0001: wait 0 ms
end
00A5: 6@ = create_car
4@ at 0 0 0
0893: put_trailer
6@ on_cab
0@
01C3: remove_references_to_car
6@
0249: release_model
4@
08BD: set
11@ bit 4
0A8C: write_memory
9@ size 1 value
11@ virtual_protect 0
end
end
end
until
8AE2: not 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 300.0 find_next 1 pass_wrecked 0 end
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2013-03-09 09:39:17
Mam problem z tym bo przy kompilacji wychodzi błąd "A jump to zero offset found."
EDIT:
Już chyba wiem:
Kod:
powinno być chyba pod
Kod:
a nie w tej samej linijce :)
Sprawdziłem ten Twój skrypt i niestety coś jest nie tak, bo mam crash. Prawdopodobnie podczas tworzenia drugiej naczepy, bo za każdym razem jestem w stanie zobaczyć jeden pojazd z naczepą, lub wogóle i potem gra się wyłącza.
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2013-03-09 11:06:12
To są dwie linijki, ale forum coś źle formatuje.
Co do skryptu, rzeczywiście crashował, ale wystarczyło zamienić kolejność sprawdzeń i śmiga:
Kod:
{
$CLEO}
0000: TRAILER
while true
0001: wait 0 ms
4@ = #ARTICT1
068D: get_camera_position_to
1@ 2@ 3@
if 0AE2: 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 300.0 find_next 0 pass_wrecked 1 repeat
0001: wait 0 ms
8119: not car
0@ wrecked if
or
0137: car
0@ model == #LINERUN
0137: car
0@ model == #RDTRAIN
0137: car
0@ model == #PETRO
then
0A97: 7@ = car
0@ struct
0A8E: 8@ =
7@ + 0x4A4
0A8E: 9@ =
7@ + 0x42F
0A8D: 10@ = read_memory
8@ size 1 virtual_protect 0
0A8D: 11@ = read_memory
9@ size 1 virtual_protect 0
if and
8039: not 10@ == 2
88B7: not test
11@ bit 4
09D0: car
0@ on_wheels
87AB: not trailer -1 attached_to_cab
0@
then
0247: load_model
4@
while 8248: not model
4@ available
0001: wait 0 ms
end
00A5: 6@ = create_car
4@ at 0 0 0
0893: put_trailer
6@ on_cab
0@
01C3: remove_references_to_car
6@
0249: release_model
4@
08BD: set
11@ bit 4
0A8C: write_memory
9@ size 1 value
11@ virtual_protect 0
end
end
end
until
8AE2: not 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 300.0 find_next 1 pass_wrecked 1 end
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2013-03-09 13:21:32
Skrypt teraz działa, ale naczepy nie pojawiają się na wszystkich ciągnikach, mniej więcej na co drugim, co trzecim naczepy nie ma :(
I mam jeszcze takie dwa pytania:
- dlaczego w pętli
Kod:
while 8248: not model
4@ available
0001: wait 0 ms
end
przed 8248 nie ma "if" ?
- i za co odpowiada końcówka w opcodzie 0AE2 (dokładnie chodzi mi o to "pass_wrecked")?
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2013-03-09 14:48:29
Nie potrzeba tam IFa, taka jest konstrukcja pętli wysokiego poziomu. W tutorialu to nieco opisałem.
pass_wrecked pomija zniszczone pojazdy.
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2013-03-09 14:51:59
Dobra dzięki za wszystko, teraz spróbuję dodać przyczepy do innych pojazdów np. do Traktora. W razie czego będę pytał dalej :)
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2013-03-19 17:31:20
Silent napisał(a):
Przychodzą mi do głowy dwa pomysły - trudniejszy, ale 'poprawny' (zapisywanie informacji o tym czy naczepa została podczepiona w pamięci skryptu + hack konstruktora i destruktora), oraz łatwiejszy, ale nieco dziwny (użycie... trzeciego/czwartego koloru do tego, by przechować info czy naczepa była podpinana pod ten wóz czy nie). Którą wersję wolisz bym opisał?
Mógłbyś opisać jeszcze metodę z tym trzecim/czwartym kolorem?
EDIT
Dobra, powiem tak, dotychczasowy skrypt nie sprawdzał się za dobrze, więc napisałem nowy. Wygląda on tak:
Kod:
thread 'NONAME'
:NONAME_11
wait 100
if
Player.Defined(
$PLAYER_CHAR)
else_jump @NONAME_11
068D: get_camera_position_to
1@ 2@ 3@
if
0AE2: 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 500.0 find_next 0 pass_wrecked 1
@NONAME_11
:NONAME_76
if
not Car.Wrecked(
0@)
else_jump @NONAME_778
if
Car.Model(
0@) == #RDTRAIN
else_jump @NONAME_153
4@ = 515
5@ = 450
6@ = 234
jump @NONAME_452
:NONAME_153
if
Car.Model(
0@) == #LINERUN
else_jump @NONAME_203
4@ = 403
5@ = 435
6@ = 234
jump @NONAME_452
:NONAME_203
if
Car.Model(
0@) == #PETRO
else_jump @NONAME_778
4@ = 514
5@ = 584
6@ = 234
:NONAME_452
wait 0
if and
09D0: car
0@ on_wheels
87AB: not trailer -1 attached_to_cab
0@
else_jump @NONAME_778
0407: store_coords_to
7@ 8@ 9@ from_car
0@ with_offset 0.0 0.0 0.0
10@ = Car.Angle(
0@)
046C: 11@ = car
0@ driver
Model.Load(
4@)
Model.Load(
5@)
Model.Load(
6@)
if and
Model.Available(
4@)
Model.Available(
5@)
Model.Available(
6@)
else_jump @NONAME_452
Car.Destroy(
0@)
wait 0
12@ = Car.Create(
4@,
7@,
8@,
9@)
Car.Angle(
12@) =
10@
wait 0
0407: store_coords_to
17@ 18@ 19@ from_car
12@ with_offset 0.0 -5.0 0.0
0395: clear_area 1 at
17@ 18@ 19@ radius 3.0
13@ = Car.Create(
5@,
17@,
18@,
19@)
Car.Angle(
13@) =
10@
wait 0
0893: put_trailer
13@ on_cab
12@
Model.Destroy(
4@)
Model.Destroy(
5@)
if
not
11@ == -1
else_jump @NONAME_768
0129: 14@ = create_actor_pedtype 24 model
6@ in_car
12@ driverseat
Car.SetDriverBehaviour(
12@, FollowRoad)
00AE: set_car
12@ traffic_behaviour_to 4
Model.Destroy(
6@)
Actor.RemoveReferences(
14@)
:NONAME_768
Car.RemoveReferences(
12@)
Car.RemoveReferences(
13@)
:NONAME_778
8AE2: not 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 500.0 find_next 1 pass_wrecked 1
@NONAME_76
jump @NONAME_11
I mam problem bo te funkcje oznaczające że pojazd miał już kiedyś doczepioną przyczepę tu jakoś nie działają. Czy w takim przypadku powinny być użyte jakieś inne wartości w opcode 0A8E ?
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2013-03-20 14:50:37
Przerobiłem skrypt na szybko tak, by używał tego triku z kolorami - wolałem jednak starą wersję :P
Kod:
{
$CLEO}
0000: TRAILER
while true
0001: wait 0 ms
4@ = #ARTICT1
068D: get_camera_position_to
1@ 2@ 3@
if 0AE2: 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 300.0 find_next 0 pass_wrecked 1 repeat
0001: wait 0 ms
8119: not car
0@ wrecked if
or
0137: car
0@ model == #LINERUN
0137: car
0@ model == #RDTRAIN
0137: car
0@ model == #PETRO
then
0A97: 7@ = car
0@ struct
0A8E: 8@ =
7@ + 0x4A4
0A8D: 10@ = read_memory
8@ size 1 virtual_protect 0
0A12: get_car
0@ tertiary_color_to
9@ quaternary_color_to
11@
if and
8039: not 10@ == 2
8039: not 11@ == 16
09D0: car
0@ on_wheels
87AB: not trailer -1 attached_to_cab
0@
then
0247: load_model
4@
while 8248: not model
4@ available
0001: wait 0 ms
end
00A5: 6@ = create_car
4@ at 0 0 0
0893: put_trailer
6@ on_cab
0@
01C3: remove_references_to_car
6@
0249: release_model
4@
0A11: set_car
0@ tertiary_color_to
9@ quaternary_color_to 16
end
end
end
until
8AE2: not 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 300.0 find_next 1 pass_wrecked 1 end
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2013-03-20 15:06:46
Napisałem nowy, bo w tym starym jak zastosowałem go do traktora to ta 'przyczepka' odpadała od niego. Tak samo działo się z pojazdami Utility Van i Tow Truck. W tym nowym już jest wszystko dobrze tylko jak dałem do niego te funkcje, które mi podałeś sprawdzające czy przyczepa została już doczepiona, to po jakiejś minucie gra mi się wyłączała.
I niestety jak dodaję tą metodę z kolorami to jest tak samo, też po minucie wyrzuca błąd :(
I mam takie dwa pytania:
- czy każdy pojazd ma cztery kolory? Może to przez to jest błąd?
- skąd bierze się te kody do 0A8E typu 0x4A4 ?
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2013-03-20 15:42:19
artginPL napisał(a):
- czy każdy pojazd ma cztery kolory? Może to przez to jest błąd?
- skąd bierze się te kody do 0A8E typu 0x4A4 ?
1. Nie, większość ma dwa - czterech nie ma chyba żaden.
2. Dokumentacje klas z EXE, sporo jest tego na GTAForums np.
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2013-03-20 20:45:37
Mam jeszcze takie pytanie czy istnieje opcode o działaniu podobnym jak 0209, tylko żeby losował jedną wartość z pośród dwóch nie występujących kolejno po sobie. A jeżeli nie ma takiego opcodu to w jaki sposób można by coś takiego zrobić? I ostatnie pytanie jaka jest różnica pomiędzy opcode 0209, a 0099 ?
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2013-03-20 21:08:19
1. Nie, musisz wymyślić własny kod. Przykład na szybko:
Kod:
0209: 0@ = random_int_in_ranges 0 100
if 0@ > 50
then 0@ = #INFERNUS
else 0@ = #ALPHA
end
2. Czy nie widać różnicy gołym okiem?
GENERATE_RANDOM_INT nie ma przedziałów, generuje liczbę z predefiniowanego zakresu 0 - 32767. W
GENERATE_RANDOM_INT_IN_RANGE podajesz zakres.
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2013-03-22 19:37:44
Ja jeszcze wrócę do tego tematu, bo mam problem. Napisałem taki skrypt:
Kod:
thread 'NONAME'
:NONAME_11
wait 100
if
Player.Defined(
$PLAYER_CHAR)
jf @NONAME_11
068D: get_camera_position_to
1@ 2@ 3@
if
0AE2: 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 500.0 find_next 0 pass_wrecked 1
@NONAME_11
:NONAME_76
wait 0
03F3: get_car
0@ primary_color_to
4@ secondary_color_to
5@
0A12: get_car
0@ tertiary_color_to
6@ quaternary_color_to
7@
if
not
7@ == 16
jf @NONAME_785
if
Car.Id(
0@) == #RDTRAIN
jf @NONAME_204
8@ = 515
0209: 23@ = random_int_in_ranges 0 2
if
23@ = 0
jf @NONAME_189
9@ = 450
jump @NONAME_455
:NONAME_189
9@ = 591
jump @NONAME_455
:NONAME_204
if
Car.Id(
0@) == #LINERUN
jf @NONAME_246
8@ = 403
9@ = 435
jump @NONAME_455
:NONAME_246
if
Car.Id(
0@) == #PETRO
jf @NONAME_288
8@ = 514
9@ = 584
jump @NONAME_455
:NONAME_288
if
Car.Id(
0@) == #TRACTOR
jf @NONAME_330
8@ = 531
9@ = 610
jump @NONAME_455
:NONAME_330
if
Car.Id(
0@) == #TOWTRUCK
jf @NONAME_375
8@ = 525
0209: 9@ = random_int_in_ranges 604 606
jump @NONAME_455
:NONAME_375
if
Car.Id(
0@) == #UTILITY
jf @NONAME_417
8@ = 552
9@ = 611
jump @NONAME_455
:NONAME_417
if
Car.Id(
0@) == #BAGGAGE
jf @NONAME_785
8@ = 485
0209: 9@ = random_int_in_ranges 606 609
:NONAME_455
wait 0
16@ = 234
if
87AB: not trailer -1 attached_to_cab
0@
jf @NONAME_785
0407: store_coords_to
10@ 11@ 12@ from_car
0@ with_offset 0.0 0.0 0.0
13@ = Car.Angle(
0@)
046C: 15@ = car
0@ driver
Model.Load(
8@)
Model.Load(
9@)
Model.Load(
16@)
if and
Model.Available(
8@)
Model.Available(
9@)
Model.Available(
16@)
jf @NONAME_455
Car.Destroy(
0@)
wait 0
17@ = Car.Create(
8@,
10@,
11@,
12@)
Car.Angle(
17@) =
13@
0229: set_car
17@ primary_color_to
4@ secondary_color_to
5@
0A11: set_car
17@ tertiary_color_to
6@ quaternary_color_to 16
0407: store_coords_to
18@ 19@ 20@ from_car
17@ with_offset 0.0 -5.0 0.0
0395: clear_area 1 at
18@ 19@ 20@ radius 3.0
wait 0
21@ = Car.Create(
9@,
18@,
19@,
20@)
Car.Angle(
21@) =
13@
0893: put_trailer
21@ on_cab
17@
Model.Destroy(
8@)
Model.Destroy(
9@)
if
not
15@ == -1
jf @NONAME_775
0129: 22@ = create_actor_pedtype 24 model
16@ in_car
17@ driverseat
Car.SetDriverBehaviour(
17@, FollowRoad)
00AE: set_car
17@ traffic_behaviour_to 4
Model.Destroy(
16@)
Actor.RemoveReferences(
22@)
:NONAME_775
Car.RemoveReferences(
17@)
Car.RemoveReferences(
21@)
:NONAME_785
8AE2: not 0@ = random_vehicle_near_point
1@ 2@ 3@ in_radius 500.0 find_next 1 pass_wrecked 1
@NONAME_76
jump @NONAME_11
Wszystko dobrze działa, ale tylko przez jakąś minutę. Próbowałem już dziesiątki kombinacji, usuwałem mniej potrzebne linijki, zmieniałem ich kolejność, ale za każdym razem to samo - minuta i crash. Czy ktoś mógłby mi powiedzieć co może powodować taki problem?
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2013-03-22 20:59:56
Przed pobieraniem kolorów nie sprawdzasz czy pojazd istnieje (wystarczy
NOT IS_CAR_DEAD) - iterator CLEO4 POWINIEN to sprawdzać, ale jak widać nie jest nieomylny.
Jedno pytanie - po cholerę CIĄGLE dekompilujesz własne skrypty?
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2013-03-22 22:14:51
Wstawienie tego NOT IS_CAR_DEAD pomogło. Co ciekawe miałem to wcześniej w moim skrypcie, ale usunąłem bo myślałem, że przez to skrypt będzie odrzucał pojazdy, które będą mieć chociażby 999 punktów życia (czyli delikatnie uszkodzone).
Silent napisał(a):
Jedno pytanie - po cholerę CIĄGLE dekompilujesz własne skrypty?
Nie piszę swoich skryptów wysokim poziomem, bo nie umiem :) I z tego powodu gdy chcę coś w nich zmienić to muszę dekompilować.