You are not logged in.
Небольшое уточнение. Вот точные значения Z-угла, по которому определяется, к какому из двух направлений относится светофор:
1234(
330.0
; 60.0) - направление
1
[
60.0
; 150.0] - направление
2
(
150.0
; 240.0) - направление
1
[
240.0
; 330.0] - направление 2
С этими углами на светофорах иногда горят неправильные сигналы!
Offline
Значения точные, получены экспериментальным путём:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | { $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
Уточнено назначение некоторых функций, имеющих отношение к светофорам.
1 2 | .text :0049D2D0 CTrafficLights_Get_Current_Traffic_Mode_NS proc near .text :0049D310 CTrafficLights_Get_Current_Traffic_Mode_WE proc near |
Определяют режим дорожного движения одного из двух направлений (0 - машины едут, 1 - машины стоят)
1 2 | .text :0049D350 CTrafficLights_Get_Current_Color_NS proc near .text :0049D3A0 CTrafficLights_Get_Current_Color_WE proc near |
Определяют цвет сигнала светофора одного из двух направлений (0 - зелёный, 1 - жёлтый, 2 - красный).
1 | .text :0049D4D0 CTrafficLights_Get_Type_by_Z_angle proc near |
Определяет направление светофора (1 - WE, 2 - NS). Передаваемый параметр - Z-угол светофора.
Написал новый вариант скрипта "Зелёная линия" - пока на автомобиле игрока включена сирена, все попутные светофоры горят зелёным, а светофоры другого направления - красным. Траффик подчиняется изменённым сигналам светофоров.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | { $CLEO } 0A8C: write_memory 0x49D6D 5 size 4 value 0xFFFFFC 77 virtual_protect 1 0A8C: write_memory 0x49D6ED size 4 value 0xFFFFFCAF virtual_protect 1 0A8C: write_memory 0x49D84B size 4 value 0xFFFFFB 01 virtual_protect 1 0A8C: write_memory 0x49D 863 size 4 value 0xFFFFFB 39 virtual_protect 1 0A8C: write_memory 0x49D9CE size 4 value 0xFFFFF97E virtual_protect 1 0A8C: write_memory 0x49D9E 4 size 4 value 0xFFFFF9B 8 virtual_protect 1 0AC7: 0@ = var 1@ offset 0A8C: write_memory 0x49D 379 size 4 value 0@ virtual_protect 1 0AC7: 0@ = var 2@ offset 0A8C: write_memory 0x49D3C 9 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 0x49D4D 0 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
Находка бесполезная, но забавная:
1 | .text :00724B60 DrawHandmanTexture proc near |
Функция рисует текстуру пешеходного светофора.
Пример использования:
1 2 3 4 5 6 | { $CLEO } wait 0 while true wait 0 0AA5: call_function 0x00724B 60 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
1 | .text :00724770 Create_luminous_polygon proc near |
Функция создаёт светящийся многоугольник, служащий сигналом светофора. Пример использования:
1 2 3 4 5 6 | { $CLEO } wait 0 while true wait 0 0AA5: call_function 0x 00724770 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:
1 2 | .text :007000E0 Create_Flashlight proc near ; создание невидимого источника света .text :0070BA00 sub_70BA 00 proc near ; участвует в создании световой проекции на земле |
Last edited by Den_spb (24-10-2011 18:55)
Offline
Существует ли способ выключения светофоров только одного направления?
Offline
жёлтый мигающий.
Все светофоры мигают желтым цветом (означает, что перекрёсток нерегулируемый):
1234567891011121314151617181920212223242526272829{
$CLEO
}
0AC7:
31@
=
var
30@
offset
0AC7:
29@
=
var
28@
offset
0A8C: write_memory 0x0049D
379
size
4
value
31@
virtual_protect
1
// подставляем свой адрес в функцию север-юг
0A8C: write_memory 0x0049D3C
9
size
4
value
29@
virtual_protect
1
// подставляем свой адрес в функцию запад-восток
30@
=
10000
// при этом значении таймера север-юг горит желтым
28@
=
22000
// при этом значении таймера запад-восток горит желтым
var
2@
: array
9
of Integer
end
1@
= 0x008CD4F
4
for
0@
=
0
to
8
0A8D:
2@
[
0@
] = read_memory
1@
size
2
virtual_protect
0
// сохраняем ИД номера светофоров в переменных скрипта
1@
+= 0x
4
end
while
true
wait
500
1@
= 0x008CD4F
4
for
0@
=
0
to
8
0A8C: write_memory
1@
size
2
value
0
virtual_protect
0
// теперь игра будет считать светофором объект с ИД=0 . Т.е. светофоры работать не будут
1@
+= 0x
4
end
wait
500
1@
= 0x008CD4F
4
for
0@
=
0
to
8
0A8C: write_memory
1@
size
2
value
2@
[
0@
] virtual_protect
0
// восстанавливаем ИД номера светофоров. Светофоры снова работают (в данном случае горят желтым цветом)
1@
+= 0x
4
end
end
Мне этот скрипт пригодится, можно его использовать в своём моде?
Только машины останавливаются на перекрёстке и стоят бесконечно. Есть ли способ заставить их всех игнорировать светофор или придётся отлавливать каждую машину и приписывать ей это свойство?
Offline
можно его использовать в своём моде?
Можно.
Есть ли способ заставить их всех игнорировать светофор или придётся отлавливать каждую машину и приписывать ей это свойство?
Попробуй такой вариант:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | { $CLEO } 0AC7: 31@ = var 31@ offset 0AC7: 30@ = var 30@ offset 0A8C: write_memory 0x0049D 379 size 4 value 31@ virtual_protect 1 // подставляем свой адрес в функцию север-юг 0A8C: write_memory 0x0049D3C 9 size 4 value 30@ virtual_protect 1 // подставляем свой адрес в функцию запад-восток 31@ = 10000 // при этом значении таймера север-юг горит желтым 30@ = 22000 // при этом значении таймера запад-восток горит желтым 0A8C: write_memory 0x0049D 300 size 2 value 0xC 032 virtual_protect 1 // xor al , al 0A8C: write_memory 0x0049D 338 size 2 value 0xC 032 virtual_protect 1 // xor al , al 0A8C: write_memory 0x0049D34A size 2 value 0xC 032 virtual_protect 1 // xor al , al var 2@ : array 9 of Integer end 1@ = 0x008CD4F 4 for 0@ = 0 to 8 0A8D: 2@ [ 0@ ] = read_memory 1@ size 2 virtual_protect 0 // сохраняем ИД номера светофоров в переменных скрипта 1@ += 0x 4 end while true wait 500 1@ = 0x008CD4F 4 for 0@ = 0 to 8 0A8C: write_memory 1@ size 2 value 0 virtual_protect 0 // теперь игра будет считать светофором объект с ИД=0 . Т.е. светофоры работать не будут 1@ += 0x 4 end wait 500 1@ = 0x008CD4F 4 for 0@ = 0 to 8 0A8C: write_memory 1@ size 2 value 2@ [ 0@ ] virtual_protect 0 // восстанавливаем ИД номера светофоров. Светофоры снова работают (в данном случае горят желтым цветом) 1@ += 0x 4 end end |
Offline
Попробуй такой вариант:
12345678910111213141516171819202122232425262728293031323334{
$CLEO
}
0AC7:
31@
=
var
31@
offset
0AC7:
30@
=
var
30@
offset
0A8C: write_memory 0x0049D
379
size
4
value
31@
virtual_protect
1
// подставляем свой адрес в функцию север-юг
0A8C: write_memory 0x0049D3C
9
size
4
value
30@
virtual_protect
1
// подставляем свой адрес в функцию запад-восток
31@
=
10000
// при этом значении таймера север-юг горит желтым
30@
=
22000
// при этом значении таймера запад-восток горит желтым
0A8C: write_memory 0x0049D
300
size
2
value 0xC
032
virtual_protect
1
// xor al , al
0A8C: write_memory 0x0049D
338
size
2
value 0xC
032
virtual_protect
1
// xor al , al
0A8C: write_memory 0x0049D34A size
2
value 0xC
032
virtual_protect
1
// xor al , al
var
2@
: array
9
of Integer
end
1@
= 0x008CD4F
4
for
0@
=
0
to
8
0A8D:
2@
[
0@
] = read_memory
1@
size
2
virtual_protect
0
// сохраняем ИД номера светофоров в переменных скрипта
1@
+= 0x
4
end
while
true
wait
500
1@
= 0x008CD4F
4
for
0@
=
0
to
8
0A8C: write_memory
1@
size
2
value
0
virtual_protect
0
// теперь игра будет считать светофором объект с ИД=0 . Т.е. светофоры работать не будут
1@
+= 0x
4
end
wait
500
1@
= 0x008CD4F
4
for
0@
=
0
to
8
0A8C: write_memory
1@
size
2
value
2@
[
0@
] virtual_protect
0
// восстанавливаем ИД номера светофоров. Светофоры снова работают (в данном случае горят желтым цветом)
1@
+= 0x
4
end
end
Нет, машины ведут себя так, будто красный и зелёный цвет никуда не делись.
Кстати, я когда декомпилировал этот скрипт (ещё первую версию), он принял такой вид:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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
Нет, машины ведут себя так, будто красный и зелёный цвет никуда не делись.
Решил задачу немного иначе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | { $CLEO } 0A8C: write_memory 0x0096914E size 1 value 1 virtual_protect 0 // "Все светофоры зелёные" while true wait 500 // установка цвета ламп светофоров NS 0A8C: write_memory 0x0049DB5F size 1 value 0xB 8 virtual_protect 1 0A8C: write_memory 0x0049DB 60 size 4 value 1 virtual_protect 1 // value: 0 - зелёный, 1 - жёлтый, 2 - красный, другое число - не горит 0A8C: write_memory 0x0049DB 64 size 2 value 0x 9090 virtual_protect 1 0A8C: write_memory 0x0049DB 66 size 1 value 0x 90 virtual_protect 1 // установка цвета ламп светофоров WE 0A8C: write_memory 0x0049DB6D size 1 value 0xB 9 virtual_protect 1 0A8C: write_memory 0x0049DB6E size 4 value 1 virtual_protect 1 // value: 0 - зелёный, 1 - жёлтый, 2 - красный, другое число - не горит 0A8C: write_memory 0x0049DB 72 size 2 value 0x 9090 virtual_protect 1 0A8C: write_memory 0x0049DB 74 size 1 value 0x 90 virtual_protect 1 wait 500 // установка цвета ламп светофоров NS 0A8C: write_memory 0x0049DB5F size 1 value 0xB 8 virtual_protect 1 0A8C: write_memory 0x0049DB 60 size 4 value 4 virtual_protect 1 // value: 0 - зелёный, 1 - жёлтый, 2 - красный, другое число - не горит 0A8C: write_memory 0x0049DB 64 size 2 value 0x 9090 virtual_protect 1 0A8C: write_memory 0x0049DB 66 size 1 value 0x 90 virtual_protect 1 // установка цвета ламп светофоров WE 0A8C: write_memory 0x0049DB6D size 1 value 0xB 9 virtual_protect 1 0A8C: write_memory 0x0049DB6E size 4 value 4 virtual_protect 1 // value: 0 - зелёный, 1 - жёлтый, 2 - красный, другое число - не горит 0A8C: write_memory 0x0049DB 72 size 2 value 0x 9090 virtual_protect 1 0A8C: write_memory 0x0049DB 74 size 1 value 0x 90 virtual_protect 1 end 0A93: |
Это ничего, что у него там циклы без вайтов? Есть гарантия, что зависать не будет?
Игра зависнет, если wait отсутствует в бесконечном цикле. В этом случае игра будет постоянно занята выполнением этого цикла, а другие скрипты и процессы (в том числе отрисовка и обработка нажатий клавиш) выполняться не будут - что внешне проявится зависанием. Как уже ранее обсуждалось, все процессы и скрипты в игре выполняются по очереди, а команда wait служит для приостановки выполнения текущего скрипта с целью выполнения других скриптов и процессов.
Что касается рассматриваемого примера - там цикл не бесконечный, он повторится всего 9 раз. При этом будут исполнены 5 * 9 = 45 опкодов.
И вообще, срабатывают ли такие проверки, перед которыми не записано if?
Если проверка одна, то if перед ней писать не обязательно. Исключение - конструкции if...then...end и if...then...else...end.
Offline
А как потом вернуть всё обратно?
Во-первых, нужно отключить чит "Все светофоры зелёные"
1 | 0A8C: write_memory 0x0096914E size 1 value 0 virtual_protect 0 |
Во-вторых, нужно восстановить участки кода gta_sa.exe, которые были отредактированы скриптом:
1 2 3 4 5 6 7 8 9 | 0A8C: write_memory 0x0049DB5F size 1 value 0x?? virtual_protect 1 0A8C: write_memory 0x0049DB 60 size 4 value 0x???????? virtual_protect 1 0A8C: write_memory 0x0049DB 64 size 2 value 0x???? virtual_protect 1 0A8C: write_memory 0x0049DB 66 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 0x0049DB 72 size 2 value 0x???? virtual_protect 1 0A8C: write_memory 0x0049DB 74 size 1 value 0x?? virtual_protect 1 |
Вместо знаков вопроса надо подставить исходные значения, посмотреть которые можно в базе gta_sa.exe. Открываем базу с помощью программы IDA, переходим на вкладку отображения кода в шестнадцатиричном виде "Hex View-A". Жмём клавишу G (переход по указанному адресу) и вводим адрес начала записи (параметр write_memory в опкоде 0A8C). При подстановке в опкод байты нужно записывать в обратном порядке.
Пример:
1 | 0A8C: write_memory 0x0049DB 60 size 4 value 0x???????? virtual_protect 1 |
Жмём G, переходим по адресу 49DB60. Значения байтов:
1 | EC F 7 FF FF |
Переписываем байты в опкод в обратном порядке:
1 | 0A8C: write_memory 0x0049DB 60 size 4 value 0xFFFFF7EC virtual_protect 1 |
Offline