lk1986
圣骑士
圣骑士
  • UID64
  • 发帖数86
  • QQ15151515
  • 社区居民
  • 原创写手
阅读:3580回复:5

给《飞飞》添加一键整理背包功能

楼主#
更多 发布于:2019-03-06 09:41
源文件中_Interface文件夹下WndField.cpp文件
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )

struct sItem
{
DWORD dwId;
DWORD dwKind2;
DWORD dwItemId;
BYTE nIndex;
sItem(){
 dwId = dwKind2 = dwItemId = nIndex = 0;
}
bool operator < (const sItem p2)
{
 if (dwKind2 == p2.dwKind2)
 {
  return dwItemId < p2.dwItemId;
 }else{
  return dwKind2 < p2.dwKind2;
 }
}
};
class CInventorySort
{
public:
CInventorySort()
{
 m_dwPos = 0;
}
~CInventorySort(){}
private:
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
DWORD m_dwPos;
public:
void Add(BYTE nIndex)
{
 if (m_dwPos >= MAX_INVENTORY)
 {
  return;
 }
 m_Item[m_dwPos].nIndex = nIndex;
 m_Item[m_dwPos].dwId = m_dwPos;
 m_dwPos++;
}
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
{
 for (int i=0;i<MAX_INVENTORY;i++)
 {
  if (m_Item.dwId == dwId)
  {
   return m_Item.nIndex;
  }
 }
 return 255;
}
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
{
 BYTE nTmp = 0;
 bool bDest = false,bSrc = false;
 for (int i=0;i<MAX_INVENTORY;i++)
 {
  if (dwSrcId == m_Item.dwId)
  {
   //id相等 则 改变对应的dest和src
   nTmp = m_Item.nIndex;
   m_Item.nIndex = dest;
  }
 }
 //临时数据保存完毕,交换开始
 for (int i=0;i<MAX_INVENTORY;i++)
 {
  if (dest == m_Item.nIndex)
  {
   //id相等 则 改变对应的dest和src
   m_Item.nIndex = nTmp;
  }
 }
}
};
-------------------------------------------------------------------------
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
紧靠其上添加:
if( pWndBase == &m_wndMenu )
{
 switch( nID )
 {
 case 2:
  {
   //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
   if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
   {
    break;
   }
   for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
   {
    CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
    if( !pItemElem )
     continue;
    if(pItemElem->GetExtra() > 0)
     continue;
    if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
     continue;
    if( g_pPlayer->IsUsing( pItemElem ) )
     continue;
    if( pItemElem->IsUndestructable() == TRUE )
    {
     g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
     continue;
    }
    g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
   }
   break;
  }
 case 1:
  {
   //整理背包
   //////////////////////////////////////////////////////////////////////////
   //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
   //////////////////////////////////////////////////////////////////////////
   //////////////////////////////////////////////////////////////////////////
   CInventorySort* pInvSort = new CInventorySort;
   vector <sItem> vItem;
   vItem.resize(MAX_INVENTORY);//初始化大小
    //////////////////////////////////////////////////////////////////////////
    //填充数据
    for (int i=0;i<MAX_INVENTORY;i++)
    {
     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
     if (!pItemElem)
     {
      vItem.dwKind2 = 0xffffffff;
      vItem.dwItemId = 0xffffffff;
      vItem.nIndex = i;
     }else {
      ItemProp* pProp = pItemElem->GetProp();
      vItem.dwKind2 = pProp->dwItemKind2;
      vItem.dwItemId = pItemElem->m_dwItemId;
      vItem.nIndex = i;
     }
     //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
    }
    //////////////////////////////////////////////////////////////////////////
    sort(vItem.begin(),vItem.end());//排序
    //////////////////////////////////////////////////////////////////////////
    //交换
    for (size_t i=0;i<vItem.size();i++)
    {
     //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
     pInvSort->Add(vItem.nIndex);
    }
    BYTE nDestPos = 0;
    for (int i=0;i<MAX_INVENTORY;i++)
    {
     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
     if (pItemElem)
     {
      if (IsUsingItem(pItemElem))
      {
       //这个位置无法放
       nDestPos++;
      }
     }
     BYTE nSrc = pInvSort->GetItemSrc(i);
     pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
     if (pItemElem)
     {
      if (IsUsingItem(pItemElem))
      {
       //这个道具无法移动,跳过
       continue;
      }
     }else{
      //空位置 不用动
      continue;
     }
     //////////////////////////////////////////////////////////////////////////
     //开始移动
     if (nSrc == nDestPos)
     {
      //原地不动
      nDestPos++;
      continue;
     }
     pInvSort->MoveItem(i,nDestPos);
     g_DPlay.SendMoveItem(0,nSrc,nDestPos);
     Sleep(5);
     //Error("移动 - %d->%d",nSrc,nDestPos);
     nDestPos++;
    }
    //取第一个元素的信息
    /*
    if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
    {
     Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
     g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
    }
    */
   //////////////////////////////////////////////////////////////////////////
   break;
  }
 }
}
m_wndMenu.SetVisible(FALSE);

--------------------------------------------------------------------------------------------------------
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
{
BaseMouseCursor();
}
在其下添加:
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
{
m_wndMenu.DeleteAllMenu();
m_wndMenu.CreateMenu(this);
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");

if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
{
 //P以上级别才可以删除所有道具
 m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
}
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
m_wndMenu.SetFocus();
}
------------------------------------------------------------------------------------------------------------
*************************
WndField.h文件
*************************
搜索:BOOL m_bReport;
其后添加:
CWndMenu m_wndMenu;
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
其后添加:
virtual void OnRButtonUp(UINT nFlags, CPoint point);
喜欢0 评分0
cc8023
侠客
侠客
  • UID1464
  • 发帖数67
  • QQ332304084
  • 社区居民
  • 忠实会员
沙发#
发布于:2022-04-09 03:45
小白来学习,谢谢分享知识
回复(0) 喜欢(0)     评分
hashcat
骑士
骑士
  • UID1650
  • 发帖数241
  • QQ93652685
板凳#
发布于:2022-10-29 00:43
小白来学习,谢谢分享知识
回复(0) 喜欢(0)     评分
l383733
新手
新手
  • UID1733
  • 发帖数21
  • QQ383733039
地板#
发布于:2023-03-08 15:57
给《飞飞》添加一键整理背包功能
回复(0) 喜欢(0)     评分
regtoemail
精灵王
精灵王
  • UID1179
  • 发帖数1532
  • QQ309104321
  • 社区居民
4楼#
发布于:2023-12-16 08:29
为了一个铜币努力176951000
回复(0) 喜欢(0)     评分
laosheng
侠客
侠客
  • UID571
  • 发帖数29
  • QQ1816788016
  • 社区居民
5楼#
发布于:2024-04-14 01:48
小白来学习,谢谢分享知识
回复(0) 喜欢(0)     评分
游客

返回顶部