飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
- t$ u1 D0 B3 l6 ?# q) m; m
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
- t4 B9 j: t; b; j* u
- z+ C, L M' k
struct sItem
+ D& ]0 {. U* B" f( R$ k6 a
{
* y$ H! b6 i7 y
DWORD dwId;
6 h" T- [: b( E4 c3 R: J5 K
DWORD dwKind2;
5 c8 E0 j D+ H. T" A( V
DWORD dwItemId;
7 \. v6 q% e) \" L# u3 @
BYTE nIndex;
; u9 j- i/ w0 F0 P, Y
sItem(){
1 r P5 R' Q$ P" S/ _; E
dwId = dwKind2 = dwItemId = nIndex = 0;
& i2 Y, u( i3 _
}
" J* V: d! J% g$ o: I; h6 [3 b
bool operator < (const sItem p2)
- n! o0 d8 |+ S8 d. ?; L
{
2 f# }% E% K2 q' o% G5 r
if (dwKind2 == p2.dwKind2)
0 Z; U' q9 b, \* O, b
{
* G7 p4 o$ N) E0 O
return dwItemId < p2.dwItemId;
0 Y% ^6 M. Q7 p9 Y0 I6 |" M/ d
}else{
1 P% u: E" j! r1 @" o
return dwKind2 < p2.dwKind2;
8 X3 W# q- B, ]! |! Q* {+ @6 p
}
9 D/ H5 [, F5 x- F
}
9 J% E& j: [' e2 M9 @: @+ Y
};
X+ f, T& H' E* ]' Q
class CInventorySort
: b8 Z, ]8 Y) I$ d' a0 h
{
/ g5 t6 C# {2 @4 I& B( R
public:
& I. `8 I9 x1 d8 }
CInventorySort()
( h8 [- K$ f6 q5 o+ [2 f
{
8 k3 P3 G. i% K* ~. x
m_dwPos = 0;
3 H$ k2 y- u0 R) u2 x3 e9 {
}
9 J! g0 ?, V7 @. j, g3 i0 V
~CInventorySort(){}
+ [1 d3 ?. y$ k" K- u) E
private:
& w) g$ U' ?: n6 |# s: K
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
% j2 ~: P4 ?/ A; K' @0 S
DWORD m_dwPos;
+ b) F0 B. J) }7 _7 q
public:
% m# }* l" x. ] i0 q
void Add(BYTE nIndex)
}5 s! W) j% S! S
{
# X9 T5 h* r- v: F
if (m_dwPos >= MAX_INVENTORY)
8 R- R& T$ V/ E/ Y+ ~
{
, ?; _9 S& L. _7 r* @; S0 L
return;
5 V0 p I, y0 C; s9 }) F
}
2 q6 m, w9 J( z9 Q
m_Item[m_dwPos].nIndex = nIndex;
3 [1 c" X: a" O- H* d
m_Item[m_dwPos].dwId = m_dwPos;
3 U, \3 c1 O/ g: N
m_dwPos++;
; g' V; {+ Y6 b+ q) Y
}
, F/ K q" S4 Y+ [5 U- W" c+ u
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
1 G; K. ~7 K5 }/ f. z; E* u
{
5 z7 k3 @5 C6 h1 U- n4 v9 }
for (int i=0;i<MAX_INVENTORY;i++)
+ ^1 r4 N; k: ?1 C2 w
{
3 b @9 x3 `2 U8 y+ O
if (m_Item.dwId == dwId)
7 a' @/ y# g, p0 E( ?9 q8 `
{
& ^3 D t( z' _) Y. u8 c
return m_Item.nIndex;
( R( |+ X4 q" o: x9 X. ~
}
3 @+ v1 L2 n% q0 ]8 u z8 d' s
}
6 ~- J9 _) M) `+ r+ \
return 255;
; b0 N% v* R9 i- l! }
}
+ U8 m1 }/ B+ L+ i) P$ ^ [
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
% k7 Z0 N+ ^1 ^; ~. \( x) L
{
- c1 U1 \2 i! n! L5 D5 K
BYTE nTmp = 0;
' k) U4 L$ t- f* u( Q ~2 f
bool bDest = false,bSrc = false;
1 Z* L+ u8 ~% ^5 n" x# q
for (int i=0;i<MAX_INVENTORY;i++)
$ f" X8 q& e; ]+ _7 G
{
+ M" u/ T; {# ^5 r% ^
if (dwSrcId == m_Item.dwId)
: S* W$ ]" f, U* |& f! a6 C6 d
{
$ f. S. ?, x' e: b& ^
//id相等 则 改变对应的dest和src
$ U( C2 `, m% W& W+ w9 |) i0 \; _6 L
nTmp = m_Item.nIndex;
- T( Q: E6 }: G4 N) L
m_Item.nIndex = dest;
: F- n w3 F/ e3 T1 M0 K
}
, y7 \1 w% I) H2 }- f% K
}
; }) }* U% i; L: o2 C& I- @
//临时数据保存完毕,交换开始
1 j9 w6 N; l8 K
for (int i=0;i<MAX_INVENTORY;i++)
0 U# k G! v4 ^1 W, I
{
) W ~# P# h1 O
if (dest == m_Item.nIndex)
, a! d5 D7 @4 n- ^% q
{
$ W8 ?/ {! o4 `0 p( a+ i7 `
//id相等 则 改变对应的dest和src
" _$ m4 y% Q7 f% I! v; v
m_Item.nIndex = nTmp;
) @) B. q( U: q
}
. b. _. g1 h4 k5 \9 l6 X
}
( e" g# [5 C0 s& A. u
}
' y F) W4 F r* T
};
# z2 N6 `! H Z+ L. _8 ^" `
-------------------------------------------------------------------------
' E. U- r2 z6 T2 k/ r
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
+ C; j3 [" ^2 W( |
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
! F7 e `' s8 z8 n
紧靠其上添加:
, Q3 Q( ]& I6 r1 n- o
if( pWndBase == &m_wndMenu )
! J2 R# ^( y. H! m$ O
{
5 Z1 Q P- o8 Z9 a7 p" N7 _$ ]: T
switch( nID )
+ q* e8 N+ [9 M5 W
{
2 ~% d5 v" d- [
case 2:
# E$ v6 M' ]- M' e9 Q, s: K
{
" Q" Q; S+ l0 j2 u# z9 ^; [+ A
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
, i5 Y" j; ~$ a+ U
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
3 r4 m8 O9 ?% `: a
{
8 F4 m m) F T/ m; z' r
break;
2 Q) I0 b, q$ D8 B1 g; l
}
" k# r3 X5 V: y, P' p' d2 |% u. e
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
) g( K2 i: t3 _1 ?
{
; ?2 K/ y7 U0 H
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
2 f: T" W9 @+ ]4 e; ~
if( !pItemElem )
, D8 ?( B: X6 r
continue;
$ B5 r& b8 Z6 _( M5 w6 Q
if(pItemElem->GetExtra() > 0)
% e& @5 r& b; R6 O- s
continue;
! W' B p8 C* U% [0 v4 \* E& M' m, o
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
3 f( V+ X3 C/ q
continue;
/ X2 v& o9 L" H& ^
if( g_pPlayer->IsUsing( pItemElem ) )
- J' r$ V: F* t& u* h$ ~
continue;
: [( |3 h7 P) a* J
if( pItemElem->IsUndestructable() == TRUE )
0 S. l3 E% z6 b9 R/ C
{
8 W: e6 R) r5 ^1 j2 p# u
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
z# }, ~; \% n5 w1 a
continue;
1 j" S! ?6 b/ C- g+ z! A
}
6 ~6 b" q1 g+ J- z! g$ g3 y
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
6 c `$ i- F5 _) R
}
h: F& B5 {4 L. ^& |: h
break;
( r8 e' }0 z; U' e$ Z) Y
}
6 `1 m# J% W8 L' p4 p' v9 E" n
case 1:
6 B% ]( S( q* }$ V$ k
{
* [0 N! w! z0 n) l; h; [
//整理背包
; `4 Q3 u3 G" ~% C2 V" M
//////////////////////////////////////////////////////////////////////////
5 ?1 N# f, R( k6 v/ _' E
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
) w( c$ I @+ a' f: V8 X* h6 W
//////////////////////////////////////////////////////////////////////////
, Z- }, q3 ^& E% |) P* o" [
//////////////////////////////////////////////////////////////////////////
0 ^6 D8 H2 Y* F2 [0 q/ v6 y
CInventorySort* pInvSort = new CInventorySort;
8 f( z+ }" Q( j, L
vector <sItem> vItem;
: |! K7 _" x* o1 k6 t
vItem.resize(MAX_INVENTORY);//初始化大小
. L4 \: O3 s; R$ ]. z
//////////////////////////////////////////////////////////////////////////
" s4 _+ S% y! O& }4 N4 V* @
//填充数据
3 k; Z% R3 W% {3 I* V0 X; X/ r
for (int i=0;i<MAX_INVENTORY;i++)
1 z0 B) i6 r: i9 K$ H: O
{
$ O# p; ^3 O9 \1 Y. K1 c
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
& ^' x( N z! A5 u9 [$ X
if (!pItemElem)
9 s& ?) @ a" K) K- i5 u' E
{
2 D& z, i7 b- U' K5 J
vItem.dwKind2 = 0xffffffff;
8 S0 L' ^9 e3 A& F: ^% [" w! l/ f* B9 V
vItem.dwItemId = 0xffffffff;
& M$ q5 s/ E7 D# d, l5 {
vItem.nIndex = i;
1 Q3 H9 Y6 `+ F7 H1 X; @
}else {
' c. m! P$ Y2 G [5 c
ItemProp* pProp = pItemElem->GetProp();
1 C. {4 K, W- e+ ~1 u S9 z
vItem.dwKind2 = pProp->dwItemKind2;
! A& c% e/ U5 a5 c; r& _
vItem.dwItemId = pItemElem->m_dwItemId;
. a& |* q2 t& N8 h2 _1 t7 w. I1 L
vItem.nIndex = i;
$ h* u/ U& [! Z* M. ?
}
8 C& H. ]1 m; X/ t
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
- r% i# {+ U" A; t' ]6 z0 U* r
}
l% n/ Z) K! B! W0 {
//////////////////////////////////////////////////////////////////////////
( |8 X* j. |. S( s
sort(vItem.begin(),vItem.end());//排序
! t a3 w; n( b( X- X, R8 l1 v5 p% s
//////////////////////////////////////////////////////////////////////////
( `0 @; `3 Z5 s2 \, z
//交换
" l/ _0 [' P7 J( u: y+ T7 k* x
for (size_t i=0;i<vItem.size();i++)
1 U/ ~, S, R- B8 u' a7 Z$ D( o# W
{
/ T6 O' r( a+ ]5 W, s- P9 R) g- M
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
# y' k; {( [! x: ^9 O* R' Z
pInvSort->Add(vItem.nIndex);
, b5 n" Q3 H% E! f
}
, g- N+ m1 m4 c6 S" }$ I2 y
BYTE nDestPos = 0;
: k9 O/ O: {: x0 r
for (int i=0;i<MAX_INVENTORY;i++)
# s- ^- [" l* }9 b$ x7 d- f! R( ^
{
2 O6 \- X) }+ ~, l' j t
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
" Y) m% ]& ^3 i; [* \0 o
if (pItemElem)
% W/ ?: d3 r; v' h
{
7 z3 Q& e$ p& A& R
if (IsUsingItem(pItemElem))
3 U: U) w2 L& i4 f7 I# V9 d6 u
{
: Z, h! Z+ Y2 _0 {. _
//这个位置无法放
! |0 a: T" a9 c
nDestPos++;
Y, E, t6 [- M" r# y6 _- o q$ \
}
/ l7 q8 l8 S+ b" q# {( D9 E% k
}
( m1 y: J! x+ b1 W
BYTE nSrc = pInvSort->GetItemSrc(i);
) T0 `# s# z% n* k1 x
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
$ F: t5 z% [' X: h% Z& r7 d- C; G b
if (pItemElem)
6 X1 C( J5 ^) K' [
{
+ r* \" V6 R; n9 q; D
if (IsUsingItem(pItemElem))
$ q. P9 ]# R" \6 N) N# q
{
; e( n0 j! c o
//这个道具无法移动,跳过
3 D- U3 d3 u' v1 [
continue;
1 }, Q& y Z$ [8 i* q
}
3 k9 }) E4 h5 v V9 I, w3 i) e% e
}else{
: _$ R' e5 O( {
//空位置 不用动
; i9 q+ K) e1 H
continue;
$ l4 x' {, Z2 K7 ?0 G, [2 L: W8 Y. L) x
}
$ p8 M9 v: z5 \
//////////////////////////////////////////////////////////////////////////
- K7 o. M; h, L T7 G
//开始移动
4 H/ B3 T2 h1 O% x6 i3 Z( s/ _& x2 C% V
if (nSrc == nDestPos)
7 I7 z9 y* }( X* H) H$ R- ?
{
5 D b# ]/ t# z+ O
//原地不动
* U1 x- _* d+ f: N: k
nDestPos++;
# ~" A% x, D0 z& W1 P0 l# n6 G1 Q
continue;
4 Z+ h1 C3 N9 _; z! {9 g& o
}
6 M- r2 ?" T9 `( i
pInvSort->MoveItem(i,nDestPos);
, D% P. K$ |7 o: \9 w6 m
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
" L8 H( y' W# I" C* ]2 S
Sleep(5);
6 C: K. S4 b: ?: @0 ?7 P4 N+ q
//Error("移动 - %d->%d",nSrc,nDestPos);
# W2 X9 {2 _& t; p) p1 k+ t) h
nDestPos++;
6 S5 G, c- E/ E/ E
}
( D# G* F% @ A" {+ G3 L" H
//取第一个元素的信息
) S" E2 c+ H, G2 K: j3 D
/*
# E+ ~! a4 W5 i
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
/ H' v% }* z) Y5 b
{
. r5 T% u" l# D8 X3 e5 e6 a1 j o5 N9 y
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
6 S* U2 q, B% z6 H3 H( w! ]
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
- R+ w; t4 j; m! l
}
2 y% u/ E8 Z5 G, M% T P, t8 D
*/
1 n4 |7 e0 r0 D8 k
//////////////////////////////////////////////////////////////////////////
3 ?; F' J6 C% e' X h
break;
+ q8 d! o$ r# B- Q$ P" k2 t
}
4 r3 p" i' T, k3 {. v; s
}
5 |6 d+ T) `% V+ f8 H
}
. W& ~' y, H% _% v( [) n f
m_wndMenu.SetVisible(FALSE);
2 o! Y/ C+ A6 l7 A( e
* `" \9 w8 h7 G! g$ {2 D
--------------------------------------------------------------------------------------------------------
6 S+ Q! v, W6 @/ K% d) j0 l Z
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
" U" }. _! L* A2 h6 X" Z
{
; t+ q }. O, H2 E2 o4 q
BaseMouseCursor();
" f: l8 f. ?! g
}
6 j3 h* y0 X9 Y, h7 R% i# [, i
在其下添加:
' b5 Y5 `; h- W6 G& W3 I
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
4 E7 D( h+ W1 ?7 l4 h C
{
0 `+ |( r* w5 L$ E! i9 Y
m_wndMenu.DeleteAllMenu();
: R# W0 @% ?, z5 {5 W
m_wndMenu.CreateMenu(this);
& t4 V4 d! F3 \4 F9 ^; F# m
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
. @$ Z- T$ j6 a6 B P
* z6 D- ?, \9 ^! e
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
+ T) B9 l+ N+ v. ?9 |, ^
{
: X( h/ u3 Y: e1 l% L+ K
//P以上级别才可以删除所有道具
# b1 Z1 e) i/ W- R& f
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
+ a( r9 i% z1 C( L- H6 S
}
( m0 i. g/ j1 M& y) ]" E2 U
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
& F8 X( ]# Q2 K) Q8 [! g, t
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
) S5 ]# X# Y1 r( ~3 i6 h5 f3 b6 T# y
m_wndMenu.SetFocus();
! |5 k# D5 h: R; r
}
+ t& R; _* ^) N$ _9 R
------------------------------------------------------------------------------------------------------------
. y* o3 f3 O' X# R% F# x9 P
*************************
a* U+ P) G3 r* ]. Y
WndField.h文件
2 k4 ~9 G+ o5 w* y; a3 Y
*************************
" z4 _8 }1 G: K/ P, r
搜索:BOOL m_bReport;
) [) I* o5 O( \6 t
其后添加:
2 r" Q$ r3 ^6 F* x* ?1 u
CWndMenu m_wndMenu;
/ k3 U& k! w% L4 {7 I& U
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
9 c+ q. B% R8 j2 r" r4 O
其后添加:
$ @) g) B3 q) D' T
virtual void OnRButtonUp(UINT nFlags, CPoint point);
% a+ T" H2 }: ^. ]& `5 X
+ E; ^& i, H# k' ]
- P: c# _1 r8 [9 c+ G
欢迎光临 飞飞世界论坛 (http://www.ffwold.com/)
Powered by Discuz! X3.2