|
|
源文件中_Interface文件夹下WndField.cpp文件
" S: W/ T- n% S5 v- }* M搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
# p0 L) e6 R6 @) X6 x$ N2 D* V9 U; }+ `
struct sItem9 Y; N# h7 \. x, q) E) D8 A
{
9 _$ P8 t5 i; DDWORD dwId;: M o. Y; |0 c+ |1 J
DWORD dwKind2;
$ e' v1 b9 R4 Z } PDWORD dwItemId;' Y6 l8 x y: C. Q5 d# C9 I
BYTE nIndex;( e7 I# Y/ M; G2 j
sItem(){
3 f) A1 y/ A9 z, G3 L, L dwId = dwKind2 = dwItemId = nIndex = 0;
: g( C+ W" ^* z, L, {}
) ^' j0 v& L' u% f- ebool operator < (const sItem p2)* S% |# _* m- Z/ Z$ Y8 T4 X' }1 z$ H
{
1 y1 b; _2 g# m' ?6 q7 K( N4 ~* O if (dwKind2 == p2.dwKind2)
?; [8 r9 {' o/ o2 k; W {
4 q' T! X3 K* d return dwItemId < p2.dwItemId;! Q/ e, M0 L4 k: v4 U7 e- s
}else{% Z U, y: d4 q& n% N
return dwKind2 < p2.dwKind2;+ x* F3 Q g% b: C! o
}6 H+ ^0 M# l- [. d9 ~. O4 m
}
8 A" O, H% y1 k( O4 v};% H9 W6 J% ?( B
class CInventorySort
( Y7 o8 E& X# u4 z" w0 d{
( c) e- E; c$ p9 c- ?- cpublic:: q# k% E( P& X& `, U
CInventorySort(). c5 J1 K( c: @; l- F/ f
{( b( f" |# A. }& [
m_dwPos = 0;
# I0 ^" E# u# z7 a& _8 i( N}5 R* L3 a, N0 K3 n# b( O
~CInventorySort(){}& m+ b5 ?2 P2 t* G
private:! t( v8 W" F) B- K: B- Y/ K. L
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
" Z* u k6 u8 y) ?$ x5 vDWORD m_dwPos;
* L0 n( q& U+ A8 ]! fpublic:
3 f5 G! B) g6 h+ Y4 i4 K2 uvoid Add(BYTE nIndex)
$ Y6 `' U+ Z: ^& D) @{1 [4 L3 c( T, J- G' \- r
if (m_dwPos >= MAX_INVENTORY), D* F* L& V% Q! M
{2 N: P. X5 o4 Q
return;
+ F1 S7 E' p/ ?1 ]; e5 U9 G' i/ z }( h* g1 E, r, W: W6 }
m_Item[m_dwPos].nIndex = nIndex;
2 a, q0 F8 Q5 e1 I' c. d9 ^3 S6 L m_Item[m_dwPos].dwId = m_dwPos;
# U! A& ~- k& z% w) y% I m_dwPos++;
& H8 U# h3 Z8 W/ u! f+ H1 D6 {}
" |* k5 d; R5 k6 l% ], a+ O4 b5 M0 UBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列. [3 {4 e) [' x; d' i* W: O
{! r% x& X+ C' H2 ?
for (int i=0;i<MAX_INVENTORY;i++)
9 q: G+ l% V2 Q: w2 j6 Y {
k R; D$ _- ]! N3 ~% Q/ @' x0 ` if (m_Item.dwId == dwId)
0 p. b A! S' C8 g3 z$ a2 f {
, t# j0 ^( a) X return m_Item.nIndex;
/ R8 i8 U- c* T) |1 r" V2 Z }0 t) {4 ^3 x; y- \* r2 E3 Q l
}
' O7 W# Y- x J! g. I% v2 e! d return 255;- W. I9 H4 M3 [
}8 E+ l0 q w! Y9 X" e( Q b) g
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置" I) |+ U& e2 b. F
{8 g J" G, Y j( X# J: L
BYTE nTmp = 0;
) W$ t& ], C6 v* m$ t bool bDest = false,bSrc = false;
- f0 N3 H) I8 f+ w% m for (int i=0;i<MAX_INVENTORY;i++)
0 U3 t, S/ F. B7 F, T* z5 P {4 Z6 T& R% G# u- ?6 z0 E
if (dwSrcId == m_Item.dwId)
1 O8 K5 C, F8 b* z {1 B$ c: }4 L% L8 u# b' x
//id相等 则 改变对应的dest和src
6 s6 v! U1 I4 V, o8 Y% N! V nTmp = m_Item.nIndex;
- A9 u; W$ K- K/ w m_Item.nIndex = dest;' I: Z$ a; X0 t7 {. A4 X
}5 {" B. o$ m4 S U
}, r2 z8 }( J u2 z& M
//临时数据保存完毕,交换开始
3 H1 [7 ` x/ v# P7 B for (int i=0;i<MAX_INVENTORY;i++)/ S5 t/ v& D# s) R% b+ U( o7 D* y
{+ \3 @2 y! V; H( b1 X
if (dest == m_Item.nIndex)
) S$ ?0 x! I" i: ]% Z {% g+ C* j, X2 [0 L4 {
//id相等 则 改变对应的dest和src
- ]( l8 m9 ^8 A( w. R5 G m_Item.nIndex = nTmp;2 H) O. \$ M+ }/ t1 X! o9 Z% m
}& a6 F `, k% b6 l+ y ]9 C
}
# d1 ]# C5 H- I3 \" Y& @}
3 C) o1 v% T2 J0 y+ |};- L5 W) r- {7 T9 u
-------------------------------------------------------------------------
9 {3 P; ^7 W7 E' \9 I* Q依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )1 z( Z1 V( G5 [! b" ?# X& H2 P: M! a
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
: @( e) ]( _5 r紧靠其上添加:5 O& G' c1 Z3 J7 E
if( pWndBase == &m_wndMenu )
% I' W. M) G2 j$ n/ `9 z1 r6 U{( j2 c m! w- V( o% ?
switch( nID )5 I$ e2 p) }& d; S+ y: _ G3 p
{
* b6 }, w; m* r/ S1 X case 2:+ T4 _9 w# z% s
{1 n- f: w0 @4 q" g1 O1 s2 [
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);& c5 S, B" [3 B* M. ^' D/ f
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))% I/ p- P4 x) X2 o
{
2 O/ w: a {4 F" t break;' ^6 |6 k8 X5 b: x
}
: f8 @" h' t2 u9 V: n- ~ for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++): l6 a" |3 I/ @' `- j" J
{- H+ |, V M9 g6 r
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);, s0 l# w6 k6 R: ^" @, G
if( !pItemElem )
: I% U- R+ T9 ~2 P continue;
5 y$ C* E& w g/ Q' |& C. v3 v if(pItemElem->GetExtra() > 0)
- @7 ~ I- U3 j& o3 L' j- @" E: A continue;6 z( Q4 E9 u+ N
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
K* x l9 I# \5 M0 P, C continue;
; T6 ^' \& h, u+ |8 y if( g_pPlayer->IsUsing( pItemElem ) )6 U& R6 `% z7 R
continue;! C% i$ o3 H" p* H: r! H7 N( Z# h/ c6 p
if( pItemElem->IsUndestructable() == TRUE )" _! R6 T5 \4 l: P+ `
{
8 A4 T* S0 `" _ g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
4 }* X3 J9 m! m1 h$ | continue;
; N: v% T' {. {$ W }
' H( K$ d2 w1 ?0 Z, a! A' M g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
. u' v6 {9 i( m2 C }8 w& J- U, N$ @5 g5 k" J1 N( N
break;
$ }+ |- s+ r6 G" B( V }
/ h- ]& c; e, n- x% o, n5 T case 1:% L2 O) f3 Q4 ?3 R4 |
{
. V7 V$ @. Y( e: B //整理背包
: Y1 A8 q3 z: L: Q) i0 _ M+ w //////////////////////////////////////////////////////////////////////////
" X. C5 l) w: t% Y; b. }2 l. ~3 X8 y9 F //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );) p1 Z; t `$ O' R$ U! G5 t9 a
//////////////////////////////////////////////////////////////////////////
+ S: Y G9 D) @ H6 [0 v- d //////////////////////////////////////////////////////////////////////////8 }: w3 a3 M6 e" B) M9 ~, G, ?
CInventorySort* pInvSort = new CInventorySort;
1 ^ i3 f) T( k' I vector <sItem> vItem;4 ]: y" ]* Z7 P# c6 f$ P+ Q/ U
vItem.resize(MAX_INVENTORY);//初始化大小
+ e: {; Z8 A8 r2 y4 p' D. y //////////////////////////////////////////////////////////////////////////# c3 T7 U8 ^2 f- d
//填充数据
: S: Y( |( }0 d for (int i=0;i<MAX_INVENTORY;i++)
" S2 a3 }; Y8 e. I, w5 m { N, O' \# C# g3 x9 C+ l
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
" l& K& H! B( `; V if (!pItemElem)
8 Y9 ]$ D1 K5 H- C D" I8 ^/ m1 g {
8 S0 p- ^8 X6 J* _! @* {) V vItem.dwKind2 = 0xffffffff;
* D1 q4 J: `& Y4 B/ q, W& T vItem.dwItemId = 0xffffffff;
! t: [2 G6 i) J" k3 Z! X. v% M% v# I vItem.nIndex = i;# ?- ~ ^3 S2 L. W# p
}else {8 j4 h6 J6 L: N2 W3 t
ItemProp* pProp = pItemElem->GetProp();/ D8 f7 a$ C. L
vItem.dwKind2 = pProp->dwItemKind2;
. {! @2 N. w/ q8 z$ _ vItem.dwItemId = pItemElem->m_dwItemId;
+ a1 g9 T E1 o3 k/ f$ d vItem.nIndex = i;
8 Q O j+ S! P9 p }
; G% O3 G3 |" p% L" A) N$ l //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
/ n' a8 i% A4 s }# @% r& e1 p) F
//////////////////////////////////////////////////////////////////////////
4 X0 ]9 Q x) l; i- {: I2 R sort(vItem.begin(),vItem.end());//排序
5 C) F) j. H |/ `9 y- I //////////////////////////////////////////////////////////////////////////* B* K6 x4 B" q( |
//交换
* d3 B6 B4 F; O% p for (size_t i=0;i<vItem.size();i++)2 c2 o, u& f) R5 h, D l+ ]" E
{
( B4 L0 q$ X' W$ f' U0 e. K //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
* n+ O `% v: ?) ?# [1 g pInvSort->Add(vItem.nIndex);
6 H5 f, x {! Z. k; L }
1 f' u9 z A' Z5 G BYTE nDestPos = 0;3 \, f3 B) A2 x
for (int i=0;i<MAX_INVENTORY;i++)8 g+ d" r/ e& W& N# t7 J
{
9 G5 h$ S) L: I CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
# H# @, W; j1 ^( s9 D. o; p8 H% e) b if (pItemElem)$ o! t8 ?% ~5 o2 @) a5 n
{
& a9 D9 c0 M0 O9 E if (IsUsingItem(pItemElem))1 h. g+ @+ i( n6 A, Z: y f8 s u
{1 g2 s" j6 u- @/ h$ y, e% Z# f. C1 }# l
//这个位置无法放
7 C3 w/ X+ v/ t e nDestPos++;7 r- u3 @7 M. j
} e/ L. k7 L# ]/ R* d
}
6 Z3 ~( D" |2 V% I. b BYTE nSrc = pInvSort->GetItemSrc(i);4 ^4 S' r6 T$ G( f
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
' Z' K' o1 ^: C if (pItemElem)" n* s. @/ g0 O1 `) d
{" j; d* o, v4 P; v) j( U
if (IsUsingItem(pItemElem))
, U# \. i. C4 Z( ?- [& } {2 G/ n# k7 {2 i; r' b$ z) e
//这个道具无法移动,跳过
9 @8 C0 m! q) ^- A% e continue;
. o. P5 f5 g8 E6 A" j1 S }9 ]1 r4 ?3 a: p3 f+ l. o5 `% Q- H
}else{
Y' |2 [3 C/ Y! C$ I: Z //空位置 不用动, Z; A( c" V8 A: a0 v" q1 B
continue;! X) x4 f- w- Z# H* U
}5 T/ \6 J7 |: s6 f
//////////////////////////////////////////////////////////////////////////
g# [0 C D! [2 t; ? //开始移动
' g+ [+ j( o/ L( T, _ if (nSrc == nDestPos)
+ O# E- Y2 J+ R% e6 f# [5 J {3 d) l; J/ w2 Y4 m' c5 D0 Q" A
//原地不动
- X8 f. G0 M( T nDestPos++;
. Z9 C! c8 U2 F( d3 l, N9 l5 W continue;7 w1 w/ M k' g' b& E8 R
}
" r2 |; V5 R+ p9 N+ u) `) P pInvSort->MoveItem(i,nDestPos);
/ u4 r1 [/ n9 Y" J6 P) O5 b5 Q g_DPlay.SendMoveItem(0,nSrc,nDestPos);6 N! z! O- a" {, ?0 q( e# C+ I# w: L
Sleep(5);9 ^4 l' D# m8 q9 d& g8 f3 B$ x
//Error("移动 - %d->%d",nSrc,nDestPos);
4 h9 v3 n5 N( X1 k/ g nDestPos++;
% {2 z4 A9 V6 \) O k! J1 \- g }
& v; y) j3 k3 b, Y //取第一个元素的信息1 s6 K8 v0 J9 n8 ~6 U1 f# o. q# E3 X
/*
F" @4 B; g& N2 z if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)9 l( k. X3 X3 m! Y4 i4 A
{
3 s$ \4 Y) D5 m( Q* A& V Error("Move - From:%d,To:%d",vItem[0].nIndex,x);# E3 Q: B7 Q5 n2 _& e
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);9 t9 Z: U9 u/ Z$ v- I4 e
}' U3 d7 q* Z q/ a7 R" R/ w
*/
- {6 E' Y' a7 {& Q) a* `+ K% r: J1 K& n //////////////////////////////////////////////////////////////////////////
% l. {* a& [0 [; X0 j; x" h' ` break;
0 X4 n0 Y! P+ @; e' S, s9 ~ }
4 t) E# y4 N7 W6 H# B9 M. } } 7 h+ E8 C2 @4 s2 U( o
}8 w K" t6 Q3 J: I. W, @
m_wndMenu.SetVisible(FALSE);
* r1 Q9 U: k! G4 B$ O2 Z* |' |" A& z
--------------------------------------------------------------------------------------------------------
5 w4 q3 {8 Y1 A* w3 n/ w8 y, [搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
; l* Y- n$ \9 Y4 F7 {, y, v3 ~{* U4 H: I' q& W% Z
BaseMouseCursor();' E9 R9 I \1 h& A# v0 x6 N
}6 C& w1 e5 _* o& b* O9 t7 Z! X
在其下添加:
6 V7 N2 d1 R' uvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)& A: |( P3 h) j T. _4 r8 q" k
{
" Z% k( f" W9 L6 z5 I) Hm_wndMenu.DeleteAllMenu();
: K7 J6 n1 ]$ g" m# B$ U/ Hm_wndMenu.CreateMenu(this);* I: T, [. L: K$ r) x" F* I1 t
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");0 m1 i, d/ ^( f" \# {
" G6 |, p, c( Y2 Iif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
L; `1 G. ^- m+ y0 J0 X{
* V8 X: y* r$ t+ X5 L% r //P以上级别才可以删除所有道具4 v3 W* Z+ A) J, }% {) u3 b+ z
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
) D1 K- C$ P) o4 W& y% X* R( g7 q}# l+ D7 \2 T3 m8 D3 ?
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
8 K; K! ~$ D1 s9 w9 ~: Vm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
4 u5 y) N" E' k7 V! Q6 t7 Om_wndMenu.SetFocus();5 W! b* z1 N8 H2 o2 F, N# e6 n
}* t4 o/ L9 {5 B2 G2 t
------------------------------------------------------------------------------------------------------------! C" P' h, s$ K. b/ @
*************************
5 \+ ]% ~& u6 t* DWndField.h文件
1 T( _1 @8 Q5 L. P*************************
& p- `/ }, r2 Z4 M+ B搜索:BOOL m_bReport;
8 U1 D8 Z9 U0 k# [$ h0 Q其后添加:7 {$ D: e% J' m/ A, y
CWndMenu m_wndMenu;9 Q+ a& [% f* R
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
1 b- {7 t" I6 C8 z" d, q其后添加:9 D, v; w0 z4 M- k0 g/ G4 W
virtual void OnRButtonUp(UINT nFlags, CPoint point);1 D4 c; M' K9 h4 D
' V7 i% a: `8 x0 r5 j3 M7 H
0 _: n9 a6 y# d |
|