#1 Re: Вопросы по скриптингу » Переход на нулевой оффсет. » 08-11-2016 10:37

Исполнение кода не должно возвращаться на самое начало кода (в данном случае это метка :ST).
Необходимо вставить перед меткой :ST любую команду - например,

0000:
:ST

или

 wait 0
:ST

#2 Re: Вопросы по скриптингу » Ped Wanted Level [GTA:VC] » 02-07-2016 18:26

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

if
    0AE3: 0@ = random_object_near_point 0.0 0.0 0.0 in_radius 10000.0 find_next 0
then
    repeat
        if
            // условия, которым должен соответствовать объект
        then
            // действия, которые нужно произвести над объектом
        end
    until  8AE3: not 0@ = random_object_near_point 0.0 0.0 0.0 in_radius 10000.0 find_next 1
end

Здесь команды для поиска объектов нужно заменить на аналогичные для поиска актеров.
Команда, заставляющая одного актера атаковать другого:

05E2: AS_actor 65@ kill_actor 50@

#3 Re: Модификации » Универсальные поворотники [CLEO4/SA/REL] » 09-05-2016 18:00

Дима, выкладывай конечно good
Правильно ли я понимаю, что данный файл будет иметь формат asi ?

DK22Pac wrote:

Как дополнительная фича - неограниченное кол-во пустых авто с включенными поворотами.

Речь идёт об автомобилях, в которых сидел игрок? Если да, то где хранится соответствующая информация - в структуре самого авто или в каких-то переменных (из кода не понял) ?

#4 Re: Модификации » Универсальные поворотники [CLEO4/SA/REL] » 21-03-2016 20:22

По идее, информация о ширине дороги должна храниться в структурах точек путей. Какое именно смещение за это отвечает - я не знаю.

#5 Re: Модификации » Универсальные поворотники [CLEO4/SA/REL] » 20-03-2016 14:56

Да, большой получился перерыв.
Принципиально новых скриптов от меня можно пока не ожидать, но возможно в скором времени появятся обновленные версии некоторых старых модов.

#6 Re: Модификации » Универсальные поворотники [CLEO4/SA/REL] » 20-03-2016 12:53

Немного доработал скрипт. В версии 2.2 поворотники на машинах ботов включаются не только при поворотах на перекрестках, но и при перестроениях на шоссе. Проверка намерения перестроиться выглядит так:

        // проверяем намерение перестроиться (если водитель едет по шоссе)
        if
            0_LightsStatus == 0
        then
            0A8E: 0_CurrentLane = 0_VehicleStruct + 0x3B7 // int   ТЕКУЩАЯ ПОЛОСА ДВИЖЕНИЯ   0 - левая  1 - правая
            0A8E: 0_NextLane = 0_VehicleStruct + 0x3B8    // int   БУДУЩАЯ ПОЛОСА ДВИЖЕНИЯ   0 - левая  1 - правая
            0A8D: 0_CurrentLane = read_memory 0_CurrentLane size 1 virtual_protect 0
            0A8D: 0_NextLane = read_memory 0_NextLane size 1 virtual_protect 0
            if and
                0_CurrentLane == 0
                0_NextLane == 1
            then  
                0_LightsStatus = 1_Right
            end
            if and
                0_CurrentLane == 1
                0_NextLane == 0
            then  
                0_LightsStatus = 1_Left
            end
        end

Весь код целиком:

