Автор Тема: Trails - вызов на лету  (Прочитано 6922 раз)

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Trails - вызов на лету
« : Февраль 19, 2014, 05:19:31 pm »
Вот такую фишку хочу сделать, суть в сочетании эффекта опьянения, вызывающего пошатывание и blur-эффекта или trails, делающего мир красочнее, ну все как жизни после выпитого.

Drunk trails


У меня пока кривая активация trails на лету (с выбросом в меню), может мы совместными усилиями доведем до ума.
Пока вызов trails возможен только в меню, чтобы игра не вылетела. Даже если этого пунта нет там, можно сделать так:

Код: C++
  1. *(BYTE *)0x869642 = 1; // выход в меню
  2. *(BYTE *)0x697D54 = 1; // trails on

Проблема в том, что меню нужно после этого закрыть вручную, в этот момент и происходит активация. Как бы описать функцию, которая должна запускаться на выходе из меню, чтобы все происходило сразу в игре без вызова меню. Я вроде нашел, что все зависит от этого указателя 0x9753A4 __MBlur, он при каждом вызове trails меняет значение. Я пробовал его устанавливать по предыдущему значению, trails включаются сразу без меню, но как-то криво, потому что должно быть уже новое значение. Вот такой вариант активирует кривой trails без меню:

Код: C++
  1. *(DWORD *)0x9753A4 = ?; // можно попробовать его предыдущее значение, но это неправильно
  2. *(BYTE *)0x697D54 = 1; // trails on

Если разбираться, то единственное место, где он устанавливается это:

Код: C++
  1. 0x55D08B         mov     ds:__MBlur, eax

Вобщем мне кажется если будет этот указатель, будет trails, только не могу сообразить как это правильно сделать.
С отключением trails проблем нет:

Код: C++
  1. *(BYTE *)0x697D54 = 0; // trails off
  2. и вызов функции 0x55CDF0 BlurDestroy

Оффлайн mike43842

  • Прохожий
  • *
  • Сообщений: 110
  • Репутация: +1/-0
    • mike43842
    • Просмотр профиля
    • lol
Re: Trails - вызов на лету
« Ответ #1 : Февраль 19, 2014, 07:02:28 pm »
А что ты сделал для того чтобы он падал?

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Trails - вызов на лету
« Ответ #2 : Февраль 19, 2014, 07:27:20 pm »
Я менял статус игрока при быстром беге.

Код: Text
  1. 0x94AD28 - [pointer] - Player pointer
  2. +0x244 - [byte] - player current status = 0x2A - fallen down // падение
  3. +0x24C - [1 byte] - walking // 1 - стоит, 4 - бежит, 5 - быстро бежит

Тут много интересного можно еще придумать. Если с этими статусами разобраться, можно например бухать и сидя в машине, только я не знаю, как потом вернуть игрока в нормальное сидячее состояние за рулем.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Trails - вызов на лету
« Ответ #3 : Февраль 19, 2014, 08:02:27 pm »
Водку бухает прям перед ментами :D Русский мод, что тут сказать  8)

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Trails - вызов на лету
« Ответ #4 : Февраль 20, 2014, 05:47:11 am »
Если говорить о моде, хорошо бы понять, как изменить еще стиль походки на шатающуюся из SA. Можно поставить такую анимацию ходьбы какому-то типу педов, но как ее на время передать игроку?
Но все-таки хотелось бы заострить внимание не на моде, а на этом эффекте. Было бы полезно его реализовать и применять для каких-то задач. Может кто-то пытался с этим разобраться?

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Trails - вызов на лету
« Ответ #5 : Март 18, 2014, 11:23:19 am »
Пытался(хотел эффектное слоумо сделать). Прошло 4 года.  :'(

