Здравствуйте, гость ( Вход | Регистрация )
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; } Просьба здесь особо не обсуждать. Мне куда более доставляет складывать добро в чистую тему. Спасибо сказали: |
|
|
|
![]() |
30 Sep 2017, 09:02
(Сообщение отредактировал Iv - 06 May 2021, 16:32)
Причина редактирования: спрятал под спойлер
Сообщение
#2
|
|
|
Power Member Сообщений: 198 Спасибо сказали: 134 раза |
Улучшение навыка Орлиный глаз
Авторы: AlexSpl, Ben Dll плагин к HD моду. https://yadi.sk/d/8xAXgEpk3NLf8f UPD Обновленная ссылка с версией в релизной конфигурации (предыдущая могла не работать на каких-то системах) https://yadi.sk/d/RVqiFWfr3NQNWi Теперь навык действует не после битвы, а до, в книгу заклинаний копируются заклинания противника, с определенной вероятностью по схеме 30/35/40% для каждого заклинания в зависимости от степени навыка (герою доступны заклинания 1-2/1-3/1-4 уровней в зависимости от степени навыка, как в оригинальной игре). Влияние артефактов и специальности учитывается. В сетевой игре работает. ![]() Код #define _CRT_RAND_S #define _CRT_SECURE_NO_WARNINGS #include "..\..\include\homm3.h" Patcher* _P; PatcherInstance* _PI; static _bool_ plugin_On = 0; struct PicStruc { int type; // тип картинки (9 - заклинание) int id; // ID картинки }; // кастомный _List_ struct List { _ptr_ Creation; PicStruc* Data; PicStruc* EndData; _ptr_ EndMem; }; int captionAddr; bool dlgFirst[] = {true, true}; // Заголовок в каждом диалоге int __stdcall saveCaption(LoHook* h, HookContext* c) { captionAddr = c->ecx; return EXEC_DEFAULT; } int __stdcall captionFix(LoHook* h, HookContext* c) { *(int*)(c->ebp - 0x14) = captionAddr; return EXEC_DEFAULT; } int showSpellDlg(_Hero_* hero, int spells[], int nPics) { if ( !nPics ) return 0; List picList; // Динамический массив картинок // Первый и последний элемент резервируем для полей Creation и EndData/EndMem соответственно PicStruc* pic = new PicStruc[nPics + 2]; for (int i = 0; i < nPics; ++i) { pic[i + 1].type = 9; pic[i + 1].id = spells[i]; } picList.Creation = (_ptr_)pic + 4; picList.Data = pic + 1; // Адрес первого элемента в списке picList.EndData = picList.Data + nPics; // Адрес следующего за последним элементом в списке байта picList.EndMem = (_ptr_)picList.EndData; sprintf(o_TextBuffer, "Благодаря навыку {Орлиный глаз}, {%s} выучил%s следующ%s заклинан%s:", hero->name, hero->sex ? "а" : "", nPics > 1 ? "ие" : "ее", nPics > 1 ? "ия" : "ие"); CALL_5(unsigned int, __fastcall, 0x4F7D20, o_TextBuffer, &picList, -1, -1, 0); delete [] pic; return 0; } int getEagleEyeSpells(_Hero_* hero, _Hero_* heroDonor, int spells[]) { int n = 0; unsigned int eagleEyeProb = (unsigned int)(CALL_1(float, __thiscall, 0x4E4690, hero) * 100.0); for (_Spell_* iSpell = o_Spell + SPL_QUICKSAND; iSpell <= o_Spell + SPL_AIR_ELEMENTAL; ++iSpell) { int i = iSpell - o_Spell; if ( heroDonor->spell_level[i] && !hero->spell[i] ) { if ( iSpell->level <= hero->second_skill[HSS_EAGLE_EYE] + 1 ) { unsigned int dice; rand_s(&dice); dice = (unsigned int)((double)dice / ((double)UINT_MAX + 1) * 100.0) + 1; if ( dice <= eagleEyeProb ) { spells[n++] = i; hero->spell[i] = 1; hero->spell_level[i] = 1; } } } } return n; } int __stdcall eagleEyeMain(LoHook* h, HookContext* c) { _Hero_* hero[] = {o_BattleMgr->hero[ATTACKER], o_BattleMgr->hero[DEFENDER]}; if ( hero[ATTACKER] && hero[DEFENDER] ) { int spells[70]; for (int i = ATTACKER; i <= DEFENDER; ++i) { if ( dlgFirst[i] && o_BattleMgr->current_side == i && hero[i]->second_skill[HSS_EAGLE_EYE] && hero[i]->doll_art[AS_SPELL_BOOK].id == AID_SPELL_BOOK ) { dlgFirst[i] = false; // Учим заклинания всегда. int n = getEagleEyeSpells(hero[i], hero[1 - i], spells); // Но диалог показываем только для игрока-человека: // в хотсите - диалог для обоих героев, в сетевой игре - только для своего героя. if ( o_GameMgr->GetPlayer(hero[i]->owner_id)->IsHuman() ) { int id = o_GameMgr->GetMeID(); if ( !o_NetworkGame || hero[i]->owner_id == id ) { o_ActivePlayerID = hero[i]->owner_id; showSpellDlg(hero[i], spells, n); o_ActivePlayerID = id; } } } } } return EXEC_DEFAULT; } int __stdcall eagleEyeSetGlobalFlags(LoHook* h, HookContext* c) { dlgFirst[ATTACKER] = true; dlgFirst[DEFENDER] = true; return EXEC_DEFAULT; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { if ( DLL_PROCESS_ATTACH == ul_reason_for_call ) { if ( !plugin_On ) { plugin_On = 1; _P = GetPatcher(); _PI = _P->CreateInstance("HD.Plugin.NewEagleEye"); // Меняем коэффициенты float eagleEyeCoefs[] = {0.00f, 0.30f, 0.35f, 0.40f}; _PI->WriteDword(0x63EA2C, (int&)eagleEyeCoefs[1]); _PI->WriteDword(0x63EA30, (int&)eagleEyeCoefs[2]); _PI->WriteDword(0x63EA34, (int&)eagleEyeCoefs[3]); // Убираем оригинальный эффект _PI->WriteHexPatch(0x469C23, "EB"); _PI->WriteHexPatch(0x476996, "E9 DD 01 00 00"); // Фиксим заголовок диалога _PI->WriteLoHook(0x4F7D49, saveCaption); _PI->WriteLoHook(0x4F7D54, captionFix); _PI->WriteLoHook(0x462C7D, eagleEyeSetGlobalFlags); _PI->WriteLoHook(0x477C00, eagleEyeMain); } } 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
igrik Цифровое отображение морали и удачи в окне стека.
... 21 Oct 2016, 19:17
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
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 - 06:24 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|