Автор Тема: Океан 10000x10000 (Реализовано)  (Прочитано 12329 раз)

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Океан 10000x10000 (Реализовано)
« : Февраль 23, 2014, 08:57:49 pm »
То, что я вижу сложно назвать океаном. Прорисовка внутренней воды ограничена по расстоянию, внешний периметр образует заметные углы. Хотелось бы наблюдать воду до горизонта, хотя бы до границ скайбокса, точнее сферы. Думаю реально расширить внешний периметр и увеличить дисстанцию прорисовки внутреннего. Речь не идет о плавании, только о видимости.

« Последнее редактирование: Февраль 28, 2014, 04:20:30 pm от xanser »

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Океан 10000x10000
« Ответ #1 : Февраль 23, 2014, 09:55:33 pm »
Интересно какой код за это отвечает, может быть CWorld класс, уж глубже надо исследователь это дело.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Океан 10000x10000
« Ответ #2 : Февраль 25, 2014, 04:49:52 pm »
Все оказалось не сложно, если поискать. Оказывается внешний периметр состоит из пяти уровней воды по 256, можно его отодвинуть и заполнить еще уровнями.
Думаю мозаика близка к завершению. Вид из стратосферы.


Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Океан 10000x10000
« Ответ #3 : Февраль 26, 2014, 04:29:20 pm »
Вроде бы получилось.



Код: C++
  1. BYTE  * WaterDraw  = (BYTE *)  0x5C1710;        // блок рисования внешней воды
  2. float   WaterShift;                             // замена переменной сдвига внешней воды
  3.  
  4. void ProtectBYTE(BYTE *Address, BYTE Value)
  5. {
  6.         DWORD OldProtect;       VirtualProtect(Address,sizeof(BYTE),PAGE_READWRITE,&OldProtect);
  7.         *Address = Value;       VirtualProtect(Address,sizeof(BYTE),OldProtect,&OldProtect);
  8. }
  9.        
  10. void ProtectDWORD(DWORD *Address, DWORD Value)
  11. {
  12.         DWORD OldProtect;       VirtualProtect(Address,sizeof(DWORD),PAGE_READWRITE,&OldProtect);
  13.         *Address = Value;       VirtualProtect(Address,sizeof(DWORD),OldProtect,&OldProtect);
  14. }
  15.        
  16. void LoadWater()
  17. {
  18.         BYTE WaterLines = 40;                                           // дополнительные линии внешней воды, добавляются к 5-ти стандартным
  19.         WaterShift = WaterLines*256+2048;                               // сдвиг внешней воды
  20.  
  21.         ProtectDWORD((DWORD*)(WaterDraw+0x9F4), (DWORD)&WaterShift);    // сдвиг северной и южной на запад
  22.         ProtectDWORD((DWORD*)(WaterDraw+0xA41), (DWORD)&WaterShift);    // сдвиг южной на юг
  23.         ProtectDWORD((DWORD*)(WaterDraw+0xC0B), (DWORD)&WaterShift);    // сдвиг северной на север
  24.         ProtectDWORD((DWORD*)(WaterDraw+0xE2B), (DWORD)&WaterShift);    // сдвиг западной на запад
  25.         ProtectDWORD((DWORD*)(WaterDraw+0x100F),(DWORD)&WaterShift);    // сдвиг восточной на восток
  26.         ProtectBYTE(WaterDraw+0xDCB, WaterLines*2+26);                  // пересчет линий внешней воды севера и юга дополнительно на востоке
  27.         ProtectBYTE(WaterDraw+0x11D1,WaterLines+5+8);                   // пересчет линий внешней воды запада и востока, 8 - заполнение внешней водой центра
  28.         ProtectBYTE(WaterDraw+0xDC1, WaterLines+5);                     // пересчет линий внешней воды севера и юга
  29.  
  30. //      *(float *) 0x69CC58 = 0;        // по умолчанию 400, вся вода сдвинута на запад на 400, можно вернуть в центр в 0
  31.  
  32. }

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Океан 10000x10000
« Ответ #4 : Февраль 26, 2014, 04:53:05 pm »
По моему это гениально! Как долго возился с данной задачей?

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Океан 10000x10000
« Ответ #5 : Февраль 26, 2014, 04:57:58 pm »
Три последних дня, в воскресенье это была только идея, хотя возникла она очень давно, но не хватало знаний.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Океан 10000x10000
« Ответ #6 : Февраль 26, 2014, 05:06:27 pm »
Код: C++
  1. .text:005C1710                                                     ; CWaterLevel::RenderWater(void)

Вот эту функцию бы в сорцы переписать, было бы отлично.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Океан 10000x10000
« Ответ #7 : Февраль 26, 2014, 05:23:56 pm »
Кстати есть предположение, но это пока только догадки, что тут указатель на текстуру:

Код: ASM
  1. .text:005C291B 0C0 A1 8C 85 97 00                                                  mov     eax, ds:dword_97858C
  2. .text:005C2920 0C0 50                                                              push    eax
  3. .text:005C2921 0C4 68 C0 3B 93 00                                                  push    offset qword_933BC0

И скорее всего, возможно этот:

Код: ASM
  1.  mov  eax, ds:dword_97858C

Но могу ошибаться тут уже надо пробовать, на живую...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Океан 10000x10000
« Ответ #8 : Февраль 27, 2014, 07:33:09 pm »
Я немного схитрил, и заполнил внутренние дырки внешней водой. Разницы не видно, но я заметил, что вроде бы подводные объекты пропадают. А внутренняя вода рисуется в радиусе игрока, поэтому там реальные дырки по углам, надо дальше копать, чтобы их залепить по-нормальному.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Океан 10000x10000
« Ответ #9 : Февраль 28, 2014, 04:20:09 pm »
Все, я доделал окончательно. В моем варианте были строки:

