飞飞世界论坛

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

一键整理背包

[复制链接]

197

主题

203

帖子

1078

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1078
QQ
跳转到指定楼层
楼主
发表于 2016-1-10 03:44:56 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
源文件中_Interface文件夹下WndField.cpp文件
: l4 W' C' v, F2 b9 w, A搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
$ c, }0 v' X- F+ l% _+ d- V. L8 A7 m) t
struct sItem
+ ]0 {9 ?& h# V% `{3 h6 Q' I9 j; A+ ]- D; C
DWORD dwId;8 b* t3 ?  ^: |# B& v
DWORD dwKind2;
1 x, n2 B+ ]5 W9 ADWORD dwItemId;
) U3 J7 Y3 W# |4 R0 X: M7 SBYTE nIndex;
: O/ {( b$ N- G3 r: W+ lsItem(){
# o8 J( m% h/ ?/ Z) k, Q8 _  dwId = dwKind2 = dwItemId = nIndex = 0;& P. I+ [; f7 q3 a
}% |- c/ K& ~: K% L" a
bool operator < (const sItem p2)
( n4 u% V' v: T, Z- J' G5 m{
2 e  Y# I: h: i; K8 B1 J  L- l  if (dwKind2 == p2.dwKind2)
# N0 A: K! i! v& S& N  {: z: r- f! D1 s* i
   return dwItemId < p2.dwItemId;' M' H! M0 F+ I. V- n5 {3 E
  }else{  u) G/ T& l9 A5 |5 T
   return dwKind2 < p2.dwKind2;
, {9 h1 M4 P% v' ]  }, A2 H; U, w- K# @- `
}4 o2 x8 P: Q; W( f$ k7 @# L
};% }: P; M# k, f! q6 U' D
class CInventorySort
& G) K( [; Z2 h2 ^1 i7 g{
/ @8 J8 Z! o  K0 n2 X, ^public:
; v: o1 c* J( MCInventorySort()( m# l. a% D( Z
{
& }8 H' ?3 ^' B, H& L. y5 S% k! j* \  m_dwPos = 0;  y3 Q) L' M6 t5 |) H! J+ K3 G: m
}
# l* o+ a# f! t% D5 R% S~CInventorySort(){}
+ {! E" @* ^% o/ |+ Hprivate:+ R6 d2 ^' }$ h9 O: q
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息+ U5 t+ _( A8 Z; I% H' F7 {  A
DWORD m_dwPos;
$ h, P/ g+ Q: q+ npublic:
4 L/ `# @" p, G- B" Z# X5 Xvoid Add(BYTE nIndex)
$ R  T, T- J$ T/ ?6 }2 |6 m{; l1 \7 W# }0 S8 Y: I5 P5 x
  if (m_dwPos >= MAX_INVENTORY)
1 g# b# V; c8 g  {( T5 w8 ^, ^$ s' B" I
   return;
# w5 P7 f# o% U# M/ F/ W  }
' ^) r5 x5 l; d8 T0 L( U- y  m_Item[m_dwPos].nIndex = nIndex;
6 R# ~$ Y7 z) a; |7 Y  m_Item[m_dwPos].dwId = m_dwPos;  w# u) u" R: j
  m_dwPos++;
+ r% r8 h5 {. F) z  e& D1 p" M7 Y}6 N# @% v( ~+ v
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
8 B, t8 O, Q; l  h/ B  W# h$ e. z{
1 p4 c+ u/ A  F7 f) J0 K" Z- N9 r: [  for (int i=0;i<MAX_INVENTORY;i++)
; J  w+ f0 P+ y  {7 Q7 O, e* k6 G6 i7 b! y) g
   if (m_Item.dwId == dwId)/ S# f; J! M% w3 w
   {
0 H4 w: J9 r0 [% A    return m_Item.nIndex;
* o: _8 i' S/ P; z4 n7 R   }
: W' N" c7 A& G$ }8 P  }
9 j: _, f( u2 ?9 J# ~  return 255;0 R7 c9 @& V( Z0 z
}/ b& B* P" [7 \  }! [  g
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置- L: D0 t# ~" N
{
3 O( X( }* i/ ^1 c  BYTE nTmp = 0;7 {$ R2 X+ _. p9 ^- {
  bool bDest = false,bSrc = false;
9 H  E, \4 Y$ p7 d3 {  for (int i=0;i<MAX_INVENTORY;i++)
, _; R4 @7 [4 M  a  {) ?& [+ o, s; z2 _+ Z/ n4 ~9 q
   if (dwSrcId == m_Item.dwId)
9 V* o  @5 y$ I1 i; h: D! Z7 O   {
- c8 S6 ?5 }% U, Z% ~    //id相等 则 改变对应的dest和src
( u+ Y( ?0 F$ \! |: y3 C  N    nTmp = m_Item.nIndex;
* G" e/ I( i* U4 ?. P; z7 d  S    m_Item.nIndex = dest;4 I/ j5 H: K' {* q+ k, _& g" r8 h
   }. {5 M/ b9 T# c  D0 M9 j6 z  L- g
  }
& Q, z' C+ c4 e! V1 C/ }' Q& @  //临时数据保存完毕,交换开始2 j! `; \% W% X3 y* e. d! G
  for (int i=0;i<MAX_INVENTORY;i++)
/ c: {0 o; U" f  {
: e( G8 w: A$ w- R( Q' O3 A' e   if (dest == m_Item.nIndex)
. R, ?" \. T" Q/ S2 [8 M   {7 v" d& ^9 e; q5 t4 p
    //id相等 则 改变对应的dest和src
* A5 g) D: Q0 {    m_Item.nIndex = nTmp;; \/ e  N- o( S6 X
   }# ^/ v) O! g" m8 ^
  }) H( `1 Z, o- D; i3 }. U& e8 T
}
0 m% ^; R1 L0 d! Z2 T; s};
( R' W% l7 {7 H8 f) g-------------------------------------------------------------------------
0 H5 c: l: A! X6 w7 f% E依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
. H* A3 K1 A9 i) O6 G6 P! b% o' M搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);/ Z2 }) h" x; a" p5 T: W" m: O) s
紧靠其上添加:
) g, P9 f4 F" T6 _if( pWndBase == &m_wndMenu )' e6 f: p6 V4 L1 M# m* d
{
1 ?; E: l& ?  n  switch( nID )
/ Z" j# d9 B: v; e  {; k4 V: x7 ]8 v4 J/ i
  case 2:* [' `, i3 ^$ Y7 A) l4 d
   {$ k- \) Y! Y" R) c+ H6 Z
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);$ L0 y, d7 s' x5 I) o+ L0 |
    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
8 k% s6 r: }* l. A3 @    {- G+ C  i( D/ K1 [8 ^- [
     break;
5 }, g3 U# w9 T3 g9 V% N    }, I# l* b& R* V9 t* S
    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
& t+ |. N  A. s  q$ _, n0 T3 Y+ S    {
8 \$ B5 L! Z- {8 ^4 N     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
; C% k$ n. j# e. M5 t9 E# t8 t, k1 O     if( !pItemElem )1 c  j, Q3 v0 E! g- a
      continue;
' H0 \8 J  `$ ^: z7 |7 ]3 I! R* @     if(pItemElem->GetExtra() > 0)
" @9 c, [4 P# O7 G      continue;# q7 t9 y" q2 m' p9 \+ Z
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
  @: V) E2 E7 `  b$ G2 D  q      continue;
- [4 C8 n9 L) @* W+ t0 G9 Q1 N     if( g_pPlayer->IsUsing( pItemElem ) )& S4 L7 c# z$ w+ }- o- ?  a
      continue;7 s. l( u  X# c$ H
     if( pItemElem->IsUndestructable() == TRUE ), r4 e7 o0 I- s' {$ g
     {
+ s& l! D( U  K$ |* ?      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );9 f$ m+ o) ^% U. `
      continue;
0 u, p' |8 T( w( b) H     }9 T  Q" q! @8 _% {, J
     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);/ X$ |9 |9 J  |9 M
    }
9 `& G  j3 ?9 {$ [2 ?$ X1 L    break;
- P7 `5 k9 D/ Z$ r( ~3 E( o* I0 j   }" Z: h; o' m7 ^) T! ]9 g+ q  G
  case 1:
* [! c9 d) C: `$ e  N" D/ w   {. ~; O+ _& g+ ~9 k" M. m& r. u* X6 o
    //整理背包( @1 p8 ]* f7 k  F: _/ `/ C
    //////////////////////////////////////////////////////////////////////////
. s+ U1 u; M- _' Q/ d    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
; f( `1 [7 p) ?# |9 F    //////////////////////////////////////////////////////////////////////////9 i; \0 N0 O" N' S! I8 q0 s
    //////////////////////////////////////////////////////////////////////////# ]1 @, F0 f- N& ?/ z3 O2 d
    CInventorySort* pInvSort = new CInventorySort;
0 B2 @3 C- y% y+ d    vector <sItem> vItem;
  N4 T/ E5 M4 T2 ^7 Q    vItem.resize(MAX_INVENTORY);//初始化大小
! f6 e) }) E" h4 F$ |     //////////////////////////////////////////////////////////////////////////
8 d* d/ m  G! ~     //填充数据1 ]' O4 @5 u! x9 H
     for (int i=0;i<MAX_INVENTORY;i++)( Y- {6 B( A3 p2 L) i, g5 q/ Q
     {
- l  K/ y/ S0 A# o& x      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
; v% z  f5 k; ]      if (!pItemElem)' n9 d2 k0 B  \9 j
      {
' l1 @* {- {8 M5 f7 D  v  \       vItem.dwKind2 = 0xffffffff;' D( C$ k- O/ [* U" k2 p  Z7 q
       vItem.dwItemId = 0xffffffff;
/ c0 z# ^  P# y7 R       vItem.nIndex = i;# h: C- T8 O6 ^0 K' `6 J* `5 k
      }else {* X" B  E# h% C7 I' @$ e- j4 c5 P
       ItemProp* pProp = pItemElem->GetProp();# v9 m: J6 l0 E3 z, P& p
       vItem.dwKind2 = pProp->dwItemKind2;
$ N" u) ]# w( B  i/ Z/ e1 b  j       vItem.dwItemId = pItemElem->m_dwItemId;
; E3 O" w7 l) F1 w) M3 q. V       vItem.nIndex = i;3 M( S' [8 |; ^9 r
      }. n5 e; T; g  B& L- b* Y
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
" E1 A' a# z6 e     }
& I; d' |! c6 A8 ~" b' N! ]- j) T     //////////////////////////////////////////////////////////////////////////& h( p  d5 w4 f, T
     sort(vItem.begin(),vItem.end());//排序6 ?8 U) ~" `/ O9 ~% G' H
     //////////////////////////////////////////////////////////////////////////5 O: J. z) i. m
     //交换
: @0 M% ?" }, p, D7 C3 D* s' |     for (size_t i=0;i<vItem.size();i++)
3 D% R$ M- ]* [2 S/ W     {- l: c- _7 m' C5 P( _' _8 ?/ f* P
      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
9 K+ j# q) U6 y% a) d  x      pInvSort->Add(vItem.nIndex);  n  _) H, E7 k% A4 h/ E" {
     }
+ o" n1 c) t2 u# w     BYTE nDestPos = 0;  T- S7 Y5 M5 C
     for (int i=0;i<MAX_INVENTORY;i++)
, q1 [" u* y* X2 |     {5 v' j& R# J$ E0 r
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);6 Y3 V/ o& H5 V+ C# w
      if (pItemElem). N4 ]# Y2 i2 `( E
      {
0 T! E% f6 d4 K) {6 [+ Y8 {2 n/ w       if (IsUsingItem(pItemElem))9 D4 K* c( W0 V  a& f
       {) k4 N/ C  x" K0 A) \
        //这个位置无法放
; a; m6 o% H/ z+ t8 K/ y        nDestPos++;
. Q% |6 d- Q  z6 i2 R/ h) Y       }
: T4 ]( B* j6 }" I; R5 C      }7 [" ]; u1 M& I) V- h' A9 a
      BYTE nSrc = pInvSort->GetItemSrc(i);7 e* I/ f) l% w2 V9 Q
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
7 P; x% t8 f' a& g      if (pItemElem)
0 M  R1 i8 d6 G9 p- u, I      {) |6 w& T9 P" M: O' d$ O
       if (IsUsingItem(pItemElem))' M  P% W+ M) o* N7 V
       {5 x: M6 M. d5 Z9 D0 v
        //这个道具无法移动,跳过! a' U  Q7 }9 t4 X- j, S  j6 u
        continue;9 c; l( D; L: V' C2 j6 Q
       }
) k8 y: p6 A. F: C      }else{
$ n" c. N. R- K: a# |       //空位置 不用动) [, R/ V# N% s6 J6 L2 P# {( g) ^
       continue;
4 u8 z$ o/ N. `1 Z1 K      }* Z2 A+ I5 d- M* D! b$ V5 C
      //////////////////////////////////////////////////////////////////////////
7 v' J$ [8 P7 X6 J; h" g/ P4 Z, g( a      //开始移动
. ~5 _. W4 u0 w7 ?+ X8 a0 H      if (nSrc == nDestPos)
' e( Z/ ^( v8 u+ X      {
# @* r, B$ H& V2 E6 {       //原地不动1 Y6 g+ |- w+ D4 I: X4 r( B0 @
       nDestPos++;& ^" U* a* _/ @3 |- Y5 h8 P, r
       continue;
: m# p+ x8 Y$ t1 S2 ^6 o* c      }
  W6 f! Y- K5 d  b      pInvSort->MoveItem(i,nDestPos);  J, ?- P1 o0 E4 F( I
      g_DPlay.SendMoveItem(0,nSrc,nDestPos);
8 }4 B8 j0 n9 ^) y* N      Sleep(5);# ?0 G! q: J" i: X3 U9 V+ \
      //Error("移动 - %d->%d",nSrc,nDestPos);( _2 J; J$ b( P: d2 K( Z
      nDestPos++;0 f: t0 U; ~) ~9 S. _; u
     }# b7 Q6 F& ~6 G3 u# w
     //取第一个元素的信息! w/ q4 }( y4 ~2 E8 l9 K6 R
     /*3 H! c' [. T( I1 R/ G: _3 `# L
     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
* |; ^3 r& U6 S  K5 c8 N. V     {
% S6 t- A, G7 h9 v      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
. u3 N4 |: O( u. [! B4 P      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
) C4 X% v% t. @: J# F/ l1 L/ ]     }6 I" L! ^+ `8 I. Z9 |) A
     */8 c5 O* E; I6 {) L, K+ D
    //////////////////////////////////////////////////////////////////////////
. D5 c! m& ?, L7 k7 d1 c) B    break;
" s: f9 ]/ }( R5 p! K2 V- ~- a* d   }
: x2 o% c9 e/ b+ e  |2 ]  }
- }- z3 g) B1 Q4 `/ k+ N% C* {}. V' ?3 K1 t0 t9 E
m_wndMenu.SetVisible(FALSE);$ D2 [9 s/ @, I& A5 ?

0 [, W2 u& f( m--------------------------------------------------------------------------------------------------------( m& k+ i/ T8 X$ u6 Z5 Y
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)6 m; H5 d5 o- m5 g# S; u% u2 c
{
5 i% X7 \: z5 U! Y2 P) S; m4 g6 p2 R/ @BaseMouseCursor();! N+ T" d- f) W, l
}6 f9 V( j- U4 d* ]0 z' h
在其下添加:
3 |3 h! M5 Y: S. u& v. Y4 |  \void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
6 R" B* T  I$ M& I{  t; c5 R8 c7 ?# `6 ~
m_wndMenu.DeleteAllMenu();
1 L; e4 s9 W# K7 B8 I# ?" ^' d+ xm_wndMenu.CreateMenu(this);3 e* b! @% T! w  W
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
% \, w8 x2 ], \' {% h; U. Z1 y+ m8 I
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
! a% ~6 P4 W  ~{( P8 T/ _2 J3 |, L% f. b
  //P以上级别才可以删除所有道具( S, a$ e, M& I& J8 K5 F% k5 d
  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
) X! k2 ~: J* W% R- \}# K2 i) X8 t& c; J2 e
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
6 t2 N4 j: W1 O; gm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );: J% @# y0 D. q9 ?: Y, ~
m_wndMenu.SetFocus();  f# K  Z) W7 w% f
}
" R1 t$ n$ i* y4 f* [, Y& a  B------------------------------------------------------------------------------------------------------------
; |6 |# O9 P) l*************************
: T* w8 L" ^! LWndField.h文件
+ V7 A: I& ~) v; j*************************
# D, Q3 K) D0 M' x9 f1 y1 }" t! b搜索:BOOL m_bReport;
0 a4 W( i, i. R8 M0 r2 y/ q其后添加:
9 v0 x# y& m. B  V. jCWndMenu m_wndMenu;
" r, W* F" V3 y4 J: y) R搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);- w  U" _/ j7 q3 L8 \$ ~
其后添加:/ z5 a+ J$ @" U4 n3 ~' y) t
virtual void OnRButtonUp(UINT nFlags, CPoint point);
) _# ^/ R6 i5 D$ C3 K& k. P$ ?6 C8 d$ E  ^
7 Q3 A5 p, X" O, U

相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-22 23:41 , Processed in 0.070342 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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