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
Ответов
Ben
сообщение 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;
}


Спасибо сказали:
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



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