飞飞世界论坛

标题: 一键整理背包 [打印本页]

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
! b+ e9 j2 T" T! U8 e9 T3 k搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )% P8 @# `- a5 b4 l2 J- O
$ F- N" E: R5 E# S* Z& ?/ |8 ]
struct sItem
2 S! O& r" O; b: a; q4 B{2 X7 v: v; k; E' O  k
DWORD dwId;3 q/ A8 |; I. E$ S$ Z4 y8 O% X3 l
DWORD dwKind2;" C  ]; t6 D2 ~% X" `
DWORD dwItemId;( d+ x1 e$ W: @9 Z" {; H
BYTE nIndex;
  ~4 }$ ^+ t7 gsItem(){
3 v& T: [3 `$ l0 X  dwId = dwKind2 = dwItemId = nIndex = 0;- g) z* B1 b, u5 i4 U
}$ T1 ]1 i" X4 p2 t9 T, Q& o! ~
bool operator < (const sItem p2)
& F7 o" O& l; R- H{
$ q, L: O( `/ N6 l3 I1 [& b  if (dwKind2 == p2.dwKind2)+ S9 g8 R& O3 b4 _) D6 v
  {/ s2 d' \& f5 @0 U1 {) A$ Q
   return dwItemId < p2.dwItemId;: G% w$ b4 T' d$ ?  A6 F8 c4 m' G+ R
  }else{" g& g$ H: O' }( z- M/ G5 g
   return dwKind2 < p2.dwKind2;/ ^6 N7 w$ C) s0 M& x8 Y2 S
  }9 O1 ^9 l( C+ {# t+ s
}
" _9 |% L) X- j' X% s};
* d9 x  H. I) o6 b) P; L; bclass CInventorySort
1 j% W; {% K8 {- E: K6 Z6 v, E" T{! G" S- e# @* y4 I1 C5 w
public:
/ R8 ?: b  D$ o. x5 [  w( r7 nCInventorySort()
8 q9 E0 j  F0 N6 k( F1 W{3 K# }, G/ ?/ p% H' n1 a6 {
  m_dwPos = 0;$ u* P2 P3 a- w$ L8 R+ j
}
1 S4 U2 G" |* M7 i$ q~CInventorySort(){}8 U" Q% B2 C( d: R
private:$ g; b9 O2 w; B- c* b; ~" F
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息0 p4 u1 Z0 I! i
DWORD m_dwPos;
+ a3 o) |! \3 u% F/ @public:5 X- L  F. D7 u; G' s0 ]
void Add(BYTE nIndex)
" [* ]! j  D3 \{& w( p& i5 o4 }7 O# y9 r4 X
  if (m_dwPos >= MAX_INVENTORY)3 Q: c% w  }: F0 W7 Z1 s& ~+ l
  {
- t- T+ g6 u+ R( f; j4 U& H2 @; o' w   return;8 A% K1 n* ]' [2 `* d
  }
1 Q8 p2 F( o4 W1 m  m_Item[m_dwPos].nIndex = nIndex;5 z% z* Q* _0 R4 j6 e7 [
  m_Item[m_dwPos].dwId = m_dwPos;1 V+ ?% b9 j8 c& k
  m_dwPos++;
' U& R0 F% Q0 c& ]}1 j( _: X! R% @4 a; }% V
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列0 Z) d" r0 U* J- v( A- Q% G3 T
{
& z& v1 R- @$ m  P. @( l; z: O; {2 @) j  for (int i=0;i<MAX_INVENTORY;i++)  o3 z1 z4 c2 X) Y( d
  {* E; {1 \; U7 v
   if (m_Item.dwId == dwId)
5 Y) r5 R: A5 F# K7 E* n. d   {, t$ E- C+ G4 }. j, P! x
    return m_Item.nIndex;
1 K) G. M' \7 R6 ?& M7 _0 `   }
4 G' E6 ?: D, U) A' ~) r+ t  }' o9 i# Z# a6 y7 A
  return 255;8 [+ b" U) x; a$ W  f
}
& `% F$ e0 {$ Y8 X0 H; F' x3 Y5 Wvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
2 f. c& k2 n' t& b8 `( \{* c: B  d/ t/ ]( h. T
  BYTE nTmp = 0;
5 o9 v. Y* h- F! X  bool bDest = false,bSrc = false;/ R6 s0 W5 b! h4 r
  for (int i=0;i<MAX_INVENTORY;i++)' Y! Y6 v. l8 e8 x- \- Q
  {
  d- W6 }, g: e   if (dwSrcId == m_Item.dwId)& F% e9 c! t8 ?! H$ ~$ k. R0 C
   {4 ]  U8 A% t4 W- I
    //id相等 则 改变对应的dest和src, N! P; ?, ]; s0 `  t! X5 O
    nTmp = m_Item.nIndex;
; {4 T! W6 w& v+ j3 E    m_Item.nIndex = dest;
% V2 ~! o7 P* L7 y" `   }
3 @2 I+ P, ~: {4 _" ^9 q  }
0 H  l8 l# r- k  //临时数据保存完毕,交换开始1 l; G, n2 M' w; |
  for (int i=0;i<MAX_INVENTORY;i++)5 z6 D, O7 u0 E7 u; B% f* x
  {3 j( Y5 m7 u3 G/ _
   if (dest == m_Item.nIndex)0 ~$ h) p- V4 R; Y, c
   {
7 X4 }8 A$ l* ]/ r. W& s    //id相等 则 改变对应的dest和src0 B9 e( p; P" C- d
    m_Item.nIndex = nTmp;- u# U+ c8 v. P1 f( t9 w0 o
   }
4 Z1 P5 T( v6 _$ R! `! N0 E* Y! m  }
- S8 @( b) I! I0 ~}& \1 b' G9 L6 P8 f6 Q( A# U8 l
};. I6 Y; t6 h/ B2 d5 |& R. S
-------------------------------------------------------------------------5 ^! D( }4 w, y# A4 l: N
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )" q) ^5 a; s6 w7 Q6 h* `
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);9 o8 M! [7 T7 F" W
紧靠其上添加:
/ R4 U  H0 s8 t3 mif( pWndBase == &m_wndMenu )
1 X% E! q6 g( C* }8 i2 O( C{$ |' d, r; q! ]' H
  switch( nID )% O2 R0 p. w  Q; L( D
  {, J2 Q& I) p3 p; s/ m& L0 D- D
  case 2:
- K) @  C; }* P/ C   {$ c; H/ x: G$ M2 b- p
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);; V' ~7 h! F" C
    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))4 k3 h' \# {. H8 H
    {" F) c  r+ I  x8 r
     break;
6 l% k) P5 k4 ~8 u    }
  S" P3 r; K; l! @! V8 s    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
+ y7 b9 d0 G: X- t    {
5 L$ y* A, k2 y8 c) [2 z7 Y' g     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
6 }) U% G- r2 h( s! N& b     if( !pItemElem )& V& r; J! V: Y% W  s7 L
      continue;8 t3 d8 I. f; {* h% y/ V. l
     if(pItemElem->GetExtra() > 0)
' j6 I" C* z. `, ?9 [5 b; J# s  [/ o      continue;4 ~4 v% {/ l' C  X" z. Q) B
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) $ h- a4 b+ E$ o# w
      continue;
) j. R( {( i$ @& h     if( g_pPlayer->IsUsing( pItemElem ) )' Y7 s0 ~3 ~# z3 p, _1 J
      continue;! b9 W8 \0 T4 Y1 r
     if( pItemElem->IsUndestructable() == TRUE )
6 O- }! E( y  X" P     {
6 a1 r1 A/ \" X/ G1 W' U" W9 t      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );1 Z1 i7 R2 S! l8 W3 j1 P
      continue;
, L9 q) o% t' J/ l0 O$ G" V, `     }6 c8 w; P2 x0 K0 T: H
     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);4 [; Y- X. r" `* B
    }
3 R+ P& c* F, J% o, {    break;9 u4 S" C' i, r% f$ _! `: U4 w
   }
: `* H2 m" Y- ]  i  case 1:
8 V% x6 R4 K% M3 g0 f2 Y* U2 `( @6 ~   {
0 R- t$ Q6 \- M0 f    //整理背包
0 i/ o0 A0 h- z" S5 g/ e    //////////////////////////////////////////////////////////////////////////
; a% d4 x# N/ h. L. r    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );0 P  c8 L9 v1 m0 q6 p$ m
    //////////////////////////////////////////////////////////////////////////
7 K9 y* x" J! F: G& M5 j  {1 |' H    //////////////////////////////////////////////////////////////////////////* g& B( `, ]$ r& }6 w
    CInventorySort* pInvSort = new CInventorySort;, i' V1 d* H( d6 h9 [
    vector <sItem> vItem;" E. J; o' r+ ]7 ^$ }4 s- p
    vItem.resize(MAX_INVENTORY);//初始化大小
) N, h4 c  h4 q5 k+ o     //////////////////////////////////////////////////////////////////////////1 V: s) U" l3 B- ]% H
     //填充数据: S3 }; _8 y. |" B0 R4 D2 t) E* s
     for (int i=0;i<MAX_INVENTORY;i++); M; E* T) }  A2 E$ y9 x$ X
     {
! d$ G& J5 W$ `' Q& L2 E      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
+ x! f4 J3 c) S+ c1 Y$ j) V" K      if (!pItemElem)7 i4 ^) X  H# q8 `
      {/ o* \6 I& A  h( ?5 I
       vItem.dwKind2 = 0xffffffff;
+ ~3 j  {) J% w4 O% L( J4 o       vItem.dwItemId = 0xffffffff;
) K$ n; R. g& u0 ]# b7 P       vItem.nIndex = i;
6 q7 ^8 E1 Y8 m9 y, O! o      }else {5 Q% v+ w* @& ^% h6 t
       ItemProp* pProp = pItemElem->GetProp();* b! q. ]9 V3 a
       vItem.dwKind2 = pProp->dwItemKind2;
% J# t# l3 j9 l1 y) q4 B) I5 x       vItem.dwItemId = pItemElem->m_dwItemId;
( }+ _. s0 o" V/ c% Y% ^1 L       vItem.nIndex = i;
: ?" g2 l% |+ h3 }* Y; l2 _      }0 \- R7 @# Z  U9 a
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);3 ?% A$ Q1 H/ J) z
     }
* N, Q9 @5 G1 Y     //////////////////////////////////////////////////////////////////////////
) o; q- R3 n1 Z" O4 `8 ~" v" V, S     sort(vItem.begin(),vItem.end());//排序' v2 d5 q) H- f7 f* F; B4 ]3 t$ C
     //////////////////////////////////////////////////////////////////////////
  e+ v/ h8 n: b5 L4 t# F     //交换& \/ j) b' g. a9 V1 [1 @6 @/ ~
     for (size_t i=0;i<vItem.size();i++)
3 h6 g+ y( R8 ?' ]! J- T  ]5 ?     {
& Q- ]2 r) p7 b% S2 @      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);! K- j, z7 n, j
      pInvSort->Add(vItem.nIndex);4 E8 o% N" R2 w! {$ \
     }
4 `7 u, W, f5 Y- L/ N     BYTE nDestPos = 0;4 Y5 B$ C; ]* H/ J, U
     for (int i=0;i<MAX_INVENTORY;i++). |% x! L2 V1 s- _  b0 B& Z* g  E
     {
: z2 W# F; k+ V: t( B* V      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
9 w& {0 b! F3 d+ U- C+ d/ J) i4 s      if (pItemElem)! j! p+ P2 k' u& i
      {/ X) `( {! S2 A3 X4 n& g$ `8 B
       if (IsUsingItem(pItemElem))
1 P$ t* L/ E# y/ r- b; q       {, k: a. t" x, P- m) X
        //这个位置无法放! P# B4 v! R( n; Q5 c6 Y
        nDestPos++;# a. G0 Z0 J' o' M( l
       }
6 \7 d1 S7 H3 d: b/ p/ T      }" {3 }& v# y/ w, w
      BYTE nSrc = pInvSort->GetItemSrc(i);0 j, T6 _0 P# `+ ]! x# O
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);* w* O* T. V9 f( F+ g" F+ d
      if (pItemElem)
8 `1 }% s3 L7 D      {
8 w) I% T( S& _5 U, G9 e       if (IsUsingItem(pItemElem))
* E& {9 W$ p' Q7 u; u" {0 F' R7 o: u       {0 d, y4 a- j" l1 C* i! G/ R( d5 s" S+ o
        //这个道具无法移动,跳过( y+ l7 {, V4 d* u) I; C
        continue;: B3 d- `& Y& a; S
       }1 N  s; t2 o9 e. G
      }else{
6 |# J, e+ J7 {       //空位置 不用动
0 ~+ Z# ^5 ~" R  A$ R( Q% k       continue;
! R- g9 ~: B: D+ M      }, n6 O5 d9 O, @8 ]
      //////////////////////////////////////////////////////////////////////////& b# ^% K, T  X8 `) ^8 L
      //开始移动
& r8 i0 `2 A7 S      if (nSrc == nDestPos)
$ [& r9 w' ]: i      {- R8 O2 z7 i. V2 ?$ l3 m" y
       //原地不动- F6 V, R# h  i7 j- A/ [) J
       nDestPos++;
) X, z0 a8 o9 c       continue;0 D4 u8 r& A" v* `
      }6 [6 m! C# \8 X* ?* b# @' U
      pInvSort->MoveItem(i,nDestPos);
% R$ T1 K1 i8 d1 s( r      g_DPlay.SendMoveItem(0,nSrc,nDestPos);
) I& \8 q5 ]' S2 L, x      Sleep(5);
5 A; c+ g3 a9 s2 @$ K) Y+ R      //Error("移动 - %d->%d",nSrc,nDestPos);
+ y7 V* Y+ v* r* }& n7 j      nDestPos++;
$ \$ K+ B5 N+ v) p/ N# L) [     }9 ?  ]. ]6 m/ b9 C4 u& j
     //取第一个元素的信息
: P" M# ]+ s& T. f9 X5 b     /*, W9 _1 r+ l! v% W$ o
     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
1 {+ f( Z( P6 h" R1 g     {- @' @. ~) g) h7 G* b3 I( ~
      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);- A7 [& r( y5 e% x( `# y
      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
% e' c3 ~% B3 a9 q& h% {6 @$ u     }* I4 l2 g! w2 E5 C
     */9 h" ^0 e9 @7 }5 u+ s/ n
    //////////////////////////////////////////////////////////////////////////# d' a2 g4 V5 T" a
    break;
) |7 g5 f* v; D% E   }
, l( @. X  ~. y' D/ Z1 w! H  }
4 j) p/ L8 M8 d! S}
$ H2 A, J$ ]: X+ f) ^* g5 H* em_wndMenu.SetVisible(FALSE);
2 Y! ~& L: e; s) }  D8 N* H$ S/ F/ _  V) Y7 s' \4 V1 m; E
--------------------------------------------------------------------------------------------------------
& w/ s  X8 X: w9 W. q( U, K# T搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)/ d; J1 t0 }2 ]6 c! C
{) J8 I9 c# p9 y+ p6 H0 h& T
BaseMouseCursor();
: W; }, S1 [4 x' i}$ T9 R* O; |( a& O3 Z
在其下添加:+ V2 @4 O: s1 O) v8 y% f4 {: _4 Q
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)+ b; E! s, q, ~2 Z3 i4 r' O( A* a
{
' E' k. X) D* W8 V+ [1 ~% pm_wndMenu.DeleteAllMenu();5 I, w8 ^9 N4 M" b0 |, \% B0 l: j
m_wndMenu.CreateMenu(this);
# h( v( H$ L. r9 S  t3 Q7 z4 vm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");) Z; D  q  ]# T

4 U8 o3 E# W2 |- F$ c& W. Oif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
& k, S% |% L2 c. D{
+ d" ~& @6 P6 c/ a  //P以上级别才可以删除所有道具4 L+ S! w4 ?. u" K$ J- |
  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
/ S; J# ]# A- e8 \" o}
* r% e2 d3 g. O! H5 ]2 j3 t' |m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );+ J" w+ h% M4 {7 ?8 M- O
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );) i4 e, f& t% m1 |6 p2 i- {; ?
m_wndMenu.SetFocus();; g2 e; x8 J) O
}& N: I  r3 `; t+ n" z, F/ t6 m+ [
------------------------------------------------------------------------------------------------------------
% N& \8 i! r" P; w5 s% @*************************1 c" ~" `7 \! O' b8 [8 s
WndField.h文件
, i" e/ o$ ?6 x*************************
& N$ D" n/ g8 P4 z2 z! H搜索:BOOL m_bReport;
  q9 R& g' M9 e; K; L. u0 Y! _7 T其后添加:! L+ W3 K  p* E6 V3 Y/ I
CWndMenu m_wndMenu;  u: U/ e2 u2 V% B9 b
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);, j- X2 k. w& i9 x" [. m# L$ W0 B" d
其后添加:+ b4 h1 ~# W, J- X
virtual void OnRButtonUp(UINT nFlags, CPoint point);! l* V! J. O, o4 n, s6 j6 F. U
6 T7 Q& A# I; t# B; d
4 J0 Q# {$ T5 h; @4 {$ ]





欢迎光临 飞飞世界论坛 (http://www.ffwold.com/) Powered by Discuz! X3.2