【1】控件类型是WoWLook/ActionButton
packet.layout.xml
<Window Type="WoWLook/ActionButton" Name="PacketButton_8" >
<Property Name="BtnAnimation" Value="" />
<Property Name="Checked" Value="False" />
<Property Name="ClippedByParent" Value="False" />
<Property Name="Default" Value="False" />
<Property Name="DragThreshold" Value="0.000000" />
<Property Name="DraggingEnabled" Value="True" />
<Property Name="Empty" Value="False" />
<Property Name="Gloom" Value="False" />
<Property Name="UnifiedAreaRect" Value="{{0.000000,56.000000},{0.000000,140.000000},{0.000000,90.000000},{0.000000,174.000000}}" />
<Event Name="Clicked" Function="Packet_ItemBtnSubClicked(8);" />
<!--右键单击使用物品的函数 -->
<Event Name="RBClicked" Function="Packet_ItemBtnClicked(8);" />
</Window>
【2】WoWLook/ActionButton的右键单击函数
packet.lua
function Packet_ItemBtnClicked(nIndex)
if(nIndex < 1 or nIndex > PACKAGE_BUTTONS_NUM) then
return;
end
-- if( g_bCtrlPressed == 0 )then
-- PACKAGE_BUTTONS[nIndex]:DoAction();
-- elseif( g_bCtrlPressed == 1 )then
-- LifeAbility:Open_Compose_Gem_Page( 0, nIndex - 1 );
-- end
if ( g_bCtrlPressed == 1 )then
LifeAbility:Open_Compose_Gem_Page( 0, nIndex - 1 );
elseif( g_bShiftPressed == 1 )then
Open_Rework_Equip( 0, nIndex-1 );
else
PACKAGE_BUTTONS[nIndex]:DoAction();--**
end
end
<!--这个是UISystem导出的Lua接口函数
客户端UI对应的lua脚本只使用两类lua函数,
一个是UI控件导出的函数,在UI_CEHUI/UILuaControl.cpp里的,里面有各种控件导出的函数。
另一个是Game导出的游戏逻辑函数,在Game/Interface/GMInterface_Lua.h里说明的
【3】DoAction();lua函数
Client/UI_CEGUI/UILuaControl.h(177):
INT Lua_DoAction(LuaPlus::LuaState* pState);
INT ActionButton::Lua_DoAction(LuaPlus::LuaState* pState)
{
if(m_pActionItem)
m_pActionItem->DoAction();// 调用子类的函数,tActionItem* m_pActionItem;
return 0;
}
【4】tActionItem是GameInterface里的函数接口
tActionItem* m_pActionItem;
我们查看所有Game里的继承自tActionItem的类,其实就是
Game/Action目录下的类。
可见有很多类型的ActionButton。背包对应的就是GMActionSystem_Item.cpp
这个Action模块有个公共的基类
class CActionItem : public tActionItem
CActionItem 派生类型
CActionItem_ChangeSuit
CActionItem_ChatMood
CActionItem_Item
CActionItem_LifeAbility
CActionItem_MouseCmd_Exchange
CActionItem_MouseCmd_Friend
CActionItem_MouseCmd_Identify
CActionItem_MouseCmd_Repair
CActionItem_PetSkill
CActionItem_Skill
【5】找到CActionItem_Item的DoAction
这里说一下,物品有不同的种类,可以放在不同的背包里,
也就是有不同的背包,多种背包,
//物品归属
enum ITEM_OWNER
{
IO_UNKNOWN,
IO_MYSELF_EQUIP, //玩家自己身上的装备
IO_MYSELF_PACKET, //玩家自己身上的包中
IO_MYSELF_BANK, //玩家自己身上的银行中
IO_MYSELF_MOUNT, //玩家自己的坐骑 [7/20/2010]
IO_PLAYEROTHER_EQUIP, //其他玩家身上的装备
IO_ITEMBOX, //打开的宝箱中
IO_BOOTH, //商人的货架
IO_MYEXBOX, //自己的交易盒
IO_OTHEREXBOX, //对方的交易盒
// IO_ENCHASEPAGE, // 宝石合成/镶嵌界面
IO_MISSIONBOX, //任务递交盒
IO_MYSTALLBOX, //自己的摊位盒
IO_OTSTALLBOX, //对方的摊位盒
// IO_APPENDITEM, //装备上附加的宝石
IO_QUESTVIRTUALITEM, // 任务奖励的(虚拟)物品,只用于显示。
IO_PS_SELFBOX, //
IO_PS_OTHERBOX, //
IO_ITEMDROP, //掉落
IO_ITEMTRANSFER, //用于传送的物品
IO_ITEMIBSHOP, //IBShop
};
...
//玩家自己身上的包中
case tObject_Item::IO_MYSELF_PACKET:
{
DoAction_Packet();
}
break;
...
...
GameProjct/trunk/Client/game/Action/GMActionSystem_Item.cpp
line:4176
普通情况下的使用物品操作:
【6】。调用了GMGameInterface.h
cpp:GMGameInterface.cpp
line:1022
的函数
//------------------------------------------------
//使用包裹里的物品_通用
virtual VOID PacketItem_UserItem(tActionItem* pActionItem, int nTargetServerID, fVector2& fvPos) = 0;
//使用包裹里的物品_对象
virtual VOID PacketItem_UserItem_ToTarget( INT nIndex, UINT nTargetID) = 0;
//使用包裹里的物品_装备
virtual VOID PacketItem_UserEquip( INT nIndex ) = 0;
//使用包裹里的物品_宝石
virtual VOID PacketItem_UserGem(INT nGemIndex, INT EquipIndex) = 0;
//销毁包裹里的物品
virtual VOID PacketItem_Destroy(INT nIndex) = 0;
CGameProcedure::s_pGameInterface->PacketItem_UserEquip 装备
{
...
//进行一系列逻辑验证,最终发送这个包到服务端
CGUseEquip msg;
msg.setBagIndex( nIndex );
CNetManager::GetMe()->SendPacket( &msg );
// 服务端返回这个包请求的结果,有可能是多个,伴随着其他属性改变的packet
// GCUseItemResult
//
}
返回结果的数据包在
Game/Network/Handler/GC.../7.Item/中
CGameProcedure::s_pGameInterface->PacketItem_UserItem 普通物品
{
//能够直接使用
CGUseItem msg;
msg.SetBagIndex( pItem->GetPosIndex() );
msg.SetTargetObjID(objID);
msg.SetTargetPetGUID(petID);
msg.SetTargetPos(&posTarget);
CNetManager::GetMe()->SendPacket( &msg );
return;
// server返回结果: GCUseEquipResult
}
CGameProcedure::s_pGameInterface->PacketItem_EquipMount 坐骑
{
CGManipulateMount msg;
msg.setBagIndex(nIndex);
msg.setMountOperator(CGManipulateMount::MANIPULATE_EQUIP_MOUNT);
CNetManager::GetMe()->SendPacket( &msg );
}