|
|
源文件中_Interface文件夹下WndField.cpp文件
! h5 A) E8 a, Q5 ]. l( W5 Q搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )+ Q. a( B+ p, S7 j5 o/ S/ A
S5 n6 {8 j+ ]. F: k9 u
struct sItem
% b, T F* i2 z! R) I{
3 J( g5 A5 G, ^DWORD dwId;
6 T6 V8 s! X4 Y7 X3 o1 f) @DWORD dwKind2;# U- U" U1 J) L
DWORD dwItemId;2 r, o+ V1 |9 [5 v
BYTE nIndex;" C0 }/ H) J. k- M B
sItem(){" w! Y2 j: O& Y
dwId = dwKind2 = dwItemId = nIndex = 0;: j+ {- g/ q! q
}
6 C9 _ P _3 W- s* cbool operator < (const sItem p2)+ T( h+ D* Z- y2 K2 _: C
{
9 A3 L6 u$ V( U9 q if (dwKind2 == p2.dwKind2)
8 q( v+ P7 R/ E+ ] {- E8 `, Z4 k4 C( S5 v: ]8 h' ^
return dwItemId < p2.dwItemId;
: V& n' X$ O- v5 q }else{+ \% h) g5 {$ B. s- a+ K: L
return dwKind2 < p2.dwKind2;- F$ m7 W# y+ u5 O2 j: `" x3 [
}* `- F2 z) o! n1 s0 Q. i
} d/ Y# ~+ s2 r. D; ?- M
};1 G* U( J2 L1 @7 r9 T% c% K
class CInventorySort
2 B3 s0 l% K, A5 R4 @# H{
+ l! t9 K' v: G: q* upublic:
! [) d8 _$ |: KCInventorySort()+ I% d4 q C( b0 x/ I1 ]
{: M5 O! V$ A* b( \5 E/ B* q
m_dwPos = 0;
3 n z: f+ r+ x: A+ R/ Q}
: s2 `0 d, R! j6 t) l- d# s~CInventorySort(){}
J7 O; g, b' J3 a) Zprivate:
7 t$ K' q- q% u" W) x) gsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
' j! ? p. m( w! o3 {& YDWORD m_dwPos;
, g7 C! m7 V9 z8 p9 Rpublic:- v5 i% j# f( h2 o0 Y5 {. z
void Add(BYTE nIndex)9 h6 V' j0 t: q8 W+ K
{2 ^6 b/ z. c% P l$ N8 j
if (m_dwPos >= MAX_INVENTORY)5 o3 I8 g$ @' F" P; `/ X" u5 I
{
/ [! o! [# `, e0 _ return;
& t, ]# L* ~/ { }
, `. _- W; |- D# ~* T7 B" Z m_Item[m_dwPos].nIndex = nIndex;
7 g2 {( x; V7 D, D! I; L, o m_Item[m_dwPos].dwId = m_dwPos;
/ d' R% A$ m9 V( A9 P2 a* h m_dwPos++;
$ S4 d/ I! Q6 H$ D1 r) S5 `}0 m) F+ k5 b2 P0 R
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列: w8 ^& v6 F' v
{6 D8 \# i, J' r9 M5 T6 f/ A
for (int i=0;i<MAX_INVENTORY;i++)& o- Q3 f; F8 i- |4 f
{
4 k, p% t. e \( l3 W! ^/ q. M if (m_Item.dwId == dwId)
! _' r; d: T& g2 |0 h {
5 N2 z" F/ w# x+ j2 R/ S! } return m_Item.nIndex;2 p7 f1 s% y6 `1 M' `- K
}
6 L4 r, y. p6 l& ]! {' r }
6 N7 {( p( w: q4 b6 v return 255;
2 v; c7 U& O, K U}
+ A0 y: q6 x7 y, R1 ?void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置% {8 E3 U9 l) m, w; N2 O
{
E$ q/ \* d' p u, Q BYTE nTmp = 0;
& I5 _% g( z. }- c) z6 A( l bool bDest = false,bSrc = false;3 G: e1 B1 N. O2 z
for (int i=0;i<MAX_INVENTORY;i++)
6 {: j; o# f/ u) n5 n {$ X) K& p$ B2 B3 ?0 b+ A
if (dwSrcId == m_Item.dwId)
7 d2 V* y, m1 f: |1 b5 i1 t, w7 r7 ~ {
" C5 C: F4 R) ]2 R. k //id相等 则 改变对应的dest和src# I {& v& F& }3 W* f1 e9 c
nTmp = m_Item.nIndex;
. u4 e% L& H. { m_Item.nIndex = dest;
- b* f0 I$ R# P" `! | }
- Y0 l9 r% { W3 i Y8 l }, } s8 [/ I1 [2 j: O% T
//临时数据保存完毕,交换开始' s) B, h: z8 p9 L
for (int i=0;i<MAX_INVENTORY;i++)
- O0 ?8 y5 d: W6 h {
2 B" v5 b% y! v; A$ [* a if (dest == m_Item.nIndex)6 R: J0 w$ c9 a! y: Q" `
{
1 `- A. f+ B: y0 i; _ //id相等 则 改变对应的dest和src8 Y/ ]7 r' j7 A4 | e8 B1 e& q
m_Item.nIndex = nTmp;* a; U* n8 `: b; E" S! y# x+ c
}5 s7 q& \2 S9 H6 ^+ A
}" a1 ^2 `" R5 q, R
}; }+ m/ ^1 N- C- M) ^, D. j
};3 A/ |5 ^# P" z" M
-------------------------------------------------------------------------
3 L4 j- V% ~3 V依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )" G' H- {5 S, G8 {6 K9 v0 t
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);0 ^5 Q) ~$ X( _4 K4 ~8 s
紧靠其上添加:
5 J" c+ x+ i9 F7 Z* v: e0 O: Oif( pWndBase == &m_wndMenu )0 t& a- v5 g& J2 Y# _
{
_. w$ `' t1 K# d% C: I+ ^ switch( nID )$ Y& g5 _) L) R
{
# X& ?$ k1 ~7 K5 N5 Q case 2:
* P0 Z& m/ A5 w {! x X9 U+ J5 f( ?6 y
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
. \8 `- t. K# k# s% \- K if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
4 y# D" U7 D) j {
) H( l) Z2 L4 }9 T! O+ N; f' Q3 M break;
4 T! o4 p! D( I$ m5 M }
+ v* ? M c2 U! p& e3 | for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)- v$ q3 e: |4 Z/ J8 u9 a& a6 H$ T" c
{
$ |; F/ T/ p4 _- j* L* v6 a% \ CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
' A2 J. @" {6 \: [+ E if( !pItemElem )
! A4 y2 C7 K2 m% J9 N8 Z continue;6 l: ^6 `- x. E+ t6 p( b
if(pItemElem->GetExtra() > 0)9 z$ _: G) |( M) B' k# p& B! I# ]
continue;- i. J( I. A- b. M& o, o
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
) a& {7 e# f( @. o9 v2 s9 Q* U& c continue;+ Z: w( Y* x+ C& Z. Y2 e. b, @
if( g_pPlayer->IsUsing( pItemElem ) )2 ^% [* {. C% R0 _3 `% o k1 i
continue;
# h- ]& i. ]" Y) p* ] if( pItemElem->IsUndestructable() == TRUE )
+ f) @: w2 Y* W6 z0 h' [ {0 {0 L5 X$ _. }; G& L1 G4 ^
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
- Y5 ]* }& L' L6 J% Y9 T continue;5 @' U T0 ]) w' `/ L# O5 r# V' I
}& { o4 q; J. \% K$ ^' Y/ b% ^+ g
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
& R5 f" _$ B4 N) i" E, J( S8 C }
# V: |) ]& s! A$ B! {8 D break;
( o' I" [0 e3 `: d6 r( C7 @ }) b, n- h, A: @
case 1:
2 P$ S D! Z: {% c1 u: i {
, v; e/ k5 V( T3 L! e& C //整理背包) q( d- G9 a: s3 E$ l
//////////////////////////////////////////////////////////////////////////! J" v- a# L# v A/ V
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );: O) M j- j, V: T' }' v
//////////////////////////////////////////////////////////////////////////0 ~0 D+ j% H) _' @2 z: F
//////////////////////////////////////////////////////////////////////////
9 @8 F$ W2 f/ L; K; Y* m CInventorySort* pInvSort = new CInventorySort;
/ r' L3 L# q8 j3 _- C$ R0 g vector <sItem> vItem;
9 D, ]1 e7 W- h; o2 o. t q4 C" V vItem.resize(MAX_INVENTORY);//初始化大小' Y: ^5 W5 x' i0 B
//////////////////////////////////////////////////////////////////////////8 W" M. l& u0 i" Z
//填充数据
9 r3 V! I6 _: i. e ]! W. W for (int i=0;i<MAX_INVENTORY;i++)
. J* b7 S, x7 V! M; n: u, r {
8 Y5 `3 s0 N. q/ U6 |& C, m CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);% f& t [# M/ V& T8 ^
if (!pItemElem)
$ j6 t* ]! F) q1 `; w2 i {/ Z! ^- V/ ^+ e& k2 c) ~- g+ I. m
vItem.dwKind2 = 0xffffffff;% Y" S4 U" w5 ?) c/ S# ~( U
vItem.dwItemId = 0xffffffff;
7 W& y j& i& a/ i/ B vItem.nIndex = i;
2 Z: {- e- N' J4 b2 k G" m5 h }else {
, g) e( g( J6 J ItemProp* pProp = pItemElem->GetProp();
3 @/ x1 j m) ^& `" T( c+ } vItem.dwKind2 = pProp->dwItemKind2;. D3 ]# ]: `: E9 Q0 ]
vItem.dwItemId = pItemElem->m_dwItemId;# D/ c6 ^) q/ G! i
vItem.nIndex = i;
7 K' c0 m j: g! D! }) o% X }( G3 r6 {/ \ j8 ]! G
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);! ~, T7 s; A8 D" I2 G% o" {
}
% Q1 |1 y7 Q2 V3 i //////////////////////////////////////////////////////////////////////////
. P1 t" Q; T# O/ R1 ` sort(vItem.begin(),vItem.end());//排序/ }: x& E4 [( V. n: O
//////////////////////////////////////////////////////////////////////////. Y8 R, Z. I) f# C, o* X* ]
//交换6 R" f) T$ k" S: t1 t
for (size_t i=0;i<vItem.size();i++)/ u9 q4 {8 T* {, W( `
{
2 \5 L* h4 q+ C //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
0 H. D. [0 q1 W1 v; F) { pInvSort->Add(vItem.nIndex);$ @3 w5 n8 t% B; V7 E% A; _
}- W9 w6 ~. h$ `. o
BYTE nDestPos = 0;
* @( n0 t% z2 B6 {( i# |" M M for (int i=0;i<MAX_INVENTORY;i++)! h7 \' t, v% d
{7 n. m6 ?. E, U2 [; l8 q0 j& K
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
; a5 K, n9 q# N& \. G- L if (pItemElem)& z8 b; b! c5 g- }4 h& p
{1 V, `( j, Q j2 d$ Z' c
if (IsUsingItem(pItemElem))
- }2 w6 o3 k- s: ?. a/ b/ | {7 q* }$ T; B. o' @, Q
//这个位置无法放" X; R/ s! p% H4 J: {
nDestPos++;
; H8 ~1 V/ f' F; A6 J' y4 t }
C |$ S) [2 m! P( o9 }/ T% F$ S }2 P$ W$ M% ` T" a* i6 f8 K5 T
BYTE nSrc = pInvSort->GetItemSrc(i);
4 F* k d+ {, J0 Y pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);# E# l5 N' ~1 {. Y5 v5 Y: T( I
if (pItemElem)7 W2 z8 h- _+ u+ Q4 B" F
{
. p S0 ?1 J* Q: s* z9 p if (IsUsingItem(pItemElem))3 J# j$ P: k5 @
{" h9 k8 J' y- p6 T
//这个道具无法移动,跳过
3 U- ^* j- A. v continue;
# [; K7 P8 p3 t- `# n3 I8 M }
! Q# R- D U+ h' h; n/ X }else{( Y2 K% s$ I+ Y+ u2 K8 G0 Z) Q
//空位置 不用动
4 r' N, K- v, a8 y continue;" r' `% N$ u. L: T' q
}: Q, E) U; T5 W- ?# P/ ?
//////////////////////////////////////////////////////////////////////////
* H4 d3 p- x$ t* s1 Z //开始移动 e6 j* o) c0 y+ J9 S: t. S8 t8 A, N
if (nSrc == nDestPos)) K/ w/ m W& ?6 k- C% t
{) k3 `; J1 K3 \! l
//原地不动
/ q. R' S R6 [8 D: ?# X+ Q, e+ N nDestPos++;
& i7 b' y3 t& r% \5 d continue;
; Z9 T! X' l, W" S$ ] }
+ \9 m% J5 H: |" e, B; ^ pInvSort->MoveItem(i,nDestPos);! h: C& U% r. q6 o" ?& q
g_DPlay.SendMoveItem(0,nSrc,nDestPos);( d0 Z- Q: ~8 n Y* G) _) _
Sleep(5);
# d2 t. |, N$ h2 k //Error("移动 - %d->%d",nSrc,nDestPos);) u W! c3 @3 @& D$ X
nDestPos++;
9 Z2 z4 v% s$ m2 X# J. \4 a$ w }
2 V( z; h" `" z, E5 t+ H //取第一个元素的信息
C6 `. O4 C9 ]3 A# i /*3 c6 @4 v# E% x4 d) {6 [3 l5 l0 f
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)0 v! f0 b& I+ a @+ H3 G @0 u
{: F0 l( H c2 ^# s( G0 t& K1 o; _6 ]
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
2 G5 _ ?8 l/ i8 s8 u9 |& h' c9 n g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);3 X) z# u9 ]% @" G
}
( U4 ^+ K) ?% F */
) I4 }0 w5 ?% K: N6 ?" M; i& E; H! A //////////////////////////////////////////////////////////////////////////
$ ^9 S5 |8 ^) ^5 ` break;/ q7 O, J, z6 H' ]6 r m7 q
}
: D) P, `; C2 x3 z9 d" T! O3 S }
3 k( O9 R# W1 l; @" b, D}9 I3 n# x( j z' m q
m_wndMenu.SetVisible(FALSE);
: u/ Q( E2 o. T9 t. l" T/ R* f7 V8 _, G" r: @) X. P8 ?* j
--------------------------------------------------------------------------------------------------------
( ]6 U5 G+ L, d" C/ ~搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)# F, O, }. B. [/ M7 e8 f
{
/ _9 f0 ^$ |% WBaseMouseCursor();
% F, {$ M4 F5 m1 o( {2 O7 i ~ |}7 M* F* `$ y. F1 m
在其下添加:
( M4 I6 T1 l% J L0 A8 }* W& B2 m7 yvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)9 h) \% H# p2 {; O/ R0 q: d& U
{
4 Q* M2 x& l: Ym_wndMenu.DeleteAllMenu();
" h) k7 `( r* B p& em_wndMenu.CreateMenu(this);" d7 ^+ H4 [4 {" B% b! D
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
) P& n9 h4 Y- l1 w2 o
5 W( k- P/ i5 r8 Xif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))0 o% n/ W% R9 Y! ]
{
* I% ^+ a( U# s" N //P以上级别才可以删除所有道具9 ]4 u/ M3 v" z4 D" ?3 b0 g
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");! B. v$ P5 f# L+ p9 j
}& r2 j2 ^3 n/ [8 y( H
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );2 c# E# v; r ?. ]+ |0 F
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );& }1 s+ K4 ~. C
m_wndMenu.SetFocus();
0 A& m- t& m+ u* a0 [3 h. Z}
% ?0 i+ R, d* ~, W------------------------------------------------------------------------------------------------------------
; | ~# V8 e9 K) y/ u, S*************************& h7 [& E. ~$ b1 a8 |9 S4 S
WndField.h文件
, n3 H* M5 K* I& \( C5 ]*************************, T, q: Q+ t9 W+ C6 x' `! r( S5 w
搜索:BOOL m_bReport;
k' q0 c6 L8 y" b其后添加:# i9 _; o6 q- |
CWndMenu m_wndMenu;
4 p, @( q+ o& c- a- o; `7 k% ?7 n搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);4 e A( [$ i; n1 ]
其后添加:8 ]7 @( [! H# _0 a
virtual void OnRButtonUp(UINT nFlags, CPoint point);$ E" b. w) C1 s* x
$ C5 F! P7 v6 a7 L( R. i$ z& ]
* J% a8 i+ \3 f7 D9 T8 Y |
|