飞飞世界论坛

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

一键整理背包

[复制链接]

197

主题

203

帖子

1092

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1092
QQ
跳转到指定楼层
楼主
发表于 2016-1-10 03:44:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源文件中_Interface文件夹下WndField.cpp文件
; E$ I4 i: r- K搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )9 x: ~- G: q  N2 ]: v7 ?5 c
4 w4 q" y0 G9 @% N$ ~& |
struct sItem* A) `: M  o7 W4 ^  f
{
* t* ~' z  J& u+ @: h" V  |DWORD dwId;; C: D. A; R3 Z, r
DWORD dwKind2;
( Y# P$ d# z0 X  rDWORD dwItemId;* J5 I' ]  ]. J1 @; U. _, S% V
BYTE nIndex;
; n& C3 g6 F# |: {3 q# L+ ksItem(){
. P& `3 G, E2 A  dwId = dwKind2 = dwItemId = nIndex = 0;
6 S) h: t4 I$ V. _}
  t9 ]% `: i& ~4 @6 a! u, j' obool operator < (const sItem p2)/ B' G0 s. w" r! Y. p
{
5 c; Z) n. s( Y' p' M  if (dwKind2 == p2.dwKind2)8 C# K( P" r- w% d- u
  {$ N$ q; R7 ]: B
   return dwItemId < p2.dwItemId;
+ P* V, {( n& k* ?& F2 p  }else{: Q1 v' T) ]& Q: e) f
   return dwKind2 < p2.dwKind2;$ F2 U0 Y; e  _# B, B% i! p+ r( Y
  }
$ _& T* R* [1 v3 j}
7 R" e; n' P. h6 @+ t5 H% _! V2 u};4 b1 w/ j- ], O/ M6 i; ]
class CInventorySort, f9 u4 U- @2 I/ m$ @  O4 I
{
' F/ Y! m7 z; P. w1 X: |% w; S) fpublic:
. D  s; e+ W) GCInventorySort()
' Z- @3 L7 t: Y  R+ L( A6 ~{9 x$ r( J: z' {( l/ E  ]3 S
  m_dwPos = 0;
' x4 v5 Z5 A/ g* N8 D}
5 L" w$ n' j7 F  U# W~CInventorySort(){}4 H. X4 I" H& J1 J3 ~
private:0 h2 e2 `1 r2 q
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息6 r1 x1 `# i; }0 U2 r
DWORD m_dwPos;
; |# T" N  _* i3 f8 x1 j3 y) ]public:/ w7 E8 g# b* m) }6 |+ ?
void Add(BYTE nIndex)
# }* T1 B" l' K) B+ Y{
% a7 S" x# O: k2 f  if (m_dwPos >= MAX_INVENTORY); a" ]2 W/ `% N+ I! P; [
  {
/ e7 Y" D% b% h* `8 n   return;, s+ B! I0 ?0 Z  q% j. w) L) y
  }
1 U5 g5 {2 b  ]; S  m_Item[m_dwPos].nIndex = nIndex;1 Q0 B+ Y  A) C3 q) w* u% c8 Z/ a
  m_Item[m_dwPos].dwId = m_dwPos;4 q% d( T6 f& ?
  m_dwPos++;: D8 i( M4 N3 Q0 V" g  b! h
}
$ e+ e- k9 h2 M! G4 [BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
5 g2 |) q- }4 y, N& H- |% F& j6 {{  D1 I& [$ P# S2 v# _, [
  for (int i=0;i<MAX_INVENTORY;i++)
/ R; J, Q' l& T( Y2 J1 M" s  {
. _; L" y7 Z+ `- J   if (m_Item.dwId == dwId)
( ^2 U' P* s! E. M   {
$ h; Z9 n* x% J9 A2 U' ?* W; U2 l    return m_Item.nIndex;) V7 S" I' n% c& R# [+ R$ M# A) P
   }
8 ~1 I' \6 O- ?3 ]/ M( ], [  }
" ], J& U9 u& \& d: B. Y' K4 s- g+ G  return 255;
1 i# W7 x1 c1 n4 S7 _0 a/ M, r  }}2 H9 a% }8 U( _# H+ h
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
' s0 O, A2 Q% J' ]1 A, o0 s{: y1 U1 B/ P! G. \( F' d5 h
  BYTE nTmp = 0;
* d1 x5 e' o8 A7 [( C: `  bool bDest = false,bSrc = false;5 r7 |: Q) ]: p* v" B: H( f
  for (int i=0;i<MAX_INVENTORY;i++)
  \$ J( d' q& {2 X" O& }  {
8 U/ U1 |# D; y: e. y( w9 o2 \   if (dwSrcId == m_Item.dwId)& {( g2 ~, H  E, n: ^$ |: O8 T
   {: `$ n' t( o. [# L! a: `! C5 d
    //id相等 则 改变对应的dest和src
! c1 ]0 {& _4 k: L6 |    nTmp = m_Item.nIndex;
; M; _. g, b3 I( {    m_Item.nIndex = dest;, g" Y* N; N# F6 ^2 q
   }
9 [; r* P9 h& f1 K' |- J- c7 _  }
. T# u, n+ i0 G1 R' K, q1 [  //临时数据保存完毕,交换开始
! H( h8 E0 I: ^( X/ g  for (int i=0;i<MAX_INVENTORY;i++)4 O5 P: q2 ?- V7 S1 @" Z
  {
3 D. `& X& q  h   if (dest == m_Item.nIndex)! Q! ?0 _# u* t6 T# f! @
   {4 q3 G8 k) C, W6 S
    //id相等 则 改变对应的dest和src+ G' v& f' F2 w4 e. y
    m_Item.nIndex = nTmp;
. \' y% y& A& @* |4 S" K. d4 A   }
" T8 V, ^$ h7 o) m  }+ u5 ~( _+ ?* o# f% r& L
}5 |! E% D# F% X! }/ P
};# M. X5 P' p1 Q# @) l) w8 M
-------------------------------------------------------------------------7 R8 x( \) j2 H7 t2 N
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
2 J4 T  p& A2 [9 Q1 ^( i& k1 B1 L  W搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);; v, v6 |% @; A( i5 Y
紧靠其上添加:# @% F; _4 j! x) H7 k2 j8 T1 h
if( pWndBase == &m_wndMenu )  t3 \# i. F$ J7 p) F. V
{
& l3 E) S+ e; p, u1 E  switch( nID )
5 E( F5 W; Z9 X9 t2 L  {
* z# n; R6 D/ H- S6 H  case 2:
8 T* w7 b0 n9 H; w  q   {
& P# o6 r) K) T0 g  S    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);8 i9 s& y9 R1 ^; i4 t
    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
; j( |$ G: E/ V  o0 G1 l    {
! u7 L. L. ], _4 C& J# c     break;! N) Q' @9 ^" X0 B; w
    }
) g# b5 V! t( X0 m    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
& I. O" l, D( m$ `& x    {
5 f5 A9 S. }4 i% a     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);" C1 d! g9 O" _: H% j- I
     if( !pItemElem )
7 s' \+ P2 T% Z4 w8 c      continue;
/ M5 s8 u( Q6 d0 Z1 Q  L7 f     if(pItemElem->GetExtra() > 0)
( l5 ?/ \( R4 |7 L6 Y- H      continue;
/ A- N/ K1 [" y7 _( N     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
* [5 F1 I* `( t' d/ J/ s      continue;9 X9 a) H' k3 |  l  z
     if( g_pPlayer->IsUsing( pItemElem ) )0 A1 A7 k2 n; |0 h
      continue;" z! I& X# j9 Q# F
     if( pItemElem->IsUndestructable() == TRUE )2 m; ~9 `* s7 K! l# T8 v5 }
     {# s$ j9 B4 `& H
      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );3 H  c9 L4 b+ D% C
      continue;
/ L" U" H4 ?  D4 [% F/ g     }
7 ~2 J3 p' U7 H  B     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
3 O6 ?' J1 J/ |$ S0 Z2 `    }
! ^( s+ {' o( O% x8 L2 A! m    break;+ @, t9 S3 p/ W6 L8 S5 a. J
   }
, d3 z% ~: f$ L  case 1:$ e3 v( u+ d; A9 A
   {9 g4 |7 v5 B2 f/ t. o! n0 x- b; y7 L1 f
    //整理背包- L/ u2 @* ]; |' o5 r& v! ~) |
    //////////////////////////////////////////////////////////////////////////
. M4 W3 Y5 U6 W' Z/ z% |# y    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );) ^5 H) s, p7 k, K& K, ], ?+ L
    //////////////////////////////////////////////////////////////////////////1 S1 m* t# D# B3 B" y0 k2 I3 j$ {
    //////////////////////////////////////////////////////////////////////////# U- g. k4 m. T7 w* M: n- u
    CInventorySort* pInvSort = new CInventorySort;2 g. p' o" s4 J8 a3 }4 M7 e
    vector <sItem> vItem;
. c/ W8 v, M2 g% X: ^) T    vItem.resize(MAX_INVENTORY);//初始化大小
" `, I- Y- |, |. t: C     //////////////////////////////////////////////////////////////////////////- Z* ?) h7 a, {+ `* V2 G
     //填充数据: r  I# a; z8 g+ P5 n; x( s$ ^
     for (int i=0;i<MAX_INVENTORY;i++)) t  u, B+ J7 {7 _5 K6 ^1 r8 _( o
     {# I( u4 R- m! Y2 Y* ?, h, Q1 i, l
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);  a' Y0 J  U- |/ }
      if (!pItemElem)
$ p  j; \4 k5 v3 E% W, G      {$ g3 L# [5 c5 j5 G' n
       vItem.dwKind2 = 0xffffffff;$ R% z( a5 ]" W
       vItem.dwItemId = 0xffffffff;; Q& P$ m! q' {* G' r; ?
       vItem.nIndex = i;- b( N) q# e8 A9 B  U; U
      }else {
& k  c* k6 p9 f9 I6 R/ t0 P$ I       ItemProp* pProp = pItemElem->GetProp();
8 p; ]8 ~2 v) p       vItem.dwKind2 = pProp->dwItemKind2;9 I/ W. m3 d4 Q( o/ o* y& ~
       vItem.dwItemId = pItemElem->m_dwItemId;# P$ [  o8 x' a# N7 p9 c
       vItem.nIndex = i;
# s2 Y# e+ I- a+ Q6 y8 `      }' s  k8 Z, i: C- q6 R) L# R" S
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);, Y8 Z  ^5 B% _- M8 W2 ^
     }% I6 ~. w4 |+ `
     //////////////////////////////////////////////////////////////////////////
$ a" \2 D" i/ `, F9 b5 g     sort(vItem.begin(),vItem.end());//排序
$ s3 `/ C& }; U2 D     //////////////////////////////////////////////////////////////////////////
8 t9 y8 b1 `5 }3 a     //交换* K9 d7 s3 \1 W5 k% |/ P& P7 H4 h
     for (size_t i=0;i<vItem.size();i++)0 I: H9 B( K+ R1 N
     {. }  v4 C  I  T9 C4 F5 T' t
      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
; l5 H) o$ P) b1 `  @, f" R      pInvSort->Add(vItem.nIndex);2 y; L8 E7 X9 ?: {: |  u7 u
     }
5 a# f9 |) V1 S) w     BYTE nDestPos = 0;
6 N9 F, s2 V( O     for (int i=0;i<MAX_INVENTORY;i++)
8 a! s/ {5 {% x; E+ M  R) R6 d5 {     {- G" W1 ?! Z2 Z! G
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);& p0 R2 q) V( R) w4 T4 F
      if (pItemElem)
: t/ Z" r5 V$ B( D  h9 K  D      {
7 I/ G0 ~+ n; b0 X; L       if (IsUsingItem(pItemElem))
+ b. K% z% |, E6 n9 Z) X       {
* j& D0 [$ l* M! X* U) U: n7 z6 A        //这个位置无法放- y" e' g* _( k# k- b
        nDestPos++;7 i0 y( j/ p: m- m
       }
% d# d0 T4 R# H( |* X      }
- O* u$ i! n% d8 y) L2 j3 z      BYTE nSrc = pInvSort->GetItemSrc(i);0 s! J- ~8 U# G+ |9 g; r
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
7 C( f1 I0 ?2 X5 E      if (pItemElem)
* B. e0 b$ K+ D- P( Y      {
1 M0 k7 J& \; z/ Q( m( c       if (IsUsingItem(pItemElem))' ~2 f% Z3 J: t9 e9 y# r& F7 R
       {5 z+ |5 ]& _) a/ F. b6 F7 s
        //这个道具无法移动,跳过3 `! R- H/ Q% S$ l3 W7 Y. M" I
        continue;6 i: [  }5 l" U! Y* ?9 O
       }
# q1 H/ V, }& {: d" [      }else{: M% ^! n6 W) O$ ^$ Q, {: n" ^
       //空位置 不用动
, L1 {* d  S+ r  Q7 M       continue;
) o. K/ N2 Q. k: n( J5 f% K      }; p* @0 r" h5 B& F! @- A" v
      //////////////////////////////////////////////////////////////////////////
4 g$ l- |6 J& |" O0 B9 l      //开始移动
4 |1 [$ I" V6 i& S" w+ X  p- M      if (nSrc == nDestPos)& T) K, J& p" s, x3 C
      {/ `7 B1 x, j4 r2 h! d
       //原地不动
! b* s) A$ ~" u% p  P       nDestPos++;
( {! u  V  Q8 p$ |1 `# F       continue;
$ @* b2 A7 K# f- {5 h+ p      }
0 F  x3 ^: c1 U, q' o      pInvSort->MoveItem(i,nDestPos);
8 `; w3 d* x2 v* J      g_DPlay.SendMoveItem(0,nSrc,nDestPos);* |/ q: Q/ c4 Q0 j# }) D
      Sleep(5);
" W% y: d) i: O! F- q      //Error("移动 - %d->%d",nSrc,nDestPos);- l8 a% G, G3 l8 R
      nDestPos++;
9 R; E$ |- k: z     }
! o2 U% B# a+ U( w- h" O+ \     //取第一个元素的信息; ^* k* Y( i" I4 C. U/ m; F
     /*
9 \+ c3 Y: m3 f     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff). M# F- }9 O) [9 u/ x& O3 H: f
     {
1 O' A- e$ ~" J) ]      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
* `1 s! q1 U  ?# }      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);. L- Q4 ]% ~8 f& Z( R
     }, b  M" C$ m& X2 U& y3 f$ J* N0 x
     */
" Q% i4 S" b# C! P5 g8 j    //////////////////////////////////////////////////////////////////////////8 ?9 v$ q- X9 f2 F
    break;
, x, v: I: h3 M3 P8 u3 r   }
9 i) {5 R% g$ d, L1 M  S  }
& b3 N; R( W5 s}
3 U. t$ _% m" F: Tm_wndMenu.SetVisible(FALSE);
$ d) T" [- @  `9 x) E% W- c5 T% J# r
--------------------------------------------------------------------------------------------------------
2 p- n( J& n- z8 d8 [搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
" e4 B8 F- e. V5 q: S( ~* t{% l# o1 j" @  W6 I
BaseMouseCursor();
' i4 B3 z' S$ ~: K- g  ^% o}; ?5 s& `7 H* [
在其下添加:2 ]/ v1 E4 }3 |3 M: D8 T" N& ~
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)- b! q# v/ `% @/ I& r0 g  v
{3 c9 O1 F, u& Y/ j9 w$ ^$ w% Y
m_wndMenu.DeleteAllMenu();
4 _  r% W, Z9 @# P9 _5 a" z7 w$ i8 `m_wndMenu.CreateMenu(this);; l. F7 G" Q4 R' ?2 Z. c
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");& P+ ~" I" L9 [- f1 T8 @4 |$ y' b

& W2 m4 H* Q" j9 A. ^if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)). A0 T. x9 C# w# |5 \2 l" l
{
% C: l+ o  m5 k: W3 U  //P以上级别才可以删除所有道具
$ t* k- O, b8 h- k( R  w  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");1 g, w/ ^5 g0 u/ J
}
* ~8 y* G- ^* y$ {) [, @; v: Q# Mm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );% {1 g) [$ l6 k( x1 _
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );- `% s! \& n) X+ v* M
m_wndMenu.SetFocus();
7 b$ r# F7 h- w! ]8 j+ j}
. b9 p) U. B+ P4 q------------------------------------------------------------------------------------------------------------; X! |8 e7 C1 n# Q  ~% E  L
*************************4 G. O& G/ F' S# G7 h! o) D
WndField.h文件
7 @$ Q% y* Z+ s0 I6 y; a5 h4 e*************************
7 h* [, T; T6 b, a4 v( ~& N搜索:BOOL m_bReport;2 e$ W/ h/ C# P# f) H, P
其后添加:; b7 v+ ]: W) E% r* a3 R
CWndMenu m_wndMenu;
& ^  M+ J, V  Y  p- y: W4 |搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);2 @+ E+ Q8 |" F. ?/ ?
其后添加:# p+ t3 z, N9 q
virtual void OnRButtonUp(UINT nFlags, CPoint point);4 E& q. H6 q" H5 Y
; R& j! F9 e' M

% J9 J2 x+ v. q) q8 J3 _8 ^

相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-29 17:50 , Processed in 0.068661 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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