|
源文件中_Interface文件夹下WndField.cpp文件
. @! v: M& m3 \& N, C3 x搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
8 L- d! Z, e1 e+ X; q: m# x7 I
& [2 p" k/ X4 mstruct sItem% w/ c+ ]6 l6 {
{
' {, u: A* c: Y: n1 k' E: cDWORD dwId;1 @/ m4 y( C, Z0 ~' x+ n: y
DWORD dwKind2;& m) C/ u" p/ G7 `5 B4 n
DWORD dwItemId;. b# s/ h6 t1 ~
BYTE nIndex;
/ s$ t( q8 J1 E/ ~1 }7 YsItem(){ }4 r* V- F ~
dwId = dwKind2 = dwItemId = nIndex = 0;3 k+ ?5 b6 t6 p1 R3 m( R/ c
}
+ h- @9 o, I- n: n& d; |$ nbool operator < (const sItem p2)- a- K( {0 d: }- F1 V6 c+ d
{2 c1 d5 _% n. N
if (dwKind2 == p2.dwKind2), U$ q8 C( ]3 S/ \4 m( E! m* o
{
$ H7 V/ [+ w: E! B; G return dwItemId < p2.dwItemId;( ^- `; \# s, H. r9 I# K$ o! s- j
}else{9 t2 G+ E- G! x2 a* o; [
return dwKind2 < p2.dwKind2;' _. c: ^3 v; i
}
3 d; i# J: }6 Q4 }}
2 q( m7 D0 ]- s};
( ~& j b K5 r- J( Eclass CInventorySort! P7 v+ y. r. I# k: ^$ P
{ {. @ d7 p5 `2 g, a
public:
& \9 P& o v2 Z8 a3 Z) b! b" S& t! X# ]5 CCInventorySort()7 L9 j+ {! ]- I& K* V2 d
{
2 |# b0 E$ J& p! }* I m_dwPos = 0;& m% I. ?- X: S
}' Q- Z3 Y) c# B3 ^6 e( {: o8 O
~CInventorySort(){}
5 {0 y9 E3 R) rprivate:
, A/ R% Y1 J1 q7 m# VsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
% M/ _) f& E F( v$ O" u/ p8 l6 [1 `DWORD m_dwPos;% @5 u6 z1 D: i& |9 S6 r' G
public:
I1 J3 L5 f) Y% k% O2 t% v1 Dvoid Add(BYTE nIndex)# k* I4 u) R5 A) }+ {1 a/ u
{1 e% q S- i2 B7 `. z& {
if (m_dwPos >= MAX_INVENTORY)" f# L% H' {( c' ~, r0 d. i
{+ ~/ Z# s" ?# ]& C8 }
return;$ r# w! A: S f# b% R& C
}0 @, q! ~! X9 |1 h
m_Item[m_dwPos].nIndex = nIndex;+ l& `* ]4 X% p- m9 W+ ]
m_Item[m_dwPos].dwId = m_dwPos;( s) w6 \! l A7 ]
m_dwPos++;
: m# O W* {8 S}
, W% e a- A& \9 V: UBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
[! K& s4 P/ ?{
, w4 ]7 R2 H- [+ `9 B: i4 J+ ~/ u for (int i=0;i<MAX_INVENTORY;i++)
8 ~, r% v) X7 \, E2 e9 S' c5 G! s {' ]6 q- T0 P9 T# _
if (m_Item.dwId == dwId)5 ~% X ~" P: ~6 ]7 e
{
9 ^/ c$ d; l$ `- w! K return m_Item.nIndex;
* X4 e5 T' |8 C4 }& n }
8 Y$ o5 Z* f# T }
# ?5 f8 y) m! u. a, e* r' X return 255;' }* v4 i$ R. l! i* \5 ]( T
}! J6 G. ]4 n4 V) y* Q% e
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
8 V q' [( V5 x8 q{
% D/ l0 r) X. M9 M0 `" Y BYTE nTmp = 0;
( I9 c! W) m; B. D5 Z4 R8 M1 j( T1 f bool bDest = false,bSrc = false;4 v1 ?7 K: d' I5 }/ H, C
for (int i=0;i<MAX_INVENTORY;i++)- I# n/ ~/ D1 v
{
" e( V1 B, v8 Q- k# }" L! c$ U) l if (dwSrcId == m_Item.dwId)
: |" t+ y. K% M9 Z/ @0 i {# C! p! d, J4 i" e) t
//id相等 则 改变对应的dest和src$ w" c3 M* o, A! `3 ~7 Z- Q
nTmp = m_Item.nIndex;
- S- N1 D, e1 |3 R( N% x) N m_Item.nIndex = dest;+ @5 | ~ E3 ~5 E$ S
}
7 Z9 C1 `2 l. T7 g3 E }
F( ~' ]5 b; [ //临时数据保存完毕,交换开始/ h1 e2 k$ a, C! U; _
for (int i=0;i<MAX_INVENTORY;i++)
! B2 C J% a4 d$ w! w9 d4 T {/ E4 n+ _$ [- G# E
if (dest == m_Item.nIndex)
/ v- E3 K1 q( q3 f% l" t {
0 q6 B; }7 b8 U! s6 o& K3 ]- e //id相等 则 改变对应的dest和src+ b. H! V4 v6 R0 B" I* E& i; H$ a
m_Item.nIndex = nTmp;1 [ t/ i3 A; p' g3 _7 Q+ |
}
. G! U- n. b5 q9 g$ l* Z/ R }
4 y! ]+ X% s9 ^! f+ K, m# V}
- f2 Y* @& l- ~; z& \5 Y/ X};
! |% Z c' M- [-------------------------------------------------------------------------2 Z: w3 K: g3 u
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )' M' L! a+ D5 y" n
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);' |; \( j4 Q. M5 J
紧靠其上添加:
( e- h: N4 S! z$ W7 w* x$ Mif( pWndBase == &m_wndMenu )
7 [. q1 d6 d* w+ O{7 [# ?6 s2 r4 i' {- o; x4 g3 J1 l% f1 z
switch( nID )
0 F0 L9 F. R( x. y8 B/ f4 x {
# c+ s& g, {) A case 2:- t% A( X* o+ z1 [5 \
{
/ Q6 G% R; H" }0 b& h' o //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);; h3 J4 }+ W( h$ x( p# h, B
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
0 i; F7 R4 Q( l+ b: H {
8 S' l* T# A0 r3 u; p: h; o break;; @$ J6 P" V9 C9 i. I' r- s
}
6 D+ c. _( @' U+ x0 c% q for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
3 h9 v8 i/ C* g$ M3 f {- z& O; ^% n7 O6 U8 y$ d& e' k
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);; U/ _0 ~8 P' t' B. v7 u% Q4 Z B
if( !pItemElem )2 \$ N1 N2 P/ e6 D/ o9 g
continue;
5 p- ^% d. B7 ]- Q/ e8 T5 l1 v if(pItemElem->GetExtra() > 0)& d* w& Z: [/ Y' q! { X7 d; I3 R: K
continue;$ F3 m! j7 |. d' Z
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
- V( _5 ^- l/ p8 `1 j) W9 q continue;
$ x, k0 d2 \# k# X if( g_pPlayer->IsUsing( pItemElem ) )/ j' Y, ^9 i5 Q( d
continue;1 `7 w, x+ X6 E$ r5 f( l$ Z
if( pItemElem->IsUndestructable() == TRUE )
2 g; p1 W/ ?* ^( _ {7 N# J$ u+ y$ @9 b* a9 `' H
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
. p/ l7 K; J# I. H continue;, M2 w: w# a3 @: l
}
! E9 T$ A @' [6 t; L6 c, g( h. h g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
" i" b% y8 E% g3 M. d$ E }$ w+ j D2 A% v6 W# x9 e! P
break;' T4 N/ ^6 @8 k( ?! P
}1 t& g& l. t6 \* g
case 1:4 q: w( P2 v+ P+ Y
{
5 \4 ^9 d5 c5 ?9 h$ Z c0 l //整理背包& d* ~" W! A- {7 p
//////////////////////////////////////////////////////////////////////////3 a* B" Y' r7 w
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
% S# E/ L# H% Y, j" |1 A //////////////////////////////////////////////////////////////////////////
6 b' Z0 j1 Z) u7 m. c9 k) b$ n- H$ D //////////////////////////////////////////////////////////////////////////! o. q, M0 v8 Q! n; ~* W
CInventorySort* pInvSort = new CInventorySort;# x+ H1 @, ]; N: H+ v- `
vector <sItem> vItem;
% t) Y) X$ m' N1 }1 Y8 g) N1 V, A vItem.resize(MAX_INVENTORY);//初始化大小( E; c8 H3 [5 [* Q3 }) |/ S7 m
//////////////////////////////////////////////////////////////////////////- L! o3 `6 L( B; b
//填充数据
/ W" ~% G1 w' x# [" {/ ] for (int i=0;i<MAX_INVENTORY;i++)
0 C& s3 N) u3 a/ ]0 K$ S {) S. ?- r) @7 _0 t( b% {, @
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);" t1 r* p) `: F% o( e$ b m4 P
if (!pItemElem)
. N+ y1 D- `5 m9 F+ [/ J/ z" C {: H8 @) V W& H
vItem.dwKind2 = 0xffffffff;* o/ B1 [2 J. C5 a2 ]6 ~ Y* M
vItem.dwItemId = 0xffffffff;: Z5 F4 B: S* i- o# N' y# w
vItem.nIndex = i;
* x# S3 C3 f& h }else {5 b+ ]% k4 |( U. P6 A6 w* I2 O
ItemProp* pProp = pItemElem->GetProp();
9 m5 P4 F9 R6 Z1 a1 Q9 }, e( V8 q vItem.dwKind2 = pProp->dwItemKind2;
! C( W* r* b. a. @+ ~ vItem.dwItemId = pItemElem->m_dwItemId;
0 _% c1 J) @; Q- N vItem.nIndex = i;
& h4 s, ?: }( V" `" G( J }3 a# S- C, G' h* }. P/ f
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
3 N4 e6 `, ^1 z( Z1 q }6 r8 H1 s& g) M+ z0 X2 |0 }
//////////////////////////////////////////////////////////////////////////+ j5 D7 [ Q/ i* d' \5 D, I
sort(vItem.begin(),vItem.end());//排序
- s* p6 i3 k3 C2 P: _8 i5 c) j //////////////////////////////////////////////////////////////////////////
* B* J$ n# ]' \; C4 A% j+ s1 H9 S1 X //交换
; g' W2 d" g8 a* i/ s7 w4 n5 g for (size_t i=0;i<vItem.size();i++)0 s0 _# v7 V8 ]4 _' ~& S
{
. P+ B! Z( ?# J //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
' w* s" f9 n9 \* { pInvSort->Add(vItem.nIndex);
) \; ?4 D& Y/ ~0 z4 V' J% A }
( [% a8 @# V7 E7 a; d" V8 h ~+ s BYTE nDestPos = 0;
" N9 M. C5 ?. l0 \6 V% C: h" x4 W for (int i=0;i<MAX_INVENTORY;i++)3 @( @' L! B5 V1 m
{
+ D6 e8 E# X& R% x2 q% m; a$ V CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
. B0 p% J3 k1 p$ k) k/ e+ f if (pItemElem)- q2 K, H1 k ~
{
) T5 i9 H+ U0 W# E0 R if (IsUsingItem(pItemElem))
8 `9 F; [ o3 b, o a- r, a6 s {
_0 g; A2 ^8 P; `) Q/ A6 A //这个位置无法放# i! h9 a, |. _2 J5 a: Z
nDestPos++;* \5 W- A6 Y+ \% }* V
}
: D8 _- |5 {& L# k( E. w }
+ e# Q# }2 y# L' H$ x- s* C BYTE nSrc = pInvSort->GetItemSrc(i);: N' u$ u: T8 d( R; ^3 b9 G+ u6 k; h
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
0 e' |: G% e9 s if (pItemElem)
B8 v% @0 f8 `2 o3 y8 a9 f0 _ {( ]" [: \( y3 g7 h( K9 N
if (IsUsingItem(pItemElem))
9 j; F3 z& a/ h# O) ] {. b9 w* w7 W& C2 f" Y9 u* i
//这个道具无法移动,跳过
4 y, O- i" o7 t4 r continue;, j: o5 ^' }) d; Y7 L( [
}
& Y7 N" K6 `( U7 ], ` }else{" [6 t1 ~3 K4 \8 w
//空位置 不用动0 o9 W3 M5 i e
continue;
9 ^% i& q8 F9 v- x6 u }
9 I; m, ?9 R) K6 V2 U4 t //////////////////////////////////////////////////////////////////////////
0 c7 w5 m8 U& G. j3 \+ R //开始移动% v8 m* j# } A( D: K) H
if (nSrc == nDestPos)9 W% ] s6 R! U$ o
{
- }# A/ a8 k6 t8 i //原地不动4 @7 Z0 p- T0 s" o
nDestPos++;& j5 l4 z* C/ v! I' J$ C. B9 }
continue;
6 g. ^& K$ O# I1 B }+ Z' |6 D, _% l2 W+ @2 s
pInvSort->MoveItem(i,nDestPos);4 ]" Y) _+ @0 v: N
g_DPlay.SendMoveItem(0,nSrc,nDestPos);5 d! T& u* z5 x/ r2 X4 p5 h
Sleep(5);
" C0 N0 L* x) _% A ] //Error("移动 - %d->%d",nSrc,nDestPos);8 z# F' a0 e5 p' ?
nDestPos++;
& A( p8 L _5 _* |2 F/ J6 h4 M' r }7 }+ v% ]) |2 ]* ~% n" j2 ~
//取第一个元素的信息
! b9 b- x+ \" V% C, r! o. m3 ?6 K /*
! s% T4 e6 x. t L h if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
$ W3 b! M% i2 T {! K+ y3 {# {8 X, X! x8 O& M, R. }
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);% ]' ^+ ]6 ~8 W
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);) x# r8 m1 r" n; E4 L' f
}" K) i6 L7 p3 `9 z4 z3 q1 ~
*/
9 v* m* a# @. O' Q5 ] //////////////////////////////////////////////////////////////////////////
3 [7 j7 n( c* u) i& h+ }: P break;
1 @4 X. V/ ^) O6 g }( M3 Q [6 E% |( |
} 4 i7 U1 r4 s% G4 c/ u* |: b
}5 H, n4 m: H% }: B2 D0 o1 M
m_wndMenu.SetVisible(FALSE);" C) X i+ s% J) _6 N9 i
- S; W6 z1 P& M9 ~0 [--------------------------------------------------------------------------------------------------------4 S: }5 r7 Z8 h, K
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)4 O% Y1 M- x3 [9 n j4 ]2 o
{; P( r- K' `) ]+ Z' K
BaseMouseCursor();
}; F/ T+ V5 R0 J}9 j( n, E$ l4 d1 @9 G+ k& H
在其下添加: o/ K, Z+ l( u0 v- k. ?0 g: ]4 K+ A9 U
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)' |, ]" C& k& M* p1 @
{# I6 i3 ?; d1 r7 j5 P; l5 b7 C
m_wndMenu.DeleteAllMenu();
5 ^' Z+ n/ t( a* _1 Vm_wndMenu.CreateMenu(this);" D5 z6 M* K" P
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
* H1 t% k5 {3 F2 O, J2 E9 K2 q" y8 @/ `2 s# x9 Z
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
5 S+ E' P' e1 k7 i `{& A$ e# P Q5 x ], C' x
//P以上级别才可以删除所有道具
) _0 @$ ~ w! |8 B, c2 z m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");; a2 g3 f$ c! x- f$ u
} a& j* k4 L+ @, X& x$ ]
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );% I$ ?2 N7 @2 u* A' ~% \2 ^
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
2 l8 Y | }0 M( N7 y# r3 U, q- @m_wndMenu.SetFocus();
& q7 N3 D/ r- X* d}
6 a/ |% J, M" l7 k5 H------------------------------------------------------------------------------------------------------------1 [0 j! M& I0 M) e4 S
*************************% C: z# d, X! y. D
WndField.h文件
, e8 e/ M+ C9 g! ~+ s*************************- n( E2 [& I9 K, Y0 X1 C' y
搜索:BOOL m_bReport;
: b. M% q) Y5 w% ~其后添加:
l. T3 D5 |" c0 FCWndMenu m_wndMenu;, B- ]1 L% E' Z7 U. ^ V/ k
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
8 m$ E, I6 b" w7 d其后添加:
3 W/ ?5 F( H3 d4 e: e1 cvirtual void OnRButtonUp(UINT nFlags, CPoint point);
2 k- a' ]# f, |' p- V/ F6 p& L! F; r. h! w
+ b' u0 ~) M3 J |
|