PDA

Просмотр полной версии : Данные о скилах из клиента


Sherman
31.03.2009, 11:15
Предисловие. Работая над небольшим проектиком мне потребовалось иметь данные о скиллах. Перепробовав варианты с ini и ресурсами, и осозновая что мой проект работает в адресном пространстве клиента, был написан этот модуль.


unit UserData;
interface

uses
Windows, SysUtils, Classes;


type
TMSData = record
name : pWideChar;
b1 : integer;
b2 : integer;
description : pWideChar;
b3 : integer;
b4 : integer;
id : integer;
level : integer;
oper_type : integer;
mp_consume : integer;
hp_consume : integer;
cast_range : integer;
cast_style : integer;
hit_time : double;
is_magic : integer;
ani_char : integer;
desc : integer;
icon_name : integer;
extra_eff : integer;
desc_add1 : pWideChar;
b5 : integer;
b6 : integer;
desc_add2 : pWideChar;
b7 : integer;
b8 : integer;
is_ench : integer;
ench_skill_id : integer;
UNK_0 : integer;
UNK_1 : integer;
end;
pMSData = ^TMSData;


procedure EngineGetMSData;cdecl; external 'engine.dll' name '?GetMSData@FL2GameData@@QAEPAUFL2MagicSkillData@@ HH@Z';
procedure EngineDL2FName; cdecl; external 'engine.dll' name '??DL2FName@@QBEPBGXZ';

function DL2FName(Skill:pMSData):PWideChar; cdecl;
function GetMSData(SkillID,SkillLvl:integer):pMSData; cdecl;

var
Engine:cardinal;

implementation

function DL2FName(Skill:pMSData):PWideChar; cdecl;
asm
mov EAX, Skill
lea ECX,dword ptr DS:[EAX+$48]
call EngineDL2FName
mov Result, EAX
end;

function GetMSData(SkillID,SkillLvl:integer):pMSData; cdecl;
asm
mov EAX,[SkillLvl]
mov ECX,[SkillID]
push EAX
push ECX
mov ECX,[Engine]
add ECX,$6F31B8
call EngineGetMSData
mov Result, EAX
end;

initialization
Engine:=GetModuleHandle('engine.dll');

end.



функция GetMSData возвращает указатель на структуру описания скила в клиенте.

DL2FName возвращает имя текстуры иконки.

Engine - адрес ImageBase "Engine.dll"


mov ECX,[Engine]
add ECX,$6F31B8

Тут я упростил, смысл - добратся до адреса по которому начинаются данные о скилах в клиенте, в таблице экспорта оно обьявлено как :
=>6F31B8 .data Export ?GL2GameData@@3VFL2GameData@@A

ЗЫ. мой проект заточен для С4, для дальнейших хроник экспортируемые ф-ции могут лежать в других dll, но в любом случае в папке system клиента :)

Добавлено через 31 минуту
xor, тут говорят что ты умеешь из клиента программно иконки вытаскивать. Можно пример увидеть?

xkor
31.03.2009, 14:21
Sherman, почитай это http://coderx.ru/showthread.php?t=76
там я давал ссылки на модуль для дельфи для работы с utx файлами и в двух сообщениях приводил примеры его использования

Sherman
31.03.2009, 15:26
Читать utx это скучно и избыточно в моем случае. Мой инъект в процессе клиента, мне ф-ции получения текстуры нужны самого клиента. Зачем дублировать то что уже написано когда я работаю в клиенте. Буду искать. )

По первой ссылке кстати лежат сорсы для работы с utx UT3, включая Lineage II
Впринципе если не получится получить с помощью самого клиента это тоже вариант.

Xa4ik
31.03.2009, 15:36
Если важен результат а не процес, можно использывать аксесовскую базу с картинками от L2informer.

Sherman
31.03.2009, 15:42
Не... это совсем суровый вариант. Вариант использования utx еще куда не шло, но вот привлечение детища M$ это зло :)