飞飞世界论坛

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

一键整理背包

[复制链接]

197

主题

203

帖子

1078

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1078
QQ
跳转到指定楼层
楼主
发表于 2016-1-10 03:44:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源文件中_Interface文件夹下WndField.cpp文件
, n$ F6 w# [+ E: A: n搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )! w5 K# G% X. L/ k
0 Z9 z4 N# F/ S9 U
struct sItem4 z% O1 H# b4 o, u/ r
{3 G, G5 R* Q# I& ?5 b  s( l+ ]
DWORD dwId;8 E* t& N7 W+ B
DWORD dwKind2;
, K1 l6 i7 D- Q' yDWORD dwItemId;  X) c5 h' \4 M# o: G8 e2 _0 u
BYTE nIndex;% |5 M6 S+ g" ^3 s8 N- z
sItem(){
4 E' D4 P+ e9 M& O; Z  dwId = dwKind2 = dwItemId = nIndex = 0;
" z8 s4 k2 P! q- x% [, A: ~2 z4 |}
3 R0 ^$ F; s! f6 {8 m- ~bool operator < (const sItem p2)5 c" H7 O9 b) Y4 J6 Y2 l8 M) S
{
' o: _- A* M* u4 L. z. N, u1 E  if (dwKind2 == p2.dwKind2)
. b  \6 {5 g1 p/ p% T) ~  {6 R4 k4 z- Z1 b8 ^0 V
   return dwItemId < p2.dwItemId;
! R& M" ^: D4 D/ R  }else{  `$ j, X- B4 W! D4 `! M
   return dwKind2 < p2.dwKind2;& T, T1 _! ?% z( R9 d, x
  }
- g: H& U; V2 ]' a3 ^) I: \/ _}2 J3 U2 g4 e3 ~% K' A+ v) y
};9 {: I( ^1 z2 z* S6 t, S2 B
class CInventorySort
+ w0 r+ H* F$ L: a: S{" K# i' _9 N$ ^
public:
8 R4 b0 ~& O! qCInventorySort()
( t' m' Z: P( ]  Z4 N{
" E' J! B* q- k" H, s; `% X  m_dwPos = 0;# d8 s- v" Q! G: A" r
}
" G+ Z* N0 z8 O! Q& ~" z3 m* h~CInventorySort(){}
- H2 n0 k, {) @: R8 o* {private:4 `" ~0 _. u6 D- m) G/ ?7 [3 p7 e1 Q
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
0 \( p4 @1 S  dDWORD m_dwPos;8 |5 [4 o# T' a  m
public:! a5 u7 t2 W& r9 A
void Add(BYTE nIndex)
% H" D' ]& g5 s+ n% {  W4 L{3 Q: v3 C9 o. x* E  P9 d! d
  if (m_dwPos >= MAX_INVENTORY)* ]* E0 V9 U. q3 x  ?
  {1 a0 b$ d3 E; m. Z3 e
   return;
& K9 \1 R- m6 w0 \$ O$ q  }# Z, K- @: T4 ]/ d
  m_Item[m_dwPos].nIndex = nIndex;- e6 G. Z/ D( |2 i7 t, Q
  m_Item[m_dwPos].dwId = m_dwPos;7 f5 `, i2 Z7 G' f- d  ]
  m_dwPos++;( H& r$ Z8 O- z# W' R( s9 f
}
& y8 ^" R8 s" aBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列& q8 `; E3 d, E; e: w
{* X) b; [% j& y& D
  for (int i=0;i<MAX_INVENTORY;i++)
$ ]) v2 V* H- C* R3 L  {
- i( N4 _( {, U. |' p  z- z) L   if (m_Item.dwId == dwId)4 K1 h* i: F  R' e5 N0 R
   {
0 s" Z9 g0 X( l    return m_Item.nIndex;- p9 j/ C( K# S2 ~* d* j
   }
% J4 H. E, J9 k+ N" r' s  }
, r" u$ l% h2 o) E* x- W  return 255;
' z/ F" h! v5 T+ X! i}
" f0 B0 r6 b4 }* \8 tvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置4 o8 D) P/ w6 J1 V% m8 T
{- g% Z6 |- ]% s6 t: v9 e
  BYTE nTmp = 0;0 R+ @( m' y' q+ e2 w9 e2 s* ~
  bool bDest = false,bSrc = false;3 \7 T& C; K  B1 F' p' d
  for (int i=0;i<MAX_INVENTORY;i++)
2 Z7 f8 h8 M) z  {  r+ |4 d( q; _& @% ^
   if (dwSrcId == m_Item.dwId)# j6 D2 M$ l8 t
   {+ O8 p1 a; R* z
    //id相等 则 改变对应的dest和src+ Q) l2 V( H: D5 r- d
    nTmp = m_Item.nIndex;
: a# R, t5 ~; q' V4 X% U    m_Item.nIndex = dest;) C5 X0 i! h3 m) z& v: D4 b: z5 |! [
   }8 I0 t7 A$ d9 q& K% B3 ?+ l! A
  }+ N  G4 J8 e  D4 I9 m
  //临时数据保存完毕,交换开始
: T. p7 M! c0 C9 }+ ]6 i# ~$ n  for (int i=0;i<MAX_INVENTORY;i++)  \, \4 _$ x' e$ J5 ]% G, \
  {
& B' `2 K9 Y/ k2 G0 O8 h   if (dest == m_Item.nIndex)
! b$ D$ J9 E4 G! e4 W- ?   {
5 ~8 W7 d1 l' j' I    //id相等 则 改变对应的dest和src% L$ O+ t: B/ U9 T1 [4 N  [) c9 {
    m_Item.nIndex = nTmp;
7 O$ t: ^( p5 b; z   }3 n+ d* O) H* j; W+ Y9 @
  }
: ^- \0 s# @# d}0 |+ \; D1 z8 a1 F% a
};
" ^3 j& P7 p4 ^* x4 u-------------------------------------------------------------------------
8 w6 B+ d' i6 U' H0 [' q. L依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )0 ~8 }# O6 |& t( ], q: _
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
/ M$ O! X1 s! {6 x' `$ b紧靠其上添加:# v( T5 B% {: i+ e9 f# x3 X
if( pWndBase == &m_wndMenu )
" ]0 e7 I, Q- f( S9 O/ Y' h7 \{1 p8 P; f$ e4 T$ g+ @( E
  switch( nID )
( G% u- E% U, X! k+ L, x  {
/ _+ G, D( p- s4 T. q& \; D1 |  case 2:
( G  Z- X$ a3 ~, U! I   {3 r0 Q9 K# N/ K, L
    //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
: Y  Z# z& P6 m, h) f" s: j    if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
/ O1 m# m  K6 e- o3 R$ \    {. I' H( \/ d" s; s& y3 i1 w
     break;  M6 ?3 y& k) `/ g7 I# H& }# p
    }1 ~/ n) D3 Y' l6 H' S
    for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)  X" f2 p1 v) o" m, A
    {. k% O# F. w/ [0 @" u' l
     CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);% C! M- H- T6 s: f
     if( !pItemElem )! W8 X1 {" ~. V- `0 v+ x
      continue;0 d: `2 n8 C- y% ~* B
     if(pItemElem->GetExtra() > 0)
" v2 |$ d/ D" l! y9 \      continue;/ ?! t( v: k# t0 n: ]$ l5 V9 O7 A
     if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
  R! T7 d7 S& A% H7 V      continue;
( W$ G; y7 V7 u$ n( S* m     if( g_pPlayer->IsUsing( pItemElem ) )4 E) F& X4 V$ H0 ]
      continue;
9 X& q, x( g$ w: D' C$ k+ @     if( pItemElem->IsUndestructable() == TRUE )3 w, z$ x( Y( b3 T; l& {0 O
     {
6 D9 {7 ~% Z8 M: B/ \& `      g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
0 L9 G. i. ^  j* B% Z7 s      continue;) I) u! B  q9 c6 |
     }4 m. E# Q, J5 Y" B
     g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);1 l' y% H% \; }4 `
    }
2 N/ A* g: O6 A+ l, ~7 N    break;1 y$ D  T1 Q" {3 Y# ]/ o8 A
   }9 M1 H' o  ]: G9 V' c
  case 1:' a( e1 f- I  i# \& Q; h
   {
5 I5 V, h3 @- w  D: ~' |5 N/ r, ~- r    //整理背包( \1 p, w3 n9 Y% S- k( h
    //////////////////////////////////////////////////////////////////////////
% N  \! f# M+ ?8 R/ z& Y    //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
$ d  Z( C1 S  {" M    //////////////////////////////////////////////////////////////////////////, L: g- r9 k7 c7 W
    //////////////////////////////////////////////////////////////////////////; W& W0 c8 ]$ ~( }6 |# V! A. ]
    CInventorySort* pInvSort = new CInventorySort;
8 @8 e" ~, z# o7 A! ~0 u    vector <sItem> vItem;
& i' S' Z  \9 b. ?: c1 W    vItem.resize(MAX_INVENTORY);//初始化大小
) R$ p# V- S: P0 Y4 o) ~     //////////////////////////////////////////////////////////////////////////
7 v+ Y0 d' {8 @0 ^# b     //填充数据
3 p/ z+ T; ~, u( x     for (int i=0;i<MAX_INVENTORY;i++)
' j6 N- p4 Q, p( t; Z     {
  o. }3 a3 R9 f* T2 \4 A      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
! w- }. R; r0 }* m6 |4 t  O      if (!pItemElem)
$ m% J1 U' t& F0 K      {
+ n% l" j; D) f2 H, w4 E       vItem.dwKind2 = 0xffffffff;
7 _" E/ \6 l1 z  f. Q, C/ @       vItem.dwItemId = 0xffffffff;
) `0 P0 Z& u1 a  B5 A3 ?       vItem.nIndex = i;' Z5 }  P6 `; D8 d0 u
      }else {
: t  l2 a6 U( ?' w       ItemProp* pProp = pItemElem->GetProp();
- u1 p7 u) ~/ S, Q       vItem.dwKind2 = pProp->dwItemKind2;
$ b! H, n: W, S       vItem.dwItemId = pItemElem->m_dwItemId;- m% W% @, z. Z/ l) ]: @0 |
       vItem.nIndex = i;* Z5 D8 W2 ~5 p8 l$ m
      }! c& [& m5 m8 G* Q# @$ w
      //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);1 t+ E0 c  J2 M; w
     }
5 S- z+ m) s0 h     //////////////////////////////////////////////////////////////////////////
# Z% t9 O& X) f& l) S6 R     sort(vItem.begin(),vItem.end());//排序4 B1 b6 x$ A7 H
     //////////////////////////////////////////////////////////////////////////
7 d$ v; o0 W, C! m$ I# H     //交换. H8 \* n# {0 G; e2 j1 W7 Y! ~
     for (size_t i=0;i<vItem.size();i++)  W$ H" b" n  n/ H/ a
     {
2 B5 b6 |7 c4 K% Y* d7 ^      //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
5 K/ s  [% B, O! P; N% y& o% ?- `      pInvSort->Add(vItem.nIndex);' N% S! w2 M4 d  a  }" t- K, a
     }
& m$ D" C& Z4 ~( ~' D0 m+ `     BYTE nDestPos = 0;
5 R# T+ B' C* `) ]     for (int i=0;i<MAX_INVENTORY;i++)# J' c# j" h: K7 Q
     {
0 E. ~, _7 _  |( B      CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
- T  U) ~" ]6 h, W# B' d3 v$ U      if (pItemElem)
7 n, G  o6 D1 U" T! b. ^  p      {# Y+ v# `/ G  k( G5 o
       if (IsUsingItem(pItemElem))
- ~# q" \; U5 [! J2 p! p( ]       {
! b! ]$ `& y  G5 p6 I: a/ F0 V        //这个位置无法放& U" |) ]$ B9 z* ^3 F: Z; \
        nDestPos++;% z4 \. b. f' `3 I8 k0 Z
       }( R9 h- T- ?- A1 I- C+ u
      }
; t. ^+ J8 V. p      BYTE nSrc = pInvSort->GetItemSrc(i);% n4 i6 g- A. |0 o
      pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);4 m6 P- D, M9 X1 E+ m4 O
      if (pItemElem)
) ^# A* i. ]( @& h8 G& @# W      {) M* j& @! T: U  `
       if (IsUsingItem(pItemElem))
) k/ `8 y; Z: J3 }1 i7 D       {
* ^2 ?* _% Y9 b1 p        //这个道具无法移动,跳过
, z; j$ F# w9 l( h        continue;% w+ ]% s, O1 O$ C7 q; F+ M4 N" q
       }" T# G+ K, d3 [6 ~9 \6 n
      }else{
( C3 F( u) `/ `, M' X% M6 y" |8 y       //空位置 不用动/ J  O! G1 I5 e
       continue;% b/ v7 A1 p' H' r# v- `) c
      }
4 x, g" U6 P' B4 Z0 Y' J/ x      //////////////////////////////////////////////////////////////////////////# A* C( U' L4 W
      //开始移动
8 i! n" ?* ~7 F1 ~      if (nSrc == nDestPos)* |. S7 ^' V7 {7 Y/ j4 X6 e
      {" w& [6 {9 Q  J! B& w, ]$ ?
       //原地不动
8 `* ]# Z; p3 [# b+ T, F       nDestPos++;1 @! i" g$ k- x1 r- v/ `: h
       continue;
5 O9 e7 S6 O' P      }% \( T  U, s. K' U& o0 |2 k
      pInvSort->MoveItem(i,nDestPos);6 L; i' |% V: |! S) }
      g_DPlay.SendMoveItem(0,nSrc,nDestPos);% |  e  y$ B  n" F4 ?
      Sleep(5);
/ ]; w/ s- t9 ]6 D0 x/ |/ ]: E      //Error("移动 - %d->%d",nSrc,nDestPos);" J5 ?$ B: Y2 S$ G
      nDestPos++;0 ^; V' v1 C- x1 B
     }: C4 u! i- P$ z* |2 f& P
     //取第一个元素的信息
+ A% S3 R+ d1 o3 x     /*# x7 W' s! A: A+ Q- Y" _
     if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)8 \6 f3 V3 a; r# R( S
     {
# w; h0 G7 _3 n* r' X$ D      Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
. A1 b: v) V2 k) a( h8 V5 m      g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);5 d  A/ i9 o$ \2 }  l. X
     }
! o3 v/ G4 O3 ~& H+ h     */+ R& f* H) {+ i0 D( S7 l
    //////////////////////////////////////////////////////////////////////////
# p* d. u. M, P7 ~1 A    break;
, [& O* S) y) U. ~8 P   }  Y& y  X' A' |! j, Y/ t6 O4 {
  } ( N- j. f5 p1 n0 Z. H: A! ~
}
& q# u2 |% v. ^m_wndMenu.SetVisible(FALSE);6 D# z6 j9 D7 W9 H
  v) t* \- c1 b/ F
--------------------------------------------------------------------------------------------------------
4 S$ u8 C! U, X5 Q% K% c搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point), O4 Y* l8 ?0 Q2 k0 Y: k
{
3 F% Z; J6 c4 ], YBaseMouseCursor();
% M; b" I! ?# B0 n2 B  \}& L$ h7 P$ }( A* C7 C
在其下添加:
4 D; ?) y  z1 p# k# y, xvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)" L+ F$ n- Q5 ~
{
3 }2 _" z; G+ i5 q( d6 qm_wndMenu.DeleteAllMenu();! j+ q& q" Q, U. _! }3 _7 z4 B. E
m_wndMenu.CreateMenu(this);/ X% i+ P( r8 h
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");5 I; s4 c: H/ g4 i

0 `, r/ z; s8 Z' `if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))4 _2 a: a! h4 y( [  }( ^
{$ K7 ?- g- G, j4 S0 ^8 [
  //P以上级别才可以删除所有道具
4 r4 t# s; _5 k; g, D  c6 L  m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
: |) u6 v8 P3 E6 n0 n}/ \6 S8 U: ~5 k8 y
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
2 a, Y  A$ p7 e9 H# R. Um_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );1 [5 d2 g& j: m8 O/ C- K
m_wndMenu.SetFocus();
5 w: N; b2 H2 ]3 V  ?* Y) ^/ h}
6 @& j0 _, _  c' d# L" v------------------------------------------------------------------------------------------------------------
! K7 t3 C: n7 v7 c" N3 T*************************: v3 I, W+ G4 ?
WndField.h文件
1 M8 d+ C! F$ S*************************! R0 T! s- _2 l% `1 |
搜索:BOOL m_bReport;6 O% F$ }" h3 L  J( k
其后添加:
6 C, b/ R! s0 w6 ICWndMenu m_wndMenu;
2 O2 l; v* M! v7 [* g搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);  Z. R$ I4 v6 _. u
其后添加:
% b4 z9 {, d7 W, q8 Wvirtual void OnRButtonUp(UINT nFlags, CPoint point);. x3 k9 p' J$ l  T6 ?& G

' `) }8 \/ ?* j
6 E! u; C! A6 P/ f) z7 p" q5 s( P) m

相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-22 14:44 , Processed in 0.073574 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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