飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
4 H6 Y/ J0 C( W* b5 c( n* z: F' R
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
* h/ H; d$ h& e7 R
4 \% t* }$ n/ _* e8 T7 W
struct sItem
" W1 @* y( x2 x8 ^( _6 t
{
- m7 ^. e6 E3 l5 N5 F- U2 e' Y. ? K( w- Y
DWORD dwId;
, g1 @! G: V/ h. J/ q
DWORD dwKind2;
' s, `+ }* D. I6 n7 m- j
DWORD dwItemId;
* c, w' G6 Q; d- W
BYTE nIndex;
0 m6 c8 E8 h7 N6 p( B
sItem(){
' [1 H# ^, S7 v4 U% }- I3 X; ]6 @- G
dwId = dwKind2 = dwItemId = nIndex = 0;
" W" C' e2 t! C# l+ P8 q
}
% G9 p5 p( [2 r1 w# {& t
bool operator < (const sItem p2)
6 d8 A- }3 e! a- G( m; b
{
z8 c7 ]. ~) G9 g; K7 [3 H
if (dwKind2 == p2.dwKind2)
$ ~, r9 P" q) P2 {7 a
{
: Q; M, Y1 B# I6 F
return dwItemId < p2.dwItemId;
H; `$ \. w% F) \, X
}else{
5 X" R; w) s5 w9 `9 n3 E/ h
return dwKind2 < p2.dwKind2;
' x* [" K3 n6 q9 R* x( L
}
- j# B. ~2 ?/ L7 t( ]' {. U
}
+ p- q% J+ s& n0 \
};
9 R5 X% ^9 L+ n4 ?4 F
class CInventorySort
) T& c) a0 b; i. \# v- T
{
6 U7 S1 @% f5 l7 U, h
public:
3 W4 _/ b1 P- }2 v: F L0 |$ n
CInventorySort()
# H1 W/ { E; U) |. F
{
n, m- h/ a8 ?3 o
m_dwPos = 0;
3 I$ R* m( Y! t: M. P8 j2 o) H
}
- ^- y* L) n, m! ?
~CInventorySort(){}
. P' T. { [; z8 R$ E7 O! R1 _
private:
2 W- P1 I/ v$ N4 {+ `" T
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
p& y7 T9 o- W; Y
DWORD m_dwPos;
! d' q3 F: | x7 ]9 C
public:
: I0 j5 Z; T) B
void Add(BYTE nIndex)
+ v; p' n2 l1 n1 Q3 i- b* u+ \1 }8 e- z
{
. G( g5 ]8 n. C1 B2 R. @% m
if (m_dwPos >= MAX_INVENTORY)
, V: f8 N; w+ A1 s. d4 B* N
{
6 a6 d3 ` I' Q4 |6 z/ ?3 r7 K
return;
5 _# W: V" L) g) ?& F
}
( o, A* a$ h; `0 ^; ]
m_Item[m_dwPos].nIndex = nIndex;
8 N2 Y8 b/ I8 }+ W: L0 L" r% d i
m_Item[m_dwPos].dwId = m_dwPos;
# K8 v: I- ?# D$ R
m_dwPos++;
8 J6 O; A m) C' a, |* C
}
( W, s: G9 f/ o. }0 h
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
2 X2 B. @1 N, w. @& ?6 Y7 h
{
9 i2 T1 I s6 a5 o! W8 d
for (int i=0;i<MAX_INVENTORY;i++)
- f+ y# q2 k9 Z
{
* g0 V! {4 ?- |; Q9 I/ O
if (m_Item.dwId == dwId)
9 H6 U9 a" w! u, e) ?
{
" h: z& E( @: C0 ~2 |6 W
return m_Item.nIndex;
- Q+ a+ [2 [; f2 ^
}
5 P! C+ o; T' D0 H; Z2 E. z+ i
}
8 a8 B. X! p3 R( Z; l+ B, B- M
return 255;
) p! Y: @" F# F0 {, w# T
}
* s& r% k! w0 }! ?
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
9 E( r% ]: m* _ A" o( ], A6 y
{
1 n3 ]" K+ j3 |) A0 G
BYTE nTmp = 0;
C, E2 @: k3 c0 t" u6 k6 u
bool bDest = false,bSrc = false;
: f! X( K/ i% w, r5 J L
for (int i=0;i<MAX_INVENTORY;i++)
" ]; R) z7 H, K g1 q& X
{
# O, \6 G+ p- e
if (dwSrcId == m_Item.dwId)
* [6 C0 Z9 @ a A# r; V
{
! L1 X9 a y& Y) V, [
//id相等 则 改变对应的dest和src
8 @0 T$ w( W( j' o: R* V8 b
nTmp = m_Item.nIndex;
?' @* o( y5 p6 U- W6 {+ I
m_Item.nIndex = dest;
x# ^( [% \& H' b
}
6 ^ U5 |8 t V* c- l
}
" O" F: f* }5 f* r
//临时数据保存完毕,交换开始
7 @9 l. c% J* F# L
for (int i=0;i<MAX_INVENTORY;i++)
5 e& T9 t3 Z+ A! c9 [% |
{
, D: s9 |$ s, d
if (dest == m_Item.nIndex)
7 ]! o% u# O4 v
{
8 w/ ~0 R/ N- y& `: `4 t
//id相等 则 改变对应的dest和src
, h+ n) M( m0 m* h9 }
m_Item.nIndex = nTmp;
$ w/ a+ R7 J+ d* C M9 ?4 r7 N
}
$ o) C5 D- u$ n5 V
}
+ x/ W/ X; S! j+ H
}
/ y: v8 w+ j+ z c& K# i( H! D4 a
};
/ F; P$ P( V$ J# V
-------------------------------------------------------------------------
% ]0 s- h% P7 ]& r0 ]; k* g
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
9 x5 M) t% B3 f$ }3 U
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
+ }# i D/ O# ]7 h9 d
紧靠其上添加:
+ B0 d J- [+ k; k# e
if( pWndBase == &m_wndMenu )
( Q. J/ D! D& d$ C3 B6 i
{
" s0 e1 X$ k% \4 n' K
switch( nID )
; ?! J8 A! `2 [6 y# @" i7 z
{
3 _. A2 k: R+ G8 Y2 k8 F0 O
case 2:
9 Q6 o- r% P8 q( X0 g
{
, X5 H5 I6 u8 n
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
! r4 z* ?6 d4 O* v3 v# d; z2 g
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
& j/ I0 J: S: }1 h5 [: [* T' \' w9 O
{
5 Q( [& b4 c5 g# u' ^# o
break;
7 P: q0 M# m% G8 {* W, \$ ]
}
1 f& s0 D# t) X8 {0 |2 D
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
# T% K# j G5 R; ^
{
+ P/ T% L% p/ i: p
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
5 T! d/ b3 n% s k8 R' l; S, S: u
if( !pItemElem )
3 H+ {: w |* q8 B8 M* Q( W
continue;
6 i4 j( B+ n. O: p' C" o
if(pItemElem->GetExtra() > 0)
, N+ }5 K* M! Q3 w
continue;
# }# ~. S u) w" z
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
+ T K6 p- v f; ~
continue;
: n! Z F* w5 I
if( g_pPlayer->IsUsing( pItemElem ) )
2 [1 C Q% }) m0 p) i: R
continue;
- t$ y, c) X& z' O* ]
if( pItemElem->IsUndestructable() == TRUE )
. c4 J$ |. P1 T0 p( P
{
' W4 P- n4 d5 C- ~* ?
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
* j* B6 P0 n3 z4 S/ i$ p4 s! J
continue;
! a; W0 D# Y% q, P$ ?" I/ x! F, G
}
+ b# Y6 |" \7 v( }8 v" ]
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
) g, D& C U4 v' Q( K' {, k( C
}
/ Y. F0 u# V6 ^* k
break;
7 T! b: m6 {7 S6 j( ~3 ?5 m
}
6 y3 v! V& \ q+ J
case 1:
4 F( D, A+ R2 W$ O( X3 n
{
], n8 u9 j8 N- J) N
//整理背包
( G7 m% H3 P: @
//////////////////////////////////////////////////////////////////////////
+ i" p2 ~- s4 g9 B
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
( y% F0 L, v" h7 c, L
//////////////////////////////////////////////////////////////////////////
' i- C6 E5 B M6 x$ l5 Z! ^
//////////////////////////////////////////////////////////////////////////
6 j& O4 n6 L# D4 @
CInventorySort* pInvSort = new CInventorySort;
( X+ f0 `$ W. N2 S( b7 M/ K9 x
vector <sItem> vItem;
! ?3 W, i5 M8 @! r, }7 S
vItem.resize(MAX_INVENTORY);//初始化大小
: o1 L2 D) h0 {
//////////////////////////////////////////////////////////////////////////
( o# y6 B& d/ R" m1 W. W
//填充数据
4 ?2 a( S7 X J4 H3 Z7 [' @, Y
for (int i=0;i<MAX_INVENTORY;i++)
& m2 a' U V9 v( H. W) z; o
{
/ L; k$ q' q; V1 f! a; I* w
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
/ ?" M4 B {6 }0 E0 A
if (!pItemElem)
) T' [& R5 T% b+ b
{
. M# N5 ? V \5 }! Z
vItem.dwKind2 = 0xffffffff;
x2 H* _) Q' z6 x' ~
vItem.dwItemId = 0xffffffff;
1 u( v% c- U2 s
vItem.nIndex = i;
. v% O2 l% I- z: S% l
}else {
4 l. ^& J7 a9 G9 F9 m4 x
ItemProp* pProp = pItemElem->GetProp();
0 O# b7 A; T) r3 ^+ G
vItem.dwKind2 = pProp->dwItemKind2;
) H. I- h1 F2 X9 ]! |: Y" H. N
vItem.dwItemId = pItemElem->m_dwItemId;
9 {: N* v: L6 _# t. O% `1 E
vItem.nIndex = i;
2 b8 i9 I. W0 l, f
}
' H) x5 h8 W2 q' H8 j
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
" [2 ^$ W% v" Y2 U' d
}
A+ e# G! z7 y7 t! U# t2 t
//////////////////////////////////////////////////////////////////////////
: X: u3 _* z/ g$ X( r
sort(vItem.begin(),vItem.end());//排序
9 d2 d2 H4 P; F8 k [; I
//////////////////////////////////////////////////////////////////////////
! ]' y& G8 h0 W
//交换
( d) a" ^4 s, W! u
for (size_t i=0;i<vItem.size();i++)
8 K" e8 ]8 P; @5 h u
{
8 x0 @6 o* v0 T' N
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
" x' W0 j- ]) y, j. P% Q5 M) q2 X) |
pInvSort->Add(vItem.nIndex);
0 ]* _: ~6 d8 z6 X
}
4 v1 Y$ O" G7 R* ~+ p0 Y
BYTE nDestPos = 0;
/ y$ J: L( e* f$ [
for (int i=0;i<MAX_INVENTORY;i++)
" E ^ s! w& e* `% U7 D- d
{
$ |3 Y2 U. p( ^7 U/ r
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
% J1 I" x5 p, V8 o- H* \
if (pItemElem)
6 o4 Y2 j+ Y2 |7 b& N
{
/ i- r3 o4 R V* U
if (IsUsingItem(pItemElem))
7 M. p! I% s5 W2 \
{
- T( ^! _2 y B. W; J
//这个位置无法放
) ~6 U7 r+ ]2 m, a6 H* c2 ?
nDestPos++;
0 Q, D/ ]8 g* s0 r
}
) v& ~9 q( y) ]* z, q2 n R. `
}
9 ]9 @+ P2 e, J" o: ^0 @
BYTE nSrc = pInvSort->GetItemSrc(i);
+ s1 X# s! h: d; ]! P% V
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
0 i/ M6 z& ~$ I" C. ?: ?7 p
if (pItemElem)
6 P7 Y* Y ]3 I1 A* {1 J
{
2 J9 ~6 N# \3 ]% k# V9 e$ T; a e
if (IsUsingItem(pItemElem))
: ~9 D; |) E: _6 Q" C2 [/ o
{
% Q7 @4 ^& X6 h/ a2 ]' c
//这个道具无法移动,跳过
8 {" ^$ ^ M$ d# r0 b' W
continue;
! N) _5 S( A8 o& O
}
7 l' O$ C1 @- P3 f6 _$ B) s. m
}else{
+ g/ L, y) O2 `
//空位置 不用动
3 s/ U1 r) L7 y- _3 m* g. `: D7 ~
continue;
# X- w+ b+ t* [1 a% R+ c
}
3 d8 Q/ o6 J6 x' o% ]' Y
//////////////////////////////////////////////////////////////////////////
2 z( V1 c+ Q: f) h j! a
//开始移动
; [8 c" N2 a4 |9 d$ J6 ]0 f
if (nSrc == nDestPos)
5 c* V1 z+ S. a) B( }1 d% t
{
3 R! N2 o" g7 {: u. X
//原地不动
3 x! g$ g) B+ E3 t# t: A
nDestPos++;
- D: j2 {3 s3 r7 L
continue;
5 x* @5 l+ L2 B# A* |
}
# ]3 N* N: h$ t, H
pInvSort->MoveItem(i,nDestPos);
6 M+ A/ h( e5 Q0 v. b
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
! A- A* i; I2 R6 E r n
Sleep(5);
' z; z3 p+ e# r& F E* q0 Z( E) S* Y
//Error("移动 - %d->%d",nSrc,nDestPos);
( }/ u2 {+ Y: ?$ T( c7 l* [: l
nDestPos++;
3 k( j( Q1 U$ \# O# _- Z
}
2 i/ k) G: f( e/ Y7 R: t3 j( }' X: `* }
//取第一个元素的信息
, o4 W: `" h- c
/*
: c! o F) L6 M' r. S: \
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
) O- L& R- o z+ C# q$ \
{
9 Z" _ j8 |8 I
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
d3 V# ^6 I! m1 j
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
4 b; Q/ B# u0 M/ e- O
}
8 _- I, U' X# F2 V& N3 z
*/
+ M- B* ]0 t- Y
//////////////////////////////////////////////////////////////////////////
9 L4 K4 y) x. q
break;
2 i4 I2 O% N$ b) J y: ~
}
# C, ~5 F' U9 k/ P/ ?/ V {- i. d
}
: r. n6 o# G' f; I+ y/ V0 l( B' @8 c
}
$ }+ B2 y x6 Z$ a) ^, r9 W9 f
m_wndMenu.SetVisible(FALSE);
: R% y. N- [$ U) W
5 P* p) W& Z5 k) u
--------------------------------------------------------------------------------------------------------
, V8 x0 l1 d) b+ N Y2 {- N
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
& n1 U5 b% p; H- B. w' J T( @
{
9 y# |- y a7 E( s* c2 H
BaseMouseCursor();
( j# |) f4 E9 e
}
& C9 g0 P9 u4 f' p
在其下添加:
) d2 s/ k# n* f6 ?
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
) [9 p: R! { Q" G! r7 b+ X
{
$ R4 m* H- c% p, N, t |
m_wndMenu.DeleteAllMenu();
6 X0 E( f+ ~% v# R
m_wndMenu.CreateMenu(this);
5 T8 ^+ y3 v4 c
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
- n! B* [1 _+ e) s0 t, L* L" D& ]
7 o* i- U9 U% k, ?0 P( u7 S4 j' T
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
2 _# P' M0 E' l( j
{
, s. B5 |2 x6 z) w6 K. e. W) ^
//P以上级别才可以删除所有道具
, k {. K4 b* Y8 C
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
2 I+ U3 @- k( Q1 G3 r
}
" r7 x9 M$ t0 V4 |+ s- O. F/ D }8 |
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
) m: g; Q. V1 {
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
, [: I" ]9 {) A! d* o
m_wndMenu.SetFocus();
% I, L/ [! W. X) g/ J' L
}
! ~4 r8 v$ \. E9 F8 s) {8 {$ f3 P) f
------------------------------------------------------------------------------------------------------------
" S2 L, a4 l: u, I
*************************
, ~3 e. N% L6 c! | w, z1 F7 c9 I9 z' m
WndField.h文件
# G# p, r1 u" d! ]+ a" w. x9 h' e
*************************
* @5 y! B2 ^$ C$ S" ?% _" ?" ]3 G
搜索:BOOL m_bReport;
, s4 v/ x1 T6 m. [& `
其后添加:
( D# ]$ e& q3 ]" S& g
CWndMenu m_wndMenu;
! a! ?' f0 _3 U( C. I' H
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
& ?& D0 K/ u# f" z _
其后添加:
4 m7 e" r# O* K& ]6 R) e
virtual void OnRButtonUp(UINT nFlags, CPoint point);
1 O& d$ W: D# c4 F$ y0 u
+ a* @, R7 ~' E. g6 W
' {2 H" M; @8 m
欢迎光临 飞飞世界论坛 (http://www.ffwold.com/)
Powered by Discuz! X3.2