飞飞世界论坛

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

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件4 H6 Y/ J0 C( W* b5 c( n* z: F' R
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
* h/ H; d$ h& e7 R
4 \% t* }$ n/ _* e8 T7 Wstruct sItem
" W1 @* y( x2 x8 ^( _6 t{
- m7 ^. e6 E3 l5 N5 F- U2 e' Y. ?  K( w- YDWORD dwId;, g1 @! G: V/ h. J/ q
DWORD dwKind2;
' s, `+ }* D. I6 n7 m- jDWORD dwItemId;
* c, w' G6 Q; d- WBYTE nIndex;0 m6 c8 E8 h7 N6 p( B
sItem(){' [1 H# ^, S7 v4 U% }- I3 X; ]6 @- G
  dwId = dwKind2 = dwItemId = nIndex = 0;" W" C' e2 t! C# l+ P8 q
}
% G9 p5 p( [2 r1 w# {& tbool operator < (const sItem p2)
6 d8 A- }3 e! a- G( m; b{  z8 c7 ]. ~) G9 g; K7 [3 H
  if (dwKind2 == p2.dwKind2)$ ~, r9 P" q) P2 {7 a
  {: Q; M, Y1 B# I6 F
   return dwItemId < p2.dwItemId;  H; `$ \. w% F) \, X
  }else{5 X" R; w) s5 w9 `9 n3 E/ h
   return dwKind2 < p2.dwKind2;
' x* [" K3 n6 q9 R* x( L  }- j# B. ~2 ?/ L7 t( ]' {. U
}
+ p- q% J+ s& n0 \};
9 R5 X% ^9 L+ n4 ?4 Fclass CInventorySort) T& c) a0 b; i. \# v- T
{6 U7 S1 @% f5 l7 U, h
public:3 W4 _/ b1 P- }2 v: F  L0 |$ n
CInventorySort()# H1 W/ {  E; U) |. F
{
  n, m- h/ a8 ?3 o  m_dwPos = 0;3 I$ R* m( Y! t: M. P8 j2 o) H
}
- ^- y* L) n, m! ?~CInventorySort(){}. P' T. {  [; z8 R$ E7 O! R1 _
private:
2 W- P1 I/ v$ N4 {+ `" TsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
  p& y7 T9 o- W; YDWORD m_dwPos;! d' q3 F: |  x7 ]9 C
public:: I0 j5 Z; T) B
void Add(BYTE nIndex)+ v; p' n2 l1 n1 Q3 i- b* u+ \1 }8 e- z
{
. G( g5 ]8 n. C1 B2 R. @% m  if (m_dwPos >= MAX_INVENTORY)
, V: f8 N; w+ A1 s. d4 B* N  {6 a6 d3 `  I' Q4 |6 z/ ?3 r7 K
   return;
5 _# W: V" L) g) ?& F  }( o, A* a$ h; `0 ^; ]
  m_Item[m_dwPos].nIndex = nIndex;
8 N2 Y8 b/ I8 }+ W: L0 L" r% d  i  m_Item[m_dwPos].dwId = m_dwPos;
# K8 v: I- ?# D$ R  m_dwPos++;8 J6 O; A  m) C' a, |* C
}( W, s: G9 f/ o. }0 h
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列2 X2 B. @1 N, w. @& ?6 Y7 h
{
9 i2 T1 I  s6 a5 o! W8 d  for (int i=0;i<MAX_INVENTORY;i++)
- f+ y# q2 k9 Z  {* g0 V! {4 ?- |; Q9 I/ O
   if (m_Item.dwId == dwId)
9 H6 U9 a" w! u, e) ?   {
" h: z& E( @: C0 ~2 |6 W    return m_Item.nIndex;- Q+ a+ [2 [; f2 ^
   }5 P! C+ o; T' D0 H; Z2 E. z+ i
  }8 a8 B. X! p3 R( Z; l+ B, B- M
  return 255;
) p! Y: @" F# F0 {, w# T}* s& r% k! w0 }! ?
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
9 E( r% ]: m* _  A" o( ], A6 y{
1 n3 ]" K+ j3 |) A0 G  BYTE nTmp = 0;  C, E2 @: k3 c0 t" u6 k6 u
  bool bDest = false,bSrc = false;
: f! X( K/ i% w, r5 J  L  for (int i=0;i<MAX_INVENTORY;i++)
" ]; R) z7 H, K  g1 q& X  {# O, \6 G+ p- e
   if (dwSrcId == m_Item.dwId)
* [6 C0 Z9 @  a  A# r; V   {! L1 X9 a  y& Y) V, [
    //id相等 则 改变对应的dest和src
8 @0 T$ w( W( j' o: R* V8 b    nTmp = m_Item.nIndex;  ?' @* o( y5 p6 U- W6 {+ I
    m_Item.nIndex = dest;
  x# ^( [% \& H' b   }
6 ^  U5 |8 t  V* c- l  }" O" F: f* }5 f* r
  //临时数据保存完毕,交换开始7 @9 l. c% J* F# L
  for (int i=0;i<MAX_INVENTORY;i++)
5 e& T9 t3 Z+ A! c9 [% |  {, D: s9 |$ s, d
   if (dest == m_Item.nIndex)7 ]! o% u# O4 v
   {8 w/ ~0 R/ N- y& `: `4 t
    //id相等 则 改变对应的dest和src, h+ n) M( m0 m* h9 }
    m_Item.nIndex = nTmp;
$ w/ a+ R7 J+ d* C  M9 ?4 r7 N   }
$ o) C5 D- u$ n5 V  }
+ x/ W/ X; S! j+ H}/ y: v8 w+ j+ z  c& K# i( H! D4 a
};
/ F; P$ P( V$ J# V-------------------------------------------------------------------------
% ]0 s- h% P7 ]& r0 ]; k* g依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
9 x5 M) t% B3 f$ }3 U搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);+ }# i  D/ O# ]7 h9 d
紧靠其上添加:
+ B0 d  J- [+ k; k# eif( pWndBase == &m_wndMenu )( Q. J/ D! D& d$ C3 B6 i
{
" s0 e1 X$ k% \4 n' K  switch( nID )
; ?! J8 A! `2 [6 y# @" i7 z  {
3 _. A2 k: R+ G8 Y2 k8 F0 O  case 2:
9 Q6 o- r% P8 q( X0 g   {, X5 H5 I6 u8 n
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);! r4 z* ?6 d4 O* v3 v# d; z2 g
    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))& j/ I0 J: S: }1 h5 [: [* T' \' w9 O
    {
5 Q( [& b4 c5 g# u' ^# o     break;
7 P: q0 M# m% G8 {* W, \$ ]    }
1 f& s0 D# t) X8 {0 |2 D    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)# T% K# j  G5 R; ^
    {+ P/ T% L% p/ i: p
     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
5 T! d/ b3 n% s  k8 R' l; S, S: u     if( !pItemElem )
3 H+ {: w  |* q8 B8 M* Q( W      continue;
6 i4 j( B+ n. O: p' C" o     if(pItemElem->GetExtra() > 0)
, N+ }5 K* M! Q3 w      continue;# }# ~. S  u) w" z
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
+ T  K6 p- v  f; ~      continue;
: n! Z  F* w5 I     if( g_pPlayer->IsUsing( pItemElem ) )2 [1 C  Q% }) m0 p) i: R
      continue;- t$ y, c) X& z' O* ]
     if( pItemElem->IsUndestructable() == TRUE ). c4 J$ |. P1 T0 p( P
     {' W4 P- n4 d5 C- ~* ?
      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );* j* B6 P0 n3 z4 S/ i$ p4 s! J
      continue;! a; W0 D# Y% q, P$ ?" I/ x! F, G
     }+ b# Y6 |" \7 v( }8 v" ]
     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
) g, D& C  U4 v' Q( K' {, k( C    }
/ Y. F0 u# V6 ^* k    break;
7 T! b: m6 {7 S6 j( ~3 ?5 m   }6 y3 v! V& \  q+ J
  case 1:4 F( D, A+ R2 W$ O( X3 n
   {  ], n8 u9 j8 N- J) N
    //整理背包( G7 m% H3 P: @
    //////////////////////////////////////////////////////////////////////////+ i" p2 ~- s4 g9 B
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );( y% F0 L, v" h7 c, L
    //////////////////////////////////////////////////////////////////////////
' i- C6 E5 B  M6 x$ l5 Z! ^    //////////////////////////////////////////////////////////////////////////
6 j& O4 n6 L# D4 @    CInventorySort* pInvSort = new CInventorySort;( X+ f0 `$ W. N2 S( b7 M/ K9 x
    vector <sItem> vItem;! ?3 W, i5 M8 @! r, }7 S
    vItem.resize(MAX_INVENTORY);//初始化大小: o1 L2 D) h0 {
     //////////////////////////////////////////////////////////////////////////
( o# y6 B& d/ R" m1 W. W     //填充数据4 ?2 a( S7 X  J4 H3 Z7 [' @, Y
     for (int i=0;i<MAX_INVENTORY;i++)& m2 a' U  V9 v( H. W) z; o
     {/ L; k$ q' q; V1 f! a; I* w
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);/ ?" M4 B  {6 }0 E0 A
      if (!pItemElem)
) T' [& R5 T% b+ b      {
. M# N5 ?  V  \5 }! Z       vItem.dwKind2 = 0xffffffff;  x2 H* _) Q' z6 x' ~
       vItem.dwItemId = 0xffffffff;1 u( v% c- U2 s
       vItem.nIndex = i;
. v% O2 l% I- z: S% l      }else {
4 l. ^& J7 a9 G9 F9 m4 x       ItemProp* pProp = pItemElem->GetProp();0 O# b7 A; T) r3 ^+ G
       vItem.dwKind2 = pProp->dwItemKind2;
) H. I- h1 F2 X9 ]! |: Y" H. N       vItem.dwItemId = pItemElem->m_dwItemId;9 {: N* v: L6 _# t. O% `1 E
       vItem.nIndex = i;2 b8 i9 I. W0 l, f
      }' H) x5 h8 W2 q' H8 j
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);" [2 ^$ W% v" Y2 U' d
     }  A+ e# G! z7 y7 t! U# t2 t
     //////////////////////////////////////////////////////////////////////////
: X: u3 _* z/ g$ X( r     sort(vItem.begin(),vItem.end());//排序
9 d2 d2 H4 P; F8 k  [; I     //////////////////////////////////////////////////////////////////////////
! ]' y& G8 h0 W     //交换
( d) a" ^4 s, W! u     for (size_t i=0;i<vItem.size();i++)
8 K" e8 ]8 P; @5 h  u     {
8 x0 @6 o* v0 T' N      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
" x' W0 j- ]) y, j. P% Q5 M) q2 X) |      pInvSort->Add(vItem.nIndex);
0 ]* _: ~6 d8 z6 X     }4 v1 Y$ O" G7 R* ~+ p0 Y
     BYTE nDestPos = 0;/ y$ J: L( e* f$ [
     for (int i=0;i<MAX_INVENTORY;i++)
" E  ^  s! w& e* `% U7 D- d     {$ |3 Y2 U. p( ^7 U/ r
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
% J1 I" x5 p, V8 o- H* \      if (pItemElem)6 o4 Y2 j+ Y2 |7 b& N
      {
/ i- r3 o4 R  V* U       if (IsUsingItem(pItemElem))7 M. p! I% s5 W2 \
       {- T( ^! _2 y  B. W; J
        //这个位置无法放) ~6 U7 r+ ]2 m, a6 H* c2 ?
        nDestPos++;
0 Q, D/ ]8 g* s0 r       }
) v& ~9 q( y) ]* z, q2 n  R. `      }9 ]9 @+ P2 e, J" o: ^0 @
      BYTE nSrc = pInvSort->GetItemSrc(i);+ s1 X# s! h: d; ]! P% V
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);0 i/ M6 z& ~$ I" C. ?: ?7 p
      if (pItemElem)
6 P7 Y* Y  ]3 I1 A* {1 J      {
2 J9 ~6 N# \3 ]% k# V9 e$ T; a  e       if (IsUsingItem(pItemElem)): ~9 D; |) E: _6 Q" C2 [/ o
       {
% Q7 @4 ^& X6 h/ a2 ]' c        //这个道具无法移动,跳过8 {" ^$ ^  M$ d# r0 b' W
        continue;
! N) _5 S( A8 o& O       }
7 l' O$ C1 @- P3 f6 _$ B) s. m      }else{+ g/ L, y) O2 `
       //空位置 不用动3 s/ U1 r) L7 y- _3 m* g. `: D7 ~
       continue;# X- w+ b+ t* [1 a% R+ c
      }
3 d8 Q/ o6 J6 x' o% ]' Y      //////////////////////////////////////////////////////////////////////////2 z( V1 c+ Q: f) h  j! a
      //开始移动; [8 c" N2 a4 |9 d$ J6 ]0 f
      if (nSrc == nDestPos)
5 c* V1 z+ S. a) B( }1 d% t      {
3 R! N2 o" g7 {: u. X       //原地不动
3 x! g$ g) B+ E3 t# t: A       nDestPos++;
- D: j2 {3 s3 r7 L       continue;
5 x* @5 l+ L2 B# A* |      }# ]3 N* N: h$ t, H
      pInvSort->MoveItem(i,nDestPos);
6 M+ A/ h( e5 Q0 v. b      g_DPlay.SendMoveItem(0,nSrc,nDestPos);! A- A* i; I2 R6 E  r  n
      Sleep(5);' z; z3 p+ e# r& F  E* q0 Z( E) S* Y
      //Error("移动 - %d->%d",nSrc,nDestPos);( }/ u2 {+ Y: ?$ T( c7 l* [: l
      nDestPos++;3 k( j( Q1 U$ \# O# _- Z
     }
2 i/ k) G: f( e/ Y7 R: t3 j( }' X: `* }     //取第一个元素的信息
, o4 W: `" h- c     /*
: c! o  F) L6 M' r. S: \     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
) O- L& R- o  z+ C# q$ \     {
9 Z" _  j8 |8 I      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
  d3 V# ^6 I! m1 j      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);4 b; Q/ B# u0 M/ e- O
     }8 _- I, U' X# F2 V& N3 z
     */+ M- B* ]0 t- Y
    //////////////////////////////////////////////////////////////////////////9 L4 K4 y) x. q
    break;2 i4 I2 O% N$ b) J  y: ~
   }
# C, ~5 F' U9 k/ P/ ?/ V  {- i. d  }
: r. n6 o# G' f; I+ y/ V0 l( B' @8 c}$ }+ B2 y  x6 Z$ a) ^, r9 W9 f
m_wndMenu.SetVisible(FALSE);: R% y. N- [$ U) W

5 P* p) W& Z5 k) u--------------------------------------------------------------------------------------------------------, V8 x0 l1 d) b+ N  Y2 {- N
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)& n1 U5 b% p; H- B. w' J  T( @
{9 y# |- y  a7 E( s* c2 H
BaseMouseCursor();( j# |) f4 E9 e
}
& C9 g0 P9 u4 f' p在其下添加:
) d2 s/ k# n* f6 ?void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
) [9 p: R! {  Q" G! r7 b+ X{$ R4 m* H- c% p, N, t  |
m_wndMenu.DeleteAllMenu();
6 X0 E( f+ ~% v# Rm_wndMenu.CreateMenu(this);
5 T8 ^+ y3 v4 cm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");- n! B* [1 _+ e) s0 t, L* L" D& ]

7 o* i- U9 U% k, ?0 P( u7 S4 j' Tif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
2 _# P' M0 E' l( j{
, s. B5 |2 x6 z) w6 K. e. W) ^  //P以上级别才可以删除所有道具, k  {. K4 b* Y8 C
  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");2 I+ U3 @- k( Q1 G3 r
}" r7 x9 M$ t0 V4 |+ s- O. F/ D  }8 |
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
) m: g; Q. V1 {m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );, [: I" ]9 {) A! d* o
m_wndMenu.SetFocus();% I, L/ [! W. X) g/ J' L
}! ~4 r8 v$ \. E9 F8 s) {8 {$ f3 P) f
------------------------------------------------------------------------------------------------------------
" S2 L, a4 l: u, I*************************, ~3 e. N% L6 c! |  w, z1 F7 c9 I9 z' m
WndField.h文件
# G# p, r1 u" d! ]+ a" w. x9 h' e*************************
* @5 y! B2 ^$ C$ S" ?% _" ?" ]3 G搜索:BOOL m_bReport;
, s4 v/ x1 T6 m. [& `其后添加:( D# ]$ e& q3 ]" S& g
CWndMenu m_wndMenu;
! a! ?' f0 _3 U( C. I' H搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);& ?& D0 K/ u# f" z  _
其后添加:
4 m7 e" r# O* K& ]6 R) evirtual void OnRButtonUp(UINT nFlags, CPoint point);
1 O& d$ W: D# c4 F$ y0 u
+ a* @, R7 ~' E. g6 W' {2 H" M; @8 m





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