飞飞世界论坛

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

一键整理背包

[复制链接]

197

主题

203

帖子

1086

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1086
QQ
跳转到指定楼层
楼主
发表于 2016-1-10 03:44:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源文件中_Interface文件夹下WndField.cpp文件  O; M# M  p" }' m  q
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )8 Q4 J- G- O' v

# b8 Y- c5 ]5 r9 H' m1 L) astruct sItem1 w' x, f. W+ u
{1 M9 Z$ s6 S& w1 M7 ]
DWORD dwId;
: ~* S1 z; Z$ qDWORD dwKind2;
/ f5 J' Z+ c; d' Q1 \8 kDWORD dwItemId;- l& D2 H, ?- B+ F- Q$ S  J
BYTE nIndex;
9 D& r/ H! ^# r0 M6 V8 jsItem(){1 `" b) Z1 L* h4 D0 ^4 s
  dwId = dwKind2 = dwItemId = nIndex = 0;
% u+ y+ J4 R/ \: j* J% L}! ~& G) a) B2 m( Q: J7 x* B5 s
bool operator < (const sItem p2)9 R* C9 M( Z. j: q+ h
{$ s; E' Y3 w. R5 l" Z
  if (dwKind2 == p2.dwKind2)
# T1 Y! J/ W& T6 ^! L  {
' {+ Q! D2 X- h3 U( }& u9 J/ p   return dwItemId < p2.dwItemId;
0 Q# x3 u% j$ h  }else{
* H5 m- j% v/ E* o  y   return dwKind2 < p2.dwKind2;/ R# c" p, ~* I% p0 j
  }/ J: F3 n' W$ p% W2 n: w
}
* i5 J7 e  X# f( v};
5 j3 P. w% j! {( ~class CInventorySort
& j' ~; N6 a; V& [6 h{$ x' H4 q8 S( k7 P
public:. c6 g/ F2 r4 a3 B; @+ x
CInventorySort()6 b6 H# G& n' O1 V' f  x" y
{
' {8 W& c6 ~; ^, d; S3 V5 {  m_dwPos = 0;( F# ^' Q) q5 i& J
}* s; d. |9 ?; A
~CInventorySort(){}
3 V) o; G* [* Eprivate:9 X) e( |$ g/ B" c* S. G
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息" E$ V  i1 r2 P$ P
DWORD m_dwPos;+ T) N: ]) H2 h# L- a% C- Z% `
public:
7 T& B  T& R/ D9 c6 T3 p; ?void Add(BYTE nIndex)
) a* V) T( W% B$ t) J9 M9 T! F4 v! O{
  d* E6 H9 S' [" m- b8 K  if (m_dwPos >= MAX_INVENTORY)
  n: c* ^3 O. L! J) ?! P9 U( Q  {* r" b$ R3 Q/ o; _& w
   return;
$ w- e. b( i" l9 Y! v; e  }
6 t+ F) E* C$ S- O! b, }& i5 ~* c  m_Item[m_dwPos].nIndex = nIndex;' f) k; d, y0 c$ @% e5 Y
  m_Item[m_dwPos].dwId = m_dwPos;4 w9 a" Y: j  x$ L$ F
  m_dwPos++;8 [- h0 S7 c2 j6 O+ |& ]
}
$ ]! }* {& w6 zBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列& t8 O1 V% k! Y8 U/ n1 g
{
9 x- ~0 ~- [! \& C% v  for (int i=0;i<MAX_INVENTORY;i++)' o; C. |" W) z. X- k
  {
" U" g0 P' X* t& }$ Q8 J   if (m_Item.dwId == dwId)
+ k( D1 o# k  `' M7 z4 u   {; F8 H  @& \) E: y0 P* @
    return m_Item.nIndex;6 S' [7 ?/ V" a3 E2 ~: i
   }, f. q9 Z1 U0 p/ u
  }8 W# Y' G  j8 \/ S/ o0 r9 f: r
  return 255;
2 P7 {, Y- U& J8 V0 Q+ \}
. B' \: _, d$ o/ k8 z9 H- P0 }void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
2 t0 i: @- }# e$ v  s{! {2 E/ y' N# c. }
  BYTE nTmp = 0;
* B# o8 z+ V" k- z  bool bDest = false,bSrc = false;
( L  c" s  q/ b6 x* I8 q  for (int i=0;i<MAX_INVENTORY;i++)
7 o2 z! U+ e* _7 S" [4 r  {
4 f- W+ o( _, {   if (dwSrcId == m_Item.dwId)
& G7 ?/ T/ @' R   {3 u' {& o  W1 {+ u& O& E
    //id相等 则 改变对应的dest和src% r9 o: U' a: k7 V4 u% X& x2 a1 U: }
    nTmp = m_Item.nIndex;, D5 p# q0 S. @# h5 h6 c
    m_Item.nIndex = dest;
) B8 b! J) U1 Q9 w: n9 b   }
$ R: H  L3 n. q' i! K3 I  }, w4 ^' i5 r. c- T
  //临时数据保存完毕,交换开始# u' m9 W0 x9 R
  for (int i=0;i<MAX_INVENTORY;i++)
1 \7 l9 @# J9 Q5 ]& S7 @* X( w  {0 ?6 }% N" X( w' O& k. D5 ~
   if (dest == m_Item.nIndex)
( w/ m5 y: Q2 S( f6 p   {6 N; f) [: a( `0 d. V
    //id相等 则 改变对应的dest和src7 a! _6 g7 n; R9 i4 e7 `
    m_Item.nIndex = nTmp;/ N; |& C9 ~/ g+ {# r7 ~
   }; N$ m- |% L* h- `3 N. m  {
  }9 b( B; j! N7 F( K/ Z+ R' k
}7 u& i% l2 z' a4 @$ m$ `; m* h$ \3 x! v
};
0 B( d0 y% L$ `-------------------------------------------------------------------------
! b/ X0 q, M) W6 h2 B% G  y依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )0 c" U& k1 @5 H( A1 f
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
6 s6 M! x, u4 v0 n, B2 W紧靠其上添加:7 G* ~! F- W' @1 K' ~- W
if( pWndBase == &m_wndMenu )! H/ V* h, y# S: B
{) ~3 b/ z: M0 s! J1 b
  switch( nID )
: E7 W5 z' g, {: ~# k4 j/ c  {6 [) b1 g. h# ]: Z
  case 2:$ T$ m( b4 C5 |) P' ]8 d5 R
   {7 X" w) O& S2 l, m1 W. H& n8 `3 L/ k
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
7 {( ?8 g! F* b- }! V    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
) W$ P' Q! H  m5 P4 G" f: A    {
2 O$ U3 J& _! X) t     break;/ F4 W* g2 d' ^; s. ]4 S
    }
& I) v5 u7 D8 F: f    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)9 q2 F  O* E0 `1 x" u+ j
    {
  r+ ^$ e1 b! }. D     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);% l. S' Q, P8 W
     if( !pItemElem ): t! `5 z" j6 Z# o; Y) x5 w
      continue;& j" i8 _: C$ s% T  v
     if(pItemElem->GetExtra() > 0)' p* Q3 F3 A& I9 k& ^
      continue;; R5 s$ l9 D: l) r- X, [
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) + U" M7 a+ ~: j$ H5 `: F0 m
      continue;4 v2 w. C  z4 T  \
     if( g_pPlayer->IsUsing( pItemElem ) )- Y) l& h6 d( {# T
      continue;
1 h" e9 y, p7 Y& |7 L  u     if( pItemElem->IsUndestructable() == TRUE )( E* {" O" q  \8 z$ v3 b7 `
     {
$ z- }9 f2 C8 e      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );/ ]! [) P) X, w! z/ \$ F
      continue;
1 N: |- h1 o- X/ W% |     }
: H+ c; b7 o3 F3 q- ^     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);& D) I- x9 S* ^. w9 l, f0 o, o
    }( n: h& r) q& A  s; c
    break;4 x2 O& C6 T! S4 |' M6 N9 p0 M
   }. ?6 t% {* M5 C+ S! s3 k' V
  case 1:" r* n9 Q' x- n+ Y0 T# Q
   {
1 S! A2 \0 t' Z    //整理背包$ ~0 t6 x3 o( C& A; T. S( Q
    //////////////////////////////////////////////////////////////////////////
5 X  ]& z2 y* @/ P+ h) }: u    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
* A6 g- a3 Y/ R5 l- c    //////////////////////////////////////////////////////////////////////////
3 w2 N3 a$ T6 C: Q    //////////////////////////////////////////////////////////////////////////9 E! ?1 @% U1 `2 F0 w
    CInventorySort* pInvSort = new CInventorySort;
/ B" ]7 L4 V) j4 e$ k* N    vector <sItem> vItem;
, l0 f/ e+ w% b5 O    vItem.resize(MAX_INVENTORY);//初始化大小
6 n% w( C/ d: b     //////////////////////////////////////////////////////////////////////////% `* N! p6 c% A
     //填充数据
2 ]* V+ J% L  v, {- c. `+ {3 }     for (int i=0;i<MAX_INVENTORY;i++)' x% h8 ?  U& K9 p* H
     {
% J9 x+ [2 K% E+ i9 A2 L      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
/ T6 T3 b  U/ C! t5 s      if (!pItemElem)
; C$ z! D4 ?: m7 n( ?$ ^      {
; Q3 P2 S; U  e( l- n1 V       vItem.dwKind2 = 0xffffffff;% k% z: S) J+ @" A) w
       vItem.dwItemId = 0xffffffff;
* `, M3 Z& y+ x       vItem.nIndex = i;
: x8 p8 G3 n7 h' v# W/ I6 u) O      }else {
' |5 Q1 f8 D# N9 c+ ~2 O       ItemProp* pProp = pItemElem->GetProp();, T, G& }, S( j! O
       vItem.dwKind2 = pProp->dwItemKind2;# `5 r' A5 B9 S6 K& x& @6 x9 Q4 L+ j
       vItem.dwItemId = pItemElem->m_dwItemId;7 M- y% Y' @. f, P& I
       vItem.nIndex = i;
$ R; O+ O- w4 J5 h! P      }
9 s9 l1 d4 u- m5 b      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
. l* b$ M9 _4 @/ n" Q     }9 A3 F! @2 g; V  U1 {
     //////////////////////////////////////////////////////////////////////////
( _: ?4 o. i; }2 u7 R     sort(vItem.begin(),vItem.end());//排序9 Z5 y, v/ S1 [8 j! c
     //////////////////////////////////////////////////////////////////////////" Z( }( |  s3 w9 g. W: ^3 [9 c4 ]
     //交换
" O# l+ S2 j/ i* K     for (size_t i=0;i<vItem.size();i++)" z& l% M5 n; l7 N: J; u+ ~- `' k3 j
     {; a6 \/ u% y; H* A; S6 f
      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);/ _! h# V8 Q. `+ d
      pInvSort->Add(vItem.nIndex);* ^  n% E6 S5 @8 |* q' _) d* L
     }4 G; W1 [# F) x: y
     BYTE nDestPos = 0;+ A' t+ {* r* u, e+ V
     for (int i=0;i<MAX_INVENTORY;i++)
; {4 H" p& X: F+ k7 h$ X     {
  O- }: U( _* G      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);7 n9 R+ J& [1 m+ |, w
      if (pItemElem)
1 s& o, B$ c( u0 f. B      {! z) c$ x: D( F1 K. B7 o% S
       if (IsUsingItem(pItemElem))
7 r4 D4 @" |/ f' @9 C! B: b! h       {! b: B5 I8 s% {  O; P5 P/ W, W% B
        //这个位置无法放$ v' O" L! `; L' y" Q* P9 x
        nDestPos++;3 w0 }* u3 U* I2 G
       }
) m( Y& J' i  w! E" y      }$ i; e5 x- \. y
      BYTE nSrc = pInvSort->GetItemSrc(i);5 B& T$ Z- T( o' t/ C
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);. s, ~: w6 w! S" R% P
      if (pItemElem)
2 w7 Z# \) E: a' E- Z' Q% m/ c      {
. @- n% x# ~3 Z: C' Y; e       if (IsUsingItem(pItemElem))
' r6 c3 n8 l7 A3 ]+ F+ h4 i+ _" ]" h       {
' S$ ]& K! ?7 V' z* M0 v( p        //这个道具无法移动,跳过2 t9 C& A( J; O' F
        continue;
2 J% \7 B; R6 x" [       }2 \- d  Z: ?, B/ O0 }  c: Z+ H" H# [- X
      }else{: H! r6 a' {' C# `3 Y% s
       //空位置 不用动; P: Q- j7 ^+ |$ C8 l
       continue;
1 V& _8 f% u/ V, I. `      }8 k3 E2 I, N% m* |/ {
      /////////////////////////////////////////////////////////////////////////// r' `; T5 g0 _  i
      //开始移动
1 m. @2 d9 p2 w) \# q! g      if (nSrc == nDestPos)4 i( {' ~8 X$ G% s
      {
2 ]8 W. e1 g/ i. L! b( I: r" W6 `       //原地不动
$ u4 w+ |; V4 }       nDestPos++;
/ }; ~5 r/ k+ e+ k& E6 x) u       continue;
- D0 J( u! }% ]$ b8 Q' e, ^      }  Y- J; `+ s: ^( p
      pInvSort->MoveItem(i,nDestPos);
