это из оригинального тултипа взято
Добавил Hшки с Аугом. Все равно не отображается
Сегодня закомичу, можете сами дальше разбираться с интерфейсом
это из оригинального тултипа взято
то, что присылали скриншотами выше - костыльный вариант, интерлюд клиент не обрабатывает option'ы в трейд окне
Добавил Hшки с Аугом. Все равно не отображается
Сегодня закомичу, можете сами дальше разбираться с интерфейсом
А как выглядит то, что сервер посылает клиенту?Так я вроде это и говорил. В целом добавил данные, но клиент их тупо не отрабатывает. Если у кого то получится допилить интерфейс - буду благодарен
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);
}
}
}
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
{
}
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); } } }
бред не бред, рабочий пример с асика.Это вообще полный бред, понасрали какую то ересь. Он выглядит вот так
![]()
Причем тут асик или не асик…. Клиент в такое не умеет ни как по умолчанию, а то что они понасрали у себя в коде - это их абсолютно личное дело.бред не бред, рабочий пример с асика.
Это? что Это?...покупаете у перфекта это и не паритесь.View attachment 4021
Я приложил компил интерфейса где уже добавлены изменения и даже сам класс исправленный если ты не заметилПричем тут асик или не асик…. Клиент в такое не умеет ни как по умолчанию, а то что они понасрали у себя в коде - это их абсолютно личное дело.
Как это не умел если это у меня работает с марта месяца.Это? что Это?...
Сервер не умел отдавать эти данные пока дизер не внес изменения сегодня...
Он сделал чисто силами UI, без пакетов трейда.Как это не умел если это у меня работает с марта месяца.
Отображение лса при передаче в трейд
на тестовом сервере можно интерфейс тестить, должно передавать инфу об ЛСе?Это вообще полный бред, понасрали какую то ересь. Он выглядит вот так
![]()
да, можешь проверятьна тестовом сервере можно интерфейс тестить, должно передавать инфу об ЛСе?
Это уже работает по умолчанию, тебе осталось добавить это в клиентподскажите где этот конфиг?