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