You are not logged in.
Так смысл команды не "прибавить 2.0", а "прибавить значение, хранящееся по адресу 006107AC". Наверное такой опции нет - чтобы дополнительную нагрузку на программу не создавать и пользователя не путать.
You can type digits step by step and check typing by opcodes "key 0 pressed ", "key 1 pressed ", etc.
If next digit was typed, you'll have to multiply previous typed digit with 10.
If typing was completed, you'll have to summarize all values.
Привет ветеранам
Взаимно!
если что, я обычно активен тут https://github.com/sannybuilder/dev/issues или тут https://github.com/sannybuilder/dev/discussions
Хорошо, будем иметь ввиду!
Я проверил - нормально компилируется на V. 3.7.0.
Как сейчас выглядит команда? Может быть, где-то пропущены запятые или пробелы между параметрами? Тогда 2 параметра "сольются" в один.
Исполнение кода не должно возвращаться на самое начало кода (в данном случае это метка :ST).
Необходимо вставить перед меткой :ST любую команду - например,
0000: :ST
или
wait 0 :ST
Можно "поймать" (получить хэндлы) педа-копа и педа-преступника, а затем заставить копа атаковать нарушителя.
Перебор всех существующих в игре объектов производится так:
if 0AE3: 0@ = random_object_near_point 0.0 0.0 0.0 in_radius 10000.0 find_next 0 then repeat if // условия, которым должен соответствовать объект then // действия, которые нужно произвести над объектом end until 8AE3: not 0@ = random_object_near_point 0.0 0.0 0.0 in_radius 10000.0 find_next 1 end
Здесь команды для поиска объектов нужно заменить на аналогичные для поиска актеров.
Команда, заставляющая одного актера атаковать другого:
05E2: AS_actor 65@ kill_actor 50@
Дима, выкладывай конечно
Правильно ли я понимаю, что данный файл будет иметь формат asi ?
Как дополнительная фича - неограниченное кол-во пустых авто с включенными поворотами.
Речь идёт об автомобилях, в которых сидел игрок? Если да, то где хранится соответствующая информация - в структуре самого авто или в каких-то переменных (из кода не понял) ?
По идее, информация о ширине дороги должна храниться в структурах точек путей. Какое именно смещение за это отвечает - я не знаю.
Да, большой получился перерыв.
Принципиально новых скриптов от меня можно пока не ожидать, но возможно в скором времени появятся обновленные версии некоторых старых модов.
Немного доработал скрипт. В версии 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
Архив со скомпилированным скриптом приложен к сообщению.
Да, опечатался:
06F8: get_nearest_route_for 62@ 63@ 64@ in_direction 1 store_to 342@ 343@ 344@ Z_angle_to 345@
Вот, нашёл у себя в запасах простой экспериментальный скрипт, подсвечивающий 10 ближайших к игроку точек путей машин:
{$CLEO} wait 2000 while true wait 0 if not player.Defined($player_char) then continue end actor.StorePos($player_actor 0@ 1@ 2@) 31@ = 0 for 30@ = 1 to 10 06F8: get_nearest_route_for 0@ 1@ 2@ in_direction 30@ store_to 6@ 7@ 8@ Z_angle_to 3@ 8@ += 1.0 016F: create_particle 3 rotation_factor 0.0 size 2.0 intensity 255 flags 31@ 0 255 at 6@ 7@ 8@ 0656: get_angle 3@ absolute_degrees_to 3@ 02F6: 4@ = sine 3@ // (float) 02F7: 5@ = cosine 3@ // (float) 4@ *= 2.0 5@ *= 2.0 005B: 7@ += 5@ // (float) 0063: 6@ -= 4@ // (float) 016F: create_particle 3 rotation_factor 0.0 size 1.0 intensity 255 flags 0 0 255 at 6@ 7@ 8@ 0092: 3@ = float 3@ to_integer 31@ += 25 end end
Надо перебрать пул ракет, сравнивая значение цели каждой ракеты (смещение +0x0008 от начала структуры ракеты) с адресом структуры педа игрока/автомобиля игрока.
http://gtamodding.ru/wiki/Адреса_Памяти … 4.D1.8B.29
Игра планирует движение машины только на одну точку вперёд.
Но если машина едет по прямой, а не находится на перекрёстке, то можно просто определить координаты нескольких ближайших точек того пути, на котором она находится в данный момент.
Для этого можно применить опкод:
04D3: get_nearest_car_path_coords_from $TEMPVAR_X_COORD $TEMPVAR_Y_COORD $TEMPVAR_Z_COORD type 2 store_to 88@ 89@ 90@
Здесь "direction" - это степень удаленности точки пути от указанных координат (если указать 1, то найдётся ближайшая к координатам точка, 2 - вторая по близости точка, 3 - третья по близости точка и т.д.)
d88, попробуй эти опкоды:
01E8: create_forbidden_for_cars_cube_cornerA 2500.0 -1677.0 20.0 cornerB 2430.0 -1653.0 0.0
включить запрет на спавн машин в указанной зоне
01E7: remove_forbidden_for_cars_cube_cornerA 2272.922 -1649.556 14.3311 cornerB 2266.101 -1633.219 14.3505
отключить запрет на спавн машин в указанной зоне
0395: clear_area 1 at 681.8004 -474.1063 15.5363 radius 3.0
очистить указанную зону от уже созданных объектов
Да, можно. Сделаем.
And, is it possible to make a boat go to a specifick cordinate?
02D3: boat $Boat drive_to 10000.0 -100.0 0.0
Boat $Boat goes to coordinates X Y Z.
Я тоже поэкспериментировал с числами. Так вот, при декомпеляции вместо числа появляется метка с тем же именем, что и у остальных меток в этом скрипте.
Вообще в скомпилированных скриптах никаких меток нет. Скомпилированный скрипт содержит только номера опкодов и значения параметров опкодов (в этом легко убедиться, открыв любой cs-файл в hex-редакторе, и сравнив полученную картину с исходным кодом скрипта). Метки создаёт декомпилятор в момент декомпиляции для удобства чтения полученного кода. Декомпилятор называет метки так, как указано в настройках СБ (Настройки СБ - Форматирование -Формат меток).
На этом форуме не рассматриваются вопросы, связанные со скриптами для SAMP.
Можно создать жёлтую линию с помощью опкода создания выстрела, постоянно применяя его в цикле:
06BC: create_M4_shoot_from 2193.268 -1165.441 1031.124 target $TEMPVAR_X_COORD $TEMPVAR_Y_COORD $TEMPVAR_Z_COORD energy 1
При этом параметр "энергия" должен быть равен нулю (если нужно получить просто светящуюся линию, а не всёразрушающий луч).
Или есть ли другой способ на некоторое время отключить возможность ходить на свидания? И чтобы девушки не звонили по телефону, и чтобы маркеры вообще не появлялись возле их домов?
Можно попробовать запустить поток снова опкодами:
004F: create_thread @MS_BIKE_MISSIONS
00D7: create_thread @NONAME_1 // without extra params
Либо надо менять прогресс отношений с каждой из подруг.
Это можно сделать с помощью опкода изменения статистики:
0627: update_integer_stat 215 to $1922
Номера статистики для отношений с подругами: 252 - 257 (см. справку СБ: Документация по scm - статистика ИД)
Другой вариант: найти в main.scm глобальные переменные со словом "girl" и попробовать записать в них ноль.
Скорее всего, нужно обнулить глобальные переменные: $GIRL_PROGRESS[0] ... $GIRL_PROGRESS[5]
При редактировании файла gta3.img (а некотороые скрипты cleo просятся туда, тот же wallrun) игра загружает процессор под 50% и не загружается. Может версия "IMGTool 2" уже древняя и за 6 лет что-то новое вышло. Может она не правильно редакртирует файлы?
При работе с IMGTool нужно быть внимательным - при попытке одновременной замены нескольких файлов программа заменяет только первый файл. Поэтому файлы нужно заменять (добавлять) по одному. А лучше пользоваться более совершенными программами (Crazy IMG Editor) - они умеют добавлять/заменять несколько файлов за раз.
Во-первых, следует различать понятия "player" и "actor".
"player" - это игрок (посмотреть команды и проверки для игрока можно, введя в поиске опкодов SB "player_char"). Если в игру играет один человек, то и игрок соответственно один (переменная игрока - $PLAYER_CHAR)
"actor" - это персонаж (физический объект), в том числе и персонаж, управляемый игроком. Персонажи в игре ещё называют "педами". Переменная педа игрока - $PLAYER_ACTOR.
Во-вторых, следует различать понятия "хэндл" и "указатель".
Хэндл - что-то типа индивидуального идентификационного номера какого-либо объекта.
Указатель - адрес структуры объекта в памяти игры.
В "классическом" скриптинге (стандартные опкоды) используются только хэндлы.
Конвертировать хэндл в указатель и обратно можно с помощью опкодов КЛЕО4. Пример для актёров:
0A96: $ActorStruct = actor $PLAYER_ACTOR struct // Вычисление указателя по хэндлу 0AEA: $actor = actor_struct $ped_struct handle // Вычисление хэндла по указателю
С учетом поправок получается такой код (в игре не проверял):
while true wait 0 if Actor.Dead($PLAYER_ACTOR) then 0A96: 4@ = actor $PLAYER_ACTOR struct 4@ += 0x764 0A8D: 7@ = read_memory 4@ size 4 virtual_protect 0 if 7@ > 0 then 0AEA: 7@ = actor_struct 7@ handle Actor.StorePos(7@, 29@, 30@, 31@) 31@ += 10.0 Marker.CreateAboveActor(8@, 7@) if 0ab0: 0x2D // insert then Actor.PutAt($PLAYER_ACTOR, 29@, 30@, 31@) end end end end
P.S. Свои глобальные переменные в клео-скриптах не используем ($Mark). Применяем вместо них локальные переменные (0@...31@).
Товарищи, а у кого-нибудь получалось найти доступ к компонентам объекта, созданного скриптом?
В структурах объектов, созданных скриптом, по смещению:
CEntity +0x18 = [dword] Указатель на RwObject (RpClump)
почему-то всё время записан ноль.
@Vital -
те клео-переменные, про которые ты говоришь - глобальные. То есть они общие для всех скриптов.
С Новым годом!