Обсуждение "небольших модов.." |
Здравствуйте, гость ( Вход | Регистрация )
Обсуждение "небольших модов.." |
24 May 2018, 09:18
Сообщение
#81
|
|
Immortal Сообщений: 6 260 Спасибо сказали: 12647 раз |
Настраиваемые имена классов (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 -------------------- |
|
|
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); } } } -------------------- |
|
|
24 May 2018, 11:14
Сообщение
#83
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
На всякий случай (:
|
|
|
24 May 2018, 17:30
(Сообщение отредактировал Barin - 24 May 2018, 17:33)
Сообщение
#84
|
|
Member Сообщений: 75 Спасибо сказали: 53 раза |
Настраиваемые имена классов (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? -------------------- |
|
|
24 May 2018, 18:19
Сообщение
#85
|
|
Immortal Сообщений: 589 Спасибо сказали: 890 раз |
Ничего сложного:
1. Переименуй плагин в "turquoise.era" вместо "turquoise.dll" 2. !#SN:W^hero_class_name_134^/^Целлюлит^; -------------------- |
|
|
24 May 2018, 19:31
(Сообщение отредактировал Barin - 24 May 2018, 19:46)
Сообщение
#86
|
|
Member Сообщений: 75 Спасибо сказали: 53 раза |
Ничего сложного: 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; Была бы очень полезная команда. Можно много чего менять без плагинов. Я постоянно с этим сталкиваюсь - хочется и оригинальный файл оставить и свой подгружать в конкретных картах. Кто может реализовать это дело? -------------------- |
|
|
25 May 2018, 23:32
Сообщение
#87
|
|
пират с чёрной меткой Сообщений: 23 632 Спасибо сказали: 12912 раза |
Текстов к грузятся и обрабатываются сразу при загрузке игры, они не хранятся в памяти в целостном виде, поэтому что заменять динамически, собственно?
-------------------- Давший быка на убой не выпросил и печень на жаркое.
|
|
|
26 May 2018, 12:42
Сообщение
#88
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Можно вроде бы сделать RedirectFile и перезагрузить текстовик.
|
|
|
26 May 2018, 19:50
Сообщение
#89
|
|
пират с чёрной меткой Сообщений: 23 632 Спасибо сказали: 12912 раза |
И все другие сделанные изменения откатятся? Тексты при посещении объектов, параметры кричей?..
-------------------- Давший быка на убой не выпросил и печень на жаркое.
|
|
|
11 Feb 2019, 16:19
Сообщение
#90
|
|
пират с чёрной меткой Сообщений: 23 632 Спасибо сказали: 12912 раза |
Небольшая модификация добавляющая статистику пройденного расстояния героя, просмотр по нажатию клавиши "X" Richter А почему такое число? Логичнее было бы 1 км, а по диагонали - sqrt(2). -------------------- Давший быка на убой не выпросил и печень на жаркое.
|
|
|
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. -------------------- |
|
|
10 Mar 2019, 15:59
Сообщение
#92
|
|
- Сообщений: 1 073 Спасибо сказали: 1529 раз |
Настраиваемые имена классов
Ссылки битые. Насколько я понимаю, dll там не нужна и можно реализовать средствами ERM/UN:C. Если так, кто может кинуть пример? -------------------- |
|
|
11 Mar 2019, 11:20
Сообщение
#93
|
|
Immortal Сообщений: 6 260 Спасибо сказали: 12647 раз |
Моя ссылка живая http://yadi.sk/d/_iFx69_O6fb_6
-------------------- |
|
|
11 Mar 2019, 11:33
Сообщение
#94
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Настраиваемые имена классов Ссылки битые. Насколько я понимаю, dll там не нужна и можно реализовать средствами ERM/UN:C. Если так, кто может кинуть пример? Не-а, там хуки ставятся. С хукером мб можно, но не пробовал. |
|
|
Текстовая версия | Сейчас: 20 April 2024 - 06:11 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |