На форуме временно ведутся технические работы! Подробнее.

Вход
Логин: Пароль:Забыли пароль?
Запомнить вас на этом компьютере?
Войти скрытым?

Здравствуйте, гость ( Вход | Регистрация )

> описание и правила

MU Development - раздел в котором каждый может предложить готовое и полезное решение для сервера/клиента/сайта mu online. Перед названием темы обезательно ставить приставку [Dev].
Каждый разработчик имеет второстепенную группу Developers.
Developers - могут в любое время закрывать и открывать свои темы.

 
Ответить в данную темуНачать новую тему
[Гайд] Разбираем цены клиента, С примерами и прочим
Рейтинг 5
5/5
V

DarkSim
сообщение 6.12.2012, 16:21
Сообщение #1

zTeam
*****
Группа: V.I.P.
Сообщений: 380
Регистрация: 14.7.2008
Пользователь №: 1543
Спасибо сказали: 590 раз(а)



Репутация:   12  
В общем не так давно решил пересмотреть свои функции и нашел интересную вещь, как оказалось WebZen не стали особо мудрить с ценами на вещи и менять их оказалось намного проще, чем я думал раньше.

1. Все начинается с функции, которая определяет цену предмета и возвращает long long значение

__int64 SetItemPrice(ObjItem * gItem, int Mode);

Название я сам придумал biggrin.gif

И так, что есть ItemStruct и что есть Mode:

- ObjItem * gItem это структура передаваемая функции, в которой клиент хранит такие данные, как Defense / Damage / требования по статам и прочее.

Не полная структура:
CODE
struct ObjItem
{
/*0*/        WORD    ItemID;
/*2*/        DWORD    Level;
/*6*/        BYTE    Unknown6;
/*7*/        BYTE    Unknown7;
/*8*/        BYTE    Unknown8;
/*9*/        WORD    DamageMin;
/*11*/        WORD    DamageMax;
/*13*/        BYTE    Unknown13;
/*14*/        WORD    Unknown14;
/*16*/        WORD    Unknown16;
/*18*/        BYTE    Unknown18;
/*19*/        BYTE    Unknown19;
/*20*/        WORD    Unknown20;
/*22*/        BYTE    Durability;
/*23*/        WORD    Attribute2;
/*25*/        WORD    RequireStrenght;
/*27*/        WORD    RequireDextirity;
/*29*/        WORD    RequireEnergy;
/*31*/        WORD    RequireVitality;
/*33*/        WORD    RequireCommand;
/*35*/        WORD    RequireLevel;
/*37*/        BYTE    Unknown37;
/*38*/        BYTE    Unknown38;
};


- int Mode это тип с которым функция должна вернуть цену, 0 - Покупка, 1 - Продажа

2. Самый гибкий и простой вариант установки своих цен:

2.1. Создаем свою функцию, которая будет выполнять нужные нам действия перед оригинальной, пример:

CODE
__int64 gSetItemPrice(ObjItem * gItem, int Mode)
{
    __int64 Money = -1;
    // ----
    if( (int)gItem == -1 )
    {
        return 0;
    }
    // ----
    switch(gItem->ItemID)
    {
    case ITEM(14, 13):    //-> Jewel Of Bless
    case ITEM(14, 14):    //-> Jewel Of Soul
        {
            Money = 15000000;
        }
        break;
    }
    // ----
    if( Money != -1 )
    {
        if( Mode == 1 )
        {
            Money /= 3;
        }
        // ----
        return Money;
    }
    // ----
    return SetItemPrice(gItem, Mode);
}


В данной случае наша функция проверяет поинтер по ItemID на Jewel Of Soul и Jewel Of Bless, возвращает цену равную 15000000 Zen, если вещь лежит в магазине (покупка) и 1/3 от суммы, если вещь лежит в инвентаре (продажа), следом проверяет изменение цены, если она была изменена то возвращает ее, если нет - вызывает оригинальную функцию

CODE
#define SetItemPrice            ((__int64(*)(ObjItem * gItem, int Mode)) 0x53D725)


2.2. Перехватываем все вызовы оригинальной функции на нашу собственную, делается это довольно просто:

- Открывает main.exe в Ollydbg, идем на адрес функции (53D725) и нажимаем CTR+R, после чего к нам выходит список всех вызовов функции

Свёрнутая информация:
## здесь был скриншот ##


Пример перехвата:

CODE
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x004D8E03, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x004F27E0, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x0053A820, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x0053A87C, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x0053A8D0, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x005BF62F, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x005BF9B8, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x005C1ABC, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x005C1AF1, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x005C1B56, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x005CC10E, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x00753437, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x007A4570, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x007A45E8, ASM::CALL);
SetHook((LPVOID)gSetItemPrice, (LPVOID)0x007A4F0E, ASM::CALL);


Вот и все, теперь мы можем легко ставить любые цены на любые вещи, при этом применять сложные проверки на вроде Excellent опций и многое другое, тут уже все от фантазии.

Структура ObjItem может оказаться уникальной для 1.03.28 GMO, но я думаю, что она универсальна как минимум с 3.2 по 5.4 сезоны.

В случае, если возникнут проблемы с вызовом функции можно делать все немного иначе, заменить все ObjItem * gItem аргументы на int ItemStruct, и вызывать нужные аргументы в формате:

*(WORD*)(ItemStruct) //-> ItemID
*(BYTE*)(ItemStruct + 22) //-> Durability

И т.д.

Собственно конец, может кому будет интересно или даже пригодиться.

P.S.: Все оффсеты для 1.03.28 GMO

Сообщение отредактировал DarkSim - 9.11.2013, 23:26
Перейти в начало страницы
+Цитировать сообщение

Profesor08
сообщение 6.12.2012, 16:36
Сообщение #2


z-Z-z-Z-z
*******
Группа: Супермодератор
Сообщений: 3675
Регистрация: 15.6.2008
Пользователь №: 1181
Спасибо сказали: 1199 раз(а)



Репутация:   11  
При этом будет отображаться визуально нужная цена?
Перейти в начало страницы
+Цитировать сообщение

DarkSim
сообщение 6.12.2012, 16:42
Сообщение #3

zTeam
*****
Группа: V.I.P.
Сообщений: 380
Регистрация: 14.7.2008
Пользователь №: 1543
Спасибо сказали: 590 раз(а)



Репутация:   12  
Да, та самая, которую вернет твоя функция
Перейти в начало страницы
+Цитировать сообщение

Crazzy-
сообщение 7.12.2012, 5:56
Сообщение #4


Элита
*******
Группа: Проверенные II
Сообщений: 896
Регистрация: 15.7.2009
Пользователь №: 7102
Спасибо сказали: 207 раз(а)



Репутация:   2  
Задрот. ))
Свёрнутая информация:
111!11


Сообщение отредактировал Crazzy- - 7.12.2012, 5:57
Перейти в начало страницы
+Цитировать сообщение

MOHAPX
сообщение 7.12.2012, 15:25
Сообщение #5


Элита
*******
Группа: V.I.P.
Сообщений: 556
Регистрация: 22.3.2008
Пользователь №: 459
Спасибо сказали: 407 раз(а)



Репутация:   2  
Цитата(Crazzy- @ 7.12.2012, 5:56) *
Задрот. ))
Свёрнутая информация:
111!11



Если бы, хотя бы треть активных участников X-MU.NET проявляли подобное задротство, то MUonline не была бы в таком упадочном состоянии. А так, в основном, "интеллект" расходуется на загаживание актуальных тем, в направление чей конец ветвистей и на Ддос атаки даже не жизнеспособных серверов.
Перейти в начало страницы
+Цитировать сообщение

KamatoZ
сообщение 1.4.2013, 2:29
Сообщение #6


Раз"3,14"здяй
*******
Группа: Проверенные
Сообщений: 864
Регистрация: 20.3.2009
Пользователь №: 5256
Спасибо сказали: 92 раз(а)



Репутация:   0  
А кто подскажет как найти оффсет для мейна 2 сезона 1.2.44.0?
Перейти в начало страницы
+Цитировать сообщение

Crazzy-
сообщение 4.4.2013, 14:16
Сообщение #7


Элита
*******
Группа: Проверенные II
Сообщений: 896
Регистрация: 15.7.2009
Пользователь №: 7102
Спасибо сказали: 207 раз(а)



Репутация:   2  
Цитата(MOHAPX @ 7.12.2012, 20:25) *
Если бы, хотя бы треть активных участников X-MU.NET проявляли подобное задротство, то MUonline не была бы в таком упадочном состоянии. А так, в основном, "интеллект" расходуется на загаживание актуальных тем, в направление чей конец ветвистей и на Ддос атаки даже не жизнеспособных серверов.

Да я не спорю, но то чем хочу занятся я никто неподдерживает sad.gif а один я невытяну по времени...
Перейти в начало страницы
+Цитировать сообщение

Profesor08
сообщение 4.4.2013, 14:46
Сообщение #8


z-Z-z-Z-z
*******
Группа: Супермодератор
Сообщений: 3675
Регистрация: 15.6.2008
Пользователь №: 1181
Спасибо сказали: 1199 раз(а)



Репутация:   11  
Цитата(Crazzy- @ 4.4.2013, 12:16) *
Да я не спорю, но то чем хочу занятся я никто неподдерживает sad.gif а один я невытяну по времени...

Тут даже время особого значения не имеет. "Один в поле не воин" - этим все сказано.
Перейти в начало страницы
+Цитировать сообщение

epmak
сообщение 4.4.2013, 15:34
Сообщение #9


MWCE 1.6.2 FOR FREE
*******
Группа: Проверенные II
Сообщений: 3770
Регистрация: 27.6.2008
Пользователь №: 1328
Спасибо сказали: 1047 раз(а)



Репутация:   6  
1 может начать, а потом уже пытаться заинтересовать остальных.
Перейти в начало страницы
+Цитировать сообщение

gucciprado
сообщение 4.4.2013, 15:46
Сообщение #10


V.I.P.
*****
Группа: Пользователи
Сообщений: 302
Регистрация: 26.2.2013
Пользователь №: 16328
Спасибо сказали: 65 раз(а)



Репутация:   0  
Спасибо, то что нужно! Как раз искал этот гайд! Вещь!
Перейти в начало страницы
+Цитировать сообщение

NeleGaL
сообщение 15.8.2013, 21:50
Сообщение #11

Наблюдатель
Группа: Новички
Сообщений: 2
Регистрация: 16.5.2013
Пользователь №: 16617
Спасибо сказали: 0 раз(а)



Репутация:   0  
неплохо спасибо большое
Перейти в начало страницы
+Цитировать сообщение

LetsToPlay
сообщение 19.7.2014, 15:00
Сообщение #12



*******
Группа: Пользователи
Сообщений: 554
Регистрация: 2.3.2014
Пользователь №: 17420
Спасибо сказали: 124 раз(а)



Репутация:   0  
Выложите пожалуйста 1.03.28 GMO майн

Спасибо, сделал. Может кто-то выложит подобный гайд для ГСа?)
Перейти в начало страницы
+Цитировать сообщение

positive
сообщение 19.7.2014, 16:00
Сообщение #13


Элита
*******
Группа: Проверенные
Сообщений: 764
Регистрация: 10.12.2013
Пользователь №: 17133
Спасибо сказали: 326 раз(а)



Репутация:   -1  
Цитата
- Открывает main.exe в Ollydbg, идем на адрес функции (53D725) и нажимаем CTR+R, после чего к нам выходит список всех вызовов функции


Как найти этот адрес? Не очень понятно.

Цитата(LetsToPlay @ 19.7.2014, 15:00) *
Выложите пожалуйста 1.03.28 GMO майн

Спасибо, сделал. Может кто-то выложит подобный гайд для ГСа?)


В соседней теме Кернигана есть... Посмотреть же можно.
Перейти в начало страницы
+Цитировать сообщение

LetsToPlay
сообщение 19.7.2014, 18:23
Сообщение #14



*******
Группа: Пользователи
Сообщений: 554
Регистрация: 2.3.2014
Пользователь №: 17420
Спасибо сказали: 124 раз(а)



Репутация:   0  
Цитата(positive @ 19.7.2014, 16:00) *
Как найти этот адрес? Не очень понятно.



В соседней теме Кернигана есть... Посмотреть же можно.

Насчет найти этот адрес, это начало функции в которой меняются цены например блесса.
например находишь где изменить цену на блес и поднимаешься до первого "PUSH EBP"

в моем майне 1.03.16 этот адрес 0x0050ED6E.



Сообщение отредактировал LetsToPlay - 19.7.2014, 18:31
Перейти в начало страницы
+Цитировать сообщение

GIF1985
сообщение 13.9.2014, 17:24
Сообщение #15

Наблюдатель
Группа: Пользователи
Сообщений: 18
Регистрация: 7.4.2014
Пользователь №: 17514
Спасибо сказали: 0 раз(а)



Репутация:   0  
эта инструкция для всех сезонов MU?
Перейти в начало страницы
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
Нет новых сообщений Скины моделей MUonline для использования в дизайне сервера или клиента
в PNG и PSD форматах
5 MOHAPX 6847 8.7.2021, 9:14 Посл. сообщение: Thedevilslefthand
Нет новых Редактирование клиента
Создание персонажа
13 zverek 895 13.12.2020, 9:25 Посл. сообщение: Wendigo
Нет новых сообщений Изменение клиента Season 6
3 vlad1993 981 24.2.2020, 19:54 Посл. сообщение: vlad1993
Нет новых сообщений Эффекты для игрового клиента
Графон в му
5 NexT 2297 5.10.2018, 21:30 Посл. сообщение: KpacaBaa
Нет новых сообщений Эффекты для игрового клиента.
Graphic Mu Online
2 Wendigo 1591 28.3.2018, 12:57 Посл. сообщение: Wendigo

 

RSS Текстовая версия Сейчас: 8.8.2022, 19:59
Яндекс.Метрика  Перевод с помощью Google English French German Italian Portuguese Russian Spanish