|
|
源文件中_Interface文件夹下WndField.cpp文件4 s7 o7 n8 E4 F
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
/ ?, B. l! Y) r3 }# q
# p& U- n2 f$ |9 C/ s% e5 Ustruct sItem
) J7 @' A8 Z- J- R& X2 d& S{
+ C8 A3 W5 A. u: U6 Z8 I1 fDWORD dwId;& v6 F4 t1 X2 f9 ?/ [8 Y
DWORD dwKind2;
8 L$ q% K& x8 f9 |# B* CDWORD dwItemId;
9 C4 U( z$ q4 s! Y- `9 JBYTE nIndex;% b! n: E+ ~- R: l" B( f& \
sItem(){* ] [* A0 R$ A. ]' R/ b$ F
dwId = dwKind2 = dwItemId = nIndex = 0;
9 }: V% \4 h6 O, j) K; Q0 T}
( E, K; i5 _( Cbool operator < (const sItem p2)
+ c% P6 a; z% C2 K' F{
; L/ H) R0 `) }- `8 V if (dwKind2 == p2.dwKind2)' \) R7 _* `* l, s
{6 ]3 N+ s( E9 O% t8 x6 c
return dwItemId < p2.dwItemId;
( e' [3 X, Y( z, s }else{
5 k' d# e' f# k- R return dwKind2 < p2.dwKind2;3 T" e6 |3 x1 s; ?8 Y
}5 {5 `2 B' M* Z' J
}) D, M( p# U' B( i
};
0 E, h1 J( m% s' ]/ [8 X. x' Fclass CInventorySort
+ a# `: ~3 }' ?" A, L1 r3 A& I, [{3 v" W* D3 @& d7 |
public:
6 ~0 n4 I3 P; k/ eCInventorySort()
, s, e7 a6 `2 C- `7 X2 A3 X{0 M& n. a l1 s4 S$ i: f
m_dwPos = 0;
( A3 \/ h! y* J, e. h7 |) ?% e" E}
1 O3 A: R( G l- Q~CInventorySort(){}
; A, X! S( O/ K8 f) eprivate:
6 N' F( U- E, n6 F/ ~sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
, a @/ W2 L7 R% f& v# s7 Z# [2 GDWORD m_dwPos;8 {6 Y6 y0 h: S$ J3 U
public:$ H5 b+ l' b4 M6 T1 ]' l* u
void Add(BYTE nIndex)% h' N/ \, s/ \ G
{
' |7 |3 f3 S/ x" @1 S' \% ^1 K$ n if (m_dwPos >= MAX_INVENTORY)# X9 B% ~4 k1 n w, p/ J
{' c8 z2 ^+ _9 p2 j) B! O
return;6 T$ K& p) p) @' i
}
9 K0 P" n3 k/ i* M# W m_Item[m_dwPos].nIndex = nIndex;
4 ` \9 d) R+ [2 o7 Y! C m_Item[m_dwPos].dwId = m_dwPos;. k: g7 [! _- ?3 o0 D
m_dwPos++;4 l- m! b! W) \$ R
}1 v. [7 H }( ^
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列 x+ ?$ p# Y* e2 K
{' l- ~; i, a/ i' a$ W7 ~
for (int i=0;i<MAX_INVENTORY;i++)
7 ?' @# Z. I/ `% q# U) J {" s0 Z+ V+ ?, H, c* M! B9 I5 b* Q
if (m_Item.dwId == dwId)
' r: `! f1 I3 W$ l& W+ j {
% ]6 s6 S- N" Q return m_Item.nIndex;
4 e3 C- k- }1 y }
. P3 |0 B8 ^# M! y# k7 }2 _% N& X }
6 n( S. v3 x6 {! F- G& v return 255;" [* R+ J# X2 s- n ^
}4 M: C# J: w, c! y; z$ V
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置; [. ~/ F+ V3 l& R
{
: L) F; I9 {# O6 d BYTE nTmp = 0;& p4 j% I% a: v/ F
bool bDest = false,bSrc = false;( j ^0 _5 n0 ^, D- q
for (int i=0;i<MAX_INVENTORY;i++)
3 {. Y4 y2 v. D3 W. z7 N {. A# m/ r* B4 a) c: F5 ?
if (dwSrcId == m_Item.dwId)
0 [3 u. z% Y+ \- O! B {
8 r& i! I0 a( q+ J9 { //id相等 则 改变对应的dest和src- e/ n; N3 [' l% ?' k% s/ Q
nTmp = m_Item.nIndex;0 d- E% h" H1 S7 B; U5 D
m_Item.nIndex = dest;
* d& E# f8 U, Z+ \3 R }
! ?8 a( c0 y) L, X& F8 ~ }. N4 a9 l$ c% S
//临时数据保存完毕,交换开始
" N5 n) x; r3 Q9 _ for (int i=0;i<MAX_INVENTORY;i++)" _( i& S A, x" O& r) [ O
{# j& ^+ K- ?% U! h# c- i
if (dest == m_Item.nIndex)
9 F, O( U3 `0 d. t* [. d- X {
* T9 ]5 q. k u //id相等 则 改变对应的dest和src+ u# ?8 `2 s S4 Q" @! b& \
m_Item.nIndex = nTmp;
2 u$ g6 M- \4 t* G0 e0 W }
c" D; D5 G1 h { }
9 D% B( H. [: H2 c9 a u ~} S" ~" ]% V( G T
};
# j3 ?# ?$ [! S* `/ F-------------------------------------------------------------------------
1 k/ B& z$ ~3 S1 |# C! E& z依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
i1 _' N) ?8 ]4 G9 A搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
% |* O( Q2 t9 f8 Z& W4 d% |8 J6 N紧靠其上添加:
" G& w& i. v2 p+ m5 mif( pWndBase == &m_wndMenu )
" M% x9 K; @, @2 h4 E- x$ m{
6 q! i/ U7 G# J/ d. `1 q" n0 T+ ? switch( nID )
7 c. z$ s$ K: \ {
# D- G' _6 g- j y case 2:3 m# F- P/ r$ Z5 J4 M
{) j; E. } j7 H ]2 h/ d
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);+ y* U$ I* o# j
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))9 O- o$ M$ c, h7 A& @
{
: I8 S5 @# a6 C! j% t# H6 @ break;
6 k G& O* {" B4 w3 C }
! b$ k; F& Z3 e+ r for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
$ T% A. Z6 I# q1 E3 B! g1 e0 s {7 K$ |6 d* G+ j$ z6 t
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
. ?9 G! `- M" W/ A% f+ @- A if( !pItemElem )
! E4 o. ]" K n/ X. b continue;
& e, M: R- K0 V9 M if(pItemElem->GetExtra() > 0)
) H/ I s9 g j' n3 v9 | continue;
$ A6 f1 \) [3 a3 V4 s/ A9 @ if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
* M" \6 V1 S. {9 u continue;" s, e3 s6 t) Y! }2 i( n& L
if( g_pPlayer->IsUsing( pItemElem ) )
; m h9 E$ @' J continue;
8 O( F( O+ R1 E5 d if( pItemElem->IsUndestructable() == TRUE )
- ~7 d q, W7 Z- C, ^7 v, w: l% s6 O {
- ]5 X# f& M o g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
; q/ g$ N/ A- V* J3 z! K4 O continue;
" E3 N0 Y6 Q4 q. G1 h3 k }+ s6 e& }6 Q: F6 ]% v
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
+ f( z0 H5 y5 M8 i$ p6 J$ y: z+ S }* a. l! u2 I$ ^
break;) [8 Z0 F2 }8 \2 j; ^8 v5 K
}" p0 |2 W0 R$ u; w" D
case 1:0 ^6 D; u* b4 ~( y7 P
{4 ^3 ]. D% G( s( u
//整理背包. x5 b4 a, a: S0 b5 I& r
//////////////////////////////////////////////////////////////////////////
, {! S5 t% o( B, g //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );$ q. p6 L! X/ i" x) Z
//////////////////////////////////////////////////////////////////////////! Y( N4 y* \/ Y" \' Q
//////////////////////////////////////////////////////////////////////////. ]6 W0 B, q5 ?& Q, U
CInventorySort* pInvSort = new CInventorySort;& g& o s& [3 |* g7 W* o
vector <sItem> vItem;8 V7 X3 |4 I, I: O
vItem.resize(MAX_INVENTORY);//初始化大小& n% |& p. D+ S# D
//////////////////////////////////////////////////////////////////////////
( ^. U& L/ M2 I% F. | //填充数据
5 |' w6 m( W5 b; e for (int i=0;i<MAX_INVENTORY;i++)1 v w- o1 N. V8 l! W
{# G. S* x- f7 x8 D, [' G
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);+ m2 t9 j# c& `1 a; f! W
if (!pItemElem)0 J- V3 G5 B, G: i
{8 g5 Z; o+ b$ m9 |1 ?7 `. Y
vItem.dwKind2 = 0xffffffff;
: E* ^% \8 p0 \8 @( J& ^ vItem.dwItemId = 0xffffffff;
; l! }- y/ p9 w9 q vItem.nIndex = i;* ?9 u5 B9 {' Y/ q, s0 ~
}else {+ \* T6 z) n4 B3 ?9 K! `
ItemProp* pProp = pItemElem->GetProp();- o/ Q: z/ ?* t
vItem.dwKind2 = pProp->dwItemKind2;/ o: f3 n8 `# l7 I9 `
vItem.dwItemId = pItemElem->m_dwItemId;8 E: ~8 E3 Z' y3 i, g% O
vItem.nIndex = i;
4 n& \" P5 f& x( Y" Q6 N }
( u& W: j/ H3 W3 I; o- `2 ^ //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
8 o9 z# ~( }/ {% w8 W0 [ L }& p8 S ]! _5 n
/////////////////////////////////////////////////////////////////////////// j% x0 H& G" w3 b% O1 X, u
sort(vItem.begin(),vItem.end());//排序) g2 j" @+ H" F/ k; D! i) f" m
//////////////////////////////////////////////////////////////////////////9 u8 U" p) h! q7 c4 L8 m# p7 s
//交换
8 e& S, A: N& x for (size_t i=0;i<vItem.size();i++)' d0 U) j# r0 E- Q
{
" u* T0 X% A8 [! A4 ?3 K# l" r% T //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
2 Y; V v% ]) w7 X% w; B/ I! P: F pInvSort->Add(vItem.nIndex);" E+ i0 I0 z# o1 p% r4 A
}, K v' Q7 J+ l
BYTE nDestPos = 0;
+ U# h4 t' } @; F/ p" ^ for (int i=0;i<MAX_INVENTORY;i++)
' b8 t0 r+ }! h" \% W# V, T, q' d {
4 v0 D( v6 M( @/ C/ { CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);9 L( x2 ^: R2 @ t3 v4 @. p0 k' f
if (pItemElem), F- x/ z, f; X4 h. K" D
{
( @- s K! a$ V: u E- l if (IsUsingItem(pItemElem))& w. o5 s( v" m0 b4 g/ f
{
8 p( i* [+ j$ { //这个位置无法放
) e% w$ m3 P5 L! k, p! K nDestPos++;
! C0 i8 g" x K( ^: O1 Y4 s- j) S8 V% ~ }4 n6 y* T/ w9 a+ w8 U( ^
}3 i7 d8 i- D3 i& b0 s6 H c) P
BYTE nSrc = pInvSort->GetItemSrc(i);
! H2 J1 _# @/ O& p pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);# ^; Z3 {" t. |5 j; M
if (pItemElem)
4 g1 H8 u5 t% }4 X {1 o1 x( D: o4 s9 G9 V
if (IsUsingItem(pItemElem))$ T1 C, ?! N7 ^
{' l7 i, L+ K% B1 }
//这个道具无法移动,跳过1 N, [* P' `9 m8 h5 C6 V* m$ P
continue;, l! |! n7 x; t& r2 o4 ]
}" j8 e& ~; r+ i8 n Q% W5 [
}else{
+ B/ b0 b* o. ~0 o: C0 K1 L4 Y F //空位置 不用动
8 ^7 U# ~/ ]$ b1 v continue;6 S/ v% _3 Y. o4 B) F
}) `7 o& P5 R6 M8 `# m
//////////////////////////////////////////////////////////////////////////
- [+ z* q, ^# T( i- t6 n, V //开始移动
0 a: J0 @/ s- u8 A9 @0 @3 r if (nSrc == nDestPos), h$ j/ M1 m) z% f
{
8 Y6 I, C8 J: d G% D- k //原地不动6 y, G0 W( O' n
nDestPos++;0 | j4 `# k0 l/ g- ^$ C
continue;/ G9 e' c- Z" N5 I9 d- M) _
}( F& q! X: W5 H
pInvSort->MoveItem(i,nDestPos); W& F/ ?* v* W5 z+ @, O
g_DPlay.SendMoveItem(0,nSrc,nDestPos);; I( d- c, {8 [0 _8 N# l1 M/ V. m
Sleep(5);& L7 H$ E" K7 e- E3 j
//Error("移动 - %d->%d",nSrc,nDestPos);7 o$ Y- k R5 V. W% U( a% c, L
nDestPos++;$ A8 g: [, y/ P8 {6 m4 U$ u: {) S
}% o9 d! `* G! K& m
//取第一个元素的信息
, |( u, c" j. F; K /*
: g' ?* \1 @3 ^ q! d if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
" b3 n& ?1 |. `# l# Z& S {! X; L, o# G# \9 }3 P' K
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);6 A" E( w/ A9 B: c
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
# H/ f9 X& |8 V0 }& M* q6 J1 q }0 _3 g) ?. `0 u. @7 K
*/
; ?# ], g$ Z/ k //////////////////////////////////////////////////////////////////////////& ?+ N4 s8 i8 Z0 E, k. |0 j$ w) i9 f
break;2 u( J0 y/ {; z6 R+ L0 G
}
% ^- S0 a. X$ s2 m2 s& ]/ f$ v; B' f }
6 [, v; [# E$ [" _4 s}
$ a- s1 {& \* N- q0 m5 X& k1 S' c5 Zm_wndMenu.SetVisible(FALSE);) h/ W) ^; n0 l3 s3 ]" R
5 K( o2 I& q- o) U--------------------------------------------------------------------------------------------------------
7 e+ \0 V( q6 v3 q搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
! z+ C; E8 K9 I0 w/ r8 j* `5 d2 t% s{
' a& Z/ z2 ^1 a( }/ F+ _0 mBaseMouseCursor();
- I* D; t0 H( `}
5 M/ u% o1 [% W* q0 }) m4 o5 C在其下添加:% o: V- }8 W# _7 {0 t! R! N
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
@7 K- F3 Z2 t- t{1 A. n; \- p+ z$ X) @$ L
m_wndMenu.DeleteAllMenu();
, n3 c, k' i) Wm_wndMenu.CreateMenu(this);7 G) b5 o; O& u0 e
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");( A6 h; W9 }) f3 y% x. x, R
6 M- f+ Y6 G- z f
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
7 B. R X- ~ k6 K3 S# J, y$ e, [{6 B- Z+ u9 }) p0 c2 y9 b
//P以上级别才可以删除所有道具* R$ G* J8 [) Q6 }% w2 A8 }7 f" I
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");3 `% N8 a0 q3 h6 F0 w" a7 h, U0 D
}
3 I$ K: R0 u8 o+ Y. Xm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );- y8 I* [* a' d5 q# w
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );) K# U2 h* t. n5 X5 a
m_wndMenu.SetFocus();/ O+ v4 C8 h4 L+ A1 [: D, U
}9 b. o, K L. \ i5 [: b
------------------------------------------------------------------------------------------------------------
0 t8 E, j" i0 m! B*************************
" X# B- X% c" F8 ~WndField.h文件" o" e. @9 I+ F1 d- |$ `: I
*************************
; @3 S# ]: O& a: C' [" V: p搜索:BOOL m_bReport; o' K3 e; R( g
其后添加:4 `# R. H" V$ O. j5 i5 i2 F5 m0 [, w0 |
CWndMenu m_wndMenu;* G3 r7 p" I1 Z" g' d# H0 I8 s
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
# p3 b: i% C' ^, e8 m6 p( C其后添加:
, [: t( K+ ]" q% _5 hvirtual void OnRButtonUp(UINT nFlags, CPoint point);
# _- N2 K) x" C; W4 v* q1 C/ x, R- e( [: a& n$ D& ?
! @( d0 N/ o* |8 o: b
|
|