飞飞世界论坛

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

一键整理背包

[复制链接]

197

主题

203

帖子

1086

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1086
QQ
跳转到指定楼层
楼主
发表于 2016-1-10 03:44:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源文件中_Interface文件夹下WndField.cpp文件
) T2 a7 I% \: F搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ). ?8 o. X+ L- ?0 Y/ }8 j
1 P; I2 C$ t. O; G- ]
struct sItem
! ^" a/ {* t: f& f9 ^{
4 Y$ N* f/ G7 yDWORD dwId;
( _  ~: C. I* R. |# d) g! f$ ^6 lDWORD dwKind2;% }) ]1 G2 D: w  z# g8 c; ?7 U
DWORD dwItemId;
% Q- g1 X8 x. {2 E+ _4 IBYTE nIndex;
/ B  A( i( G) e1 N+ WsItem(){1 F/ X+ y  Y+ l; V# N5 T, _
  dwId = dwKind2 = dwItemId = nIndex = 0;
- v. r0 T% Z! |3 T- c! B' k}
  `7 o( M2 I5 {& ]- g. f- wbool operator < (const sItem p2)
4 p! c; E  s. j0 a9 ?/ Z+ u{
$ b% H! L8 _' U; J; h  if (dwKind2 == p2.dwKind2)
, b; s; U& ?5 N  {: @9 f* p0 W9 q. U9 Q6 w6 Z4 b5 m! j
   return dwItemId < p2.dwItemId;
& F+ X3 V0 n' D: [8 }  }else{3 n. A4 T. K$ d: t5 a/ d
   return dwKind2 < p2.dwKind2;
) g5 _- Y# i: B! u* U4 H8 M: i  }
! M. V. e7 ~$ t8 l* @}
% ?, Q9 }9 Y, l};- I. P6 A/ L3 U- w1 r5 C' i3 S
class CInventorySort
- a% x# M7 ~( D: [! }{
# d/ G; U( [( P2 Z. Ppublic:6 U1 L4 r9 J5 s0 R0 g' C
CInventorySort(); H4 r% b2 F0 I5 z  O
{
1 t( z/ m% l- C1 H7 @  m_dwPos = 0;
0 s) a' D2 j& {+ o2 y; o3 @9 \; o}
$ G) e6 M. K/ Q3 w1 v7 ]~CInventorySort(){}
9 o( [2 ?" }. z( {, ?private:6 C0 A0 T: S. d9 u6 G6 g6 H2 @
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息- G. F5 W. i4 R- P0 E& ?1 a. t
DWORD m_dwPos;7 s6 H3 m( p( {. G
public:
, M( z2 S8 U: T6 Yvoid Add(BYTE nIndex)8 i8 x) u6 B1 g! G8 S
{
0 P$ v; U7 T6 a8 i4 [* {  if (m_dwPos >= MAX_INVENTORY)
+ t+ ]3 ?2 J5 p: ?  {
6 {" j+ {6 w" O; T% E   return;7 r1 C, @, C( T5 R. ]5 ]
  }$ {$ J. i8 R$ B2 h" y
  m_Item[m_dwPos].nIndex = nIndex;
6 `! M- p- q, ]" ]4 X  m_Item[m_dwPos].dwId = m_dwPos;% S( c, ]& l4 ~, N: f. e
  m_dwPos++;( e5 \6 F* @9 x4 p' \  y* W7 z
}
+ S" ?* D% J& I8 wBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列" p4 w9 {) t+ N* ^: x+ M( [
{3 S/ F% g* Z2 T! Z; X: ~, ?! w
  for (int i=0;i<MAX_INVENTORY;i++)
2 m  q; P6 r/ \, I! n' ~' x: |; d  {
! K9 W) o( G/ ^" I. m1 Q   if (m_Item.dwId == dwId)
: G0 T2 J/ d. a/ f4 z! b0 t   {
8 _' S$ E" V( T7 v: T; K" t    return m_Item.nIndex;
8 `8 N7 H- P; `! e7 d. ~   }
& H) b4 ^3 X* {/ x( T  }( C0 n( [9 \/ |, X8 b9 v) ]: J( v
  return 255;( `) i0 |8 y3 L
}  H. K6 c0 ^9 ~0 N, A
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
) ], Q2 T- G- ^1 n( H! F& i{* R, }( B5 D; T
  BYTE nTmp = 0;# H! E" B) e- Y$ d
  bool bDest = false,bSrc = false;
2 W4 g. D# `) w: G4 t- d/ S, Y  for (int i=0;i<MAX_INVENTORY;i++). Q( w) c% _& Q& {& Y3 a
  {  k; t  E+ w7 k  _
   if (dwSrcId == m_Item.dwId)
) {* ]( P# a, E( j   {
* ]0 o! f, Q2 \! }# F! V2 b    //id相等 则 改变对应的dest和src
* A5 ^0 w# h2 ]% `+ J- m1 ~7 \6 X    nTmp = m_Item.nIndex;* C( }' i0 F, e( [- @
    m_Item.nIndex = dest;
  F. G( F4 ?( d% {# D& F( g   }. K6 z! C8 d/ L; ?  C
  }
  T2 @( b5 u8 W( B$ t& W: b  //临时数据保存完毕,交换开始
& W  Z0 K1 Y* G$ v5 i/ u  for (int i=0;i<MAX_INVENTORY;i++)
+ V5 F, `1 z( h+ s  {
1 _- O/ ]) z$ Y1 P  e; g$ M/ j   if (dest == m_Item.nIndex)
, s/ v- D( A+ s4 p   {! s0 N5 f6 X& Z$ l9 u' Y
    //id相等 则 改变对应的dest和src, h: E1 O/ b; h6 S" _
    m_Item.nIndex = nTmp;0 r' ]3 [% n4 e1 \! X$ H8 c' t* m
   }) ~& b2 G+ m" m! }/ Q8 V$ r
  }/ m& F- L( G# z$ C% T, B' u
}
( U( M5 d7 a+ d0 @};
/ d0 c/ s+ k- w$ O-------------------------------------------------------------------------
' @8 Z' |& X9 w  D8 p0 g. R0 B依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )0 r2 k7 X6 K) J5 |3 G
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);+ k7 T) T# G0 a/ T5 Q0 R
紧靠其上添加:) s# j3 [/ w4 e/ v- i2 H
if( pWndBase == &m_wndMenu )
6 k: a" T4 t( x7 b% u{& W, V% e2 C7 P2 i9 Y
  switch( nID )2 d, G' t, V! \, W
  {: T' K. a- H: ?8 L3 B$ ]
  case 2:0 G4 i+ X0 j$ n
   {3 B. T# j; @2 X: d7 A
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
6 L3 W. y* q' K5 L0 |9 P    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))1 c7 h0 ?/ ?$ j
    {
( [) y: z; C( a0 h: b     break;# D! d4 A% r% c' n& J2 a; q; Z* X8 D
    }
2 J8 e, k' O+ {; h& S1 z- K    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)' ?' s2 i2 P5 R3 J" M
    {
! O6 A0 q: e! ~     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
4 \. R$ R; ^, ]% H% K0 K4 y     if( !pItemElem )
' l  ]! O; k6 k' c6 o* g      continue;! Y2 H: S7 y, ~8 g4 P
     if(pItemElem->GetExtra() > 0): u! U8 l: y5 X2 P
      continue;
( q- T" ?( Z+ y1 @     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) 5 \* z- s% e. B' G( N/ @
      continue;
9 N8 x# }% o+ m     if( g_pPlayer->IsUsing( pItemElem ) )) T1 B) n* X# `8 v' ]2 x( Z% h
      continue;
1 X3 U- `, s& r     if( pItemElem->IsUndestructable() == TRUE )- n1 |/ `2 m1 Z
     {
6 Q& s  G3 Z' {9 Y7 h3 p, m      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
7 u0 S) |/ a" X* n0 z% l8 ?      continue;
5 O  m+ J# s" l: @, Z' v- `6 [$ |     }0 G* Q; Y+ \& |. i2 s$ I
     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
8 Q$ x7 r/ n) l6 R- H) D& {    }
9 J) v4 p5 Y  h! C/ e% X    break;
, v- Q, `/ o9 X- S! g0 F0 M   }' h8 v! M3 h( S5 t3 r2 S
  case 1:
* W6 X/ d5 B. L: Q   {6 X6 t6 q7 E  N  L+ [) P
    //整理背包0 o9 e9 ?+ x  C% s" q
    //////////////////////////////////////////////////////////////////////////. c# \8 @' b! ?6 W
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );! B2 X/ [, x! A1 `7 Z/ D. t
    //////////////////////////////////////////////////////////////////////////' O$ i# {# S/ _$ }2 q
    //////////////////////////////////////////////////////////////////////////
7 r$ n5 `5 B- B" {. P$ X    CInventorySort* pInvSort = new CInventorySort;' V  `* D+ {" D. w0 ^* \5 g9 F
    vector <sItem> vItem;
/ g4 |5 M/ i2 C8 U* H  Y0 W7 i( E    vItem.resize(MAX_INVENTORY);//初始化大小" J" [7 @: A9 L& w+ U$ {
     //////////////////////////////////////////////////////////////////////////
6 E7 `, ?4 n' j& v  T5 y% L; m     //填充数据
* y5 o- F7 L  {4 X     for (int i=0;i<MAX_INVENTORY;i++)
* H, n/ e& c; |6 a     {  o6 i3 n+ G$ E$ s& R
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);. ?) q4 m, Y7 P$ W/ p9 d  ]; j
      if (!pItemElem)
3 V; t, z- I" {- N      {
. i4 q, T( Y; J" k       vItem.dwKind2 = 0xffffffff;
8 j0 @4 |3 r# p/ ~" e       vItem.dwItemId = 0xffffffff;
/ H8 u2 ~8 Q5 a7 R6 c       vItem.nIndex = i;
& }5 A3 c: d% o      }else {+ S) T  D+ U' k& Y
       ItemProp* pProp = pItemElem->GetProp();5 i" D# @: d6 M0 S, D/ u
       vItem.dwKind2 = pProp->dwItemKind2;# b+ z, O$ K8 f* f: y
       vItem.dwItemId = pItemElem->m_dwItemId;2 T: |2 @. G1 w) x; A3 x1 `% e
       vItem.nIndex = i;
% `. ^9 G3 n' P/ q      }7 S+ ~% h* _6 l1 }4 G' ^
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);# C8 H/ }' g5 u
     }" B/ i7 M/ s1 l/ v
     //////////////////////////////////////////////////////////////////////////
3 S, q1 s5 a5 }. @2 i3 D     sort(vItem.begin(),vItem.end());//排序
. p0 O- }! @. j4 u, i     //////////////////////////////////////////////////////////////////////////$ I- d" y8 w  R" g- L  }* H
     //交换  i5 @* g$ d5 z, ^
     for (size_t i=0;i<vItem.size();i++)
* ]( V) J. @! [1 b- Z+ E+ x) p     {% ?7 z$ M5 H. e1 {; k7 R
      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
1 K  p3 ~* K  r1 Q7 r/ u      pInvSort->Add(vItem.nIndex);8 j/ e- X3 f  k$ @
     }0 B! }7 H' P6 R5 b6 o, l
     BYTE nDestPos = 0;" V2 W& T' F, R( W. E
     for (int i=0;i<MAX_INVENTORY;i++)
- v" M+ _. x) S     {$ y2 V0 O7 O, |5 T1 _8 w& l9 u  t
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
, I' [5 z5 x; z5 i      if (pItemElem)% [$ m" J) h8 e% a
      {
- ^: ^0 u; _( U       if (IsUsingItem(pItemElem))
" S  F2 t2 G& E! x1 q( c/ {       {# j! v4 k3 W4 y* q6 }7 A
        //这个位置无法放5 ]! ~. ?+ H+ B
        nDestPos++;7 O+ \2 \& L8 e$ t* D
       }
# V' L2 n7 R0 s      }
9 `9 v# ^' ]) B; }6 Q      BYTE nSrc = pInvSort->GetItemSrc(i);' z0 \. _4 M5 I/ J- U/ }
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
0 \/ h' ]) T" u" i2 e, B      if (pItemElem)
( G% P7 b5 N2 w/ T$ G( C0 ~      {/ q2 \9 w! o8 |; V: G: A6 y
       if (IsUsingItem(pItemElem))6 V' y2 O0 ]! G3 a! o0 c
       {" T, \+ n3 U5 O. t- v$ T9 {
        //这个道具无法移动,跳过
; a! d* u& B0 C* i& F        continue;1 [9 S# N4 ^' `9 c1 e/ \% R
       }
( [' _$ k3 w  \# C6 J* H      }else{
6 j* S# {& L' q       //空位置 不用动
4 f6 R9 l3 i" Y$ p, u       continue;5 |% f" O  x% V$ K1 t
      }
/ `# y) x  I$ s1 e: |/ a8 f      //////////////////////////////////////////////////////////////////////////
( ]2 j# i  }1 K1 z6 V' N% P7 K3 e      //开始移动
3 L$ T; r& K8 y# \* j4 ]9 r      if (nSrc == nDestPos)/ `  o  y3 \' o; P( X- s4 Y
      {5 W1 J4 a7 s+ x2 D1 ^
       //原地不动+ P! U; D% j: `& c! }
       nDestPos++;
9 y; z+ S( n- W  D  X% T       continue;
% ]/ q7 x! S+ C6 K5 _      }6 G9 h5 C0 u7 u4 N( B
      pInvSort->MoveItem(i,nDestPos);
9 q3 E  k. F$ |, d      g_DPlay.SendMoveItem(0,nSrc,nDestPos);
9 S. \/ _# @' N$ I" N      Sleep(5);
# A- P3 U" B' D. b# q$ t* s1 j      //Error("移动 - %d->%d",nSrc,nDestPos);% f' p3 p2 U6 l2 T. A
      nDestPos++;
) ?" T( J2 D- K2 T     }
+ I2 }. E+ Z# E9 n     //取第一个元素的信息
7 p& l0 X1 v; R8 ]- o     /*
! f# X" x2 z6 s( P/ L     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)% o+ I- Z& r# _) \
     {
# `( K' N* ~9 K0 a% ?      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
& X0 e, V$ T, l5 [0 h      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
3 T0 t+ M9 m2 o5 E     }" W9 I* Q3 p+ @0 ~- b6 b# ?
     */
1 N: r1 J- N/ a+ x8 L3 |) e    //////////////////////////////////////////////////////////////////////////2 w! ~5 j* m; M( C
    break;7 [$ b# ^+ _9 w# c
   }
2 [8 x6 G1 v& l# c# P9 n" k  } 2 @) q; `2 |6 X. d! |! `2 J4 n
}1 T& A( j% i* @# g# ~" v
m_wndMenu.SetVisible(FALSE);
4 b! T" ]9 j6 L# a& a
. B, t( x5 M" w* ~& a2 X! H--------------------------------------------------------------------------------------------------------
3 U# U8 w  R# R搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
" r: h  I) h6 }/ T1 I{% k' L' m; T" \" P2 p: c# i
BaseMouseCursor();) ~. R* t9 O* s4 }' Y+ Q" ~5 `
}$ W* k: v# t* j
在其下添加:% T5 R  o' S4 v& I8 W- ~- x# B) J( r
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)# C4 g1 ]% K& E$ ?* }2 g0 x% m
{( E7 r# y0 V0 e6 B$ x3 Z0 u
m_wndMenu.DeleteAllMenu();
$ D# ~- `# {8 U9 x% f4 Dm_wndMenu.CreateMenu(this);5 Y* k4 ]1 y0 p* j
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
: T9 s! |5 i: i6 N" `% f; d* _3 w7 V7 l# c
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))( ?3 p& \( c8 ]' ?" Q- b
{$ G' E. N: K  x8 f, b9 L
  //P以上级别才可以删除所有道具
! O, n+ x* Y8 a( g4 _  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");/ @: C' ]9 c, v7 N
}
, ~: ]( y, v3 w% v! Am_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
9 k; U5 |7 i2 d+ _m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
' g, U' x: O; s# w; }5 U) Km_wndMenu.SetFocus();
" V9 b2 S) J% G" m* K! L$ q- `}9 F: ?! [3 L5 t1 F  j
------------------------------------------------------------------------------------------------------------1 ?5 ]$ @. j( x5 h
*************************
" A1 X. X2 N$ X0 cWndField.h文件' x7 B! X% ^! I! Z& C! j
*************************4 G, k& m' T1 B& B
搜索:BOOL m_bReport;
6 z; l# d6 B/ c3 Y+ F其后添加:
* D! m# E, w2 k0 s+ \9 {: x* {CWndMenu m_wndMenu;! C/ \1 |/ ]  H. N- W
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
# l; C* _1 L0 F其后添加:' Q0 r$ |& `/ S+ r
virtual void OnRButtonUp(UINT nFlags, CPoint point);) i3 ^2 N" ?2 Y- X4 L, A
6 P* E7 H3 [# X" g8 g% v

; O3 S- H8 [+ G/ A

相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 21:33 , Processed in 0.073353 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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