|
|
源文件中_Interface文件夹下WndField.cpp文件+ _/ _2 n+ q2 z4 c8 H
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
) @3 {5 g, m# t5 u+ q* B3 `' _) s" z% k
struct sItem
2 F8 z1 R3 z2 u& Q. J; v) ?/ C/ }{% |9 ?5 V l) O% c) U
DWORD dwId;
. G; G- |6 x# I' b V3 wDWORD dwKind2;
0 ~2 r' o; s! PDWORD dwItemId;
7 v @% Y* j8 [# K5 vBYTE nIndex;
( ^$ E" U" u( z( ~, f2 N9 VsItem(){. Q0 U, r% [0 w9 ^# p
dwId = dwKind2 = dwItemId = nIndex = 0;' u, ?" f% q6 A
}$ r+ R9 A: I, \2 o
bool operator < (const sItem p2)
2 C9 y8 i+ D: I, i{2 \1 I6 u; U6 J$ L* U
if (dwKind2 == p2.dwKind2)
" p) W5 w8 U) z3 W, q! H. C {& ?- V$ k$ `0 u# X7 z9 F+ i7 ]
return dwItemId < p2.dwItemId;1 ]2 }, q) h v, g( `# [* y5 \1 x
}else{
3 W" Z! G. w, m6 x8 @ return dwKind2 < p2.dwKind2;: p3 ?. ~3 f4 Y$ B t
}) j) h( t# l. g' Y' S
}! `% w$ D. g7 Q9 v
}; ?& `0 Z2 ?% w& K3 n, C
class CInventorySort
4 `. ]6 ^! a! }$ s{
) ~0 \7 ~5 R; R1 ~2 ^, U ^) Zpublic:
5 W% i- E- [3 D8 T" @7 }7 o6 CCInventorySort()+ K2 [* Z5 K3 b: \% E6 r
{9 Q4 o" _; u1 _/ b1 n0 k+ _
m_dwPos = 0;
6 }4 Q; K* `) u0 S M" M}3 F9 C% b1 v8 ~$ \
~CInventorySort(){}1 Z$ E1 G4 s8 @& g& _' b
private:! ?; e; n2 k4 Z6 D6 u8 t/ y
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
, K& |+ x e8 _) sDWORD m_dwPos;' C; i/ d. D/ l& k7 q1 Y3 C& z
public:
B3 h2 F* T1 Z* J* ]4 S1 Xvoid Add(BYTE nIndex)
4 Z; g# w0 j8 R$ ~3 D{& K% H3 A; y3 i& t4 t* ~
if (m_dwPos >= MAX_INVENTORY)0 | Q3 A# P0 H8 ^
{8 S7 C, K* _0 K
return;
1 e3 n* o+ H0 z% D. A7 c }1 i% q8 z6 \/ d# u5 N: \8 Q
m_Item[m_dwPos].nIndex = nIndex;
. `) M" C5 Z8 v3 | L2 Q m_Item[m_dwPos].dwId = m_dwPos;
5 ~8 s i; l+ K, \6 ^ m_dwPos++;
5 l: w: m8 w% T2 n$ ^! t' _}! ]7 D7 H2 t5 {; _ I3 \$ f
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
) f* V# t4 y# C3 y- G{
: _5 r, ~- U0 h' j" u& o+ t9 t3 [ for (int i=0;i<MAX_INVENTORY;i++)9 E P% L1 s* V4 [2 r
{
, a3 }& `( x n5 g) s if (m_Item.dwId == dwId): o# L& F2 c) j: h! n
{
& C, b+ N# H& R/ Y" V: t0 N return m_Item.nIndex;
6 r; n' y0 P- S @ }2 A% v; O2 f1 X6 r9 y; T
}
1 {, j# d' x5 g( r return 255;
2 s! }0 g6 P8 I% v$ P}
( p& T5 n' F% J( f6 ~* ^# A: d: Avoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
s5 D$ w4 w9 b- x2 K' T: G. z{
0 |" z1 U" y3 O/ h, C; S- B BYTE nTmp = 0;
3 `2 G) a( F& Y2 j bool bDest = false,bSrc = false;
8 T4 Z2 q) z, k: w/ D4 k- q for (int i=0;i<MAX_INVENTORY;i++)6 p O1 w2 v9 B9 j
{
0 @0 {( T% [( S) L+ x3 N if (dwSrcId == m_Item.dwId)" E1 i' P9 }$ i3 l2 I2 R7 F- L( }
{
! B% w( K& K% L //id相等 则 改变对应的dest和src
, t3 F" m$ d7 s4 d nTmp = m_Item.nIndex; x) k6 g9 Q0 w' k* M
m_Item.nIndex = dest;
, K' ^3 J' I) y) X }
1 |$ U: S6 C8 @9 K% l0 m7 r }3 ], u/ B& G# n' Y1 H. V* y
//临时数据保存完毕,交换开始8 F0 V6 V4 c6 h! p
for (int i=0;i<MAX_INVENTORY;i++)
5 e0 r% }: o4 z0 c( }9 K {: L* u. `6 d& Y, r/ _ I
if (dest == m_Item.nIndex)
3 ^/ n5 R9 H3 j J, q1 e: ? {. e$ Z1 T1 t& p& Z
//id相等 则 改变对应的dest和src% p6 x& W& N" R% H" ~; E' v7 P+ h
m_Item.nIndex = nTmp;4 F' S U. u# m# h# p/ R
}
& @6 q Q9 H7 Y9 e4 U }
5 W; Q( O) f' l G) w- H! c}1 M+ [+ b l) y) {4 ~
};
0 x* g, k8 _( O- W% ~. n-------------------------------------------------------------------------2 S, l- K6 F1 Q
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
6 e0 D. @+ p5 W7 n5 K# L搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
; g5 M l+ ~# x6 o紧靠其上添加:
?2 Q5 S* C. B7 Z* r0 s; sif( pWndBase == &m_wndMenu )! G/ @3 y# U7 _* o5 | ?8 n& w
{) d/ [2 P4 m1 D- w, i
switch( nID ); k2 {! H2 [# [+ p
{; X W8 x" v5 ?# m2 H% p
case 2:4 H' G; x# b# Q( L- k& s$ T# X/ U
{3 i: e( K" s8 W6 D
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);& Z7 W G* I* q& W1 Q n% ^
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
8 c9 v( O* o9 b3 y1 s { b/ w$ n" E1 u& ^) k
break;
0 |* Y+ [! y4 a3 |) t0 G3 s }
$ H! M0 r8 z; s& n for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
& t6 U( V8 l' `0 c4 a( w {
3 M- z3 j' K" H: l/ i: _" i% s- A* U CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);7 E( I9 a* h* u+ @
if( !pItemElem )
! V& n6 e4 x; J; | continue;- _- J2 T3 i, b! y8 @! ^& }6 Z
if(pItemElem->GetExtra() > 0)
% g1 p* x9 T) V/ J3 [: X continue;
; \0 c4 P5 l' \8 F/ Z2 s! _" w/ J* Q if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) 7 s9 Q/ e4 D* n8 E0 x9 q: ]1 `
continue;
8 o1 W$ t3 p3 A9 Z+ T0 H5 z, p if( g_pPlayer->IsUsing( pItemElem ) )& O4 |) u, F! s
continue;8 T4 H! k c; s
if( pItemElem->IsUndestructable() == TRUE )+ A5 s5 X3 j2 j2 R5 ~
{
6 B1 @6 u* Y! c- L6 ?0 @ g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );6 X9 X8 W, Z6 {. l" B$ u1 l- \
continue;
" K# }# s7 p/ v/ u. s g }6 J1 I, F* _ W: L1 a
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
' H* {3 B. e4 D0 k2 g }
; V6 q& k$ R. M5 `3 Z8 n break;, _$ M" v2 Q. u2 G
} @2 n* }5 l! O$ R/ j& q: T
case 1:4 I' }# O' \. l( e" \% m
{* m- K1 }/ O8 t' L* ]+ u
//整理背包
1 F1 R" m1 m& q, T0 L7 y8 p //////////////////////////////////////////////////////////////////////////
# l9 C0 U9 {4 J- S f8 g, L //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );& V a* g, A4 L) @
//////////////////////////////////////////////////////////////////////////
! e: a5 w- S/ \2 O: y //////////////////////////////////////////////////////////////////////////
2 N% U$ M. A& B8 {/ N& O, N CInventorySort* pInvSort = new CInventorySort;
2 C- h6 k, p. Q6 d5 V vector <sItem> vItem;
# _' y3 S9 `1 B8 z2 k2 P6 e vItem.resize(MAX_INVENTORY);//初始化大小
! _( p& j" n" V" I# u! I ////////////////////////////////////////////////////////////////////////// j( A8 \& b/ I" u
//填充数据
/ B8 c" z. e. Y( t for (int i=0;i<MAX_INVENTORY;i++)
9 o, o' o0 i3 Q$ Y {+ n, x4 \6 B S ?% V! d
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
3 K" z. t# X# [/ y% C) i0 W2 B if (!pItemElem)) D4 l C% |- G5 }& w& A7 x
{# }! r& X q3 G1 R" M9 y
vItem.dwKind2 = 0xffffffff;3 _9 R( F/ p7 e3 m" \
vItem.dwItemId = 0xffffffff;) I3 L+ _- H; e& ?
vItem.nIndex = i;
8 ?! @8 u, Y' D+ x# m, K; ~% I }else { E. ?3 }3 {( N. C
ItemProp* pProp = pItemElem->GetProp();
0 _# ~' M7 [5 \1 q/ f* C8 S vItem.dwKind2 = pProp->dwItemKind2;
; W8 R0 v; q1 [7 x! i2 x) \( P vItem.dwItemId = pItemElem->m_dwItemId;' i; M0 r; e# [8 D& K8 e: w c
vItem.nIndex = i;
" I1 m2 \. g g4 p C! ^ }
8 d' S" I7 K6 v //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
' G3 |& n+ D( |, R7 z }
* y: {- R8 T, S T1 l //////////////////////////////////////////////////////////////////////////
: N" X1 T0 `$ k! C, O sort(vItem.begin(),vItem.end());//排序
$ s5 P; a, i0 \5 w. Y/ f //////////////////////////////////////////////////////////////////////////
4 Y8 K* X* _" d5 I8 x& V //交换
I& l7 H, N7 b( ^- E$ w for (size_t i=0;i<vItem.size();i++). L, l( `* X" J/ u3 D0 |
{& m' }+ g$ N$ Y% ]2 Y5 ^
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
& l: _& W5 p8 j8 U2 j pInvSort->Add(vItem.nIndex);
I9 U7 ^' ^8 }% s. Q8 q6 n }
' }9 u# ]' K) D7 ]- ^ I BYTE nDestPos = 0;
! P0 D4 S+ d- q: l# ~! g" z( H for (int i=0;i<MAX_INVENTORY;i++)
8 H; B8 o, x# Q7 O# H' j {
K( f5 Y9 X3 M" {& _0 y CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);+ r: F7 V; L& r* ?/ D9 d4 K1 e, {
if (pItemElem)9 y( ]+ L% m; d
{8 O# F* B* Q! F2 m* z7 C
if (IsUsingItem(pItemElem))
7 w, t. h/ @5 a; j { E( s% B: d" Z4 K
//这个位置无法放
+ @9 y+ l- X" g, ]! P9 d nDestPos++;, C( K4 l: z5 }
}/ F1 _9 V4 a" L6 y6 Q
}$ W! n3 M, }# @0 { I3 v% q
BYTE nSrc = pInvSort->GetItemSrc(i);8 s) H) F- ^ ~, k1 u5 M' t7 B
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
& _# p+ m/ f8 U/ b- e1 X) s- S if (pItemElem)
1 |$ a, ]) r+ j1 L. ^' K. x {
5 G; A! W) V7 K3 F0 \ if (IsUsingItem(pItemElem))$ F7 F+ e5 j( {
{
- M# @+ D# L6 @5 {+ |' E //这个道具无法移动,跳过
+ `6 |0 K" C" D ~ continue;
9 `8 W- o! e. {- W( r }
' S' a, T$ v; _ }else{
" v: o! g; D# D //空位置 不用动* a5 Q, ?! Z% Y# S1 a3 t8 ~. _
continue;
* A3 j" l* I8 @ }
$ a* i( D; R6 c( \ //////////////////////////////////////////////////////////////////////////
9 b, J9 U1 Y4 l //开始移动: e+ ?' t: l7 E2 G1 ]! ~6 f3 m
if (nSrc == nDestPos)9 j! v& W. G4 v3 Q* T* X6 J7 }1 }
{
- r% S& _0 T6 _6 Z //原地不动
8 }9 X4 V. z8 P I# I8 _, r( i nDestPos++;
9 V" G2 f4 Z6 R continue;* Z! _- }# S8 B7 x
}$ c( S% ]4 u6 ~, O) u/ [' L8 m
pInvSort->MoveItem(i,nDestPos);
. q3 }% o5 v) \ g_DPlay.SendMoveItem(0,nSrc,nDestPos);
1 L' c( a" N3 t4 Y- k0 s Sleep(5);& T; {+ c' y g: p
//Error("移动 - %d->%d",nSrc,nDestPos);
7 M# m2 y5 t0 z$ ^3 u nDestPos++;' ^6 F9 x) C2 i4 ?+ O. S
}
6 P W6 P& q2 A$ L //取第一个元素的信息
8 o1 m+ y/ O8 b /*( }2 Z& k5 H: G! _! J
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)' H5 w2 }6 i, ~. {9 ^; {
{
. \" q s% M3 @ Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
( e# h- I, J* u6 |' K0 \6 b/ { g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);; |! o1 N5 m/ U) D5 K: S5 H' l
}& z( B7 b7 f( s- |
*/% r; c& j7 H% [, N' o; T' y" u+ T
//////////////////////////////////////////////////////////////////////////
1 }- A6 ^. K7 u6 d; D break;
7 ?& r: m R6 \" J$ p7 I/ a }
( d) m9 u t0 s, h } 7 F, @! ~% D x* _6 L
}, Z+ e" t, {. Y0 T0 w* R, r3 Z6 ^8 r
m_wndMenu.SetVisible(FALSE);8 ]8 _6 q$ R5 q( y
3 J, @ f' Y2 U-------------------------------------------------------------------------------------------------------- ] B. m+ `& e
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)' H |; t7 [9 |5 B1 K. g; v
{ w# l# O- v3 y
BaseMouseCursor();7 ?' n0 s% ~) r+ _3 _
}5 @- `( v/ @" P: A6 G
在其下添加:
0 {, `3 ^$ R6 v" q! `8 M- c* [% S3 cvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)% _1 N/ w( @+ J
{4 [5 ?9 k6 x& A
m_wndMenu.DeleteAllMenu();
6 X" E8 m0 R2 D Om_wndMenu.CreateMenu(this);
6 m, j( L- l7 p. s; {. J) Cm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");5 t$ n* r* \1 N. P! U$ L% A- I
. u5 b5 \ }6 p1 S& c- q) nif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
" L$ I* k' n4 v{$ D2 N- D2 g0 t0 c% m, M' }
//P以上级别才可以删除所有道具3 D. L. J; E+ D7 C& A2 q
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
+ d- t6 V( o% B2 l}
) C: a& q; U7 J5 vm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
" O* c& i* k1 K. X/ b% `# Xm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
9 k0 |! u9 F' I6 s0 ~, A- R% g* Sm_wndMenu.SetFocus();/ n# b: N/ w. t! ^( N" m
}
* [( T A4 f8 A2 I% r8 b7 f+ S------------------------------------------------------------------------------------------------------------- {4 W5 O9 ~3 H7 c* t8 [
*************************/ z; e- c! s x6 D
WndField.h文件
$ A& t1 b" [" b$ |& _$ t( Z*************************- u2 h+ N3 i; |4 @% e2 N P8 x
搜索:BOOL m_bReport;
- ^ i& ?6 p/ {, B其后添加:5 B+ y' ]: P f: `* j, R1 O: X+ x
CWndMenu m_wndMenu;9 u3 I# J M$ g1 X* f
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
8 s6 R: H$ y& q) O. v其后添加:
, z+ N9 ]* b. _# R6 X3 z% Uvirtual void OnRButtonUp(UINT nFlags, CPoint point);1 i: K% w% Z7 k( u0 A$ i1 x
k) J5 }# _% o8 j
- O' T$ u m# Q' R; i
|
|