Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Инвентарь товаров
#1
Есть в клиенте линейки такая вещь как инвентарь товаров, возможность вызова которого появляется при включении настройки UseGoodsInventory в l2.ini и чем-то похожее на список призовых предметов, вызываемых у менеджера витаминов, но при этом более детальное и функциональное.

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

имеется пакет, который шлет клиенту информацию об имеющихся товарах в этом инвентаре:
[SRC="java"]
package l2p.gameserver.network.serverpackets;

import java.util.LinkedHashMap;

import l2p.gameserver.model.Player;
import l2p.gameserver.model.actor.instances.player.PremiumItem;
import l2p.gameserver.network.serverpackets.components.Opcode;

public class ExGoodsInventoryInfo extends L2GameServerPacket
{
private LinkedHashMap<Integer, PremiumItem> _list;

public ExGoodsInventoryInfo(Player player)
{
_list = player.getPremiumItems().getItems();
}

@Override
protected void writeImpl()
{
writeEx(Opcode.ExGoodsInventoryInfo);
writeH(_list.size());

if (_list.isEmpty())
return;

for (int uid : _list.keySet())
{
PremiumItem item = _list.get(uid);

writeQ(uid);
writeC(0x00); // 0 - иконка из датки GoodsIcon, 1 - ?
writeD(10001); // номер иконки из GoodsIcon
writeS("название товара " + uid); // название товара
writeS("описание товара " + uid); // описание товара
writeQ(0x00); // время до удаления итема?
writeC(0x00); // цвет?
writeC(0x01); // 1 - показать информацию об отправителе, 0 - не показывать
writeS(item.getSender()); // имя отправителя
writeS("сообщение от отправителя"); // сообщение от отправителя
writeH(0x01); // количество вещей
writeD(item.getId()); // id вещи
writeD((int) item.getCount()); // количество
}
}
}
[/SRC]
и он вполне нормально работает, но только пока товар один
но если товаров больше одного, то вместо 2 и далее товаров в списке будет мусор типа такого
но структура пакета вроде как вполне правильная и ничего более туда не впихать или убрать... тем более что если я буду слать место writeQ(uid); всегда writeQ(1);, то список будет выглядеть вполне нормально
на первый взгляд вроде как типа проблема решена, так? да вот к сожалению нифига - в пакете RequestUseGoodsInventoryItem, отправлемом клиентом при нажатии кнопки "Забрать товар", в таком случае всегда приходит запрос на получение только первого товара в списке...

Ну вот собственно говоря меня и интересует - может кто уже с этим инвентарем работал и может подсказать что делать?
Ответ
#2
Gaikotsu Написал:Есть в клиенте линейки такая вещь как инвентарь товаров, возможность вызова которого появляется при включении настройки UseGoodsInventory в l2.ini и чем-то похожее на список призовых предметов, вызываемых у менеджера витаминов, но при этом более детальное и функциональное.

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

имеется пакет, который шлет клиенту информацию об имеющихся товарах в этом инвентаре:
[SRC="java"]
package l2p.gameserver.network.serverpackets;

import java.util.LinkedHashMap;

import l2p.gameserver.model.Player;
import l2p.gameserver.model.actor.instances.player.PremiumItem;
import l2p.gameserver.network.serverpackets.components.Opcode;

public class ExGoodsInventoryInfo extends L2GameServerPacket
{
private LinkedHashMap<Integer, PremiumItem> _list;

public ExGoodsInventoryInfo(Player player)
{
_list = player.getPremiumItems().getItems();
}

@Override
protected void writeImpl()
{
writeEx(Opcode.ExGoodsInventoryInfo);
writeH(_list.size());

if (_list.isEmpty())
return;

for (int uid : _list.keySet())
{
PremiumItem item = _list.get(uid);

writeQ(uid);
writeC(0x00); // 0 - иконка из датки GoodsIcon, 1 - ?
writeD(10001); // номер иконки из GoodsIcon
writeS("название товара " + uid); // название товара
writeS("описание товара " + uid); // описание товара
writeQ(0x00); // время до удаления итема?
writeC(0x00); // цвет?
writeC(0x01); // 1 - показать информацию об отправителе, 0 - не показывать
writeS(item.getSender()); // имя отправителя
writeS("сообщение от отправителя"); // сообщение от отправителя
writeH(0x01); // количество вещей
writeD(item.getId()); // id вещи
writeD((int) item.getCount()); // количество
}
}
}
[/SRC]
и он вполне нормально работает, но только пока товар один
но если товаров больше одного, то вместо 2 и далее товаров в списке будет мусор типа такого
но структура пакета вроде как вполне правильная и ничего более туда не впихать или убрать... тем более что если я буду слать место writeQ(uid); всегда writeQ(1);, то список будет выглядеть вполне нормально
на первый взгляд вроде как типа проблема решена, так? да вот к сожалению нифига - в пакете RequestUseGoodsInventoryItem, отправлемом клиентом при нажатии кнопки "Забрать товар", в таком случае всегда приходит запрос на получение только первого товара в списке...

Ну вот собственно говоря меня и интересует - может кто уже с этим инвентарем работал и может подсказать что делать?

writeQ(uid); попробуй разбить на два
writeD(0x00);
writeD(0x00);

Где по логике вещей, первый - длина списка, второй - порядковый номер в этом списке.
Студия L2dev.su. Сборки Lindvior, Epilogue. ICQ 1817070. Skype wowan.sm
Ответ
#3
длина списка и так выше шлется и там именно Q, по данным из дампа энджина клиента видно...

к тому же в RequestUseGoodsInventoryItem тоже Q приходит
Ответ
#4
Gaikotsu Написал:Есть в клиенте линейки такая вещь как инвентарь товаров, возможность вызова которого появляется при включении настройки UseGoodsInventory в l2.ini и чем-то похожее на список призовых предметов, вызываемых у менеджера витаминов, но при этом более детальное и функциональное.

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

имеется пакет, который шлет клиенту информацию об имеющихся товарах в этом инвентаре:
[SRC="java"]
package l2p.gameserver.network.serverpackets;

import java.util.LinkedHashMap;

import l2p.gameserver.model.Player;
import l2p.gameserver.model.actor.instances.player.PremiumItem;
import l2p.gameserver.network.serverpackets.components.Opcode;

public class ExGoodsInventoryInfo extends L2GameServerPacket
{
private LinkedHashMap<Integer, PremiumItem> _list;

public ExGoodsInventoryInfo(Player player)
{
_list = player.getPremiumItems().getItems();
}

@Override
protected void writeImpl()
{
writeEx(Opcode.ExGoodsInventoryInfo);
writeH(_list.size());

if (_list.isEmpty())
return;

for (int uid : _list.keySet())
{
PremiumItem item = _list.get(uid);

writeQ(uid);
writeC(0x00); // 0 - иконка из датки GoodsIcon, 1 - ?
writeD(10001); // номер иконки из GoodsIcon
writeS("название товара " + uid); // название товара
writeS("описание товара " + uid); // описание товара
writeQ(0x00); // время до удаления итема?
writeC(0x00); // цвет?
writeC(0x01); // 1 - показать информацию об отправителе, 0 - не показывать
writeS(item.getSender()); // имя отправителя
writeS("сообщение от отправителя"); // сообщение от отправителя
writeH(0x01); // количество вещей
writeD(item.getId()); // id вещи
writeD((int) item.getCount()); // количество
}
}
}
[/SRC]
и он вполне нормально работает, но только пока товар один
но если товаров больше одного, то вместо 2 и далее товаров в списке будет мусор типа такого
но структура пакета вроде как вполне правильная и ничего более туда не впихать или убрать... тем более что если я буду слать место writeQ(uid); всегда writeQ(1);, то список будет выглядеть вполне нормально
на первый взгляд вроде как типа проблема решена, так? да вот к сожалению нифига - в пакете RequestUseGoodsInventoryItem, отправлемом клиентом при нажатии кнопки "Забрать товар", в таком случае всегда приходит запрос на получение только первого товара в списке...

