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

Full Version: Вопросы по моддингу
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Ты поставил хук, на место добавления золота при настроенном граале. Поэтому лучше вместо установки
сделать добавление
При этом, насколько я понимаю, если грааль не построен, то и золота от твоего хука не прибавится
igrik, то пробный скрипт, поэтому записывал сразу значение 5000, позже изменил на +5000, чтоб проверить работает ли. Хук установлен на адрес с уже окончательным доходом, вроде подсчитывает правильно и с граалью и без.

Тут на дф2 нашел запись по структурам монстров и героев, а вот по городу ничего найти не могу, не знаю от куда прочитать тип города и построенные в нем строения
Хук поставлен правильно.
Структура города (из исходников ВоГ):
Code:
// Замки
// 6971F0 (18h*9[число типов городов])
// 6A60B0 ()
//
// + 24h dw * 8  = количество доступных для найма монстров
// +150h dd + dd = постройки
// 0 01 -  0 Гильдия магов ур 1
//   02 -  1 2
//   04 -  2 3
//   08 -  3 4
//   10 -  4 5,?(6,7)
//   20 -  5 таверна
//   40 -  6 верфь(0,4,7,8),?(1,2,3,5,6)
//   80 -  7 форт (+ слева картинка)
// 1 01 -  8 цитадель (+)
//   02 -  9 замок (+)
//   04 - 10 управа (+)
//   08 - 11 префектура (+)
//   10 - 12 муниципалитет (+)
//   20 - 13 капитолий (+)
//   40 - 14 рынок
//   80 - 15 хранилище ресурсов
// 2 01 - 16 кузница
//   02 - 17 маяк(0),таинств.пруд(1),торг.арт.(2,5,8),?(3),вуаль тьмы(4),
//           чер.ход(6),кл.бог.войны(7)
//   04 - 18 баст.гриф.(0-3),гильд горн.(1-2),крылья воятеля(2-2),инкуб(3-1),
//           взрыт.мог.(4-1),гриб.кольца(5-1),стол(6-1),кв.капитана(7-1),сад жизни(8-1)
//   08 - 19 баст.гриф.+(0-3+),гильд горн.(1-2+),крылья воятеля(2-2+),инкуб(3-1+),
//           взрыт.мог.(4-1+),гриб.кольца(5-1+),стол(6-1+),кв.капитана(7-1+),сад жизни(8-1+)
//   10 - 20 ?(0,1,2,3,4,5,6,7,8)
//   20 - 21 конюшни(0),фонтан уд(1),см.башня(2),сер.тучи(3),ус.ч.магии(4),
//           водов.маны(5),гил.н.раб(6),знаки страха(7),ун.магии(8)
//   40 - 22 бр.меча(0),сокровищ(1),библ(2),врата замка(3),преобр.ск(4),
//           портал выз(5),дв.балист(6),обелиск крови(7),?(8)
//   80 - 23 ?(0,1,4,7,8),стена зн.(2),орден огня(3),ак.б.иск(5),храм волх(6)
// 3 01 - 24 ?(0,2,4,5,6,7,8),мол.дендр(1-5),клетки(3-3)
//   02 - 25 ?(0,2,4,5,6,7,8),мол.дендр(1-5+),клетки(3-3+)
//   04 - 26 грааль
//   08 - 27 ?(x)
//   10 - 28 ?(x)
//   20 - 29 ?(x)
//   40 - 30 жил 1  (x-1)
//   80 - 31 жил 2  (x-2)
// 4 01 - 32 жил 3  (x-3)
//   02 - 33 жил 4  (x-4)
//   04 - 34 жил 5  (x-5)
//   08 - 35 жил 6  (x-6)
//   10 - 36 жил 7  (x-7)
//   20 - 37 жил 1+ (x-1+)
//   40 - 38 жил 2+ (x-2+)
//   80 - 39 жил 3+ (x-3+)
// 5 01 - 40 жил 4+ (x-4+)
//   02 - 41 жил 5+ (x-5+)
//   04 - 42 жил 6+ (x-6+)
//   08 - 43 жил 7+ (x-7+)
// +158h dd + dd = модификаторы и производители существ
// теже жилища
// 0 80 - форт слева картинка
// 2 08 - "Инкубатор"
// 3 40 - "Бесы" карт
//   80 - "Гоги"
// 4 01 - "Адские Гончие"
//   02 - "Демоны"
//   04 - "Порождение Зла"
//   08 - "Эфриты"
//   10 - "Дьяволы"
//   20 - + "Черти" ("Бесы")
//   40 - + "Магоги" ("Гоги")
//   80 - + "Церберы" ("Адские Гончие")
// 5 01 - + "Рогатые Демоны" ("Демоны")
//   02 - + "Адские Отродья" ("Порождение Зла")
//   04 - + "Султаны Эфритов" ("Эфриты")
//   08 - + "Архидьяволы" ("Дьяволы")

