#51 18-12-2011 17:57

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

Re: Универсальные поворотники [CLEO4/SA/REL]

BullDogHEMI427 wrote:

И как насчёт дополнительных оффсетов для мотоциклов? Например, задние поворотники в 99% случаев сливаются посередине.

Если X-оффсет равен 0, то скрипт увеличивает его до 0.15:

if
    0_FrontLightX == 0.0
then
    0_FrontLightX = 0.15
end
if
    0_BackLightX == 0.0
then
    0_BackLightX = 0.15
end

Если этого значения мало, то можно увеличить.

BullDogHEMI427 wrote:

Есть возможность включать поворотники машинам педов, перестраивающихся на шоссе?

Перестроения - это другой вопрос, я его пока не исследовал.

Last edited by Den_spb (18-12-2011 17:58)

Offline

#52 31-12-2011 11:05

BullDogHEMI427
From: Рязань
Registered: 02-04-2009
Posts: 54

Re: Универсальные поворотники [CLEO4/SA/REL]

Хммм... Я один заметил, что в некоторых ситуациях на стоящей на месте машине без водителя (например, спавненной автосалоном) включается правый поворотник?


Also known as HemiG
It's cool to Hate. It's cool to be a bloody guitarist.
284487-39e63-35897154-h200.jpg

Offline

#53 31-12-2011 11:20

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Универсальные поворотники [CLEO4/SA/REL]

Надо добавить проверку, что в авто сидит водитель.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#54 05-01-2012 03:02

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

Re: Универсальные поворотники [CLEO4/SA/REL]

В версии 2.1 устранены недоработки предыдущих версий:
- исправлена уязвимость, из-за которой в определённых случаях была вероятность вылета игры со скриптом версии 2.0;
- теперь поворотники не работают на пустых машинах (исключение - машина, которую вёл игрок), а также на "приаттаченных" к чему-либо машинах;
- уменьшена "проникающая способность" короны (теперь корона не просвечивает сквозь водителя мотоцикла или сквозь весь корпус машины);
- уменьшена инертность короны (последовательные вспышки не сливаются в одну, что иногда могло наблюдаться раньше);
- теперь скрипт работает во время миссий.

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

Поэкспериментировав с функцией короны, выяснил смысл ещё нескольких параметров:

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

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

Offline

#55 06-01-2012 12:13

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Универсальные поворотники [CLEO4/SA/REL]

Круто, как всегда. Жаль увидеть все это вживую смогу только через полгода.

Offline

#56 16-07-2012 21:14

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Универсальные поворотники [CLEO4/SA/REL]

Фух, я конечно уже многое позабыл за год, но вроде как постепенно начинаю вливаться в скриптинг опять.
Последняя версия поворотников, адаптированная под клео 3(управление клавишами A и D, как в первой мафии):

{$CLEO}  // убраны опкоды 0B10, 0B15. Добавлена проверка <> 0xFFFF
hex
  02 00 01 @code 00
end

:Variables
hex
   00 00 00 00
   00 00 00 00  // 34@
   00 00 00 00  // 35@
   00 00 00 00  // 36@
   00 00 00 00  // 37@
   00 00 00 00  // 38@
   00 00 00 00  // 39@
   00 00 00 00  // 40@
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00 //50
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00 //55
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00  //60
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00  //65
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
end

:code
0A9F: 0@ = current_thread_pointer
0A8E: 1@ = 0@ + 0x10
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
000E: 1@ -= @Variables
000A: 0@ += 0xC4
0A8F: 31@ = 1@ - 0@
0016: 31@ /= 4
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 = 35@(31@,1i)
    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_Angle2 = 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 and
33@ >= 0
   0AB0:  key_pressed 65 // A
   8AB0: not key_pressed 68 // D
then
   33@ = -2000
end
if and
   33@ > -1800
   33@ < 0
then
   0_StatusOfPlayerCar = 1_Left
   33@ = 0
end
             
if and
33@ >= -2000
0AB0:  key_pressed 68 // D
8AB0: not key_pressed 65 // A
then
   33@ = -4000
end
if and
   33@ > -3800
   33@ < -2000
then
   0_StatusOfPlayerCar = 1_Right
   33@ = 0
end

if and
   0_StatusOfPlayerCar <> 0
