Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ERM-консоль
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
feanor
Плагин, добавляющий в чат несколько дополнительных команд и возможность исполнения ERM.

https://dl.dropboxusercontent.com/u/61759222/HoMM/chalk.era (v001)
https://dl.dropbox.com/u/61759222/HoMM/chalk.rar (исходники)



Команды:
  • /showfps - включает отображение FPS вместо строки чата
  • /leveldebugger - включает встроенный "отладчик карты". Единственная функция, которую я заметил - отображение координат в подсказке по почве.
  • /execerm <command> - исполнение ERM-команды. Команда приводится без предваряющих восклицательных знаков, но с точкой-с-запятой (т.е. /execerm IF:L^Hello!^; ). Поддерживаются !!HE-1 и v998/999/1000 (ограниченно)
  • /heroid - номер, имя и адрес структуры текущего героя.
  • !!<command> - аналогично execerm.
  • [здесь может быть ваше пожелание]



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

void InitWoGSpecials()
{
    if (*(int *)(*(int*)0x69CCFC + 4)!=-1)
    {
        HERO* currhero = (HERO*)GetHeroRecord(*(int *)(*(int*)0x69CCFC + 4));

        *(int*)0x27F9970 = (int)currhero;
        ErmV[998] = currhero->x;
        ErmV[999] = currhero->y;
        ErmV[1000] = currhero->l;

        ErmF[1000]= !CALL_1(int, __thiscall, 0x4BAA60, *(int*)0x69CCFC);
    }
}

void PrintString(char* str)
{
        char buf[1024];

        sprintf(buf,"IF:L^{~green}%s{~}^;",str);
        ExecErmCmd(buf);

        /*sprintf(buf,"IF:L^%s^;",str);
        EventParams[1] = str*/
}

void __stdcall  OnChat(PEvent e)
{
    if(EventParams[0] == 1)
    {
        EventParams[2] = 1;

        char *buf=(char*)malloc(32+strlen((const char*)EventParams[1]));
        sprintf(buf,"IF:L^{~%s}%s{~}^;\0","lime",EventParams[1]);
        ExecErmCmd(buf);
        free(buf);

        char str[256];

        if(!stricmp((const char*)EventParams[1],"/showfps"))
            {
                *(int*)((*(int*)0x6992B8)+0x3C) = !*(int*)((*(int*)0x6992B8)+0x3C);
                PrintString("FPS switched off");
            }

        if(!stricmp((const char*)EventParams[1],"/leveldebugger"))
            {
                *(int*)0x698A18 = !*(int*)0x698A18;
                PrintString(*(int*)0x698A18?"Level debugger switched on":"Level debugger switched off");
            }

        if(!stricmp((const char*)EventParams[1],"/heroid"))
            {
                int id = *(int *)(*(int*)0x69CCFC + 4);
                if (id!=-1)
                {
                    sprintf(str,"%s: id %i, struct at 0x%08X",
                                                        ((HERO*)GetHeroRecord(id))->Name,
                                                        id,
                                                        GetHeroRecord(id)
                             );
                }
                else
                {
                    strcpy(str,"Hero not selected");
                }

                PrintString(str);
            }

        if(!strnicmp((const char*)EventParams[1],"/execerm",strlen("/execerm")))
        {
            InitWoGSpecials();

            ExecErmCmd((char*)(strlen("/execerm")+1+EventParams[1]));
            PrintString("Executed");
        }

        if(!strnicmp((const char*)EventParams[1],"!!",strlen("!!")))
        {
            InitWoGSpecials();

            ExecErmCmd((char*)(strlen("!!")+EventParams[1]));
            PrintString("Executed");
        }


        //ExecErmCmd(str);
        //MessageBoxA(0,(LPCSTR)(EventParams[1]),(LPCSTR)str,0);
    }
}



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
        ConnectEra();    
        RegisterHandler(OnChat, "OnChat");
    }
    return TRUE;
}

Сорцы и нормальная заливка будут позже.
Berserker
Вспомнилось:

Код
ZVSE
!?FU77003;
!!SN:W^InChat^/?y1;
!!SN&y1=1:Q;

!?FU77014;
!!SN:X?y1;

!!if&y1=0:;
  !!SN:W^InChat^/1;
!!en:;

!!if&y1=1:;
  !!SN:X?y1/?z1/0;
  !!SN:L^Era.dll^/?y10 Ay10/^ExecErmCmd^/?y11 Ey11/0/z1;
!!en:;

!!if&y1=2:;
  !!SN:W^InChat^/0;
!!en:;
feanor
Упс. Ну ладно, у меня понтовее happy.gif
Berserker
Кстати, а почему бы точку с запятой автоматом не добавлять?
feanor
Цитата
Кстати, а почему бы точку с запятой автоматом не добавлять?

Мысль была, но она пришла ровно через шестьдесят одну секунду после нажатия кнопки "Загрузить".


Кстате, еще какие команды нужны?
feanor
Версия..ну пусть 001 (от 18 часов 26 июля 2012 года)

[*] Исправлена ошибка (точнее, не оправдавшая себя фича), из-за которой нельзя было вводить чит-коды
[+] Добавлены команды /chalk (выводит список команд и дату/время компиляции плагина), /console on|off (включение/отключение консоли)
[+] Вывод в чат теперь идет без посредства ERM.
[+] Точка с запятой теперь добавляется автоматически

