|
|
源文件中_Interface文件夹下WndField.cpp文件! C( g. d% S. T) K
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )1 F/ g7 x: Z; q# G
* u+ l6 i& S, S
struct sItem
$ c. v! `9 w7 f( j1 v* g5 Q{) x& G8 }$ [2 ]4 B3 S
DWORD dwId;0 i8 V i3 Z* I `) M# Z
DWORD dwKind2;
$ h" U( a8 w+ `5 h7 N1 UDWORD dwItemId;0 z0 {! {7 ]4 |5 L5 ~& x2 Y
BYTE nIndex;
* f7 R6 i) j- csItem(){/ [/ n! S+ a0 ? ]4 A8 Q) g2 |8 z9 T% I$ W
dwId = dwKind2 = dwItemId = nIndex = 0;
* P2 O1 B; M; i$ O. m}6 z$ @/ q& E1 L/ j. m+ y% A3 b; S
bool operator < (const sItem p2)
+ l' r5 w5 \( c4 ?8 z G9 M0 Y' L{
9 Z8 R& L. Q+ |8 D, f# G) G if (dwKind2 == p2.dwKind2)
6 y9 D4 U @; f( g- ^ {
9 U$ t2 W. Z/ n/ `& L! O4 S' S return dwItemId < p2.dwItemId;7 [1 B, W7 c- w" S3 F) ]
}else{
H$ {2 f" \0 G7 Z* T, W return dwKind2 < p2.dwKind2;
. L0 M1 c2 }% P0 W( R: S }
' u5 {! O6 \& K2 I+ L5 g) K}2 R( m' m' ~ p ]
};( F, r8 r9 U+ Y Q
class CInventorySort
9 N' j2 ?7 s7 o/ a5 r{
3 B3 M6 i/ C! E9 l: Q3 xpublic:
; V6 y) E6 ^& }8 bCInventorySort()
O3 {1 i; v- ~2 a9 l+ k{
# f4 v5 `4 C8 o m_dwPos = 0;
+ F' Q V4 B' @3 o- @5 Y}5 T8 L6 U1 e$ G2 @6 D [
~CInventorySort(){}" Y f* ?& T* `+ Q" E% |* }
private:
/ O; Q( k& e1 ^" C4 P; h- YsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息1 g+ l* ?- Z' r# l5 n' v- P7 u
DWORD m_dwPos;3 k8 P% E8 e. l& {- Y* @
public:
- M3 Z- D' U& c/ B4 Vvoid Add(BYTE nIndex)3 h% J$ j) d' G. x X* S: o5 ]) X* c
{" U5 E7 N; c) G' `2 s1 D
if (m_dwPos >= MAX_INVENTORY)6 ~6 [8 g, _4 w$ S; ^+ M6 }6 C
{
8 v d5 Z2 |( C' y7 N f6 `2 @ return;( f" Q) S6 ]- ?( T9 m
}5 V# c8 g$ S* D) Z8 H* V
m_Item[m_dwPos].nIndex = nIndex;
! e ^6 p, {8 }2 m: d4 i% x+ X3 U m_Item[m_dwPos].dwId = m_dwPos;
4 G) h; T5 ?) M m_dwPos++;
0 M. c! i) n" w: H- b0 W3 ?1 F}
' l9 ~$ D# Z! [5 |" a0 mBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列+ W' Z) Q/ Z' ~+ Y7 j1 [1 n
{5 x" J# {$ h3 L* G7 N3 z
for (int i=0;i<MAX_INVENTORY;i++)
2 B7 u) |( X0 g# P; L {
3 S, \6 j+ q: C! |9 J if (m_Item.dwId == dwId)2 \+ O0 {" a/ ?6 k3 O
{( C* J9 O7 ?' \; T4 [$ A7 E
return m_Item.nIndex;! p/ f: d4 E* u( A5 r7 m' n
}0 J8 O2 B1 U4 w* ^# q9 s* D
}
5 P# B$ T! n/ D4 D7 v* J% w return 255;
, k$ \6 Y& g1 _1 p S9 }}
! z9 w5 |+ b! e4 E7 u, Q# \void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置! f3 Z/ ~+ W8 F( \) |& k
{6 P: w D) C3 Y5 S
BYTE nTmp = 0;* L5 @5 o$ z* M
bool bDest = false,bSrc = false;
5 V: O; K: ~- \ A for (int i=0;i<MAX_INVENTORY;i++)
" f% ^( i& s' j. O% x* T! n; w {$ p/ Z! K+ V* T9 D. k, p
if (dwSrcId == m_Item.dwId)
2 q2 _; h0 j. l& U/ n3 f) f {6 z. y* b9 w* H8 `( [, }2 E1 f2 v, J
//id相等 则 改变对应的dest和src; E/ |2 d5 D& J" o
nTmp = m_Item.nIndex;
( p* s) w: J* H! D j. H; H- f* H m_Item.nIndex = dest;
7 {2 e1 Y6 f& l }
3 v8 o' o0 h1 I. v( Q2 `1 K }3 [! _$ |* z( ?" ~2 D& {
//临时数据保存完毕,交换开始
0 h% ^3 f3 g; P- b+ n for (int i=0;i<MAX_INVENTORY;i++)
% G, y. K+ e g3 n {" |( [+ x1 Q6 o, t
if (dest == m_Item.nIndex)
/ D% o) z+ r+ R7 ? {
9 {9 S' A, G h% R# I //id相等 则 改变对应的dest和src. V' I }8 H. v$ \0 v% @' K
m_Item.nIndex = nTmp;' m" C8 }$ q: x0 G# f
}5 Z, L) B5 B, j: F- r6 e% G }
}
. C! n+ X2 d- e7 j' d}
3 q/ ~- J& f5 b$ E5 _3 ?};6 X( r/ w! Y" T9 z$ J% E
-------------------------------------------------------------------------! h3 l- [. @# {! ~% s, J
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
6 c( M3 U' }4 f" e( v3 H, @# g# u p搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);) C& K3 \+ Y& c' w9 | J
紧靠其上添加:
. }8 E4 Y2 @4 i! j6 G& ]if( pWndBase == &m_wndMenu ). W& E# C' y( x- J$ k C" ~! Z
{0 l" z' d9 G4 I% M
switch( nID )" z" D/ _) o$ k; b7 Q. x- O0 e) o5 k
{
. \" @9 B4 p+ N6 [" ~4 M case 2:
6 ~+ B' ]* H4 O {
/ x5 ^1 @9 t4 [! e$ k5 d# ^, Q //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);8 L% g5 n& n- X
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))% q# C# L! D) M& M8 X
{: r( H- G( ^/ J. q" \' i
break;
6 | p# u: Q: G' N5 j- G }- j# ^+ K" O/ i& Y
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)/ T3 [0 ^' N$ Z7 S& k2 O$ l
{' `, s+ ~; i8 p5 z3 y% X; p+ T
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
" N2 W3 \1 @/ A+ y8 }8 _) x: A if( !pItemElem )+ _; b) E$ h9 ]$ V: a
continue;+ P: s% |+ G1 U% p2 z1 O$ O
if(pItemElem->GetExtra() > 0)
" t7 r- i- X4 I6 @- r' [ continue;
+ ~* h# l8 c: ], j if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) % P- s2 G% M& E
continue;
3 m' g7 x$ i# C$ Y' d if( g_pPlayer->IsUsing( pItemElem ) )
) n2 Y) S5 F1 r: I0 s) E: x* u continue;
% M% b* ^5 C4 f% c$ G) c6 y! q if( pItemElem->IsUndestructable() == TRUE ): U! f( x0 {0 @3 E
{
: B7 i1 e" i0 o1 Y* A. X g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
* ]6 F6 p, m2 m1 Y+ [% I) L: I continue;
9 j: S' e. `+ }/ k, ` }
- ^4 |* ~& P6 X% Y n! ] g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
) | \ \0 l3 W+ X! v, `6 a }
% a; N9 c/ F$ r# R2 m! g, U break;
* W! \: n% o) w e4 z }( E& B' ]' `* V7 G! p+ m
case 1:# i' x$ Z: r* |2 g4 Z
{
n' m- Z1 [# n4 @# g! E //整理背包
; [* [9 J6 E' H) R //////////////////////////////////////////////////////////////////////////
k2 m5 v7 q6 U# U( X, S //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );5 D4 @" t4 L; h% A
//////////////////////////////////////////////////////////////////////////
/ m! c: c9 U/ z0 |: \) d //////////////////////////////////////////////////////////////////////////$ q* j* K1 z/ r
CInventorySort* pInvSort = new CInventorySort;
1 w$ b& i5 l- [ vector <sItem> vItem;
+ }* q9 A$ A) g. a( x2 D vItem.resize(MAX_INVENTORY);//初始化大小
3 R- H3 j/ Q. Q9 i) P; v, T" ~3 C //////////////////////////////////////////////////////////////////////////
2 X" i* u) }4 _7 n/ a6 J9 M //填充数据
3 t* D/ S- N$ j* `5 z for (int i=0;i<MAX_INVENTORY;i++)
( f8 o' O2 o: K: D3 [6 j7 @ {
! y+ Z$ H& N: E3 t CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
& l6 B8 [* [- m) j1 k8 n% I% X if (!pItemElem)' Q! L2 c: d( x* R+ C0 Z2 \
{
: k* ?+ ]7 F$ d" A: O# Z7 S2 | vItem.dwKind2 = 0xffffffff;9 j. y @" O! B2 l0 l$ p
vItem.dwItemId = 0xffffffff;8 i# J, u% d" v
vItem.nIndex = i;
; t3 `* z2 Y) g. e1 z8 j }else {& v. }) T" y3 ]2 Z) \) Y: G5 s3 ]: N
ItemProp* pProp = pItemElem->GetProp();7 W; q& _: S! @0 s8 j
vItem.dwKind2 = pProp->dwItemKind2;
' O1 d; M$ {2 g$ Y. _7 | vItem.dwItemId = pItemElem->m_dwItemId;
! N! q/ J4 m4 m( j' b! t W vItem.nIndex = i;; O( d! z( n) M2 V* Q# A" e/ h
}+ k. s6 W1 P9 b# q7 E. n
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);8 A8 _% \& r) c( s" |
}7 n' }' n& ~. S
//////////////////////////////////////////////////////////////////////////
: ^9 Y8 ?1 n$ \ sort(vItem.begin(),vItem.end());//排序
7 t7 P$ r* r: y# F# K /////////////////////////////////////////////////////////////////////////// d& H' w1 B8 |5 z) i6 }
//交换* t, A( Z( Y& ?1 |' }
for (size_t i=0;i<vItem.size();i++)9 T: u6 m- R6 C& \4 K1 U& y- g Q
{
0 J+ T+ E ?3 q) C4 }$ Y //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
h: |+ F6 s B8 F pInvSort->Add(vItem.nIndex);
& \9 k- J- Y$ v0 @2 o- M0 Q }
4 x& c! e7 ~/ r0 D BYTE nDestPos = 0;
. T8 V$ \- S4 v; V, R+ k; p. ? for (int i=0;i<MAX_INVENTORY;i++)* r3 a+ `+ r$ e: D
{
% t, l* ?# b7 v1 X( Z/ a% l" M CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
8 h- I! }7 ]6 R# T0 G( }* L7 S if (pItemElem)& M8 ~- d/ |7 o, q+ b
{
& r3 H5 V& d9 z3 B/ p if (IsUsingItem(pItemElem))
2 i; u0 p- f( N. y/ e {
/ y! i y' ~ R0 `+ i //这个位置无法放9 s6 ]7 P' e8 p- H- D- M. o
nDestPos++;+ n. m+ }2 r$ j w5 e6 l+ f
}- y5 `# g1 O# K& ] z3 y7 i
}3 X$ A) S$ Q6 v1 W
BYTE nSrc = pInvSort->GetItemSrc(i);
' P# n: ]% I* B5 v, n pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
6 ?$ d" B& H, N( @: } if (pItemElem) g1 L) \4 {0 U" l9 j' b4 b6 F
{3 g6 N8 J) I A8 F4 {* f
if (IsUsingItem(pItemElem))
8 s; e* `- n6 c4 w" R {2 o$ n: Z$ E( E5 z1 }2 P7 J2 D
//这个道具无法移动,跳过
7 y2 s8 I+ n5 k6 l" }. g continue;, _% \& v# i$ z. v
}; O/ Y u( E' e; U$ @8 g
}else{
6 k" Y! ~" n7 H //空位置 不用动# ~7 V n3 n, ?% V2 b+ |6 H
continue;
8 b: u, B! f4 q4 V }" h5 w2 k" r! X0 e% D: c
//////////////////////////////////////////////////////////////////////////9 m! m9 f8 ` z/ ?4 B
//开始移动9 }) @7 _. \- n( f( j e6 T) f* }0 h
if (nSrc == nDestPos)4 [ W1 P0 S( I/ @
{- i d5 i# T& Z" _3 ^$ R: V' {
//原地不动 a+ J1 W* a: v; n! r
nDestPos++;2 Q# u' o4 A" b- f! s$ P0 l
continue;
5 H% I$ ]" z8 T }, O( N S! e6 Y4 p
pInvSort->MoveItem(i,nDestPos);0 s9 W$ D5 z9 w6 c7 F
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
; l9 S1 }* K* p u! V Sleep(5);, d! X: y2 o, T! o$ `
//Error("移动 - %d->%d",nSrc,nDestPos);4 L- u7 C. E3 ~* i; \" }* W
nDestPos++;
4 _6 l+ n" x) Y/ w# j: }; @9 S+ q: s }7 p u' O( e4 L* s
//取第一个元素的信息
, _- H1 _' N) d# B" M' P /*
\* o; a4 Q: p- t- D7 \4 n/ K if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)) m6 S; g+ ?$ B% O1 C+ N1 |
{" C B3 Z7 V- k4 \9 b# _4 v- S$ s
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);5 ~8 h# E* n# u5 U
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
2 @7 M: g" G# k+ S }3 N/ w. ~/ ?! _$ s" S
*/
. y* K5 Y o$ P; A! E7 f9 R //////////////////////////////////////////////////////////////////////////
5 V b1 l% w/ M, Z2 B break;
4 J! A! K# d( |: j }5 t' k/ d- f7 B. y% U3 p
}
1 R( f- N: P- h9 T% F3 O}
& g2 b+ I1 F* v/ B& Gm_wndMenu.SetVisible(FALSE);0 ?' T* R( ?- ]2 J6 ]$ [: c. l
' ]: c0 c! n$ O7 T( U) N" [--------------------------------------------------------------------------------------------------------) `3 d _: y6 ]
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
$ K- V5 A- [! ^- L/ i{
( i$ P- |7 z0 F7 _BaseMouseCursor();
. @ j# f7 ]& [5 M, O. x}- q; u! s' r, f! [9 c& J! ]
在其下添加:
5 }6 j7 X0 _1 X( `void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)7 v9 n$ j9 D# o+ I4 n M
{9 M" ?- S5 b T
m_wndMenu.DeleteAllMenu();
) v6 J. G, V+ gm_wndMenu.CreateMenu(this);$ a, G$ Z2 \8 @ ]* o; x# z
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");0 Q4 g' |8 s# ?* Z1 ?
5 a0 i9 {9 @1 t% \) q2 _if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))4 ^( D8 Q9 S7 _5 m* Z1 R+ Y9 ?& K
{, X8 \3 z/ ]/ ]' C, b- w" u- C; k
//P以上级别才可以删除所有道具" p( B# c: k X: }8 O& }- N) X0 B3 Z
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
. Q4 I* Y! l2 k5 ]/ ?) G) t}: W% W! @; `, G t. O; O0 z
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
4 `7 x* J' Q: w$ _+ Cm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
% p8 R, _1 J. j4 z. `$ Z4 dm_wndMenu.SetFocus();
7 J0 E, c6 I" r; j4 A1 `}
& D" T& B+ E9 |# K0 l& S) M4 X------------------------------------------------------------------------------------------------------------% d7 V. v) I3 @: }9 H! q. k
*************************8 O4 J: f7 D8 }$ K: |4 h: H
WndField.h文件
- b$ l0 A/ h$ i% R) A v Q( H*************************; S- D, P6 x4 U4 [/ J" a, q
搜索:BOOL m_bReport;8 o- N4 x# f' P1 k8 d* |4 V. c
其后添加:7 N! f' `* F4 M0 \4 n5 W l& i
CWndMenu m_wndMenu;. D, E! H- V6 k: e
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
: K7 V) w+ q# a! \0 k& x其后添加:
2 k1 h }; A- m" v7 f' U$ S4 gvirtual void OnRButtonUp(UINT nFlags, CPoint point);
; J7 B; k# O" a( Z$ O
- w; ~# D- E1 Q3 t% k5 t1 y( |1 l c' g% q" j
|
|