飞飞世界论坛

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

一键整理背包

[复制链接]

197

主题

203

帖子

1086

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1086
QQ
跳转到指定楼层
楼主
发表于 2016-1-10 03:44:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源文件中_Interface文件夹下WndField.cpp文件
* L. j4 w' C  A& G; H! L: H. `搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
# c9 v- c: N7 w( `; s5 H3 c  ]  ^7 j( B" S" K
struct sItem3 E" G( U* M# S- }0 Q
{
  D: B: g. ~9 @9 ?( }DWORD dwId;: k, Z5 ~- ?% P5 F# ~" n9 k
DWORD dwKind2;
( l, e3 y9 M/ d% _9 x4 DDWORD dwItemId;  |" k( Z& E; l$ E6 D$ I
BYTE nIndex;
9 J7 ^4 ?/ ]4 X( D7 d/ [0 LsItem(){$ J7 L4 c4 H" `. B% p1 O9 y# O" @
  dwId = dwKind2 = dwItemId = nIndex = 0;
6 e0 i- y4 ~% F6 g; F7 I, j2 I% \}
. b, N, F) e# q; d4 @bool operator < (const sItem p2)
2 J# F+ G; r# g1 c{% N* v) }# q' [# v, L1 U) I7 M/ O
  if (dwKind2 == p2.dwKind2)$ b1 @) u, r+ b; R5 G% ^
  {8 l8 Y" \: a. \- r0 G4 D# U  w
   return dwItemId < p2.dwItemId;: z5 f; Z0 r- k( \0 u8 C8 O
  }else{
, e4 _/ ^: a/ O6 `6 H/ I" g   return dwKind2 < p2.dwKind2;
  h6 \/ j3 @! h- a% ]6 C  }6 E( q# }. c9 O# K9 f& m
}
% E; p$ @9 V6 e9 X2 y};+ \  K3 j2 s6 t
class CInventorySort
+ L. s! i0 u/ y# w8 J+ M{) c0 k3 _$ K2 D8 m( T/ X2 H
public:# W% c/ G# f- Q1 t1 d1 ]  a3 y) W) M
CInventorySort()
" C, J) Y3 A) o; ~! A{
+ S5 O# s5 v/ _' y  m_dwPos = 0;
6 p4 B1 G4 f5 \* Z+ q}/ }; ~) A, n7 b/ P
~CInventorySort(){}/ Z. `* ^- s. J: Z
private:
- m  m; c' [  l3 V+ L( W. h0 |sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息' z  F' j, j( J
DWORD m_dwPos;
) d) _) x$ l' a. w* W2 Spublic:9 y4 t' d) N( P( O0 t/ R
void Add(BYTE nIndex)
4 H0 k! {& h/ C7 b4 ]{
% Q2 c6 m$ L. D3 T5 ]! p; p. k  if (m_dwPos >= MAX_INVENTORY)
, K. G  m: z# G3 F! _, S  {
) B: ^7 t% R4 W+ n/ E2 r   return;
# w* v4 U( C3 x! |; h  }& d7 {$ O* V! y  U4 z$ h  ]( z
  m_Item[m_dwPos].nIndex = nIndex;
% T  z9 G  R* L8 D  h3 C  m_Item[m_dwPos].dwId = m_dwPos;
, H) T4 x: S# Z% ?: t0 k& C, [! F  m_dwPos++;2 U; k! i4 V0 z! f
}% ]+ D" V. w! H7 v
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
$ e% n7 T: K6 u/ L2 c  T% A{
3 p3 {# j- k" j2 _& f4 h, N( q, ?, R  for (int i=0;i<MAX_INVENTORY;i++)6 s& K8 [- q% |, ]' Q; v, \2 C3 Y) O+ ]
  {
) H0 q( P) I) H   if (m_Item.dwId == dwId)( x$ f9 q8 f% q5 ~& A5 j
   {
  T$ M1 |+ g9 I9 Z  C    return m_Item.nIndex;
' i. T6 g# x* X6 m5 t' p   }
9 T( V8 [$ C. i  }0 w/ w. Q6 t1 R
  return 255;$ l9 X1 L) Y5 N6 F
}. y. M$ j5 z1 q, k
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
& c1 `6 w" o' O) _{
7 q# F# ]3 i* |  BYTE nTmp = 0;
" V7 C' l4 u$ Z  bool bDest = false,bSrc = false;
3 W, O7 M/ i! J+ J2 J' ^7 i0 T( h  for (int i=0;i<MAX_INVENTORY;i++)
9 i7 I, F4 \$ l9 @+ K  {
2 n4 r2 B6 a6 [# g   if (dwSrcId == m_Item.dwId)
, V5 P! `, E/ O4 J   {- q/ r$ ]/ B1 [9 F& h7 \0 l0 M) d
    //id相等 则 改变对应的dest和src
7 O& a( `  W3 _) V# Y  ]    nTmp = m_Item.nIndex;
9 d+ u" Y7 z8 u" B, B2 P    m_Item.nIndex = dest;$ r+ V' k2 p  C- K
   }
, [( y( p3 `- `$ f. I+ Y, L# t' _  }% {6 g, {+ h) t7 o% R
  //临时数据保存完毕,交换开始; T7 n0 d4 U) E2 U0 K
  for (int i=0;i<MAX_INVENTORY;i++)
3 F$ G7 X" b& m& _: J  {" ]  ]" O0 n, j) j
   if (dest == m_Item.nIndex)
8 i% z0 `7 M; ~7 Z( D# S0 I- E   {. Z5 c- b+ n+ x" e1 T
    //id相等 则 改变对应的dest和src: B' o9 m  s1 Q8 c' k/ n
    m_Item.nIndex = nTmp;" M) X' D4 }) a
   }
- y! ~# K  E8 U# |" \4 @4 {  }
. d1 G+ d! l/ ~# f}( w2 R4 c- [7 b& z. h1 s0 ]
};1 }6 t4 j7 |* w5 P
-------------------------------------------------------------------------
) e( s& R1 H: M* W& G! w: L* A依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ), k: u; Z# @- V* |/ |
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);" j9 a5 |/ u# _& W5 @
紧靠其上添加:  @+ i( o6 s0 ~* N6 g
if( pWndBase == &m_wndMenu )
  B( H. A0 w1 J7 j( E{) E& @- _/ k$ H: b2 M) f
  switch( nID )
$ i" ^* E3 `% Q% Y# Y  {
  @6 G) _* a) z  case 2:
