|
|
源文件中_Interface文件夹下WndField.cpp文件( K+ |. Y4 T0 F- A( K2 N
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
- O& A' z( ]5 Z( d2 y( K, e) _! s. x0 ?5 L9 N# {$ E
struct sItem
: d6 \, k$ Y6 G) L9 X$ g, O& R- s{+ \; T" ]# J4 K
DWORD dwId;
& o' W+ y. k( `% q9 ]5 hDWORD dwKind2;
. ^' Y( H" r% j4 {. CDWORD dwItemId;9 W1 Q D8 G* H1 j. H; E
BYTE nIndex;) Z6 l" `0 Q6 ?, r" n
sItem(){
- V% z+ B! V L! v! D dwId = dwKind2 = dwItemId = nIndex = 0;' P7 l5 y' L2 [4 ^
}
7 e# H) |- i, ^9 I! sbool operator < (const sItem p2)
4 o' I( F0 ?! ]8 ~{
$ c" R+ ~ D& r7 _ if (dwKind2 == p2.dwKind2)
# q: H9 P$ s6 e: U2 a {
6 s% `& a# U9 ^+ ? return dwItemId < p2.dwItemId;; D# R5 t. Y! O0 ?5 ]5 X/ I
}else{
& n* f9 z& J+ [0 k6 p- L return dwKind2 < p2.dwKind2;
# |' o. d1 R4 V7 Q( k" h5 x! H0 x# M }/ U/ f' @, ]) @8 c4 P
}, c; g, P! K5 s, b+ n2 Z& N2 E
};
9 \/ i- C, D8 D- @3 X+ kclass CInventorySort$ X: J& m" X; k5 b% e8 _0 K* y
{
6 L# M" d! D2 [* o& z6 upublic:6 C: n# ?5 X4 T
CInventorySort()
8 l7 ]0 T' O! b. p: h{2 ~# }6 u- U# i" f U) a3 O
m_dwPos = 0;6 Q1 f+ R F0 J% v6 i9 g/ [; j
}$ I; b, l: U# b
~CInventorySort(){}4 U( `% p4 X7 L4 c K5 Q! A( C
private:
1 o- Q# o) O5 [/ lsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
" Y5 O! C0 @4 v2 U5 l2 H4 {% ^DWORD m_dwPos;
' `& S ]9 i% O# Epublic:8 P$ p, V, ?& @
void Add(BYTE nIndex): F/ E6 \9 j" t/ ~+ s! p' j( ~2 m4 I$ J
{
. t6 n8 d6 [$ U if (m_dwPos >= MAX_INVENTORY)
: B$ u; ?. m& K B# |/ M. m! } {; S- l4 D# R1 j. {1 _
return;* H) ~$ K# p! n' m5 |8 ^3 \
}! U( }" r5 N% m# S* ?6 a, [0 n
m_Item[m_dwPos].nIndex = nIndex;
. [$ l( Q/ d7 i4 V m_Item[m_dwPos].dwId = m_dwPos;- M& E3 _, ~: x( b/ l
m_dwPos++;1 k6 G. p) q2 e! W" A
}0 b3 ]+ V3 c: H! k
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列+ w) s8 G( _" {; e4 S6 M
{
5 M h' `! ]( Y) B& F for (int i=0;i<MAX_INVENTORY;i++); D8 o9 d; x2 d8 W
{0 J# l3 `& z0 ?/ ? h
if (m_Item.dwId == dwId)5 e4 S N& x2 T1 a& D0 ^" w
{
/ ^% r& h6 Q; K' v$ q* b3 s return m_Item.nIndex;
7 H* G' L' I0 {/ \" y% i }. z9 `& ^" Q2 n, g u* Q
}
3 M/ d/ U3 l- ]! J# U/ b! F0 H" O8 L1 L return 255;2 M9 t2 Z/ `; |: V0 p- w
}
2 i) z5 I8 P+ x1 `void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
8 S1 n. Y* n% U1 S2 O{
( R( R# E- |( E5 |9 F BYTE nTmp = 0;
9 k4 m7 }* N* v- o4 \2 z4 n bool bDest = false,bSrc = false;$ ^. |3 n) K5 z+ [7 h$ P1 ~6 s5 Y" L
for (int i=0;i<MAX_INVENTORY;i++)
, D' M/ h- h X( U, C# ^- V. r/ W {
. } I+ ^- \: k& Q: P8 ~5 R O! W if (dwSrcId == m_Item.dwId)% G1 j9 h F4 a+ Z; B9 t* Q
{2 W5 q) P" `4 |7 D5 d
//id相等 则 改变对应的dest和src
( N' L! {/ K8 k4 y9 b! } nTmp = m_Item.nIndex;
4 ?& q; t" C0 n m_Item.nIndex = dest; Q2 w- I0 ]5 x8 w/ E( z
}. ]; x0 c, t5 Y4 {- l4 W) R
}; L+ C S0 M. R" O, g3 a, [
//临时数据保存完毕,交换开始# x0 r. h( J. ?
for (int i=0;i<MAX_INVENTORY;i++)
. h6 c, s. P: i" ]. f3 P {) a" H1 L" ?6 Z: ?, T
if (dest == m_Item.nIndex)( O# g' f8 o- J9 a: W- D: u. \& |3 O6 m V
{9 Y* L3 T5 k( a0 {2 B& ^
//id相等 则 改变对应的dest和src" W% ]0 n9 `9 Z
m_Item.nIndex = nTmp;
1 K; K4 ?9 ~ J5 w, D: ^" i* u }
6 ~0 F4 h# G/ t9 a/ Y5 ^3 C+ v) } }
?" ^7 ?9 Q' Q- c) @0 [( I}
+ x+ _- M2 x2 Q};5 b- g! S0 N6 n$ ~8 i) ?
-------------------------------------------------------------------------
6 |4 O" ^/ w$ f1 v% s. ^依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
A5 {2 n6 e( O" U; a搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);8 Q u. Y1 o3 r2 O1 |
紧靠其上添加:8 [/ n$ Y9 x9 G
if( pWndBase == &m_wndMenu )
, d( Y% c+ S( P8 q5 S d{
! t- B7 ?" G8 y' w- I b. e* u5 ] switch( nID )
0 \ G5 Y; v8 Z+ V2 l {
/ h* F% b9 H6 X {; ]- z case 2:
4 W9 X' d! H. H- }7 Y" o {
0 U$ M- L* w/ {, P //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);; p3 p. X" r% q5 s; S9 o; B* A
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
9 X' G3 q7 G( Y' S( ~+ z5 k {( q- B! h# U+ h+ i& m: n
break;! t0 p) K9 N, Z0 o+ L
}7 _) ]" L+ L& K1 @: U- c7 r
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)# b) \- @6 V6 Y# X
{
1 S z% u7 X+ ]6 Z1 K CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);8 F; D7 s/ y) T( B4 q' P, R
if( !pItemElem )
; L( z9 o; \8 \9 z6 x+ e2 O5 v continue; D5 H/ t6 Y( E I- z
if(pItemElem->GetExtra() > 0)
( R9 z8 W0 K, r. |% ~0 ]! D+ V* Q continue;' |! R% G! W+ `) X" y
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) : w' o! @# _0 y9 b0 ]% ], b# a" c
continue;) y$ ]$ X; P9 ^# }
if( g_pPlayer->IsUsing( pItemElem ) )
1 u& D# k4 z; H) F7 v continue;, P' H- [# z2 ]) s& y
if( pItemElem->IsUndestructable() == TRUE )
4 N! b x3 H# C {
! O( L4 R" v/ g g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
" x) ?! s) r( y8 t continue;
- Z. Q* X+ }' p$ n1 Y7 G }8 D) X3 F( p2 c( g% a2 I
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);* W. v/ ~& @2 v {% q+ F
}
3 z2 H8 Y: a' V6 T9 {" [ break;
5 F+ ?* K9 D1 F2 b, ^ }9 b, _- f( t0 K
case 1:
0 O' m2 c/ b% r3 L$ r) q. l {
3 g1 b+ z! j O, F w! K+ Q //整理背包8 t5 V0 R# z: h/ j1 y: R3 ~; `$ L4 B3 d
//////////////////////////////////////////////////////////////////////////& w! n, H" n! w) v6 Z J
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
* X& O% I6 y6 t- F; b0 O //////////////////////////////////////////////////////////////////////////7 R9 x! O$ S% A; j/ N
//////////////////////////////////////////////////////////////////////////
/ v5 p' p0 u) Q1 u" ?( r/ s$ {1 E CInventorySort* pInvSort = new CInventorySort;: v4 ]& s& F2 C3 ~% V. A
vector <sItem> vItem;6 C( ]: ^* V3 M6 r" N! D4 e
vItem.resize(MAX_INVENTORY);//初始化大小3 h, o' t( N8 _
/////////////////////////////////////////////////////////////////////////// y) {; I( x' @7 w' U. j* p
//填充数据
G+ |8 @4 P, h/ N% `8 l% C for (int i=0;i<MAX_INVENTORY;i++)
9 y0 ~3 [/ O7 P" L3 s {* I! i4 O Q" u# t) _* G3 Y( s
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
; @0 s8 v! F* y+ X) @) |- v, Q if (!pItemElem)" N$ x7 u6 T* E) _3 y, q
{/ ?3 V! r% m$ n# L" x. T
vItem.dwKind2 = 0xffffffff;: R4 M: Q; ?7 F
vItem.dwItemId = 0xffffffff;
0 l1 t, ~7 }! M7 @1 x% U6 q$ s T vItem.nIndex = i;$ ~% o" y4 [1 B& t2 D$ i
}else {: X1 M. o9 E3 C' i, m, Q
ItemProp* pProp = pItemElem->GetProp();
' `7 {2 D/ K! B& j ^, O$ P) v vItem.dwKind2 = pProp->dwItemKind2;- v& J! Z x: p% m( p7 C4 D
vItem.dwItemId = pItemElem->m_dwItemId;
4 \1 a0 w7 M( E& B vItem.nIndex = i;
: G7 \! s. P: \ }+ k5 S( o) b. x$ ~8 ]: H% \; ]
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
. K7 D$ K& Z# r" s }
8 M# W+ \( D# V7 y1 R/ h. d //////////////////////////////////////////////////////////////////////////
2 j8 q/ _* ?/ ?' x7 K5 j# j1 t+ D sort(vItem.begin(),vItem.end());//排序
0 \) f- Z+ s) V* k: Y //////////////////////////////////////////////////////////////////////////6 R& o4 H% P7 y4 g
//交换& a0 w, \9 d/ Y1 P
for (size_t i=0;i<vItem.size();i++)
# U, g" E, B- p/ N" k: R {
( \# K' W8 J7 r/ s6 Q7 a0 M //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
; I- _- t! s3 x& n& \ pInvSort->Add(vItem.nIndex);
3 F. Q. m3 l. f( i6 m4 r }! z3 k, k: X0 T0 @( l6 @
BYTE nDestPos = 0;2 E' g$ L! e1 h9 }" o5 y
for (int i=0;i<MAX_INVENTORY;i++)( T6 _8 L- _% V# \9 q# {( z
{* o3 p9 q8 L) [5 F# H; u% m
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
( o0 C% e5 s9 [8 d( X if (pItemElem)
+ i- `- a i0 k0 [; {0 s {
N: W- Y' z _ if (IsUsingItem(pItemElem))
' K" e3 T# |8 @; }! o3 B {+ \7 `8 M# E' [8 j2 |6 I) h
//这个位置无法放; p# T. d0 d( j' a* t7 H) G
nDestPos++;
( e3 W! ?! |6 J4 j3 ] }
$ c7 @" d3 v# j$ {; ^2 s! `" w" V }
1 b! c: a T3 B! y; w6 y8 }; i, ~ BYTE nSrc = pInvSort->GetItemSrc(i);1 @! {+ D" r _0 G
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);$ p7 A. C# d5 X, P* } Z* v
if (pItemElem)
8 T: W# }! a: o: }& ] {: C" z; j8 A @% L
if (IsUsingItem(pItemElem))
8 e' q- m6 @8 {0 m1 E3 W% h/ q {
. o9 B: x' c5 y0 P& k( C //这个道具无法移动,跳过
6 W9 z+ x2 [$ M0 Q* t continue;$ {, w+ Z# ^5 V* [$ _
}9 Q9 y d+ X& \1 e. V
}else{! i: H" o5 U1 F" w
//空位置 不用动
$ Q. Y0 F2 J$ ~. S7 }' G8 q continue;
4 u. G* A/ f3 @8 i; \ }) G+ F/ D! C( [
//////////////////////////////////////////////////////////////////////////
+ k. E% L: r% u0 p //开始移动
- V* I$ o! P/ I" i1 h8 x! j. X if (nSrc == nDestPos)' L2 I! b. T" `4 Y3 V% k! _+ V2 s
{
: J/ I9 G I) l //原地不动
- n! n8 r8 T2 |4 A% L nDestPos++;
0 b( w& D* n+ Y# t' P/ |! W continue;
. q2 h/ j1 a, w/ W- F# F }8 w$ Z* ] [0 b% u% T
pInvSort->MoveItem(i,nDestPos);. L! u* u3 K/ D/ w
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
. w: c( i( A3 i* z7 j Sleep(5);3 {) ?3 U5 F5 I0 h( @
//Error("移动 - %d->%d",nSrc,nDestPos);
: S1 o, q, x5 O% M: a( o/ H nDestPos++; O' ]8 p9 s' R6 h: c4 _) X' ?% `
}
) T3 d3 H% ^- T! x, s) h //取第一个元素的信息
/ s- j5 m, [+ _- M /*- X. m( x. w8 S& `5 @( q
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
" v& k0 c6 h; ?# C5 q {1 X6 y3 f+ m9 `: R4 j- l
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
! @$ J& ~ o- _ g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);* Z- F! e. h) t9 M
}
8 s3 _% @9 z% {) e. j2 C% G */
/ ?! d) ] o9 H" \- B9 k //////////////////////////////////////////////////////////////////////////5 I* u1 q' Y! ~* Q1 c6 c+ P+ |( d
break;
) u$ i2 @ r& @2 _" ^! U% N }
$ d- L* ^' X/ g }
6 _& x' n0 J; Y, A5 x}
, g- t. l5 Z) z. fm_wndMenu.SetVisible(FALSE);7 d1 \. W, M/ M* b" R
8 @+ U. T. I# W. j& i--------------------------------------------------------------------------------------------------------
5 k9 g# H Z4 P. X* U! ?" s搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
# E: V2 g: t$ H, A7 V' f- A3 a% T{8 ?8 F, z7 s6 Y0 G+ u: c& ^
BaseMouseCursor();
9 n) B3 U: c" p4 i# G}
2 w j! H$ ^5 b2 E在其下添加:
& _; g0 }$ G g4 u5 J0 ovoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point); x- |9 L0 f2 o) i( X) c- M$ T/ w! _
{6 M# B8 d3 C S. L# x
m_wndMenu.DeleteAllMenu();
5 i( {5 J3 j4 Mm_wndMenu.CreateMenu(this);" g; x- n3 ?, D6 A1 [ M
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
/ T, ]. k8 ~5 y9 R9 K% `- v1 \' {# D
6 \4 e0 Z. I* z$ U% E- e- L- cif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))( u0 ~) v8 r0 q
{
' l# S4 \, i+ Z //P以上级别才可以删除所有道具$ u' |7 ^ }' h7 T; y' U
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");7 ]+ q- C! ]* W F0 U
}/ l* t* G1 X' D ]/ U
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
, v% F3 I; m4 t" r1 x* S. w# Hm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );" f% N/ _. u$ S* U' l* @' F
m_wndMenu.SetFocus();
, ]2 C2 D# G+ x7 {- J; Z7 v}$ k+ \/ j' [' F7 ]
------------------------------------------------------------------------------------------------------------
2 V2 _- m6 h" n; ~$ q5 m- m*************************! @, Q9 m! h* U; C6 K' ~
WndField.h文件
4 q0 ~, |8 k! M. x& q*************************7 o5 M8 B' _8 ?
搜索:BOOL m_bReport;+ i0 T7 V4 ]) C
其后添加:
; o6 S, y+ _, r( H) w7 Y3 \. vCWndMenu m_wndMenu;
" P8 M9 ~0 ]1 Q" v. P G* d搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);% o9 K% R+ o7 z
其后添加:0 `7 e; }( ^! {! N$ S) Y* h/ B
virtual void OnRButtonUp(UINT nFlags, CPoint point);
8 a3 e% `% Y: p" h+ _4 f/ l6 ]% L6 J+ O/ p: t m
, e x; v, F3 ]2 L8 G
|
|