Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обсуждение "небольших модов.."
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
Страницы: 1, 2
igrik
просто создай свой скрипт и все. Вот например
HE:R2/$
Установить/проверить/получить пол героя
$ = 0 – мужчина
$ = 1 – женщина

Код
ZVSE
!#HE27:R2/0; Джем теперь мужик, вжик его...
!#HE28:R2/1; а Мальком - девушка


upd: затупил... поправил
feanor
Эм, в коде-то тоже !!HE:R2 )
hippocamus
С бинарником надёжнее, и будет работать в СОД+ХД
Но если цель - Эра - тогда нет смысла не заморочиться с ЕРМ.
AleXeLix
В прирученных нейтралах Хотовского сатира бы в оплот.
hippocamus
AleXeLix
Но он-то хотовский! А плагин создавался под СОД.
Да, его в Оплот хорошо бы - но это делается уже совсем другими инструментами!
Richter
Если кто знает, поделитесь живыми ссылками на "небольшие моды".
Iv
Кое-что здесь: http://yadi.sk/d/_iFx69_O6fb_6
feanor
Шо, опять?(с)
храните в облаке, говорили они..
Orzie
"Чем больше зеркал, тем лучше", говорили они. "Закрепите тему хостинга модов", говорили они.

Это лишь начало, ребят.
Richter
Добавил существ с помощью amethyst.dll, но... нужно чтобы они колдовали заклинания. В файле конфигурации не понятно какие значения нужны. Вылет за вылетом, при попытке колдовать. Всё заполнено правильно, в том числе добавлено !!MA:B../..;
Кто нибудь знает как сделать нового монстра кастером? ...без глюков)
Iv
А анимация кастования в дефе монстра есть?
Richter
Цитата(Iv @ 20 Nov 2015, 12:26) *
А анимация кастования в дефе монстра есть?

Да, конечно.
igrik
В анимации выстрела должно быть не меньше 9 кадров, иначе появляются вылеты. Возмозможно такая же колбаса и с анимацией каста
Richter
Цитата(igrik @ 20 Nov 2015, 13:08) *
В анимации выстрела должно быть не меньше 9 кадров, иначе появляются вылеты. Возмозможно такая же колбаса и с анимацией каста

Не помогает 9,10,15 кадров. Вылет без "объяснений" при наводке курсора на существо.
Строки в конфиге:
Spell 1=38.
Spell 2=38.
Spell 3=38.
(38 - воскрешение, с другими номера также не работает)
feanor
Номера трындец неправильные.
Это индексы в таблицах.
MasterOfPuppets
Цитата(feanor @ 14 Aug 2016, 00:56) *
Анимированные существа на поле боя (порт из WoG 3.59)

Автор: sergroj
Портировано: feanor в рамках проекта TSW; разрешение автора получено.
Формат: папка с модом.

InstantAnimation.zip, 7 Кб

Скорости анимаций настраиваются индивидуально для каждого типа существ в файле anims.ini; существующие параметры взяты из блока monanim0 хотовского HotA.dat (версия 1.3.4), для вог-монстров взято по подобию.
Помимо этого, есть глобальный множитель, позволяющий ускорить или замедлить анимацию для всех монстров без пересчета всех параметров.

До чего сейчас дошёл формат плагинов, что эта библиотека у меня вообще не грузится простым LoadLibrary?
feanor
Она эровское апи пытается подтянуть?

Попробуй эту, без эры (возможно, даже SoD-совместимую)
https://dl.dropboxusercontent.com/u/6175922...InstantAnim.dll

ну и исходник ftgj https://dl.dropboxusercontent.com/u/6175922.../dllmain_ia.cpp
MasterOfPuppets
Цитата(feanor @ 14 Aug 2016, 16:34) *
Она эровское апи пытается подтянуть?

Да хрен его знает. Я переименовал в .dll, включил у себя поддержку плагинов, но в списке модулей оно так и не появилось. При том, что любые левые библиотеки загружаются, даже po.dll, которая, правда, бросает сообщение об отсутствии ЭРЫ.

Цитата(feanor @ 14 Aug 2016, 16:34) *
Попробуй эту, без эры (возможно, даже SoD-совместимую)
https://dl.dropboxusercontent.com/u/6175922...InstantAnim.dll

ну и исходник ftgj https://dl.dropboxusercontent.com/u/6175922.../dllmain_ia.cpp

Спасибо, помогло! К счастью, ковыряний в тех местах в моём exe нет и плагин спокойно работает.
igrik
Цитата(MoP)
... и плагин спокойно работает.

Проверь, есть ли анимация полета снаряда при стрельбе.
Просто в SoDe с подключением данного плагина через HD - нет.
MasterOfPuppets
Проверил. Есть.
MasterOfPuppets
Цитата(feanor @ 14 Aug 2016, 00:56) *
Анимированные существа на поле боя (порт из WoG 3.59)
InstantAnimation.zip, 7 Кб

А почему существа >255 игнорируются?
feanor

int creature_anim_coeffs[256];
igrik
Цитата(MasterOfPuppets @ 24 Nov 2016, 16:10) *
Цитата(feanor @ 14 Aug 2016, 00:56) *
Анимированные существа на поле боя (порт из WoG 3.59)
InstantAnimation.zip, 7 Кб

А почему существа >255 игнорируются?

MoP, если тебе нужна перекомпилированная dll на 999 монстров, то вот она (скачать).
Я изменил 256->999 в трех местах. Там инты, поэтому думаю так можно было сделать.


upd: ой, там же эровская апи подтягивается. Блин.
Ben
Цитата(igrik @ 09 Aug 2017, 17:47) *
А где сама DLL?


Приаттачил бы, если б была такая возможность у форума. А где-то там в сети я файлы не храню - дурная это мода, и хорошим она для людей не кончится (как и многие другие тенденции IT последних лет).

По запросу вышлю, если кому-то нужно.
fireman
Ben, закинь в гугл/яндекс диск в ближайшие лет 5 не умрёт точно
feanor
Цитата
Ben, закинь в гугл/яндекс диск в ближайшие лет 5 не умрёт точно
Да-да, я тож самое думал о дропбоксе
hippocamus
Ну, так дропбокс убил только прямые ссылки (и то - для бесплатников). Так-то выкладывать можно.
А Яндекс, Гугл, Мега и проч. их и так не давали изначально.
feanor
Цитата
Ну, так дропбокс убил только прямые ссылки (и то - для бесплатников). Так-то выкладывать можно.
Абсолютно одна фигня с точки зрения вечности долгосрочного хранения.
Выложил человек что-то, а потом на него упал танк и еще после этого дропбокс сменил формат ссылок. В общем-то, всем абсолютно безразлично, что файлы лежат где-то там в облаке, главное - что по ссылкам они более недоступны.

Я был бы не против, если бы прямые ссылки преобразовались в кривые. Но они грохнули их совсем, сраное мудачье.
hippocamus
Я где-то читал, что нужно сделать с неработающей прямой ссылкой dropbox, чтобы получить работающую непрямую. Там однозначное преобразование. То есть - если уж совсем на человека танк упал, прямо уж так - абсолютно, напрочь - то можно воскресить ) Не человека, конечно. Но ссылку.
Barin
Цитата(feanor @ 08 Feb 2013, 15:55) *
Настраиваемые имена классов (turquoise.dll)

Плагин: turquoise.zip, зеркало

Позволяет настраивать индивидуальное имя класса для каждого героя (аналогично Джем из стандартных кампаний SoD), как с помощью конфигурационного файла (приложен в архиве), так и динамически, с помощью SN:W-переменных с именем hero_class_name_<hero_id>.

Иллюстрация:


Код
Patcher * globalPatcher;
PatcherInstance *patcher;

_ptr_ GetClassNameDefault;

char* GetClassName(HERO* hero)
{
    char tmp[64];
    sprintf(tmp,"SN:W^hero_class_name_%i^/?z1;", hero->Number);
    ExecErmCmd(tmp);
    
    if(ErmZ[1][0]!=0)
    {
        return ErmZ[1];
    }
    return CALL_1(char*, __thiscall, GetClassNameDefault, hero);
}

void __stdcall InitNames(PEvent e)
{
    char tmp[1024];
    char tmp_erm[1024];
    for(int i=0; i!=256;i++)
    {
        sprintf(tmp,"Hero%i",i);
        ReadStrFromIni(tmp, "Classnames", "turquoise.ini", (char*)tmp);
        if (*tmp)
        {
            sprintf(tmp_erm,"SN:W^hero_class_name_%i^/^%s^;", i, tmp);
            ExecErmCmd(tmp_erm);
        }
    }
}


char* __stdcall GetClassName_hook(HiHook* h, HERO* hero)
{
    return GetClassName(hero);
}

int __stdcall hook_4E1(LoHook* h, HookContext* c)
{
    c->ecx = (int)GetClassName((HERO*)(c->eax));
    return EXEC_DEFAULT;
}

int __stdcall hook_4DB(LoHook* h, HookContext* c)
{
    c->eax = (int)GetClassName((HERO*)(c->ecx));
    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(PINSTANCE_MAIN);
        ConnectEra();

        RegisterHandler(InitNames, "OnBeforeErmInstructions");
        RegisterHandler(InitNames, "OnAfterCreateWindow");

        HiHook *h = patcher->WriteHiHook(0x4D91E0,SPLICE_,EXTENDED_,THISCALL_,(void*)GetClassName_hook);
        GetClassNameDefault = h->GetDefaultFunc();
        
        patcher->WriteLoHook(0x4E1DE6, (void*)hook_4E1);
        patcher->WriteLoHook(0x4DB980, (void*)hook_4DB);
        patcher->WriteLoHook(0x4DBDF7, (void*)hook_4DB);
    }
    return TRUE;
}



У кого остался этот плагин? Залейте пожалуйста.
Iv
Цитата(Barin @ 24 May 2018, 00:56) *
Цитата(feanor @ 08 Feb 2013, 15:55) *
Настраиваемые имена классов (turquoise.dll)

Плагин: turquoise.zip, зеркало

Позволяет настраивать индивидуальное имя класса для каждого героя (аналогично Джем из стандартных кампаний SoD), как с помощью конфигурационного файла (приложен в архиве), так и динамически, с помощью SN:W-переменных с именем hero_class_name_<hero_id>.

Иллюстрация:


Код
Patcher * globalPatcher;
PatcherInstance *patcher;

_ptr_ GetClassNameDefault;

char* GetClassName(HERO* hero)
{
    char tmp[64];
    sprintf(tmp,"SN:W^hero_class_name_%i^/?z1;", hero->Number);
    ExecErmCmd(tmp);
    
    if(ErmZ[1][0]!=0)
    {
        return ErmZ[1];
    }
    return CALL_1(char*, __thiscall, GetClassNameDefault, hero);
}

void __stdcall InitNames(PEvent e)
{
    char tmp[1024];
    char tmp_erm[1024];
    for(int i=0; i!=256;i++)
    {
        sprintf(tmp,"Hero%i",i);
        ReadStrFromIni(tmp, "Classnames", "turquoise.ini", (char*)tmp);
        if (*tmp)
        {
            sprintf(tmp_erm,"SN:W^hero_class_name_%i^/^%s^;", i, tmp);
            ExecErmCmd(tmp_erm);
        }
    }
}


char* __stdcall GetClassName_hook(HiHook* h, HERO* hero)
{
    return GetClassName(hero);
}

int __stdcall hook_4E1(LoHook* h, HookContext* c)
{
    c->ecx = (int)GetClassName((HERO*)(c->eax));
    return EXEC_DEFAULT;
}

int __stdcall hook_4DB(LoHook* h, HookContext* c)
{
    c->eax = (int)GetClassName((HERO*)(c->ecx));
    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(PINSTANCE_MAIN);
        ConnectEra();

        RegisterHandler(InitNames, "OnBeforeErmInstructions");
        RegisterHandler(InitNames, "OnAfterCreateWindow");

        HiHook *h = patcher->WriteHiHook(0x4D91E0,SPLICE_,EXTENDED_,THISCALL_,(void*)GetClassName_hook);
        GetClassNameDefault = h->GetDefaultFunc();
        
        patcher->WriteLoHook(0x4E1DE6, (void*)hook_4E1);
        patcher->WriteLoHook(0x4DB980, (void*)hook_4DB);
        patcher->WriteLoHook(0x4DBDF7, (void*)hook_4DB);
    }
    return TRUE;
}



У кого остался этот плагин? Залейте пожалуйста.

http://yadi.sk/d/_iFx69_O6fb_6
turquoise (имена классов).zip
igrik
Feanor, а тут ошибки нет в определении цикла. Может for(int i=0; i!=156;i++)
Код
void __stdcall InitNames(PEvent e)
{
    char tmp[1024];
    char tmp_erm[1024];
    for(int i=0; i!=256;i++) // тут  i!=156 ?
    {
        sprintf(tmp,"Hero%i",i);
        ReadStrFromIni(tmp, "Classnames", "turquoise.ini", (char*)tmp);
        if (*tmp)
        {
            sprintf(tmp_erm,"SN:W^hero_class_name_%i^/^%s^;", i, tmp);
            ExecErmCmd(tmp_erm);
        }
    }
}
feanor
На всякий случай (:
Barin
Цитата(Iv @ 24 May 2018, 09:18) *
Цитата(Barin @ 24 May 2018, 00:56) *
Цитата(feanor @ 08 Feb 2013, 15:55) *
Настраиваемые имена классов (turquoise.dll)

Плагин: turquoise.zip, зеркало

Позволяет настраивать индивидуальное имя класса для каждого героя (аналогично Джем из стандартных кампаний SoD), как с помощью конфигурационного файла (приложен в архиве), так и динамически, с помощью SN:W-переменных с именем hero_class_name_<hero_id>.

Иллюстрация:


Код
Patcher * globalPatcher;
PatcherInstance *patcher;

_ptr_ GetClassNameDefault;

char* GetClassName(HERO* hero)
{
    char tmp[64];
    sprintf(tmp,"SN:W^hero_class_name_%i^/?z1;", hero->Number);
    ExecErmCmd(tmp);
    
    if(ErmZ[1][0]!=0)
    {
        return ErmZ[1];
    }
    return CALL_1(char*, __thiscall, GetClassNameDefault, hero);
}

void __stdcall InitNames(PEvent e)
{
    char tmp[1024];
    char tmp_erm[1024];
    for(int i=0; i!=256;i++)
    {
        sprintf(tmp,"Hero%i",i);
        ReadStrFromIni(tmp, "Classnames", "turquoise.ini", (char*)tmp);
        if (*tmp)
        {
            sprintf(tmp_erm,"SN:W^hero_class_name_%i^/^%s^;", i, tmp);
            ExecErmCmd(tmp_erm);
        }
    }
}


char* __stdcall GetClassName_hook(HiHook* h, HERO* hero)
{
    return GetClassName(hero);
}

int __stdcall hook_4E1(LoHook* h, HookContext* c)
{
    c->ecx = (int)GetClassName((HERO*)(c->eax));
    return EXEC_DEFAULT;
}

int __stdcall hook_4DB(LoHook* h, HookContext* c)
{
    c->eax = (int)GetClassName((HERO*)(c->ecx));
    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(PINSTANCE_MAIN);
        ConnectEra();

        RegisterHandler(InitNames, "OnBeforeErmInstructions");
        RegisterHandler(InitNames, "OnAfterCreateWindow");

        HiHook *h = patcher->WriteHiHook(0x4D91E0,SPLICE_,EXTENDED_,THISCALL_,(void*)GetClassName_hook);
        GetClassNameDefault = h->GetDefaultFunc();
        
        patcher->WriteLoHook(0x4E1DE6, (void*)hook_4E1);
        patcher->WriteLoHook(0x4DB980, (void*)hook_4DB);
        patcher->WriteLoHook(0x4DBDF7, (void*)hook_4DB);
    }
    return TRUE;
}



У кого остался этот плагин? Залейте пожалуйста.

http://yadi.sk/d/_iFx69_O6fb_6
turquoise (имена классов).zip

Плохо, что в каждом плагине нет более ясной информации. Описания понятны только разработчику этих плагинов. Как менять имена классов динамически? Справочник Эры тоже сложно написан, без детальной информации, без наглядных примеров. SN:W - а что дальше? Напишите пример. Картинка иллюстрации уже не работает.

Как мне сменить название класса у героя 134?
igrik
Ничего сложного:
1. Переименуй плагин в "turquoise.era" вместо "turquoise.dll"
2. !#SN:W^hero_class_name_134^/^Целлюлит^;
Barin
Цитата(igrik @ 24 May 2018, 18:19) *
Ничего сложного:
1. Переименуй плагин в "turquoise.era" вместо "turquoise.dll"
2. !#SN:W^hero_class_name_134^/^Целлюлит^;


1) Получилось. А так попробуй догадайся... feanor много чего полезного сделал, но наглядное описание не оставляет потомкам-мододелам.

2) Кто-нибудь пытался сделать подобную команду, но только для текстовых файлов?

!!SN:L^Era.dll^/?y1 Ay1/^RedirectFile^/?y2 Ey2/1/^оригинальный.def^/^мой.def^; !!VRy1:S0; !!VRy2:S0;

например:

!!SN:L^Era.dll^/?y1 Ay1/^RedirectFile^/?y2 Ey2/1/^оригинальный.txt^/^мой.txt^; !!VRy1:S0; !!VRy2:S0;

Была бы очень полезная команда. Можно много чего менять без плагинов. Я постоянно с этим сталкиваюсь - хочется и оригинальный файл оставить и свой подгружать в конкретных картах.

Кто может реализовать это дело?
hippocamus
Текстов к грузятся и обрабатываются сразу при загрузке игры, они не хранятся в памяти в целостном виде, поэтому что заменять динамически, собственно?
feanor
Можно вроде бы сделать RedirectFile и перезагрузить текстовик.
hippocamus
И все другие сделанные изменения откатятся? Тексты при посещении объектов, параметры кричей?..
hippocamus
Цитата(Richter @ 11 Feb 2019, 15:15) *
Небольшая модификация добавляющая статистику пройденного расстояния героя, просмотр по нажатию клавиши "X"

Richter
А почему такое число?
Логичнее было бы 1 км, а по диагонали - sqrt(2).
Richter
1 км попробовал сразу, цифры получались слишком "холодные". Поэтому решил с плавающей запятой, подогнал число с помощью деления. Получилось интересно и адекватно.
А насчет sqrt(2) (1.414км) по диагонали, многовато, расстояние есть расстояние. Попробую на досуге, только число сделаю 1,087, плюс минус рандомные варианты погрешности скажем 0,023.
Algor
Настраиваемые имена классов
Ссылки битые.
Насколько я понимаю, dll там не нужна и можно реализовать средствами ERM/UN:C.
Если так, кто может кинуть пример?
Iv
Моя ссылка живая http://yadi.sk/d/_iFx69_O6fb_6
feanor
Цитата(Algor @ 10 Mar 2019, 16:59) *
Настраиваемые имена классов
Ссылки битые.
Насколько я понимаю, dll там не нужна и можно реализовать средствами ERM/UN:C.
Если так, кто может кинуть пример?

Не-а, там хуки ставятся.
С хукером мб можно, но не пробовал.
ALEKCEN
Печально,что тема умерла,хотя хотелось-бы несколько модов утащить оттуда...может кто перезальёт ?(
XEPOMAHT
Цитата(ALEKCEN @ 05 Aug 2025, 11:48) *
может кто перезальёт ?(


Смысл? То, что собиралось и работало под ERA 1.8 15-летней давности на современной ERA 3.9.ХХ работать без ошибок не станет (для таких старых модов поддержки давно нет или она была реализована в более современных аналогах).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.