Здравствуйте, гость ( Вход | Регистрация )
25 Jul 2012, 11:30
(Сообщение отредактировал Iv - 10 Nov 2015, 21:49)
Сообщение
#1
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20610 раз |
Эта тема предназначена для небольших модов, не требующих оформления отдельной темы.
Все обсуждения - в соседней теме. При выкладке указывайте:
Замена воговского таймера для Эры Всегда убивали воговские таймеры (которые TM, не TL). Их мало (сто, из них изрядная часть зарезервирована), они перегружены и вообще мастдай. В дллках оно еще более усугубляется - совершенно не хочется делать лишний хэндл для инициализации таймера, долбаться с его резервированием etc etc.. Поэтому для удобства написания дллок я набросал простенькую библиотеку, которая хукает RunTimer и посылает сообщение плагинам и ERM'у. Требует Бараторчевский патчер, ибо он трушный. Плагин: timerevent.era Проект: eratimer_code.rar Интерфейс: Простой как топор. Для ерм: функция !?FU4074700, в x1 - номер игрока (0..7), в x2 - день (1,2,3,4,5,6,7,8..) Для эры: событие OnGlobalTimer с двумя аналогичными параметрами. См. пример ниже. Повторю еще раз, требует patcher_x86.dll в корне папки с героями!! Пример (Си) Код void __stdcall TimerTest (PEvent e) { char buf[128]; int i = *(int*)(e->Data); sprintf(buf,"IF:L^%i %i^;",*(int*)(e->Data), *(1+(int*)(e->Data))); ExecErmCmd(buf); } .. RegisterHandler(TimerTest,"OnGlobalTimer"); Код: <div class="sp-wrap"><div class="sp-body" title="Код"> Код #include <windows.h> </div></div>#include <stdio.h> #include "....includeera.h" #include "....includeheroes.h" #include "....includepatcher_x86_commented.hpp" Patcher * globalPatcher; PatcherInstance *patcher; int __cdecl OnAnyTimer(HiHook* h, int owner) { ErmX[1]=owner; ErmX[2]=CALL_0(int, __cdecl ,0x7103D2); FireErmEvent(4074700); int param[2] = {owner,CALL_0(int, __cdecl ,0x7103D2)}; FireEvent("OnGlobalTimer",(void*)param,8); return EXEC_DEFAULT; } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { globalPatcher = GetPatcher(); patcher = globalPatcher->CreateInstance("timerwrapper"); ConnectEra(); patcher->WriteHiHook(0x74DC74, SPLICE_, EXTENDED_, CDECL_, (void*)OnAnyTimer); } return TRUE; } Просьба здесь особо не обсуждать. Мне куда более доставляет складывать добро в чистую тему. Спасибо сказали: |
|
|
|
![]() |
21 Oct 2016, 19:17
(Сообщение отредактировал igrik - 10 Aug 2017, 09:57)
Сообщение
#2
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
Цифровое отображение морали и удачи в окне стека.
Как в MOP автор: igrik язык: нет формат: dll (плагин для HD-мода) версии: SoD/WoG/ERA NumMoralLuck.dll (8.50kb) Код ///////////////////////////////////////////////////////// // Расширение диалога монстров: // // - отображение единиц удачи и морали (igrik) // // - отображение длительности заклинаний (из HotA) // ///////////////////////////////////////////////////////// #include "..\..\include\homm3.h" // Объекты patcher_x86. Patcher* _P; PatcherInstance* _PI; int __stdcall Y_MoralLuckBonus(LoHook* h, HookContext* c) { // цифровое отображение морали if (*(int*)(c->edi+1256) < 1) sprintf(o_TextBuffer, "%d", *(int*)(c->edi+1256)); else sprintf(o_TextBuffer, "+%d", *(int*)(c->edi+1256)); int bonMoralNew = CALL_1 (int, __cdecl, 6386834, 80); int bonMoral = CALL_12 (int, __thiscall, 6014624, bonMoralNew, 48, 209, 20, 20, o_TextBuffer, "tiny.fnt", 4, 3006, 10, 0, 8); CALL_4 (int, __thiscall, 0x5FE2D0, c->ebx, *(int*)(c->ebx+8), 1, &bonMoral); // цифровое отображение удачи if (*(int*)(c->edi+1260) < 1) sprintf(o_TextBuffer, "%d", *(int*)(c->edi+1260)); else sprintf(o_TextBuffer, "+%d", *(int*)(c->edi+1260)); int bonLuckNew = CALL_1 (int, __cdecl, 6386834, 80); int bonLuck = CALL_12 (int, __thiscall, 6014624, bonLuckNew, 101, 209, 20, 20, o_TextBuffer, "tiny.fnt", 4, 3007, 10, 0, 8); CALL_4 (int, __thiscall, 0x5FE2D0, c->ebx, *(int*)(c->ebx+8), 1, &bonLuck); return EXEC_DEFAULT; } int __stdcall Y_MoralLuckBonus2(LoHook* h, HookContext* c) { if (*(int*)(c->ebx+104) < 1) sprintf(o_TextBuffer, "%d", *(int*)(c->ebx+104)); else sprintf(o_TextBuffer, "+%d", *(int*)(c->ebx+104)); int bonMoralNew = CALL_1 (int, __cdecl, 6386834, 80); int bonMoral = CALL_12 (int, __thiscall, 6014624, bonMoralNew, 48, 209, 20, 20, o_TextBuffer, "tiny.fnt", 4, 3006, 10, 0, 8); CALL_4 (int, __thiscall, 0x5FE2D0, c->ebx+48, *(int*)(c->ebx+56), 1, &bonMoral); // отображение единиц удачи if (*(int*)(c->ebx+124) < 1) sprintf(o_TextBuffer, "%d", *(int*)(c->ebx+124)); else sprintf(o_TextBuffer, "+%d", *(int*)(c->ebx+124)); int bonLuckNew = CALL_1 (int, __cdecl, 6386834, 80); int bonLuck = CALL_12 (int, __thiscall, 6014624, bonLuckNew, 101, 209, 20, 20, o_TextBuffer, "tiny.fnt", 4, 3007, 10, 0, 8); CALL_4 (int, __thiscall, 0x5FE2D0, c->ebx+48, *(int*)(c->ebx+56), 1, &bonLuck); return EXEC_DEFAULT; } int __stdcall Y_SpellShow(LoHook* h, HookContext* c) { // цифровое отображение длительности заклинаний (вытащено из HotA.dll) int Spell = *(int*)(c->esi); int DlgShow = *(int*)(c->ebp-40); if (Spell >=0) { if (Spell == 47 || Spell == 59 || Spell == 72) int Spell = 47; else { sprintf(o_TextBuffer, "x%d", *(int*)(c->esi+12)); int SpellNew = CALL_1 (int, __cdecl, 6386834, 80); int SpellShow = CALL_12 (int, __thiscall, 6014624, SpellNew, *(int*)(c->ebp-28), 202, 46, 20, o_TextBuffer, "tiny.fnt", 4, 3003 - *(int*)(c->ebp-32), 10, 0, 8); CALL_4 (int, __thiscall, 0x5FE2D0, DlgShow + 48, *(int*)(DlgShow +56), 1, &SpellShow); } } return EXEC_DEFAULT; } int __stdcall Y_SpellInfo1(LoHook* h, HookContext* c) { // в этой функции я не смог поставить HiHook // потому что в WoGе после её выполнения вылетает if( c->eax >= 3000 && c->eax <= 3007 ) { switch (c->eax){ case 3000: c->eax = 11; break; // спелл_1 case 3001: c->eax = 11; break; // спелл_2 case 3002: c->eax = 11; break; // спелл_3 case 3006: c->eax = 9; break; // мораль case 3007: c->eax = 10; break; // удача default: c->eax = -1; break; // на всякий } c->return_address = 0x5F4B34; return NO_EXEC_DEFAULT; } return EXEC_DEFAULT; } int __stdcall Y_SpellInfo2(LoHook* h, HookContext* c) { // подсказка для циферных отображений спеллов, морали и удачи switch (c->esi){ case 3000: c->esi = 221; break; // спелл_1 case 3001: c->esi = 222; break; // спелл_2 case 3002: c->esi = 223; break; // спелл_3 case 3006: c->esi = 219; break; // мораль case 3007: c->esi = 220; break; // удача } return EXEC_DEFAULT; } int __stdcall Y_SpellShow1(LoHook* h, HookContext* c) { int New = CALL_1 (int, __cdecl, 0x617492, 80); int SpellShow = CALL_12 (int, __thiscall, 6014624, New, 15, c->ebx + 16, 46, 20, "", "tiny.fnt", 4, c->edi + 3003, 10, 0, 8); CALL_4 (int, __thiscall, 0x4230D0, c->esi, *(int*)(c->esi + 8), 1, &SpellShow); return EXEC_DEFAULT; } int __stdcall Y_SpellShow2(LoHook* h, HookContext* c) { int New = CALL_1 (int, __cdecl, 0x617492, 80); int SpellShow = CALL_12 (int, __thiscall, 6014624, New, 15, *(int*)(c->ebp + 24) + 16, 46, 20, "", "tiny.fnt", 4, c->ebx + 3003, 10, 0, 8); CALL_4 (int, __thiscall, 0x4230D0, c->esi, *(int*)(c->esi + 8), 1, &SpellShow); return EXEC_DEFAULT; } int __stdcall Y_SpellShow3(LoHook* h, HookContext* c) { _Dlg_* dlg = (_Dlg_*)(c->edi + 56); int item = 3006 - *(int*)(c->ebp + 8); int spell = *(int*)c->esp - 1; if (spell >= 0 && spell != 47 && spell != 59 && spell != 72) sprintf(o_TextBuffer, "x%d", *(int*)(c->esi + 4 * spell + 408)); else sprintf(o_TextBuffer, ""); ((_DlgStaticText_*)dlg->GetItem(item))->SetText(o_TextBuffer); return EXEC_DEFAULT; } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { static _bool_ plugin_On = 0; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: if (!plugin_On) { plugin_On = 1; _P = GetPatcher(); _PI = _P->CreateInstance("MonDescription"); // Патч на tiny.fnt малые описания монстров (все в DEC) *(int*)6243434 = 6687924; // в бою *(int*)6244485 = 6687924; // при покупке *(int*)6241855 = 6687924; // не в бою _PI->WriteLoHook(0x5F3C43, Y_MoralLuckBonus); // мораль и удача в бою _PI->WriteLoHook(0x5F439B, Y_MoralLuckBonus2); // мораль и удача вне в боя // отображение длительности заклинаний в окне монстра (вытащено из HotA.dll) _PI->WriteLoHook(0x5F6BE2, Y_SpellShow); _PI->WriteLoHook(0x5F4B05, Y_SpellInfo1); // тут WoG/ERA не дают поставить HiHook _PI->WriteLoHook(0x5F522A, Y_SpellInfo2); // отображение длительности заклинаний в расширенной статистике (вытащено из HotA.dll) _PI->WriteLoHook(0x46D12B, Y_SpellShow1); _PI->WriteLoHook(0x46D4CB, Y_SpellShow2); _PI->WriteLoHook(0x46D9F0, Y_SpellShow3); } case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
-------------------- Спасибо сказали: |
|
|
|
feanor Небольшие моды и плагины. 25 Jul 2012, 11:30
feanor Обработка копания (granite.dll)
Плагин: granite.e... 18 Aug 2012, 22:10
feanor Работа с датой (malachite.dll)
Плагин: malachite.... 18 Aug 2012, 22:41
feanor Контроль восьмого слота (obsidian.dll)
Плагин: ob... 19 Oct 2012, 20:35
feanor Отрицательная удача (badluck.dll) (с) Sav, feanor
... 03 Jan 2013, 00:10
feanor Настраиваемые имена классов (turquoise.dll)
Плаги... 08 Feb 2013, 15:55
feanor Вызовы элементалей (summoniots.dll)
Плагин: summo... 28 Mar 2013, 14:27
feanor Гильдия воров вместо "Братства меча" в З... 17 Jul 2013, 18:31
Iv Другие флаги игроков
Автор: Iv (с участием Algor... 18 Jul 2013, 13:31
feanor Несколько небольших патчей.
Автор: feanor
Язык: н... 25 Jul 2013, 08:00
Iv Зомбивод (39 б)
Автор: Master of puppets
Язык: нет... 25 Jul 2013, 16:02
feanor Часы реального времени.
ПКМ по дате на экране к... 01 Aug 2013, 14:30
feanor Еженедельная газета "Голос из-под стойки... 16 Sep 2013, 00:59
Iv -Why do you call your software "beta"?
-... 19 Sep 2013, 23:55
igrik Рюкзак героя
Версия 1.04.
Автор: igrik
Язык: русск... 21 Sep 2013, 23:13
Iv Случайные нейтральные герои
Нейтралы с вероятност... 13 Mar 2014, 13:14
feanor Статуя Ленина в Инферно вместо Бога Огня
Автор: f... 22 Apr 2014, 20:39
Iv Родная грязь (dirt) для Подземелья
Маленький пат... 15 Jun 2014, 20:37
Orzie Культ Вождя Мирового Пролетариата
Авторы: feanor,... 15 Jul 2014, 13:12
feanor Магические сундуки
Сундуки с артефактами теперь о... 31 Jul 2014, 22:57
feanor Вуду-гарпии.
Иногда гарпии-ведьмы будут атаковать... 03 Feb 2015, 19:06
feanor Иной формат даты.
Дни недели и месяцы именуются, ... 10 Feb 2015, 03:13
feanor Иные виды снарядов-лучей.
Архимаги стреляют молни... 10 Feb 2015, 20:56
hippocamus Приручённые нейтралы
Большинство нейтралов теперь... 12 Feb 2015, 16:27
Iv Больше колодцев для бога колодцев
Маленький патчи... 19 Feb 2015, 23:46
feanor В честь минувших праздников полового диморфизма..
... 13 Mar 2015, 23:57
feanor Анимированные существа на поле боя (порт из WoG 3.... 14 Aug 2016, 00:56
Ben Новая версия заклинания Городской портал
Авторы: ... 08 Aug 2017, 21:11
igrik А где сама DLL?
Кстати забыл. Тестировал. Багов ... 09 Aug 2017, 17:47
Iv Напоминаю:
Цитата(feanor @ 25 Jul 2012, 11... 22 Aug 2017, 16:33
Ben Модификация Зыбучих песков и Мин
Dll плагин к HD ... 02 Sep 2017, 17:46
Ben Улучшение вторичного навыка Обучение
Dll плагин к... 27 Sep 2017, 18:41
Ben Улучшение навыка Орлиный глаз
Авторы: AlexSpl, Be... 30 Sep 2017, 09:02
igrik WoG Native Dialogs
(Вог диалоги в родном исполнен... 20 Sep 2018, 22:02
igrik Защита артефактов, пандор и свитков
Скачать (41.5... 16 Nov 2018, 08:42
Richter Небольшая модификация добавляющая статистику пройд... 11 Feb 2019, 15:15
suftfree Модификация добавляющая огромное количество новых ... 26 Apr 2020, 15:21![]() ![]() |
| Текстовая версия | Сейчас: 15 April 2026 - 05:08 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|