igrik,

спасибо
igrik, can't thank you enough for this

Вот, для сравнения, с учётом последних обновлений плагина WND
XEPOMAHT Привет подскажи плагин Увеличение лимита первичных навыков с 99 до 249 в SoD, HotA как установить
(14.11.2021 10:05)komrad.kazackoff Wrote: [ -> ]Увеличение лимита первичных навыков с 99 до 249 в SoD, HotA как установить
Просто копируешь в папку с игрой (версия игры должна быть обязательно 3.2, если поставишь на какой-нибудь Комплит, работать не будет):
https://vk.com/doc-118013293_620137228
XEPOMAHT Спасибо, но у меня к сожелению Комплит.
Привет, у меня возникла идейка, но я не знаю, каким образом ее можно реализовать. Можете подсказать пожалуйста?
Code:
// dllmain.cpp : Определяет точку входа для приложения DLL.
#include "pch.h"
#include "patcher_x86.hpp"
#include "era.h"
#include <fstream>
#pragma warning( disable : 4996)
using namespace std;
using namespace Era;
Patcher* globalPatcher;
PatcherInstance* Magic;
// Загрузка текста из ини
void __stdcall ReadINI_AndRemove(TEvent* e)
{
char buf[30];
ReadStrFromIni("Count", "Main", "Pointer List.ini", buf);
int count = atoi(buf);
if (count > 0)
{
char name[30];
for (size_t i = 0; i < count; i++)
{
sprintf(name, "Pointer%d", i);
ReadStrFromIni(name, "Main", "Pointer List.ini", buf);
int adress = atoi(buf);
if (adress > 0x400000)
Magic->UndoAllAt(adress); // Блин, работает только на свои патчи
}
}
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
globalPatcher = GetPatcher();
Magic = globalPatcher->CreateInstance("Raistlin.RemovePatches");
ConnectEra();
RegisterHandler(ReadINI_AndRemove, "OnAfterCreateWindow");
/*case :
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;*/
}
return TRUE;
}
Я хочу написать отключалку патчей НD-мода, но не знаю, как отключить патч