Ну вот собственно говоря меня и интересует - может кто уже с этим инвентарем работал и может подсказать что делать?

Простите за тупой вопрос, а какой его смысл? И каков его функционал?
Ответ
#5
ну в корее в этот инвентарь кладутся товары, купленные в l2plex - какой-то там магазин, кажется на официальном сайте или типа этого.
и далее товар может забрать любой персонаж с аккаунта

правда не уверен что сейчас это уже используется - хз когда это все ввели, но в хф эти пакеты точно уже были.
Ответ
#6
204C7FF9 PUSH 0x2063AA64 UNICODE "ExGoodsInventoryInfoPacket"
204C7FFE PUSH 0x20629524 UNICODE "(Receive)%s"
204C80D0 PUSH 0x2063AA9C ASCII "QcSdQ"
204C8202 PUSH 0x2063AAA4 ASCII "QdSSQccSSh"
204C829E PUSH 0x20629438 ASCII "dd"

вот такую структуру выдаёт клиент
Ответ
#7
Вобщем вот итог всех мучений моих с этим пакетом

режим 1. ограничения: только одна упаковка товара, показывается не более 10 предметов в упаковке, даже если их больше
режим 2. ограничения: показывает только первые 6 предметов, даже если их больше в списке
ну и окончательный код класса пакета
[SRC="java"]
package l2p.gameserver.network.serverpackets;

import java.util.LinkedHashMap;

import l2p.gameserver.model.Player;
import l2p.gameserver.model.actor.instances.player.PremiumItem;
import l2p.gameserver.network.serverpackets.components.Opcode;

public class ExGoodsInventoryInfo extends L2GameServerPacket
{
private LinkedHashMap<Integer, PremiumItem> _list;
private int _mode;
private int _iconId;
private String _goodsName;
private String _goodsDesc;
private String _senderName;
private String _senderDesc;

public ExGoodsInventoryInfo(Player player)
{
this(player, 0, 0, null, null, null, null);
}

public ExGoodsInventoryInfo(Player player, int mode, int iconId, String goodsName, String goodsDesc, String senderName, String senderDesc)
{
_list = player.getPremiumItems().getItems();
_mode = mode;
_iconId = iconId;
_goodsName = goodsName;
_goodsDesc = goodsDesc;
_senderName = senderName;
_senderDesc = senderDesc;
}

@Override
protected void writeImpl()
{
writeEx(Opcode.ExGoodsInventoryInfo);

if (_mode == 1)
{
writeH(0x01);
writeQ(0x01);
writeC(0x00); // 0 - иконка из датки GoodsIcon, 1 - ?
writeD(_iconId); // номер иконки из GoodsIcon
writeS(_goodsName); // название товара
writeS(_goodsDesc); // описание товара
writeQ(0x00); // время до удаления итема?
writeC(0x00); // цвет?
writeC(_senderName != null && !_senderName.isEmpty() ? 0x01 : 0x00); // 1 - показать информацию об отправителе, 0 - не показывать
writeS(_senderName); // имя отправителя
writeS(_senderDesc); // сообщение от отправителя
writeH(_list.size()); // количество вещей

for (PremiumItem item : _list.values())
{
writeD(item.getId()); // id вещи
writeD((int) item.getCount()); // количество
}
}
else
{
writeH(_list.size());

for (PremiumItem item : _list.values())
{
writeH(0x02);
writeQ(item.getUid());
writeC(item.getSender() != null && !item.getSender().isEmpty() ? 0x01 : 0x00); // 1 - показать информацию об отправителе, 0 - не показывать
writeS(item.getSender()); // имя отправителя
writeD(item.getId()); // id вещи
writeQ(item.getCount()); // количество
}
}
}
}
[/SRC]

