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