-
AlexSpl
имя: Александр
- Эксперт
-
- Сообщения: 5587
- Зарегистрирован: 17 сен 2010, 12:58
- Пол:
- Награды: 14
-
-
- Поблагодарили: 2185 раз.
|
AlexSpl » 16 окт 2020, 11:49
Немножко переделал плагин, чтобы можно было произвольно менять высоту текстового описания: - Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h" #include "..\..\HotA\homm3.h"
Patcher* _P; PatcherInstance* _PI;
static _bool_ plugin_On = 0;
_bool_ isRusLng;
int __stdcall Y_LoadAllTXTinGames(LoHook* h, HookContext* c) { if (o_CreatureInfo[0].name_single[0] != 'P') { isRusLng = 1; } else { isRusLng = 0; } return EXEC_DEFAULT; }
int c_neu_rmb_id;
int __stdcall c_get_neu_rmb(LoHook* h, HookContext* c) { c_neu_rmb_id = c->esi;
return EXEC_DEFAULT; }
int __stdcall changeRMBInfoDescTextHeight(LoHook* h, HookContext* c) { int c_neu_lv = o_pCreatureInfo[c_neu_rmb_id].level + 1; int c_neu_at = o_pCreatureInfo[c_neu_rmb_id].attack; int c_neu_df = o_pCreatureInfo[c_neu_rmb_id].defence; int c_neu_sp = o_pCreatureInfo[c_neu_rmb_id].speed; int c_neu_hp = o_pCreatureInfo[c_neu_rmb_id].hit_points; int c_neu_d1 = o_pCreatureInfo[c_neu_rmb_id].damage_min; int c_neu_d2 = o_pCreatureInfo[c_neu_rmb_id].damage_max; char* c_neu_ds = o_pCreatureInfo[c_neu_rmb_id].specification_description;
if (isRusLng == 1) { sprintf(o_TextBuffer, "%s\n\nУровень: {%d}, Атака: {%d}, Защита: {%d},\nЗдоровье: {%d}, Урон: {%d}-{%d}, Скорость: {%d}.\n\n\n%s", o_TextBuffer, c_neu_lv, c_neu_at, c_neu_df, c_neu_hp, c_neu_d1, c_neu_d2, c_neu_sp, c_neu_ds); } else { sprintf(o_TextBuffer, "%s\n\nLevel: {%d}, Attack: {%d}, Defense: {%d},\nHealth: {%d}, Damage: {%d}-{%d}, Speed: {%d}.\n\n\n%s", o_TextBuffer, c_neu_lv, c_neu_at, c_neu_df, c_neu_hp, c_neu_d1, c_neu_d2, c_neu_sp, c_neu_ds); } CALL_12(_DlgStaticText_*, __thiscall, 0x5BC6A0, c->eax, 16, 100, 224, 120 /* Description text height */, o_TextBuffer, (const char*)"smalfont.fnt", 1, 1001, 1, 0, 8);
c->return_address = 0x53003B; return NO_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.NewRMGDesc");
// check language after loading all txt files _PI->WriteLoHook(0x4EDFFD, Y_LoadAllTXTinGames);
// advanced rmb on neutrals _PI->WriteLoHook(0x52FFEC, c_get_neu_rmb); _PI->WriteLoHook(0x53000E, changeRMBInfoDescTextHeight); _PI->WriteByte(0x530170, 217); // private y pos } }
return TRUE; }
|