Везде всё перерыл, но максимум, до чего дошел: как и ты - активация с выбросом в меню. :(

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичок
  • *****
  • Сообщений: 176
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Trails - вызов на лету
« Ответ #6 : Март 19, 2014, 03:54:49 pm »
Trails можно менять в скриптинге, есть такой опкод меняющий trails.
I know everything and nothing...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Trails - вызов на лету
« Ответ #7 : Март 19, 2014, 05:06:37 pm »
имеешь ввиду 0374: set_motion_blur? Что-то не работает

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичок
  • *****
  • Сообщений: 176
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Trails - вызов на лету
« Ответ #8 : Март 19, 2014, 05:11:09 pm »
Точно так-с, но можно изменить кое-что в памяти что-б работал.
I know everything and nothing...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Trails - вызов на лету
« Ответ #9 : Апрель 02, 2014, 05:03:06 pm »
Вобщем я сделал trails. Переключение клавишей T

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичок
  • *****
  • Сообщений: 176
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Trails - вызов на лету
« Ответ #10 : Апрель 02, 2014, 05:44:57 pm »
сделай ini файл для выбора клавиши, тогда будет совсем хорошо!
I know everything and nothing...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Trails - вызов на лету
« Ответ #11 : Апрель 02, 2014, 06:15:35 pm »
Ну вообще особого смысла включать по клавише я не вижу, эффект лучше применять в каких-то специфических ситуациях игры.

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Trails - вызов на лету
« Ответ #12 : Апрель 05, 2014, 08:46:36 am »
Я давно работал с Motion Blur(он же Trails) - убирал "мочу" в глазах, оставляя приятные эффекты вроде улучшенных капель, нагретого воздуха и т.д.
Но это всё я делал в timecyc.dat , и вот подумал - почему бы не изменять это в нужный момент через память, для таких модов, как представлен выше(пьянка).

Нашел адреса:
7E4734 [4b] // Blur R
7E4730 [4b] // Blur G
7E472C [4b] // Blur B
- но средствами CLEO(даже с virtual_protect 1) не удается сменить значения.
В "Артмани" же работает(если включить заморозку значения) - хоть и не всё время, а миганиями.

Дело в том, что этот способ позволит регулировать интенсивность и цвет blur-а, поэтому было бы неплохо понять, как юзать эти адреса(я не очень шарю в "замороженных" адресах)

Ах да - чуть не забыл! Эти три адреса цвета Blur, помимо самого цвета задают еще и интенсивность. Т.е. выставив значения 3 3 3 - вы почти не увидите мочи в глазах, зато все остальные эффекты будут видны. Выставив же 255 255 255 - вы зальете экран белесым веществом. Ну, в общем, вы поняли :D

P.S. Повторюсь - со всеми значениями я экспериментировал в timecyc.dat, а не через память. Через память кое-как криво получалось в артмани(с миганием), а потому цель сообщения - нахождение способа использовать адреса памяти
« Последнее редактирование: Апрель 05, 2014, 08:50:21 am от Shaggy »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Trails - вызов на лету
« Ответ #13 : Апрель 07, 2014, 05:39:49 pm »
Эти адреса непрерывно перезаписываются из другого места, поэтому смысла их менять нет. Нужно либо искать это место, но скорее всего там нет точных значений цвета, потому что значения из timecyc.dat не совпадают с теми, что в итоге в памяти, там возможно какой-то перерасчет. Либо можно напрямую передавать цвета в этот участок:

Код: ASM
  1. .text:0046BDF7 00C FF B1 A4 00 00 00                             push    [ecx+CCamera.field_A4] ; B, 0x7E472C
  2. .text:0046BDFD 010 FF B1 A8 00 00 00                             push    [ecx+CCamera.field_A8] ; G, 0x7E4730
  3. .text:0046BE03 014 FF B1 AC 00 00 00                             push    [ecx+CCamera.field_AC] ; R, 0x7E4734
  4. .text:0046BE09 018 FF B1 08 08 00 00                             push    [ecx+CCamera.rwCamera] ; rwCamera
  5. .text:0046BE0F 01C E8 CC 19 0F 00                                call    cameraMBlurProcess

field_A4, field_A8, field_AС это как раз твои адреса, чтобы к ним больше не было обращения, можно заменить сразу на нужные значения:

Код: ASM
  1. .text:0046BDF7 00C 6A 05 90 90 90 90                             push    5 ; B, nop 4
  2. .text:0046BDFD 010 6A 05 90 90 90 90                             push    5 ; G, nop 4
  3. .text:0046BE03 014 6A 05 90 90 90 90                             push    5 ; R, nop 4
  4. .text:0046BE09 018 FF B1 08 08 00 00                             push    [ecx+CCamera.rwCamera] ; rwCamera
  5. .text:0046BE0F 01C E8 CC 19 0F 00                                call    cameraMBlurProcess

Получишь цвет (5,5,5). Так что если сделаешь такую замену (0x6A это push в данном случае), то можно цвета писать в адреса 0x46BDF8, 0x46BDFE, 0x46BE04

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

« Последнее редактирование: Апрель 07, 2014, 05:43:14 pm от xanser »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Trails - вызов на лету
« Ответ #14 : Апрель 16, 2014, 01:34:30 am »
Круть, жаль на C++.
Для таких же, как я - другой способ:
через extracolours. Основное отличие от способа, представлено xanser-ом выше - в том, что так можно сделать вообще что угодно, к примеру - мод ночного видения(BLUR тут тоже заменяется):
1) Открываем timecyc.dat
заменяем 18й extracolour на мой
Цитировать
// Extra Colour 18----------*NIGHT VISION*----------
0 255 0     0 255 0     0 255 0     0 255 0     0 255 0         0 255 0      0 255 0      0 255 0         0 255 0     1.0    1.0      1.0      200     100    0      800.0    100.0   1.0            0 255 0      0 255 0      0 255 0              000 255 000         0 255 0       0

- выделенные цвета - цвета BLUR-а. Остальные цвета - как в любом часе погоды. В моде на ночное видение - всё зеленое.
2)Активация на кнопку 'N', когда целишься из снайперской винтовки:
:SNIPERN
thread 'SNIPERN'

:SNIPERN_10
wait 10
if
   Player.Defined($PLAYER_CHAR)
else_goto @SNIPERN_10
if and
   Player.Controllable($PLAYER_CHAR)
02D7:   player $PLAYER_CHAR currentweapon == 29
80E0:   not player $PLAYER_CHAR driving
029F:   player $PLAYER_CHAR stopped
else_goto @SNIPERN_10
if
00E1:   player 0 pressed_button 6
else_goto @SNIPERN_10
03E5: text_box 'ASM1_1'  // ~t~Press ~h~N ~t~to use Night Vision

:SNIPERN_90
wait 10
if and
   Player.Controllable($PLAYER_CHAR)
02D7:   player $PLAYER_CHAR currentweapon == 29
80E0:   not player $PLAYER_CHAR driving
029F:   player $PLAYER_CHAR stopped
else_goto @SNIPERN_10
if
00E1:   player 0 pressed_button 6
else_goto @SNIPERN_10
if
05EE:  key_pressed 78 //VK_...
else_goto @SNIPERN_90
unload_wav 1
load_wav 'ASS_6' 1

:SNIPERN_175
wait 0
if and
85EE:   not key_pressed 78 //VK_...
has_wav_loaded 1
else_goto @SNIPERN_175
if and
   Player.Controllable($PLAYER_CHAR)
02D7:   player $PLAYER_CHAR currentweapon == 29
80E0:   not player $PLAYER_CHAR driving
029F:   player $PLAYER_CHAR stopped
else_goto @SNIPERN_427
if
00E1:   player 0 pressed_button 6
else_goto @SNIPERN_427
play_wav 1
wait 200
05E0: 0@ = read_memory 10553902 size 2 virtual_protect 0
wait 10
04F9: set_extracolors 18 fade 0

:SNIPERN_281
wait 10
if
83D2:   not wav 1 ended
else_goto @SNIPERN_340
if and
   Player.Controllable($PLAYER_CHAR)
02D7:   player $PLAYER_CHAR currentweapon == 29
00E1:   player 0 pressed_button 6
85EE:   not key_pressed 78 //VK_...
else_goto @SNIPERN_388
jump @SNIPERN_281

:SNIPERN_340
unload_wav 1

:SNIPERN_344
wait 10
if and
   Player.Controllable($PLAYER_CHAR)
02D7:   player $PLAYER_CHAR currentweapon == 29
00E1:   player 0 pressed_button 6
85EE:   not key_pressed 78 //VK_...
else_goto @SNIPERN_388
jump @SNIPERN_344

:SNIPERN_388
04FA: reset_sky_colors_with_fade 0
set_weather 0@
wait 10

:SNIPERN_401
wait 0
if
85EE:   not key_pressed 78 //VK_...
else_goto @SNIPERN_401
jump @SNIPERN_90

:SNIPERN_427
unload_wav 1
jump @SNIPERN_10
- там еще звук используется, но это мелочи. Фишка в частях:
Цитировать
05E0: 0@ = read_memory 10553902 size 2 virtual_protect 0 // - узнаем id текущей погоды
04F9: set_extracolors 18 fade 0 // - ставим экстракалор
и потом:
Цитировать
04FA: reset_sky_colors_with_fade 0 // вырубаем экстракалор
set_weather 0@ // возвращаем погоду(без этого ничего не убирается, т.к. по дефолту экстракалоры используются только в интерьерах и заставках, а не в игре)

--------------------------------------------------------------------------------------
Т.е. можно по-дефолту в timecyc для всех погод выставить нулевой(или пости нулевой) blur, а экстракалорами задавать его интенсивность и цвет.

Минус этого способа в том, что изобращение сменится мгновенно, а потому - для плавного эффекта нужно сделать несколько extracolours, и применять в скрипте их по-очереди. Ну.. такие извращенцы и быдлокодеры, как я - это любят  :-\
P.S. Ну и... есть еще пара мелочей :P Учите короче C++ и не будьте как я
« Последнее редактирование: Апрель 16, 2014, 01:37:39 am от Shaggy »