Как работает пакет BuyList?

space2pacman

Постоялец
Местный
Сообщения
355
Розыгрыши
0
Репутация
252
Реакции
266
Баллы
1 083

1) Открыл диалог с NPC
2) Buy item
3) Отображается окно покупки (Пакет BuyList)

Зачем отправлять игроку objectId предмета если он его еще не купил и в мире предмет не появился?
То есть я 100 раз открою окно и 100 раз создам уникальный objectId?
 

Байлист это продажа от игрока к нпц
 
Зачем отправлять игроку objectId предмета если он его еще не купил и в мире предмет не появился?
То есть я 100 раз открою окно и 100 раз создам уникальный objectId?
Незачем. Можно просто отправлять либо любое число, либо itemId предмета. Ничего уникального там не нужно создавать. Просто нужно потестировать и проверить как клиент отнесется к измененному пакету.

Хочеться добавить что во многих пакетах есть либо бинарные данные которыет просто не изменяются, либо не имеют никакого эффекта на клиент. Так что просто нужно проверить свою модификацию.
 
В пакете используется запись "ItemInfo", по-этому в нем могут присуствовать елементы, которые присущие только предметам с владельцем.

Пример использования этой записи в InventoryUpdate и ItemList.
 
Интересует только objectId и его актуальность там
давайте посмотрим на это с другой стороны.

Пакет используется для продажи предметов и может быть использован в первобытных ГМ панелях (которые на сервере л2, а не в ВЕБ-е).

То-есть человек может добавить предмету СА / ЛС и для тестирования и потом без проблем получать через ГМ Магазин.

Так что - ответ все равно остается тот же - в этих пакетах используется "ItemInfo".
Примеры использования его можно еще найти и в TradePacket и в Семечках для Манора ну и основные его потребители - InventoryUpdate и ItemInfo.

Почему Вы этого видеть не хотите - не имею представления.

ItemInfo:
Java:
            writeH(temp.getItem().getType1()); // item type1
            writeD(temp.getObjectId());
            writeD(temp.getItemId());
            writeD(temp.getCount());
            writeH(temp.getItem().getType2()); // item type2
            writeH(temp.getCustomType1()); // item type3
            if (temp.isEquipped())
            {
                writeH(0x01);
            }
            else
            {
                writeH(0x00);
            }
            writeD(temp.getItem().getBodyPart()); // slot 0006-lr.ear 0008-neck 0030-lr.finger 0040-head 0080-?? 0100-l.hand 0200-gloves 0400-chest 0800-pants 1000-feet 2000-?? 4000-r.hand 8000-r.hand
            writeH(temp.getEnchantLevel()); // enchant level
            // race tickets
            writeH(temp.getCustomType2()); // item type3

SellList

Java:
            writeH(item.getItem().getType1());
            writeD(item.getObjectId());
            writeD(item.getItemId());
            writeD(item.getCount());
            writeH(item.getItem().getType2());
            writeH(0x00);
            writeD(item.getItem().getBodyPart());
            writeH(item.getEnchantLevel());
            writeH(0x00);
            writeH(item.getCustomType2());

Buy List

Java:
                writeH(item.getItem().getType1()); // item type1
                writeD(item.getObjectId());
                writeD(item.getItemId());
                if (item.getCount() < 0)
                {
                    writeD(0x00); // max amount of items that a player can buy at a time (with this item id)
                }
                else
                {
                    writeD(item.getCount());
                }
                writeH(item.getItem().getType2()); // item type2
                writeH(0x00); // ?
                writeD(item.getItem().getBodyPart()); // 0006-lr.ear 0008-neck 0030-lr.finger 0040-head 0080-?? 0100-l.hand 0200-gloves 0400-chest 0800-pants 1000-feet 2000-?? 4000-r.hand 8000-r.hand
                writeH(item.getEnchantLevel()); // enchant level
                writeH(0x00); // ?
                writeH(0x00);

Так сказать - найдите 10 отличий.
 
  • Мне нравится
Реакции: raz
давайте посмотрим на это с другой стороны.

Пакет используется для продажи предметов и может быть использован в первобытных ГМ панелях (которые на сервере л2, а не в ВЕБ-е).