+ `1 [) b, q2 e; e  a! {   {
! \! m8 f" N8 m1 B' \: r) _    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);; B, e" K  G0 r) k, O  ]
    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
9 i) ]  p& u' s- h! q    {
% ?& q4 g# v9 ?4 V/ o. i& E     break;
4 m' T4 P% I! ^6 _, ]) R4 E    }
+ H& ?0 V/ a( B  _: h8 C    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)! _+ |9 r3 ~& J- |4 G
    {9 E* _3 E- I' m8 D
     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
2 [& j/ H- B8 I' b     if( !pItemElem )
$ ~: [# G) {* i      continue;1 o$ q! q9 M* T. R
     if(pItemElem->GetExtra() > 0)
; v  H8 a( ~4 U) w" u; d      continue;6 A) a7 c) Z7 t3 s) }
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
; @  m4 t. _1 d5 E4 n) @      continue;
6 j/ \% ]2 q& @+ m: k* g; p     if( g_pPlayer->IsUsing( pItemElem ) )6 R) Z0 u- l8 |
      continue;" c8 S4 ?/ c3 x. |5 u/ W
     if( pItemElem->IsUndestructable() == TRUE )
, M0 ]8 D/ p" n2 Y+ {  N     {8 T) v- R) x% j# L0 O  o0 |
      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );- \' C6 k% j2 ^7 m
      continue;
* W6 U8 r3 l! Y( m+ T0 I% ~     }
7 e  w' ^; w  |  ~     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
+ C. R3 R3 E8 |3 O    }
. E+ v4 s3 }8 p    break;, {+ r" H$ H. K
   }
7 [8 `& t$ s1 o/ X  R2 ?, @6 B4 z! F  case 1:1 ]5 ]. D) i" J7 j; c! L, F2 h: r
   {+ x! d- j* l) v4 `& I
    //整理背包
" i; S3 ~1 Z: [, X" K    //////////////////////////////////////////////////////////////////////////* @! T0 v3 t) g% y2 L# R! i
    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );9 ^; D: z4 Q7 D' _7 h: F  u* a
    //////////////////////////////////////////////////////////////////////////2 Y/ I% C+ v' q
    //////////////////////////////////////////////////////////////////////////7 h+ f3 n! d3 B2 k4 l0 x2 j
    CInventorySort* pInvSort = new CInventorySort;
( v' z/ A% ]5 k- a/ n/ M4 x    vector <sItem> vItem;# b  G; P% y* }, E) `
    vItem.resize(MAX_INVENTORY);//初始化大小# r$ d4 w% w4 c3 f
     //////////////////////////////////////////////////////////////////////////
) z% L5 }" n' p6 y+ D5 ^8 Y7 S     //填充数据
" u5 j5 t2 Y6 {+ f7 u: @- X     for (int i=0;i<MAX_INVENTORY;i++)
& f6 D4 y% A" y% L9 S  \! b     {+ i0 G5 H. B$ w* L9 b
      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);, c% [/ J- k" n; l
      if (!pItemElem)+ y1 ]# s6 ?/ u1 ?" f7 }
      {
0 \5 E  ^# `( e6 V8 v+ A% F, h8 Q       vItem.dwKind2 = 0xffffffff;
* u% a; _# p& d$ h8 l& v       vItem.dwItemId = 0xffffffff;
5 l0 o* n1 D" D- N& W! k4 y) B       vItem.nIndex = i;' T- h- x7 p4 ?: O
      }else {( w8 N* d6 V' S+ A5 {- B4 u) X  m
       ItemProp* pProp = pItemElem->GetProp();$ A  T: }5 N# Q/ y
       vItem.dwKind2 = pProp->dwItemKind2;
0 ~* c! S- J; K8 a' e7 p9 C       vItem.dwItemId = pItemElem->m_dwItemId;
9 A( I% W' \' V* c/ S; ^       vItem.nIndex = i;$ G, r( h2 Q- L! |+ o
      }& k+ D) [8 d* f" X/ u' f# W
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
4 H( f8 i  }0 a$ S     }$ T8 x2 }% r0 ?
     //////////////////////////////////////////////////////////////////////////) ?. A7 ^3 j! ]8 Y  R: }
     sort(vItem.begin(),vItem.end());//排序
8 S: m' ~0 }! z) Q     //////////////////////////////////////////////////////////////////////////8 t0 d+ ^# J, N" b
     //交换0 e: k' F" Y/ t( c
     for (size_t i=0;i<vItem.size();i++)
/ g& t; U' V7 ]( z: f6 `2 A     {6 O  p, G& u1 X9 m! o. C
      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
! N5 f7 z: c3 q      pInvSort->Add(vItem.nIndex);! f$ I( j! e( k7 o0 E, \1 q
     }
4 w5 C; b- a: t5 u( ?     BYTE nDestPos = 0;
& p4 t+ r5 n7 ^' O- N6 c     for (int i=0;i<MAX_INVENTORY;i++)
4 O, r3 r* g2 @3 B' c  m) M     {
4 M( g8 H0 r) x8 l      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
' t9 G0 H# Y$ b+ ~6 Q  K- c      if (pItemElem)
! s  T. Q5 o4 H: ~      {
. C3 J$ I) Y+ l6 k' b: T- t0 D       if (IsUsingItem(pItemElem))
" X9 F6 T4 X7 \) E( Q- d$ D7 d       {
3 F' U! |/ ~: P- o  B& p: J& ]        //这个位置无法放
  J% d. y; S7 F3 A7 t        nDestPos++;1 [) E" A/ Q0 s3 y
       }
: P; C: I8 }5 o# l8 h* ?5 ?      }, p$ s6 y8 M0 Q- ]; o
      BYTE nSrc = pInvSort->GetItemSrc(i);8 r  ^# }3 Z$ P
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);% k9 B: u# n; O; E% `
      if (pItemElem)4 x) r- U1 i8 Y* s4 ~$ ~
      {1 Y- U$ K0 m& j4 o
       if (IsUsingItem(pItemElem))
; \  G# J0 p- _+ M4 h8 l4 W       {
+ i3 l3 U( n+ q5 z% Q, ]        //这个道具无法移动,跳过& b0 F3 Q2 _6 P) N  V+ I
        continue;
% W* _7 r0 c; G8 h1 ]* F       }1 Z5 B& B6 H$ g% V( O
      }else{
7 Q; P, T3 a- p- D! j       //空位置 不用动
: l: i* y& }6 }       continue;
: v- J4 h4 `: ?. w# \      }# F1 z) N2 x; H' S- G/ k9 V
      //////////////////////////////////////////////////////////////////////////8 @7 Q- {: o3 j6 X6 \6 L
      //开始移动" |! N4 [8 `; G- ?
      if (nSrc == nDestPos)
