|
|
源文件中_Interface文件夹下WndField.cpp文件3 W8 q$ T& m1 ?' b* ?, v9 {
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
5 c4 y0 r; B4 m' s( j
0 E2 r6 v# S4 u3 T2 D/ Ystruct sItem8 A ?; G5 v" @: A1 |
{* ^5 u2 l7 L' Z( {2 a. B4 N
DWORD dwId;
/ s; d4 o% c4 K: X$ C4 w. @" b* iDWORD dwKind2;
0 \+ {4 U4 t( _) iDWORD dwItemId;4 u& g" a( C( D% a3 H; M
BYTE nIndex;
7 F6 A) @. N7 a p$ v0 IsItem(){* b2 t% m& T( K# ?4 [6 K
dwId = dwKind2 = dwItemId = nIndex = 0;1 Y1 a# \& [8 A
}4 N4 _" o( g& l) t- z/ Q# J
bool operator < (const sItem p2)
- D: L; M0 i; a" M{; p" S! \, K( r# V+ l7 z
if (dwKind2 == p2.dwKind2)% f$ F( t1 w) ~# I
{3 B# v$ |; y. _: U
return dwItemId < p2.dwItemId;2 k( |2 z# A# @9 {3 y4 l
}else{* j0 Q+ d( ~" \- z
return dwKind2 < p2.dwKind2;* m& c# y3 f8 [/ v7 u% ^/ Y
}2 U4 y( W1 D! B+ _( ]8 E: U
}+ Q2 N& H, v: ~+ h
};6 _& X! a* V: A: N" U& U
class CInventorySort
4 U& v! ~9 J. M/ P+ x y( v{, T8 j& l0 C) i m) Q3 P5 c H G
public:: V9 Y3 T R6 ^2 E- w2 g1 @
CInventorySort() X2 H E8 d" A3 X4 L `
{3 J* p0 W+ D4 w. ~
m_dwPos = 0;7 l. p2 H' a' D' ~
}% _3 C% d- j! @7 Z4 R* J
~CInventorySort(){}1 D0 s1 l5 f( B' r2 O4 U1 C' b
private:2 ]$ Y$ @# \8 p2 n- I2 t h& R1 ?9 U0 A
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
7 P: A9 A" ~ {$ G4 b$ K" sDWORD m_dwPos;) q0 y7 a a8 Z; C2 Q/ w
public:, M9 [9 J% z$ W. v+ d; R( g
void Add(BYTE nIndex)
3 N8 ^6 q" k5 t3 u9 @# Q{) I2 i& I% }1 t- r8 {- Q
if (m_dwPos >= MAX_INVENTORY)
8 ?; X+ u6 F5 w8 H3 h {! q5 n, Z0 c* C
return;% ]% k' j0 B+ [9 g4 N- p5 L
}
4 O/ F) {4 B4 v5 @7 S$ S4 H m_Item[m_dwPos].nIndex = nIndex;
Q0 H$ ^- q; Z1 V R m_Item[m_dwPos].dwId = m_dwPos;
0 ]2 L! W6 ~0 t1 s5 b m_dwPos++;
) y) [! _7 u j. E- V}
7 w6 u1 ]1 ^; W1 P8 o/ R3 XBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
5 p% {9 k2 ~/ c+ n{( I# L$ T/ @ ~: _3 @
for (int i=0;i<MAX_INVENTORY;i++)& Q! M: y4 r- I* _
{* V9 d2 {/ C( S& c2 s9 O* [. o
if (m_Item.dwId == dwId)
, A) b8 {, {; ?% Y {
% n4 m- |3 S2 U$ T9 r$ K6 l8 K" V return m_Item.nIndex;
n- }" K% b9 o+ G' a+ h }
$ [& p/ N& S1 t) L4 ]3 O) I }
# U- T/ D4 D* u- L3 v% s* ]3 n return 255;
5 L. s) D* D' p) `) h+ Y}! G) P. ^. _$ ?2 Q0 I* L( b
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置$ ^% r: E9 @8 l! P8 i0 r9 z9 b: d
{: B: a5 B( u8 l5 P: w; ~- x2 R6 J$ x
BYTE nTmp = 0;
1 E: E/ H$ |0 o" r5 f c bool bDest = false,bSrc = false;
" K' ^8 S0 P8 ^7 z# Z0 u0 W for (int i=0;i<MAX_INVENTORY;i++)
/ m3 m9 T$ v9 E9 |/ c {3 m) E6 ?8 w( [# b1 F' c1 _8 z+ e
if (dwSrcId == m_Item.dwId)! T, E9 E; r5 \
{+ T+ ^ A; l9 F! d
//id相等 则 改变对应的dest和src
6 M4 S6 [; P0 N. q2 v nTmp = m_Item.nIndex;
U$ p. ~" w7 v: v# Y m_Item.nIndex = dest;
: j! T% b* L9 y: T* [* V }- B( }/ L- h t! J
}. G4 [4 F; m$ N- T3 t; M7 |
//临时数据保存完毕,交换开始
, E" f. Z; x2 M# y for (int i=0;i<MAX_INVENTORY;i++)9 _/ n: @/ p* U! P% {8 Q
{) |4 S0 Q7 h. ~: |' `& {5 Y* T
if (dest == m_Item.nIndex)
2 R4 j$ S' M; @; U {
# b1 d! Z/ a- G //id相等 则 改变对应的dest和src
+ W4 i6 X/ l' O0 r& s m_Item.nIndex = nTmp;
- D8 p! J# I, l$ y$ `7 j, y }
2 J( x$ ]9 F; j; V! K; n2 F5 N% g }* ^# W; l5 s# L' D) f! F p! J, o
}
# H* I. _; L5 T6 x" x};
: R) j$ d# H9 j-------------------------------------------------------------------------
) O3 R: o" F5 N* Z依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
5 Q. l. _$ m" X0 h% x搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
3 Q4 B9 k }+ b0 n+ R) H紧靠其上添加:
0 T: {3 B4 G. X! Q' b; ^if( pWndBase == &m_wndMenu )
8 u3 [' @9 E( d6 n# g# W% P3 ]{
) D8 d# ^4 l+ v$ @ switch( nID )
* i; ? D! Y& }5 v6 A {
1 z1 P2 D0 b8 N; x3 N) w$ x! x+ c6 c case 2:
4 a5 g0 |- ?, q$ f* e J) S! E {! y- b. \' B" k c. `
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
( G, t7 r$ X( L if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))1 R4 L, r, V6 ?
{5 o4 W: t0 H0 D! U
break;9 ?3 c$ B1 Y2 b# z9 @( @
}
* ?' W u" c( M$ U for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
: L8 j# i4 p; S# S( Q2 g$ B! O {
3 @8 ^) S5 p2 R5 x CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i); r5 C+ E+ r5 j- Z
if( !pItemElem )
" o. C0 [8 r+ Z& _ continue; _1 I+ j& q, y1 u1 e! L3 k- A
if(pItemElem->GetExtra() > 0)
- y$ b, m' O$ A. E. `: A; l continue;
0 {* e6 x% _. ^3 `5 w6 L; N; [ if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
/ }8 s M0 y2 H; D a% l continue;0 ? `* Q$ y4 s: I
if( g_pPlayer->IsUsing( pItemElem ) )8 ]9 o$ Q) d* [1 K5 c
continue;! [8 ^7 |' W; H% R9 \
if( pItemElem->IsUndestructable() == TRUE )
) J5 ^" \% F! z& w3 L" l {' O1 s1 H4 I( \! B0 m, `" M% d% `
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
. i' z4 }+ }7 V [4 R. C6 K# a continue;9 W; ~+ G, g& M. J; [6 E" P
}8 `3 Y* ]1 M: k5 R# o
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
+ d$ k2 H# J1 C3 F }, V+ \6 I( }! M
break;
% c+ L1 ~3 X7 [9 F/ j. [ }
0 P$ c& [9 J4 u* l4 n case 1:
( I/ x! R( y4 b1 S2 E {5 U; b6 D- \, X4 K
//整理背包) _+ a" L" K% }0 v% {% F }
//////////////////////////////////////////////////////////////////////////2 \" x( C9 h; o# o d
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
; n$ |1 [! z/ V. g8 b7 B% S+ E. W5 Y" v //////////////////////////////////////////////////////////////////////////; X' S, L# ]7 Z8 l0 A7 o4 f
//////////////////////////////////////////////////////////////////////////
4 t4 n5 T: p6 J& r, Y# I CInventorySort* pInvSort = new CInventorySort;
4 J1 E- }1 c7 F$ [& C vector <sItem> vItem;' @2 o4 Z" ?" m; w S) T
vItem.resize(MAX_INVENTORY);//初始化大小" _# [( K' k q* G! F5 {7 j6 v5 g
//////////////////////////////////////////////////////////////////////////
8 {- _& ^, [9 U; [8 K; O7 b //填充数据8 I! y: ]6 ~/ D' W' o1 c% l' q, }3 s
for (int i=0;i<MAX_INVENTORY;i++)) g3 B% H% F8 X: X' k
{1 J+ Z8 m* L a$ M4 [
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
- d% t# B# r/ S5 s7 K if (!pItemElem)
' [# D3 X2 f- J! a+ L0 \0 B. M {
9 F, ]* n* K. C* a# c0 l$ d vItem.dwKind2 = 0xffffffff;
2 Q6 I; O- e0 C2 V% X vItem.dwItemId = 0xffffffff;) W5 k9 _5 O" J( A$ I0 D. @3 P6 r# B) d! ?
vItem.nIndex = i;
( T3 s- D7 d/ _7 {+ w; C6 D }else {# Q$ D. t( ?2 ?+ `
ItemProp* pProp = pItemElem->GetProp();
4 X6 f1 i: \5 k; P vItem.dwKind2 = pProp->dwItemKind2;0 r5 A' y1 Y, @$ k0 R
vItem.dwItemId = pItemElem->m_dwItemId;
9 J: ?4 d9 @( k/ h6 V vItem.nIndex = i;
" V4 B) S8 d D2 Y; O }
; I( t$ T* F5 ^, A' S* Q //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
# e; x" P4 Z$ @7 \ }* d w( n x. U+ |& d3 R3 E" ?
//////////////////////////////////////////////////////////////////////////5 s4 l/ d* b; y4 r7 q0 C' @+ w% B
sort(vItem.begin(),vItem.end());//排序
2 a+ S& V" c- m8 ?3 t! b2 F //////////////////////////////////////////////////////////////////////////
3 u) R1 j3 R) M& [ //交换
+ b5 i5 b" ?6 i3 l9 r% D% O for (size_t i=0;i<vItem.size();i++)
, y, ]4 T: \$ I" ` {
& y3 Y- m2 @$ ] @ //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);' h, G; l& l* {) y- Q* W
pInvSort->Add(vItem.nIndex);5 g" d3 d8 O& O' f
}# ~/ k: I$ z E% B/ x: t# G" a
BYTE nDestPos = 0;
4 x( y$ {9 v4 i/ ]8 V% B. T) P w for (int i=0;i<MAX_INVENTORY;i++)' J- `# y5 D4 m5 l. Z) M
{
( H+ s( \% a: M" u6 t( U2 x CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);( u6 ?2 a6 H: r$ [
if (pItemElem)3 k2 H- S+ }7 C8 d
{$ o u, u' x3 b0 D5 L
if (IsUsingItem(pItemElem))
]3 g5 V: q- X6 Z8 g" U {1 r* ^. e/ S& R% c
//这个位置无法放
. X2 ]5 ]# W" R6 d7 { nDestPos++;9 c; A: E* q. X$ r
}
0 O- ?0 q( }5 d2 b+ t }
+ e& j" Q# K3 `% F2 O) H BYTE nSrc = pInvSort->GetItemSrc(i);
& h0 D) d x, r6 j' y pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);$ h1 J k9 k8 E( }, y
if (pItemElem)( Y4 g! e, e5 x
{' v$ C3 T$ w: r; @ y' ~
if (IsUsingItem(pItemElem))
. ]- m9 r+ i& c) w3 G+ d$ v) V% a; w {7 ~& G y8 G2 n) S+ E
//这个道具无法移动,跳过
: L7 q2 j: X+ m; L: M continue;, }) K2 L, p6 s* |& L
}
* I9 o7 }8 X9 |; P) y }else{! M8 S# @" A7 N& ]( I3 X
//空位置 不用动
. t, W; P' Y" P continue;
3 R) w1 n* z* b/ v$ C }
: t2 H$ I- l2 m- c9 z: f" A //////////////////////////////////////////////////////////////////////////
" _+ I- J. o( v/ s& a! C: F: m //开始移动8 ]' b0 o3 }6 h& y8 N
if (nSrc == nDestPos)6 I9 t; X' _8 K# A
{
: j8 J, w+ N' s0 l. [" c, o# v4 H //原地不动
+ F4 N* P1 p. z% d' K nDestPos++;1 E) O1 n) L) B2 U2 Y8 l
continue;4 T+ y2 H, v/ k1 l8 B( P
}" R/ [# P7 J8 J+ K
pInvSort->MoveItem(i,nDestPos);
6 L K$ D8 |, d9 D g_DPlay.SendMoveItem(0,nSrc,nDestPos);
v& D) ^. P' g4 I- y0 F Sleep(5);
6 [. p3 y- X" I/ g: Y& t //Error("移动 - %d->%d",nSrc,nDestPos);
( A: G# p2 X% G: w! F; B nDestPos++;$ p, v; L: q. ^4 `' Q
}+ q: {9 j' {8 d/ H, L
//取第一个元素的信息- i, \/ r1 v7 g* Y( F J. k1 f
/*0 F. _5 w" ]5 m" s% W! ?- @
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)0 d4 l# E- a5 o3 N8 T" U
{1 \, W# P% B) h( K0 x7 p
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
* E. X- ^& R0 H! s2 A; @# W$ X; P9 C g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
9 S" J- y) g1 }, L" x" S4 N }
5 ?( _# j' V$ u */
, Z S' c/ y5 `/ }5 P! r; W b //////////////////////////////////////////////////////////////////////////" C3 r+ x5 R; l- T- z$ c
break;. |) P; Q1 T. ]7 V% [! F3 K" G* m
}' n" R( P0 y1 J; a( c
}
. e6 f5 t& x" a. G$ i# Y9 e9 o2 ]2 ?}
3 F8 `0 B3 j4 Rm_wndMenu.SetVisible(FALSE);) p" U0 Q# o, }& N+ ^: c6 \
; j" M6 H& j; V6 v3 c--------------------------------------------------------------------------------------------------------
2 W# D( l; l; t搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
/ M7 B: w3 q4 ?/ V( }{# [; ^2 Q+ U1 ^) Z1 Y' ~" D1 d7 V( Y
BaseMouseCursor();# a3 j8 k' C0 f# `/ G* y7 R( T* Q
}1 H+ A/ b5 V) q1 \7 E3 |3 I
在其下添加:0 t/ c9 H& _4 c8 y3 P& X
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
& N( L) Z- w( F% D L{. D/ o1 U2 z2 c/ K
m_wndMenu.DeleteAllMenu();
" o" ]" V+ g+ N5 a) R6 |9 |m_wndMenu.CreateMenu(this);; Z- U! P7 i) l! g
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
& L) |/ }7 [. `3 O9 }; b' n+ a. u! ^8 X* U
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
5 \9 B0 r+ g# {! x0 C{4 D S% y9 V) b: ^, f! L
//P以上级别才可以删除所有道具
* A7 f4 b! J9 x7 ~3 ~8 h m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");7 b+ K0 Y8 S' E! F# X$ a& j8 L
}# V" @3 L* r! i- L6 @# H
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
+ t( b, M5 z3 i( M) l& l& Vm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
, J' \/ \! X2 C2 x( Lm_wndMenu.SetFocus();
^- c" _( o7 \* p8 J} D8 m8 ^# ^6 N4 D: e4 h* ^3 h
------------------------------------------------------------------------------------------------------------
: N! \: ^7 G. {0 o0 s) ?$ K*************************
- j7 ^2 ^/ N; i4 ~* L! xWndField.h文件: `" o# J. r# S0 H& p/ s& M
*************************) u/ M' M' B2 O7 w4 b1 `1 G) }- j7 L
搜索:BOOL m_bReport;
' Y( u) x1 q4 X [ m- v" v其后添加:) w3 Z+ \* w8 D* A( G! |: H: i4 t) f
CWndMenu m_wndMenu;
& F5 m: I/ Z* H$ \2 d4 s" A搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);8 o5 ^- h; M: g0 [8 g% X& G
其后添加:
* ^/ b9 B/ C2 L/ W, Y( Dvirtual void OnRButtonUp(UINT nFlags, CPoint point);- k* P' a2 X# [) R" V7 d9 C
. g, |3 C0 x- n$ f+ u
7 P3 S" g3 r& M: s" t |
|