|
源文件中_Interface文件夹下WndField.cpp文件$ h0 g' s" I+ z' {
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
7 I$ o7 ]1 }: t8 O& n. G6 R8 j! l8 ~% S4 |1 M0 d' e4 o: Z* i
struct sItem4 O- _! `4 I/ H+ X) s& _, c
{4 T, w! J- R" n8 N; {
DWORD dwId;7 m y7 i4 [3 g4 b- s% E& \
DWORD dwKind2;
* h$ d) e- B* X$ tDWORD dwItemId;+ z! x* n8 C3 Q9 x! D
BYTE nIndex;
/ ~% Z& G, `9 i7 FsItem(){0 e" _; J4 u0 i8 b( [
dwId = dwKind2 = dwItemId = nIndex = 0;
! N4 }8 u' v3 I# r# G3 J& a P t1 e}4 z# m: ?9 T ^9 ~
bool operator < (const sItem p2)
! J6 i) ]0 X4 q% R3 e( S{
4 U. B$ u5 [+ o; w if (dwKind2 == p2.dwKind2); z7 _! i7 a/ _# P0 i5 D
{: W7 m( Y- ^' \8 Z
return dwItemId < p2.dwItemId;
3 J, m9 V( L5 e }else{* l; P7 J) Q% a8 v
return dwKind2 < p2.dwKind2;
| Y, w3 ?* ]( D }
; n; [- K8 t! w+ f}+ Y+ \$ O. j) i8 @7 p
};) S5 C9 G# v! U; @
class CInventorySort
+ v/ A `* ?) `! M/ x4 h4 O{& T. i! U) B9 Q0 ?. w
public:) r1 ^# R8 N: A' N C0 X
CInventorySort()' o8 M' `1 Y" l3 A
{- B" N6 W1 {3 \- U" p0 o
m_dwPos = 0;
& X6 c' s' R8 Q& w% M7 G}- P6 y/ E1 q' x! K* c* ?' q; |
~CInventorySort(){}
. h. G9 v) j2 ~private:6 b5 ^& y+ v, V# F: P% u
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息9 h. ?4 Y o( ?' J( V( z2 \
DWORD m_dwPos;5 @4 h# |% h' H& c3 S
public:& u6 U! S+ L- _ b9 G8 E( g
void Add(BYTE nIndex)
, T c) }1 f# x{
$ z* c3 X- F2 ~- [( w: P if (m_dwPos >= MAX_INVENTORY)
) o* _' m: \( u( W8 V {
4 _1 Y8 F6 T8 ?; q% L' l return;
# J7 Y, }& V6 I( C" @9 e w }0 U- X+ {% J) n) \+ {
m_Item[m_dwPos].nIndex = nIndex;! S6 X" F7 w2 i8 Y( F: v1 R @
m_Item[m_dwPos].dwId = m_dwPos;$ ]+ `8 y7 k: H* b8 f, B# S% l
m_dwPos++;! H4 t% n' V6 t3 C P' z. g
}" [+ L! q# D$ G t! D' ^# U
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
2 R1 |8 M# b+ @. Y1 O{
! Y# O# ]3 ?/ Y& e for (int i=0;i<MAX_INVENTORY;i++)' K5 C1 a d" K$ A, D
{
9 n& Z, m* q3 \0 N' Y if (m_Item.dwId == dwId)( z+ v, c+ o* k8 k' y; }1 E
{7 W6 N, G" P8 ?" ^. Q) w
return m_Item.nIndex;3 E, H) }* t1 Z5 [: J. [$ Z: E
}6 f0 P6 D. b5 Q! x3 }! L
}
. v% z) P, `3 @& m* W return 255;
4 V1 s5 J# F* c6 [1 a4 Q% J}
% p2 f2 ?- z( S' Y& O8 svoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置* V, ^6 Z- G$ e# g
{' x" ^$ p" Z+ b2 g6 Z
BYTE nTmp = 0;
0 I9 Z5 w% {# X! h* |4 l bool bDest = false,bSrc = false;+ {1 }- Q+ I, M# E$ c
for (int i=0;i<MAX_INVENTORY;i++)
: k4 i9 U5 e$ r {' C- ^ X) b2 Q5 n" J3 Z
if (dwSrcId == m_Item.dwId)' @8 \1 c# c v- d
{3 i, W$ \/ P& R7 R: `
//id相等 则 改变对应的dest和src
/ f5 O6 J; @( M* Q1 f nTmp = m_Item.nIndex;/ T: c6 `- p% [: ]; u
m_Item.nIndex = dest;+ a# u) d' U- m& O: b7 V* v8 q: `
}
7 ~2 R: E# O7 {. A, X' } }2 x! h# z! w, r ?2 z/ F
//临时数据保存完毕,交换开始
# X- T) b; @3 D: N f+ t5 L for (int i=0;i<MAX_INVENTORY;i++)
* b. j( W- \9 a. ]$ J: t6 u: T; Z {, m5 A/ l P3 o6 W* p! X
if (dest == m_Item.nIndex)
, H: r, A$ L" `( F {- g, {. a* Y: a' a3 t g; l+ M
//id相等 则 改变对应的dest和src+ ^* y( I2 c: w3 _1 y. o$ p! G
m_Item.nIndex = nTmp;* E* c) E" j7 ?
}) ^: Y1 w9 m' @8 C" a
}' m# n# p1 O: u' C# b& F1 f4 N
}
! P/ v! v D9 b; C' R* i};6 y7 K9 T% \7 Y! W) ~" e% B
-------------------------------------------------------------------------
. H" n+ ]! I* o依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )4 [% s% v- N: @1 X) C3 D- d
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);! o3 p& h* U* S. n; g! X
紧靠其上添加:/ _5 f/ J- v$ ^! f- l0 ?! E$ B) X
if( pWndBase == &m_wndMenu )5 w# \. J( q s7 r. d
{1 Z _6 O% a9 B1 f
switch( nID )
; O- N4 ^; A3 x$ J) ^7 c {
1 x Q" x0 h- `/ V6 T. d+ p case 2:
6 h' X t I4 T- q3 _3 {: P { O4 O X7 N t
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
& ?# z. [' e* z; `# ~4 g' h if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))) O" b# }9 Y, l% [: }
{8 C) e0 C4 x- |
break;: r: y5 r5 i8 Q+ A3 ?5 |* z
}& o0 O1 s) }9 t% @0 Y
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
* i4 |" |( N2 A( _( h/ Y# C4 f {7 ]# G w7 Y6 k: R& f
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
9 B( T. s/ Y9 L: A `4 E if( !pItemElem )1 D, l: e1 o4 m4 R) d7 b5 j. c
continue;
/ U2 Y1 r$ ~3 k t if(pItemElem->GetExtra() > 0)
/ \5 L/ k, x8 K; o) Y continue;$ q0 x2 C" V% ~7 Q! q- |9 w
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) ; {8 \' G9 @ t' E6 y
continue;) y% a7 R% D3 o3 K
if( g_pPlayer->IsUsing( pItemElem ) )
# |( J5 i. ?/ R# i$ M4 z continue;4 N5 v" n$ H5 g. I" W# E
if( pItemElem->IsUndestructable() == TRUE )# q8 q( o& W% T V# j* j4 X
{
5 m! B4 b+ Q" a" u g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
, c$ J! P6 v' V+ f+ h3 ? continue;/ N3 G, W7 P# k! c# q
}, f* c5 E- u0 L8 _/ K0 `9 a
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);5 w3 B* r1 j- {" p/ Z1 t+ C6 S
}
2 [% w7 G9 m0 f% X& u0 ?, x2 @ break;
t; L8 n9 t; e7 l }# D k- r( u" [5 _
case 1:8 t) g) D! E5 m7 D
{
4 ~$ u; R2 X# J/ M; G* Z //整理背包
! h8 L# \ D, u. m+ v. v1 c: V; ` //////////////////////////////////////////////////////////////////////////
& p! ]2 a k3 g' V //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
, |! r1 l. q" p. H1 L1 ? //////////////////////////////////////////////////////////////////////////
$ O/ `* t! `8 z, O //////////////////////////////////////////////////////////////////////////
9 g# j9 x, _0 b0 I) U6 ]0 T CInventorySort* pInvSort = new CInventorySort;2 g# d& }) p+ Y0 y% ?
vector <sItem> vItem;
& |5 n+ B4 d$ G4 V1 m+ {" a vItem.resize(MAX_INVENTORY);//初始化大小
* I8 h) U+ n X% o9 C+ S3 }5 h+ m //////////////////////////////////////////////////////////////////////////
" [1 h8 a" }8 g$ Z //填充数据2 u7 s2 [& Q* o4 X2 O# J
for (int i=0;i<MAX_INVENTORY;i++)$ G; U$ d% B, c- o
{
! ?. K: m* y6 z3 t! N1 j. W CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);# }$ u2 f+ D( }9 \
if (!pItemElem)
, E( Q2 K- l' V {
, A- q/ u; J0 a6 x! l# L5 o! ` vItem.dwKind2 = 0xffffffff;
9 t' r* O7 T6 X6 `) o; o/ F- c9 R vItem.dwItemId = 0xffffffff;
% ^0 T5 ~- t! U/ A8 g) K+ u$ [! ] vItem.nIndex = i;9 I% P9 _$ G& i" c6 m% F
}else {7 r) Y8 {$ t6 y8 p G. B1 I/ O3 o
ItemProp* pProp = pItemElem->GetProp();( b9 O( D+ b8 Z, g3 m O2 P
vItem.dwKind2 = pProp->dwItemKind2;
( @5 ?/ J( V. j! L7 y, J vItem.dwItemId = pItemElem->m_dwItemId;1 T) L7 M& V) I, V; \% G& q: F: G' }
vItem.nIndex = i;8 b" l% U9 C m8 v0 I0 r
}8 Y. ? l+ K7 z# F) `
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);% ]3 P* {2 z7 C( L% ^; K. x
}
4 p+ W; o6 u/ q) y* T //////////////////////////////////////////////////////////////////////////7 p1 S3 F6 Z; G. U$ d7 |* W
sort(vItem.begin(),vItem.end());//排序
B5 H6 b2 |. E& Z# A //////////////////////////////////////////////////////////////////////////8 ?2 J0 u# |# [2 v
//交换7 Q: V1 G9 U# l% u6 z' }
for (size_t i=0;i<vItem.size();i++)
: [+ |, E5 O: p6 a6 v' Y {
1 y) I4 [0 ~7 ?+ x //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
) \* o6 u# w7 ]: k- T$ r, d. h pInvSort->Add(vItem.nIndex);: r* H- R0 }, l6 g( d8 F
}7 d4 a8 i' C9 v" H% W6 _
BYTE nDestPos = 0;
K7 m! Y/ F6 c( o" e% u0 T' F5 H# ^ for (int i=0;i<MAX_INVENTORY;i++)
6 T$ @1 y5 R( F8 f) }9 s! [ {* b8 C3 E; N# D" e
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos); y' T2 f/ i9 j3 ^6 k5 `+ N
if (pItemElem)) |5 l+ `) _4 h
{
* L2 M6 k8 [8 c. K( U+ ? if (IsUsingItem(pItemElem))6 E" l! ^: R- r- G& g
{
$ p% b9 u% b+ @ U //这个位置无法放" h; T8 h* S! ~/ `
nDestPos++;
/ r0 W$ |) R8 A% {( N3 t0 ] }
; ?7 H! c' A; h U" `4 ~% Z }
, F5 |& t3 X% \$ y& d' G5 P BYTE nSrc = pInvSort->GetItemSrc(i);" d( ?3 v! r$ u$ ~
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
" _5 c, d4 g% d4 w: o! [) ]1 u, P8 L# w if (pItemElem)% a! Z! \1 @+ V3 u: E/ b
{$ E& v" Q: V- {5 z; M. q4 X
if (IsUsingItem(pItemElem))5 w6 s* D+ J- s r$ n8 G' p
{& W2 k- h' A: N- I( X
//这个道具无法移动,跳过
" S5 ~( B' R2 b. u, J0 O2 } continue;
% q+ o* D3 C8 k1 S8 T& d }; C3 I/ b8 |: {3 o: r( }
}else{( G" i5 |, L7 b8 b4 R3 @+ E9 Z4 @; q
//空位置 不用动
+ P7 V% H( b. a" l, m continue;, v4 c5 f' V( [* M
}
5 B7 Q$ p' y# N //////////////////////////////////////////////////////////////////////////
2 p' R2 l3 L% p$ d* f //开始移动
. K* R9 _. X! x+ _% S. w$ D, D' b if (nSrc == nDestPos)& _, N3 [& m( x7 }0 c8 L
{
5 b3 ?4 N8 [( }8 Z5 B //原地不动
) ]3 O! p" H8 C& \1 |" {& y nDestPos++;- `5 o+ z/ s. J. ^) a8 u
continue;" i3 H5 n- m7 g& m% u8 A
}" ^8 n A) w' C4 {3 K. T: O
pInvSort->MoveItem(i,nDestPos);. x1 W) E; F6 d$ C
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
, e: ^! t5 W. ~, Y) |' C8 S* @ Sleep(5);% g5 |- Z; W* P8 B# ^6 D
//Error("移动 - %d->%d",nSrc,nDestPos); I/ `1 D. t! L" x
nDestPos++;
9 |" R5 @4 Y5 p3 A/ S/ c }& Z1 w7 }( k! l7 k# D8 w
//取第一个元素的信息
7 G5 O: J4 b, h! v1 y+ e R+ b /*
+ j6 {) l, [% a+ H" k if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)5 }' X- R; U7 v
{
) M! O, O" ?; |, Y0 j4 i5 A$ P Error("Move - From:%d,To:%d",vItem[0].nIndex,x);$ ~5 i. h9 c3 C- r. P4 s
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);$ h/ ]& k F3 C
}; V, D3 Y2 s8 J6 B- q
*/% `) R2 C. x+ S
//////////////////////////////////////////////////////////////////////////
3 q2 u% [ E. { break;; n& I' {9 j) } `
}
* V2 X. ?% Y. s# b9 Y } " [0 C" N5 i: ]3 g5 Q# }& O4 f
}5 h3 o8 X/ `9 R" K; ?& ^
m_wndMenu.SetVisible(FALSE);
! } E& B0 ]! S* R; x: n# T& B. J; l. G9 ]0 ]
--------------------------------------------------------------------------------------------------------
; @' J0 V8 N' N: Y6 C$ B: q搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)3 P; U9 C* Y$ I7 X$ q" |% D
{
/ c3 `# T' a) l: T: qBaseMouseCursor();
5 c4 p% d4 K, k* b. o1 T}. I# l7 F+ C# w# v4 L
在其下添加:
6 ^$ N. \: J- g( X/ hvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
i% f" j% {; P) W) M* ~* Z5 K6 F{
3 r3 V C* r' O8 m" Um_wndMenu.DeleteAllMenu();$ {6 M/ B( A7 I W" Y
m_wndMenu.CreateMenu(this);; i5 i0 [; \! y' w* H% x
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
, c9 t; K b: a
4 ]2 y! i4 c/ fif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))( }2 `4 [! i1 G' }8 B0 r. f% n) L
{
9 L' o' Y+ p( C9 }' [ //P以上级别才可以删除所有道具
|8 m' H- p+ [! |9 p- v m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
# }% r' q, X/ ]( |% @+ i: [}9 d [/ N" {8 V; T0 g- N! s, B
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );& H( V+ P$ T) T+ p& b& F
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
2 k. j$ M+ ]0 i9 `) I7 A/ Mm_wndMenu.SetFocus();6 \% t) q7 X' }, a( k }9 c
}
; c! r U& k4 z& S' R5 ?4 w------------------------------------------------------------------------------------------------------------. W; M3 S8 L+ }, e2 w* x$ N
*************************
3 @6 w0 w; r Q" dWndField.h文件
1 l6 H7 D) b5 ^& ^2 G6 z*************************1 F7 H! m+ s. D9 c+ N
搜索:BOOL m_bReport;
7 C$ H" @3 v0 L: N: ?+ x其后添加:* S( W4 s. n2 [* I1 [) ]
CWndMenu m_wndMenu;
5 T, ?. t7 w# g3 G/ o) P搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);# X4 s3 c, {5 x& a8 h, U! |
其后添加:# w4 ?3 }9 i3 I
virtual void OnRButtonUp(UINT nFlags, CPoint point);
9 B; s6 n9 A% G+ c3 c, I7 D, N0 w4 K+ V+ p# R6 D5 D
+ G' @" ~( v0 B6 f" [
|
|