Код: C++
  1. ProtectBYTE(WaterDraw+0x11D1,WaterLines+5+8);           // пересчет линий внешней воды запада и востока
  2. ProtectBYTE(WaterDraw+0xDC1, WaterLines+5);             // пересчет линий внешней воды севера и юга

WaterLines это дополнительные внешние линии
+5 это стандартные внешние линии
+8 это дополнительные внешние линии, временно закрывающие центр, теперь я их убрал и расширил видимость центральной части, которая была ограничена радиусом камеры 2000

Код: C++
  1. *(float*)0x69CD7C = 10000;
  2. *(float*)0x69CD80 = 10000;

В итоге весь пазл сложился



Ну и наконец итог, которого я ждал 7 лет, прекрасный вид океана!

« Последнее редактирование: Март 02, 2014, 08:38:13 pm от xanser »

Оффлайн GHOST

  • Прохожий
  • *
  • Сообщений: 73
  • Репутация: +14/-0
  • RUS-CASA (2008 - 2010)
    • Просмотр профиля
Re: Океан 10000x10000 (Реализовано)
« Ответ #10 : Февраль 28, 2014, 10:00:30 pm »
xanser мм.. будет ли это в общем доступе для всех.. ?  :o
Друга нельзя купить, но его можно продать...

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Океан 10000x10000 (Реализовано)
« Ответ #11 : Февраль 28, 2014, 10:10:23 pm »
Цитировать
Ну и наконец итог, которого я ждал 7 лет

7 лет, не чего себе, а что в этом помогло тебе разобраться?

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Океан 10000x10000 (Реализовано)
« Ответ #12 : Март 01, 2014, 05:58:45 am »
Не знал с какого боку подойти. Материалы этого сайта подтолкнули что-то изучать, разбирать ассемлерный код, конечно я только в начале этого пути, и больше на интуиции пока, но уже что-то начало получаться. Я тут переписал код без замены переменных, а только заменой значений, сохранив алгоритм самой игры

Код: C++
  1. void ProtectBYTE(BYTE *Address, BYTE Value) {
  2.         DWORD OldProtect;       VirtualProtect(Address,sizeof(BYTE),PAGE_READWRITE,&OldProtect);
  3.         *Address = Value;       VirtualProtect(Address,sizeof(BYTE),OldProtect,&OldProtect);
  4. }
  5. void LoadWater() {
  6.         BYTE * WaterRender = (BYTE *) 0x5C1710;                 // функция рендера воды
  7.         if  (* WaterRender == 0xDE)  WaterRender += 0x20;       // VC 1.1
  8.         BYTE   WaterLines  = 40;                                // количество линий внешней воды 5
  9. //      *(float *)0x69CC58 = 0;                                 // сдвиг всей воды на запад 400
  10.         *(float *)0x69CD7C = 10000;                             // радиус видимости внутренней воды ниже 60 метров (z-15)*800*0.022+1200
  11.         *(float *)0x69CD80 = 10000;                             // радиус видимости внутренней воды выше 60 метров 2000
  12.         *(float *)0x69CDCC = WaterLines*256;                    // сдвиг на количество внешней воды 1280 = 5*256
  13.         ProtectBYTE(WaterRender+0xDC1, WaterLines);             // количество внешней воды севера и юга
  14.         ProtectBYTE(WaterRender+0xDCB,(WaterLines-5)*2+26);     // расширение внешней воды севера и юга на восток
  15.         ProtectBYTE(WaterRender+0xDD3, WaterLines);             // сдвиг внешней воды запада и востока на север
  16.         ProtectBYTE(WaterRender+0x11D1,WaterLines);             // количество внешней воды запада и востока
  17.         ProtectBYTE(WaterRender+0x11DB,WaterLines+16);          // расширение внешней воды запада и востока на север
  18. }

Можно также убрать дырки под островами программой WaterEditor, нарисовав полностью черную текстуру, мне кажется они вообще не нужны, кстати появятся птицы над землей.



xanser мм.. будет ли это в общем доступе для всех.. ?  :o

Берите этот код в свои моды, ну или могу скомпилировать в отдельную asi-шку
« Последнее редактирование: Март 02, 2014, 02:26:20 pm от xanser »

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Океан 10000x10000 (Реализовано)
« Ответ #13 : Март 01, 2014, 04:22:43 pm »
Я постараюсь прикладывать больше усилий, на то что-бы выпускать знания по моддингу. Сейчас на данный момент конечно же и нелегкое положение у меня с финансами. Но имейте введу, что сайт я не когда не брошу и не закрою, я его хорошо оплачиваю и пока отлично удерживаю. Ведь много раз были случаи, когда разрабатывался какой-то мод и потом когда людей начала прижимать жизнь и они шли уже работать, и вскоре сайт с модом становился заброшенным и все. Так вот я такого с этим сайтом не допущу впереди постоянно будут выходить новые материалы и много другого.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Океан 10000x10000 (Реализовано)
« Ответ #14 : Март 01, 2014, 08:26:36 pm »
Sektor, подумай, как можно расширить аудиторию, привлечь пользователей, разместить ссылки на таких сайтах как gtaforums и в плане финансирования сайта можно снять с тебя хотя бы частично это бремя, рассмотреть варианты финансовой поддержки сайта, получается ты делаешь работу для всех и сам один за это платишь.