|
|
源文件中_Interface文件夹下WndField.cpp文件
; E$ I4 i: r- K搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )9 x: ~- G: q N2 ]: v7 ?5 c
4 w4 q" y0 G9 @% N$ ~& |
struct sItem* A) `: M o7 W4 ^ f
{
* t* ~' z J& u+ @: h" V |DWORD dwId;; C: D. A; R3 Z, r
DWORD dwKind2;
( Y# P$ d# z0 X rDWORD dwItemId;* J5 I' ] ]. J1 @; U. _, S% V
BYTE nIndex;
; n& C3 g6 F# |: {3 q# L+ ksItem(){
. P& `3 G, E2 A dwId = dwKind2 = dwItemId = nIndex = 0;
6 S) h: t4 I$ V. _}
t9 ]% `: i& ~4 @6 a! u, j' obool operator < (const sItem p2)/ B' G0 s. w" r! Y. p
{
5 c; Z) n. s( Y' p' M if (dwKind2 == p2.dwKind2)8 C# K( P" r- w% d- u
{$ N$ q; R7 ]: B
return dwItemId < p2.dwItemId;
+ P* V, {( n& k* ?& F2 p }else{: Q1 v' T) ]& Q: e) f
return dwKind2 < p2.dwKind2;$ F2 U0 Y; e _# B, B% i! p+ r( Y
}
$ _& T* R* [1 v3 j}
7 R" e; n' P. h6 @+ t5 H% _! V2 u};4 b1 w/ j- ], O/ M6 i; ]
class CInventorySort, f9 u4 U- @2 I/ m$ @ O4 I
{
' F/ Y! m7 z; P. w1 X: |% w; S) fpublic:
. D s; e+ W) GCInventorySort()
' Z- @3 L7 t: Y R+ L( A6 ~{9 x$ r( J: z' {( l/ E ]3 S
m_dwPos = 0;
' x4 v5 Z5 A/ g* N8 D}
5 L" w$ n' j7 F U# W~CInventorySort(){}4 H. X4 I" H& J1 J3 ~
private:0 h2 e2 `1 r2 q
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息6 r1 x1 `# i; }0 U2 r
DWORD m_dwPos;
; |# T" N _* i3 f8 x1 j3 y) ]public:/ w7 E8 g# b* m) }6 |+ ?
void Add(BYTE nIndex)
# }* T1 B" l' K) B+ Y{
% a7 S" x# O: k2 f if (m_dwPos >= MAX_INVENTORY); a" ]2 W/ `% N+ I! P; [
{
/ e7 Y" D% b% h* `8 n return;, s+ B! I0 ?0 Z q% j. w) L) y
}
1 U5 g5 {2 b ]; S m_Item[m_dwPos].nIndex = nIndex;1 Q0 B+ Y A) C3 q) w* u% c8 Z/ a
m_Item[m_dwPos].dwId = m_dwPos;4 q% d( T6 f& ?
m_dwPos++;: D8 i( M4 N3 Q0 V" g b! h
}
$ e+ e- k9 h2 M! G4 [BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
5 g2 |) q- }4 y, N& H- |% F& j6 {{ D1 I& [$ P# S2 v# _, [
for (int i=0;i<MAX_INVENTORY;i++)
/ R; J, Q' l& T( Y2 J1 M" s {
. _; L" y7 Z+ `- J if (m_Item.dwId == dwId)
( ^2 U' P* s! E. M {
$ h; Z9 n* x% J9 A2 U' ?* W; U2 l return m_Item.nIndex;) V7 S" I' n% c& R# [+ R$ M# A) P
}
8 ~1 I' \6 O- ?3 ]/ M( ], [ }
" ], J& U9 u& \& d: B. Y' K4 s- g+ G return 255;
1 i# W7 x1 c1 n4 S7 _0 a/ M, r }}2 H9 a% }8 U( _# H+ h
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
' s0 O, A2 Q% J' ]1 A, o0 s{: y1 U1 B/ P! G. \( F' d5 h
BYTE nTmp = 0;
* d1 x5 e' o8 A7 [( C: ` bool bDest = false,bSrc = false;5 r7 |: Q) ]: p* v" B: H( f
for (int i=0;i<MAX_INVENTORY;i++)
\$ J( d' q& {2 X" O& } {
8 U/ U1 |# D; y: e. y( w9 o2 \ if (dwSrcId == m_Item.dwId)& {( g2 ~, H E, n: ^$ |: O8 T
{: `$ n' t( o. [# L! a: `! C5 d
//id相等 则 改变对应的dest和src
! c1 ]0 {& _4 k: L6 | nTmp = m_Item.nIndex;
; M; _. g, b3 I( { m_Item.nIndex = dest;, g" Y* N; N# F6 ^2 q
}
9 [; r* P9 h& f1 K' |- J- c7 _ }
. T# u, n+ i0 G1 R' K, q1 [ //临时数据保存完毕,交换开始
! H( h8 E0 I: ^( X/ g for (int i=0;i<MAX_INVENTORY;i++)4 O5 P: q2 ?- V7 S1 @" Z
{
3 D. `& X& q h if (dest == m_Item.nIndex)! Q! ?0 _# u* t6 T# f! @
{4 q3 G8 k) C, W6 S
//id相等 则 改变对应的dest和src+ G' v& f' F2 w4 e. y
m_Item.nIndex = nTmp;
. \' y% y& A& @* |4 S" K. d4 A }
" T8 V, ^$ h7 o) m }+ u5 ~( _+ ?* o# f% r& L
}5 |! E% D# F% X! }/ P
};# M. X5 P' p1 Q# @) l) w8 M
-------------------------------------------------------------------------7 R8 x( \) j2 H7 t2 N
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
2 J4 T p& A2 [9 Q1 ^( i& k1 B1 L W搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);; v, v6 |% @; A( i5 Y
紧靠其上添加:# @% F; _4 j! x) H7 k2 j8 T1 h
if( pWndBase == &m_wndMenu ) t3 \# i. F$ J7 p) F. V
{
& l3 E) S+ e; p, u1 E switch( nID )
5 E( F5 W; Z9 X9 t2 L {
* z# n; R6 D/ H- S6 H case 2:
8 T* w7 b0 n9 H; w q {
& P# o6 r) K) T0 g S //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);8 i9 s& y9 R1 ^; i4 t
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
; j( |$ G: E/ V o0 G1 l {
! u7 L. L. ], _4 C& J# c break;! N) Q' @9 ^" X0 B; w
}
) g# b5 V! t( X0 m for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
& I. O" l, D( m$ `& x {
5 f5 A9 S. }4 i% a CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);" C1 d! g9 O" _: H% j- I
if( !pItemElem )
7 s' \+ P2 T% Z4 w8 c continue;
/ M5 s8 u( Q6 d0 Z1 Q L7 f if(pItemElem->GetExtra() > 0)
( l5 ?/ \( R4 |7 L6 Y- H continue;
/ A- N/ K1 [" y7 _( N if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
* [5 F1 I* `( t' d/ J/ s continue;9 X9 a) H' k3 | l z
if( g_pPlayer->IsUsing( pItemElem ) )0 A1 A7 k2 n; |0 h
continue;" z! I& X# j9 Q# F
if( pItemElem->IsUndestructable() == TRUE )2 m; ~9 `* s7 K! l# T8 v5 }
{# s$ j9 B4 `& H
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );3 H c9 L4 b+ D% C
continue;
/ L" U" H4 ? D4 [% F/ g }
7 ~2 J3 p' U7 H B g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
3 O6 ?' J1 J/ |$ S0 Z2 ` }
! ^( s+ {' o( O% x8 L2 A! m break;+ @, t9 S3 p/ W6 L8 S5 a. J
}
, d3 z% ~: f$ L case 1:$ e3 v( u+ d; A9 A
{9 g4 |7 v5 B2 f/ t. o! n0 x- b; y7 L1 f
//整理背包- L/ u2 @* ]; |' o5 r& v! ~) |
//////////////////////////////////////////////////////////////////////////
. M4 W3 Y5 U6 W' Z/ z% |# y //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );) ^5 H) s, p7 k, K& K, ], ?+ L
//////////////////////////////////////////////////////////////////////////1 S1 m* t# D# B3 B" y0 k2 I3 j$ {
//////////////////////////////////////////////////////////////////////////# U- g. k4 m. T7 w* M: n- u
CInventorySort* pInvSort = new CInventorySort;2 g. p' o" s4 J8 a3 }4 M7 e
vector <sItem> vItem;
. c/ W8 v, M2 g% X: ^) T vItem.resize(MAX_INVENTORY);//初始化大小
" `, I- Y- |, |. t: C //////////////////////////////////////////////////////////////////////////- Z* ?) h7 a, {+ `* V2 G
//填充数据: r I# a; z8 g+ P5 n; x( s$ ^
for (int i=0;i<MAX_INVENTORY;i++)) t u, B+ J7 {7 _5 K6 ^1 r8 _( o
{# I( u4 R- m! Y2 Y* ?, h, Q1 i, l
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i); a' Y0 J U- |/ }
if (!pItemElem)
$ p j; \4 k5 v3 E% W, G {$ g3 L# [5 c5 j5 G' n
vItem.dwKind2 = 0xffffffff;$ R% z( a5 ]" W
vItem.dwItemId = 0xffffffff;; Q& P$ m! q' {* G' r; ?
vItem.nIndex = i;- b( N) q# e8 A9 B U; U
}else {
& k c* k6 p9 f9 I6 R/ t0 P$ I ItemProp* pProp = pItemElem->GetProp();
8 p; ]8 ~2 v) p vItem.dwKind2 = pProp->dwItemKind2;9 I/ W. m3 d4 Q( o/ o* y& ~
vItem.dwItemId = pItemElem->m_dwItemId;# P$ [ o8 x' a# N7 p9 c
vItem.nIndex = i;
# s2 Y# e+ I- a+ Q6 y8 ` }' s k8 Z, i: C- q6 R) L# R" S
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);, Y8 Z ^5 B% _- M8 W2 ^
}% I6 ~. w4 |+ `
//////////////////////////////////////////////////////////////////////////
$ a" \2 D" i/ `, F9 b5 g sort(vItem.begin(),vItem.end());//排序
$ s3 `/ C& }; U2 D //////////////////////////////////////////////////////////////////////////
8 t9 y8 b1 `5 }3 a //交换* K9 d7 s3 \1 W5 k% |/ P& P7 H4 h
for (size_t i=0;i<vItem.size();i++)0 I: H9 B( K+ R1 N
{. } v4 C I T9 C4 F5 T' t
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
; l5 H) o$ P) b1 ` @, f" R pInvSort->Add(vItem.nIndex);2 y; L8 E7 X9 ?: {: | u7 u
}
5 a# f9 |) V1 S) w BYTE nDestPos = 0;
6 N9 F, s2 V( O for (int i=0;i<MAX_INVENTORY;i++)
8 a! s/ {5 {% x; E+ M R) R6 d5 { {- G" W1 ?! Z2 Z! G
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);& p0 R2 q) V( R) w4 T4 F
if (pItemElem)
: t/ Z" r5 V$ B( D h9 K D {
7 I/ G0 ~+ n; b0 X; L if (IsUsingItem(pItemElem))
+ b. K% z% |, E6 n9 Z) X {
* j& D0 [$ l* M! X* U) U: n7 z6 A //这个位置无法放- y" e' g* _( k# k- b
nDestPos++;7 i0 y( j/ p: m- m
}
% d# d0 T4 R# H( |* X }
- O* u$ i! n% d8 y) L2 j3 z BYTE nSrc = pInvSort->GetItemSrc(i);0 s! J- ~8 U# G+ |9 g; r
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
7 C( f1 I0 ?2 X5 E if (pItemElem)
* B. e0 b$ K+ D- P( Y {
1 M0 k7 J& \; z/ Q( m( c if (IsUsingItem(pItemElem))' ~2 f% Z3 J: t9 e9 y# r& F7 R
{5 z+ |5 ]& _) a/ F. b6 F7 s
//这个道具无法移动,跳过3 `! R- H/ Q% S$ l3 W7 Y. M" I
continue;6 i: [ }5 l" U! Y* ?9 O
}
# q1 H/ V, }& {: d" [ }else{: M% ^! n6 W) O$ ^$ Q, {: n" ^
//空位置 不用动
, L1 {* d S+ r Q7 M continue;
) o. K/ N2 Q. k: n( J5 f% K }; p* @0 r" h5 B& F! @- A" v
//////////////////////////////////////////////////////////////////////////
4 g$ l- |6 J& |" O0 B9 l //开始移动
4 |1 [$ I" V6 i& S" w+ X p- M if (nSrc == nDestPos)& T) K, J& p" s, x3 C
{/ `7 B1 x, j4 r2 h! d
//原地不动
! b* s) A$ ~" u% p P nDestPos++;
( {! u V Q8 p$ |1 `# F continue;
$ @* b2 A7 K# f- {5 h+ p }
0 F x3 ^: c1 U, q' o pInvSort->MoveItem(i,nDestPos);
8 `; w3 d* x2 v* J g_DPlay.SendMoveItem(0,nSrc,nDestPos);* |/ q: Q/ c4 Q0 j# }) D
Sleep(5);
" W% y: d) i: O! F- q //Error("移动 - %d->%d",nSrc,nDestPos);- l8 a% G, G3 l8 R
nDestPos++;
9 R; E$ |- k: z }
! o2 U% B# a+ U( w- h" O+ \ //取第一个元素的信息; ^* k* Y( i" I4 C. U/ m; F
/*
9 \+ c3 Y: m3 f if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff). M# F- }9 O) [9 u/ x& O3 H: f
{
1 O' A- e$ ~" J) ] Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
* `1 s! q1 U ?# } g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);. L- Q4 ]% ~8 f& Z( R
}, b M" C$ m& X2 U& y3 f$ J* N0 x
*/
" Q% i4 S" b# C! P5 g8 j //////////////////////////////////////////////////////////////////////////8 ?9 v$ q- X9 f2 F
break;
, x, v: I: h3 M3 P8 u3 r }
9 i) {5 R% g$ d, L1 M S }
& b3 N; R( W5 s}
3 U. t$ _% m" F: Tm_wndMenu.SetVisible(FALSE);
$ d) T" [- @ `9 x) E% W- c5 T% J# r
--------------------------------------------------------------------------------------------------------
2 p- n( J& n- z8 d8 [搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
" e4 B8 F- e. V5 q: S( ~* t{% l# o1 j" @ W6 I
BaseMouseCursor();
' i4 B3 z' S$ ~: K- g ^% o}; ?5 s& `7 H* [
在其下添加:2 ]/ v1 E4 }3 |3 M: D8 T" N& ~
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)- b! q# v/ `% @/ I& r0 g v
{3 c9 O1 F, u& Y/ j9 w$ ^$ w% Y
m_wndMenu.DeleteAllMenu();
4 _ r% W, Z9 @# P9 _5 a" z7 w$ i8 `m_wndMenu.CreateMenu(this);; l. F7 G" Q4 R' ?2 Z. c
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");& P+ ~" I" L9 [- f1 T8 @4 |$ y' b
& W2 m4 H* Q" j9 A. ^if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)). A0 T. x9 C# w# |5 \2 l" l
{
% C: l+ o m5 k: W3 U //P以上级别才可以删除所有道具
$ t* k- O, b8 h- k( R w m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");1 g, w/ ^5 g0 u/ J
}
* ~8 y* G- ^* y$ {) [, @; v: Q# Mm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );% {1 g) [$ l6 k( x1 _
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );- `% s! \& n) X+ v* M
m_wndMenu.SetFocus();
7 b$ r# F7 h- w! ]8 j+ j}
. b9 p) U. B+ P4 q------------------------------------------------------------------------------------------------------------; X! |8 e7 C1 n# Q ~% E L
*************************4 G. O& G/ F' S# G7 h! o) D
WndField.h文件
7 @$ Q% y* Z+ s0 I6 y; a5 h4 e*************************
7 h* [, T; T6 b, a4 v( ~& N搜索:BOOL m_bReport;2 e$ W/ h/ C# P# f) H, P
其后添加:; b7 v+ ]: W) E% r* a3 R
CWndMenu m_wndMenu;
& ^ M+ J, V Y p- y: W4 |搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);2 @+ E+ Q8 |" F. ?/ ?
其后添加:# p+ t3 z, N9 q
virtual void OnRButtonUp(UINT nFlags, CPoint point);4 E& q. H6 q" H5 Y
; R& j! F9 e' M
% J9 J2 x+ v. q) q8 J3 _8 ^ |
|