You are not logged in.
Небольшое уточнение. Вот точные значения Z-угла, по которому определяется, к какому из двух направлений относится светофор:
(330.0 ; 60.0) - направление 1 [60.0 ; 150.0] - направление 2 (150.0 ; 240.0) - направление 1 [240.0 ; 330.0] - направление 2
С этими углами на светофорах иногда горят неправильные сигналы!
Offline
Значения точные, получены экспериментальным путём:
{$CLEO} var 0@ : array 12 of integer end 0a95: model.Load(1351) repeat wait 0 until model.Available(1351) 30@ = 340.4744 29@ = 2498.3745 31@ = 0 object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 59.9 31@ += 1 30@ += 5.0 object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 60.0 31@ += 1 30@ += 5.0 object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 60.1 31@ += 1 30@ = 340.4744 29@ += 10.0 //-------------------------------------- object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 149.9 31@ += 1 30@ += 5.0 object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 150.0 31@ += 1 30@ += 5.0 object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 150.1 31@ += 1 30@ = 340.4744 29@ += 10.0 //-------------------------------------- object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 239.9 31@ += 1 30@ += 5.0 object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 240.0 31@ += 1 30@ += 5.0 object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 240.1 31@ += 1 30@ = 340.4744 29@ += 10.0 //-------------------------------------- object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 329.9 31@ += 1 30@ += 5.0 object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 330.0 31@ += 1 30@ += 5.0 object.Create(0@[31@] 1351 30@ 29@ 15.7854) 0177: set_object 0@[31@] Z_angle_to 330.1 31@ += 1 30@ = 340.4744 29@ += 10.0 //-------------------------------------- model.Destroy(1351) 0a93:
Например, светофоры со значением Z-угла 330.1 и 59.9 горят одним цветом, в то время как светофоры со значениями 329.9, 330.0, 60.0, 60.1 горят другим цветом. Аналогично определены остальные интервалы.
Offline
Углы брал не для светофора, а для автомобиля. Там больше подходят мои углы, но не везде правильно работает.
А для пешеходных тоже должен быть таймер?
Last edited by RDH (13-06-2010 11:42)
Offline
Уточнено назначение некоторых функций, имеющих отношение к светофорам.
.text:0049D2D0 CTrafficLights_Get_Current_Traffic_Mode_NS proc near .text:0049D310 CTrafficLights_Get_Current_Traffic_Mode_WE proc near
Определяют режим дорожного движения одного из двух направлений (0 - машины едут, 1 - машины стоят)
.text:0049D350 CTrafficLights_Get_Current_Color_NS proc near .text:0049D3A0 CTrafficLights_Get_Current_Color_WE proc near
Определяют цвет сигнала светофора одного из двух направлений (0 - зелёный, 1 - жёлтый, 2 - красный).
.text:0049D4D0 CTrafficLights_Get_Type_by_Z_angle proc near
Определяет направление светофора (1 - WE, 2 - NS). Передаваемый параметр - Z-угол светофора.
Написал новый вариант скрипта "Зелёная линия" - пока на автомобиле игрока включена сирена, все попутные светофоры горят зелёным, а светофоры другого направления - красным. Траффик подчиняется изменённым сигналам светофоров.
{$CLEO} 0A8C: write_memory 0x49D6D5 size 4 value 0xFFFFFC77 virtual_protect 1 0A8C: write_memory 0x49D6ED size 4 value 0xFFFFFCAF virtual_protect 1 0A8C: write_memory 0x49D84B size 4 value 0xFFFFFB01 virtual_protect 1 0A8C: write_memory 0x49D863 size 4 value 0xFFFFFB39 virtual_protect 1 0A8C: write_memory 0x49D9CE size 4 value 0xFFFFF97E virtual_protect 1 0A8C: write_memory 0x49D9E4 size 4 value 0xFFFFF9B8 virtual_protect 1 0AC7: 0@ = var 1@ offset 0A8C: write_memory 0x49D379 size 4 value 0@ virtual_protect 1 0AC7: 0@ = var 2@ offset 0A8C: write_memory 0x49D3C9 size 4 value 0@ virtual_protect 1 while true wait 0 if Player.Defined($PLAYER_CHAR) then 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 $ONMISSION == 0 then 03C0: 0@ = actor $PLAYER_ACTOR car if 0ABD: vehicle 0@ siren_on then 0174: 0@ = car 0@ Z_angle 0AA7: call 0x49D4D0 num_params 1 pop 1 0@ 0@ // CTrafficLights_Get_Type_by_Z_angle if 0@ == 1 // WE then 1@ = 15000 2@ = 15000 else // 0@ == 2 // NS 1@ = 5000 2@ = 10000 end continue end end end 01BD: 1@ = current_time_in_ms 01BD: 2@ = current_time_in_ms end
Last edited by Den_spb (18-02-2011 19:49)
Offline
надеюсь, названия функций найдут отражение в базе))
Offline
Offline
Находка бесполезная, но забавная:
.text:00724B60 DrawHandmanTexture proc near
Функция рисует текстуру пешеходного светофора.
Пример использования:
{$CLEO} wait 0 while true wait 0 0AA5: call_function 0x00724B60 num_params 25 pop 25 60.0 0 0 255 1 1.0 0 1.0 0.5 0 0 0 0.5 27.6875 160.4639 -2016.1389 27.6875 155.3591 -2016.1389 32.6875 160.4639 -2016.1389 32.6875 155.3591 -2016.1389 end
Последние 12 параметров - координаты углов прямоугольника (3 координаты * 4 точки), в который будет вписана текстура.
UPD:
1.0 0.0 1.0 0.5 0.0 0.0 0.0 0.5 - координаты отображаемого куска текстуры (2 координаты * 4 точки)
1.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 - при этих значениях текстура не обрезается и отображается целиком.
0 0 255 - RGB
Last edited by Den_spb (24-10-2011 17:24)
Offline
Я так понял что имя текстуры захардкодено и изменить её на свою не удастся?
Offline
Еще не встречал ни одного захардкоденого названия текстуры в gta_sa.exe
Offline
@Sw[ee]t - текстура, если я правильно понимаю, называется "handman". файл "models\particle.txd"
@Jack Daniel's - ряд текстур, насколько я понимаю, грузятся экзешником... типа худа, например... или вот эта состоит из двух частей (рука и человечек, которые выводятся по отдельности)... кстати, было бы интересно узнать адреса по которым они (указатели на них ?) хранятся в игре... сюда вот - 0хA94B68 - грузятся 128 (вроде) текстур, вызываемых скриптами... а текстуры худа (и, очевидно, партиклз и ещё много чего) грузятся еще куда-то.
Try not. Do or do not, there is no try.
Offline
Я так понял что имя текстуры захардкодено и изменить её на свою не удастся?
Перед запуском данной функции можно заменить текстуру handman на любую другую из particle.txd.
Кстати, в particle.txd можно добавлять свои текстуры, подробности тут
кстати, было бы интересно узнать адреса по которым они (указатели на них ?) хранятся в игре
Адреса с указателями на текстуры particle.txd приведены тут
Last edited by Den_spb (23-10-2011 23:07)
Offline
... можно заменить текстуру handman на любую другую из particle.txd.
ТОЛЬКО из particle.txd? А свой txd если подставить?
Мне нужна текстура которая будет висеть в воздухе в опр. координатах...
Last edited by Sw[ee]t (24-10-2011 11:29)
Offline
.text:00724770 Create_luminous_polygon proc near
Функция создаёт светящийся многоугольник, служащий сигналом светофора. Пример использования:
{$CLEO} wait 0 while true wait 0 0AA5: call_function 0x00724770 num_params 16 pop 16 0 0 0 1 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 27.6875 155.3591 -2016.1389 end
Параметры:
1 - цвет многоугольника (1 - зелёный, 2 - жёлтый, 3 - красный)
27.6875 155.3591 -2016.1389 - позиция локальной системы координат (светофора)
0.0 0.0 1.0 - координаты вектора At (определяют Z-угол поворота эффекта)
1.0 0.0 0.0 - координаты точки в локальной СК (определяет размер и направление эффекта)
Прочие функции, вызываемые в 0x49DAB0 CTrafficLights_Render_TrafficLight:
.text:007000E0 Create_Flashlight proc near ; создание невидимого источника света .text:0070BA00 sub_70BA00 proc near ; участвует в создании световой проекции на земле
Last edited by Den_spb (24-10-2011 18:55)
Offline
Существует ли способ выключения светофоров только одного направления?
Offline
жёлтый мигающий.
Все светофоры мигают желтым цветом (означает, что перекрёсток нерегулируемый):
{$CLEO} 0AC7: 31@ = var 30@ offset 0AC7: 29@ = var 28@ offset 0A8C: write_memory 0x0049D379 size 4 value 31@ virtual_protect 1 // подставляем свой адрес в функцию север-юг 0A8C: write_memory 0x0049D3C9 size 4 value 29@ virtual_protect 1 // подставляем свой адрес в функцию запад-восток 30@ = 10000 // при этом значении таймера север-юг горит желтым 28@ = 22000 // при этом значении таймера запад-восток горит желтым var 2@: array 9 of Integer end 1@ = 0x008CD4F4 for 0@ = 0 to 8 0A8D: 2@[0@] = read_memory 1@ size 2 virtual_protect 0 // сохраняем ИД номера светофоров в переменных скрипта 1@ += 0x4 end while true wait 500 1@ = 0x008CD4F4 for 0@ = 0 to 8 0A8C: write_memory 1@ size 2 value 0 virtual_protect 0 // теперь игра будет считать светофором объект с ИД=0 . Т.е. светофоры работать не будут 1@ += 0x4 end wait 500 1@ = 0x008CD4F4 for 0@ = 0 to 8 0A8C: write_memory 1@ size 2 value 2@[0@] virtual_protect 0 // восстанавливаем ИД номера светофоров. Светофоры снова работают (в данном случае горят желтым цветом) 1@ += 0x4 end end
Мне этот скрипт пригодится, можно его использовать в своём моде?
Только машины останавливаются на перекрёстке и стоят бесконечно. Есть ли способ заставить их всех игнорировать светофор или придётся отлавливать каждую машину и приписывать ей это свойство?
Offline
можно его использовать в своём моде?
Можно.
Есть ли способ заставить их всех игнорировать светофор или придётся отлавливать каждую машину и приписывать ей это свойство?
Попробуй такой вариант:
{$CLEO} 0AC7: 31@ = var 31@ offset 0AC7: 30@ = var 30@ offset 0A8C: write_memory 0x0049D379 size 4 value 31@ virtual_protect 1 // подставляем свой адрес в функцию север-юг 0A8C: write_memory 0x0049D3C9 size 4 value 30@ virtual_protect 1 // подставляем свой адрес в функцию запад-восток 31@ = 10000 // при этом значении таймера север-юг горит желтым 30@ = 22000 // при этом значении таймера запад-восток горит желтым 0A8C: write_memory 0x0049D300 size 2 value 0xC032 virtual_protect 1 // xor al , al 0A8C: write_memory 0x0049D338 size 2 value 0xC032 virtual_protect 1 // xor al , al 0A8C: write_memory 0x0049D34A size 2 value 0xC032 virtual_protect 1 // xor al , al var 2@: array 9 of Integer end 1@ = 0x008CD4F4 for 0@ = 0 to 8 0A8D: 2@[0@] = read_memory 1@ size 2 virtual_protect 0 // сохраняем ИД номера светофоров в переменных скрипта 1@ += 0x4 end while true wait 500 1@ = 0x008CD4F4 for 0@ = 0 to 8 0A8C: write_memory 1@ size 2 value 0 virtual_protect 0 // теперь игра будет считать светофором объект с ИД=0 . Т.е. светофоры работать не будут 1@ += 0x4 end wait 500 1@ = 0x008CD4F4 for 0@ = 0 to 8 0A8C: write_memory 1@ size 2 value 2@[0@] virtual_protect 0 // восстанавливаем ИД номера светофоров. Светофоры снова работают (в данном случае горят желтым цветом) 1@ += 0x4 end end
Offline
Попробуй такой вариант:
{$CLEO} 0AC7: 31@ = var 31@ offset 0AC7: 30@ = var 30@ offset 0A8C: write_memory 0x0049D379 size 4 value 31@ virtual_protect 1 // подставляем свой адрес в функцию север-юг 0A8C: write_memory 0x0049D3C9 size 4 value 30@ virtual_protect 1 // подставляем свой адрес в функцию запад-восток 31@ = 10000 // при этом значении таймера север-юг горит желтым 30@ = 22000 // при этом значении таймера запад-восток горит желтым 0A8C: write_memory 0x0049D300 size 2 value 0xC032 virtual_protect 1 // xor al , al 0A8C: write_memory 0x0049D338 size 2 value 0xC032 virtual_protect 1 // xor al , al 0A8C: write_memory 0x0049D34A size 2 value 0xC032 virtual_protect 1 // xor al , al var 2@: array 9 of Integer end 1@ = 0x008CD4F4 for 0@ = 0 to 8 0A8D: 2@[0@] = read_memory 1@ size 2 virtual_protect 0 // сохраняем ИД номера светофоров в переменных скрипта 1@ += 0x4 end while true wait 500 1@ = 0x008CD4F4 for 0@ = 0 to 8 0A8C: write_memory 1@ size 2 value 0 virtual_protect 0 // теперь игра будет считать светофором объект с ИД=0 . Т.е. светофоры работать не будут 1@ += 0x4 end wait 500 1@ = 0x008CD4F4 for 0@ = 0 to 8 0A8C: write_memory 1@ size 2 value 2@[0@] virtual_protect 0 // восстанавливаем ИД номера светофоров. Светофоры снова работают (в данном случае горят желтым цветом) 1@ += 0x4 end end
Нет, машины ведут себя так, будто красный и зелёный цвет никуда не делись.
Кстати, я когда декомпилировал этот скрипт (ещё первую версию), он принял такой вид:
0AC7: 31@ = var 30@ offset 0AC7: 29@ = var 28@ offset 0A8C: write_memory 4838265 size 4 value 31@ virtual_protect 1 0A8C: write_memory 4838345 size 4 value 29@ virtual_protect 1 30@ = 10000 28@ = 22000 1@ = 9229556 0@ = 0 :NONAME_77 0A8D: 2@(0@,9i) = read_memory 1@ size 2 virtual_protect 0 1@ += 4 0@ += 1 0@ > 8 jf @NONAME_77 :NONAME_121 wait 500 1@ = 9229556 0@ = 0 :NONAME_143 0A8C: write_memory 1@ size 2 value 0 virtual_protect 0 1@ += 4 0@ += 1 0@ > 8 jf @NONAME_143 wait 500 1@ = 9229556 0@ = 0 :NONAME_204 0A8C: write_memory 1@ size 2 value 2@(0@,9i) virtual_protect 0 1@ += 4 0@ += 1 0@ > 8 jf @NONAME_204 jump @NONAME_121
Это ничего, что у него там циклы без вайтов? Есть гарантия, что зависать не будет? И вообще, срабатывают ли такие проверки, перед которыми не записано if? Если нет, то зачем всё это?
Offline
Нет, машины ведут себя так, будто красный и зелёный цвет никуда не делись.
Решил задачу немного иначе:
{$CLEO} 0A8C: write_memory 0x0096914E size 1 value 1 virtual_protect 0 // "Все светофоры зелёные" while true wait 500 // установка цвета ламп светофоров NS 0A8C: write_memory 0x0049DB5F size 1 value 0xB8 virtual_protect 1 0A8C: write_memory 0x0049DB60 size 4 value 1 virtual_protect 1 // value: 0 - зелёный, 1 - жёлтый, 2 - красный, другое число - не горит 0A8C: write_memory 0x0049DB64 size 2 value 0x9090 virtual_protect 1 0A8C: write_memory 0x0049DB66 size 1 value 0x90 virtual_protect 1 // установка цвета ламп светофоров WE 0A8C: write_memory 0x0049DB6D size 1 value 0xB9 virtual_protect 1 0A8C: write_memory 0x0049DB6E size 4 value 1 virtual_protect 1 // value: 0 - зелёный, 1 - жёлтый, 2 - красный, другое число - не горит 0A8C: write_memory 0x0049DB72 size 2 value 0x9090 virtual_protect 1 0A8C: write_memory 0x0049DB74 size 1 value 0x90 virtual_protect 1 wait 500 // установка цвета ламп светофоров NS 0A8C: write_memory 0x0049DB5F size 1 value 0xB8 virtual_protect 1 0A8C: write_memory 0x0049DB60 size 4 value 4 virtual_protect 1 // value: 0 - зелёный, 1 - жёлтый, 2 - красный, другое число - не горит 0A8C: write_memory 0x0049DB64 size 2 value 0x9090 virtual_protect 1 0A8C: write_memory 0x0049DB66 size 1 value 0x90 virtual_protect 1 // установка цвета ламп светофоров WE 0A8C: write_memory 0x0049DB6D size 1 value 0xB9 virtual_protect 1 0A8C: write_memory 0x0049DB6E size 4 value 4 virtual_protect 1 // value: 0 - зелёный, 1 - жёлтый, 2 - красный, другое число - не горит 0A8C: write_memory 0x0049DB72 size 2 value 0x9090 virtual_protect 1 0A8C: write_memory 0x0049DB74 size 1 value 0x90 virtual_protect 1 end 0A93:
Это ничего, что у него там циклы без вайтов? Есть гарантия, что зависать не будет?
Игра зависнет, если wait отсутствует в бесконечном цикле. В этом случае игра будет постоянно занята выполнением этого цикла, а другие скрипты и процессы (в том числе отрисовка и обработка нажатий клавиш) выполняться не будут - что внешне проявится зависанием. Как уже ранее обсуждалось, все процессы и скрипты в игре выполняются по очереди, а команда wait служит для приостановки выполнения текущего скрипта с целью выполнения других скриптов и процессов.
Что касается рассматриваемого примера - там цикл не бесконечный, он повторится всего 9 раз. При этом будут исполнены 5 * 9 = 45 опкодов.
И вообще, срабатывают ли такие проверки, перед которыми не записано if?
Если проверка одна, то if перед ней писать не обязательно. Исключение - конструкции if...then...end и if...then...else...end.
Offline
А как потом вернуть всё обратно?
Во-первых, нужно отключить чит "Все светофоры зелёные"
0A8C: write_memory 0x0096914E size 1 value 0 virtual_protect 0
Во-вторых, нужно восстановить участки кода gta_sa.exe, которые были отредактированы скриптом:
0A8C: write_memory 0x0049DB5F size 1 value 0x?? virtual_protect 1 0A8C: write_memory 0x0049DB60 size 4 value 0x???????? virtual_protect 1 0A8C: write_memory 0x0049DB64 size 2 value 0x???? virtual_protect 1 0A8C: write_memory 0x0049DB66 size 1 value 0x?? virtual_protect 1 0A8C: write_memory 0x0049DB6D size 1 value 0x?? virtual_protect 1 0A8C: write_memory 0x0049DB6E size 4 value 0x???????? virtual_protect 1 0A8C: write_memory 0x0049DB72 size 2 value 0x???? virtual_protect 1 0A8C: write_memory 0x0049DB74 size 1 value 0x?? virtual_protect 1
Вместо знаков вопроса надо подставить исходные значения, посмотреть которые можно в базе gta_sa.exe. Открываем базу с помощью программы IDA, переходим на вкладку отображения кода в шестнадцатиричном виде "Hex View-A". Жмём клавишу G (переход по указанному адресу) и вводим адрес начала записи (параметр write_memory в опкоде 0A8C). При подстановке в опкод байты нужно записывать в обратном порядке.
Пример:
0A8C: write_memory 0x0049DB60 size 4 value 0x???????? virtual_protect 1
Жмём G, переходим по адресу 49DB60. Значения байтов:
EC F7 FF FF
Переписываем байты в опкод в обратном порядке:
0A8C: write_memory 0x0049DB60 size 4 value 0xFFFFF7EC virtual_protect 1
Offline