8AB0: not key_pressed 65 // A
8AB0: not key_pressed 68 // D
then  
   0_StatusOfPlayerCar = 0         
end   

if and
0_StatusOfPlayerCar == 1_Left
8AB0: not key_pressed 65 // A
   0AB0:  key_pressed 68 // D
then  
   0_StatusOfPlayerCar = 0     
end

if and
0_StatusOfPlayerCar == 1_Right
   0AB0:  key_pressed 65 // A
   8AB0: not key_pressed 68 // D
then  
   0_StatusOfPlayerCar = 0
end   

if and
0AB0:  key_pressed 68 // D
0AB0:  key_pressed 65 // A
then 
  0_StatusOfPlayerCar = 1_Both          
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

0A8D: 12@ = read_memory 0xB74494 size 4 virtual_protect 1
000A: 12@ += 0x4
0A8D: 12@ = read_memory 12@ size 4 virtual_protect 1
for 29@ = 0 to 27904 step 0x100
       0A8D: 0_VehicleHandle = read_memory 12@ size 1 virtual_protect 1
       000A: 12@ += 0x1
       
       if and
       0029:   0_VehicleHandle >= 0x00 
       001B:   0x80 > 0_VehicleHandle
       then 
           005A: 0_VehicleHandle += 29@ // (int)
           if
           056E: (check) car 0_VehicleHandle defined
           then
            
            if and
            8119:   not car 0_VehicleHandle wrecked 
            01AF:   car 0_VehicleHandle sphere 0 in_sphere 0_CamX 0_CamY 0_CamZ radius 1_RadiusOfSearch 1_RadiusOfSearch 1_RadiusOfSearch
            then
            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   
           end 
       end
end 
    end    
end

:__LabelToOffset
if
    0@ == 0
then
    0AB2: ret 1 0
end     
0A9F: 1@ = current_thread_pointer
1@ += 0x10 
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // baseIP
0062: 1@ -= 0@ // label address
0AB2: ret 1 1@


:__VarToOffset
0A9F: 23@ = current_thread_pointer
23@ += 0x3C
0@ *= 4
005A: 23@ += 0@ // address of the local variable 
0AB2: ret 1 23@

: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
        0AB1: call_scm_func @__VarToOffset 1 varnumber 6 result 0_VectorPointer
        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
        0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
        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
        0AB1: call_scm_func @__VarToOffset 1 varnumber 6 result 0_VectorPointer
        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
        0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
        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
                0AB1: call_scm_func @__LabelToOffset 1 label @SHR_0Ah store_to 30@
                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
                    0AB1: call_scm_func @__LabelToOffset 1 label @AND_3FFh store_to 30@
                    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
                    0AB1: call_scm_func @__LabelToOffset 1 label @SHR_0Ah store_to 30@
                    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
        gosub @Get_lights_coords
        if
            0_LightsStatus == 1_Right
        then
            //0AC7: 0_VectorPointer = var 0_FrontLightX offset
            0AB1: call_scm_func @__VarToOffset 1 varnumber 6 result 0_VectorPointer
            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
            0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
            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
            0AB1: call_scm_func @__VarToOffset 1 varnumber 6 result 0_VectorPointer
            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
            0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
            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
        0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
        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
        0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
        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

Last edited by Sergey81 (16-07-2012 21:18)

Offline

#57 04-07-2014 12:39

Monstr74
Registered: 13-09-2013
Posts: 1

Re: Универсальные поворотники [CLEO4/SA/REL]

Можно ли сделать проекции на земле и освещённость от поворотников? wink

Offline

#58 05-07-2014 18:17

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Да, можно. Сделаем.

Offline

#59 05-07-2014 19:49

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Универсальные поворотники [CLEO4/SA/REL]

Если есть планы по дальнейшей разработке, то предлагаю добавить проверку на совместимость машины с ImVehFt и не отображать поворотники на таких.

Offline

#60 20-03-2016 12:53

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Немного доработал скрипт. В версии 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

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

Offline

#61 20-03-2016 14:03

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Универсальные поворотники [CLEO4/SA/REL]

Den_spb wrote:

Немного доработал скрипт.

Вот это новость! Я думал, что ты уже окончательно забросил скриптинг. Стоит ли ожидать чего-то нового?

Offline

#62 20-03-2016 14:56

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

