You are not logged in.
Огромное спасибо, попозжа проверю:^
Offline
Короче, что-то у меня вылетает, а без этого кода, работает стабильно
Offline
Покажи хоть как используешь этот код. В scm-функцию надо передавать хэндл актера, которому устанавливается новый референс. Например:
0AB1: call_scm_func @set_actor_scripted_reference 1 $PLAYER_ACTOR
Offline
В общем вот
0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 20@ closest_ped_to 0@ if 0@ > -1 else_jump @walk_696 if 02CB: actor 0@ bounding_sphere_visible else_jump @walk_696 :set_actor_scripted_reference 0A96: 0@ = actor 0@ struct 0AA6: call_method 0x5E47E0 struct 0@ num_params 1 pop 0 new_ref 2 0AB2: ret 0 :Дальше идут действия над актёром: 0AB1: call_scm_func @set_actor_scripted_reference 1 0@ - эту команду куда не ставил, везде вылеты
Напиши пожалуйста показательный скрипт, найди педа и заставь его прыгать или бегать, чтоб понятнее было...
Offline
{$CLEO} if 8AA9: not game_version_original then 0a93: end while true wait 0 if not player.Defined(0) then continue end // Шаг 1: найти нужного актера среди случайных педов gosub @find_random_cop_near_player // Шаг 2: проверка, был ли поиск удачным if 0@ == 0 then continue end // Шаг 3: делаем из случайного педа актера 0AB1: call_scm_func @set_actor_scripted_reference 1 0@ // Шаг 4: работаем с актером gosub @do_something_with_actor // Шаг 5: убираем за собой gosub @cleanup // Шаг 6: возвращаемся, чтобы повторить все с начала end :find_random_cop_near_player actor.StorePos($PLAYER_ACTOR, 0@, 1@, 2@) if 0AE1: 0@ = random_actor_near_point 0@ 1@ 2@ in_radius 10.0 find_next 0 pass_deads 1 //IF and SET then while true //проверка, является ли найденный актер копом 089F: get_actor 0@ pedtype_to 3@ if 3@ == 6 //cop then break end //найти следующего и повторить действия if 8AE1: not 0@ = random_actor_near_point 0@ 1@ 2@ in_radius 10.0 find_next 1 pass_deads 1 //IF and SET then 0@ = 0 //нужного педа не найдено break end end else 0@ = 0 //нужного педа не найдено end return :set_actor_scripted_reference 0A96: 0@ = actor 0@ struct 0AA6: call_method 0x5E47E0 struct 0@ num_params 1 pop 0 new_ref 2 0AB2: ret 0 :do_something_with_actor 0187: 1@ = create_marker_above_actor 0@ marker.SetColor(1@, 1) while true if not player.Defined(0) then continue end if or actor.Dead(0@) actor.Dead($PLAYER_ACTOR) then break end 0850: AS_actor 0@ follow_actor $PLAYER_ACTOR wait 0 end return :cleanup marker.Disable(1@) actor.RemoveReferences(0@) 0@ = 0 return
Offline
В общем не работает текст вызванный из .fxt файлов, когда поставил версию клео 3, всё заработало, прошу исправить
Offline
В общем не работает текст вызванный из .fxt файлов, когда поставил версию клео 3, всё заработало, прошу исправить
GxtHook.asi поставь и текст будет отображаться.
Offline
Ставил, не помогло, только он не .asi, а .cleo
Offline
@Kostyan - проверь теперь. Возможно, опять проблемы с msvcrt.dll. В любом случае головной боли с ним было достаточно, буду использовать статические библиотечные функции...
@nike - а вредные советы давать не надо. То, что ты предлагаешь отрубит опкоды dynamic_gxt.
Offline
Всё работает, спасибо;-)
Offline
Новое обновление. Исправлен баг с 3D-звуком. Исправлен баг с опкодом 0AA4. В опкоды 0AA5-0AA8 добавлена возможность передавать в качестве параметра строку.
______________________________________________
На сегодняшний день все заявленные баги исправлены. Так что нынешнюю версию можно считать финалом.
Offline
Баг с 3Д звуком исправлен не полностью, двигатель машины всёравно криво работает
Offline
Какой еще двигатель машины?:rolleyes:
Offline
А возможно сделать работу опкода call_scm_func в миссиях? Мне бы просто им в миссии вызывать функции, а возврат параметров - необязательно. Просто чтоб реально в миссии было также вызвать функцию с параметрами, потому что возврат всех переменных сделать не получится - в миссии их больше) Просто очень надо или альтернативу этого опкода для работы в миссиях...
Offline
Какой еще двигатель машины?:rolleyes:
Ээээмм, я про звук
Offline
Alien, чем принцип работы опкода 0AE3 из КЛЕО 4 отличается от опкода-аналога 0B13 из SANO? Если я в своём скрипте заменяю
0B13: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 1
на
0AE3: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 1
то он не находит светофоры (если find_next 1 заменить на 0, то находит, но только при движении игрока с большой скоростью). А 0B13 работает отлично - мгновенно находит нужные объекты.
Offline
@Viger - дык вроде сделано уже... scm-функция в миссиях имеет 32 локальные переменные (как в обычных скриптах). Поэтому любой код из обычного клео-скрипта может быть легко перетащен в клео-миссию.
@Kostyan - что-то не сильно понятнее стало от твоего пояснения.
@Den_spb - принцип в том, что флаг find_next имеет определяющее значение в CLEO 4 и не имеет значения в SANO. Шаблон для поиска примерно такой:
if 0AE1: 23@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 0 pass_deads 1 //IF and SET then repeat ... until 8AE1: not 23@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 1 pass_deads 1 //IF and SET end
Сначала пытаемся найти любого подходящего педа в области с начала пула, если это удалось (такой пед нашелся), пытаемся найти следующего итд. Над каждым найденным выполняется одно и то же действие (в теле цикла repeat-until).
Кстати, твой скрипт я уже перетаскивал на CLEO 4. Вот что получилось:
//Проехал на красный - получи звезду 2 (клео-скрипт для гта са) {$CLEO} var 17@ : Integer 18@ : Integer 6@ : Integer 8@ : Integer 29@ : Integer 30@ : Integer 25@ : Integer end const Player_WAS_in_front_of_red_traffic_light = 17@ Traffic_light_type = 18@ // 1 or 2 Type_of_red_traffic_light = 6@ // 0,1,2,3 0 - both not red 3 - both red Player_IS_in_front_of_red_traffic_light = 8@ Traffic_light_model = 25@ end 19@ = 30000.0 20@ = 30000.0 //---------------------------------------------------------------------------------------------------- while true wait 0 if player.Defined($PLAYER_CHAR) then if and actor.Driving($PLAYER_ACTOR) 84A7: not actor $PLAYER_ACTOR driving_boat 84C8: not actor $PLAYER_ACTOR driving_flying_vehicle then if or 89AE: not actor $PLAYER_ACTOR driving_train actor.DrivingVehicleType($PLAYER_ACTOR, #TRAM) then 03C0: 28@ = actor $PLAYER_ACTOR car if 8ABD: not vehicle 28@ siren_on then //--------------------------------------------------------------------------Определяем ближайший светофор actor.StorePos($PLAYER_ACTOR 0@ 1@ 2@) 3@ = 30.0 if gosub @GET_RANDOM_OBJECT then 0984: 31@ = object 9@ model gosub @is_Object_Traffic_Light if 31@ <> 0 then object.StorePos(9@ 12@ 13@ 26@) actor.StorePos($player_actor 0@ 1@ 2@) 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ 0509: 2@ = distance_between_XY 0@ 1@ and_XY 12@ 13@ if 0025: 14@ > 2@ // (float) then 23@ = 0 0085: Traffic_light_model = 31@ // (int) 0087: 19@ = 12@ // (float) 0087: 20@ = 13@ // (float) 0087: 27@ = 26@ // (float) 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ 0176: 24@ = object 9@ Z_angle 02F6: 10@ = cosine 24@ // (float) синус 02F7: 22@ = sine 24@ // (float) косинус 0073: 10@ /= 22@ // (float) тангенс //----------------------------------Определяем тип светофора if and 24@ >= 60.0 24@ <= 150.0 then Traffic_light_type = 2 else if and 24@ >= 240.0 24@ <= 330.0 then Traffic_light_type = 2 else Traffic_light_type = 1 end end end end end actor.StorePos($player_actor 0@ 1@ 2@) 27@ += 1.0 if and 14@ < 30.0 // если ближайший светофор достаточно близко 06BD: no_obstacles_between 0@ 1@ 2@ and 19@ 20@ 27@ solid 1 car 0 actor 0 object 0 particle 0 // и нет препятствий между светофором и игроком then // иначе интереса светофор не представляют 27@ -= 1.0 else 27@ -= 1.0 23@ = 0 continue end //------------------------Определяем позицию игрока относительно светофора 0087: 22@ = 0@ // (float) 0063: 22@ -= 19@ // (float) 006B: 22@ *= 10@ // (float) 005B: 22@ += 20@ // (float) if or 24@ < 90.0 24@ > 270.0 then if 0025: 22@ > 1@ // (float) Y_act < tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 24@ == 90.0 then if 0025: 0@ > 19@ // (float) X_act > X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 24@ == 270.0 then if 0025: 19@ > 0@ // (float) X_act < X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else // Z > 90 AND Z < 270 if 0025: 1@ > 22@ // (float) Y_act > tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end end end end //------------------------------------------------------------------------ if 23@ == 0 then if or // Список светофоров, запрещённых к пересечению только спереди (при красном сигнале) Traffic_light_model == 3855 Traffic_light_model == 1315 Traffic_light_model == 1352 Traffic_light_model == 1350 Traffic_light_model == 1351 Traffic_light_model == 3516 then if Player_IS_in_front_of_red_traffic_light == True then 23@ = 1 end else if or // Список светофоров, запрещённых к пересечению и спереди, и сзади Traffic_light_model == 1283 Traffic_light_model == 1284 then 23@ = 1 end end else if 23@ == 2 then if Player_IS_in_front_of_red_traffic_light <> Player_WAS_in_front_of_red_traffic_light then 23@ = 3 end end end Player_WAS_in_front_of_red_traffic_light = Player_IS_in_front_of_red_traffic_light //---------------------------Определяем текущие цвета светофоров типов 1 и 2 0AA7: call_function 0x49d310 num_params 0 pop 0 29@ 0AA7: call_function 0x49d350 num_params 0 pop 0 30@ if 30@ < 29@ then Type_of_red_traffic_light = 2 else if 30@ > 29@ then Type_of_red_traffic_light = 1 else if or 29@ == 2228480 // cheat All green lights enabled 30@ == 2228480 then Type_of_red_traffic_light = 0 else Type_of_red_traffic_light = 3 // both are red end end end //-------------------------------------------------------------------------- if or Type_of_red_traffic_light == 3 Type_of_red_traffic_light == Traffic_light_type then if 23@ == 1 then 23@ = 2 else if 23@ == 3 then if player.Defined($PLAYER_CHAR) then if 810F: not player $PLAYER_CHAR wanted_level > 0 then if gosub @CHECK_ANY_COP_NEAR_PLAYER then 010D: set_player $PLAYER_CHAR wanted_level_to 1 end end end 23@ = 0 end end else 23@ = 0 end // type == type else 23@ = 0 end // siren on else 23@ = 0 end else 23@ = 0 end else 23@ = 0 end // player defined end // while main //----------------------------------------------------------------------------------------- :is_Object_Traffic_Light if and 31@ <> 3855 // GAY_TRAFFIC_LIGHT 31@ <> 1315 // TRAFFICLIGHT1 31@ <> 1352 // CJ_TRAFFIC_LIGHT3 31@ <> 1350 // CJ_TRAFFIC_LIGHT4 31@ <> 1351 // CJ_TRAFFIC_LIGHT5 31@ <> 3516 // VGSSTRIPTLIGHTS1 31@ <> 1283 // MTRAFFIC1 then if 31@ <> 1284 // MTRAFFIC2 then 31@ = 0 end end return :GET_RANDOM_OBJECT if 0AE3: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 1 //искать с последнего найденного then 0485: return_true return else if 0AE3: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 0 //если весь пул пройден, начать сначала then 0485: return_true return end end 8485: return_false return :CHECK_ANY_COP_NEAR_PLAYER if 0AE1: 23@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 0 pass_deads 1 //IF and SET then repeat 089F: get_actor 23@ pedtype_to 23@ if 23@ == 6 then 0485: return_true return end until 8AE1: not 23@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 1 pass_deads 1 //IF and SET end 8485: return_false return
Там еще добавлена проверка на то, что правонарушение замечает коп.:D
Last edited by Alien (09-06-2010 05:15)
Offline
Алиен, но дело в том, то что мне бы использовать опкод call в миссии мейна! А оттуда он слетает. Ты мог бы сделать ну просто, поддержку этого опкода в стандартных миссиях СА? Я думаю это не сложно будет, но при вызове обратного ret с параметрами пусть так и останется 32 локальных переменных, а остальные переменные пусть остаются как были! У меня лично в миссиях этот опкод не работает, в последней версии ещё не пробовал.
Если что, был ведь какой-то код Симана, который позволял ставить таймеры не только на глобальные переменные, но и на локальные? Там вроде и был код, который определяет, запущена ли сейчас миссия или обычный поток, ну может это тебе поможет!:)
Offline
Ок, переделал scm_func. Правда пришлось писать по заглушкам структуры CScriptThread...=)
Offline
Спасибо большое! Сейчас протестирую)
Offline
Кстати, твой скрипт я уже перетаскивал на CLEO 4. Вот что получилось:
Спасибо, только проверку ИД нового светофора и проверку того, ближе ли новый светофор к игроку, чем старый, надо внести в цикл поиска объектов. Тогда нужный светофор будет найден очень быстро (уже проверил). За копов тоже благодарю - полезная функция.
Last edited by Den_spb (08-06-2010 23:54)
Offline
Offline
Вроде опкод, находится ли актёр в поле зрения вот:
89ED: not actor $PLAYER_ACTOR is_within_field_of_view_actor 9@
А опкод
0364: actor 102@(42@,9i) spotted_actor $PLAYER_ACTOR
означает не задел ли актёр другого актёра
@Alien да, степень вложенности пока ограничена! После вызова call_scm_func из миссии, а затем вызвав из того кода ещё другую функцию, то переменные обнулятся, вместо того, чтобы вернуться как были. При вызове не из миссии - всё нормально работает!
Offline
@Viger - нашел проблему, из-за которой не сохранялись локальные переменные mission thread'ов... Теперь все работает как надо?
Offline