You are not logged in.
Почему происходит вылет в данном кусочке кода (я с помощью звуков проверил точное местоположение вылета), ведь вроде бы все правильно.
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
А зачем тебе 0209: 10@ = random_int_in_ranges 0 3 ?
Зачем ты сначала присваиваешь 10@ рандомное значение, и тут же вешаешь на неё таблицу?
Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!
Offline
@Gyr - для того, чтобы был случайный результат. Я так делал часто, и все работало прекрасно. Именно таким образом я делал вариативность.
Offline
Тут надо смотреть весь код. Кусочек кусочком, а проблема может быть вообще в другом месте.
Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!
Offline
Вот весь код. Не думаю, что показ его что-то изменит, но всё же.
: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
А вот тут ты оказался не прав. Ошибка-то кроется в совсем другом месте скрипта. Запомни если ты делаешь gosub или jump на метку, после которой идет IF, то перед IF в обязательном порядке должна стоять wait 0 (можно больше). иначе у тебя будет происходить зависание игры, что собственно и произошло. А ошибка кроется в метке :Act. И вообще, старайся ставить wait 0 перед любым IF. Так надежней.
P.S.: У меня скрипт заработал Прикольней будет, если охранник атакует тех, на кого ты укажешь, а не просто всех подряд.
Last edited by Gyr (20-05-2012 10:42)
Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!
Offline
Ставить wait перед каждым if не стоит - скрипт будет медленно работать (каждый wait 0 приостанавливает работу скрипта на 1 кадр). Лучше, конечно, учиться писать в высокоуровневом стиле - с ним не запутаешься в собственном коде, да и проще разобраться с употреблением wait.
Last edited by Den_spb (20-05-2012 11:54)
Offline
Ох, спасибо огромное я бы вряд ли нашёл, думал, что всё в порядке, а ошибка, как всегда у программистов, кроется в совсем неожиданных местах.
Gyr, смысл у меня в том, чтобы этот бот был не охранником, а как бы вторым самостоятельным игроком, он будет совершать разные действия в зависимости от случайного выбора. Я планирую сделать его поведение похожим на поведения настоящего игрока.
Ещё раз спасибо.
Offline
Den_spb частично прав - если ставить wait перед каждым If, то скрипт будет работать медленней (даже если wait = 0), НО заметно это только когда работаешь с текстом или изображениями. В таком скрипте как у тебя это не будет заметно вообще, так что решай сам.
А насчет высокоуровневых кодов - так это кому как удобней. Я вот, например, наоборот в них больше путаюсь.
Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!
Offline
А насчет высокоуровневых кодов - так это кому как удобней.
Это верно, каждый работает так, как ему удобно
Но я покажу на примере, почему высокоуровневый стиль может быть удобнее.
Сравним два варианта одного и того же кода - в меточном стиле и в высокоуровневом:
// 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
А насчет высокоуровневых кодов - так это кому как удобней. Я вот, например, наоборот в них больше путаюсь.
Стоит написать несколько скриптов в высокоуровневом стиле и больше к меточному варианту не вернёшься.
Offline
Не вижу ни одной проверки 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
@DK22Pac - спасибо за замечание, учту. Кстати, разве возможны какие-либо действия и проверки (на вождение транспорта, нажатие клавиши), пока игрок не создан?
@Den_spb - я высокоуровненвые конструкции использую теперь чаще, в основном для проверок. Ещё так удобнее загружать модели. Загрузил в цикле repeat, использовал и выгрузил.
По ходу разговора вопрос: можно ли if..then включить внутрь другого if..then? И можно ли так делать с другими конструкциями, или лучше не вклинивать одно в другое?
Offline
Кстати, разве возможны какие-либо действия и проверки (на вождение транспорта, нажатие клавиши), пока игрок не создан?
Если действия и проверки не относятся к игроку (в опкоде нет переменных $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