飞飞世界论坛

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

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
. J/ T4 p6 }; H' j/ \3 M9 T搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
9 ]7 X" [4 c( b5 L& `( t1 p: f. [5 t4 N- Y
struct sItem/ m3 F; T( {# [2 h
{
0 M6 V/ U: C3 h+ o$ e' h& q+ m6 y. HDWORD dwId;
4 _* L/ ]3 R/ b. X- YDWORD dwKind2;* E5 n4 f( z3 G7 V% Q
DWORD dwItemId;
# p$ \/ x. s" j/ T: o: JBYTE nIndex;
" `) b/ S% l; U" I: a$ s6 ZsItem(){. [3 P' o% j  _
  dwId = dwKind2 = dwItemId = nIndex = 0;& d2 p7 ~' K5 l7 _
}
% t0 ?7 U4 Z" f" bbool operator < (const sItem p2)
# m- t0 E1 t# N/ E{
7 r5 c# P2 H  f: I  X; V4 @$ N  if (dwKind2 == p2.dwKind2)
% h" @; c9 q& G. d' S+ y1 l  {' k8 |6 `9 A9 z& B" l0 a
   return dwItemId < p2.dwItemId;
; n- ?% Q! t5 x- b- h) i  }else{
3 b" ~, G0 `7 [   return dwKind2 < p2.dwKind2;0 z. `( f* G* r
  }: ]" A  l% `  h0 {# u: H0 w9 _8 s
}& C5 [) G7 d  A8 n* l
};
* P, W% T- w5 `class CInventorySort
$ V' L: g! ]( Q% E+ Q{
, C6 Z8 e/ |) m- p, i+ Hpublic:
  }* L5 j8 m1 k+ e* g% j! s7 U, q. HCInventorySort()5 [) r# m6 p  [& d; v
{% m9 X# J" T/ `/ @1 q& U2 F
  m_dwPos = 0;% q. @+ p, s" M  b" n- r
}& }) }; R, S1 Y* |
~CInventorySort(){}
& e* G& K# |2 G) f, oprivate:* q4 H, e, T/ F4 {
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息: a* |/ P" `6 ]
DWORD m_dwPos;. R6 P) d: V/ u( H3 N) b! N% G
public:5 |* [, x: }8 U( L8 {
void Add(BYTE nIndex)0 p: ?6 p2 K2 k2 `/ g
{
) B/ z, p& {7 L1 l2 t4 U+ z  if (m_dwPos >= MAX_INVENTORY)
- Z3 g# q. q' T5 r1 I& u" K  O3 L  {
9 E. Y8 ^" ]4 l6 B' Z% J   return;
) V; e& B3 T. ?& y" \  }' S  p- m2 H0 D- g; I- h- K
  m_Item[m_dwPos].nIndex = nIndex;3 }9 V" H6 d- l0 D! M  B
  m_Item[m_dwPos].dwId = m_dwPos;
4 @3 ]" p6 R0 [% g  ^3 N: i  m_dwPos++;: ^+ R# A% J7 C+ X7 m0 Y
}# s7 l  A$ o- i; D$ \
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列  _  A. ]( W; Q1 Y2 ?* m7 Z
{, F/ m4 G( K1 n( |1 N. o0 Z/ Z
  for (int i=0;i<MAX_INVENTORY;i++)
* _; M" X( ^6 A+ T4 c" X4 D0 A. l  {
0 [' p- f$ {( ?   if (m_Item.dwId == dwId)
* [  J& i# Z/ ]$ o! [   {
$ w/ T/ ~- X! ^    return m_Item.nIndex;1 U/ @1 Y3 `( j9 S; D0 Y
   }6 k4 f0 Y; T$ m
  }0 j1 K. z) T8 J8 D% b
  return 255;0 l- Y6 a7 j& k, n9 z5 e( g
}2 ]  n, H: t  b
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置( w) @! H/ m* @" A1 O
{5 O% r7 Q+ |; Y4 w* P- g8 F
  BYTE nTmp = 0;6 ~' F% v9 c  j6 L
  bool bDest = false,bSrc = false;2 K+ }. q; _. C
  for (int i=0;i<MAX_INVENTORY;i++)
- ?5 m, z" U4 M8 p2 X* W& s( J. f% ?  {
: K! l( ?% G6 `  L7 `9 e   if (dwSrcId == m_Item.dwId)' @4 j8 ]# A0 ~  s: V0 l
   {
3 Z; z* T% W/ o0 M1 R    //id相等 则 改变对应的dest和src4 P3 y0 a# W  ^9 P. T
    nTmp = m_Item.nIndex;+ E! V1 d/ ~% b
    m_Item.nIndex = dest;0 z8 p6 g! u# c3 R. b  }5 B
   }) ^% H, I7 Q9 o/ s, O0 J
  }
# c- ?! n& t/ f( p! N  G  //临时数据保存完毕,交换开始, E( j$ q( Z& o+ M5 s; b5 ^7 K- {
  for (int i=0;i<MAX_INVENTORY;i++)0 o" J$ H6 f$ P5 s
  {
. |. i5 w$ C( h% e) R) j   if (dest == m_Item.nIndex)0 j' U" u; b& k7 C  H9 c; ]  S
   {
# l2 p& z5 m/ B! i# P+ q) b    //id相等 则 改变对应的dest和src! ]! w3 y; X; o
    m_Item.nIndex = nTmp;5 }, `8 J( f/ B& U( [- B
   }& g& h- s: P. c( g% U; k' j/ r
  }; F( v" Z7 C/ Y. _
}
8 g- r  k! C8 D$ d};+ \/ a. U( x# g! b- ^5 h
-------------------------------------------------------------------------
" G( v. n) x: {2 I3 N: M9 U依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
8 }1 [' r! l' y5 S) a搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);* r; X1 v. j  c: h1 Z- ^9 S
紧靠其上添加:
8 h" i9 N  B- ?8 c8 _. J2 Zif( pWndBase == &m_wndMenu )
9 N$ _" j: x9 ~# F9 d{( J4 t8 K8 t% V/ a0 w; x2 a2 X/ W
  switch( nID )% R7 |0 o4 I1 V
  {) R- Q# R$ I8 K# K$ [
  case 2:- B" @: P1 [& y, B
   {- A: F9 |- @6 \8 y2 u
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
& b: ]7 p( V1 _    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))! K1 `8 l, u% e+ Z# x
    {
8 J2 |6 t- V9 r9 W     break;
8 y' a) L# l) I$ D2 v  D' f    }5 j5 }, c: G5 |  V: ]
    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
# G- j( ]0 Q# U- V. |* ]    {
8 A% |% a* V+ N1 L0 x     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);' m& d7 y( [4 b1 F
     if( !pItemElem )
: s+ x$ L" T3 s      continue;
1 w0 R- l2 r+ p& x  A% t  `     if(pItemElem->GetExtra() > 0)5 ]! r6 H; k2 v. J4 ^% P" r
      continue;# Z1 N4 ^4 U( Q. u$ b, v
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) 7 B* \; o6 N1 w6 F5 L
      continue;; m3 j9 S5 V! f# ?
     if( g_pPlayer->IsUsing( pItemElem ) )2 w5 K6 j$ K. _" H
      continue;
0 Y# Z0 g- `; `* m( L# U& n7 G     if( pItemElem->IsUndestructable() == TRUE )
  [8 x- ]9 J( {; y1 o/ [. b8 ]3 A- @/ u! p     {) X/ p5 k2 v" `& R8 X
      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );$ P& I8 b- J6 P+ L8 ~
      continue;) z: B, c+ |' E+ g
     }
5 J2 [% ^. a% \3 t+ M     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);1 M- J' f8 y, S; q+ R4 Y8 `: ?
    }
, k9 W# a7 d/ Y# t; O! S    break;
8 O* }% W' F% F' Z   }
% C- ]; K" b: W8 A5 e# {+ l  case 1:
, K4 A1 t- D0 g* N$ h   {/ K5 O, Z: e/ T( j2 t8 f! H/ }
    //整理背包
2 S8 z" k. W2 H6 \/ O8 A9 g9 @    //////////////////////////////////////////////////////////////////////////+ Q+ w( u; s2 l" e; A/ [
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
. Z. V) o6 g. A( V    //////////////////////////////////////////////////////////////////////////: _3 J* X8 J. D& @; V' @
    //////////////////////////////////////////////////////////////////////////; h1 K4 O' U* }* c4 @7 x
    CInventorySort* pInvSort = new CInventorySort;
" V9 f) D6 L: P    vector <sItem> vItem;
: M& Q/ G- U9 C2 r- Q- b: z    vItem.resize(MAX_INVENTORY);//初始化大小
& M5 p4 `3 g  x  Y, l     //////////////////////////////////////////////////////////////////////////
! F4 ?) j& ~6 R2 E     //填充数据& G# J  k( b4 f# `
     for (int i=0;i<MAX_INVENTORY;i++)
6 O7 ~" N' i9 B     {
- i$ I4 ?& I. S& B+ x$ s* z      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);0 ~& {' F9 {- t7 O8 w* ?
      if (!pItemElem)9 E) B( u/ [  A
      {
1 W" t$ w7 u, A$ s4 v       vItem.dwKind2 = 0xffffffff;* r1 H( |/ @, Y. d+ R9 ?) C
       vItem.dwItemId = 0xffffffff;
8 |+ |" O5 Z% \" t       vItem.nIndex = i;6 T1 y" y& E' ]. ^2 r' i
      }else {
$ D0 z, F8 u' m2 L  [1 f/ R9 h       ItemProp* pProp = pItemElem->GetProp();  O! T7 ^+ N" K! a
       vItem.dwKind2 = pProp->dwItemKind2;( C' V& p5 A" f- J
       vItem.dwItemId = pItemElem->m_dwItemId;$ `1 N& m# A7 s1 \) n
       vItem.nIndex = i;. o4 N; W. G' L& f7 ~' |9 |* l
      }/ O+ t( V$ p: L% z. ^) r, x3 S$ \
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
5 x3 [3 G. ~5 Q8 @7 h  C- j: w/ M     }
1 z" x' b( I& p2 F' s( q- @- n* r. N     //////////////////////////////////////////////////////////////////////////& s5 C9 Y7 C% x
     sort(vItem.begin(),vItem.end());//排序
& P! i+ I& h6 d     //////////////////////////////////////////////////////////////////////////
! ]3 M: ^$ {( ]. R3 m& E     //交换& {) [- U1 X# v* [/ j$ f
     for (size_t i=0;i<vItem.size();i++)
0 v$ |1 T- ]1 F! r& c* w     {
- ^6 p% X* {- j  T      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);- r+ f+ `1 f' L) J- E1 a) ^
      pInvSort->Add(vItem.nIndex);! i: g6 v% J" [/ I4 z) f( |
     }
3 |* Y5 [- X' [5 j9 ?     BYTE nDestPos = 0;
! }- Y; g) r3 @5 V9 ?+ H% U. y     for (int i=0;i<MAX_INVENTORY;i++)/ o1 g- I0 ^  d7 A, g6 W
     {
- {. ~  W& ]( V6 B      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
! p! k2 I; d( V! G8 s4 @      if (pItemElem)
( k6 {" A6 L7 b# `      {
# k0 }5 H8 O" R, M& ]       if (IsUsingItem(pItemElem))4 H9 k0 ^" `$ f3 c6 \. g
       {2 y3 C$ r$ L- }; x, E/ w- R; h
        //这个位置无法放- g! G. X7 ?0 k
        nDestPos++;. w% C, T& t/ ^+ d
       }: j' N7 p" B8 F) Y
      }
/ y" B: B) @& h' U/ }. X5 n$ i      BYTE nSrc = pInvSort->GetItemSrc(i);1 p, O" j. a5 u/ w2 D5 h& v
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);' s# X2 t2 r8 s3 e: u+ d* J
      if (pItemElem)
/ p  ]# A, X9 g0 P      {. q; l7 N- t& u5 V5 A  @( `0 p. B
       if (IsUsingItem(pItemElem))
4 K+ U  U' B/ f' }       {
' y; Y* W; e( |5 U        //这个道具无法移动,跳过6 q: Z+ i6 e9 H8 N
        continue;  r  V  o& q% q3 v! u
       }
# b7 A  b1 N! C. i/ a      }else{1 X; k( L' I- {+ p6 Z
       //空位置 不用动3 L9 d. W% \& l
       continue;
8 I9 d7 N; p, Y/ {; @      }
5 f$ ?( [7 {" J7 K7 J7 j      //////////////////////////////////////////////////////////////////////////' N/ J1 ~8 L0 H6 C* @$ F
      //开始移动
6 R) i) i* k7 n. g1 s. }      if (nSrc == nDestPos)
+ R' E4 T  f+ _0 }      {. I, N2 `  r' d4 C' n# V( k
       //原地不动
: H8 h3 Q, Q$ s" G7 m       nDestPos++;+ y5 v' u( W/ T8 X8 `
       continue;
. R8 Z( r6 p3 N$ x8 x      }
0 |$ z9 o5 ~( l# j      pInvSort->MoveItem(i,nDestPos);0 N% B: y7 Z9 m4 j# C
      g_DPlay.SendMoveItem(0,nSrc,nDestPos);- i' Z$ b& x- u9 I/ O
      Sleep(5);
* R/ D( @+ z* h, ]- ^3 B  Y1 K      //Error("移动 - %d->%d",nSrc,nDestPos);
- {$ c/ F+ T2 @* c0 P0 K( C+ m      nDestPos++;
: w4 Q! M' C( |2 |+ T: l5 T+ e9 T     }
; i. [3 w% Z9 {8 j7 Q* a     //取第一个元素的信息8 \' x- n4 \& p! l
     /*" h- K; o! ~/ ~: c% D
     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)+ |; }4 n3 P) Y& u2 |6 M+ r
     {  L; S, ~/ g& M" A6 y
      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);7 l" d& Q, `2 `* V/ \* ?% |
      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);/ D* H& C4 `3 A% O& _
     }
8 G; T* e6 U1 g! F! j     */) }' i3 z" L. Q! R
    //////////////////////////////////////////////////////////////////////////! h- @' k; @9 ~( Y& F
    break;
4 D& Y9 M/ K1 u   }; i, h4 _1 E) w* F% T
  }
+ l# p. g, g" ?2 a7 ?" o$ m7 H}- T4 c; q% \9 Y
m_wndMenu.SetVisible(FALSE);
, G/ ]& G5 x- C; v! D; B6 Q
6 f2 @- v$ k( p' D--------------------------------------------------------------------------------------------------------
: n/ k/ q+ C, k8 L. L搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
! n0 e3 w3 B, J& E% l# r{, b; h2 t+ T( i7 C. y9 O( {
BaseMouseCursor();( R* S% [6 z, _0 c& R; C& i, L
}3 R  B/ l/ b& O
在其下添加:
( Q: R$ @5 c6 d/ X  Wvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
8 ^; m- Y7 \$ L. R{
" C5 Q% e% n( Qm_wndMenu.DeleteAllMenu();- u7 K  e! w2 L
m_wndMenu.CreateMenu(this);
, _* \+ @' k1 E8 Gm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");# ~$ I! O6 l3 N  q# V) }) Y
% z$ K; o4 k8 K
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)): Q, X- M( ?. ?/ ]2 N( x: J% R) V# g. U
{$ ~3 r' W: U  B8 T. t, N& q
  //P以上级别才可以删除所有道具
; a( g& l0 ~* o) x* K  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
# `3 E" l& ?  _  Q2 d* H}' {0 T) Q$ J7 K7 u! r
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );. w$ S) J, ]4 w- _* a
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );2 i0 I2 s5 Q7 v$ \  r0 M6 Q
m_wndMenu.SetFocus();
1 G* K5 G! P# L' p5 t}
. P# \* Q! Z0 \------------------------------------------------------------------------------------------------------------4 g& h( ^  n5 u+ x
*************************
! X" _# O( `( SWndField.h文件" D' M, ?& S) j& @" w: O
*************************4 S' e7 b" b0 m" R
搜索:BOOL m_bReport;
/ {* n& Z* m5 T其后添加:5 J' |4 @3 o! B8 N9 R6 H8 s
CWndMenu m_wndMenu;' g  ~5 _5 Z! i1 d# g& e: F1 u
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);/ Y0 G1 p0 I; i) q- Z
其后添加:( M9 W* C( e. I7 I: Z9 a( v
virtual void OnRButtonUp(UINT nFlags, CPoint point);7 E2 n5 G+ ~$ U! \, h5 k
5 i* Y' J& z7 i2 |
- r" q! r" P5 Y  w





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