飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
3 C: U. f `2 M% j1 v9 e+ s/ j8 _& ?! D
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
9 t. }5 B6 e0 x* \. E- N3 h( }2 V4 q C
2 {% k/ ]( G/ M! r$ F7 E1 q2 d; s# c
struct sItem
7 g6 S* ~) o Q4 s
{
( D) L6 ^2 j& Y& d% _4 R* r" U
DWORD dwId;
' N- B. F$ ?7 W; R( i+ }
DWORD dwKind2;
) y7 z) ]' q; h: U1 M
DWORD dwItemId;
: q$ u9 g5 f" a0 V
BYTE nIndex;
3 K8 h9 L6 y/ G. u+ P* k$ k
sItem(){
5 ?: i1 V g0 P
dwId = dwKind2 = dwItemId = nIndex = 0;
" Q- i0 v- ^- f; j
}
4 R4 |- y+ x, M& w% h
bool operator < (const sItem p2)
4 N& [: M- J; s* l% d9 g
{
0 M! n9 ?+ G# t5 ]
if (dwKind2 == p2.dwKind2)
# x4 `* R1 c' _' }6 i
{
# D2 j6 x, V ?$ i" p$ D
return dwItemId < p2.dwItemId;
" a. r) ^7 K3 \$ C! {5 V
}else{
7 J5 G) a. H v/ F
return dwKind2 < p2.dwKind2;
5 [9 o) H( ?$ i: Z* P( Q
}
. ?, ~9 t5 b3 n* U. D
}
, Q2 ?3 y, e' I2 t
};
/ ^; I4 e! e! W1 w& g
class CInventorySort
4 R) T" a; Q) m1 ?8 T6 Y3 {
{
+ v1 W) ^8 O, ~6 i! p1 `
public:
$ _1 i* V$ Q f J: g) j* A
CInventorySort()
+ O9 B0 `: J" ^6 z5 q, A
{
, G9 _0 \: E5 U, V ]7 N, q
m_dwPos = 0;
, l3 v$ m' d4 G% e) E' Q( K& Z
}
5 o. [' [& f2 ~4 J: p& T S
~CInventorySort(){}
( ~! F* r; m( N
private:
& ~$ P2 j K5 w5 V- ~* m5 \
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
, d* r/ G E: ?7 u8 g& t+ ]1 N C
DWORD m_dwPos;
. l- a' `( q- s: P& L
public:
$ d0 L* A6 h9 w9 q
void Add(BYTE nIndex)
" A5 t, f8 \2 E- \8 s
{
0 N$ N/ k3 A& e0 N6 i
if (m_dwPos >= MAX_INVENTORY)
p& X: l. ?% G! E. ^
{
& O9 D7 K* ?! t8 B( Q' H9 b
return;
$ V5 E, K+ I- H, k' X+ v3 [. |+ V: {% b
}
+ d: Y% ?! L7 h5 h
m_Item[m_dwPos].nIndex = nIndex;
" \, Q( r' q2 S n
m_Item[m_dwPos].dwId = m_dwPos;
. o9 y; \ t4 Q( X4 z
m_dwPos++;
: Z# D* W, O6 R6 g a; @# y$ p
}
" [$ B! F0 N$ H+ M
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
, \1 v; j& M/ W, V# ]- f
{
& z; q+ k* m- @4 T2 v
for (int i=0;i<MAX_INVENTORY;i++)
) i$ Z# Y# M/ c" @6 U0 p7 V
{
, A% Z& O& X$ g6 x8 Z5 o
if (m_Item.dwId == dwId)
7 R' g2 X ?* n. m; C6 T% L% {! o
{
j" d& {! u4 _2 {" g; m
return m_Item.nIndex;
: ]) D3 }5 X0 j' t; H: @" {
}
8 w$ y6 j9 n& M ~$ ^5 w$ J
}
: V8 q) e6 ~) t! a% S9 N- y9 u
return 255;
1 }3 j* [- q5 X) D' u% Y, R; ~
}
: j3 Z) I" p1 |$ A5 a7 P/ N- K; T
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
+ P: D$ K, D7 C; p
{
2 U8 a) L) }. X" o2 i6 h6 Y
BYTE nTmp = 0;
" o9 h" {. a" _: q5 S
bool bDest = false,bSrc = false;
. L! G" @7 y" G' D
for (int i=0;i<MAX_INVENTORY;i++)
/ D0 w( x* S7 w9 D! J; V. ^
{
% I& u& k6 \ _- _
if (dwSrcId == m_Item.dwId)
' e% s g( R) r: q' f) A' E
{
+ M0 G; `: }' G5 Q4 o
//id相等 则 改变对应的dest和src
! a0 P, F6 H2 g# J( J
nTmp = m_Item.nIndex;
9 y2 K8 ~; r4 n; c
m_Item.nIndex = dest;
! y3 g7 n2 D4 c' ]! j/ m2 v; d
}
( T* e# W- C3 f3 h3 S
}
& Y. g: Z2 D5 O: a; }( Y! \
//临时数据保存完毕,交换开始
$ W+ `: p6 w9 s' t# U# X! B D f
for (int i=0;i<MAX_INVENTORY;i++)
) h3 N, L6 O7 K- d" Z
{
3 K4 P6 \% l; G, Z9 Z0 z
if (dest == m_Item.nIndex)
; U7 G( h+ F. ]
{
0 q6 J6 @& B( B8 k" K4 I
//id相等 则 改变对应的dest和src
; a4 l5 w+ h4 u5 x
m_Item.nIndex = nTmp;
x ?* v! m3 {% d+ B9 |: j' Y
}
9 N" U; g& x$ m- w* J8 x U7 X' s
}
( W' R- @, Y$ e6 Z4 c- U
}
& i& t2 h3 `* t( o! W
};
S3 B. [; F: a
-------------------------------------------------------------------------
P( s% e4 K6 P7 |
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
+ O+ V; {9 X* v6 j; R
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
$ Y6 Z4 r `, e; n0 X7 r
紧靠其上添加:
% n5 a( Z. E, g
if( pWndBase == &m_wndMenu )
+ M; {2 N6 a) x$ E) z/ u% a# u
{
4 P4 Q9 l4 u5 N
switch( nID )
; N; r; s6 m8 N- h* [
{
6 n* P6 b& v# v0 d8 a4 U! r& h5 x
case 2:
4 S7 I e, Q* L
{
3 f1 C$ L [+ k
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
7 e+ P% Q( f* G4 U9 y4 ^7 P
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
5 K0 Z/ C$ i& b
{
+ J/ d% V) Q( D8 r( k# ^6 o
break;
/ K7 m9 W- i4 b# t3 S
}
0 X7 b: q7 H2 e: u4 s4 R
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
7 u ~! J2 e# a9 j3 _) Q- n
{
- ?; u' ]" F0 y
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
* ]2 A& x2 `5 a7 Q% E. T
if( !pItemElem )
' @' d8 n5 A+ r) k
continue;
. |/ Z0 S5 B y6 o1 {2 u
if(pItemElem->GetExtra() > 0)
V% F- m) a: H, X# o
continue;
* h @" y7 A- J) P7 K) f0 h" a, r. ]: O
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
! L( X" G, Q! h2 @
continue;
% w/ D; j; c0 Q5 D _; Q2 B
if( g_pPlayer->IsUsing( pItemElem ) )
! N2 [7 M! ]/ N9 R* k
continue;
0 c7 H/ E6 ] k6 X7 {$ T
if( pItemElem->IsUndestructable() == TRUE )
5 Z+ O/ D% {/ q+ t" m
{
2 s! `( Q: P6 o# ^% [
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
) k, U9 L% f, d. x
continue;
T% U5 @- m4 @4 Z) k
}
4 Q N9 |" ^, {+ c
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
( B( I0 X3 V7 x% x8 B6 N4 R) O! s
}
4 n6 l1 L V9 H+ [# o* p, G; U
break;
# [. R* h: }% I' z
}
& L+ \' _( p' T* M5 q+ t; Z2 Y- O
case 1:
+ i! j! U; S1 Q' t/ e
{
: C5 R3 Z$ {& n: a# r" C
//整理背包
+ c: w. n% W/ \, d8 T1 b7 w
//////////////////////////////////////////////////////////////////////////
+ l3 h, } G5 U4 A% ]# B* {8 O
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
" _* ?0 x5 l: C- }: b
//////////////////////////////////////////////////////////////////////////
2 ^4 ?& |# W7 p- b3 D0 t) p# W, |
//////////////////////////////////////////////////////////////////////////
) d+ [6 `0 F/ x/ @5 V
CInventorySort* pInvSort = new CInventorySort;
9 k* P/ W2 {: H( [7 R$ r
vector <sItem> vItem;
6 ^$ P+ \$ w& y0 a4 H
vItem.resize(MAX_INVENTORY);//初始化大小
) g" C4 _: H @" a7 W% a! M, D
//////////////////////////////////////////////////////////////////////////
2 l' w& Y+ t4 h& Y1 S( D9 D
//填充数据
! p* x% I( f8 L" ^
for (int i=0;i<MAX_INVENTORY;i++)
" x6 a. c2 i' ^+ K
{
7 D5 A! E' Q1 S. L; @; x
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
5 n) e3 n9 F4 ?
if (!pItemElem)
+ u9 C# i8 X/ p6 r$ B/ E" F- y
{
& B) ~/ C; n* x1 L
vItem.dwKind2 = 0xffffffff;
+ ]% o( A6 ]8 ]. I/ D2 x0 j0 A
vItem.dwItemId = 0xffffffff;
; W' R. w3 p% K- R, I8 e
vItem.nIndex = i;
( a5 O. t' R$ g
}else {
0 z$ `% x4 _% \3 _' i/ d
ItemProp* pProp = pItemElem->GetProp();
% G Q# O3 X ?, x
vItem.dwKind2 = pProp->dwItemKind2;
5 d1 P6 L3 ?+ a, e
vItem.dwItemId = pItemElem->m_dwItemId;
1 g- I2 ~( A- f, O
vItem.nIndex = i;
7 S) T% F3 Z* u( `# ]
}
6 D& e( a- u) P+ C$ O& V
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
9 L& m& U9 l, O8 D
}
: G! G. B" e2 i, W0 f( D$ F6 z$ r
//////////////////////////////////////////////////////////////////////////
8 u/ I$ N, ^; N+ a& c
sort(vItem.begin(),vItem.end());//排序
5 Y. M5 M2 j) g% x% n; l0 b
//////////////////////////////////////////////////////////////////////////
- c; |. {2 T+ d8 T! A
//交换
+ m5 N+ p8 I+ s
for (size_t i=0;i<vItem.size();i++)
. f+ P+ B) {; ?3 K( B
{
6 U# @7 H! F8 B' D, S8 p& b* s
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
5 _! n% I6 ^0 y
pInvSort->Add(vItem.nIndex);
0 l4 N0 T) a$ X% \1 N" i
}
7 i# A q) k3 F3 A4 k/ }; r
BYTE nDestPos = 0;
! V1 b5 P# r$ ?/ {7 q9 f
for (int i=0;i<MAX_INVENTORY;i++)
9 E3 w9 Q4 H( W/ N
{
. }/ @( ]0 U# ]+ T0 X
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
2 Y( ?2 W) d1 n" n- k! \
if (pItemElem)
- f) i( w5 Q. f y
{
7 y( n: H4 _% Z d t
if (IsUsingItem(pItemElem))
0 ^) B) s& {) e: z/ [9 [6 L
{
2 |5 @5 l! U- y" S$ {$ d# D; I3 V
//这个位置无法放
S4 Y$ ?+ i# H$ J
nDestPos++;
$ u+ E5 N9 ^& U# i
}
) k0 y* F; B" O( k
}
1 A, d1 T* Y( ?4 X0 m
BYTE nSrc = pInvSort->GetItemSrc(i);
# \+ _8 l" }- U9 m- r' m
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
' r" {, L3 Z; R' {& M! |
if (pItemElem)
' q) o7 _" L3 S' x
{
4 b, E# G* ]& W1 M3 |
if (IsUsingItem(pItemElem))
' d" o5 a8 ~$ z/ `7 P. H- |
{
' Z9 e4 A0 F8 l( i% c2 }
//这个道具无法移动,跳过
% r( \1 |: _4 d( k3 ^! X
continue;
% S* t* y* m0 m. Z
}
$ o3 d; Q( z) `3 E/ l5 D& {/ z. C& X
}else{
" a8 \3 o( w* ^! }9 s' a8 j. _
//空位置 不用动
$ F; x! J( C$ M, n8 [% D6 N
continue;
) ^9 W+ O! ?" I* @6 P5 R1 w
}
f- O7 r: p ?! z; t
//////////////////////////////////////////////////////////////////////////
: ]% [; s# i: P
//开始移动
! R- F% W/ m! ~' k
if (nSrc == nDestPos)
9 d$ O3 s/ E! e5 [- Z9 ^
{
5 G5 H; Y8 H: X# `- N! M, @6 z3 M
//原地不动
. d2 E8 `* F5 @9 i4 H8 P# r4 u
nDestPos++;
. q* T$ F0 Q' e; j" I5 b/ {4 |
continue;
' `6 k. ] G; B7 Q. O! E8 G. M
}
: \. Z2 m6 s; X" \+ x5 V
pInvSort->MoveItem(i,nDestPos);
f: T8 {, H5 H' x. y6 ^' f: ]# w: D
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
h# r& @' m, g! |
Sleep(5);
2 w9 ?3 T- R% M
//Error("移动 - %d->%d",nSrc,nDestPos);
' d u& w& }3 [
nDestPos++;
6 U) M6 H: b8 l( I
}
# q. T$ m- E" F. z
//取第一个元素的信息
# ~7 _7 A! Q% f( B& @7 @
/*
! S3 q7 s' ^! J" q
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
6 m" @' ^+ X/ U( ^
{
+ o- I" F& c; x; T( Z, e' I
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
9 u c" p9 _* G( b& ^8 @
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
4 }1 d/ N: ?: _" M5 A% Q' f
}
% C) R% P6 h; Z8 f. B
*/
7 y0 G! q2 Q. U, q5 a+ r$ j# E
//////////////////////////////////////////////////////////////////////////
1 e( E6 s( y7 s
break;
$ F1 \* w2 y a) D- a* q' c; L
}
' {' |+ V' g4 M4 n3 I+ S# g
}
; T+ e2 ]1 p k4 j' R
}
0 p# x* U4 H a$ p1 `& Q" A# _9 Q
m_wndMenu.SetVisible(FALSE);
" A3 Y1 G5 H5 r* o& @+ ~( s
+ t `$ R2 a2 o/ M2 k' }9 ^
--------------------------------------------------------------------------------------------------------
@ C7 H9 Z8 o$ z: g0 O! ^
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
6 U$ s6 f+ J" ]8 {; q8 F
{
8 r/ G$ n9 N' O- d4 }
BaseMouseCursor();
p, B1 J d. X
}
( p" a3 K1 }9 l+ X' l
在其下添加:
3 @0 O1 W* D' ]+ r
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
; y( I" K" d& `0 s
{
$ X! `: p; K- r9 V, ^/ R& }
m_wndMenu.DeleteAllMenu();
7 y- q' J* X% v8 z: C2 d
m_wndMenu.CreateMenu(this);
: u0 N8 t- s! w/ ?/ Q! Z& {, p
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
7 Z# ]# ~ @! |8 I6 U! f1 Q) ]
+ S4 Y# I3 J0 R: G4 X8 h. Z
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
) v% |+ Y8 v# T- [, ~4 e) R: M5 q
{
/ I7 r6 n2 x" O$ H+ q
//P以上级别才可以删除所有道具
" q: D/ A1 v9 t- P7 \1 f! @
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
, [; o' G' }( q2 Z2 d; x' h
}
4 [/ } Z7 m! a( w! ^4 W
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
9 V8 e3 B! B; P/ v0 ^/ A% G0 D
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
: r0 [/ x, Q9 a( z, \
m_wndMenu.SetFocus();
( J, Y$ _' `1 z/ q9 ]8 @& S
}
3 |7 p, q% y! u0 H% o1 E+ E* \
------------------------------------------------------------------------------------------------------------
: \; Q" A; {1 s- X! U$ }
*************************
+ F# `" k5 z+ z" r/ L2 u
WndField.h文件
/ }2 \2 W# {( F! J, O
*************************
. P1 R2 R, `3 s0 M
搜索:BOOL m_bReport;
; B5 |& t0 _! l5 l8 ^
其后添加:
8 `* Y& T# C% k% I
CWndMenu m_wndMenu;
9 a9 N) f) f! ?' N
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
# I) R, B% U: U) Y F; j
其后添加:
( w l$ K! V) Z3 ]; l& Y6 T
virtual void OnRButtonUp(UINT nFlags, CPoint point);
4 t2 Q0 b' M- P! x: k
! z0 U8 @, l- w2 l
: b9 c Y$ ^- n3 q
欢迎光临 飞飞世界论坛 (http://ffwold.com/)
Powered by Discuz! X3.2