|
|
源文件中_Interface文件夹下WndField.cpp文件
- I. m% Z* c5 b h" E j搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )% ?- s+ N. a$ h4 O
. }/ r9 Q* M% q7 n2 _( ]; Gstruct sItem
% g0 {: J3 S' M) l" U; ~, Y{
7 }/ ]# ` q8 r Q3 A- o; jDWORD dwId;
/ J. K1 t5 c& V) m8 eDWORD dwKind2;8 V2 z8 E% j2 R( z
DWORD dwItemId;* X9 t# V- {. S
BYTE nIndex;1 v4 ]- e8 N. @; N7 z
sItem(){
$ g4 N1 \; a# A6 C, m dwId = dwKind2 = dwItemId = nIndex = 0;
7 M4 y0 u' z H7 z$ U B}
& k; H( N$ y& l2 ?bool operator < (const sItem p2)6 ~* R4 V( g y5 b$ t
{# v: ]: T/ s; x5 n: K2 s2 Q
if (dwKind2 == p2.dwKind2)
6 ~$ p9 |: a$ R& _. g+ A {
9 H S& G: {5 ?) f return dwItemId < p2.dwItemId;
1 g( R" H( }$ e" g5 l+ H7 h }else{
8 U. c2 }' L+ z3 R$ I" i' ? return dwKind2 < p2.dwKind2;
; x# @0 A* G0 q# H }
+ q0 E7 Y& T. d6 t}
1 X1 R# o3 Q% }9 W/ c, A) l};5 g8 M2 w8 S; Y8 ?
class CInventorySort
- S) f2 i8 ?+ E3 t' Y2 t{
/ ]$ _- P5 s) Apublic:
4 f; B6 f+ v* kCInventorySort()
0 l4 \9 K% S/ F$ m, R# r{: ?- C7 B* G( ~* _. M; V: h
m_dwPos = 0;$ Z# { _! A& ?' B+ D0 \
}& s! j3 O( _4 R% {' _0 G. L1 b
~CInventorySort(){}
& Z# s! N. X1 c5 i6 }private:
1 f9 E- d- S/ O0 tsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
; w3 I' a' s! Z$ @DWORD m_dwPos;4 h7 H [9 U3 X! q& s
public:
$ o9 q3 o: C8 C# k2 Z- cvoid Add(BYTE nIndex)( t: J* K7 x1 A) W% H( |( r1 w
{
; O, t8 o: _4 A, y* i' U9 N if (m_dwPos >= MAX_INVENTORY)
* B( T0 f5 h" L* K7 U {% G8 Z9 I" j9 p& L0 L+ r8 N
return;
5 r: b9 @# N% e7 ?8 h }
z7 g; W% _& t/ ?/ a. n, f6 ] m_Item[m_dwPos].nIndex = nIndex;. H* a" l4 b( ?' r9 K* y) Z, C" A
m_Item[m_dwPos].dwId = m_dwPos;) ` _; ^. O! G# A
m_dwPos++;! g& J3 P! L0 h- G- F2 ~
}) P9 }$ S. R: M0 v m
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列& b' p9 t Z# ^" \. X5 l# u m
{ m' J$ X9 `; `! L* `
for (int i=0;i<MAX_INVENTORY;i++). `' H3 q7 e% ?8 @
{* P5 M2 s& Q0 {7 P- l7 B7 `; B9 w- b
if (m_Item.dwId == dwId)# y* ?. r% y8 S' t k, _% ?
{, s$ ?9 Y: D" S' n& n
return m_Item.nIndex;1 l2 y. [* Z. u: G+ u8 d
}: j0 _) J/ J/ _8 ]4 Q
}
4 e; P+ d% F8 o return 255;0 v) W. X% A4 ]: ?5 K
}
3 X; ~( Z( h6 j; W4 ^- [. xvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置! W% ]- j( j) k1 [8 E, @, M; m
{8 |, H) E' b" H
BYTE nTmp = 0;5 c$ y5 ~* I6 Q# `& Q! }$ K' K
bool bDest = false,bSrc = false;
3 f+ k! m8 G1 Q/ c" U) } for (int i=0;i<MAX_INVENTORY;i++)6 e. X- L# ?- k' b
{
* p& b9 y0 Z! s& Y% R' S if (dwSrcId == m_Item.dwId)
: U' a, p6 q2 K; A/ d {) `! S+ P6 b6 R" r" \/ m: a$ i
//id相等 则 改变对应的dest和src
! ]" ?" I5 k" ~4 h' o; q nTmp = m_Item.nIndex;
" p0 ]. s* E( K. o, f) \: L m_Item.nIndex = dest;3 x6 ?# N9 d0 @: @
}
" y% Y# o% `: n1 ]) ` }9 g3 k6 [' ]# Q! {$ k
//临时数据保存完毕,交换开始
- K) ?8 U& W6 |, K2 W" m for (int i=0;i<MAX_INVENTORY;i++)
3 G' Z4 U* d. _# @6 u1 p {" H8 K7 A0 }+ \$ _0 z2 A4 V. `0 o
if (dest == m_Item.nIndex)5 ^! L; h, Y: W* `! Y: j
{
% c W' C3 j% W) { //id相等 则 改变对应的dest和src
1 i: E+ Y; |! G W0 M' {' { m_Item.nIndex = nTmp;5 h( Y; ~7 Y- C# ]
}
2 R# k( O) j& B$ P0 N: e. X }
J2 B! n. C& |+ z$ \5 D0 M}+ f9 ^/ ~6 B& n+ c; T4 G
}; r$ G" X, O/ D- K: o
-------------------------------------------------------------------------
/ q, y# k2 N9 ^- Y4 R' w依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
. ^ a3 D2 Y' H' P' j) @搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
0 B6 s, ^8 N* U; f- Q8 e5 ~/ G" S紧靠其上添加:: D! j2 M1 R: M n0 v: p- i! D
if( pWndBase == &m_wndMenu )
& q4 w8 h; n6 b" ~; {/ ?{. F% v2 ], _8 n5 [" x) z8 ^
switch( nID )
( Y9 y1 g, n/ h7 H: {0 C( ?$ M& p, G {- x$ r& |: ~8 I9 j4 z0 @
case 2:$ c4 y8 w1 ?# u
{! f9 j$ \- ^+ g: s2 c! x- O) B8 j
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
+ l0 Y7 m9 }8 c; s if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))! k0 A; |" O5 b, r2 R
{0 a) o' [& i0 l
break;% u/ U: q2 C6 S( Y, F) e
}& g5 m" z; ~5 r1 ]3 |( Q( H0 W+ G% w
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
, j# ]$ p* @* `4 d8 l {) q4 S. G9 Z8 [5 O
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
4 T' ]/ J6 F8 \0 P% v" g if( !pItemElem ): l5 E# w8 l" C% X) |3 G7 F
continue;. m) g% m/ i+ `2 e
if(pItemElem->GetExtra() > 0)7 Z# h* K3 C! F1 H
continue;. ~3 g! F+ {9 @% R8 F1 Y m
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) 8 H3 @( S7 b0 U
continue;
6 y! j8 N3 }2 ]) ]! V- G B if( g_pPlayer->IsUsing( pItemElem ) )
- x0 G5 e& q' A0 L k- c continue;
' \% c5 {7 t) K& t+ U if( pItemElem->IsUndestructable() == TRUE )6 {& q% Z% a" K3 T4 `/ ^8 @
{
8 Z) E$ h+ V. W+ e( |, Z4 {7 w$ h g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );0 } p( W3 O& S/ {, a5 o* b# ~
continue;
/ e% v5 j/ n# B3 D5 W }4 |2 c4 P6 l9 ]' }
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);& R( w% G/ ~: k3 L: B: y
}
* t9 ~" n* ]8 }* ?- E break;
; W7 g( p2 l8 q' N, Z0 ?2 } ] }; S; R5 z1 P4 h- ~
case 1:
+ u6 f1 Q# t% m: _' \' n; D {0 _, v3 Y1 x' k
//整理背包5 ~) Z1 s# Y$ D0 x
//////////////////////////////////////////////////////////////////////////) W9 {; C5 ], o( a0 Y! I* c( y% r
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );" D$ ^* p0 e0 O- R
//////////////////////////////////////////////////////////////////////////
9 T" f2 B: @. }3 c! |1 H$ M1 q //////////////////////////////////////////////////////////////////////////
7 A' h5 L& `$ b+ n3 P CInventorySort* pInvSort = new CInventorySort;+ |" y, t2 u* C$ b N/ v
vector <sItem> vItem;! g% _' v) x# |1 C! R; _6 G( P
vItem.resize(MAX_INVENTORY);//初始化大小$ P/ j% ~' ]4 f& V0 b& u
//////////////////////////////////////////////////////////////////////////
9 g/ E7 R3 J/ y7 T //填充数据( }7 _* [1 V# q0 n+ j- r5 |
for (int i=0;i<MAX_INVENTORY;i++)! v& o: {' g! Z6 C2 X
{
; H. {; p* a2 o5 ^0 M$ y CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
* A$ Q9 }# Q; N6 p- R; L4 N g- o) T if (!pItemElem)7 K! V& }4 C, ^ B7 w- b$ t
{3 z: X6 @' H. M4 O* l! ^, d
vItem.dwKind2 = 0xffffffff;
9 ^* X, Z {: K& ?# r/ ] vItem.dwItemId = 0xffffffff;, x" E) F& b7 c# F
vItem.nIndex = i;
% W) d7 [% z: a7 {4 [ }else {
+ x3 z2 p/ k/ o' \" M ItemProp* pProp = pItemElem->GetProp();5 U8 F A+ j% b, {# y( v* w. y
vItem.dwKind2 = pProp->dwItemKind2;
& o& Z# Y" m8 j% s7 B* j' b vItem.dwItemId = pItemElem->m_dwItemId;8 p1 k! j2 Y2 p4 Q6 u
vItem.nIndex = i;' I5 H2 z; V r
}% Q5 K$ z7 H; J. E5 L9 s+ T# h
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);& w. }4 l! a' y, j
}
4 Z) ~8 f. V8 |" K- a //////////////////////////////////////////////////////////////////////////
9 c8 m) Q5 G+ w( Q& c sort(vItem.begin(),vItem.end());//排序
% y6 i% ]5 ?& Y4 u //////////////////////////////////////////////////////////////////////////
h) e' [; @! e: b: p //交换
% S# L$ {, t; C$ [( T: A6 O$ k for (size_t i=0;i<vItem.size();i++)
4 E* c5 y3 ^/ Z: m v; v {0 Y7 p5 k3 R% A: y( \& X
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);* Y9 c4 a! z1 @0 d" F
pInvSort->Add(vItem.nIndex);
' H6 r) w+ T n; F, C0 M6 H }
. z& I8 S+ l/ F E/ ^- ? BYTE nDestPos = 0;; c+ a9 u5 g1 i5 t* j5 t% m
for (int i=0;i<MAX_INVENTORY;i++)
6 s( ?& H& I, r! Z5 L {# i2 {8 I8 e( |) x2 l1 g- [$ P
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);1 M8 i$ |9 m: R8 e* [ d. @
if (pItemElem), m& P' q' C" ~) [, N# m7 T2 }
{
: [: w4 Y: |8 a" a! L# U if (IsUsingItem(pItemElem))
3 n4 ? B) J+ _) r {* q9 C5 A/ D b0 ]6 K& f
//这个位置无法放, n& V @+ `. l1 A
nDestPos++;- a( S5 ]! g4 c* g$ y! \, z; ^
}: {8 l" \: Q* k6 O2 E3 X* s
}
5 I. l. ?9 O3 F. t! C* i# o BYTE nSrc = pInvSort->GetItemSrc(i);+ `2 d8 c& D I& |: B) c
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);1 L! `1 N- Q" h7 h: N) s& q7 R0 ^! l
if (pItemElem) D1 d4 ~4 |' }3 ^+ x- n+ u
{4 I4 E2 E2 S1 @! [, o1 p
if (IsUsingItem(pItemElem)) m4 p3 q' y9 P6 C( @4 Q
{4 C0 q( @) n$ g( ~5 H3 T; S1 @9 ]
//这个道具无法移动,跳过
$ A% y4 I) N' h4 V5 N continue;- r" H) @- t: \* R, E- V4 w
}
5 k$ _2 M* n% `9 P) N' u }else{
. `/ `7 ?: P }! n D* l; @& @' y //空位置 不用动; x% c6 Q T$ c$ F
continue;
" c% B* R& m0 N0 y" n* _$ R, U" | }+ {8 |5 P' U" r% [
//////////////////////////////////////////////////////////////////////////; ^) {* n/ @9 d; d
//开始移动
* f) |. V" a! }1 m/ O$ L' r3 V if (nSrc == nDestPos)
( V, M/ d. f) x: c) P- S* o* f {
, [" c/ a* \! O: I' w //原地不动
" w, `5 `9 i1 a* ` nDestPos++;
" v0 n% @( T: T% l continue;
6 S s8 S1 Q3 [1 u9 B }
7 Q: _$ P* n) H6 K/ K" }+ \4 W pInvSort->MoveItem(i,nDestPos);
+ P" }: u% f' J$ ~: c+ w+ r g_DPlay.SendMoveItem(0,nSrc,nDestPos);
* O3 L4 p3 H1 ]6 v$ P5 i Sleep(5);
' ?; y1 A5 \4 j$ ~, V, O //Error("移动 - %d->%d",nSrc,nDestPos);5 E! } Q3 Q d% u$ B2 \, L
nDestPos++;
2 C+ X. h2 l" R4 ^: A }& |6 |. d4 h1 o
//取第一个元素的信息6 U# W3 G6 f% p0 t
/*) {$ A. ]3 ?' L
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)/ Y- T3 x. Y4 q8 u9 e9 C
{; R% p. d V. W; M. `: z
Error("Move - From:%d,To:%d",vItem[0].nIndex,x); d3 R) T! C9 \; t* Q" W! L
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
% e- T' q- ^ H4 q }* f$ i* U. N9 s5 ]& |. P
*/) u% G V1 ~- ^, X& T, J, [
//////////////////////////////////////////////////////////////////////////; m! H3 E& L3 [) P" n
break;
% W5 S$ a1 k* ` y( S3 X }* M9 Z# _7 |: o
} 9 d$ x. z' W2 D. L5 `5 B, j$ Z/ o
}, u( u8 F1 R. q
m_wndMenu.SetVisible(FALSE);* v+ T9 s- J# S2 c' O2 U9 t! d
4 Z x- `+ C! e6 i7 O$ U4 y& f8 K--------------------------------------------------------------------------------------------------------3 m* x: z! Q5 y% b }
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
, K6 m- ?. k. `, @; _! G. _! }* Y{9 ~3 \6 H% Y5 I
BaseMouseCursor();
. s& ?) M% l- r3 p$ ^% ~}
, v$ h: T8 E* C/ X6 h1 c在其下添加:
3 d; c0 }# g" H5 uvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
/ z9 p: n% `0 x/ |; P) D. ?{/ K7 u# w$ R% I; d7 Y
m_wndMenu.DeleteAllMenu();7 t1 h9 \$ o$ M) s" B. C5 {6 r
m_wndMenu.CreateMenu(this);# X% `5 s1 D; ?2 s
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");4 v) J: D+ _) V; \: j: N5 _
: I8 Q5 }+ n! o/ Q- J4 Qif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))+ R( C0 z8 L; w. B
{1 c: y G/ ?* C+ Z; ~! L
//P以上级别才可以删除所有道具
# ]$ w9 L: E, }+ P# B/ B6 s m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");5 A* d3 G& J0 j% M0 t* s9 M
}) @4 G5 G- Z$ d: Q
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
, R8 q5 t3 j' dm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );2 ^3 j5 b6 \! {/ P% a. K. \
m_wndMenu.SetFocus();3 I7 Q' T+ y0 a* ]! b
}
k# s( w2 P0 k" Q* S; J* H------------------------------------------------------------------------------------------------------------2 k5 L9 K W8 D
*************************
5 V+ a1 M U0 u+ ]WndField.h文件: n W7 ?# }3 j
*************************
+ @( Z6 [9 L ~搜索:BOOL m_bReport;) M3 \+ @ y8 z' v0 k
其后添加:
: t- g, E! A, L/ `- SCWndMenu m_wndMenu;! G* U# ?6 S! t }6 {( n b5 u" \
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
) c, B% G, S3 b0 [) f6 g其后添加:
( |' e$ H9 V6 o( b; c Ivirtual void OnRButtonUp(UINT nFlags, CPoint point);& @8 ^) D# M# H2 o, N2 x
" [/ u/ n) U" F- Z o$ }5 P0 v8 @1 W I% Y' m1 {
|
|