|
|
源文件中_Interface文件夹下WndField.cpp文件9 e" f( E9 g, V9 p$ |
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ), D6 r& D2 A# c2 h K6 a% X
) u) l! h/ b- S1 ~- h" ?
struct sItem
' F4 R' A9 Q# B* t{
* P. |- t' {9 Q' NDWORD dwId;% D( ?, c5 s& V
DWORD dwKind2;4 V6 C5 q& i2 f4 U5 E
DWORD dwItemId;% s1 } `# T9 Z7 q0 a* D2 e# h& `( l
BYTE nIndex;
$ P! o5 B: ^- G3 ?sItem(){
' z3 l0 }. h& q) z) m B dwId = dwKind2 = dwItemId = nIndex = 0;
, v' h3 J d( w0 f3 |4 a6 \}* r2 C! n- W; ^0 ?
bool operator < (const sItem p2)1 _" `+ L2 k: e! s# [+ G! \3 F s
{
, R, L& y6 }( r9 P4 Y; U& T/ f if (dwKind2 == p2.dwKind2)
% s. b% h2 m) d; A6 {# x {0 B: j" w3 J) e7 g# j
return dwItemId < p2.dwItemId;
/ s! O W( ]$ ?) J/ e ` }else{
0 O) r. e6 ~7 ?+ B4 q' K9 J6 L1 X, I1 B return dwKind2 < p2.dwKind2;% |. ~* Y8 ^+ Z4 d: V
}
/ c1 c& u O" E! A6 u}1 S! C4 G( n* t# x6 b$ x
};6 p* l f% n4 H* S
class CInventorySort
& X$ n1 g# _9 e+ p) G: _$ ^2 T4 |{
2 S$ b ]3 i5 E ^/ i6 [5 @$ C1 \public:
6 C+ ~7 k3 ]# D* @* dCInventorySort()
8 \- H/ |: ^ Z8 l" k; _8 Q1 C2 d! ~+ ?{: j3 o% H% ~8 D T& K
m_dwPos = 0;
3 y+ W$ q- Y5 y O}& r' P2 p+ M" r7 X" M N
~CInventorySort(){}
' R& f8 G" Y& z: `: rprivate:
, r7 J9 ]2 q2 e' @" F2 Y; l) gsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
: w3 e' r+ f$ s* g2 j. DDWORD m_dwPos;3 r0 ?& r9 c- \2 w5 Q# P: ]
public:
4 j" J6 @ _6 `void Add(BYTE nIndex)
0 Z4 i! h& a/ A5 m+ y, H{5 C3 K# ?! J5 x3 h- _
if (m_dwPos >= MAX_INVENTORY)
$ H6 u. a* c+ W0 \ {
5 L$ | _. _& k+ t c8 D. ] return;# x6 a3 x- V: p7 V; T
}
. R* s4 \ | I7 K m_Item[m_dwPos].nIndex = nIndex;
8 ~, N- X6 l% B1 o/ \7 n5 C+ D9 w4 V$ ? m_Item[m_dwPos].dwId = m_dwPos;5 ^9 f' Z/ {# w% ?" w
m_dwPos++;
1 N( w" A# R- g* L" Z' u! D}' _- Z: ?% d. S, x
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列: X! M" h! V5 @' U9 r
{
& p z! A( ]/ n! F) X. W# H$ R# ` for (int i=0;i<MAX_INVENTORY;i++); T: P& Y9 Q' W4 L$ C: D
{2 W3 ^+ K5 n" ^; D; g$ Y, y" Q
if (m_Item.dwId == dwId)
3 ~9 [' X* I! ~7 ]7 W {& b* K7 Z" N1 H( w7 q
return m_Item.nIndex;' N. }1 U0 X$ n; j0 g' i
}$ h/ y. x; r' ^. v4 ?, V' [5 H6 ^- j
}1 N3 ~" B6 w3 _2 a
return 255;' ~2 Y* h) p; n; p2 E
}: Z3 t' T* F1 N9 i- W6 A) _# C* J
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
# M/ R# p9 O9 Y# N9 M{
1 F, p7 V; A- _# Y0 r) m7 M2 A7 \ BYTE nTmp = 0;3 J: u7 a/ n& a
bool bDest = false,bSrc = false;
& m/ }! z5 m8 O* {5 {" O6 ^ for (int i=0;i<MAX_INVENTORY;i++)
( N' S9 S) O2 [, x+ y. N! z( } {
# ]: u7 M+ s8 d+ ? if (dwSrcId == m_Item.dwId)
1 |8 J3 V/ M- I) P' d( P+ E* G- Z {
- u1 j" I9 A- ]7 U$ x# i( q //id相等 则 改变对应的dest和src3 N, U; Z& a. w$ q) T% a2 T c8 M+ Z
nTmp = m_Item.nIndex;! d6 S! V& g) Z( I
m_Item.nIndex = dest;; F6 |5 U+ Q" e$ y
}0 y7 ?# A) S7 c' D
}
" O: f/ }& s d //临时数据保存完毕,交换开始
' Y& l$ b* w# I) x& D h for (int i=0;i<MAX_INVENTORY;i++)
a3 B+ e" P5 U! ^ {$ o% C8 e, O4 b- S1 t2 N; a, j
if (dest == m_Item.nIndex)
) B: ^3 g% K8 O6 ^! \" s {. p+ x; H: Y; `8 u& u' T0 L
//id相等 则 改变对应的dest和src9 c! S! S! X. J9 x4 Q2 i
m_Item.nIndex = nTmp;' H* }4 k$ g2 _3 r+ j) ^3 n% I
}! X% [8 X' t) e8 B3 K
}% z- E4 C( D7 _* p7 W1 i2 y6 ?
}
) g& F! Q d6 r) o; ^8 O" z3 F7 k};
4 ~# `6 T! y0 M; v A, |-------------------------------------------------------------------------% P1 ?0 l! q0 h5 j# K8 }
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )# ?) t5 k! u# Z( v5 @
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
# K% _6 p. K/ Z! h紧靠其上添加:
! g' m1 u1 k, I3 ^ R, M# u- Z" i8 `if( pWndBase == &m_wndMenu )
/ ?8 t$ |) z3 i3 ?% v% o{
. J! r6 A2 ]) W/ E R9 x* ] switch( nID )
% g$ K n; m. O/ v9 U) v* y {! x) `- I( d/ R0 F% Z( S2 W3 V) k
case 2: h" a# ]3 }% z2 i4 }# j
{
% s: k" v4 F. Z Z( c //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
5 y4 B+ p; o+ ^" n if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)): D4 C0 i& l5 a
{7 h3 y7 i- i9 I, L% F# J
break; R5 }2 |. z% r. t5 }3 b g; m* c" j
}6 Z7 `3 G$ q; B/ f9 T( b, O$ |5 y
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)6 ~# V& v0 R R/ ^5 f
{6 d+ }+ ~- z2 z* w5 H
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
( O8 g6 G- g6 U1 r" _% c! V3 ]8 S* ^! R if( !pItemElem )
" d0 S! k+ u, m3 A" m) y9 O continue;# O F1 P! y/ A
if(pItemElem->GetExtra() > 0)
4 r* U: b+ J# H, M; ?1 t continue;5 D9 q3 d) h: @# p% u4 y
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
8 s/ T) i6 s( Z/ \ continue;+ j1 ?, H' P8 g
if( g_pPlayer->IsUsing( pItemElem ) )
9 L, \0 B; e7 Z H% x continue;8 q# h/ v5 l2 S4 z# G
if( pItemElem->IsUndestructable() == TRUE )
! ] V" Z* Y4 g4 w7 \( ^% U8 A {9 d) K8 [2 A8 I( _
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );. T) k; B/ y" B" @% y6 H. C
continue;! B/ ~7 i$ B- l( K. G1 F& j' s
}( V2 z4 e! n* V( V9 O2 I
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
* E4 |0 A7 s8 Y* b }
/ X5 }3 X/ Y, D1 g- Q/ ^: F# v' _ break;$ k8 Q$ p8 Y& k) U" l, g) L
}8 P0 u' Q; _) S- q- M9 q0 B
case 1:( `# H1 y6 R- b0 U
{
" a$ V- k3 h) _; L5 B, c //整理背包
) F! S/ u# j) {7 _ //////////////////////////////////////////////////////////////////////////
3 x% q h% d4 h2 n //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
: E6 R6 V; m3 o, A* E //////////////////////////////////////////////////////////////////////////
9 @. R2 N# n4 m+ l5 A //////////////////////////////////////////////////////////////////////////+ {0 E9 X$ e9 x% b2 h9 W
CInventorySort* pInvSort = new CInventorySort;& t: r& V) e$ B7 h
vector <sItem> vItem;
. \7 w9 f$ K a, z' R. S( ^0 K vItem.resize(MAX_INVENTORY);//初始化大小
. a* q Y% H* o) G; E; V+ N% ^ //////////////////////////////////////////////////////////////////////////! ~2 o: d# p: e: |
//填充数据3 ^ Z9 V9 {& Y4 [9 n5 m
for (int i=0;i<MAX_INVENTORY;i++)/ e& M6 Q# U5 s* u/ d& H
{* K) W4 Z4 y( M4 b( ^2 e2 d, Y6 R
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
7 w" x8 g, l: U0 y9 ^ if (!pItemElem)- D0 f; S/ y7 w4 U% d; ~
{
- \" c/ y8 D; F" A- g, A- C vItem.dwKind2 = 0xffffffff;
$ r* _: q$ n3 U4 _" Y7 f; n vItem.dwItemId = 0xffffffff;
4 o; O3 l4 D) U* D/ i vItem.nIndex = i;
3 P; i+ D; F n' m }else {3 f' i4 e8 @& @8 h+ I( J" u+ W6 E% ~
ItemProp* pProp = pItemElem->GetProp();
# o. X2 T1 n5 `: D vItem.dwKind2 = pProp->dwItemKind2;' g" {" \ Z8 O( j
vItem.dwItemId = pItemElem->m_dwItemId;8 y4 K" X2 }$ N/ }, f
vItem.nIndex = i;8 z( Q, c$ x9 U* Z$ J& L, W8 P% N* X
}
* P2 ^ P% [4 W0 ~4 J( F7 G //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);) a; e8 R+ Y% f* ?$ i
}8 }9 F' {- ?& y. h
//////////////////////////////////////////////////////////////////////////
) v+ A0 ?- D% Z3 V sort(vItem.begin(),vItem.end());//排序
" A& l( b( d* s, l5 a% e! F3 d //////////////////////////////////////////////////////////////////////////
5 _2 w: L; k9 D6 L! }( _# N6 H //交换
1 f& B5 P4 o% s3 z for (size_t i=0;i<vItem.size();i++)' O6 D# H- a$ Q
{
+ m9 H% P- e T; q3 i+ B //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);1 H5 H% E/ w: x$ S
pInvSort->Add(vItem.nIndex);
$ T$ l0 X( y9 j* e1 D: ]" Z7 b6 I }8 N. O6 i: H! a3 h c( u$ f
BYTE nDestPos = 0;# ?; T' e) @% [' \: a
for (int i=0;i<MAX_INVENTORY;i++): u x) |7 x* W, `* c% u8 o4 q
{1 z. s) i, C/ ?
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
: K4 V9 V8 ~1 V* b7 b w2 M; z9 F if (pItemElem)" {% J/ Y2 ?0 i, P% C
{- D% T9 Z- E4 S( G. X; Z# Q
if (IsUsingItem(pItemElem))1 M e9 J# C. D5 M$ G* t
{2 P5 t& K9 [$ S; S: _
//这个位置无法放8 _) o/ [* g4 `' {1 ^
nDestPos++;% e. A; z* @) g; \2 @& R }7 L
}4 g( M7 z$ O( Y( w7 s1 J/ Q
}
1 ^1 j" B8 H9 Q+ T; z6 Z5 ]8 ^3 _' ], i BYTE nSrc = pInvSort->GetItemSrc(i);
2 S; p. m7 R. L4 y' I pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
; Y! [: ^2 C( V4 \; j1 q if (pItemElem)2 c2 h9 M+ j" k2 t
{0 O6 D" K* J% K8 ]$ L- T
if (IsUsingItem(pItemElem))
5 O: K) @, s. i. O+ ^: | {7 P& `7 ]" ^6 j0 ^" G
//这个道具无法移动,跳过
4 C: l& e) {- `) @# h continue;
& [( a- n- ?% Q+ a2 d; X+ ~# a }# r( e* a# p `; c6 K/ D! x
}else{; r3 q# O" h8 G8 m7 B; y, {4 [
//空位置 不用动! f" x/ ]+ | a3 {
continue;1 o: |- V) q6 k) m) W& C
}
. R- d5 J2 s8 g& y //////////////////////////////////////////////////////////////////////////
0 p5 X- X+ z4 M% j //开始移动
1 E9 k3 X1 T" B- M2 j9 T1 g& z) n U if (nSrc == nDestPos)" Q* i7 Y5 G: D9 R
{# e9 |' `) Z( ?. `
//原地不动# Z; U3 R6 d0 f I, A) w1 E+ g3 Z, f
nDestPos++;
! Q2 U, r& t; ]9 ^# G( q8 T+ G continue;- g5 A3 B) U! s4 Q5 i" _
}2 b* m1 n8 F- E' A. I% p
pInvSort->MoveItem(i,nDestPos);4 r w2 C q) n
g_DPlay.SendMoveItem(0,nSrc,nDestPos); V5 A& c# q- }
Sleep(5);
( B" w- ?, A; y //Error("移动 - %d->%d",nSrc,nDestPos);
+ L( v2 z8 Z4 H nDestPos++;% r: {) D0 m7 Y# X" r9 z: X
}
, C) F4 U/ u* B+ n3 C //取第一个元素的信息; T+ U8 Y1 z9 h
/*& |" B! F0 e+ N. F# K
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)9 Q/ p. A$ k5 R/ S6 n
{* A6 c1 F7 \1 e* q
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
% @% t* ~7 H7 R( G g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
- p7 \1 c0 | s. i# N }
2 b2 p1 H5 ~# D5 Q, p! X */
% L. H& W; L/ i# { //////////////////////////////////////////////////////////////////////////
# v p/ s& v8 J* L4 K) U2 i break;
2 s0 c7 J4 v1 P6 R7 Q# ~ }
9 d3 N* ~( g2 s2 ?2 c6 P, ^: _ }
3 V5 u; Z$ l, q. j$ Z}
, I) W: t% W; V" u, X; Rm_wndMenu.SetVisible(FALSE);
$ A( ^3 y& J. j, [0 a# e1 }2 C" x" K V9 S* M ]
--------------------------------------------------------------------------------------------------------. R! i* t n A/ A0 t
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
* `& u- T( C- j$ [( r. Q/ O! K{
. ~$ V) W0 C! Q- {BaseMouseCursor();/ K* [0 ~. u3 O! u4 q
}; t/ {- T% \% M' D3 \. M
在其下添加:
. }1 ^- G5 x" H+ L* avoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
$ U4 S- | O2 y$ ~{3 O# L7 e3 x# l% J% w- {* q( j/ o+ M
m_wndMenu.DeleteAllMenu();% f( u6 ?/ j4 w# n
m_wndMenu.CreateMenu(this);
! g/ b- P4 y: D4 q: O8 tm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");, S! Y( e( \& g' Z
" o u3 U' s C3 @9 v- ]if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))4 v6 [% g; ^* L' p3 \! q
{4 b0 E; |. ^" J) ^5 t
//P以上级别才可以删除所有道具/ e# W- r T( _( J" y" \1 m& M5 { P
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
, N: y3 v9 j0 @1 }4 @}; c$ s9 I$ G! a* ^/ q
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
( `; M2 r, ~" f& fm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );! `0 ]# _1 E( k r. N
m_wndMenu.SetFocus();% w8 A! Q* o$ T, `4 k
}
X& _9 t4 ]3 q2 W/ H- I------------------------------------------------------------------------------------------------------------( L# G* G- N# R
*************************1 {# v) F9 c7 ]/ u! X
WndField.h文件! H3 P# y8 t- e' g9 X
*************************% c. t3 X7 {" d2 _# k3 K: }. @
搜索:BOOL m_bReport;
, R# Q% Z- e/ _7 n$ P# g6 L其后添加:! @$ v' v5 R( a* r& v. N; \& g
CWndMenu m_wndMenu;# b1 a& a6 O# y0 y; k2 h! u
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
2 Z* r/ C8 C4 P- ^' f其后添加:
3 U# C F2 M# T: c# H! `virtual void OnRButtonUp(UINT nFlags, CPoint point);
9 W# B! I+ o7 ?0 X* i4 W" K! R- D k6 V1 J; a* j( d! Q( }5 f
" m) H' g; Y' ` |
|