То-есть человек может добавить предмету СА / ЛС и для тестирования и потом без проблем получать через ГМ Магазин.

Так что - ответ все равно остается тот же - в этих пакетах используется "ItemInfo".
Примеры использования его можно еще найти и в TradePacket и в Семечках для Манора ну и основные его потребители - InventoryUpdate и ItemInfo.

Почему Вы этого видеть не хотите - не имею представления.

ItemInfo:
Java:
            writeH(temp.getItem().getType1()); // item type1
            writeD(temp.getObjectId());
            writeD(temp.getItemId());
            writeD(temp.getCount());
            writeH(temp.getItem().getType2()); // item type2
            writeH(temp.getCustomType1()); // item type3
            if (temp.isEquipped())
            {
                writeH(0x01);
            }
            else
            {
                writeH(0x00);
            }
            writeD(temp.getItem().getBodyPart()); // slot 0006-lr.ear 0008-neck 0030-lr.finger 0040-head 0080-?? 0100-l.hand 0200-gloves 0400-chest 0800-pants 1000-feet 2000-?? 4000-r.hand 8000-r.hand
            writeH(temp.getEnchantLevel()); // enchant level
            // race tickets
            writeH(temp.getCustomType2()); // item type3

SellList

Java:
            writeH(item.getItem().getType1());
            writeD(item.getObjectId());
            writeD(item.getItemId());
            writeD(item.getCount());
            writeH(item.getItem().getType2());
            writeH(0x00);
            writeD(item.getItem().getBodyPart());
            writeH(item.getEnchantLevel());
            writeH(0x00);
            writeH(item.getCustomType2());

Buy List

Java:
                writeH(item.getItem().getType1()); // item type1
                writeD(item.getObjectId());
                writeD(item.getItemId());
                if (item.getCount() < 0)
                {
                    writeD(0x00); // max amount of items that a player can buy at a time (with this item id)
                }
                else
                {
                    writeD(item.getCount());
                }
                writeH(item.getItem().getType2()); // item type2
                writeH(0x00); // ?
                writeD(item.getItem().getBodyPart()); // 0006-lr.ear 0008-neck 0030-lr.finger 0040-head 0080-?? 0100-l.hand 0200-gloves 0400-chest 0800-pants 1000-feet 2000-?? 4000-r.hand 8000-r.hand
                writeH(item.getEnchantLevel()); // enchant level
                writeH(0x00); // ?
                writeH(0x00);

Так сказать - найдите 10 отличий.
С семечками, приватными магазинами, гмшопами с предметаси с СА все понятно.

Если семечки то заранее создается itemList, количество предметов и objectId. Тоже самое и с ГМшопом.

Мой вопрос про обычные предметы, которыми торгуют NPC.
Предмет еще не создан в мире но уже имеет objectId? Какая логика была у разработчиков?
Предмет не уникальный. Обычный. Ему-то зачем objectId ?

Или логика такая
1) Создаем на старте сервера ItemList для Trader Lector
2) При нажатии на Buy Fighter weapon загружать этот лист и отправлять через пакет с указанием не только ItemId но и ObjectId
3) Покупаем sword
4) При подтверждении создаем новый sword, присваиваем новый objectId и кладем в сумку

Верно?
 
Еще как вариант - это может быть указателем для покупки лимитированных предметов.
Условно для работы лимитированных "байлистов" - (на ГОД хрониках в КХ продается "Сила Гигантов", которая лимитировання в колличестве на неделю. Лимит действует на весь клан. То-есть 1 человек скупил - больше никто не может).
Ну и чтобы не париться с новыми системами - сделали, что при покупке таких предметов - они как-бы обменивались на адену.

С семечками, приватными магазинами, гмшопами с предметаси с СА все понятно.

Если семечки то заранее создается itemList, количество предметов и objectId. Тоже самое и с ГМшопом.

Мой вопрос про обычные предметы, которыми торгуют NPC.
Предмет еще не создан в мире но уже имеет objectId? Какая логика была у разработчиков?
Предмет не уникальный. Обычный. Ему-то зачем objectId ?

Или логика такая
1) Создаем на старте сервера ItemList для Trader Lector
2) При нажатии на Buy Fighter weapon загружать этот лист и отправлять через пакет с указанием не только ItemId но и ObjectId
3) Покупаем sword
4) При подтверждении создаем новый sword, присваиваем новый objectId и кладем в сумку

Верно?
но я думаю что это рудиментарный прикол, из-за того что бы разработчики не писали для каждого метода работы с предметами свои парсеры для инфы об этих предметах.
 
Последнее редактирование модератором:
Незачем. Можно просто отправлять либо любое число, либо itemId предмета. Ничего уникального там не нужно создавать. Просто нужно потестировать и проверить как клиент отнесется к измененному пакету.

Хочеться добавить что во многих пакетах есть либо бинарные данные которыет просто не изменяются, либо не имеют никакого эффекта на клиент. Так что просто нужно проверить свою модификацию.
Да, objectId наверное именно тут не нужен но логика buyList нужна.
Поэтому на старте сервера можно создавать buyList.
* Создать предметы один раз
* Присвоим каждому objectId
* Потом каждый предмет записать в buyList

При диалоге с NPC Lector подгружать этот buyList

Нужно проверять когда приходит ответ от игрока, что он хочет купить и сравнить есть ли этот предмет в buyList у NPC Lector?
 
Да, objectId наверное именно тут не нужен но логика buyList нужна.
Поэтому на старте сервера можно создавать buyList.
* Создать предметы один раз
* Присвоим каждому objectId
* Потом каждый предмет записать в buyList

При диалоге с NPC Lector подгружать этот buyList

Нужно проверять когда приходит ответ от игрока, что он хочет купить и сравнить есть ли этот предмет в buyList у NPC Lector?
Данные для BuyList пакета должны проверяться на наличие и адены у игрока, и самих предметов для покупки. Это намного сложнее чем просто проверить предметы. Например нужно учитывать что делает игрок в это время, или вообще он запрашивал этот BuyList от NPC ? Есть также ситуации когда может прийти много пакетов для покупки вещей, но только первый должен быть использован ( у нас структура запрос - ответ, а не запрос - много ответов ). Зачастую не учитывается что вообще пакет может быть неправильным, то есть перед тем что-либо делать нужно тоже проверить сколько предметов покупается, сколько адены нужно на это, есть ли лимит на количество предметов (у нас всетаки есть ситуация когда пакет может иметь тот же самый предмет но сотни раз повторяющийся). Ну и когда предмет уже куплен, тогда нужно отослать соответствующие сообщения на клиент, типа купил того-то и столько-то за такую-то сумму. Или наоборот, мол нехватает деньжат, вали подальше...

Кстати, логика покупки тоже может быть сложнее. Например если есть ограниченное количество предметов и они должны каким-то образом восстанавливаться (будет опять возможность покупки в будущем). Тогда нужно учитывать можно ли такой предмет отсылать игроку, или же позволить купить то чего в принципе пока нет. И это все должно каким-то образом работать между всеми BuyList-ами на сервера (например в определенное время у всех NPC восстанавливаються продукты для покупки). Есть еще ситуации когда не все игроки могут запросить BuyList, например есть ограничение по старшинству в кланах или там ограничение по замку. Короче, это уже немного выходит за пределы простой торговли, но смысл в том что BuyList будет использоваться в более сложных ситуацияx чем просто проверка предметов на покупку.
 

1) Открыл диалог с NPC
2) Buy item
3) Отображается окно покупки (Пакет BuyList)

Зачем отправлять игроку objectId предмета если он его еще не купил и в мире предмет не появился?
То есть я 100 раз открою окно и 100 раз создам уникальный objectId?
В этом поле в данном случае вполне может просто 0 слаться.
А причина его наличия банальна - для упрощения в большинстве пакетов, где отсылается инфа о предметах, используется одна и та же структура данных, даже если в каком-то конкретном случае часть этой инфы не нужна.
Причина такого проще некуда - чтобы везде использовать один и тот же метод разбора инфы, а не городить под каждый пакет отдельный метод.
 
Назад
Сверху