http://zalil.ru/33613281 - плагин
https://dl.dropbox.com/u/61759222/HoMM/chalk.rar - код+плагин+меньшая вероятность потери ссылки
Bes
если написать группу команд для одного ресивера через пробел, они будут адекватно обработаны?
Например:
Код
!!BM0:S2 P12;


и второй вопрос:
можно ли так же через пробел использовать разные ресиверы?
Например:
Код
!!BM0:S2; !!BM1:P12

feanor
Цитата
если написать группу команд для одного ресивера через пробел, они будут адекватно обработаны?

Да.

Цитата
можно ли так же через пробел использовать разные ресиверы?

Нет, выполнится только первый
Berserker
Можно, конечно, по ";" разбивать строку и вызывать ExecErmCmd на каждой.
Bes
feanor
активирую чат (жму TAB), нажимаю ВВОД (Enter)
= безмолвный вылет игры (

Версия: chalk 001 (18:03:18 от 26 июля 2012 года)
feanor
Хм. У меня все норм.
Кто-нибудь еще, подтвердите или опровергните?
hippocamus
У меня почему-то не активируется плагин. Но и не вылетает. Пишет: "Красный:"
Плагин помещён в Mods\Wog\EraPlugins\
Версия Эры 2.41
Моды: Wog, Wog Rus, Wog Revised
feanor
Цитата
У меня почему-то не активируется плагин. Но и не вылетает. Пишет: "Красный:"

Это при tab+enter? Дак палгин и не должен в этом случае ничего делать, так что все нормально
hippocamus
Команда !!IF:M^2^; не работает.
Bes
Цитата(feanor @ 08 Jan 2013, 16:27) *
Хм. У меня все норм.
Кто-нибудь еще, подтвердите или опровергните?

вылет был на era+HD3.28fв оконном режиме. Повторно пробовал в полноэкранном.... вылетело так: tab+enter+enter. ошибка приложения, будет закрыто (диалог win7, никаких крашлогов не создавалось). Пробовал тут же ещё раз повторить - ничего (
Странно, ERA2.4.

на h3era.exe не получилось пока такого повторить.

hippocamus, а нефиг 2,41 какую-то ставить... нет релиза, нет и гарантий
feanor
Ага, с HD вылетело.

Цитата
Команда !!IF:M^2^; не работает.

Вбил !!IF:M^2^; - вывело мессаджбокс с двойкой.
Вбил /exec IF:M^2^; - тоже вывело.
Bes
после многочисленных манипуляций с чатом стало очевидно...
- нужна команда быстрого вызова в строку чата последней использованной chalk-плагином команды...
типа, нажал что-то, и появилась в строке пред.исполненная команда... а там уже я либо по быстрому подправлю значение на новое, либо просто нажму испольнить

feanor
спасибо за очень удобный тестовый инструмент!!! я доволен как чёрт!!!
hippocamus
Shift-Ins и Ctrl-V не рабоатют? Жаль, не могу полноценно потестить. Часть клавиш заменяется у мну виртуальной клавиатурой...
Bes
Цитата(hippocamus @ 14 Jan 2013, 23:12) *
Shift-Ins и Ctrl-V не рабоатют? Жаль, не могу полноценно потестить. Часть клавиш заменяется у мну виртуальной клавиатурой...

так там же нет выделения, просто набирается текст в чате и всё...
feanor
Вот Ctrl+С/V и нумпада не хватает адназначна.

А вообще - еще много чего не хватает
Bes
Цитата(feanor @ 14 Jan 2013, 23:39) *
Вот Ctrl+С/V и нумпада не хватает адназначна.

ОСОБЕННО NumPad'а!!!
feanor
лезть в обработку ввода не хочется категорически.
А ктрл+в, кстати, работает в HD.

Из хотелок:
- перегонялка из hex в dec с записью в переменную
- запись разных часто употребляемых адресов в памяти в переменную (combatmanager, структуры героев и стеков)
- вообще, вычислялка выражений в духе ollydbg.
Iv
Очень не хватает, как в DOS, по нажатию кнопки "вверх" возвращения предыдущей команды
tolich
В DOS она тоже не сразу появилась.
gerkruger
Просьба перезалить файл, так как ссылка в первом посту нерабочая.
feanor
Псто №6 же.
gamecreator
так вставь эту ссылку в первый пост что ли
Algor
Кидаю chalk.dll в Mods\WoG\EraPlugins.
Запускаю (Era 2.4), жму Tab, ввожу /chalk
Получаю "Красный: /chalk"

ЧЯДНТ и в каком месте слепой?

hippocamus, у тебя были похожие грабли? как решил?
gamecreator
так команды /chalk и нету то
hippocamus
Цитата(Algor @ 29 Apr 2013, 08:07) *
hippocamus, у тебя были похожие грабли? как решил?
забил ))
Algor
Цитата(gamecreator @ 29 Apr 2013, 10:44) *
так команды /chalk и нету то

Ну, во-первых есть, а во-вторых ничего другого тоже не выполняется.

Цитата(hippocamus @ 29 Apr 2013, 14:21) *
Цитата(Algor @ 29 Apr 2013, 08:07) *
hippocamus, у тебя были похожие грабли? как решил?
забил ))

Вай, не хочу так. Надоело ч-з жо универсальный интерфейс дебажиться.
feanor
А если в chalk.era переименовать?
Algor
Цитата(feanor @ 29 Apr 2013, 16:18) *
А если в chalk.era переименовать?

Так заработало, спасибо!
Напиши это в первом посте большими красными буквами, а то ведь еще пара страниц и никто не найдет.

UPD: и да, истории команд реально не хватает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.