飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
. J/ T4 p6 }; H' j/ \3 M9 T
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
9 ]7 X" [4 c( b5 L& `
( t1 p: f. [5 t4 N- Y
struct sItem
/ m3 F; T( {# [2 h
{
0 M6 V/ U: C3 h+ o$ e' h& q+ m6 y. H
DWORD dwId;
4 _* L/ ]3 R/ b. X- Y
DWORD dwKind2;
* E5 n4 f( z3 G7 V% Q
DWORD dwItemId;
# p$ \/ x. s" j/ T: o: J
BYTE nIndex;
" `) b/ S% l; U" I: a$ s6 Z
sItem(){
. [3 P' o% j _
dwId = dwKind2 = dwItemId = nIndex = 0;
& d2 p7 ~' K5 l7 _
}
% t0 ?7 U4 Z" f" b
bool operator < (const sItem p2)
# m- t0 E1 t# N/ E
{
7 r5 c# P2 H f: I X; V4 @$ N
if (dwKind2 == p2.dwKind2)
% h" @; c9 q& G. d' S+ y1 l
{
' k8 |6 `9 A9 z& B" l0 a
return dwItemId < p2.dwItemId;
; n- ?% Q! t5 x- b- h) i
}else{
3 b" ~, G0 `7 [
return dwKind2 < p2.dwKind2;
0 z. `( f* G* r
}
: ]" A l% ` h0 {# u: H0 w9 _8 s
}
& C5 [) G7 d A8 n* l
};
* P, W% T- w5 `
class CInventorySort
$ V' L: g! ]( Q% E+ Q
{
, C6 Z8 e/ |) m- p, i+ H
public:
}* L5 j8 m1 k+ e* g% j! s7 U, q. H
CInventorySort()
5 [) r# m6 p [& d; v
{
% m9 X# J" T/ `/ @1 q& U2 F
m_dwPos = 0;
% q. @+ p, s" M b" n- r
}
& }) }; R, S1 Y* |
~CInventorySort(){}
& e* G& K# |2 G) f, o
private:
* q4 H, e, T/ F4 {
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
: a* |/ P" `6 ]
DWORD m_dwPos;
. R6 P) d: V/ u( H3 N) b! N% G
public:
5 |* [, x: }8 U( L8 {
void Add(BYTE nIndex)
0 p: ?6 p2 K2 k2 `/ g
{
) B/ z, p& {7 L1 l2 t4 U+ z
if (m_dwPos >= MAX_INVENTORY)
- Z3 g# q. q' T5 r1 I& u" K O3 L
{
9 E. Y8 ^" ]4 l6 B' Z% J
return;
) V; e& B3 T. ?& y" \
}
' S p- m2 H0 D- g; I- h- K
m_Item[m_dwPos].nIndex = nIndex;
3 }9 V" H6 d- l0 D! M B
m_Item[m_dwPos].dwId = m_dwPos;
4 @3 ]" p6 R0 [% g ^3 N: i
m_dwPos++;
: ^+ R# A% J7 C+ X7 m0 Y
}
# s7 l A$ o- i; D$ \
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
_ A. ]( W; Q1 Y2 ?* m7 Z
{
, F/ m4 G( K1 n( |1 N. o0 Z/ Z
for (int i=0;i<MAX_INVENTORY;i++)
* _; M" X( ^6 A+ T4 c" X4 D0 A. l
{
0 [' p- f$ {( ?
if (m_Item.dwId == dwId)
* [ J& i# Z/ ]$ o! [
{
$ w/ T/ ~- X! ^
return m_Item.nIndex;
1 U/ @1 Y3 `( j9 S; D0 Y
}
6 k4 f0 Y; T$ m
}
0 j1 K. z) T8 J8 D% b
return 255;
0 l- Y6 a7 j& k, n9 z5 e( g
}
2 ] n, H: t b
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
( w) @! H/ m* @" A1 O
{
5 O% r7 Q+ |; Y4 w* P- g8 F
BYTE nTmp = 0;
6 ~' F% v9 c j6 L
bool bDest = false,bSrc = false;
2 K+ }. q; _. C
for (int i=0;i<MAX_INVENTORY;i++)
- ?5 m, z" U4 M8 p2 X* W& s( J. f% ?
{
: K! l( ?% G6 ` L7 `9 e
if (dwSrcId == m_Item.dwId)
' @4 j8 ]# A0 ~ s: V0 l
{
3 Z; z* T% W/ o0 M1 R
//id相等 则 改变对应的dest和src
4 P3 y0 a# W ^9 P. T
nTmp = m_Item.nIndex;
+ E! V1 d/ ~% b
m_Item.nIndex = dest;
0 z8 p6 g! u# c3 R. b }5 B
}
) ^% H, I7 Q9 o/ s, O0 J
}
# c- ?! n& t/ f( p! N G
//临时数据保存完毕,交换开始
, E( j$ q( Z& o+ M5 s; b5 ^7 K- {
for (int i=0;i<MAX_INVENTORY;i++)
0 o" J$ H6 f$ P5 s
{
. |. i5 w$ C( h% e) R) j
if (dest == m_Item.nIndex)
0 j' U" u; b& k7 C H9 c; ] S
{
# l2 p& z5 m/ B! i# P+ q) b
//id相等 则 改变对应的dest和src
! ]! w3 y; X; o
m_Item.nIndex = nTmp;
5 }, `8 J( f/ B& U( [- B
}
& g& h- s: P. c( g% U; k' j/ r
}
; F( v" Z7 C/ Y. _
}
8 g- r k! C8 D$ d
};
+ \/ a. U( x# g! b- ^5 h
-------------------------------------------------------------------------
" G( v. n) x: {2 I3 N: M9 U
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
8 }1 [' r! l' y5 S) a
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
* r; X1 v. j c: h1 Z- ^9 S
紧靠其上添加:
8 h" i9 N B- ?8 c8 _. J2 Z
if( pWndBase == &m_wndMenu )
9 N$ _" j: x9 ~# F9 d
{
( J4 t8 K8 t% V/ a0 w; x2 a2 X/ W
switch( nID )
% R7 |0 o4 I1 V
{
) R- Q# R$ I8 K# K$ [
case 2:
- B" @: P1 [& y, B
{
- A: F9 |- @6 \8 y2 u
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
& b: ]7 p( V1 _
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
! K1 `8 l, u% e+ Z# x
{
8 J2 |6 t- V9 r9 W
break;
8 y' a) L# l) I$ D2 v D' f
}
5 j5 }, c: G5 | V: ]
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
# G- j( ]0 Q# U- V. |* ]
{
8 A% |% a* V+ N1 L0 x
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
' m& d7 y( [4 b1 F
if( !pItemElem )
: s+ x$ L" T3 s
continue;
1 w0 R- l2 r+ p& x A% t `
if(pItemElem->GetExtra() > 0)
5 ]! r6 H; k2 v. J4 ^% P" r
continue;
# Z1 N4 ^4 U( Q. u$ b, v
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
7 B* \; o6 N1 w6 F5 L
continue;
; m3 j9 S5 V! f# ?
if( g_pPlayer->IsUsing( pItemElem ) )
2 w5 K6 j$ K. _" H
continue;
0 Y# Z0 g- `; `* m( L# U& n7 G
if( pItemElem->IsUndestructable() == TRUE )
[8 x- ]9 J( {; y1 o/ [. b8 ]3 A- @/ u! p
{
) X/ p5 k2 v" `& R8 X
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
$ P& I8 b- J6 P+ L8 ~
continue;
) z: B, c+ |' E+ g
}
5 J2 [% ^. a% \3 t+ M
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
1 M- J' f8 y, S; q+ R4 Y8 `: ?
}
, k9 W# a7 d/ Y# t; O! S
break;
8 O* }% W' F% F' Z
}
% C- ]; K" b: W8 A5 e# {+ l
case 1:
, K4 A1 t- D0 g* N$ h
{
/ K5 O, Z: e/ T( j2 t8 f! H/ }
//整理背包
2 S8 z" k. W2 H6 \/ O8 A9 g9 @
//////////////////////////////////////////////////////////////////////////
+ Q+ w( u; s2 l" e; A/ [
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
. Z. V) o6 g. A( V
//////////////////////////////////////////////////////////////////////////
: _3 J* X8 J. D& @; V' @
//////////////////////////////////////////////////////////////////////////
; h1 K4 O' U* }* c4 @7 x
CInventorySort* pInvSort = new CInventorySort;
" V9 f) D6 L: P
vector <sItem> vItem;
: M& Q/ G- U9 C2 r- Q- b: z
vItem.resize(MAX_INVENTORY);//初始化大小
& M5 p4 `3 g x Y, l
//////////////////////////////////////////////////////////////////////////
! F4 ?) j& ~6 R2 E
//填充数据
& G# J k( b4 f# `
for (int i=0;i<MAX_INVENTORY;i++)
6 O7 ~" N' i9 B
{
- i$ I4 ?& I. S& B+ x$ s* z
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
0 ~& {' F9 {- t7 O8 w* ?
if (!pItemElem)
9 E) B( u/ [ A
{
1 W" t$ w7 u, A$ s4 v
vItem.dwKind2 = 0xffffffff;
* r1 H( |/ @, Y. d+ R9 ?) C
vItem.dwItemId = 0xffffffff;
8 |+ |" O5 Z% \" t
vItem.nIndex = i;
6 T1 y" y& E' ]. ^2 r' i
}else {
$ D0 z, F8 u' m2 L [1 f/ R9 h
ItemProp* pProp = pItemElem->GetProp();
O! T7 ^+ N" K! a
vItem.dwKind2 = pProp->dwItemKind2;
( C' V& p5 A" f- J
vItem.dwItemId = pItemElem->m_dwItemId;
$ `1 N& m# A7 s1 \) n
vItem.nIndex = i;
. o4 N; W. G' L& f7 ~' |9 |* l
}
/ O+ t( V$ p: L% z. ^) r, x3 S$ \
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
5 x3 [3 G. ~5 Q8 @7 h C- j: w/ M
}
1 z" x' b( I& p2 F' s( q- @- n* r. N
//////////////////////////////////////////////////////////////////////////
& s5 C9 Y7 C% x
sort(vItem.begin(),vItem.end());//排序
& P! i+ I& h6 d
//////////////////////////////////////////////////////////////////////////
! ]3 M: ^$ {( ]. R3 m& E
//交换
& {) [- U1 X# v* [/ j$ f
for (size_t i=0;i<vItem.size();i++)
0 v$ |1 T- ]1 F! r& c* w
{
- ^6 p% X* {- j T
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
- r+ f+ `1 f' L) J- E1 a) ^
pInvSort->Add(vItem.nIndex);
! i: g6 v% J" [/ I4 z) f( |
}
3 |* Y5 [- X' [5 j9 ?
BYTE nDestPos = 0;
! }- Y; g) r3 @5 V9 ?+ H% U. y
for (int i=0;i<MAX_INVENTORY;i++)
/ o1 g- I0 ^ d7 A, g6 W
{
- {. ~ W& ]( V6 B
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
! p! k2 I; d( V! G8 s4 @
if (pItemElem)
( k6 {" A6 L7 b# `
{
# k0 }5 H8 O" R, M& ]
if (IsUsingItem(pItemElem))
4 H9 k0 ^" `$ f3 c6 \. g
{
2 y3 C$ r$ L- }; x, E/ w- R; h
//这个位置无法放
- g! G. X7 ?0 k
nDestPos++;
. w% C, T& t/ ^+ d
}
: j' N7 p" B8 F) Y
}
/ y" B: B) @& h' U/ }. X5 n$ i
BYTE nSrc = pInvSort->GetItemSrc(i);
1 p, O" j. a5 u/ w2 D5 h& v
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
' s# X2 t2 r8 s3 e: u+ d* J
if (pItemElem)
/ p ]# A, X9 g0 P
{
. q; l7 N- t& u5 V5 A @( `0 p. B
if (IsUsingItem(pItemElem))
4 K+ U U' B/ f' }
{
' y; Y* W; e( |5 U
//这个道具无法移动,跳过
6 q: Z+ i6 e9 H8 N
continue;
r V o& q% q3 v! u
}
# b7 A b1 N! C. i/ a
}else{
1 X; k( L' I- {+ p6 Z
//空位置 不用动
3 L9 d. W% \& l
continue;
8 I9 d7 N; p, Y/ {; @
}
5 f$ ?( [7 {" J7 K7 J7 j
//////////////////////////////////////////////////////////////////////////
' N/ J1 ~8 L0 H6 C* @$ F
//开始移动
6 R) i) i* k7 n. g1 s. }
if (nSrc == nDestPos)
+ R' E4 T f+ _0 }
{
. I, N2 ` r' d4 C' n# V( k
//原地不动
: H8 h3 Q, Q$ s" G7 m
nDestPos++;
+ y5 v' u( W/ T8 X8 `
continue;
. R8 Z( r6 p3 N$ x8 x
}
0 |$ z9 o5 ~( l# j
pInvSort->MoveItem(i,nDestPos);
0 N% B: y7 Z9 m4 j# C
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
- i' Z$ b& x- u9 I/ O
Sleep(5);
* R/ D( @+ z* h, ]- ^3 B Y1 K
//Error("移动 - %d->%d",nSrc,nDestPos);
- {$ c/ F+ T2 @* c0 P0 K( C+ m
nDestPos++;
: w4 Q! M' C( |2 |+ T: l5 T+ e9 T
}
; i. [3 w% Z9 {8 j7 Q* a
//取第一个元素的信息
8 \' x- n4 \& p! l
/*
" h- K; o! ~/ ~: c% D
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
+ |; }4 n3 P) Y& u2 |6 M+ r
{
L; S, ~/ g& M" A6 y
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
7 l" d& Q, `2 `* V/ \* ?% |
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
/ D* H& C4 `3 A% O& _
}
8 G; T* e6 U1 g! F! j
*/
) }' i3 z" L. Q! R
//////////////////////////////////////////////////////////////////////////
! h- @' k; @9 ~( Y& F
break;
4 D& Y9 M/ K1 u
}
; i, h4 _1 E) w* F% T
}
+ l# p. g, g" ?2 a7 ?" o$ m7 H
}
- T4 c; q% \9 Y
m_wndMenu.SetVisible(FALSE);
, G/ ]& G5 x- C; v! D; B6 Q
6 f2 @- v$ k( p' D
--------------------------------------------------------------------------------------------------------
: n/ k/ q+ C, k8 L. L
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
! n0 e3 w3 B, J& E% l# r
{
, b; h2 t+ T( i7 C. y9 O( {
BaseMouseCursor();
( R* S% [6 z, _0 c& R; C& i, L
}
3 R B/ l/ b& O
在其下添加:
( Q: R$ @5 c6 d/ X W
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
8 ^; m- Y7 \$ L. R
{
" C5 Q% e% n( Q
m_wndMenu.DeleteAllMenu();
- u7 K e! w2 L
m_wndMenu.CreateMenu(this);
, _* \+ @' k1 E8 G
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
# ~$ I! O6 l3 N q# V) }) Y
% z$ K; o4 k8 K
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
: Q, X- M( ?. ?/ ]2 N( x: J% R) V# g. U
{
$ ~3 r' W: U B8 T. t, N& q
//P以上级别才可以删除所有道具
; a( g& l0 ~* o) x* K
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
# `3 E" l& ? _ Q2 d* H
}
' {0 T) Q$ J7 K7 u! r
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
. w$ S) J, ]4 w- _* a
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
2 i0 I2 s5 Q7 v$ \ r0 M6 Q
m_wndMenu.SetFocus();
1 G* K5 G! P# L' p5 t
}
. P# \* Q! Z0 \
------------------------------------------------------------------------------------------------------------
4 g& h( ^ n5 u+ x
*************************
! X" _# O( `( S
WndField.h文件
" D' M, ?& S) j& @" w: O
*************************
4 S' e7 b" b0 m" R
搜索:BOOL m_bReport;
/ {* n& Z* m5 T
其后添加:
5 J' |4 @3 o! B8 N9 R6 H8 s
CWndMenu m_wndMenu;
' g ~5 _5 Z! i1 d# g& e: F1 u
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
/ Y0 G1 p0 I; i) q- Z
其后添加:
( M9 W* C( e. I7 I: Z9 a( v
virtual void OnRButtonUp(UINT nFlags, CPoint point);
7 E2 n5 G+ ~$ U! \, h5 k
5 i* Y' J& z7 i2 |
- r" q! r" P5 Y w
欢迎光临 飞飞世界论坛 (http://ffwold.com/)
Powered by Discuz! X3.2