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
Ответов
feanor
сообщение 19 Oct 2012, 20:35
Сообщение #2

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






Контроль восьмого слота (obsidian.dll)

Плагин: obsidian.era

События:
!?FU4074810 (OnAdditionalMonsterAvailable) - происходит при каждой проверке на доступность восьмого слота.
x1 - номер замка
x2 - адрес его структуры
x3 - указатель на флаг наличия/отсутствия оного слота. Ну, как обычно.

!?FU4074811 (OnAdditionalMonsterSetting) - происходит после установки обитателей в жилище. В этом событии можно записать этих самых обитателей.
x1 - номер замка
x2 - адрес его структуры
x3 - указатель на тип монстров
x4 - указатель на количество монстров. Количество монстров записывается в два байта!!
(пояснение: при помощи последних двух полей можно установить "постояльцев", не прибегая к экспортируемым функциям)

Экспортируемые функции:

extern "C" __declspec(dllexport) void SetAdditionalMonster(int castle_id, int type, int amount) - устанавливает в замок castle_id монстров type числом amount
extern "C" __declspec(dllexport) int GetAdditionalMonsterType(int castle_id) - возвращает индекс монстра из восьмого слота замка castle_id
extern "C" __declspec(dllexport) int GetAdditionalMonsterAmount(int castle_id) - возвращает количество монстров из восьмого слота замка castle_id

Ну понятно по сигнатурам, да.

Пример (ERM)
Во всех Инферно можно нанимать 5 Монахов Баа каждую неделю.
Код
ZVSE

!?FU4074811;
!!CA0/x1:T?y10;
!!SN&y10=3:L^obsidian.era^/?y10 Ay10/^SetAdditionalMonster^/?y20 Ey20/1/x1/169/5;

!?FU4074810;
!!CA0/x1:T?y10;
!!UN&y10=3:Cx3/4/1;


!?PI;
!!MA:O169/3;
!!VRz47:S^Монах Баа^;
!!VRz48:S^Монахи Баа^;
!!UN:G1/169/0/47 G1/169/1/48;


Другой вариант первого триггера:
Код
!?FU4074811;
!!CA0/x1:T?y10;
!!UN&y10=3:Cx3/4/169;
!!UN&y10=3:Cx4/2/5;




Код
// dllmain.cpp: определяет точку входа для приложения DLL.

#include <windows.h>
#include <stdio.h>
#include "..\..\include\era.h"
#include "..\..\include\heroes.h"
#include "..\..\include\patcher_x86_commented.hpp"


Patcher * globalPatcher;
PatcherInstance *patcher;

extern "C" __declspec(dllexport) void SetAdditionalMonster(int castle_id, int type, int amount)
{
    CASTLE *cstl = ((CASTLE*)(*(int*)((*(int*)0x699538) + 0x21614) + sizeof(CASTLE) * castle_id));
    cstl->EightMonsterAmount = amount;
    cstl->EightMonsterType = type;
}

extern "C" __declspec(dllexport) int GetAdditionalMonsterType(int castle_id)
{
    CASTLE *cstl = ((CASTLE*)(*(int*)((*(int*)0x699538) + 0x21614) + sizeof(CASTLE) * castle_id));
    return cstl->EightMonsterType;
}

extern "C" __declspec(dllexport) int GetAdditionalMonsterAmount(int castle_id)
{
    CASTLE *cstl = ((CASTLE*)(*(int*)((*(int*)0x699538) + 0x21614) + sizeof(CASTLE) * castle_id));
    return cstl->EightMonsterAmount;
}


int IsEighthSlotAvailable(CASTLE* cstl)
{
    int ret = false;

    if (cstl->Type == 5 && cstl->Built[2]&64)
        ret = true;

    EventParams[0]=cstl->Number;
    EventParams[1]=(int)cstl;
    EventParams[2]=(int)&ret;
    FireEvent("OnAdditionalMonsterAvailable",0,0);

    ErmX[1]=cstl->Number;
    ErmX[2]=(int)cstl;
    ErmX[3]=(int)&ret;
    FireErmEvent(4074810);

    return ret;
}


int __stdcall hook_5BDCBF(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->ecx;

    
    EventParams[0]=cstl->Number;
    EventParams[1]=(int)cstl;
    EventParams[2]=0x3C+(int)cstl;
    EventParams[3]=0x40+(int)cstl;
    FireEvent("OnAdditionalMonsterSetting",0,0);

    ErmX[1]=cstl->Number;
    ErmX[2]=(int)cstl;
    ErmX[3]=0x3C+(int)cstl;
    ErmX[4]=0x40+(int)cstl;
    FireErmEvent(4074811);

    return EXEC_DEFAULT;
}


int __stdcall hook_4C8B39(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->ecx;
    
    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x4C8B62;
    else
        c->return_address = 0x4C8B5D;


    return NO_EXEC_DEFAULT;
}

int __stdcall hook_51D2AE(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->esi;

    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x51E79B;
    else
        c->return_address = 0x51D2DB;
    return NO_EXEC_DEFAULT;
}

int __stdcall hook_5C651F(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->esi;

    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x5C66D9;
    else
        c->return_address = 0x5C654D;
    return NO_EXEC_DEFAULT;
}

int __stdcall hook_5D8BD8(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->ecx;

    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x5D8C08;
    else
        c->return_address = 0x5D8BFE;
    return NO_EXEC_DEFAULT;
}

int __stdcall hook_5D8C11(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->edx;

    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x5D8C95;
    else
        c->return_address = 0x5D8C37;
    return NO_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("obsidian");
        ConnectEra();
        
        patcher->WriteLoHook(0x4C8B39,(void*)hook_4C8B39); //JNE SHORT 004C8B62
        patcher->WriteLoHook(0x51D2AE,(void*)hook_51D2AE); //JNE 0051E79B
        patcher->WriteLoHook(0x5C651F,(void*)hook_5C651F); //JNE 005C66D9
        patcher->WriteLoHook(0x5D8BD8,(void*)hook_5D8BD8); //JNE SHORT 005D8C08
        patcher->WriteLoHook(0x5D8C11,(void*)hook_5D8C11); //JNE SHORT 005D8C08

        patcher->WriteLoHook(0x5BDCBB,(void*)hook_5BDCBF); //после записи в новый день
        

        //RegisterHandler(TimerTest,"OnGlobalTimer");
    }
    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:22
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика