飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
! b+ e9 j2 T" T! U8 e9 T3 k
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
% P8 @# `- a5 b4 l2 J- O
$ F- N" E: R5 E# S* Z& ?/ |8 ]
struct sItem
2 S! O& r" O; b: a; q4 B
{
2 X7 v: v; k; E' O k
DWORD dwId;
3 q/ A8 |; I. E$ S$ Z4 y8 O% X3 l
DWORD dwKind2;
" C ]; t6 D2 ~% X" `
DWORD dwItemId;
( d+ x1 e$ W: @9 Z" {; H
BYTE nIndex;
~4 }$ ^+ t7 g
sItem(){
3 v& T: [3 `$ l0 X
dwId = dwKind2 = dwItemId = nIndex = 0;
- g) z* B1 b, u5 i4 U
}
$ T1 ]1 i" X4 p2 t9 T, Q& o! ~
bool operator < (const sItem p2)
& F7 o" O& l; R- H
{
$ q, L: O( `/ N6 l3 I1 [& b
if (dwKind2 == p2.dwKind2)
+ S9 g8 R& O3 b4 _) D6 v
{
/ s2 d' \& f5 @0 U1 {) A$ Q
return dwItemId < p2.dwItemId;
: G% w$ b4 T' d$ ? A6 F8 c4 m' G+ R
}else{
" g& g$ H: O' }( z- M/ G5 g
return dwKind2 < p2.dwKind2;
/ ^6 N7 w$ C) s0 M& x8 Y2 S
}
9 O1 ^9 l( C+ {# t+ s
}
" _9 |% L) X- j' X% s
};
* d9 x H. I) o6 b) P; L; b
class CInventorySort
1 j% W; {% K8 {- E: K6 Z6 v, E" T
{
! G" S- e# @* y4 I1 C5 w
public:
/ R8 ?: b D$ o. x5 [ w( r7 n
CInventorySort()
8 q9 E0 j F0 N6 k( F1 W
{
3 K# }, G/ ?/ p% H' n1 a6 {
m_dwPos = 0;
$ u* P2 P3 a- w$ L8 R+ j
}
1 S4 U2 G" |* M7 i$ q
~CInventorySort(){}
8 U" Q% B2 C( d: R
private:
$ g; b9 O2 w; B- c* b; ~" F
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
0 p4 u1 Z0 I! i
DWORD m_dwPos;
+ a3 o) |! \3 u% F/ @
public:
5 X- L F. D7 u; G' s0 ]
void Add(BYTE nIndex)
" [* ]! j D3 \
{
& w( p& i5 o4 }7 O# y9 r4 X
if (m_dwPos >= MAX_INVENTORY)
3 Q: c% w }: F0 W7 Z1 s& ~+ l
{
- t- T+ g6 u+ R( f; j4 U& H2 @; o' w
return;
8 A% K1 n* ]' [2 `* d
}
1 Q8 p2 F( o4 W1 m
m_Item[m_dwPos].nIndex = nIndex;
5 z% z* Q* _0 R4 j6 e7 [
m_Item[m_dwPos].dwId = m_dwPos;
1 V+ ?% b9 j8 c& k
m_dwPos++;
' U& R0 F% Q0 c& ]
}
1 j( _: X! R% @4 a; }% V
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
0 Z) d" r0 U* J- v( A- Q% G3 T
{
& z& v1 R- @$ m P. @( l; z: O; {2 @) j
for (int i=0;i<MAX_INVENTORY;i++)
o3 z1 z4 c2 X) Y( d
{
* E; {1 \; U7 v
if (m_Item.dwId == dwId)
5 Y) r5 R: A5 F# K7 E* n. d
{
, t$ E- C+ G4 }. j, P! x
return m_Item.nIndex;
1 K) G. M' \7 R6 ?& M7 _0 `
}
4 G' E6 ?: D, U) A' ~) r+ t
}
' o9 i# Z# a6 y7 A
return 255;
8 [+ b" U) x; a$ W f
}
& `% F$ e0 {$ Y8 X0 H; F' x3 Y5 W
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
2 f. c& k2 n' t& b8 `( \
{
* c: B d/ t/ ]( h. T
BYTE nTmp = 0;
5 o9 v. Y* h- F! X
bool bDest = false,bSrc = false;
/ R6 s0 W5 b! h4 r
for (int i=0;i<MAX_INVENTORY;i++)
' Y! Y6 v. l8 e8 x- \- Q
{
d- W6 }, g: e
if (dwSrcId == m_Item.dwId)
& F% e9 c! t8 ?! H$ ~$ k. R0 C
{
4 ] U8 A% t4 W- I
//id相等 则 改变对应的dest和src
, N! P; ?, ]; s0 ` t! X5 O
nTmp = m_Item.nIndex;
; {4 T! W6 w& v+ j3 E
m_Item.nIndex = dest;
% V2 ~! o7 P* L7 y" `
}
3 @2 I+ P, ~: {4 _" ^9 q
}
0 H l8 l# r- k
//临时数据保存完毕,交换开始
1 l; G, n2 M' w; |
for (int i=0;i<MAX_INVENTORY;i++)
5 z6 D, O7 u0 E7 u; B% f* x
{
3 j( Y5 m7 u3 G/ _
if (dest == m_Item.nIndex)
0 ~$ h) p- V4 R; Y, c
{
7 X4 }8 A$ l* ]/ r. W& s
//id相等 则 改变对应的dest和src
0 B9 e( p; P" C- d
m_Item.nIndex = nTmp;
- u# U+ c8 v. P1 f( t9 w0 o
}
4 Z1 P5 T( v6 _$ R! `! N0 E* Y! m
}
- S8 @( b) I! I0 ~
}
& \1 b' G9 L6 P8 f6 Q( A# U8 l
};
. I6 Y; t6 h/ B2 d5 |& R. S
-------------------------------------------------------------------------
5 ^! D( }4 w, y# A4 l: N
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
" q) ^5 a; s6 w7 Q6 h* `
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
9 o8 M! [7 T7 F" W
紧靠其上添加:
/ R4 U H0 s8 t3 m
if( pWndBase == &m_wndMenu )
1 X% E! q6 g( C* }8 i2 O( C
{
$ |' d, r; q! ]' H
switch( nID )
% O2 R0 p. w Q; L( D
{
, J2 Q& I) p3 p; s/ m& L0 D- D
case 2:
- K) @ C; }* P/ C
{
$ c; H/ x: G$ M2 b- p
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
; V' ~7 h! F" C
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
4 k3 h' \# {. H8 H
{
" F) c r+ I x8 r
break;
6 l% k) P5 k4 ~8 u
}
S" P3 r; K; l! @! V8 s
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
+ y7 b9 d0 G: X- t
{
5 L$ y* A, k2 y8 c) [2 z7 Y' g
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
6 }) U% G- r2 h( s! N& b
if( !pItemElem )
& V& r; J! V: Y% W s7 L
continue;
8 t3 d8 I. f; {* h% y/ V. l
if(pItemElem->GetExtra() > 0)
' j6 I" C* z. `, ?9 [5 b; J# s [/ o
continue;
4 ~4 v% {/ l' C X" z. Q) B
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
$ h- a4 b+ E$ o# w
continue;
) j. R( {( i$ @& h
if( g_pPlayer->IsUsing( pItemElem ) )
' Y7 s0 ~3 ~# z3 p, _1 J
continue;
! b9 W8 \0 T4 Y1 r
if( pItemElem->IsUndestructable() == TRUE )
6 O- }! E( y X" P
{
6 a1 r1 A/ \" X/ G1 W' U" W9 t
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
1 Z1 i7 R2 S! l8 W3 j1 P
continue;
, L9 q) o% t' J/ l0 O$ G" V, `
}
6 c8 w; P2 x0 K0 T: H
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
4 [; Y- X. r" `* B
}
3 R+ P& c* F, J% o, {
break;
9 u4 S" C' i, r% f$ _! `: U4 w
}
: `* H2 m" Y- ] i
case 1:
8 V% x6 R4 K% M3 g0 f2 Y* U2 `( @6 ~
{
0 R- t$ Q6 \- M0 f
//整理背包
0 i/ o0 A0 h- z" S5 g/ e
//////////////////////////////////////////////////////////////////////////
; a% d4 x# N/ h. L. r
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
0 P c8 L9 v1 m0 q6 p$ m
//////////////////////////////////////////////////////////////////////////
7 K9 y* x" J! F: G& M5 j {1 |' H
//////////////////////////////////////////////////////////////////////////
* g& B( `, ]$ r& }6 w
CInventorySort* pInvSort = new CInventorySort;
, i' V1 d* H( d6 h9 [
vector <sItem> vItem;
" E. J; o' r+ ]7 ^$ }4 s- p
vItem.resize(MAX_INVENTORY);//初始化大小
) N, h4 c h4 q5 k+ o
//////////////////////////////////////////////////////////////////////////
1 V: s) U" l3 B- ]% H
//填充数据
: S3 }; _8 y. |" B0 R4 D2 t) E* s
for (int i=0;i<MAX_INVENTORY;i++)
; M; E* T) } A2 E$ y9 x$ X
{
! d$ G& J5 W$ `' Q& L2 E
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
+ x! f4 J3 c) S+ c1 Y$ j) V" K
if (!pItemElem)
7 i4 ^) X H# q8 `
{
/ o* \6 I& A h( ?5 I
vItem.dwKind2 = 0xffffffff;
+ ~3 j {) J% w4 O% L( J4 o
vItem.dwItemId = 0xffffffff;
) K$ n; R. g& u0 ]# b7 P
vItem.nIndex = i;
6 q7 ^8 E1 Y8 m9 y, O! o
}else {
5 Q% v+ w* @& ^% h6 t
ItemProp* pProp = pItemElem->GetProp();
* b! q. ]9 V3 a
vItem.dwKind2 = pProp->dwItemKind2;
% J# t# l3 j9 l1 y) q4 B) I5 x
vItem.dwItemId = pItemElem->m_dwItemId;
( }+ _. s0 o" V/ c% Y% ^1 L
vItem.nIndex = i;
: ?" g2 l% |+ h3 }* Y; l2 _
}
0 \- R7 @# Z U9 a
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
3 ?% A$ Q1 H/ J) z
}
* N, Q9 @5 G1 Y
//////////////////////////////////////////////////////////////////////////
) o; q- R3 n1 Z" O4 `8 ~" v" V, S
sort(vItem.begin(),vItem.end());//排序
' v2 d5 q) H- f7 f* F; B4 ]3 t$ C
//////////////////////////////////////////////////////////////////////////
e+ v/ h8 n: b5 L4 t# F
//交换
& \/ j) b' g. a9 V1 [1 @6 @/ ~
for (size_t i=0;i<vItem.size();i++)
3 h6 g+ y( R8 ?' ]! J- T ]5 ?
{
& Q- ]2 r) p7 b% S2 @
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
! K- j, z7 n, j
pInvSort->Add(vItem.nIndex);
4 E8 o% N" R2 w! {$ \
}
4 `7 u, W, f5 Y- L/ N
BYTE nDestPos = 0;
4 Y5 B$ C; ]* H/ J, U
for (int i=0;i<MAX_INVENTORY;i++)
. |% x! L2 V1 s- _ b0 B& Z* g E
{
: z2 W# F; k+ V: t( B* V
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
9 w& {0 b! F3 d+ U- C+ d/ J) i4 s
if (pItemElem)
! j! p+ P2 k' u& i
{
/ X) `( {! S2 A3 X4 n& g$ `8 B
if (IsUsingItem(pItemElem))
1 P$ t* L/ E# y/ r- b; q
{
, k: a. t" x, P- m) X
//这个位置无法放
! P# B4 v! R( n; Q5 c6 Y
nDestPos++;
# a. G0 Z0 J' o' M( l
}
6 \7 d1 S7 H3 d: b/ p/ T
}
" {3 }& v# y/ w, w
BYTE nSrc = pInvSort->GetItemSrc(i);
0 j, T6 _0 P# `+ ]! x# O
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
* w* O* T. V9 f( F+ g" F+ d
if (pItemElem)
8 `1 }% s3 L7 D
{
8 w) I% T( S& _5 U, G9 e
if (IsUsingItem(pItemElem))
* E& {9 W$ p' Q7 u; u" {0 F' R7 o: u
{
0 d, y4 a- j" l1 C* i! G/ R( d5 s" S+ o
//这个道具无法移动,跳过
( y+ l7 {, V4 d* u) I; C
continue;
: B3 d- `& Y& a; S
}
1 N s; t2 o9 e. G
}else{
6 |# J, e+ J7 {
//空位置 不用动
0 ~+ Z# ^5 ~" R A$ R( Q% k
continue;
! R- g9 ~: B: D+ M
}
, n6 O5 d9 O, @8 ]
//////////////////////////////////////////////////////////////////////////
& b# ^% K, T X8 `) ^8 L
//开始移动
& r8 i0 `2 A7 S
if (nSrc == nDestPos)
$ [& r9 w' ]: i
{
- R8 O2 z7 i. V2 ?$ l3 m" y
//原地不动
- F6 V, R# h i7 j- A/ [) J
nDestPos++;
) X, z0 a8 o9 c
continue;
0 D4 u8 r& A" v* `
}
6 [6 m! C# \8 X* ?* b# @' U
pInvSort->MoveItem(i,nDestPos);
% R$ T1 K1 i8 d1 s( r
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
) I& \8 q5 ]' S2 L, x
Sleep(5);
5 A; c+ g3 a9 s2 @$ K) Y+ R
//Error("移动 - %d->%d",nSrc,nDestPos);
+ y7 V* Y+ v* r* }& n7 j
nDestPos++;
$ \$ K+ B5 N+ v) p/ N# L) [
}
9 ? ]. ]6 m/ b9 C4 u& j
//取第一个元素的信息
: P" M# ]+ s& T. f9 X5 b
/*
, W9 _1 r+ l! v% W$ o
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
1 {+ f( Z( P6 h" R1 g
{
- @' @. ~) g) h7 G* b3 I( ~
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
- A7 [& r( y5 e% x( `# y
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
% e' c3 ~% B3 a9 q& h% {6 @$ u
}
* I4 l2 g! w2 E5 C
*/
9 h" ^0 e9 @7 }5 u+ s/ n
//////////////////////////////////////////////////////////////////////////
# d' a2 g4 V5 T" a
break;
) |7 g5 f* v; D% E
}
, l( @. X ~. y' D/ Z1 w! H
}
4 j) p/ L8 M8 d! S
}
$ H2 A, J$ ]: X+ f) ^* g5 H* e
m_wndMenu.SetVisible(FALSE);
2 Y! ~& L: e; s) } D8 N* H$ S
/ F/ _ V) Y7 s' \4 V1 m; E
--------------------------------------------------------------------------------------------------------
& w/ s X8 X: w9 W. q( U, K# T
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
/ d; J1 t0 }2 ]6 c! C
{
) J8 I9 c# p9 y+ p6 H0 h& T
BaseMouseCursor();
: W; }, S1 [4 x' i
}
$ T9 R* O; |( a& O3 Z
在其下添加:
+ V2 @4 O: s1 O) v8 y% f4 {: _4 Q
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
+ b; E! s, q, ~2 Z3 i4 r' O( A* a
{
' E' k. X) D* W8 V+ [1 ~% p
m_wndMenu.DeleteAllMenu();
5 I, w8 ^9 N4 M" b0 |, \% B0 l: j
m_wndMenu.CreateMenu(this);
# h( v( H$ L. r9 S t3 Q7 z4 v
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
) Z; D q ]# T
4 U8 o3 E# W2 |- F$ c& W. O
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
& k, S% |% L2 c. D
{
+ d" ~& @6 P6 c/ a
//P以上级别才可以删除所有道具
4 L+ S! w4 ?. u" K$ J- |
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
/ S; J# ]# A- e8 \" o
}
* r% e2 d3 g. O! H5 ]2 j3 t' |
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
+ J" w+ h% M4 {7 ?8 M- O
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
) i4 e, f& t% m1 |6 p2 i- {; ?
m_wndMenu.SetFocus();
; g2 e; x8 J) O
}
& N: I r3 `; t+ n" z, F/ t6 m+ [
------------------------------------------------------------------------------------------------------------
% N& \8 i! r" P; w5 s% @
*************************
1 c" ~" `7 \! O' b8 [8 s
WndField.h文件
, i" e/ o$ ?6 x
*************************
& N$ D" n/ g8 P4 z2 z! H
搜索:BOOL m_bReport;
q9 R& g' M9 e; K; L. u0 Y! _7 T
其后添加:
! L+ W3 K p* E6 V3 Y/ I
CWndMenu m_wndMenu;
u: U/ e2 u2 V% B9 b
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
, j- X2 k. w& i9 x" [. m# L$ W0 B" d
其后添加:
+ b4 h1 ~# W, J- X
virtual void OnRButtonUp(UINT nFlags, CPoint point);
! l* V! J. O, o4 n, s6 j6 F. U
6 T7 Q& A# I; t# B; d
4 J0 Q# {$ T5 h; @4 {$ ]
欢迎光临 飞飞世界论坛 (http://www.ffwold.com/)
Powered by Discuz! X3.2