Да возможно передавать картинку эмблем в клиент которые хранятся на сервере, такое делали хранили сами картинки в папке сервера(не помню в каком формате) и оттуда их передавали в клиент. Могу ошибаться но вы вроде это имели в виду?
У себя я это делал для отображения эмблем фракций вместо картинки альянса.
Gaikotsu: Маркетинг у скриптов на высшем уровне - могут и снег зимой эскимосу продать.
Kampina Написал:Да возможно передавать картинку эмблем в клиент которые хранятся на сервере, такое делали хранили сами картинки в папке сервера(не помню в каком формате) и оттуда их передавали в клиент. Могу ошибаться но вы вроде это имели в виду?
У себя я это делал для отображения эмблем фракций вместо картинки альянса.
Почти.
Только я хочу писать велосипеды, а не костыли.
Решил попробовать пойти легким путем и передать нужное мне изображение через эмблему клана. Но тут появилась проблема, как заменить уже существующую в кэше эмблему, ибо клиент просто игнорирует пакет PledgeCrest с crestId который уже есть в кэше.
Нашел в engine.dll функцию которая вроде как сохраняет эмблемы. Но больше понимания к тому как оно работает это мне не дало.
Из того что я понял:
На клиент приходить пакет PledgeCrest с dds файлом
клиент сохраняет его в папку ../crest/
затем, вызывается функция ImportCrestFile, которая подгружает файлы из crest в оперативку или если их много создает utx файл, но это лишь догадка, так как после вызова данной функции dds-ки пропадают, а crest.utx не всегда появляется.
UCanvas::ImportCrestFile
PHP код:
<?php
void __thiscall UCanvas::ImportCrestFile(UCanvas *this, int a2, int a3, int a4, int a5)
{ int v5; // ST0C_4@1 int v6; // esi@3 int v7; // eax@4 int v8; // eax@5 UCanvas *v9; // ecx@6 int v10; // edi@6 int v11; // esi@8 int v12; // eax@9 int v13; // eax@13 int v14; // ST24_4@18 int v15; // eax@18 int v16; // [sp-4h] [bp-630h]@8 int v17; // [sp+0h] [bp-62Ch]@1 char v18; // [sp+Ch] [bp-620h]@1 int v19; // [sp+20Ch] [bp-420h]@1 int v20; // [sp+40Ch] [bp-220h]@1 UCanvas *v21; // [sp+618h] [bp-14h]@1 int *v22; // [sp+61Ch] [bp-10h]@1 int v23; // [sp+628h] [bp-4h]@1
Для того чтобы понять как удаляет - смотри обработку диалога где ставится/убирается значок - там вот скорее всего и дергается какая нибудь функция для удаления старой текустуры (или просто пометки что такая-то текстура удалена) в случае когда удаляется/меняется значок.
Сохраняет текстуру оно в пакет 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;
что в итоге превращается в установку флагов для обьекта что он удален.
Gaikotsu Написал:Для того чтобы понять как удаляет - смотри обработку диалога где ставится/убирается значок - там вот скорее всего и дергается какая нибудь функция для удаления старой текустуры (или просто пометки что такая-то текстура удалена) в случае когда удаляется/меняется значок.
Хорошая идея.
Нажатие кнопки удаления эмблемы клана вызывает RequestClanUnregisterCrest() в NWindow.dll, а там:
execRequestClanUnregisteCrest
PHP код:
<?php
void __stdcall UUIScript::execRequestClanUnregisterCrest(struct FFrame *a2, void *const a3)
{ _BYTE *v3; // edx@1 int v4; // ecx@2 int v5; // [sp+0h] [bp-E0h]@1 int v6; // [sp+Ch] [bp-D4h]@3 int v7; // [sp+18h] [bp-C8h]@3 int v8; // [sp+1Ch] [bp-C4h]@3 int *v9; // [sp+D0h] [bp-10h]@1 int v10; // [sp+DCh] [bp-4h]@1
lordofdest Написал:Сохраняет текстуру оно в пакет 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 ?
Позже распишу варианты и постараюсь найти древние наработки которые генерит *.lib файлы с дллок л2 и публичные хедеры к ут2003 на которых в своё время запускал UCC на длл от прелюда.