飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
5 T$ U' |/ U- M( b' c9 {
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
/ ]; C3 a7 y$ a2 }
5 w: w( Z6 t' _/ f: k1 w
struct sItem
; A) ~0 @8 C% U8 D
{
, S4 d) X* F% T. {
DWORD dwId;
8 s+ B3 r( s8 g9 v: ]* _
DWORD dwKind2;
- p9 \( Y* l# t& s& E6 ^
DWORD dwItemId;
2 p& ?& D6 S' V6 ~0 U4 O
BYTE nIndex;
7 q% k( r d# U+ l% z
sItem(){
/ Y! m, ~9 T l" R# f' v3 C+ T
dwId = dwKind2 = dwItemId = nIndex = 0;
! o" ]$ w( w: T' |
}
) @6 O7 O Y/ X# X) n; Q) m, W- m
bool operator < (const sItem p2)
; F- E, _$ e. P2 w
{
) C- L6 j3 C7 D ~ ^& V
if (dwKind2 == p2.dwKind2)
$ Z. Z, r: n u5 U
{
" f; d; @0 ?* P
return dwItemId < p2.dwItemId;
( m5 P+ F7 n' r; `7 ?: a2 \' r
}else{
& k0 d, v! F5 c* r {. C i* w" S
return dwKind2 < p2.dwKind2;
8 O) Z; u* G% o) { Y) K" g$ k5 k5 f
}
0 _: b0 h( D; [" D5 F
}
' }) L4 J/ G5 V7 m: d
};
1 C5 s) `0 j0 ?( D ~' w0 o
class CInventorySort
7 O8 C* E7 W2 L9 `
{
6 `. |! Z) m1 A$ T9 {- u% e
public:
' v$ v+ y+ x3 r0 D
CInventorySort()
) v2 {' E6 x6 G# f+ K1 _
{
% d. r" j, A3 A3 A q
m_dwPos = 0;
# e6 U+ i/ ^; X+ r" I
}
* k* a/ D& A! [9 d& B! e8 V
~CInventorySort(){}
; ?% q( P8 T% G. A' O
private:
# y& P7 x" d) L1 a/ B- G2 W
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
: s8 g& i- y2 p8 w. Y7 t
DWORD m_dwPos;
# G# m, n, x1 c9 A* y
public:
' ~# ]2 {$ A; @0 U
void Add(BYTE nIndex)
& x5 |! \9 C; s: O
{
- d! Y" ~) ?/ @( U" `, w& N8 @
if (m_dwPos >= MAX_INVENTORY)
; m8 z% Q5 T y) q/ o/ @' R
{
( \. w7 h) f1 i9 @* e; c. l
return;
( [* P, P$ e; q6 ^( I; K
}
2 k5 P/ @1 O3 ?
m_Item[m_dwPos].nIndex = nIndex;
0 s. ~ y8 H$ E" h* `
m_Item[m_dwPos].dwId = m_dwPos;
& C. Y( T2 s5 U6 ~0 o# j
m_dwPos++;
) Y( ^! o9 d9 e) u2 O& I4 N
}
) m5 @! ^- p& }, q% A5 P
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
/ @: P0 j) s& R3 F* s& R& s0 m* t
{
$ q: k$ Q* }: @! y! j9 D
for (int i=0;i<MAX_INVENTORY;i++)
. m, T8 r) p. V
{
- J" x3 D1 r- K6 j. W% E
if (m_Item.dwId == dwId)
) u0 |4 s) k, L5 x
{
. D* j: s' _; z4 x& ]* p
return m_Item.nIndex;
# \( ~1 W9 o# u1 J* p6 s
}
2 Y0 T, a5 P3 J2 h
}
$ o9 H- f* T3 @
return 255;
. K0 a( d) E1 m2 d, }; X4 c+ y
}
$ Q0 s% U( X2 D+ ]
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
5 h1 P) G4 H) B6 q/ n" v3 B
{
2 n4 B: }% [( B h5 Q& M
BYTE nTmp = 0;
: G# s* t4 O2 I# E
bool bDest = false,bSrc = false;
- N X1 ^* Y0 _) y$ {1 G
for (int i=0;i<MAX_INVENTORY;i++)
! M/ j0 y {0 G7 S6 T# c" m1 ]- V- Z
{
( G; [. B4 q2 t- D( _& ]$ i0 d
if (dwSrcId == m_Item.dwId)
2 @4 D- O3 V' J. {% E# m
{
4 k% t; R/ ?7 U2 D( {
//id相等 则 改变对应的dest和src
# w4 D2 u+ b3 |6 j# K/ W- _
nTmp = m_Item.nIndex;
( Q1 E% o3 f) e9 s
m_Item.nIndex = dest;
' r P! E( n! g6 l) E* ?& Y
}
& j2 [$ c4 M$ k5 r
}
0 x' u* h4 ^: B5 R; a/ _% L
//临时数据保存完毕,交换开始
) ]1 T) C! a" k% j D( a( z3 Y
for (int i=0;i<MAX_INVENTORY;i++)
" _. Q x7 y5 r. q& u0 P
{
. Z+ \8 ~3 X ^* O. E$ `" v
if (dest == m_Item.nIndex)
4 m5 ?/ T+ G/ O6 @6 O3 X
{
3 G b$ b( N' g, d: {) e k
//id相等 则 改变对应的dest和src
P# I/ G3 M4 T9 E8 d
m_Item.nIndex = nTmp;
" D- a- C3 f) `& f7 N. {, Z1 D1 d1 a
}
* k$ E% G) `2 X1 S
}
8 j0 g3 a& M5 T5 u: O
}
, K$ g- C6 Z/ B' [
};
% H( R3 o9 U/ e' ] _
-------------------------------------------------------------------------
3 m. N/ w' H3 _. g
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
7 S! G8 ?* T" |7 d
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
+ E# E! O2 I o$ {1 F" i
紧靠其上添加:
- x- p6 v9 Z, M) {2 H% [+ k. J
if( pWndBase == &m_wndMenu )
1 x' |: [3 d5 l! y% c( @
{
0 J: ?/ g; _" [
switch( nID )
3 C: b1 g, ^3 f/ C( B" U
{
5 H$ ~0 x& H. Q7 c, Y1 m
case 2:
) o2 |8 c W4 J0 I
{
# a0 a" r5 ?. d' x' p
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
) j* u8 o. ]3 O# \. ]
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
+ W9 _1 Y, O w5 E3 U. l+ e8 @- J
{
6 B! ]$ L @% W% t. T- R0 W
break;
: p9 R3 \* ?- E1 u2 w p/ S; W, Y
}
% w+ {; |" ?* N' g' T5 g
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
" Z8 a% g& ?* U
{
1 J4 _4 _. J. W) W1 {/ X6 {
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
) r: H- A# Z1 m9 T
if( !pItemElem )
/ m0 i% b" z3 \. \/ J. h/ j
continue;
5 ?1 s: S5 e) n3 w, E
if(pItemElem->GetExtra() > 0)
/ j+ W) |. g) B9 o# P
continue;
v8 V2 z1 G/ ~) l
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
) I( o: C, g! Y9 t( m9 s6 D
continue;
/ H/ R/ B8 M+ M# g
if( g_pPlayer->IsUsing( pItemElem ) )
$ `: L) h$ E4 ^3 h& T
continue;
* |6 c% U. P+ A& ?! ]; j% J
if( pItemElem->IsUndestructable() == TRUE )
( K7 y2 A3 b9 I* c
{
0 s6 k% b7 t) W3 q1 p
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
1 ]# ~# {7 c2 s- B$ r& }
continue;
2 K4 H, E; U- I5 G% e$ W g$ e
}
, Y4 z& @8 `: z9 V% Y( g! @
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
' c6 d* [- X8 U% s$ _( g3 I
}
5 @2 g% v" B/ q k% G( o
break;
7 A8 L8 E, _7 j; o5 m# w2 ?' t
}
! Q% ]0 z' s) n; u+ O6 c& X/ g+ I8 ]0 X
case 1:
; o# c8 m4 ?* s2 X
{
1 L6 Z' W, B! b/ T2 j
//整理背包
, Y& F8 D" M1 P. z6 [
//////////////////////////////////////////////////////////////////////////
* \5 D0 v, Q# p3 f
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
" m! q: I) \; ]! f! f6 _5 `
//////////////////////////////////////////////////////////////////////////
0 \- _ N0 ]' K" Q; C% t2 ~- {# E
//////////////////////////////////////////////////////////////////////////
! x* w* s( T$ W L1 d
CInventorySort* pInvSort = new CInventorySort;
?2 D! I0 \: u) F1 h$ h$ f/ g
vector <sItem> vItem;
; y: p8 \+ u2 b% W$ m6 Y+ a2 i. J. l
vItem.resize(MAX_INVENTORY);//初始化大小
2 F; v9 M2 v2 C+ o1 ]" o6 p7 L
//////////////////////////////////////////////////////////////////////////
$ [) e7 K' ?% D, r( L6 O
//填充数据
6 i R, ~2 O7 t
for (int i=0;i<MAX_INVENTORY;i++)
2 q. U( }- F; i2 E* |: {. D3 I
{
: v/ |) Z: F6 `
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
; y7 M; G6 E7 L( d
if (!pItemElem)
% H. N: \* [/ |8 m% J$ G: `2 w
{
& t: S; x5 d6 @4 x \
vItem.dwKind2 = 0xffffffff;
- R) w) b1 Q* c+ D( d# j: O9 |
vItem.dwItemId = 0xffffffff;
# X: l7 w' I1 \( i
vItem.nIndex = i;
2 p1 X2 v N- T' a' }1 \
}else {
) @: H) K3 P+ u, \
ItemProp* pProp = pItemElem->GetProp();
* K0 l. I% h$ J% _" D
vItem.dwKind2 = pProp->dwItemKind2;
# u9 J, t: h @& B& h
vItem.dwItemId = pItemElem->m_dwItemId;
- ~& d+ N* ^0 T! F3 E6 k
vItem.nIndex = i;
+ R# R3 s! y+ B, O5 ]# C
}
3 X" q$ M, c- L" f
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
' [) ^: g' e. J3 ]( o
}
* |$ U1 w% O" {! q; F T7 t
//////////////////////////////////////////////////////////////////////////
$ c E" y+ j! @# X+ z
sort(vItem.begin(),vItem.end());//排序
& c2 y8 ?: R# J* o0 S8 G- r/ B
//////////////////////////////////////////////////////////////////////////
* I; l- X+ O4 t' V- H5 U
//交换
- @& `1 z; s, {% \& k. C z
for (size_t i=0;i<vItem.size();i++)
9 ? ~! q4 U$ K3 T# l' `
{
3 I- E& {) z4 Z- C* H/ M
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
C; `* V2 D) l3 O$ R# v( {+ S
pInvSort->Add(vItem.nIndex);
, [' J; `2 r9 y3 j0 L
}
" ~: E. P1 K. ?. e5 e. P7 q
BYTE nDestPos = 0;
' q5 \: S+ D- g- L
for (int i=0;i<MAX_INVENTORY;i++)
7 T- ~, \' ]3 w" Z' w, ~
{
* C9 g# V& S1 E) l8 q8 l
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
! Z6 t3 O# v5 B/ n$ s- W
if (pItemElem)
& Y3 [$ {) g1 _4 o6 d0 @6 s
{
3 h! U) v; P O j. N
if (IsUsingItem(pItemElem))
* b: X: a2 m; i4 @' I; ]
{
. S$ B( G& @4 q# F- ?& f# R: t
//这个位置无法放
3 j/ P/ r. S7 v
nDestPos++;
6 M$ B4 C7 C( X, y
}
8 q) }+ y5 @) P4 o4 {1 `: ?
}
" H4 x5 T; r ^+ d" V
BYTE nSrc = pInvSort->GetItemSrc(i);
1 f: o/ c* g; M4 y) U
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
6 b% \4 q5 M( G8 y }
if (pItemElem)
1 ~7 h: O0 s4 J$ p6 ~& a
{
" u" E; ^0 F2 z; G# P3 y5 [
if (IsUsingItem(pItemElem))
% o {7 ~# }/ _" ]
{
4 N8 T8 k1 H3 j0 B& M. M1 ^
//这个道具无法移动,跳过
: C- y% n- `: }6 x4 }
continue;
( X, I' T" E c- u u$ P: g3 c0 w0 C
}
( i" V/ X+ y* r7 [8 ^& }
}else{
! T: | o, ^1 t' W
//空位置 不用动
( K9 X5 {7 o0 L& T: i
continue;
9 K& S9 l# @, V( v- r# i
}
9 W; i9 ?* o B
//////////////////////////////////////////////////////////////////////////
* @/ x0 l, t* E- g3 v8 u& D* m
//开始移动
& \* T6 ^+ T" t' s* y: Q' w. G
if (nSrc == nDestPos)
; Z2 P9 z2 u }1 e
{
. M, }) Q0 K8 @
//原地不动
6 g$ L4 k/ d" ?
nDestPos++;
2 j1 H) \! d4 e
continue;
0 I) y6 J" L) p. G( l& u# E! u) F
}
5 {0 F! e6 `8 e" D% }0 F
pInvSort->MoveItem(i,nDestPos);
; s1 }7 \2 s1 z, L+ V/ M
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
/ \1 _/ B2 ^- [4 N0 o5 k* x# W
Sleep(5);
% d7 e! h. K" L
//Error("移动 - %d->%d",nSrc,nDestPos);
; e$ N V% _3 B/ m+ t* _# O( _
nDestPos++;
/ e- p. |/ D: v- w: x( z; Q
}
3 q. n" z# ~9 h, T$ S, d3 U) _1 b
//取第一个元素的信息
$ \7 I6 C& a. L& p% |
/*
v$ ~( ?2 I; s7 F0 @- y" z: ?
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
0 f9 @: Y0 V' U# h. Y# s1 w8 ]
{
3 w% c( B. ?% s& x+ n- r: x# ~
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
7 @) K1 w) B: V- M u2 V7 |# ?7 x
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
2 ]& [8 W- l( T+ h. q- C" B! Y
}
( F; c" r4 h. N, [6 u' J
*/
; b- T$ J2 Z6 t3 H7 {1 g8 d
//////////////////////////////////////////////////////////////////////////
& @- b' _: L% }
break;
# ]" C: i' z5 |. f6 }! @ P& m
}
/ F O1 b1 i/ v; u" N0 g6 D2 B
}
- f. s3 o" h$ P* ]0 o4 C
}
+ m: m6 v9 v' ]- Q
m_wndMenu.SetVisible(FALSE);
' _5 e+ m4 `- e
% Z, J% x& _! G/ g2 ?
--------------------------------------------------------------------------------------------------------
1 P9 w% w! k: |) y2 Q( ^/ S+ G
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
1 f" B. W8 z8 H8 a( W+ M4 N
{
9 A9 M- D, _9 y+ Y$ w
BaseMouseCursor();
6 j U# f$ {5 ~, a8 i
}
2 m; w; z" N1 s- n1 c$ Z
在其下添加:
1 m9 E. U2 q9 n! P5 a
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
& n- u: v" _# u
{
9 `- G9 s! k h5 Q. b
m_wndMenu.DeleteAllMenu();
# k3 B) d& o- W9 ^6 i. p" o
m_wndMenu.CreateMenu(this);
5 O) t. U7 B+ f. V) [
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
: D3 \2 ]; q* x- R/ `, H
; f" L( Q: A* L3 o
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
. ]! ]' V# B8 \! W% v. w( H" X' P: L
{
) \* F! p& b+ y0 {$ B0 h9 P" M
//P以上级别才可以删除所有道具
) ?7 v- b4 n3 o& f" Q
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
1 J& ^. L$ ]6 k9 a1 m5 O9 }; q. m
}
0 A7 W0 J% g' X2 }! U- u% a
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
- }" f/ }) A4 m' X/ x
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
! `4 _7 M, g v, M% I- ^
m_wndMenu.SetFocus();
. s7 |' A6 u& k: {7 c
}
+ u l6 X6 X. I1 g' Y& n
------------------------------------------------------------------------------------------------------------
. O6 u, d! a/ q0 K6 o2 m4 `. y. O
*************************
% m9 T/ e: k5 \ e. t5 R+ |4 J
WndField.h文件
# t, L+ y! i! q' u+ _8 A
*************************
4 T/ ]5 {8 ]& E2 a
搜索:BOOL m_bReport;
1 L) C, j9 R+ w; E
其后添加:
" j: Y! u/ h5 {$ C- S; g' j4 `' y
CWndMenu m_wndMenu;
$ p0 `) X7 I Y
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
: _) r% O# {$ D, F( x0 \% o) V* c
其后添加:
' x1 J0 ]. A5 m: A" i1 D) y
virtual void OnRButtonUp(UINT nFlags, CPoint point);
+ M" Z; R5 @' q. w8 Y4 N
1 ]% N8 O @" P4 I
8 n9 H# C) I" X- u
欢迎光临 飞飞世界论坛 (http://ffwold.com/)
Powered by Discuz! X3.2