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
endP.S. Свои глобальные переменные в клео-скриптах не используем ($Mark). Применяем вместо них локальные переменные (0@...31@).
Товарищи, а у кого-нибудь получалось найти доступ к компонентам объекта, созданного скриптом?
В структурах объектов, созданных скриптом, по смещению:
CEntity +0x18 = [dword] Указатель на RwObject (RpClump)
почему-то всё время записан ноль.
@Vital -
те клео-переменные, про которые ты говоришь - глобальные. То есть они общие для всех скриптов.
С Новым годом!