{$CLEO}  // убраны опкоды 0B10, 0B15. Добавлена проверка <> 0xFFFF
const
    0_VehicleHandle = 0@
    0_VehicleStruct = 1@
    0_TractorStruct = 2@
        0_PointAdress = 2@
            0_Adress = 2@
                0_VectorPointer = 2@
    0_PrewPathPointID = 3@  // массив ИД точек
    0_CurrPathPointID = 4@
    0_NextPathPointID = 5@
    0_CarX = 6@
        0_PrewX = 6@            // массив X координат точек
            0_FrontLightX = 6@
    0_CarY = 7@
        0_CurrX = 7@
            0_FrontLightY = 7@
    0_CarZ = 8@
        0_NextX = 8@
            0_FrontLightZ = 8@
    0_CarCamDistForw = 9@
        0_PrewY = 9@           // массив Y координат точек
            0_BackLightX = 9@
    0_CarCamDistBack = 10@
        0_CurrY = 10@
            0_BackLightY = 10@
    0_NextY = 11@
        0_BackLightZ = 11@
    0_CamX = 12@
    0_CamY = 13@
    0_CamZ = 14@
    0_CurrentCarOfPlayer = 15@
        0_VehicleType = 15@
    0_OldCarOfPlayer = 16@
    0_StatusOfPlayerCar = 17@
    0_CamTargetMirrorX = 18@    
    0_CamTargetMirrorY = 19@    
    0_CamTargetMirrorZ = 20@    
    0_CamTargetX = 21@    
    0_CamTargetY = 22@    
    0_CamTargetZ = 23@
    0_CarDriver = 24@
    0_UnicalNumberOfCorona = 25@
    0_LightsStatus = 26@
    0_Angle1 = 27@
        0_CurrentLane = 27@
    0_Angle2 = 28@
        0_NextLane = 28@

    // 31@
    
    1_RadiusOfSearch = 200.0 // радиус поиска транспорта, м
    
    // Режимы:
    1_Left = 1
    1_Right = 2
    1_Both = 3
