Wake of Gods Forum | Форум Во Имя Богов

Full Version: Вопросы по моддингу
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Quote:Можно ли добавить несколько новых почв в герои (так, чтобы у замка, оплота и сопряжения у каждого была своя трава, например)?
Предположим, нет.

Quote:И можно ли менять почву на клетках карты уже во время игры?
Да.

Quote:И какой формат у клеток почвы? То есть, в редакторе карт сделать почву размером 1 на X сделать невозможно, минимальный размер по любому направлению 2. Если менять вручную, это будет также?
Нет.

Quote:И что на деле происходит в тех клетках, где рисунок почвы идет по диагонали? Внутри там одно значение или два?
Нет. Одно, конечно, в дефы глянь.

//------------------------------------------------------
Quote:2) Как можно изменить параметры вторичных навыков?
Если без подробностей - вот здесь адреса http://forum.df2.ru/index.php?showtopic=6139

Quote:3) Началась игра, загрузилась карта. Как получить ее адрес, адрес клетки на карте?
У тебя чтоль чужих исходников нет?
Quote:У тебя чтоль чужих исходников нет?
Исходников? О_о
Каких?
У меня есть дизассемблированная база под IDA, но во-первых, что-либо найти в ней очень затруднительно, если не знаешь базового адреса, где искать (то есть подходит только, чтобы что-то уточнять), во-вторых, как я понимаю, карта создается в динамической памяти и в иде ее быть не может.
За ответы спасибо, ссылка
Quote:http://forum.df2.ru/index.php?showtopic=6139
очень годная.
Quote:Исходников? О_о
Каких?
WoG, сергроевская база, HD где-то был, декомпилят по сергрожевской базе.

Quote:У меня есть дизассемблированная база под IDA, но во-первых, что-либо найти в ней очень затруднительно, если не знаешь базового адреса, где искать (то есть подходит только, чтобы что-то уточнять
если это готовая - по названиям ищи

Quote:во-вторых, как я понимаю, карта создается в динамической памяти и в иде ее быть не может.
вкладку Structs нажми в сергробазе.




Энивей:

Quote:3) Началась игра, загрузилась карта. Как получить ее адрес, адрес клетки на карте?

Адвенчаменеджер
Code:
#define o_AdvMgr (*(_AdvMgr_**)0x6992B8)
В нем
Code:
..
_GameMap_* map; //+92 (десятичное)
..

Или

Игроменеджер
Code:
#define o_GameMgr (*(_GameMgr_**)0x699538)

В нем:
Code:
..
  _MapHeader_ map_header; // +1F86Ch
  _GameMap_ Map; // +1FB70h
..

Теперь:

Code:
NOALIGN struct _GameMap_ : public _Struct_
{
  // Список шаблонов объектов карты.
  _List_<_Template_> Templates; // +0
  // Список объектов на карте.
  _List_<_Object_> Objects; // +16
  
  _byte_ f20[128]; // +32
  
  // Список лагерей героя на карте.
  _List_<_PlaceHolder_> PlaceHolders; // +160
  
  _byte_ fB0[32]; // +176
  
  // Адрес 3-мерного массива [L][Y][X], хранящего свойства объекта каждой клетки карты.
  _MapItem_* items; // +208
  // Размер карты (по-горизонтали и по-вертикали).
  _int_ size; // +212
  // Есть ли у карты подземный уровень.
  _bool8_ has_underground; // +216
  
  _byte_ fD9[3715]; // +217
  
  
  //normal
  // Получение клетки по координатам (из массива items).
  inline _MapItem_* GetItem(_int_ x, _int_ y, _int_ z)
  {
     return CALL_4(_MapItem_*, __thiscall, 0x4086D0, this, x, y, z);
  }
};

Или, если надо чистую UN:C реализацию - вот исходник этой 0x4086D0

Code:
//----- (004086D0) --------------------------------------------------------
int __thiscall GetMapItemPoByXY(int this, int a2, int a3, int a4)
{
  return *(_DWORD *)(this + 208) + 38 * (a2 + *(_DWORD *)(this + 212) * (a3 + a4 * *(_DWORD *)(this + 212)));
}

Теперь сама _MapItem_


