|
|
源文件中_Interface文件夹下WndField.cpp文件
) R5 k) S7 W7 u, D: e. a; _搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )% f1 n1 a, g: I! p3 E7 v ^
' j' z6 X' ? `# r! r
struct sItem5 B" j8 J# u, V. `1 J
{6 I% r# S; j, v0 Y8 _$ E
DWORD dwId;8 i! S0 Y* V5 `* e2 i
DWORD dwKind2;; D: A" b1 G; b2 U. f
DWORD dwItemId;
( G! l4 [& R! |- l9 ^BYTE nIndex;
/ l0 A5 F% p: D' Y( usItem(){, B' E. @/ P- {0 U# s* z
dwId = dwKind2 = dwItemId = nIndex = 0;
3 q! S+ t/ @) A' t3 P( o0 T}$ Z# o6 L! o8 v: y9 j- H( k
bool operator < (const sItem p2)
% ^; j) E$ f% [. y) G* l8 A{' `; F6 `" U9 Y( q. L' x
if (dwKind2 == p2.dwKind2)
# F% m: f5 @( Q% F: ] {
2 r/ S* W7 I% R; \* n return dwItemId < p2.dwItemId;
5 t; F |+ n6 M, w# c8 ^# N }else{, O, C3 i8 `. \$ \0 E$ @
return dwKind2 < p2.dwKind2;& P0 k6 u' A. i! S
}/ {5 [8 _' e4 g- L6 x) }
}- T( y0 J( G2 D+ T* o* M" s
};
; `9 k3 V! Z2 x3 }class CInventorySort& h5 N b5 E6 t( m3 b
{
' U) _7 u. @: m6 r4 Dpublic:
: f- O# z' a+ z) g' Y! nCInventorySort()5 L/ Y1 Y( j* Q6 Z- M- h( v
{
) s: u3 q2 e& c* s S m_dwPos = 0;' \1 u) D2 L2 S5 h) T7 T
}* Z: e% _& `" G) X3 o) P5 U) e
~CInventorySort(){}
0 w, l" @* u/ F1 }6 p$ oprivate:
: ]6 g1 G% p9 Z4 I# {5 Q8 R1 H; v. @7 O# usItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
5 i' S1 b$ p/ h5 q" }# {DWORD m_dwPos;) W4 l9 I3 p0 U+ u* Z1 x
public:* ?' I' u& s% r7 ]# V
void Add(BYTE nIndex)
i5 w- `6 S$ n+ I4 S{
! C, v* v6 V7 T/ F) ]( W if (m_dwPos >= MAX_INVENTORY)
6 H9 w% Y6 d4 s {3 s( i5 o4 B" n; V
return;; [! \! p8 O# N ]
}
. C" B$ b: \: F2 v! F8 m m_Item[m_dwPos].nIndex = nIndex;
/ k r! g! {& B: w2 m m_Item[m_dwPos].dwId = m_dwPos;
3 b' M1 l& h( c, w0 U, C m_dwPos++;& \+ @# t8 A5 W
}9 T t; {. R' e3 X9 T! V0 y4 b
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列: h9 b5 S; C, l# R u6 J; o
{, _5 o3 ~8 e8 p3 g+ u
for (int i=0;i<MAX_INVENTORY;i++)/ @( q ~! O4 ?* ]7 k; s/ x8 K" o" Y
{& I2 h A1 `, z( U6 `
if (m_Item.dwId == dwId)0 Z2 t: c& W5 y# N8 o! ]" b1 w
{, g; x6 ~& S9 u% P9 h; b. W
return m_Item.nIndex;
- C5 R2 F: F$ O }
. V7 G5 `6 H. K6 T8 W' M$ s$ J- y }1 S2 i9 c3 u8 ]5 L6 X
return 255;/ r! u3 S h# [9 X( i6 @. n
}3 `+ D( I8 |$ }- p
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
; [- a0 p' S& Q$ f8 T0 j u) g) v{
& S" X- L/ D- P `0 G BYTE nTmp = 0;
' |( H, B7 b1 B4 H/ k! J4 g+ z- _ bool bDest = false,bSrc = false;
6 N+ P9 o# \9 Z0 B9 d0 V8 ? for (int i=0;i<MAX_INVENTORY;i++)
% v* k1 m* n! ]$ H4 x! K6 ^ {
8 E' Y& r0 S- Q4 M9 S4 @ if (dwSrcId == m_Item.dwId)
* J; H# J+ Y) L% J. Q5 U2 s. h {
0 E, O/ L4 x9 T1 p' ]/ Y //id相等 则 改变对应的dest和src
- T j9 n& c# S' `4 S& k nTmp = m_Item.nIndex;
+ Q$ _' Y" |5 e8 H m_Item.nIndex = dest;% V8 ~( |& n s; B) w5 t
}
8 m! N+ N. l! e, {/ P7 T }
7 U7 V0 y$ M: l //临时数据保存完毕,交换开始( i. Q- f% N9 m1 g. D4 n
for (int i=0;i<MAX_INVENTORY;i++)
+ t% f/ g: j5 R; c! d: \ {
, s. Q! ^# i& w6 q# p if (dest == m_Item.nIndex)
# j% B) W8 G- y4 k {" Y! O# C0 ^% T/ j, P2 {) u
//id相等 则 改变对应的dest和src3 \0 a4 k4 p2 ?# `: Z. G
m_Item.nIndex = nTmp;
( F$ V) t/ u5 k L# ` }
3 ?+ u6 u+ R/ T2 E U$ | }
& Q2 l1 w) E+ X) ]+ K& q}/ E2 N. H2 I( ]
};6 i+ o! U3 \0 V; V8 k
-------------------------------------------------------------------------
: k: `& N( a# z- T" i依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )* z% k! G& s$ |+ P6 R# q
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);/ w. z1 A! m) E
紧靠其上添加:
% U. H( o1 n7 X; Mif( pWndBase == &m_wndMenu )- E& N5 v; X& v; G9 x2 J/ a
{5 z7 C$ q, r7 Q ]0 O) e
switch( nID )( M, ]3 K! R& N% W. h, I8 D
{5 R; y, ?5 R. ?) W) j' x
case 2:
2 S( W- K: @9 J0 _ {% S3 t) U7 q8 g3 x6 M; g
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
" A% d2 f2 U# `6 z if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
9 M' J. h+ q- q; L- N0 g {
4 g& D( K: ~2 D$ p$ T break;! r: a$ t9 m5 e/ Q& Y0 u* \! M
}! I* K! {: o8 B% h" E F. B+ z
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
|( }5 `9 W1 n) Y {
3 |* M$ t, l+ }2 ~ CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i); e3 o% k0 s5 N3 m( j0 e2 ]
if( !pItemElem )
3 M M* {, l+ y, d2 b! t) g# K) A( R. K continue;
8 m5 m: `7 {' P% N( s' l- r' V2 p if(pItemElem->GetExtra() > 0)
( o. O$ M2 x" Q$ K continue;- l0 J O& Q" R$ e
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) * U' \0 Y4 t% \6 I' i* H4 o( v
continue;/ Q: W) k: y0 r
if( g_pPlayer->IsUsing( pItemElem ) )+ P( e! ^0 ?/ D2 _
continue;
2 C4 [: w. r7 M" Y7 i* k: v if( pItemElem->IsUndestructable() == TRUE )
+ }" S+ q. h( W/ y% T: b9 t {5 j( Q& S: ~# K! ]6 V4 c
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );( _: h& }7 m/ v5 c' B3 M( k; T
continue;
% @1 Y1 m! z' y- w+ s& h/ o+ m$ R }
$ R* u7 p& P4 w0 x6 K, V g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
. Z" A! E) @! n6 {1 \7 p }
! l' m1 f6 m6 V6 k( \5 H break;3 A2 T5 C2 m" S" r& }# K
}
$ P1 o ?! O# ]' v8 p, W. `' q7 W case 1:8 ? l: K) C( T* m3 ?) R+ ]3 @
{3 u5 i r: V$ w6 D3 y% G+ m j
//整理背包5 Y u8 O7 _" `. `$ B+ Y* U3 V
//////////////////////////////////////////////////////////////////////////. R, H3 g9 ?6 b% G
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );% q1 q$ z0 @* V' u& y5 Q
//////////////////////////////////////////////////////////////////////////
- b# A+ N9 ]0 y" S //////////////////////////////////////////////////////////////////////////2 g! I2 s. J9 y! j8 }* B. K
CInventorySort* pInvSort = new CInventorySort;
4 ?- P+ w- A" N8 _# c1 o5 ] vector <sItem> vItem;
( ~6 A' U- G0 G: H1 t" }" g vItem.resize(MAX_INVENTORY);//初始化大小
2 H4 q; }, _' i //////////////////////////////////////////////////////////////////////////
4 }) A* |7 x6 B6 H& o% n //填充数据
! ]( J6 d6 P: v L' }! c# y9 A- Z for (int i=0;i<MAX_INVENTORY;i++)1 e& ?/ M F" y- Z1 j
{
: c' @& y/ e& g( i. | CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
. ?/ S- ^ u; ~8 w if (!pItemElem)6 q* z. e8 _1 }" C: z
{$ p# c; k9 m3 ]- \9 k3 f
vItem.dwKind2 = 0xffffffff;5 M2 ?! ?) g* }1 `8 a' z% q
vItem.dwItemId = 0xffffffff;
3 z: w* }+ K6 M8 T vItem.nIndex = i;. x+ U" q$ F: p F. E, h9 L9 q
}else {
5 F- B3 W% X2 n9 f& J ItemProp* pProp = pItemElem->GetProp();
4 D5 M9 `- q& N( G2 d u" {& j: t. y; F vItem.dwKind2 = pProp->dwItemKind2;
5 u) |8 q: j( L1 R. Q5 r vItem.dwItemId = pItemElem->m_dwItemId;/ b3 U T/ E6 N" ]- @
vItem.nIndex = i;
8 I, `# q& g- a0 { }7 V$ V' C# {. P; ~! n- Z
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);0 S5 ?$ U4 `; x
}
& q: @7 }) b3 ]9 y //////////////////////////////////////////////////////////////////////////3 F% A% U. @1 }! ?5 ?3 n' T2 }; A% U
sort(vItem.begin(),vItem.end());//排序/ a+ q" {% J/ I/ ^
//////////////////////////////////////////////////////////////////////////7 u- A( C) G( W, D
//交换
! `5 x8 L- a3 P4 t& F. O for (size_t i=0;i<vItem.size();i++)
4 M% g$ {7 M8 L5 Y {
5 {' }, h. k K& U //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
: `0 _' p+ I9 t8 \" y+ j9 g pInvSort->Add(vItem.nIndex);" @& @( a3 t+ }- B; l% D8 W {+ ^0 P; z
}+ R* A! K) k# q0 y
BYTE nDestPos = 0;; u6 D# Y+ j$ X' \5 I0 D# o
for (int i=0;i<MAX_INVENTORY;i++)
; l, j9 N+ E' I+ n4 M {" w+ @. }$ w! I- }
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);3 [$ J2 }& X n0 Q, g% x E6 h
if (pItemElem)
8 i' ?1 H( L7 C( W& k {5 [' D# j. ?/ h% g, U
if (IsUsingItem(pItemElem))
( k' d6 |" J5 e! j( ^* h' A* M# A {, ^% K$ z- }3 B; M) [
//这个位置无法放% z6 ? c2 U8 I( f7 \" |% _
nDestPos++;. n+ m- r6 K J
}
3 b. n: Y$ M. c6 F/ j }
* v; y. q3 c" f BYTE nSrc = pInvSort->GetItemSrc(i);
, r2 c0 B+ F" P8 m" m' E pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
' I& f' h8 ]8 v/ y( u5 J2 G$ J if (pItemElem)2 q8 m- G' v. r* t
{- u- P, ]$ L% z* s* I& Z
if (IsUsingItem(pItemElem))5 e( r# @% j, g
{
& `: Q( Q) ~/ x2 U$ W- d' t //这个道具无法移动,跳过
5 Q: y4 A, E% W3 k9 M- ] continue;
! m! K% J" q+ }' C) o. N% B% Q3 [ }
6 g2 M, {; c( j6 m- e+ D' N4 Q }else{
W8 Y- O4 [( e* i, z. Q //空位置 不用动: X! G2 n; u$ G: n/ \0 Z2 w
continue;, m% c2 A$ `6 H6 L
}: O; v* o) N4 Y! y) l7 X
//////////////////////////////////////////////////////////////////////////# d/ u+ C/ h, l0 ~
//开始移动5 D1 N; ~1 v9 ], R. `+ d* a
if (nSrc == nDestPos)& } L/ g1 m E) d @9 p' p
{8 h, Z/ B# V- R9 i _
//原地不动
* H- I, f- [( @4 P7 R nDestPos++;
" z3 p; F' D7 o3 K& I! i continue;7 U: F* z7 V0 ?. L7 T: v3 y& o P& p8 j
}0 C: N" y7 @6 q6 s4 b: D
pInvSort->MoveItem(i,nDestPos);
1 n Q- J$ n8 V: \* [* Q" k g_DPlay.SendMoveItem(0,nSrc,nDestPos);7 j+ Q+ y! g0 A6 ]2 y
Sleep(5);% V9 [& m) x/ ~* n$ N
//Error("移动 - %d->%d",nSrc,nDestPos);% a: d7 d6 k* K) e
nDestPos++;
. P. M! A' W) ~# a, U, Z }
$ A8 v0 g/ p+ o* R4 N# X( i //取第一个元素的信息+ \" j* d0 b" }4 N& M
/*
5 _, G& A3 z' F if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
- b4 [9 m3 |) u$ X _) e" i* B {
) d8 `+ j$ F, P, v7 k4 Y Error("Move - From:%d,To:%d",vItem[0].nIndex,x);) ^$ N) O& Y6 Y$ L n" g5 {) r
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x); }4 R0 z7 O2 a a/ k- l- ?
}0 s4 W" d& u% c+ n. r- ]/ m$ u
*/9 H% d p7 m$ c4 J( o( U
//////////////////////////////////////////////////////////////////////////! p# n2 L, J) Z
break;! l `( l1 H& N% P$ p
}3 Z; ~' O, X- C
}
& e( B5 d5 \/ b1 E7 w}
3 h$ `* v) B" e z, l: ~: W1 Um_wndMenu.SetVisible(FALSE);
% n& [4 e4 V5 g8 h6 |+ ]4 z
) U# f7 Y7 Z% l) v$ r--------------------------------------------------------------------------------------------------------( q$ ~. o% d! E( i3 }
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)6 G0 U* p) B8 d! S! S
{, I$ G9 k G6 s6 o' B- r2 F
BaseMouseCursor();2 t4 P; e% Q0 v* t5 e$ ~9 \: V
}" g% ^+ D( o. X6 X
在其下添加:
& J- Y0 U1 m- b, m) T; A( Qvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)4 y5 \1 h& g z! u$ t+ \
{$ H( ~4 n$ T4 \6 ]1 g4 v( d7 D1 C
m_wndMenu.DeleteAllMenu();
( r8 ]9 W% s- F0 U% U0 u! a9 U1 c2 zm_wndMenu.CreateMenu(this);5 [# H3 V4 G* [
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");: j( y5 U \3 m) Q& o
9 K( H& C* Z% x3 p3 Z0 c
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))) T* Y8 \# w. Z0 ~1 y+ p9 i$ X# F; N5 J
{# Q, E3 G8 [8 W, c% ?( b
//P以上级别才可以删除所有道具/ @& v- r# a' \0 L' E; O
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");0 K5 }% M+ ~; b5 v& `; i. u
}
$ B' N8 u. L& A! T& F7 ^0 o. H0 a- ?m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
2 x0 M8 h% ?" j$ |) F4 Lm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );' @/ r5 n5 g$ L3 g
m_wndMenu.SetFocus();: { f/ h7 V9 U3 E$ R. X, C5 ~
}8 m* E8 J6 e$ r
------------------------------------------------------------------------------------------------------------
! ]! o0 \9 E: q& j0 o: w! C*************************
2 b0 I4 d9 G6 b& j% W* VWndField.h文件( s7 o0 ]. ]8 G! I6 z# A
************************* @# O# [9 _+ Q. q: M; Z
搜索:BOOL m_bReport;0 D- w# r5 `9 f# Z2 R$ B* O. ]
其后添加:
7 M/ r2 g% |3 X) H D6 LCWndMenu m_wndMenu;* Y7 l" ]# U3 d( k
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
& S8 i6 O! ~, ~# R/ y7 ?其后添加:
" ?! }9 N8 w w( d& g3 avirtual void OnRButtonUp(UINT nFlags, CPoint point);
( p- b4 Q$ o/ ]( Y1 Y7 u: Z; z% p, x/ v5 Q w
% T1 I! n f; R% @" t& P |
|