Re: Универсальные поворотники [CLEO4/SA/REL]

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

Offline

#63 20-03-2016 23:01

Goldfish
From: Псков
Registered: 21-04-2015
Posts: 177
Website

Re: Универсальные поворотники [CLEO4/SA/REL]

Den_spb, большая просьба)
как узнать правую или левую полосу в офсете от N'ной точки пути или по какой полосе едет авто ГГ ?? smile

Offline

#64 21-03-2016 20:22

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

Re: Универсальные поворотники [CLEO4/SA/REL]

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

Offline

#65 07-05-2016 21:36

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Универсальные поворотники [CLEO4/SA/REL]

Универсальные поворотники на C++

#include <plugin.h>
#include <game_sa\CVehicle.h>
#include <game_sa\common.h>
#include <game_sa\CModelInfo.h>
#include <game_sa\CTimer.h>
#include <game_sa\CCoronas.h>
#include <game_sa\CGeneral.h>
#include <game_sa\CCamera.h>
#include <extender\VehicleExtender.h>

// originally made by Den_spb

#define TURN_ON_OFF_DELAY 500
#define MAX_RADIUS 200.0f

using namespace plugin;

class UniversalTurnlights {
public:
    enum eLightsStatus {
        LIGHTS_OFF, LIGHTS_LEFT, LIGHTS_RIGHT, LIGHTS_BOTH
    };

    class VehicleTurnlightsData {
    public:
        eLightsStatus lightsStatus;

        VehicleTurnlightsData(CVehicle *) {
            lightsStatus = LIGHTS_OFF;
        }
    };

    static VehicleExtendedData<VehicleTurnlightsData> *pTurnlightsData;

    UniversalTurnlights() {
        pTurnlightsData = new VehicleExtendedData<VehicleTurnlightsData>;
        
        Events::vehicleRenderEvent.before += [](CVehicle *vehicle){
            if ((vehicle->m_dwVehicleSubClass == VEHICLE_AUTOMOBILE || vehicle->m_dwVehicleSubClass == VEHICLE_BIKE) &&
                (vehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_AUTOMOBILE || vehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BIKE) &&
                vehicle->m_wModelIndex != MODEL_BMX && vehicle->m_wModelIndex != MODEL_BIKE && vehicle->m_wModelIndex != MODEL_MTBIKE &&
                !vehicle->m_pAttachedTo)
            {
                eLightsStatus &lightsStatus = pTurnlightsData->Get(vehicle).lightsStatus;
                if (vehicle->m_pDriver) {
                    CPed *playa = FindPlayerPed();
                    if (playa && playa->m_pVehicle == vehicle && playa->m_bInVehicle) {
                        if (KeyPressed(90)) // Z
                            lightsStatus = LIGHTS_LEFT;
                        else if (KeyPressed(88)) // X
                            lightsStatus = LIGHTS_BOTH;
                        else if (KeyPressed(67)) // C
                            lightsStatus = LIGHTS_RIGHT;
                        else if (KeyPressed(VK_SHIFT))
                            lightsStatus = LIGHTS_OFF;
                    }
                    else {
                        lightsStatus = LIGHTS_OFF;

                        CVector2D prevPoint = GetCarPathLinkPosition(vehicle->m_autoPilot.m_wPreviousPathNodeInfo);
                        CVector2D currPoint = GetCarPathLinkPosition(vehicle->m_autoPilot.m_wCurrentPathNodeInfo);
                        CVector2D nextPoint = GetCarPathLinkPosition(vehicle->m_autoPilot.m_wNextPathNodeInfo);

                        float angle = GetZAngleForPoint(nextPoint - currPoint) - GetZAngleForPoint(currPoint - prevPoint);
                        while (angle < 0.0f) angle += 360.0f;
                        while (angle > 360.0f) angle -= 360.0f;

                        if (angle >= 30.0f && angle < 180.0f)
                            lightsStatus = LIGHTS_LEFT;
                        else if (angle <= 330.0f && angle > 180.0f)
                            lightsStatus = LIGHTS_RIGHT;

                        if (lightsStatus == LIGHTS_OFF) {
                            if (vehicle->m_autoPilot.m_nCurrentLane == 0 && vehicle->m_autoPilot.m_nNextLane == 1)
                                lightsStatus = LIGHTS_RIGHT;
                            else if (vehicle->m_autoPilot.m_nCurrentLane == 1 && vehicle->m_autoPilot.m_nNextLane == 0)
                                lightsStatus = LIGHTS_LEFT;
                        }
                    }
                }
                if(CTimer::m_snTimeInMilliseconds % (TURN_ON_OFF_DELAY * 2) < TURN_ON_OFF_DELAY) {
                    CVector dv = TheCamera.m_vGameCamPos - vehicle->GetCoords();
                    if (dv.Magnitude() < MAX_RADIUS) {
                        DrawVehicleTurnlights(vehicle, lightsStatus);
                        if (vehicle->m_pTractor)
                            DrawVehicleTurnlights(vehicle->m_pTractor, lightsStatus);
                    }
                }
            }
        };
    }

    ~UniversalTurnlights() {
        delete pTurnlightsData;
    }

    static CVector2D GetCarPathLinkPosition(CCarPathLinkAddress &address) {
        if (address.m_wAreaId != -1 && address.m_wCarPathLinkId != -1 && ThePaths.m_pPathNodes[address.m_wAreaId]) {
            return CVector2D(static_cast<float>(ThePaths.m_pNaviNodes[address.m_wAreaId][address.m_wCarPathLinkId].m_posn.x) / 8.0f,
                static_cast<float>(ThePaths.m_pNaviNodes[address.m_wAreaId][address.m_wCarPathLinkId].m_posn.y) / 8.0f);
        }
        return CVector2D(0.0f, 0.0f);
    }

    static void DrawTurnlight(CVehicle *vehicle, unsigned int dummyId, bool leftSide) {
        CVector posn =
            reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex])->m_pVehicleStruct->m_avDummyPosn[dummyId];
        if (posn.x == 0.0f) posn.x = 0.15f;
        if (leftSide) posn.x *= -1.0f;
        CCoronas::RegisterCorona(reinterpret_cast<unsigned int>(vehicle) + 50 + dummyId + (leftSide? 0 : 2), vehicle, 255, 128, 0, 255, posn, 
            0.3f, 150.0f, CORONATYPE_SHINYSTAR, 0, false, false, 0, 0.0f, false, 0.5f, 0, 50.0f, false, true);
    }

    static void DrawVehicleTurnlights(CVehicle *vehicle, eLightsStatus lightsStatus) {
        if (lightsStatus == LIGHTS_BOTH || lightsStatus == LIGHTS_RIGHT) {
            DrawTurnlight(vehicle, 0, false);
            DrawTurnlight(vehicle, 1, false);
        }
        if (lightsStatus == LIGHTS_BOTH || lightsStatus == LIGHTS_LEFT) {
            DrawTurnlight(vehicle, 0, true);
            DrawTurnlight(vehicle, 1, true);
        }
    }

    static float GetZAngleForPoint(CVector2D &point) {
        float angle = CGeneral::GetATanOfXY(point.x, point.y) * 57.295776f - 90.0f;
        while (angle < 0.0f) angle += 360.0f;
        return angle;
    }

    static bool KeyPressed(unsigned int keyCode) {
        return (GetKeyState(keyCode) & 0x8000) != 0;
    }
} plg;

VehicleExtendedData<UniversalTurnlights::VehicleTurnlightsData> *UniversalTurnlights::pTurnlightsData;

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


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#66 09-05-2016 18:00

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

Re: Универсальные поворотники [CLEO4/SA/REL]

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

DK22Pac wrote:

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

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

Offline

#67 10-05-2016 19:18

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Универсальные поворотники [CLEO4/SA/REL]

Den_spb wrote:

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

DK22Pac wrote:

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

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

1) Выложу весь проект (Visual Studio), вместе со скомпилированной библиотекой (asi).
2) Статус хранится для всех авто. Может быть даже ситуация, когда игрок вытаскивает NPC из авто, а поворотники на авто продолжают работать.
Как это работает: при создании пула CVehicle, выделяется память для хранения дополнительных свойств на каждое авто.
В коде этого явно не видно, всё завернуто в класс-шаблон VehicleExtendedData.

https://github.com/DK22Pac/plugin-sdk/t … Turnlights

Last edited by DK22Pac (21-05-2016 12:28)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

Board footer

Powered by FluxBB