|
|
源文件中_Interface文件夹下WndField.cpp文件# i1 [1 D) c U! b0 S
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )3 g% n4 O0 k. v3 t7 i% [1 Q
$ D* E' v, q5 _: A V9 w Astruct sItem
- A" K5 y9 G" t, w% N7 k9 Q{
' p$ H' O8 k: X& d4 W3 y* iDWORD dwId;. m6 R* L: t( h
DWORD dwKind2;: y' [4 O) _ e0 u1 c
DWORD dwItemId;7 Y' _- p) J3 B; D4 A7 L5 _
BYTE nIndex;; M, F/ g, c: K
sItem(){
+ o7 L+ e- g7 e* Z+ N% Z, M dwId = dwKind2 = dwItemId = nIndex = 0;* ~$ |) G! h8 W6 |
}
6 L. K9 b+ `. rbool operator < (const sItem p2)
) S( ]+ l5 ^/ Z2 x$ Y{
" D' _+ U3 K" U; {/ A if (dwKind2 == p2.dwKind2)
. L; H$ c; i& {* G6 I( }$ O {
2 y$ _6 v' w' L return dwItemId < p2.dwItemId;
4 c0 A1 a+ V2 ^. d" F }else{) n; y' ?! A& T( m! ]8 C+ a8 z
return dwKind2 < p2.dwKind2;+ G+ ^, ]- t5 A1 {7 R: ?* z
}! t& a8 |# n# l
}+ P9 B( Y# g) w8 L5 |& c( L
};! u- `# Z& _: d5 s2 R" E* _
class CInventorySort
8 a f. p5 b/ M{
4 d0 d7 ~* H" V* I1 a8 Z mpublic:$ f* w' q: l- ~( b1 o2 r8 c9 F1 \* n
CInventorySort()
- g% O; Q1 J; k! I" V{. c( H6 L+ L2 J
m_dwPos = 0;" F9 r+ |+ i" o6 P' M
}
( o) b. v( x! N) n' U5 K~CInventorySort(){}
, A- V! O3 X! W6 _private:- @# }6 A/ d! k' {
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息- q& D3 t2 q( I7 i/ ?
DWORD m_dwPos;
o7 _& w( j x. t% Apublic:
' l! U5 j; ?! K. Hvoid Add(BYTE nIndex)6 z7 ?+ h6 W# D5 I
{
* Z- E$ ]6 X0 v( D0 u( X if (m_dwPos >= MAX_INVENTORY)
+ p: Q4 b+ I2 F; J {
! B7 C& a! h& T& { return;% I8 |% T& E: b' n8 g
}' I, b, |4 Z- ]1 w
m_Item[m_dwPos].nIndex = nIndex;$ w$ J* J0 }$ k' ?* J% ^! O
m_Item[m_dwPos].dwId = m_dwPos;- L# f I; w, k* X4 G9 d0 k4 }
m_dwPos++;
6 J+ X& B9 s {# `' ^1 }: H+ i}
9 Q* @4 b' z( A5 e& X" u, {: ]5 PBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
: ^, G/ z9 B" D# T3 r/ u- o{
, M# t- u/ O' Q6 M8 P for (int i=0;i<MAX_INVENTORY;i++)
$ P& N+ ~1 F* G( e i m3 v2 O4 ^& a {
; |! m& |0 T, e3 u if (m_Item.dwId == dwId)5 c1 A& G( Y: j, O* ^
{
e: v! M) B7 t g& M return m_Item.nIndex;
! U$ k4 g9 p! s6 i }
) t# G. T% k' B, P5 }7 k }# U( S$ n* {/ p+ q$ n
return 255;
0 H3 D, \8 u3 E" ]( m}
9 O, j$ k) F& @& S$ o% Wvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置& H0 r6 T7 M; M; s
{
! G- Y) Y5 l9 | n8 ~ BYTE nTmp = 0;
. v5 G- t$ _* c bool bDest = false,bSrc = false;& ?( |2 m W, c( g! {3 m
for (int i=0;i<MAX_INVENTORY;i++)
7 j4 s: O7 g7 K& H( L) `' C* d {( ~5 _, X$ U/ Q4 N. |/ l k% N
if (dwSrcId == m_Item.dwId)
+ k" j+ N3 s' W: L/ n" G! `$ y {
1 P! `4 ?" k G2 f2 w //id相等 则 改变对应的dest和src, y7 F9 @( i8 ~, Z9 Y: x) [
nTmp = m_Item.nIndex;
9 z; J. F4 H: e1 [; @5 s m_Item.nIndex = dest;' r. [, Q$ l) D. \) ^/ o& N
}
2 a+ Z% r' f7 P. O0 f( h* w }
- B4 G( x& O4 l5 D+ m" E/ m //临时数据保存完毕,交换开始 ?- u5 E- Y6 D4 a
for (int i=0;i<MAX_INVENTORY;i++)# J2 T8 r" B: z4 a8 x t
{
- E! e, i3 ?2 B2 u- Y if (dest == m_Item.nIndex)
, A" V2 y( e# W* k {9 ^" W0 P' u6 C0 y! A) S
//id相等 则 改变对应的dest和src$ \0 P4 ~( ~+ Y9 g0 [. n' W: E
m_Item.nIndex = nTmp;
: z F& _/ g- }2 S }. h" ]9 s; u" l( \7 ^- ^& `
}
* O q7 w6 m7 t6 d1 D}, }, y: g/ T7 R+ e% f
};, ^! F: T" }6 c/ {" V; D0 b
-------------------------------------------------------------------------: c' T+ _* T/ E3 ~5 x6 D2 m
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
% M9 O' t, D: d搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);% r8 R/ s9 R0 l6 H9 P' M
紧靠其上添加:# R2 R3 v1 X8 ~: Y5 p
if( pWndBase == &m_wndMenu )
' A: }/ Y. W* e# S5 ?! o% I+ C0 C; ^{4 h# D0 h8 y; o) Y( T* S2 @# w
switch( nID )0 V1 a' c+ }) P% @
{0 h+ P) D [- O& j6 G1 ]
case 2:
, q d* u9 m; S7 v, u! M" ` {
$ n1 r) X8 b+ O3 J$ e //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
5 W2 U* D3 w1 d9 X% [ if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))$ y% G4 L7 d* ^/ _( Z& ?
{
. R/ H0 ]3 g5 t: @, z break;
, S# {) B F2 l) X, x: u5 m }
5 T4 L2 `( p7 X2 ]' O for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
0 [3 e; F, C) L1 R7 M! I {4 e3 D: k8 U1 ?4 v
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);. Y0 m- Q! n8 R3 ?: {$ L
if( !pItemElem )* @/ ~, O! r2 G, N
continue;
( B* A6 I- x1 F% ~. z8 k if(pItemElem->GetExtra() > 0)
4 C8 {9 N( h) ^ continue;
. n0 q* D+ l# A9 w1 _+ _, o if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) $ f# U: g, }+ g9 B/ G
continue;
% f. ^8 q; v7 f& J% T2 u if( g_pPlayer->IsUsing( pItemElem ) )
+ n C9 w# P& j continue;
0 @1 x, U, L- u" K if( pItemElem->IsUndestructable() == TRUE ) W3 X. \' I4 D' Y) `: z/ H1 s+ q
{
+ `4 o8 B) r, e g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
& m6 t: D; N2 d( z& p continue;+ \- y6 p T1 D
}# J9 g3 V. Q" c ]% q( h# I
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);6 T# }! `/ p3 K$ s4 T. z; V
}
$ R- c b y0 p ? break;
+ P4 E& n# B0 v3 F; q0 D4 I2 b }2 T [7 S4 X" t& T9 Q% r
case 1:; W" X+ d. l- y/ }6 t
{1 \& k: t) @2 v* C0 C1 u! }: w
//整理背包
6 z T: @, {+ x3 Z2 y //////////////////////////////////////////////////////////////////////////
: x; Z% N1 y' y' Q) l3 U //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
u+ Q- s8 d5 l0 s x* }- N //////////////////////////////////////////////////////////////////////////
: e2 e1 w! M4 O- A3 u* `, H* O" t //////////////////////////////////////////////////////////////////////////# s) o$ S" V$ J0 m5 ]( @# V; A @
CInventorySort* pInvSort = new CInventorySort;
6 B" N# s- i9 }0 n* k: V5 W vector <sItem> vItem;5 j; Q% \! e& V/ @ `( n8 S" b \
vItem.resize(MAX_INVENTORY);//初始化大小5 K; p6 q- K8 h9 |$ q L: y. X
//////////////////////////////////////////////////////////////////////////& k8 ?. e1 w. {; O( x- T
//填充数据
+ g0 ^, y: |8 Z1 S ? for (int i=0;i<MAX_INVENTORY;i++)
0 u/ l5 o# W" ~1 D% G2 L8 G0 F+ A {
; X. A( ~; N* X8 _9 `! F CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);( f; R' a1 |. D5 ~$ a
if (!pItemElem)
0 C: \& Z/ D$ k% c {
2 O, U4 i2 a& ]: T% ^7 v; ^! \3 @) N vItem.dwKind2 = 0xffffffff;9 t: N O; q1 u- L) R. B
vItem.dwItemId = 0xffffffff;2 ~& b! t0 t+ m& n4 j/ i4 L
vItem.nIndex = i;
% Y" r; D, I' r& R }else {! Z5 ]$ t2 U; D7 r
ItemProp* pProp = pItemElem->GetProp();) @. E5 g* {1 e0 e) p
vItem.dwKind2 = pProp->dwItemKind2;! B) n$ ]$ O, R* C5 [. R2 j
vItem.dwItemId = pItemElem->m_dwItemId;% G+ |% S Y8 W3 h9 d5 y5 Q" x* P
vItem.nIndex = i;
% a4 G Y1 K' ] L2 s! L }
6 A( k) F) `1 h //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
2 m+ Q9 b/ \2 M' Y }$ B( y5 o3 @/ |
//////////////////////////////////////////////////////////////////////////# {+ X2 [% L1 @& |$ b
sort(vItem.begin(),vItem.end());//排序
2 h% `" h9 K; w" _2 G6 Q //////////////////////////////////////////////////////////////////////////
% ~" y$ b1 t( W //交换. Q( j0 l: c" S) p/ n- @0 U
for (size_t i=0;i<vItem.size();i++)
7 @$ @: l, ^- U! G# b9 @! \ {
# V2 a% l9 @* ]! p3 J$ b //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);) L$ S2 A/ |7 S/ q/ G" d y8 H
pInvSort->Add(vItem.nIndex);
3 e( |& I+ x0 P; V S }
+ ^% H6 x/ A" G; Y7 V BYTE nDestPos = 0;
5 p, j" R# T3 R8 J! W2 ^ for (int i=0;i<MAX_INVENTORY;i++)3 @$ t) r0 L' b5 D& m9 u
{
, }1 b: \* ]4 z5 z" j; i+ Z CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
: |* _, W0 C. R& q V& { if (pItemElem)1 Y, ^% A, @4 ~2 E2 m* B5 p" h; J6 t
{
' p/ z y3 ?3 j& P% x if (IsUsingItem(pItemElem))
, G) }) M. w, L" z9 C- n6 _ {% {* _4 i7 o/ f6 i1 O
//这个位置无法放4 T1 a5 ?$ l0 {" i3 U/ _( s
nDestPos++;
1 j& ]. u4 F2 V. r: i }/ Y. w# i6 z) {$ N
}3 ]3 l( D3 X) |( Q
BYTE nSrc = pInvSort->GetItemSrc(i);
4 J0 D9 v! u. B/ |% E pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
+ O% I* q; n1 J$ Z if (pItemElem)2 Y: y5 u0 T) A/ u. N
{
; q- Z- c- b) T0 s) N" H if (IsUsingItem(pItemElem))
' g. f- K8 s7 V0 T. T% {0 @ {
2 T6 Z2 {8 j5 a S1 ^8 ]8 B$ q3 t //这个道具无法移动,跳过
) S/ _! s B' _# H8 z+ h8 v continue; l" j7 b% J: X
}, c6 d* I% n- |( D) [
}else{
' u/ ]# [( h) D( O- ]4 [3 G0 N //空位置 不用动& S5 ~1 i$ r0 n X# w
continue;& G: u- G- U" J- j
}1 W& e# I% r! D* }* E2 v# X3 i
//////////////////////////////////////////////////////////////////////////
% f8 e7 R2 k3 ~: f- U; H) X. v$ K //开始移动
5 h3 k* h( m' \5 G$ F- J1 X if (nSrc == nDestPos): g7 r6 F+ @, Z* ?0 P; N
{2 [; _' c5 H" E( v9 c$ Y$ x
//原地不动
e. Y8 @4 I. d4 O nDestPos++;
5 J8 J6 g0 {* y continue;
# k1 F+ k7 l% N8 ~ }
2 X- T6 \$ C) D5 `- V ~/ ~& W pInvSort->MoveItem(i,nDestPos);
2 j' G9 B# Y3 E* T- k5 Q/ B7 u# s g_DPlay.SendMoveItem(0,nSrc,nDestPos);5 g6 z; L E+ g: y; e& n
Sleep(5);: c6 M8 H4 q( c2 u& ]1 B! j3 A" w
//Error("移动 - %d->%d",nSrc,nDestPos);
W; Z3 P' ~, | nDestPos++;
3 [# q3 M( p4 q' t }' \: k: l' k1 i9 k: x/ q8 g' @
//取第一个元素的信息7 Z; o/ x7 x% l# i: x& f+ I0 s
/*7 Q; w- C |9 m: }2 Q4 W0 J
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)4 t2 r4 |& C/ z# h7 U3 [
{
3 \ k& C- A7 j2 c1 u O4 q$ Q Error("Move - From:%d,To:%d",vItem[0].nIndex,x);7 z x0 B: H( p4 J
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);0 {, P M, z. y- d" n% @
}
# Q9 e: N5 o5 H! P. M* ?$ g */
! ], n+ B1 R) {% f) [8 Q1 l( y //////////////////////////////////////////////////////////////////////////' P, z5 |( Z5 R! c' a' B# H" t
break;
7 r' [( E2 Z+ J% O }
# F- r, e9 @+ [7 E: ] M } : P% R% P" O; J8 f. W- y
}, E1 b: T/ m9 o$ M( }
m_wndMenu.SetVisible(FALSE);
" [; |, b. j; o) @* I O9 B/ W( r U& ~, C
--------------------------------------------------------------------------------------------------------
# V0 l6 m0 Y" ^8 |搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
1 C8 z$ e) w$ \{
; N. V4 A9 Z3 c/ _* C) EBaseMouseCursor();) E' x& Z/ p4 p' `6 r$ V2 f
} X. C; ?+ h& E! w2 U+ X- e# ~ D
在其下添加:0 l& [4 A( g# v4 P4 i+ E
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)7 f5 k1 g" [: }6 W$ T9 X
{3 t4 G7 ^/ B4 @ |- ?* w& u7 U
m_wndMenu.DeleteAllMenu();
, c' L! R! b! S6 w! t8 O9 |1 Fm_wndMenu.CreateMenu(this);6 K$ x9 x% }/ j# R& c" @" `
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
0 Y1 q4 p% c9 s% ]/ \
% w* p4 G4 j2 q6 i1 Yif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))9 N2 S* D# P! @5 r" ~9 z9 E' ?* r5 B
{
) s$ C: c* ?3 } //P以上级别才可以删除所有道具# `9 l( h8 \# D
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");% b7 _( M# }6 P. D
}1 l4 c6 t+ N& O0 f; s# |" n
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );! C$ X K# ?, }* I& J/ m
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
& _! g+ f5 z2 c) A2 |! Y' ?. `m_wndMenu.SetFocus();
, W. u0 T' F* o}3 l0 F. ^ H( o9 T6 C3 Z1 G
------------------------------------------------------------------------------------------------------------% z7 k0 G' n. t& s. x
*************************' i" w: q9 t1 F) S3 l7 e' @9 v
WndField.h文件
a8 f' a9 g3 i+ a* g) G( e, {*************************
( F, ]1 o; J1 u ]! Q1 e搜索:BOOL m_bReport;- z- i& E; N" A$ s
其后添加:
0 c% G Q K$ z' ^CWndMenu m_wndMenu;' X% I# l; B; d: C( ]
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);5 K: G$ U+ H# \4 Y! w) f0 D& U$ l. |
其后添加:7 |! Q6 B, L$ s$ Y
virtual void OnRButtonUp(UINT nFlags, CPoint point);
8 @4 {+ ]) L. h
, i8 u ?4 H# |: O% a& o: _( l+ R; H! {1 [! J9 N$ B3 y" j
|
|