天龙 - Action Buffer

发布于 2021年 07月 02日 09:55

【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 ); }