Current time: 22.11.2024, 17:52 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Исследование героев
» туториал(ы)
Author Message
igrik Offline

Posts: 2819
Post: #691

(27.03.2017 13:16)Bes Wrote:  вроде бы замена wog'ификацией идёт в теле таймера... не?
В том и дело, что все те замены которые идут в теле таймера (только для первого дня) следует перенести в тело !?PI;
И раньше мы получали гарантированный вылет, сейчас - нет.


game bug fixes extended.dll || My Plugins || My GitHub
(This post was last modified: 27.03.2017 16:34 by igrik.)
27.03.2017 16:33
Visit this user's website Find all posts by this user Quote this message in a reply
hippocamus Offline

Posts: 517
Post: #692

Вот всегда инстересовал вопрос - почему многие ресиверы нормально обрабатываются в ?!PI, но не работают в качестве инструкций #! ?
Что вообще допустимо в инструкциях?

(да, у вас переставлены местами символы ? и !. старого ермиста не проведёшь!)


-= подпись Гиппокамуса =-
03.04.2017 05:46
Visit this user's website Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #693

(03.04.2017 05:46)hippocamus Wrote:  Вот всегда инстересовал вопрос - почему многие ресиверы нормально обрабатываются в ?!PI, но не работают в качестве инструкций #! ?
Что вообще допустимо в инструкциях?
Немного странный вопрос если честно. Это же разные участки кода, куда поставлены хуки триггеров и инструкции.
(03.04.2017 05:46)hippocamus Wrote:  (да, у вас переставлены местами символы ? и !. старого ермиста не проведёшь!)
Зачем его пытаться провести, когда он сам это делает с успехом. Либо кто-то уже совсем старый в этом деле, и кое-что успел подзабыть. 96-copy


game bug fixes extended.dll || My Plugins || My GitHub
(This post was last modified: 03.04.2017 11:45 by igrik.)
03.04.2017 11:35
Visit this user's website Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 118
Post: #694

Hello
Привет!

Sorry for English! I will try to translate with Yandex...
Извините за английский! Я попытаюсь перевести с Яндекс...

Is it possible to link these includes that were previously available here ?
Можно ли связать эти включает в себя, которые ранее были доступны здесь ?

Would be very nice for making plugins)
Было бы очень хорошо для создание плагинов)

Code:
#include "targetver.h"

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

#include "..\..\include\patcher_x86_commented.hpp"
#include "..\..\include\HotA\HoMM3.h"
#include "..\..\include\era.h"
12.08.2017 05:18
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 624
Post: #695

17.08.2017 09:59
Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 118
Post: #696

Thank you)
Спасибо)

By any chance, you wouldn't happen to have an example of creating a custom dialog? I understand how to use 0x4F6C00 but I can't figure how to make one from scratch ..
Вы случайно не пример создания пользовательского диалогового окна? Я понимаю, как использовать 0x4F6C00, но я не могу понять, как сделать один с нуля 105
18.08.2017 00:20
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 624
Post: #697

No, I haven't.
If I'll need it someday, probably I will use !!DL and ExecErm.
18.08.2017 01:57
Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #698

