|
|
源文件中_Interface文件夹下WndField.cpp文件
+ |. l4 D9 X1 S* w ~- i; v5 `, Q搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ); x6 W+ e' H+ f# c' z2 k& V- ~% `
+ ^6 j0 j# p3 A" Xstruct sItem! A7 c% i: y+ w7 n; }
{
5 c- i; T4 C3 Y2 @DWORD dwId;
3 e, L3 a( z0 tDWORD dwKind2;" k4 B6 ]2 D8 U/ V* ^0 ?
DWORD dwItemId;2 \ v/ O' U8 v# B+ r5 C5 n
BYTE nIndex;) l; {9 l5 j1 E( ^+ S9 ]! V
sItem(){
( k3 R: c( B1 m7 V dwId = dwKind2 = dwItemId = nIndex = 0;9 ~8 ]7 e+ A2 i8 O( k
}
% L* H0 S* |7 lbool operator < (const sItem p2) D l: s$ b3 g8 N
{
. _! g: i9 @! [) N! E7 d; O if (dwKind2 == p2.dwKind2)
# m* u" T, ]* h" `3 W6 G {
) m% y% B s* y3 \ return dwItemId < p2.dwItemId;7 C% y: ?4 `% y, j0 J
}else{
" b7 l7 \' Q4 b/ l. t' k: O2 s+ Q return dwKind2 < p2.dwKind2;
0 \0 [( T; U% S2 Y, E3 ^4 u }/ { E3 d" w" I8 g; z( l! @ I
}) W/ n6 W) d3 M) O! B* i
};# M3 B4 C( f% V" R
class CInventorySort
" S9 T( Q, c; Q( T{
% W, A4 {6 N; ^3 g5 l& Y$ ]; Ipublic:
* z" |* R1 b4 `; cCInventorySort()
9 s* R/ F6 `0 n) r3 |, H2 {/ Z{
+ B1 t6 s! G6 y/ ` m_dwPos = 0;
) p' _2 H; S8 ]$ y/ O}
/ Z; E! c0 A: _! L- K7 [~CInventorySort(){}
& M% p4 v8 }) W( v: O$ z5 Pprivate:
) M) ^7 \2 J8 h5 ~% o+ f1 WsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息3 T; A3 o% O0 |3 m' |4 w) ~% L
DWORD m_dwPos;- ~( R3 Q, m6 |, g( H$ S T
public:! H2 x2 N* W% ?0 @" a2 U( j
void Add(BYTE nIndex)
* \6 j. ~* ^' x1 r: h{8 d$ v" `7 r- s& v
if (m_dwPos >= MAX_INVENTORY)
( _+ Y/ R, Z! e* ]% j {
1 J$ Z, \8 J" `+ U% u- z return;& C: ^ @5 T% P4 l$ F! s' ~# |
}% c9 h F+ r7 p {/ T! B
m_Item[m_dwPos].nIndex = nIndex;+ J5 m4 M! l! t! D$ G3 b
m_Item[m_dwPos].dwId = m_dwPos; R9 I B# x, v6 O: `
m_dwPos++;4 Z. X0 K d( G3 P8 ?
}
2 n3 u2 O2 Q* z. `1 t# zBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列, E- I" H% f' ?/ q
{3 r8 l0 Q! M5 g
for (int i=0;i<MAX_INVENTORY;i++)% g* K2 Q3 u9 R O) L
{
" V; J+ A# l8 J4 }4 `7 A9 P if (m_Item.dwId == dwId)
# ?3 [, ~. B! s0 e2 X3 _+ Q% b {
# _1 a+ e$ k4 C2 d) s0 h0 N% R3 E return m_Item.nIndex;
! m9 |9 Z$ h; D8 I: Q& C }
7 f' J3 s, _3 j K+ Z! \) N }
9 y8 }. U. @3 ~: w return 255;- b. A. X# a, E/ v/ ~" W' }$ V9 t
}
1 { l/ H, ?0 u5 Z9 qvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
) V& T$ W% |% b- w2 ]{
7 j; d. X/ h# z7 c BYTE nTmp = 0;: A0 S: M' f9 w$ y5 h
bool bDest = false,bSrc = false;1 r, ] U% c5 X0 I4 a- n. a: P
for (int i=0;i<MAX_INVENTORY;i++)/ @/ R4 M% ^1 \% k- V
{
% x0 D$ I" h$ Q" z if (dwSrcId == m_Item.dwId)" u: T$ l3 N* I8 h n
{6 ^" a* u& @& s' a, J4 i* z
//id相等 则 改变对应的dest和src' Q3 M+ V# U. L2 K- _/ j
nTmp = m_Item.nIndex;3 f$ E/ j% H/ f4 h4 x
m_Item.nIndex = dest;
2 D8 j" N7 ?$ w* M3 Y. k- i }
; |: n0 Y( t# W+ J$ l# u2 C/ M" b }
$ x2 J, h9 a1 ` C* H //临时数据保存完毕,交换开始2 u, ]3 ~) X$ J* t
for (int i=0;i<MAX_INVENTORY;i++) j& S/ N" q( X3 n0 g3 V) N/ @
{
0 \7 O/ D: F% d# [) p% M. O if (dest == m_Item.nIndex)
6 c5 Y( Z' T: {, t6 d {
2 U7 T5 p& [' i6 f //id相等 则 改变对应的dest和src
& B: G1 B/ x' z1 @! q% m4 c m_Item.nIndex = nTmp;
3 @4 i+ S0 j( w; M4 A }
8 a) l0 i% a2 ]& R }* Q2 ]8 R/ X( I2 _# ~& y
}
! h4 _3 [, Z3 i/ J' s. ]};" ~, t4 @3 k; D" k( p! k- s& D% p
-------------------------------------------------------------------------
1 d) @" r/ A; T0 ~7 s6 n依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
Z/ ?) l2 _. L3 f5 H3 H# E搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);+ t1 c. R$ ]5 t6 i9 v' b
紧靠其上添加:# Y, p0 [# C V$ ~. G( e
if( pWndBase == &m_wndMenu )
6 A4 `9 l9 k# A! X' z9 q{) X0 D ]2 E: |* V" h
switch( nID )
. h, k; x$ d3 J T% B% K, m {: a8 z: {8 Q5 w7 x8 E+ m
case 2:
* c3 g! g8 c3 n N1 M# w. g; |! F {4 y- }% |2 Z) ]' a" Z& _0 _
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);# v9 ^3 t9 J" S, k' u0 I. d. W
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))8 W$ Z5 N! V2 J
{2 u' C: L) l" N; k& z
break;7 Y( H4 s3 p$ s7 d) [
}( a- W* w6 C! ^# U) q0 H
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)1 o a+ }( G/ ]2 y# w. ^
{) T# {# J; }0 o# g4 a
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);1 S5 ^- V, M0 m Z
if( !pItemElem )
0 k! g" q' @8 L" w1 N0 F) J: n3 e0 `5 t continue;7 `# Y9 `. j- e' l
if(pItemElem->GetExtra() > 0)7 y( l5 _. |& `4 F: m
continue;
5 k8 x* A. l7 A ~/ ?$ a4 i if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) ) s, g- k8 @& E6 O E- y, G6 W
continue;
- u1 S4 E/ r& E- t1 Y if( g_pPlayer->IsUsing( pItemElem ) ): C* r- X: i( @0 k; e8 E
continue;6 H# O* [ C/ P$ t. C
if( pItemElem->IsUndestructable() == TRUE )$ G" Y/ Q$ p0 T9 y8 V: k7 W8 U
{6 ]1 q; m0 q' o( M5 A6 x2 K
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
2 Q, K1 A$ u8 R3 u! W continue;4 p# a/ Q+ n4 `* W8 G4 l
}
k# U. K! D1 V' F7 C4 j5 i2 F$ j g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);$ p; q6 M' V& z- w, \6 ^
}1 `8 U' L2 p+ D4 A* T
break;) U# P- E: g' p* S$ |2 ~% D
}- L @3 ~0 M/ d0 d1 @4 C! B
case 1:
) |) n3 O6 {; t3 X {0 g. A# u$ ^ }* a1 v6 D
//整理背包 q9 a* C0 r5 ]$ r& R
//////////////////////////////////////////////////////////////////////////
: z, f7 e6 b" I) [$ x' \, N& v //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );: C% o4 g' A8 @' q
//////////////////////////////////////////////////////////////////////////
# \+ Y) |" k1 I _9 L, p* e, L //////////////////////////////////////////////////////////////////////////
! {# c o) K! B* A CInventorySort* pInvSort = new CInventorySort;
1 _* D8 z( r; q8 v vector <sItem> vItem;% h- U' L$ l4 y" T+ K4 q# F7 O
vItem.resize(MAX_INVENTORY);//初始化大小/ U8 D" o* ]# h
//////////////////////////////////////////////////////////////////////////3 u* g0 O* \1 t( l3 p+ f$ r
//填充数据. T$ g9 W0 N6 u! _7 }
for (int i=0;i<MAX_INVENTORY;i++)! O- F9 k4 y0 J) ?# `
{
% u3 t( n: I% Z% C% r. | CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
7 R1 ]0 K0 ?; k if (!pItemElem)! e" |0 b5 h$ @# n- O
{3 V' R# M9 \9 B
vItem.dwKind2 = 0xffffffff;
1 J. L1 \+ b/ Q* l& i, @* t+ N$ U vItem.dwItemId = 0xffffffff;% N3 E' A) V6 ?
vItem.nIndex = i;. E! e( e( q3 M/ i: m, W0 @
}else {2 ~% q1 h* y& R. E8 l
ItemProp* pProp = pItemElem->GetProp();' ]+ Y* ~! y9 b" G
vItem.dwKind2 = pProp->dwItemKind2;
$ c2 K+ Z) X% o( Q vItem.dwItemId = pItemElem->m_dwItemId;
- t* u* \4 Z- u# |& k) W2 h. d vItem.nIndex = i;
) `$ D0 S0 L* Q$ o0 x# ^( a }$ y$ e! H* P( e
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
1 X0 d( @& B* c2 K, E, F, g }
: k# H; Y/ q% Y' ? \* C/ U. a //////////////////////////////////////////////////////////////////////////" i, L: |6 \% a/ f
sort(vItem.begin(),vItem.end());//排序
5 j# n+ o- V: P' L) P- h //////////////////////////////////////////////////////////////////////////
8 d) Q% E3 y0 T) L! y+ }8 G //交换, a- A2 J7 x ]0 w, I6 c. ]
for (size_t i=0;i<vItem.size();i++)
8 ]& Q( x4 D0 \7 ?' Y B( C' K& w {! k- j3 x5 x% P9 H
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
# s0 f! {, `" L, l pInvSort->Add(vItem.nIndex);
' m, a# R: Z x0 A }3 n7 H# J; ^( k; {& d w, y
BYTE nDestPos = 0;8 w5 }2 k3 T) H& ?3 v- U( {! \6 c
for (int i=0;i<MAX_INVENTORY;i++)
3 c) u3 M! }. a {5 T2 l1 V( E7 {" R) u
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);3 P w/ e- y5 t ~1 [3 B) x: g6 d
if (pItemElem)
$ x. b# M+ _. {9 h {
$ b2 u1 i0 ~. K. r! H/ \! d/ G5 k; t if (IsUsingItem(pItemElem))
5 m2 n. p2 D% Z& f: |: K D! I; ?2 D {
; h" h9 c7 Q7 r1 N+ C) C- y //这个位置无法放; l! g2 x$ M+ e+ c1 S0 j
nDestPos++;$ i) I! G+ A2 r% w$ y/ y3 q
}
# {2 F& R, o) Y/ {8 R$ N }& C: f+ c2 X6 i7 e" B* Z* J# ]* r
BYTE nSrc = pInvSort->GetItemSrc(i);% W! ?0 Q( D J. y
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);" e& u; Z2 S2 b/ O0 N$ q) }5 \3 l
if (pItemElem)7 U, Y4 Q4 x1 W- i5 A! i: l
{ d& K4 `2 e/ _& q' l& w1 R& M6 M
if (IsUsingItem(pItemElem))0 M9 k4 D" q- {3 _; d j+ v( x. M
{
6 R0 B. W3 h7 w3 ]& j$ F g6 V //这个道具无法移动,跳过5 w+ k! j4 r& }; J! L: o: E9 c" c0 m
continue;! B5 Y( C# y/ Q$ N
}: j3 Y! |$ C( E6 r9 N4 i' C
}else{
2 X6 E7 R- ?7 ^5 S$ R //空位置 不用动. V" l0 d. ?" B
continue;# s6 m1 e, R0 `
}# v1 q9 |7 w S, E! |! y% d
//////////////////////////////////////////////////////////////////////////
0 U* R3 v! D+ d% Q+ K //开始移动4 K2 Y& G( g2 t# l; c4 G# X& B
if (nSrc == nDestPos)3 C) \0 {9 o/ Q. C# s) N( [
{
% y7 T. S" J; V& t; } //原地不动
; N% z5 O1 u% }9 C; s; @# G* X nDestPos++;1 D" L: N- h* N0 K% a
continue;* \8 c# }) I: [6 v5 C+ h8 y
}9 G1 @* V& N4 B( V( y3 I
pInvSort->MoveItem(i,nDestPos);8 Z; S, d, O* ?5 A# j& Z
g_DPlay.SendMoveItem(0,nSrc,nDestPos);0 ]% _9 E7 O# s1 ?" R V" j, N
Sleep(5);$ Y) N3 B! @$ {8 Z- P+ M, O0 H
//Error("移动 - %d->%d",nSrc,nDestPos);
0 M% I% e) v- ?1 u7 ?7 \ nDestPos++;
& D# s4 t7 l7 D$ _0 v8 f" m9 I5 W/ ] }; b2 j$ _; ?" h3 \; {: _3 m& p# T
//取第一个元素的信息
3 x7 b- G4 M8 i% k! d /*
) {8 p+ R+ Q* v, X5 q& k& W if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
& }# q R. b5 d: g; w {
' L1 ~. W2 K- L/ k; v Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
2 U% S1 {- f; o- O g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);8 I$ E% Z* l- N/ y* I
}
A& h: K6 u2 [" P" x8 G: d */
! B3 h/ o7 G B$ B: c( h! @ k //////////////////////////////////////////////////////////////////////////
) t$ R6 g6 u7 o1 z break;
" C0 A1 F* {4 a- I) m. E }2 |( m0 A4 ~& n' R$ L% f: a
}
?0 W8 q$ W f/ t( _$ q}+ a# P9 A% w+ p- m, ~# J
m_wndMenu.SetVisible(FALSE);8 q# @: Q. L2 F a- y* S# x& J2 y% y
7 l$ ~" b9 Y+ [1 G: ~& m6 F
--------------------------------------------------------------------------------------------------------, ^9 [3 O" A c6 @9 ~. b/ j
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)3 ^" l. l& l. j; }
{
/ ?. z2 B" @) LBaseMouseCursor();/ c! d2 q' w" R+ N+ l
}
% H- a3 n8 V% ^& @, x3 }在其下添加:% H0 ~9 v6 N3 b- O e( F$ a
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
* L- F9 a+ R. r) z& m- a{
, X" q; q7 ]: M- ~$ T% [m_wndMenu.DeleteAllMenu();
1 N2 E1 A" e* @' I2 ~# O5 nm_wndMenu.CreateMenu(this);
x* E4 o3 c' i+ V4 Jm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
% N" g+ y3 P7 T5 ^/ w, w; \' r( P( G: c+ ?% |8 n) _0 _% B# X
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
$ r/ _! K% N$ s; O4 _- L" s{$ H/ T0 { f; r5 j+ q9 Z
//P以上级别才可以删除所有道具: G: ^$ J3 k0 _+ Y5 p( B
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
% N8 P0 N+ ]. e4 X$ ]2 l8 w, r}
9 ?# _* W4 e- N3 H1 b4 n' km_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
- I! P5 l- _+ L, Tm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
" F7 S' N3 _" N M$ R6 B9 f1 @* T( Tm_wndMenu.SetFocus();; A7 h7 P4 z, v+ `+ U
}& z2 |3 n) T; w( A0 W3 N
------------------------------------------------------------------------------------------------------------
' _5 w. z" f4 g2 T*************************4 e) u7 V/ I, Z* W- t2 O$ t
WndField.h文件
9 V9 [, W! z1 |0 Z1 {( ]0 P! m" M*************************
2 d# J( u [0 L8 h+ ^+ |+ F. s搜索:BOOL m_bReport;2 }( q/ Z1 T" s" u0 e
其后添加:0 @- D% G+ u( f! G' d
CWndMenu m_wndMenu;
& ]: K1 l c8 p/ \0 @) f Z搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);% \% q- j Q3 I _5 c9 \
其后添加:* K$ _; O+ R& j
virtual void OnRButtonUp(UINT nFlags, CPoint point);/ C" c6 a( f0 B" c
% i: ]' B/ L; S, x2 y) J
+ t- ~# L; r% ^ N0 l
|
|