IPB

Здравствуйте, гость ( Вход | Регистрация )

> Небольшие моды и плагины.
feanor
сообщение 25 Jul 2012, 11:30 (Сообщение отредактировал Iv - 10 Nov 2015, 21:49)
Сообщение #1

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20610 раз




Эта тема предназначена для небольших модов, не требующих оформления отдельной темы.
Все обсуждения - в соседней теме.

При выкладке указывайте:
  • краткое описание. Скриншот - факультативно
  • авторство (если не свое - особенно)
  • формат (инсталлятор, архив или одиночный плагин),
  • язык (или его отсутствие в случае безтекстового мода).
  • разумеется, ссылку на скачивание. Не рекомендуются как zalil, rghost и подобные обменники с кратким сроком жизни файла, так и depositfiles, letitbit и прочие многоэтапные файлопохранилища.


Замена воговского таймера для Эры

Всегда убивали воговские таймеры (которые 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>
#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;
}
</div></div>

Просьба здесь особо не обсуждать. Мне куда более доставляет складывать добро в чистую тему.
Go to the top of the pageAdd Nick
 
+Quote Post
 
Start new topic
Ответов
igrik
сообщение 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;
}



--------------------
Go to the top of the pageAdd Nick
 
+Quote Post

Сообщений в этой теме
- 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
- - 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 15 April 2026 - 05:08
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика