|
|
源文件中_Interface文件夹下WndField.cpp文件/ M$ V8 {3 G5 y+ _! ^5 g
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
2 L! U" g2 @4 U8 f* P2 I6 [$ i2 d H. u% s) g0 n
struct sItem
; I- o R% r, X7 N3 M0 j! h: j. v{0 E5 p$ f& K) M) o# L7 M
DWORD dwId;. q) ^ I7 t* t, v
DWORD dwKind2;* w' B8 b+ v" r( R4 j, R
DWORD dwItemId;
5 @. T9 p9 J/ x }1 Q3 `% |' D5 rBYTE nIndex;
; e h0 c. o% V+ D' L isItem(){
0 o2 ]. V; W! F4 \ dwId = dwKind2 = dwItemId = nIndex = 0;
( y/ l: Y) j" w% t8 }}9 ~% {( j! O" ~0 M8 z$ s7 m
bool operator < (const sItem p2)
9 X4 F' }: l7 C) N{
( }7 M) I! `2 @- [/ C, m1 b4 V9 C( @ if (dwKind2 == p2.dwKind2)8 @: E/ A h' {
{- f4 c% g: r0 w( H9 b( I( @
return dwItemId < p2.dwItemId;/ ^& I# f9 Z+ y# [
}else{
& J* X: ?2 E3 e* G& S& h return dwKind2 < p2.dwKind2;! B) o$ h$ v# t) w7 W7 j
}
7 c) Y* c. U% v0 f1 o7 e}
g6 m- v; F. t5 Y" f};( x- \1 U$ u" u3 K2 X
class CInventorySort
7 O% u- n. E+ j2 H, A6 I{" O' }/ B" j1 e5 M" u8 M
public:
& Z4 J% z$ I5 J4 F2 c' J- h' D9 S4 T. \CInventorySort()9 J. B" F& f. x% H. q
{( N4 F9 y; h& K2 G
m_dwPos = 0;8 G% w! M2 _9 k W; D3 A6 U
}
0 g/ Q% v7 h* I~CInventorySort(){}
+ V |6 j; a* o! X5 c! dprivate:
6 @5 B; r0 U% ~! c. ssItem m_Item[MAX_INVENTORY];//存放排序好的道具信息: v* m) K' M* l/ m# s/ c
DWORD m_dwPos;8 q$ A) a# a5 y( {/ y
public:: J( J( G- z( T; b& R2 m# U
void Add(BYTE nIndex)% o& y+ ]8 G( n$ f: J+ U5 B
{
# ?% w' r! D) ~" f" R if (m_dwPos >= MAX_INVENTORY)
% G6 s8 \. Z9 O8 t; `" E, i { N( r4 X; E1 }# g4 {4 w" a
return;
1 z/ z7 `$ t' \5 h H }8 m' O4 N% b( s. Q$ g( d% u. V: A
m_Item[m_dwPos].nIndex = nIndex; f* P0 @: T: p* M
m_Item[m_dwPos].dwId = m_dwPos;
1 `, v0 i% ]: D5 @# J7 U0 q m_dwPos++;7 m) u i# |( Y4 t. a1 H* P
}
) g( V8 y5 W: _3 qBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
) y7 N. o3 b! s: o' R2 U% O" W5 H" |! _; a{; n1 x' O' J; ]2 @1 v/ U
for (int i=0;i<MAX_INVENTORY;i++)* y9 W3 \- \% l+ I* Z$ J/ E
{, x4 o* G! ~5 t6 c/ N% ^8 n* y
if (m_Item.dwId == dwId)
# S, i/ C; f5 ^- R& d {
& h! i7 \' W8 L# ^# ^ return m_Item.nIndex;+ p& y, j- X- o
}3 R- W4 B0 _7 V( b* T) _
}
$ Z0 z" G' J: d% o8 r7 n$ M) c return 255;
# E% K4 O9 e4 |}- ?* x2 o$ u; L+ j3 s
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
* v% K6 a; U2 A0 }& W$ I{
1 z7 i r& ?7 s) }: A BYTE nTmp = 0;1 w% `) Z1 A4 }/ `( Q* X3 |
bool bDest = false,bSrc = false;. D9 a) X0 V3 S, R; @4 b+ v k
for (int i=0;i<MAX_INVENTORY;i++)
6 y h* S, X' V4 ~1 Q$ | {
. l( g, @, K) X4 m- j if (dwSrcId == m_Item.dwId)
C& W; |0 L. Q! N/ D2 `& C H { G$ z) [, Q! f6 r- [3 V/ H8 e
//id相等 则 改变对应的dest和src7 B1 L) S( t! Q7 d
nTmp = m_Item.nIndex;6 H7 X, p+ n# P$ a- A
m_Item.nIndex = dest;
7 `# F3 h3 S2 B: x }
/ o8 o4 R; a5 P5 u1 K/ e }
, B' c9 m6 D+ q' f8 X //临时数据保存完毕,交换开始
5 f! ~9 p/ o$ S6 A for (int i=0;i<MAX_INVENTORY;i++)5 R, }+ l7 s0 ?
{
: R8 Z! Y- W2 K. M, p: y/ E if (dest == m_Item.nIndex)
# |2 E, g. C: w9 `; c3 k {- U& l- Y$ v" v" X6 e
//id相等 则 改变对应的dest和src
3 l/ @4 I, j$ e m_Item.nIndex = nTmp;
. X& W3 K1 A+ |) W* N, H, v }/ q/ |) [* O- M- [1 h& A
}
) S) Q# }5 F* s3 w. V' X% b}
" b; U; P' L# R3 j: ^};
) y3 |+ m9 h( }& X" @ q r+ n-------------------------------------------------------------------------
/ ] M% P" h: y1 B. n依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
! V! D' W- T8 M$ \搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
; Q, v K' [1 b$ b* M. f0 e( V# \紧靠其上添加:
, J$ L0 k/ _. |2 A, Gif( pWndBase == &m_wndMenu )6 d+ c u( X. x
{
, P! _) E) }7 e6 K$ T, h switch( nID )
/ i# m3 x$ O# V3 ?( N2 w3 _: H. m {9 m4 r; R1 b$ P1 {8 ~- i
case 2:
/ {) q! D+ D- l& p1 j1 p/ a: x: o% O- x {
: D h6 q K, n6 F+ a, q6 r4 I4 ~ //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);" A: R7 ?0 c1 q
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
& r3 w9 \$ [1 } {
. ? j# t8 E: c/ n break;
1 \1 @* T) {1 g. o$ t; h' r }; w5 j9 Y& |/ j0 M
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)( ~& A) h: a! h) S$ y4 [$ A5 V2 J
{
- \& V2 {* O. L4 _! {, s CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
+ W0 I% b. G' r) S4 n$ [& K if( !pItemElem )
, @3 n. ?& w" y% d. A4 h' M; ? continue;6 {$ |* J& e5 d2 ]1 p3 u
if(pItemElem->GetExtra() > 0)
/ Q& R) r: s# {& ]6 I- Z continue;
2 G: L4 I0 B# u/ g+ k" b, L# t if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) ; y" B) _; t" U
continue;7 ], d$ ?- j; F2 i% f
if( g_pPlayer->IsUsing( pItemElem ) )) y& n7 t% S$ h" g
continue;8 b8 \" ^) W9 p; ?/ z1 {
if( pItemElem->IsUndestructable() == TRUE )
# u: r# Q0 |; F6 S$ T# h {
1 R% K1 o$ @+ X$ z g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );# n1 r8 M8 P( v, [9 Z% B+ R. ?
continue;
9 m" {1 X. C- w8 L0 I" W- R }
3 n8 Z) C$ c0 D. v( ]$ k+ \ g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
7 ^ f% Z9 _% T0 n; V }
# l1 W* ^ I* q break;5 {# n0 j6 x( j( Y1 v" h8 ?6 O# B+ L
}) P7 R9 ?" y( A" S
case 1:3 C. V. y8 |7 ?% ^: ^% s, `
{& M$ P) n8 F5 }+ j! c3 R3 E
//整理背包
" x- `: b$ I. Q! \8 L0 O. `, A* u //////////////////////////////////////////////////////////////////////////( s. c- O6 g* ~1 U' z
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
9 A* ]2 T( v# r, U w //////////////////////////////////////////////////////////////////////////; I# r8 [; U1 I8 ]% }- E
//////////////////////////////////////////////////////////////////////////
! b/ g6 z1 m+ o2 u CInventorySort* pInvSort = new CInventorySort;/ v8 }; L9 ?: @" t1 {6 f
vector <sItem> vItem;
2 b6 G. P. l% a. I% u' S+ W vItem.resize(MAX_INVENTORY);//初始化大小
, P# b9 B$ N: b) p4 [ x$ e /////////////////////////////////////////////////////////////////////////// q+ z9 |+ T9 U- J
//填充数据3 [2 n" k2 U4 C# y$ S( c" O: @
for (int i=0;i<MAX_INVENTORY;i++)
* c5 ^5 m5 J9 |0 @& m) W7 y* w {
! ~# F" K8 d! z% [ CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i); p9 `" g U+ q: E$ e
if (!pItemElem)3 D2 k3 |" [6 [: F
{/ V: l: B* ]9 V4 C
vItem.dwKind2 = 0xffffffff;
0 ?6 H- k$ O4 j X n/ d vItem.dwItemId = 0xffffffff;, p6 Z. X5 w, S
vItem.nIndex = i;
' k+ A- ^4 A7 Q5 U* r) E# s; | }else {
5 P! R, {1 M; @. u# b7 ]) ~ ItemProp* pProp = pItemElem->GetProp();& v; s3 M! H* E P2 `; Z4 c
vItem.dwKind2 = pProp->dwItemKind2;! b# V& h% T1 p* K: C1 T
vItem.dwItemId = pItemElem->m_dwItemId;& h7 f0 X; T" K1 }/ q7 e, }
vItem.nIndex = i;. i: |3 t8 M2 y6 b7 z- i
}
/ u0 k9 V; t5 L/ ? //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
; B2 W4 J+ M# i }
" p1 V6 M9 B: K4 l: } //////////////////////////////////////////////////////////////////////////( z2 |, h' F3 w; N
sort(vItem.begin(),vItem.end());//排序 b! s3 C. }$ b9 g ]3 Q' Z1 y
//////////////////////////////////////////////////////////////////////////
' d- u v" N2 ]8 n- \% [, B* P //交换
, I3 u i2 U1 \& G- n. s for (size_t i=0;i<vItem.size();i++)
5 T0 `3 _$ f1 m" z0 V6 _! y% k {
% m8 p: d) M. ~; V //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);( f$ F3 ~) C6 ?% E2 B3 \" X
pInvSort->Add(vItem.nIndex);- Q1 o" n6 D9 x2 l
}- h, m& C1 ^# c* p0 A7 ^- ^# q* r. [
BYTE nDestPos = 0;' u$ K. c' D' ~" A- N" ~9 ?
for (int i=0;i<MAX_INVENTORY;i++)5 B" }6 U$ j5 a2 i9 e$ A
{
) I' q h4 u' \' L( Y2 V CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);2 j, P6 W' M ]* Z3 `# K! k& n ^
if (pItemElem)4 \7 g% C, j3 q5 b4 F) G4 A
{/ F$ r! ?" j. J2 P5 I- [ S
if (IsUsingItem(pItemElem))
4 u! t- w8 O+ g$ o& L$ p$ E {
) t* w5 B' M8 {7 A3 Q$ u, a ^ //这个位置无法放
P2 ~1 T, r1 k nDestPos++;3 G$ N5 H- @" t3 W' [
}: f: g) h" ^# |/ L: C' f, L
}
6 X0 b7 h7 q. y, T: S. g BYTE nSrc = pInvSort->GetItemSrc(i);
' V- z6 ~( m1 b6 V, p4 ]2 p" W8 B pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
, X8 t: R4 D* U) ~ if (pItemElem)0 f! J; V. j1 Y3 u, n
{
% z; A8 M# D8 t7 P( [/ Y; o; k if (IsUsingItem(pItemElem))" D( q* E2 k2 d
{0 w+ [; u$ U+ q2 @: B1 h
//这个道具无法移动,跳过
2 d8 l8 C; n% q$ Z, d- \ continue;
# [4 j+ ]% g2 E3 V! u9 h; c9 L }
4 u J2 T8 g5 B: x) V2 x }else{
% Y3 W. }/ I- K: q$ o' m% b1 n2 Q //空位置 不用动
# z0 w3 c" p1 G! |4 ~ g' d continue;& n: }) Y3 K K0 W- M2 T ]' a
}
5 b; S+ G+ G, u+ } //////////////////////////////////////////////////////////////////////////* P) v! T/ m( a. V1 m( o
//开始移动0 D1 J+ Z: C8 g6 p
if (nSrc == nDestPos)
: ]- C' ~! o2 |3 \0 _! l2 Z# a' H; t {
) ~: i0 |) k/ d //原地不动
. }" D6 o4 D: [, ~1 F nDestPos++;( O$ b3 V- O- ?7 M
continue;' e2 \! ?8 |" x7 n- E
}% X/ H; p8 b4 B# \# I$ a: a9 S
pInvSort->MoveItem(i,nDestPos);
# @- t O3 X0 P g_DPlay.SendMoveItem(0,nSrc,nDestPos);( u, k/ |; {# r) ?6 u
Sleep(5);; L+ y2 Z: l( K' B5 \# `
//Error("移动 - %d->%d",nSrc,nDestPos);* h3 |, s3 @/ t9 V% ?. i
nDestPos++;2 V0 @4 _; w# M
}
% @) l/ i2 T$ w& N- c+ ~4 H5 X //取第一个元素的信息
2 b) I% ~. w* [. h5 @' J2 g$ S1 m /*
8 [' [6 I+ L8 c& n* A# T5 Z/ R( t) { if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
' f! c* e8 ]& J5 a) ~% Q2 g {7 y6 s9 a% C' p( \, A
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);$ y: b/ g' C/ h9 g7 B
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
) q6 c4 ?; J" A$ D }
' w3 h* y" `3 K. e7 L */8 K6 p4 T8 I$ B: j( k
//////////////////////////////////////////////////////////////////////////$ c+ @# }# U+ B- ]3 y/ j0 _
break;
3 v$ w1 v! L5 w1 A } a# O6 @0 a, R: c
}
# z. W2 ]8 f3 q! I}
6 t4 @3 ^5 \& @2 w# vm_wndMenu.SetVisible(FALSE);" ?% N) {0 v' ?/ I. `0 R
1 ?$ ^) p2 S2 j- ^0 S--------------------------------------------------------------------------------------------------------
4 a8 L6 U" V; u* Q9 ~搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)9 x' W& w! @/ L2 q& j2 z
{
' o I- T d5 }BaseMouseCursor();) `: Y9 f/ F) K- O+ a' Z
}
! r8 J* x: Y% r9 u0 v$ _在其下添加:
) }$ A: m, F- a4 a/ e% Q) k8 xvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
3 Z' t, _5 _9 g* L/ W+ |{
2 H" N# d8 z' J% M! e8 E1 p0 Gm_wndMenu.DeleteAllMenu();
# h: _# ?9 M% h. Dm_wndMenu.CreateMenu(this);- t2 n8 X; A1 z- |' l6 I
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");) ^6 P- ~, P4 x2 l( c' E
5 {5 H/ t7 W0 x& i$ `if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
' P7 a1 {: s9 N2 y- t5 I9 F{& X8 G- j; j2 Y0 s; X
//P以上级别才可以删除所有道具
& C+ v" Y- [2 _% E' \9 C# w m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");' @- A6 P3 M, b1 C; \
}: U0 o* k* A2 F% c. A/ ?
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
6 K+ B4 [& u; A% x& c. Z" B+ h8 H3 u; ]m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );4 H1 |- P" V; O* a$ @: L' _) g4 h" Q
m_wndMenu.SetFocus();! H- b+ C) L" @3 T( q
}" |# S2 {8 E3 i( L
------------------------------------------------------------------------------------------------------------
5 _) ^/ h5 ?9 A. I*************************9 q y6 X3 U2 l" _& \5 v3 b
WndField.h文件3 _# \5 t! U" ~! k. e
*************************" g8 }; @" b# |5 |; z
搜索:BOOL m_bReport;! J" \! F6 {2 q) D0 b+ A0 o% j
其后添加:
' i8 A' @2 z. Y, H5 Q; _CWndMenu m_wndMenu;
' f0 _5 t `- m! u' b5 T- N/ N9 w搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
6 ^8 k1 O8 @& x% v* r其后添加:
$ e/ V7 t) L1 D1 Rvirtual void OnRButtonUp(UINT nFlags, CPoint point);
0 w4 l5 c ?4 q1 t
( Q U: }7 _4 _
1 _% ]6 U3 G; Q% O( A |
|