|
|
源文件中_Interface文件夹下WndField.cpp文件
( `- l) P# p" b) g搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
5 w2 y' T6 B2 V4 o
3 l9 N. m- @! D/ c9 Ostruct sItem
4 I2 a: i7 }& ?2 R# ?( s{6 \' k4 \% x( z
DWORD dwId;% ?- i0 M+ O/ D; y4 o+ i
DWORD dwKind2;
; `7 N, Y7 a' UDWORD dwItemId;
% s7 J. J7 R8 T% |BYTE nIndex;8 r. R: K* J$ x t0 \
sItem(){
' u: x8 G( C" k- @. g' V dwId = dwKind2 = dwItemId = nIndex = 0;
1 W6 c% G% t6 z: C}+ K1 B3 D/ k5 N& n6 h6 H4 I$ |
bool operator < (const sItem p2); @0 L% ^! L+ B# ^" C5 e
{$ a0 J: A5 g: k% y# A) J/ o" R3 u
if (dwKind2 == p2.dwKind2)3 a+ r9 @. b; a' Q
{
2 }( _- L5 J6 Y! e8 e) p4 N7 O return dwItemId < p2.dwItemId;
2 T7 D. D( o* B3 ]" ?% l3 e* z3 r }else{) J0 e' Y( i7 ^! \
return dwKind2 < p2.dwKind2;3 P0 I- W1 g5 j
}8 q, T. y+ N# T
}$ G# N2 S) }( R/ R9 ^. }' J
};! w3 ^9 h% J( m+ c6 W- j" ~% Z( @* U
class CInventorySort
4 D; _& C2 w+ A9 q{
1 A/ f' G2 G# ^+ z' `. Bpublic:: Y' m" p( ~& H& \6 h7 Q
CInventorySort()
) q4 `. n& v& s+ l{
' ~! s5 f+ H8 U m_dwPos = 0;
: }4 Z# l8 j* A K, X; T1 J* t}) \3 \- K$ A( T6 \3 ]& E+ F
~CInventorySort(){}
. A& |. m4 A* u4 j+ c$ _private:
* @" e: Q; w+ _9 \1 vsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息% {7 d9 w7 B. g
DWORD m_dwPos;
- A3 o2 f. X0 h$ m/ G* r( x# Hpublic:/ Q- d. S1 d6 \0 n
void Add(BYTE nIndex)
& l9 b# A' {! L) E{
9 _; j0 Z2 G+ v. u: _+ C if (m_dwPos >= MAX_INVENTORY)
7 N/ c; W8 B) Z& p! ^3 a/ R4 M9 S {
; y _+ \3 h5 L3 S( n# @4 r return;
2 O5 K4 T' m+ N D5 { }, y% C5 h O j; O; ^. |9 h
m_Item[m_dwPos].nIndex = nIndex;* U6 F$ {- F: o# t. _
m_Item[m_dwPos].dwId = m_dwPos;/ g I; o! M+ S& w. C
m_dwPos++;4 j% y* |" y, h% J* O1 i" @9 z1 v
}
# t- m& f; W5 g8 z! @BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
7 Z- y0 S. D5 }9 h D{
- ?, Q& F: a3 d/ t& o# b( T7 @ for (int i=0;i<MAX_INVENTORY;i++)
a# ^. `% q8 e I* H {
+ C# x/ p% W& l: |6 g" ? if (m_Item.dwId == dwId): d7 ~- D2 e' s6 u0 C
{
( [1 ?7 F Q8 z% n return m_Item.nIndex;
0 O) D( E3 D; g4 O% p4 A }
9 q4 M* j. o& W+ G5 R9 n3 T }& I9 G# p# ^3 { {' W# ~5 \
return 255;# Q- R( P1 i* T8 M/ H6 ]/ m
}
9 t* X0 R n* {# [# P% Kvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
# i* F" ]0 d. q/ D; l O{$ a0 k; I* N! E1 y
BYTE nTmp = 0;
0 {. h6 w+ |9 _: a$ w. q bool bDest = false,bSrc = false;. R' U" e! w1 M% y
for (int i=0;i<MAX_INVENTORY;i++)
9 i. v% A! ~& ~& W" P {
# _3 H! K5 f. B$ z% |$ v if (dwSrcId == m_Item.dwId)
) N8 d5 r5 `9 | {
& N8 |) @2 ]. R! V- z! |5 X3 ? //id相等 则 改变对应的dest和src
$ P# v: W/ ^0 @9 J& g1 n$ |9 j: E nTmp = m_Item.nIndex;
9 E) ^8 Q" L B: T& r m_Item.nIndex = dest;
! S \7 o3 ?( G! H, I; X a3 C }! S H+ p& |6 |" B _9 K+ g
}3 x6 I- p1 r" X* a! L' ~
//临时数据保存完毕,交换开始
`: y0 B% j5 s( O' l( E* }) _ for (int i=0;i<MAX_INVENTORY;i++)( m4 v" h/ D/ K# {: K0 f# _9 p
{
+ v, ~, J3 L3 M1 N if (dest == m_Item.nIndex); \) A; ^; [$ z" j+ D5 H
{7 y8 ^# T0 w l% F$ g
//id相等 则 改变对应的dest和src
5 M5 n, u+ u+ v4 `, @ m_Item.nIndex = nTmp;6 E, N d% u3 y1 @5 T
}
, P8 Q( W3 C, Z6 y2 g$ ~$ Q. H, l }0 z+ ]2 }; k" d0 d1 `* s
}0 A" q m3 g- s6 k: T P
};
9 q m. ? W8 Z$ K-------------------------------------------------------------------------
/ B% G) ?2 U1 i依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
# W( A; l, z% ]% B; b' f. u! r/ E搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
0 d' w' z4 t4 c1 D3 D% Y6 E4 B紧靠其上添加:+ l0 v7 f4 g. y- r0 h& B, m! v P
if( pWndBase == &m_wndMenu )* V( R( @% J9 S2 Y Q% \9 q
{- a2 B5 o, f8 Q+ o4 m. t! [2 r
switch( nID )
9 C$ y7 _ Y& C5 R) o0 U: F: f4 b {, |/ F. K0 K V- ]7 {# b
case 2:
& b1 D! C# D+ s1 l5 M" H2 ~ {7 g2 l/ B6 I2 ~
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);6 `0 b) V3 b2 Y4 O8 _
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))' M' P& d4 i B9 H! J
{$ I& m: z. k+ b( j. ?) f3 C
break;
: } A* w5 Y N, v' L, p }5 j! m) i( s# l) p% B& ~
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
% y7 Z3 t) [* x5 d- d {
# A3 i* ]. A7 L) _: s CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);. R# u' X% I: B8 o" g0 Y0 Q
if( !pItemElem )
2 Y2 A! L2 M" F5 G continue;7 d8 F& m$ L: O4 g
if(pItemElem->GetExtra() > 0)* w8 {. A! e9 _% b8 Y
continue;! J/ Z% v9 T& {; @
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) % {" E+ E. I2 H7 k- e" K# d
continue;
6 t( Q; l( P( M0 ^ u# { if( g_pPlayer->IsUsing( pItemElem ) ); @$ N/ ?# e% A" u5 a6 w5 b7 z- g
continue;5 O" }9 q* _& l. p' }& x. a
if( pItemElem->IsUndestructable() == TRUE ), W( U, X! \5 s5 ]) g: n0 ^4 O9 `0 J
{( F2 ^7 q' A% I+ n4 R1 z+ i8 n
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );/ Z! Q4 F& t R4 P
continue;
) X2 E# S: F' T' d) i }: v( U4 e; W6 v1 z
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);9 B: s( ^4 r7 r
}8 r. t, Q7 S$ h( S0 `
break;
+ `; w8 u( S2 u }
2 a1 Q5 v1 J; } case 1:% \2 u1 H3 ?; X
{
5 M4 t9 K1 B( g1 z0 } //整理背包
+ V5 T: P4 V0 p: a& {1 w //////////////////////////////////////////////////////////////////////////
' h& ]6 n1 M, d) b. j# |# X5 B //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
5 U& ] ^" O% R) O! [* S //////////////////////////////////////////////////////////////////////////& h! e" X% M4 w& Y. g
//////////////////////////////////////////////////////////////////////////
+ B* K+ K4 B( z& ~4 k; `* C; ~% ? CInventorySort* pInvSort = new CInventorySort;, ^# X9 @0 \1 Q- ~. s. ?& w& Z, F
vector <sItem> vItem;3 J% C6 w. x- d0 Y$ b" q
vItem.resize(MAX_INVENTORY);//初始化大小% _ D3 {' j1 G1 M# ?' [' o
//////////////////////////////////////////////////////////////////////////
9 V1 C7 I& J! Q3 C0 k4 l; h! w //填充数据3 G; N$ {! t# {
for (int i=0;i<MAX_INVENTORY;i++)/ ~+ s# L: H/ P
{
8 b; O0 ~' n% {$ @! K1 @. @6 N. W CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);- [! l. N( R: i2 g& E# \6 B
if (!pItemElem)
2 O! g& Q- N/ ]6 _ {
) y6 P# p: \0 q8 ]" o7 |& n) {+ _ vItem.dwKind2 = 0xffffffff;; l& w, B. O4 _6 o# x& N' Q# X
vItem.dwItemId = 0xffffffff;
. |, ~+ |0 J( |& P" X% ]+ D vItem.nIndex = i;
' G9 t( n4 o$ N) }" n3 D' P }else {$ ~" b/ o I9 R# D5 U. v
ItemProp* pProp = pItemElem->GetProp();
! \- C' T: T4 P$ u6 H vItem.dwKind2 = pProp->dwItemKind2;
. E* @' Y8 }$ A' p2 \ vItem.dwItemId = pItemElem->m_dwItemId;4 r# a6 |) }$ R
vItem.nIndex = i;' S, A ~2 N& G4 A7 j+ H+ c8 `
}
3 b8 K2 J2 ~% K1 Z2 V* ?: Z //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);/ a8 r. J# w0 x' ~% Y
}
. C4 U/ v0 x9 Z# d6 { //////////////////////////////////////////////////////////////////////////5 U/ o- ]& O; [ p% A* a3 d
sort(vItem.begin(),vItem.end());//排序
7 }' c- A# W3 }" f# Q //////////////////////////////////////////////////////////////////////////. D3 W+ f% y r% U" { d1 v
//交换
; e' E3 I9 v) T* `( a) } ^4 S7 {4 U for (size_t i=0;i<vItem.size();i++)" G6 B' G& k- v
{& U C. y8 @" s- z
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);! `0 J; ~0 f2 [9 n2 [
pInvSort->Add(vItem.nIndex);! v2 L( k8 L }* D O
}5 L2 P2 _! e$ x$ }7 Q7 J7 j
BYTE nDestPos = 0;
* I% {# v& Z; H0 y# f% [/ U% G+ J for (int i=0;i<MAX_INVENTORY;i++)$ X, V7 X3 i+ ^! t h, W3 @
{
5 o' v ]1 j2 V( y& Z( H CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);1 K- q' T* P4 [
if (pItemElem); n' J W8 r9 @9 P! b
{, N3 Z* I a* \
if (IsUsingItem(pItemElem))/ Q0 I7 h' K5 ]0 h! K
{
$ w# r6 b! q- r' W; \2 z7 W& w: m/ K //这个位置无法放
; ~# l# `8 T2 a/ o# f4 ~ nDestPos++;
# r4 m! t. K5 p$ K }
r& {6 s& e, ~' _+ R$ g) G; G }+ h) S3 j5 S; [. {
BYTE nSrc = pInvSort->GetItemSrc(i); X4 {8 f9 c- F) L* o$ ~4 u
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);) t/ O& {1 M7 Q5 S% H9 V+ L
if (pItemElem)
8 s( ~; ?$ F/ R1 W, |) c. r {
# K) N& f2 Q: r if (IsUsingItem(pItemElem))2 X7 M k+ V2 i* S5 B
{
5 M3 p+ v9 d8 m2 D* T //这个道具无法移动,跳过
- q: t+ P7 ~! ], T continue;; A4 E' S! X' a3 B9 E/ R: y; u( m
}
% k% u! w8 e9 ?$ N+ s }else{
+ i+ g3 q+ D9 d //空位置 不用动# }) i; H( b9 E% j3 j3 V% Z
continue;' j1 b k( r' G( T( E6 r
}
% Y( I" X5 F" }5 y& v( u/ B. i //////////////////////////////////////////////////////////////////////////
- g {5 R/ g) h* u# |* P7 W! r //开始移动2 i4 G" q% g. g" v' N
if (nSrc == nDestPos)
: }* `9 E* S1 Y1 E; K4 o( R {
! `+ t8 @# I: Y% v0 c" m6 `! R //原地不动
/ z9 d7 N$ ^5 h- W6 z nDestPos++;
, n$ i4 \, r I" O& N6 r M continue;
* `! i- R& v: K- ]8 y5 Y }
1 Q) V2 \; Y8 V pInvSort->MoveItem(i,nDestPos);
6 i/ a7 l8 \' h; n7 t6 W g_DPlay.SendMoveItem(0,nSrc,nDestPos);2 |9 E: I/ H& b! _% x
Sleep(5);* q7 l4 F. t8 M# R5 T
//Error("移动 - %d->%d",nSrc,nDestPos);
/ J! f) g1 J; G6 u nDestPos++;) g$ Q. ^, e1 {4 U% f9 t
}& m0 e1 o$ n' J: N+ t2 Y/ a
//取第一个元素的信息7 x0 b7 M) H% {, w6 \- L A$ u: L) L
/*/ u) I7 x' {. I$ T/ j
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)( w' K' }: `8 M$ `# G9 l
{( W* G- v$ J, X4 l4 P4 M
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);3 v' w! N# W/ T/ c
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
7 K$ v4 u+ O$ A; O }, h' j; G* I( S, z
*/
6 Z$ f. ~" r- v p //////////////////////////////////////////////////////////////////////////2 g1 {$ v& d6 c' z# k
break;4 W# P% ]9 |" [- E+ L, @9 ~, `/ G. j
}; ]$ V# o5 J6 ~! L
} $ B; T A. Y4 k" B0 F$ _! e
}: x" y" X$ q4 o0 r6 I8 h# C
m_wndMenu.SetVisible(FALSE);
" @1 V- v0 k' E" |2 J6 W: f3 `9 X, t. R# {1 L0 x7 g- N0 e+ i L% n! _
--------------------------------------------------------------------------------------------------------, U& n6 \% _* s9 v
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)2 U. Y; f1 p: Q6 Q
{( I% S- h2 W! L2 y0 Q
BaseMouseCursor();
+ n5 ?# ?, n+ s$ O$ _}" M( z- n8 k% B" _7 i" |. I
在其下添加:
+ j5 k" Z9 E7 _% jvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
, ]# ^8 _0 z& P8 }6 d' e{4 Z; V0 _! T. c# b& ?) y6 \
m_wndMenu.DeleteAllMenu();6 C' h; L: x) i$ B' C9 {) ?
m_wndMenu.CreateMenu(this);
1 U. Z5 z5 N( a2 _4 C* l5 Nm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");, a( I- Y+ v' H0 C
. |$ }( m1 O) W* y9 K4 C+ Gif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
$ b% P. ? a% k' X! ]0 u% j{7 H- X4 Z" x- U8 _; b
//P以上级别才可以删除所有道具, O; R# g2 b+ g! `
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");% Y" o& [! w/ i( r1 g
}
5 S! g# e1 Q5 N& s! [m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );: [+ |! E. y2 H1 h+ u1 v
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );8 l- U" q1 _ M0 r! v3 m9 `+ a
m_wndMenu.SetFocus();
- B; i% x# O3 v# v' O& z- \}+ d/ I1 y. c8 z8 S6 g. j1 a5 F
------------------------------------------------------------------------------------------------------------1 [$ ]+ Y- F* |* R' ^& v0 B
*************************
5 n/ K5 {, G! aWndField.h文件 Z% s6 `2 @: u, t$ y9 x5 h
*************************
, }/ c+ P$ `7 C' }. i1 ]( i1 [: m搜索:BOOL m_bReport; ?8 |) S; x% a) {: I
其后添加:( e/ D% t/ }0 ~. ~% a, f Q
CWndMenu m_wndMenu;
9 b! I5 F/ V, C& E/ [. A* V搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
8 P, J5 S8 S" x$ C: |/ {' V其后添加:; K/ B- y3 D% L9 d- d1 T1 P
virtual void OnRButtonUp(UINT nFlags, CPoint point);' P2 Z9 K2 n, P# ~
$ @- j2 @1 ~! t: n4 o7 k# g" o. i ~+ }( U) A# a
|
|