|
|
源文件中_Interface文件夹下WndField.cpp文件: l$ U+ Y9 }, S4 C, N
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
2 u/ j2 F, v/ V
" x5 _5 U' R' estruct sItem
4 q% R9 c& m7 _{, M$ t; p* ~. c$ [& z) ` g7 N
DWORD dwId;9 U. ~4 c2 P8 `9 q
DWORD dwKind2;2 E! S5 y0 e! J) l4 t7 _+ u) f
DWORD dwItemId;5 p& D( f0 f M
BYTE nIndex;
- W; |" X1 L. ~. D% G9 gsItem(){
1 i+ X3 q6 t& I0 ^/ U' ^9 g9 j1 W dwId = dwKind2 = dwItemId = nIndex = 0;' }7 `6 e* I& a. \1 M% F+ Y( V
}
2 q% E8 v' K2 P! f- ]3 Mbool operator < (const sItem p2)# y! `; h+ L( R; x4 a8 B
{* `5 U4 G5 P! U, J3 ]: d) {
if (dwKind2 == p2.dwKind2)/ x* P: h5 r, \2 U- f
{
! N/ {6 }- g4 f; H9 _% c) Z% ] return dwItemId < p2.dwItemId;* y. m% Z% n6 B# R
}else{3 `1 O v2 i! x3 E5 O2 l
return dwKind2 < p2.dwKind2;
! S# _+ H2 M: q& F7 _ }
$ p1 d F7 A" |9 C: J}
! ]* I7 s8 A& x7 \- t, h};4 @$ S8 }1 t/ @; b" s* S7 u: q
class CInventorySort& W3 x3 G' S6 {5 e
{, `" ]; O! t) F
public:
5 L) a( |" M9 z# Q3 bCInventorySort()' ?4 E0 `7 V4 E0 O9 }, b
{9 _1 W8 H% G1 X2 ~ l
m_dwPos = 0;
9 y! g9 I F2 X* z}6 e- ~7 @0 {8 \* G2 I
~CInventorySort(){}- [" S8 u3 {/ f: m7 o1 d
private:8 K5 a6 D1 Q7 L6 @# {6 }
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
$ X& l6 c/ {% t9 l) [DWORD m_dwPos;' ]; |) V( }! g- g# ^) }! y
public:" d: z. l0 m% r. e
void Add(BYTE nIndex)
6 G! q4 Q0 x! M$ c" e) l6 T{
) r! ~' J) ]6 p' a& R! ~/ R7 ~ if (m_dwPos >= MAX_INVENTORY)& L, r) F& z. S5 U- j# F' ?
{. ?' w0 F. ^3 P% {/ x% _
return;: ]5 f3 f) N4 _" _" A1 F% r
}+ u& `- J c" H m, h2 F4 {
m_Item[m_dwPos].nIndex = nIndex;
8 P5 {) R/ m7 E# |" M; [7 ] m_Item[m_dwPos].dwId = m_dwPos;9 V4 P9 N& r% y& a$ ?
m_dwPos++;8 R2 P& h% U: z" v! o! {+ p4 N7 Z
}; ?5 h) m; P, {+ H
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
5 n& F& N' f% c% X% W{8 {- ^8 n. ~& Q! m/ J4 [
for (int i=0;i<MAX_INVENTORY;i++), e: W' y5 _7 r" ]2 h7 V& U# @) R
{9 [. i& N1 w% z) p
if (m_Item.dwId == dwId)
# \; j, s0 B* o# _( g1 X0 M {) i$ `2 b$ i5 L; M( _" B
return m_Item.nIndex;, o( s; H; Y+ n2 J, W! x
}# i7 B+ O' D8 e% Q0 k9 D
}' g. S& P4 `# q9 h- U4 a( }0 T8 T; _
return 255;
( f& o# z, V) x. N# d. C- k& R}
8 R$ h. F- D' I7 W+ N4 bvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置& v3 ?8 o! B6 a: \3 }' F
{1 U& b& S; Q1 s5 \- e; F
BYTE nTmp = 0;
! s# q( X ~0 K+ N. @ bool bDest = false,bSrc = false;+ P& U: F& v9 T: J& C
for (int i=0;i<MAX_INVENTORY;i++)! ^( ?2 }* {) J, w. l3 E
{
# _# n; t, M }: |& ? if (dwSrcId == m_Item.dwId)
( a) [' [* ^/ o W! D o5 V {6 a/ I/ `% n: {( |; O0 Y/ ~- z" `+ a
//id相等 则 改变对应的dest和src
; W. Q; q% P% Q3 Z# v2 {; I nTmp = m_Item.nIndex;) S x; U x! V: |& H# {+ J+ _- S# D8 T
m_Item.nIndex = dest;# W3 N. K5 L9 i1 f5 c3 M) ?6 b2 r
}2 ~. Z2 o6 y9 x3 j. R2 k, {; u1 [6 l
}' C9 |. w* E0 d
//临时数据保存完毕,交换开始
1 j5 K4 W3 j: }2 d# n+ J* C; { for (int i=0;i<MAX_INVENTORY;i++)( c X \& Q7 g8 ]+ t( n' ]$ o8 \& p
{
+ q, I; ?3 t) }6 ^* P3 H. { if (dest == m_Item.nIndex)
9 m+ u1 C4 F" l& Q# f+ S, R, Q3 w {) }7 Y% l8 D: n, W2 q/ d
//id相等 则 改变对应的dest和src
' F. n! X- J# W! R m_Item.nIndex = nTmp;
2 w5 O4 J% v6 _" U7 L }% z- v: y9 X! y
}8 S9 I8 r. t! f& N
}& l7 [! m; J- P2 c
};
* a9 K5 _% ?4 u# ^; K1 ~-------------------------------------------------------------------------
5 L* q* z& y8 m9 C依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )8 ]$ m$ X, ]3 i% t+ D
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);. V: E; Y8 Z8 ~$ I- z) b4 s( y
紧靠其上添加:$ w* y* R* E8 t, O& @) m
if( pWndBase == &m_wndMenu )5 j% Q' N0 s& k* ?1 v* U3 `
{
I5 f8 F) V, c4 J+ Z switch( nID )
% o c. z: [- k/ I/ \: g {4 z8 R. N5 d ]3 c
case 2:
|' i% u& a. s" r2 D" z& z( L {
1 Y' x# F. M! W8 g //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
. t% v0 t% _' a* E, q7 a4 E if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))! C( k0 X6 S, M" M$ W1 ] J w5 [
{
1 y) ]6 @! L0 `- s9 g9 O% | break;$ P- B8 m7 A2 _# K- s& t
}
5 ^( B' T8 r9 _- _ for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
' Y9 X0 M+ o Z% ~' U7 j {# c0 t1 w2 @/ G E0 A
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);2 H* g# x. p& z& C: l& }# g
if( !pItemElem )) x9 q6 Y0 Q) Y; [5 f
continue;; X4 n4 @& I2 \* G& b
if(pItemElem->GetExtra() > 0)& s7 l1 d& C5 y
continue;
- ~" v# r6 m1 C2 E if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) . S' d: F4 R' c8 x D
continue;% \/ s1 \5 c- ~8 }" r H; F, M
if( g_pPlayer->IsUsing( pItemElem ) )$ Y6 O( U& r9 `
continue;
; I. {6 C* L+ {2 v ` if( pItemElem->IsUndestructable() == TRUE )( [' A8 ]5 Y9 A# }, {2 z
{% _/ a* w+ V, x7 x' K- }; H
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
7 U( x1 }+ C% j6 h' \* z2 b% b continue;" p/ C9 {3 m# r3 y0 O% N
}
# I' U8 I& Z' f: }- m V g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);$ Z7 d" P5 |' F- P
}5 Q4 R% x' ~7 v
break;
4 S/ n6 V4 ~6 k$ z. n* n) f: m }& u5 I$ \& E- g
case 1:
. [8 R0 J: V; \0 K: o {- G' a5 M b1 j7 } n( e
//整理背包2 ^# W7 ~( R @- Q& n# J/ q
//////////////////////////////////////////////////////////////////////////" s1 M) ^( I Y$ ?7 F4 ]
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
8 u p! h t6 R3 y7 j; _ //////////////////////////////////////////////////////////////////////////
7 g3 O* Q0 ^ r1 U% a7 Z. a //////////////////////////////////////////////////////////////////////////- n7 ], A4 |" K* |6 F/ V+ S( [
CInventorySort* pInvSort = new CInventorySort;
/ V% v! l- a- T: c2 U: q vector <sItem> vItem;
) R6 V7 X5 Q# G vItem.resize(MAX_INVENTORY);//初始化大小5 @5 a9 [7 d1 P5 V# D+ B& J
//////////////////////////////////////////////////////////////////////////
5 K+ ~. z% K7 d# h( c2 n3 {9 b //填充数据
3 W% l" g$ z1 j: c3 N for (int i=0;i<MAX_INVENTORY;i++)6 @! \1 b% C c: I! B( E
{( i- ]8 } N/ Y8 Y' k4 _2 E0 B% _; z
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);3 |+ n% `" w+ I6 g9 l) x
if (!pItemElem)0 g/ h" P* o: {8 b1 ~+ j5 q
{, p/ L) d- d: j% h# m, a- f
vItem.dwKind2 = 0xffffffff;
4 h5 o$ o8 W$ P0 Y( ]9 \ vItem.dwItemId = 0xffffffff;# [" l" [! U- x7 O2 N: K+ {
vItem.nIndex = i;
- A6 y1 w) M8 G5 O: E: o ? }else {7 m" }+ p: M8 Q$ \: G( g* Z
ItemProp* pProp = pItemElem->GetProp();
. g7 ~% m# C+ T4 W: X% k vItem.dwKind2 = pProp->dwItemKind2;( G6 n6 P a& l9 h1 z3 r' H# I( E
vItem.dwItemId = pItemElem->m_dwItemId;+ [' d4 |! p; E' \$ [ U2 ]- W
vItem.nIndex = i;
+ t) L8 k# G2 p( ]& s' A8 Z% m }, ]0 U" \6 ^% c, V {0 P
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);7 o+ ~! c$ e" O( g+ s. u
}; c& @+ Q. L0 g- l1 O! J
//////////////////////////////////////////////////////////////////////////
4 K, [) M' r, D# c( c6 r sort(vItem.begin(),vItem.end());//排序
2 M/ T! }7 h3 c- o P) r //////////////////////////////////////////////////////////////////////////
: d& ?+ Y0 A; K" ? //交换
2 A2 l- O% x" p2 M# M* x for (size_t i=0;i<vItem.size();i++)6 ~# E- E# |! H0 J4 \! f! y( a
{
+ x Y4 y! J6 M* X& a, x- x //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);- v. ~! c. g5 f' i; G9 b- b+ W* ^8 d
pInvSort->Add(vItem.nIndex);
) G/ G: v% h: v$ [( W% e- E6 |! ~* @ }! j8 G. [3 J; h" x
BYTE nDestPos = 0;
$ x% a* w) C& s3 D for (int i=0;i<MAX_INVENTORY;i++)/ ^2 W7 ?% V) B
{( r( m% Z: Y# S& Y6 m: p3 t5 a
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);& h- b1 P( n# s+ t4 ?$ R3 J; f) r- O
if (pItemElem)
$ G) z! ~8 |! N/ o: J/ _ {
+ `# ]+ r0 {. W. P2 _5 K( b7 K if (IsUsingItem(pItemElem))" e( E- {; D$ p6 l
{
7 ^9 P6 n+ w7 _8 A* P* E //这个位置无法放+ U( t$ {' F1 b& D
nDestPos++; |+ U( ~# g# j, H* @: d* k* z/ W L
}# o9 L; b6 _- A u0 z2 e+ I9 b
}
$ l3 n, m4 X2 w( @5 p0 O7 j3 ? BYTE nSrc = pInvSort->GetItemSrc(i);3 l/ A. K0 R7 b' q1 r0 P4 {
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);! Z0 ?8 h$ z( |0 I9 s
if (pItemElem) E. _8 c# Y p0 N# r
{& z3 L2 c* j1 m
if (IsUsingItem(pItemElem))
2 q% L; }$ e/ S+ U3 M. @8 c) v {- k& u" _/ D1 W* n& o6 D
//这个道具无法移动,跳过. o* I8 f2 u) L: g! [. J
continue;
0 S1 N- k. I. B% ~$ ?* [" I }
. H: q D; b" M5 J }else{
/ D2 D: {- N# [ //空位置 不用动+ E# h# w8 a, }2 a
continue;9 i) p$ E" J2 s a5 ~ y' e
}( V; b# a2 T" y& R5 E U
//////////////////////////////////////////////////////////////////////////* K) y9 t, J8 k! u
//开始移动6 w- o+ s: w ]
if (nSrc == nDestPos)
% i* E; J* t' Q {
. d7 [# `* B! j) m* j7 ^! O //原地不动
& M9 x+ E$ m5 c0 |% v3 F/ ] nDestPos++;2 W% J3 `: I) {. l; C3 t- x
continue;8 x& d3 e% m* C
}
, `4 v5 P- E6 o: Y6 j$ M pInvSort->MoveItem(i,nDestPos);. ?, G) g$ z3 g6 e: U/ h4 p
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
$ t, i6 y. u2 H# i9 g Sleep(5);2 ^( M6 J) c' b8 w
//Error("移动 - %d->%d",nSrc,nDestPos);
5 C' x* `7 r V, _; e nDestPos++;
^2 e5 R( Q' _1 w1 F5 N }$ t3 }6 J( n/ n" V* a" k/ g6 h
//取第一个元素的信息" u; ^- j( P7 c5 J a# c4 n
/*2 f5 J) `2 f9 h+ V4 {8 P# e4 x) {
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)/ z0 |/ t( X9 a5 u
{
8 y# J4 v2 M0 D2 _ Error("Move - From:%d,To:%d",vItem[0].nIndex,x);3 a% l0 e7 z: D t
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
8 w4 @( p& i3 B8 a% Q- q j }
# Z. b- [2 n# m4 I */
4 u3 O7 s2 a3 _& Z! d: ? //////////////////////////////////////////////////////////////////////////
1 K; H' p# l3 x/ [ break;% ?% B2 U& J+ `3 O' h" z! k/ n
}; L3 C& I6 K- ]1 P7 Z0 g
}
0 S" P. J9 n# v}
* g, v# F' E' V& ^; Lm_wndMenu.SetVisible(FALSE);( P6 T1 o) f: z1 O' b3 r3 Q0 j6 W6 w
, `( }3 w; Z! M! T- g, I
--------------------------------------------------------------------------------------------------------
* Z; n8 z5 F+ {; d' Y搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)5 ^7 q8 B( o y/ J- O0 `
{, q6 t( W0 r& ?) J( \- y2 i
BaseMouseCursor();
' h, _6 \$ ]0 E O2 A) E, k}
+ D% i+ M0 c# j' }/ G- O在其下添加:" m$ r/ f& T3 n
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
) T3 g: r8 | w' |{
0 _& Y1 G4 \/ ^* V3 ?& z+ \+ tm_wndMenu.DeleteAllMenu();. X* C! K0 E* d" v( S, }
m_wndMenu.CreateMenu(this);
! X4 x5 H' U$ lm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
! ~/ |! @* O, X0 s. m0 x+ i
a1 Z7 }4 u' H% \9 wif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
- O) q2 ]; K9 N) j{
7 s. u; F0 `: c* B4 a //P以上级别才可以删除所有道具
: F5 X2 ~7 g+ @% Z( Y m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");# u( O" R; _, Z. Y% D# u
}
/ ^8 x( W- x2 [- q3 Lm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );' P3 G2 L/ e' q. c+ d. `
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
! F5 I) x& J' y) j Nm_wndMenu.SetFocus();
% s* z! A% Z$ J% @& B% _}
& ]4 e! w. B0 u! l------------------------------------------------------------------------------------------------------------+ ]2 @% ?! F [1 z$ |2 e
*************************
7 ~/ |) _" P& ~9 iWndField.h文件
* X4 h- ^( B$ [' U5 o, W- O*************************
0 i% Q! i6 X& } S搜索:BOOL m_bReport;
$ }6 G$ v+ j7 _$ O v/ B0 q0 z其后添加:
/ [# q- i1 [, _* ?CWndMenu m_wndMenu;0 `; e% J4 R% h8 X' D
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
- o5 r* z: t. S# u其后添加:
& P! G& S' a$ ?9 O' Q+ Tvirtual void OnRButtonUp(UINT nFlags, CPoint point);
9 F$ n L& J1 }; i
- j# T; z9 _9 z, i/ X. `
$ [1 m$ R4 F" a" |" Q! u4 S! ^ |
|