飞飞世界论坛

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

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件. {9 q9 w: {( L. |1 f
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )6 F6 Q6 J1 Q4 P% o" K* ~& |# }

( `1 p. ~" C8 Q4 Kstruct sItem7 o) a- x, Y0 L
{2 w7 H  T+ T  ^7 ~. \3 }
DWORD dwId;
$ r: k( l( J4 p# [; yDWORD dwKind2;. X! l( m: }; B% X# O- w0 h
DWORD dwItemId;
% i. k% W' F5 [' d; N  g  zBYTE nIndex;
2 B; a+ ~" f: v7 J$ q8 a( lsItem(){
, D/ y$ y& q+ V5 j' c  dwId = dwKind2 = dwItemId = nIndex = 0;8 D9 R0 y5 `# L0 k
}
  @+ z. `7 }, b2 M2 y0 {' ubool operator < (const sItem p2); ^( J- T! {! n2 o. Z* v3 S4 _
{6 ~$ h$ e! T$ ^0 F
  if (dwKind2 == p2.dwKind2)' C! l$ _' x! o" }9 p% a
  {
3 c: L7 p" r; k# L; }   return dwItemId < p2.dwItemId;) S# E% Y( s, _1 Z, L. ?
  }else{
- a1 K4 U8 X) e6 W9 p+ j   return dwKind2 < p2.dwKind2;% a* b+ R6 Q) ], z! t) n1 |) B: S
  }
( ?# c# `( P$ F/ f  E}
$ P  \: R, G# w7 ], S2 U) p1 \};
% z# W" W. A' yclass CInventorySort0 {5 Z4 P: v9 X6 d, Y: r5 P: n" g3 L
{
1 ~- G2 E( J& x" lpublic:: h$ L" z' K, I
CInventorySort()
/ b+ X3 j  D, a" ?$ Q3 i{
8 J2 t* @4 y8 _+ ]  m_dwPos = 0;' a+ e% ?  D; y" \5 L- @0 Y7 O: M
}
/ h8 p8 n" T* o0 o" D3 U~CInventorySort(){}8 q) L8 ^) H  t! m1 l
private:
7 M0 c, V  A4 u6 {7 C. QsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息) Z  W  m- y- |/ X
DWORD m_dwPos;
" i0 l& A$ a* g  upublic:
* a) P1 a$ Z3 bvoid Add(BYTE nIndex)
2 ]; R/ d5 G- U. g{
6 s$ A% l1 a( }. Q/ v+ U: ?8 Q  if (m_dwPos >= MAX_INVENTORY)9 R. N8 C1 a: }: Y; R: ?3 V7 [* K
  {8 d7 @7 @2 R  B( f# {9 [
   return;. T4 M7 a5 E6 d3 N* Y* l
  }
" N% ]5 ]& Q* I% C5 m- R: |  m_Item[m_dwPos].nIndex = nIndex;
7 p/ _9 h, F0 _" b. l  m_Item[m_dwPos].dwId = m_dwPos;! l1 [# ]  f% Z
  m_dwPos++;
' I' o2 M& G. h$ r# H" d4 z& m# e}
0 t: k; c+ w. W% t: p# \9 Y0 sBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列/ D9 w2 d4 B. h# s5 _- [
{
9 z: t; {0 F  R* O, G- @& j. K1 R$ M  for (int i=0;i<MAX_INVENTORY;i++)
, w: ^3 H4 W. {% k9 d  {
7 b2 L1 }' b1 I* \3 {8 {3 n   if (m_Item.dwId == dwId)
! f7 A3 ?8 H; Y* p/ q   {
  D! b2 y6 L3 K7 d# k    return m_Item.nIndex;6 n! [9 |% b8 i3 a
   }
  q) O( [8 G. B! [: g6 W# D+ s  }: y( [  H' c+ l% g9 Q% \
  return 255;
, O2 a& a: H4 q! A; {. b}. g/ a- i5 E$ v# W! D7 V& m9 b
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置, J. ~# H" p- F  A. l- c
{% u* o. V! R- Z+ M4 v. m7 h
  BYTE nTmp = 0;
# y8 [$ Q6 g: o, B4 q* E0 z  bool bDest = false,bSrc = false;( @1 ~5 r6 B3 {2 S" k8 _
  for (int i=0;i<MAX_INVENTORY;i++)
2 z3 e  }# ]2 I* a& U7 V6 U  {( _7 r/ g' V! S3 E8 i' X% u  u4 y
   if (dwSrcId == m_Item.dwId)$ j# Y( X% l* \& Z
   {3 v5 z- d: B+ ^) ]5 `6 Z! M, ?: {
    //id相等 则 改变对应的dest和src
) P( O9 W. e7 y" j  W2 W5 s* Z4 ?    nTmp = m_Item.nIndex;7 y" ]  c+ A; j& f( j6 m/ Z3 Y& |
    m_Item.nIndex = dest;- }! S8 }: T3 w; m  Q
   }
! Q" L+ t3 P6 A3 ^  }
2 h+ n5 ^' b1 ]* [2 u  //临时数据保存完毕,交换开始
" r( y$ n, L/ k9 Z9 ~  for (int i=0;i<MAX_INVENTORY;i++)
1 f' l: w/ o- C  {' X' `  t+ X( H6 f( t3 O$ [
   if (dest == m_Item.nIndex)
% v+ t; \9 i  _! T& J2 t1 @   {
1 M" j  M. w: @% W& G5 j1 D3 k    //id相等 则 改变对应的dest和src
& z8 b& _3 w- b! N4 ~' r& r    m_Item.nIndex = nTmp;8 t( J6 M9 B# b  w- C, H5 c
   }' g8 t5 o8 X0 M) v, G
  }
% M7 ^) ^4 X- \, G$ M}
" T$ u8 ]) F7 s' [+ _+ i- m};; U- f9 X4 h7 l; h1 q; E
-------------------------------------------------------------------------
1 N+ z5 Y& ]# Y) G4 j8 m9 W! ^9 D依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )9 w+ C6 q- `2 B$ n0 e: B- c
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
, ]; p1 i% x- V紧靠其上添加:
. \+ H# W) P: w6 J4 v# }% |! Pif( pWndBase == &m_wndMenu )
; W. v5 c2 \5 ~+ o{! z2 H: E; S9 @4 R) E1 H
  switch( nID )' ?, ]0 K! T: i7 \- C/ J
  {
' P# v4 o. K3 ?2 Z/ p+ _+ I+ F) j  case 2:3 \0 Q' U) j- X
   {0 D& l! r+ K- Q0 v5 c1 z
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
7 m8 D+ d. z" a$ y4 ^+ r    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
1 y& C9 j# m: h; M0 y) ?& v; H    {
) f2 B5 h* |! v9 R% t     break;& B( M& d* a/ i; v
    }
/ p& C; G% W: K0 |; t; s8 A# [    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
9 S6 K; u# m1 f. \( i" T9 L    {
- b1 i' S) }9 @$ m' j" O; V     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
" ^7 ]8 Z! I0 O     if( !pItemElem )/ V  _4 T# t* j* r' O
      continue;
( l! _; E8 @" K1 q; l5 i( k     if(pItemElem->GetExtra() > 0)
3 y. o9 z. n4 P4 X, ?6 g7 {0 h      continue;
0 \, x) Q: \6 f  i1 t2 q     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
6 f  k/ f- {1 L. L! B4 o9 U      continue;
. Z' j: O2 |6 c  U4 H* w     if( g_pPlayer->IsUsing( pItemElem ) )
' |8 E, ?( N  S- h6 z      continue;/ r0 _9 R% @. W6 d5 L. W
     if( pItemElem->IsUndestructable() == TRUE )
! g) t4 ]3 |9 I$ O, J     {
( o( s, C4 d$ o9 T      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );& W3 C* P% o. o; o. c
      continue;' p3 }4 z/ \1 G( L2 S
     }
6 d2 M+ X/ s3 z) D' h- c/ v     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
! N/ K. G2 t+ O    }
9 f5 ^8 Y6 I" o; M) j    break;7 x0 [$ x7 o2 T: ?4 F# q
   }' g% D6 d5 M* O, z) s" m
  case 1:9 {) v7 k$ f% }$ X7 Y
   {; ~2 k, l: G. s
    //整理背包7 `3 T9 O% H' U! @4 N4 v5 {
    //////////////////////////////////////////////////////////////////////////+ d) `% v9 j4 V6 ]% n2 F
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
3 ?+ T5 B7 Z9 o  f0 R    //////////////////////////////////////////////////////////////////////////
/ X5 J6 Q0 x3 B( A- ~    //////////////////////////////////////////////////////////////////////////9 B  Y+ @* Z- ?! S
    CInventorySort* pInvSort = new CInventorySort;
& g4 d% q) q/ K% a/ p1 v    vector <sItem> vItem;* m0 S9 D7 I7 p0 {# Y& R5 i0 g
    vItem.resize(MAX_INVENTORY);//初始化大小, |6 ^# a" L2 j6 s0 r3 K4 U% _
     //////////////////////////////////////////////////////////////////////////
0 Q: U$ \7 C# q. V3 Z     //填充数据
4 j  ^- k+ F1 m# [8 d9 ~4 `- g     for (int i=0;i<MAX_INVENTORY;i++)
8 Z9 B3 Z, n4 E     {  i5 C2 x' `  ^3 B# d
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);2 @  V# c2 O2 f- `
      if (!pItemElem)
  r% i7 w6 X% M0 _- a      {! V& T, j# |7 y7 [
       vItem.dwKind2 = 0xffffffff;' r! R& }! A2 ~. C  N/ O
       vItem.dwItemId = 0xffffffff;
8 N  r$ v; |. X9 ]0 B& B; v       vItem.nIndex = i;- U  Z' v" }# S
      }else {
! D. i! l& r- D2 y, l, N; }       ItemProp* pProp = pItemElem->GetProp();
& q( M$ N$ I  Q1 b7 a( d3 k       vItem.dwKind2 = pProp->dwItemKind2;6 r& e8 D8 n, W( M
       vItem.dwItemId = pItemElem->m_dwItemId;
2 Y, F6 I; I: c8 C" [       vItem.nIndex = i;
6 L+ U# [2 \; [0 g3 A9 ]( j      }
' M- u3 z( j. F* F/ d      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
3 y" T2 L7 p3 M" W$ m4 k  Q     }5 M& \" b& C; |0 B8 D2 U) i) S
     //////////////////////////////////////////////////////////////////////////
: a# p4 L+ w* ]% _  Q  K% O6 ~% G4 Z     sort(vItem.begin(),vItem.end());//排序
7 r( o! p- R6 o- }0 P9 `     //////////////////////////////////////////////////////////////////////////$ k1 I  H" t; E* Y
     //交换. t: l* n' S( q$ S& Z: r4 @2 @
     for (size_t i=0;i<vItem.size();i++)
4 H) t$ L8 x' h% P     {
! K. x9 L, I7 i& o" Q      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);! z) v% l- c# g- j
      pInvSort->Add(vItem.nIndex);
1 I9 r8 Z( m: }% K     }
  P6 ^2 E+ u6 G2 R( k; Y     BYTE nDestPos = 0;
/ u3 ?2 z: k7 |; l0 F     for (int i=0;i<MAX_INVENTORY;i++)1 l. P' f& g4 ^. K
     {5 |. H7 ~* {8 L$ ~7 \
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
, [1 G' N9 i& R' s) |& P      if (pItemElem)
9 U) D3 K- T$ I* j$ B3 C      {
2 K0 l& E9 i% ]% S' T       if (IsUsingItem(pItemElem))
6 y1 F  b, [) h1 y( f5 T: H       {
% m& A3 b5 N2 \6 A+ ~) G        //这个位置无法放, K" f+ ]8 \/ [" [  E
        nDestPos++;
6 Q2 ?( C9 F& O* P: x, b* L       }
, C- e( z/ B1 [! Z0 R      }
1 J! n, o  y8 }  o7 b, b      BYTE nSrc = pInvSort->GetItemSrc(i);
6 q+ d9 N' D# C0 Y6 [% }& V      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);3 g; `3 ~; d3 w
      if (pItemElem)
& f% Q: A' Z. X: J/ Z      {, ^5 `2 S3 C  I! ^
       if (IsUsingItem(pItemElem))
6 |7 T+ H1 }' v0 d; [       {
& W( e+ G' J2 r; u) @4 I, y2 ?; z* G        //这个道具无法移动,跳过
+ Y1 \1 }0 S" i7 w! H        continue;% q% a/ i& Z, r! s  D
       }
- _" U6 j/ B  f# C- r  `$ h      }else{
( M  g8 m4 v) s* ^5 S8 v       //空位置 不用动
' X* Q+ K0 w! K) `. X( }# c       continue;7 T& K& @  D+ Y) r. t5 y: u5 T5 o
      }- x6 f) ?5 o' k  N
      //////////////////////////////////////////////////////////////////////////8 ]) \6 |4 l* V8 x( ]3 ~
      //开始移动3 l4 {& I, d7 C4 g% |2 W- u8 T
      if (nSrc == nDestPos)& j) V8 F% E; Z! ]4 Y) p7 z  V* F. T, i
      {8 E: u0 E% y! W3 _
       //原地不动
$ @- v; [. Q8 ]  k3 l- W" }       nDestPos++;" o! h. l4 v' G- n# _( z
       continue;- ^' L& N5 w' a; v4 _1 N7 L2 J
      }
3 \/ R/ e6 q( h6 {) w+ @1 Q! D      pInvSort->MoveItem(i,nDestPos);  W% c" R# ~6 Y9 S3 l8 {
      g_DPlay.SendMoveItem(0,nSrc,nDestPos);. @  k6 ^; p4 \9 t& I4 @$ R) y" v
      Sleep(5);
7 \  p5 R$ R: F5 f+ A/ m      //Error("移动 - %d->%d",nSrc,nDestPos);, D' {& b" K1 b" B/ U
      nDestPos++;' {: E: G; z6 ]2 A; w7 z; l
     }
9 p& n$ @, X* a) e! V& j7 p; o, ?; D     //取第一个元素的信息. d+ k$ ^% z/ t$ Y  k" l
     /*+ x. h6 \' x; V( q% G
     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
: E! t1 c$ C. x7 M' {5 p% O     {
( K9 O. v3 I: N      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);7 X/ T) m. x3 J0 C5 a* N
      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
7 ~  R3 S* o1 r( u7 u7 ~     }3 U. @: G% [( E8 r& y
     */! K: A' f" E0 Q* m2 ?& U% C
    //////////////////////////////////////////////////////////////////////////
. O* ?* L* G; c( G- ^6 m    break;. T: f  }$ C+ {- b
   }% p2 M8 v  ?% r/ T, I3 O
  }
1 K) E# Q1 W  u" X+ x( {}, a- Y/ q' f: I! `8 g
m_wndMenu.SetVisible(FALSE);
. N1 _) T1 v6 L8 r6 g) u. _  ?9 w+ b* i4 f5 a+ W; K- ?
--------------------------------------------------------------------------------------------------------
+ ~! S- P5 K/ H& B/ N搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)  t& D' T) X  g, U5 b( p, V& z
{8 Y" P5 Q: x2 Q1 A$ q
BaseMouseCursor();3 A0 X: p7 n& i/ m
}9 o7 Y  i/ B, G. i
在其下添加:
) N' @1 x! }' `( `+ nvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point), K" s0 g3 C5 [; X3 ^
{
1 M% F$ d' ~* Y! e0 @- j' Sm_wndMenu.DeleteAllMenu();
1 M2 X. y' o. h. s' x6 b5 r* om_wndMenu.CreateMenu(this);% l) B% X6 M4 q9 n& b8 X5 e
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
% d0 N) l$ l3 _. ^
: g+ b8 e- x, c) X" rif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
* m2 b% j5 E% L$ ?{
2 A4 {6 u5 |% c6 `& j0 k: w  //P以上级别才可以删除所有道具& O" q8 P, O8 W: b0 K9 A: f% |
  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");0 m# ]: W: q3 t5 d7 f1 n0 W6 X
}" ~& Y* v+ E' O
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
7 W8 T+ R8 I. C9 lm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
# f" p+ |; c: e  d7 g+ um_wndMenu.SetFocus();4 q" t% h5 R( c+ p1 L! _
}
# x( u' l  ?* `( u* ^9 k------------------------------------------------------------------------------------------------------------! x2 n, z& z$ f: _& V8 {
*************************
( Y9 J! P; q% J( s* mWndField.h文件
# [' |# L) o8 r8 R, j1 C. ?*************************
* Q! i8 W4 ~( h# M搜索:BOOL m_bReport;7 A: T7 I1 B! D" C" T7 j- z
其后添加:
1 ?, J! G7 K9 G) FCWndMenu m_wndMenu;: n5 s7 u, _4 f7 A1 y. W4 D! W5 R2 v
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);) e" k+ `0 f" m3 k& N) G3 k
其后添加:
. [+ p) n. ]* Z. l. D( Bvirtual void OnRButtonUp(UINT nFlags, CPoint point);
! z0 T  o5 U5 _+ l3 J! L/ U0 k3 Z  l+ ~3 F" F1 N
( h! I9 G( a* U8 q0 j





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