|
|
源文件中_Interface文件夹下WndField.cpp文件2 d1 G" f' ` F6 ^
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )6 N0 O0 w$ H+ D/ t1 g$ ]9 d
% q2 I$ J' E J. i. e
struct sItem: B3 I- I& ?/ U* |" ?
{3 ~0 T* Z8 Z/ D+ Z; M% ]. f
DWORD dwId;
& L% K3 T3 z1 U& s& XDWORD dwKind2;- N7 P% A$ w) @) H l
DWORD dwItemId;' l" u9 X1 @% x
BYTE nIndex;! {: j- ?3 B, g- j/ v- D8 N
sItem(){
" _+ r% Y- \8 C# Q4 A1 d dwId = dwKind2 = dwItemId = nIndex = 0;
4 ~6 d: u o4 k6 f4 Q; ~}3 J q% _) b6 [2 g: O7 k! ~
bool operator < (const sItem p2)2 {8 x- |" o) E! y& N5 n$ p
{# `; I% h, a0 u t9 |2 ]9 a
if (dwKind2 == p2.dwKind2)
! l0 X3 g% k5 U( Y2 |9 `9 j5 e {
) [4 C. j+ x. @. S8 c return dwItemId < p2.dwItemId;
/ y# u9 d. D; S4 s8 I4 R$ J& [8 m }else{* D$ N/ i7 b2 T3 S) h: R* M
return dwKind2 < p2.dwKind2;) _: w1 M j8 v* x! q s
}
( y8 d2 w0 l. O5 F1 t% T! F}
. Z: g3 H% O- G' K: Z1 Y( E1 ?};- U [( \: L1 } P2 ^& \( A
class CInventorySort
% Y4 K; J" R, J{
3 k7 s4 V% R9 A# [( [2 s& Tpublic:( E0 R- }, l$ u
CInventorySort()& X, o6 Q% P6 c- P$ Z1 k7 v7 [
{5 v) ~' _3 S0 g6 v" w
m_dwPos = 0;: v9 g* c7 F# d4 ?
}
6 p6 x' p. \5 |$ i* A' ^~CInventorySort(){}
! z" ]( E- R; r! bprivate:' V5 U4 C" U- p* v7 V) u/ j# e* z
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息# j9 r' ?6 q; U/ K8 _& H
DWORD m_dwPos;
: t1 E7 c) R( X- S# R) {public:
# p, @5 b0 L: B4 H9 l4 P0 lvoid Add(BYTE nIndex)$ P7 ^, c: K! Q4 p( L" S$ `/ C
{
\! t# S6 {# @2 Q+ t if (m_dwPos >= MAX_INVENTORY), P4 k5 x% i& q- R" B
{
) Z1 {8 X2 | s, _6 c4 V2 E; \0 O return;& m0 F1 L3 |4 J# t
}7 S; a P( i4 K0 F
m_Item[m_dwPos].nIndex = nIndex;
" d/ P @: Q0 e! B m_Item[m_dwPos].dwId = m_dwPos;
) }' m* O" }2 T! A. ^ m_dwPos++;
' N/ ?9 u! S3 i5 R}! \# x. g7 e D- e6 i0 u' z
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列) S: { s7 Y+ O, P+ U1 o
{1 t% g% x: I+ b; ] J
for (int i=0;i<MAX_INVENTORY;i++)9 g H& v# J% `( I Y1 @; `
{
]7 @5 b/ r0 A6 l0 E2 F6 H) h. h if (m_Item.dwId == dwId)6 w9 Z @/ c/ ~( a
{
}+ ~+ U8 P6 N0 y2 J return m_Item.nIndex;: F) Q* b& [0 R
}
; h3 q+ q' X! a. |5 H0 F4 g }
) C& c3 T/ `! Q5 N2 Y+ P return 255;% G! W9 ]$ |9 N1 n' d
}
8 @. @3 e7 q% M) p* Ivoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置% V+ O$ a d; D
{
& C1 S [2 h' g' m& T$ T: p, Z6 Y- `, u BYTE nTmp = 0;* l* \* V8 o% Z( ^7 i) K
bool bDest = false,bSrc = false;
! E9 G; I {# j' W for (int i=0;i<MAX_INVENTORY;i++)+ A( E* l8 ^! }& q
{
! f) E! x+ L& _7 e( F1 f8 j if (dwSrcId == m_Item.dwId)6 a. z Q8 N9 ~" d# h0 d* X$ s
{0 t' V. }+ Z; e8 O! D
//id相等 则 改变对应的dest和src
: L6 h$ Y9 x( V' m: t. o nTmp = m_Item.nIndex;
2 C5 R; E7 {" U$ q$ S% B m_Item.nIndex = dest; g7 {" v4 Y- `4 Z" q8 E; J0 U
}
- I8 s o f/ v: r }
: }# m6 E* ] r* d- y' W8 [! B4 y //临时数据保存完毕,交换开始) S" @# D) A. F( q
for (int i=0;i<MAX_INVENTORY;i++)
3 n7 j- M6 S4 _2 h: G0 d } {+ ^2 k% P0 Z/ m1 w
if (dest == m_Item.nIndex)8 y7 b% U+ c5 ~ | r0 B; E% K4 L
{
* G! T: @, H7 c) X //id相等 则 改变对应的dest和src
4 ^/ C5 n: Q3 I W% A- R. K m_Item.nIndex = nTmp;( S- d" M1 S J0 n/ X2 \/ b
}3 S" I9 T+ h9 F" f5 B9 i! f+ W
}+ ]% `; {: z; h1 i7 o) \; J
}/ k8 I' s8 C6 b( ?
}; A1 n# [7 w+ J* y
-------------------------------------------------------------------------
4 m E5 ^" s. d% q' V8 {$ v依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
; t- V( B4 g+ B3 \3 E$ a搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);$ ]7 v2 t9 ?2 V# K, P
紧靠其上添加:% E5 A, G- z. {' a g/ p; g
if( pWndBase == &m_wndMenu )
. K, `- A/ h" o5 t) ]; P$ `4 c{) J5 i: z' d9 Z
switch( nID )
: X- z! \: b$ ?5 K4 V' d {& m+ K& h4 p* Q! |2 }+ f4 u
case 2:/ ?! T0 j7 E, g% |7 V8 t9 R
{! [ F* y- `6 i3 S& L! m7 U# v7 T3 [
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
4 F3 X ?2 p d* d6 S) _ if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)): u% R; {* M8 e6 T" K
{/ t2 K! p' y$ R9 ~$ ]) V( u
break;
Q; G6 D( g2 f: w }
6 D( h/ U6 I2 C4 L: A3 p for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
0 W q! C7 M7 ]# h0 u, b {! \% \3 g+ D: a$ U9 M/ H
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);9 W5 t1 C( J' X4 }3 M: x
if( !pItemElem )
& T {5 v% R: G; v$ \% j continue;
( A+ _( n3 P0 V* t* {- t: g5 Z if(pItemElem->GetExtra() > 0), M' T9 n5 ?7 o7 x; C8 X% J
continue;
( g, k/ H1 [/ C0 l$ D( J if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
+ p9 c( ~0 p# S5 @" n continue;
3 g2 a0 ]4 ]) l& D if( g_pPlayer->IsUsing( pItemElem ) )
7 b7 s( O' Y6 h, F- p7 ]! ?6 m continue;
5 u, z t6 M" k- G6 \ r8 y4 u5 s if( pItemElem->IsUndestructable() == TRUE )
! v3 j3 W+ k" A: L9 f9 o {) s: C; Z, q8 Y8 ^$ Z
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
9 i+ r0 L; d) V continue;
; |7 |3 ~" I! q* C4 p9 A }( P8 ^0 L0 D! X1 B0 S4 I
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);: d* e& p6 N } K3 t4 h
}
3 Z# E2 |& N3 P, Z' Y break;
# B: B( B% W+ Q/ F8 \ L }* H0 ~* ~+ i0 q- y- P
case 1:3 ]% r2 z+ z6 I1 W. R
{ x R- c/ ]4 X; g( z
//整理背包
& A X9 H9 E9 @ ////////////////////////////////////////////////////////////////////////// z. z0 ?. A2 F7 T- \0 T5 C" q; R- O
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );9 u% R. K# k/ _# D% Z& Z/ L* a
//////////////////////////////////////////////////////////////////////////+ x0 [2 Q- `: o3 p O9 F
//////////////////////////////////////////////////////////////////////////" ]. g" R7 {+ h1 [7 ^9 X( O! k0 j
CInventorySort* pInvSort = new CInventorySort;% K( J$ u3 A1 h
vector <sItem> vItem;
5 ]3 a; A# o# a, S3 F* d vItem.resize(MAX_INVENTORY);//初始化大小
5 U6 H$ Q/ Q, R! B1 | //////////////////////////////////////////////////////////////////////////3 y" c6 M9 R& R; [) T
//填充数据
, q, ~5 ^# P8 ]% g for (int i=0;i<MAX_INVENTORY;i++)
. V4 i3 N/ `' f {9 s9 u7 H0 U, c2 ^+ @" r3 w
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
; N( ]' N0 u: i* c" H! n if (!pItemElem)
6 a3 A( W9 Q: U+ ~5 W {6 v" m4 n2 [6 a! t, D
vItem.dwKind2 = 0xffffffff;
. B/ n1 f" o4 O8 d. L9 F vItem.dwItemId = 0xffffffff;
; Q f ?. x, F4 N* H vItem.nIndex = i;
! h3 H% D1 S% s& v# q' F7 Y8 U0 O& ^ }else {+ K6 R6 ^# j( r3 h: k
ItemProp* pProp = pItemElem->GetProp();$ @" R4 n1 o* P, h1 U: v P
vItem.dwKind2 = pProp->dwItemKind2;
2 _: N9 T' n3 W( v& f vItem.dwItemId = pItemElem->m_dwItemId;, j4 g+ d8 X" f
vItem.nIndex = i;
9 T9 D9 } |4 q) s0 F }
, L* T6 [ W [, s9 y- U- U //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);1 Z( H1 m- v( }8 _
}
$ M( i3 x" Q: e" V/ g+ M* D9 H3 A //////////////////////////////////////////////////////////////////////////0 n9 _3 B( `) \+ N0 W1 I$ a
sort(vItem.begin(),vItem.end());//排序
/ Y, J# g# a2 c //////////////////////////////////////////////////////////////////////////
) c6 e. g3 L! v, P //交换
5 D3 q6 m2 z: F- o* R for (size_t i=0;i<vItem.size();i++)
% B- b e9 V# u* b' e) [ {
/ X" k7 A7 F$ c: \ //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
2 |9 o" @$ N( l7 j2 ` pInvSort->Add(vItem.nIndex);
: H+ Y0 b p+ |0 U; X }
m: j8 R8 N5 {( f( S \0 i. |$ ~ BYTE nDestPos = 0;
" F4 m- l- U% j1 G. ?$ S for (int i=0;i<MAX_INVENTORY;i++)
( }6 l8 ?. U( L% e0 l {
' \, N; B9 J0 L9 x9 v4 U- k CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
" Y/ A8 l% v4 f! H1 Z if (pItemElem)2 O7 J8 I* `1 g7 p+ d
{
+ T0 |: l* w: u6 O if (IsUsingItem(pItemElem))
. a0 e; v& v+ h0 D {
0 G1 R# q" t: M; V. E6 h8 w$ J+ w //这个位置无法放
. ^2 H4 g8 H$ T( s nDestPos++;2 } ^$ V+ u# H' p# F
}
5 F* |: T# \' p8 T }- e! z: Y3 j$ A2 u1 S, _( k
BYTE nSrc = pInvSort->GetItemSrc(i);
; ~* L/ V8 v4 ~ pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
; R/ u# ]( b( L: ~. [- A: k if (pItemElem)9 ?- ]" ^* J( a1 k; z7 ~
{: E; g2 W' Q* G. c7 E g( W Q
if (IsUsingItem(pItemElem))3 }# D4 o' G* E3 Y
{, ]# _$ G, Z5 O
//这个道具无法移动,跳过: O" ~$ W# U' B+ Z$ D/ t
continue;
+ |7 t, a# C* Q& _( S) E }
- b# n/ t8 N9 f0 Y6 U }else{" }8 P* A* s0 i4 P
//空位置 不用动
. F& u. O2 f9 w" f) y1 Z6 Z continue;
; s- ~) t. E5 A2 C7 w& N, q }* h' K* w! |5 X: H
//////////////////////////////////////////////////////////////////////////& f& ?, ?4 B7 w7 c4 n C
//开始移动
% `2 h7 y) x( V' p2 m7 r if (nSrc == nDestPos)
) y% k6 z1 s7 I! l) J" X1 i3 y {8 h5 w. C+ R L3 J0 _
//原地不动3 x$ E! A. e8 J* C+ A6 K! W& w
nDestPos++;2 J- ]& p& |* y. v6 p: o. J* R
continue;
# I. \6 f& Y, J }- ?: U7 t. W$ h- L, I
pInvSort->MoveItem(i,nDestPos);
6 U/ \: T% g$ h! y g_DPlay.SendMoveItem(0,nSrc,nDestPos);
6 R' h% M3 d" z. J% ~9 M3 L# D- s Sleep(5);
" h# k/ z7 S4 @: J, @ //Error("移动 - %d->%d",nSrc,nDestPos);
( P+ ?" z$ d1 c( E1 p' U7 | nDestPos++;
6 G/ }; `$ ]$ F: |. u* y }& D- W' D4 I! ]
//取第一个元素的信息4 R( Y2 z5 M; E1 I5 p( K
/*, o$ {- M+ x+ u8 }- T
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
# @6 M! N; O7 x7 I& |) ~- | {9 o! P& ^7 ^& \5 j
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);4 _9 }" a8 T! U! B. p/ h$ L
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
, Z1 M$ [% F2 V# G2 ? }2 k8 ?5 K/ F$ A2 \4 `& a! K
*/* ?4 h$ Q# v- j$ s* C
//////////////////////////////////////////////////////////////////////////
4 Y. I' C! g, q) r) z4 h2 S break;% O3 b, m& i9 [% y- z( N" I- A
}
; n* Y6 [- l# I/ V3 B9 _+ w }
0 R- K8 f0 ~4 W" R5 v, g}
) m+ P" @8 s, l0 g' A( Tm_wndMenu.SetVisible(FALSE);, P: E; M" E9 ]# R
) P& U8 {. g0 M. g- e
--------------------------------------------------------------------------------------------------------
/ W9 b4 U/ K4 ]- P. g搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point): `# d! H F& a, D. r6 ]- s2 l
{
( \- O1 {$ B$ W5 c6 F2 G9 lBaseMouseCursor();# B* z6 ^$ o) G, O2 Y
}- W( O4 i' c: d/ y) x- P
在其下添加:
, D) E! J, `3 e+ P3 X5 \' {void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)) Z7 K3 w( K2 v# _$ H* x5 f' K
{3 S1 t& M4 Y( j9 W/ V
m_wndMenu.DeleteAllMenu();
* ^3 \: h- T( |5 R1 F3 {m_wndMenu.CreateMenu(this);
* J" A2 n( C) [% g3 Q% um_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");9 Y* ~8 J+ p0 l/ t% g' X W
) f* g# j: O9 F# Wif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
: ? b6 G" e/ l2 H6 d9 |0 i{
3 a9 j% d% D2 e4 r% e5 N //P以上级别才可以删除所有道具
# e+ \& ~( y3 O2 w9 f7 R7 K# v m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");* g7 x" H9 b. v7 j o
}
. B! z& B5 w1 w) Cm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );3 {& q" i% h4 l5 N
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
! B' c& l3 X+ z. zm_wndMenu.SetFocus();; p# p& G1 _+ D& y8 `
}0 C# N/ k* R: m! {; A! ^
------------------------------------------------------------------------------------------------------------
1 K. _3 ~; f$ `; ^. X*************************, L, V1 O+ _8 o( l% p5 d
WndField.h文件
* M4 E& _# Y6 p1 L' Q# l- [*************************
8 m1 ^" ]9 m" {: W; K搜索:BOOL m_bReport;% d5 ^6 Z& o5 S- S& X# G5 {
其后添加:( \* o5 N* E& v+ ^
CWndMenu m_wndMenu;
( v- R7 F5 W; e) i5 s1 S s/ q) d9 Y6 D搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
9 o; W5 |4 b3 m" h其后添加:
+ K2 [" R2 q5 t' _8 J, Cvirtual void OnRButtonUp(UINT nFlags, CPoint point); e$ g+ s6 w+ @2 M2 D
2 K0 u) G$ q4 V2 @9 s5 \% e
, F1 {, z! J* H2 v4 q |
|