Экипировка брони.

  • Автор темы Автор темы ShturMAN
  • Дата начала Дата начала

ShturMAN

Свой человек
Участник
Старожил I степени
Сообщения
67
Розыгрыши
0
Решения
1
Репутация
27
Реакции
40
Баллы
578
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
IL
Знающие люди, как сделать, чтобы при одевании тела, сразу одевался весь сет?
 
Решение
Есть нативка:
C-подобный:
native static function GetSetItemIDList( int ClassID, int EffectID, out array<int> arrID );
Соответственно в масив собирает все ид сета, после чего по инвентарю можно прогнать цикл с поиском єтих ид, если совпадает - слать реквест юз итема, если нет - искать дальше. В InventoryWnd есть примери и прямого реквеста по сервериду
C-подобный:
RequestUseItem(info.ServerID);
И юза по индексу с итем виндоу:
C-подобный:
function UseItem( ItemWindowHandle a_hItemWindow, int index )
Стоило бьі уточнить: а что будет если у персонажа два одинаковьх сета на руках? А если два набора перчаток и тд и тп. А если єто ц грейд, где сет не еще не фул слотьі занимает, что делать с пустующими и тд. Ну вообще, наверное, найпростейшее - єто чекать наличие бонуса у сета с єтим телом, оттудаже можно брать все ид перефирии, чекать их наличие у персонажа, если их >=2 то вьібирать наиболее заточеную, например.

Либо дать возможность игроку самому формировать список своих "сетов", забивая обж ид (ну, то есть игрок перетягивает просто шмотку, а Вьі на сервере чекаете и запоминаете обж ид), а потом просто єти наборьі натягивать на него.
 
В инвентаре один сет, допустим ДК маг. Одеваю робу и вместе с ней (при наличии в инвентаре) одевается всё остальное.
Свадебный наряд, как я понял, просто "натягивает" текстуры.

Как я понял, это можно сделать на уровне клиента - в Silent интерфейс есть такая функция.
 
Последнее редактирование модератором:
Как я понял, это можно сделать на уровне клиента - в Silent интерфейс есть такая функция.
Можно, там тоже есть информация о сетах (в класе тултипов наглядное использование), ну и дальше точно такой же перебор итемов у играка в инвентаре и реквест на екипировку.
 
Можно, там тоже есть информация о сетах (в класе тултипов наглядное использование), ну и дальше точно такой же перебор итемов у играка в инвентаре и реквест на екипировку.
Можно более подробно? Я пока только щупаю, а не полностью погружен в компиляцию интерфейса)
 
Есть нативка:
C-подобный:
native static function GetSetItemIDList( int ClassID, int EffectID, out array<int> arrID );
Соответственно в масив собирает все ид сета, после чего по инвентарю можно прогнать цикл с поиском єтих ид, если совпадает - слать реквест юз итема, если нет - искать дальше. В InventoryWnd есть примери и прямого реквеста по сервериду
C-подобный:
RequestUseItem(info.ServerID);
И юза по индексу с итем виндоу:
C-подобный:
function UseItem( ItemWindowHandle a_hItemWindow, int index )
 

Clarity

Баллов: 1
Помог благодрю
Решение
Есть нативка:
C-подобный:
native static function GetSetItemIDList( int ClassID, int EffectID, out array<int> arrID );
Соответственно в масив собирает все ид сета, после чего по инвентарю можно прогнать цикл с поиском єтих ид, если совпадает - слать реквест юз итема, если нет - искать дальше. В InventoryWnd есть примери и прямого реквеста по сервериду
C-подобный:
RequestUseItem(info.ServerID);
И юза по индексу с итем виндоу:
C-подобный:
function UseItem( ItemWindowHandle a_hItemWindow, int index )

это через интерфейс клиента, или в серверной части? и наверно тогда надо еще проверку, не одет ли уже какой-то айтем из сета, иначе его наверно снимет?
 
это через интерфейс клиента, или в серверной части?
Интерфейс.
и наверно тогда надо еще проверку, не одет ли уже какой-то айтем из сета, иначе его наверно снимет?
Не помешала бьі точно, снять не снимет, ибо искать будет по инвентарю, а не екипированьім слотам, к тому же надевать будет либо по индексу, либо по обж ид (серверсайдьій индификатор, а не тот что в датниках, и они не дублируются) но будет передевать каждьій раз, как найдет новое совпадение. )) Я бьі вообще просто обрьівал цикл, когда найдет нужньій ид. Но в ответе я опирался на:
В инвентаре один сет, допустим ДК маг.

А, еще кстати, бьівает на сервере заглушка типа не одевать чаще раз в 100 мс, и хорошо (ну ладно, хорошо ли - вопрос открьітьій, учитьівая количество проблем :loltt0: ) если все последующие реквестьі станут в очередь, а могут просто оборваться и магии не произойдет. )
 
Последнее редактирование:
Разобрался сам. Кому надо - забирайте.
Код:
function UseItem( ItemWindowHandle a_hItemWindow, int index )
{
    local ItemInfo    info;
    local array<int> SetServerIDs;
    local int i;

    if( a_hItemWindow.GetItem(index, info) )
    {
        if( info.bRecipe )
        {
            DialogSetReservedInt(info.ServerID);
            DialogSetID(DIALOG_USE_RECIPE);
            DialogShow(DIALOG_Warning, GetSystemMessage(798));
        }
        else if( info.PopMsgNum > 0 )
        {
            DialogSetID(DIALOG_POPUP);
            DialogSetReservedInt(info.ServerID);
            DialogShow(DIALOG_Warning, GetSystemMessage(info.PopMsgNum));
        }
        else
        {
            if( GetSetItemsToEquip( info, SetServerIDs ) )
            {
                for( i = 0; i < SetServerIDs.Length; i++ )
                    RequestUseItem( SetServerIDs[i] );
            }
            else
            {
                RequestUseItem(info.ServerID);
            }
        }
    }
}
Код:
function bool IsPartOfSet( int ClassID, out string SetName )
{
    local int i;
  
    for( i = 0; i < m_SetItems.Length; i++ )
    {
        if( m_SetItems[i].ClassID == ClassID )
        {
            SetName = m_SetItems[i].SetName;
            return true;
        }
    }
  
    SetName = "";
    return false;
}
Код:
function bool GetSetItemsToEquip( ItemInfo info, out array<int> SetServerIDs )
{
    local int i;
    local string SetName;
    local ItemInfo invItem;
  
    SetServerIDs.Length = 0;
  
    if( !IsPartOfSet( info.ClassID, SetName ) )
        return false;
  
    SetServerIDs[SetServerIDs.Length] = info.ServerID;
  
    for( i = 0; i < m_SetItems.Length; i++ )
    {
        if( m_SetItems[i].ClassID == info.ClassID )
            break;
    }
  
    if( i >= m_SetItems.Length )
        return true;
  
    if( !IsBodyArmorBySlot( m_SetItems[i].SlotType ) )
        return true;
  
    for( i = 0; i < m_SetItems.Length; i++ )
    {
        if( m_SetItems[i].SetName == SetName && m_SetItems[i].ClassID != info.ClassID )
        {
            if( FindItemByClassID( m_SetItems[i].ClassID, invItem ) )
                SetServerIDs[SetServerIDs.Length] = invItem.ServerID;
        }
    }
  
    return true;
}
Код:
function bool FindItemByClassID( int ClassID, out ItemInfo FoundItem )
{
    local int i;
    local ItemInfo info;
  
    for( i = 0; i < m_invenItem.GetItemNum(); i++ )
    {
        m_invenItem.GetItem( i, info );
        if( info.ClassID == ClassID && !info.bEquipped )
        {
            FoundItem = info;
            return true;
        }
    }
  
    return false;
}
Код:
function bool IsBodyArmorBySlot( int SlotType )
{
    return (SlotType == SLOT_BODY);
}
Код:
struct SetItemData
{
    var int ClassID;
    var string SetName;
    var int SlotType;
};

var array<SetItemData> m_SetItems;

const SLOT_BODY = 0;
const SLOT_HELM = 1;
const SLOT_GLOVES = 2;
const SLOT_BOOTS = 3;
const SLOT_LEGS = 4;
const SLOT_SHIELD = 5;
const SLOT_WEAPON = 6;
Код:
function InitSetItems()
{
    m_SetItems.Length = 0;
  
    AddSetItem( 2382, "TallumHeavy", SLOT_BODY );
    AddSetItem( 547,  "TallumHeavy", SLOT_HELM );
    AddSetItem( 5768, "TallumHeavy", SLOT_GLOVES );
    AddSetItem( 5780, "TallumHeavy", SLOT_BOOTS );
}

function AddSetItem( int ClassID, string SetName, int SlotType )
{
    local int index;
  
    index = m_SetItems.Length;
    m_SetItems.Length = index + 1;
    m_SetItems[index].ClassID = ClassID;
    m_SetItems[index].SetName = SetName;
    m_SetItems[index].SlotType = SlotType;
}
В инициализации нужно дописать ID сетов.
 
Последнее редактирование:
Назад
Сверху Снизу