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