avatar_SaneaMD

Разбор хекс кода вещей + история, Понимание работы анти-дубликат системы

Автор SaneaMD, 2014 Янв. 05, 17:18

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

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

Ключевые слова [SEO] mu onlineхекс коданти-дубликат

SaneaMD

Недавно поздравил своих игроков с новым годом и в качестве подарка я решил закинуть каждому игроку в банк боксы и пару камней.
вот примерно так
Спойлер
## здесь был скриншот ##
[свернуть]
Естественно не в ручную а при помощи кода, тут мне и понадобились хекс код этих самых подарков. закинул себе в банк это все и сделал не хитрый запрос:
Спойлер
declare @hex varbinary(1920); set @hex=(SELECT Items FROM warehouse where AccountId='мой акк'); print @hex;
[свернуть]
из полученного кода я выделил что мне нужно, зная что код итема состоит из 32 значений, я отсчитал 1024(32*на 32 клетки которые занимает мой подарок) и скопировал.
получил:
Спойлер
0B6000DA3CE5000000E00000000000000B6000C37914000000E0000000000000B400010BA8A1D400
00E00000000000000B6000B3A09D000000E0000000000000B400010BA81DEB0000E00000000000000
B6000C4D0D7000000E0000000000000B400010BA7C6920000E00000000000000B6000479852000000
E00000000000000B60002620E1000000E0000000000000B400010BA8F6790000E0000000000000B40
0010BA81D700000E00000000000000B6000EDCE62000000E0000000000000B400010BA7C9DB0000E0
000000000000B400010BA8A42C0000E0000000000000B400010BA7CA120000E00000000000000B600
0AF9AE0000000E00000000000000B6000F2C550000000E00000000000000B6000CFFDC5000000E000
0000000000B400010BA8F64E0000E00000000000000B6000E570CB000000E00000000000000B60004
4D4EC000000E00000000000000B600006A5FF000000E0000000000000B400010BA8FD0E0000E00000
000000000B6000BDD923000000E00000000000000B6000C44574000000E00000000000000B6000C99
1D1000000E0000000000000B400010BA7C9A70000E00000000000000B60006058A8000000E0000000
0000000B60004E612B000000E00000000000000B60000D9E42000000E0000000000000B400010BA8F
CC30000E00000000000000B6000F6B05A000000E0000000000000
[свернуть]
Теперь обмозговал код по которому каждый игрок получит подарок не теряя весь банк. За ранее попросил игроков сделать место 4* на 8(по горизонтали).
Полученный код:
Спойлер
    $result = mssql_query("SELECT AccountID FROM [WareHouse] order by AccountID asc");
$row_num = mssql_num_rows($result);

for($i=0; $i<$row_num; ++$i) {
$result_ = mssql_fetch_row($result);
$query        = mssql_query("declare @it varbinary(1920);
set @it=(SELECT [Items] FROM [WareHouse] WHERE [AccountID]='".$result_[0]."');
print @it");
$mycuritems    = mssql_get_last_message();
$newitem    = '0B6000DA3CE5000000E00000000000000B6000C37914000000E0000000000000B400010BA8A1
D40000E00000000000000B6000B3A09D000000E0000000000000B400010BA81DEB0000E0000000000
0000B6000C4D0D7000000E0000000000000B400010BA7C6920000E00000000000000B600047985200
0000E00000000000000B60002620E1000000E0000000000000B400010BA8F6790000E000000000000
0B400010BA81D700000E00000000000000B6000EDCE62000000E0000000000000B400010BA7C9DB00
00E0000000000000B400010BA8A42C0000E0000000000000B400010BA7CA120000E00000000000000
B6000AF9AE0000000E00000000000000B6000F2C550000000E00000000000000B6000CFFDC5000000
E0000000000000B400010BA8F64E0000E00000000000000B6000E570CB000000E00000000000000B6
00044D4EC000000E00000000000000B600006A5FF000000E0000000000000B400010BA8FD0E0000E0
0000000000000B6000BDD923000000E00000000000000B6000C44574000000E00000000000000B600
0C991D1000000E0000000000000B400010BA7C9A70000E00000000000000B60006058A8000000E000
00000000000B60004E612B000000E00000000000000B60000D9E42000000E0000000000000B400010
BA8FCC30000E00000000000000B6000F6B05A000000E0000000000000';
$test        = 0;
$test        = $slot*32;
$mynewitems = substr_replace($mycuritems, $newitem, ($test+2), 1024);
mssql_query("UPDATE [warehouse] set [Items]=".$mynewitems." WHERE [AccountId]='".$result_[0]."'");
}
[свернуть]
Конечно на новый год я устроил оффлайн на 10 мин. чтоб не возникло проблем допустим если кто то в это время будет в банке.
Все прошло успешно не смотря на то что возникла проблема с sql но это к теме не относится. И так про саму тему, на следующий день после обеда(новый год же был:D) я захожу на сервер и тут начинается..."у меня проблема с подарками, не могу вытащить, выкидывает и просит связаться с ГМ'ом". Виноват конечно же был я, кто же еще...
Я начал разбираться как же так вроде тестил и все было хорошо. Даже грешил на новый камень. Тут мне удалось получить дисконнект и за них я просто имел в инвентаре 2 подарка то есть 2 раза сделал себе подарок чтоб понять. Полученное сообщение "This is an illegal dublicated item. Contact a GM.", копаясь опять же в хекс кодах уже инвентаря я понял что действительно дубликат и проблемы есть у тех у кого больше аккаунтов и передали себе("жадность", как сказал один игрок). Вроде бы сами виноваты но вот что делать с теми кто просто купил камень или получил честно другой подарок. Кстати почему грешил на камень, просто с боксами проблем не возникло, так как их сразу же покидали не передавая. Так вот оказывается 2 одинаковых итема имеют разный код.
Я заметил что изменяется а что остается в Box+5:
Хекс код:
Цитировать0B60004762C9000000E0000000000000
то что красным меняется, это так называемый S/N
И так если в банке или в инвентаре при перемещений итема сервер находит одинаковый S/N то выкидывает из игры говоря что дубликат. Я вручную удалил и дал другие камни всем у кого были проблемы(не у многих если смотреть что подарков было сделано около 1800 аккаунтам)

wizik

А почему так не подробно?

вот ваш хекс бокса +5

0B60004762C9000000E0000000000000  , разберем по байту

0B - item index

60 - тут инфа об, заточке вещи на +0 - +15, о том сколько лайфов вставлено от 0 до 3 и есть ли опция лак на шмотке.
Формула: Значение = 8*Уровень заточки+4*Luck(Luck равен либо 1 либо 0 -  если есть лак на вещи 1, если нету ноль) +  1*Кол-во лайфов (от 0 до 3)

00 - Durability от 0 до FF (255), и значение считается так:

Значение = Durability(берем из файла item.txt для конкретной вещи и переводим в хекс) + F*Exc(есть вещь екселент то 1, если не то 0) + ItemLvlFactor

ItemLvlFactor = 1*Заточка вещи(от 0 до 4) + 2*Заточка вещи(от 5 до 9 тоесть если вещь +4 и ниже - то множитель равен 0) + 3*Заточка вещи (от 10 до 11 если вещи +9 и ниже множитель равен 0) + 6*Заточка вещи(от +12 до +15 если вещь +11 и ниже то множитель равен 0). Тут не совсем уверен в формуле, надо проверить


4762C900 - серийник, как он генерируется правильно не знаю, надо тестить.

00 - показатель для екслент опций, например 3F - Фулл вещь, так же если вставлено лайфов 4 и более к значению прибавляется 40, а в байте где в нашем случае значение 60 кол-во вставленых лайфов обнуляется и снова растет до 3.

если шмотка +0+ фулл+ 28адд
То есть байт 00, превратиться в 7F
А байт 60, превратиться в 03

если шмотка +0+ фулл+ 12адд
То есть байт 00, превратиться в 3F
А байт 60, превратиться в 03

следующий байт 00 - надо смотреть, не знаю.

байт E0 Item Type, 00 - sword, 80 - Armor, E0 (12) - раздел боксов, вингов и тд (Wings / Misc)

байт 00 - отвечает за хармони опции и опции 380лвла

0000000000 последние 5 байт это сокет опции по байту на каждый слот.

Profesor08

2E7F91797F4C007F0588150032023667

797F4C00- серийник и генерируется процедурой exec WZ_GetItemSerial
15 - хармони опция. 1 - тип опции, 5 - уровень опции! а не то что там выше написано.
8 - опция для вещей 380 уровня! а не то что выше написано.
5 - ancient. 5 - первый тип, А - второй тип.

Для вот такого хекс вещей
0C4000E5AF7A004650D000FFFFFFFFFF911AAC2AFFFFFFFFFFFFFFFFFFFFFFFF
911AAC2A - второй серийник, генерируется процедурой exec WZ_GetItemSerial2 1

И не пытайтесь так добавлять вещи как это сделал топик стартер! Это чревато проблемами похлеще, так как тут заменяется часть банка игрока. Игрок мог не убрать вещи, то он их безвозвратно утратит.

SaneaMD

Цитата: wizikА почему так не подробно?
Во первых я многого из чего ты написал не знал а во вторых эта так для понимания, не думаю что ко то еще рисует что либо через эти  коды, блага есть мумакер и всевозможные едиторы.

Цитата: Profesor08И не пытайтесь так добавлять вещи как это сделал топик стартер! Это чревато проблемами похлеще, так как тут заменяется часть банка игрока. Игрок мог не убрать вещи, то он их безвозвратно утратит.
я для этого и создал тему чтобы другой кто то не попал или же был готов

wizik

Цитата: x00000 от 2014 Янв. 06, 00:35  Во первых я многого из чего ты написал не знал а во вторых эта так для понимания, не думаю что ко то еще рисует что либо через эти  коды, блага есть мумакер и всевозможные едиторы.


я для этого и создал тему чтобы другой кто то не попал или же был готов

двойной сундук на 6х сезона и  мумакер стирает каждый раз сундук, и титан теч - баганый едитор, и рисует шмот с нулевым серийком.

Ну, sql скрипт полезен будет всегда твой. Но и хекс код знать нужно, чтобы смочь кастыль смастерить, когда мумакер и тд бессильны.

SaneaMD

Вот допустим прошло 6 дней после нового года и некоторые не взяли свой подарок, возможно эти игроки уже не играют. Дабы не искушать других на глупости принял решение удалить подарок если он в первозданном виде.
Вот получившийся код:
Спойлер
$result = mssql_query("SELECT AccountID FROM [WareHouse] order by AccountID asc");
$row_num = mssql_num_rows($result);
for($i=0; $i<$row_num; ++$i) {
$result_ = mssql_fetch_row($result);
$query = mssql_query("declare @it varbinary(1920);
set @it=(SELECT [Items] FROM [WareHouse] WHERE [AccountID]='".$result_[0]."');
print @it");
$mycuritems = mssql_get_last_message();
$test = 0;
//$test = $slot*32;
$curitems = substr($mycuritems, $test+2,1024);
$newitem = '0B6000DA3CE5000000E00000000000000B6000C37914000000E0000000000000B400010BA8A1
D40000E00000000000000B6000B3A09D000000E0000000000000B400010BA81DEB0000E0000000000
0000B6000C4D0D7000000E0000000000000B400010BA7C6920000E00000000000000B600047985200
0000E00000000000000B60002620E1000000E0000000000000B400010BA8F6790000E000000000000
0B400010BA81D700000E00000000000000B6000EDCE62000000E0000000000000B400010BA7C9DB00
00E0000000000000B400010BA8A42C0000E0000000000000B400010BA7CA120000E00000000000000
B6000AF9AE0000000E00000000000000B6000F2C550000000E00000000000000B6000CFFDC5000000
E0000000000000B400010BA8F64E0000E00000000000000B6000E570CB000000E00000000000000B6
00044D4EC000000E00000000000000B600006A5FF000000E0000000000000B400010BA8FD0E0000E0
0000000000000B6000BDD923000000E00000000000000B6000C44574000000E00000000000000B600
0C991D1000000E0000000000000B400010BA7C9A70000E00000000000000B60006058A8000000E000
00000000000B60004E612B000000E00000000000000B60000D9E42000000E0000000000000B400010
BA8FCC30000E00000000000000B6000F6B05A000000E0000000000000';
$new_newitems ='FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
if($curitems==$newitem) {
$mynewitems = substr_replace($mycuritems, $new_newitems, ($test+2), 1024);
mssql_query("UPDATE [warehouse] set [Items]=".$mynewitems." WHERE [AccountId]='".$result_[0]."'");
}
}
[свернуть]

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