飞飞世界论坛

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

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
- t$ u1 D0 B3 l6 ?# q) m; m搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
- t4 B9 j: t; b; j* u
- z+ C, L  M' kstruct sItem+ D& ]0 {. U* B" f( R$ k6 a
{* y$ H! b6 i7 y
DWORD dwId;
6 h" T- [: b( E4 c3 R: J5 KDWORD dwKind2;5 c8 E0 j  D+ H. T" A( V
DWORD dwItemId;
7 \. v6 q% e) \" L# u3 @BYTE nIndex;; u9 j- i/ w0 F0 P, Y
sItem(){
1 r  P5 R' Q$ P" S/ _; E  dwId = dwKind2 = dwItemId = nIndex = 0;& i2 Y, u( i3 _
}" J* V: d! J% g$ o: I; h6 [3 b
bool operator < (const sItem p2)- n! o0 d8 |+ S8 d. ?; L
{2 f# }% E% K2 q' o% G5 r
  if (dwKind2 == p2.dwKind2)0 Z; U' q9 b, \* O, b
  {
* G7 p4 o$ N) E0 O   return dwItemId < p2.dwItemId;0 Y% ^6 M. Q7 p9 Y0 I6 |" M/ d
  }else{1 P% u: E" j! r1 @" o
   return dwKind2 < p2.dwKind2;8 X3 W# q- B, ]! |! Q* {+ @6 p
  }
9 D/ H5 [, F5 x- F}9 J% E& j: [' e2 M9 @: @+ Y
};
  X+ f, T& H' E* ]' Qclass CInventorySort: b8 Z, ]8 Y) I$ d' a0 h
{/ g5 t6 C# {2 @4 I& B( R
public:
& I. `8 I9 x1 d8 }CInventorySort()( h8 [- K$ f6 q5 o+ [2 f
{8 k3 P3 G. i% K* ~. x
  m_dwPos = 0;3 H$ k2 y- u0 R) u2 x3 e9 {
}
9 J! g0 ?, V7 @. j, g3 i0 V~CInventorySort(){}
+ [1 d3 ?. y$ k" K- u) Eprivate:
& w) g$ U' ?: n6 |# s: KsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
% j2 ~: P4 ?/ A; K' @0 SDWORD m_dwPos;+ b) F0 B. J) }7 _7 q
public:
% m# }* l" x. ]  i0 qvoid Add(BYTE nIndex)
  }5 s! W) j% S! S{# X9 T5 h* r- v: F
  if (m_dwPos >= MAX_INVENTORY)
8 R- R& T$ V/ E/ Y+ ~  {, ?; _9 S& L. _7 r* @; S0 L
   return;
5 V0 p  I, y0 C; s9 }) F  }2 q6 m, w9 J( z9 Q
  m_Item[m_dwPos].nIndex = nIndex;3 [1 c" X: a" O- H* d
  m_Item[m_dwPos].dwId = m_dwPos;3 U, \3 c1 O/ g: N
  m_dwPos++;; g' V; {+ Y6 b+ q) Y
}, F/ K  q" S4 Y+ [5 U- W" c+ u
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列1 G; K. ~7 K5 }/ f. z; E* u
{5 z7 k3 @5 C6 h1 U- n4 v9 }
  for (int i=0;i<MAX_INVENTORY;i++)+ ^1 r4 N; k: ?1 C2 w
  {
3 b  @9 x3 `2 U8 y+ O   if (m_Item.dwId == dwId)
7 a' @/ y# g, p0 E( ?9 q8 `   {& ^3 D  t( z' _) Y. u8 c
    return m_Item.nIndex;
( R( |+ X4 q" o: x9 X. ~   }
3 @+ v1 L2 n% q0 ]8 u  z8 d' s  }6 ~- J9 _) M) `+ r+ \
  return 255;; b0 N% v* R9 i- l! }
}+ U8 m1 }/ B+ L+ i) P$ ^  [
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置% k7 Z0 N+ ^1 ^; ~. \( x) L
{- c1 U1 \2 i! n! L5 D5 K
  BYTE nTmp = 0;' k) U4 L$ t- f* u( Q  ~2 f
  bool bDest = false,bSrc = false;1 Z* L+ u8 ~% ^5 n" x# q
  for (int i=0;i<MAX_INVENTORY;i++)$ f" X8 q& e; ]+ _7 G
  {
+ M" u/ T; {# ^5 r% ^   if (dwSrcId == m_Item.dwId): S* W$ ]" f, U* |& f! a6 C6 d
   {
$ f. S. ?, x' e: b& ^    //id相等 则 改变对应的dest和src$ U( C2 `, m% W& W+ w9 |) i0 \; _6 L
    nTmp = m_Item.nIndex;
- T( Q: E6 }: G4 N) L    m_Item.nIndex = dest;: F- n  w3 F/ e3 T1 M0 K
   }
, y7 \1 w% I) H2 }- f% K  }; }) }* U% i; L: o2 C& I- @
  //临时数据保存完毕,交换开始
1 j9 w6 N; l8 K  for (int i=0;i<MAX_INVENTORY;i++)0 U# k  G! v4 ^1 W, I
  {) W  ~# P# h1 O
   if (dest == m_Item.nIndex), a! d5 D7 @4 n- ^% q
   {$ W8 ?/ {! o4 `0 p( a+ i7 `
    //id相等 则 改变对应的dest和src" _$ m4 y% Q7 f% I! v; v
    m_Item.nIndex = nTmp;) @) B. q( U: q
   }
. b. _. g1 h4 k5 \9 l6 X  }
( e" g# [5 C0 s& A. u}' y  F) W4 F  r* T
};# z2 N6 `! H  Z+ L. _8 ^" `
-------------------------------------------------------------------------' E. U- r2 z6 T2 k/ r
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )+ C; j3 [" ^2 W( |
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);! F7 e  `' s8 z8 n
紧靠其上添加:
, Q3 Q( ]& I6 r1 n- oif( pWndBase == &m_wndMenu )
! J2 R# ^( y. H! m$ O{
5 Z1 Q  P- o8 Z9 a7 p" N7 _$ ]: T  switch( nID )+ q* e8 N+ [9 M5 W
  {
2 ~% d5 v" d- [  case 2:# E$ v6 M' ]- M' e9 Q, s: K
   {
" Q" Q; S+ l0 j2 u# z9 ^; [+ A    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);, i5 Y" j; ~$ a+ U
    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
3 r4 m8 O9 ?% `: a    {
8 F4 m  m) F  T/ m; z' r     break;2 Q) I0 b, q$ D8 B1 g; l
    }
" k# r3 X5 V: y, P' p' d2 |% u. e    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
) g( K2 i: t3 _1 ?    {
; ?2 K/ y7 U0 H     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);2 f: T" W9 @+ ]4 e; ~
     if( !pItemElem ), D8 ?( B: X6 r
      continue;
$ B5 r& b8 Z6 _( M5 w6 Q     if(pItemElem->GetExtra() > 0)
% e& @5 r& b; R6 O- s      continue;! W' B  p8 C* U% [0 v4 \* E& M' m, o
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
3 f( V+ X3 C/ q      continue;/ X2 v& o9 L" H& ^
     if( g_pPlayer->IsUsing( pItemElem ) )
- J' r$ V: F* t& u* h$ ~      continue;: [( |3 h7 P) a* J
     if( pItemElem->IsUndestructable() == TRUE )0 S. l3 E% z6 b9 R/ C
     {8 W: e6 R) r5 ^1 j2 p# u
      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );  z# }, ~; \% n5 w1 a
      continue;1 j" S! ?6 b/ C- g+ z! A
     }
6 ~6 b" q1 g+ J- z! g$ g3 y     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
6 c  `$ i- F5 _) R    }
  h: F& B5 {4 L. ^& |: h    break;
( r8 e' }0 z; U' e$ Z) Y   }
6 `1 m# J% W8 L' p4 p' v9 E" n  case 1:
6 B% ]( S( q* }$ V$ k   {* [0 N! w! z0 n) l; h; [
    //整理背包
; `4 Q3 u3 G" ~% C2 V" M    //////////////////////////////////////////////////////////////////////////
5 ?1 N# f, R( k6 v/ _' E    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
) w( c$ I  @+ a' f: V8 X* h6 W    //////////////////////////////////////////////////////////////////////////
, Z- }, q3 ^& E% |) P* o" [    //////////////////////////////////////////////////////////////////////////0 ^6 D8 H2 Y* F2 [0 q/ v6 y
    CInventorySort* pInvSort = new CInventorySort;8 f( z+ }" Q( j, L
    vector <sItem> vItem;: |! K7 _" x* o1 k6 t
    vItem.resize(MAX_INVENTORY);//初始化大小
. L4 \: O3 s; R$ ]. z     //////////////////////////////////////////////////////////////////////////
" s4 _+ S% y! O& }4 N4 V* @     //填充数据
3 k; Z% R3 W% {3 I* V0 X; X/ r     for (int i=0;i<MAX_INVENTORY;i++)1 z0 B) i6 r: i9 K$ H: O
     {
$ O# p; ^3 O9 \1 Y. K1 c      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
& ^' x( N  z! A5 u9 [$ X      if (!pItemElem)
9 s& ?) @  a" K) K- i5 u' E      {
2 D& z, i7 b- U' K5 J       vItem.dwKind2 = 0xffffffff;8 S0 L' ^9 e3 A& F: ^% [" w! l/ f* B9 V
       vItem.dwItemId = 0xffffffff;
& M$ q5 s/ E7 D# d, l5 {       vItem.nIndex = i;1 Q3 H9 Y6 `+ F7 H1 X; @
      }else {' c. m! P$ Y2 G  [5 c
       ItemProp* pProp = pItemElem->GetProp();1 C. {4 K, W- e+ ~1 u  S9 z
       vItem.dwKind2 = pProp->dwItemKind2;
! A& c% e/ U5 a5 c; r& _       vItem.dwItemId = pItemElem->m_dwItemId;. a& |* q2 t& N8 h2 _1 t7 w. I1 L
       vItem.nIndex = i;$ h* u/ U& [! Z* M. ?
      }8 C& H. ]1 m; X/ t
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);- r% i# {+ U" A; t' ]6 z0 U* r
     }  l% n/ Z) K! B! W0 {
     //////////////////////////////////////////////////////////////////////////
( |8 X* j. |. S( s     sort(vItem.begin(),vItem.end());//排序! t  a3 w; n( b( X- X, R8 l1 v5 p% s
     //////////////////////////////////////////////////////////////////////////
( `0 @; `3 Z5 s2 \, z     //交换
" l/ _0 [' P7 J( u: y+ T7 k* x     for (size_t i=0;i<vItem.size();i++)
1 U/ ~, S, R- B8 u' a7 Z$ D( o# W     {
/ T6 O' r( a+ ]5 W, s- P9 R) g- M      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
# y' k; {( [! x: ^9 O* R' Z      pInvSort->Add(vItem.nIndex);, b5 n" Q3 H% E! f
     }, g- N+ m1 m4 c6 S" }$ I2 y
     BYTE nDestPos = 0;
: k9 O/ O: {: x0 r     for (int i=0;i<MAX_INVENTORY;i++)
# s- ^- [" l* }9 b$ x7 d- f! R( ^     {2 O6 \- X) }+ ~, l' j  t
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);" Y) m% ]& ^3 i; [* \0 o
      if (pItemElem)% W/ ?: d3 r; v' h
      {7 z3 Q& e$ p& A& R
       if (IsUsingItem(pItemElem))
3 U: U) w2 L& i4 f7 I# V9 d6 u       {: Z, h! Z+ Y2 _0 {. _
        //这个位置无法放! |0 a: T" a9 c
        nDestPos++;  Y, E, t6 [- M" r# y6 _- o  q$ \
       }/ l7 q8 l8 S+ b" q# {( D9 E% k
      }( m1 y: J! x+ b1 W
      BYTE nSrc = pInvSort->GetItemSrc(i);
) T0 `# s# z% n* k1 x      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);$ F: t5 z% [' X: h% Z& r7 d- C; G  b
      if (pItemElem)6 X1 C( J5 ^) K' [
      {
+ r* \" V6 R; n9 q; D       if (IsUsingItem(pItemElem))$ q. P9 ]# R" \6 N) N# q
       {; e( n0 j! c  o
        //这个道具无法移动,跳过3 D- U3 d3 u' v1 [
        continue;
1 }, Q& y  Z$ [8 i* q       }
3 k9 }) E4 h5 v  V9 I, w3 i) e% e      }else{: _$ R' e5 O( {
       //空位置 不用动
; i9 q+ K) e1 H       continue;
$ l4 x' {, Z2 K7 ?0 G, [2 L: W8 Y. L) x      }$ p8 M9 v: z5 \
      //////////////////////////////////////////////////////////////////////////
- K7 o. M; h, L  T7 G      //开始移动4 H/ B3 T2 h1 O% x6 i3 Z( s/ _& x2 C% V
      if (nSrc == nDestPos)7 I7 z9 y* }( X* H) H$ R- ?
      {5 D  b# ]/ t# z+ O
       //原地不动
* U1 x- _* d+ f: N: k       nDestPos++;
# ~" A% x, D0 z& W1 P0 l# n6 G1 Q       continue;4 Z+ h1 C3 N9 _; z! {9 g& o
      }6 M- r2 ?" T9 `( i
      pInvSort->MoveItem(i,nDestPos);
, D% P. K$ |7 o: \9 w6 m      g_DPlay.SendMoveItem(0,nSrc,nDestPos);" L8 H( y' W# I" C* ]2 S
      Sleep(5);6 C: K. S4 b: ?: @0 ?7 P4 N+ q
      //Error("移动 - %d->%d",nSrc,nDestPos);
# W2 X9 {2 _& t; p) p1 k+ t) h      nDestPos++;6 S5 G, c- E/ E/ E
     }( D# G* F% @  A" {+ G3 L" H
     //取第一个元素的信息
) S" E2 c+ H, G2 K: j3 D     /*# E+ ~! a4 W5 i
     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
/ H' v% }* z) Y5 b     {. r5 T% u" l# D8 X3 e5 e6 a1 j  o5 N9 y
      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
6 S* U2 q, B% z6 H3 H( w! ]      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);- R+ w; t4 j; m! l
     }2 y% u/ E8 Z5 G, M% T  P, t8 D
     */
1 n4 |7 e0 r0 D8 k    //////////////////////////////////////////////////////////////////////////3 ?; F' J6 C% e' X  h
    break;
+ q8 d! o$ r# B- Q$ P" k2 t   }
4 r3 p" i' T, k3 {. v; s  } 5 |6 d+ T) `% V+ f8 H
}
. W& ~' y, H% _% v( [) n  fm_wndMenu.SetVisible(FALSE);
2 o! Y/ C+ A6 l7 A( e* `" \9 w8 h7 G! g$ {2 D
--------------------------------------------------------------------------------------------------------6 S+ Q! v, W6 @/ K% d) j0 l  Z
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)" U" }. _! L* A2 h6 X" Z
{; t+ q  }. O, H2 E2 o4 q
BaseMouseCursor();
" f: l8 f. ?! g}
6 j3 h* y0 X9 Y, h7 R% i# [, i在其下添加:
' b5 Y5 `; h- W6 G& W3 Ivoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)4 E7 D( h+ W1 ?7 l4 h  C
{
0 `+ |( r* w5 L$ E! i9 Ym_wndMenu.DeleteAllMenu();: R# W0 @% ?, z5 {5 W
m_wndMenu.CreateMenu(this);& t4 V4 d! F3 \4 F9 ^; F# m
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
. @$ Z- T$ j6 a6 B  P
* z6 D- ?, \9 ^! eif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
+ T) B9 l+ N+ v. ?9 |, ^{
: X( h/ u3 Y: e1 l% L+ K  //P以上级别才可以删除所有道具# b1 Z1 e) i/ W- R& f
  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
+ a( r9 i% z1 C( L- H6 S}
( m0 i. g/ j1 M& y) ]" E2 Um_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
& F8 X( ]# Q2 K) Q8 [! g, tm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
) S5 ]# X# Y1 r( ~3 i6 h5 f3 b6 T# ym_wndMenu.SetFocus();
! |5 k# D5 h: R; r}+ t& R; _* ^) N$ _9 R
------------------------------------------------------------------------------------------------------------. y* o3 f3 O' X# R% F# x9 P
*************************
  a* U+ P) G3 r* ]. YWndField.h文件2 k4 ~9 G+ o5 w* y; a3 Y
*************************" z4 _8 }1 G: K/ P, r
搜索:BOOL m_bReport;
) [) I* o5 O( \6 t其后添加:2 r" Q$ r3 ^6 F* x* ?1 u
CWndMenu m_wndMenu;/ k3 U& k! w% L4 {7 I& U
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
9 c+ q. B% R8 j2 r" r4 O其后添加:$ @) g) B3 q) D' T
virtual void OnRButtonUp(UINT nFlags, CPoint point);
% a+ T" H2 }: ^. ]& `5 X+ E; ^& i, H# k' ]

- P: c# _1 r8 [9 c+ G




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