|
|
源文件中_Interface文件夹下WndField.cpp文件
; ^ O/ _: L" w4 P) H Z# _) l3 u搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
0 F7 m1 E' `# {2 L7 ]( Z, e' H' q1 Q1 x$ _, L
struct sItem% t; n" ]$ O9 {% F7 s
{9 J7 ^! Y; p3 T$ B! }
DWORD dwId;+ J% p" }% E" F, J9 \9 Y" |
DWORD dwKind2;, n- J6 ?( B, B% M; Y8 }' G$ G
DWORD dwItemId; e) X3 [% E+ Z7 j( `" m% j$ N
BYTE nIndex;
2 u5 l6 D7 J( B" ~% T" ksItem(){$ b/ H; i7 h% G* v2 e
dwId = dwKind2 = dwItemId = nIndex = 0;
0 R) W% G# e. r# R}
1 `( G2 y9 v! @bool operator < (const sItem p2)
r1 C. A" A* e; M( `{3 C6 Z. u) s) ^4 I0 g& `! k
if (dwKind2 == p2.dwKind2)
5 U2 ^- V5 `) }: M$ w {
^; S& Q& J ^6 q return dwItemId < p2.dwItemId; h) _& J* d% c* X, Q0 l
}else{9 }- U6 Q' e/ Z
return dwKind2 < p2.dwKind2;4 u1 q% r2 b# _9 C( d6 J" ~
}* _' L6 c# p( e5 X! C
}* S' s( a' s7 q- ?% K# [
};9 _ J- N0 f% }1 Y: o2 u9 V; D
class CInventorySort
2 U( x% r7 j9 }, }& j: p{( ~6 R* D: V) k$ E7 r) y
public:
4 g0 e; ?8 {+ d5 q& ~CInventorySort()
+ b* B1 A" z9 f: a, b0 s9 w$ h{
6 h) q% z# p! W! `' r2 q m_dwPos = 0;) @' Z- l0 y6 m; T$ l" r
}' S& T6 H/ _/ a, m; i4 B$ F
~CInventorySort(){}
8 h( H% a' L- h6 u' c0 sprivate:) s" H5 c& s" Z# p! H+ w" X
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
/ [( l- }+ E6 DDWORD m_dwPos;
! K% K* ?7 Q5 vpublic:
Q' _2 @# Y6 `8 p- N. k* j7 ^void Add(BYTE nIndex)' f) J' D* p, q! T0 m: ^
{# V# b$ z; O) \( a
if (m_dwPos >= MAX_INVENTORY)) p8 G. i3 i) Y" c. u C: g
{
7 q N2 o, m. {3 x5 F* i0 s8 t1 V return;8 |/ E, k {$ [; m; r
}
+ g0 x; Z$ X; z7 l m_Item[m_dwPos].nIndex = nIndex;( k9 H7 d" T) W' Y( C* Y0 U
m_Item[m_dwPos].dwId = m_dwPos;& Q, P5 I! E" ~6 _
m_dwPos++;9 h. S) Z6 J' u2 t& ?8 D9 i' I
}+ O2 o. j2 D8 b. u; Q
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
. M# r+ g5 i- F' N7 g8 C# X1 C{
: l; q- P+ Z% p4 c% H for (int i=0;i<MAX_INVENTORY;i++)6 t4 C" G# z% F8 x$ R# _
{" N, a, H0 O9 f+ w+ f$ w |
if (m_Item.dwId == dwId)
4 P v1 P0 ]" U6 s5 K& X {+ z" z7 P# J1 j0 i6 ]0 Q9 c
return m_Item.nIndex;/ I8 d( R6 a' ]4 @6 X) K( }
}
2 g% S# X& n" i8 E3 N }' l3 f7 w0 N; @/ |0 F+ {! f$ l* L
return 255;
$ d8 g! h v$ E0 }+ h6 R G* t}; k/ G _. t" L7 I) B, G3 b6 P2 C
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置' E1 y8 P0 t% V
{* R4 Z7 C0 K& [+ j1 k3 Z" C
BYTE nTmp = 0;0 a9 g" ?+ w# c o9 N) }! Q. g% t
bool bDest = false,bSrc = false;( ]) q2 Z7 A* B+ o
for (int i=0;i<MAX_INVENTORY;i++)
3 }/ t# J" f9 ?1 s9 R# ` {4 L/ n; ?6 d4 d0 T- q
if (dwSrcId == m_Item.dwId)
& L3 q( b) {0 _% @8 `, s {
2 a: l# S: b, ~3 S3 W" f //id相等 则 改变对应的dest和src
7 x' F5 B, H+ l' d t# e8 { nTmp = m_Item.nIndex;' Y8 C. C4 j Z# _1 z. H
m_Item.nIndex = dest;! H1 L* C6 f, Q# `) W1 ~
}
- P( @8 j. h) E7 A/ S }
T9 S* I$ t# O# e9 S" Q4 p- W //临时数据保存完毕,交换开始4 y# ?$ [' m$ W4 M8 ~
for (int i=0;i<MAX_INVENTORY;i++)6 |! ^3 L5 s o* n7 a# D- u
{
) `- C: U; [) x/ e) c/ x! q if (dest == m_Item.nIndex), ]1 |+ x5 D# `1 k7 D
{' W& ^, ^' W4 { ?
//id相等 则 改变对应的dest和src( w, |8 ^$ b' d
m_Item.nIndex = nTmp;
" z, l! I* A+ A0 }6 q# O2 m }5 |; U& O% S; B6 f0 G) `
}
9 K/ O( k. b) X" u}
# |4 y! S) r* `& V J) v# h}; T1 _* N5 i) {+ f
-------------------------------------------------------------------------" U2 C7 v$ m Z% J$ h* p, q
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ), F p; J# M- w! A4 a$ O+ j) `# D% G, I
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);3 T9 K! W9 K! W& Y" w& r' p7 {( G% Z( u
紧靠其上添加:; s- E$ a) I5 \
if( pWndBase == &m_wndMenu )1 t A7 f8 y1 d7 a& v" L" Y
{
* w" t+ d- W& M4 h! ]6 ^6 R" L switch( nID )' f% z# w/ Y7 r! G! u: s" j4 i2 s
{
5 S: U% U* h$ n% l, G3 K case 2:
/ `0 O1 V6 f/ ^# F- E+ t" U {0 K, b( W3 p q8 V$ c/ p
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);2 @: i: n# i4 o$ c' o% }% n* O
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)) B1 `9 v& ?2 S( `2 e
{9 P# Y" P: ^" j4 _# t- [) R
break;
% L% N7 f8 g; u$ ~ }$ W& g! V# F$ i) j) g: [: T, f% ^
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)2 l/ z# G) l* A1 x% M
{3 f0 \- [# M# @
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);& |6 Q/ |* z6 u" Q; v) v
if( !pItemElem )
2 V [$ l) a4 [5 N5 } continue;
- @: V6 J- J" p1 E2 E2 I if(pItemElem->GetExtra() > 0)5 p& E+ [) u) H0 J6 b
continue;* _: n+ k, t1 ]( s
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
* `9 c U. @0 c0 `- Z5 s# X continue;
* H! H, P, d, S1 I" f if( g_pPlayer->IsUsing( pItemElem ) )
* e# l$ m G) S3 m continue;
) Y; j5 M/ @) x+ k; p if( pItemElem->IsUndestructable() == TRUE )! P% @, N5 R6 x6 G' M
{- {; Y9 J5 P+ R7 _
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
( S2 c& x$ R l) N6 C continue;6 C& h! B" I( n# G0 G
}1 U& c" y, d' U& i2 _
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
3 u6 e7 Y+ ^3 e* G. p }
1 G) }; x5 o7 O2 z break;
6 q0 B% x9 Y5 G" i5 `/ v! @5 v) } }
: ]8 j- u+ h% P# F8 V- p8 E case 1:+ u. Y2 I; p0 h" X4 L
{
* i; L" I! u( ]' Z, g; a, z6 u9 Y //整理背包1 c; o( Q+ H" t
//////////////////////////////////////////////////////////////////////////; w9 u# @4 n) `* Z9 [( p
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
3 A4 E8 v# n2 M, e# @8 r //////////////////////////////////////////////////////////////////////////
+ Z, Q8 K1 R; A% Y- y- j" l% C6 l //////////////////////////////////////////////////////////////////////////
9 a) k4 w- C. I! L, q# \8 u4 Z6 P CInventorySort* pInvSort = new CInventorySort;
' i# k4 k, ^! x% n C vector <sItem> vItem;
0 ?/ y `; H Z; r vItem.resize(MAX_INVENTORY);//初始化大小8 n; A& l5 Q8 g F/ E
//////////////////////////////////////////////////////////////////////////- |+ ?- K9 J' o% Q. C9 ^
//填充数据& [: D$ P% T7 q/ `; n6 t9 \
for (int i=0;i<MAX_INVENTORY;i++)
# `& s! y4 x# R7 h- d5 |$ q {
0 t) K) B& A) V$ X. x CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
1 ?. @- N# w- n8 s2 e if (!pItemElem) Q3 K) H5 p6 W" V7 Y( Z- q
{
3 y6 x& `7 T, ~ vItem.dwKind2 = 0xffffffff;
/ ^7 d' B$ A* m4 Z* i4 Y, h! s vItem.dwItemId = 0xffffffff;( S" Y6 r2 X% ^; d
vItem.nIndex = i;5 b7 N; u/ Q5 H+ @# j+ \/ b
}else {/ \' a7 r) X; D0 [. Y, x
ItemProp* pProp = pItemElem->GetProp();
7 E& \, T! F% z3 r vItem.dwKind2 = pProp->dwItemKind2;
- Z7 [* l- Q3 L/ V vItem.dwItemId = pItemElem->m_dwItemId;' t7 ]7 ~7 ?$ h: u1 j& s' f3 \
vItem.nIndex = i;6 R9 J0 L9 V3 Q2 \
}9 o6 l# X+ Z/ G0 X
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);3 s1 P* b2 w9 g: `. N# N" J: I- l! f
}& ?$ v5 t4 O5 w& k i5 W# u
//////////////////////////////////////////////////////////////////////////
( r; c- |7 z% q1 M9 n u sort(vItem.begin(),vItem.end());//排序
/ I8 N; {% H1 K" i0 ~8 F //////////////////////////////////////////////////////////////////////////: p0 X2 e+ Q/ A3 k/ `- x
//交换" w1 A# t/ p X( s( j
for (size_t i=0;i<vItem.size();i++)$ L: O; f5 F2 n7 s, e' |0 B' R& m
{1 l3 A; U& e- J$ J
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
6 M! p9 P9 B) `0 v% C% Y6 n( F( ?; J pInvSort->Add(vItem.nIndex);
( V# h0 W1 |0 E1 l! T/ p7 m3 X }
& B, Y( A' T, a8 Q- b% e) ^! a5 ? BYTE nDestPos = 0;! J* V4 Q I# J' O! M
for (int i=0;i<MAX_INVENTORY;i++)4 s) {+ d7 I% c7 U
{" [* B) g4 t4 v0 J; H
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
! S9 I- [/ b" ?, n if (pItemElem)3 j8 O. c" l4 b# J/ F
{
# T7 W; ~' T9 R5 h' U9 d y if (IsUsingItem(pItemElem))3 w* R) X4 O/ l" Y- g B: Y
{
7 C3 J7 ^$ Y9 d/ `0 S7 k //这个位置无法放+ U g6 w. C8 v2 r9 s
nDestPos++;
6 ]8 j/ | Q2 i2 Q! w }% C6 H5 ~. [+ ]0 X ~
}, B- z# l) Q, p; Z7 t
BYTE nSrc = pInvSort->GetItemSrc(i);
% {. i7 c; F7 W5 ]2 h: s pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
1 @- X2 v+ T A1 {0 |6 S if (pItemElem)) w! w% Q5 |/ D4 H' o1 t4 U, i9 y
{
6 `/ {: }, y3 ? J if (IsUsingItem(pItemElem))
9 [0 ~: s5 e9 ?. ^ {
3 p4 l! T/ ?9 h7 G3 O* G //这个道具无法移动,跳过$ S' Z" `+ U6 ~4 ~
continue;
i0 P8 |/ W: P# a4 ?. Q- n }% Y, s( U# ~/ Q5 x! f$ F
}else{0 z; l) k5 n: k7 q- _
//空位置 不用动 w" r; j; {; p+ {8 m! h+ K2 m+ s
continue;" f |4 T t2 k0 x" N% N B0 E& G
}! p8 E- s9 R- J. ]3 @
/////////////////////////////////////////////////////////////////////////// ]2 |3 {. J3 n; m4 k
//开始移动+ B* I3 A: [9 w
if (nSrc == nDestPos)
& E" B. g4 q2 Z% ]6 R3 S- x {9 P& Q. K" |( n5 y8 w0 W s
//原地不动1 {4 c! e& x- d& W2 l1 o- R% w2 m: K& P
nDestPos++;
G4 [% r3 \/ J/ D continue;. s0 h o! A9 K3 C
}, r8 A* |1 D9 U0 ]4 m( D7 k3 ]5 @
pInvSort->MoveItem(i,nDestPos);
: m/ d: t, p0 {0 \( q" W g_DPlay.SendMoveItem(0,nSrc,nDestPos);4 o( b/ p4 W$ d6 X5 l
Sleep(5);# R. u6 n! i# k! e! ^
//Error("移动 - %d->%d",nSrc,nDestPos);! v# n; p3 Y. T: M' s; O* Y
nDestPos++;
% v6 i9 S+ X1 Z% A }" r7 j4 p: z. v! h
//取第一个元素的信息2 B; g' \! o$ {0 Z7 S. ^
/*
, }. _0 o0 Z' a+ S% S if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
. |0 x& f9 H- ?/ {1 g {; T7 N {, \" d8 O% y2 v- `" l9 Y) r
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
* L* H; ?, |7 j1 ^ g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
- v) Y( i: F9 u% n* | } Y5 e; i& A% p2 G3 A
*/0 |4 t8 v2 l5 {3 S/ B, Z
//////////////////////////////////////////////////////////////////////////. d/ p$ g1 i$ m3 Q- L, x7 Z
break;
. D" T/ Q- j$ R }
/ p5 ~( g B4 C0 H9 h } * w7 v9 F# b' L
}8 B. I- D+ g) [/ F8 T; ]4 l
m_wndMenu.SetVisible(FALSE);
' U/ U# C' `2 M( \% m* X8 @. v) k1 P1 ~7 U# ]
--------------------------------------------------------------------------------------------------------
( D( k/ \. F* u& X A; b( W搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
1 p3 O) l( B+ _7 W{5 x% X4 G8 K- O* v4 T! |
BaseMouseCursor();
8 w X! C# T8 z6 r* @}# g! y) n0 V4 \ Z
在其下添加:
2 l ]+ b3 [/ X) |) evoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
6 P6 @7 u* Y) F" J{
+ k; n- X9 U# cm_wndMenu.DeleteAllMenu();3 V( Z7 w3 l9 @. U2 X, E8 I
m_wndMenu.CreateMenu(this);& s7 F' P. @. ]: B; A/ e
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
4 j" V8 g. ]* l1 \: _# Z1 {
T- U( ^3 ]* D. |* n1 Q2 G+ aif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
' E2 G+ r" ?! Q$ {2 i{' [7 M0 ?- i i8 N( ]7 x8 d
//P以上级别才可以删除所有道具
6 \% u/ j" c, a, o/ g* w4 i m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
: c" d5 U* b4 r}. `4 k/ G' ?- z# o# H% X
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
( k: ?4 O1 u8 P+ b: F# ~m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );: w5 J: h- Y0 Q! q! H' l
m_wndMenu.SetFocus();$ c l7 T4 r3 N/ U
}' \" q2 e! l8 C* Y1 O' `# c
------------------------------------------------------------------------------------------------------------
2 v! C# h6 d" E) {4 f; Z*************************
) ?) I- G0 D& y6 H: G$ ?3 Y$ d1 ]WndField.h文件
, v v' \" G- l5 w. b3 K4 d4 Q*************************" u7 a3 M* F* A- J
搜索:BOOL m_bReport;0 F4 j7 ~2 l, j
其后添加:" e" Q6 `5 d4 J9 S' V
CWndMenu m_wndMenu;4 O7 q1 m9 M( ]
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);5 q0 B. j7 _, K" Q. N
其后添加:0 @9 W9 G, u5 x$ [7 Q, i& U$ F
virtual void OnRButtonUp(UINT nFlags, CPoint point);
+ j* H& U2 [- s6 r/ s7 g q) M( q3 J6 V+ |$ @) Z: |$ ~
$ S, H% l2 f7 n3 ^) N$ M; ^ |
|