Сортировка предметов инвентаря Interlude

BIT_hack

Знающий
Участник
Сообщения
112
Розыгрыши
0
Решения
1
Репутация
6
Реакции
64
Баллы
420
Решил сделать сортировку инвентаря в Interlude подсмотрел в других исходниках, делают по весу я сделал также но постарался написать свой код как я вижу.
Но вот вопрос как всё таки правильно сортировать предметы? я думаю по весу это не правильный подход, так как есть еще заточка, грейд и тп.
Как вы сортируете свой инвентарь?

У меня получилось та(
1722158654683.png

Свой срипт: aaIT_SortInventory.uc
C++:
/******************************************

Дата 28.07.2024 13:54



  Разработчик: BITHACK



  Copyright (c) Ваша компания



 Описание скрипта: Сортировка инвентаря по типам предметов и весу.

  Сначала сортировка по типам:

    - Ассеты

    - Оружие

    - Броня

    - Аксессуары

    - Прочие предметы (в том числе экипировка, зелья, стрелы, рецепты, материалы)

  Затем сортировка каждого типа по весу.

*******************************************/

class aaIT_SortInventory extends UICommonAPI;



 var int nextSlot;

 var ItemWindowHandle ItemWnd;



//! Сортировка инвентаря

function SortItem(ItemWindowHandle m_invenItem)

    {

   local int i;

   local int invenLimit;

   local ItemInfo item;

   local EItemType eItemType;



 // Массивы для хранения элементов каждого типа

   local Array<ItemInfo> AssetList;

   local Array<ItemInfo> WeaponList;

   local Array<ItemInfo> ArmorList;

   local Array<ItemInfo> AccesaryList;

   local Array<ItemInfo> EtcItemList;



 // Массивы для хранения элементов "прочих предметов"

   local Array<ItemInfo> BlessEnchantAmList;

   local Array<ItemInfo> BlessEnchantWpList;

   local Array<ItemInfo> EnchantAmList;

   local Array<ItemInfo> EnchantWpList;

   local Array<ItemInfo> PotionList;

   local Array<ItemInfo> ElixirList;

   local Array<ItemInfo> ArrowList;

   local Array<ItemInfo> RecipeList;

   local Array<ItemInfo> MaterialList;



      ItemWnd = m_invenItem;



      invenLimit = ItemWnd.GetItemNum();



 // Сортировка по типу

   for (i = 0; i < invenLimit; ++i)

      {

        ItemWnd.GetItem(i, item);

        eItemType = EItemType(item.ItemType);



     switch (eItemType)

        {

          case ITEM_ASSET:

          AssetList.Length = AssetList.Length+1;

          AssetList[AssetList.Length-1] = item;

       break;

          case ITEM_WEAPON:

          WeaponList.Length = WeaponList.Length+1;

          WeaponList[WeaponList.Length-1] = item;

       break;

          case ITEM_ARMOR:

          ArmorList.Length = ArmorList.Length+1;

          ArmorList[ArmorList.Length-1] = item;

       break;

          case ITEM_ACCESSARY:

          AccesaryList.Length = AccesaryList.Length+1;

          AccesaryList[AccesaryList.Length-1] = item;

       break;



          case ITEM_ETCITEM:



       switch (EEtcItemType(item.ItemSubType))

          {

            case ITEME_ENCHT_AM:

            EnchantAmList.Length = EnchantAmList.Length+1;

            EnchantAmList[EnchantAmList.Length-1] = item;

         break;

            case ITEME_BLESS_ENCHT_AM:

            BlessEnchantAmList.Length = BlessEnchantAmList.Length+1;

            BlessEnchantAmList[BlessEnchantAmList.Length-1] = item;

         break;

            case ITEME_ENCHT_WP:

            EnchantWpList.Length = EnchantWpList.Length+1;

            EnchantWpList[EnchantWpList.Length-1] = item;

         break;

            case ITEME_BLESS_ENCHT_WP:

            BlessEnchantWpList.Length = BlessEnchantWpList.Length+1;

            BlessEnchantWpList[BlessEnchantWpList.Length-1] = item;

         break;

            case ITEME_POTION:

            PotionList.Length = PotionList.Length+1;

            PotionList[PotionList.Length-1] = item;

         break;

            case ITEME_ELIXIR:

            ElixirList.Length = ElixirList.Length+1;

            ElixirList[ElixirList.Length-1] = item;

         break;

            case ITEME_ARROW:

            ArrowList.Length = ArrowList.Length+1;

            ArrowList[ArrowList.Length-1] = item;

         break;

            case ITEME_RECIPE:

            RecipeList.Length = RecipeList.Length+1;

            RecipeList[RecipeList.Length-1] = item;

         break;

            case ITEME_MATERIAL:

            MaterialList.Length = MaterialList.Length+1;

            MaterialList[MaterialList.Length-1] = item;

         break;

            default:

            EtcItemList.Length = EtcItemList.Length+1;

            EtcItemList[EtcItemList.Length-1] = item;

         break;

            }

       break;

          default:

          EtcItemList.Length = EtcItemList.Length+1;

          EtcItemList[EtcItemList.Length-1] = item;

       break;

          }

        }

 // Сортировка списков по весу

      SortListByWeight(AssetList);

      SortListByWeight(WeaponList);

      SortListByWeight(ArmorList);

      SortListByWeight(AccesaryList);

      SortListByWeight(EnchantAmList);

      SortListByWeight(BlessEnchantAmList);

      SortListByWeight(EnchantWpList);

      SortListByWeight(BlessEnchantWpList);

      SortListByWeight(PotionList);

      SortListByWeight(ElixirList);

      SortListByWeight(ArrowList);

      SortListByWeight(RecipeList);

      SortListByWeight(MaterialList);

      SortListByWeight(EtcItemList);



 // Добавление элементов в инвентарь

      AddItems(AssetList);

      AddItems(WeaponList);

      AddItems(ArmorList);

      AddItems(AccesaryList);

      AddItems(EnchantAmList);

      AddItems(BlessEnchantAmList);

      AddItems(EnchantWpList);

      AddItems(BlessEnchantWpList);

      AddItems(PotionList);

      AddItems(ElixirList);

      AddItems(ArrowList);

      AddItems(RecipeList);

      AddItems(MaterialList);

      AddItems(EtcItemList);

      }



// Функция для сортировки списка по весу

function SortListByWeight(out array<ItemInfo> ItemList)

    {

   local int i, j;

   local ItemInfo temp;



   for (i = 0; i < ItemList.Length - 1; ++i)

      {

     for (j = i + 1; j < ItemList.Length; ++j)

        {

       if (ItemList[i].Weight > ItemList[j].Weight)

          {

            temp = ItemList[i];

            ItemList[i] = ItemList[j];

            ItemList[j] = temp;

            }

          }

        }

      }



// Функция добавление элементов в инвентарь

function AddItems(array<ItemInfo> ItemList)

    {

   local int i;

   for (i = 0; i < ItemList.Length; i++)

      {

        ItemWnd.SetItem(nextSlot, ItemList[i]);

        nextSlot++;

        }

      }



    defaultproperties{}
 

А в чем проблема, типа лагает недостаточно при клике? Еще ж можно тогда всандалить сортировку по типу оружия/брони, щитьі к щитам и все такое.
 
Может логичней каждую группу/список сортировать по имени, т.е. по алфавиту
 
А в чем проблема, типа лагает недостаточно при клике? Еще ж можно тогда всандалить сортировку по типу оружия/брони, щитьі к щитам и все такое.
Не не лагает все быстро сортирует но как видно но хотелось бы чтобы S,A,B,D и тп чтобы по очереди сортировались иначе получается что нг пуха может весить тяжелей S пухи и тогда она получается в списке S грейда на скрине видно и с сосками таже история(
Но я не нашел кроме того как парсить строку и проверять что за грейд может кто то знает как узнать какой грейд по типу?
 
  • Мне нравится
Реакции: Rolo
Оверпостинг
Может логичней каждую группу/список сортировать по имени, т.е. по алфавиту
Хотелось бы по грейду

Делал изначально так для оружия и шмота но хотел универсальности и не знал что CrystalType отвечает за грейд похоже для оружия и шмота придется писать отдельную функцию(
 
Последнее редактирование модератором:
Делал изначально так для оружия и шмота но хотел универсальности и не знал что CrystalType отвечает за грейд похоже для оружия и шмота придется писать отдельную функцию(
Ну тултип иконки грейда по ним же и ставится, кстати. ) А свитки и етк итемьі на ИЛе ж вроде грейда как такого не имеют, там хз за что зацепиться, разве что парсить реально с названия, или с AdditionalName, где оно там указано не помню.
 
Оверпостинг
Не стал писать новую функцию добавил еще условие по типу CrystalType но что-то мне кажется, что весь мой код не правилен, Если вы знаете как это сделать правильно, отпишите пожалуйста у меня сломался похоже логика))
C++:
// Функция для сортировки списка по весу
function SortListByWeight(out array<ItemInfo> ItemList)
{
  local int i, j;
  local ItemInfo temp;

  // Внешний цикл перебирает все элементы списка, кроме последнего
  for (i = 0; i < ItemList.Length - 1; ++i)
  {
    // Внутренний цикл сравнивает текущий элемент с каждым последующим
    for (j = i + 1; j < ItemList.Length; ++j)
    {
      // Проверка типа элемента: оружие или броня
      if (EItemType(ItemList[i].ItemType) == ITEM_WEAPON || EItemType(ItemList[i].ItemType) == ITEM_ARMOR)
      {
        // Сортировка по типу кристалла для оружия и брони
        if (ItemList[i].CrystalType > ItemList[j].CrystalType)
        {
          // Перестановка элементов, если текущий элемент имеет кристалл более высокого уровня
          temp = ItemList[i];
          ItemList[i] = ItemList[j];
          ItemList[j] = temp;
        }
      }
      else
      {
        // Сортировка по весу для остальных типов предметов
        if (ItemList[i].Weight > ItemList[j].Weight)
        {
          // Перестановка элементов, если текущий элемент тяжелее
          temp = ItemList[i];
          ItemList[i] = ItemList[j];
          ItemList[j] = temp;
        }
      }
    }
  }
}

Может логичней каждую группу/список сортировать по имени, т.е. по алфавиту
А как ты сортировал в своей базе данных на сайте?
 
Не стал писать новую функцию добавил еще условие по типу CrystalType но что-то мне кажется, что весь мой код не правилен, Если вы знаете как это сделать правильно, отпишите пожалуйста у меня сломался похоже логика))
C++:
// Функция для сортировки списка по весу
function SortListByWeight(out array<ItemInfo> ItemList)
{
  local int i, j;
  local ItemInfo temp;

  // Внешний цикл перебирает все элементы списка, кроме последнего
  for (i = 0; i < ItemList.Length - 1; ++i)
  {
    // Внутренний цикл сравнивает текущий элемент с каждым последующим
    for (j = i + 1; j < ItemList.Length; ++j)
    {
      // Проверка типа элемента: оружие или броня
      if (EItemType(ItemList[i].ItemType) == ITEM_WEAPON || EItemType(ItemList[i].ItemType) == ITEM_ARMOR)
      {
        // Сортировка по типу кристалла для оружия и брони
        if (ItemList[i].CrystalType > ItemList[j].CrystalType)
        {
          // Перестановка элементов, если текущий элемент имеет кристалл более высокого уровня
          temp = ItemList[i];
          ItemList[i] = ItemList[j];
          ItemList[j] = temp;
        }
      }
      else
      {
        // Сортировка по весу для остальных типов предметов
        if (ItemList[i].Weight > ItemList[j].Weight)
        {
          // Перестановка элементов, если текущий элемент тяжелее
          temp = ItemList[i];
          ItemList[i] = ItemList[j];
          ItemList[j] = temp;
        }
      }
    }
  }
}
Та вроде ж норм на первьій взгляд вьіглядит. ) А почему не правильньім кажется, не работает?
 
Та вроде ж норм на первьій взгляд вьіглядит. ) А почему не правильньім кажется, не работает?
Я про весь код мне кажется он должен работать по другому хз я сам написал его и он мне не нравится мне кажется должно быть проще как-то))
Оставлю пока так может что придет в голову перепишу выложу.
 
Я про весь код мне кажется он должен работать по другому хз я сам написал его и он мне не нравится мне кажется должно быть проще как-то))
Я, как уважающий себя ИЛ боец, имею только один критерий для кода - его работоспособность, если все работает приблизительно как хотелось (или если я могу подать его работу, как соответствующую ТЗ, или заявить, что так даже лучше) - значит все в порядке, и смотреть дальше нет смьісла.

Ну, а если серьезно, то вроде на ХФе том же приблизительно такая же логика, если я правильно помню.
 
  • Мне нравится
Реакции: BIT_hack

    Projack

    Баллов: 22
    РУЛОН СНОВА В СЕТИ
А как ты сортировал в своей базе данных на сайте?
ну смотря что - например эквип сначала по грейду, потом внутри грейда по атаке/защите, затем по имени
для неэкипируемого чисто по имени
 
ну смотря что - например эквип сначала по грейду, потом внутри грейда по атаке/защите, затем по имени
для неэкипируемого чисто по имени

а что делать тогда с разницей маг/воинский шмот? можно ли учитывать класс персонажа при сортировке? так как допустим для Ы грейда если отсортировать, то воинские шмотки у мага будут в начале - у них выше п деф и п атак. и бижа вообще не отсортируется... то есть надо добавлять определение типа айтема перед применением правила сортировки по параметрам этого айтема
 
Ну тут уж никак, разве что добавлять параметр какой-то в свойства предмета.
Хотя конечно для оружия есть параметр магическое оно или нет - когда-то оно использовалось для раздельных шансов заточки. точнее и сейчас скорее всего используется, но для маг/не маг оружия ща выставляются одинаковые шансы.

ну а так да - у меня в бз под каждый вариант запроса в бд свой вариант сортировки идет.
PHP:
switch ($type)
{
    case "weapon":
        switch ($subType)
        {
            case "sword":
                $cond = "A.`class` = 'WEAPON' AND A.`type` IN ('SWORD', 'BIGSWORD') AND A.`category` = 'NONE'";
                break;

            case "blunt":
                $cond = "A.`class` = 'WEAPON' AND A.`type` IN ('BLUNT', 'BIGBLUNT') AND A.`category` = 'NONE'";
                break;

            case "hero":
            case "legendary":
            case "territory":
            case "legacy":
            case "cursed":
            case "dragon":
            case "tauti":
            case "kelbim":
            case "shunaiman":
            case "elysium":
            case "mysterious":
            case "souvenir":
            case "shadow_weapon":
                $cond = "A.`class` = 'WEAPON' AND A.`category` = '{$subType}'";
                break;

            case "appearance":
                $cond = "A.`class` = 'WEAPON' AND A.`category` = 'APPEARANCE' AND A.`type` <> 'NONE'";
                break;

            default:
                $cond = "A.`class` = 'WEAPON' AND A.`type` = '{$subType}' AND A.`category` = 'NONE'";
                break;
        }

        $sort = "A.`grade`, A.`patk`, A.`matk`, A.`price`, B.`name`";
        break;

    case "armor":
        switch ($subType)
        {
            case "chest":
            case "legs":
            case "full_armor":
                $cond = "A.`class` = 'ARMOR' AND A.`slot` = '{$subType}' AND A.`type` = '{$class}' AND A.`category` = 'NONE'";
                break;

            case "shield":
            case "sigil":
                $cond = "A.`ex_type` = '{$subType}' AND A.`category` = 'NONE'";
                break;

            case "belt":
            case "underwear":
                $cond = "A.`ex_type` = '{$subType}' AND A.`category` = 'NONE'";
                break;

            case "pet_equipment":
                $cond = "A.`ex_type` = '{$subType}' AND A.`class` = 'ACCESSORY' AND A.`slot` <> 'PENDANT'";
                break;

            case "appearance":
                $cond = "A.`class` = 'ARMOR' AND A.`category` = 'APPEARANCE'";
                break;

            default:
                $cond = "A.`class` = 'ARMOR' AND A.`slot` = '{$subType}' AND A.`category` = 'NONE'";
                break;
        }

        $sort = "A.`grade`, A.`pdef`, A.`mdef`, A.`sdef`, A.`price`, B.`name`";
        break;

    case "jewelry":
        switch ($subType)
        {
            case "epic":
            case "territory":
            case "pvp":
                $cond = "A.`class` = 'JEWELRY' AND A.`category` = '{$subType}'";
                break;

            default:
                $cond = "A.`ex_type` = '{$subType}' AND A.`category` = 'NONE'";
                break;
        }

        $sort = "A.`grade`, A.`mdef`, A.`price`, B.`name`";
        break;

    case "accessory":
        switch ($subType)
        {
            case "left_bracelet":
            case "right_bracelet":
            case "talisman":
            case "pendant":
                $cond = "A.`slot` = '{$subType}'";
                break;

            case "appearance":
                $cond = "A.`class` = 'ACCESSORY' AND A.`category` = 'APPEARANCE'";
                break;

            case "brooch":
                $cond = "A.`class` = 'ACCESSORY' AND A.`slot` = 'BROOCH'";
                break;

            case "jewel":
                $cond = "A.`class` = 'ACCESSORY' AND A.`slot` = 'JEWEL'";
                break;

            default:
                $cond = "A.`ex_type` = '{$subType}'";
                break;
        }

        $sort = "A.`grade`, A.`pdef`, A.`mdef`, B.`name`";
        break;

    case "other":
        switch ($subType)
        {
            case "appearance":
                $cond = "A.`class` = 'OTHER' AND A.`category` = 'APPEARANCE'";
                break;

            case "arrow":
                $cond = "A.`type` IN ('ARROW', 'BOLT', 'UNLIMITED_ARROW', 'UNLIMITED_BOLT')";
                break;

            case "etc":
                $cond = "A.`class` = 'OTHER' AND A.`type` = 'OTHER' AND A.`category` = 'NONE'";
                break;

            default:
                $cond = "A.`type` = '{$subType}' AND A.`category` = 'NONE'";
                break;
        }

        $sort = "B.`name`";
        break;

    default:
    {
        $cond = "A.`class` = 'NONE'";
        $sort = "B.`name`";
    }
}
 
Выше в хрониках посмотрел да там действительно добавили типы даже на соски в интерлюдии такого нет( Но я думаю, что тоже можно что-то придумать)
 
Код:
#include <vector>
#include <algorithm>

class aaIT_SortInventory : public UICommonAPI {
    int nextSlot;
    ItemWindowHandle ItemWnd;

public:
    enum EItemType {
        ITEM_ASSET,
        ITEM_WEAPON,
        ITEM_ARMOR,
        ITEM_ACCESSARY,
        ITEM_ETCITEM
    };

    enum EEtcItemType {
        ITEME_ENCHT_AM,
        ITEME_BLESS_ENCHT_AM,
        ITEME_ENCHT_WP,
        ITEME_BLESS_ENCHT_WP,
        ITEME_POTION,
        ITEME_ELIXIR,
        ITEME_ARROW,
        ITEME_RECIPE,
        ITEME_MATERIAL
    };

    struct ItemInfo {
        EItemType ItemType;
        EEtcItemType ItemSubType;
        int Weight;
        int CrystalType;
    };

    void SortItem(ItemWindowHandle m_invenItem) {
        ItemWnd = m_invenItem;
        int invenLimit = ItemWnd.GetItemNum();

        std::vector<ItemInfo> AssetList, WeaponList, ArmorList, AccesaryList, EtcItemList;
        std::vector<ItemInfo> BlessEnchantAmList, BlessEnchantWpList, EnchantAmList, EnchantWpList;
        std::vector<ItemInfo> PotionList, ElixirList, ArrowList, RecipeList, MaterialList;

        for (int i = 0; i < invenLimit; ++i) {
            ItemInfo item;
            ItemWnd.GetItem(i, item);

            switch (item.ItemType) {
                case ITEM_ASSET:
                    AssetList.push_back(item);
                    break;
                case ITEM_WEAPON:
                    WeaponList.push_back(item);
                    break;
                case ITEM_ARMOR:
                    ArmorList.push_back(item);
                    break;
                case ITEM_ACCESSARY:
                    AccesaryList.push_back(item);
                    break;
                case ITEM_ETCITEM:
                    switch (item.ItemSubType) {
                        case ITEME_ENCHT_AM:
                            EnchantAmList.push_back(item);
                            break;
                        case ITEME_BLESS_ENCHT_AM:
                            BlessEnchantAmList.push_back(item);
                            break;
                        case ITEME_ENCHT_WP:
                            EnchantWpList.push_back(item);
                            break;
                        case ITEME_BLESS_ENCHT_WP:
                            BlessEnchantWpList.push_back(item);
                            break;
                        case ITEME_POTION:
                            PotionList.push_back(item);
                            break;
                        case ITEME_ELIXIR:
                            ElixirList.push_back(item);
                            break;
                        case ITEME_ARROW:
                            ArrowList.push_back(item);
                            break;
                        case ITEME_RECIPE:
                            RecipeList.push_back(item);
                            break;
                        case ITEME_MATERIAL:
                            MaterialList.push_back(item);
                            break;
                        default:
                            EtcItemList.push_back(item);
                            break;
                    }
                    break;
                default:
                    EtcItemList.push_back(item);
                    break;
            }
        }

        SortAndAddItems(AssetList);
        SortAndAddItems(WeaponList);
        SortAndAddItems(ArmorList);
        SortAndAddItems(AccesaryList);
        SortAndAddItems(EnchantAmList);
        SortAndAddItems(BlessEnchantAmList);
        SortAndAddItems(EnchantWpList);
        SortAndAddItems(BlessEnchantWpList);
        SortAndAddItems(PotionList);
        SortAndAddItems(ElixirList);
        SortAndAddItems(ArrowList);
        SortAndAddItems(RecipeList);
        SortAndAddItems(MaterialList);
        SortAndAddItems(EtcItemList);
    }

    void SortAndAddItems(std::vector<ItemInfo>& ItemList) {
        std::sort(ItemList.begin(), ItemList.end(), ItemComparator());

        for (std::vector<ItemInfo>::iterator it = ItemList.begin(); it != ItemList.end(); ++it) {
            ItemWnd.SetItem(nextSlot++, *it);
        }
    }

    struct ItemComparator {
        bool operator() (const ItemInfo& a, const ItemInfo& b) {
            if (a.ItemType == ITEM_WEAPON || a.ItemType == ITEM_ARMOR) {
                return a.CrystalType < b.CrystalType;
            } else {
                return a.Weight < b.Weight;
            }
        }
    };

    void defaultproperties() {}
};

Код:
#include <vector>
#include <algorithm>

class aaIT_SortInventory extends UICommonAPI {
    int nextSlot;
    ItemWindowHandle ItemWnd;

    enum EItemType {
        ITEM_ASSET,
        ITEM_WEAPON,
        ITEM_ARMOR,
        ITEM_ACCESSARY,
        ITEM_ETCITEM
    };

    enum EEtcItemType {
        ITEME_ENCHT_AM,
        ITEME_BLESS_ENCHT_AM,
        ITEME_ENCHT_WP,
        ITEME_BLESS_ENCHT_WP,
        ITEME_POTION,
        ITEME_ELIXIR,
        ITEME_ARROW,
        ITEME_RECIPE,
        ITEME_MATERIAL
    };

    struct ItemInfo {
        EItemType ItemType;
        EEtcItemType ItemSubType;
        int Weight;
        int CrystalType;
    };

    void SortItem(ItemWindowHandle m_invenItem) {
        ItemWnd = m_invenItem;
        int invenLimit = ItemWnd.GetItemNum();

        std::vector<ItemInfo> AssetList, WeaponList, ArmorList, AccesaryList, EtcItemList;
        std::vector<ItemInfo> BlessEnchantAmList, BlessEnchantWpList, EnchantAmList, EnchantWpList;
        std::vector<ItemInfo> PotionList, ElixirList, ArrowList, RecipeList, MaterialList;

        for (int i = 0; i < invenLimit; ++i) {
            ItemInfo item;
            ItemWnd.GetItem(i, item);

            switch (item.ItemType) {
                case ITEM_ASSET:
                    AssetList.push_back(item);
                    break;
                case ITEM_WEAPON:
                    WeaponList.push_back(item);
                    break;
                case ITEM_ARMOR:
                    ArmorList.push_back(item);
                    break;
                case ITEM_ACCESSARY:
                    AccesaryList.push_back(item);
                    break;
                case ITEM_ETCITEM:
                    switch (item.ItemSubType) {
                        case ITEME_ENCHT_AM:
                            EnchantAmList.push_back(item);
                            break;
                        case ITEME_BLESS_ENCHT_AM:
                            BlessEnchantAmList.push_back(item);
                            break;
                        case ITEME_ENCHT_WP:
                            EnchantWpList.push_back(item);
                            break;
                        case ITEME_BLESS_ENCHT_WP:
                            BlessEnchantWpList.push_back(item);
                            break;
                        case ITEME_POTION:
                            PotionList.push_back(item);
                            break;
                        case ITEME_ELIXIR:
                            ElixirList.push_back(item);
                            break;
                        case ITEME_ARROW:
                            ArrowList.push_back(item);
                            break;
                        case ITEME_RECIPE:
                            RecipeList.push_back(item);
                            break;
                        case ITEME_MATERIAL:
                            MaterialList.push_back(item);
                            break;
                        default:
                            EtcItemList.push_back(item);
                            break;
                    }
                    break;
                default:
                    EtcItemList.push_back(item);
                    break;
            }
        }

        SortAndAddItems(AssetList);
        SortAndAddItems(WeaponList);
        SortAndAddItems(ArmorList);
        SortAndAddItems(AccesaryList);
        SortAndAddItems(EnchantAmList);
        SortAndAddItems(BlessEnchantAmList);
        SortAndAddItems(EnchantWpList);
        SortAndAddItems(BlessEnchantWpList);
        SortAndAddItems(PotionList);
        SortAndAddItems(ElixirList);
        SortAndAddItems(ArrowList);
        SortAndAddItems(RecipeList);
        SortAndAddItems(MaterialList);
        SortAndAddItems(EtcItemList);
    }

    void SortAndAddItems(std::vector<ItemInfo>& ItemList) {
        std::sort(ItemList.begin(), ItemList.end(), [](const ItemInfo& a, const ItemInfo& b) {
            if (a.ItemType == ITEM_WEAPON || a.ItemType == ITEM_ARMOR) {
                return a.CrystalType < b.CrystalType;
            } else {
                return a.Weight < b.Weight;
            }
        });

        for (const auto& item : ItemList) {
            ItemWnd.SetItem(nextSlot++, item);
        }
    }

    defaultproperties {}
};
 
а что делать тогда с разницей маг/воинский шмот?
Ну у них есть ArmorType.
можно ли учитывать класс персонажа при сортировке?
Канешн, GetMyUserInfo(info), info.nSubClass.
так как допустим для Ы грейда если отсортировать, то воинские шмотки у мага будут в начале - у них выше п деф и п атак. и бижа вообще не отсортируется... то есть надо добавлять определение типа айтема перед применением правила сортировки по параметрам этого айтема
Не, ну если делать мод "лагают все", то можно пойти и таким путем, пушки да, флага не имеют, но у маг пушек, если мьі разделим физ атаку на маг атаку, мьі получим коефициент <2, а у физ >2 (касательно 2 єто я пальцем в небо и не проверял), соответственно так и можно чекать. И да, конечно, в єтот мод обязательно добавляем определение класса чара. А еще, действительно, что за дичь, что у нас кольца и серьги хрен пойми как лежат, обязательно прогоняем еще поиск по SlotBitType. Тепероь определенно станет лучше, но недостаточно! Разве справедливо, что заточенньіе вещи могут оказаться в конце ссписка? Очевидно, нет. Погнали еще сортировку по Enchanted сделаем. Но постойте, а если я точу вещи и не хочу трогать уже заточенньіе? Правильно, добавляем в сортировку еще проверку EnchantedOnTop (где EnchantedOnTop - єто бул с опшенса, которую игрок ставит себе сам, а мьі ее храним где-то в инишнике). Погнали дальше, по-моему, не справедливо, что мьі не учли наличие ЛСов, проворачиваем с ними аналогично заточке все. Не забьіваем протянуть в опшенс новьіе конфиги. Ладненько, а теперь подумаем вот о чем. СА. Нормально что пушка с СА идет в перемешку с пустьіми? Очевиден же ответ. Проверяем пушки на наличие AdditionalName. Конечно не понятно что юзер от нас хочет, потому протягиваем конфиг и сюда. А можно даже лучше, не бул, а инт, где 0 - сначала пушки с СА, 1 - сначала пушки без СА, 2 - да вообще похер, как сортируются, так пусть и лежат. Не знаю, кто будет ставить третий вариант, но по дефолту надо лепить именно его, чтобьі профи-юзерьі вашего клиента получили привелегии в кастомизации сортировки. Если все еще не будет пролага, обращайтесь, идеи я накину всегда.
 
