ObjectStruct клиента + Item

Автор DarkSim, 2013 Апр. 12, 15:03

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] клиентинвентарьobjectstruct

DarkSim

Всем добрый день)

В общем вчера сел колупать маин и докулупал структуру персонажа и его инвентарных вещей, для тех кто не в теме:
- Это как OBJECTSTRUCT в GS'e, только это в main.exe, она хранит практически всю информацию о персонаже и самое замечательное, что в маине она глобальная (чуть ниже опишу как это можно использовать).

Спойлер
#pragma pack(push, 1)
struct ObjectItem    //-> Complete (size: 107)
{
/*+0*/        short    ItemID;
/*+2*/        int        Level;
/*+6*/        char    Unknown6;
/*+7*/        char    Unknown7;
/*+8*/        char    Unknown8;
/*+9*/        short    DamageMin;
/*+11*/        short    DamageMax;
/*+13*/        char    Unknown13;
/*+14*/        short    Unknown14;
/*+16*/        short    Unknown16;
/*+18*/        char    Unknown18;
/*+19*/        char    Unknown19;
/*+20*/        short    Unknown20;
/*+22*/        char    Durability;
/*+23*/        char    ExcellentOption;
/*+24*/        char    AncientOption;
/*+25*/        short    ReqStrenght;
/*+27*/        short    ReqDextirity;
/*+29*/        short    ReqEnergy;
/*+31*/        short    ReqVitality;
/*+33*/        short    ReqCommand;
/*+35*/        short    ReqLevel;
/*+37*/        char    SpecialCount;
/*+38*/        WORD    SpecialType[8];
/*+54*/        BYTE    SpecialValue[8];
/*+62*/        int        UniqueID;
/*+66*/        char    Unknown66;
/*+67*/        char    PosX;
/*+68*/        char    PosY;
/*+69*/        WORD    HarmonyType;
/*+71*/        short    HarmonyValue;
/*+73*/        char    Is380Item;
/*+74*/        char    SocketOption[5];
/*+79*/        char    Unknown79;
/*+80*/        char    SocketSeedIndex[5];
/*+85*/        char    SocketSphereLevel[5];
/*+90*/        char    SocketSet;
BYTE gap01[5];
/*+96*/        char    DurabilityState;
/*+97*/        char    PeriodItem;
/*+98*/        char    ExpiredItem;
/*+99*/        int        ExpireDateConvert;
/*+103*/    int        Unknown103;
};
#pragma pack(pop)
// ----------------------------------------------------------------------------------------------

#pragma pack(push, 1)
struct UnknownStruct0
{
/*+0*/    WORD    Unknown0;//?
/*+2*/    WORD    Unknown2;//?
/*+4*/    WORD    Unknown4;//?
/*+6*/    WORD    Unknown6;
/*+8*/    WORD    Unknown8;
/*+10*/    WORD    Unknown10;
/*+12*/    WORD    Unknown12;//?
/*+14*/    WORD    Unknown14;
/*+16*/    WORD    Unknown16;
};
#pragma pack(pop)
// ----------------------------------------------------------------------------------------------

#pragma pack(push, 1)
struct ObjectCharacter    //-> ~InDev (size: 6012) [8128AC4 | 8128AC8]
{
/*+0*/        char    Name[11];
/*+11*/        char    Class;
/*+12*/        BYTE    Unknown12;
/*+13*/        BYTE    Unknown13;
/*+14*/        short    Level;
/*+16*/        DWORD    Experience;
/*+20*/        DWORD    NextExperience;
/*+24*/        short    Strength;
/*+26*/        short    Dexterity;
/*+28*/        short    Vitality;
/*+30*/        short    Energy;
/*+32*/        short    Leadership;
/*+34*/        WORD    Life;
/*+36*/        WORD    Mana;
/*+38*/        WORD    MaxLife;
/*+40*/        WORD    MaxMana;
/*+42*/        WORD    Shield;
/*+44*/        WORD    MaxShield;
/*+46*/        WORD    AttackRate;
/*+48*/        WORD    DefenseRate;
/*+50*/        short    AddStrength;
/*+52*/        short    AddDexterity;
/*+54*/        short    AddVitality;
/*+56*/        short    AddEnergy;
BYTE gap01[4];
/*+62*/        WORD    AddLeadership;    //GS use unsigned value...
/*+64*/        WORD    Stamina;
/*+66*/        WORD    MaxStamina;
/*+68*/        BYTE    ItemSpecialUseFlag;        //Bit decomposit (1, 2, 8)
BYTE UnknownGap;
/*+70*/        WORD    ItemSpecialUseTime[3];    //[ ]
/*+76*/        WORD    AddPoint;    //FruitStat start
/*+78*/        WORD    MaxAddPoint;
/*+80*/        WORD    MinusPoint;
/*+82*/        WORD    MaxMinusPoint;    //FruitStat end
/*+84*/        WORD    AttackSpeed;
/*+86*/        WORD    DamageRate;
/*+88*/        WORD    DamageMin;
/*+90*/        WORD    DamageMax;
/*+92*/        WORD    Unknown92;
/*+94*/        WORD    Unknown94;
/*+96*/        WORD    Unknown96;
BYTE gap02[10];
/*+108*/    WORD    Unknown108;
/*+110*/    WORD    Unknown110;
BYTE gap03[4];
/*+116*/    WORD    LevelPoint;
/*+118*/    BYTE    MagicCount;
/*+119*/    BYTE    Unknown119;
/*+120*/    WORD    pMagicList[650];    //maybe 150?
/*1420*/
BYTE gap04[3252];
/*+4672*/    ObjectItem pEquipment[12];
/*+5956*/    DWORD    MoneyInventory;    //(C4)
/*+5960*/    DWORD    MoneyWarehouse;    //(C4)
BYTE gap05[8];
/*+5972*/    UnknownStruct0 Unknown5972;
BYTE gap06[2];
/*+5992*/    WORD    Unknown5992;
/*+5994*/    WORD    Unknown5994;
BYTE gap07[2];
/*+5998*/    WORD    Unknown5998;
/*+6000*/    WORD    Unknown6000;
/*+6002*/    WORD    Unknown6002;
/*+6004*/    WORD    Unknown6004;
/*+6006*/    WORD    Unknown6006;
/*+6008*/    BYTE    Unknown6008;
/*+6009*/    BYTE    Unknown6009;
/*+6010*/    BYTE    Unknown6010;
/*+6011*/    BYTE    Unknown6011;
};
#pragma pack(pop)
// ----------------------------------------------------------------------------------------------
[свернуть]

Все, что нашел по назначению назвал как следует, остальное пока под "Unknown".

Для чего это нужно:
a) Добавлять свои кастомы в клиент с небывалой гибкостью
б) Декомпилить функции маина (с учетом того, что это все глобальная структура - даже из HexRoys выходит удивительный результат)

Как найти адрес структуры
Спойлер
## здесь был скриншот ##

- (вводим цепочку команд)
## здесь был скриншот ##
- (переходим к результату)
## здесь был скриншот ##
## здесь был скриншот ##
- (спускаем вниз пока не увидим нужный отрывок)

8128AC4 -> искомое
[свернуть]

Как связаться с структурой
Спойлер
После того как нашли адрес в коде просто забираем данные из адреса подобным типом:
ObjectCharacter * pPlayer = &*(ObjectCharacter*)*(DWORD*)0x8128AC4;
[свернуть]

Как добавить структуру в IDA
Спойлер
1. Нажимаем Shift + F1
2. Нажимаем Insert
3. Вставляем весь код, что в шапке сообщения
4. Находим функцию, где используется наша глобальная структура

5. Выставляем ей тип ObjectCharacter*


6. Любуемся результатом


(https://www.everfall.com/paste/id.php?yslht5lwudcw
https://www.everfall.com/paste/id.php?i1wurbtv6hy4
https://www.everfall.com/paste/id.php?i1wurbtv6hy4)

P.S.:
- Так же потребуется выставить все тоже самое для адреса +4 от нашей глобальной (0x8128AC8)
- Так же можно делать подобное и с переменными типа ItemObject:

[свернуть]

Ну вот вроде и все.

Структура сделана под Season 6 Episode 3 GMO маин, на других версиях она может отличаться, в общем то это можно сказать пример.

MOHAPX

Цитата: DarkSim от 2013 Апр. 12, 14:03  В общем вчера сел колупать маин и докулупал структуру персонажа и его инвентарных вещей, для тех кто не в теме:
- Это как OBJECTSTRUCT в GS'e, только это в main.exe, она хранит практически всю информацию о персонаже и самое замечательное, что в маине она глобальная (чуть ниже опишу как это можно использовать).

Для чего это нужно:
a) Добавлять свои кастомы в клиент с небывалой гибкостью
б) Декомпилить функции маина (с учетом того, что это все глобальная структура - даже из HexRoys выходит удивительный результат)



Молодец! Уже который раз радуешь результатами своей деятельности.

От себя, в перечислении возможных действий с найденной структурой, хотел бы добавить свою давнюю мечту:

с) разделение персонажей по половой принадлежности ).

Я уже года три предлагаю некоторым программистам создать функцию подобного разделения. Но всегда у всех всё упиралось в клиентскую часть. Если не ошибаюсь, то и с тобой общались на подобную тему. Добавить всего один бит в обмен пакета идентификации персонажей трудностей не представляет, резерв огромный. При создании персонажа, добавить символ персонализации тоже не должно вызвать сложностей. Элементы сетов, традиционных и противоположного пола, можно по названиям частей сетов сохранить идентичными, но раскидать по разным папкам. Узкое и не совсем пока предсказуемое, это на каком этапе грузить визуальную разницу. Так как именно модели необходимые для персонажей, грузятся при запуске клиента. В отличии от остального. Но решение реализации можно найти по ходу.
В результате, наконец бы в MU женская половина могла бы выбрать себе женского персонажа, например мага или воина. А мужская, наконец стать полноценным Эльфом, или Суммом )). Как во всех современных онлайн играх. Естественно, графику я бы взял на себя, хоть часть.
Подумай над этим, или ещё кто клюнет на идею ))).

DarkSim

#2
MOHAPX
- Идея хороша, но как клиент будет понимать кого ты хочешь создать, добавлять свитч в игре тяжеловато, если данные о поле игрока сервер будет получать из базы сайта например то можно сделать, что то вроде. Просто при создании персонажа у тебя заранее будет отображаться у всех соответствующий тебе пол игрока, но это как феминистический костыль будет  :lol:

MOHAPX

Цитата: DarkSim от 2013 Апр. 13, 09:41  MOHAPX
- Идея хороша, но как клиент будет понимать кого ты хочешь создать, добавлять свитч в игре тяжеловато, если данные о поле игрока сервер будет получать из базы сайта например то можно сделать, что то вроде. Просто при создании персонажа у тебя заранее будет отображаться у всех соответствующий тебе пол игрока, но это как феминистический костыль будет  :lol:

Ты наверное не совсем понял вот это:

ЦитироватьПри создании персонажа, добавить символ персонализации тоже не должно вызвать сложностей.

Наверное размытость фразы не очень понятна. Всё очень просто. Если при создании персонажа в его ник вписывать, заранее оговоренный определённый символ - (! " № * @ # $ % & = + - _) выбирай по вкусу, ну или последовательность, то ведь не сложно написать процедуру способную по этому символу в нике разделить половую принадлежность и передать соответствующую внешность персонажу.

8BitCore

Цитата: MOHAPX от 2013 Апр. 13, 14:53  Наверное размытость фразы не очень понятна. Всё очень просто. Если при создании персонажа в его ник вписывать, заранее оговоренный определённый символ - (! " № * @ # $ % & = + - _) выбирай по вкусу, ну или последовательность, то ведь не сложно написать процедуру способную по этому символу в нике разделить половую принадлежность и передать соответствующую внешность персонажу.
Допустим, в качестве последнего символа в нике, при записи в базу его удаляет. Но это действительно костыль.
Тима добавлял кнопки в игру, добавь две кнопки выбора пола (wasntme)

Profesor08

#5
И потом модельки игроков рисовать, а также все модели шмота перерисовывать.

Simp1e

с помощью её можно писать читы в виде простой длл к маину =) даже с виртуальным хуком =)
 как бы это не повлеяло на корысные цели  

так держать продолжай дальше ) Хоть одному человеку не лень искать всё это говно...

MOHAPX

Конечно можно и кнопки, но для этого уже надо несколько другой подход. И кто сказал, что символ, или знак должен быть последним и его надо удалять? Наоборот первым и пусть присутствует в самом нике. Например в чате, общаясь, можно сразу понять с кем ведёшь беседу ).

Но ведь не это ключевое. Какая будет реализация изначального выбора половой принадлежности уже дело пятое. Вариантов ещё можно несколько предложить. Главное замахнутся на подобное и попытаться реализовать. Тем более, при "метке" в нике совсем не обязательно захламлять базу сервера и вообще обращаться к серверу. Зачем?

Кузнец?!  ..... неее, тьфу  .... сервер нам не нужен. Чтобы например одеть мага в легендари, но другого вида, нам надо поменять только сами части сета. Ни характеристики ни ID  частей сета не меняются, поэтому серверу до нас, как и Item.bmd на клиенте, не должно быть дела. Только внешний вид. Как малой кровью получить возможность различать пол? Вот именно, просто первой буквой или символом в нике. Когда сервер на клиент пакетом передаёт инфу, возникающего возле нашего перса другого, нам только надо будет от него именно ник. И уже по нему провести процедуру визуализации внешнего вида.
В таком варианте упрощается всё до максимума. Единственная трудность, повторяюсь, это как именно подать женские(если эльф, то мужские) части сета на перса. Вот с мобами всё просто, они подгружаются в момент появления их в поле зрения. А всё что касается персонажей, при загрузке самого клиента. Поэтому перса надо "переодеть" в момент получения ника. Так как по умолчанию он уже одет традиционно. Вот какие последствия от этого могут произойти, я не могу предсказать. Надо экспериментировать.
Мне видится к папке Data\Player в клиенте, добавить Data\Player1. В традиционной всё как и было, а в дополнительной названия всё те же, но сами части моделей противоположного пола. При загрузке клиента части сетов грузятся традиционно, а уже на подмену с теми же названиями берутся из Data\Player1.

В общем думайте )). Надеюсь на этот раз суть идеи прояснил?

Morgan

Может быть немного тупой вопрос.....
Зачем разделять на пол или в Mu  играет очень много женского пола?

Simp1e

Unknown92 m_AttackDamageRateMin
Unknown96 m_MagicSpeed
Unknown94 m_AttackDamageRateMax

Телега

Можно более подробный гайд?)
ибо вообще представления не имею что такое IDA и что с ней делать.

Телега

Ребят, где взять эту структуру для Reedlan мейна?

Похожие темы (5)