Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2012-10-07 16:47:44
Witam, mam takie pytanie, mianowicie napisałem skrypt który ustawia natężenie ruchu w zależności od godziny:
Kod:
//-------------MAIN---------------
0000: NOP
:NONAME_2
wait 0
00BF: 1@ = current_time_hours, 2@ = current_time_minutes
if and
1@ >= 0
not 1@ >= 2
else_jump @NONAME_53
01EB: set_traffic_density_multiplier_to 1.6
03DE: set_pedestrians_density_multiplier_to 1.4
:NONAME_53
00BF: 1@ = current_time_hours, 2@ = current_time_minutes
if and
1@ >= 2
not 1@ >= 4
else_jump @NONAME_100
01EB: set_traffic_density_multiplier_to 0.3
03DE: set_pedestrians_density_multiplier_to 0.1
:NONAME_100
00BF: 1@ = current_time_hours, 2@ = current_time_minutes
if and
1@ >= 4
not 1@ >= 6
else_jump @NONAME_147
01EB: set_traffic_density_multiplier_to 0.9
03DE: set_pedestrians_density_multiplier_to 0.1
:NONAME_147
00BF: 1@ = current_time_hours, 2@ = current_time_minutes
if and
1@ >= 6
not 1@ >= 12
else_jump @NONAME_194
01EB: set_traffic_density_multiplier_to 9.9
03DE: set_pedestrians_density_multiplier_to 9.9
:NONAME_194
00BF: 1@ = current_time_hours, 2@ = current_time_minutes
if and
1@ >= 12
not 1@ >= 18
else_jump @NONAME_241
01EB: set_traffic_density_multiplier_to 5.8
03DE: set_pedestrians_density_multiplier_to 5.8
:NONAME_241
00BF: 1@ = current_time_hours, 2@ = current_time_minutes
if and
1@ >= 18
not 1@ >= 21
else_jump @NONAME_288
01EB: set_traffic_density_multiplier_to 9.9
03DE: set_pedestrians_density_multiplier_to 9.9
:NONAME_288
00BF: 1@ = current_time_hours, 2@ = current_time_minutes
if and
1@ >= 21
not 1@ >= 23
else_jump @NONAME_2
01EB: set_traffic_density_multiplier_to 3.6
03DE: set_pedestrians_density_multiplier_to 3.6
jump @NONAME_2
I wszystko ładnie działa, tylko mam problem gdy wejdę do jakiegoś interioru w którym są ludzie (np. komisariaty policji), bo wtedy bardzo dużo ludzi robi się w środku i po kilku sekundach gra się wyłącza. I tu moje pytanie jak poprawić ten skrypt żeby był nieaktywny kiedy gracz jest w interiorze, a po wyjściu z interioru znów był aktywny?
Postów:
304
Dołączył:
2010-10-02
Napisano dnia: 2012-10-07 18:09:32
Kod:
077E: get_active_interior_to
$ACTIVE_INTERIOR
:petla
wait 0
if
$ACTIVE_INTERIOR = 0
jf @petla
jump @NONAME_2
Ja bym proponował sprawdzić coś takiego.
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2012-10-08 16:55:38
Dziwne, dałem to na początek skryptu i owszem w interiorze nie było już problemu, ale dalsza część skryptu przestała działać, tzn. ruch był cały czas taki sam :(
Postów:
304
Dołączył:
2010-10-02
Napisano dnia: 2012-10-09 00:50:35
Jutro przetestuje i zobaczę czy uda mi się naprawić.
Edit:
Spróbuj dodać coś takiego na początku:
Kod:
:NONAME
077E: get_active_interior_to
$ACTIVE_INTERIOR
jump @petla
:petla
wait 0
if
$ACTIVE_INTERIOR = 0
else_jump @petla
jump @NONAME_2
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2012-10-10 09:39:01
Dalej to samo, zastanawiam się czy nie trzeba dać jeszcze warunku że interior jest nieaktywny do pozostałych pętli
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2012-10-12 16:44:01
Pokaż cały aktualny skrypt. To jest bardzo proste do zrobienia, więc gdzieś pewnie się po prostu pomyliłeś.
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2012-10-12 17:26:44
Też wydawało mi się to proste do zrobienia, a mam z tym sporo problemów. Cały skrypt wygląda następująco:
Kod:
//-------------MAIN---------------
0000: NOP
:NONAME_2
wait 0
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR = 0
else_jump @NONAME_2
jump @NONAME_36
:NONAME_36
wait 0
00BF: 3@ = current_time_hours, 4@ = current_time_minutes
if and
3@ >= 0
not 3@ >= 2
else_jump @NONAME_87
01EB: set_traffic_density_multiplier_to 1.6
03DE: set_pedestrians_density_multiplier_to 1.4
:NONAME_87
00BF: 3@ = current_time_hours, 4@ = current_time_minutes
if and
3@ >= 2
not 3@ >= 4
else_jump @NONAME_134
01EB: set_traffic_density_multiplier_to 0.3
03DE: set_pedestrians_density_multiplier_to 0.1
:NONAME_134
00BF: 3@ = current_time_hours, 4@ = current_time_minutes
if and
3@ >= 4
not 3@ >= 6
else_jump @NONAME_181
01EB: set_traffic_density_multiplier_to 0.9
03DE: set_pedestrians_density_multiplier_to 0.1
:NONAME_181
00BF: 3@ = current_time_hours, 4@ = current_time_minutes
if and
3@ >= 6
not 3@ >= 12
else_jump @NONAME_228
01EB: set_traffic_density_multiplier_to 9.9
03DE: set_pedestrians_density_multiplier_to 9.9
:NONAME_228
00BF: 3@ = current_time_hours, 4@ = current_time_minutes
if and
3@ >= 12
not 3@ >= 18
else_jump @NONAME_275
01EB: set_traffic_density_multiplier_to 5.8
03DE: set_pedestrians_density_multiplier_to 5.8
:NONAME_275
00BF: 3@ = current_time_hours, 4@ = current_time_minutes
if and
3@ >= 18
not 3@ >= 21
else_jump @NONAME_322
01EB: set_traffic_density_multiplier_to 9.9
03DE: set_pedestrians_density_multiplier_to 9.9
:NONAME_322
00BF: 3@ = current_time_hours, 4@ = current_time_minutes
if and
3@ >= 21
not 3@ >= 23
else_jump @NONAME_2
01EB: set_traffic_density_multiplier_to 3.6
03DE: set_pedestrians_density_multiplier_to 3.6
jump @NONAME_2
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2012-10-12 18:10:58
No, błąd rzeczywiście trywialny : )
Kod:
if
$ACTIVE_INTERIOR = 0
else_jump @NONAME_2
O ile w ORYGINALNEJ składni SCM porównywanie przez = było poprawne, Sanny wymaga == (tak jak ma to większość języków programowania).
Poprawiłem lekko ten skrypt usuwając zmienną globalną, optymalizując i przepisując na konstrukcje wysokiego poziomu:
Kod:
{
$CLEO}
0000: TRAFFIC
while true
0001: wait 2000 ms
077E: get_active_interior_to
0@
if
0@ == 0
then
00BF: 3@ = current_time_hours,
4@ = current_time_minutes
if and
3@ >= 0
2 >
3@
then
01EB: set_traffic_density_multiplier_to 1.6
03DE: set_pedestrians_density_multiplier_to 1.4
end
if
and
3@ >= 2
4 >
3@
then
01EB: set_traffic_density_multiplier_to 0.3
03DE: set_pedestrians_density_multiplier_to 0.1
end
if
and
3@ >= 4
6 >
3@
then
01EB: set_traffic_density_multiplier_to 0.9
03DE: set_pedestrians_density_multiplier_to 0.1
end
if
and
3@ >= 6
12 >
3@
then
01EB: set_traffic_density_multiplier_to 9.9
03DE: set_pedestrians_density_multiplier_to 9.9
end
if
and
3@ >= 12
18 >
3@
then
01EB: set_traffic_density_multiplier_to 5.8
03DE: set_pedestrians_density_multiplier_to 5.8
end
if
and
3@ >= 18
21 >
3@
then
01EB: set_traffic_density_multiplier_to 9.9
03DE: set_pedestrians_density_multiplier_to 9.9
end
if
and
3@ >= 21
23 >
3@
then
01EB: set_traffic_density_multiplier_to 3.6
03DE: set_pedestrians_density_multiplier_to 3.6
end
end
Zastanawia mnie tylko, czemu dekompilujesz własne skrypty?
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2012-10-12 19:07:05
Zaraz sprawdzę, a co do pytania na końcu to jak inaczej mam otwierać nawet własny skrypt? Zawsze daję dekompiluj
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2012-10-12 19:24:15
Po prostu otwieraj plik .txt z kodem źródłowym. Jak sądzisz, jak inaczej dałoby się pisać skrypty które rozwalają się po ponownej dekompilacji (zmienne trzymające wskaźniki na nagłówki, surowe ciągi znaków, wstawki w Assemblerze)?
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2012-10-12 19:39:36
W sumie zawsze usuwałem ten plik z kodem źródłowym :-) A co do skryptu to dalej w interiorze robi się pełno ludzi i gra się wyłącza. Bez tego moda wszystko jest dobrze także na pewno on to powoduje
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2012-10-12 20:23:09
To w takim razie trzeba przywrócić mnożniki na zwykłe poziomy jeśli gracz jest w interiorze:
Kod:
{
$CLEO}
0000: TRAFFIC
while true
0001: wait 2000 ms
077E: get_active_interior_to
0@
if
0@ == 0
then
00BF: 3@ = current_time_hours,
4@ = current_time_minutes
if and
3@ >= 0
2 >
3@
then
01EB: set_traffic_density_multiplier_to 1.6
03DE: set_pedestrians_density_multiplier_to 1.4
end
if
and
3@ >= 2
4 >
3@
then
01EB: set_traffic_density_multiplier_to 0.3
03DE: set_pedestrians_density_multiplier_to 0.1
end
if
and
3@ >= 4
6 >
3@
then
01EB: set_traffic_density_multiplier_to 0.9
03DE: set_pedestrians_density_multiplier_to 0.1
end
if
and
3@ >= 6
12 >
3@
then
01EB: set_traffic_density_multiplier_to 9.9
03DE: set_pedestrians_density_multiplier_to 9.9
end
if
and
3@ >= 12
18 >
3@
then
01EB: set_traffic_density_multiplier_to 5.8
03DE: set_pedestrians_density_multiplier_to 5.8
end
if
and
3@ >= 18
21 >
3@
then
01EB: set_traffic_density_multiplier_to 9.9
03DE: set_pedestrians_density_multiplier_to 9.9
end
if
and
3@ >= 21
23 >
3@
then
01EB: set_traffic_density_multiplier_to 3.6
03DE: set_pedestrians_density_multiplier_to 3.6
end
else
01EB: set_traffic_density_multiplier_to 1.0
03DE: set_pedestrians_density_multiplier_to 1.0
end
end
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2012-10-12 21:04:47
Wielkie dzięki, w końcu działa. Mógłbyś powiedzieć skąd masz taką wiedzę na ten temat, bo w sumie patrząc na Twój ostatni post długo nie mogłem załapać co się zmieniło w porównaniu do poprzedniego ;-)
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2012-10-12 21:44:06
Siedzę w tym aktywnie od 2008 roku i po prostu bawi mnie odkrywanie jak coś w SA działa (w momencie tego pisania też przedzieram się przez EXE, usiłując ogarnąć w jaki sposób gra ogarnia obiekty-atraktory (np. stoły w kasynie - pedy podchodzą do nich i wykonywany jest na nich skrypt z SCM)). To kwestia doświadczenia.
___________________
Moderator