|
|
源文件中_Interface文件夹下WndField.cpp文件& }2 Z" n6 @, {, Q: c% I4 l6 R+ Z2 ^
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )$ z: }# n# x/ l1 c$ W
- k% R. y L' x
struct sItem- P' I4 R# g! p
{
* M' F5 M7 @& l S8 r7 K8 h) g) ZDWORD dwId;# ^. m. `6 L# _
DWORD dwKind2;
K/ c6 A! a" N, r, ^8 x0 ~1 ZDWORD dwItemId;
1 G9 J1 s- R! {4 h5 b5 xBYTE nIndex;
9 _3 G' P1 E# C$ JsItem(){) K# ~) |" S- T8 _4 W1 B8 u) c
dwId = dwKind2 = dwItemId = nIndex = 0;
' l1 M6 N9 i( J}
6 {' l$ e) O% Xbool operator < (const sItem p2), @9 U1 Y7 k. D& `( U
{
; W& g0 ?6 C. K' p7 a/ ]$ e if (dwKind2 == p2.dwKind2)1 N7 G8 B" D" S4 _) h
{
8 F4 a: x" R, p. k, a& h1 S; }1 | return dwItemId < p2.dwItemId;! Q; ?6 N2 D8 L, m# b( {% Q
}else{
% X& s0 D6 a9 x0 M& A; x! R# p0 N' T9 E return dwKind2 < p2.dwKind2;
2 r; P$ Z5 F7 R4 m) F }
; V% U' n/ ?; @/ c}
8 O- m' f8 l M};) h F& G' Q/ h6 |4 x' B! Z
class CInventorySort! P- M- o9 d8 K9 ^9 j
{- L$ J( V( j, @& m% k2 |
public:
$ x* H; o# Y. V: hCInventorySort()
* k7 O8 E1 Z8 t3 [+ B{
7 C/ g/ D/ Q7 _8 R! K" n$ k* i0 C m_dwPos = 0;% n5 ?2 n4 g: L; Y# r# U
}; n' V3 n; H3 H4 Y; O8 w* B$ j* K9 N
~CInventorySort(){}
& U7 C, t9 j8 @0 R5 jprivate:# i8 {, N- ~$ K; e0 M3 [# u
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息; A) Q J; d3 }, }( E, I' Y, o
DWORD m_dwPos;
; ~# q/ p7 _- C% w* O8 {, X: D7 Qpublic:
: ]- U0 L- ~0 e3 Q/ { Ovoid Add(BYTE nIndex)& n) B" N+ o. m
{6 s; d! Y. ?' }/ N, R8 v& c9 f1 V- f6 }' {
if (m_dwPos >= MAX_INVENTORY)
# D8 {/ _& j( G0 S" ~( O8 {. } {$ x+ q; V/ G- j- A6 ?5 Z
return;/ M/ W( ]6 H- a A7 p
}
; J5 e2 z) k$ X3 `6 I m_Item[m_dwPos].nIndex = nIndex;
* Q6 a6 S& V6 T4 K1 k m_Item[m_dwPos].dwId = m_dwPos;
9 A2 t" K% o/ h& z( R' j6 F0 J m_dwPos++;
# W: T' V: ^" m5 s: Y}
" C) t$ U" ~; n3 ]3 L6 a" a& cBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
5 B6 I$ I7 y% o N7 _: ~; O{
! i" Y/ z7 f9 u5 j) ^ for (int i=0;i<MAX_INVENTORY;i++)
! E9 J, y* ?) X6 x8 B8 Z+ ^- \$ z {
/ H( i0 k" M4 L, U& \! [0 r if (m_Item.dwId == dwId)' u* j- F; C4 y3 v$ w- q/ q
{
3 T/ Y$ ]! R" `8 c7 L- M5 r# A" v return m_Item.nIndex;
& k+ X; H, u! R/ s }! p M! @' j: [5 l
}
& L, W7 |; c) y" n4 j* ] return 255;7 `4 Q6 K/ K: Z' [1 I+ Z
}5 a! d( r+ Y' h
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
; w8 Y* g0 P% a9 G5 y6 Q{ _+ h* O D- }3 R) [
BYTE nTmp = 0;. B' b/ k5 f) j* b+ v& y8 j
bool bDest = false,bSrc = false;% g5 L# N7 M0 p) z# f
for (int i=0;i<MAX_INVENTORY;i++)
" K- n& K& n# G5 p/ o! U! { D' b {" E4 s; a {4 I' R
if (dwSrcId == m_Item.dwId)
8 T* j4 {6 {5 V. v7 E. V: N+ M, d {
# D% |/ k3 ~. `( s0 X# ]- t7 c //id相等 则 改变对应的dest和src
8 M- ]/ u% v" d- i7 X2 C nTmp = m_Item.nIndex;
+ f; I8 N9 T5 l5 R0 t% C! `# v m_Item.nIndex = dest;
$ C0 R" g& H0 `/ M2 A }
" I# e+ X. M6 b, Q. p9 W6 p }# o) z* i& g# _& z
//临时数据保存完毕,交换开始
2 {$ S5 C, \# q4 X) ?/ |) o for (int i=0;i<MAX_INVENTORY;i++)* E9 D r) I8 q8 {
{
4 f9 g! G) t9 K# U/ R+ [ if (dest == m_Item.nIndex)# L, c3 `. \, i; M+ A ~
{
) N6 K" ^* h. R% ?- w //id相等 则 改变对应的dest和src
, s8 X, s. b- T- N6 M m_Item.nIndex = nTmp;
: k) @. S j2 X q m" z' \ }/ _: r! N3 K9 x# ^* G9 @) L
}7 h7 f1 I Z4 k$ p. R8 n
}
* k) w. p1 k: Z0 p1 i4 v};& ]2 R: h9 a* G! `
-------------------------------------------------------------------------
% l% F# u1 f" z6 u' h依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )& ~5 |7 R+ ~2 z1 `: S
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);. Y: C9 {3 ~6 O
紧靠其上添加:) {% h* b: b& F
if( pWndBase == &m_wndMenu )5 }% T! k8 V& t( V$ S
{
! y/ i3 T, \- r% M" H switch( nID )
v, k1 M) {0 U5 a {
; D( S: a" ]0 | case 2:
& F m+ [" L3 P! ]( I+ o {
0 W1 t8 s5 ?0 k$ m' g9 k3 Z //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);! {4 x; H6 s/ ^7 y; n
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
2 O- K& _8 O( Q$ L# @# ` {
/ m' ?; r$ X2 m } break;
9 y- d- M# ]' B1 K$ | }6 `) y$ b+ N2 D1 f1 v/ C* g% g8 P
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)$ R3 o+ |- B) V5 c
{; C, T8 z7 o* t- u! Q& Y. Q9 g5 ?. f: \
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);9 w' q, Q1 u- H
if( !pItemElem )
" D6 u/ Y* B) m& C& H! Z8 S continue;' i5 m; D; W. U0 Q: F
if(pItemElem->GetExtra() > 0)
7 [# q4 Z. C i! B/ w continue;# m M6 q6 n: P: l4 o' |' x, v
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
( r( G8 X; A; O1 Z. c continue;
7 ?" {" E6 W; ? if( g_pPlayer->IsUsing( pItemElem ) )
5 @8 i6 |& m' U continue;
5 f% [/ k2 X4 i: |& N if( pItemElem->IsUndestructable() == TRUE )2 ?, R, `& y7 a2 F& d# [- |: y) V
{
4 N6 A6 c- _9 M2 o8 E g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
; J# ]# f' ^1 z/ j" n continue;) e/ L, v2 ~# U
}
+ R1 E" {! O- d8 F j g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
. Z( J' ^, ]! f }
& E6 t3 R E/ V8 C: O3 n2 V break;: H, N6 {! T" Q
}* D3 {" Q+ Q1 S7 y% [# f( i
case 1:8 R/ N; e$ F9 l$ _2 m2 L- z/ s
{
( B2 ~/ Z7 x4 C% E2 k+ \$ I& g4 q //整理背包
8 `9 O% H" Y# N+ D //////////////////////////////////////////////////////////////////////////# b! _9 N$ W2 h+ Z9 t# g2 v6 ^
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
8 [6 E( z* t; i9 Z; }8 R //////////////////////////////////////////////////////////////////////////- _8 D# {; l+ H" i
//////////////////////////////////////////////////////////////////////////) G/ D0 j% x. E5 t0 Q
CInventorySort* pInvSort = new CInventorySort;2 ]5 b* t, @' ^4 `0 U
vector <sItem> vItem;
! `5 d* ]: g, z+ d* I vItem.resize(MAX_INVENTORY);//初始化大小
: K2 Y/ C5 e( O! }8 p7 k ////////////////////////////////////////////////////////////////////////// o9 ^* c$ [+ W8 A! e" E
//填充数据
# V# ~% K# ]" t+ D. }& J3 f& g& u for (int i=0;i<MAX_INVENTORY;i++)4 j9 y! N8 g. K% O, |9 e, x
{
. n8 S0 n' f, k4 I& d/ F1 @# E CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);% M$ ?$ T% U o! X
if (!pItemElem)2 m c! e& P% j3 b! Y2 j
{
" E2 W* M! o5 h' A vItem.dwKind2 = 0xffffffff;9 R2 h; G- J; }/ s" \4 q
vItem.dwItemId = 0xffffffff;
% J3 I, ?3 [ l# O vItem.nIndex = i;: D! w7 W7 j! j
}else {
% {1 f3 f) X% i ItemProp* pProp = pItemElem->GetProp();
2 Q- G% ~! X$ w vItem.dwKind2 = pProp->dwItemKind2;
8 Q# `- j9 T' O- y/ M3 H( I vItem.dwItemId = pItemElem->m_dwItemId;- G3 O" L, d6 r/ F
vItem.nIndex = i;5 B- g& V8 ?$ g( U6 `) v
}
0 d0 w f" l( E) V: j //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);) `. s; F- i) ?2 C# F( _1 m2 K; D
}
( e" w! g; f2 R7 e+ { H+ u //////////////////////////////////////////////////////////////////////////
0 H) h# b' Q0 L+ Z* s+ r6 ^ sort(vItem.begin(),vItem.end());//排序
) R; m6 A& C* z0 \9 ]% R% x s3 D //////////////////////////////////////////////////////////////////////////' S8 a8 G8 y; p+ I4 j
//交换) U8 W4 _! e, f/ e, W; s
for (size_t i=0;i<vItem.size();i++)# p+ a) J4 n* o- K+ [
{
% W$ c/ A& \! {/ e' |1 D; q; _2 M* R //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
- ~3 j& n9 W" }9 A4 d% d5 t M pInvSort->Add(vItem.nIndex);% }9 k+ x3 ?1 Z- k s
}. t1 w# G8 \' V) W3 h2 z w! i& F
BYTE nDestPos = 0;+ L1 Z& v* v5 e7 A! X2 J7 ~1 M
for (int i=0;i<MAX_INVENTORY;i++)
+ W, {8 D1 G8 Y( z {
3 L' J- f& j1 l' r& x( S# } CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
! W3 |& D% n' `4 y0 v if (pItemElem)6 Q6 f4 Z% d9 p# B5 @
{1 G( }) I5 J9 Q6 L$ W2 q
if (IsUsingItem(pItemElem))
0 Z: O* n7 O$ G( N% Z {$ P5 o, U2 | O# k
//这个位置无法放* X- h( W, V8 f
nDestPos++;
' @ }' X% c8 b' z2 B" u1 Z- D }$ x6 r1 m# A( f* U# m
}
% n% C& b: `: Q8 { BYTE nSrc = pInvSort->GetItemSrc(i);
9 t4 _, x) C; ?2 u$ G7 s pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);1 y. C/ T- U$ h: _* S
if (pItemElem)0 P- _1 h6 B1 B" V1 X
{5 w$ n% f; d+ ?5 C+ K
if (IsUsingItem(pItemElem))
! H' p! o" R5 K1 _7 i/ f n2 E {0 X; u$ ?5 d* ]* t) @# B" O0 r( \
//这个道具无法移动,跳过
. O0 ~- ]- e7 D2 b5 |6 D* A: E* Y# R continue;4 h8 A: R3 B# k5 ]
}
' A m( k( M2 _; X4 e }else{- ?! X: c! u3 p) @% V1 G& E* l. a
//空位置 不用动
; n$ g5 O) X8 ~9 D6 R" Z continue;" J. ?1 T8 q# y- S" |) [5 ~
}
- X3 q% v8 T; R4 G- [& D d- X7 K6 y //////////////////////////////////////////////////////////////////////////
. i$ C: K) m6 M$ D5 ] //开始移动
9 T. e2 }' z8 I# J) A+ U9 v if (nSrc == nDestPos)7 P# e6 W+ w8 J( G) @; m
{
% S' z2 Z) ]; P5 a3 D% ~$ y //原地不动
9 s% {! J3 ?5 W% r# @ nDestPos++;1 e) M& h U9 c1 s, i3 b+ ?, K
continue;/ M! C, z7 c* C
}: y- s: v% U2 A( d( @% S z: }6 ?
pInvSort->MoveItem(i,nDestPos);0 n7 G, U; f; p, _3 A6 D- W# D
g_DPlay.SendMoveItem(0,nSrc,nDestPos);# ] p) `; g h* ~4 }1 f
Sleep(5);) s) p' N! X) j( \6 z- A" Z; C! U
//Error("移动 - %d->%d",nSrc,nDestPos);
4 z. q# Q- d: n; h5 S0 P3 t nDestPos++;# U4 k( O! v8 z: x( q; s
}
4 D8 h H2 Y) _! ^" T$ z //取第一个元素的信息/ m4 P4 G, s9 F+ ~
/*
+ `4 c# v( N! X4 a if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)! L5 a2 h2 }; P$ l, Q+ V
{
. z- v# R0 v" }0 [9 F Error("Move - From:%d,To:%d",vItem[0].nIndex,x);- O) ?6 i& X( S2 `# ^
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);2 R. c' ^; {" I7 T& C) x$ Q
}
7 j8 G* }& t) [6 Z8 g" ] */1 f9 o- s0 @9 n' B/ R
////////////////////////////////////////////////////////////////////////// s: b" Y, o6 a4 V K
break;4 c! [$ k. y+ u) i) K" }: K
}; m8 }/ S1 ~4 Q" a6 C( y* l
}
]- e: b/ T: X}
- w- ]1 E! o$ m5 a1 q: v. |+ sm_wndMenu.SetVisible(FALSE);/ e5 {% J# n) L' L/ c/ X
, J2 ]1 n- v* s. A0 p5 D7 {: M--------------------------------------------------------------------------------------------------------
' @" C. ~, U- s8 F8 u搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)& W. u8 T$ M+ B
{; E9 C) H' i7 b* j3 z
BaseMouseCursor();
/ U1 T2 A5 L& k$ v0 d# d}
: Q# A% M/ U& t7 c! D* |在其下添加:. h6 q3 b- y ~( N
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point) x3 `- o/ z( w, M
{
2 n0 @9 B) m. e. _8 cm_wndMenu.DeleteAllMenu();
. L9 D' o- \% b3 d& C& u7 um_wndMenu.CreateMenu(this);
4 Q" k% g+ k* I' i _: h1 p3 k( ~m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");5 [0 S% Y# f9 r! l* X8 |3 _
) w1 h- O- g0 l! J) z# P, c
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))- k6 Z( Y) h6 l+ q
{9 H3 C5 m `! }, O7 E) l
//P以上级别才可以删除所有道具
9 {" X9 X% x; C1 ~6 }; f) y, ~9 a4 ]4 H m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
1 F3 P2 G9 h" g# e" A}
6 j& {. E/ N. p( n' L) ym_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );; y! F9 r* x5 J7 x
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );$ G% V8 j4 B) H5 c
m_wndMenu.SetFocus();
+ P& b% N) A- h$ P}: ^/ J7 H9 c% a W# j% N; ~3 Z* R
------------------------------------------------------------------------------------------------------------
) z! y( h( C* m; T*************************- Q2 V& \; {. u0 }& R( o
WndField.h文件+ H5 t- ~! n7 p4 @3 V3 R1 h
*************************
9 A4 | [# e7 z- U. ]* \3 o* V. T搜索:BOOL m_bReport;4 u: S. I' U5 m. |3 n
其后添加:
# |+ s' Q% d) F! CCWndMenu m_wndMenu; n& f% J+ R8 C/ V* ^& z0 n
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
8 [6 D) ^, g$ F( \; b3 I其后添加:) D) k) g8 `7 ^2 q
virtual void OnRButtonUp(UINT nFlags, CPoint point);
& ^9 O/ d- U/ m n/ ?% j
6 a& q# S/ b4 q4 y; n
! ?, X- I: _ ^) @, X |
|