飞飞世界论坛

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

作者: admin    时间: 2016-1-10 03:44
标题: 一键整理背包
源文件中_Interface文件夹下WndField.cpp文件. M+ W: D( i7 f9 f
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
! Q4 [  R1 m& c- s; _( B3 ?6 m7 c3 F( V/ H: n  _
struct sItem2 W% I4 F, p& Z# Q- ?$ _" B+ I
{
! J$ C: r$ ^0 w& r4 ]2 TDWORD dwId;
! M1 q" _- Z' o- p1 ~: |  c' KDWORD dwKind2;
! ~* }- l  T% C  ?# JDWORD dwItemId;
" \' Q4 _, ]: R% [/ k7 O" IBYTE nIndex;
2 c) l& @1 U$ u: f& DsItem(){
! b% s! l) H; Y3 U* `  dwId = dwKind2 = dwItemId = nIndex = 0;
6 A  A. `3 w4 b6 z}; K( t  c  z+ X4 _
bool operator < (const sItem p2)! ]* \% {( L) q4 r( g( E
{- [3 S, }6 m, }; d& m& d: H
  if (dwKind2 == p2.dwKind2), c$ i. k) }; y$ m3 Y2 E
  {
+ N* c2 W' m5 N6 J   return dwItemId < p2.dwItemId;  |) k/ B, ~: c4 d; S
  }else{% y7 F& y" V, w- P% y2 V0 _
   return dwKind2 < p2.dwKind2;# T( n; @% I& u) [' g6 \
  }
+ B1 A4 y+ m1 d: \$ S}
3 t. ]/ O6 ~) q; `  {+ t+ b* g8 n5 |};3 @5 U3 ^. |3 K& v9 U( j
class CInventorySort( e7 p# I/ T0 ~* X4 Y# c8 o
{
& j/ k, t. o8 {: c7 b& jpublic:! u3 I0 }' Q+ C9 K  Q
CInventorySort()
: }% Y3 M6 j5 W9 x{
4 y% H3 [) U# H1 D  m_dwPos = 0;/ N+ z/ o' H$ [# D- i3 d
}+ [3 H+ Z4 }9 F" H  U, y
~CInventorySort(){}" o  |. b, e" W' C1 Z- k7 Q* }  Z$ D
private:
% H% T, f5 t: g4 _sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
& Q9 _9 f0 H; tDWORD m_dwPos;# V" A% j& k0 e# W; f
public:
9 e; \7 k' @2 E7 k# w; \1 gvoid Add(BYTE nIndex)
# B; a- x0 E" b{8 }6 G8 _) i0 S' U) W, n
  if (m_dwPos >= MAX_INVENTORY)4 n) }# M! b6 E( _  p  F  J9 y
  {
" ~6 v, z' h' s' I) P! n   return;7 j0 Z/ E; N3 X5 g
  }
' E% q+ a4 f# C* E: E  m_Item[m_dwPos].nIndex = nIndex;
+ Z6 \5 W& O/ c8 \  m_Item[m_dwPos].dwId = m_dwPos;) I& H3 N0 U5 |" c6 X% t( S' a
  m_dwPos++;
* E2 i5 ~+ p( T2 ~4 Z}) x2 S: m6 `. l- A/ _
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
7 {( [& J& H+ [) Q1 `) i# k  ]  F{
: _  {0 K- P# l- w& v3 B/ m  for (int i=0;i<MAX_INVENTORY;i++)
- `9 p/ E  Z: ^( A% k  {
# D2 _: {% R4 c4 y% G0 h& @   if (m_Item.dwId == dwId)$ w. T8 s* h$ y# m
   {( e$ ~$ `( O: Z! b/ t
    return m_Item.nIndex;
3 y/ j3 {* d! `' ~) |8 i+ u$ C   }
3 T' r( C$ G8 H* ?  }3 G$ t$ `8 Y7 i0 {* r) G9 Q5 L
  return 255;
5 n) |0 K4 p( A3 T4 |}
* E: Y5 v* L% d" E( ]2 u3 Q) ivoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置4 r! x% H/ l3 y5 l5 U; Y
{
, o& M4 q8 r% y  BYTE nTmp = 0;6 R: c0 l$ J/ o8 v
  bool bDest = false,bSrc = false;1 E  ], u# n% t8 S" R
  for (int i=0;i<MAX_INVENTORY;i++)
3 U2 S4 [* r  D6 I  {, L0 Y3 o; Q+ D) u3 {
   if (dwSrcId == m_Item.dwId)
& d! x! t3 t5 M   {
7 ^2 S  g1 b# y" Z- L    //id相等 则 改变对应的dest和src
) M% Y4 E) h* r' Y% \    nTmp = m_Item.nIndex;1 Y9 C, G/ a; P& @1 ?9 u9 Q
    m_Item.nIndex = dest;
1 q3 }$ G; t) K6 I- j% l5 ]   }1 U) ?! h6 |8 l6 N8 T5 Q
  }" R, U/ e3 }: @, D. ?1 t
  //临时数据保存完毕,交换开始
+ T+ w* ?% w  N* C5 i1 K$ ?  for (int i=0;i<MAX_INVENTORY;i++)
6 F' z4 S, I8 E; G) J  {* I3 N( `8 e4 I  r. a, h4 l3 n" Q( C' H
   if (dest == m_Item.nIndex): p' g5 M2 b6 w" ?4 {& K
   {
3 Z& c! o$ t& J1 N    //id相等 则 改变对应的dest和src# h& o. a8 L, g2 g. e9 n5 |) P! b
    m_Item.nIndex = nTmp;& G! a  ]( L, F' n
   }
3 H7 d8 Z! `- d* z: z# K  }
5 R( H( ^6 F  n3 Y! \8 ~1 |% q}
# Z. [+ K5 H* R) C1 m+ D. L( E};
; X8 }. Q. m! V% }! f4 F-------------------------------------------------------------------------* v. f1 ?% y: |8 f
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
) k: S6 b( `$ G# i3 Y搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);0 \3 X1 ?3 ^: O$ X5 c; r' u
紧靠其上添加:
4 w' c$ ]$ N% g  n, b+ x: v* sif( pWndBase == &m_wndMenu )1 Q" r9 l7 u- T. v
{
$ v9 N- J, a% f% @2 y  switch( nID )
; Y# D& A  D3 j  {$ K' Y# N) ~* h* e5 F4 D+ c
  case 2:7 F) h- ^- q: Q  s: H! T! |0 ]
   {$ q4 z' D6 R. W8 b$ m7 u
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
( o: J; M. j. }* c    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)), n  R# y% }  n) U* r
    {- T* G# j( l1 F! Q# j+ v& S
     break;
6 [5 G1 k! C) q6 j0 ~2 R! ~    }& f2 }8 Q# \8 |, A  B  K
    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
9 W0 r! {8 U# j! t% L    {
: u8 u( e1 q- S( W8 K9 T3 W6 k/ Z     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);% z5 q$ P7 \; P4 H* h, l
     if( !pItemElem )
0 ]0 Z- ~& }* o0 q1 n2 \      continue;
5 c' I) \/ J/ x- G6 I0 I     if(pItemElem->GetExtra() > 0)
  q4 T: S$ c6 J/ [! \) v7 m      continue;
/ O6 a" r! y+ O! c9 H# {/ G5 W8 F( K     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
4 z: {. N6 v, N* x* H1 j" [. w      continue;. B5 R# Q3 z; f- w6 {* H5 B" s
     if( g_pPlayer->IsUsing( pItemElem ) )6 Z8 D( u% u4 r6 O( J6 E* b# H
      continue;
8 X5 {" w0 f# ]. p3 y( a7 L+ d     if( pItemElem->IsUndestructable() == TRUE )  h& t" v, J" P7 }
     {
0 f  _) x! I1 a' I6 w5 g8 ]      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
. O% g% e: J5 z1 X. S      continue;$ w9 @; I" h  ^4 S4 V
     }
6 ~# X7 S( F6 {" u" R1 l     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
6 D& |& e" @( U1 m    }
/ w4 M6 a7 ?1 ]. X    break;, T$ f7 m$ W2 P. F" y
   }2 n, A1 s% {; j4 W& a6 L4 |
  case 1:
2 e0 }0 M" V! u3 J   {8 ~) P+ G; R( @; c; x% Q/ {
    //整理背包- V, g9 |' Y" l: ]
    //////////////////////////////////////////////////////////////////////////
: Y+ [% T$ G3 O) A% y% c9 w    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );" r) d9 t  Y, O9 @' d& ]0 @" d
    //////////////////////////////////////////////////////////////////////////6 ^9 j1 z1 l% o6 S
    //////////////////////////////////////////////////////////////////////////