struct _CastleSetup_{
  Byte   Number;        //* +0 0,1,2,...
  char   Owner;         //*O +1 0,...
  char   BuiltThisTurn; // +2 - уже строили в этот турн (0-нет, 1-да, 2-не наш город)
  Byte  _u2;            //* +3 0
  Byte   Type;          //*T +4 0,1...,8
  Byte   x;             //* +5
  Byte   y;             //* +6
  Byte   l;             //* +7
  Byte   Pos2PlaceBoatX;//* +8 помещать лодку при покупки в Shipyard
  Byte   Pos2PlaceBoatY;//* +9
  Byte  _uAa[2];        // +0A
  int    IHero;         //* +0Ch = номер героя внутри города (-1 - никого нет)
  int    VHero;         //* +10h = номер героя снаружи города (-1 - никого нет)
  char   MagLevel;      //*G +14h = уровень магической гильдии в городе (исп. AI для постройки)
  Byte  _u15;
  Word   Monsters[2][7];//*M- +16h ко-лво простых и апгрейднутых
  char  _u32;           //*- +32 = ?
  char  _u33;           //* +33 = 1
  char  _u34;           //* +34 = 0
  Byte  _u35a[3];
  int   _u38;           //* +38 = -1
  int   _u3C;           //* +3C = -1
  short _u40;           //*- +40
  Word  _u42;           //  +42
  int    Spels[5][6];   //*G- +44 сами заклинания
  char   MagicHild[5];  //*G- +BCh = колво заклинаний в уровне гильдии
  Byte  _uC1[3];
  char  _uC4;           //* +C4 = 0
  Byte  _uC5[3];
  _AMes_ Name;          //*N +C8 -> Имя города
  int   _u8[3];         //* +D4 = 0
  Dword  GuardsT[7];    //*M +E0 = охрана замка
  Dword  GuardsN[7];    //*M +FC = кол-во охраны
  Dword  GuardsT0[7];   //*M- +118 = охрана замка
  Dword  GuardsN0[7];   //*M- +134 = кол-во охраны
  Byte   Built[8];      //*B +150h = уже построенные здания (0400)
  Byte   Bonus[8];      //*B +158h = бонус на существ, ресурсы и т.п., вызванный строениями
  Dword  BMask[2];      //*B- +160h = маска доступных для строения строений
};
Всё таки хук поставлен не правильно. Потому что в этом месте уже не получить структуру города внутри этой функции, и поэтому ни номер города на карте, ни его тип.
Хук нужно ставить в 0x005BFA68.
Пока получилась такая штука:

Стабильно вылетает в первую неделю, хотя после того как переустановил героев вылетают подряд все скрипты, и старые и новые, может кто-нибудь проверить у себя на вылеты?

Единственное, не могу понять, почему тип города определяется только на карте, если клацнуть на замок, а в экране города значение всегда 0, как и при передаче хода.

igrik, только прочитал твое сообщение, сейчас попробую.
igrik, да, насчёт структуры города ты прав. Не заметил, что значение затирается.
igrik, твой скрипт работает на ура, спасибо. Еще раз посмотрел в ИДЕ, увидел, что уже при проверке на хранилище ресурсов используется esi.

gamecreator, спасибо за структуру города.
Подскажите, человеку вообще слабознакомому с С++.
Как это (хоть и работающее) безобразие привести к нормальному виду. А еще лучше оранизовать в функцию и показать способ вызова этой функции, которая будет возвращать адрес структуры активного стека. И еще желательно не через __thiscall.
Code:
char* combatManager = (char*)(*((int*)0x699420));  // это this_

int j = *(int*)(this_ + 78524);       // номер активного стека текущей стороны 0 ... 20
int i = *(int*)(this_ + 78520);       // номер активной стороны
int v3 = i * 14 + i * 7 + j;          // переход к номеру стека 0 ... 41
int v1 = v3 * 1352;                   // длина структуры одного стека
int v2 = *(int*)(this_ + 21708 + v1); // получить структуру стека
Что подразумевается под нормальным видом? Потому что лично для меня нормальным было бы подобное:
Code:
CombatManager *cm = *(CombatManager**)0x699420;
BattleStack activeStack = cm->stack[cm->currentSide][cm->currentSideStack];
Но к такому виду приводить долго и нудно.
И зачем здесь функция?
Code:
void* __stdcall getActiveStackAddress () {
  char* combatManager = (char*)(*((int*)0x699420));  // это this_

  int j = *(int*)(this_ + 78524);       // номер активного стека текущей стороны 0 ... 20
  int i = *(int*)(this_ + 78520);       // номер активной стороны
  int v3 = i * 14 + i * 7 + j;          // переход к номеру стека 0 ... 41
  int v1 = v3 * 1352;                   // длина структуры одного стека
  int v2 = *(int*)(this_ + 21708 + v1); // получить структуру стека
  return (void*) v2;
}


Если возвращать адрес нужно как целое число, то просто return v2; и int __stdcall getActiveStackAddress .
igrik, у тебя же есть человеческие заголовочники из HD.
o_BattleMgr->GetCurrentStack();
Есть конечно, но далеко не всегда врубаюсь как их использовать.
И еще один вопрос. Как через патчер вызвать например такую функцию

Чёто не компилируется. Пишет "результатом вычисления фрагмента не является функция, принимающая 0 аргументов" Visual C++ 2008
Code:
CALL_2(int, __thiscall, 0x5AF4E0(), 0x6A3D90, 0);
У тебя скобки после адреса. Я ничего не понимаю в патчере, но предполагаю, что должно быть так:
Code:
CALL_2(int, __thiscall, ((void*)0x5AF4E0), ((void*)(*(int*)0x6A3D90)), 0);
Ведь по адресу 0x6A3D90 у тебя не this, а указатель на него. Иначе зачем UN:C?
не совсем:
Code:
CALL_2(int, __thiscall, 0x5AF4E0, *(int*)0x6A3D90, 0);
оно все равно все в int приводит
Code:
#define CALL_2(return_type, call_type, address, a1, a2) \
((return_type (call_type *)(_dword_,_dword_))(address))((_dword_)(a1),(_dword_)(a2))


кстати, чтобы не запускать калькулятор, можно и
Code:
CALL_2(int, __thiscall, 5960928, *(int*)6962576, 0);

   :D
Мне нужно в меню выбора кампаний SoD отключить некоторые окна, выглядеть должно так:
Image: 8274307.jpg

Для начала хочу презентовать 1 кампанию, другие должны быть заблокированы.
Наверняка можно сделать это подобием таких команд:

Quote:сместить кнопки далеко за пределы экрана: для бин файла
; кнопка "Синглплеер"
63E6B0 FFFD
; кнопка "Мультиплеер"
63E6B8 FFFD
; кнопка "Обучение"
63E6C8 FFFD
; кнопка "Во имя богов"
456C6C AAAA
; кнопка "Клинок Армагедона"
456CE6 AAAA
; кнопка "Возраждение Эратии"
63BBF0 AAAA
; кнопка "Выбрать"
63BBF8 AAAA

Кто может помочь?

p.s Оставшиеся 3 окна тоже бы отключить.
Reference URL's