#151 23-05-2010 07:14

Kostyan
Registered: 27-09-2009
Posts: 94

Re: CLEO 4 для GTA San Andreas

Огромное спасибо, попозжа проверю:^

Offline

#152 23-05-2010 10:19

Kostyan
Registered: 27-09-2009
Posts: 94

Re: CLEO 4 для GTA San Andreas

Короче, что-то у меня вылетает, а без этого кода, работает стабильно

Offline

#153 23-05-2010 15:06

Alien
Registered: 12-10-2008
Posts: 564

Re: CLEO 4 для GTA San Andreas

Покажи хоть как используешь этот код. В scm-функцию надо передавать хэндл актера, которому устанавливается новый референс. Например:

0AB1: call_scm_func @set_actor_scripted_reference 1 $PLAYER_ACTOR

Offline

#154 24-05-2010 03:08

Kostyan
Registered: 27-09-2009
Posts: 94

Re: CLEO 4 для GTA San Andreas

В общем вот

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

#155 24-05-2010 09:22

Alien
Registered: 12-10-2008
Posts: 564

Re: CLEO 4 для GTA San Andreas

{$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

#156 28-05-2010 06:10

Kostyan
Registered: 27-09-2009
Posts: 94

Re: CLEO 4 для GTA San Andreas

В общем не работает текст вызванный из .fxt файлов, когда поставил версию клео 3, всё заработало, прошу исправить

Offline

#157 28-05-2010 07:48

nike
From: Novosibirsk
Registered: 23-04-2010
Posts: 13

Re: CLEO 4 для GTA San Andreas

Kostyan wrote:

В общем не работает текст вызванный из .fxt файлов, когда поставил версию клео 3, всё заработало, прошу исправить

GxtHook.asi поставь и текст будет отображаться.

Offline

#158 28-05-2010 09:21

Kostyan
Registered: 27-09-2009
Posts: 94

Re: CLEO 4 для GTA San Andreas

Ставил, не помогло, только он не .asi, а .cleo

Offline

#159 28-05-2010 17:53

Alien
Registered: 12-10-2008
Posts: 564

Re: CLEO 4 для GTA San Andreas

@Kostyan - проверь теперь. Возможно, опять проблемы с msvcrt.dll. В любом случае головной боли с ним было достаточно, буду использовать статические библиотечные функции...
@nike - а вредные советы давать не надо. То, что ты предлагаешь отрубит опкоды dynamic_gxt.

Offline

#160 29-05-2010 07:11

Kostyan
Registered: 27-09-2009
Posts: 94

Re: CLEO 4 для GTA San Andreas

Всё работает, спасибо;-)

Offline

#161 03-06-2010 15:37

Alien
Registered: 12-10-2008
Posts: 564

Re: CLEO 4 для GTA San Andreas

Новое обновление. Исправлен баг с 3D-звуком. Исправлен баг с опкодом 0AA4. В опкоды 0AA5-0AA8 добавлена возможность передавать в качестве параметра строку.

______________________________________________
На сегодняшний день все заявленные баги исправлены. Так что нынешнюю версию можно считать финалом.

Offline

#162 06-06-2010 01:35

Kostyan
Registered: 27-09-2009
Posts: 94

Re: CLEO 4 для GTA San Andreas

Баг с 3Д звуком исправлен не полностью, двигатель машины всёравно криво работает

Offline

#163 06-06-2010 05:32

Alien
Registered: 12-10-2008
Posts: 564

Re: CLEO 4 для GTA San Andreas

Какой еще двигатель машины?:rolleyes:

Offline

#164 06-06-2010 11:08

Viger
Registered: 14-05-2009
Posts: 24

Re: CLEO 4 для GTA San Andreas

А возможно сделать работу опкода call_scm_func в миссиях? Мне бы просто им в миссии вызывать функции, а возврат параметров - необязательно. Просто чтоб реально в миссии было также вызвать функцию с параметрами, потому что возврат всех переменных сделать не получится - в миссии их больше) Просто очень надо или альтернативу этого опкода для работы в миссиях...

Offline

#165 06-06-2010 13:03

Kostyan
Registered: 27-09-2009
Posts: 94

Re: CLEO 4 для GTA San Andreas

Alien wrote:

Какой еще двигатель машины?:rolleyes:

Ээээмм, я про звук blush

Offline

#166 06-06-2010 20:36

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

Re: CLEO 4 для GTA San Andreas

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

#167 07-06-2010 04:50

Alien
Registered: 12-10-2008
Posts: 564

Re: CLEO 4 для GTA San Andreas

@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

#168 07-06-2010 07:06

Viger
Registered: 14-05-2009
Posts: 24

Re: CLEO 4 для GTA San Andreas

Алиен, но дело в том, то что мне бы использовать опкод call в миссии мейна! А оттуда он слетает. Ты мог бы сделать ну просто, поддержку этого опкода в стандартных миссиях СА? Я думаю это не сложно будет, но при вызове обратного ret с параметрами пусть так и останется 32 локальных переменных, а остальные переменные пусть остаются как были! У меня лично в миссиях этот опкод не работает, в последней версии ещё не пробовал.
Если что, был ведь какой-то код Симана, который позволял ставить таймеры не только на глобальные переменные, но и на локальные? Там вроде и был код, который определяет, запущена ли сейчас миссия или обычный поток, ну может это тебе поможет!:)

Offline

#169 07-06-2010 17:45

Alien
Registered: 12-10-2008
Posts: 564

Re: CLEO 4 для GTA San Andreas

Ок, переделал scm_func. Правда пришлось писать по заглушкам структуры CScriptThread...=)

Offline

#170 08-06-2010 17:53

Viger
Registered: 14-05-2009
Posts: 24

Re: CLEO 4 для GTA San Andreas

Спасибо большое! Сейчас протестирую)

Offline

#171 08-06-2010 23:49

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

Re: CLEO 4 для GTA San Andreas

Alien wrote:

Кстати, твой скрипт я уже перетаскивал на CLEO 4. Вот что получилось:

Спасибо, только проверку ИД нового светофора и проверку того, ближе ли новый светофор к игроку, чем старый, надо внести в цикл поиска объектов. Тогда нужный светофор будет найден очень быстро (уже проверил). За копов тоже благодарю - полезная функция. good

Last edited by Den_spb (08-06-2010 23:54)

Offline

#172 09-06-2010 05:20

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: CLEO 4 для GTA San Andreas

кстате помимо проверки копов надо еще проверять вот это

0364:   actor 102@(42@,9i) spotted_actor $PLAYER_ACTOR

что значит, что коп увидел игрока, иначе как он его запалит wink


I know everything and nothing...

Offline

#173 09-06-2010 09:02

Viger
Registered: 14-05-2009
Posts: 24

Re: CLEO 4 для GTA San Andreas

Вроде опкод, находится ли актёр в поле зрения вот:

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

#174 09-06-2010 09:28

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: CLEO 4 для GTA San Andreas

Да не все верно spot это и есть увидел.
Задел другое. Что там collision или...


I know everything and nothing...

Offline

#175 09-06-2010 10:21

Alien
Registered: 12-10-2008
Posts: 564

Re: CLEO 4 для GTA San Andreas

@Viger - нашел проблему, из-за которой не сохранялись локальные переменные mission thread'ов... Теперь все работает как надо?

Offline

Board footer

Powered by FluxBB