(18.08.2017 00:20)RoseKavalier Wrote:  By any chance, you wouldn't happen to have an example of creating a custom dialog? I understand how to use 0x4F6C00 but I can't figure how to make one from scratch ..
Уфф!!! И у меня наконец-то что-то начало получаться:
Code:
void AdvMgr_ShowTestDlg(int x, int y)
{
    int cx = 256;    // ширина (width)
    int cy = 106;    // высота (height)
    int zx = 22;    // отступ по x
    int zy = 55;    // отступ по y

    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, cx, cy, DF_SCREENSHOT | DF_SHADOW, NULL);                                // создали диалог
    dlg->AddItemByZOrder(_DlgStdBackground_::Create(0,0,dlg->width,dlg->height, 0, 0, o_GameMgr->GetMeID()), 0);    // рамка в цвете игрока
    // dlg->AddItem(_DlgBlueBackground_::Create(0,0, dlg->width, dlg->height, o_GameMgr->GetMeID()));                // синяя рамка как в HD
    dlg->AddItem(_DlgStaticText_::Create(0, 20, dlg->width, 42, "Вы действительно хотите выйти?", "medfont.fnt", 1, 0, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // заголовок
        
    // делаем кнопку ок
    dlg->AddItem(_DlgStaticPcx8_::Create(zx, dlg->height -zy, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(zx +1, dlg->height -zy +1, 64, 30, 30722, "iOkay.def", 0, 1, 0, 28, 2));
    // dlg->GetItem(30722)->SetEnabled(0); отключенная кнопка ok

    // делаем кнопку отмена
    dlg->AddItem(_DlgStaticPcx8_::Create(dlg->width - zx -64, dlg->height -zy, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(dlg->width - zx -64 +1, dlg->height -zy +1, 64, 30, 30721, "iCancel.def", 0, 1, 0, 1, 2));

    dlg->Run();
    dlg->Destroy(TRUE);
}


game bug fixes extended.dll || My Plugins || My GitHub
(This post was last modified: 18.08.2017 16:23 by igrik.)
18.08.2017 15:39
Visit this user's website Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 118
Post: #699

@feanor
Sadly, cannot use ERM for what I want (SoD).

@igrik
Very nice!
I will try it and see if I can get some more things figured out and share back results)
18.08.2017 17:24
Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 118
Post: #700

I've not managed to discover much except about this:
   
Right-click window message on item
Code:
_DlgItem_* it;
it = dlg->GetItem(7);
it->full_tip_text = "This is right-click popup message.";

Dialog only open during right-click
Code:
//dlg->Run(); // don't use this
//dlg->Destroy(TRUE); // don't use this
dlg->RMC_Show();

Some work done... not sure if I should make it available to public even with multiplayer checks. I don't mind sharing code, just don't want it to fall in wrong hands, opinions? 105


Some things I'm interested in (if anyone knows) :
  1. assign a variable/function to a clicked item (not only button, also defs - see 4/5)
  2. read text in the edit dialog
  3. make edit dialog numbers/text only
  4. make the highlighted cadre when clicking an item (like level-up skills)
  5. changing defs (like HWrulez button)

I think some of these may be connected to each other but I could not figure it out so far.

4:
Image: y37dzBk.png
5:
Image: U8Ge7fJ.png

Any help greatly appreciated)
02.09.2017 08:13
Find all posts by this user Quote this message in a reply
Valery Offline

Posts: 2196
Post: #701

Can't add a check if game is MP or single, as cheat codes? Then I see no problem with releasing the code, btw great job132
02.09.2017 14:18
Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #702

Code:
1. int __stdcall Y_HeroLvlUp_3x_Proc(HiHook* hook, _Struct_* dlg, _EventMsg_* msg)
{
    if (msg->type == MT_MOUSEBUTTON)
    {
        if (msg->subtype == MST_LBUTTONCLICK)
        {
            if (msg->item_id == 7012)
            {    
                dlg->GetItem(2012)->SendCommand(6, 4); dlg->GetItem(2012)->Draw();
                dlg->GetItem(2013)->SendCommand(6, 4); dlg->GetItem(2013)->Draw();
                dlg->GetItem(7013)->SendCommand(5, 4); dlg->GetItem(7013)->Draw();
                dlg->GetItem(30722)->SetEnabled(1);
                dlg->Redraw(TRUE);                
            }
    return CALL_2(int, __thiscall, hook->GetDefaultFunc(), dlg, msg);
}

2, 3.     sprintf(o_TextBuffer, "%s либо %s %s.", ((_DlgStaticText_*)dlg->GetItem(2005))->text, *(int*)((*(int*)((*(int*)0x6A7F68) +32)) + 4*hero->second_skill[SSkill]), *(int*)(*(int*)0x67DCF0 + SSkill*16) );
    ((_DlgStaticText_*)dlg->GetItem(2005))->SetText(o_TextBuffer);

4.     dlg->AddItem(CALL_8 (_DlgItem_*, __thiscall, 0x44FE00, o_New(56), 257, 325, 46, 46, 7013, *(int*)(*(int*)0x6AAD18 + 118), 1024));
    dlg->GetItem(7013)->SendCommand(5, 4);

5. ((_DlgStaticDef_*)dlg->GetItem(7012))->def_frame_index = your_number;

Image: YK78FzIHOww.jpg


game bug fixes extended.dll || My Plugins || My GitHub
(This post was last modified: 02.09.2017 14:40 by igrik.)
02.09.2017 14:28
Visit this user's website Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 118
Post: #703

(02.09.2017 14:18)Valery Wrote:  Can't add a check if game is MP or single, as cheat codes? Then I see no problem with releasing the code, btw great job132
Merci, I think the inspiration should look familiar to you!
Of course, almost all my code has no-multiplayer check, but anyone with a little knowledge and bad intentions could circumvent it - hence my hesitation.

(02.09.2017 14:28)igrik Wrote:  

Fantastic, it seems you've figured most of it already) :D 132

Another question: how about "mouse-over text"?
Code:
dlg->AddItemByZOrder(_DlgStdBackground_::Create(x, y, w, h, id, bottom_bar=TRUE, player_id), 0);
[...]
dlg->GetItem(some_id)->short_tip_text = "Text to show in bottom bar."

//guess you need text in bottom bar
dlg->AddItem(_DlgStaticText_::Create(x, y, w, h, ?messageText?, font, color, id, ALIGN_H_CENTER | ALIGN_V_TOP, bkcolor));

Image: mG2HQae.png
02.09.2017 19:17
Find all posts by this user Quote this message in a reply
Valery Offline

Posts: 2196
Post: #704

(02.09.2017 19:17)RoseKavalier Wrote:     but anyone with a little knowledge and bad intentions could circumvent it - hence my hesitation.

If a player is motivated enough to change your code in order to cheat, it already means he can already cheat by using other obvious tools, as playing the autosaves on another device and find how split works anyway.
02.09.2017 20:20
Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #705

(02.09.2017 19:17)RoseKavalier Wrote:  Another question: how about "mouse-over text"?
Смотри тут. Это недописанное окно командира.
Code:
_DlgStaticDef_* CommDef;
_DlgStaticTextPcx8ed_* statbar = NULL;

// показ сообщения по ПКМ на первичных навыках командира
void Y_New_CommanderDlg_ShowPreSkill_RMC(int npc_id, int skill)
{
    int skill_power = *(int*)(0x28620C0 + 296 * npc_id + 56 + skill*4); // получить силу скила
    char* text = "";
    int sizeX, sizeY;

    bool art_npc_155 = false;    
    for (char i = 0; i < 6; ++i ){
        if (o_Npc[npc_id].arts[i][0] == 155 )
            art_npc_155 = true;    
    }
    if ( !art_npc_155 || skill_power > 1 )
    {
        text = Get_ITxt(skill_power + 136 + skill *6, 1);        // получить строку в текстовике в зависимости от силы скила
        sizeX = 560; sizeY = 440;
    }
    else
    {
        text = Get_ITxt(skill + 236, 1);
        sizeX = 340; sizeY = 220;
    }

    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, sizeX, sizeY, DF_SCREENSHOT | DF_SHADOW, NULL);                            
    dlg->AddItemByZOrder(_DlgStdBackground_::Create(0, 0, dlg->width, dlg->height, 0, 0, o_GameMgr->GetMeID()), 0);
    
    dlg->AddItem(_DlgStaticDef_::Create(dlg->width/2 -35, 25, 70, 70, 2, "ComSkls2.def", skill_power + skill*7 + 6*art_npc_155, 0, 0x12));          
    dlg->AddItem(_DlgStaticText_::Create(25, 95, dlg->width -50, dlg->height -25 -95, text, "medfont.fnt", 1, 3, ALIGN_H_CENTER | ALIGN_V_TOP, 0));

    dlg->RMC_Show();
}

int __stdcall Y_New_CommanderDlg_Proc(_Dlg_* dlg_Npc, _EventMsg_* msg)
{
    int r = dlg_Npc->DefProc(msg);

    int npc_id = dlg_Npc->field_64; // получаем номер командира/героя
    _Npc_* npc = GetNpc(npc_id); // получаем структуру командира
    _Hero_* hero = o_GameMgr->GetHero(npc_id); // структура героя
    int temp_1, temp_2; // временная переменная

    // обновление подсказки при движении мыши (id = 10)
    if (msg->type == MT_MOUSEOVER)
        {
            _DlgItem_* it = dlg_Npc->FindItem(msg->x_abs, msg->y_abs);
            char* text = "";
            if (it)    
            {
                switch (it->id)
                {
                    case 3:     text = Get_ITxt(263, 1); break; // подсказка Уволить командира
                    case 4:     text = Get_ITxt(273, 1); break; // подсказка для просмотра биографии
                    case 6:  text = Get_ITxt(npc->type + 10, 1); break; // подсказка первого спец_умения
                    case 7:  text = Get_ITxt(npc->type + 10, 2); break; // подсказка второго спец_умения
                    case 11: text = Get_ITxt(259, 1); break; // подсказка Имя командира

                    case 12: text = Get_ITxt(npc->lvl_attack + 100, 1);      break; // подсказка дефа навыка атаки
                    case 13: text = Get_ITxt(npc->lvl_defence + 106, 1);     break; // подсказка дефа навыка защиты
                    case 14: text = Get_ITxt(npc->lvl_hit_points + 112, 1);  break; // подсказка дефа навыка здоровья
                    case 15: text = Get_ITxt(npc->lvl_damage + 118, 1);       break; // подсказка дефа навыка урона
                    case 16: text = Get_ITxt(npc->lvl_spell_power + 124, 1); break; // подсказка дефа навыка силы магии
                    case 17: text = Get_ITxt(npc->lvl_speed + 130, 1);       break; // подсказка дефа навыка скорости

                    case 31: case 61: sprintf(o_TextBuffer, "%s%d", Get_ITxt(264, 1), npc->now_level +1); text = o_TextBuffer; break;// подсказка уровня командира
                    case 32: case 33: text = Get_ITxt(242, 1);       break; // подсказка класса командира
                    case 34: case 35: sprintf(o_TextBuffer, "%s%s", Get_ITxt(266, 1), hero->name); text = o_TextBuffer; break;// подсказка хозяина героя
                    case 36: case 37: sprintf(o_TextBuffer, "%s%d", Get_ITxt(267, 1), npc->now_expa); text = o_TextBuffer; break;// подсказка текущего опыта
                    case 38: case 39: sprintf(o_TextBuffer, "%s%d", Get_ITxt(268, 1), CALL_1(int, __thiscall, 0x769260, npc)); text = o_TextBuffer; break;// подсказка следующего опыта

                    case 40: text = Get_ITxt(269, 1); break; // подсказка навыки класса
                    case 41: text = Get_ITxt(270, 1); break; // подсказка артефакты
                    case 42: text = Get_ITxt(271, 1); break; // подсказка основные навыки
                    case 43: text = Get_ITxt(272, 1); break; // подсказка вторичные навыки

                    case 45: temp_1 = Get_NpcSkillPower(npc, 0); temp_2 = hero->attack;
                             if ( npc->type == 7 ) temp_2 += (temp_2/2);
                             sprintf(o_TextBuffer, Get_ITxt(275, 2), temp_1 + temp_2); text = o_TextBuffer; break;                                            // подсказка атака
                    case 46: temp_1 = Get_NpcSkillPower(npc, 1); temp_2 = hero->defence;
                             if ( npc->type == 7 ) temp_2 += (temp_2/2);
                             sprintf(o_TextBuffer, Get_ITxt(276, 2), temp_1 + temp_2); text = o_TextBuffer; break;                                            // подсказка защита

                    case 47: sprintf(o_TextBuffer, Get_ITxt(277, 2), Get_NpcSkillPower(npc, 2)); text = o_TextBuffer; break;                                // подсказка здоровье
                    case 48: sprintf(o_TextBuffer, Get_ITxt(278, 2), Get_NpcSkillPower(npc, 3)/2, Get_NpcSkillPower(npc, 3)); text = o_TextBuffer; break;    // подсказка сила урон
                    case 49: sprintf(o_TextBuffer, Get_ITxt(279, 2), Get_NpcSkillPower(npc, 4)); text = o_TextBuffer; break;                                // подсказка сила магии
                    case 50: sprintf(o_TextBuffer, Get_ITxt(280, 2), Get_NpcSkillPower(npc, 6)); text = o_TextBuffer; break;                                // подсказка сопротивление
                    case 51: sprintf(o_TextBuffer, Get_ITxt(281, 2), ((npc->specBon[0] & 0x10) ? 24 : 0)); text = o_TextBuffer; break;                        // подсказка боезапас
                    case 52: sprintf(o_TextBuffer, Get_ITxt(282, 2), Get_NpcSkillPower(npc, 5)); text = o_TextBuffer; break;                                // подсказка скорость

                    case 30722:    text = Get_ITxt(261, 1); break; // Ok Выход
                    default: text = "";    break;
                }
            statbar->SetText(text);
            statbar->Draw();
            statbar->RedrawScreen();
            }
        }


    if (msg->type == MT_MOUSEBUTTON)
            {
                if (msg->subtype == MST_RBUTTONDOWN) // клик ПКМ
                {
                    switch (msg->item_id)
                    {
                        case 3: b_MsgBox(Get_ITxt(201, 1), MBX_RMC);            break;  // Уволить командира
                        case 4: case 11: b_MsgBox(Get_ITxtBio(npc_id, 1), MBX_RMC);            break;  // ПКМ для просмотра биографи
                        case 6: b_MsgBox(Get_ITxt(npc->type + 19, 1), MBX_RMC);        break;  // ПКМ первого спец_умения
                        case 7: b_MsgBox(Get_ITxt(npc->type + 19, 2), MBX_RMC);        break;  // ПКМ второго спец_умения

                        case 12: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 0);     break; // ПКМ дефа навыка атаки
                        case 13: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 1);     break; // ПКМ дефа навыка защиты
                        case 14: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 2);     break; // ПКМ дефа навыка здоровья
                        case 15: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 3);     break; // ПКМ дефа навыка урона
                        case 16: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 4);     break; // ПКМ дефа навыка силы магии
                        case 17: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 5);     break; // ПКМ дефа навыка скорости

                        case 32: case 33: b_MsgBox(Get_ITxt(npc->type + 186, 1), MBX_RMC);        break;  // ПКМ на описании класса

                        case 30722: b_MsgBox(Get_ITxt(261, 2), MBX_RMC); break; // ПКМ Ok Выход
                    }
                }
            }
    return r;
}
// новое диалоговое окно командира для ERA (0x0076A46E)
int Y_New_CommanderDlg_Show(int NHero_id, bool lvl_up)
{
    _Npc_* npc = GetNpc(NHero_id); // получаем структуру командира
    _Hero_* hero = o_GameMgr->GetHero(NHero_id); // структура героя
    int sizeX, sizeY;
    char* name_pcx;
    
    if (!lvl_up)    {
        name_pcx = "DlgCom0.pcx";    
        sizeX = 634; sizeY = 505;
    }
    else {
        name_pcx = "DlgCom1.pcx";    
        sizeX = 634; sizeY = 600;    
    }

    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, sizeX, sizeY, DF_SCREENSHOT | DF_SHADOW, Y_New_CommanderDlg_Proc);

    // деф командира
    dlg->field_64 = NHero_id; // сохраняем номер командира в структуре диалога для Dlg_Proc
    dlg->AddItem(_DlgStaticPcx8_::Create(20, 70, 100, 130, 4, "CRBKGNEU.pcx")); // фон замка под дефом командира нейтральный (id = 4)
    dlg->AddItem(CommDef = _DlgStaticDef_::Create(-130, -80, 100, 130, 5, o_CreatureInfo[npc->type + 174].def_name, 0, 0, 0x12)); // шагающий деф командира (id = 5)

    // задник диалога под цвет игрока (id = 1)
    _DlgStaticPcx8_* fonPcx;
    dlg->AddItem(fonPcx = b_DlgStaticPcx8_Create(0, 0, dlg->width, dlg->height, 1, name_pcx, 2048));
    fonPcx->Colorize(o_GameMgr->GetMeID());

    // кнопки ок и уволить
    dlg->AddItem(_DlgButton_::Create(285, dlg->height -76, 64, 30, 30722, "iOkay.def", 0, 1, 1, 28, 2)); // кнопка ok (id = 30722)
    dlg->AddItem(_DlgButton_::Create(564, dlg->height -76, 51, 35, 3, "hsbtns2.def", 0, 1, 1, 28, 2));   // кнопка удалить командира (id = 3)
    CALL_3 (void, __thiscall, 0x50CEA0, o_MouseMgr, 0, 0);  // установить курсор(0,0)

    dlg->AddItem(_DlgStaticText_::Create(20, 70, 100, 130, "", "medfont.fnt", 1, 4, ALIGN_H_CENTER | ALIGN_V_CENTER, 0));  // подсказка на дефе (пустышка, но по ней ПКМ определяет id и выдает окно биографии)
    
    // дефы спец_умений командира
    dlg->AddItem(_DlgStaticDef_::Create(395, 113, 43, 43, 6, "ComSkls.def", npc->type *2, 0, 0x12));    // первый деф спец_умений (id = 6)
    dlg->AddItem(_DlgStaticDef_::Create(504, 113, 43, 43, 7, "ComSkls.def", npc->type *2 +1, 0, 0x12)); // первый деф спец_умений (id = 7)

    // подсказка в статус баре    
    statbar = _DlgStaticTextPcx8ed_::Create(8, dlg->height -18 -8, dlg->width - 16, 18, "Подсказка", "smalfont.fnt", "HD_TStat.pcx", 1, 10, ALIGN_H_CENTER | ALIGN_V_CENTER);
    dlg->AddItem(statbar);

    dlg->AddItem(_DlgStaticText_::Create(131, 18, 370, 17, npc->name, "medfont.fnt", 7, 11, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // имя командира (id = 11)

    // артефакты (id 20...25)
    bool art_npc_155 = false;
    for (char i = 0; i < 6; ++i ){
        if (npc->arts[i][0] > 0 )
            dlg->AddItem(_DlgStaticDef_::Create(330 +48*i, 184, 45, 45, 20, "artifact.def", npc->arts[i][0], 0, 0x12));
        if (npc->arts[i][0] == 155 )
            art_npc_155 = true;            
    }

    // скилы (id 12...17)
    for (char i = 0; i < 6; ++i ){
        int art_freme_skill = *(int*)(0x28620C0 +296*NHero_id +56 +4*i);
        if (art_freme_skill < 2 && art_npc_155)
            art_freme_skill = 6;
        dlg->AddItem(_DlgStaticDef_::Create(40 +96*i, 270, 70, 70, 12+i, "ComSkls2.def", art_freme_skill +7*i, 0, 0x12));
    }

    dlg->AddItem(_DlgStaticText_::Create(22, 46, 96, 18, Get_ITxt(264, 1), "medfont.fnt", 7, 31, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // уровень_текст (id = 31)
    sprintf(o_TextBuffer, "%d", npc->now_level +1);
    dlg->AddItem(_DlgStaticText_::Create(22, 46, 96, 18, o_TextBuffer, "medfont.fnt", 1, 61, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0)); // уровень_число (id = 61)

    dlg->AddItem(_DlgStaticText_::Create(16, 205, 104, 18, Get_ITxt(265, 1), "medfont.fnt", 7, 32, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // класс_текст1 (id = 32)
    dlg->AddItem(_DlgStaticText_::Create(16, 220, 104, 18, Get_ITxt(npc->type +216, 1), "medfont.fnt", 1, 33, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // класс_текст2 (id = 33)

    dlg->AddItem(_DlgStaticText_::Create(128, 46, 192, 18, Get_ITxt(266, 1), "medfont.fnt", 7, 34, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Хозяин_текст (id = 34)
    dlg->AddItem(_DlgStaticText_::Create(128, 46, 192, 18, hero->name, "medfont.fnt", 1, 35, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0)); // Хозяин_имя (id = 35)
    
    dlg->AddItem(_DlgStaticText_::Create(330, 46, 284, 18, Get_ITxt(267, 1), "medfont.fnt", 7, 36, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Текущий_опыт_текст (id = 36)
    sprintf(o_TextBuffer, "%d", o_Npc[NHero_id].now_expa);
    dlg->AddItem(_DlgStaticText_::Create(330, 46, 284, 18, o_TextBuffer, "medfont.fnt", 1, 37, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0)); // Текущий_опыт_число (id = 37)    

    dlg->AddItem(_DlgStaticText_::Create(330, 68, 284, 18, Get_ITxt(268, 1), "medfont.fnt", 7, 38, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Следующий_уровень_текст (id = 38)

    sprintf(o_TextBuffer, "%d", CALL_1(int, __thiscall, 0x769260, npc));
    dlg->AddItem(_DlgStaticText_::Create(330, 68, 284, 18, o_TextBuffer, "medfont.fnt", 1, 39, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));   // Следующий_уровень_число (id = 39)    

    dlg->AddItem(_DlgStaticText_::Create(377, 91, 192, 18, Get_ITxt(269, 1), "medfont.fnt", 7, 40, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // Навыки_класса_текст (id = 40)
    dlg->AddItem(_DlgStaticText_::Create(377, 160, 192, 18, Get_ITxt(270, 1), "medfont.fnt", 7, 41, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // Артефакты_текст (id = 41)

    dlg->AddItem(_DlgStaticText_::Create(133, 247, 366, 18, Get_ITxt(271, 1), "medfont.fnt", 7, 42, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // Основные_навыки_текст (id = 42)
    dlg->AddItem(_DlgStaticText_::Create(133, 344, 366, 18, Get_ITxt(272, 1), "medfont.fnt", 7, 43, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // Вторичные_навыки_текст (id = 43)
    
    int temp_1, temp_2; // временные переменные

    temp_1 = Get_NpcSkillPower(npc, 0);     temp_2 = hero->attack;
    if ( npc->type == 7 ) temp_2 += (temp_2/2);
    sprintf(o_TextBuffer, "%d (%d)", temp_1, temp_1 + temp_2);
    dlg->AddItem(_DlgStaticText_::Create(128, 69, 192, 18, o_TextBuffer, "medfont.fnt", 1, 65, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Атака_число (id = 65)
    dlg->AddItem(_DlgStaticText_::Create(128, 69, 192, 18, Get_ITxt(275, 1), "medfont.fnt", 7, 45, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Атака_текст (id = 45)

    temp_1 = Get_NpcSkillPower(npc, 1);     temp_2 = hero->defence;
    if ( npc->type == 7 ) temp_2 += (temp_2/2);
    sprintf(o_TextBuffer, "%d (%d)", temp_1, temp_1 + temp_2);
    dlg->AddItem(_DlgStaticText_::Create(128, 91, 192, 18, o_TextBuffer, "medfont.fnt", 1, 66, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Защита_число (id = 66)
    dlg->AddItem(_DlgStaticText_::Create(128, 91, 192, 18, Get_ITxt(276, 1), "medfont.fnt", 7, 46, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Защита_текст (id = 46)

    sprintf(o_TextBuffer, "%d", Get_NpcSkillPower(npc, 2));
    dlg->AddItem(_DlgStaticText_::Create(128, 113, 192, 18, o_TextBuffer, "medfont.fnt", 1, 67, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Здоровье_число (id = 67)
    dlg->AddItem(_DlgStaticText_::Create(128, 113, 192, 18, Get_ITxt(277, 1), "medfont.fnt", 7, 47, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Здоровье_текст (id = 47)

    temp_1 = Get_NpcSkillPower(npc, 3);
    sprintf(o_TextBuffer, "%d - %d", temp_1/2, temp_1);
    dlg->AddItem(_DlgStaticText_::Create(128, 135, 192, 18, o_TextBuffer, "medfont.fnt", 1, 68, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Урон_число (id = 68)
    dlg->AddItem(_DlgStaticText_::Create(128, 135, 192, 18, Get_ITxt(278, 1), "medfont.fnt", 7, 48, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Урон_текст (id = 48)

    sprintf(o_TextBuffer, "%d", Get_NpcSkillPower(npc, 4));
    dlg->AddItem(_DlgStaticText_::Create(128, 157, 192, 18, o_TextBuffer, "medfont.fnt", 1, 69, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Сила_магии_число (id = 69)
    dlg->AddItem(_DlgStaticText_::Create(128, 157, 192, 18, Get_ITxt(279, 1), "medfont.fnt", 7, 49, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Сила_магии_текст (id = 49)

    sprintf(o_TextBuffer, "%d%%", Get_NpcSkillPower(npc, 6));
    dlg->AddItem(_DlgStaticText_::Create(128, 179, 192, 18, o_TextBuffer, "medfont.fnt", 1, 70, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Сопротивление_число (id = 70)
    dlg->AddItem(_DlgStaticText_::Create(128, 179, 192, 18, Get_ITxt(280, 1), "medfont.fnt", 7, 50, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Сопротивление_текст (id = 70)

    sprintf(o_TextBuffer, "%d", (npc->specBon[0] & 0x10 ? 24 : 0));
    dlg->AddItem(_DlgStaticText_::Create(128, 201, 192, 18, o_TextBuffer, "medfont.fnt", 1, 71, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Боезапас_число (id = 71)
    dlg->AddItem(_DlgStaticText_::Create(129, 201, 192, 18, Get_ITxt(281, 1), "medfont.fnt", 7, 51, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Боезапас_текст (id = 51)

    sprintf(o_TextBuffer, "%d", Get_NpcSkillPower(npc, 5));
    dlg->AddItem(_DlgStaticText_::Create(128, 223, 192, 18, o_TextBuffer, "medfont.fnt", 1, 72, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Скорость_число (id = 72)
    dlg->AddItem(_DlgStaticText_::Create(128, 223, 192, 18, Get_ITxt(282, 1), "medfont.fnt", 7, 52, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Скорость_текст (id = 52)

    dlg->Run();
    dlg->Destroy(TRUE);

    return 1;
}

Структура командира:
Code:
#define o_Npc ((_Npc_*)0x28620C0)         // получение структуры командира

struct _Npc_;

// Структура командира 0x128h (296)
NOALIGN struct _Npc_
{
_dword_ on;               // 0x00     +0    Доступность
_dword_ alive;            // 0x04     +4    Жив_или_мёртв  
_dword_ id;               // 0x08     +8    Номер_героя_хозяина (ну и номер командира)
_dword_ type;             // 0x0C     +12   Тип_командира
_dword_ type_Hero;        // 0x10     +16   Тип_героя
_dword_ LastExpaInBattle; // 0x14     +20   Опыт в прошлых битвах
_dword_ CustomPrimary;    // 0x18     +24   Если вы установить 1 (вкл), первичные навыки не будут изменяться с продвижением командира по уровням
                           //                Если установить 0, то здоровье и урон  будут автоматически прибавляться вместе с уровнем командира (из ERM Help = CO:P)
_dword_ attack;           // 0x1C     +28   Атака
_dword_ defence;          // 0x20     +32   Защита
_dword_ hit_points;       // 0x24     +36   Здоровье
_dword_ damage;           // 0x28     +40   Урон
_dword_ spell_power;      // 0x2C     +44   Сила_магии
_dword_ speed;            // 0x30     +48   Скорость
_dword_ resistance;       // 0x34     +52   Сопротивление

_dword_ lvl_attack;       // 0x38     +56   Уровень_Атаки
_dword_ lvl_defence;      // 0x3C     +60   Уровень_Защиты
_dword_ lvl_hit_points;   // 0x40     +64   Уровень_Здоровья
_dword_ lvl_damage;       // 0x44     +68   Уровень_Урона
_dword_ lvl_spell_power;  // 0x48     +72   Уровень_Сила_магии
_dword_ lvl_speed;        // 0x4C     +76   Уровень_Скорости
_dword_ lvl_resistance;   // 0x50     +80   Уровень_Сопротивления

_word_ arts[10][8];       // 0x54     +84   Номер_артефакта; Кол-во проведённых с ним битв
_char_ name[32];          // 0xF4     +244  Имя
_dword_ old_expa;         // 0x114    +276  Старый_опыт_героя
_dword_ now_expa;         // 0x118    +280  Текущий_опыт
_dword_ now_level;        // 0x11C    +284  Текущий_уровень (при отображении добавляем +1)
_dword_ specBon[2];       // 0x120    +288  Особые_бонусы(сумма_битов); Запрещенные_бонусы(сумма_битов)
};

// функция получения адреса структуры командира
inline _Npc_*  GetNpc(_int_ hero_id) {return ((_Npc_ *)(0x28620C0 + 296 * hero_id));}
// функция получения строк из командирского текстовика "znpc00.txt"
inline char* Get_ITxt(int StrNum, int ItemNum) {return CALL_3 (char*, __cdecl, 0x77710B, StrNum, ItemNum, 0x2860724);}
// функция получения строк из командирского текстовика "znpc01.txt" Имена и биографии
inline char* Get_ITxtBio(int StrNum, int ItemNum) {return CALL_3 (char*, __cdecl, 0x77710B, StrNum, ItemNum, 0x286072C);}
// функция получения силы первичного командирского навыка
inline int Get_NpcSkillPower(_Npc_* npc, int skill_id) {return CALL_2 (int, __thiscall, 0x769460, npc, skill_id);}
Image: B9WQ3qs.jpg


game bug fixes extended.dll || My Plugins || My GitHub
(This post was last modified: 27.09.2017 11:29 by igrik.)
03.09.2017 01:15
Visit this user's website Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group