|
|
源文件中_Interface文件夹下WndField.cpp文件
9 _# N: s$ y$ O1 |' G' s0 H) e搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
/ Z+ V( [1 D4 ?/ d2 d" ^: A/ _0 S: r: f H# _; F
struct sItem
6 ], S* U- A, o9 M8 b) ~4 ^{
# b; R1 r+ a) SDWORD dwId;
7 p5 H6 o5 t- c0 r) s2 [DWORD dwKind2;2 Q3 r2 ]1 ~7 }8 }/ J3 U
DWORD dwItemId;
5 _: V' N5 t, O; oBYTE nIndex;
% S* N6 }$ m0 {5 J! [sItem(){* W& C) o1 I& u. |8 T* W! K
dwId = dwKind2 = dwItemId = nIndex = 0;
5 d9 n m7 @8 l% E2 R}
/ o" ~* X9 J7 Gbool operator < (const sItem p2). N* v2 t- q, {( C9 x3 _' S( b9 `
{2 g$ t" \9 C+ s
if (dwKind2 == p2.dwKind2). `- r" G/ N1 W: S
{
" }5 y0 X4 Y) h return dwItemId < p2.dwItemId;: r5 p: u p4 T5 q
}else{
9 S% r" ~7 S$ `4 w3 m+ t+ n return dwKind2 < p2.dwKind2;
6 U4 C6 z/ m C: o0 [7 q }
: H* ]7 P% n2 ^" m; j}
: Y8 O9 r, h9 D7 r};! z6 G- E& g' M
class CInventorySort8 j3 h& Z2 I, N! I" j
{2 [9 T5 p. |" u. t
public:: R8 X7 k; E8 g. T: g1 A. H, d
CInventorySort()
5 u! l& Y8 y8 r' X{
: T5 K, Q, I$ Y D m_dwPos = 0;
6 ~# P2 y9 Y8 R2 r}1 R& q s3 C( G& y& S5 a# Z- G
~CInventorySort(){}: U+ x4 j0 W8 V0 x" O$ _
private:. |* H$ |& n% K8 O/ N
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息7 \& K* M2 T: A
DWORD m_dwPos;* O$ S" S- n5 ]2 G& n8 d4 D
public:
; N l& s# `( v( i6 L# Qvoid Add(BYTE nIndex)4 ^5 \ }& y7 Q7 t. {
{
) G, E/ a$ r+ K5 U. s! ? if (m_dwPos >= MAX_INVENTORY)
5 ], N" u+ J8 C8 f* r {6 A9 h; n" i( M. h: h6 ]) y
return;
( V% h9 z+ L. R: O: } }
2 \ @3 A+ S! g. m& A, F3 h' i; f m_Item[m_dwPos].nIndex = nIndex;
5 v: D: `' g: o0 o. n! Y; `& E m_Item[m_dwPos].dwId = m_dwPos;
% Q1 z8 \, ?3 G5 f$ w$ B) E m_dwPos++;) M4 R9 ~+ Q$ x+ `6 r
}
l4 d/ ^; ], J6 w- b. zBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
$ s% n" }7 u2 s0 g* ^: Y{
8 S( O" o; @9 B8 }: v for (int i=0;i<MAX_INVENTORY;i++)9 X& j1 o8 ~/ e6 d) X0 X
{8 ^$ p: k; w" H0 V5 j
if (m_Item.dwId == dwId)) H- T- I3 C1 }: w% h0 h
{0 H8 ?: w+ f- ^( n u/ R g
return m_Item.nIndex;
6 V3 c* D8 M6 L: `* |8 n3 p }% H6 ?7 H0 _7 n* c# r) t$ n+ N8 o
}9 z$ r- v' j# \/ e, h7 _
return 255;
! g, ] m6 l, g0 W6 Q& u. y}7 d7 H* D0 C& l. E7 ~
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
% |: D, P0 C, H' Y0 l+ C{. o* A8 y( r8 n* s
BYTE nTmp = 0;. {. _) }, A2 C6 n j, N
bool bDest = false,bSrc = false;
' G }3 ]( _5 k9 ]4 k' W for (int i=0;i<MAX_INVENTORY;i++)
9 c+ e8 }- Q/ [( _* g1 Y {
6 D# U- ^7 I, ]7 ^ if (dwSrcId == m_Item.dwId); f6 G5 V+ D; i* _+ O7 l0 s; w# M, V
{0 S( C6 L' I0 N" D' K3 a1 Q
//id相等 则 改变对应的dest和src8 {( {; R$ k+ O& @4 Q* L: q
nTmp = m_Item.nIndex;2 i- _$ t/ Z$ e3 U* `+ p5 q
m_Item.nIndex = dest;9 Z% ~9 q! m3 ~8 s: B. C o
}
( C4 ` {4 o. y* @2 n }5 L8 a# X! `1 t* c* N) p
//临时数据保存完毕,交换开始6 j, j/ M5 D% G# R; L2 q6 P
for (int i=0;i<MAX_INVENTORY;i++)
, n) a" M k' q9 x5 |; u% o& e {
7 Z" n- p8 [; T4 r0 C7 F if (dest == m_Item.nIndex). u% E3 y: e7 P# x9 J* f
{
0 J; [' U/ I; j$ k% G% ` //id相等 则 改变对应的dest和src. P! x0 A) F; u$ q5 \
m_Item.nIndex = nTmp;
i% r8 Y' v2 B7 ]" ` }
, r( X" n' C8 B3 Z6 M: M+ d }
. O2 |# P1 D/ n}6 z0 s, W3 h; d5 s# i: F
};
$ Q5 d1 n* ~, l* k2 \0 ?6 V9 n) i-------------------------------------------------------------------------
2 a2 j/ [9 }4 i+ b% L依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )) u. x! U6 N+ u, l) Q
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
o) D/ ?! m: l8 L- c- @紧靠其上添加:
o$ H9 ^1 n1 {8 Rif( pWndBase == &m_wndMenu )9 q2 t, ?7 ]6 m0 u: y0 I
{
/ E3 H C' r$ R* N! u2 [) ` switch( nID )0 g* ?2 g# }( f+ U9 a
{
, O, p: X$ a8 P& d5 @( U) [ case 2:
% _5 F8 u, B q9 _- q {
2 m$ f5 ]8 }' r4 C+ ]3 C, ?8 |, O //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
) V7 s* C: z' m( U' [ if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
$ J# h' h: ^5 R# [+ N* s {
% N, ?# g- V! N* F break;
) ]) [* X2 ? P, Y* b }
3 ~9 F g, ?8 B for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
& z* M; j; {0 i) E* I, c {# o4 W8 J: d! K& {3 I
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
2 T* p/ K; ]9 B. O/ [- | if( !pItemElem )# _; K2 L! k7 Z
continue;$ F( c7 Y- V& H" ~
if(pItemElem->GetExtra() > 0)+ H" t' f6 E2 \6 X
continue;
& B6 c5 m) N, L0 D! P7 k if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
: z5 n1 n; n% T: ] continue;, k, J8 m& M- r/ o1 d- J+ h
if( g_pPlayer->IsUsing( pItemElem ) )5 E4 V1 k0 T& ^" A* Y, @ x% t0 K
continue;
% b9 t: @' C* T( T) F$ D if( pItemElem->IsUndestructable() == TRUE )2 Q& P# K% {1 O0 @1 v. ]" j
{
' S( {, M9 ~! ?3 m g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );' Z# K9 i1 s% D, ^1 v; f6 B
continue;! x# M" b* V; ^1 g$ N1 F- X
}
" K1 D# K7 Z. k6 t g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
9 V. R) s5 R z/ d+ z, h8 i }0 N4 j9 f4 V. L& i7 n
break;
# D- g; j4 _0 E7 }7 P) a9 O }
1 {+ P0 j4 ?, s5 Q& D( n3 A; ? case 1:8 O$ b! Q! ~* |0 r8 r: E
{# a, e- R$ z3 M" v( U4 h
//整理背包7 x, m3 m& ~7 ^
//////////////////////////////////////////////////////////////////////////8 z1 N# Z! u0 o' `# u2 ^3 T! F
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
8 Z" ?) T8 u" N' f* W //////////////////////////////////////////////////////////////////////////) b/ _6 i: Q$ ^/ m0 N5 X+ l9 s
//////////////////////////////////////////////////////////////////////////
8 p) y6 {. T2 ^. m# o CInventorySort* pInvSort = new CInventorySort;
+ r# c a1 f/ d3 b/ _( e+ S vector <sItem> vItem;
) [. ?4 ~, A4 Q) M% h" |" R2 \7 G+ }. F vItem.resize(MAX_INVENTORY);//初始化大小- T4 c2 r/ U; D* ^4 O u
//////////////////////////////////////////////////////////////////////////( Z/ \4 m7 ^& r4 W A
//填充数据
8 Q$ \3 Z' J) A6 d9 N for (int i=0;i<MAX_INVENTORY;i++)* ^7 z3 h. h/ D; X. {( o( U
{
+ b, L# B# k/ Y CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);* T0 ~( c% w& Z
if (!pItemElem)4 P9 Z% @+ ], ]$ ]! w
{
2 r6 B) w! R: E* A/ q( P6 ] _ vItem.dwKind2 = 0xffffffff;
8 s& G" Y) D" F& L vItem.dwItemId = 0xffffffff;* K6 S7 i- A$ V1 p( ~
vItem.nIndex = i;$ t2 O. O; }+ E8 F5 |$ G
}else {
% t. ?7 x+ L1 U. C9 v ItemProp* pProp = pItemElem->GetProp();
5 ~4 M; u/ }9 k6 }3 ~ L8 ]: l vItem.dwKind2 = pProp->dwItemKind2;
) }4 [/ T/ e Z* s: L( K5 _ vItem.dwItemId = pItemElem->m_dwItemId;
5 x# C8 |4 }% b( k) \6 y6 e4 q4 h, l vItem.nIndex = i;, _9 v+ Z5 h7 G
} K8 }4 u; @! G e- \6 K
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId); X. o/ z! C- F M4 G
}" Y$ W/ E% K0 ?
//////////////////////////////////////////////////////////////////////////
, u" u! e) a# ] sort(vItem.begin(),vItem.end());//排序
# p+ d" z3 ]& l$ [ v/ f! i# d //////////////////////////////////////////////////////////////////////////
7 M$ h+ H# x7 ^ //交换
c* ~$ Q9 Z- D$ E5 ] h$ J for (size_t i=0;i<vItem.size();i++)
' s( ~2 f9 o. J, y: j; b( |+ H {+ Y; r/ C; G2 G. P
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);0 R# i" h) b* H0 X
pInvSort->Add(vItem.nIndex);% f; Y% ?& S: @# c" L
}4 B* a" h* b7 G8 A
BYTE nDestPos = 0;' [: @$ P0 g8 P$ t9 t) d i: l
for (int i=0;i<MAX_INVENTORY;i++)' p( W. C0 s4 Y1 ?
{0 m2 b. `$ d! F' p: c+ O
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);* w+ D- V3 S7 R" D8 `, B& ]
if (pItemElem)4 I# q$ s7 p% D8 c. n" r4 C
{9 ^/ v; @# s/ s, k% h% r( d2 {
if (IsUsingItem(pItemElem))
7 [" p, B8 Y1 q9 w0 q; p {
. \5 c+ Q \' R+ V, G: O* [ //这个位置无法放
3 E) I- N% x4 w- F* U nDestPos++;
; T, q7 f4 x* S. ~# X }
) [ q( E& b3 m' X) s+ ]1 I4 [ }( X1 {: m# {# `. ~0 O
BYTE nSrc = pInvSort->GetItemSrc(i);
4 k* J5 f+ |/ L" h" N5 } pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
- ^$ t9 ]5 K6 j$ M1 V1 B1 r4 \ if (pItemElem)! Q, p9 ]8 I( f
{$ J3 H/ M9 ^! ?, ?! E' k# H. S
if (IsUsingItem(pItemElem))
. y, i. F) q; }" d6 K) H* _! \ {( ?: t& y' c& y; ^( x6 b
//这个道具无法移动,跳过
" J; O1 n4 d7 ~) J1 ~ continue;) X O# `% H3 _: A4 B" C( }3 q4 h: I
}
^" V- J) Y+ T. g }else{
1 s, W7 R" v6 C" v$ K& v5 Z7 z5 l( o //空位置 不用动( r1 [; D" }) ~2 F( Z
continue;
# ~ _% r( \, O7 s* f }8 f( i/ m: c' J% S
//////////////////////////////////////////////////////////////////////////! e- D- V0 d+ c' I6 k9 q* C' f9 I
//开始移动, x( E/ G' L: d7 i# @
if (nSrc == nDestPos)
! l) ]+ ^! }' H+ V' }# T {' \/ C# {3 R$ Z7 c p- q
//原地不动
+ x& ^( {& G+ D nDestPos++;
8 p2 B9 m+ }6 T& ?9 t4 j0 v continue;
9 e% n G$ t6 b; k6 T: o }! `; _9 O) M# y6 j
pInvSort->MoveItem(i,nDestPos);
& C% g `3 y0 e9 Q0 ]/ M g_DPlay.SendMoveItem(0,nSrc,nDestPos);
& D" z7 I; q9 Z* B9 [: N$ O& x- L1 \- t Sleep(5);
: p7 B- x) u3 W2 Y H6 }( t2 H0 q //Error("移动 - %d->%d",nSrc,nDestPos);$ D4 H1 q" h' F5 p6 z/ o
nDestPos++;$ d" s3 s" y5 `. z# _
}% ]6 w* a8 d5 z; ^; s
//取第一个元素的信息
0 X3 C& s1 o( T! Y/ `5 P /*
) X7 ?" g# I. I if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
0 K0 ~. ^2 {% M) P {
2 d' w8 g7 o5 v* Z Error("Move - From:%d,To:%d",vItem[0].nIndex,x);$ V3 p7 f2 h$ T# v! N7 X6 m
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);% ^! U5 N. ^$ d, ]6 @
}
# g% e) k: V/ z2 M1 G */
^! q3 p/ @/ N0 C( I6 h5 j2 c //////////////////////////////////////////////////////////////////////////7 ~. W2 b% z. n5 }6 ]- |
break;& v0 O5 o# m$ ^# ?0 c4 f3 ~
}8 P5 w- r* s0 J
} 3 n$ C# B% F! G! w; g7 y7 A# i
}5 |, U% U- [1 K9 }1 v
m_wndMenu.SetVisible(FALSE);
9 g' w! d6 K' {3 n3 L( ^# z9 @8 \/ G$ W( k
--------------------------------------------------------------------------------------------------------3 T/ R- y6 Q( t' n
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
& q d. q; p h& B5 k{
: _. Q5 j* _; d( m* D4 ]" U; hBaseMouseCursor();
0 V6 I; D2 m! k, e}
! l! ?7 g8 _, R/ d; @7 k在其下添加:2 k1 }1 o3 t3 f5 k# J
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
h& M5 E5 Z. \3 s' d9 [' a{
* Q8 w# v" Z- v- @m_wndMenu.DeleteAllMenu();8 k3 M- W( Q; @. |! ]8 C- U3 k
m_wndMenu.CreateMenu(this);. B; O5 l6 M! q# _; P- {$ h
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
2 U5 a" S: M5 u% j+ w2 C
$ ^0 U4 w b3 G9 Y1 i- I+ p. v& iif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))$ O5 u* n) |$ p; m# _) r
{
; [3 }6 D8 D4 F' b4 x) F //P以上级别才可以删除所有道具
/ p/ u9 A f) w% a* h* ~9 v3 I% f: `( ? m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
) b/ E% y5 ]. Q, g& r8 {9 @4 ?2 K8 n}6 g: \2 p2 }. u7 _) a! c
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
7 h. X [+ _9 ]7 ^" y. Cm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
' ]7 x1 a7 J( Z, f) Om_wndMenu.SetFocus();( [' g. q* g, o/ ?
}6 u+ n5 k+ T7 E$ h7 d) j
------------------------------------------------------------------------------------------------------------
8 {+ f& M$ `; y w0 F+ S: C( p. U*************************- ^9 y- X7 r2 M! v
WndField.h文件9 F; b+ l' [! u: N
*************************
1 v( B0 i- a: P* o6 G6 d搜索:BOOL m_bReport;* _1 `+ A) |5 q, p( S/ M4 ^
其后添加:; W: ]0 K2 _: U8 x- o6 L, \
CWndMenu m_wndMenu;: s6 v! A8 }) W
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);' W/ M7 I+ Y8 f
其后添加:+ C6 G$ k( D$ \+ G% X. j/ r
virtual void OnRButtonUp(UINT nFlags, CPoint point);9 B: z7 Z) v. @7 v, ^" K* M: u
) q" G+ r! `: _9 z9 V" I
" Y3 p* l- c+ j; c
|
|