end
0_OldCarOfPlayer = -1
while true
    wait 0
    if
        not player.defined($player_char)
    then
        continue
    end

    if
        32@ > 1000
    then
        32@ = 0
    end
    
    if and
        actor.Driving($PLAYER_ACTOR)
        84C8:   not actor $PLAYER_ACTOR driving_flying_vehicle
        84A7:   not actor $PLAYER_ACTOR driving_boat 
        89AE:   not actor $PLAYER_ACTOR driving_train
        not actor.DrivingVehicleType($PLAYER_ACTOR #BMX)
        not actor.DrivingVehicleType($PLAYER_ACTOR #BIKE)
        not actor.DrivingVehicleType($PLAYER_ACTOR #MTBIKE)
    then    
        03C0: 0_CurrentCarOfPlayer = actor $PLAYER_ACTOR car
        046C: 0_CarDriver = car 0_CurrentCarOfPlayer driver
        if 
            003B:   0_CarDriver == $PLAYER_ACTOR // (int) 
        then
            if
                803B:   not  0_CurrentCarOfPlayer == 0_OldCarOfPlayer // (int)      
            then
                0_StatusOfPlayerCar = 0
                0085: 0_OldCarOfPlayer = 0_CurrentCarOfPlayer // (int) 
            end
            
            if
                0AB0:  key_pressed 90 // Z
            then
                0_StatusOfPlayerCar = 1_Left 
            else
                if
                    0AB0:  key_pressed 88 // X
                then
                    0_StatusOfPlayerCar = 1_Both 
                else
                    if
                        0AB0:  key_pressed 67 // C
                    then
                        0_StatusOfPlayerCar = 1_Right
                    else
                        if
                            0AB0:  key_pressed 16 // Shift
                        then
                            0_StatusOfPlayerCar = 0
                        end 
                    end                    
                end        
            end
        end // CJ -driver          
    end  // actor driving 

    068D: get_camera_position_to 0_CamTargetMirrorX 0_CamTargetMirrorY 0_CamTargetMirrorZ              
    068E: get_camera_target_point_to 0_CamTargetX 0_CamTargetY 0_CamTargetZ  
    0063: 0_CamTargetX -= 0_CamTargetMirrorX // (float) 
    0063: 0_CamTargetY -= 0_CamTargetMirrorY // (float) 
    0063: 0_CamTargetZ -= 0_CamTargetMirrorZ // (float) 
    0063: 0_CamTargetMirrorX -= 0_CamTargetX // (float) 
    0063: 0_CamTargetMirrorY -= 0_CamTargetY // (float) 
    0063: 0_CamTargetMirrorZ -= 0_CamTargetZ // (float)
    068D: get_camera_position_to 0_CamX 0_CamY 0_CamZ
    068E: get_camera_target_point_to 0_CamTargetX 0_CamTargetY 0_CamTargetZ
    
    0A9F: 0_UnicalNumberOfCorona = current_thread_pointer

    if
        0AE2: 0_VehicleHandle = random_vehicle_near_point 0_CamX 0_CamY 0_CamZ in_radius 1_RadiusOfSearch find_next 0 pass_wrecked 1 //IF and SET
    then
        repeat
            0A97: 0_VehicleStruct = car 0_VehicleHandle struct
            0A8E: 0_VehicleType = 0_VehicleStruct + 1424 // int
            0A8D: 0_VehicleType = read_memory 0_VehicleType size 1 virtual_protect 0
            if and
                0_VehicleType <> 0
                0_VehicleType <> 9
            then
                continue
            end
            0AA8: call_function_method 0x6D1080 struct 0_VehicleStruct num_params 0 pop 0 0_VehicleType // _CVehicleBase__getVehicleType
            if and
                0_VehicleType <> 1
                0_VehicleType <> 2
            then
                continue
            end            
            0A8E: 0_TractorStruct = 0_VehicleStruct + 0x4C4 // int
            0A8D: 0_TractorStruct = read_memory 0_TractorStruct size 4 virtual_protect 0
            car.StorePos(0_VehicleHandle 0_CarX 0_CarY 0_CarZ)
            050A: 0_CarCamDistBack = distance_between_XYZ 0_CarX 0_CarY 0_CarZ and_XYZ 0_CamTargetMirrorX 0_CamTargetMirrorY 0_CamTargetMirrorZ 
            050A: 0_CarCamDistForw = distance_between_XYZ 0_CarX 0_CarY 0_CarZ and_XYZ 0_CamTargetX 0_CamTargetY 0_CamTargetZ           
            if or
                0025:   0_CarCamDistForw > 0_CarCamDistBack // (float) 
                0_TractorStruct > 0
                0137:  car 0_VehicleHandle model == #BMX 
                0137:  car 0_VehicleHandle model == #BIKE 
                0137:  car 0_VehicleHandle model == #MTBIKE 
                0686:   car 0_VehicleHandle attached  
            then                    
                continue
            end
            046C: 0_CarDriver = car 0_VehicleHandle driver
            if and
                803B:   not  0_VehicleHandle == 0_OldCarOfPlayer // (int)  
                0_CarDriver <= 0
            then
                continue
            end    
            if
                32@ <= 500
            then
                gosub @Turn_signals_process
            end   
        until 8AE2: not 0_VehicleHandle = random_vehicle_near_point 0_CamX 0_CamY 0_CamZ in_radius 1_RadiusOfSearch find_next 1 pass_wrecked 1 //IF and SET
    end    
end

:Turn_signals_process    
if
    003B:   0_VehicleHandle == 0_OldCarOfPlayer // (int) 
then
    0085: 0_LightsStatus = 0_StatusOfPlayerCar // (int) 
    gosub @Get_lights_coords
    if or
        0_LightsStatus == 1_Right
        0_LightsStatus == 1_Both
    then
        0AC7: 0_VectorPointer = var 0_FrontLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
        0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end
    if or
        0_LightsStatus == 1_Left
        0_LightsStatus == 1_Both
    then
        0_BackLightX *= -1.0
        0_FrontLightX *= -1.0
        0AC7: 0_VectorPointer = var 0_FrontLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
        0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end        
else
    0_LightsStatus = 0
    0A8E: 0_NextPathPointID = 0_VehicleStruct + 0x3A6 // int   НОМЕР СЛЕДУЮЩЕЙ ТОЧКИ ПУТИ      0x3A6
    0A8E: 0_CurrPathPointID = 0_VehicleStruct + 0x3A4 // int   НОМЕР ТЕКУЩЕЙ ТОЧКИ ПУТИ         0x3A4
    0A8E: 0_PrewPathPointID = 0_VehicleStruct + 0x3A8 // int   НОМЕР ПРЕДЫДУЩЕЙ ТОЧКИ ПУТИ     0x3A8
    0A8D: 0_CurrPathPointID = read_memory 0_CurrPathPointID size 2 virtual_protect 0
    0A8D: 0_NextPathPointID = read_memory 0_NextPathPointID size 2 virtual_protect 0
    0A8D: 0_PrewPathPointID = read_memory 0_PrewPathPointID size 2 virtual_protect 0
    if
        0_CurrPathPointID <> 0xFFFF
    then
        for 31@ = 0 to 2
            if
                3@(31@,3i) <> 0xFFFF
            then    
                0085: 0_PointAdress = 3@(31@,3i) // (int) 
                
                0AC6: 30@ = label @SHR_0Ah offset
                0AA8: call_function_method 30@ struct 3@(31@,3i) num_params 0 pop 0 3@(31@,3i)
             //   0B15: 3@(31@,3i) = 3@(31@,3i) SHR 0xA   ////////////////////////////////////////////////////////////
             
                3@(31@,3i) *= 4
                3@(31@,3i) += 0x96F854
                0A8D: 3@(31@,3i) = read_memory 3@(31@,3i) size 4 virtual_protect 0
                    
                if
                    3@(31@,3i) <> 0
                then
                    0085: 3@(31@,3i) = 0_PointAdress // (int)
    
                    0AC6: 30@ = label @AND_3FFh offset
                    0AA8: call_function_method 30@ struct 0_PointAdress num_params 0 pop 0 0_PointAdress               
                 //   0B10: 0_PointAdress = 0_PointAdress AND 0x3FF ///////////////////////////////////////////////////
                   
                    0_PointAdress *= 0xE
                    
                    0AC6: 30@ = label @SHR_0Ah offset
                    0AA8: call_function_method 30@ struct 3@(31@,3i) num_params 0 pop 0 3@(31@,3i)                
                  //  0B15: 3@(31@,3i) = 3@(31@,3i) SHR 0xA ///////////////////////////////////////////////////////////
                   
                    3@(31@,3i) *= 4
                    3@(31@,3i) += 0x96F974
                    0A8D: 3@(31@,3i) = read_memory 3@(31@,3i) size 4 virtual_protect 0
                    005A: 0_PointAdress += 3@(31@,3i) // (int) 
                            
                    0085: 6@(31@,3i) = 0_PointAdress // (int)
                    0A8E: 9@(31@,3i) = 0_PointAdress + 2 // int 
                            
                    0A8D: 6@(31@,3i) = read_memory 6@(31@,3i) size 2 virtual_protect 0
                    if
                        6@(31@,3i) >= 0x8000 // negative word
                    then
                        6@(31@,3i) += 0xFFFF0000 // convert to negative dword
                    end 
                    0093: 6@(31@,3i) = integer 6@(31@,3i) to_float 
                    6@(31@,3f) /= 8.0
                            
                    0A8D: 9@(31@,3i) = read_memory 9@(31@,3i) size 2 virtual_protect 0
                    if
                        9@(31@,3i) >= 0x8000 // negative word
                    then
                        9@(31@,3i) += 0xFFFF0000 // convert to negative dword
                    end 
                    0093: 9@(31@,3i) = integer 9@(31@,3i) to_float 
                    9@(31@,3f) /= 8.0   
                end
            else
                6@(31@,3i) = 0.0
                9@(31@,3i) = 0.0
            end // <> 0xFFFF          
        end   // for end  
    
        0063: 0_NextX -= 0_CurrX // (float) 
        0063: 0_NextY -= 0_CurrY // (float) 
        0063: 0_CurrX -= 0_PrewX // (float)
        0063: 0_CurrY -= 0_PrewY // (float) 
     
        0604: get_Z_angle_for_point 0_NextX 0_NextY store_to 0_Angle1 
        0604: get_Z_angle_for_point 0_CurrX 0_CurrY store_to 0_Angle2 
        0063: 0_Angle1 -= 0_Angle2 // (float)
        0656: get_angle 0_Angle1 absolute_degrees_to 0_Angle1 
        if and
            0_Angle1 >= 30.0
            0_Angle1 < 180.0
        then
            0_LightsStatus = 1_Left
        else
            if and
                0_Angle1 <= 330.0
                0_Angle1 > 180.0
            then
                0_LightsStatus = 1_Right
            else
                0_LightsStatus = 0
            end
        end   // LightsStatus
        
        // проверяем намерение перестроиться (если водитель едет по шоссе)
        if
            0_LightsStatus == 0
        then
            0A8E: 0_CurrentLane = 0_VehicleStruct + 0x3B7 // int   ТЕКУЩАЯ ПОЛОСА ДВИЖЕНИЯ   0 - левая  1 - правая
            0A8E: 0_NextLane = 0_VehicleStruct + 0x3B8    // int   БУДУЩАЯ ПОЛОСА ДВИЖЕНИЯ   0 - левая  1 - правая
            0A8D: 0_CurrentLane = read_memory 0_CurrentLane size 1 virtual_protect 0
            0A8D: 0_NextLane = read_memory 0_NextLane size 1 virtual_protect 0
            if and
                0_CurrentLane == 0
                0_NextLane == 1
            then  
                0_LightsStatus = 1_Right
            end
            if and
                0_CurrentLane == 1
                0_NextLane == 0
            then  
                0_LightsStatus = 1_Left
            end
        end  
        
        gosub @Get_lights_coords
        if
            0_LightsStatus == 1_Right
        then
            0AC7: 0_VectorPointer = var 0_FrontLightX offset
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
            0AC7: 0_VectorPointer = var 0_BackLightX offset
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
        end
        if 
            0_LightsStatus == 1_Left
        then
            0_BackLightX *= -1.0
            0_FrontLightX *= -1.0
            0AC7: 0_VectorPointer = var 0_FrontLightX offset
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
            0AC7: 0_VectorPointer = var 0_BackLightX offset
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
        end        
    end   // FFFF    3A4     
end 

0_VehicleStruct += 0x4C8 
0A8D: 0_VehicleStruct = read_memory 0_VehicleStruct size 4 virtual_protect 0
if
    0_VehicleStruct > 0
then
    gosub @Get_lights_coords
    if or
        0_LightsStatus == 1_Right
        0_LightsStatus == 1_Both
    then
        0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end
    if or
        0_LightsStatus == 1_Left
        0_LightsStatus == 1_Both
    then
        0_BackLightX *= -1.0
        0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end    
end
  
return

:Get_lights_coords
0A8E: 0_Adress = 0_VehicleStruct + 0x22 // int 
0A8D: 0_Adress = read_memory 0_Adress size 2 virtual_protect 0 //model index
0_Adress *= 4
0_Adress += 0xA9B0C8
0A8D: 0_Adress = read_memory 0_Adress size 4 virtual_protect 0 //CModel
0_Adress += 0x5C                                        
0A8D: 0_Adress = read_memory 0_Adress size 4 virtual_protect 0 //vehicle struct
0A8D: 0_FrontLightX = read_memory 0_Adress size 4 virtual_protect 0 //x offset
0_Adress += 4
0A8D: 0_FrontLightY = read_memory 0_Adress size 4 virtual_protect 0 //y offset
0_Adress += 4
0A8D: 0_FrontLightZ = read_memory 0_Adress size 4 virtual_protect 0 //z offset
0_Adress += 4
0A8D: 0_BackLightX = read_memory 0_Adress size 4 virtual_protect 0 //x offset
0_Adress += 4
0A8D: 0_BackLightY = read_memory 0_Adress size 4 virtual_protect 0 //y offset
0_Adress += 4
0A8D: 0_BackLightZ = read_memory 0_Adress size 4 virtual_protect 0 //z offset
if
    0_FrontLightX == 0.0
then
    0_FrontLightX = 0.15
end
if
    0_BackLightX == 0.0
then
    0_BackLightX = 0.15
end
return

:SHR_0Ah
hex
    C1 E9 0A          // shr ecx, 0xA
    89 C8             // mov eax, ecx
    C3                // retn
end

:AND_3FFh
hex
    81 E1 FF 03 00 00 // and ecx, 0x3FF
    89 C8             // mov eax, ecx
    C3                // retn
end
// 0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 15.0 0 penetration 1.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona

Архив со скомпилированным скриптом приложен к сообщению.

#7 Re: Работа с памятью, EXE » Вопрос по памяти » 29-11-2014 12:45

Да, опечатался:

06F8: get_nearest_route_for 62@ 63@ 64@ in_direction 1 store_to 342@ 343@ 344@ Z_angle_to 345@

Вот, нашёл у себя в запасах простой экспериментальный скрипт, подсвечивающий 10 ближайших к игроку точек путей машин:

{$CLEO}
wait 2000
while true
    wait 0
    if
        not player.Defined($player_char)
    then
        continue
    end
    actor.StorePos($player_actor 0@ 1@ 2@)
    31@ = 0
    for 30@ = 1 to 10
        06F8: get_nearest_route_for 0@ 1@ 2@ in_direction 30@ store_to 6@ 7@ 8@ Z_angle_to 3@
        8@ += 1.0 
        016F: create_particle 3 rotation_factor 0.0 size 2.0 intensity 255 flags 31@ 0 255 at 6@ 7@ 8@
        0656: get_angle 3@ absolute_degrees_to 3@ 
        02F6: 4@ = sine 3@ // (float) 
        02F7: 5@ = cosine 3@ // (float)
        4@ *= 2.0
        5@ *= 2.0
        005B: 7@ += 5@ // (float) 
        0063: 6@ -= 4@ // (float)  
        016F: create_particle 3 rotation_factor 0.0 size 1.0 intensity 255 flags 0 0 255 at 6@ 7@ 8@
        0092: 3@ = float 3@ to_integer
        31@ += 25
    end
end 

#8 Re: Вопросы по скриптингу » Один вопрос » 27-11-2014 21:35

Надо перебрать пул ракет, сравнивая значение цели каждой ракеты (смещение +0x0008 от начала структуры ракеты) с адресом структуры педа игрока/автомобиля игрока.
http://gtamodding.ru/wiki/Адреса_Памяти … 4.D1.8B.29

#9 Re: Работа с памятью, EXE » Вопрос по памяти » 25-11-2014 20:11

Игра планирует движение машины только на одну точку вперёд.
Но если машина едет по прямой, а не находится на перекрёстке, то можно просто определить координаты нескольких ближайших точек того пути, на котором она находится в данный момент.
Для этого можно применить опкод:
04D3: get_nearest_car_path_coords_from $TEMPVAR_X_COORD $TEMPVAR_Y_COORD $TEMPVAR_Z_COORD type 2 store_to 88@ 89@ 90@
Здесь "direction" - это степень удаленности точки пути от указанных координат (если указать 1, то найдётся ближайшая к координатам точка, 2 - вторая по близости точка, 3 - третья по близости точка и т.д.)

#10 Re: Вопросы по скриптингу » Один вопрос » 25-11-2014 20:00

d88, попробуй эти опкоды:
01E8: create_forbidden_for_cars_cube_cornerA 2500.0 -1677.0 20.0 cornerB 2430.0 -1653.0 0.0
включить запрет на спавн машин в указанной зоне
01E7: remove_forbidden_for_cars_cube_cornerA 2272.922 -1649.556 14.3311 cornerB 2266.101 -1633.219 14.3505
отключить запрет на спавн машин в указанной зоне
0395: clear_area 1 at 681.8004 -474.1063 15.5363 radius 3.0
очистить указанную зону от уже созданных объектов

#12 Re: GTA Modding » Sanny Builder / CLEO discussion » 09-06-2014 20:13

Wouter0100 wrote:

And, is it possible to make a boat go to a specifick cordinate?

02D3: boat $Boat drive_to 10000.0 -100.0 0.0

Boat $Boat goes to coordinates X Y Z.

#13 Re: Вопросы по скриптингу » Один вопрос » 09-06-2014 20:05

d88 wrote:

Я тоже поэкспериментировал с числами. Так вот, при декомпеляции вместо числа появляется метка с тем же именем, что и у остальных меток в этом скрипте.

Вообще в скомпилированных скриптах никаких меток нет. Скомпилированный скрипт содержит только номера опкодов и значения параметров опкодов (в этом легко убедиться, открыв любой cs-файл в hex-редакторе, и сравнив полученную картину с исходным кодом скрипта). Метки создаёт декомпилятор в момент декомпиляции для удобства чтения полученного кода. Декомпилятор называет метки так, как указано в настройках СБ (Настройки СБ - Форматирование -Формат меток).

#14 Re: Вопросы по скриптингу » Вопрос » 09-06-2014 19:56

На этом форуме не рассматриваются вопросы, связанные со скриптами для SAMP.

#15 Re: Вопросы по скриптингу » Создание 3D линий » 31-05-2014 10:54

Можно создать жёлтую линию с помощью опкода создания выстрела, постоянно применяя его в цикле:
06BC: create_M4_shoot_from 2193.268 -1165.441 1031.124 target $TEMPVAR_X_COORD $TEMPVAR_Y_COORD $TEMPVAR_Z_COORD energy 1
При этом параметр "энергия" должен быть равен нулю (если нужно получить просто светящуюся линию, а не всёразрушающий луч).

#16 Re: Вопросы по скриптингу » Один вопрос » 31-05-2014 10:47

d88 wrote:

Или есть ли другой способ на некоторое время отключить возможность ходить на свидания? И чтобы девушки не звонили по телефону, и чтобы маркеры вообще не появлялись возле их домов?

Можно попробовать запустить поток снова опкодами:
004F: create_thread @MS_BIKE_MISSIONS
00D7: create_thread @NONAME_1 // without extra params
Либо надо менять прогресс отношений с каждой из подруг.
Это можно сделать с помощью опкода изменения статистики:
0627: update_integer_stat 215 to $1922
Номера статистики для отношений с подругами: 252 - 257 (см. справку СБ: Документация по scm - статистика ИД)
Другой вариант: найти в main.scm глобальные переменные со словом "girl" и попробовать записать в них ноль.
Скорее всего, нужно обнулить глобальные переменные: $GIRL_PROGRESS[0] ... $GIRL_PROGRESS[5]

#17 Re: Sanny Builder и CLEO » Sanny Builder v3.xx » 18-03-2014 20:25

grompes wrote:

При редактировании файла gta3.img (а некотороые скрипты cleo просятся туда, тот же wallrun) игра загружает процессор под 50% и не загружается. Может версия "IMGTool 2" уже древняя и за 6 лет что-то новое вышло. Может она не правильно редакртирует файлы?

При работе с IMGTool нужно быть внимательным - при попытке одновременной замены нескольких файлов программа заменяет только первый файл. Поэтому файлы нужно заменять (добавлять) по одному. А лучше пользоваться более совершенными программами (Crazy IMG Editor) - они умеют добавлять/заменять несколько файлов за раз.

#18 Re: Работа с памятью, EXE » Помогите с работой в памяти » 18-03-2014 20:07

Во-первых, следует различать понятия "player" и "actor".
"player" - это игрок (посмотреть команды и проверки для игрока можно, введя в поиске опкодов SB "player_char"). Если в игру играет один человек, то и игрок соответственно один (переменная игрока - $PLAYER_CHAR)
"actor" - это персонаж (физический объект), в том числе и персонаж, управляемый игроком. Персонажи в игре ещё называют "педами". Переменная педа игрока - $PLAYER_ACTOR.

Во-вторых, следует различать понятия "хэндл" и "указатель".
Хэндл - что-то типа индивидуального идентификационного номера какого-либо объекта.
Указатель - адрес структуры объекта в памяти игры.
В "классическом" скриптинге (стандартные опкоды) используются только хэндлы.

Конвертировать хэндл в указатель и обратно можно с помощью опкодов КЛЕО4. Пример для актёров:

0A96: $ActorStruct = actor $PLAYER_ACTOR struct // Вычисление указателя по хэндлу
0AEA: $actor = actor_struct $ped_struct handle // Вычисление хэндла по указателю

С учетом поправок получается такой код (в игре не проверял):

while true
    wait 0
    if Actor.Dead($PLAYER_ACTOR)
    then
        0A96: 4@ = actor $PLAYER_ACTOR struct
        4@ += 0x764
        0A8D: 7@ = read_memory 4@ size 4 virtual_protect 0        
        if
            7@ > 0
        then
            0AEA: 7@ = actor_struct 7@ handle           
            Actor.StorePos(7@, 29@, 30@, 31@)
            31@ += 10.0
            Marker.CreateAboveActor(8@, 7@)
            if 0ab0: 0x2D // insert
            then
                Actor.PutAt($PLAYER_ACTOR, 29@, 30@, 31@)
            end
        end
    end    
end

P.S. Свои глобальные переменные в клео-скриптах не используем ($Mark). Применяем вместо них локальные переменные (0@...31@).

#19 Re: Справочная информация » Работа с компонентами машины » 16-02-2014 01:42

Товарищи, а у кого-нибудь получалось найти доступ к компонентам объекта, созданного скриптом?
В структурах объектов, созданных скриптом, по смещению:

CEntity +0x18 = [dword] Указатель на RwObject (RpClump)

почему-то всё время записан ноль.

#20 Re: Sanny Builder и CLEO » Sanny Builder v3.xx » 22-01-2014 17:31

@Vital -
те клео-переменные, про которые ты говоришь - глобальные. То есть они общие для всех скриптов.

#22 Re: Программы для GTA » Проблема с .asi файлами » 26-12-2013 22:22

Нужна версия gta_sa.exe 1.0 US или gta_sa.exe 1.0 US no-dvd

#23 Re: Вопросы по скриптингу » Один вопрос » 17-11-2013 12:01

@d88 -
С точки зрения конечного результата, нет разницы, каким именно способом будет поворачиваться объект - "автоматически" (например, с помощью анимации) или "вручную" (с помощью многократной установки объекту нового угла поворота, который должен с каждым разом увеличиваться на одну и ту же величину). Но для того, чтобы вращение выглядело плавным при "ручном" способе, присвоение нового значения угла поворота должно происходить как можно чаще (желательно - каждый кадр, т.е. в скрипте должен быть только один wait 0).

#24 Re: Вопросы по скриптингу » Один вопрос » 16-10-2013 17:01

2. Можно ли записать в переменные координаты положения камеры?

068D: get_camera_position_to $TEMPVAR_FLOAT_1 $TEMPVAR_FLOAT_2 $TEMPVAR_FLOAT_3

#25 Re: Вопросы по скриптингу » Один вопрос » 15-10-2013 20:42

Тем и удобнее, что в глобальную можно записать текст длиной больше 4 символов, а в локальные, как оказалось, нельзя.

У глобальных и локальных переменных одинаковые размеры.
$, @ - 4 байта
s$, @s - 8 байтов
v$, @v - 16 байтов
Один знак текста кодируется одним байтом.

Board footer

Powered by FluxBB