Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Игровой клиент (https://forum.zone-game.info/forumdisplay.php?f=54)
-   -   Костылизация nwindow.dll (https://forum.zone-game.info/showthread.php?t=42505)

Triumvare 15.09.2017 22:17

Костылизация nwindow.dll
 
Недавно задался вопросом, возможно ли передать картинку в клиент L2, собственно посмотрел на реализацию эмблем клана в Interface.u, и понял что нужно копать в нативные функции. Задача состоит в том что бы посмотреть в nwindow.dll как байтовый массив превращается в объект Texture и написать такую же функцию только для своих нужд.

Отсюда вопрос, есть ли какие-то мануалы по IDA Pro для Lineage 2, или люди у которых можно поспрашивать че да как.

Заранее спасибо.

n3k0nation 15.09.2017 22:26

Re: Костылизация nwindow.dll
 
Нэ?

Triumvare 15.09.2017 22:42

Re: Костылизация nwindow.dll
 
Цитата:

Сообщение от n3k0nation (Сообщение 427912)

Походу не оно, я имел ввиду, как из массива что приходит на клиент создается текстура. Либо я туповат. В любом случае спасибо. :)

n3k0nation 15.09.2017 22:43

Re: Костылизация nwindow.dll
 
На клиент с сервера приходит уже готовая DDS текстура, впрочем, клиент отсылает на сервер, также, уже готовую текстуру.

Triumvare 15.09.2017 23:14

Re: Костылизация nwindow.dll
 
Вложений: 1
Цитата:

Сообщение от n3k0nation (Сообщение 427914)
На клиент с сервера приходит уже готовая DDS текстура, впрочем, клиент отсылает на сервер, также, уже готовую текстуру.

https://forum.zone-game.info/attachm...1&d=1505506273

Эм, нет, на клиент отправляется байтовый массив, размер изображения и id клана, потом в клиенте все это превращается в объект Texture и вставляется в нужное место. :)

Хочу реализовать такую же нативную функцию в параметры которой буду передавать массив, а получать из не текстуру.

n3k0nation 15.09.2017 23:24

Re: Костылизация nwindow.dll
 
Правда? А че внутри байтового массива? Идите курите формат DDS, все спеки есть в гугле. Как сравните по байтикам хотя бы заголовок (он всего лишь 124 байта) - приходите назад.

Код создания UTexture я уже скидывал выше, это не более чем инкапсуляция текстуры сжатой DXT.

moveton 15.09.2017 23:26

Re: Костылизация nwindow.dll
 
Цитата:

Сообщение от Triumvare (Сообщение 427915)
https://forum.zone-game.info/attachm...1&d=1505506273

Эм, нет, на клиент отправляется байтовый массив, размер изображения и id клана, потом в клиенте все это превращается в объект Texture и вставляется в нужное место. :)

Хочу реализовать такую же нативную функцию в параметры которой буду передавать массив, а получать из не текстуру.

Эта _data и есть уже готовая dds в dxt1, которую однажды прислал клиент.

n3k0nation 15.09.2017 23:27

Re: Костылизация nwindow.dll
 
Цитата:

Сообщение от Triumvare (Сообщение 427915)
Хочу реализовать такую же нативную функцию в параметры которой буду передавать массив, а получать из не текстуру.

Ну, создайте объект UTexture и передайте ему текстуру. В чем проблема?

Triumvare 15.09.2017 23:47

Re: Костылизация nwindow.dll
 
Крч, что я хочу сделать:
Пользователь на сайте загружает изображение профиля. Это фото сохраняется в бд, затем отобразить его в игре при помощи Unreal Script'ов. Где и как это уже другая история.
Собственно передать информацию на клиент я могу. Все что нужно это грубо говоря написать функцию на С++ в которой превратить то что я получил от сервера в UTexture и вызвать ее в Unreal Script'ах в нужном мне месте.

Как писать нативные функции что бы их можно было использовать в том же interface.u ?

Цитата:

Сообщение от moveton (Сообщение 427917)
Эта _data и есть уже готовая dds в dxt1, которую однажды прислал клиент.

Надеюсь можно как-то конвертировать png\jpg в dds при помощи java :)

Цитата:

Сообщение от n3k0nation (Сообщение 427916)
Правда? А че внутри байтового массива? Идите курите формат DDS, все спеки есть в гугле. Как сравните по байтикам хотя бы заголовок (он всего лишь 124 байта) - приходите назад.