8 G0 m( l9 `  Q      g_DPlay.SendMoveItem(0,nSrc,nDestPos);- u1 k( b* g/ q, n& ^, p
      Sleep(5);' F; W+ l7 l1 O- j5 n$ ^
      //Error("移动 - %d->%d",nSrc,nDestPos);2 }- c2 W0 N4 r, _2 T
      nDestPos++;! Y/ X8 X7 ]1 X  L3 C
     }; z1 G3 M9 S. N3 U# [
     //取第一个元素的信息- S5 Q2 A! u4 u
     /*
' b4 ^2 r3 i  t+ Y! Y0 S     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
4 u+ N7 C6 {! A. C     {* s* _" a* k2 a: \) F% M9 y
      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);3 O" U! i" a- q9 S  z# }1 e
      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
- T0 V5 [, D* ?9 E. g     }
! S  }2 s3 R- l& m9 F0 g& X     */
0 `- i: u$ n+ ~" E  g5 D    //////////////////////////////////////////////////////////////////////////
. V* S- h8 `" g3 ]- t    break;
6 Q3 J# |" `: ~   }
5 }1 W9 ~6 b+ x1 e  }
+ H* X* E8 C- E3 O" C0 P7 g}
) v+ ]. E7 V: Wm_wndMenu.SetVisible(FALSE);
/ V& ?: ^( n# s) c  l7 g5 o% E* b3 [5 a" x5 f
--------------------------------------------------------------------------------------------------------
" s/ X. Z2 e7 k2 L* ]6 w! k搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
( ]/ a# M; ?$ T$ F{8 r$ h+ `5 c+ e0 [! T2 Y' X9 O
BaseMouseCursor();
" y' B3 U( A$ y/ W; c' H$ Z* b}$ j  Z$ ~7 k1 e& |! A7 d% e" I
在其下添加:5 y  P7 s+ V, i; I  s
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
9 k6 V/ u4 S" D2 j{
  c! y. l6 M  V2 U: F  m( om_wndMenu.DeleteAllMenu();
. f" U' M2 z9 h) V3 T+ p/ L; xm_wndMenu.CreateMenu(this);
- Z1 z  h  X' {9 Lm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");; C  \7 [4 ]7 l
7 L- Z9 J/ f' ~1 L/ M
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))& Y/ }( K+ t* {1 e/ E8 N
{1 q% N' [0 \+ s4 }8 A1 k7 S
  //P以上级别才可以删除所有道具
% I9 Z/ V6 s/ e2 N8 a  W, Q1 C& D( S  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");; a- h$ \5 h- c8 c: h5 s( H
}0 [% ]( \+ ]1 Z: b0 I
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
: @% e. ~, p0 Y- r( h" tm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );$ p$ R: W: n3 v
m_wndMenu.SetFocus();2 \9 ^7 O  D. v* E6 V
}" {9 E6 T; k* Q% k$ |+ J2 T# m
------------------------------------------------------------------------------------------------------------
1 r5 F. ~% a( S' z( X*************************
) C; O) _4 @5 B' I6 Y" f2 FWndField.h文件$ U: c6 f0 _$ s4 M+ X8 T
*************************
8 L7 y) J4 V  L4 f+ E1 U/ O搜索:BOOL m_bReport;! G5 A# R) I1 e! C( h6 q
其后添加:
1 F. U# [8 ?, ]8 R& |6 h  n5 xCWndMenu m_wndMenu;
: T7 v+ B, \7 F0 V) C, ~$ ^  J搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
  `& n8 w3 c9 E9 f" R# J* X其后添加:
6 ^* t3 H' W9 N) b  S6 |& ?virtual void OnRButtonUp(UINT nFlags, CPoint point);
( E6 R  g. N. ]0 i
/ q8 @: @, |& U: H* t
3 }+ ?1 ^9 D; g1 a2 ~

相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-20 18:02 , Processed in 0.063503 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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