Добавлено через 19 часов 20 минут
--------------------------------------------------------
Вобщем эпопея с инвентарем товаров продолжается Smile

Домучал я данный пакет до более вменяемого состояния.
В итоге получилось следующее:
- в списке могут быть одновременно товары как 1 типа (упаковки с 1-10 предметами внутри), так и 2 типа (просто предметы).
- первым в списке обязательно надо отправлять товары 1 типа.
- товары 2 типа почему-то занимают в два раза больше места в списке, поэтому конечный размер списка, отправляемый в пакете, равен - min(count_1 + count_2 * 2, 25) и соответственно только товаров 1 типа может отображаться до 25, а товаров второго типа - максимум 12. ну и если список состоит из товаров обеих типов, то количество отображаемых товаров будет зависеть от соотношения количеств предметов разных типов.


[SRC="java"]
package l2p.gameserver.network.serverpackets;

import java.util.LinkedHashMap;

import l2p.gameserver.instancemanager.goods.Goods;
import l2p.gameserver.instancemanager.goods.GoodsManager;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.actor.instances.player.PremiumItem;
import l2p.gameserver.network.serverpackets.components.Opcode;

public class ExGoodsInventoryInfo extends L2GameServerPacket
{
private LinkedHashMap<Integer, Goods> _goods;
private LinkedHashMap<Integer, PremiumItem> _items;

public ExGoodsInventoryInfo(Player player)
{
_goods = GoodsManager.getInstance().getGoods(player);
_items = player.getPremiumItems().getItems();
}

@Override
protected void writeImpl()
{
writeEx(Opcode.ExGoodsInventoryInfo);
writeH(Math.min(_goods.size() + _items.size() * 2, 25));

for (Goods goods : _goods.values())
{
writeC(0x01);
writeQ(goods.getId());
writeD(goods.getIconId()); // номер иконки из GoodsIcon.dat
writeS(goods.getName()); // название товара
writeS(goods.getDesc()); // описание товара
writeQ(0x00); // ?
writeC(0x00); // ?
writeC(goods.getSenderName().isEmpty() ? 0x00 : 0x01); // 1 - показать информацию об отправителе, 0 - не показывать
writeS(goods.getSenderName()); // имя отправителя
writeS(goods.getSenderMsg()); // сообщение от отправителя
writeH(goods.getItems().length); // количество вещей в товаре

for (int[] item : goods.getItems())
{
writeD(item[0]); // id вещи
writeD(item[1]); // количество
}
}

for (PremiumItem item : _items.values())
{
writeH(0x02);
writeQ(item.getId());
writeC(item.getSender().isEmpty() ? 0x00 : 0x01); // 1 - показать имя отправителя, 0 - не показывать
writeS(item.getSender()); // имя отправителя
writeD(item.getItemId()); // id вещи
writeQ(item.getCount()); // количество
}
}
}
[/SRC]
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Обновить инвентарь Wa3abi 3 1,327 04-02-2013, 02:30 PM
Последний пост: Wa3abi
  Ошибка после того как создам итем в инвентарь. Ololowke666 1 1,280 10-29-2012, 02:25 PM
Последний пост: Zubastic
  Как добавить вещь в инвентарь игроку. MelkiyGnom 20 9,560 08-01-2012, 07:22 PM
Последний пост: Nokia
  как посмотреть инвентарь и вх чара через базу Darvin 2 1,575 11-02-2011, 12:04 PM
Последний пост: Darvin
  Трейд, РБ, упорядочить инвентарь. bizi 17 4,884 04-17-2010, 02:05 PM
Последний пост: SkyWard
  как добавить вещи в инвентарь Amielly 4 2,992 03-11-2009, 03:42 PM
Последний пост: prelest
  Как почистить инвентарь? Govard 1 4,147 09-05-2008, 01:48 AM
Последний пост: Mmouse

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)