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

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

Maksim

Гений мысли
Проверенный
Арбитр
Куратор Данных
Стратег Данных
Медаль Благодарности
Мастер Архивов
Хранитель Пера
Оратор
Авторитет форума
Знаток Lineage2
Уважаемый собеседник
Неукротимое пламя
Старожил I степени
Сообщения
1 527
Розыгрыши
0
Решения
7
Репутация
733
Реакции
1 467
Баллы
1 838
Хроники
  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.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу