飞飞世界论坛

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

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
7 r% R$ j8 O1 H# Y搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )! r0 _5 U3 j  a. Q$ f
& p" w* Z' a7 ~) f7 z  t. N: Y
struct sItem, g- U: E0 W7 {
{2 U0 v" Q. Z' V0 X
DWORD dwId;, h# A; A5 u, \" W7 D0 j, t
DWORD dwKind2;7 q( ?  `0 b9 S. a' T3 t; y, z
DWORD dwItemId;: U8 ^  F# `) E
BYTE nIndex;% E' v# c* X/ x# r
sItem(){
2 P; `6 N2 |/ N4 g: L  dwId = dwKind2 = dwItemId = nIndex = 0;" U$ N) G2 T# j  @$ @; ~
}
' u4 ]& l6 `& G, P7 W9 ~  |bool operator < (const sItem p2)4 i6 H2 F3 m9 ?' Y9 T$ r9 D
{7 J8 z/ u5 ~8 v, O0 y/ Z8 u* h* g
  if (dwKind2 == p2.dwKind2)4 k- p/ Y. U, c6 ]1 ?9 J4 \* r' x
  {
2 ]3 t9 M, f8 v   return dwItemId < p2.dwItemId;
. J2 U, i" w( |6 G( M! @  }else{, y, c! F$ M% J% B
   return dwKind2 < p2.dwKind2;
1 {3 N$ z$ B- E; y  }( q! @0 i4 P/ T, n5 N4 y$ a
}  i+ c: t9 K8 h* s- Z/ V
};; C% S: `" Y. j
class CInventorySort
2 h- |/ I7 D! t# P* I{
6 N3 i, K- O/ g" ~public:
; z0 B1 g8 Y$ yCInventorySort()2 X8 h" ^7 }8 Z, O7 c# u
{! F6 I3 @  x: v  T& Z& M
  m_dwPos = 0;
) Z: H3 s+ A9 x( a" Q}
1 E' [$ V' b9 B$ T% w& I+ S# D8 U4 I~CInventorySort(){}% N5 t5 K/ j% u
private:& t$ Z/ q( a% Q3 B" F; `% F6 N
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息; ]1 O. S. K6 E9 S' y4 a  O0 P
DWORD m_dwPos;! x: Q( O2 K" F  ^. Q$ [3 C
public:
% a. `. ~& e  R. v2 n! S! }void Add(BYTE nIndex)
: o% u9 I+ w- ]4 q4 k{3 w3 p, J% Z* b, F
  if (m_dwPos >= MAX_INVENTORY)" l7 A  o- M* Q& B  d- Q
  {
9 q2 S5 ~8 A' H. v) u   return;2 S$ h0 X: V. Z+ R5 {, g: p3 Q# x
  }8 x+ I( ~4 D( g; Y# B2 ~1 Q
  m_Item[m_dwPos].nIndex = nIndex;5 k: n  b  V5 P
  m_Item[m_dwPos].dwId = m_dwPos;
/ T& m% I0 B( a* t+ u  m_dwPos++;
4 [+ T7 G' A; x. k' D: A}
5 M, n/ H6 b9 O' v% YBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列  j6 B0 @& h; P8 I4 S4 n
{
' H1 g3 M$ F- G1 ?5 j# o6 j+ I  for (int i=0;i<MAX_INVENTORY;i++)2 ~2 S0 C: D7 Z) ]3 o' j4 m5 N& [
  {1 H! d1 u2 e$ D9 q2 l6 [
   if (m_Item.dwId == dwId), E5 `( j: r  g2 c5 x3 G* a
   {, I4 a1 g; E. A8 N2 D1 [/ R
    return m_Item.nIndex;
* j0 J7 d* m- z+ q$ n   }
6 ]  _1 r# K" a( L2 C  }
0 D# n4 T- L1 V) |) R+ e* s9 H; D' K  return 255;, |+ V4 l( e7 u! A# h5 L& ^2 k% F, m
}
: j2 e# U7 A7 |7 t1 l+ d7 Hvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
' e; b* c( P' X, ^0 W( o5 W{
: U$ z- n' q% j  BYTE nTmp = 0;
  {8 v* t5 J/ [% }& B  bool bDest = false,bSrc = false;% y8 `. R5 y# R! t# m7 u. W
  for (int i=0;i<MAX_INVENTORY;i++)
( i! H' l5 g; b$ e  {% L3 c- n' M8 U. H( j
   if (dwSrcId == m_Item.dwId)
3 S4 P0 z* z3 b! Q: ]) B   {
4 O, ^$ H6 U; [) ]    //id相等 则 改变对应的dest和src& g1 V7 K: [* k3 ~+ j2 T6 k2 Z! G
    nTmp = m_Item.nIndex;1 J; M& V# @5 f0 \! S9 E* ]
    m_Item.nIndex = dest;
! R" k3 J8 r; H   }8 p! \/ j5 d- a- E! U" @
  }: G9 T( c3 x+ p/ k% S9 X7 z% @
  //临时数据保存完毕,交换开始
5 d5 |) F1 P7 R5 |0 L. ]2 f  for (int i=0;i<MAX_INVENTORY;i++)% }3 ]- g1 K+ A) O4 W, v& j- \1 w
  {
8 g" ^9 C) r! L   if (dest == m_Item.nIndex)
- v, m  h) X/ b' P4 _: J/ }   {, l" g# S7 f0 w8 E) k9 n
    //id相等 则 改变对应的dest和src+ n7 V! \9 J! {
    m_Item.nIndex = nTmp;
9 }( H9 G: h2 k% O/ ?" P3 m. @   }" H; `' z$ ?( g  S) _. b
  }
+ B2 I: ]2 V$ n. f0 @}7 D2 ]. g; I! f/ j! j' E$ a) K# p
};
1 M; q- n* O- [' ]-------------------------------------------------------------------------: \6 Z- k" F. Z6 i5 w! \, P3 y
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ): _6 z$ \, [2 V: R$ K
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);! I( f" ]5 P# o! m) J
紧靠其上添加:
: A2 m. r) L! \6 F% Mif( pWndBase == &m_wndMenu )
3 V9 Q% i& x  ^. B$ s{+ b- N! `3 Q0 J- E
  switch( nID )1 r) i1 G- i$ P  u9 t2 y
  {
* l2 }% i1 S$ E- A9 u  case 2:
9 _; i6 d" C2 m' t/ }   {  m9 L. K: z7 t& U
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
+ S. P3 D& I" O% X7 z7 h# Q. i    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
  C+ ?( z# F- `8 ^    {
, U  L3 G) F& t     break;/ g% X# |# c! }* m# r
    }
" O6 z+ b* T. F( O& J/ c5 S    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)6 t  ]! s# M" X% A7 u. L) ^+ _+ \
    {/ s  d6 d! ?2 T5 ~6 q
     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);# B% `. N( x+ \! f( S, a
     if( !pItemElem )
" ]: d! r. n3 ^- q      continue;
! r6 U5 H6 C8 ^- e/ Y     if(pItemElem->GetExtra() > 0): w: i# q+ {% u& ?/ R% [
      continue;
- A4 N' r& v6 O: }, R' u$ v* n/ F. Q8 W     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )   B9 v( A. H- k$ T* ^/ _
      continue;
, v) Q3 ^& ~! `     if( g_pPlayer->IsUsing( pItemElem ) )0 S$ m- q" i7 Z5 C: ^2 Q: N; l% L4 s$ a
      continue;
; q+ V3 A6 a! m     if( pItemElem->IsUndestructable() == TRUE ). r7 `6 r' K: o
     {, ~& t  K, X8 \4 ?) p: d
      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
/ g; ]8 t" D  K' }: ]      continue;
6 A: U( b/ ]& U4 S5 W; j6 o     }( W$ U/ f( q2 j" c: [0 Y3 N5 p
     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
- K, e* o" Q+ `" N8 {0 F    }
$ ]+ E  T' S8 l# K    break;
$ G) R- S! [2 y0 H   }
/ ]$ S& e. O4 s# ?% X9 t  case 1:
: `; a) j8 F; n) x   {
+ s' R5 ~/ N3 I5 n, M. k    //整理背包0 N2 S4 l2 J! H% A  c0 K
    //////////////////////////////////////////////////////////////////////////' X2 t' t/ Y5 a% x; r0 R
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );. ?( {& N+ Y+ G& {/ L8 [" J) e
    //////////////////////////////////////////////////////////////////////////& i/ r6 E: y' G% O4 o
    //////////////////////////////////////////////////////////////////////////4 n! L+ Z$ S, @
    CInventorySort* pInvSort = new CInventorySort;7 K, U. i7 c- M% g8 ~
    vector <sItem> vItem;
- n. f1 x# |! [4 f, I    vItem.resize(MAX_INVENTORY);//初始化大小
/ ?/ a& @* F( b     //////////////////////////////////////////////////////////////////////////# c4 \, Z/ @& Q8 S: _6 ?
     //填充数据
; l6 G# j  r7 C6 q, i) A     for (int i=0;i<MAX_INVENTORY;i++)
4 s( W1 `, y- Q     {
8 g4 a& S, p" M      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
2 V% l2 e. r3 A: x- j4 i      if (!pItemElem)
# D: e) C3 d/ v6 y, r) s      {
7 t, z) U% o" G0 Z9 B+ M       vItem.dwKind2 = 0xffffffff;
! r& O) {& t; U/ j       vItem.dwItemId = 0xffffffff;* P( x* q$ `$ L; A/ j% l
       vItem.nIndex = i;
/ U" }7 v& _, ?! O# X( k4 S      }else {
4 g' S2 A. j- Y% l9 E% t       ItemProp* pProp = pItemElem->GetProp();4 k* W. m1 x8 f
       vItem.dwKind2 = pProp->dwItemKind2;+ s2 r& ]6 y" S' `: n
       vItem.dwItemId = pItemElem->m_dwItemId;, ?- @' K3 m% I  H; j9 w0 \
       vItem.nIndex = i;
. k) R6 X& b! q+ I" W; C      }+ p  [) z% w$ A# D
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);$ P6 ?9 o0 Y, P! l2 B5 T5 ^# A
     }
- T& Y% S! D, i$ W7 X. d  h* ?. O     //////////////////////////////////////////////////////////////////////////
: u2 S" q+ S7 k     sort(vItem.begin(),vItem.end());//排序# H- o# H& \. N; e9 G) v/ n, _
     //////////////////////////////////////////////////////////////////////////
# B3 R1 H* R2 y# h5 l     //交换; r- @8 z* T% M" |2 A8 C+ I
     for (size_t i=0;i<vItem.size();i++)/ v! I  k$ M3 D, O  `# i2 H8 g
     {  g8 X4 @& P# j* x
      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
. v* z9 ~$ q) v3 J      pInvSort->Add(vItem.nIndex);
8 U6 D0 v" _  J" J     }
; }) d5 x  K7 O/ d     BYTE nDestPos = 0;
$ Z# z1 v: S  N/ L& N- O: S     for (int i=0;i<MAX_INVENTORY;i++)
# q/ U$ N! d. O# \& c( `& q     {$ L6 _0 R2 t6 H
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);. t9 ~' h4 P# R( `
      if (pItemElem)" k% E) v& [4 o
      {
* `& Q% v  s  J' a0 t* E, K  L       if (IsUsingItem(pItemElem))5 s7 n- S2 m4 J# g- ^3 v
       {
$ [# ^' H+ J6 z- q; q4 k        //这个位置无法放. ]8 \! C% f# E5 U" O
        nDestPos++;
9 X9 R/ R1 t2 }; a  e! L8 h       }9 B8 g4 H5 S- D& \7 T2 c% v
      }" w2 r" ]" K$ F1 V' Y
      BYTE nSrc = pInvSort->GetItemSrc(i);2 m$ L/ P  K) I# U
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);" y* b7 T- g8 G: N, I4 o+ p
      if (pItemElem); @2 W/ t" ^5 Y9 R+ D2 q, D, q
      {
0 O" F1 w: G3 _+ [. _% X5 ~  ?       if (IsUsingItem(pItemElem))& h; N+ h/ m$ x! g' y1 r: @
       {
; c) U6 I' I" P, D& a( V" X4 G) l        //这个道具无法移动,跳过
0 @8 O4 ^; e+ v( O$ W) i        continue;
* [4 v% ?3 J- Q' A7 w2 _       }
% s7 H$ Y  a- i* s: A      }else{, I/ C% J: C( p* P5 G, a# O
       //空位置 不用动
3 p+ i* ~, }( S8 x3 Z( @2 ~  K       continue;7 X$ B& @8 Q9 p0 _# y) g# K( p8 I
      }
2 e  A! B# d* O% V, t! T0 Q      /////////////////////////////////////////////////////////////////////////// P! G, f' S( o+ ~) q2 z
      //开始移动
% F* g! d# [$ i. C3 e' K      if (nSrc == nDestPos)
8 L# L* l- X6 @9 O" J/ o6 A      {8 o6 H" g7 l7 n1 b
       //原地不动
: S+ L2 E: D, L. W. n  r& j: s       nDestPos++;
, d0 m5 `+ b1 ~5 G       continue;) u# V% F& A# r* ~
      }" _% g, C% G1 f
      pInvSort->MoveItem(i,nDestPos);
& \: p3 F  C  q2 {2 D      g_DPlay.SendMoveItem(0,nSrc,nDestPos);
% |5 |# V! b3 R. d( C# @$ g) h0 F9 y      Sleep(5);
* V) _. i& e% ?      //Error("移动 - %d->%d",nSrc,nDestPos);
/ Z) {. _6 M  _5 _5 C' `/ }) s/ x9 ]5 d      nDestPos++;
- O2 D1 C8 Z9 j2 _, z8 M5 v     }
. K8 g  \) k. z- d     //取第一个元素的信息3 V; U: F9 [! T. z0 u- f! j- r
     /*  Q4 \& Z1 o& |' ?! H; b+ v3 ]
     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)) l7 ?$ t: x$ W& n: y" N" \) t, B/ q
     {
! ^7 V" n9 H3 N: F7 j      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
8 ^3 _. c( y& T6 S/ u& F      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
( D, N$ Z0 d- M% a$ u8 b1 T7 R# c     }
+ l7 l2 ]) A, B! U7 n     */
* }- q3 C; i+ e9 D    //////////////////////////////////////////////////////////////////////////6 g% z3 }# A* F4 w- ^: h" |  O
    break;! w, `8 p8 ?& u: D& L; x! W. d
   }
+ a( [/ C; S7 @  } ! y. w8 ?; H7 t' j, _
}; B3 I  ~# l1 ]+ U
m_wndMenu.SetVisible(FALSE);' ^% e) f8 m  A

2 [/ i0 g5 j3 R* o0 r1 Y+ }--------------------------------------------------------------------------------------------------------/ L$ L: ~* m' ]; e  a) p' L
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)$ B+ u/ Z& e+ |# _; C* G( E/ F
{
1 _. \9 ^1 K; F1 fBaseMouseCursor();! L' g- T- t1 D
}' e7 E  a# H1 ^3 K: o
在其下添加:
# V0 E# l* K9 M2 m' _8 _& ~3 T2 D/ B( wvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)- J" {" A, \# Z1 P
{, v0 m0 Y# z. w; d
m_wndMenu.DeleteAllMenu();8 q. F2 G+ f4 r/ j' u4 d' F2 K
m_wndMenu.CreateMenu(this);
( f( H2 l1 N, S% sm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");  k/ y; R& d4 B8 k3 ^* W; p

7 {) x0 o% `7 b4 W* bif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))$ [, l; C: l( u
{
0 p. X: [/ P4 @5 l  //P以上级别才可以删除所有道具) @$ d& B. W+ T' C' T8 O
  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
1 d- K& E' b! d6 Z) U6 w7 e}* H+ g' ~2 n7 P  I! `# z5 m
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );/ A6 M/ r% f( z
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );" I: Z5 `% Q- c* z
m_wndMenu.SetFocus();; y( a/ p5 Q9 Q: D) `; F- E2 k" I5 W
}9 Q% _4 J5 a$ {& B
------------------------------------------------------------------------------------------------------------
  A6 |) `# h/ i3 ~1 V1 `*************************: L5 |) }* W0 A4 \
WndField.h文件& A6 X2 J( b! g9 [# R: `& _
*************************
$ H& F7 c- ]7 y. o1 S/ S( T+ @搜索:BOOL m_bReport;
5 N5 D7 T! T2 i( w1 [" ~其后添加:( ?% R' T. g6 |. F0 o! J( t
CWndMenu m_wndMenu;* @; W* X9 ]. \- K* Z# n/ V
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);7 S; Y  H" T2 V4 {8 X5 `
其后添加:
' Y; q8 U0 [0 \. F) b( rvirtual void OnRButtonUp(UINT nFlags, CPoint point);
7 y. Y7 B, w7 b  f- u5 ^0 m7 |; @4 l/ L4 v" {' q, |  q
+ {6 A, V  H" m9 q% G) f" X





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