Все обсуждения - в соседней теме.
При выкладке указывайте:
- краткое описание. Скриншот - факультативно
- авторство (если не свое - особенно)
- формат (инсталлятор, архив или одиночный плагин),
- язык (или его отсутствие в случае безтекстового мода).
- разумеется, ссылку на скачивание. Не рекомендуются как 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");
{
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>#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;
}
Просьба здесь особо не обсуждать. Мне куда более доставляет складывать добро в чистую тему.