GTA Builder Форум

GTA Vice City => Справочная информация => Тема начата: Shagg_E от Январь 09, 2015, 07:23:28 pm

Название: Нижний цвет неба
Отправлено: Shagg_E от Январь 09, 2015, 07:23:28 pm
Кто-нибудь знает, как сменить цвет нижней половины неба? Той, что тёмно-серая. Может адрес какой есть, чтобы изменять его динамически: его можно было бы тогда сменять на тот же, что и у нижнего края "верхнего" неба(у "верхнего" неба 2 градиента цвета).
P.S. скайбокс(или сферу) не предлагать:)
Название: Re: Нижний цвет неба
Отправлено: xanser от Январь 09, 2015, 08:42:43 pm
Что-то ничего не удалось разглядеть, у меня стандартное небо синее, к горизонту до воды светлеет, только если воду убрать, там что-то коричневое ниже. А почему ты не хочешь использовать "то, что не предлагать", ведь можно добиться большей фотореалистичности. Я, например, после экспериментов обнаружил, что если сделать "то, что не предлагать" монохромным, а не голубым, и нужной прозрачности, то цвета будут правильно отображать настройки timecyc.dat, ночь будет черной, а не фиолетовой, дождь пасмурным серым, а ясное небо голубым. Я бы покопал в сторону создания динамического "того, что не предлагать", чтобы создать эффект движения и смены текстур с изменением прозрачности и всякое такое.
Возвращаясь к теме, покажи что-ли скрин, чтобы понять, что именно тебя интересует.
Название: Re: Нижний цвет неба
Отправлено: Shagg_E от Январь 10, 2015, 12:34:06 am
Вот эта тёмно-серая фигня, когда находишься на большой высоте:
(http://i65.fastpic.ru/thumb/2015/0110/24/fefd0a768b6050b0d83965103d83cd24.jpeg) (http://fastpic.ru/view/65/2015/0110/fefd0a768b6050b0d83965103d83cd24.jpg.html)

Если увеличить дистанцию прорисовки и сделать скайсферу "монохромным, а не голубым, и нужной прозрачности" цветом, то серая фигня останется серой фигней :(
Если делать нижнюю часть скайсферы не серым, а цвета неба - то этот низ не будет меняться во время смены суток, т.е. ночью будет голубой/фиолетовый
Название: Re: Нижний цвет неба
Отправлено: xanser от Январь 10, 2015, 09:35:06 am
А у меня вот так на высоте 1000. По-моему у тебя просто маловато воды, серая фигня определяет уже уровень ниже горизонта.

(http://s6.postimg.org/bofe7zlkx/scr_20150110062917788.jpg)
Название: Re: Нижний цвет неба
Отправлено: Shagg_E от Январь 10, 2015, 03:26:43 pm
У тебя просто дистанция прорисовки большая. Серая фигня появляется при небольшой.
В том то и дело, что хотелось бы сохранить небольшую дистанцию: когда падаешь с большой высоты, малая дальность видимости сглаживает небольшую игровую территорию.
Название: Re: Нижний цвет неба
Отправлено: GeniusZ от Январь 15, 2017, 01:31:05 pm
Кстати, под углом камеры это очень заметно.
Название: Re: Нижний цвет неба
Отправлено: Shagg_E от Январь 15, 2017, 02:47:09 pm
Кстати, под углом камеры это очень заметно.
Да во многих моментах это заметно, нужно найти адреса памяти этого цвета RGB и динамически записывать туда цвет второй половины неба. Увы, я только в последний год начал активно изучать IDA, но сейчас занят MMS, поэтому хз, когда к этому приступлю..
Название: Re: Нижний цвет неба
Отправлено: DK от Январь 23, 2017, 08:30:12 pm
Искать надо в местах, где вызывается отрисовка прямоугольника с градиентом.
Название: Re: Нижний цвет неба
Отправлено: GeniusZ от Январь 27, 2017, 02:56:02 pm
Вот здесь надо смотреть:  CClouds::RenderBackground(short, short, short, short, short, short, short)
Название: Re: Нижний цвет неба
Отправлено: GeniusZ от Февраль 11, 2017, 07:53:29 am
Написал такой патч:
Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class SkyPatch {
  7. public:
  8.          static CRGBA ColorHooked;
  9.  
  10.          static void CSpriteDrawAnyRect(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA* color1, CRGBA* color2, CRGBA* color3, CRGBA* color4)
  11.         {      
  12.                 ColorHooked = *color4;
  13.  
  14.                 CSprite2d Temp;
  15.                 Temp.DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, *color1, *color2, *color3, *color4);
  16.         }
  17.  
  18.         SkyPatch() {
  19.                 patch::RedirectCall(0x53F949, CSpriteDrawAnyRect);
  20.  
  21.                 patch::SetPointer(0x53F3B8, &ColorHooked);
  22.                 patch::SetPointer(0x53F3BD, &ColorHooked);
  23.                 patch::SetPointer(0x53F3CA, &ColorHooked);
  24.                 patch::SetPointer(0x53F3CF, &ColorHooked);
  25.  
  26.                 patch::SetPointer(0x53F452, &ColorHooked);
  27.                 patch::SetPointer(0x53F45D, &ColorHooked);
  28.                 patch::SetPointer(0x53F462, &ColorHooked);
  29.                 patch::SetPointer(0x53F46D, &ColorHooked);
  30.  
  31.                 patch::SetPointer(0x53F5EC, &ColorHooked);
  32.                 patch::SetPointer(0x53F5F1, &ColorHooked);
  33.                 patch::SetPointer(0x53F5F6, &ColorHooked);
  34.                 patch::SetPointer(0x53F5FB, &ColorHooked);
  35.     }
  36. } skyPatch;
  37.  
  38. CRGBA SkyPatch::ColorHooked = { 0, 0, 0, 0 };
Все бы ничего, если не появилось теперь это:
(http://i89.fastpic.ru/thumb/2017/0211/c8/28dff8652cd631bebe4e5ba8ea83bcc8.jpeg) (http://fastpic.ru/view/89/2017/0211/28dff8652cd631bebe4e5ba8ea83bcc8.jpg.html) (http://i89.fastpic.ru/thumb/2017/0211/08/0d2ef698eeca146d29069cc224fb1e08.jpeg) (http://fastpic.ru/view/89/2017/0211/0d2ef698eeca146d29069cc224fb1e08.jpg.html) (http://i89.fastpic.ru/thumb/2017/0211/db/c509c7165b78748d214475880bd9eddb.jpeg) (http://fastpic.ru/view/89/2017/0211/c509c7165b78748d214475880bd9eddb.jpg.html)
Название: Re: Нижний цвет неба
Отправлено: Shagg_E от Февраль 11, 2017, 10:37:20 pm
Круто! Но я не очень понимаю, как это работает: почему так много адресов для патча?

По поводу глюков на скрине - это норма(раньше вместо голубого оно было бы серым): исправляется настройкой ID флагов. Некоторые объекты придется прописать в object.dat. Наверное, для обычной игры заморачиваться с исправлением объектов не стоит(слишком многое придется исправлять), а вот для отдельных глобалок этот патч очень даже подойдет.
Название: Re: Нижний цвет неба
Отправлено: GeniusZ от Февраль 12, 2017, 06:47:56 am
Круто! Но я не очень понимаю, как это работает: почему так много адресов для патча?

Суть в том, что я заменяю аргументы функции на перехваченный цвет неба.

Но все-таки решил, что в интерьерах лучше не активировать патч:
Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class SkyPatch {
  7. public:
  8.          static CRGBA ColorHooked;
  9.  
  10.          static void CSpriteDrawAnyRect(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA* color1, CRGBA* color2, CRGBA* color3, CRGBA* color4)
  11.         {      
  12.                 ColorHooked = *color4;
  13.  
  14.                 CSprite2d Temp;
  15.                 Temp.DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, *color1, *color2, *color3, *color4);
  16.         }
  17.  
  18.          static void CSpriteDrawAnyRectHooked(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA* color1, CRGBA* color2, CRGBA* color3, CRGBA* color4)
  19.          {
  20.                  CSprite2d Temp;
  21.  
  22.                  if (*(int*)0x978810) //nCurrentInterior
  23.                          Temp.DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, *color1, *color2, *color3, *color4);
  24.                  else
  25.                          Temp.DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, ColorHooked, ColorHooked, ColorHooked, ColorHooked);
  26.          }
  27.  
  28.         SkyPatch() {
  29.                 patch::RedirectCall(0x53F949, CSpriteDrawAnyRect);
  30.                 patch::RedirectCall(0x53F437, CSpriteDrawAnyRectHooked);
  31.                 patch::RedirectCall(0x53F590, CSpriteDrawAnyRectHooked);
  32.                 patch::RedirectCall(0x53F63B, CSpriteDrawAnyRectHooked);
  33.     }
  34. } skyPatch;
  35.  
  36. CRGBA SkyPatch::ColorHooked = { 0, 0, 0, 0 };
Название: Re: Нижний цвет неба
Отправлено: DK от Февраль 12, 2017, 11:46:41 am
CSprite2d::DrawAnyRect - это статический метод. Для вызова не требуется обьект CSprite2d, можно вызывать так:
Код: C++
  1. CSprite2d::DrawAnyRect (x1, y1, x2, y2, x3, y3, x4, y4, color1, color2, color3, color4);

Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class SkyPatch {
  7. public:
  8.     static CRGBA ColorHooked;
  9.  
  10.     static void MySpriteDrawAnyRect(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA& color1, CRGBA& color2, CRGBA& color3, CRGBA& color4) {
  11.         ColorHooked = color4;
  12.         CSprite2d::DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, color1, color2, color3, color4);
  13.     }
  14.  
  15.     static void MySpriteDrawAnyRectHooked(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA& color1, CRGBA& color2, CRGBA& color3, CRGBA& color4) {
  16.         if (*(int*)0x978810) //nCurrentInterior
  17.             CSprite2d::DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, color1, color2, color3, color4);
  18.         else
  19.             CSprite2d::DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, ColorHooked, ColorHooked, ColorHooked, ColorHooked);
  20.     }
  21.  
  22.     SkyPatch() {
  23.         patch::RedirectCall(0x53F949, MySpriteDrawAnyRect);
  24.         patch::RedirectCall(0x53F437, MySpriteDrawAnyRectHooked);
  25.         patch::RedirectCall(0x53F590, MySpriteDrawAnyRectHooked);
  26.         patch::RedirectCall(0x53F63B, MySpriteDrawAnyRectHooked);
  27.     }
  28. } skyPatch;
  29.  
  30. CRGBA SkyPatch::ColorHooked = { 0, 0, 0, 0 };
Название: Re: Нижний цвет неба
Отправлено: xanser от Август 01, 2019, 11:46:42 am
Дополнение:
Есть предел прорисовки верхнего цвета неба на высоте 3000.0. Если нужно разместить локацию выше с сохранением привычного отображения цвета, то это меняется в адресе 0x69950C. Актуально для "параллельных миров". Может быть наоборот захочется увидеть другое небо без мелькающих остатков синего, тогда стоит отключить вызов функции 0x4A600B