飞飞世界论坛

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

一键整理背包

[复制链接]

197

主题

203

帖子

1086

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1086
QQ
跳转到指定楼层
楼主
发表于 2016-1-10 03:44:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源文件中_Interface文件夹下WndField.cpp文件
& J! R6 z7 p% `3 F% R* q/ {搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )7 [, e6 Z2 z/ j) B- z
7 {: p& `: ^+ {: H$ @
struct sItem9 n" Q3 J, z+ g  p0 z# Z
{
4 d7 _8 N, X  hDWORD dwId;
% o( F. o9 ?* F8 G0 K! yDWORD dwKind2;: y% k( L% z9 X% }
DWORD dwItemId;
/ K( l6 }1 w" s1 |0 S7 ABYTE nIndex;% t$ L9 F- k& ~$ E5 ]
sItem(){
% N+ L3 r3 K$ Y! E  dwId = dwKind2 = dwItemId = nIndex = 0;
* R2 y- F, f3 ^7 k- \3 y}$ q* a  V* _+ g" p/ x
bool operator < (const sItem p2)' O$ z5 _( `# x% P& A$ ]
{
* M, z9 [: {( j/ ~* m4 R  if (dwKind2 == p2.dwKind2)
! K! f  a( B" n( c( Z  {0 J  ]  X4 W0 {# W* S! E
   return dwItemId < p2.dwItemId;5 o9 `! f* e  O
  }else{
8 b7 N9 ]) _# \, y1 N' d( X& z0 C  D, X   return dwKind2 < p2.dwKind2;1 Y7 \' p& q& K- u9 p- K0 ^
  }& z5 p" s3 G! _' |5 j, t
}
& A+ J3 R) @* |8 G% A" s. y};( I" s& J; u4 v' m' f9 t' s8 b& b+ r5 Q
class CInventorySort
, h; m) @% R( S9 g{
9 X! e8 T  d; H- Wpublic:6 e. W1 a: O3 `3 U
CInventorySort()" e, j; t4 s* r
{7 {9 ?* L8 D3 F5 K: ?
  m_dwPos = 0;2 H% @5 y$ K+ f  H* M! T
}
, X0 X$ ?1 R: M% M, {1 k# c~CInventorySort(){}
7 b4 s3 _- N4 Qprivate:
# _  o( U! ?# S2 a- u7 U  o* O0 ?sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
3 z7 W" c! _& b% y9 dDWORD m_dwPos;
. W/ q/ L* Q! @# Spublic:( Y) {( m2 A5 X/ E; n/ a
void Add(BYTE nIndex)
' t# e2 I- p3 C$ n) X8 g* Y( \{* b5 _- A5 n- t1 Q
  if (m_dwPos >= MAX_INVENTORY)3 L1 a# P2 h# v/ Q# u
  {/ d- l) l* b$ ~/ P1 `) o* m4 b
   return;
; ]0 I8 i/ |! X  }5 w% a% v3 C5 _( N) S1 ?4 P
  m_Item[m_dwPos].nIndex = nIndex;
( Q6 u+ v& S& g( E. S  m_Item[m_dwPos].dwId = m_dwPos;
) c- H2 w' N& O* A4 r  m_dwPos++;  w& @7 F% m/ x$ ^! }
}
7 D& K; v  l! nBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
# s) I7 a2 T. ^# T* @( v{
& _% i% s- Q/ z" U/ i  for (int i=0;i<MAX_INVENTORY;i++)$ A% o$ V- o7 i$ Z; l" a
  {. Z/ U+ ^( x6 G
   if (m_Item.dwId == dwId)! h' U0 Z( z3 U# X' C
   {0 O2 Y- {5 @; R: g! C0 l
    return m_Item.nIndex;
) x9 H* k) t* R% j. Y   }
1 J' Y3 O* b, W) g3 U# v5 W  }8 D7 V0 W" t- I/ ]( }, |, J. T& _
  return 255;* \7 Z* d) f8 Y" |4 Q% B, b
}
% G% c- c. k+ {) rvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置- f/ ^, f" ~8 t( H6 {* g  U( w- J
{3 v% o* n7 s' w
  BYTE nTmp = 0;- U( G/ r9 D5 T( ]
  bool bDest = false,bSrc = false;+ _+ |- y* |# U* S
  for (int i=0;i<MAX_INVENTORY;i++)
1 x0 o1 u7 e% w4 X  {
, Y2 H- I8 T4 o8 Z; t' @& w2 g   if (dwSrcId == m_Item.dwId)
+ R4 ?6 O! D' M3 S   {1 v; }' c3 F: K' ]  F
    //id相等 则 改变对应的dest和src
4 {3 B  W* L4 m- P" ]* u' f    nTmp = m_Item.nIndex;
6 S. D( J! ]6 P8 T6 H    m_Item.nIndex = dest;; x# H2 @( W; E6 X
   }0 T9 i) o0 x/ J4 ~  U( j
  }
' X  P7 d: @! A% G( L, U' u) R% S! P  //临时数据保存完毕,交换开始
) M0 l1 s( u% w; P8 U# Z3 ~  for (int i=0;i<MAX_INVENTORY;i++)  N( b" s' h& S$ y/ G% c7 J& {' x
  {
6 t: q4 C5 i. M3 B' b$ a) Y   if (dest == m_Item.nIndex)
6 ?2 q- {! V1 L, u/ s  r   {
. i4 g- M% t- a3 H1 q0 n2 k    //id相等 则 改变对应的dest和src/ Z& P( K4 v( J0 s
    m_Item.nIndex = nTmp;
/ s" `7 e, |0 G2 L- U( f* ]   }; Q' G# Q5 i* p2 b. r7 @
  }% n: I6 w6 D4 B' i
}9 r2 Y* s$ Z) M
};% [# t) k9 W) H. ?0 K5 d
-------------------------------------------------------------------------7 Z$ v. G* f2 R$ B4 C" m
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )  Q4 r  H2 k- }* t9 z
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
) k7 W9 X3 W0 x1 B( a0 p紧靠其上添加:: {; c( X" n% t  r& t+ k
if( pWndBase == &m_wndMenu )
( w3 V: ~1 S) l{2 H' c  s3 o# D1 ^% z5 E% l$ k
  switch( nID )' _; X, t% [" Z, G
  {
' d) k' }1 E2 }  case 2:
4 r' Y7 B5 v) ]   {
' L1 w0 l8 m$ H    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);+ g# N+ b' `3 }0 |4 W9 ]
    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))0 n4 a( O0 n7 ^9 B
    {
7 i$ G+ _6 d! U8 t* ~     break;1 r8 n4 H. ~7 b7 M9 f
    }
+ ]% @! \# F+ x6 O, h' z% }    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)/ t6 r7 S0 s4 ?# j  Y
    {( K2 v6 p' r0 A$ c
     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
. m; [$ v7 H% l# G& h( Q/ n! a! b     if( !pItemElem )4 P! w3 u; E5 s1 j# U- h+ J$ n" G
      continue;
/ Z( {: Z7 ^! s8 S% r5 H2 ]/ i     if(pItemElem->GetExtra() > 0)& \3 b/ i. h' N% J* [# P
      continue;
# L8 \1 p4 d' x) c2 q     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
: m' i/ z6 k/ s" T      continue;
$ g# W/ Q6 f+ m: ?% r: X     if( g_pPlayer->IsUsing( pItemElem ) )5 E2 z4 S: v5 r8 U
      continue;
* Y8 I0 J& T  C/ e! l     if( pItemElem->IsUndestructable() == TRUE )
* L) x+ q% R* N: H( s# k" m     {+ G8 z) a( I' Y7 B9 N! P1 N; P0 b
      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );4 Q2 u1 @; D% T" t! w0 B
      continue;  K' b$ u" E+ }2 o4 ~; G
     }
, f% b* X" V% M0 B( Y     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
9 l3 z, H8 a0 f6 y4 r3 w    }8 x$ T# G) M( o( d* |2 c. m& e
    break;
  i0 a- L; s& K4 O   }. u. N5 R3 Z. ^% F$ K/ S
  case 1:
  J1 o4 |. B2 d+ @" I# _1 q6 w   {8 J' X+ h' a" i0 O
    //整理背包
8 f  k( \7 x1 j0 ^, T4 B9 S    //////////////////////////////////////////////////////////////////////////4 `2 d3 A. I. ?; a+ d" m6 v
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
% _0 A  h' X0 S- `2 v' [    //////////////////////////////////////////////////////////////////////////% s" O4 S. j$ H# W
    //////////////////////////////////////////////////////////////////////////% e, l- p* M- s* W
    CInventorySort* pInvSort = new CInventorySort;7 k3 h3 b& ?' ]2 G1 \- d
    vector <sItem> vItem;
; F8 m+ [' e0 i* Z! _    vItem.resize(MAX_INVENTORY);//初始化大小
& O* O! W- M. _+ q1 Q     //////////////////////////////////////////////////////////////////////////
, K1 \3 D  n3 Q% G     //填充数据
* T! K  y; A9 _/ f5 H     for (int i=0;i<MAX_INVENTORY;i++)  J( s6 N6 w6 m+ _8 i* u9 u; g! o
     {* ^. D6 H4 y3 s# b
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);( F! m- F+ V2 f8 A( H$ h) G4 i
      if (!pItemElem)/ y' I' p$ Y+ o# R* s
      {" C! E+ k4 t5 o( c& b- C# |
       vItem.dwKind2 = 0xffffffff;4 W, j7 o8 R- C2 y% o
       vItem.dwItemId = 0xffffffff;
3 V6 N2 T$ b$ m/ |6 p4 T       vItem.nIndex = i;/ h3 b. _) e  Y8 s
      }else {
3 }$ p" u1 U$ a5 w; U       ItemProp* pProp = pItemElem->GetProp();0 U+ R! k- b6 d  Y, H9 e
       vItem.dwKind2 = pProp->dwItemKind2;
; ^; _! E1 _4 X; F- u       vItem.dwItemId = pItemElem->m_dwItemId;2 k9 U3 n0 d' ^. i% u: R
       vItem.nIndex = i;
& l1 v( o) T' B3 |4 P! u% }      }- q) c$ F) B/ Y5 j9 l
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);1 N+ q- e' c. [$ t
     }
4 W! \6 E9 u" H& j8 q. |2 R9 k; W! k     //////////////////////////////////////////////////////////////////////////7 n( O$ L, W* K) w9 ?$ b5 X
     sort(vItem.begin(),vItem.end());//排序
3 [* |4 ]+ C% d. O# ]# |7 p4 D: i& [     //////////////////////////////////////////////////////////////////////////; f, C* t1 t0 N$ D, B: F: r, @
     //交换4 c0 J9 m7 t3 h6 f
     for (size_t i=0;i<vItem.size();i++)
3 P1 F. ~: i9 q5 W     {
" r+ h3 H( K: n+ M      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
. W$ f6 I6 ?) D& {. f      pInvSort->Add(vItem.nIndex);
1 l* `0 V: R) L  u- n: Q1 g     }# N' K9 g, F$ `; v6 `
     BYTE nDestPos = 0;3 w2 G' G; h0 `6 X! i' ~" y
     for (int i=0;i<MAX_INVENTORY;i++)
$ G8 K( Y' J4 n3 q     {% ^# R6 e- r1 p0 e* ~* Q/ j9 i; B
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
8 D) y! x$ {+ d( D& ^      if (pItemElem)% |* C: ]; A+ E* I1 l
      {
; j4 ?  Z+ H0 l       if (IsUsingItem(pItemElem))
- g+ F/ G3 L. K( c       {
* V& v# l; ~* x- P; ^$ j9 V3 F        //这个位置无法放
4 n0 O! ]0 L- \& t2 {7 h& B        nDestPos++;
2 c0 x$ b1 B2 K1 C$ T; [" Q       }
8 q. v6 J' m# m1 O8 [      }# v# P& F. B" u; c5 C, e2 r- r  C; g
      BYTE nSrc = pInvSort->GetItemSrc(i);4 N, B, O  G' j) B
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
! Q" Y/ f. O6 t7 Q% K5 h" ]      if (pItemElem)) j! Q9 g; L4 p5 e8 F1 s9 @7 y4 N
      {* K# K) Y+ k9 n/ S0 g  Y; M( A
       if (IsUsingItem(pItemElem))
: U& e/ v4 F6 L$ |3 B       {
2 A* S* d" o* @! u/ ]        //这个道具无法移动,跳过
! A' f1 R$ g9 d- |        continue;% J4 ]) b/ l( _1 `
       }
2 [  R7 a: \; O7 f) h      }else{
' T# r: x9 f8 c       //空位置 不用动
  F# f. n9 G7 x8 d1 J2 S0 [       continue;
( K5 j4 g# Y$ y  o7 [      }
# x  _+ h8 \% Q" J      //////////////////////////////////////////////////////////////////////////; F. i8 k. D% L9 u/ f
      //开始移动
. Q! t7 V0 R8 ?9 D      if (nSrc == nDestPos). r& t6 f  o! S( Z
      {
2 o+ Q+ U  N1 n, f% l' C, n       //原地不动/ y& N' }( M, e- i$ u, ^: b1 L4 X
       nDestPos++;
& j5 B3 m4 v- i7 j4 M       continue;
. W  W( U; K1 R9 }8 t      }
% {3 N$ Z$ O1 F2 a" t      pInvSort->MoveItem(i,nDestPos);/ y7 W- q+ y0 h) q
      g_DPlay.SendMoveItem(0,nSrc,nDestPos);
' _! ^3 S4 p  T  I, _/ ?' v      Sleep(5);
; s+ v/ q8 X9 d: ~      //Error("移动 - %d->%d",nSrc,nDestPos);
/ ~* o! \+ w" B$ g% |      nDestPos++;9 T7 r% q9 X9 h/ Q( {3 \
     }. F% G, ]+ T2 s+ |9 I, G6 L& m2 H
     //取第一个元素的信息
/ w$ Z1 `: `1 ~" Z( ~7 ^9 F     /*
+ ?2 y' q; T, E2 h8 \" q+ l9 O/ [     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
& J; ^2 z( F4 o, g1 E     {
% J5 S  k7 M. O3 G1 B      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
* s& D% b+ H3 Y% ?1 E* w2 }      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
6 I) h7 J: J3 O9 {7 j- \     }
" ~6 H% g9 C* c* @) ~1 ^     */
3 k3 ~3 X- t% c, {- z; f    //////////////////////////////////////////////////////////////////////////; W. y1 u: E! M6 A( A1 U$ q4 Z' g
    break;( U9 r8 C( G' O% ^$ A+ Z+ X
   }
" G% e" b' j! Z% \  } , ^  j; i8 A7 V8 S- n3 I
}
' Q0 c( F# F! ]7 ]* A  M$ r# Gm_wndMenu.SetVisible(FALSE);+ f% j# k1 G( [5 i& R$ e

" X4 I& {" ~  Z$ J) P  o0 Y* K--------------------------------------------------------------------------------------------------------$ X& J4 w% M5 @8 Z: s4 d! D# n5 n
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
" E9 H4 ?1 l- I# l% U{
' X$ H( h) y; k- xBaseMouseCursor();
, X& P5 d8 ?3 O3 v}
/ W- q% z. ?9 M2 _. x在其下添加:( j7 W) ]2 F' C8 z4 f7 l  a4 ~+ r
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)4 W# ]! q9 \3 M! b
{, ^1 a* r6 P8 i& X: T; E
m_wndMenu.DeleteAllMenu();
4 l. b: \9 w( V. R2 w  K/ }; Z) b( `. Om_wndMenu.CreateMenu(this);/ w7 o8 v6 t2 Y# j
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");, t% u: W: c% F3 \9 g: ]
; q* R# k7 l7 J. H5 }3 N
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
- I$ C9 h8 x$ I  O{% |3 ]7 |* j# J+ T$ n% w
  //P以上级别才可以删除所有道具
  V# n! {5 }1 X+ x+ w  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
# P% {6 v* z6 l}
0 ~) K6 l" @& _. }) |+ i. \+ [& X% um_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );( I6 c* x/ U, W5 ?: k. ?
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );. I% d: k" g! q  K, f6 @( u
m_wndMenu.SetFocus();
/ j% S% X, M3 r# q5 M( k0 W- _% x( P+ L}
0 t2 b7 m2 Q0 ]& \2 k7 a------------------------------------------------------------------------------------------------------------
- ?" Z* u: X% p/ p* B*************************
4 e& @8 p* j, j) Z  v7 ^* FWndField.h文件  V, \+ B8 y2 y" C/ B4 F- x
*************************- l* T1 c) h2 e4 l. E+ j
搜索:BOOL m_bReport;' n) V6 a- x" p4 c' @5 I3 d; O
其后添加:1 D" H) O0 R# Q. s# c% P0 S
CWndMenu m_wndMenu;
1 O% T+ V  \+ W. }+ n搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
# N" q- w! e4 q5 O5 l/ t+ V+ B其后添加:
" M, w8 x8 |$ t3 R+ @) ovirtual void OnRButtonUp(UINT nFlags, CPoint point);
# [) T2 w7 V7 U  C& z' Z/ ?
" o& \, b* G5 E# g: u- X
, z- K! j+ X- u' z

相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-15 21:24 , Processed in 0.064455 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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