|
|
源文件中_Interface文件夹下WndField.cpp文件
3 s; k7 O8 |4 C6 l8 J6 |. i0 K搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )7 X2 s, i- G4 K& v. ^5 z1 S& \
6 e" j3 J) k1 u$ Z' Cstruct sItem
) j# d5 t7 t" A$ Y+ L- g- |{
6 w& N: l5 C3 U+ E' P# k* U2 JDWORD dwId;
- o: e9 @2 |( n7 N2 P) k* RDWORD dwKind2;: Q. V. E' ?; o8 a
DWORD dwItemId;
: Q$ {! ]6 N. ~1 d% M0 ~! x5 BBYTE nIndex;! w0 N2 j* Y" ]& @
sItem(){# _+ _4 ^8 C' c9 ]9 M; j7 u
dwId = dwKind2 = dwItemId = nIndex = 0;: ~7 d# O9 a7 a1 o; C" a
}
# a' Z* X6 k f, xbool operator < (const sItem p2)9 Q4 i& m/ T( A. d. |; _
{3 p/ D ~7 a% S t) \
if (dwKind2 == p2.dwKind2)
7 w& I& T3 b8 U* h. t {) I0 x! o, z$ ?* Z& j
return dwItemId < p2.dwItemId;' i( f4 r/ X1 ?0 y* g- w
}else{1 u5 Z# j; N4 n3 [
return dwKind2 < p2.dwKind2;
. Y& N4 e: s8 [8 v }
& x. E. c/ g* s. W0 Z! u+ M3 H}
7 h# U7 b; M( k; o7 V9 L: e};3 x3 a3 n4 G; i* m6 r
class CInventorySort
* L4 `+ I. ~1 r. j) g{
9 P) P8 d' k2 V Q) O$ jpublic:4 v! y8 C: Y0 g) I
CInventorySort()
/ U! r& Y$ m: P1 M9 e{% r v# H* d# d) Y- k7 T) N: L
m_dwPos = 0;
& m9 C- s' L, p}
7 T1 ~& O# j+ b8 a# O. ?~CInventorySort(){}' H9 i. Y4 @/ c
private:
9 |. s. y' x3 s. N: ], vsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
0 ~! ?, g, l, u6 k3 gDWORD m_dwPos;
$ U9 ?+ ]3 N5 ?public:3 h; O4 S) Y# F; ]3 r8 G% B
void Add(BYTE nIndex)
; v+ A* w, b3 |9 k{
8 q8 i* x8 t1 {' m0 P' d- T$ f if (m_dwPos >= MAX_INVENTORY). n: W1 c1 i* \% S* w9 w9 d* g) ]9 Y- z
{' L* E+ k$ t% i) G' x
return;
$ i$ ~/ Z4 L% Y2 d, E9 @ }6 ]( A* u4 Q, H* o# p
m_Item[m_dwPos].nIndex = nIndex;' b' `( S. |& ^' p3 @. p
m_Item[m_dwPos].dwId = m_dwPos;. L9 @: h- i; v" T' Q" F) P( e5 l
m_dwPos++;
4 H; r2 M$ j* o5 w- E$ y8 y% |}
8 B; @: Q" z7 e5 ~7 _6 GBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列) Z2 I: h. h: f# Y
{8 k7 s$ F2 A! O$ h# }; ~0 a
for (int i=0;i<MAX_INVENTORY;i++)3 f' e; F4 [, R0 z
{
% f7 [! _) f5 E( u' p! J if (m_Item.dwId == dwId)
9 ?& U. v# ^ e" v4 F {
5 O7 h2 {) S! {$ C9 r1 a return m_Item.nIndex;
, R. j' t' u" d! e, K }
9 X) S, r- l' F! a# Q, @* ] }, ?/ A# p8 ~, i: E+ s
return 255;
; [9 P: E3 p* V/ _4 }. L}6 V4 Y% ~) Q$ y
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
* l$ v" Y. a$ I. o9 |- ]* m# Q{8 Y" w$ t5 U% i% z
BYTE nTmp = 0; r: ]3 g6 b( Q7 N% F# |
bool bDest = false,bSrc = false;
( A* M. E( ?: r for (int i=0;i<MAX_INVENTORY;i++)- |8 T, e, y4 E/ Y7 Y( s9 l, ~+ } c
{" `. ]6 E; [3 ^# d' m: j* E
if (dwSrcId == m_Item.dwId)
4 H5 M4 ]! O: N" i& b* `+ h. k {
) q: i( G8 j% q: S* Q3 c- _ //id相等 则 改变对应的dest和src, B1 |9 ^2 Q8 |) d% d
nTmp = m_Item.nIndex;
5 l) G# t5 ]6 [4 G0 b% K m_Item.nIndex = dest;
; l3 l% U% F p/ S5 s }6 x2 Q+ }7 [, m0 c0 |$ W
}7 _0 n5 c i K8 s& |3 o
//临时数据保存完毕,交换开始
6 c' P( ?1 N8 W& I for (int i=0;i<MAX_INVENTORY;i++)
1 F# }' p& z* z9 _) ]" n {+ W8 O9 h( f9 G# {5 l6 l
if (dest == m_Item.nIndex)( U. |7 K5 h1 u0 f
{5 g6 `$ _5 Y5 J: [7 M0 E& S$ W, q& L
//id相等 则 改变对应的dest和src- r& f: ^; m9 X7 W8 @. a$ f
m_Item.nIndex = nTmp;
4 S+ A8 N& ^) K" F, t3 W2 D }
4 C; A6 b7 O2 U+ T y }' N4 f" e/ L6 \: Z0 P9 v
}: i/ u4 v. a8 h
};
* y& {( z6 J0 b) b" a-------------------------------------------------------------------------; L7 l( Z7 D1 m* u* k( X
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
% N( q- _4 D6 W/ {; H; O搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase); ^: G" m5 u+ o- q+ T4 y
紧靠其上添加:
* p+ K! Q3 f% [, O3 M* p Kif( pWndBase == &m_wndMenu )
6 t# m: V; x U' y3 b2 H: M{1 H& y1 J( t, ]" `$ _
switch( nID )) n1 ` H" l+ S) K9 {" X5 H+ A! ~7 a
{! ~# C" m& v) }. i
case 2:1 d/ ?0 d" c: L
{
' [8 H+ ]4 Y- P3 ^ //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
! } n- k% N# }' B, {. C- v8 o4 e$ T if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))* |3 D- @3 b) l
{" v' _8 U, s0 A% \& U$ V
break;7 U5 ] a3 X8 M+ y: j5 ^4 h
}7 K2 W- u" z* X! R: K
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
4 m/ l/ C. C& }4 n- A {
9 `9 E, l7 c- _0 ~3 r) C CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
! |3 v. j7 y, [ if( !pItemElem )
3 i4 Q: X7 p1 L; P' x8 Y7 L continue;
7 N! |5 m r: p! c) T: i4 } if(pItemElem->GetExtra() > 0)
! j1 J5 Y7 R$ k4 u' a" ^6 v continue;
7 ?, s" t& V! Q* A T if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
$ m: s/ O" z+ W1 X continue;
; y7 t/ I# A# U" G1 l if( g_pPlayer->IsUsing( pItemElem ) )4 p& E4 _. P" d* i8 w K
continue;4 D# J$ n! ~6 m" R4 J
if( pItemElem->IsUndestructable() == TRUE )
5 |$ I! C# V# ^. d8 r) e {5 i7 a) t9 R+ L `5 `
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );! X$ ^* Y L, ^/ n4 b
continue;
% ]; d+ j; w( D% J0 [0 H* s }. {: x! d8 @7 @2 d- l2 z' m, o4 y! T
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);& i8 S$ ]! A, z( ]
}1 \4 X. `$ y! i8 Y# O7 v
break;
* f- A0 \6 g$ B: {$ t }
# r0 t) A! F/ e# z# Y6 l) t8 I. g' Z case 1:
. q5 Y1 b8 Q2 K& C% y {
* N) y6 e* e9 N //整理背包
: M3 C% F: N, i8 i7 _# v! M //////////////////////////////////////////////////////////////////////////
b# r4 F2 v: b //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );, p& u1 N, @2 S
//////////////////////////////////////////////////////////////////////////
5 R; p, _3 b8 W5 w4 T //////////////////////////////////////////////////////////////////////////5 J; {$ f8 E" z+ q& S
CInventorySort* pInvSort = new CInventorySort;# u, P$ `/ A- H0 r1 `$ S( V0 i
vector <sItem> vItem;
6 P9 ^5 L7 V2 e4 b' j vItem.resize(MAX_INVENTORY);//初始化大小
4 m, G) y# D! v2 ^/ u6 D+ K //////////////////////////////////////////////////////////////////////////0 Z+ O( O; e$ Q. ]- Q7 H
//填充数据$ ]4 S5 q, z( G/ z5 k' G# l+ g1 }0 g
for (int i=0;i<MAX_INVENTORY;i++)
$ _3 r; ^- u1 ]5 a$ B {
! P5 U- M% C" D CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
! A w# P+ f+ V R, @% ` if (!pItemElem)
' W3 m3 C. f. M% V {
+ y+ R$ Z( D& j# `0 w vItem.dwKind2 = 0xffffffff;* r: p( b) A% x
vItem.dwItemId = 0xffffffff;
4 n6 d0 ~$ Z0 b8 F+ | vItem.nIndex = i;: T" U+ h4 K; y3 i* p. Y! M
}else {
* K. R+ u6 Z& F6 M) s8 } q6 Z ItemProp* pProp = pItemElem->GetProp();
, Y5 n3 b' G+ ~7 ]1 H vItem.dwKind2 = pProp->dwItemKind2;5 n% B2 J, \4 E9 b. k) K) B1 d
vItem.dwItemId = pItemElem->m_dwItemId;* n9 _3 r5 x* J0 ~* x Y+ Z' ?
vItem.nIndex = i;
2 @" S; z; M% s- m0 c0 Y: e$ t }
Q) ^+ g) \; \9 \. L' z //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
K4 S9 a& `& a, O/ }' c }
' d+ r Z, W6 }) o2 g3 Z //////////////////////////////////////////////////////////////////////////
) I3 H: D0 z7 g) C/ g" l sort(vItem.begin(),vItem.end());//排序
% K8 k& N' L/ U+ e# x# p //////////////////////////////////////////////////////////////////////////
5 o% W& @ s3 H //交换1 g6 T; V9 N9 s8 D, n
for (size_t i=0;i<vItem.size();i++)
/ M7 g: g& T5 N T {
2 B2 R6 Z9 d7 L) a3 n* x/ _$ [! u //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);* C* M- F8 w1 z! k. L4 R- S+ T
pInvSort->Add(vItem.nIndex);
# c: Q9 _0 [& W3 q0 R' e }
* h0 Y; Q# d; Y& b BYTE nDestPos = 0;
) @- L% a H) C* g* C) P2 P for (int i=0;i<MAX_INVENTORY;i++): |- K0 D/ u# C1 k' x
{
?; H- K, f |& f6 s4 s) C CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
$ W( l1 i% w; y. H if (pItemElem)
( l. U9 n2 V$ C* x4 G( k' P {" `3 s" s( ~2 q& F) L
if (IsUsingItem(pItemElem))
3 @; p! s. O7 `8 h% f2 f2 V {
$ ~7 X; \1 f: x/ ]+ h //这个位置无法放4 j) e; o. a( Z
nDestPos++;
& X# g: `, p* f2 [" g' s }: U( A3 w. @; z8 _
}. X$ t& x2 T' N; C
BYTE nSrc = pInvSort->GetItemSrc(i);
6 A* H( {$ y( X2 a pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
1 W4 K" ]% ]# Z if (pItemElem)
; R2 w& I3 \/ W5 _# A {1 \' F+ ?$ x9 x" D% N0 Z3 l
if (IsUsingItem(pItemElem))
- D# r' F& k; \! m# k, p {5 L& u1 v* y/ |- s- x, @
//这个道具无法移动,跳过8 k" X, V6 |$ x# G( I
continue;4 @2 N$ f1 ~+ T' z+ I4 q. \
}
; Z" |% y0 _) ?* u }else{
/ i, d0 [6 d- K //空位置 不用动
K0 y$ H9 X8 a' Q0 T* H continue;3 V8 [4 o- W7 G8 R
}
% f# X5 Y; B4 v* W! z9 c //////////////////////////////////////////////////////////////////////////) \: ?, M- Q& V2 V
//开始移动
4 F8 M9 e% P {8 S1 C; ?- C/ U+ O9 ] if (nSrc == nDestPos)
' \9 a" w' L2 ]! j8 b1 h0 ? {0 H6 I0 z$ E& v, K! Z4 \( _7 j: j
//原地不动
# _+ ?8 | T, k/ B6 H5 t3 q/ I' P& V0 S nDestPos++;2 y! `+ _6 L3 J/ _
continue;6 y: \$ s5 P( y0 W
}: Z2 L% g1 y3 q+ q0 F$ M5 o
pInvSort->MoveItem(i,nDestPos);
: c9 F. H& L( K; Z! f1 M) s g_DPlay.SendMoveItem(0,nSrc,nDestPos);' g- S9 |! m8 X. ?* ]# e. M
Sleep(5);
( r4 ~; B; ~! k, }) V0 Y \/ l //Error("移动 - %d->%d",nSrc,nDestPos);
( [- O3 Z0 b. N" {+ T3 \% K nDestPos++;
. u7 E& ]+ @3 l3 U9 P, u }( q* v2 Q) \/ ]: j6 ^9 j" t
//取第一个元素的信息0 {) V$ w8 \; Z- R9 l
/*
; K( { H; Y6 Y' g- f8 { if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
+ ]' d5 u. V( ?5 D" N {: e* Y. F/ u; B# f/ v) B
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
3 N, p, u- s5 n, Y& P g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
% a8 i: S/ J7 O' q( t& V$ C3 d }4 C8 U8 ^9 ]& M) h) }; [7 n( s8 O
*/
2 I; X& {# \% a4 O& \ //////////////////////////////////////////////////////////////////////////
& Z: P ` l6 B" I break;
) ^& l; S; M! w/ i& W) t+ C3 M, B }8 R* \: [4 u; {2 w# L' H6 ^
} , L3 _$ r0 l2 K0 z4 v I
}* F& G: e) v# l) l0 j
m_wndMenu.SetVisible(FALSE);
3 P2 X) b* h- f! Z: D9 x( V
, o* i9 T% I6 u B, ?# `1 B--------------------------------------------------------------------------------------------------------8 C9 H |; T' ^0 E+ p% b
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point): Y( E2 E# ? d/ w7 u! c, T
{# |' I! l) @2 s" m; Y+ f% T' z
BaseMouseCursor();9 Y1 e. R5 _) U9 `, n2 w1 w
}
6 @& R, L, H, U5 u) I) a1 ?在其下添加:$ Q ]/ ~. p% {* a5 b, @8 Q0 G
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)( y7 z( D1 N7 u4 g! a1 b& @
{
( E: \0 f, c2 F" E: J$ U& J" Qm_wndMenu.DeleteAllMenu();4 I: F5 _( `; C0 k9 \/ |$ k* b. G" r
m_wndMenu.CreateMenu(this);% [, k7 [" ]+ F, G4 N. d/ {9 f
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
I4 x E4 U& f+ |# H, y2 c e5 _8 n3 r
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))2 a* r5 m$ E3 _7 J# Q
{
2 o* B, D$ | J ` //P以上级别才可以删除所有道具
7 w$ j0 }8 _- l m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
' s. [* c4 T( b6 h& Y. E2 y}
4 K4 `8 e% D% B+ rm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point ); l+ h; q* Q% n% Q( E
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
1 j) f7 K* i+ P6 y1 S0 F+ b5 h9 V# B) tm_wndMenu.SetFocus();
9 {1 E4 N# ~+ {9 K}; ^, v1 R* Z! N- }3 ?6 t
------------------------------------------------------------------------------------------------------------
2 f0 i$ r) g$ Z0 M* ^' q! D" U# U*************************& N3 ]( g7 ^; A& G/ E& D! t1 M# i/ j
WndField.h文件
+ M+ }2 \$ X. a- @8 M, ^5 o*************************$ V4 F0 C. A) `- u) I
搜索:BOOL m_bReport;
: A; i( M# ]: [: W6 V其后添加:5 {9 K( u4 h2 Z- K$ `$ q
CWndMenu m_wndMenu;
; c( }0 r$ _' [( T/ P" R( e搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
- o& U5 f" |9 Z1 r其后添加:
4 `% m8 g p) @% S; e: ~virtual void OnRButtonUp(UINT nFlags, CPoint point);8 c3 D: x! z$ Q
' J# V- K. z/ `7 m
; z( w7 f8 y: I$ ~) V* j |
|