Отображение оружия с ЛС в трейде

это из оригинального тултипа взято

Добавил Hшки с Аугом. Все равно не отображается

Сегодня закомичу, можете сами дальше разбираться с интерфейсом
 

Добавил Hшки с Аугом. Все равно не отображается

Сегодня закомичу, можете сами дальше разбираться с интерфейсом
то, что присылали скриншотами выше - костыльный вариант, интерлюд клиент не обрабатывает option'ы в трейд окне
 
Так я вроде это и говорил. В целом добавил данные, но клиент их тупо не отрабатывает. Если у кого то получится допилить интерфейс - буду благодарен
 
Так я вроде это и говорил. В целом добавил данные, но клиент их тупо не отрабатывает. Если у кого то получится допилить интерфейс - буду благодарен
А как выглядит то, что сервер посылает клиенту?
 
Java:
public class TradeStart extends L2GameServerPacket
{
    private final Player _activeChar;
    private final ItemInstance[] _itemList;

   
    public TradeStart(Player player)
    {

        _activeChar = player;
        _itemList = player.getInventory().getAvailableItems(true, false);
    }
   
    @Override
    protected final void writeImpl()
    {
        if (_activeChar.getActiveTradeList() == null || _activeChar.getActiveTradeList().getPartner() == null)
            return;
       
        writeC(0x1E);
        writeD(_activeChar.getActiveTradeList().getPartner().getObjectId());
        writeH(_itemList.length);
       
        for (ItemInstance temp : _itemList)
        {
            if (temp == null || temp.getItem() == null)
                continue;
           
            Item item = temp.getItem();
           
            writeH(item.getType1());
            writeD(temp.getObjectId());
            writeD(temp.getItemId());
            writeD(temp.getCount());
            writeH(item.getType2());
            //
            int _augorg = 0;
            int _aug = 0;
            int _aug2 = 0;
            int _aug3 = 0;
            if (temp.isAugmented()) {
                _augorg = temp.getAugmentation().getAugmentationId();  
                _aug = _augorg>>16;
                _aug2 = _aug;
                _aug3 = _augorg-(_aug<<16);
            }

           
            if (temp.isAugmented())
                writeH(_aug2);
            if (temp.isAugmented() == false)
            writeH(0x00);
            writeD(item.getBodyPart());
            writeH(temp.getEnchantLevel());
            writeH(0x00);
            if (temp.isAugmented())
            writeH(_aug3);
            if (temp.isAugmented() == false)
            writeH(0x00);

           
        }
    }
}

JavaScript:
class TradeWnd extends UICommonAPI;

const DIALOG_ID_TRADE_REQUEST = 0;
const DIALOG_ID_ITEM_NUMBER = 1;

function OnLoad()
{
    registerEvent( EV_DialogOK );
    registerEvent( EV_DialogCancel );

    registerEvent( EV_TradeStart );
    registerEvent( EV_TradeAddItem );
    registerEvent( EV_TradeDone );
    registerEvent( EV_TradeOtherOK );
    registerEvent( EV_TradeUpdateInventoryItem );
    registerEvent( EV_TradeRequestStartExchange );
}

function OnSendPacketWhenHiding()
{
    RequestTradeDone( false );
}

function OnHide()
{
    Clear();
}

function OnEvent( int eventID, string param )
{
    //debug("eventID " $ eventID $ ", param : " $ param );
    switch( eventID )
    {
    case EV_TradeStart:
        HandleStartTrade(param);
        break;
    case EV_TradeAddItem:
        HandleTradeAddItem(param);
        break;
    case EV_TradeDone:
        HandleTradeDone(param);
        break;
    case EV_TradeOtherOK:
        HandleTradeOtherOK(param);
        break;
    case EV_TradeUpdateInventoryItem:
        HandleTradeUpdateInventoryItem(param);
        break;
    case EV_TradeRequestStartExchange:
        HandleReceiveStartTrade(param);
        break;
    case EV_DialogOK:
        HandleDialogOK();
        break;
    case EV_DialogCancel:
        HandleDialogCancel();
        break;
    default:
        break;
    };
}

function OnClickButton( string ControlName )
{
    //debug("ControlName : " $ ControlName);
    if( ControlName == "OKButton" )
    {
        // 교환 수락.
        class'UIAPI_ITEMWINDOW'.static.SetFaded( "TradeWnd.MyList", true );
        RequestTradeDone( true );
        //HideWindow( "TradeWnd" );
    }
    else if( ControlName == "CancelButton" )
    {
        RequestTradeDone( false );
        //HideWindow( "TradeWnd" );
    }
    else if( ControlName == "MoveButton" )
    {
        HandleMoveButton();
    }
}

function OnDBClickItem( string ControlName, int index )
{
    local ItemInfo info;
    if(ControlName == "InventoryList")    // remove the item from InventoryList and move it to MyList
    {
        if( class'UIAPI_ITEMWINDOW'.static.GetItem("TradeWnd.InventoryList", index, info) )
        {
            if( IsStackableItem( info.ConsumeType ) &&  (info.ItemNum!=1))        // stackable? //1개면 수량입력창을 띄우지 않는다.
            {
                DialogSetID( DIALOG_ID_ITEM_NUMBER );
                DialogSetReservedInt( info.ServerID );
                DialogSetParamInt( info.ItemNum );
                DialogShow( DIALOG_NumberPad, MakeFullSystemMsg( GetSystemMessage(72), info.Name, "" ) );
            }
            else
                RequestAddTradeItem( info.ServerID, 1 );
        }
    }
}

function OnDropItem( string strID, ItemInfo info, int x, int y)
{
    //debug("OnDropItem strID " $ strID $ ", src=" $ info.DragSrcName);
    if( strID == "MyList" && info.DragSrcName == "InventoryList" )
    {
        if( IsStackableItem( info.ConsumeType ) )        // stackable?
        {
            if( info.AllItemCount > 0 )                // 전체이동
            {
                RequestAddTradeItem( info.ServerID, info.AllItemCount );
            }
            else if( info.ItemNum==1)
            {
                RequestAddTradeItem( info.ServerID, 1);
            }
            else
            {
                DialogSetID( DIALOG_ID_ITEM_NUMBER );
                DialogSetReservedInt( info.ServerID );
                DialogSetParamInt( info.ItemNum );
                DialogShow( DIALOG_NumberPad, MakeFullSystemMsg( GetSystemMessage(72), info.Name, "" ) );
            }
        }
        else
            RequestAddTradeItem( info.ServerID, 1 );
    }
}

function MoveToMyList( int index, int num )
{
    local ItemInfo info;
    if( class'UIAPI_ITEMWINDOW'.static.GetItem("TradeWnd.InventoryList", index, info) )    // success returns true
    {
        RequestAddTradeItem( info.ServerID, num );
        //if( num >= info.ItemNum )
        //    class'UIAPI_ITEMWINDOW'.static.DeleteItem("TradeWnd.InventoryList", index);

        //info.ItemNum = num;
        //class'UIAPI_ITEMWINDOW'.static.AddItem("TradeWnd.MyList", info);
    }
}

function HandleMoveButton()
{
    local int selected;
    local ItemInfo info;
    selected = class'UIAPI_ITEMWINDOW'.static.GetSelectedNum("TradeWnd.InventoryList");
    if( selected >= 0 )
    {
        class'UIAPI_ITEMWINDOW'.static.GetItem("TradeWnd.InventoryList", selected, info);
        if( info.ItemNum == 1 )        // stackable??
            MoveToMyList(selected, 1);
        else
        {
            DialogSetID( DIALOG_ID_ITEM_NUMBER );
            DialogSetReservedInt( info.ServerID );
            DialogSetParamInt( info.ItemNum );
            DialogShow( DIALOG_NumberPad, MakeFullSystemMsg( GetSystemMessage(72), info.Name, "" ) );
        }
    }
}

function HandleStartTrade( string param )
{
    local int targetID;
    local UserInfo targetInfo;
    local string clanName;
    local WindowHandle m_inventoryWnd;
    local WindowHandle m_warehouseWnd;
    local WindowHandle m_privateShopWnd;
    local WindowHandle m_shopWnd;
    local WindowHandle m_multiSellWnd;

    //각종 윈도우 핸들을 얻어온다.
    m_inventoryWnd = GetHandle( "InventoryWnd" );    //인벤토리
    m_warehouseWnd = GetHandle( "WarehouseWnd" );        //개인창고, 혈맹창고, 화물창고
    m_privateShopWnd = GetHandle( "PrivateShopWnd" );    //개인판매, 개인구매
    m_shopWnd = GetHandle( "ShopWnd" );                //상점구매, 판매
    m_multiSellWnd = GetHandle( "MultiSellWnd" );            //멀티셀

    if( m_inventoryWnd.IsShowWindow() )            //인벤토리 창이 열려있으면 닫아준다.
    {
        m_inventoryWnd.HideWindow();
    }  
    if( m_warehouseWnd.IsShowWindow() )            //창고 창이 열려있으면 닫아준다.
    {
        m_warehouseWnd.HideWindow();
    }  
    if( m_privateShopWnd.IsShowWindow() )        //개인상점 창이 열려있으면 닫아준다.
    {
        m_privateShopWnd.HideWindow();
    }  
    if( m_shopWnd.IsShowWindow() )                //상점 창이 열려있으면 닫아준다.
    {
        m_shopWnd.HideWindow();
    }
    if( m_multiSellWnd.IsShowWindow() )            //멀티셀 창이 열려있으면 닫아준다.
    {
        m_multiSellWnd.HideWindow();
    }
   
    class'UIAPI_WINDOW'.static.ShowWindow("TradeWnd");
    class'UIAPI_WINDOW'.static.SetFocus("TradeWnd");

    ParseInt( param, "targetId", targetID );
   
    if( targetID > 0 )
    {
        GetUserInfo( targetID, targetInfo );
        if( targetInfo.nClanID > 0 )
        {
            clanName = GetClanName( targetInfo.nClanID );
            class'UIAPI_TEXTBOX'.static.SetText( "TradeWnd.Targetname", targetInfo.Name $ " - " $ clanName );
        }
        else
        {
            class'UIAPI_TEXTBOX'.static.SetText( "TradeWnd.Targetname", targetInfo.Name);        //혈맹이 없어도 이름을 표시해준다.
        }
    }
}

function HandleTradeAddItem( string param )
{
    local string    strDest;
    local ItemInfo    itemInfo, tempInfo;
    local int        index;

    ParseString( param, "destination", strDest );

    ParamToItemInfo( param, itemInfo );
    if( strDest == "inventoryList" )
    {
        strDest = "TradeWnd.InventoryList";
    }
    else if( strDest == "myList" )
    {
        strDest = "TradeWnd.MyList";
        class'UIAPI_INVENWEIGHT'.static.ReduceWeight( "TradeWnd.InvenWeight", itemInfo.ItemNum * itemInfo.Weight );
        //debug("AddWeight " $ itemInfo.ItemNum * itemInfo.Weight );
    }
    else if( strDest == "otherList" )
    {
        strDest = "TradeWnd.OtherList";
        class'UIAPI_INVENWEIGHT'.static.AddWeight( "TradeWnd.InvenWeight", itemInfo.ItemNum * itemInfo.Weight );
        //debug("ReduceWeight " $ itemInfo.ItemNum * itemInfo.Weight );
    }

      ItemInfo.RefineryOp2 = itemInfo.Blessed;
    ItemInfo.RefineryOp1 = itemInfo.Damaged;


    index = class'UIAPI_ITEMWINDOW'.static.FindItemWithServerID( strDest, itemInfo.ServerID );
    //debug( "HandleTradeAddItem " $ strDest $ ", index " $ index );
    if( index >= 0 )
    {
        if( IsStackableItem( ItemInfo.ConsumeType ) )
        {
            class'UIAPI_ITEMWINDOW'.static.GetItem( strDest, index, tempInfo );
            itemInfo.ItemNum += tempInfo.ItemNum;
            class'UIAPI_ITEMWINDOW'.static.SetItem( strDest, index, itemInfo );
        }
        // 아이템이 이미 있고 수량성 아이템도 아니라면 아무것도 하지 않는다.
    }
    else
    {
        class'UIAPI_ITEMWINDOW'.static.AddItem( strDest, itemInfo );
    }
}

// 교환이 끝났음
function HandleTradeDone( string param )
{
    class'UIAPI_WINDOW'.static.HideWindow("TradeWnd");
}

// 다른 쪽에서 OK 버튼을 눌러서 더이상 변경할 수 없음. 상대방의 아이템 리스트를 변경 불가 상태로 변경.
function HandleTradeOtherOK( string param )
{
    class'UIAPI_ITEMWINDOW'.static.SetFaded( "TradeWnd.OtherList", true );
}

// 아이템을 옮기거나 할때 자신의 인벤토리 상황을 업데이트 한다.
function HandleTradeUpdateInventoryItem( string param )
{
    local ItemInfo info;
    local string type;
    local int    index;

    ParseString( param, "type", type );
    ParamToItemInfo( param, info );
    if( type == "add" )
    {
        class'UIAPI_ITEMWINDOW'.static.AddItem( "TradeWnd.InventoryList", info );
    }
    else if( type == "update" )
    {
        index = class'UIAPI_ITEMWINDOW'.static.FindItemWithServerID( "TradeWnd.InventoryList", info.ServerID );
        if( index >= 0 )
            class'UIAPI_ITEMWINDOW'.static.SetItem( "TradeWnd.InventoryList", index, info );
    }
    else if( type == "delete" )
    {
        index = class'UIAPI_ITEMWINDOW'.static.FindItemWithServerID( "TradeWnd.InventoryList", info.ServerID );
        //debug("HandleTradeUpdateInventoryItem delete : index(" $ index $ ")");
        if( index >= 0 )
            class'UIAPI_ITEMWINDOW'.static.DeleteItem( "TradeWnd.InventoryList", index );
    }
}

function HandleReceiveStartTrade( string param )
{
    local int targetID;
    local UserInfo info;
    ParseInt( param, "targetID", targetID );
    if( targetID > 0 && GetUserInfo( targetID, info ) )
    {
        DialogSetID( DIALOG_ID_TRADE_REQUEST );
        DialogSetParamInt( 10*1000 );            // 10 seconds
        DialogShow( DIALOG_Progress, MakeFullSystemMsg(GetSystemMessage(100), info.Name, "" ) );
    }
}

function HandleDialogOK()
{
    local int serverID;
    local int num;
    if( DialogIsMine() )
    {
        if( DialogGetID() == DIALOG_ID_TRADE_REQUEST )
        {
            //debug("DialogOK DIALOG_ID_TRADE_REQUEST");
            AnswerTradeRequest( true );
        }
        else if( DialogGetID() == DIALOG_ID_ITEM_NUMBER )
        {
            //debug("DialogOK DIALOG_ID_ITEM_NUMBER");
            serverID = DialogGetReservedInt();
            num = int( DialogGetString() );
            //debug("serverID " $ serverID $ ", num " $ num );
            RequestAddTradeItem( serverID, num );
        }
    }
}

function HandleDialogCancel()
{
    if( DialogIsMine() )
    {
        if( DialogGetID() == DIALOG_ID_TRADE_REQUEST )
        {
            //debug("DialogCancel DIALOG_ID_TRADE_REQUEST");
            AnswerTradeRequest( false );
        }
    }
}

function Clear()
{
    class'UIAPI_ITEMWINDOW'.static.Clear( "TradeWnd.InventoryList" );
    class'UIAPI_ITEMWINDOW'.static.Clear( "TradeWnd.MyList" );
    class'UIAPI_ITEMWINDOW'.static.Clear( "TradeWnd.OtherList" );
    class'UIAPI_TEXTBOX'.static.SetText( "TradeWnd.TargetName", "" );
    class'UIAPI_INVENWEIGHT'.static.ZeroWeight( "TradeWnd.InvenWeight" );
}
defaultproperties
{
}
 

Attachments

Java:
public class TradeStart extends L2GameServerPacket
{
    private final Player _activeChar;
    private final ItemInstance[] _itemList;

 
    public TradeStart(Player player)
    {

        _activeChar = player;
        _itemList = player.getInventory().getAvailableItems(true, false);
    }
 
    @Override
    protected final void writeImpl()
    {
        if (_activeChar.getActiveTradeList() == null || _activeChar.getActiveTradeList().getPartner() == null)
            return;
     
        writeC(0x1E);
        writeD(_activeChar.getActiveTradeList().getPartner().getObjectId());
        writeH(_itemList.length);
     
        for (ItemInstance temp : _itemList)
        {
            if (temp == null || temp.getItem() == null)
                continue;
         
            Item item = temp.getItem();
         
            writeH(item.getType1());
            writeD(temp.getObjectId());
            writeD(temp.getItemId());
            writeD(temp.getCount());
            writeH(item.getType2());
            //
            int _augorg = 0;
            int _aug = 0;
            int _aug2 = 0;
            int _aug3 = 0;
            if (temp.isAugmented()) {
                _augorg = temp.getAugmentation().getAugmentationId();
                _aug = _augorg>>16;
                _aug2 = _aug;
                _aug3 = _augorg-(_aug<<16);
            }

         
            if (temp.isAugmented())
                writeH(_aug2);
            if (temp.isAugmented() == false)
            writeH(0x00);
            writeD(item.getBodyPart());
            writeH(temp.getEnchantLevel());
            writeH(0x00);
            if (temp.isAugmented())
            writeH(_aug3);
            if (temp.isAugmented() == false)
            writeH(0x00);

         
        }
    }
}

Это вообще полный бред, понасрали какую то ересь. Он выглядит вот так
a2d1b91b7f8152bcb8fa45eaaa4f273f.png
 
бред не бред, рабочий пример с асика.
Причем тут асик или не асик…. Клиент в такое не умеет ни как по умолчанию, а то что они понасрали у себя в коде - это их абсолютно личное дело.
 
Причем тут асик или не асик…. Клиент в такое не умеет ни как по умолчанию, а то что они понасрали у себя в коде - это их абсолютно личное дело.
Я приложил компил интерфейса где уже добавлены изменения и даже сам класс исправленный если ты не заметил
 
Это? что Это?...:rolleyes:
Сервер не умел отдавать эти данные пока дизер не внес изменения сегодня...
Как это не умел если это у меня работает с марта месяца.
Отображение лса при передаче в трейд
 
Как это не умел если это у меня работает с марта месяца.
Отображение лса при передаче в трейд
Он сделал чисто силами UI, без пакетов трейда.
Нативно лучше цеплять данные как раз из пакета. Ему было бы тоже так проще это сделать чем вертеть костыли в UI
 
Это вообще полный бред, понасрали какую то ересь. Он выглядит вот так
a2d1b91b7f8152bcb8fa45eaaa4f273f.png
на тестовом сервере можно интерфейс тестить, должно передавать инфу об ЛСе?
 
Here everything is black when I put the code in the client and I need to add the Java part too?
 
Back
Top