Сначала я думал, что метод UndoAllAt на это способен, но оказалось, что он работает только с текущим экземпляром PatcherInstance.
(11.12.2021 11:29)Raistlin Wrote: [ -> ]Я хочу написать отключалку патчей НD-мода, но не знаю, как отключить патч
Сначала я думал, что метод UndoAllAt на это способен, но оказалось, что он работает только с текущим экземпляром PatcherInstance.
Там только на низком уровне можно (в Тифоне я просто восстанавливаю затёртый патчером код игры там где нужно в рамках ERA+ обычным бинарным патчем как для HD-мода, так и для era.dll), но за подобное надругательство над патчером ни Бараторч, ни Берсеркер не скажут спасибо. На высоком затирать перехваты патчера - вряд ли можно, т.к. хитрый патчер всегда ответит кукишем на подобные вандальные действия. Поэтому я не хочу использовать патчер, т.к. он ограничивает свободу в кодинге игры.
Единственное, что можно сделать на патчере - создание обходного пути в коде игры (в Тифоне так же это практикуется, когда нужен независимый от патчера код, обезопасенный от пользовательских хуков и патчей).
Raistlin,
Code:
///////////////////////////////////////////////////
// Метод GetInstance
// Возвращает экземпляр TPatcherInstance
// с именем owner.
// в качестве аргумента можно передавать имя модуля.
// метод возвращает nil в случае, если
// экземпляр с именем owner не существует (не был создан)
// Используется для :
// - проверки активен ли некоторый мод, использующий patcher_x86.dll
// - получения доступа ко всем патчам и хукам
// некоторого мода, использующего patcher_x86.dll
function GetInstance(owner_name: PAnsiChar): TPatcherInstance; virtual; stdcall; abstract;
Спасибо большое! У меня все получилось - как оказалось, все-таки существует глобальное затирание, но я просто не знал, как его использовать: надо было обращаться к объекту класса GlobalPatcher, а не PatcherInstance. Когда я сделал это, чтобы воспользовать функцией GetInstance, я увидел глобально работающую функцию UndoAllAt.
(20.01.2022 09:35)igrik Wrote: [ -> ] (20.01.2022 07:18)XEPOMAHT Wrote: [ -> ]Ага, при этом получится та же история, что и с game bug fixes от igrik/Ben/RK - несовместимость с ERA+.
Дай мне список того, что конфликтует в плагине с ERA+, я запилю совместимость.
1. Конфликт с ненавистью монстров - Тифон подменяет адрес кейса на монстров, а game bug fixes extended ставит хук, полностью игнорируя содовскую адресацию кейса, в итоге, ненависти из Тифона не будут работать. Ну это я могу исправить сам в Тифоне, уничтожив соотвествующий хук game bug fixes extended, но для совместимости со старыми версиями Тифона лучше было бы, чтобы хук отменялся в самом game bug fixes extended.
2. Так делать не надо:
Code:
if ( heroID < 0 && heroID > 155 )
return 0; // выход, если номер героя неправильный
Если номер героя неправильный, игра вылетит намного раньше.
3. Запреты заклов уже исправлены в Тифоне, там же их количество увеличено до 95. Поэтому функции, адресующиеся к o_GameMgr->disabled_spells всегда будут попадать в молоко, т.к. эти таблицы в ERA+ перемещены в память Тифона бинарным патчем, а сам UN:J Тифон вовсе выключает, т.е. функции Игрика Y_ArtGive_Spell, Y_ArtGive_LoadSpells и Y_ArtGive_AllSpells могут приводить к ошибкам в игре. Ну а если кто-то попытается адаптировать плагин Алекса под Эру на новые заклы... там совместимость вообще нулевая.
4. Исходник RK primary skill overflow.cpp должен быть выключен целиком, т.к. он конфликтует и с Тифоном, и с Примой, входящей в сборки Демона.
XEPOMAHT, хорошо. Сегодня вечером сделаю:
1. Сделаю проверку на Тифон, если Тифон включен - данный хук НЕ будет устанавливаться вообще.
2. Это то понятно. Просто я давно не лез в этот участок кода. Сделаю проверку на максимальный номер героя
3. Сделаю проверку на Тифон, если Тифон включен - данный хук НЕ будет устанавливаться вообще.
4. Этого кода никогда не было в плагине: исходник лежит чисто для информации, но код не используется и никогда не использовался.
(20.01.2022 12:01)Raistlin Wrote:я выкладывал плагин, позволяющий убирать хуки, поставленные патчером, с помощью патчера - может быть, попробуешь добавить его в ERA+? Несовместимостей с ним быть не может, а для использования достаточно просто записать адреса в конфиге, и хуки будут убраны.
Мне был бы полезен этот плагин для отмены феаноровских хуков, но я не знаю как им пользоваться. Нужна хотя бы короткая инструкция.
Тифон умеет убирать чужие хуки с помощью обычного бинарного патча или непосредственной подмены хука патчера хуком WERD, т.к. Мастер, скорее всего намеренно, запитал в Тифон установку хуков позднее патчера, чтобы получить больше свободы для манипуляции с игрой. Конечно, сам патчер будет думать, что хук там якобы есть, и в лог запишет эти несуществующие хуки, но просто отмена хука мне не требуется - часто нужен именно оригинальный содовский код, без влияния патчера, который... всё равно ставит хук, независимо от того, отменён он или нет (при отмене хука, патчер выполнит затёртый код и вернётся обратно, но физически при этом хук никуда не денется).
(20.01.2022 12:04)igrik Wrote: [ -> ]Сделаю проверку на Тифон, если Тифон включен - данный хук НЕ будет устанавливаться вообще.
Ок, буду ждать результата. Надеюсь, проверка будет не по имени dll (т.к. Берсеркер в своём релизе Тифона переименовывал dll, если скляроз не изменяет).
XEPOMAHT, помимо самого плагина есть конфиг, где нужно в первой строчке указать количество убираемых патчей и хуков, а затем просто перечислить все адреса, откуда нужно что-то убрать. Единственное, писать адреса надо в десятичной, а не шестнадцатиричной системе счисления.