если окно не в фокусе. после логина что происходит норм?
Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Всё работает нормально проверял, независимо от того, находится ли окно в фокусе или нет. Можно открыть сколько угодно окон, главное — не забывать менять логин и пароль в файле AutoLogin.ini".если окно не в фокусе. после логина что происходит норм?
Всё работает нормально проверял, независимо от того, находится ли окно в фокусе или нет. Можно открыть сколько угодно окон, главное — не забывать менять логин и пароль в файле AutoLogin.ini".
На данный момент — да, но никто не мешает вам реализовать свои идеи в коде.это на каждое окно под разных чаров надо каждый раз вбивать логин и пароль?
CommandLineManager.hНа данный момент — да, но никто не мешает вам реализовать свои идеи в коде.
#pragma once
struct CommandLineConstants
{
/** Auth login/password set from launcher params (Format: String - e.g. "-authdata login,password") */
static constexpr wchar_t AuthData[] = L"authdata";
};
class CommandLineManager
{
public:
/**
* No copying or copy assignment allowed for this class.
*/
CommandLineManager(CommandLineManager const&) = delete;
CommandLineManager& operator=(CommandLineManager const&) = delete;
/**
* Initialization using a string containing all params
*/
void Init(const wchar_t* lp_cmd_line);
/**
* Initialization using a collection of params
*/
void Init(const std::vector<std::wstring>& cmd_line_params);
/**
* Checks command line arguments for a matching param
*
* @param param - Parameter to look for in command line arguments
*
* @return True if param is found in command line arguments
*/
bool HasParam(const std::wstring& param);
/**
* Retrieves value associated with given command line parameter
*
* @param param - Parameter to look for in command line arguments
*
* @return Value associated with command line parameter
*/
std::wstring GetParamValue(const std::wstring& param);
/**
* Checks command line arguments for a matching flag param
*
* @param param - Parameter to look for in command line arguments
*
* @return True if param is found in command line arguments and it is a flag param value
*/
bool HasFlagParam(const std::wstring& param);
std::map<std::wstring, std::wstring> GetCommandLineArgs()
{
return command_line_args_;
}
/**
* Singleton
*/
static CommandLineManager& Get();
private:
CommandLineManager() = default;
/** True if command line parser initialized */
static bool IsInitialized;
/** Gets a collection of sub-arguments from a string of one or two arguments */
std::vector<std::wstring> GetSubArguments(const std::wstring& sub_arg_list);
/** Add commandline params from a collection of arguments */
void AddArguments(const std::vector<std::wstring>& arg_list);
/**
* Adds parameter name to collection of command line parameters
*
* @param param_name - Parameter name to add
*/
void AddParam(const std::wstring& param_name);
/** Collections of command line arguments */
std::map<std::wstring, std::wstring> command_line_args_;
};
#include <pch.h>
#include "CommandLineManager.h"
namespace
{
const std::wstring FlagParamValue = L"__FLAG__";
const std::wstring UnusedParamValue = L"unused";
}
bool CommandLineManager::IsInitialized = false;
CommandLineManager& CommandLineManager::Get()
{
static CommandLineManager command_line_manager;
if(!IsInitialized)
{
// Support for DLL's
int arg_count = 0;
const LPWSTR *arg_list = CommandLineToArgvW(GetCommandLine(), &arg_count);
std::vector<std::wstring> output;
output.reserve(arg_count);
for(int i = 0; i < arg_count; i++)
{
output.emplace_back(arg_list[i]);
}
command_line_manager.Init(output);
}
return command_line_manager;
}
void CommandLineManager::Init(const std::vector<std::wstring>& cmd_line_params)
{
if (!IsInitialized)
{
std::vector<std::wstring> args;
for (std::wstring cmd_line_param : cmd_line_params)
{
for (const std::wstring& arg : GetSubArguments(cmd_line_param))
{
args.push_back(arg);
}
}
AddArguments(args);
IsInitialized = true;
}
}
std::vector<std::wstring> CommandLineManager::GetSubArguments(const std::wstring& sub_arg_list)
{
std::vector<std::wstring> args;
if (const std::wstring::size_type sub_arg_equals_pos = sub_arg_list.find_first_of(L'='); sub_arg_equals_pos != std::wstring::npos)
{
// Add both args
args.push_back(sub_arg_list.substr(0, sub_arg_equals_pos));
args.push_back(sub_arg_list.substr(sub_arg_equals_pos + 1, sub_arg_list.length() - 1));
}
else
{
// Add single arg
args.push_back(sub_arg_list);
}
return args;
}
void CommandLineManager::AddArguments(const std::vector<std::wstring>& arg_list)
{
if (!arg_list.empty())
{
const std::wstring delimiters(L"-,;\\");
std::wstring param_name;
bool bPrevWasParamName = false;
const int num_args = static_cast<int>(arg_list.size());
for (int i = 0; i < num_args; i++)
{
std::wstring command_line_arg = arg_list[i];
// Do we have a param name
if (const std::wstring::size_type pos = command_line_arg.find_first_not_of(delimiters); pos > 0 && pos != std::wstring::npos)
{
if (bPrevWasParamName)
{
// We have another param name so previous was a flag (no param value)
// Add a value to signify we have a flag param
AddParam(param_name);
}
param_name = command_line_arg;
// strip out first part so we're left with just the param name
param_name.erase(0, pos);
if (i == num_args - 1)
{
// Add final flag param
AddParam(param_name);
}
bPrevWasParamName = true;
continue;
}
bPrevWasParamName = false;
// Make sure we're not adding a duplicate
if (auto it = command_line_args_.find({ param_name }); it == command_line_args_.end())
{
if (command_line_arg.empty())
{
// Treat empty param value as a flag
command_line_args_.insert({ param_name, FlagParamValue });
}
else
{
command_line_args_.insert({ param_name, command_line_arg });
}
}
// Clear for next param
param_name.clear();
}
}
}
void CommandLineManager::AddParam(const std::wstring& param_name)
{
// Make sure we're not adding a duplicate
if (const auto it = command_line_args_.find({ param_name }); it == command_line_args_.end())
{
command_line_args_.insert({ param_name, FlagParamValue });
}
}
bool CommandLineManager::HasParam(const std::wstring& param)
{
if (const auto itr = command_line_args_.find({ param }); itr != command_line_args_.end())
{
if (itr->second != UnusedParamValue)
{
return true;
}
}
return false;
}
std::wstring CommandLineManager::GetParamValue(const std::wstring& param)
{
if (const auto itr = command_line_args_.find({ param }); itr != command_line_args_.end())
{
return itr->second;
}
return std::wstring();
}
bool CommandLineManager::HasFlagParam(const std::wstring& param)
{
if (const auto itr = command_line_args_.find({ param }); itr != command_line_args_.end())
{
return itr->second == FlagParamValue;
}
return false;
}
std::wstring AutoLogin_Login;
std::wstring AutoLogin_Password;
if (CommandLineManager::Get().HasParam(CommandLineConstants::AuthData))
{
const std::wstring auth_string = CommandLineManager::Get().GetParamValue(CommandLineConstants::AuthData);
if (std::vector<std::wstring> auth_data = StringUtils::Split(auth_string, ','); auth_data.size() >= 2)
{
AutoLogin_Login = auth_data[0];
AutoLogin_Password = auth_data[1];
}
}
Я увидел твой пост в друг теме и понял о чем ты, но этот код для интерлюдии и HF подойдет, для выше хроник все можно сделать через интерфейс и UGX и будет работать стабильно.если окно не в фокусе. после логина что происходит норм?
Возможно, в будущем я планирую заниматься этим только под заказ. Или же, если кто-то из ребят захочет помочь, они могут это сделать, но не бесплатно.есть ли способ импортировать функцию RequestLogin внутрь интерфейса, чтобы мы могли использовать ее там?
Таким образом, мы можем записывать/считывать файл автологина внутри интерфейса, и мы можем использовать его для нескольких учетных записей, а не только для одной.
решил попробовать - но не работает, вроде как бы и пишет что пароль не подходит, но акк и пароль я точно вписал верно))Вот код автологина для interlude, который требует доработки, но уже работает, особенно благодаря Charmant
Логин и пароль берется из файла AutoLogin.ini который должен лежать рядом с dll в вашей папке system игры.
AutoLogin.ini с таким содержимым:
Код на с++ Visual Studio 2022Код:[AutoLogin] Login=admin Password=admin
C++:#include "pch.h" #include <windows.h> #include <string> extern "C" void __declspec(dllexport) __stdcall function1() { //Заглушка для экспорта L2.exe (От крита клиента!) } namespace { enum L2ConsoleState { Loading = 0, Unknown = 1, Login = 2, CharCreate = 3, CharSelect = 4, InGame = 5 }; class UL2ConsoleWnd {}; UL2ConsoleWnd* UL2ConsoleWndPtr = nullptr; uintptr_t consoleOffset = 0x3663bc; // для IL клиента } // Определение класса UNetworkHandler class UNetworkHandler {}; // Тип функции RequestAuthLogin typedef int(__fastcall* RequestAuthLoginFn)(UNetworkHandler*, int, const wchar_t*, const wchar_t*, int); // Смещение для UNetworkHandler в engine.dll const uintptr_t unetworkOffset = 0x81F538; // Глобальные переменные для хранения указателей UNetworkHandler** unetwork = nullptr; RequestAuthLoginFn requestAuthLoginFn = nullptr; // Функция для авторизации static void RequestLogin(const std::wstring& login, const std::wstring& password) { // Проверка инициализации указателей if (!unetwork || !requestAuthLoginFn) { return; } // Вызов функции авторизации из игры requestAuthLoginFn(*unetwork, 0, login.c_str(), password.c_str(), 0); } // Функция для чтения строки из INI-файла static void ReadIniString() { std::wstring login; std::wstring password; wchar_t buffer[256] = { 0 }; // Чтение логина и пароля из ini-файла GetPrivateProfileStringW(L"AutoLogin", L"Login", L"", buffer, _countof(buffer), L".\\AutoLogin.ini"); login = buffer; // Чтение логина и пароля из ini-файла GetPrivateProfileStringW(L"AutoLogin", L"Login", L"", buffer, _countof(buffer), L".\\AutoLogin.ini"); password = buffer; // Вызов функции авторизации RequestLogin(login, password); } static void L2StatusLoad() { HMODULE hNwindowModule = nullptr; while (hNwindowModule == nullptr) { hNwindowModule = GetModuleHandleW(L"nwindow.dll"); Sleep(1000); } // получение валидного указателя на UL2ConsoleWnd uintptr_t pUL2ConsoleWnd = (reinterpret_cast<uintptr_t>(hNwindowModule)) + consoleOffset; while (UL2ConsoleWndPtr == nullptr) { UL2ConsoleWndPtr = *reinterpret_cast<UL2ConsoleWnd**>(pUL2ConsoleWnd); Sleep(300); } // получение адреса по которому записывается текущее состояние L2ConsoleState* statePtr = reinterpret_cast<L2ConsoleState*>(UL2ConsoleWndPtr + 0x38); while (true) { L2ConsoleState currentState = *statePtr; switch (currentState) { case L2ConsoleState::Loading: // MessageBoxW(NULL, L"загрузка", L"L2ConsoleState", MB_OK); ReadIniString(); exit; break; case L2ConsoleState::Login: //MessageBoxW(NULL, L"лобби", L"L2ConsoleState", MB_OK); break; case L2ConsoleState::CharCreate: //MessageBoxW(NULL, L"cоздание чара", L"L2ConsoleState", MB_OK); break; case L2ConsoleState::CharSelect: //MessageBoxW(NULL, L"выбор чара", L"L2ConsoleState", MB_OK); break; case L2ConsoleState::InGame: // MessageBoxW(NULL, L"в игре", L"L2ConsoleState", MB_OK); break; } Sleep(5000); } } // Поток для авторизации static DWORD WINAPI TestThread(LPVOID lpParameter) { L2StatusLoad(); return 0; } // Точка входа DLL extern "C" __declspec(dllexport) BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { // Отключение отслеживания вызовов функций библиотеки DisableThreadLibraryCalls(hModule); // Получение модуля engine.dll HMODULE engineModule = GetModuleHandleW(L"engine.dll"); if (engineModule) { // Получение адреса UNetworkHandler unetwork = reinterpret_cast<UNetworkHandler**>(reinterpret_cast<uintptr_t>(engineModule) + unetworkOffset); // Получение адреса функции RequestAuthLogin requestAuthLoginFn = (RequestAuthLoginFn)GetProcAddress(engineModule, "?RequestAuthLogin@UNetworkHandler@@UAEHPAG0H@Z"); } // Создание потока для авторизации CreateThread(nullptr, 0, TestThread, nullptr, 0, nullptr); } return TRUE; }
И вот готовые файлы для тех, кто хочет настроить автологин (*Только вход в окно логина*): просто распакуйте архив в системную папку игры interlude и не забудьте изменить логин и пароль в файле AutoLogin.ini.
Я проверил: ввёл логин из четырёх нулей и пароль — и успешно вошёл в систему.решил попробовать - но не работает, вроде как бы и пишет что пароль не подходит, но акк и пароль я точно вписал верно))
мб длинна пароля 4 нуля ему не подходит?
[AutoLogin]
Login=0000
Password=0000
В файле AutoLogin.ini должно быть указано следующее: если ваш логин и пароль — 0000, то введите их именно так, а если нет, то укажите свои данные.
Код:[AutoLogin] Login=0000 Password=0000
Эт же не кодированный .ini, открывай через блокнот или notepad+
незнаю почему но при любом редактировании хоть нотпадом хоть чем - ломается он, какая там кодировка символов?В файле AutoLogin.ini должно быть указано следующее: если ваш логин и пароль — 0000, то введите их именно так, а если нет, то укажите свои данные.
Код:[AutoLogin] Login=0000 Password=0000
ставлю вот такнезнаю почему но при любом редактировании хоть нотпадом хоть чем - ломается он, какая там кодировка символов?
[AutoLogin]
Login=admin
Password=0000
UTF-8ставлю вот так
[AutoLogin]
Login=admin
Password=0000
и всё-поломка)
l2 -login:<admin> -password:<0000>