#1 29-05-2010 08:29

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Светофоры

Можно ли как-нибудь вручную управлять светофором, шлагбаумом?
Светофор меняется за счёт переключений файлов TXD?


programmer.png
modder.jpg

Offline

#2 29-05-2010 11:17

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Светофоры

Управлять отображением светофора - можно.
Управлять светофором так, чтобы это влияло на трафик - просто так не получится.

TrafficController считает, что 30 секунд (не помню точную цифру и направления, надо покопаться в архивах), можно проезжать по дорогам с севера на юг, следующие 30 секунд - с востока на запад.
А перерисовка светофора берет текущее время и отрисовывается соответствующе.

Offline

#3 30-05-2010 18:33

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Светофоры

Просто есть скрипт Railway_traffic_lights - ж/д светофоры - ну я и подумал реализовать типа этого для уличного движения (сделать, например "зелёную линию" для спецтранспорта).

И кстати, можно узнать технологию управления отображением светофора? В скрипте копался - недопонял sad

Last edited by RDH (30-05-2010 18:38)


programmer.png
modder.jpg

Offline

#4 30-05-2010 18:44

XotaBi4b
From: Харьков
Registered: 13-09-2008
Posts: 87

Re: Светофоры

listener wrote:

Управлять отображением светофора - можно.
Управлять светофором так, чтобы это влияло на трафик - просто так не получится.

TrafficController считает, что 30 секунд (не помню точную цифру и направления, надо покопаться в архивах), можно проезжать по дорогам с севера на юг, следующие 30 секунд - с востока на запад.
А перерисовка светофора берет текущее время и отрисовывается соответствующе.

В  Crazy Trainer 151 v 2.0  есть чит:

Все светофоры зелёные

И на всех светофорах был зелёный, и все машины ехали.

К RDH  - Значит, если покапавшись в тренере, возможно найти интересные адреса отвечающие за трафик и светофоры.

Offline

#5 30-05-2010 18:55

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Светофоры

Все светофоры зелёные

Так прикол не в том, чтобы на всех линиях был зелёный! Надо, чтобы в определённое время светофор давал линию нужного направления, а все остальные линии были закрыты.

P.S.

"Все светофоры зелёные" - стандартный чит, включается записью в 0x96914E значения 1.


programmer.png
modder.jpg

Offline

#6 30-05-2010 21:18

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

Просто есть скрипт Railway_traffic_lights - ж/д светофоры

Если речь идёт о моём скрипте ж/д светофоров, то там всё намного проще, чем в светофорах автомобильных. Есть 3 модели объектов - светофоры с разными цветами огней. Если необходимо переключить светофор (зависит от того, существует ли поезд и как он расположен относительно светофора), то удаляется старый светофор и на его месте тут же создаётся новый - с другим огнём.

Last edited by Den_spb (30-05-2010 21:27)

Offline

#7 31-05-2010 14:17

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Светофоры

Den_spb wrote:

Если речь идёт о моём скрипте ж/д светофоров

Насколько я знаю, твой скрипт - algorithm5, а есть ещё Railway_traffic_lights - автор некий Hakcer93 (в нем только светофоры, нет алгоритма движения поездов, работает через main.scm).
Или они оба твои?
Скрин Railway_traffic_lights
-------Offtop-------
А что означает синий сигнал ж/д светофора?

Last edited by RDH (31-05-2010 14:27)


programmer.png
modder.jpg

Offline

#8 31-05-2010 14:56

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Offline

#9 31-05-2010 16:28

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

Верно, я делал algorithm. О существовании других подобных модов не знал.

Offline

#10 01-06-2010 15:58

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Светофоры

Нашёл настоящих авторов мода с ж/д светофорами http://trainsforgta.net/downloads.php?c … bcat_id=53


programmer.png
modder.jpg

Offline

#11 01-06-2010 20:36

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

Эту модификацию я знаю - светофоры там идут как статические объекты, а мэйн заменяется только для того, чтобы выводить фирменную заставку ГТТ на экран в начале игры. Сначала я подумал, что к ним тоже скрипт переключения написали.

Offline

#12 01-06-2010 22:23

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

Только что провёл эксперимент - управлять сигналом светофора можно, но надо патчить 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

#13 01-06-2010 23:20

Seemann
Registered: 07-08-2006
Posts: 2,154

Re: Светофоры

Зачем патчить ехе, если с помощью virtual protect 1 (посл. параметр в write_memory) можно на лету изменить нужный код?

Offline

#14 01-06-2010 23:53

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

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

#15 02-06-2010 00:11

Seemann
Registered: 07-08-2006
Posts: 2,154

Re: Светофоры

Ну и чтобы не париться с записью значений, вместо СвойАдрес подсунем адрес локальной переменной 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

#16 02-06-2010 15:57

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Светофоры

Den_spb wrote:

10000 - желтый цвет

А остальные цвета?
Какой принцип получения кода цвета?


programmer.png
modder.jpg

Offline

#17 02-06-2010 18:20

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

Как я уже сказал выше, светофорные функции читают текущее значение глобального таймера, которое изменяется в пределах от 0 до 60000 мс. Когда значение таймера равно 10000 мс, светофоры "север-юг" горят желтым цветом. Зелёный сигнал светофора предшествует жёлтому, поэтому для него следует взять меньшее значение таймера (например, 4000). Красный сигнал следует за жёлтым, поэтому для него берётся большее значение (например, 16000).

Offline

#18 04-06-2010 11:14

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Светофоры

Со светофорами разобрался smile. А шлагбаум?
В принципе, сам шлагбаум опустить думаю несложно (поменять угол у объекта), но как включить световую сигнализацию?

З.Ы.
Когда в городе никого нет, TrafficController включает жёлтый мигающий. Можно программно включить?
И ещё - почему 0x49D310? Скрин
-------------
Не нашёл адреса запад-восток!

Last edited by RDH (04-06-2010 16:44)


programmer.png
modder.jpg

Offline

#19 04-06-2010 19:26

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

В принципе, сам шлагбаум опустить думаю несложно (поменять угол у объекта), но как включить световую сигнализацию?

К работе шлагбаумов имеет отношение функция 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

#20 04-06-2010 23:50

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

жёлтый мигающий.

Все светофоры мигают желтым цветом (означает, что перекрёсток нерегулируемый):

{$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

#21 05-06-2010 08:39

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Светофоры

Den_spb wrote:

Лично я желтого мигающего в игре никогда не видел

После выполнения этого скрипта, когда в городе никого не останется, светофоры перейдут в жёлтый мигающий.

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

Если включить чит "Все светофоры зелёные" - анимация прекратится и светофор перейдет в зелёный, а если выключить - то анимация возобновится smile.

Last edited by RDH (05-06-2010 08:44)


programmer.png
modder.jpg

Offline

#22 05-06-2010 09:02

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Светофоры

Сделал скрипт "Зелёная линия":

{$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

Смотрится очень эффектно smile. Ему бы ещё траффик подчинялся smile.

Но есть минус - пешеходные светофоры работают по своим таймерам!

Last edited by RDH (05-06-2010 09:05)


programmer.png
modder.jpg

Offline

#23 05-06-2010 13:11

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

Небольшое уточнение. Вот точные значения Z-угла, по которому определяется, к какому из двух направлений относится светофор:

(330.0 ; 60.0)   -   направление 1
[60.0 ; 150.0]   -   направление 2
(150.0 ; 240.0)   -   направление 1
[240.0 ; 330.0]   -   направление 2

Если включить чит "Все светофоры зелёные" - анимация прекратится и светофор перейдет в зелёный, а если выключить - то анимация возобновится .

Ну это понятно. Если посмотреть функцию 0x49D350 в IDA, то видно, что сначала идёт проверка, включен ли чит, а потом уже производится операция с текущим временем.
8e357c2ff0f3t.jpg

Last edited by Den_spb (05-06-2010 13:21)

Offline

#24 08-06-2010 09:44

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Светофоры

А для трафика есть таймер или нужно останавливать машины вручную?


programmer.png
modder.jpg

Offline

#25 09-06-2010 23:26

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Светофоры

После следующих правок траффик "запад-восток" всегда подчиняется светофорам соответствующего направления (даже когда сигнал светофора выставлен искусственно):

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

Board footer

Powered by FluxBB