
Saltfire
Постоялец-
Публикаций
589 -
Зарегистрирован
-
Посещение
-
Победитель дней
27 -
Отзывы
N/A
Тип контента
Профили
Форумы
Загрузки
Магазин
Инструкции
Весь контент Saltfire
-
Помогите прикрутить на Interlude окошко со счётчиком квест-итемов
тема ответил Saltfire в теме Клиент игры
В интерлюдии, есть не допиленный PCCafeEventWnd, который работает не на всех сборках и клиентах, пакет на лыжах называется ExPCCafePointInfo (зачастую просто заглушка) Если есть исходники интерфейса, можешь воссоздать, что тебе необходимо через interface.u и interface.xdat. -
Для поиска матриц можно использовать CheatEngine, а чтобы точно знать, что ты делаешь, ты можешь скинуть предмет на землю и найти его, а там и все остальное. Потерял, ты хотел просто пример. Vector2 WorldToScreen(const Vector3& worldPosition, const D3DXMATRIX& viewMatrix, const D3DXMATRIX& projectionMatrix, int screenWidth, int screenHeight) { // Преобразуем мировые координаты в координаты клипа с использованием матрицы вида D3DXVECTOR4 clipSpace; clipSpace.x = worldPosition.x * viewMatrix._11 + worldPosition.y * viewMatrix._21 + worldPosition.z * viewMatrix._31 + viewMatrix._41; clipSpace.y = worldPosition.x * viewMatrix._12 + worldPosition.y * viewMatrix._22 + worldPosition.z * viewMatrix._32 + viewMatrix._42; clipSpace.z = worldPosition.x * viewMatrix._13 + worldPosition.y * viewMatrix._23 + worldPosition.z * viewMatrix._33 + viewMatrix._43; clipSpace.w = worldPosition.x * viewMatrix._14 + worldPosition.y * viewMatrix._24 + worldPosition.z * viewMatrix._34 + viewMatrix._44; // Применяем матрицу проекции D3DXVECTOR4 projectedSpace; projectedSpace.x = clipSpace.x * projectionMatrix._11 + clipSpace.y * projectionMatrix._21 + clipSpace.z * projectionMatrix._31 + clipSpace.w * projectionMatrix._41; projectedSpace.y = clipSpace.x * projectionMatrix._12 + clipSpace.y * projectionMatrix._22 + clipSpace.z * projectionMatrix._32 + clipSpace.w * projectionMatrix._42; projectedSpace.z = clipSpace.x * projectionMatrix._13 + clipSpace.y * projectionMatrix._23 + clipSpace.z * projectionMatrix._33 + clipSpace.w * projectionMatrix._43; projectedSpace.w = clipSpace.x * projectionMatrix._14 + clipSpace.y * projectionMatrix._24 + clipSpace.z * projectionMatrix._34 + clipSpace.w * projectionMatrix._44; // Преобразуем координаты клипа в нормализованные координаты устройства if (projectedSpace.w != 0.0f) { projectedSpace.x /= projectedSpace.w; projectedSpace.y /= projectedSpace.w; projectedSpace.z /= projectedSpace.w; } // Преобразуем нормализованные координаты устройства в экранные координаты Vector2 screenPosition; screenPosition.x = (projectedSpace.x + 1.0f) * 0.5f * screenWidth; screenPosition.y = (1.0f - (projectedSpace.y + 1.0f) * 0.5f) * screenHeight; return screenPosition; } Если ты хочешь это делать на уровне ладвы "без как ты хочешь хуков и адских калбеков", то пример для UE2.5 будет выглядеть так: FVector2D WorldToScreen(const FVector& WorldPosition, APlayerController* PlayerController) { FVector2D ScreenPosition; // Проверяем, что PlayerController не равен nullptr if (PlayerController) { // Получаем размер окна int32 ScreenWidth = GEngine->GameViewport->Viewport->GetSizeXY().X; int32 ScreenHeight = GEngine->GameViewport->Viewport->GetSizeXY().Y; // Преобразуем мировую позицию в экранные координаты PlayerController->ProjectWorldLocationToScreen(WorldPosition, ScreenPosition); // Теперь ScreenPosition содержит координаты в диапазоне от (0, 0) до (ScreenWidth, ScreenHeight) } return ScreenPosition; } С учетом, что ты понимаешь как устроен UE2.5. Но тебе еще придется очень сильно постараться, чтобы сие чудо запустить. Шары сурсов для l2 не было, все приватное. Но если ты хочешь это делать на D3 - то без хуков ты не справишься.
-
Определение World, View и Projection матриц: World Matrix: Определяет положение и ориентацию объектов в игровом мире. View Matrix: Определяет, как сцена будет отображаться из точки зрения камеры. Projection Matrix: Определяет, как 3D-координаты будут проецироваться на 2D-экран. Для d3dx9.h #include <d3dx9.h> struct Vector3 { float x, y, z; }; struct Vector2 { float x, y; }; Vector2 WorldToScreen(const Vector3& worldPosition, const D3DXMATRIX& viewMatrix, const D3DXMATRIX& projectionMatrix, int screenWidth, int screenHeight) { // Преобразуем мировые координаты в координаты клипа D3DXVECTOR4 clipSpace; clipSpace.x = worldPosition.x * viewMatrix._11 + worldPosition.y * viewMatrix._21 + worldPosition.z * viewMatrix._31 + viewMatrix._41; clipSpace.y = worldPosition.x * viewMatrix._12 + worldPosition.y * viewMatrix._22 + worldPosition.z * viewMatrix._32 + viewMatrix._42; clipSpace.z = worldPosition.x * viewMatrix._13 + worldPosition.y * viewMatrix._23 + worldPosition.z * viewMatrix._33 + viewMatrix._43; clipSpace.w = worldPosition.x * viewMatrix._14 + worldPosition.y * viewMatrix._24 + worldPosition.z * viewMatrix._34 + viewMatrix._44; // Преобразуем координаты клипа в нормализованные координаты устройства if (clipSpace.w != 0.0f) { clipSpace.x /= clipSpace.w; clipSpace.y /= clipSpace.w; clipSpace.z /= clipSpace.w; } // Преобразуем нормализованные координаты устройства в экранные координаты Vector2 screenPosition; screenPosition.x = (clipSpace.x + 1.0f) * 0.5f * screenWidth; screenPosition.y = (1.0f - (clipSpace.y + 1.0f) * 0.5f) * screenHeight; return screenPosition; } Для современных версией есть DirectXMath.h: #include <DirectXMath.h> #include <iostream> using namespace DirectX; struct Vector3 { float x, y, z; }; struct Vector2 { float x, y; }; Vector2 WorldToScreen(const Vector3& worldPosition, const XMMATRIX& viewMatrix, const XMMATRIX& projectionMatrix, int screenWidth, int screenHeight) { // Преобразуем мировые координаты в координаты клипа XMVECTOR worldPos = XMLoadFloat3(reinterpret_cast<const XMFLOAT3*>(&worldPosition)); XMVECTOR clipSpace = XMVector3Transform(worldPos, XMMatrixMultiply(viewMatrix, projectionMatrix)); // Преобразуем координаты клипа в нормализованные координаты устройства XMFLOAT4 clipSpaceFloat; XMStoreFloat4(&clipSpaceFloat, clipSpace); if (clipSpaceFloat.w != 0.0f) { clipSpaceFloat.x /= clipSpaceFloat.w; clipSpaceFloat.y /= clipSpaceFloat.w; clipSpaceFloat.z /= clipSpaceFloat.w; } // Преобразуем нормализованные координаты устройства в экранные координаты Vector2 screenPosition; screenPosition.x = (clipSpaceFloat.x + 1.0f) * 0.5f * screenWidth; screenPosition.y = (1.0f - (clipSpaceFloat.y + 1.0f) * 0.5f) * screenHeight; return screenPosition; } Для поиска матриц, лучше использовать готовые мощные инструменты, либо пытаться писать и анализировать самому, чего-то такого: #include <iostream> #include <fstream> #include <iomanip> void ReadMemory(HANDLE hProcess, uintptr_t address) { std::ofstream logFile("l2memory.log", std::ios::app); if (!logFile.is_open()) { std::cerr << "Failed to open the file for writing" << std::endl; return; } int value; SIZE_T bytesRead; if (ReadProcessMemory(hProcess, (LPCVOID)address, &value, sizeof(value), &bytesRead) && bytesRead == sizeof(value)) { std::cout << "Address: " << std::hex << address << " Value (int): " << value << std::dec << std::endl; logFile << "Адрес: " << std::hex << address << " Значения (int): " << value << std::dec << std::endl; if (value > 0 && value < 256) { char buffer[2] = { static_cast<char>(value), '\0' }; std::cout << "Interpreted as char: " << buffer << std::endl; logFile << "Интерпретировано как символ: " << buffer << std::endl; } } else { std::cerr << "Failed to read memory at the address: " << std::hex << address << std::dec << std::endl; logFile << "Не удалось прочитать память по адресу: " << std::hex << address << std::dec << std::endl; logFile.close(); return; } char buffer[256]; if (ReadProcessMemory(hProcess, (LPCVOID)(address + sizeof(value)), buffer, sizeof(buffer) - 1, &bytesRead) && bytesRead > 0) { buffer[bytesRead] = '\0'; std::cout << "Address: " << std::hex << (address + sizeof(value)) << " Value (string): " << buffer << std::dec << std::endl; logFile << "Адрес: " << std::hex << (address + sizeof(value)) << " Значение (string): " << buffer << std::dec << std::endl; } else { std::cerr << "Failed to read the string at the address: " << std::hex << (address + sizeof(value)) << std::dec << std::endl; logFile << "Не удалось прочитать строку по адресу: " << std::hex << (address + sizeof(value)) << std::dec << std::endl; } std::cout << "Bytes in hex: "; logFile << "Вывод байтов в шестнадцатеричном формате: "; for (SIZE_T i = 0; i < sizeof(value); ++i) { std::cout << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(reinterpret_cast<unsigned char*>(&value)[i]) << " "; logFile << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(reinterpret_cast<unsigned char*>(&value)[i]) << " "; } for (SIZE_T i = 0; i < bytesRead; ++i) { std::cout << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(reinterpret_cast<unsigned char*>(buffer)[i]) << " "; logFile << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(reinterpret_cast<unsigned char*>(buffer)[i]) << " "; } std::cout << std::dec << std::endl; logFile << std::dec << std::endl; std::cout << "Filtered bytes: "; logFile << "Фильтрация нулевых байтов: "; for (SIZE_T i = 0; i < sizeof(value) + bytesRead; ++i) { unsigned char byte = (i < sizeof(value)) ? reinterpret_cast<unsigned char*>(&value)[i] : reinterpret_cast<unsigned char*>(buffer)[i - sizeof(value)]; if (byte != 0) { std::cout << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(byte) << " "; logFile << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(byte) << " "; } } std::cout << std::dec << std::endl; logFile << std::dec << std::endl; logFile.close(); }
-
Ищу помощь в настройке отключения опыта биндом кнопки "замочка"
тема ответил Saltfire в теме Клиент игры
Для интерлюда и интерфейс с исходниками и компилятор есть в шаре, да и обсуждалось много раз, что да как. Бесплатное, самому нужно дописывать и приводить к нужному тебе состоянию. Либо купить или нанять кто разбирается в C++ и UnrealScript, в целом UE (старых версий), чтобы сделал тебе то, что ты хочешь на чистых исходниках интерфейса. А вообще, лучше себе свой сам начинай делать, тебе понравится, затянет. Зачем нужно то, что ты не сможешь поддерживать в будущем. Это касается и сервера и патча для клиента. Лучше брать то, где есть исходники и по логики собрать и дописать, что нужно и не нужно. -
Ищу помощь в настройке отключения опыта биндом кнопки "замочка"
тема ответил Saltfire в теме Клиент игры
Похоже на AACC. Я тебя огорчу, после успешного возвращения в дампе ты увидишь буковки и цифорки от обфускаций кода. И что-то там сделать и собрать назад будет ой какая проблема, для незнающих вообще даже азов этой всей свистопляски. Короче такая себе затея, когда можно взять чистый интерфейс и сделать необходимые вещи самому, а не пытаться ломать платные. Дебажить и попытаться понять, что отправляется когда нажимаешь на замок, об этом уже выше упомянули и пытаться реализовать этот механизм на стороне сервера. Или купить готовое решение со всеми рабочими функциями и обновлениями в iPerfect . -
Ищу помощь в настройке отключения опыта биндом кнопки "замочка"
тема ответил Saltfire в теме Клиент игры
@trololo1234 так суда скинь interface.u и interface.xdat, глядишь, кто-то и поможет. -
Это кто такую чушь сказал? rusacis - по прежнему работает, как и сам acis И я бы рекомендовал писать именно на их форуме, а не пытаться найти помощь тут.
-
Ты наверно хотел сказать, не лезь, л2 съест твой мозг.
-
Сделай svg. За бесплатно.
-
@JohnyDap Ну, начинается
-
Под защитой сервера подразумевается нечто большее, чем просто шифрование данных, передаваемых между клиентом и сервером. Использование клиентских скриптов для обеспечения безопасности сервера выглядит абсурдно. На самом деле, это лишь шифрование пакетов, что не является полноценной защитой. Это стандартная процедура, направленная на обеспечение целостности данных. Полноценная защита сервера должна включать взаимосвязь и работу пакетов на более глубоком уровне. В текущей реализации пакеты могут обрабатываться в любом месте рабочего стола, и это создает уязвимости. Каждый пакет представлен как отдельный класс файла, что приводит к его изоляции от контекста, в котором он должен функционировать. Это создает возможность для повторного использования пакетов, если они подменяются, что ставит под угрозу безопасность всей системы.
-
Этот проект был для верующих в сказки и дедов морозов.
-
Что совсем разум потерял и зрение? Какие фишки, какие люди, что предлагают? Этот шлак даже предлагать нельзя.
-
Бесплатно: За бесплатно
-
Полностью согласен! Пара человек в закрытом проекте не сможет добиться такого же качества, как тысячи людей, работающих над открытым проектом. Закрытые проекты часто страдают от узкого взгляда и недостатка разнообразия идей. В то время как открытые проекты, наоборот, становятся полем для экспериментов и креативности.
-
Серьезно, как вообще можно было додуматься до такой абсурдной системы? Это просто катастрофа! Вместо того, чтобы упростить процесс взаимодействия и сделать его удобным для пользователей, мы получаем кучу ограничений и запутанных решений. Это не просто неэффективно - это реально вызывает раздражение! Когда за дело берутся люди, которые просто стремятся к быстрой прибыли, а не к качеству, результат получается ужасным. Тонны говнокода, которые не работают должным образом, и в итоге мы все страдаем из-за этого. Пора уже задуматься о том, как сделать систему действительно удобной и эффективной, а не просто "работающей".
-
@lakinet, достаточно было увидеть исходный код, чтобы ужаснуться. Похоже, его писал 12-летний школьник, который только начал изучать программирование.
-
Добавь в исключения антивируса или защитника и не будет удалять. Невозможно сделать так, чтобы не удаляло! Пиратский клиент и никогда ты его своим не сделаешь. Если конечно только не начнешь с ncsoft или innova сотрудничать, что я очень сильно сомневаюсь.
-
Я к тому, что есть много способов настроить сервер и сделать его доступным для игроков, без необходимости в статическом ип. Если уже вложил столько усилий в проект, возможно, стоит рассмотреть более амбициозные цели. Даже если ожидаешь небольшую аудиторию, можно подумать о том, как привлечь больше игроков. Стоит рассмотреть маркетинговые стратегии или сотрудничество с другими проектами. Уверен, что с правильным подходом сможешь достичь большего!
-
Понимаю, что у каждого провайдера свои правила, но если бы все работало так просто, то не было бы столько вопросов на форумах. Может, стоит попробовать запустить что-то более серьезное, чем просто локалку?
-
То есть, подключение всё же происходит после ввода логина и пароля, но после попытки войти на игровой сервер, не пускает? Это явно указывает на то, что сервер настроен неправильно или что-то не было учтено в настройках.
-
Интересно, что вы так уверены в необходимости статического IP для запуска сервера. На самом деле, многие серверы прекрасно работают и с динамическими IP, особенно с помощью динамического DNS. Может, стоит немного углубиться в тему, прежде чем делать такие категоричные заявления?
-
Линдерленд защищаешь? Мозги бы лучше защитил, от слабоумия.