飞飞世界论坛

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

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
2 ^# [5 h9 z( b+ ]4 d搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
* K' g. v) ]/ Z. T7 S' Y1 f/ a1 q$ K8 _( o
struct sItem2 A+ E1 w# {! a& N
{
& b8 O* A/ o* w. U# y: sDWORD dwId;
- O) m8 u" Q1 L' y& g, P7 z, pDWORD dwKind2;* R: `8 E) ~& V: p8 O  r# _
DWORD dwItemId;
8 p- S7 h6 _( Q3 s9 {" C% _BYTE nIndex;7 o, x1 m6 S* V! Q& f. y( ?+ G0 T
sItem(){5 ^& S! N& ~# B+ b& c8 E' }
  dwId = dwKind2 = dwItemId = nIndex = 0;
/ O" v2 f0 n) N9 r4 C}* ?2 i% Q0 L8 b( q8 `1 L0 x9 }
bool operator < (const sItem p2)
. K* ^, M6 p3 V{
# k% J- U, V/ V; T. y  if (dwKind2 == p2.dwKind2)
' P! @. _) O9 v. K6 b; C" o4 l  {
" f5 R3 z9 j% k! g; ~   return dwItemId < p2.dwItemId;  b: O* j7 {6 p3 O( I2 E
  }else{* ^* t' `6 a! I( n+ i# L# ]
   return dwKind2 < p2.dwKind2;: i$ Z% n5 E# v2 }+ `
  }
6 e+ X# f; d1 L( n) V* p}1 t; m3 O" W1 O
};
" y- G2 H! P0 Dclass CInventorySort
$ C. D# B: {8 `9 k5 X+ f* i4 z{" j& w- T8 R# R9 J! S$ P9 @3 t. k
public:8 p3 f. a) H6 |' q5 e  e$ n
CInventorySort()' u" [& i' @# l+ k1 l  g
{
* y, `4 R6 k3 `) j& r  m_dwPos = 0;7 T0 f! v$ `4 M# `% Y+ E
}1 M6 K' f) K' a- x
~CInventorySort(){}: b$ X6 T3 k3 p/ ]
private:/ f$ o& }& f( r' f
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息: r/ H: V+ K* {& e# j
DWORD m_dwPos;  k2 I. l- O$ |* _6 R% [* r
public:0 M3 [0 _) r3 M' q' H9 A1 g5 C% v
void Add(BYTE nIndex)8 M( \* u. l7 c  C$ h
{2 q/ g! P" P! Y" A% u6 R7 X
  if (m_dwPos >= MAX_INVENTORY)
  K- x# Q/ m6 h5 V* h  {5 k7 S" S* K! A% z
   return;
- O2 {) v- [7 d; t, K- A0 P  }
8 l9 l( h* d, w2 Q2 k9 W  m_Item[m_dwPos].nIndex = nIndex;
. R; ]( f* M( Q5 b: O- W  m_Item[m_dwPos].dwId = m_dwPos;
& b: r0 i. ]4 Z4 c( s& |% Z  m_dwPos++;
& L; a$ b6 W$ W: c}% p; t# s8 M8 @+ a/ P8 M1 D* ?# B  i
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
6 S: _& F3 c5 Q" F{
8 ]' y& o, h; E* a! y7 ~  for (int i=0;i<MAX_INVENTORY;i++)
( l/ o/ h8 d  A  {
$ l$ c1 r% ]! V& O  P5 g! o$ \6 l" `   if (m_Item.dwId == dwId)' F1 i# E" u2 N
   {
3 g$ \% l2 K  t# Z$ A6 z3 H; T    return m_Item.nIndex;
) k# Q/ x1 A" i/ s9 ?   }
7 \- |  R# t- C  }" o/ |% ^3 `5 `; m% b
  return 255;
3 N2 d& H6 Q0 e! ?6 ]2 u0 j}! G/ O! s0 s: P. Z, N
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置; V/ d; @6 q& |' A5 T( P4 T0 o
{( g/ O2 y" ]1 b+ Y! E
  BYTE nTmp = 0;
% W7 _! |& @* W; A3 L" m  bool bDest = false,bSrc = false;5 K- s! M1 I% v
  for (int i=0;i<MAX_INVENTORY;i++)' l2 ~1 ~2 Y: `
  {
# y% ~; u+ p( |1 w" o5 }& v' Z   if (dwSrcId == m_Item.dwId)
6 f5 ~8 E+ {7 }8 |" V   {
  Y) m- e! h: A( t  }7 J7 k3 I8 x    //id相等 则 改变对应的dest和src  t+ N( C, o( o: a' \" x: i$ p
    nTmp = m_Item.nIndex;
9 J4 O9 @; x9 |. Z& W( T    m_Item.nIndex = dest;7 K1 D& h1 Z! x( p' i# d
   }
3 r/ N- C" o* Z0 O' D4 U  }$ B" \6 X" ]& `  r/ o! I4 T5 {  {
  //临时数据保存完毕,交换开始2 _+ A$ f4 F/ T% M/ H6 u+ \, s
  for (int i=0;i<MAX_INVENTORY;i++)9 R( Y  j  k1 D. R  T
  {# b; N7 H5 F# d
   if (dest == m_Item.nIndex)
& g6 ~# h8 L& v- l% N3 c   {; n9 x% }3 q. O& [$ A# n* M6 n" A
    //id相等 则 改变对应的dest和src
3 m1 k' i/ b1 X# y    m_Item.nIndex = nTmp;' W4 B% W8 G7 d+ |% _
   }/ G$ ^% [) Q9 u: l, l
  }' O" r4 |! X7 V. x
}
; R/ X3 }; U1 R  V' f% a};
% i' k8 g& C: H-------------------------------------------------------------------------7 k! N% S& C- }+ u) {# B, i! ]! w
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
. k  s- b! X2 p; K5 G搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);+ ?0 x3 n! {( T- \- s/ I. {2 _
紧靠其上添加:1 c) a/ W# V. d. F
if( pWndBase == &m_wndMenu )
7 F( l, l1 C0 q$ B# g5 T1 R{
- e) h% X3 v1 E5 f" ?. V- P: b  switch( nID )6 G' }8 w" h9 d6 o7 A1 Q1 O
  {
3 p$ c( c4 a, b$ y1 l. M8 B6 w  case 2:
+ C. M9 b# t& y3 y+ n& \6 ^   {7 I/ ~) h/ ^( k- g
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
: f  T+ J9 m  r; m: f7 C* i! R. ~    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)), M  C4 i9 X; u: y
    {# S" ^, F: `/ R1 Q' ]) c% Q* a+ L' m
     break;
% i2 M7 @0 K% V. e7 u) B/ ]1 m    }
. C5 E& Y2 I7 `0 A; Y0 i    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)8 s( \8 u: A: {2 O: u! t
    {
, o, b: v1 {) V$ s% ]+ N     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
5 i+ D  g0 M# |2 Y8 R     if( !pItemElem )
5 ]' g% Q  ~# k5 j      continue;. ~) c0 z" P# l" M5 I
     if(pItemElem->GetExtra() > 0)
$ r& z7 g) c' |6 U      continue;
1 L) o; t2 G! D! ]8 C4 i8 p0 U/ ~     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
6 }! |7 s2 y; m- T1 Q% Y+ H      continue;. z4 `( R% H9 _0 z3 S5 S
     if( g_pPlayer->IsUsing( pItemElem ) ); a0 v) ]  m6 J6 p. v
      continue;
0 N# d1 a. g) N3 o1 O) u' }; d) H     if( pItemElem->IsUndestructable() == TRUE )2 b5 S7 T& B4 d; V4 u
     {
0 d3 I4 @( `9 ~+ w' j      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
+ F! u$ w! s$ \* G  S, _  |, ~      continue;
1 r7 y- V( o1 n' ~, v4 _# ~1 v     }
# Z5 w) y  `% Z- T     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);1 w1 M% ?: J  J. e
    }( @2 h9 A( a* B. Q
    break;! o% |4 J" v5 ~
   }0 \/ e! G+ h2 F- Q. t5 u
  case 1:
' u1 x7 }: ~0 C) D4 U% `4 O   {
1 V# z5 Z  x4 {    //整理背包3 D" ^+ @- \6 ^3 m- C
    //////////////////////////////////////////////////////////////////////////
8 W4 G9 Q5 N0 p, E$ G5 j    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );# C3 Q7 D5 [5 y6 w% a1 T7 k+ A
    //////////////////////////////////////////////////////////////////////////8 P' A- c9 e0 g* k  G
    //////////////////////////////////////////////////////////////////////////
1 x# D# G9 v# d* Y$ k) H. A    CInventorySort* pInvSort = new CInventorySort;3 _) _3 C# Q; H/ V& n
    vector <sItem> vItem;
# l* B4 w5 ?6 b2 w5 A    vItem.resize(MAX_INVENTORY);//初始化大小8 g9 A; V5 r5 v0 Y; J% h; ?
     //////////////////////////////////////////////////////////////////////////9 @- ^% X" Q/ b6 V$ h  D; B) L
     //填充数据# p2 x/ N# ]4 H9 ^* i% q
     for (int i=0;i<MAX_INVENTORY;i++)% M! p8 D3 g) O7 R" w1 }
     {* d1 I7 I4 b6 F
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);2 U% l8 Z' g  i) q
      if (!pItemElem)
, y6 L- L- E) j8 w$ G& B) z      {
# h4 D9 I2 S% w8 C) X1 n% m4 m       vItem.dwKind2 = 0xffffffff;, c) E$ X2 F5 k$ }8 _& W) R
       vItem.dwItemId = 0xffffffff;
( J9 S* |% ~5 b       vItem.nIndex = i;
8 u& A1 H# t9 f) y. Z* h      }else {7 M+ |: ]3 E& p# {+ Q
       ItemProp* pProp = pItemElem->GetProp();
# ~# s% y+ E7 z% v: Y" z       vItem.dwKind2 = pProp->dwItemKind2;
" U9 `% _; |0 n/ I( x+ |! v! i' N3 u       vItem.dwItemId = pItemElem->m_dwItemId;
$ e- m( m( E8 E       vItem.nIndex = i;
5 w; Y1 R+ X* J( y1 G4 d      }! D+ V, O# K: R( J* W
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
; ^+ o- K& N3 m' H7 S     }5 A0 J9 k% q1 I: A
     //////////////////////////////////////////////////////////////////////////
9 y4 m8 ^# d# n! d     sort(vItem.begin(),vItem.end());//排序; f, f+ s# [" I; f7 e
     //////////////////////////////////////////////////////////////////////////) n4 Y. k' U2 D5 \2 f# t; ]/ t7 T
     //交换& n% [" \, Y( L  W2 q5 q
     for (size_t i=0;i<vItem.size();i++)+ S1 m! H' M, v- c4 d8 z
     {9 \: ~4 c$ a0 m9 n0 d/ {% }
      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);# s; \3 D/ @! J! n6 d. l
      pInvSort->Add(vItem.nIndex);
) W" u4 b7 W( y3 r  i. n     }
7 B. x9 L( Q; S* A6 i     BYTE nDestPos = 0;9 k! v/ L: w0 ^5 s" C8 S
     for (int i=0;i<MAX_INVENTORY;i++)
- m" s6 d! {6 e/ q- p  X! Y     {
0 ^( X3 ]/ n% t      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
5 k; i6 r7 c% s% _# c) v% L) H; \      if (pItemElem)' d3 q) K3 w4 }2 u$ u- o
      {7 b8 u7 I( z4 w0 B
       if (IsUsingItem(pItemElem))2 x$ i: g* O/ W+ H) B& q
       {& f: M6 M* g4 A8 p" `
        //这个位置无法放
* \3 }7 H) g5 m* |% F        nDestPos++;
" I/ ?9 w1 u3 a' G6 {  k       }' E) u$ u, P3 J; J
      }' Y- g0 j- D: ?0 c
      BYTE nSrc = pInvSort->GetItemSrc(i);
# Q3 q5 f# S0 v0 A. Y8 ?      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
, j- F* s4 X4 z4 t; U      if (pItemElem)4 x$ M' g! c7 u
      {
2 O! C$ [6 `, [: `' X* i4 a' k       if (IsUsingItem(pItemElem))0 s8 D( B* o- S+ d
       {
* A, W! g: H3 ]( W        //这个道具无法移动,跳过9 _2 Y" l6 `! m9 R. B
        continue;# g3 L+ J; H) L) k. Q* G
       }6 a: g1 ?2 [7 g9 e
      }else{. ?+ l( W- I: x5 |
       //空位置 不用动8 H# W' L) n0 T" ?1 v
       continue;
5 V' m/ M7 f) v' i7 Z! `) l3 v      }/ U" i0 S6 p) Y/ x: q, Q0 M1 J
      //////////////////////////////////////////////////////////////////////////6 D6 S( b- j* W7 r
      //开始移动
( b- L4 \3 x" m      if (nSrc == nDestPos)
- b5 K" G$ z. a& I  I5 X      {, ~1 @  [) b  P$ ^' b- N8 x5 V9 P
       //原地不动
! b( a( h$ m0 u       nDestPos++;9 m% x3 r' A! Y' h+ d9 {% N
       continue;* x; v0 }2 u8 v) I% g7 L
      }
  K( V  s4 Y0 C% b6 \0 Q, s! a8 r      pInvSort->MoveItem(i,nDestPos);
6 R. m$ C8 m* g; c0 b8 `! H, K  A      g_DPlay.SendMoveItem(0,nSrc,nDestPos);
$ v5 u/ |  W( y7 R. W0 O      Sleep(5);
  v0 x$ [. S6 ?& F5 ?6 J+ d" I      //Error("移动 - %d->%d",nSrc,nDestPos);- J" Q0 s+ {+ N# l5 m
      nDestPos++;
3 |6 H! o3 Z7 g     }; j) ?2 ?9 ^2 d$ c! H. p
     //取第一个元素的信息
  M4 y6 c- G3 i# n     /*
. c3 Z0 @' I. l) F& v     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
; D0 R# @( Q, ~. Q5 e$ `( ?! V     {
! z+ F2 h# p4 W& v% `% X      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);& [7 Y& \2 Q: j( m# y. P9 w
      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);1 r8 Z3 l* I: o6 p8 z/ v$ u8 l
     }! g. w4 l/ l" q
     */: @9 w+ L! k1 V* T
    //////////////////////////////////////////////////////////////////////////; h+ @7 o& h0 Q
    break;9 X* p# v7 O, E1 H
   }( ]! ~7 g2 [0 g. Q  t
  } 8 q  A) _! }/ z
}6 z. f! m3 C# r' n) V) r
m_wndMenu.SetVisible(FALSE);
. s, O5 T' l; n2 y/ a6 [
: e- [( c' r1 a% S5 Q/ M6 h/ p--------------------------------------------------------------------------------------------------------
3 m0 |4 q$ r+ f! G' v$ P" n搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
# Y3 g  u# t7 W& W7 q{
( o6 W* x. J) N3 A: hBaseMouseCursor();
( C  J8 b: ^7 f6 D' G" A}
% s' ?% z3 \+ |, k% Q8 K# j在其下添加:
- n8 s+ a; f. H+ hvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
" c- P: t6 A6 c$ P: b" M/ `, M{: S& p. H' [- `' X
m_wndMenu.DeleteAllMenu();
1 k8 L4 @& ?" b" y/ wm_wndMenu.CreateMenu(this);+ g6 a7 |* g1 }4 R) q( {# i
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
9 e! ?, k; L3 Z/ r3 j! ^
( H$ U5 O2 W- l, B. H: G2 L' sif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
2 h" Z( S9 Z8 ^& m3 U# n{* p: l$ O/ p+ r7 r. g" q( `
  //P以上级别才可以删除所有道具
, x9 G& w# s0 t, D0 q8 S& q  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
, b" n0 K  e- f9 G6 h+ j: U& w/ _, s}
, c6 H8 n' h* S) }! Em_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );. j) m" C1 U3 Q/ H' v
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );  g: E0 x4 |# R4 ^1 H
m_wndMenu.SetFocus();
! l3 n; I" X/ H! p}
7 q0 W  S, D, z8 e) t------------------------------------------------------------------------------------------------------------  T% r! i$ u/ ?0 [9 \& u3 F) Y
*************************
: O! }6 {% B, ^WndField.h文件
! D9 ~3 a$ C- o  b# N*************************+ n7 |3 Z$ L. d
搜索:BOOL m_bReport;. {( b' t/ k  _
其后添加:
( Q' i2 i! k+ h6 jCWndMenu m_wndMenu;
* f, x# S# d2 K3 L- h搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);6 r2 y) B' [6 F
其后添加:
: f  E1 d2 ^% x3 M) m2 W+ o' O+ zvirtual void OnRButtonUp(UINT nFlags, CPoint point);
5 a8 i; O' F# I6 V% U; `9 D# l. u4 s4 V

( @. t2 H  I% V




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