Code:
NOALIGN struct _MapItem_ : public _Struct_
{
_dword_  setup; //+0
_byte_  land; // +4
_byte_  land_type;//+5
_byte_  river;//+6
_byte_  river_type;//+7
_byte_  road;//+8
_byte_  road_type;//+9
_word_  field_0A;//+10
_byte_  mirror;//+12
_byte_  attrib;//+13
_word_  field_0E_bits;//+14
_word_  field_10;//+16
_dword_  draw;//+18
_dword_  draw_end;//+22
_dword_  draw_end_2;//+26

_dword_  object_type;//+30

_word_  os_type; //+34
_word_  draw_num;//+36
}


Quote:1) Подскажите, как поправить Horde Growth. Оказалось, что этот параметр в CRTRAITS.TXT не влияет на игру. О_о

Code:
// 642E30: using guessed type int HordeBuildings[4];
..
// 6887F0: using guessed type _HordeBuildingData_ TownHordeBuildings[18];
Code:
00000000 _HordeBuildingData_ struc ; (sizeof=0x10)
00000000 Monster             dd ?
00000004 Count               dw ?                                    ; base 10
00000006 Level               dw ?                                    ; base 10
00000008 UpgMonster          dd ?
0000000C UpgCount            dw ?                                    ; = Level + 7
0000000E UpgLevel            dw ?                                    ; base 10
00000010 _HordeBuildingData_ ends
Огромное спасибо!
Буду разбираться.

UPDATE: Hordes заработали. Правда для чего нужно
using guessed type int HordeBuildings[4],
я не понял. Работает без него.
#define o_GameMgr (*(_GameMgr_**)0x699538)
Я не понимаю, что делать с вот этим вот.
Вот мой код:
Quote:int ptr;
int result = ReadProcessMemory(_handle, LPCVOID(6919480), &ptr, 4, (SIZE_T*)&_readBytes);
int ptr2;
result = ReadProcessMemory(_handle, LPCVOID(ptr), &ptr2, 4, (SIZE_T*)&_readBytes);
int mapSize;
result = ReadProcessMemory(_handle, LPCVOID(ptr2 + 129904 + 212), &mapSize, 4, (SIZE_T*)&_readBytes);
Что я делаю не так?
Code:
int advManager;
int result = ReadProcessMemory(_handle, LPCVOID(0x699538), &advManager, 4, (SIZE_T*)&_readBytes);
int gameMap;
result = ReadProcessMemory(_handle, LPCVOID(ptr+0x1FB70), &gameMap, 4, (SIZE_T*)&_readBytes);
int mapSize;
result = ReadProcessMemory(_handle, LPCVOID(ptr2 + 212), &mapSize, 4, (SIZE_T*)&_readBytes);

При этом, если делать из-под процесса игры, лучше использовать

Code:
int advManager = *(int*)0x699538;
int gameMap= *(int*)(advManager+0x1FB70);
int mapSize= *(int*)(gameMap+212);
или говнокодом
Code:
int mapSize = *(int*)((*(int*)((*(int*)0x699538)+0x1FB70))+212);

А еще лучше структуры, своеописанные или готовый заголовочник
Спасибо! Код игроменеджера у меня не заработал, заработал следующий через адвенчерменеджер:
Quote:int advManager;
ReadProcessMemory(_handle, LPCVOID(0x6992B8), &advManager, 4, (SIZE_T*)&_readBytes);
int gameMap;
ReadProcessMemory(_handle, LPCVOID(advManager + 92), &gameMap, 4, (SIZE_T*)&_readBytes);
int mapSize;
ReadProcessMemory(_handle, LPCVOID(gameMap + 212), &mapSize, 4, (SIZE_T*)&_readBytes);
Из процесса игры было бы делать проще, но я пока не разобрался с патчером, поэтому прописываю мод при запущенной игре из своего ехе.
Quote:Из процесса игры было бы делать проще, но я пока не разобрался с патчером
зачем патчер?
Ну я использую конфигурацию Heroes 3 Complete Edition + HD Mod, как я понимаю, чтобы модифицировать ехе в данном случае, нужно api патчера использовать, чтобы потом все срослось.
Или в винде можно запустить мой код в процессе игры просто через виндовозное api?

У меня тут еще вопрос появился. Я пока не разобрался, как организовано хранение объектов (героев, замков, существ) и их привязка к карте.
В _MapItem_ есть следующие поля, которые могут иметь к этому отношения:
Dword SetUp; // +0
...
int OType; // +1E
Word OSType; // +22
Как я понял, в первое кидается указатель на нейтральных монстров, если они есть, иначе 0, правильно?
Про последние два в документации ничего толкового не написано и я не нашел какого-то обобщенного типа вроде Object, в котором может содержаться указатель на любой объект (героя, шахту и т.д.)
Есть тип _Types_ для карты, но как я понял, он для препятствий.
В общем, мне нужно из клетки на карте вытащить, стоит ли там монстр, герой, есть ли в ней вход в замок, шахту и получить указатель на этот объект. Для героя, как я понимаю, он потом должен быть приведен к _THero_/_Hero_, для замка к _CastleSetup_.
Или из карты это вытащить нельзя и надо отдельно просматривать список городов и героев?

По структуре _CMonster_
Quote:struct _CMonster_{
unsigned Number :12; // +00 число
unsigned Agression : 5; // +0C 1C-присоединяется, 0A-кровожадное
unsigned NoRun : 1; // +12 не убегает 3.58 fix
unsigned NoMore : 1; // +11 не растет
unsigned SetUpInd : 8; // +13 номер в настройке объектов (P1+44)
unsigned _u1 : 4; // +1B
unsigned HasSetUp : 1; // +1F имеет настройку структуры монстра
};
Непонятны смыслы полей SetUpInd, _u1, HasSetUp. Как из нее получить номер монстра, тот же, что используется CRTRAITS.TXT, а из него параметры монстра?
Quote:Про последние два в документации ничего толкового не написано и я не нашел какого-то обобщенного типа вроде Object, в котором может содержаться указатель на любой объект (героя, шахту и т.д.)
Это тип и подтип объекта.

Quote:Ну я использую конфигурацию Heroes 3 Complete Edition + HD Mod, как я понимаю, чтобы модифицировать ехе в данном случае, нужно api патчера использовать, чтобы потом все срослось.
Совершенно не обязательно. Патчер, в общем-то, нужен только ради удобства написания хуков.
Дллки HD-мод может подгружать и так.
Я понял, что Dword SetUp; // +0 относится только к тому, получают ли игроки за убийство монстра, если на этой клетке монстр, ресурсы.
Самый главный вопрос остается открытым : как получить указатель на тот объект, который лежит в конкретной клетке карты, если в _MapItem_ этого указателя нет?
Допустим, по _MapItem_ стало ясно, что в этой клетке лежит город сопряжение. Как получить указатель на именно то актуальное сопряжение, которое там находится?
Quote:Допустим, по _MapItem_ стало ясно, что в этой клетке лежит город сопряжение. Как получить указатель на именно то актуальное сопряжение, которое там находится?

Code:
inline _int_  FindTownIdByXYZ(_int_ x, _int_ y, _int_ z) {return CALL_4(_int_, __thiscall, 0x4BB530,this, x, y, z);} //номер города по координатам, от gameMgr. И таки да, в оригинале это делается перебором

inline _Town_*  GetTown(_int_ town_id) {return ((_Town_*)(*(_ptr_*)(((_ptr_)this) + 0x21614) + 360 * town_id));} //указатель по номеру
004BB5C0 - номер двеллинга по координатам
Можешь мне скинуть именно те исходники, что у тебя?
У меня опенсорсные Сергея Роженко с ГитХаба : https://github.com/GrayFace/wog
В них нет никакой обобщающей структуры ни геймменеджера, ни адвенчерменеджера (есть только их упоминания), нет тех функций, которые ты скинул.
По тем ссылкам, которые ты приводил ранее, ссылки на исходники битые.
Доброго времени суток,направьте плз.Хочу заменить в башне големов на модели скаченных гномов,подскажите как это сделать не удаляя из игры големов,и где лежат файлы со статами и названиями существ и зданий.Спасибо .
(11.06.2014 20:04)axignom99 Wrote: [ -> ]где лежат файлы со статами и названиями существ и зданий.Спасибо .
советую глянуть http://forum.df2.ru/index.php?showtopic=16223

что до замены без удаления...
ставите ERA
и кидаете ссылку на ваших новых гномов...
сделаем вам мини-мод для удобной замены моделей големов (уточните потом каких именно заменять)
Reference URL's