You are not logged in.
Можно ли как-нибудь вручную управлять светофором, шлагбаумом?
Светофор меняется за счёт переключений файлов TXD?
Offline
Управлять отображением светофора - можно.
Управлять светофором так, чтобы это влияло на трафик - просто так не получится.
TrafficController считает, что 30 секунд (не помню точную цифру и направления, надо покопаться в архивах), можно проезжать по дорогам с севера на юг, следующие 30 секунд - с востока на запад.
А перерисовка светофора берет текущее время и отрисовывается соответствующе.
Offline
Просто есть скрипт Railway_traffic_lights - ж/д светофоры - ну я и подумал реализовать типа этого для уличного движения (сделать, например "зелёную линию" для спецтранспорта).
И кстати, можно узнать технологию управления отображением светофора? В скрипте копался - недопонял
Last edited by RDH (30-05-2010 18:38)
Offline
Управлять отображением светофора - можно.
Управлять светофором так, чтобы это влияло на трафик - просто так не получится.TrafficController считает, что 30 секунд (не помню точную цифру и направления, надо покопаться в архивах), можно проезжать по дорогам с севера на юг, следующие 30 секунд - с востока на запад.
А перерисовка светофора берет текущее время и отрисовывается соответствующе.
В Crazy Trainer 151 v 2.0 есть чит:
Все светофоры зелёные
И на всех светофорах был зелёный, и все машины ехали.
К RDH - Значит, если покапавшись в тренере, возможно найти интересные адреса отвечающие за трафик и светофоры.
GTA SA CrashKiller by MadniX , Virtual_Key_Codes for opcode 0AB0
Offline
Все светофоры зелёные
Так прикол не в том, чтобы на всех линиях был зелёный! Надо, чтобы в определённое время светофор давал линию нужного направления, а все остальные линии были закрыты.
P.S.
"Все светофоры зелёные" - стандартный чит, включается записью в 0x96914E значения 1.
Offline
Просто есть скрипт Railway_traffic_lights - ж/д светофоры
Если речь идёт о моём скрипте ж/д светофоров, то там всё намного проще, чем в светофорах автомобильных. Есть 3 модели объектов - светофоры с разными цветами огней. Если необходимо переключить светофор (зависит от того, существует ли поезд и как он расположен относительно светофора), то удаляется старый светофор и на его месте тут же создаётся новый - с другим огнём.
Last edited by Den_spb (30-05-2010 21:27)
Offline
Если речь идёт о моём скрипте ж/д светофоров
Насколько я знаю, твой скрипт - algorithm5, а есть ещё Railway_traffic_lights - автор некий Hakcer93 (в нем только светофоры, нет алгоритма движения поездов, работает через main.scm).
Или они оба твои?
Скрин Railway_traffic_lights
-------Offtop-------
А что означает синий сигнал ж/д светофора?
Last edited by RDH (31-05-2010 14:27)
Offline
Offline
Нашёл настоящих авторов мода с ж/д светофорами http://trainsforgta.net/downloads.php?c … bcat_id=53
Offline
Эту модификацию я знаю - светофоры там идут как статические объекты, а мэйн заменяется только для того, чтобы выводить фирменную заставку ГТТ на экран в начале игры. Сначала я подумал, что к ним тоже скрипт переключения написали.
Offline
Только что провёл эксперимент - управлять сигналом светофора можно, но надо патчить exe.
С отчетом времени, после которого происходит смена сигнала светофора, по-видимому связаны 3 функции: 0x49D310, 0x49D350 и 0x49D3A0. Если посмотреть в базе listener-а устройство этих функций, то видно, что при работе они оперируют со значением текущего глобального времени игры (currentTime, записано по адресу 0x0B7CB84). Можно взять, к примеру, функцию 0x49D350 и с помощью hex-редактора заменить:
0049D378: A184CBB700 mov eax,[000B7CB84]
на
0049D378: A1свойАдрес mov eax,[свойАдрес]
,где свойАдрес - какой-нибудь адрес памяти, неиспользуемый игрой. После этого пишется скрипт, в котором по данному адресу записывается нужное значение:
{$CLEO} 0000: while true 0A8D: 0@ = read_memory 0x00B7CB84 size 2 virtual_protect 0 0A8C: write_memory СвойАдрес size 2 value 0@ virtual_protect 0 wait 500 0A8C: write_memory СвойАдрес size 2 value 10000 virtual_protect 0 // будет гореть желтый wait 500 end 0a93:
В примере светофоры направления север-юг начинают мигать: полсекунды горит цвет, который должен быть в данный момент, полсекунды горит желтый цвет
Offline
Зачем патчить ехе, если с помощью virtual protect 1 (посл. параметр в write_memory) можно на лету изменить нужный код?
Offline
Seemann, не знал об этой возможности. Спасибо, что просветил.
Скрипт пишем таким образом (ехе патчить не надо):
{$CLEO} 0A8C: write_memory 0x0049D379 size 4 value СвойАдрес virtual_protect 1 while true 0A8D: 0@ = read_memory 0x00B7CB84 size 2 virtual_protect 0 0A8C: write_memory СвойАдрес size 2 value 0@ virtual_protect 0 wait 500 0A8C: write_memory СвойАдрес size 2 value 10000 virtual_protect 0 wait 500 end
Проверено - работает.
Offline
Ну и чтобы не париться с записью значений, вместо СвойАдрес подсунем адрес локальной переменной 0@ (или любой другой):
{$CLEO} 0AC7: 1@ = var 0@ offset 0A8C: write_memory 0x0049D379 size 4 value 1@ virtual_protect 1 while true 0A8D: 0@ = read_memory 0x00B7CB84 size 2 virtual_protect 0 wait 500 0@ = 10000 wait 500 end
Offline
10000 - желтый цвет
А остальные цвета?
Какой принцип получения кода цвета?
Offline
Как я уже сказал выше, светофорные функции читают текущее значение глобального таймера, которое изменяется в пределах от 0 до 60000 мс. Когда значение таймера равно 10000 мс, светофоры "север-юг" горят желтым цветом. Зелёный сигнал светофора предшествует жёлтому, поэтому для него следует взять меньшее значение таймера (например, 4000). Красный сигнал следует за жёлтым, поэтому для него берётся большее значение (например, 16000).
Offline
Со светофорами разобрался . А шлагбаум?
В принципе, сам шлагбаум опустить думаю несложно (поменять угол у объекта), но как включить световую сигнализацию?
З.Ы.
Когда в городе никого нет, TrafficController включает жёлтый мигающий. Можно программно включить?
И ещё - почему 0x49D310? Скрин
-------------
Не нашёл адреса запад-восток!
Last edited by RDH (04-06-2010 16:44)
Offline
В принципе, сам шлагбаум опустить думаю несложно (поменять угол у объекта), но как включить световую сигнализацию?
К работе шлагбаумов имеет отношение функция 0x005A0B50 (_??ProcessTraincross), надо с ней поэкспериментировать.
TrafficController включает жёлтый мигающий. Можно программно включить?
Лично я желтого мигающего в игре никогда не видел, но если это явление возможно, значит его реально воссоздать и искусственно.
И ещё - почему 0x49D310?
В смысле откуда я взял этот адрес? Всё просто - в idb-базе listener-a многие функции проименованы, что позволяет осуществлять их поиск по ключевому слову (подобно поиску опкодов в СБ). Я просто скачал базу, открыл её в IDA 4.2 и осуществил поиск функций по слову "trafficlight". В базе функция 0x49D310 носит название _?TimeToSwitchTrafficlightToRed (название не совсем корректное, но всё же, функция к светофорам отношение имеет).
Не нашёл адреса запад-восток!
0A8C: write_memory 0x0049D3C9 size 4 value 1@ virtual_protect 1
Значения глобального таймера для конкретных цветов будут другие, т.к. обычно цвета светофоров разных направлений в один и тот же момент времени различаются. Например, желтый - 22000 мс.
Last edited by Den_spb (04-06-2010 19:32)
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
Last edited by Den_spb (05-06-2010 08:35)
Offline
Лично я желтого мигающего в игре никогда не видел
После выполнения этого скрипта, когда в городе никого не останется, светофоры перейдут в жёлтый мигающий.
P.S.
{$CLEO} 0AC7: 1@ = var 0@ offset 0A8C: write_memory 0x0049D379 size 4 value 1@ virtual_protect 1 while true 0@ = 60000 wait 500 0@ = 10000 wait 500 0@ = 0 wait 500 end
Если включить чит "Все светофоры зелёные" - анимация прекратится и светофор перейдет в зелёный, а если выключить - то анимация возобновится .
Last edited by RDH (05-06-2010 08:44)
Offline
Сделал скрипт "Зелёная линия":
{$CLEO} 0AC7: 1@ = var 0@ offset 0AC7: 5@ = var 4@ offset 0A8C: write_memory 0x0049D379 size 4 value 1@ virtual_protect 1 0A8C: write_memory 0x0049D3C9 size 4 value 5@ virtual_protect 1 :green_line wait 0 if Actor.Driving($PLAYER_ACTOR) jf @normal 03C0: 2@ = actor $PLAYER_ACTOR car 3@=Car.Angle(2@) // проверяем направление авто if 3@ <= 45.0 jf @135_255 jump @green_n_s :135_255 if and 3@ >= 135.0 3@ <= 225.0 jf @315_360 jump @green_n_s :315_360 if 3@ >= 315.0 jf @green_e_w :green_n_s // север-юг 0@ = 0 4@ = 60000 jump @green_line :green_e_w // запад-восток 0@ = 60000 4@ = 19000 jump @green_line :normal // обычный режим 0A8D: 0@ = read_memory 0x00B7CB84 size 2 virtual_protect 0 0A8D: 4@ = read_memory 0x00B7CB84 size 2 virtual_protect 0 jump @green_line
Смотрится очень эффектно . Ему бы ещё траффик подчинялся .
Но есть минус - пешеходные светофоры работают по своим таймерам!
Last edited by RDH (05-06-2010 09:05)
Offline
Небольшое уточнение. Вот точные значения Z-угла, по которому определяется, к какому из двух направлений относится светофор:
(330.0 ; 60.0) - направление 1 [60.0 ; 150.0] - направление 2 (150.0 ; 240.0) - направление 1 [240.0 ; 330.0] - направление 2
Если включить чит "Все светофоры зелёные" - анимация прекратится и светофор перейдет в зелёный, а если выключить - то анимация возобновится .
Ну это понятно. Если посмотреть функцию 0x49D350 в IDA, то видно, что сначала идёт проверка, включен ли чит, а потом уже производится операция с текущим временем.
Last edited by Den_spb (05-06-2010 13:21)
Offline
А для трафика есть таймер или нужно останавливать машины вручную?
Offline
После следующих правок траффик "запад-восток" всегда подчиняется светофорам соответствующего направления (даже когда сигнал светофора выставлен искусственно):
0A8C: write_memory 0x0049D6ED size 1 value 0xAF virtual_protect 1 0A8C: write_memory 0x0049D863 size 2 value 0xFB39 virtual_protect 1 0A8C: write_memory 0x0049D9E4 size 1 value 0xB8 virtual_protect 1
Этим осуществляется подмена вызова 0x49d310 вызовом 0x49d3a0 в функции 0x49D610, регулирующей движение на светофорах. Для светофоров "север-юг" решение пока не найдено.
Last edited by Den_spb (09-06-2010 23:28)
Offline