Код создания UTexture я уже скидывал выше, это не более чем инкапсуляция текстуры сжатой DXT.

Каюсь, был не прав.

n3k0nation 16.09.2017 01:17

Re: Костылизация nwindow.dll
 
Цитата:

Сообщение от Triumvare (Сообщение 427919)
Надеюсь можно как-то конвертировать png\jpg в dds при помощи java

Декодировать текстуру, сжать ее DXT и запилить заголовок DDS. Это если в общих словах. Подробности зависят уже от конкретного исходного и таргет форматов (и DXT далеко не один). Все спеки на эти форматы есть в сети, по DDS на сайте мелкомягких, в частности. Только не забудьте учесть byte-ordering.


Цитата:

Сообщение от Triumvare (Сообщение 427919)
Как писать нативные функции что бы их можно было использовать в том же interface.u ?

Цитата:

You can declare UnrealScript functions as native, which means that the function is callable from UnrealScript, but is actually implemented (elsewhere) in C++. For example, the Actor class contains a lot of native function definitions, such as:
Код:

  native(266) final function bool Move( vector Delta );
The number inside the parenthesis after the native keyword corresponds to the number of the function as it was declared in C++ (using the AUTOREGISTER_NATIVE macro), and is only required for operator functions. The native function is expected to reside in the DLL named identically to the package of the class containing the UnrealScript definition.
Больше информации в документации UDK.

Kampina 16.09.2017 01:49

Re: Костылизация nwindow.dll
 
Да возможно передавать картинку эмблем в клиент которые хранятся на сервере, такое делали хранили сами картинки в папке сервера(не помню в каком формате) и оттуда их передавали в клиент. Могу ошибаться но вы вроде это имели в виду?

У себя я это делал для отображения эмблем фракций вместо картинки альянса.

Triumvare 16.09.2017 18:21

Re: Костылизация nwindow.dll
 
Цитата:

Сообщение от Kampina (Сообщение 427921)
Да возможно передавать картинку эмблем в клиент которые хранятся на сервере, такое делали хранили сами картинки в папке сервера(не помню в каком формате) и оттуда их передавали в клиент. Могу ошибаться но вы вроде это имели в виду?

У себя я это делал для отображения эмблем фракций вместо картинки альянса.

Почти.
Только я хочу писать велосипеды, а не костыли. :)

А размер текстуры удалось изменить ?

Triumvare 17.09.2017 14:01

Re: Костылизация nwindow.dll
 
Решил попробовать пойти легким путем и передать нужное мне изображение через эмблему клана. Но тут появилась проблема, как заменить уже существующую в кэше эмблему, ибо клиент просто игнорирует пакет PledgeCrest с crestId который уже есть в кэше.

Kampina 18.09.2017 00:49

Re: Костылизация nwindow.dll
 
Цитата:

Сообщение от Triumvare (Сообщение 427927)
Почти.
Только я хочу писать велосипеды, а не костыли. :)

А размер текстуры удалось изменить ?

Размер меняется и в клиенте не только на сервере. Клиент я не трогаю.

Triumvare 18.09.2017 23:34

Re: Костылизация nwindow.dll
 
Нашел в engine.dll функцию которая вроде как сохраняет эмблемы. Но больше понимания к тому как оно работает это мне не дало.


Из того что я понял:
На клиент приходить пакет PledgeCrest с dds файлом
клиент сохраняет его в папку ../crest/
затем, вызывается функция ImportCrestFile, которая подгружает файлы из crest в оперативку или если их много создает utx файл, но это лишь догадка, так как после вызова данной функции dds-ки пропадают, а crest.utx не всегда появляется.

UCanvas::ImportCrestFile:
Свернуть ↑Развернуть ↓


Собственно вопрос, как узнать куда оно сохраняет текстуру, и как ее оттуда удалить ?

За любую информацию, как всегда, буду благодарен.

Gaikotsu 18.09.2017 23:39

Re: Костылизация nwindow.dll
 
Для того чтобы понять как удаляет - смотри обработку диалога где ставится/убирается значок - там вот скорее всего и дергается какая нибудь функция для удаления старой текустуры (или просто пометки что такая-то текстура удалена) в случае когда удаляется/меняется значок.

lordofdest 19.09.2017 08:48

Re: Костылизация nwindow.dll
 
Сохраняет текстуру оно в пакет crest.
Это видно с поиска пакета UObject::LoadPackage(0, L"crest", 0x10u, 0) или создания нового UObject::CreatePackage(0, L"crest").

далее оно делает что то типа:
ImportObject<UTexture>( Level, Pkg, TempName, RF_Public|RF_Standalone, TempFname );
ну и по сути вся соль импорта в этом вызове он сам найдет импортер для данного обьекта если таковой имееться. Если интиресно фабрику для импорта текстур можно найти в ИДА по строке "RLE compression of BMP images not supported".

а удалется обьект как то вот так:
UObject* Pkg = Object;
while( Pkg->GetOuter() )
Pkg = Pkg->GetOuter();
if( Pkg && Pkg->IsA(UPackage::StaticClass() ) )
((UPackage*)Pkg)->bDirty = 1;
unguard;

delete Object;

что в итоге превращается в установку флагов для обьекта что он удален.

Triumvare 19.09.2017 18:56

Re: Костылизация nwindow.dll
 
Цитата:

Сообщение от Gaikotsu (Сообщение 427947)
Для того чтобы понять как удаляет - смотри обработку диалога где ставится/убирается значок - там вот скорее всего и дергается какая нибудь функция для удаления старой текустуры (или просто пометки что такая-то текстура удалена) в случае когда удаляется/меняется значок.

Хорошая идея.

Нажатие кнопки удаления эмблемы клана вызывает RequestClanUnregisterCrest() в NWindow.dll, а там:
execRequestClanUnregisteCrest:
Свернуть ↑Развернуть ↓


Но к сожалению я не понимаю что тут происходит.


Цитата:

Сообщение от lordofdest (Сообщение 427949)
Сохраняет текстуру оно в пакет crest.
Это видно с поиска пакета UObject::LoadPackage(0, L"crest", 0x10u, 0) или создания нового UObject::CreatePackage(0, L"crest").

далее оно делает что то типа:
ImportObject<UTexture>( Level, Pkg, TempName, RF_Public|RF_Standalone, TempFname );
ну и по сути вся соль импорта в этом вызове он сам найдет импортер для данного обьекта если таковой имееться. Если интиресно фабрику для импорта текстур можно найти в ИДА по строке "RLE compression of BMP images not supported".

а удалется обьект как то вот так:
UObject* Pkg = Object;
while( Pkg->GetOuter() )
Pkg = Pkg->GetOuter();
if( Pkg && Pkg->IsA(UPackage::StaticClass() ) )
((UPackage*)Pkg)->bDirty = 1;
unguard;

delete Object;

что в итоге превращается в установку флагов для обьекта что он удален.

А как мне это реализовать ? Как использовать объект UObject и его функции в моей dll ?

Стукните в скайп Triumvare или дайте свой.

lordofdest 19.09.2017 19:43

Re: Костылизация nwindow.dll
 
Позже распишу варианты и постараюсь найти древние наработки которые генерит *.lib файлы с дллок л2 и публичные хедеры к ут2003 на которых в своё время запускал UCC на длл от прелюда.

lordofdest 19.09.2017 21:01

Re: Костылизация nwindow.dll
 
Вложений: 1
Можешь на базе этого собрать себе нужные хедеры и либы.

Triumvare 20.09.2017 18:03

Re: Костылизация nwindow.dll
 
Цитата:

Сообщение от lordofdest (Сообщение 427969)
Можешь на базе этого собрать себе нужные хедеры и либы.

Спасибо огромное.

Нужный мне класс UObject находится в core.dll, я собрал core.lib, но вот как собрать хедер не знаю, буду разбираться.

lordofdest 20.09.2017 18:48

Re: Костылизация nwindow.dll
 
Ну хедер для него там уже есть вам нужны по сути 3 класса uobject, ufactory и utexture. И вопрос вот в чем каковы ваши познания в с++ и как все это добро разворачиваеться в рантайме(смещения филдов, сабклассы и виртуальные таблици)?

Triumvare 20.09.2017 19:21

Re: Костылизация nwindow.dll
 
Цитата:

Сообщение от lordofdest (Сообщение 427998)
Ну хедер для него там уже есть вам нужны по сути 3 класса uobject, ufactory и utexture. И вопрос вот в чем каковы ваши познания в с++ и как все это добро разворачиваеться в рантайме(смещения филдов, сабклассы и виртуальные таблици)?

Познания в с++ почти что минимальны, достаточно много писал на java, а вот на с++ только в универе. А насчет рантайма, эм что ? :)


Текущее время: 02:55. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot