飞飞世界论坛

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

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件4 o0 ?( S" R1 t+ U
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
* S( O; G; Z5 }8 k9 P# y; t: v- Z
  \  W% q" X& s8 K* m6 ~& d% g5 Qstruct sItem' q  u( {: L2 s# ]7 S
{# q7 l+ Q5 g) m+ P1 x4 d# I# H
DWORD dwId;# R$ v! h# p2 M4 n4 d7 C* |, Y
DWORD dwKind2;
* c& P" d: s8 r: E7 X( r! N0 NDWORD dwItemId;
& U1 s+ v3 a3 `' B4 F$ J  W. ?BYTE nIndex;
+ @$ Q9 f5 r' o! h9 U# l4 vsItem(){
6 T- |" D5 D$ O# S$ n" u2 K  dwId = dwKind2 = dwItemId = nIndex = 0;
. |! G: p) @( `" H0 J}
9 @+ ?4 N: E' d$ w1 x5 Rbool operator < (const sItem p2)
, m6 {2 }) u! i{
7 P4 V6 M/ k" M/ B, v0 }; S, [  if (dwKind2 == p2.dwKind2): T; e1 J0 V- q) j0 _# g
  {$ J) U; {& k6 L
   return dwItemId < p2.dwItemId;
: Q" k$ R2 c& H: @% n  }else{- n. P$ |( k( e: ?# P9 w- o7 r. L
   return dwKind2 < p2.dwKind2;
6 T: h1 _+ U5 ^' w/ S# s+ ^- Y  }! |. j. Z6 @; i5 B* ]& h
}2 E' W' J7 T' P) R( b/ D
};
. M' ?# O" v# ~. Y7 ^; B0 K0 f! Hclass CInventorySort0 s  D1 p9 G7 o
{
+ J) A: U* d/ S6 w$ `5 m  upublic:1 F+ M* T" A2 t& x# l
CInventorySort()6 m) W7 }& d6 w
{
. Z+ L  p$ a0 w. N9 _3 f$ E' j  m_dwPos = 0;0 C% S: ]* s2 a8 |/ H: U, _8 j
}; O2 E) }& i, @& Z
~CInventorySort(){}4 `& E9 ?$ e. v) F2 l
private:
" X5 @+ C& d7 G7 u; M% LsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
( [% x; `. F9 ~. Q3 eDWORD m_dwPos;" P* }8 s+ d3 _" A+ q; J% h
public:
  g5 |, d9 S/ K' |) e* `0 [. g  Qvoid Add(BYTE nIndex)& v6 e  D% @2 o4 W: e" H9 X; Y6 j
{
- I# @, w2 i! V  if (m_dwPos >= MAX_INVENTORY)& T* W" p4 R' P/ r, Z
  {2 [( L$ A& Z6 t, X
   return;
$ G: |" p' Z/ y  }
5 F5 B  a+ V" V4 \& N4 b  m_Item[m_dwPos].nIndex = nIndex;  i" |, ]6 a8 d1 Q' \7 h
  m_Item[m_dwPos].dwId = m_dwPos;: @; c7 ]2 a4 a* Y  p
  m_dwPos++;0 j& m5 M; s+ e# _- U
}1 O$ d5 ^+ j7 Z- _! v7 _9 E
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列5 P& g) R% M& y+ i$ ~5 q2 ^
{
$ O- b9 u0 l0 r/ n) E& M  for (int i=0;i<MAX_INVENTORY;i++)
$ S$ s5 ]( z% }; b  {
: }, c6 M! A0 x4 S2 k" Z1 J   if (m_Item.dwId == dwId)
- m9 O9 d; I  U/ [# @   {
# y; }5 O# E6 w5 Y    return m_Item.nIndex;
; B* R- y3 K' g* {   }7 b" l7 U* b# w1 v
  }
" ^1 U& ?, J/ W/ x! e( g5 a0 I  return 255;( T* P: I$ _3 I
}* w. y2 P5 x- }! V& Y# E* v  U
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
; I! b" t  }! P5 D, c{/ \) T1 N9 {0 r. V5 C
  BYTE nTmp = 0;' ^4 j' o9 z% K
  bool bDest = false,bSrc = false;' U. k: d2 X) S1 s  @: a: Y; j
  for (int i=0;i<MAX_INVENTORY;i++)- ?' H7 Z$ I) J8 B3 e. y
  {" \4 V, I& J7 P# r9 a: P. u
   if (dwSrcId == m_Item.dwId). s5 V" K; o5 L" p! }) H/ C
   {
% A" I/ d1 ?4 {7 G( U5 t    //id相等 则 改变对应的dest和src
# j4 g7 D3 R; @. T3 P  J% U    nTmp = m_Item.nIndex;- p  F) N( e0 b0 n% f# \" u' [6 j
    m_Item.nIndex = dest;
2 \5 @$ ], Q$ m' B   }
4 _8 ]' A; W1 j& U3 Z7 D: c: y  }
+ K) R- ^0 o- E3 p  //临时数据保存完毕,交换开始
# m$ o, k( ?7 I# [9 K  for (int i=0;i<MAX_INVENTORY;i++)* q% A( I* G& h! i' `& h7 @0 N5 s
  {
. ~$ i# U5 W# Q1 \8 R# y, p$ g; f+ K4 T   if (dest == m_Item.nIndex)% W. z7 i9 @' L, b/ C
   {& ^% |5 N- N# o; V7 X. h4 J5 o: M
    //id相等 则 改变对应的dest和src
4 s/ r% G! h9 Q; n    m_Item.nIndex = nTmp;
9 B& G- E' k  K1 {   }
7 `) D2 r5 K3 J! X" ^  }% g# W4 c" B$ J4 i
}! w% j0 ?5 d- ~3 R. t! {
};
! m- o4 s! _8 ^7 n: n& ~/ R- l-------------------------------------------------------------------------, @' d0 }) |5 J9 [+ f% W
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )# w4 g8 Q6 y2 v$ e3 ~5 r
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);9 C8 I, H& C3 J  U
紧靠其上添加:
! J3 b- k& e" I9 ~6 O2 Tif( pWndBase == &m_wndMenu )
& A/ S# S; ]. _" L8 @8 P{/ j, J* z7 K* e3 {. P9 s0 e
  switch( nID )
. K8 X$ j5 x0 B+ ]' A: T  {
) q$ m" p; O9 C2 P- j  case 2:
  ?! {( Z5 j/ f( V   {
1 S% R" j3 [$ ?$ {( t    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
; ~5 d) J) g; r1 S    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
0 i/ Y. L1 {4 v, D' D" Q# G    {
/ N0 K; A$ O  l3 {  \0 N     break;, \1 P) s/ ^) N4 t" F1 a! H
    }
: _! ~, x6 L$ q, H2 n    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
# w1 D$ q) [: W0 d- b4 J    {8 Q1 X( {% i: e) L' m$ O$ w
     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);9 L% W2 F4 z8 O# _, G* A
     if( !pItemElem )8 |7 v& E! i; a" V% h) L- B9 M
      continue;
3 k4 z" m  E+ i5 T2 i3 c     if(pItemElem->GetExtra() > 0)/ Z: _  E8 D; g# F- n0 j$ f
      continue;5 h( [% [& k9 L; J6 O& Y
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) / Y) B4 C2 F% \( X
      continue;1 Z1 l7 O0 x* M) N2 C
     if( g_pPlayer->IsUsing( pItemElem ) )* E2 B! t# |; n1 D2 }( r
      continue;
, K, G$ B# S2 E& s. W) B     if( pItemElem->IsUndestructable() == TRUE )4 y. c$ r" S- {; Y5 t
     {
" p2 c8 q& N7 @      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
3 a) n+ s/ h' }+ [      continue;
: P3 O3 ~7 D1 ^" t6 }     }
  |/ E. Z2 A4 q  c     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
8 W/ R5 G9 B" [% O8 b5 ?    }
$ n( b" J; H$ `( l. W! I4 C! l: O    break;
7 h* Q2 i7 ]$ q   }" V# t  Q! s3 O& t# ?
  case 1:( O9 r; U7 g5 x, r$ t/ K0 K
   {: |2 J& S/ I+ }# z7 E2 w
    //整理背包
# v3 k, u7 W$ i. ^4 o, k    //////////////////////////////////////////////////////////////////////////! ~5 [/ }+ G3 c. y
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );/ a$ |, D# Z) g
    /////////////////////////////////////////////////////////////////////////// T  L- j0 ~( c5 ]: ~1 H" ^
    //////////////////////////////////////////////////////////////////////////0 P. P& e' g3 K7 r
    CInventorySort* pInvSort = new CInventorySort;* v# q* ]- y& A$ t6 r. W+ [; b3 L
    vector <sItem> vItem;, A0 i0 T- ?- Q4 ?( {3 H
    vItem.resize(MAX_INVENTORY);//初始化大小- r0 q; {& p+ O% [5 k
     //////////////////////////////////////////////////////////////////////////
$ t2 f0 _" v+ n  b     //填充数据" B1 j0 Q  |( C8 Y6 ^; U: h
     for (int i=0;i<MAX_INVENTORY;i++): \8 p, N0 s1 R2 S* W! L: l% L
     {6 P! ~$ |0 f/ Y/ z; H% l
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
5 M) a" }+ j! R, o      if (!pItemElem)
) h7 X" V* R% f# d- D7 `- f      {
; K0 C( ], k$ [$ a       vItem.dwKind2 = 0xffffffff;
7 P9 ^, m) ~" a# O# D       vItem.dwItemId = 0xffffffff;
% F) Y) p" b! _& @% O       vItem.nIndex = i;# z, C1 [9 i7 ~& d- K- Q  L
      }else {6 F+ B5 R8 ]% j# r: o
       ItemProp* pProp = pItemElem->GetProp();
1 H( _; w, ?' P. U- {+ v       vItem.dwKind2 = pProp->dwItemKind2;
. ?8 z8 e9 M, t: ~, f2 @2 n       vItem.dwItemId = pItemElem->m_dwItemId;
5 H" S; c9 c5 q$ c  n       vItem.nIndex = i;
. ]  s+ z, @6 E% v) p      }! ?( \# Z% P& C% X9 ?* G% k% o) I
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);" q$ v3 H) E1 y% ~
     }0 C: [  z* T/ B; l; K  X
     //////////////////////////////////////////////////////////////////////////* S4 g8 m' U! q0 C, {
     sort(vItem.begin(),vItem.end());//排序. N/ N' k# J2 m) u0 R
     //////////////////////////////////////////////////////////////////////////
# Z4 {1 e" ]( Z( J( K     //交换
8 l  w. Y& P* [. B     for (size_t i=0;i<vItem.size();i++)
* \6 U! _0 M% Y  M     {
* y: B4 k# S6 c4 Q) l1 j6 a      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);  J$ c$ Y5 P% R
      pInvSort->Add(vItem.nIndex);/ k( W9 Z; c( Z6 p4 E
     }
# U' h2 i! `1 H' Z     BYTE nDestPos = 0;
: Y" b# M! j  [$ U3 V0 z     for (int i=0;i<MAX_INVENTORY;i++)
  X: M# j5 c; u' x+ U     {. P: s3 U" F; [0 X' `6 F
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);7 X9 Z+ r3 L' {- w# z
      if (pItemElem)" o$ K5 q  m3 l* w) ]( W# l
      {4 k! I  ]  A- i
       if (IsUsingItem(pItemElem))
, t$ O: }3 {  N$ u; G3 z; B, C. a8 K       {& B1 x( R% B7 {( E
        //这个位置无法放
8 J# `2 r* o" U" Y% N0 D        nDestPos++;
) P  Q" V" K  d; `7 [: i: Z       }
' M4 g6 j3 O7 Q, T$ i1 S1 N- P      }8 x, @0 O' _8 j9 V" E5 T, Z
      BYTE nSrc = pInvSort->GetItemSrc(i);
* t6 w3 `# z- t) n$ _. A      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
* A5 U" R; m6 B8 C/ {( \  L5 E5 `% [      if (pItemElem)
! U% `6 T$ r% a* l: [& T) G4 x9 S      {' Q5 k$ V6 c7 O: r+ [  a0 S
       if (IsUsingItem(pItemElem))
3 E& x' Z( [! E# _       {- _: B( q+ i* X& F
        //这个道具无法移动,跳过+ t/ {* E& u( m8 D
        continue;0 ~6 ]( l: y, k1 F- }% B; H
       }7 x- A: q3 _/ G5 P1 u
      }else{6 D7 j; a  y, q$ ]
       //空位置 不用动# r+ }7 V% D2 r
       continue;
' Y8 u) o7 A0 r3 ~- F      }8 i  J6 b: Z% k8 y0 @, W
      //////////////////////////////////////////////////////////////////////////( _3 O/ W& @7 [7 @7 m1 W7 s
      //开始移动" Y! Y& t# B2 p" U" w5 m/ h
      if (nSrc == nDestPos)
1 u% U# u: D3 X) g+ T& J0 u      {
5 P9 w! [, l# V3 r       //原地不动
2 u4 B/ q3 E$ N; {$ C8 t. L       nDestPos++;% Y; `. o/ K. C5 R! |) V1 U
       continue;0 |2 D, p; v3 i9 d( B" ~' {: y
      }
+ x* G# _) n& Z: m: @* G0 K      pInvSort->MoveItem(i,nDestPos);
5 `0 E4 X4 N: f7 p5 L+ T  E      g_DPlay.SendMoveItem(0,nSrc,nDestPos);2 g2 s1 c& r7 r
      Sleep(5);
; P% j: q! `8 Y' s+ j      //Error("移动 - %d->%d",nSrc,nDestPos);5 Z, l4 N3 d$ H8 O5 C; X7 Y
      nDestPos++;1 a0 k5 ^5 H( V
     }
6 a& F$ N3 y3 m6 F; F& F3 j0 x4 n     //取第一个元素的信息
- U6 t' B; G  I; l     /*
* v! o* o: R) [     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)3 |" s. `8 `- z% S$ h7 @5 g
     {
" ^  A2 |7 M! X: B6 u      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);" J$ @( `, }3 X8 H, Y
      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
4 h& {! n- t7 D, ~     }/ }5 M& Y" M$ n  i! ?  C8 g+ p9 |
     */
1 ~9 E: h# y; C& F6 z" ^2 {    //////////////////////////////////////////////////////////////////////////. g' c2 @# o% Q0 Q5 g% J7 T6 f3 _
    break;
, @* v) n) @: Y2 \4 Z   }& G  w/ I5 _8 [3 ~* ^
  }
; c2 a0 h+ t7 g! t! w6 B4 p1 v1 H}
  P2 C* H" ]+ S3 N* B8 K6 Sm_wndMenu.SetVisible(FALSE);
0 G6 d1 R% i/ g+ W* @9 b  c" l8 a" w, z/ @, ]/ R9 P( J7 Z
--------------------------------------------------------------------------------------------------------
% R  g  B  Z6 f( H搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
  S* E6 _, A( i$ e: t8 k0 y8 @4 Y- B{
# g, f, K* K% ~  m! [' I# KBaseMouseCursor();
6 j, D; [3 J7 Y2 }, K  @/ b}
7 T3 V: }, U8 y4 s9 Q1 C- s" o; m% f在其下添加:
1 G3 D$ S& c# w" F2 y( gvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
' r, `1 a0 n, ]; ~; `{
& R6 m1 k8 o# q/ \7 um_wndMenu.DeleteAllMenu();
/ F; S/ E% h0 Y7 _/ j. gm_wndMenu.CreateMenu(this);
' L& o* N2 g7 A+ w4 N) j' am_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");( u. ^# E$ @6 {* O# P
* I) `* s0 E7 U1 A* K% d+ B
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))5 |1 J& B4 z* A8 ~2 i9 x
{
- _1 X/ o+ I# j; H4 ^4 I  //P以上级别才可以删除所有道具
; _+ w9 u+ @& i: b  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");8 n; d1 z3 B/ n. |
}* C6 e) s: @. _5 f# E7 L0 B
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );! p  }: {) g9 a+ H* H; @
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );' P# H, I, y5 g. E6 X  X/ Z
m_wndMenu.SetFocus();
0 l* \) C9 O% F- Q! ~. _& I}
1 ?5 `0 }. |: c------------------------------------------------------------------------------------------------------------
, Y0 D+ b) e( F! e6 I*************************
; N6 m% h# {: z5 D5 `* lWndField.h文件4 R5 S" ~) L: j! t. D: K% o$ q# S
*************************) ?0 S4 V. D+ y
搜索:BOOL m_bReport;, m: R! a- X6 S/ h0 y, Q
其后添加:0 w+ D9 w' L' M1 j
CWndMenu m_wndMenu;
( k7 k) H$ K' n* N搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);+ k+ A) _8 J3 G6 b6 ~
其后添加:5 P/ L7 J0 [3 |/ p0 F0 }
virtual void OnRButtonUp(UINT nFlags, CPoint point);& S" N* A& r2 Z$ _4 L

  p3 u/ K1 o! j' g) P8 A" I0 ^% Z/ j" ]





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