# Y% t0 x8 N  x; v      {
. q  e0 ~7 @1 h+ W( m, a, o( A$ X' x       //原地不动  D, `. X6 k0 ?5 b0 E
       nDestPos++;3 T0 P) m" `( Q* S, y
       continue;' s# Y0 p$ e# m7 E; |7 w
      }
1 C  a5 I- M; g4 _! X      pInvSort->MoveItem(i,nDestPos);
! r4 \/ `# E- i7 k      g_DPlay.SendMoveItem(0,nSrc,nDestPos);
4 D5 X2 k" v+ B" I9 L% G* Y" p; S      Sleep(5);
4 t3 v3 j! W3 V/ f3 b4 q- ^      //Error("移动 - %d->%d",nSrc,nDestPos);
$ I$ P! Y% x) c      nDestPos++;
3 w( m+ j3 @$ D2 O. \! t  M0 c     }, e) S/ n( V# o) b- a) l  J* G
     //取第一个元素的信息
& ]5 x/ @( e5 |" q. d     /*
: D4 d& S$ c5 a2 h7 ^) l! @6 {( h     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)9 H# \* g8 {2 I% U
     {
( E* u1 n. {, n4 X7 V      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
) Q+ Y( q: t; s* z: h7 V      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);6 V9 s% a8 O% {
     }! @- G$ g# L6 D% V
     */& J& W) H# _; s7 u0 P: N& o
    //////////////////////////////////////////////////////////////////////////& Z  n4 D& M, e" n& ?; W
    break;
8 {$ e7 i( w5 F% X6 ]/ t; [   }
% U5 a) D/ E" {' g! M  } 0 k1 C1 K, b4 h  q7 h# P. j2 _
}% R8 v+ h1 K- @) k/ }3 H
m_wndMenu.SetVisible(FALSE);
; d- ~: n0 E$ Y9 a0 P+ V2 {( u
0 F; P& \( E2 B2 x2 r--------------------------------------------------------------------------------------------------------
" T& A* J8 i2 {& p+ ~. S搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)2 Y) \2 s9 h; _1 |  R; g
{& a$ `3 e7 _6 G8 |+ t+ p- I
BaseMouseCursor();0 s& t+ H# X# d% c8 H& V: }( G
}
7 f; R! V1 }# N% }# S0 V- H在其下添加:
. Q% I) e3 _$ T/ g' K8 B& ^$ kvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
* u. Z# j5 c( S) j/ y$ U' w{
" P3 S8 s" o1 P4 S+ H; k2 qm_wndMenu.DeleteAllMenu();  M  k# i1 k% r7 r. y4 R
m_wndMenu.CreateMenu(this);3 F0 z) d9 C2 f1 ?, ~3 N
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
% g, x9 {1 m( A1 l( Z4 V0 t( F! {  E- z; m9 j+ S" Q
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))* m' N8 r0 [' I! [& c/ L
{/ k, l; h( Z# R0 H
  //P以上级别才可以删除所有道具0 n& S8 d5 E/ Z/ k' n
  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
: b9 R0 i  g0 a+ ~$ I/ l}
9 J3 b- X  t$ R" T6 Z9 p& \m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
/ t$ i* r' x) R* Hm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );+ A. u) W5 _7 ~5 A
m_wndMenu.SetFocus();
+ b2 m+ m( `) U4 Z1 d# j( O  A8 ^1 v}- [' k+ B, d/ e1 K! p% _/ s* P
------------------------------------------------------------------------------------------------------------
7 q- R8 w& E, U/ U) `+ d0 P1 E*************************
7 D! p0 P8 z' P/ m' _WndField.h文件
$ w3 H) ]' E+ H*************************7 z: t) K* E1 f, M, B" S
搜索:BOOL m_bReport;
; S) R) Q7 @" X; ~$ V: J其后添加:6 W; u& D" T# |  k; Q
CWndMenu m_wndMenu;7 y2 O: J4 T+ W' l# q4 F
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
" I* A1 K9 c1 _; Z9 ]. T( [# m3 ?/ x其后添加:
& x1 _6 q3 ]( p$ tvirtual void OnRButtonUp(UINT nFlags, CPoint point);/ H2 T& s2 q0 a" _9 \# t% I
# R+ X; P$ d+ g9 e$ F

5 m* r! N6 A) b: g# ]! A

相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 19:24 , Processed in 0.063446 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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