ExGoodsInventoryInfo - в поисках пакета

Статус
В этой теме нельзя размещать новые ответы.

Maksim

Величайший
Местный
Знаток Lineage2
Любитель реакций
Неукротимое пламя
Старожил I степени
Сообщения
393
Розыгрыши
0
Решения
3
Репутация
386
Реакции
317
Баллы
1 513
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
Custom HF5
ExGoodsInventoryInfo

В поисках пакета под HF5, был только от линдвиора с примерной структурой:
Код:
package engine.gameserver.serverpackets;

import java.util.Map;

import engine.gameserver.model.PremiumItem;

public class ExGoodsInventoryInfo extends L2GameServerPacket
{
    private final Map<Integer, PremiumItem> _premiumItemMap;
    
    public ExGoodsInventoryInfo(Map<Integer, PremiumItem> premiumItemMap)
    {
        _premiumItemMap = premiumItemMap;
    }
    
    @SuppressWarnings("rawtypes")
    @Override
    protected void writeImpl()
    {
        writeEx(0x112);
        if (!_premiumItemMap.isEmpty())
        {
            writeH(_premiumItemMap.size());
            for (Map.Entry entry : _premiumItemMap.entrySet())
            {
                writeQ((Integer) entry.getKey());
                writeC(0);
                writeD(10003);
                writeS(((PremiumItem) entry.getValue()).getSender());
                writeS(((PremiumItem) entry.getValue()).getSender());
                writeQ(0);
                writeC(2);
                writeC(0);
                
                writeS(null);
                writeS(null);
                
                writeH(1);
                writeD(((PremiumItem) entry.getValue()).getItemId());
                writeD((int) ((PremiumItem) entry.getValue()).getCount());
            }
        }
        else
        {
            writeH(0);
        }
    }
}
 
Решение
Java:
package l2p.gameserver.network.serverpackets;

import java.util.LinkedHashMap;

import l2p.gameserver.managers.goods.Goods;
import l2p.gameserver.managers.goods.GoodsManager;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.actor.instances.player.PremiumItem;

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

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

    @Override
    protected void writeImpl()
    {...
Java:
package l2p.gameserver.network.serverpackets;

import java.util.LinkedHashMap;

import l2p.gameserver.managers.goods.Goods;
import l2p.gameserver.managers.goods.GoodsManager;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.actor.instances.player.PremiumItem;

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

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

    @Override
    protected void writeImpl()
    {
        writeEx(0xE3);

        int giSize = Math.min(_goods.size(), 25);
        int piSize = Math.min(Math.min(Math.max((25 - giSize) / 2, 0), 12), _items.size());

        writeH(Math.min(giSize + piSize * 2, 25));

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

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

            giSize--;

            if (giSize == 0)
                break;

        }

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

            piSize--;

            if (piSize == 0)
                break;
        }
    }
}
 
Решение
Java:
package l2p.gameserver.network.serverpackets;

import java.util.LinkedHashMap;

import l2p.gameserver.managers.goods.Goods;
import l2p.gameserver.managers.goods.GoodsManager;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.actor.instances.player.PremiumItem;

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

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

    @Override
    protected void writeImpl()
    {
        writeEx(0xE3);

        int giSize = Math.min(_goods.size(), 25);
        int piSize = Math.min(Math.min(Math.max((25 - giSize) / 2, 0), 12), _items.size());

        writeH(Math.min(giSize + piSize * 2, 25));

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

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

            giSize--;

            if (giSize == 0)
                break;

        }

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

            piSize--;

            if (piSize == 0)
                break;
        }
    }
}
Спасибо :blush
 
Может возникнуть странный вопрос на тему "почему отсылаемое количество ограничено 25 элементами" - за давностью лет конечно уже не помню, т.к. колупал это все еще в 2016-2017 годах, но то ли большее количество не отображалось, то ли вобще вызывало криты клиента.

то же относится к премиум итемам, отсылаемым после goods - даже если до 25 максимальных осталось больше 12 возможных элементов - больше 12 не показывает/критует.
 
Может возникнуть странный вопрос на тему "почему отсылаемое количество ограничено 25 элементами" - за давностью лет конечно уже не помню, т.к. колупал это все еще в 2016-2017 годах, но то ли большее количество не отображалось, то ли вобще вызывало криты клиента.

то же относится к премиум итемам, отсылаемым после goods - даже если до 25 максимальных осталось больше 12 возможных элементов - больше 12 не показывает/критует.
Можно будет сделать ограничение на кол-во выдаваемых предметов как вариант. :Coffee:
Ну и в клиенте еще посмотреть это окно + в коде unreal script.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу