You are not logged in.
И как насчёт дополнительных оффсетов для мотоциклов? Например, задние поворотники в 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Если этого значения мало, то можно увеличить.
Есть возможность включать поворотники машинам педов, перестраивающихся на шоссе?
Перестроения - это другой вопрос, я его пока не исследовал.
Last edited by Den_spb (18-12-2011 17:58)
Offline
Хммм... Я один заметил, что в некоторых ситуациях на стоящей на месте машине без водителя (например, спавненной автосалоном) включается правый поворотник?
Also known as HemiG
It's cool to Hate. It's cool to be a bloody guitarist.
Offline
Надо добавить проверку, что в авто сидит водитель.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
В версии 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
Круто, как всегда. Жаль увидеть все это вживую смогу только через полгода.
Offline
Фух, я конечно уже многое позабыл за год, но вроде как постепенно начинаю вливаться в скриптинг опять.
Последняя версия поворотников, адаптированная под клео 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
Можно ли сделать проекции на земле и освещённость от поворотников? 
Offline
Если есть планы по дальнейшей разработке, то предлагаю добавить проверку на совместимость машины с ImVehFt и не отображать поворотники на таких.
Offline
Немного доработал скрипт. В версии 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
Немного доработал скрипт.
Вот это новость! Я думал, что ты уже окончательно забросил скриптинг. Стоит ли ожидать чего-то нового?
Offline
Den_spb, большая просьба)
как узнать правую или левую полосу в офсете от N'ной точки пути или по какой полосе едет авто ГГ ?? 
Offline
Универсальные поворотники на 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
Дима, выкладывай конечно
Правильно ли я понимаю, что данный файл будет иметь формат asi ?
Как дополнительная фича - неограниченное кол-во пустых авто с включенными поворотами.
Речь идёт об автомобилях, в которых сидел игрок? Если да, то где хранится соответствующая информация - в структуре самого авто или в каких-то переменных (из кода не понял) ?
Offline
Дима, выкладывай конечно
![]()
Правильно ли я понимаю, что данный файл будет иметь формат 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