Ну у них есть ArmorType.

Канешн, GetMyUserInfo(info), info.nSubClass.

Не, ну если делать мод "лагают все", то можно пойти и таким путем, пушки да, флага не имеют, но у маг пушек, если мьі разделим физ атаку на маг атаку, мьі получим коефициент <2, а у физ >2 (касательно 2 єто я пальцем в небо и не проверял), соответственно так и можно чекать. И да, конечно, в єтот мод обязательно добавляем определение класса чара. А еще, действительно, что за дичь, что у нас кольца и серьги хрен пойми как лежат, обязательно прогоняем еще поиск по SlotBitType. Тепероь определенно станет лучше, но недостаточно! Разве справедливо, что заточенньіе вещи могут оказаться в конце ссписка? Очевидно, нет. Погнали еще сортировку по Enchanted сделаем. Но постойте, а если я точу вещи и не хочу трогать уже заточенньіе? Правильно, добавляем в сортировку еще проверку EnchantedOnTop (где EnchantedOnTop - єто бул с опшенса, которую игрок ставит себе сам, а мьі ее храним где-то в инишнике). Погнали дальше, по-моему, не справедливо, что мьі не учли наличие ЛСов, проворачиваем с ними аналогично заточке все. Не забьіваем протянуть в опшенс новьіе конфиги. Ладненько, а теперь подумаем вот о чем. СА. Нормально что пушка с СА идет в перемешку с пустьіми? Очевиден же ответ. Проверяем пушки на наличие AdditionalName. Конечно не понятно что юзер от нас хочет, потому протягиваем конфиг и сюда. А можно даже лучше, не бул, а инт, где 0 - сначала пушки с СА, 1 - сначала пушки без СА, 2 - да вообще похер, как сортируются, так пусть и лежат. Не знаю, кто будет ставить третий вариант, но по дефолту надо лепить именно его, чтобьі профи-юзерьі вашего клиента получили привелегии в кастомизации сортировки. Если все еще не будет пролага, обращайтесь, идеи я накину всегда.

не бухти)) и кстати проточенные пушки сами отсортируются, так как больший п/м атак)

ЗЫ: инвентарь сортируется на серваке, как я понял. а можно перенести сортировку на клиентсайд? или если на серваке - то на отдельный процес, который не будет жрать ресурсы от основного ядра.
 
не бухти)) и кстати проточенные пушки сами отсортируются, так как больший п/м атак)
Так дичь же будет, если по атаке сортировать, будет идти типа коряга +10, потом СБ +0, потом коряга +2 и тд.
 
Так дичь же будет, если по атаке сортировать, будет идти типа коряга +10, потом СБ +0, потом коряга +2 и тд.
норм. это будет в некоторой степени отражать ценность переточеной пушки
 
Назад
Сверху Снизу