飞飞世界论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 18367|回复: 0
打印 上一主题 下一主题

一键整理背包

[复制链接]

197

主题

203

帖子

1086

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1086
QQ
跳转到指定楼层
楼主
发表于 2016-1-10 03:44:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源文件中_Interface文件夹下WndField.cpp文件
  J/ X% a1 W+ k搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )6 c# X  v- o- j
2 t. H- G+ s' P
struct sItem
& V5 X: Z% _- j1 \9 _  C{
. x1 U& g2 R! J) vDWORD dwId;
+ o8 ~9 j0 N3 D8 D: B) KDWORD dwKind2;
) H* }7 r+ v2 m3 m7 g; c" V( h0 oDWORD dwItemId;
" e6 B! k8 B7 U0 Z: |' MBYTE nIndex;: S5 W4 O! y0 J- O" J+ Y
sItem(){
5 \. w! ~. @9 b; D! O  dwId = dwKind2 = dwItemId = nIndex = 0;- V! ^( d0 h; f- |1 Y1 j; G7 ?. o/ H, I
}
/ T! F' ~1 Q( @8 h# W; B: gbool operator < (const sItem p2)
0 @8 r; V3 \4 O9 d1 }: y{
8 ~* d& ^" M9 k: R" u9 m( D% R4 I  if (dwKind2 == p2.dwKind2)
# W2 p" v. F9 F1 B  {& s: K2 E( M6 A) }; z; v% V
   return dwItemId < p2.dwItemId;
3 i4 X# b/ W) S  j: E! ~  }else{1 u# o/ v- I# |5 b: E
   return dwKind2 < p2.dwKind2;
5 V; J! T3 O5 O; j) ]  }
9 m, Y% K" [& R$ f+ s6 d}
* e$ l4 Y6 V6 i& w6 G( H};/ E8 Q1 J& `. L0 e0 g  \% Z4 S8 `# s
class CInventorySort% c; l, v' V6 Y7 j) S
{
. t0 v( H  t, B/ t- e% N  D; w" Qpublic:- r' R; I+ c- M* J- V
CInventorySort()( N$ w2 N- U/ x. ^; l7 y" q- q) Y
{5 U0 m! h- n; d: ?0 A
  m_dwPos = 0;+ c0 b0 ]" ~  i6 D5 X3 Z8 S2 n
}0 C1 A: \1 Z* }8 q/ T/ {$ t$ E- B
~CInventorySort(){}
6 B( o# {2 w9 ]3 h) `! X% Kprivate:. o+ r. K" j: B' t* V
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
/ Y! b2 s+ c% M. l2 ?9 GDWORD m_dwPos;. l7 R+ p; ^4 A4 [& W9 ?
public:
6 W1 o% f, l, wvoid Add(BYTE nIndex)0 Y, Z0 t% E: k  k2 V. s1 i
{' o9 P% Y6 n( U) A, H$ z! z
  if (m_dwPos >= MAX_INVENTORY)0 ~6 P7 O4 I% j; {
  {
3 A, A7 Y: y, b   return;8 m+ M$ r( ]2 ~6 A
  }0 O" W. W4 n" X5 r- Z& T/ H5 w
  m_Item[m_dwPos].nIndex = nIndex;
9 s) [7 H( `; v0 o+ C. V  m_Item[m_dwPos].dwId = m_dwPos;3 k; r  G3 u! M9 M& s
  m_dwPos++;
' S7 }* K- U- s7 w}
% g' \: M- U( y/ o  z; PBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
" @( M' v( G/ g# }2 J+ ~{* e6 A0 ]- M3 e8 U% p3 k7 ?# J- z
  for (int i=0;i<MAX_INVENTORY;i++)9 c7 B% ]; E+ g) J4 L
  {% R# {  h+ Q6 A# R) c9 _0 G- K
   if (m_Item.dwId == dwId)( D: e7 V1 \* b* G2 G$ z$ x
   {
- K+ m: w% r" V! S. U    return m_Item.nIndex;$ ]2 B  j% w0 w8 q( C
   }) V3 K0 Y5 A+ c4 m
  }
" @$ N+ E& [  t  return 255;3 p0 `9 o- f0 h; R; E3 u
}+ `; }# ~" b6 v
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置- V6 N) @. F. D
{
1 k' l/ v  l  w4 \6 L4 G  ]; {1 @  BYTE nTmp = 0;: t* b1 f, ]) u) {( A$ {) _
  bool bDest = false,bSrc = false;) ~9 c9 E+ x  x3 G* s& u
  for (int i=0;i<MAX_INVENTORY;i++)
  ?4 K5 [+ P4 }1 X2 Q/ ~  {# i. R0 i0 f7 U) Q* H) F0 U. ]
   if (dwSrcId == m_Item.dwId)( d/ x! ~1 j7 v( y% X1 v+ T/ M
   {
& z4 [' s' d9 l/ z3 Q$ n    //id相等 则 改变对应的dest和src: Y% O7 Y3 F- U
    nTmp = m_Item.nIndex;+ \. x2 Y- h8 a  V- m! C
    m_Item.nIndex = dest;, v$ v4 g- H8 {, V  f
   }
+ C9 c* z8 J5 |4 B. W8 p  }
% x; _; f) Q3 L# r% d( D  //临时数据保存完毕,交换开始( C- b& k: e0 o+ r3 i
  for (int i=0;i<MAX_INVENTORY;i++)! M$ v. ?) |9 Q6 O# ?+ Q
  {
+ n8 f4 R/ t  K# W* r' x   if (dest == m_Item.nIndex)
! b* {" x& N% q9 h9 c   {1 w4 y4 X3 e. U9 |- R/ |
    //id相等 则 改变对应的dest和src( }% X! `' K3 m$ {6 ?5 c
    m_Item.nIndex = nTmp;  J# t* e+ q4 R7 p" _9 X
   }
" F( q9 j7 M' X" |& m  }+ A4 E3 W5 S& M3 \( S; g3 T8 w
}
# p& t6 G3 E) j( O9 V9 ]; X: C! l  ~};
: i; h; I# I# l  \/ L+ I( |-------------------------------------------------------------------------
- E* g* ^" {( P# C依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
- N: P8 p+ S% @搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);0 ^. v: w7 h- I" g
紧靠其上添加:; v, s  F2 i" |- A9 v/ }1 ?5 s
if( pWndBase == &m_wndMenu )0 n0 n4 x) v, Q* N. ]
{
$ C: r; H8 d! ]2 l. M' m, _0 `' g  switch( nID )
. H' x& g& w2 Q" r  {# u$ ?% Y( S' j* y0 A# V5 X
  case 2:/ m+ m  v4 w4 c9 d. _4 Q" v
   {0 y+ r: S8 `* ?! V
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
0 j( Z, J0 z6 A) E! g0 F' a    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
2 m! g. Q3 x% Z! |    {
$ |; g$ q$ A9 C3 t- {- X0 p     break;
3 b; R) {2 B9 O9 B  _3 @    }* o* j7 N4 P( k) E9 _
    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)- T* n2 _! i9 x* z1 j/ O3 V, ?+ M
    {6 y6 w/ Z* ^( Q5 C3 K; K
     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);' m! ]1 f+ j4 w3 D
     if( !pItemElem )
( ?  m: R# H" A" ?  Z# }5 e1 E      continue;
4 P* d/ }2 i- a     if(pItemElem->GetExtra() > 0)
4 w0 F3 R5 F. F, x) \      continue;3 Q9 M* t0 F2 {; \+ u
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) 0 U# y, d" s3 x& Z. j! n8 Z
      continue;! N9 k8 j! g2 O9 P/ l& |( L( k
     if( g_pPlayer->IsUsing( pItemElem ) )) y9 r/ b: A& f; y
      continue;
& f- [# c1 s# z: v     if( pItemElem->IsUndestructable() == TRUE )
: l: C; k) w$ \- u& z. n: }     {
1 {) ^5 n0 C+ R( |; F      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
1 H: s6 I& T3 x+ m+ V. o      continue;- d% x" @5 `8 w  f. q8 G7 j: h$ u
     }& @; a6 P& `: J! f! z; ]
     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);$ L) }0 k$ k  H; @
    }
& w) u2 k0 ]" G) n    break;% ], l5 c7 K" q
   }1 t, k8 q- H% M! O; M" I
  case 1:
# H" _/ o% Y; H- y- {% ]4 Y  n- A  A   {4 b% k2 h( E$ ^( L! k; j' _% C
    //整理背包* j! b; O# V, ?  B3 @
    //////////////////////////////////////////////////////////////////////////3 X2 [% s5 D8 G# F" G0 c  P" i
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );% u  X5 r' B( @5 c( Y) X
    //////////////////////////////////////////////////////////////////////////
! S" X/ J2 N7 D& \3 X% I    //////////////////////////////////////////////////////////////////////////
; X1 |% t- c* N( }# U: V% R    CInventorySort* pInvSort = new CInventorySort;. M! f! ^3 f5 E9 J3 n- C
    vector <sItem> vItem;: R/ }; s/ N5 \( C; ^
    vItem.resize(MAX_INVENTORY);//初始化大小# l- c8 M$ s5 j' F$ E% r+ \
     //////////////////////////////////////////////////////////////////////////
' d" \: g* P# [% t% M     //填充数据. `. |: v9 G5 {1 }- V2 @" B: F
     for (int i=0;i<MAX_INVENTORY;i++)" d. M; t9 G6 i, G
     {1 G. @/ a# |6 E  r- H
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);/ C+ L3 x, f/ E/ w7 F2 v
      if (!pItemElem): \9 a- `- [# J* p! c! x8 y; y; Z
      {# K2 v2 U7 K2 q; I, H
       vItem.dwKind2 = 0xffffffff;( u- P! O8 j# \
       vItem.dwItemId = 0xffffffff;, E( ~, U) R! ]- {) q' N
       vItem.nIndex = i;# U- @9 S+ ?6 l0 v* _/ B" A
      }else {
, V$ F6 y7 n: T7 ^; O- o6 S! \       ItemProp* pProp = pItemElem->GetProp();
. G) y: V4 J* d6 D" i       vItem.dwKind2 = pProp->dwItemKind2;) y- ~0 `, V* Q; I
       vItem.dwItemId = pItemElem->m_dwItemId;8 J  g3 i+ `7 `6 z7 K$ T/ b
       vItem.nIndex = i;5 K! p9 j- F9 Z) \6 b$ |9 d/ q0 [
      }9 g  }; N* ^: g$ t' o
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
3 \% F" P  s5 x5 }: Q$ M+ V     }+ A  F8 Z0 C4 {" F$ O1 h
     //////////////////////////////////////////////////////////////////////////1 g0 B1 G; {: \, Y" M% }
     sort(vItem.begin(),vItem.end());//排序& ?5 L- u" X7 X
     //////////////////////////////////////////////////////////////////////////
/ @! G3 k2 |5 K& X) a! ]     //交换
/ \6 z, }; k. B$ F* [. J     for (size_t i=0;i<vItem.size();i++). ]  a5 q8 S4 `6 ?# r! c; B
     {" a! M1 d* I0 _) ^* X4 V% t$ b
      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
+ D1 {7 q, R1 S4 g      pInvSort->Add(vItem.nIndex);5 h: |( ?, o5 }) F, _8 k: r( {$ K
     }1 q% E6 ~- n0 L, H5 B$ ^
     BYTE nDestPos = 0;
) n" b" X1 J; U' ^2 K( a     for (int i=0;i<MAX_INVENTORY;i++)
; U) q. A9 c* ?& C     {2 Z5 J% o1 q: d% g* S
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);1 a2 e3 i1 }8 e2 e" z% ?
      if (pItemElem)% Y7 g. g% V8 ^
      {- s3 P/ n3 \2 ~' N8 c% K
       if (IsUsingItem(pItemElem))
/ N3 L8 q! b3 s6 L( e, {% N  U       {6 J) A/ ?0 a% y# r) w
        //这个位置无法放) B# a( M) ?: N% y8 \
        nDestPos++;
4 w3 X9 Y: `0 C/ g9 k8 x& e, M2 _       }
; K; w- h  e$ y+ j" z# v5 k      }
8 s3 ]4 ?- P( Y* J' U. f5 ?      BYTE nSrc = pInvSort->GetItemSrc(i);3 z! i3 C8 F# f8 Z
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
6 x# T+ M% d* K      if (pItemElem)0 X0 M. t4 [; w* ?
      {  V, y* Y( H) h" j5 F1 |  c
       if (IsUsingItem(pItemElem)), q& |  n- |; B
       {
& y  m, [1 O. B: E7 t7 J6 h, v        //这个道具无法移动,跳过
3 w' r% s0 m- B; W        continue;
0 a3 @; t1 c3 I1 W2 g3 Q, I# H       }. [+ j$ C( j0 O. H5 h7 G" ^  m
      }else{& O. {) ?* b0 {& Y6 O  {5 g
       //空位置 不用动2 x+ I" ^! ~5 p5 ^
       continue;+ a( p$ c3 y* g" \" Q
      }
' q0 R- Z, ?$ T! b) ^' K      //////////////////////////////////////////////////////////////////////////
+ |: C, J% |2 H+ y% J+ H. G      //开始移动" r7 y" c* @( ~+ F) p
      if (nSrc == nDestPos)
9 a* O, z: [6 o( |# a6 o      {' Z1 m8 K- C' ^+ k6 Z/ n& R
       //原地不动
0 Q# O" ^8 h% p* Q+ m/ o7 r, t' N       nDestPos++;
4 v2 D8 H; x- {. N/ C* P       continue;
9 h+ I9 a! e( k  B" p8 R      }5 P+ ~2 _) A, B0 Z. q; K, r/ [6 j
      pInvSort->MoveItem(i,nDestPos);
. `$ }) `  P8 d) g      g_DPlay.SendMoveItem(0,nSrc,nDestPos);
0 `! C" _; w4 g6 o9 l0 p( t      Sleep(5);' B' e6 z( Z. I& p9 W
      //Error("移动 - %d->%d",nSrc,nDestPos);
1 y: T7 n" [  m' g8 [      nDestPos++;
' k  [8 M4 e4 R     }% f+ Q1 @: W: b$ H. c6 T
     //取第一个元素的信息
9 S4 _" \5 D$ `% q7 z/ {     /*
  O- p4 P8 l- p' M2 j     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
2 _3 [- J9 I8 b3 I8 z     {% V  D1 E# m$ [. k2 D6 w5 }
      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
" K* Z3 G$ N0 y0 V: W      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);8 \9 o/ z$ o# \1 N# |& b
     }7 N' w$ B; h6 {8 f
     */
7 N( w+ F) C5 O    //////////////////////////////////////////////////////////////////////////9 h9 O: I5 c7 e- D/ L/ p2 ~3 c7 X
    break;
8 Q  W+ p" \1 V% q. L/ x   }+ ?& I/ F2 V$ {- }
  } 2 o" N# ^: e1 s6 V7 n% J5 }4 B
}+ s7 M. h% z6 T/ a' S8 C
m_wndMenu.SetVisible(FALSE);
; p2 B. Z- Z. m* a  u* f
( O6 B: s' h9 _% g6 b--------------------------------------------------------------------------------------------------------
# B! F3 x( s" J( J搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
# {3 ]6 ?' h, h+ q% y' G. U) S{, P) n* ~* J& S
BaseMouseCursor();
6 q# r2 S' }2 E, U5 m}
% w4 C$ X' c8 k8 T, I在其下添加:
( c& v$ v. l% N9 K, n. H5 |% ]! ]void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point). _1 ~: o: a. s& v# ]' V4 v0 i
{* S# A& E! x3 k9 x% j+ R
m_wndMenu.DeleteAllMenu();
! z1 Y# R, w$ m7 L6 zm_wndMenu.CreateMenu(this);
7 }' e7 N' D9 y5 H' n7 @+ Sm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
8 c' c( x% t9 H2 |! R8 K
' u, @+ k3 U% C. Aif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))) E' S, e9 y! ]& J6 s0 r. J- q* {
{. o2 `' W' P6 u) u8 c: D
  //P以上级别才可以删除所有道具  \  {1 w* Z: X" L2 i. D
  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");  g% z: a& m+ y( z) a; O" p
}
5 g( a$ r; g" p: t" F* q5 Jm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );, }2 B2 c% o2 I2 t8 m! i
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );5 [7 J& G9 ]' ?7 ^0 ]4 o1 T' Y
m_wndMenu.SetFocus();
( v  j8 F0 P1 A! v5 T  S1 W6 G0 n& F}
* l$ n# M+ V* |& M* s/ H------------------------------------------------------------------------------------------------------------
' L3 y+ z% J; _9 q3 @0 d*************************
  U. ^1 \- S$ a+ lWndField.h文件0 w5 ]5 A  b& i8 h# c/ l
*************************
' P, n' c5 B$ O% d9 ]4 z( V搜索:BOOL m_bReport;
, @& B- d/ A: F2 d# `( ^+ {  N其后添加:. N$ L) B; |* M
CWndMenu m_wndMenu;
' }/ V: C3 l+ Y% V- V+ m0 j搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
+ D; l* F5 W% y0 ]6 V其后添加:
' W" ?: H% q/ j) Yvirtual void OnRButtonUp(UINT nFlags, CPoint point);* r% e0 r! E, [: z" l6 a) C

9 y# g& u- M, ^& k# N
5 @/ N( T$ g6 x

相关帖子

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|飞飞世界技术论坛  

GMT+8, 2025-12-9 06:38 , Processed in 0.069763 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表