|
|
源文件中_Interface文件夹下WndField.cpp文件
$ K5 a) Y5 k9 B6 Q- C; d% D R搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )1 C: D t+ O1 i
) _- ~. j4 V1 a
struct sItem
9 _4 \' C) U6 t" g4 S) v{
% ~- d" H. ]+ u3 R) iDWORD dwId;3 G ?/ Z3 ]! L# ^/ A
DWORD dwKind2;
+ s: M, D1 q5 RDWORD dwItemId;
# _; q& A$ [: p' K: C6 iBYTE nIndex;
2 o( z. e+ ]: ]* a* p) _sItem(){: F( D" H8 y3 L
dwId = dwKind2 = dwItemId = nIndex = 0;
* B' y) U% B$ s+ j0 r}2 e& w0 M2 f m# i4 H, R; \
bool operator < (const sItem p2)( E% T9 l* l3 l0 h# E
{# y. _. Y% D& C
if (dwKind2 == p2.dwKind2)
: ?, q) B' A) w6 _! p {1 G8 z+ c. U9 M; w
return dwItemId < p2.dwItemId;% E* M) ?9 Y$ Y8 B' W; H3 T
}else{1 _* C. P/ V+ c
return dwKind2 < p2.dwKind2;
: l: i( k9 q( {% i9 h }5 W! M; k4 ^, A) u! @' J9 }5 E4 ]
}/ i" w1 M2 |9 J$ O+ B6 m' d# a( G6 ^
};9 b) x6 q8 Y8 I" T
class CInventorySort- R/ j2 u- g O* d9 P: h r
{
3 \& d, t# d" `public:0 b; F, |! Q- A/ Y& O7 y. l
CInventorySort()5 b' _/ m4 [9 s5 m3 Y
{
/ k }+ Y: Y) _3 p( x m_dwPos = 0;- L1 i& \; Y0 P4 `
}" x1 ]7 T- y# T! V6 R1 i b
~CInventorySort(){}9 y1 W! S& F) k/ f! q; O( i
private:( s8 E3 d5 f, u) B, x6 T6 A& `# ?
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息9 P! V% }# U8 c% E9 J
DWORD m_dwPos;3 x: P- @& d2 G1 Q* S/ l# a1 E/ o) V
public:% @- {8 F$ k) D2 m# {8 p
void Add(BYTE nIndex)( A1 f7 Z) f6 W3 g
{
) N7 j- e9 H1 U$ f- B# E0 P; Q" O if (m_dwPos >= MAX_INVENTORY)
- h" E+ h2 [- o/ P- n3 d& {( t {
6 E$ c$ }8 f+ `4 v return;
6 |( Q9 |" F4 u4 y9 s }$ @3 C5 V9 r4 i4 |0 z
m_Item[m_dwPos].nIndex = nIndex;
# j& X' u0 t* D/ ]9 y* N& e m_Item[m_dwPos].dwId = m_dwPos;
- X. t0 X; X; q/ i! M m_dwPos++; ?3 y* O# C* t5 f" k
}
; E5 f) O+ N) ZBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
& M! H2 [1 R4 X. F+ ?7 F: w{3 {) t6 l# l' j5 [" u5 k
for (int i=0;i<MAX_INVENTORY;i++)
( ]' u7 P3 J3 I p& t {
% k$ L7 v( A! W6 [: o+ @6 }+ b! N; ] if (m_Item.dwId == dwId)
" O! _4 W4 E& K! S3 F" Q {
0 \! k' ` V9 r) P8 j6 j return m_Item.nIndex;% V' n' b( j( g' A
}2 A! W" z/ ~; n) o* G" w: Z
}
9 @0 V" W! a2 @ return 255;: S+ T7 q0 h, [$ Z
}
1 j4 e2 h$ D, }: c. ?void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置" _! c9 e, c* H6 J# b. C7 \
{7 |9 p" B6 B- K2 C! k+ N' _
BYTE nTmp = 0;
5 q7 d( u& m2 ~1 y6 f bool bDest = false,bSrc = false;
: i7 r! u3 l( f. x! ` for (int i=0;i<MAX_INVENTORY;i++)
9 Y; {. T$ e8 _# }7 l$ M {
9 n& O$ @: A2 x- j8 V" A3 l if (dwSrcId == m_Item.dwId)* b4 c+ l. F* w# B
{* s, o: b+ ~# F% G e# _
//id相等 则 改变对应的dest和src* |7 [' K( X* Q3 B B
nTmp = m_Item.nIndex;$ }: v- [6 s" C; ]+ N2 X4 {0 Y0 e
m_Item.nIndex = dest;
8 Q2 e/ }+ k0 J- C4 A }
8 V( s+ M7 ?+ \$ q I- B }
* y' h/ v( |# B/ v/ D' R //临时数据保存完毕,交换开始
) f$ B/ T- N8 G8 N8 i for (int i=0;i<MAX_INVENTORY;i++)
5 \ B q8 A7 n) x8 w& I- P- z {9 @' M% W; F; y' ^/ U: Z
if (dest == m_Item.nIndex)
$ i7 z, q1 n$ e& S4 i3 T5 n0 S9 u& |+ _ {
; I% y$ ^% I8 t, E7 s //id相等 则 改变对应的dest和src/ D6 K0 I; A0 t' J. G% B4 y3 W6 _
m_Item.nIndex = nTmp;% C( V9 Z, w# V5 x- y5 ^3 Q A4 B
}
: g* G& b7 n. `! V7 q }
7 U: _5 i+ X1 v$ U ]( }}
# G4 O) i5 ^& J! z};8 Z" ~/ L9 M* F% n* i( F: Z0 H
-------------------------------------------------------------------------" ^" @6 M5 S: c. w2 R- S4 f
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )0 Q7 {+ V. n/ z [: [' B" a
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);0 G8 Z" b9 ?, N
紧靠其上添加:3 m/ f- x# U4 J% F3 N
if( pWndBase == &m_wndMenu )
/ ]- m. z( t6 M. P& p8 N( T{ k/ v* T7 {6 c5 f
switch( nID ). i4 S* k9 Y3 n* E; A
{4 {+ S5 L" q4 z- X
case 2:, r, @( P1 u+ q0 z9 E
{
3 W7 }" C" B/ n; p* y //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);& U- V. [0 }9 |1 v6 N9 p8 q
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))" P# g$ H6 w S8 Q: e V( A
{
1 y% g) B0 o: T' L, i6 n! o4 } break;
1 Z5 c9 w; L4 b& \ } V( q8 g, @3 c! H; D, x# W" H# j
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
: J/ n. Z) c$ |' t {4 K, \. l: M" y2 @6 a) V
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);& k7 P4 }. @/ Y [
if( !pItemElem )
2 {; E* V& v! D# U' Z continue;* m l9 q3 K; q# g- \2 {5 z3 ^+ W
if(pItemElem->GetExtra() > 0); Z+ l8 K* n# f1 I0 T* A
continue;! U* \) F. m4 T9 a8 X& I" [
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) 4 N2 l; B) ^. ^1 Q9 R
continue;
& y4 n5 K. m$ U$ R2 z1 k# C if( g_pPlayer->IsUsing( pItemElem ) )9 l3 T2 c6 O2 G b% l
continue;$ i0 ?$ X v5 g1 T2 V k: e
if( pItemElem->IsUndestructable() == TRUE )$ |9 W. g8 W% d. g0 @+ d; ?2 s( u) Q
{
- ^6 P) C6 |& J9 j g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
; s4 @3 z& z6 p/ Z continue;
3 d/ N# E d- s3 c3 n) W* U }, C4 w* g% L' D4 O7 Y, }5 [/ K
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
/ \/ c3 n4 t) X$ v }
9 {2 N- s O. M7 T" ~3 \8 P- v break;
& Q5 d4 Z- I8 ~7 g$ s2 r8 Y* i. r }4 b: @3 F8 Q( m& |
case 1:
* [% ^ S6 J3 Y6 j# Z {2 e) ^# r9 Y/ F, {- v2 _
//整理背包 h! o- k* n/ v9 A
//////////////////////////////////////////////////////////////////////////5 ^4 g2 E; A4 g/ g" T5 `! c
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );8 t# V% t. y( G+ e; o% }
//////////////////////////////////////////////////////////////////////////6 V1 z( r9 U: K" q4 v1 M
//////////////////////////////////////////////////////////////////////////# u# {& _/ v0 A) [, k+ c4 O
CInventorySort* pInvSort = new CInventorySort;
* ~3 A/ u0 S# d/ `5 p$ }7 ~& l vector <sItem> vItem;1 e2 W- E0 A/ Y! v, y- Z' @) b/ L
vItem.resize(MAX_INVENTORY);//初始化大小
& K' q* K( }" J# s' D% d$ I //////////////////////////////////////////////////////////////////////////
: @# V4 I( k; p( e: k) ~% C+ `4 F //填充数据$ E Y" f9 l' H( N; A
for (int i=0;i<MAX_INVENTORY;i++)0 r- A `) w0 B) J' n
{' b9 \1 j% m; A7 f
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
# v$ ~% F/ \. s, p if (!pItemElem)
; J- n( x M3 l- X1 p5 b( n {
, o v, u* u: z' t: ^+ y6 b5 U vItem.dwKind2 = 0xffffffff;& R( @" P' L3 a6 }* Z
vItem.dwItemId = 0xffffffff;
# W$ k6 E! Z. Y" V vItem.nIndex = i;* i, y7 h6 @3 n: e# i5 H& _% T( D- @
}else {
7 U N3 X% M f# Y2 `$ F) E9 s ItemProp* pProp = pItemElem->GetProp();
5 z5 t! N. s9 Q" a0 R vItem.dwKind2 = pProp->dwItemKind2;
; |' U4 Y6 r# w3 K# P( X vItem.dwItemId = pItemElem->m_dwItemId;' t% k# c* m; X n2 k( ?8 M. h
vItem.nIndex = i;
S; p" ~ a6 W0 l- @* ^! m }, H/ y* f! T: k
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);3 H D1 h% n8 r& ]
}+ K% p9 e, z, ?" H( ?
//////////////////////////////////////////////////////////////////////////' `, k, r% W1 Z( r9 K9 p
sort(vItem.begin(),vItem.end());//排序9 e) [$ O, L* `8 e$ M
//////////////////////////////////////////////////////////////////////////
# T' h/ N4 w- f* S) Z //交换" l) B6 N6 x9 q; Q" m$ M3 f: }
for (size_t i=0;i<vItem.size();i++)2 @9 W: z& F$ ~/ S
{
) o3 l! o8 O5 `9 }. Q) j3 Q; h //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
1 w; l, w, U( @$ I- f pInvSort->Add(vItem.nIndex);
: R. E+ Y: i# D+ ?+ r/ m }
2 [0 k' R' S: e: J a BYTE nDestPos = 0;8 ]! ?2 p" e2 ?
for (int i=0;i<MAX_INVENTORY;i++)& E) a+ u2 s3 z2 w H' w% K
{, w8 P7 C: f7 Y, A0 Q
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
/ N2 H% y2 u2 l, f+ x* Y if (pItemElem)
, r* H% {' X# ` o$ i {
( g* A! `9 ~ c# b# S6 t0 x0 @ if (IsUsingItem(pItemElem))8 u, W5 p* f y$ p( ~8 y. [
{
" _5 g$ o9 w4 B% D; x0 K; j1 c; x$ O //这个位置无法放
0 k7 v4 L0 h- K9 } nDestPos++;, O0 R$ P g$ b9 L9 B8 w
}
* ?0 f& }1 x0 h }) B. ~/ S: l5 Z9 y5 x
BYTE nSrc = pInvSort->GetItemSrc(i);, L! L- j. \$ y( D; H
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);! N7 m( D+ a( Z- K, J/ X2 u
if (pItemElem)
$ j3 O0 A+ l7 `$ z- q) a {
( p0 x% |! n+ N4 y# H if (IsUsingItem(pItemElem))9 }, s4 |1 T! R7 N [. r( z
{
" h, l# o0 K3 T( b5 O //这个道具无法移动,跳过
2 ~ {" `) x' N5 h# e1 w continue;
# l$ K; w* V- ^ }
) \1 b2 z3 h/ ]' }6 z1 j- F }else{
6 R! J- X; G- F //空位置 不用动
* B5 c3 x4 |8 R ` continue;
$ d/ h. i7 q! e) g }# G4 r! W$ V. d3 p% b5 Z
//////////////////////////////////////////////////////////////////////////, t6 ~ c' Q- ?8 b2 U& e( Z
//开始移动
1 g( P$ M8 k. j5 h# u/ K5 I! ?/ e" S if (nSrc == nDestPos); u: P+ o- X o7 O5 g- e. `0 V
{3 r# y' y; T; o0 N5 Z/ K
//原地不动
6 B$ _0 R- _% D9 n2 Q, Z nDestPos++;6 u* i& f' o. N) q) T9 e
continue;' j4 n% ~# V% `5 `
}$ B4 E# }8 |: A) e' z1 q
pInvSort->MoveItem(i,nDestPos);% T+ p' E0 F' i; M
g_DPlay.SendMoveItem(0,nSrc,nDestPos);* L: z0 ~$ c" F0 U/ g* ^
Sleep(5);
& }1 w, T0 o& O9 U //Error("移动 - %d->%d",nSrc,nDestPos);1 N- @6 I) R( U; b/ F! D
nDestPos++;" c) T( l ^& n3 C- ~/ B; z
}( _7 T- I& Y! J& e: O% K5 u& j6 X/ y
//取第一个元素的信息
( h- a# h2 H' V+ A9 ?( h0 e /*4 A, p2 J2 @9 @( |; E- ^
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)3 o# K8 q" U. n0 t0 T5 z, e
{
' N2 g- T1 a' S( e Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
6 u$ i& u9 j; d/ G& C |* v0 O g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
' N( H3 z# n- G8 t. i. [. ] }
7 n" P }$ N% b! g6 x% u4 l */
/ Z: j5 V( O( W3 h //////////////////////////////////////////////////////////////////////////
: `% z# ?, s* I) C2 d% q8 m break;8 Z9 R& w* |% ~
}* {2 u' |5 k, Z
} i: j& O( [" K+ V8 [+ N
}
% P' d" f& Z, x5 _/ [% D! q8 _m_wndMenu.SetVisible(FALSE);
, p: s& B. s1 I# F
8 G$ y; N$ H9 ?# a--------------------------------------------------------------------------------------------------------6 q3 \$ d' T# Y0 S; H5 C2 R$ _
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point) w+ v( [: N; n6 E0 i2 P
{) n1 W5 T* b% h- Z r" ]; m
BaseMouseCursor();
2 p+ r t3 S4 Q% b% g1 l}8 o' c, Z r" W
在其下添加:+ ]9 r2 }, R2 p% _) X4 d6 @
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
3 c3 H( C& E' N6 v{9 A6 W. D7 x V, p0 P0 t d
m_wndMenu.DeleteAllMenu();1 V. F" ?: H4 x. [
m_wndMenu.CreateMenu(this);
+ {$ Z$ K. z8 t1 [6 m* K4 e5 gm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
6 K- K. \$ }0 T) p5 |5 l9 B Z7 O/ Q* r4 M9 H. c- t8 z
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
8 R. M n; J* C6 v Y{
2 I( `1 \; N9 i //P以上级别才可以删除所有道具2 i% l( p5 O' w5 d T
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");. N1 a5 H# y$ j2 J; h
}. \$ Z! t, H3 ?9 o8 V5 M7 m. g
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
8 o. q: v/ X. \. \$ z! }m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );' c+ V" l! z8 |/ w3 ]
m_wndMenu.SetFocus();- N2 f6 r# N# {$ x6 T! q- Q) m! i
}
' ~9 \. ~. V0 _6 y0 I$ E4 ~# Y------------------------------------------------------------------------------------------------------------2 {3 N5 i! R |* T8 ]+ a! C, y
*************************& d) s; i# m8 c& Y: z4 c6 _7 H6 b
WndField.h文件6 u( [5 |7 x4 }1 N' w, R
*************************- n) N: q8 E- E/ D4 A
搜索:BOOL m_bReport;
7 c% @9 I- `1 f其后添加:& Y5 j7 U5 W7 P
CWndMenu m_wndMenu;
f/ K4 w2 B: t5 T6 `4 }2 f搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
8 h, F0 w/ Y! H" ]; y其后添加:% B! R7 G* f' O7 A
virtual void OnRButtonUp(UINT nFlags, CPoint point);. H2 X8 n) {- u2 o' p, S+ l
6 K) V$ \! f4 D8 w6 L4 }0 F, ]
4 d/ ]" R3 }% A3 ^& C6 b, \( A5 v5 k |
|