|
|
源文件中_Interface文件夹下WndField.cpp文件8 f m3 O) l4 h6 X' N
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
, M% S! ?) p9 |' e
. F! `; M. d3 @struct sItem
, Z# \2 W+ e2 z5 M7 p{6 H% [5 u1 ?( H2 g6 ]' h* c5 E
DWORD dwId;& `) F6 ^4 P3 ]7 W# e* A5 f
DWORD dwKind2;* m- | V0 D/ b
DWORD dwItemId;: W5 i' x- E! e& p, X% H
BYTE nIndex;1 d z$ P3 _0 z0 @
sItem(){
) J5 ^/ U4 ~2 Y+ c* y4 y" Q dwId = dwKind2 = dwItemId = nIndex = 0;$ o$ P5 H0 c5 D, z9 [+ Y
}) J; X: F+ g3 j: e7 }" o
bool operator < (const sItem p2)
: @9 F0 a: X4 R( _- c' N% g{! y1 O+ F( `0 a% y. _
if (dwKind2 == p2.dwKind2)" a0 a6 U6 ]' ~/ W9 W0 y6 P N
{
- J( L5 J% ]1 }1 S+ s& w& ~$ @0 f, | return dwItemId < p2.dwItemId;) Q" |. a& X- z4 a
}else{
# G+ A2 f" ^3 j6 S5 A( x return dwKind2 < p2.dwKind2;
) Q' U6 s5 f0 n# i( l/ _6 u }
4 S; G' a( C/ D: a- k}
* H, u; H+ ~6 d3 J};( Z, q" P5 H2 |' w
class CInventorySort
. P/ b' F! I& y7 Z{- C9 d$ J' w5 T
public:
' n: j4 e, b, s( FCInventorySort()- j0 Q2 _. e! K d" _- L
{1 t n1 j) V& p$ @
m_dwPos = 0;. G1 N' B0 [, g/ i0 v, z
}
& t/ L1 `3 l6 S, Q% n% q) D~CInventorySort(){}
9 C% B, M' y9 O( m2 B6 B4 g2 }4 `private:+ I+ J! G7 Y! F( ]
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息% L% Z2 q* q& [2 V4 i2 t0 s8 X% ~4 O
DWORD m_dwPos;, ] k( M8 n- _: F* J, Y+ G$ v6 X
public:
, `# b5 d$ I( V- X* M& J/ @& ivoid Add(BYTE nIndex)
- H4 v7 Z1 h) i2 h3 W{9 X2 Z% d+ M8 `# x# W
if (m_dwPos >= MAX_INVENTORY)7 s3 `7 I! I- h# v1 p1 k( @
{
. q) x" k$ J' u9 G* } return;6 _3 k/ i, l# U( x. _
}& [' t. t- g# W9 B7 X* u, c/ V% [
m_Item[m_dwPos].nIndex = nIndex;
# w/ {9 M) |% w" `# Y+ T6 A m_Item[m_dwPos].dwId = m_dwPos;
% e2 P: h) Y! E7 z$ L m_dwPos++;1 i2 a F* I8 x
}
1 c% M" E2 l. F( A) Z3 F# cBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列; A1 B. g6 o& C" l
{
# a5 x; C" `* Z7 k; Y# Y for (int i=0;i<MAX_INVENTORY;i++)3 |# s) T1 @. N9 k0 ?
{
' j# _/ N- a+ D if (m_Item.dwId == dwId)
" }4 E) T6 J1 T% S$ C' h- e4 ~7 T {9 e' L8 l8 K2 a! ?- E% a$ \$ I
return m_Item.nIndex;
' }9 h, ]' G8 p% U }
& @; k% S& ?6 I. ^ }
9 m: r+ V5 W- ]: V& v return 255;
2 s: {* f% _: a0 ]* g5 g}
8 v# z9 f0 V5 g5 F+ ~void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置. j8 B Y* ^7 G) T5 l+ [
{
) L5 _% c7 r: O: w1 ` BYTE nTmp = 0;5 ], F* r f/ m9 b% M1 B* @
bool bDest = false,bSrc = false;
- W% u" V5 ]* e; H! z for (int i=0;i<MAX_INVENTORY;i++)+ B. S3 a# y0 \1 Q
{
" g+ b# b' ~7 z2 t$ e$ ] if (dwSrcId == m_Item.dwId)
7 C8 {& S, v6 }2 n- \: w {
. A* d g( r8 P9 C$ Z //id相等 则 改变对应的dest和src
) y, A$ n: m8 B3 d# O nTmp = m_Item.nIndex;
' G5 @0 Q8 d3 r+ }" f2 |+ z: _ m_Item.nIndex = dest;1 J6 D3 o g& Q( T) Q+ y* ?
}
5 S' x* D- }/ N1 o v W }2 { [1 ^9 q: x8 Q4 r O3 b
//临时数据保存完毕,交换开始6 g; [# Z. |4 u
for (int i=0;i<MAX_INVENTORY;i++)8 R% V& H. ?1 k, t% ]3 }) J& j
{/ @# [4 z% s* ~) I/ ?. Q- P
if (dest == m_Item.nIndex)* U* |, X" D4 S, U
{
" B6 b7 ^# Z4 D2 o //id相等 则 改变对应的dest和src
# T; ^/ P* M4 f" Y m_Item.nIndex = nTmp;
E" V1 d3 Q3 W6 Z0 w. a0 e }- O9 S1 _6 b$ g
}8 _- ]8 M H$ ?: b% X
}; V) [! f% S9 z9 g1 b; H9 |- I
};
4 }1 Y$ D T" b5 O2 ~-------------------------------------------------------------------------- t- u: C# F5 g: X
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )* |/ T5 B& b# J; d
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
3 E+ z' f+ M8 y紧靠其上添加:
3 C! e; M$ D; ~: ^if( pWndBase == &m_wndMenu )
" v$ l9 u+ k; ^1 ~{( s5 |6 e4 M9 T4 w1 H* I
switch( nID )
) a* ~" d/ u+ y {
+ q0 Z7 Y( [9 h' t% e0 }$ z/ U case 2:
" }3 b. Z: L, k5 Z {8 s3 I, i0 c; ^
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
* O) o9 H4 @: n0 S- r+ Y4 F; p if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
3 M0 T' k) n R( g3 I {9 `0 M" A) u; ?3 C8 J4 i, y
break;
( V- S, r6 Z) G/ J, S$ P& ^* z! R }
* q9 v) X+ b" M1 d" w for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)* W; m1 B, a$ J" c8 e! } T
{ ]2 N/ r. ]: }/ l. G8 ?: M
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);: A: B- D2 l9 J3 x
if( !pItemElem )1 K; K4 G% z/ h7 F4 A+ `/ {6 @
continue;4 T6 n2 v/ L( ?4 [1 \
if(pItemElem->GetExtra() > 0)1 C' \' p: C) K
continue;* m- ]! s* v5 Y, k) _3 n; w. N5 M
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
( d8 d/ w! D. s) k/ } continue;
/ u7 M# b+ t% a# } if( g_pPlayer->IsUsing( pItemElem ) )0 p7 e- j1 X# I/ r. d
continue;) ~& n4 P" n& j" `3 ^& Q
if( pItemElem->IsUndestructable() == TRUE )
9 A; F1 z* \% b- e, E. B5 R& Z {) A* C2 \1 o8 J+ M' T; k1 r
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
2 v6 w7 n4 r6 Z+ T continue;
3 {* i8 b8 s0 z1 M' j/ n' ^ }
0 W/ M( g% g! v1 r g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
1 {; U6 e+ u& s7 l }1 ^8 a7 ~9 j& X* m2 [
break;8 m9 m6 m9 E, _
}$ ~9 Z" C1 g5 E) v1 z
case 1:
9 t4 ~' P- H# J6 L) B- m& P {
0 p- Y8 R5 f- ^2 A( e! Z //整理背包
+ {! O( r8 [( L# {6 H- F, Y, f0 c5 t //////////////////////////////////////////////////////////////////////////
, q( `; Q) o! k9 O7 B! j //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );. P6 y3 w" |+ A& E
//////////////////////////////////////////////////////////////////////////
7 h+ r1 w4 q* J2 k //////////////////////////////////////////////////////////////////////////
t! s! a3 D% T& ~& V6 A. C CInventorySort* pInvSort = new CInventorySort;7 x- j0 e) p) K# Q
vector <sItem> vItem;- B$ L. [$ k9 Z' d2 f/ t
vItem.resize(MAX_INVENTORY);//初始化大小; ~3 R& y/ t+ y5 x, \# ^9 Q. ^
//////////////////////////////////////////////////////////////////////////
! ?) ] C' S' I3 I //填充数据# ?9 n" q. N3 N
for (int i=0;i<MAX_INVENTORY;i++)* S; q" d7 \: P6 L) `# D
{2 l; d( S8 n/ \/ B1 D9 N
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);* _* w/ Y$ L$ D8 T4 p- b: Q) y/ S
if (!pItemElem)* f c6 W, a; J2 E0 B3 _; ]5 V
{4 y6 `. m# ^' l% K
vItem.dwKind2 = 0xffffffff;! G* ^% a1 ^( w0 a
vItem.dwItemId = 0xffffffff;
* L( f+ R z* s/ i& @) r5 d0 d vItem.nIndex = i;% j( t4 h6 x" h/ k: I+ ~9 i
}else {
4 O2 j7 }+ `2 Q. q ItemProp* pProp = pItemElem->GetProp();* B; E# b( z9 t( i* J8 Z0 M( u% {
vItem.dwKind2 = pProp->dwItemKind2;
. j/ p) n* l0 ]4 i4 ^6 U- m/ D vItem.dwItemId = pItemElem->m_dwItemId;
3 I! G3 J: T6 y vItem.nIndex = i;$ L6 [1 r& c3 z* A- _
}
7 e% m4 ?: s+ t1 j5 L //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
! I( [- ^( j$ D/ }4 `! i; G }) {1 X$ o: Q/ |
//////////////////////////////////////////////////////////////////////////
, ]: Q, q( h# t7 F$ F sort(vItem.begin(),vItem.end());//排序
. h8 T q0 h8 ]& K5 r1 }3 X //////////////////////////////////////////////////////////////////////////. u0 k2 ]6 H) @' K9 Y \) Y
//交换
: I( V( ~- k* g2 V% l for (size_t i=0;i<vItem.size();i++)# M$ Z( S N u$ ?% Q4 N' h: ^
{( C7 |/ i3 L! p3 z8 x
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);; V, H5 m; r# I' _) _
pInvSort->Add(vItem.nIndex);2 s! V+ b0 e* S3 U/ a
} [$ i6 u1 W) `# r/ \# ]. v" O" A
BYTE nDestPos = 0;
u/ w# `. u+ K for (int i=0;i<MAX_INVENTORY;i++)
8 l7 D; w. S( J4 i- R2 A {* c* }2 ^) L+ \, q% b
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);' W1 `/ Y1 q. p q5 Y' k) F' c
if (pItemElem)
- Q) H' p3 A6 w# |1 H {
+ c- I8 n# }+ h( Y- Y% w& e if (IsUsingItem(pItemElem))
- S3 J6 b& ~+ T, `' a: `4 r9 \ {* Z% z! m/ p# n! _, g2 G# m
//这个位置无法放" m: n. I3 I' N& F6 t( E
nDestPos++;
5 d2 D! U0 G; [: t0 c) N }
5 I0 e0 ^6 }) h }
, O, M% K+ x7 [ BYTE nSrc = pInvSort->GetItemSrc(i);
P* n1 T" i) {) ?3 l6 G pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
: ?9 A' p- ]6 L# E* v) X if (pItemElem)
" }; \4 \$ G' |6 x* f4 P: X {
! t) ]. z0 W4 d7 c3 ? if (IsUsingItem(pItemElem))& [* n5 Y8 o1 m* O( q& o
{
3 A) }8 y! K9 q5 A( S' H0 B) K$ C- S //这个道具无法移动,跳过. s. e& @; I/ e; z3 d) H% d
continue;( T, L& q! r; h4 G% C- b0 J
}
' h8 o$ _( d# |3 K0 S* F }else{
. G& v* d0 c/ j2 T5 c+ g6 K4 } //空位置 不用动
d, ?8 r0 @, @1 o5 N6 `" y continue;
" U/ N9 k0 a2 ^4 \& \0 C }5 ~7 A+ ?, G5 c
//////////////////////////////////////////////////////////////////////////2 f3 J3 x$ q( S) _ B# H0 h
//开始移动( B! _8 Y$ K7 s2 Z$ l
if (nSrc == nDestPos)
+ ]) u4 a; r, ^ {
# [+ Q* e- m, N //原地不动0 R* D6 C V9 h+ E( [ W$ u+ ?
nDestPos++;
\+ }5 B, M: @5 U0 Y/ R continue;: n: D- e5 J2 |, N
}4 z0 a4 l: |: C1 J
pInvSort->MoveItem(i,nDestPos);
% K0 t6 h& r5 A9 F( t' g g_DPlay.SendMoveItem(0,nSrc,nDestPos);7 `4 S T7 |7 r
Sleep(5);
. l% C0 @# `# ^( [7 o6 I: R1 { //Error("移动 - %d->%d",nSrc,nDestPos);
z$ x4 @6 y% t+ w$ T) f, K. Y L nDestPos++;
! S+ G, z' U4 G, Y2 ]$ A7 G }
, F) D! g2 W" E; D1 f* d! ] //取第一个元素的信息5 F9 m% ?( _* I- I1 k9 P
/*
# e V, B" \( s) C if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
3 }7 C3 }5 O8 S( i {! i* W) T9 Q) \- X8 h; d
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);7 e8 j- R, H- |0 x) R
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
, S% V6 ]# m, D3 B) ~ }& g+ V0 \. w6 u# D! @* W C4 T
*/
, }3 d7 ^, V* j H; [ //////////////////////////////////////////////////////////////////////////
9 S( _ a* C3 j" s7 F break;( v5 {; {0 c9 a& L# `
}$ v- i; i: C; W% |
} + H" J2 l2 {! z; o9 ?: t$ T7 }" p9 V
}; N: N/ Y1 G4 @3 ~
m_wndMenu.SetVisible(FALSE);2 p3 U# H, K# l. G
% A, j7 F6 ` N% x! q8 c' x
--------------------------------------------------------------------------------------------------------# h% E+ s. O. x0 R2 _/ q' y( g$ k
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)9 e) B' X" o* X& Y. _3 H, G0 v
{3 R+ J2 B: U5 {/ X/ Z% d `& i
BaseMouseCursor();8 @5 W3 @. Y- S3 F
}! k i6 n" A* G/ l" g
在其下添加:
+ n! A1 i6 v% a8 Y, F9 |+ p5 Rvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)9 E* L8 U1 U' Q* t0 S9 F
{0 d" o2 i0 t5 t$ k* r$ `7 A0 t/ k
m_wndMenu.DeleteAllMenu();. O/ L/ Y9 I$ _* _$ F* R
m_wndMenu.CreateMenu(this);7 Q/ F9 \& e, t6 z
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
8 v9 g, c) s/ P) T1 w2 x/ p( U0 U$ x/ d( J* {5 W! n
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
9 Y* o% _, [2 ?; J9 l' l{! @0 v( W9 e: F6 |- d
//P以上级别才可以删除所有道具
7 x/ C" s: E% e" L/ n1 j m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
& @2 a! y- E! ^* ^) @" |}- u/ L; p1 H, w" @9 t3 k# q/ [
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );! `# u( u7 E0 d2 A' i1 y
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
j4 }, F E& x, v; \' h" {m_wndMenu.SetFocus();4 a9 O. d; u1 ^1 M4 T
}
0 E5 R% Z+ I0 W& j3 R------------------------------------------------------------------------------------------------------------
. Q! p W; T( U************************* V- Y- ~7 |9 |; V8 b
WndField.h文件
2 p6 _6 ` s1 D( Q5 ?************************* ~9 C3 N ]! [; \8 ~* k
搜索:BOOL m_bReport;0 F1 F# g1 Q/ W6 P" N6 l9 M4 b
其后添加:
{+ v0 T- ~6 @8 j0 @- r0 lCWndMenu m_wndMenu;
( {0 ~1 v8 B' w/ ]' U7 Q搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);4 Z- T3 _# \+ }7 t9 C) U: u
其后添加:, v% {" v! p7 f/ {& X- T0 ~$ B
virtual void OnRButtonUp(UINT nFlags, CPoint point);
% X7 B' S7 l; O4 C" \0 q5 m, s4 v E; D
) b$ n9 a( D2 p# O. h% `0 \4 b |
|