Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
08 Dec 2015, 21:51
Сообщение
#341
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20605 раз |
Эм, ну должно работать вроде.
|
|
|
|
08 Dec 2015, 21:52
(Сообщение отредактировал igrik - 08 Dec 2015, 22:22)
Сообщение
#342
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
неа, не работает. Код в точности как я приложил в спойлере
upd: вру: хук "hook_YAtrCast" (FireErmEvent(79001)) вызывается дважды, "hook_YAfterShoot" (FireErmEvent(79002)) не вызывается "hook_YAfterStrike" (FireErmEvent(79003)) вызывается единожды (как и должен) Видимо где-то я забокопорил, но я в упор не вижу где * * * * * upd: ми просто жуткая баклашка, я разобрался. по первому - у меня уже был плагин с хуком по этому адресу, поэтому дважды по второму - неправильный адрес хука по третьему - все было ок Но это заняло целый час. Господь в одних носках!!! Все равно мэрси -------------------- |
|
|
|
10 Dec 2015, 17:34
(Сообщение отредактировал feanor - 10 Dec 2015, 17:41)
Сообщение
#343
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20605 раз |
Цитата x3 - кто кастует и описалово как в !!MM: 0 - герой (c вычетом маны и невозможностью каста в этом раунде битвы), 1 - монстр, 2 - арт (зачастую "что попало" в !!MM), 3 - герой (без вычета маны), 4 - герой (без вычета маны + бистро бистро анимация) Там не совсем что попало, там либо имя артефакта с номером, равным номеру спелла, либо Альянс и Доспехи для соответствующих спеллов (прост где ты видишь в параметрах передаваемый номер арта?)я в ТоЕ кастовал так Код void CastArtifactSpell(int artifact, int spell, int duration) { char* combatManager = (char*)(*((int*)0x699420)); char *tmp; tmp = GetArtifactRecord(spell)->name; GetArtifactRecord(spell)->name = GetArtifactRecord(artifact)->name; if ( (unsigned char)sub_5A43E0( combatManager, spell, 3, *(int *)(combatManager + 78528), 1, 2) ) CastBattleSpell(combatManager, spell, -1, 2, -1, 3, duration); GetArtifactRecord(spell)->name = tmp; } 3 и 4, кстати, не предусмотрены конструкцией вроде, так что я очень хз насчет них |
|
|
|
10 Dec 2015, 18:17
Сообщение
#344
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
Цитата Там не совсем что попало, там либо имя артефакта с номером, равным номеру спелла, либо Альянс и Доспехи для соответствующих спеллов (прост где ты видишь в параметрах передаваемый номер арта?) Да, я не правильно выразился: там имя артефакта с номером спела, и Альянс или Доспехи -------------------- |
|
|
|
19 Dec 2015, 13:02
(Сообщение отредактировал Richter - 21 Dec 2015, 15:19)
Сообщение
#345
|
|
![]() collector of time Сообщений: 159 Спасибо сказали: 73 раза |
координаты ZGODBON.DEF
ID#139(левая) ;X - 754830h(1b) Y - 75482Bh(4b); ID#107(правая);X - 7548AAh(1b) Y - 7548A5h(4b); Менять кадры можно следующим образом; Для ID#139 Меняем ID на неюзаный, скажем 300 по адресу 754822h, Далее по средствам ERM ставим нужный кадр по адресу 75481Fh. для 107, id по адресу 75489Fh, кадр 75489Ch Обновление Def'a не запилино в функции Dlg_Hero_Update(а жаль), поэтому обновление кадра происходит только после открытия окна героя. -------------------- |
|
|
|
25 Mar 2016, 19:59
(Сообщение отредактировал AlexSpl - 25 Mar 2016, 20:00)
Сообщение
#346
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
2feanor:
Вы писали: Код PPAdvManager = ^PAdvManager; PAdvManager = ^TAdvManager; TAdvManager = PACKED RECORD Dummy: ARRAY [0..79] OF BYTE; RootDlgIdPtr: PPINTEGER; CurrentDlgIdPtr: PPINTEGER; (* Dummy *) END; // .RECORD TAdvManager AdvManagerPtr: PPAdvManager = Ptr($6992D0); PROCEDURE GetGameState (OUT GameState: TGameState); BEGIN IF AdvManagerPtr^.RootDlgIdPtr <> NIL THEN BEGIN GameState.RootDlgId := AdvManagerPtr^.RootDlgIdPtr^^; END // .IF ELSE BEGIN GameState.RootDlgId := 0; END; // .ELSE IF AdvManagerPtr^.CurrentDlgIdPtr <> NIL THEN BEGIN GameState.CurrentDlgId := AdvManagerPtr^.CurrentDlgIdPtr^^; END // .IF ELSE BEGIN GameState.CurrentDlgId := 0; END; // .ELSE END; // .PROCEDURE GetDialogsIds Похоже, что это то, что нужно, если GameState.RootDlgId - фиксированная и уникальная величина для карты приключений в любой игре. Только есть пара вопросов: 1. ID диалогов в Героях 3 действительно фиксированные величины? 2. Если так, то какой RootDlgId соответствует карте приключений? У меня получилось 6530532. Так ли это? Получаю так (пока без проверки на nil): Код function GetH3RootDlgID: Integer; begin Result := RPM_INT(RPM_INT(RPM_INT($6992D0) + 80)); end; RPM_INT - чтение Integer (адрес - аргумент). |
|
|
|
25 Mar 2016, 20:04
(Сообщение отредактировал feanor - 25 Mar 2016, 20:07)
Сообщение
#347
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20605 раз |
Да, 63A5E4 - фиксированный адрес.
Код // 63A5E4: using guessed type int (__thiscall *AdvMapDlg_VTable)(void *, char);
|
|
|
|
26 Mar 2016, 01:46
Сообщение
#348
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Добавил код для разных версий (вдруг кому пригодится, чтобы не тратить время на поиски адресов). Вписал Вас в Special Thanks (надеюсь, Вы не против).
Код // Subverions
SV_Complete_RU = 0; SV_Complete_EN = 1; SV_SoD_EN = 2; SV_Chronicles = 3; SV_HotA = 4; // Heroes Chronicles CHAPTER_1 = 0; CHAPTER_2 = 1; CHAPTER_3 = 2; CHAPTER_4 = 3; CHAPTER_5 = 4; CHAPTER_6 = 5; CHAPTER_7 = 6; CHAPTER_8 = 7; CHAPTER_UNKNOWN = 8; ... H3AdvManagerAddr: array[SV_Complete_RU..SV_HotA] of DWORD = ($69CA20, $699280, $6992D0, $000000, $6992D0); HCAdvManagerAddr: array[CHAPTER_1..CHAPTER_8] of DWORD = ($63B458, $63B450, $63B458, $63D8A0, $63B458, $63D858, $63E8C0, $63E8D0); H3MapDlgID: array[SV_Complete_RU..SV_HotA] of DWORD = ($63B5F4, $63A5E4, $63A5E4, $000000, $63A5E4); HCMapDlgID: array[CHAPTER_1..CHAPTER_8] of DWORD = ($5EB594, $5EB594, $5EB594, $5EB594, $5EB594, $5EB594, $5EB5A4, $5EB5A4); ... function GetH3RootDlgID: DWORD; var RootDlgIDAddr: DWORD; begin if SubVer <> SV_Chronicles then RootDlgIDAddr := RPM_DWORD(RPM_DWORD(H3AdvManagerAddr[SubVer]) + $50) else RootDlgIDAddr := RPM_DWORD(RPM_DWORD(HCAdvManagerAddr[HCChapter]) + $50); if RootDlgIDAddr <> 0 then Result := RPM_DWORD(RootDlgIDAddr) else Result := 0; end; ... function isAdvMapActive: Boolean; begin case Version of // Temp Solution V_H1: Result := RPM_WORD(GetH1HeroAddr(0) + $3D) <> 0; V_H2: Result := RPM_BYTE(GetH2HeroAddr(0) + $63) <> 0; // Temp Solution else if SubVer <> SV_Chronicles then Result := GetH3RootDlgID = H3MapDlgID[SubVer] else Result := GetH3RootDlgID = HCMapDlgID[HCChapter]; end; end; |
|
|
|
27 Mar 2016, 00:30
(Сообщение отредактировал AlexSpl - 27 Mar 2016, 00:43)
Сообщение
#349
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
А нет ли случайно в менеджере приключений (advManager) Героев 3 указателя на таблицу виртуальных функций класса icon (const icon::`vftable')? Заметил, что в Героях 1 и 2 этот указатель не равен nil, только если идёт игра на карте приключений.
|
|
|
|
01 Jul 2016, 22:50
(Сообщение отредактировал igrik - 01 Jul 2016, 22:51)
Сообщение
#350
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
feanor, подскажи как это (хоть и работающее) безобразие привести к более презентабельному виду (вложиться в пару строк)
А еще лучше организовать в функцию и показать способ вызова этой функции, которая будет возвращать адрес структуры активного стека. И еще желательно не через __thiscall. Код 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); // получить структуру стека -------------------- |
|
|
|
11 Jul 2016, 11:36
(Сообщение отредактировал Barin - 11 Jul 2016, 12:19)
Сообщение
#351
|
|
![]() Member Сообщений: 84 Спасибо сказали: 70 раз |
Мне нужно в меню выбора кампаний SoD отключить некоторые окна, выглядеть должно так:
![]() Для начала хочу презентовать 1 кампанию, другие должны быть заблокированы. Наверняка можно сделать это подобием таких команд: Цитата сместить кнопки далеко за пределы экрана: для бин файла ; кнопка "Синглплеер" 63E6B0 FFFD ; кнопка "Мультиплеер" 63E6B8 FFFD ; кнопка "Обучение" 63E6C8 FFFD ; кнопка "Во имя богов" 456C6C AAAA ; кнопка "Клинок Армагедона" 456CE6 AAAA ; кнопка "Возраждение Эратии" 63BBF0 AAAA ; кнопка "Выбрать" 63BBF8 AAAA Кто может помочь? p.s Оставшиеся 3 окна тоже бы отключить. -------------------- |
|
|
|
18 Sep 2016, 19:42
Сообщение
#352
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
Проиграть анимацию стека. Код !!UN:C6919200/4/?y10; !!VRy20:Sx1 *1352 +21708 +y1; // x1 = номер стека !!SN:E4482656/2/y20/13/-1/0; //13 - атака вниз !!SN:E4482656/2/y20/2/1/0; //восстанавливаем исходное положение (стойка) Еще бы разобраться с массовой анимацией стеков. -------------------- |
|
|
|
18 Sep 2016, 20:55
Сообщение
#353
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20605 раз |
Попробуй в функции из этого поста
http://forum.df2.ru/index.php?s=&showt...st&p=607236 подменить номер для анимации урона или самому прокручивать комбатанимэйшнстеп |
|
|
|
14 Dec 2016, 21:43
(Сообщение отредактировал AlexSpl - 14 Dec 2016, 21:51)
Сообщение
#354
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Подскажите, пожалуйста, как узнать, проходима ли героем клетка с координатами x, y, z. Без учёта объектов, которые герой может "убрать с пути" (сундуки, ресурсы, артефакты и т.п.).
Или хотя бы функцию, которая строит маршрут героя. |
|
|
|
01 May 2017, 16:06
(Сообщение отредактировал Barin - 01 May 2017, 16:20)
Сообщение
#355
|
|
![]() Member Сообщений: 84 Спасибо сказали: 70 раз |
Хорошо, работает для объектов которые можно построить. А как определить подобные декоративные объекты непонятно: Сначала проверь указанное, а потом говори что "непонятно". Откуда эта инфа, что можно менять только строящиеся объекты? Ты проверял? Конечно нет. Поэтому и не знаешь, что можно. И в сотый раз тебе повторять уже надоело - есть специальные темы для обсуждений. А эти темы для чистой информации. Смекаешь? Проверял. В ERM справочнике предоставлен список только объектов. В списке нет подобных декоративных дефов. Там есть значения без информации: постройки 20, 27, 28, 29 - попробовал не сработало. Например: !!VRy1:S8; //city (e.g. Castle) !!VRy2:S20; //building ID (e.g Tavern) !!VRy6:S10; //frames num in new def (там 10 кадров) !!VRy3:S1; //new x !!VRy4:S1; //new y !!VRy5:Sy1 *44 +y2 *6 +6859276; !!UN:Cy5/2/y6; !!VRy5:+2; !!UN:Cy5/2/y3; !!VRy5:+2; !!UN:Cy5/2/y4; Короче, через CM подобный объект не определяется, имеет значение -1 как и фон города. Где посмотреть ID водопада? -------------------- |
|
|
|
01 May 2017, 20:13
Сообщение
#356
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
-------------------- |
|
|
|
01 May 2017, 20:40
Сообщение
#357
|
|
![]() 😸🧡✊✌️ Сообщений: 16 495 Спасибо сказали: 3402 раза |
Где посмотреть ID водопада? В ERM-справке по ресейверу !!CM:I щёлкнуть по слову "место".-------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
09 Jun 2017, 12:47
(Сообщение отредактировал Barin - 09 Jun 2017, 12:47)
Сообщение
#358
|
|
![]() Member Сообщений: 84 Спасибо сказали: 70 раз |
Команду RedirectFile использую для подмены дефов в конкретных картах, но с форматом .txt трюк не проходит.
Например: !?PI; !!SN:L^Era.dll^/?y1 Ay1/^RedirectFile^/?y2 Ey2/1/^HCTRAITS.txt^/^my.txt^; !!VRy1:S0; !!VRy2:S0; HCTRAITS.txt - здесь список классов героев. my.txt - мои новые названия. Как можно это сделать? -------------------- |
|
|
|
09 Jun 2017, 16:01
(Сообщение отредактировал igrik - 09 Jun 2017, 16:04)
Сообщение
#359
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
Как можно это сделать? Смысла в этом нет.HCTRAITS.txt грузится при старте экзешника и всего один раз. Но пожешь использовать этот способ. Точно не знаю - сработает ли, и будет ли утечка памяти ли. Ли-ли-ли... Цитата !!VRz1:S^1111.txt^; полное название тектовика в z1
!!UN:C5138903/4/9597928; подменить ссылку на адрес переменной z1 !!SN:E5138896/1; функция загрузки "hctraits.txt" -------------------- |
|
|
|
10 Jun 2017, 12:02
Сообщение
#360
|
|
![]() Member Сообщений: 84 Спасибо сказали: 70 раз |
Как можно это сделать? Смысла в этом нет.HCTRAITS.txt грузится при старте экзешника и всего один раз. Но пожешь использовать этот способ. Точно не знаю - сработает ли, и будет ли утечка памяти ли. Ли-ли-ли... Цитата !!VRz1:S^1111.txt^; полное название тектовика в z1 !!UN:C5138903/4/9597928; подменить ссылку на адрес переменной z1 !!SN:E5138896/1; функция загрузки "hctraits.txt" Если есть вероятность ошибок, лучше откажусь от этой затеи. Тем более мне нужно было не только hctraits.txt, но и другие текстовики, например DWELLING.txt - чтобы подменять в городе названия строений Оплота на названия строений Града. Пользуясь случаем, не подскажите ли, можно этого добиться через ERM? Что-то не встретил команду в справочнике. Ресейвер !!CA не даёт такой возможности, а в !!UN есть команда только для узнавания названия - N2/z#/$1/$2 – имя здания ($2) в городе $1. -------------------- |
|
|
|
![]() ![]() |
| Текстовая версия | Сейчас: 20 December 2025 - 18:58 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|