|
|
源文件中_Interface文件夹下WndField.cpp文件9 N2 W6 ~1 y' y- P8 }) Q+ Z
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
4 J; }) P6 I" u; l: A) W- O! L' C# V; y, D/ N8 S
struct sItem
! g5 g) G# n& S& ?. [0 o{
# O3 g) \" j" Z' Z% ?2 a0 i% i7 |DWORD dwId;' T3 f- p& k$ a3 A( U, i
DWORD dwKind2;( a% T* X6 H# ]6 ]" ~. j5 N
DWORD dwItemId;% d- Q3 I2 f0 Z4 f7 ?0 b" P8 b
BYTE nIndex;
% a5 C, W$ n$ R4 p" R" H1 IsItem(){$ N4 o4 Y, \( {2 _9 i' Q1 f
dwId = dwKind2 = dwItemId = nIndex = 0; D0 A1 q9 j- H
} R$ B, Z. \# \- N7 w" [
bool operator < (const sItem p2)
! J5 ?: s8 P7 h{
# ^# N5 m z% H* t4 E if (dwKind2 == p2.dwKind2)
# }9 w& t8 c4 S; i% ? {$ Y! U1 V4 i, H5 o; ~7 l
return dwItemId < p2.dwItemId;
, R. T! B, G; n9 I l0 [) T3 ~ }else{
s# j. J/ d* U& p y+ ^$ m return dwKind2 < p2.dwKind2;
: o0 W1 U+ B5 k: b }
& s/ K4 |$ P( p9 z) n9 g}1 e" Z ~" x, x; }
};2 K* q: h7 I( o
class CInventorySort
! L; }8 w3 j S, O/ }{9 ^+ F/ L: Q4 t8 U# V
public:1 B1 S) X) i# s) Z/ f
CInventorySort()6 \% f0 i2 T* r
{/ h2 }9 a1 {0 I1 g# a
m_dwPos = 0;; d. l, n& f0 b T( O
}5 H+ |3 _- t+ ?3 r* r
~CInventorySort(){}. J4 U6 C9 r+ `
private:9 t8 d. e: J, X" }7 B E6 N0 b( u+ |
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
: I5 j& X/ k- \DWORD m_dwPos;
; \* v* i. ~. b) A& I4 ?, Ipublic:" V" E0 f- \, h' d3 b, n
void Add(BYTE nIndex)
9 n, F1 Y6 w) E. `( B( H: c{8 K1 k) y3 q- b& P" \3 ~/ i R
if (m_dwPos >= MAX_INVENTORY)
/ f0 ^/ ?6 `! K2 P {
0 Q7 _+ s% ?9 z# |# E return;
# G( o2 u, c7 O" r }" P0 `* {1 s7 d! P$ s% Z
m_Item[m_dwPos].nIndex = nIndex;! }3 w2 S0 s, }' o% n
m_Item[m_dwPos].dwId = m_dwPos;4 z: `' n: t# r+ R
m_dwPos++;
3 }& c4 Y7 A) \1 t/ c4 G0 O4 d}
. ~) z; Q; u+ q5 e9 N }BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
) X ^- q( h4 g4 H+ N* A4 i9 D9 Y{% Y5 {9 ^# O; O& s
for (int i=0;i<MAX_INVENTORY;i++), P' H4 L/ M7 m. j5 q- ]
{ i5 G4 |$ w7 B* i, _/ K- g
if (m_Item.dwId == dwId)
) [8 c2 A m3 u, x. z {4 c7 M4 x6 O2 Y& @. {8 P
return m_Item.nIndex;
/ U6 B5 l: _0 \ }
! z. g# G$ |& B$ }+ I! A }1 J( j2 z6 _2 e+ Q
return 255;
& Y( w# h. T; S* c}3 [7 j. ]$ C" \! V! }+ ~, {
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
3 A8 j: O: c$ p) i{
5 `+ U* {8 C- h* M1 {7 Y; s BYTE nTmp = 0;' ~- T; j$ z9 @
bool bDest = false,bSrc = false;
7 @) p6 x* H, X2 V for (int i=0;i<MAX_INVENTORY;i++)
' w+ N1 p3 E* r# z {4 n: O% X3 U9 C1 [, B0 ~& H& I
if (dwSrcId == m_Item.dwId), p$ Y# b& ~4 E6 [: G0 n% H
{
( F8 n: C" f0 P2 H //id相等 则 改变对应的dest和src8 u, `2 j$ r5 s) a! w ~( _& d
nTmp = m_Item.nIndex;$ R6 ^) H8 P3 F5 i
m_Item.nIndex = dest;
; i( e! g$ b' x6 T: _* o }
+ c" J( J, ?9 B$ { E9 z ]; ]" r6 G }" V% ?) y: i7 v! k- z, K# V
//临时数据保存完毕,交换开始' J& B% G: q9 k9 S( i% ?* P% b6 s
for (int i=0;i<MAX_INVENTORY;i++)* {. p9 \6 W8 G. Q3 ?1 \( c/ O0 F. R
{
% [' I- h' I9 p& u) N if (dest == m_Item.nIndex)
3 a( J0 ]0 [! `3 E. O {; P3 m9 k0 a( B/ s2 }% s
//id相等 则 改变对应的dest和src
$ t6 V3 g. v) M2 x m_Item.nIndex = nTmp;$ w; c* L: `! S, d' g( y# Q
}' U) D" [, B& C- m4 Q7 M4 Q# c
}
. }/ r. ?9 o! r+ r, _}
+ e8 M7 a) _0 ~4 F* A};# h) [0 T. i+ ~2 d. v0 x6 B
-------------------------------------------------------------------------
; x9 D6 Z) u r+ {' ?依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )# X m' g5 V- c E- S( p/ {
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);. }7 W; P+ l$ j8 ~6 ~
紧靠其上添加:9 R' F2 [9 Z2 a) o) R* Y
if( pWndBase == &m_wndMenu )
* _' l6 T! ]) ^7 j- N$ b% \* Q{
# t2 q. `- g$ N& L switch( nID )
! q) V" U( Z, c2 D4 f! p9 ?- Z {
7 z& O4 a; `# v case 2:
$ a+ y) @5 ~4 x; ]4 S, G7 @* E) x {, P1 w$ ]4 c/ K0 W8 w! C0 U' n
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);2 b& w7 M5 E; l7 P/ d" o; b( F
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))% v: _& }/ {. M2 s a0 y
{
9 s# [8 _( D5 ?( h. ^- h break; G% F1 H2 i( Y6 U3 W I) _$ b: `
}
8 p! D6 X; D$ @8 d1 H7 t Y, ^6 J for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)% m S4 l$ P6 [1 H
{) d+ S% @& `+ z* e" K5 ?1 S! G
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);6 a) M5 c9 V+ `7 a1 c
if( !pItemElem )
1 I( x' A4 }- z7 L1 s& ]4 m continue;/ Y3 E- |6 }7 f7 Q1 W9 O2 | M
if(pItemElem->GetExtra() > 0)
6 U/ e0 y" U+ @) d9 w/ ^/ M continue;
! N- [5 b3 \9 H if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) & k9 f2 {7 P0 |2 q+ a4 b
continue;
8 E/ o b' ?0 D7 V. I; e if( g_pPlayer->IsUsing( pItemElem ) ), W6 X# h A A- a
continue;
2 v% l" W3 V6 m+ B9 A G if( pItemElem->IsUndestructable() == TRUE ); R4 b2 V* U F( Q* l. z. t
{
3 p6 I* F1 K' x+ j; y g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );+ \: q4 B& ~. W! {; p& P& o
continue;
8 K1 G# H$ N# e- ~& r$ j/ N }
2 B# `" F0 b% }; @+ \ g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
- q" Q, c1 C4 g. e }
. a% i* w* B' |$ C) u break;
3 A* N+ V# y) \+ z1 L# U( E2 {! z }5 ~) T& L( W; B/ b) A* j8 ~
case 1:4 K) R. j, W9 h0 ]- T4 S7 a0 A! k
{2 y8 Y6 k$ r- ~
//整理背包3 V. R& `7 E. B. ]4 a! t$ k9 I
//////////////////////////////////////////////////////////////////////////
# u' B7 u- m* Y1 E6 G: N$ x //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
' ~& }1 H$ F% k* [. ?- Q+ [ //////////////////////////////////////////////////////////////////////////( r& p5 V0 K3 _) h* Q9 x& Y9 d
//////////////////////////////////////////////////////////////////////////
( t" u \6 m5 T CInventorySort* pInvSort = new CInventorySort;' a4 b" R" P; J& i3 C w/ G/ v! w; [
vector <sItem> vItem;" p* V" b$ }* x- ?0 {
vItem.resize(MAX_INVENTORY);//初始化大小! ~; s7 K6 T! A9 s& P4 T
//////////////////////////////////////////////////////////////////////////0 ]9 l* @" d' x! @
//填充数据
# q3 q: U! {1 C, }: e for (int i=0;i<MAX_INVENTORY;i++)$ \8 p2 x8 X) D5 J3 f# s
{( F9 c1 d1 O* \) s d2 H0 A
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
- A$ [1 }. p, l/ T5 m% N. t0 _ if (!pItemElem)
t4 a3 k5 Y, x2 ?" N" L {
3 _0 U: |9 R! K9 N vItem.dwKind2 = 0xffffffff;. }" K7 Q) D* U: c C7 K4 z% @
vItem.dwItemId = 0xffffffff;4 h( Z6 O! e* |8 M3 p: p
vItem.nIndex = i;
* c$ d) |8 l4 ^! a8 _) G }else {
# T' p+ z; g) R8 U ItemProp* pProp = pItemElem->GetProp();( g" F" C- f% Q/ O' r
vItem.dwKind2 = pProp->dwItemKind2;
3 Q9 z+ w. S y9 G" o/ ^ vItem.dwItemId = pItemElem->m_dwItemId;
0 m( H: c! k+ r- P6 k vItem.nIndex = i;2 L, e) `0 `$ {5 w- w- l0 o4 d4 B
}
1 r: R: B" y: N! F //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);1 ~8 N8 U% g h, }
}
+ t" l# Y* Q5 `, b( X. Y //////////////////////////////////////////////////////////////////////////& }- O+ V& P8 t, d! x/ i( x0 P; U
sort(vItem.begin(),vItem.end());//排序
6 S& i6 e# H4 Y) S$ _, }" I$ k! u //////////////////////////////////////////////////////////////////////////
( b, w, o) @3 L1 ^# e& r+ k //交换 S5 d' Q) K7 {; v
for (size_t i=0;i<vItem.size();i++)
" V2 |: X& B% R8 _, o4 z {. o) M2 ~* c' d; j+ G
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);; N h) K# ~; _8 }0 D
pInvSort->Add(vItem.nIndex);0 h# ~; F/ K: s7 m' T0 k
}
5 j' g( T6 P, v3 D8 K, A BYTE nDestPos = 0;
9 c2 b' D0 I) a for (int i=0;i<MAX_INVENTORY;i++)
/ G; C. ]: r Q/ K' E* i' T+ y {3 N7 O8 I, l5 v1 ~ B8 Y1 Q8 @
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);* y* q* f) P- B
if (pItemElem)
) @' _0 u+ [# Q* S3 }! g8 j {0 P& `/ ?% t* `& A5 c6 T8 u. J
if (IsUsingItem(pItemElem))( r0 T( D! x" O3 Z5 l
{4 ~" @: g. E6 T9 K* ^- j- C3 t
//这个位置无法放! @, e5 _4 `; {! _! J
nDestPos++;
7 d6 ]$ _- X& W9 n }
& M8 X% f6 D' i: N4 X }3 y& _" e7 }! `# U6 Z
BYTE nSrc = pInvSort->GetItemSrc(i);
6 D+ t+ ?2 v; |: r% m8 n& l+ E pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
$ B( n, P$ f0 Q; @$ N- O8 v7 B if (pItemElem)) k8 ^! P+ i% B
{
2 m) t( g- v: i+ ]2 }5 k if (IsUsingItem(pItemElem))" X3 j% y5 f) d# i& W
{$ r9 o' {" ~9 y, i" t
//这个道具无法移动,跳过
9 \ ?" c+ w6 m+ ]4 a7 |( G continue;, }- @7 y# |; b3 ? N+ j7 u
}" d( \) ?6 Q: h9 b7 @3 l% r
}else{. ]1 \' ^8 ?, R& l% F
//空位置 不用动
5 K% M1 c% @5 O$ M( w continue;* K! x" k) U/ Q# Z. q0 S3 ^+ Z
}
9 A h7 z- n7 S7 A //////////////////////////////////////////////////////////////////////////+ Y) t4 `& U7 s
//开始移动
8 h7 w$ a( D6 d. y" D# j3 W if (nSrc == nDestPos)
5 K5 N- |* _+ x6 F {
8 \2 b( D9 G5 I" ? //原地不动
3 v! j5 w& g$ w7 P( D2 {2 Y: s2 U nDestPos++;
$ O$ d/ i* h! L3 e" `4 |; U continue;
7 k, \8 o: D1 P4 X }
$ U7 x: C- |% s: w' H pInvSort->MoveItem(i,nDestPos);3 o2 ~! |* i8 \5 c6 s: w9 b7 @( v
g_DPlay.SendMoveItem(0,nSrc,nDestPos);* w& V! y% B" e. K
Sleep(5);
( s8 h" \! a7 H9 O" v- ]# }, e //Error("移动 - %d->%d",nSrc,nDestPos);& X0 L3 P% S! _
nDestPos++;2 e& Y/ v3 C$ m5 Z3 J
}1 W" I7 b' V* o9 f& {: ]
//取第一个元素的信息3 h Q# |4 I G4 s
/*1 D9 G9 b/ E6 w! l7 R/ S
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
0 J, V! O1 ?: T. ?7 c' \8 n. W {
3 P7 a: F* O8 B, B: L) G Error("Move - From:%d,To:%d",vItem[0].nIndex,x);1 I; ]# u6 U: J: \; L. h" Z
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
" D7 R! B# `4 ?9 Z# j/ m* R }# _( S. x$ f( A$ E
*/
! J' Z- J' o; b, _+ v //////////////////////////////////////////////////////////////////////////: @ {8 B# d% ]
break; V+ a$ s e4 I B2 X
}0 O3 \7 q, ^! N2 v G) o, W* N
}
3 T2 G% z$ u, K7 |9 J/ C5 @" }}, X* h/ \! N j" K$ \: Y
m_wndMenu.SetVisible(FALSE);
0 k' K# N' D& Y9 x! }, J2 L
& K: i/ U& D4 e9 w/ A--------------------------------------------------------------------------------------------------------/ O8 X0 A1 |. A& @) B5 | r5 v
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point); y# w! |4 S& D
{, ]3 D1 C2 f/ T+ f! w* m6 m% {
BaseMouseCursor();$ W& k6 H- W. ^9 J# h. ~
}
( K5 o6 Y G1 `7 a/ s, q在其下添加:
2 }6 @0 b* _' dvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)! |& q |; _' D( A
{
. F2 @. u- y3 Q: um_wndMenu.DeleteAllMenu();
$ [- R$ {5 Y! A" ]' N) e) e9 Lm_wndMenu.CreateMenu(this);
( @/ z$ b/ N8 B) \) A( o/ k* Dm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");. T# k# c: n+ b* q
8 ~+ u9 p0 o \& y% P( P
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))7 j) |7 m5 z! s N7 {
{7 ?# g3 q- i+ A0 l7 P- Z
//P以上级别才可以删除所有道具
; C* V6 v3 l; D0 ?9 J m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
: @5 y' Q7 c# b2 d# F' }}/ R" _7 L* D* F6 \/ A( y! z
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
) q" A% F, `. s! a* Z- Cm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
) o* Y8 J. ~" D; u. Qm_wndMenu.SetFocus();
- E: \/ t) N: {7 [, d}
6 J. E% h ~, i4 n------------------------------------------------------------------------------------------------------------
' E/ W+ [: U+ q% w. ]# s3 ?*************************
3 Q6 _5 N7 }/ M4 UWndField.h文件
: X9 J2 w0 v1 w8 T- X7 W*************************
! a. l% ]1 g9 J搜索:BOOL m_bReport;
& x! c" k1 g! k! ^/ r8 x5 E2 k其后添加:5 R# e9 q" s% j
CWndMenu m_wndMenu;
; \. B% z& v: h) s9 A0 {; C搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);) Y) V+ h8 e' _- J5 R2 {
其后添加:
. m! S, F; U! d1 k0 ^9 dvirtual void OnRButtonUp(UINT nFlags, CPoint point);
! J5 W9 g+ b" R5 R9 Z
: S8 ?0 }4 N: |" D! F! n# F6 D8 s U& E7 G) @7 G$ w
|
|