#1 21-03-2012 19:49

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Ошибка с таблицами переходов

Почему происходит вылет в данном кусочке кода (я с помощью звуков проверил точное местоположение вылета), ведь вроде бы все правильно.
ScmLog почему-то у меня не работает, но звуками я точно проверил, что вылет возникает в этом промежутке, после проверки, скрипт не доходит ни до одной из меток, что указаны в таблице переходов.

0209: 10@ = random_int_in_ranges 0 3   
018C: play_sound 1054 at 0.0 0.0 0.0 
wait 750   
0871: init_jump_table 10@ total_jumps 4 default_jump 0 @Act2 jumps 0 @Kill 1 @Walk 2 @Madness 3 @Wave -1 @Act2 -1 @Act2 -1 @Act2 
....

Очень надеюсь на вашу помощь.

Offline

#2 06-04-2012 07:48

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Ошибка с таблицами переходов

А зачем тебе 0209: 10@ = random_int_in_ranges 0 3 ?
Зачем ты сначала присваиваешь 10@ рандомное значение, и тут же вешаешь на неё таблицу?


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#3 20-04-2012 19:33

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Re: Ошибка с таблицами переходов

@Gyr - для того, чтобы был случайный результат. Я так делал часто, и все работало прекрасно. Именно таким образом я делал вариативность.

Offline

#4 26-04-2012 12:51

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Ошибка с таблицами переходов

Тут надо смотреть весь код. Кусочек кусочком, а проблема может быть вообще в другом месте.


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#5 18-05-2012 16:23

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Re: Ошибка с таблицами переходов

Вот весь код. Не думаю, что показ его что-то изменит, но всё же.

:pl
wait 0
if and
not actor.Dead($PLAYER_ACTOR)
not actor.Driving($PLAYER_ACTOR)
0ADC: test_cheat "PLAY"
jf @pl
04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 3.0 1.0
actor.Create(3@,15,#MALE01,0@,1@,-100.0)
actor.Health(3@) = 150
actor.WeaponAccuracy(3@) = 65
0209: 4@ = random_int_in_ranges 2 9
0781: get_weapon_with_ID 4@ model_to 5@ 
0209: 6@ = random_int_in_ranges 22 32
0781: get_weapon_with_ID 6@ model_to 7@ 
0209: 8@ = random_int_in_ranges 33 38
0781: get_weapon_with_ID 8@ model_to 9@
model.Load(5@)
model.Load(7@)
model.Load(9@)
018C: play_sound 1054 at 0.0 0.0 0.0 
038B: load_requested_models 
jump @pl2

:pl2
wait 0
if and
model.Available(5@)
model.Available(7@)
model.Available(9@)
jf @pl2
01B2: give_actor 3@ weapon 4@ ammo 1 
01B2: give_actor 3@ weapon 6@ ammo 9999
01B2: give_actor 3@ weapon 8@ ammo 9999
model.Destroy(5@)
model.Destroy(7@)
model.Destroy(9@)
01B9: set_actor 3@ armed_weapon_to 0
077A: set_actor 3@ acquaintance 1 to_actors_pedtype 0
077A: set_actor 3@ acquaintance 1 to_actors_pedtype 8 
077A: set_actor 3@ acquaintance 4 to_actors_pedtype 7
wait 500
018C: play_sound 1054 at 0.0 0.0 0.0
wait 500 
jump @pl3

:pl3
wait 0 
if 
not actor.Dead(3@)
jf @pl4        
018C: play_sound 1054 at 0.0 0.0 0.0
0209: 10@ = random_int_in_ranges 0 3 
wait 750 
0871: init_jump_table 10@ total_jumps 4 default_jump 0 @Act2 jumps 0 @Kill 1 @Walk 2 @Madness 3 @Wave -1 @Act2 -1 @Act2 -1 @Act2

:Act2
32@ = 0
13@ = 500
jump @Act  

:Act
if and
not actor.Dead(3@)
001D:   32@ > 13@ // (int)
then 
077B: clear_actor 3@ acquaintance 4 to_actors_pedtype 4
077B: clear_actor 3@ acquaintance 4 to_actors_pedtype 5
077B: clear_actor 3@ acquaintance 4 to_actors_pedtype 6
01B9: set_actor 3@ armed_weapon_to 0 
0747: clear_acquaintance 4 of_actors_pedtype 6 to_actors_pedtype 15 
jump @pl3
end
if
actor.Dead(3@)
then
jump @pl4
end
jump @Act

:pl4 
actor.RemoveReferences(3@)
wait 750
jump @pl

:Kill
wait 0
018C: play_sound 1054 at 0.0 0.0 0.0 
077A: set_actor 3@ acquaintance 4 to_actors_pedtype 4 
077A: set_actor 3@ acquaintance 4 to_actors_pedtype 5
077A: set_actor 3@ acquaintance 4 to_actors_pedtype 6
0746: set_acquaintance 4 of_actors_pedtype 6 to_actors_pedtype 15 
0209: 12@ = random_int_in_ranges 0 10 
if
12@ > 5
then
01B9: set_actor 3@ armed_weapon_to 4@
else
01B9: set_actor 3@ armed_weapon_to 6@
end 
32@ = 0
0209: 13@ = random_int_in_ranges 25000 90000 
jump @Act

:Walk
018C: play_sound 1054 at 0.0 0.0 0.0 
05DE: AS_actor 3@ walk_around_ped_path 
32@ = 0
0209: 13@ = random_int_in_ranges 25000 45000 
jump @Act

:Madness
018C: play_sound 1054 at 0.0 0.0 0.0 
077A: set_actor 3@ acquaintance 4 to_actors_pedtype 4 
077A: set_actor 3@ acquaintance 4 to_actors_pedtype 5
077A: set_actor 3@ acquaintance 4 to_actors_pedtype 6
0746: set_acquaintance 4 of_actors_pedtype 6 to_actors_pedtype 23 
01B9: set_actor 3@ armed_weapon_to 8@
32@ = 0
0209: 13@ = random_int_in_ranges 25000 90000 
jump @Act 

:Wave
wait 0
018C: play_sound 1054 at 0.0 0.0 0.0 
if and
not actor.Dead(3@) 
00F2:   actor 3@ near_actor $PLAYER_ACTOR radius 12.0 12.0 0 
jf @Wave2
018C: play_sound 1054 at 0.0 0.0 0.0 
0639: AS_actor 3@ rotate_to_actor $PLAYER_ACTOR
wait 750 
0605: actor 3@ perform_animation_sequence "ENDCHAT_03" IFP_file "PED" 4.0 loop 0 -1 0 0 time -1 
32@ = 0
13@ = 2500
jump @Act

:Wave2
32@ = 0
13@ = 500
jump @Act

Offline

#6 20-05-2012 10:37

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Ошибка с таблицами переходов

А вот тут ты оказался не прав. Ошибка-то кроется в совсем другом месте скрипта. Запомни если ты делаешь gosub или jump на метку, после которой идет IF, то перед IF в обязательном порядке должна стоять wait 0 (можно больше). иначе у тебя будет происходить зависание игры, что собственно и произошло. А ошибка кроется в метке :Act. И вообще, старайся ставить wait 0 перед любым IF. Так надежней.
P.S.: У меня скрипт заработал smile Прикольней будет, если охранник атакует тех, на кого ты укажешь, а не просто всех подряд.

Last edited by Gyr (20-05-2012 10:42)


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#7 20-05-2012 11:49

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Ошибка с таблицами переходов

Ставить wait перед каждым if не стоит - скрипт будет медленно работать (каждый wait 0 приостанавливает работу скрипта на 1 кадр). Лучше, конечно, учиться писать в высокоуровневом стиле - с ним не запутаешься в собственном коде, да и проще разобраться с употреблением wait.

Last edited by Den_spb (20-05-2012 11:54)

Offline

#8 20-05-2012 13:58

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Re: Ошибка с таблицами переходов

Ох, спасибо огромное grin я бы вряд ли нашёл, думал, что всё в порядке, а ошибка, как всегда у программистов, кроется в совсем неожиданных местах.
Gyr, смысл у меня в том, чтобы этот бот был не охранником, а как бы вторым самостоятельным игроком, он будет совершать разные действия в зависимости от случайного выбора. Я планирую сделать его поведение похожим на поведения настоящего игрока.
Ещё раз спасибо. wink

Offline

#9 21-05-2012 08:54

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Ошибка с таблицами переходов

Den_spb частично прав - если ставить wait перед каждым If, то скрипт будет работать медленней  (даже если  wait = 0), НО заметно это только когда работаешь с текстом или изображениями. В таком скрипте как у тебя это не будет заметно вообще, так что решай сам.
А насчет высокоуровневых кодов - так это кому как удобней. Я вот, например, наоборот в них больше путаюсь.


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#10 21-05-2012 10:41

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Ошибка с таблицами переходов

А насчет высокоуровневых кодов - так это кому как удобней.

Это верно, каждый работает так, как ему удобно smile
Но я покажу на примере, почему высокоуровневый стиль может быть удобнее.
Сравним два варианта одного и того же кода - в меточном стиле и в высокоуровневом:

// This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007

{$VERSION 3.1.0027}
{$CLEO .cs}

//-------------MAIN---------------
0AC7: 31@ = var 2@ offset 
0A8D: 30@ = read_memory 12846072 size 4 virtual_protect 0 

:Noname_16
0001: wait 0 ms 
00BF: 0@ = current_time_hours, 1@ = current_time_minutes 
00D6: if or
0019:   0@ > 20 
8029:   not  0@ >= 6 
004D: jump_if_false @Noname_1ED 
00D6: if 
0AE2: 0@ = random_vehicle_near_point 0.0 0.0 0.0 in_radius 6000.0 find_next 0 pass_wrecked 1 //IF and SET 
004D: jump_if_false @Noname_1ED 

:Noname_63
0A97: 1@ = car 0@ struct 
0A8E: 2@ = 1@ + 1424 // int 
0A8D: 2@ = read_memory 2@ size 1 virtual_protect 0 
00D6: if 
0039:   2@ == 6 
004D: jump_if_false @Noname_1C9 
0A8E: 2@ = 1@ + 1472 // int 
0A8D: 2@ = read_memory 2@ size 1 virtual_protect 0 
00D6: if 
8039:   not  2@ == 1 
004D: jump_if_false @Noname_1C9 
000A: 1@ += 1488 
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 
00D6: if 
0039:   1@ == 0 
004D: jump_if_false @Noname_1C9 
00D6: if 
8981:   not train 0@ wrecked 
004D: jump_if_false @Noname_1C9 
0441: 1@ = car 0@ model 
07E4: get_model 1@ dimensions_cornerA_to 5@ 2@ 3@ dimensions_cornerB_to 4@ 1@ 6@ 
000B: 1@ += 20.0 
0407: store_coords_to 2@ 3@ 4@ from_car 0@ with_offset 0.0 1@ 0.0 
0174: 5@ = car 0@ Z_angle 
02F6: 6@ = sine 5@ // (float) 
02F7: 7@ = cosine 5@ // (float) 
000B: 5@ += 90.0 
02F6: 8@ = sine 5@ // (float) 
02F7: 9@ = cosine 5@ // (float) 
0013: 6@ *= 5.0 
0013: 7@ *= 5.0 
0013: 8@ *= 15.0 
0013: 9@ *= 15.0 
0AA5: call 7369616 16 pop 16 0 0 1.0 0 5.0 80 80 80 80 6@ 7@ 8@ 9@ 31@ 30@ 2 

:Noname_1C9
8AE2:   not 0@ = random_vehicle_near_point 0.0 0.0 0.0 in_radius 6000.0 find_next 1 pass_wrecked 1 //IF and SET 
004D: jump_if_false @Noname_63 

:Noname_1ED
0002: jump @Noname_16
{$CLEO}

0AC7: 31@ = var 2@ offset
0A8D: 30@ = read_memory 0xC403F8 size 4 virtual_protect 0 
while true
    wait 0
    00BF: 0@ = current_time_hours, 1@ = current_time_minutes
    if or
        0@ > 20
        0@ < 6
    then    
        if
            0AE2: 0@ = random_vehicle_near_point 0.0 0.0 0.0 in_radius 6000.0 find_next 0 pass_wrecked 1 //IF and SET
        then
            repeat
                0A97: 1@ = car 0@ struct
                0A8E: 2@ = 1@ + 1424 // int
                0A8D: 2@ = read_memory 2@ size 1 virtual_protect 0
                if
                    2@ == 6
                then
                    0A8E: 2@ = 1@ + 0x5C0 // int
                    0A8D: 2@ = read_memory 2@ size 1 virtual_protect 0
                    if
                        2@ <> 1
                    then    
                        1@ += 0x5D0
                        0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
                        if
                            1@ == 0 
                        then
                            if
                                8981: not train 0@ wrecked 
                            then
                                0441: 1@ = car 0@ model 
                                07E4: get_model 1@ dimensions_cornerA_to 5@ 2@ 3@ dimensions_cornerB_to 4@ 1@ 6@ 
                                1@ += 20.0                           
                                0407: store_coords_to 2@ 3@ 4@ from_car 0@ with_offset 0.0 1@ 0.0 
                                0174: 5@ = car 0@ Z_angle 
                                02F6: 6@ = sine 5@ // (float) 
                                02F7: 7@ = cosine 5@ // (float) 
                                5@ += 90.0
                                02F6: 8@ = sine 5@ // (float) 
                                02F7: 9@ = cosine 5@ // (float)
                                6@ *= 5.0                          
                                7@ *= 5.0                           
                                8@ *= 15.0                          
                                9@ *= 15.0                          
                                0AA5: 0x707390 16 pop 16 0 0 1.0 0 5.0 80 80 80 80 6@ 7@ 8@ 9@ 31@ 30@ 2  
                            end
                        end
                    end
                end
            until 8AE2: not 0@ = random_vehicle_near_point 0.0 0.0 0.0 in_radius 6000.0 find_next 1 pass_wrecked 1 //IF and SET
        end
    end
end

Теперь попробуйте найти отрезок кода, который будет выполняться в случае подтверждения какой-то проверки - например, 1@ == 0.
В высокоуровневом варианте искомый кусок виден сразу:

                            if
                                8981: not train 0@ wrecked 
                            then
                                0441: 1@ = car 0@ model 
                                07E4: get_model 1@ dimensions_cornerA_to 5@ 2@ 3@ dimensions_cornerB_to 4@ 1@ 6@ 
                                1@ += 20.0                           
                                0407: store_coords_to 2@ 3@ 4@ from_car 0@ with_offset 0.0 1@ 0.0 
                                0174: 5@ = car 0@ Z_angle 
                                02F6: 6@ = sine 5@ // (float) 
                                02F7: 7@ = cosine 5@ // (float) 
                                5@ += 90.0
                                02F6: 8@ = sine 5@ // (float) 
                                02F7: 9@ = cosine 5@ // (float)
                                6@ *= 5.0                          
                                7@ *= 5.0                           
                                8@ *= 15.0                          
                                9@ *= 15.0                          
                                0AA5: 0x707390 16 pop 16 0 0 1.0 0 5.0 80 80 80 80 6@ 7@ 8@ 9@ 31@ 30@ 2  
                            end

Таким образом, высокоуровневый код представлен "как на ладони" - сразу видно, что происходит после той или иной проверки. В случае с меточным вариантом требуется какое-то время, чтобы пройтись по меткам и разобраться в структуре кода.

Last edited by Den_spb (21-05-2012 10:43)

Offline

#11 21-05-2012 11:18

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Ошибка с таблицами переходов

Gyr wrote:

А насчет высокоуровневых кодов - так это кому как удобней. Я вот, например, наоборот в них больше путаюсь.

Стоит написать несколько скриптов в высокоуровневом стиле и больше к меточному варианту не вернёшься.

Offline

#12 21-05-2012 12:19

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Ошибка с таблицами переходов

Не вижу ни одной проверки actor.Defined. Эра нубо-скриптов прошла уже. Пора научиться правильно писать коды.

Last edited by DK22Pac (21-05-2012 12:23)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#13 21-05-2012 15:40

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Re: Ошибка с таблицами переходов

@DK22Pac - спасибо за замечание, учту. Кстати, разве возможны какие-либо действия и проверки (на вождение транспорта, нажатие клавиши), пока игрок не создан?
@Den_spb - я высокоуровненвые конструкции использую теперь чаще, в основном для проверок. Ещё так удобнее загружать модели. Загрузил в цикле repeat, использовал и выгрузил.
По ходу разговора вопрос: можно ли if..then включить внутрь другого if..then? И можно ли так делать с другими конструкциями, или лучше не вклинивать одно в другое?

Offline

#14 21-05-2012 22:40

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Ошибка с таблицами переходов

Кстати, разве возможны какие-либо действия и проверки (на вождение транспорта, нажатие клавиши), пока игрок не создан?

Если действия и проверки не относятся к игроку (в опкоде нет переменных $PLAYER_CHAR и $PLAYER_ACTOR), то перед их выполнением проверка на существование игрока не нужна.

По ходу разговора вопрос: можно ли if..then включить внутрь другого if..then? И можно ли так делать с другими конструкциями, или лучше не вклинивать одно в другое?

Можно, конечно. Пример есть в моём предыдущем сообщении.

Загрузил в цикле repeat, использовал и выгрузил.

Если после объявления модели на загрузку (model.load) выполнить команду принудительной загрузки моделей (038B: load_requested_models), то цикл с model.available будет не нужен.

Last edited by Den_spb (21-05-2012 22:43)

Offline

Board footer

Powered by FluxBB