6 \! p7 ~1 G" g- t8 U/ j    CInventorySort* pInvSort = new CInventorySort;/ P) A; m$ F% s) t1 {
    vector <sItem> vItem;
( l$ h0 x3 y4 I, z6 s+ n6 N, i    vItem.resize(MAX_INVENTORY);//初始化大小
" @6 d* }6 G. ~0 E, j     //////////////////////////////////////////////////////////////////////////
, r* [# i: Z1 H. n     //填充数据: s5 l2 O; X0 e  Z2 x' P  I& g7 `/ E; K: g
     for (int i=0;i<MAX_INVENTORY;i++)
9 D% L' n  w0 {     {
9 f8 e0 \9 V" ]0 d& I) Z7 m      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);+ g6 k) ]( Q* J
      if (!pItemElem)
, L! P4 ?: ?" y+ [3 ^/ Z      {
* \$ o4 v6 W+ J! D" B( G7 Z       vItem.dwKind2 = 0xffffffff;
7 D0 X& y& n. Z       vItem.dwItemId = 0xffffffff;
1 f4 v5 q% k+ l+ E6 f9 d; B3 o& f       vItem.nIndex = i;! P, z- Y% X4 @  n, ]$ S
      }else {6 d4 A0 ~$ Z5 C/ F9 e
       ItemProp* pProp = pItemElem->GetProp();
. m3 X3 ^8 f( ^% ~4 L1 u# a/ h       vItem.dwKind2 = pProp->dwItemKind2;
. l% \" z2 t4 O" Q/ k$ e       vItem.dwItemId = pItemElem->m_dwItemId;
3 W0 T- S8 z, F+ c, S/ j- ?) c       vItem.nIndex = i;* p1 n9 C# c+ j0 f
      }- V% O( N  p3 R
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
$ _9 T( S  h7 t( N     }
$ O/ O* R# F) f' y     //////////////////////////////////////////////////////////////////////////: F+ R$ o7 _- x4 C& Z6 f8 `( b- G5 J# o
     sort(vItem.begin(),vItem.end());//排序6 ^3 ]2 o2 b' S% R4 e
     //////////////////////////////////////////////////////////////////////////
; d  c+ v6 ]1 Y( C  R+ X     //交换, |$ S+ _& F! e
     for (size_t i=0;i<vItem.size();i++)3 S& b! }# P8 A5 A$ M
     {
4 z. \% v" A& k' d$ P1 u2 ?      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);1 H9 C* K5 K* n0 z- K
      pInvSort->Add(vItem.nIndex);& y9 z7 ~2 k2 o; S% U
     }6 Q! ]8 J! @$ [, o4 w
     BYTE nDestPos = 0;
$ \  V  Z& p' [     for (int i=0;i<MAX_INVENTORY;i++)# m5 n, X* L3 g
     {9 b/ U3 M3 f3 `  ^* y* K  Q& E
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);% Z3 J) }* C9 ?% G3 B3 F
      if (pItemElem)4 I% k/ K% g1 _; y( V
      {
: J) j  ^" P' f' Z3 {5 ?% J0 f  e4 t       if (IsUsingItem(pItemElem))
  g. q; P* j; E1 D9 N       {8 Y- X: n% A+ v+ j' R) U- |
        //这个位置无法放2 k, e) K! s6 s
        nDestPos++;4 ^+ O1 ]: I8 [+ v5 k
       }
+ D  [7 e3 @9 I      }
0 {4 P& ~) j1 r. F      BYTE nSrc = pInvSort->GetItemSrc(i);
( M' a" C2 J5 a" z+ r8 q( a, ^      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
# W# x) d5 _& q3 \9 [      if (pItemElem)
' H7 m/ o3 c  ~3 o3 Z( p" T1 o      {& k% t4 N" X& {4 X
       if (IsUsingItem(pItemElem))* \9 |2 u  K$ A6 a8 F1 s4 f4 h
       {
+ ^% t/ e  A& ^: q0 R- m* `3 W        //这个道具无法移动,跳过
1 t# V4 E# t* I$ l2 G        continue;
  ^5 T9 A+ ^  E$ E$ v       }6 Y0 j- k( {7 Q- x8 g: q, A
      }else{9 _5 P+ h) j. \
       //空位置 不用动) y3 R4 t7 F9 a% Z' Z( g# c
       continue;
/ Z' Q. Q8 G% u$ r- F5 T1 I      }- E' i2 U, J! k$ D
      //////////////////////////////////////////////////////////////////////////; S9 D2 E8 B* A( R' Q$ m
      //开始移动  k! f- z6 q7 J2 U( m& H+ K
      if (nSrc == nDestPos)/ X- \2 n! e; h( g3 L7 ?
      {$ y4 n1 F# I  k% }7 N
       //原地不动5 b% G4 R% N5 F3 J. r
       nDestPos++;$ i# v7 o# Q+ a  \1 f, U% N
       continue;
0 S- U) {: R- s3 f) c! g      }% J% E5 A' ^  r+ H) |/ M
      pInvSort->MoveItem(i,nDestPos);% P! i1 i" S5 K! Y7 ]8 Q9 ?' |; Y
      g_DPlay.SendMoveItem(0,nSrc,nDestPos);3 M0 D) R  p, P
      Sleep(5);8 I5 t9 @$ B6 [. y7 j: I
      //Error("移动 - %d->%d",nSrc,nDestPos);
) ~/ D6 q* `6 O; ?- \      nDestPos++;
) b) n) ^8 U( [3 s% M     }
) ^0 |+ C: L& W" _2 G     //取第一个元素的信息
+ ~- U* F& ^. V9 ~5 y# Y0 W     /*+ R" t$ }/ L& P5 @4 W! k9 v& G
     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
0 H3 F& ]; u! t/ a8 M$ u  g  e     {1 m) [3 Q6 J/ b0 m+ v+ O0 R+ W& W
      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
; z+ a2 [. N- H, G: @1 x6 D      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);+ E+ Y  G7 l  U! Y. c; f7 U
     }
: k! I" a1 @+ ?5 _! o- z2 j' \9 c, N2 N     */
2 Z2 r7 j) \  A( m3 u5 x& K- x    //////////////////////////////////////////////////////////////////////////
3 I1 N, h3 h: {  o    break;
: R( O. T6 w3 u   }6 G* m8 s3 p" c; y' P
  } 8 W8 l* r) b$ Z$ s" Q* A
}$ H& A2 M+ C! B6 K8 v
m_wndMenu.SetVisible(FALSE);4 N. B% }  K$ K* K8 {

- X2 C0 @) l# \  U0 K; B--------------------------------------------------------------------------------------------------------9 A% x0 h- ^4 ^. O
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)( ]3 b% Z* ~( G. Y9 b1 a5 ~
{
7 L: G$ d! y( C" e+ nBaseMouseCursor();9 u! f. t, e: S. ?3 D
}* y- L& A4 F' o% k6 Q
在其下添加:* w6 ~; i: d( T9 P
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point). s. P0 H9 u) g" j0 ^+ a
{
0 I0 A' V3 i, [- @3 N7 M, @m_wndMenu.DeleteAllMenu();* |: K; t8 U: E) G
m_wndMenu.CreateMenu(this);) d" h; X) [0 k0 W; e% V! v
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");; z3 }! L: f5 h, a2 x4 c

$ I  X/ u: b7 y: N/ ^' Gif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))) g! H' _1 h! g& N& K
{
( A8 n7 c! I2 l0 |0 X" V  //P以上级别才可以删除所有道具
& i* l& k. S' ^" z8 Q  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");6 s" V$ K+ {# C1 D
}
- N5 _# Q. R! M% F' im_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
& x+ O' N, Z4 m- D% R! Nm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
" _4 B$ u% I/ i# Um_wndMenu.SetFocus();
3 n8 b( U2 ?. P. i! }9 K}
# ]! s0 _2 O7 {3 J7 O------------------------------------------------------------------------------------------------------------, I8 y& B+ _: T% S0 H
*************************
, c( a; K; R" _- ^WndField.h文件2 J* {" }! w4 Z) V  j0 X. [
*************************
) S+ z# A) j. W3 ?! c5 R2 F4 S" o搜索:BOOL m_bReport;
; ~8 A. k' n' C) z; U其后添加:
1 f- z- G! H% w" dCWndMenu m_wndMenu;
. B+ }7 w( L, f! ^7 N0 a搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
! I  b% h# W9 }" `. `7 e其后添加:8 r( F* j8 Y7 b9 j* Z" P; U& B3 ~
virtual void OnRButtonUp(UINT nFlags, CPoint point);
9 R( D% G3 ]+ P% m5 |. `' e: R9 f7 X3 V& _( E" J
! j. L: j: q8 _) D0 e





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