PDA

Просмотр полной версии : Параметры итемов.


nitrotek
20.09.2012, 19:29
Тема перекочевавшая с pwlab.net
Те самые октеты который так любят администраторы серверов.

Все значения представлены в шестнадцатеричной системе счисления.

Одежда, Бижутерия: Variable Size
+0. Требуется уровень
+2. Ограничение по классу, считается так: Суммирование по нижеперечисленным значениям даёт ограничение по нескольким классам. Т.е например Ограничение по классу: Убийца, Шаман. Выглядит как: 24. [Size 2 Bytes]
Страж - 100
Мистик - 200
Шаман - 4
Убийца - 20
Воин - 1
Маг - 2
Лучник - 40
Жрец - 80
Оборотень - 10
Друид - 8
+4. Требуется сила [Size 2 Bytes]
+6. Требуется выносливость [Size 2 Bytes]
+8. Требуется ловкость [Size 2 Bytes]
+A. Требуется интеллект [Size 2 Bytes]
+C. Текущая прочность предмета [Size 4 Bytes]
+10. Максимальная прочность предмета [Size 4 Bytes]
+14. Класс вещи (Неисследовал) но значения занимают [Size 2 Bytes]
+16. Флаги вещи (Неисследовано) но значения занимают [Size 1 Bytes]
+17. Размер буффера создателя предмета (WideString) [Size 1 Bytes]
+18. Создатель вещи [..Size..] (В нашем случае, не будем учитывать автора), поэтому следующий тоже начинается со смещения +18.
+18. Защита [Size 4 Bytes]
+2C. Уклонение [Size 4 Bytes]
+30. +Мана [Size 4 Bytes]
+34. +Здоровье [Size 4 Bytes]
+38. +Защита от металла [Size 4 Bytes]
+3C. +Защита от дерева [Size 4 Bytes]
+40. +Защита от воды [Size 4 Bytes]
+44. +Защита от огня [Size 4 Bytes]
+48. +Защита от земли [Size 4 Bytes]
+4C. +Количество ячеек [Size 2 Bytes]
+4E. +Флаги ячеек [Size 2 Bytes]
+Range (50,50+4*OFF:4C). Идентификаторы камней в ячейках. [Every size 4 Bytes].
+50. +Количество дополнительных свойств, [Siize 4 Bytes]
+54++. Лист дополнительных свойств. Идентификаторы ниже [Every size 8 Bytes]

Дополнительные свойства
Дополнительные свойства имеют структуру:

struct EffectProp {
int ID;
int Value;
}

Список предполагаемых ID и их идентификаторы:
[ID = 2139]. Уменьшение физического урона
[ID = 2144]. Восстановление здоровья.
[ID = 2149,2148]. Восстановление маны.
[ID = 2274,2276,2543]. Дополнительное здоровье.
[ID = 227B]. Дополнительная мана.
[ID = 227E]. Скорость +.
[ID = 2290]. Физическая защита.
[ID = 25B4]. Интеллект +.
[ID = 25BA]. Выносливость +.
[ID = 25FF]. Защита от металла.
[ID = 2619]. Защита от дерева.
[ID = 2633]. Защита от воды.
[ID = 264E]. Защита от огня.
[ID = 266B]. Защита от земли.
[ID = 25B1,25B2]. Ловкость +.
[ID = 2468]. Сила +.
[ID = 2138]. Уменьшение физического урона %
[ID = 2151] Пауза между атаками.
[ID = 2424,229E]. Уклонение.
[ID = 2422]. Физ защита.
[ID = 2249]. Вероятность нанесения критического удара.
[ID = 2253]. Пение -%F
[ID = 23F4]. Физическая атака.

[SIZE="5"]Стиль: Fix Size [12 Bytes]
+0. Требуемый уровень [4 Bytes]
+4. Цвет [4 Bytes]
+8. Идентификатор const 0x03 [2 Bytes]
+A. Unknown Data [2 Bytes]
Цвет у китайцев считывается так (код исходя из данных дизассемблера, поэтому можно его упростить, часть уже упрощена) ,непонятно зачем так было сделано ведь данные все равно занимают 4 байта, что в RGB, что в их формате:
DWORD PWFashionColorToRGB(DWORD ColorOctets)
{
DWORD ColorRGB = ((((((ColorOctets & 0xFFFFFC00) | 0xFFFF8000) << 3) | (ColorOctets & 0x3e0)) << 3) | (ColorOctets & 0x1f)) << 3;
Byte *Colors = (Byte*)&ColorRGB;
Colors[3] = 0;
Swap(Colors[0],Colors[2]);
return ColorRGB;
}
}
Последние 3 строки всего лишь обменивают байты, и зануляют альфа байт.
Исходный формат у китайцев: aarrggbb
Формат RGB: 00bbggrr

Хирки: FixSize [8 Bytes]
40 77 1B 00 00 00 40 3F
+0. Текущее количество запаса у хиры.[4 Bytes].
+4. Unknown Data [3 Bytes]
+7. Возможно идентификатор 0x3F = const [1 Bytes]

Прошу любить и жаловать и дополнять эту тему.

FreePVP)))
20.09.2012, 23:44
+14. Класс вещи (Неисследовал) но значения занимают [Size 2 Bytes]
Этот "класс" так же является размером буфера с основными статами вещи, если не ошибаюсь:
+18. Защита [Size 4 Bytes]
+2C. Уклонение [Size 4 Bytes]
+30. +Мана [Size 4 Bytes]
+34. +Здоровье [Size 4 Bytes]
+38. +Защита от металла [Size 4 Bytes]
+3C. +Защита от дерева [Size 4 Bytes]
+40. +Защита от воды [Size 4 Bytes]
+44. +Защита от огня [Size 4 Bytes]
+48. +Защита от земли [Size 4 Bytes]

Стиль: Fix Size [12 Bytes]
+0. Требуемый уровень [4 Bytes]
+4. Цвет [4 Bytes]
+8. Идентификатор const 0x03 [2 Bytes]
+A. Unknown Data [2 Bytes]
Тут спорный вопрос
У меня бывали случаи, когда стиль занимал более 12 байт
Так что я читаю его следующим образом(хотя тут надо еще тестировать):

Level = ds.ReadInt16();
ds.ReadWord();
Color = ds.ReadDword();
ds.ReadByte();
uint len = ds.ReadCUInt32();
ds.ReadWord();
ds.Skip((int)len);

rusran4
13.10.2012, 05:18
Страж - 100
Мистик - 200
Шаман - 4
Убийца - 20
Воин - 1
Маг - 2
Лучник - 40
Жрец - 80
Оборотень - 10
Друид - 8
Ошибаешься. Каждый последующий класс размером больше предыдущего в 2 раза. (1 2 4 8 16 32 64 128 256 512 соответственно) 1023 - без ограничений на класс
Лист дополнительных свойств. Идентификаторы ниже [Every size 8 Bytes]
Не всегда 8, объяснять почему не буду, но намекну... скиллы... точка...
Список предполагаемых ID и их идентификаторы:
Буду благодарен тому, кто поделится полным списком функций

Smertig
13.10.2012, 11:40
Ошибаешься. Каждый последующий класс размером больше предыдущего в 2 раза. (1 2 4 8 16 32 64 128 256 512 соответственно) 1023 - без ограничений на класс
ТС указал в hex'е.

rusran4
15.10.2012, 06:56
40 77 1B 00 00 00 40 3F
+0. Текущее количество запаса у хиры.[4 Bytes].
+4. Unknown Data [3 Bytes]
+7. Возможно идентификатор 0x3F = const [1 Bytes]
Остаток заряда [int:4 bytes]
Процент для срабатывания [float:4bytes]

Jok3r666
15.10.2012, 11:54
Маг - 2
Лучник - 40
Жрец - 80
Оборотень - 10
Друид - 8
Ну не понятно же, если убийца и шаман это 24 = 20+4
То к примеру "оборотень" = "Маг" + "друид"
Как же все таки он понимает какое из ограничений?

nitrotek
15.10.2012, 12:56
Ну не понятно же, если убийца и шаман это 24 = 20+4
То к примеру "оборотень" = "Маг" + "друид"
Как же все таки он понимает какое из ограничений?
Как уже писали выше все значения в шестнадцатеричной системе счисления. Собственно и у меня в самом начале поста об этом написано.
Оборотень <> Маг + Друид. Почему? Да потому что 8+2 = A, а не 10.
Принадлежность к классу определяется обычным поразрядным &.
Например проверка принадлежности к магу:
Если (Value И 2) равен 2 <Обрабатываем> и.т.д

Jok3r666
15.10.2012, 13:24
Как уже писали выше все значения в шестнадцатеричной системе счисления
Сори не заметил.

rusran4
15.10.2012, 14:47
DWORD PWFashionColorToRGB(DWORD ColorOctets)
{
DWORD ColorRGB = ((((((ColorOctets & 0xFFFFFC00) | 0xFFFF8000) << 3) | (ColorOctets & 0x3e0)) << 3) | (ColorOctets & 0x1f)) << 3;
Byte *Colors = (Byte*)&ColorRGB;
Colors[3] = 0;
Swap(Colors[0],Colors[2]);
return ColorRGB;
}
Автор, можешь это на си написать?

nitrotek
15.10.2012, 15:13
xD
void PWFashionColorToRGB(unsigned int ColorOctets, unsigned char &R, unsigned char &B, unsigned char &G)
{
unsigned int ColorRGB = ((((((ColorOctets & 0xFFFFFC00) | 0xFFFF8000) << 3) | (ColorOctets & 0x3e0)) << 3) | (ColorOctets & 0x1f)) << 3;
unsigned char *Colors = (unsigned char*)&ColorRGB;

B = Colors[0];
G = Colors[1];
R = Colors[2];
}

Вызываете так:

unsigned char R,G,B;
PWFashionColorToRGB(ColorOctets,R,G,B);
После работы процедуры R,G,B станут цветами соответственно: Red, Green, Blue

rusran4
15.10.2012, 23:57
Значит на php будет выглядеть так:
function fashioncolor($color)
{
$blue=($color%32)*8+1;
$green=(($color/32)%32)*8+1;
$red=((($color/32)/32)%32)*8+1;

$newcolor = sprintf('%02x%02x%02x', $red, $green, $blue);
return $newcolor;
}
echo fashioncolor(hexdec('<код>'));