Сообщений: 199
Тем: 0
Зарегистрирован: Jul 2013
Репутация:
348
03-28-2017, 11:21 PM
(Сообщение последний раз редактировалось: 03-29-2017, 02:46 PM Melcor.)
Mantra Написал:Пробывал сделать сравнение zonaname-ru в 109
По этому мануалу, летит ошибка и название столбца. Что я не так делаю или метод не работает уже со всеми датками?
не, это не сработает. Разобрать структуру можно выдрав ее из клиента или вывести ее саму, просматривая декодированный файл.
Сообщений: 109
Тем: 4
Зарегистрирован: Oct 2015
Репутация:
7
Вытащил структуру skillname из Engine.dll
Цитата: skill_begin;
skill_id;
level;
sub_level;
name;
desc;
desc_param;
enchant_name;
enchant_name_param;
enchant_desc;
enchant_desc_param;
skill_end;
Непонятно следующее, откуда взять UWORD,WORD,ASCF,INT итд?
Разработка Lineage II Classic: Saviors 2.0
Сообщений: 199
Тем: 0
Зарегистрирован: Jul 2013
Репутация:
348
Mantra Написал:Вытащил структуру skillname из Engine.dll
Непонятно следующее, откуда взять UWORD,WORD,ASCF,INT итд?
по сути структура правильная, вот только fileedit уже не подойдет.
корейцы оптимизаторы хреновы, накидали типа такого
Код: a,Рывок\a //name
12 //id
a,В течение $s1 Скорость +$s2.\a
13
//и так далее, по нарастающей
//тут непонятно только одно: как определить конец таблицы
теперь обычный даш выглядит так вот примерно
Код: =====================
4 //id
1 //level && sublevel
0 //тут id с которого берется описание
-1 // тут level && sublevel с которого берется описание
12 //вот а здесь и ниже уже оптимизация, берется данные из примера выше
13
14
3
3
3
3
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
Melcor Написал:по сути структура правильная, вот только fileedit уже не подойдет.
корейцы оптимизаторы хреновы, накидали типа такого И что плохого в L2GameDataName?
Теперь они строки хранят не в том же файлике, а в отдельном, тем самым экономя место и время загрузки. Там есть ряд веселых моментов, это вы еще до армора и веапона не добрались
Сообщений: 109
Тем: 4
Зарегистрирован: Oct 2015
Репутация:
7
По поводу армора, вообще хз как он открывает, там не хватает 4 столбцов в конце. Видимо по этому и не сохраняет, а только открывает.
С L2GameDataName давно разобрался ничего там сложного нет, главное чтобы строки не повторялись, минус в этом только в том что трудно локализовать, если с кореи например. Раньше можно было экселем теперь видимо вручную.
Разработка Lineage II Classic: Saviors 2.0
Сообщений: 199
Тем: 0
Зарегистрирован: Jul 2013
Репутация:
348
Zubastic Написал:И что плохого в L2GameDataName?
Теперь они строки хранят не в том же файлике, а в отдельном, тем самым экономя место и время загрузки. Там есть ряд веселых моментов, это вы еще до армора и веапона не добрались
так вот со skillname они заморачиваться не стали, и в L2GameDataName не запихнули, а прямо там и оставили.
Сообщений: 109
Тем: 4
Зарегистрирован: Oct 2015
Репутация:
7
Melcor Написал:по сути структура правильная, вот только fileedit уже не подойдет.
корейцы оптимизаторы хреновы, накидали типа такого
Код: a,Рывок\a //name
12 //id
a,В течение $s1 Скорость +$s2.\a
13
//и так далее, по нарастающей
//тут непонятно только одно: как определить конец таблицы
теперь обычный даш выглядит так вот примерно
Код: =====================
4 //id
1 //level && sublevel
0 //тут id с которого берется описание
-1 // тут level && sublevel с которого берется описание
12 //вот а здесь и ниже уже оптимизация, берется данные из примера выше
13
14
3
3
3
3
Если я не ошибаюсь это добавили еще в 24 или 28 протоколе. Ради интереса попробую сравнить столбцы с 28 и 64+ протокола из двух дампов. Интересно что добавили.
Melcor Написал:так вот со skillname они заморачиваться не стали, и в L2GameDataName не запихнули, а прямо там и оставили. npcname вообще не разу не менялся вроде как.
Разработка Lineage II Classic: Saviors 2.0
Сообщений: 199
Тем: 0
Зарегистрирован: Jul 2013
Репутация:
348
Кто в курсе, что с заголовком в декодированном skillname? Как его расшифровать то? 3 байта вместо обычных 4.
Сообщений: 527
Тем: 17
Зарегистрирован: Oct 2010
Репутация:
1,919
Как я понял, файл состоит из 2х частей, и у него 2 размера таблиц.
1 - 3х байтовый, брал за основу себе тулзу asmi, и там оно реализовано как compactInt: Код: public int readCompactInt() throws IOException
{
int output = 0;
boolean signed = false;
for (int i = 0; i < 5; i++)
{
int x = in.read();
if (x < 0)
{
throw new EOFException();
}
if (i == 0)
{
if ((x & 0x80) > 0)
{
signed = true;
}
output |= (x & 0x3F);
if ((x & 0x40) == 0)
{
break;
}
}
else if (i == 4)
{
output |= (x & 0x1F) << (6 + (3 * 7));
}
else
{
output |= (x & 0x7F) << (6 + ((i - 1) * 7));
if ((x & 0x80) == 0)
{
break;
}
}
}
if (signed)
{
output *= -1;
}
return output;
}
Формат первой таблицы прост:
Код: public String str;
private int str_id;
2 - стандартный размер.
Формат второй примерно такой:
Код: public int id;
public short lvl;
public short sub_lvl;
public int pr_id;
public short pr_lvl;
public short pr_sblvl;
public int name_id;
public int info_id;
public int stats_id;
private int enchant_name_id;
private int enchant_name_param_id;
private int enchant_desc_id;
private int enchant_desc_param_id;
Сообщений: 199
Тем: 0
Зарегистрирован: Jul 2013
Репутация:
348
Mifesto Написал:
quote
Как я понял, файл состоит из 2х частей, и у него 2 размера таблиц.
1 - 3х байтовый, брал за основу себе тулзу asmi, и там оно реализовано как compactInt: Код: public int readCompactInt() throws IOException
{
int output = 0;
boolean signed = false;
for (int i = 0; i < 5; i++)
{
int x = in.read();
if (x < 0)
{
throw new EOFException();
}
if (i == 0)
{
if ((x & 0x80) > 0)
{
signed = true;
}
output |= (x & 0x3F);
if ((x & 0x40) == 0)
{
break;
}
}
else if (i == 4)
{
output |= (x & 0x1F) << (6 + (3 * 7));
}
else
{
output |= (x & 0x7F) << (6 + ((i - 1) * 7));
if ((x & 0x80) == 0)
{
break;
}
}
}
if (signed)
{
output *= -1;
}
return output;
}
Формат первой таблицы прост:
Код: public String str;
private int str_id;
2 - стандартный размер.
Формат второй примерно такой:
Код: public int id;
public short lvl;
public short sub_lvl;
public int pr_id;
public short pr_lvl;
public short pr_sblvl;
public int name_id;
public int info_id;
public int stats_id;
private int enchant_name_id;
private int enchant_name_param_id;
private int enchant_desc_id;
private int enchant_desc_param_id;
Огромное спасибо! Работает как надо. :ct:
|