IPB

Здравствуйте, гость ( Вход | Регистрация )

5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
> Обсуждение "небольших модов.."
Iv
сообщение 24 May 2018, 09:18
Сообщение #81

Immortal
Сообщений: 6 260
Спасибо сказали: 12647 раз




Цитата(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


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 24 May 2018, 10:18 (Сообщение отредактировал igrik - 24 May 2018, 10:23)
Сообщение #82

Immortal
Сообщений: 589
Спасибо сказали: 890 раз




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);
        }
    }
}


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 24 May 2018, 11:14
Сообщение #83

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




На всякий случай (:
Go to the top of the pageAdd Nick
 
+Quote Post
Barin
сообщение 24 May 2018, 17:30 (Сообщение отредактировал Barin - 24 May 2018, 17:33)
Сообщение #84

Member
Сообщений: 75
Спасибо сказали: 53 раза




Цитата(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?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 24 May 2018, 18:19
Сообщение #85

Immortal
Сообщений: 589
Спасибо сказали: 890 раз




Ничего сложного:
1. Переименуй плагин в "turquoise.era" вместо "turquoise.dll"
2. !#SN:W^hero_class_name_134^/^Целлюлит^;


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Barin
сообщение 24 May 2018, 19:31 (Сообщение отредактировал Barin - 24 May 2018, 19:46)
Сообщение #86

Member
Сообщений: 75
Спасибо сказали: 53 раза




Цитата(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;

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

Кто может реализовать это дело?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 25 May 2018, 23:32
Сообщение #87

пират с чёрной меткой
Сообщений: 23 632
Спасибо сказали: 12912 раза




Текстов к грузятся и обрабатываются сразу при загрузке игры, они не хранятся в памяти в целостном виде, поэтому что заменять динамически, собственно?


--------------------
Давший быка на убой не выпросил и печень на жаркое.
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 26 May 2018, 12:42
Сообщение #88

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




Можно вроде бы сделать RedirectFile и перезагрузить текстовик.
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 26 May 2018, 19:50
Сообщение #89

пират с чёрной меткой
Сообщений: 23 632
Спасибо сказали: 12912 раза




И все другие сделанные изменения откатятся? Тексты при посещении объектов, параметры кричей?..


--------------------
Давший быка на убой не выпросил и печень на жаркое.
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 11 Feb 2019, 16:19
Сообщение #90

пират с чёрной меткой
Сообщений: 23 632
Спасибо сказали: 12912 раза




Цитата(Richter @ 11 Feb 2019, 15:15) *
Небольшая модификация добавляющая статистику пройденного расстояния героя, просмотр по нажатию клавиши "X"

Richter
А почему такое число?
Логичнее было бы 1 км, а по диагонали - sqrt(2).


--------------------
Давший быка на убой не выпросил и печень на жаркое.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 11 Feb 2019, 17:17 (Сообщение отредактировал Richter - 11 Feb 2019, 17:21)
Сообщение #91

collector of time
Сообщений: 159
Спасибо сказали: 73 раза




1 км попробовал сразу, цифры получались слишком "холодные". Поэтому решил с плавающей запятой, подогнал число с помощью деления. Получилось интересно и адекватно.
А насчет sqrt(2) (1.414км) по диагонали, многовато, расстояние есть расстояние. Попробую на досуге, только число сделаю 1,087, плюс минус рандомные варианты погрешности скажем 0,023.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Algor
сообщение 10 Mar 2019, 15:59
Сообщение #92

-
Сообщений: 1 073
Спасибо сказали: 1529 раз




Настраиваемые имена классов
Ссылки битые.
Насколько я понимаю, dll там не нужна и можно реализовать средствами ERM/UN:C.
Если так, кто может кинуть пример?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 11 Mar 2019, 11:20
Сообщение #93

Immortal
Сообщений: 6 260
Спасибо сказали: 12647 раз




Моя ссылка живая http://yadi.sk/d/_iFx69_O6fb_6


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 11 Mar 2019, 11:33
Сообщение #94

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




Цитата(Algor @ 10 Mar 2019, 16:59) *
Настраиваемые имена классов
Ссылки битые.
Насколько я понимаю, dll там не нужна и можно реализовать средствами ERM/UN:C.
Если так, кто может кинуть пример?

Не-а, там хуки ставятся.
С хукером мб можно, но не пробовал.
Go to the top of the pageAdd Nick
 
+Quote Post

5 страниц V  « < 3 4 5
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 20 April 2024 - 02:11
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика