飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
. M+ W: D( i7 f9 f
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
! Q4 [ R1 m& c- s; _( B3 ?6 m
7 c3 F( V/ H: n _
struct sItem
2 W% I4 F, p& Z# Q- ?$ _" B+ I
{
! J$ C: r$ ^0 w& r4 ]2 T
DWORD dwId;
! M1 q" _- Z' o- p1 ~: | c' K
DWORD dwKind2;
! ~* }- l T% C ?# J
DWORD dwItemId;
" \' Q4 _, ]: R% [/ k7 O" I
BYTE nIndex;
2 c) l& @1 U$ u: f& D
sItem(){
! b% s! l) H; Y3 U* `
dwId = dwKind2 = dwItemId = nIndex = 0;
6 A A. `3 w4 b6 z
}
; K( t c z+ X4 _
bool operator < (const sItem p2)
! ]* \% {( L) q4 r( g( E
{
- [3 S, }6 m, }; d& m& d: H
if (dwKind2 == p2.dwKind2)
, c$ i. k) }; y$ m3 Y2 E
{
+ N* c2 W' m5 N6 J
return dwItemId < p2.dwItemId;
|) k/ B, ~: c4 d; S
}else{
% y7 F& y" V, w- P% y2 V0 _
return dwKind2 < p2.dwKind2;
# T( n; @% I& u) [' g6 \
}
+ B1 A4 y+ m1 d: \$ S
}
3 t. ]/ O6 ~) q; ` {+ t+ b* g8 n5 |
};
3 @5 U3 ^. |3 K& v9 U( j
class CInventorySort
( e7 p# I/ T0 ~* X4 Y# c8 o
{
& j/ k, t. o8 {: c7 b& j
public:
! u3 I0 }' Q+ C9 K Q
CInventorySort()
: }% Y3 M6 j5 W9 x
{
4 y% H3 [) U# H1 D
m_dwPos = 0;
/ N+ z/ o' H$ [# D- i3 d
}
+ [3 H+ Z4 }9 F" H U, y
~CInventorySort(){}
" o |. b, e" W' C1 Z- k7 Q* } Z$ D
private:
% H% T, f5 t: g4 _
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
& Q9 _9 f0 H; t
DWORD m_dwPos;
# V" A% j& k0 e# W; f
public:
9 e; \7 k' @2 E7 k# w; \1 g
void Add(BYTE nIndex)
# B; a- x0 E" b
{
8 }6 G8 _) i0 S' U) W, n
if (m_dwPos >= MAX_INVENTORY)
4 n) }# M! b6 E( _ p F J9 y
{
" ~6 v, z' h' s' I) P! n
return;
7 j0 Z/ E; N3 X5 g
}
' E% q+ a4 f# C* E: E
m_Item[m_dwPos].nIndex = nIndex;
+ Z6 \5 W& O/ c8 \
m_Item[m_dwPos].dwId = m_dwPos;
) I& H3 N0 U5 |" c6 X% t( S' a
m_dwPos++;
* E2 i5 ~+ p( T2 ~4 Z
}
) x2 S: m6 `. l- A/ _
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
7 {( [& J& H+ [) Q1 `) i# k ] F
{
: _ {0 K- P# l- w& v3 B/ m
for (int i=0;i<MAX_INVENTORY;i++)
- `9 p/ E Z: ^( A% k
{
# D2 _: {% R4 c4 y% G0 h& @
if (m_Item.dwId == dwId)
$ w. T8 s* h$ y# m
{
( e$ ~$ `( O: Z! b/ t
return m_Item.nIndex;
3 y/ j3 {* d! `' ~) |8 i+ u$ C
}
3 T' r( C$ G8 H* ?
}
3 G$ t$ `8 Y7 i0 {* r) G9 Q5 L
return 255;
5 n) |0 K4 p( A3 T4 |
}
* E: Y5 v* L% d" E( ]2 u3 Q) i
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
4 r! x% H/ l3 y5 l5 U; Y
{
, o& M4 q8 r% y
BYTE nTmp = 0;
6 R: c0 l$ J/ o8 v
bool bDest = false,bSrc = false;
1 E ], u# n% t8 S" R
for (int i=0;i<MAX_INVENTORY;i++)
3 U2 S4 [* r D6 I
{
, L0 Y3 o; Q+ D) u3 {
if (dwSrcId == m_Item.dwId)
& d! x! t3 t5 M
{
7 ^2 S g1 b# y" Z- L
//id相等 则 改变对应的dest和src
) M% Y4 E) h* r' Y% \
nTmp = m_Item.nIndex;
1 Y9 C, G/ a; P& @1 ?9 u9 Q
m_Item.nIndex = dest;
1 q3 }$ G; t) K6 I- j% l5 ]
}
1 U) ?! h6 |8 l6 N8 T5 Q
}
" R, U/ e3 }: @, D. ?1 t
//临时数据保存完毕,交换开始
+ T+ w* ?% w N* C5 i1 K$ ?
for (int i=0;i<MAX_INVENTORY;i++)
6 F' z4 S, I8 E; G) J
{
* I3 N( `8 e4 I r. a, h4 l3 n" Q( C' H
if (dest == m_Item.nIndex)
: p' g5 M2 b6 w" ?4 {& K
{
3 Z& c! o$ t& J1 N
//id相等 则 改变对应的dest和src
# h& o. a8 L, g2 g. e9 n5 |) P! b
m_Item.nIndex = nTmp;
& G! a ]( L, F' n
}
3 H7 d8 Z! `- d* z: z# K
}
5 R( H( ^6 F n3 Y! \8 ~1 |% q
}
# Z. [+ K5 H* R) C1 m+ D. L( E
};
; X8 }. Q. m! V% }! f4 F
-------------------------------------------------------------------------
* v. f1 ?% y: |8 f
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
) k: S6 b( `$ G# i3 Y
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
0 \3 X1 ?3 ^: O$ X5 c; r' u
紧靠其上添加:
4 w' c$ ]$ N% g n, b+ x: v* s
if( pWndBase == &m_wndMenu )
1 Q" r9 l7 u- T. v
{
$ v9 N- J, a% f% @2 y
switch( nID )
; Y# D& A D3 j
{
$ K' Y# N) ~* h* e5 F4 D+ c
case 2:
7 F) h- ^- q: Q s: H! T! |0 ]
{
$ q4 z' D6 R. W8 b$ m7 u
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
( o: J; M. j. }* c
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
, n R# y% } n) U* r
{
- T* G# j( l1 F! Q# j+ v& S
break;
6 [5 G1 k! C) q6 j0 ~2 R! ~
}
& f2 }8 Q# \8 |, A B K
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
9 W0 r! {8 U# j! t% L
{
: u8 u( e1 q- S( W8 K9 T3 W6 k/ Z
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
% z5 q$ P7 \; P4 H* h, l
if( !pItemElem )
0 ]0 Z- ~& }* o0 q1 n2 \
continue;
5 c' I) \/ J/ x- G6 I0 I
if(pItemElem->GetExtra() > 0)
q4 T: S$ c6 J/ [! \) v7 m
continue;
/ O6 a" r! y+ O! c9 H# {/ G5 W8 F( K
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
4 z: {. N6 v, N* x* H1 j" [. w
continue;
. B5 R# Q3 z; f- w6 {* H5 B" s
if( g_pPlayer->IsUsing( pItemElem ) )
6 Z8 D( u% u4 r6 O( J6 E* b# H
continue;
8 X5 {" w0 f# ]. p3 y( a7 L+ d
if( pItemElem->IsUndestructable() == TRUE )
h& t" v, J" P7 }
{
0 f _) x! I1 a' I6 w5 g8 ]
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
. O% g% e: J5 z1 X. S
continue;
$ w9 @; I" h ^4 S4 V
}
6 ~# X7 S( F6 {" u" R1 l
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
6 D& |& e" @( U1 m
}
/ w4 M6 a7 ?1 ]. X
break;
, T$ f7 m$ W2 P. F" y
}
2 n, A1 s% {; j4 W& a6 L4 |
case 1:
2 e0 }0 M" V! u3 J
{
8 ~) P+ G; R( @; c; x% Q/ {
//整理背包
- V, g9 |' Y" l: ]
//////////////////////////////////////////////////////////////////////////
: Y+ [% T$ G3 O) A% y% c9 w
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
" r) d9 t Y, O9 @' d& ]0 @" d
//////////////////////////////////////////////////////////////////////////
6 ^9 j1 z1 l% o6 S
//////////////////////////////////////////////////////////////////////////
6 \! p7 ~1 G" g- t8 U/ j
CInventorySort* pInvSort = new CInventorySort;
/ P) A; m$ F% s) t1 {
vector <sItem> vItem;
( l$ h0 x3 y4 I, z6 s+ n6 N, i
vItem.resize(MAX_INVENTORY);//初始化大小
" @6 d* }6 G. ~0 E, j
//////////////////////////////////////////////////////////////////////////
, r* [# i: Z1 H. n
//填充数据
: s5 l2 O; X0 e Z2 x' P I& g7 `/ E; K: g
for (int i=0;i<MAX_INVENTORY;i++)
9 D% L' n w0 {
{
9 f8 e0 \9 V" ]0 d& I) Z7 m
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
+ g6 k) ]( Q* J
if (!pItemElem)
, L! P4 ?: ?" y+ [3 ^/ Z
{
* \$ o4 v6 W+ J! D" B( G7 Z
vItem.dwKind2 = 0xffffffff;
7 D0 X& y& n. Z
vItem.dwItemId = 0xffffffff;
1 f4 v5 q% k+ l+ E6 f9 d; B3 o& f
vItem.nIndex = i;
! P, z- Y% X4 @ n, ]$ S
}else {
6 d4 A0 ~$ Z5 C/ F9 e
ItemProp* pProp = pItemElem->GetProp();
. m3 X3 ^8 f( ^% ~4 L1 u# a/ h
vItem.dwKind2 = pProp->dwItemKind2;
. l% \" z2 t4 O" Q/ k$ e
vItem.dwItemId = pItemElem->m_dwItemId;
3 W0 T- S8 z, F+ c, S/ j- ?) c
vItem.nIndex = i;
* p1 n9 C# c+ j0 f
}
- V% O( N p3 R
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
$ _9 T( S h7 t( N
}
$ O/ O* R# F) f' y
//////////////////////////////////////////////////////////////////////////
: F+ R$ o7 _- x4 C& Z6 f8 `( b- G5 J# o
sort(vItem.begin(),vItem.end());//排序
6 ^3 ]2 o2 b' S% R4 e
//////////////////////////////////////////////////////////////////////////
; d c+ v6 ]1 Y( C R+ X
//交换
, |$ S+ _& F! e
for (size_t i=0;i<vItem.size();i++)
3 S& b! }# P8 A5 A$ M
{
4 z. \% v" A& k' d$ P1 u2 ?
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
1 H9 C* K5 K* n0 z- K
pInvSort->Add(vItem.nIndex);
& y9 z7 ~2 k2 o; S% U
}
6 Q! ]8 J! @$ [, o4 w
BYTE nDestPos = 0;
$ \ V Z& p' [
for (int i=0;i<MAX_INVENTORY;i++)
# m5 n, X* L3 g
{
9 b/ U3 M3 f3 ` ^* y* K Q& E
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
% Z3 J) }* C9 ?% G3 B3 F
if (pItemElem)
4 I% k/ K% g1 _; y( V
{
: J) j ^" P' f' Z3 {5 ?% J0 f e4 t
if (IsUsingItem(pItemElem))
g. q; P* j; E1 D9 N
{
8 Y- X: n% A+ v+ j' R) U- |
//这个位置无法放
2 k, e) K! s6 s
nDestPos++;
4 ^+ O1 ]: I8 [+ v5 k
}
+ D [7 e3 @9 I
}
0 {4 P& ~) j1 r. F
BYTE nSrc = pInvSort->GetItemSrc(i);
( M' a" C2 J5 a" z+ r8 q( a, ^
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
# W# x) d5 _& q3 \9 [
if (pItemElem)
' H7 m/ o3 c ~3 o3 Z( p" T1 o
{
& k% t4 N" X& {4 X
if (IsUsingItem(pItemElem))
* \9 |2 u K$ A6 a8 F1 s4 f4 h
{
+ ^% t/ e A& ^: q0 R- m* `3 W
//这个道具无法移动,跳过
1 t# V4 E# t* I$ l2 G
continue;
^5 T9 A+ ^ E$ E$ v
}
6 Y0 j- k( {7 Q- x8 g: q, A
}else{
9 _5 P+ h) j. \
//空位置 不用动
) y3 R4 t7 F9 a% Z' Z( g# c
continue;
/ Z' Q. Q8 G% u$ r- F5 T1 I
}
- E' i2 U, J! k$ D
//////////////////////////////////////////////////////////////////////////
; S9 D2 E8 B* A( R' Q$ m
//开始移动
k! f- z6 q7 J2 U( m& H+ K
if (nSrc == nDestPos)
/ X- \2 n! e; h( g3 L7 ?
{
$ y4 n1 F# I k% }7 N
//原地不动
5 b% G4 R% N5 F3 J. r
nDestPos++;
$ i# v7 o# Q+ a \1 f, U% N
continue;
0 S- U) {: R- s3 f) c! g
}
% J% E5 A' ^ r+ H) |/ M
pInvSort->MoveItem(i,nDestPos);
% P! i1 i" S5 K! Y7 ]8 Q9 ?' |; Y
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
3 M0 D) R p, P
Sleep(5);
8 I5 t9 @$ B6 [. y7 j: I
//Error("移动 - %d->%d",nSrc,nDestPos);
) ~/ D6 q* `6 O; ?- \
nDestPos++;
) b) n) ^8 U( [3 s% M
}
) ^0 |+ C: L& W" _2 G
//取第一个元素的信息
+ ~- U* F& ^. V9 ~5 y# Y0 W
/*
+ R" t$ }/ L& P5 @4 W! k9 v& G
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
0 H3 F& ]; u! t/ a8 M$ u g e
{
1 m) [3 Q6 J/ b0 m+ v+ O0 R+ W& W
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
; z+ a2 [. N- H, G: @1 x6 D
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
+ E+ Y G7 l U! Y. c; f7 U
}
: k! I" a1 @+ ?5 _! o- z2 j' \9 c, N2 N
*/
2 Z2 r7 j) \ A( m3 u5 x& K- x
//////////////////////////////////////////////////////////////////////////
3 I1 N, h3 h: { o
break;
: R( O. T6 w3 u
}
6 G* m8 s3 p" c; y' P
}
8 W8 l* r) b$ Z$ s" Q* A
}
$ H& A2 M+ C! B6 K8 v
m_wndMenu.SetVisible(FALSE);
4 N. B% } K$ K* K8 {
- X2 C0 @) l# \ U0 K; B
--------------------------------------------------------------------------------------------------------
9 A% x0 h- ^4 ^. O
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
( ]3 b% Z* ~( G. Y9 b1 a5 ~
{
7 L: G$ d! y( C" e+ n
BaseMouseCursor();
9 u! f. t, e: S. ?3 D
}
* y- L& A4 F' o% k6 Q
在其下添加:
* w6 ~; i: d( T9 P
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
. s. P0 H9 u) g" j0 ^+ a
{
0 I0 A' V3 i, [- @3 N7 M, @
m_wndMenu.DeleteAllMenu();
* |: K; t8 U: E) G
m_wndMenu.CreateMenu(this);
) d" h; X) [0 k0 W; e% V! v
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
; z3 }! L: f5 h, a2 x4 c
$ I X/ u: b7 y: N/ ^' G
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
) g! H' _1 h! g& N& K
{
( A8 n7 c! I2 l0 |0 X" V
//P以上级别才可以删除所有道具
& i* l& k. S' ^" z8 Q
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
6 s" V$ K+ {# C1 D
}
- N5 _# Q. R! M% F' i
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
& x+ O' N, Z4 m- D% R! N
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
" _4 B$ u% I/ i# U
m_wndMenu.SetFocus();
3 n8 b( U2 ?. P. i! }9 K
}
# ]! s0 _2 O7 {3 J7 O
------------------------------------------------------------------------------------------------------------
, I8 y& B+ _: T% S0 H
*************************
, c( a; K; R" _- ^
WndField.h文件
2 J* {" }! w4 Z) V j0 X. [
*************************
) S+ z# A) j. W3 ?! c5 R2 F4 S" o
搜索:BOOL m_bReport;
; ~8 A. k' n' C) z; U
其后添加:
1 f- z- G! H% w" d
CWndMenu m_wndMenu;
. B+ }7 w( L, f! ^7 N0 a
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
! I b% h# W9 }" `. `7 e
其后添加:
8 r( F* j8 Y7 b9 j* Z" P; U& B3 ~
virtual void OnRButtonUp(UINT nFlags, CPoint point);
9 R( D% G3 ]+ P% m5 |. `' e
: R9 f7 X3 V& _( E" J
! j. L: j: q8 _) D0 e
欢迎光临 飞飞世界论坛 (http://www.ffwold.com/)
Powered by Discuz! X3.2