飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
. {9 q9 w: {( L. |1 f
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
6 F6 Q6 J1 Q4 P% o" K* ~& |# }
( `1 p. ~" C8 Q4 K
struct sItem
7 o) a- x, Y0 L
{
2 w7 H T+ T ^7 ~. \3 }
DWORD dwId;
$ r: k( l( J4 p# [; y
DWORD dwKind2;
. X! l( m: }; B% X# O- w0 h
DWORD dwItemId;
% i. k% W' F5 [' d; N g z
BYTE nIndex;
2 B; a+ ~" f: v7 J$ q8 a( l
sItem(){
, D/ y$ y& q+ V5 j' c
dwId = dwKind2 = dwItemId = nIndex = 0;
8 D9 R0 y5 `# L0 k
}
@+ z. `7 }, b2 M2 y0 {' u
bool operator < (const sItem p2)
; ^( J- T! {! n2 o. Z* v3 S4 _
{
6 ~$ h$ e! T$ ^0 F
if (dwKind2 == p2.dwKind2)
' C! l$ _' x! o" }9 p% a
{
3 c: L7 p" r; k# L; }
return dwItemId < p2.dwItemId;
) S# E% Y( s, _1 Z, L. ?
}else{
- a1 K4 U8 X) e6 W9 p+ j
return dwKind2 < p2.dwKind2;
% a* b+ R6 Q) ], z! t) n1 |) B: S
}
( ?# c# `( P$ F/ f E
}
$ P \: R, G# w7 ], S2 U) p1 \
};
% z# W" W. A' y
class CInventorySort
0 {5 Z4 P: v9 X6 d, Y: r5 P: n" g3 L
{
1 ~- G2 E( J& x" l
public:
: h$ L" z' K, I
CInventorySort()
/ b+ X3 j D, a" ?$ Q3 i
{
8 J2 t* @4 y8 _+ ]
m_dwPos = 0;
' a+ e% ? D; y" \5 L- @0 Y7 O: M
}
/ h8 p8 n" T* o0 o" D3 U
~CInventorySort(){}
8 q) L8 ^) H t! m1 l
private:
7 M0 c, V A4 u6 {7 C. Q
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
) Z W m- y- |/ X
DWORD m_dwPos;
" i0 l& A$ a* g u
public:
* a) P1 a$ Z3 b
void Add(BYTE nIndex)
2 ]; R/ d5 G- U. g
{
6 s$ A% l1 a( }. Q/ v+ U: ?8 Q
if (m_dwPos >= MAX_INVENTORY)
9 R. N8 C1 a: }: Y; R: ?3 V7 [* K
{
8 d7 @7 @2 R B( f# {9 [
return;
. T4 M7 a5 E6 d3 N* Y* l
}
" N% ]5 ]& Q* I% C5 m- R: |
m_Item[m_dwPos].nIndex = nIndex;
7 p/ _9 h, F0 _" b. l
m_Item[m_dwPos].dwId = m_dwPos;
! l1 [# ] f% Z
m_dwPos++;
' I' o2 M& G. h$ r# H" d4 z& m# e
}
0 t: k; c+ w. W% t: p# \9 Y0 s
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
/ D9 w2 d4 B. h# s5 _- [
{
9 z: t; {0 F R* O, G- @& j. K1 R$ M
for (int i=0;i<MAX_INVENTORY;i++)
, w: ^3 H4 W. {% k9 d
{
7 b2 L1 }' b1 I* \3 {8 {3 n
if (m_Item.dwId == dwId)
! f7 A3 ?8 H; Y* p/ q
{
D! b2 y6 L3 K7 d# k
return m_Item.nIndex;
6 n! [9 |% b8 i3 a
}
q) O( [8 G. B! [: g6 W# D+ s
}
: y( [ H' c+ l% g9 Q% \
return 255;
, O2 a& a: H4 q! A; {. b
}
. g/ a- i5 E$ v# W! D7 V& m9 b
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
, J. ~# H" p- F A. l- c
{
% u* o. V! R- Z+ M4 v. m7 h
BYTE nTmp = 0;
# y8 [$ Q6 g: o, B4 q* E0 z
bool bDest = false,bSrc = false;
( @1 ~5 r6 B3 {2 S" k8 _
for (int i=0;i<MAX_INVENTORY;i++)
2 z3 e }# ]2 I* a& U7 V6 U
{
( _7 r/ g' V! S3 E8 i' X% u u4 y
if (dwSrcId == m_Item.dwId)
$ j# Y( X% l* \& Z
{
3 v5 z- d: B+ ^) ]5 `6 Z! M, ?: {
//id相等 则 改变对应的dest和src
) P( O9 W. e7 y" j W2 W5 s* Z4 ?
nTmp = m_Item.nIndex;
7 y" ] c+ A; j& f( j6 m/ Z3 Y& |
m_Item.nIndex = dest;
- }! S8 }: T3 w; m Q
}
! Q" L+ t3 P6 A3 ^
}
2 h+ n5 ^' b1 ]* [2 u
//临时数据保存完毕,交换开始
" r( y$ n, L/ k9 Z9 ~
for (int i=0;i<MAX_INVENTORY;i++)
1 f' l: w/ o- C
{
' X' ` t+ X( H6 f( t3 O$ [
if (dest == m_Item.nIndex)
% v+ t; \9 i _! T& J2 t1 @
{
1 M" j M. w: @% W& G5 j1 D3 k
//id相等 则 改变对应的dest和src
& z8 b& _3 w- b! N4 ~' r& r
m_Item.nIndex = nTmp;
8 t( J6 M9 B# b w- C, H5 c
}
' g8 t5 o8 X0 M) v, G
}
% M7 ^) ^4 X- \, G$ M
}
" T$ u8 ]) F7 s' [+ _+ i- m
};
; U- f9 X4 h7 l; h1 q; E
-------------------------------------------------------------------------
1 N+ z5 Y& ]# Y) G4 j8 m9 W! ^9 D
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
9 w+ C6 q- `2 B$ n0 e: B- c
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
, ]; p1 i% x- V
紧靠其上添加:
. \+ H# W) P: w6 J4 v# }% |! P
if( pWndBase == &m_wndMenu )
; W. v5 c2 \5 ~+ o
{
! z2 H: E; S9 @4 R) E1 H
switch( nID )
' ?, ]0 K! T: i7 \- C/ J
{
' P# v4 o. K3 ?2 Z/ p+ _+ I+ F) j
case 2:
3 \0 Q' U) j- X
{
0 D& l! r+ K- Q0 v5 c1 z
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
7 m8 D+ d. z" a$ y4 ^+ r
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
1 y& C9 j# m: h; M0 y) ?& v; H
{
) f2 B5 h* |! v9 R% t
break;
& B( M& d* a/ i; v
}
/ p& C; G% W: K0 |; t; s8 A# [
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
9 S6 K; u# m1 f. \( i" T9 L
{
- b1 i' S) }9 @$ m' j" O; V
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
" ^7 ]8 Z! I0 O
if( !pItemElem )
/ V _4 T# t* j* r' O
continue;
( l! _; E8 @" K1 q; l5 i( k
if(pItemElem->GetExtra() > 0)
3 y. o9 z. n4 P4 X, ?6 g7 {0 h
continue;
0 \, x) Q: \6 f i1 t2 q
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
6 f k/ f- {1 L. L! B4 o9 U
continue;
. Z' j: O2 |6 c U4 H* w
if( g_pPlayer->IsUsing( pItemElem ) )
' |8 E, ?( N S- h6 z
continue;
/ r0 _9 R% @. W6 d5 L. W
if( pItemElem->IsUndestructable() == TRUE )
! g) t4 ]3 |9 I$ O, J
{
( o( s, C4 d$ o9 T
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
& W3 C* P% o. o; o. c
continue;
' p3 }4 z/ \1 G( L2 S
}
6 d2 M+ X/ s3 z) D' h- c/ v
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
! N/ K. G2 t+ O
}
9 f5 ^8 Y6 I" o; M) j
break;
7 x0 [$ x7 o2 T: ?4 F# q
}
' g% D6 d5 M* O, z) s" m
case 1:
9 {) v7 k$ f% }$ X7 Y
{
; ~2 k, l: G. s
//整理背包
7 `3 T9 O% H' U! @4 N4 v5 {
//////////////////////////////////////////////////////////////////////////
+ d) `% v9 j4 V6 ]% n2 F
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
3 ?+ T5 B7 Z9 o f0 R
//////////////////////////////////////////////////////////////////////////
/ X5 J6 Q0 x3 B( A- ~
//////////////////////////////////////////////////////////////////////////
9 B Y+ @* Z- ?! S
CInventorySort* pInvSort = new CInventorySort;
& g4 d% q) q/ K% a/ p1 v
vector <sItem> vItem;
* m0 S9 D7 I7 p0 {# Y& R5 i0 g
vItem.resize(MAX_INVENTORY);//初始化大小
, |6 ^# a" L2 j6 s0 r3 K4 U% _
//////////////////////////////////////////////////////////////////////////
0 Q: U$ \7 C# q. V3 Z
//填充数据
4 j ^- k+ F1 m# [8 d9 ~4 `- g
for (int i=0;i<MAX_INVENTORY;i++)
8 Z9 B3 Z, n4 E
{
i5 C2 x' ` ^3 B# d
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
2 @ V# c2 O2 f- `
if (!pItemElem)
r% i7 w6 X% M0 _- a
{
! V& T, j# |7 y7 [
vItem.dwKind2 = 0xffffffff;
' r! R& }! A2 ~. C N/ O
vItem.dwItemId = 0xffffffff;
8 N r$ v; |. X9 ]0 B& B; v
vItem.nIndex = i;
- U Z' v" }# S
}else {
! D. i! l& r- D2 y, l, N; }
ItemProp* pProp = pItemElem->GetProp();
& q( M$ N$ I Q1 b7 a( d3 k
vItem.dwKind2 = pProp->dwItemKind2;
6 r& e8 D8 n, W( M
vItem.dwItemId = pItemElem->m_dwItemId;
2 Y, F6 I; I: c8 C" [
vItem.nIndex = i;
6 L+ U# [2 \; [0 g3 A9 ]( j
}
' M- u3 z( j. F* F/ d
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
3 y" T2 L7 p3 M" W$ m4 k Q
}
5 M& \" b& C; |0 B8 D2 U) i) S
//////////////////////////////////////////////////////////////////////////
: a# p4 L+ w* ]% _ Q K% O6 ~% G4 Z
sort(vItem.begin(),vItem.end());//排序
7 r( o! p- R6 o- }0 P9 `
//////////////////////////////////////////////////////////////////////////
$ k1 I H" t; E* Y
//交换
. t: l* n' S( q$ S& Z: r4 @2 @
for (size_t i=0;i<vItem.size();i++)
4 H) t$ L8 x' h% P
{
! K. x9 L, I7 i& o" Q
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
! z) v% l- c# g- j
pInvSort->Add(vItem.nIndex);
1 I9 r8 Z( m: }% K
}
P6 ^2 E+ u6 G2 R( k; Y
BYTE nDestPos = 0;
/ u3 ?2 z: k7 |; l0 F
for (int i=0;i<MAX_INVENTORY;i++)
1 l. P' f& g4 ^. K
{
5 |. H7 ~* {8 L$ ~7 \
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
, [1 G' N9 i& R' s) |& P
if (pItemElem)
9 U) D3 K- T$ I* j$ B3 C
{
2 K0 l& E9 i% ]% S' T
if (IsUsingItem(pItemElem))
6 y1 F b, [) h1 y( f5 T: H
{
% m& A3 b5 N2 \6 A+ ~) G
//这个位置无法放
, K" f+ ]8 \/ [" [ E
nDestPos++;
6 Q2 ?( C9 F& O* P: x, b* L
}
, C- e( z/ B1 [! Z0 R
}
1 J! n, o y8 } o7 b, b
BYTE nSrc = pInvSort->GetItemSrc(i);
6 q+ d9 N' D# C0 Y6 [% }& V
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
3 g; `3 ~; d3 w
if (pItemElem)
& f% Q: A' Z. X: J/ Z
{
, ^5 `2 S3 C I! ^
if (IsUsingItem(pItemElem))
6 |7 T+ H1 }' v0 d; [
{
& W( e+ G' J2 r; u) @4 I, y2 ?; z* G
//这个道具无法移动,跳过
+ Y1 \1 }0 S" i7 w! H
continue;
% q% a/ i& Z, r! s D
}
- _" U6 j/ B f# C- r `$ h
}else{
( M g8 m4 v) s* ^5 S8 v
//空位置 不用动
' X* Q+ K0 w! K) `. X( }# c
continue;
7 T& K& @ D+ Y) r. t5 y: u5 T5 o
}
- x6 f) ?5 o' k N
//////////////////////////////////////////////////////////////////////////
8 ]) \6 |4 l* V8 x( ]3 ~
//开始移动
3 l4 {& I, d7 C4 g% |2 W- u8 T
if (nSrc == nDestPos)
& j) V8 F% E; Z! ]4 Y) p7 z V* F. T, i
{
8 E: u0 E% y! W3 _
//原地不动
$ @- v; [. Q8 ] k3 l- W" }
nDestPos++;
" o! h. l4 v' G- n# _( z
continue;
- ^' L& N5 w' a; v4 _1 N7 L2 J
}
3 \/ R/ e6 q( h6 {) w+ @1 Q! D
pInvSort->MoveItem(i,nDestPos);
W% c" R# ~6 Y9 S3 l8 {
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
. @ k6 ^; p4 \9 t& I4 @$ R) y" v
Sleep(5);
7 \ p5 R$ R: F5 f+ A/ m
//Error("移动 - %d->%d",nSrc,nDestPos);
, D' {& b" K1 b" B/ U
nDestPos++;
' {: E: G; z6 ]2 A; w7 z; l
}
9 p& n$ @, X* a) e! V& j7 p; o, ?; D
//取第一个元素的信息
. d+ k$ ^% z/ t$ Y k" l
/*
+ x. h6 \' x; V( q% G
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
: E! t1 c$ C. x7 M' {5 p% O
{
( K9 O. v3 I: N
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
7 X/ T) m. x3 J0 C5 a* N
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
7 ~ R3 S* o1 r( u7 u7 ~
}
3 U. @: G% [( E8 r& y
*/
! K: A' f" E0 Q* m2 ?& U% C
//////////////////////////////////////////////////////////////////////////
. O* ?* L* G; c( G- ^6 m
break;
. T: f }$ C+ {- b
}
% p2 M8 v ?% r/ T, I3 O
}
1 K) E# Q1 W u" X+ x( {
}
, a- Y/ q' f: I! `8 g
m_wndMenu.SetVisible(FALSE);
. N1 _) T1 v6 L8 r6 g) u. _ ?9 w
+ b* i4 f5 a+ W; K- ?
--------------------------------------------------------------------------------------------------------
+ ~! S- P5 K/ H& B/ N
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
t& D' T) X g, U5 b( p, V& z
{
8 Y" P5 Q: x2 Q1 A$ q
BaseMouseCursor();
3 A0 X: p7 n& i/ m
}
9 o7 Y i/ B, G. i
在其下添加:
) N' @1 x! }' `( `+ n
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
, K" s0 g3 C5 [; X3 ^
{
1 M% F$ d' ~* Y! e0 @- j' S
m_wndMenu.DeleteAllMenu();
1 M2 X. y' o. h. s' x6 b5 r* o
m_wndMenu.CreateMenu(this);
% l) B% X6 M4 q9 n& b8 X5 e
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
% d0 N) l$ l3 _. ^
: g+ b8 e- x, c) X" r
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
* m2 b% j5 E% L$ ?
{
2 A4 {6 u5 |% c6 `& j0 k: w
//P以上级别才可以删除所有道具
& O" q8 P, O8 W: b0 K9 A: f% |
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
0 m# ]: W: q3 t5 d7 f1 n0 W6 X
}
" ~& Y* v+ E' O
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
7 W8 T+ R8 I. C9 l
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
# f" p+ |; c: e d7 g+ u
m_wndMenu.SetFocus();
4 q" t% h5 R( c+ p1 L! _
}
# x( u' l ?* `( u* ^9 k
------------------------------------------------------------------------------------------------------------
! x2 n, z& z$ f: _& V8 {
*************************
( Y9 J! P; q% J( s* m
WndField.h文件
# [' |# L) o8 r8 R, j1 C. ?
*************************
* Q! i8 W4 ~( h# M
搜索:BOOL m_bReport;
7 A: T7 I1 B! D" C" T7 j- z
其后添加:
1 ?, J! G7 K9 G) F
CWndMenu m_wndMenu;
: n5 s7 u, _4 f7 A1 y. W4 D! W5 R2 v
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
) e" k+ `0 f" m3 k& N) G3 k
其后添加:
. [+ p) n. ]* Z. l. D( B
virtual void OnRButtonUp(UINT nFlags, CPoint point);
! z0 T o5 U5 _+ l3 J
! L/ U0 k3 Z l+ ~3 F" F1 N
( h! I9 G( a* U8 q0 j
欢迎光临 飞飞世界论坛 (http://www.ffwold.com/)
Powered by Discuz! X3.2