飞飞世界论坛

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

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件5 T$ U' |/ U- M( b' c9 {
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
/ ]; C3 a7 y$ a2 }5 w: w( Z6 t' _/ f: k1 w
struct sItem; A) ~0 @8 C% U8 D
{
, S4 d) X* F% T. {DWORD dwId;8 s+ B3 r( s8 g9 v: ]* _
DWORD dwKind2;
- p9 \( Y* l# t& s& E6 ^DWORD dwItemId;
2 p& ?& D6 S' V6 ~0 U4 OBYTE nIndex;
7 q% k( r  d# U+ l% zsItem(){
/ Y! m, ~9 T  l" R# f' v3 C+ T  dwId = dwKind2 = dwItemId = nIndex = 0;
! o" ]$ w( w: T' |}) @6 O7 O  Y/ X# X) n; Q) m, W- m
bool operator < (const sItem p2); F- E, _$ e. P2 w
{) C- L6 j3 C7 D  ~  ^& V
  if (dwKind2 == p2.dwKind2)
$ Z. Z, r: n  u5 U  {
" f; d; @0 ?* P   return dwItemId < p2.dwItemId;
( m5 P+ F7 n' r; `7 ?: a2 \' r  }else{& k0 d, v! F5 c* r  {. C  i* w" S
   return dwKind2 < p2.dwKind2;8 O) Z; u* G% o) {  Y) K" g$ k5 k5 f
  }0 _: b0 h( D; [" D5 F
}
' }) L4 J/ G5 V7 m: d};1 C5 s) `0 j0 ?( D  ~' w0 o
class CInventorySort
7 O8 C* E7 W2 L9 `{6 `. |! Z) m1 A$ T9 {- u% e
public:' v$ v+ y+ x3 r0 D
CInventorySort()) v2 {' E6 x6 G# f+ K1 _
{% d. r" j, A3 A3 A  q
  m_dwPos = 0;
# e6 U+ i/ ^; X+ r" I}
* k* a/ D& A! [9 d& B! e8 V~CInventorySort(){}
; ?% q( P8 T% G. A' Oprivate:# y& P7 x" d) L1 a/ B- G2 W
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
: s8 g& i- y2 p8 w. Y7 tDWORD m_dwPos;# G# m, n, x1 c9 A* y
public:' ~# ]2 {$ A; @0 U
void Add(BYTE nIndex)
& x5 |! \9 C; s: O{- d! Y" ~) ?/ @( U" `, w& N8 @
  if (m_dwPos >= MAX_INVENTORY)
; m8 z% Q5 T  y) q/ o/ @' R  {
( \. w7 h) f1 i9 @* e; c. l   return;( [* P, P$ e; q6 ^( I; K
  }
2 k5 P/ @1 O3 ?  m_Item[m_dwPos].nIndex = nIndex;
0 s. ~  y8 H$ E" h* `  m_Item[m_dwPos].dwId = m_dwPos;
& C. Y( T2 s5 U6 ~0 o# j  m_dwPos++;
) Y( ^! o9 d9 e) u2 O& I4 N}
) m5 @! ^- p& }, q% A5 PBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列/ @: P0 j) s& R3 F* s& R& s0 m* t
{
$ q: k$ Q* }: @! y! j9 D  for (int i=0;i<MAX_INVENTORY;i++). m, T8 r) p. V
  {
- J" x3 D1 r- K6 j. W% E   if (m_Item.dwId == dwId)) u0 |4 s) k, L5 x
   {. D* j: s' _; z4 x& ]* p
    return m_Item.nIndex;# \( ~1 W9 o# u1 J* p6 s
   }2 Y0 T, a5 P3 J2 h
  }
$ o9 H- f* T3 @  return 255;. K0 a( d) E1 m2 d, }; X4 c+ y
}$ Q0 s% U( X2 D+ ]
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
5 h1 P) G4 H) B6 q/ n" v3 B{
2 n4 B: }% [( B  h5 Q& M  BYTE nTmp = 0;
: G# s* t4 O2 I# E  bool bDest = false,bSrc = false;
- N  X1 ^* Y0 _) y$ {1 G  for (int i=0;i<MAX_INVENTORY;i++)! M/ j0 y  {0 G7 S6 T# c" m1 ]- V- Z
  {
( G; [. B4 q2 t- D( _& ]$ i0 d   if (dwSrcId == m_Item.dwId)
2 @4 D- O3 V' J. {% E# m   {4 k% t; R/ ?7 U2 D( {
    //id相等 则 改变对应的dest和src
# w4 D2 u+ b3 |6 j# K/ W- _    nTmp = m_Item.nIndex;( Q1 E% o3 f) e9 s
    m_Item.nIndex = dest;' r  P! E( n! g6 l) E* ?& Y
   }
& j2 [$ c4 M$ k5 r  }
0 x' u* h4 ^: B5 R; a/ _% L  //临时数据保存完毕,交换开始
) ]1 T) C! a" k% j  D( a( z3 Y  for (int i=0;i<MAX_INVENTORY;i++)
" _. Q  x7 y5 r. q& u0 P  {. Z+ \8 ~3 X  ^* O. E$ `" v
   if (dest == m_Item.nIndex)
4 m5 ?/ T+ G/ O6 @6 O3 X   {
3 G  b$ b( N' g, d: {) e  k    //id相等 则 改变对应的dest和src
  P# I/ G3 M4 T9 E8 d    m_Item.nIndex = nTmp;
" D- a- C3 f) `& f7 N. {, Z1 D1 d1 a   }
* k$ E% G) `2 X1 S  }
8 j0 g3 a& M5 T5 u: O}, K$ g- C6 Z/ B' [
};
% H( R3 o9 U/ e' ]  _-------------------------------------------------------------------------3 m. N/ w' H3 _. g
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )7 S! G8 ?* T" |7 d
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
+ E# E! O2 I  o$ {1 F" i紧靠其上添加:
- x- p6 v9 Z, M) {2 H% [+ k. Jif( pWndBase == &m_wndMenu )1 x' |: [3 d5 l! y% c( @
{
0 J: ?/ g; _" [  switch( nID )
3 C: b1 g, ^3 f/ C( B" U  {5 H$ ~0 x& H. Q7 c, Y1 m
  case 2:
) o2 |8 c  W4 J0 I   {# a0 a" r5 ?. d' x' p
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);) j* u8 o. ]3 O# \. ]
    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
+ W9 _1 Y, O  w5 E3 U. l+ e8 @- J    {6 B! ]$ L  @% W% t. T- R0 W
     break;: p9 R3 \* ?- E1 u2 w  p/ S; W, Y
    }% w+ {; |" ?* N' g' T5 g
    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)" Z8 a% g& ?* U
    {
1 J4 _4 _. J. W) W1 {/ X6 {     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);) r: H- A# Z1 m9 T
     if( !pItemElem )
/ m0 i% b" z3 \. \/ J. h/ j      continue;
5 ?1 s: S5 e) n3 w, E     if(pItemElem->GetExtra() > 0)
/ j+ W) |. g) B9 o# P      continue;  v8 V2 z1 G/ ~) l
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) ) I( o: C, g! Y9 t( m9 s6 D
      continue;
/ H/ R/ B8 M+ M# g     if( g_pPlayer->IsUsing( pItemElem ) )
$ `: L) h$ E4 ^3 h& T      continue;
* |6 c% U. P+ A& ?! ]; j% J     if( pItemElem->IsUndestructable() == TRUE )
( K7 y2 A3 b9 I* c     {0 s6 k% b7 t) W3 q1 p
      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
1 ]# ~# {7 c2 s- B$ r& }      continue;
2 K4 H, E; U- I5 G% e$ W  g$ e     }, Y4 z& @8 `: z9 V% Y( g! @
     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
' c6 d* [- X8 U% s$ _( g3 I    }
5 @2 g% v" B/ q  k% G( o    break;
7 A8 L8 E, _7 j; o5 m# w2 ?' t   }! Q% ]0 z' s) n; u+ O6 c& X/ g+ I8 ]0 X
  case 1:; o# c8 m4 ?* s2 X
   {1 L6 Z' W, B! b/ T2 j
    //整理背包
, Y& F8 D" M1 P. z6 [    //////////////////////////////////////////////////////////////////////////* \5 D0 v, Q# p3 f
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );" m! q: I) \; ]! f! f6 _5 `
    //////////////////////////////////////////////////////////////////////////0 \- _  N0 ]' K" Q; C% t2 ~- {# E
    //////////////////////////////////////////////////////////////////////////! x* w* s( T$ W  L1 d
    CInventorySort* pInvSort = new CInventorySort;  ?2 D! I0 \: u) F1 h$ h$ f/ g
    vector <sItem> vItem;; y: p8 \+ u2 b% W$ m6 Y+ a2 i. J. l
    vItem.resize(MAX_INVENTORY);//初始化大小
2 F; v9 M2 v2 C+ o1 ]" o6 p7 L     //////////////////////////////////////////////////////////////////////////
$ [) e7 K' ?% D, r( L6 O     //填充数据
6 i  R, ~2 O7 t     for (int i=0;i<MAX_INVENTORY;i++)2 q. U( }- F; i2 E* |: {. D3 I
     {
: v/ |) Z: F6 `      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
; y7 M; G6 E7 L( d      if (!pItemElem)
% H. N: \* [/ |8 m% J$ G: `2 w      {
& t: S; x5 d6 @4 x  \       vItem.dwKind2 = 0xffffffff;
- R) w) b1 Q* c+ D( d# j: O9 |       vItem.dwItemId = 0xffffffff;# X: l7 w' I1 \( i
       vItem.nIndex = i;
2 p1 X2 v  N- T' a' }1 \      }else {
) @: H) K3 P+ u, \       ItemProp* pProp = pItemElem->GetProp();
* K0 l. I% h$ J% _" D       vItem.dwKind2 = pProp->dwItemKind2;
# u9 J, t: h  @& B& h       vItem.dwItemId = pItemElem->m_dwItemId;
- ~& d+ N* ^0 T! F3 E6 k       vItem.nIndex = i;+ R# R3 s! y+ B, O5 ]# C
      }
3 X" q$ M, c- L" f      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
' [) ^: g' e. J3 ]( o     }* |$ U1 w% O" {! q; F  T7 t
     //////////////////////////////////////////////////////////////////////////$ c  E" y+ j! @# X+ z
     sort(vItem.begin(),vItem.end());//排序
& c2 y8 ?: R# J* o0 S8 G- r/ B     //////////////////////////////////////////////////////////////////////////* I; l- X+ O4 t' V- H5 U
     //交换- @& `1 z; s, {% \& k. C  z
     for (size_t i=0;i<vItem.size();i++)9 ?  ~! q4 U$ K3 T# l' `
     {3 I- E& {) z4 Z- C* H/ M
      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);  C; `* V2 D) l3 O$ R# v( {+ S
      pInvSort->Add(vItem.nIndex);, [' J; `2 r9 y3 j0 L
     }" ~: E. P1 K. ?. e5 e. P7 q
     BYTE nDestPos = 0;
' q5 \: S+ D- g- L     for (int i=0;i<MAX_INVENTORY;i++)
7 T- ~, \' ]3 w" Z' w, ~     {* C9 g# V& S1 E) l8 q8 l
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);! Z6 t3 O# v5 B/ n$ s- W
      if (pItemElem)& Y3 [$ {) g1 _4 o6 d0 @6 s
      {3 h! U) v; P  O  j. N
       if (IsUsingItem(pItemElem))* b: X: a2 m; i4 @' I; ]
       {
. S$ B( G& @4 q# F- ?& f# R: t        //这个位置无法放3 j/ P/ r. S7 v
        nDestPos++;
6 M$ B4 C7 C( X, y       }8 q) }+ y5 @) P4 o4 {1 `: ?
      }" H4 x5 T; r  ^+ d" V
      BYTE nSrc = pInvSort->GetItemSrc(i);1 f: o/ c* g; M4 y) U
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);6 b% \4 q5 M( G8 y  }
      if (pItemElem)1 ~7 h: O0 s4 J$ p6 ~& a
      {" u" E; ^0 F2 z; G# P3 y5 [
       if (IsUsingItem(pItemElem))% o  {7 ~# }/ _" ]
       {4 N8 T8 k1 H3 j0 B& M. M1 ^
        //这个道具无法移动,跳过
: C- y% n- `: }6 x4 }        continue;
( X, I' T" E  c- u  u$ P: g3 c0 w0 C       }
( i" V/ X+ y* r7 [8 ^& }      }else{
! T: |  o, ^1 t' W       //空位置 不用动( K9 X5 {7 o0 L& T: i
       continue;
9 K& S9 l# @, V( v- r# i      }
9 W; i9 ?* o  B      //////////////////////////////////////////////////////////////////////////* @/ x0 l, t* E- g3 v8 u& D* m
      //开始移动
& \* T6 ^+ T" t' s* y: Q' w. G      if (nSrc == nDestPos)
; Z2 P9 z2 u  }1 e      {
. M, }) Q0 K8 @       //原地不动6 g$ L4 k/ d" ?
       nDestPos++;2 j1 H) \! d4 e
       continue;0 I) y6 J" L) p. G( l& u# E! u) F
      }
5 {0 F! e6 `8 e" D% }0 F      pInvSort->MoveItem(i,nDestPos);; s1 }7 \2 s1 z, L+ V/ M
      g_DPlay.SendMoveItem(0,nSrc,nDestPos);/ \1 _/ B2 ^- [4 N0 o5 k* x# W
      Sleep(5);
% d7 e! h. K" L      //Error("移动 - %d->%d",nSrc,nDestPos);
; e$ N  V% _3 B/ m+ t* _# O( _      nDestPos++;/ e- p. |/ D: v- w: x( z; Q
     }
3 q. n" z# ~9 h, T$ S, d3 U) _1 b     //取第一个元素的信息
$ \7 I6 C& a. L& p% |     /*
  v$ ~( ?2 I; s7 F0 @- y" z: ?     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
0 f9 @: Y0 V' U# h. Y# s1 w8 ]     {3 w% c( B. ?% s& x+ n- r: x# ~
      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
7 @) K1 w) B: V- M  u2 V7 |# ?7 x      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);2 ]& [8 W- l( T+ h. q- C" B! Y
     }( F; c" r4 h. N, [6 u' J
     */; b- T$ J2 Z6 t3 H7 {1 g8 d
    //////////////////////////////////////////////////////////////////////////
& @- b' _: L% }    break;# ]" C: i' z5 |. f6 }! @  P& m
   }/ F  O1 b1 i/ v; u" N0 g6 D2 B
  }
- f. s3 o" h$ P* ]0 o4 C}+ m: m6 v9 v' ]- Q
m_wndMenu.SetVisible(FALSE);' _5 e+ m4 `- e

% Z, J% x& _! G/ g2 ?--------------------------------------------------------------------------------------------------------1 P9 w% w! k: |) y2 Q( ^/ S+ G
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
1 f" B. W8 z8 H8 a( W+ M4 N{9 A9 M- D, _9 y+ Y$ w
BaseMouseCursor();6 j  U# f$ {5 ~, a8 i
}
2 m; w; z" N1 s- n1 c$ Z在其下添加:1 m9 E. U2 q9 n! P5 a
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
& n- u: v" _# u{
9 `- G9 s! k  h5 Q. bm_wndMenu.DeleteAllMenu();# k3 B) d& o- W9 ^6 i. p" o
m_wndMenu.CreateMenu(this);
5 O) t. U7 B+ f. V) [m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");: D3 \2 ]; q* x- R/ `, H
; f" L( Q: A* L3 o
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)). ]! ]' V# B8 \! W% v. w( H" X' P: L
{) \* F! p& b+ y0 {$ B0 h9 P" M
  //P以上级别才可以删除所有道具) ?7 v- b4 n3 o& f" Q
  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");1 J& ^. L$ ]6 k9 a1 m5 O9 }; q. m
}
0 A7 W0 J% g' X2 }! U- u% am_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
- }" f/ }) A4 m' X/ xm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );! `4 _7 M, g  v, M% I- ^
m_wndMenu.SetFocus();
. s7 |' A6 u& k: {7 c}+ u  l6 X6 X. I1 g' Y& n
------------------------------------------------------------------------------------------------------------
. O6 u, d! a/ q0 K6 o2 m4 `. y. O*************************
% m9 T/ e: k5 \  e. t5 R+ |4 JWndField.h文件# t, L+ y! i! q' u+ _8 A
*************************4 T/ ]5 {8 ]& E2 a
搜索:BOOL m_bReport;1 L) C, j9 R+ w; E
其后添加:
" j: Y! u/ h5 {$ C- S; g' j4 `' yCWndMenu m_wndMenu;$ p0 `) X7 I  Y
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
: _) r% O# {$ D, F( x0 \% o) V* c其后添加:
' x1 J0 ]. A5 m: A" i1 D) yvirtual void OnRButtonUp(UINT nFlags, CPoint point);+ M" Z; R5 @' q. w8 Y4 N

1 ]% N8 O  @" P4 I
8 n9 H# C) I" X- u




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