|
|
源文件中_Interface文件夹下WndField.cpp文件: `# b- W7 `: B6 b; q7 {" T
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
) k a8 }5 O. x# G$ Y8 ]2 J" [9 n4 v+ [1 v. @8 u# j
struct sItem) {' n5 ~9 U f5 {* e6 t
{
$ V+ I- d8 y% D9 I3 p! bDWORD dwId;
( P) z1 e1 U9 Q6 G$ _( D) y/ g& HDWORD dwKind2;
+ u0 x6 N0 d9 s8 \' a% l3 M# kDWORD dwItemId;6 ~5 G7 E& P* y* x* D* ]# h
BYTE nIndex;$ H3 j# E/ ~+ T* B
sItem(){
: E$ `4 D: a9 ]( ?& T/ W dwId = dwKind2 = dwItemId = nIndex = 0;+ N- R. f/ o q9 a! I! y* J6 W
}
5 S/ l7 r+ f0 V/ G' C+ Kbool operator < (const sItem p2)0 H& X! r) A0 |' s/ R) {: R
{' \3 f/ u, s: w+ k0 l
if (dwKind2 == p2.dwKind2)
* M) p) C1 U4 f7 d {* J& _) t. B* @) `" C/ |7 m, P
return dwItemId < p2.dwItemId;1 I+ l7 \0 J/ j" W U
}else{
5 {0 q7 ~( ]( X* [2 C+ O return dwKind2 < p2.dwKind2;
! b G) I; A) b' C7 w }
+ K/ u% A3 D3 b1 V}
( R& S# V: z0 i+ j/ m1 o5 ^/ g};7 a$ |8 w. Z0 F% Y! j. X
class CInventorySort
# l8 Y# \# T5 x: Y) W8 k/ X{/ n) k: r' T. C9 i' |% q
public:9 L" _$ W) U! ^, J- l
CInventorySort(), g; U2 o+ [: P4 ~7 _
{
" ?0 B: b; u5 G" d3 j8 @% ] m_dwPos = 0;4 g d* I3 b7 L( Z6 D6 b0 {
}2 x9 _& e$ V, s) v+ G
~CInventorySort(){}+ T$ H6 b$ i3 Y2 D2 s! ]) g
private:) h; U1 R% Q' B/ r2 x* D
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
+ D7 V" x# H* ?5 F6 ~6 Y) _8 uDWORD m_dwPos;9 Y9 y$ v2 G1 @5 }) ?
public:
8 @/ e) }" Q9 d) D, E% p% wvoid Add(BYTE nIndex)
4 k# p3 m$ c7 U* Z9 u9 j* w- j{) V s& \& L: x0 J! r5 O
if (m_dwPos >= MAX_INVENTORY)4 b5 U" h9 k+ {
{4 q( M( p. m& x& B) q
return;+ }8 W. b+ i6 e& ^0 I: q) ?. `
}
0 J$ N# {2 X3 @3 h m_Item[m_dwPos].nIndex = nIndex;
% u* m* o1 ~. D) I$ t. t: V& t m_Item[m_dwPos].dwId = m_dwPos;
2 L2 d0 _1 ^' M+ Y, { m_dwPos++;; e: j! u. ?# d) O: I1 J. g
}8 v$ ?) ~4 J# l% e
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列# d" K2 @. e+ M. d. C
{
) c9 ]5 Y+ _ j# F for (int i=0;i<MAX_INVENTORY;i++)9 m/ h! i! ]* S2 A. c
{/ @ {+ s) q: c; B9 @3 F
if (m_Item.dwId == dwId)) v e5 k0 Q( Y0 T( f" W- ]
{- q- A2 ?7 \ J) i! `8 n
return m_Item.nIndex;
: d2 m' k3 I( l8 b# f7 I }
" _" b# j3 ?7 z( n! |. _! F }& C& `& h8 A& ~+ `5 }
return 255;
o1 Y( H& ` Q1 i3 \}% J% |9 ], L# a7 \2 P& R
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
8 Y5 p2 a( `' K( w) ~ N{
8 z8 r, O; i9 P+ g6 T% K BYTE nTmp = 0;# S$ y, B1 E) i- m2 c
bool bDest = false,bSrc = false;+ i- ?+ k5 K; @6 H
for (int i=0;i<MAX_INVENTORY;i++)2 m$ [# V; @' d
{1 L, n4 ~3 Y0 S2 r, G* Z
if (dwSrcId == m_Item.dwId)
9 O+ M. g& f3 s4 x {
- v4 l1 k- h- y* ^8 f1 t6 j$ S //id相等 则 改变对应的dest和src
/ u% K# K% j8 g' y nTmp = m_Item.nIndex;7 e) T2 k7 z* X. W2 |; [) B1 a5 p
m_Item.nIndex = dest;
2 B2 ?5 N- |, b4 P: V. x }( ]; W1 u6 n! ~" I" j
}
* n3 y% J. K& T' S //临时数据保存完毕,交换开始$ h. Z+ F. o/ A0 |! d% V4 l
for (int i=0;i<MAX_INVENTORY;i++)
0 z1 ]# y; G8 | {- P+ `7 G4 g8 ?) ]6 y
if (dest == m_Item.nIndex)
. p" b3 u/ `, Q* s3 K {
/ V* N* q4 o$ a //id相等 则 改变对应的dest和src2 [, U3 _1 Q' |& U) d8 B
m_Item.nIndex = nTmp;, x6 t) A# x1 e8 l
}+ w9 H4 ]* s, [0 V' O
}
% n; `& y0 ?$ x}
[8 V$ a% k- Q& H' x7 P, |8 ~3 E};
! r! n# p/ I A+ Y8 d-------------------------------------------------------------------------/ {1 t* D3 O H3 u. k- c Q, T
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )4 @! P; j: p# J+ ~+ ~ O
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
4 z! Z+ G7 a* g' g- }紧靠其上添加:
, K9 P. i' g: A$ {7 eif( pWndBase == &m_wndMenu )
0 X' J3 u L4 s: m{ \9 D1 j. n3 H9 S( N6 a/ o5 g
switch( nID )
3 A- v: c, f9 ?' G& I; |0 T {% \: x* _0 [' `* N2 A) f4 p8 _
case 2:2 E' h2 g) i) t* `
{
$ I8 N( Q, `) x0 D/ t9 D5 A$ m //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);% O* a6 E9 R3 `" s; P) Q9 |, i
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))/ T8 d7 ~# ?/ F9 Q% f5 |' U
{
: ^! Y' N2 O: X4 z( E X Z break;* l1 @: P4 e2 c2 H! t! r( Z
}
7 |' W. {- d# ^% K! ] for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
* A Q. Y3 z, m; a {
6 d8 K4 g9 k0 r: _& f! Y. f2 W1 ` CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);1 T( C2 E/ x/ x
if( !pItemElem )+ ?7 L g5 W, `' z% Y
continue;
8 {+ D# h" S; x F, k if(pItemElem->GetExtra() > 0)
( |! _( ?! ~! o( t0 x continue;& A V9 H2 v7 j7 s# x
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) ' }/ c8 [# x8 l- `9 Y8 _: N* M X$ k
continue;
% }6 k- I; [6 Y. F if( g_pPlayer->IsUsing( pItemElem ) )
* z5 p. d; t4 z7 N$ H7 I1 S continue;2 J! X8 \8 Q# z( a8 E# B
if( pItemElem->IsUndestructable() == TRUE )
; u& G6 W0 g7 r ~& N, X! [/ d {
5 s$ A5 D8 A# |; U- n: }7 w/ M) ] g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );3 ]$ E! ]' P$ |8 J z& J, K/ i
continue;" L' b* b6 r2 X% w0 |
}
/ w+ J+ o% T6 I+ Q6 M, S) ] g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);( H3 H3 \2 s6 g
}
. M" o" T2 c5 A# ? s4 n break;
5 m( q' j- W; s3 q0 b" O. ? }
& ]# j# C0 h" U0 Z( w: w/ W case 1:" ~2 u6 a& D4 c2 f9 T
{
. {+ L& f9 r v; u0 G5 i+ Q* Z //整理背包
/ f( H# q/ ^) k) D2 a6 W //////////////////////////////////////////////////////////////////////////
7 a. O$ \ c. g5 b. G' u //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );" n9 p( z: e- O8 U3 p
//////////////////////////////////////////////////////////////////////////
& N1 f( U' G# ?) a2 v# D- w //////////////////////////////////////////////////////////////////////////
. Q1 s& Z: k0 V$ ~% o/ |" B) } CInventorySort* pInvSort = new CInventorySort;
- P) T9 b9 P/ N' |9 a vector <sItem> vItem;4 o2 Y2 o2 s+ l; @" W6 A; w8 T* }
vItem.resize(MAX_INVENTORY);//初始化大小
) Q, ~+ E! l! B& }. ? //////////////////////////////////////////////////////////////////////////5 ^ K2 P, f- c+ r4 [9 X% d6 Z# J
//填充数据
/ A9 \* N/ `% g1 W% p for (int i=0;i<MAX_INVENTORY;i++)
/ ]3 [! Y( n' i" C: F% p$ ^ Z {
% [6 s/ x# w& F2 C CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
8 q0 p. d( N# t. M& [( K if (!pItemElem)
* j. m5 w4 O8 K& G {
: f1 H4 l5 \" t7 h6 W/ Q vItem.dwKind2 = 0xffffffff;7 e5 ~' L, @% d s
vItem.dwItemId = 0xffffffff;
9 ?1 O( {, D4 ~" h$ w c: g& b vItem.nIndex = i;1 A, K/ L3 @, G R- S
}else {
. W R) i+ x* j! m4 K ItemProp* pProp = pItemElem->GetProp();
+ b4 P5 O( M. {- i vItem.dwKind2 = pProp->dwItemKind2;
1 h7 U- G$ K3 C& { vItem.dwItemId = pItemElem->m_dwItemId;
6 L3 w6 @* b8 \& A" n1 b/ L vItem.nIndex = i;
! b* P1 u; k3 O$ N4 i! L! B }
7 l, y, Y& {9 y, j //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
7 K, y o/ N7 L0 J# r }2 n& L. n0 A" \' `$ h/ R' Z# L+ b
//////////////////////////////////////////////////////////////////////////
2 o) o9 I' {; m$ ] sort(vItem.begin(),vItem.end());//排序1 Q) V0 H: [% |. _! k4 a
/////////////////////////////////////////////////////////////////////////// ?! I8 q8 P' s- d, e4 D
//交换' u4 ?) s, b$ W3 f2 {% z
for (size_t i=0;i<vItem.size();i++)4 r* c. h5 q& M# g3 r
{- {) q* x* U" k0 Z
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
9 V& m$ m; ? ?* C; ` pInvSort->Add(vItem.nIndex);
9 \, C5 M# ]/ @/ w9 h }
* Q0 q5 P& Q# g. h BYTE nDestPos = 0;% i$ N' G% s0 S9 b0 c
for (int i=0;i<MAX_INVENTORY;i++)6 u; x8 J; @! H1 H
{' O9 s: j/ j s, S+ p
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);8 j( Z. Y5 P5 M
if (pItemElem)! G: _& ~4 d# B+ r5 g
{: z! p( ~; c U, h1 n6 M
if (IsUsingItem(pItemElem))
8 ^, q s6 | X {: ]* _, q, \6 C- A1 _
//这个位置无法放2 C, L% T. b8 @) |# m# A8 e
nDestPos++;: _# n" I* Y) e$ [) A
}
9 n( w9 C7 ^! K. C k) \4 ^ }
+ \' M5 C( v. }4 D; o BYTE nSrc = pInvSort->GetItemSrc(i);* O* @% G& v$ h+ ~0 [+ X
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
3 g5 E" o# [0 G8 f if (pItemElem)
% k4 n; O: }( ~/ J O- p: I& ~ {
4 ^- k2 U5 O+ Y. i/ @4 c4 A2 P1 ~+ ~ if (IsUsingItem(pItemElem))
: w* p y5 I' Q3 H {
3 a( C4 R! s6 F2 O) u: R //这个道具无法移动,跳过& M# _3 Z& ~% u- I$ ~$ N
continue;
9 E) |5 } m5 G* c! \4 r/ d/ K }
( N; {$ {8 Q/ z# K# H8 S( h }else{
9 ~( g3 o* ?( J //空位置 不用动
/ B& z+ a! A" x) K: q( h. l continue;
% }# q. F: V' ?. Y6 G4 Y/ V A# I; u }
1 ]; f, r6 _% y! M% y. b9 m2 h6 O% F0 C //////////////////////////////////////////////////////////////////////////
# _. k3 i% D! u: B8 L/ m& t/ o) W //开始移动8 R- \, {9 k g
if (nSrc == nDestPos)
2 C2 ?) O: [' t9 b/ ~5 m {
9 f, s) J$ d/ E' j) d //原地不动
, _- `, M- d0 |% m nDestPos++;
, K1 _" x* b( n( q x+ T+ u continue;0 x2 n) r! T# i/ i& y. `% a) ]
}# Q; l+ `0 G6 @. p
pInvSort->MoveItem(i,nDestPos);* e: b$ B* t$ O; _; q M
g_DPlay.SendMoveItem(0,nSrc,nDestPos);) j; d; d! f1 }- Z0 l
Sleep(5);/ z3 M1 y$ P; H) Q. @# R
//Error("移动 - %d->%d",nSrc,nDestPos);
. n7 p! }& Y! C' b" D nDestPos++;
f2 o% c6 x3 U }
$ I' S+ f' ]; r+ f! F //取第一个元素的信息
, C# C O4 b6 p- r8 l3 |) | /*
: v7 ?5 B/ k2 S8 t2 @" |% o if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)/ {5 H0 E& p# t- u. D% Q6 F
{1 x( ]0 }0 y2 C7 @* f8 R5 O! M
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);3 I' f0 C) ^4 R- [& ]
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);! d9 j; ~% ]7 T' n: I
}$ A# @ p" Q" q2 j. \4 r0 d; L8 N
*/
- s. x5 K" F* r. }! C v. g //////////////////////////////////////////////////////////////////////////# } Q3 s6 e" H/ s% c# u: X# C
break;+ O7 Y7 H+ u2 B) j% {9 X1 i4 S
}
& _6 A; M2 K# T9 L, b } % B0 f5 O6 o" r3 O& t
}9 e* n' u; _! H. F8 }/ j+ }
m_wndMenu.SetVisible(FALSE);
$ d5 A, k) ?3 j6 t: P" ?. d- @1 O: K% B. Y- S9 I
--------------------------------------------------------------------------------------------------------
6 _$ n, l; t1 t3 U) h8 u2 C搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
& Z. |4 N# q6 h1 f% ?' g1 n3 y- B{3 P; p% W( K8 }' I
BaseMouseCursor();
9 Z; J4 \6 J7 o}( Y/ ^& O& ]* E+ t+ p' e. N( o' q
在其下添加:
- u2 y- E2 J8 a( {% V- D7 u0 Rvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
5 M- q( x6 }1 z{+ `7 G- }( w$ c, v) G5 `+ F+ f
m_wndMenu.DeleteAllMenu();7 v: D/ s* T; e9 {$ m
m_wndMenu.CreateMenu(this);! K, o. d4 I ?; L8 Q8 \/ E
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
4 R. s& ~) u8 C. t
5 m; V. a, I. ` C% pif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
, _' h u( q P0 }{
( V( l" S5 P& b* c. @- ]* E //P以上级别才可以删除所有道具( ?; J& \. G# {- X
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");; w+ B( ~, x3 ^+ N$ w$ H
}
$ b! ]% F0 e" d2 U& Om_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );& g" R. y8 I4 m0 h o
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
8 i% u4 l% n8 r+ b6 lm_wndMenu.SetFocus();
% |% ]7 Y2 f3 G) f) S3 _}
. g' f/ o2 X5 ? f. B8 N------------------------------------------------------------------------------------------------------------
; K* F8 B; a& g' \2 s0 }; z*************************! v4 A1 y8 G, W1 I; ~& P% W4 T" D
WndField.h文件# s+ \/ S; o) ?
*************************
5 T$ h% p7 Y/ i2 Z& D, v( V搜索:BOOL m_bReport;5 ~9 c& D& P* y- V5 k2 v. M: e) ]
其后添加:& o; M5 B0 P7 h: a& }
CWndMenu m_wndMenu;
% g! D3 A1 h# k# I' t2 Q% [搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
0 U, a( p$ b/ j其后添加:$ F3 S y/ a0 Z& _4 d4 d
virtual void OnRButtonUp(UINT nFlags, CPoint point);
; D7 z! `: {$ r/ s$ {" U
# c; S; j8 O: }: i+ b R8 G
# _ ~8 g3 T: g/ ~0 | |
|