飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
2 ^# [5 h9 z( b+ ]4 d
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
* K' g. v) ]/ Z. T7 S' Y1 f
/ a1 q$ K8 _( o
struct sItem
2 A+ E1 w# {! a& N
{
& b8 O* A/ o* w. U# y: s
DWORD dwId;
- O) m8 u" Q1 L' y& g, P7 z, p
DWORD dwKind2;
* R: `8 E) ~& V: p8 O r# _
DWORD dwItemId;
8 p- S7 h6 _( Q3 s9 {" C% _
BYTE nIndex;
7 o, x1 m6 S* V! Q& f. y( ?+ G0 T
sItem(){
5 ^& S! N& ~# B+ b& c8 E' }
dwId = dwKind2 = dwItemId = nIndex = 0;
/ O" v2 f0 n) N9 r4 C
}
* ?2 i% Q0 L8 b( q8 `1 L0 x9 }
bool operator < (const sItem p2)
. K* ^, M6 p3 V
{
# k% J- U, V/ V; T. y
if (dwKind2 == p2.dwKind2)
' P! @. _) O9 v. K6 b; C" o4 l
{
" f5 R3 z9 j% k! g; ~
return dwItemId < p2.dwItemId;
b: O* j7 {6 p3 O( I2 E
}else{
* ^* t' `6 a! I( n+ i# L# ]
return dwKind2 < p2.dwKind2;
: i$ Z% n5 E# v2 }+ `
}
6 e+ X# f; d1 L( n) V* p
}
1 t; m3 O" W1 O
};
" y- G2 H! P0 D
class CInventorySort
$ C. D# B: {8 `9 k5 X+ f* i4 z
{
" j& w- T8 R# R9 J! S$ P9 @3 t. k
public:
8 p3 f. a) H6 |' q5 e e$ n
CInventorySort()
' u" [& i' @# l+ k1 l g
{
* y, `4 R6 k3 `) j& r
m_dwPos = 0;
7 T0 f! v$ `4 M# `% Y+ E
}
1 M6 K' f) K' a- x
~CInventorySort(){}
: b$ X6 T3 k3 p/ ]
private:
/ f$ o& }& f( r' f
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
: r/ H: V+ K* {& e# j
DWORD m_dwPos;
k2 I. l- O$ |* _6 R% [* r
public:
0 M3 [0 _) r3 M' q' H9 A1 g5 C% v
void Add(BYTE nIndex)
8 M( \* u. l7 c C$ h
{
2 q/ g! P" P! Y" A% u6 R7 X
if (m_dwPos >= MAX_INVENTORY)
K- x# Q/ m6 h5 V* h
{
5 k7 S" S* K! A% z
return;
- O2 {) v- [7 d; t, K- A0 P
}
8 l9 l( h* d, w2 Q2 k9 W
m_Item[m_dwPos].nIndex = nIndex;
. R; ]( f* M( Q5 b: O- W
m_Item[m_dwPos].dwId = m_dwPos;
& b: r0 i. ]4 Z4 c( s& |% Z
m_dwPos++;
& L; a$ b6 W$ W: c
}
% p; t# s8 M8 @+ a/ P8 M1 D* ?# B i
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
6 S: _& F3 c5 Q" F
{
8 ]' y& o, h; E* a! y7 ~
for (int i=0;i<MAX_INVENTORY;i++)
( l/ o/ h8 d A
{
$ l$ c1 r% ]! V& O P5 g! o$ \6 l" `
if (m_Item.dwId == dwId)
' F1 i# E" u2 N
{
3 g$ \% l2 K t# Z$ A6 z3 H; T
return m_Item.nIndex;
) k# Q/ x1 A" i/ s9 ?
}
7 \- | R# t- C
}
" o/ |% ^3 `5 `; m% b
return 255;
3 N2 d& H6 Q0 e! ?6 ]2 u0 j
}
! G/ O! s0 s: P. Z, N
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
; V/ d; @6 q& |' A5 T( P4 T0 o
{
( g/ O2 y" ]1 b+ Y! E
BYTE nTmp = 0;
% W7 _! |& @* W; A3 L" m
bool bDest = false,bSrc = false;
5 K- s! M1 I% v
for (int i=0;i<MAX_INVENTORY;i++)
' l2 ~1 ~2 Y: `
{
# y% ~; u+ p( |1 w" o5 }& v' Z
if (dwSrcId == m_Item.dwId)
6 f5 ~8 E+ {7 }8 |" V
{
Y) m- e! h: A( t }7 J7 k3 I8 x
//id相等 则 改变对应的dest和src
t+ N( C, o( o: a' \" x: i$ p
nTmp = m_Item.nIndex;
9 J4 O9 @; x9 |. Z& W( T
m_Item.nIndex = dest;
7 K1 D& h1 Z! x( p' i# d
}
3 r/ N- C" o* Z0 O' D4 U
}
$ B" \6 X" ]& ` r/ o! I4 T5 { {
//临时数据保存完毕,交换开始
2 _+ A$ f4 F/ T% M/ H6 u+ \, s
for (int i=0;i<MAX_INVENTORY;i++)
9 R( Y j k1 D. R T
{
# b; N7 H5 F# d
if (dest == m_Item.nIndex)
& g6 ~# h8 L& v- l% N3 c
{
; n9 x% }3 q. O& [$ A# n* M6 n" A
//id相等 则 改变对应的dest和src
3 m1 k' i/ b1 X# y
m_Item.nIndex = nTmp;
' W4 B% W8 G7 d+ |% _
}
/ G$ ^% [) Q9 u: l, l
}
' O" r4 |! X7 V. x
}
; R/ X3 }; U1 R V' f% a
};
% i' k8 g& C: H
-------------------------------------------------------------------------
7 k! N% S& C- }+ u) {# B, i! ]! w
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
. k s- b! X2 p; K5 G
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
+ ?0 x3 n! {( T- \- s/ I. {2 _
紧靠其上添加:
1 c) a/ W# V. d. F
if( pWndBase == &m_wndMenu )
7 F( l, l1 C0 q$ B# g5 T1 R
{
- e) h% X3 v1 E5 f" ?. V- P: b
switch( nID )
6 G' }8 w" h9 d6 o7 A1 Q1 O
{
3 p$ c( c4 a, b$ y1 l. M8 B6 w
case 2:
+ C. M9 b# t& y3 y+ n& \6 ^
{
7 I/ ~) h/ ^( k- g
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
: f T+ J9 m r; m: f7 C* i! R. ~
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
, M C4 i9 X; u: y
{
# S" ^, F: `/ R1 Q' ]) c% Q* a+ L' m
break;
% i2 M7 @0 K% V. e7 u) B/ ]1 m
}
. C5 E& Y2 I7 `0 A; Y0 i
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
8 s( \8 u: A: {2 O: u! t
{
, o, b: v1 {) V$ s% ]+ N
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
5 i+ D g0 M# |2 Y8 R
if( !pItemElem )
5 ]' g% Q ~# k5 j
continue;
. ~) c0 z" P# l" M5 I
if(pItemElem->GetExtra() > 0)
$ r& z7 g) c' |6 U
continue;
1 L) o; t2 G! D! ]8 C4 i8 p0 U/ ~
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
6 }! |7 s2 y; m- T1 Q% Y+ H
continue;
. z4 `( R% H9 _0 z3 S5 S
if( g_pPlayer->IsUsing( pItemElem ) )
; a0 v) ] m6 J6 p. v
continue;
0 N# d1 a. g) N3 o1 O) u' }; d) H
if( pItemElem->IsUndestructable() == TRUE )
2 b5 S7 T& B4 d; V4 u
{
0 d3 I4 @( `9 ~+ w' j
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
+ F! u$ w! s$ \* G S, _ |, ~
continue;
1 r7 y- V( o1 n' ~, v4 _# ~1 v
}
# Z5 w) y `% Z- T
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
1 w1 M% ?: J J. e
}
( @2 h9 A( a* B. Q
break;
! o% |4 J" v5 ~
}
0 \/ e! G+ h2 F- Q. t5 u
case 1:
' u1 x7 }: ~0 C) D4 U% `4 O
{
1 V# z5 Z x4 {
//整理背包
3 D" ^+ @- \6 ^3 m- C
//////////////////////////////////////////////////////////////////////////
8 W4 G9 Q5 N0 p, E$ G5 j
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
# C3 Q7 D5 [5 y6 w% a1 T7 k+ A
//////////////////////////////////////////////////////////////////////////
8 P' A- c9 e0 g* k G
//////////////////////////////////////////////////////////////////////////
1 x# D# G9 v# d* Y$ k) H. A
CInventorySort* pInvSort = new CInventorySort;
3 _) _3 C# Q; H/ V& n
vector <sItem> vItem;
# l* B4 w5 ?6 b2 w5 A
vItem.resize(MAX_INVENTORY);//初始化大小
8 g9 A; V5 r5 v0 Y; J% h; ?
//////////////////////////////////////////////////////////////////////////
9 @- ^% X" Q/ b6 V$ h D; B) L
//填充数据
# p2 x/ N# ]4 H9 ^* i% q
for (int i=0;i<MAX_INVENTORY;i++)
% M! p8 D3 g) O7 R" w1 }
{
* d1 I7 I4 b6 F
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
2 U% l8 Z' g i) q
if (!pItemElem)
, y6 L- L- E) j8 w$ G& B) z
{
# h4 D9 I2 S% w8 C) X1 n% m4 m
vItem.dwKind2 = 0xffffffff;
, c) E$ X2 F5 k$ }8 _& W) R
vItem.dwItemId = 0xffffffff;
( J9 S* |% ~5 b
vItem.nIndex = i;
8 u& A1 H# t9 f) y. Z* h
}else {
7 M+ |: ]3 E& p# {+ Q
ItemProp* pProp = pItemElem->GetProp();
# ~# s% y+ E7 z% v: Y" z
vItem.dwKind2 = pProp->dwItemKind2;
" U9 `% _; |0 n/ I( x+ |! v! i' N3 u
vItem.dwItemId = pItemElem->m_dwItemId;
$ e- m( m( E8 E
vItem.nIndex = i;
5 w; Y1 R+ X* J( y1 G4 d
}
! D+ V, O# K: R( J* W
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
; ^+ o- K& N3 m' H7 S
}
5 A0 J9 k% q1 I: A
//////////////////////////////////////////////////////////////////////////
9 y4 m8 ^# d# n! d
sort(vItem.begin(),vItem.end());//排序
; f, f+ s# [" I; f7 e
//////////////////////////////////////////////////////////////////////////
) n4 Y. k' U2 D5 \2 f# t; ]/ t7 T
//交换
& n% [" \, Y( L W2 q5 q
for (size_t i=0;i<vItem.size();i++)
+ S1 m! H' M, v- c4 d8 z
{
9 \: ~4 c$ a0 m9 n0 d/ {% }
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
# s; \3 D/ @! J! n6 d. l
pInvSort->Add(vItem.nIndex);
) W" u4 b7 W( y3 r i. n
}
7 B. x9 L( Q; S* A6 i
BYTE nDestPos = 0;
9 k! v/ L: w0 ^5 s" C8 S
for (int i=0;i<MAX_INVENTORY;i++)
- m" s6 d! {6 e/ q- p X! Y
{
0 ^( X3 ]/ n% t
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
5 k; i6 r7 c% s% _# c) v% L) H; \
if (pItemElem)
' d3 q) K3 w4 }2 u$ u- o
{
7 b8 u7 I( z4 w0 B
if (IsUsingItem(pItemElem))
2 x$ i: g* O/ W+ H) B& q
{
& f: M6 M* g4 A8 p" `
//这个位置无法放
* \3 }7 H) g5 m* |% F
nDestPos++;
" I/ ?9 w1 u3 a' G6 { k
}
' E) u$ u, P3 J; J
}
' Y- g0 j- D: ?0 c
BYTE nSrc = pInvSort->GetItemSrc(i);
# Q3 q5 f# S0 v0 A. Y8 ?
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
, j- F* s4 X4 z4 t; U
if (pItemElem)
4 x$ M' g! c7 u
{
2 O! C$ [6 `, [: `' X* i4 a' k
if (IsUsingItem(pItemElem))
0 s8 D( B* o- S+ d
{
* A, W! g: H3 ]( W
//这个道具无法移动,跳过
9 _2 Y" l6 `! m9 R. B
continue;
# g3 L+ J; H) L) k. Q* G
}
6 a: g1 ?2 [7 g9 e
}else{
. ?+ l( W- I: x5 |
//空位置 不用动
8 H# W' L) n0 T" ?1 v
continue;
5 V' m/ M7 f) v' i7 Z! `) l3 v
}
/ U" i0 S6 p) Y/ x: q, Q0 M1 J
//////////////////////////////////////////////////////////////////////////
6 D6 S( b- j* W7 r
//开始移动
( b- L4 \3 x" m
if (nSrc == nDestPos)
- b5 K" G$ z. a& I I5 X
{
, ~1 @ [) b P$ ^' b- N8 x5 V9 P
//原地不动
! b( a( h$ m0 u
nDestPos++;
9 m% x3 r' A! Y' h+ d9 {% N
continue;
* x; v0 }2 u8 v) I% g7 L
}
K( V s4 Y0 C% b6 \0 Q, s! a8 r
pInvSort->MoveItem(i,nDestPos);
6 R. m$ C8 m* g; c0 b8 `! H, K A
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
$ v5 u/ | W( y7 R. W0 O
Sleep(5);
v0 x$ [. S6 ?& F5 ?6 J+ d" I
//Error("移动 - %d->%d",nSrc,nDestPos);
- J" Q0 s+ {+ N# l5 m
nDestPos++;
3 |6 H! o3 Z7 g
}
; j) ?2 ?9 ^2 d$ c! H. p
//取第一个元素的信息
M4 y6 c- G3 i# n
/*
. c3 Z0 @' I. l) F& v
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
; D0 R# @( Q, ~. Q5 e$ `( ?! V
{
! z+ F2 h# p4 W& v% `% X
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
& [7 Y& \2 Q: j( m# y. P9 w
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
1 r8 Z3 l* I: o6 p8 z/ v$ u8 l
}
! g. w4 l/ l" q
*/
: @9 w+ L! k1 V* T
//////////////////////////////////////////////////////////////////////////
; h+ @7 o& h0 Q
break;
9 X* p# v7 O, E1 H
}
( ]! ~7 g2 [0 g. Q t
}
8 q A) _! }/ z
}
6 z. f! m3 C# r' n) V) r
m_wndMenu.SetVisible(FALSE);
. s, O5 T' l; n2 y/ a6 [
: e- [( c' r1 a% S5 Q/ M6 h/ p
--------------------------------------------------------------------------------------------------------
3 m0 |4 q$ r+ f! G' v$ P" n
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
# Y3 g u# t7 W& W7 q
{
( o6 W* x. J) N3 A: h
BaseMouseCursor();
( C J8 b: ^7 f6 D' G" A
}
% s' ?% z3 \+ |, k% Q8 K# j
在其下添加:
- n8 s+ a; f. H+ h
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
" c- P: t6 A6 c$ P: b" M/ `, M
{
: S& p. H' [- `' X
m_wndMenu.DeleteAllMenu();
1 k8 L4 @& ?" b" y/ w
m_wndMenu.CreateMenu(this);
+ g6 a7 |* g1 }4 R) q( {# i
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
9 e! ?, k; L3 Z/ r3 j! ^
( H$ U5 O2 W- l, B. H: G2 L' s
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
2 h" Z( S9 Z8 ^& m3 U# n
{
* p: l$ O/ p+ r7 r. g" q( `
//P以上级别才可以删除所有道具
, x9 G& w# s0 t, D0 q8 S& q
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
, b" n0 K e- f9 G6 h+ j: U& w/ _, s
}
, c6 H8 n' h* S) }! E
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
. j) m" C1 U3 Q/ H' v
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
g: E0 x4 |# R4 ^1 H
m_wndMenu.SetFocus();
! l3 n; I" X/ H! p
}
7 q0 W S, D, z8 e) t
------------------------------------------------------------------------------------------------------------
T% r! i$ u/ ?0 [9 \& u3 F) Y
*************************
: O! }6 {% B, ^
WndField.h文件
! D9 ~3 a$ C- o b# N
*************************
+ n7 |3 Z$ L. d
搜索:BOOL m_bReport;
. {( b' t/ k _
其后添加:
( Q' i2 i! k+ h6 j
CWndMenu m_wndMenu;
* f, x# S# d2 K3 L- h
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
6 r2 y) B' [6 F
其后添加:
: f E1 d2 ^% x3 M) m2 W+ o' O+ z
virtual void OnRButtonUp(UINT nFlags, CPoint point);
5 a8 i; O' F# I6 V
% U; `9 D# l. u4 s4 V
( @. t2 H I% V
欢迎光临 飞飞世界论坛 (http://ffwold.com/)
Powered by Discuz! X3.2