飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
7 r% R$ j8 O1 H# Y
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
! r0 _5 U3 j a. Q$ f
& p" w* Z' a7 ~) f7 z t. N: Y
struct sItem
, g- U: E0 W7 {
{
2 U0 v" Q. Z' V0 X
DWORD dwId;
, h# A; A5 u, \" W7 D0 j, t
DWORD dwKind2;
7 q( ? `0 b9 S. a' T3 t; y, z
DWORD dwItemId;
: U8 ^ F# `) E
BYTE nIndex;
% E' v# c* X/ x# r
sItem(){
2 P; `6 N2 |/ N4 g: L
dwId = dwKind2 = dwItemId = nIndex = 0;
" U$ N) G2 T# j @$ @; ~
}
' u4 ]& l6 `& G, P7 W9 ~ |
bool operator < (const sItem p2)
4 i6 H2 F3 m9 ?' Y9 T$ r9 D
{
7 J8 z/ u5 ~8 v, O0 y/ Z8 u* h* g
if (dwKind2 == p2.dwKind2)
4 k- p/ Y. U, c6 ]1 ?9 J4 \* r' x
{
2 ]3 t9 M, f8 v
return dwItemId < p2.dwItemId;
. J2 U, i" w( |6 G( M! @
}else{
, y, c! F$ M% J% B
return dwKind2 < p2.dwKind2;
1 {3 N$ z$ B- E; y
}
( q! @0 i4 P/ T, n5 N4 y$ a
}
i+ c: t9 K8 h* s- Z/ V
};
; C% S: `" Y. j
class CInventorySort
2 h- |/ I7 D! t# P* I
{
6 N3 i, K- O/ g" ~
public:
; z0 B1 g8 Y$ y
CInventorySort()
2 X8 h" ^7 }8 Z, O7 c# u
{
! F6 I3 @ x: v T& Z& M
m_dwPos = 0;
) Z: H3 s+ A9 x( a" Q
}
1 E' [$ V' b9 B$ T% w& I+ S# D8 U4 I
~CInventorySort(){}
% N5 t5 K/ j% u
private:
& t$ Z/ q( a% Q3 B" F; `% F6 N
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
; ]1 O. S. K6 E9 S' y4 a O0 P
DWORD m_dwPos;
! x: Q( O2 K" F ^. Q$ [3 C
public:
% a. `. ~& e R. v2 n! S! }
void Add(BYTE nIndex)
: o% u9 I+ w- ]4 q4 k
{
3 w3 p, J% Z* b, F
if (m_dwPos >= MAX_INVENTORY)
" l7 A o- M* Q& B d- Q
{
9 q2 S5 ~8 A' H. v) u
return;
2 S$ h0 X: V. Z+ R5 {, g: p3 Q# x
}
8 x+ I( ~4 D( g; Y# B2 ~1 Q
m_Item[m_dwPos].nIndex = nIndex;
5 k: n b V5 P
m_Item[m_dwPos].dwId = m_dwPos;
/ T& m% I0 B( a* t+ u
m_dwPos++;
4 [+ T7 G' A; x. k' D: A
}
5 M, n/ H6 b9 O' v% Y
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
j6 B0 @& h; P8 I4 S4 n
{
' H1 g3 M$ F- G1 ?5 j# o6 j+ I
for (int i=0;i<MAX_INVENTORY;i++)
2 ~2 S0 C: D7 Z) ]3 o' j4 m5 N& [
{
1 H! d1 u2 e$ D9 q2 l6 [
if (m_Item.dwId == dwId)
, E5 `( j: r g2 c5 x3 G* a
{
, I4 a1 g; E. A8 N2 D1 [/ R
return m_Item.nIndex;
* j0 J7 d* m- z+ q$ n
}
6 ] _1 r# K" a( L2 C
}
0 D# n4 T- L1 V) |) R+ e* s9 H; D' K
return 255;
, |+ V4 l( e7 u! A# h5 L& ^2 k% F, m
}
: j2 e# U7 A7 |7 t1 l+ d7 H
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
' e; b* c( P' X, ^0 W( o5 W
{
: U$ z- n' q% j
BYTE nTmp = 0;
{8 v* t5 J/ [% }& B
bool bDest = false,bSrc = false;
% y8 `. R5 y# R! t# m7 u. W
for (int i=0;i<MAX_INVENTORY;i++)
( i! H' l5 g; b$ e
{
% L3 c- n' M8 U. H( j
if (dwSrcId == m_Item.dwId)
3 S4 P0 z* z3 b! Q: ]) B
{
4 O, ^$ H6 U; [) ]
//id相等 则 改变对应的dest和src
& g1 V7 K: [* k3 ~+ j2 T6 k2 Z! G
nTmp = m_Item.nIndex;
1 J; M& V# @5 f0 \! S9 E* ]
m_Item.nIndex = dest;
! R" k3 J8 r; H
}
8 p! \/ j5 d- a- E! U" @
}
: G9 T( c3 x+ p/ k% S9 X7 z% @
//临时数据保存完毕,交换开始
5 d5 |) F1 P7 R5 |0 L. ]2 f
for (int i=0;i<MAX_INVENTORY;i++)
% }3 ]- g1 K+ A) O4 W, v& j- \1 w
{
8 g" ^9 C) r! L
if (dest == m_Item.nIndex)
- v, m h) X/ b' P4 _: J/ }
{
, l" g# S7 f0 w8 E) k9 n
//id相等 则 改变对应的dest和src
+ n7 V! \9 J! {
m_Item.nIndex = nTmp;
9 }( H9 G: h2 k% O/ ?" P3 m. @
}
" H; `' z$ ?( g S) _. b
}
+ B2 I: ]2 V$ n. f0 @
}
7 D2 ]. g; I! f/ j! j' E$ a) K# p
};
1 M; q- n* O- [' ]
-------------------------------------------------------------------------
: \6 Z- k" F. Z6 i5 w! \, P3 y
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
: _6 z$ \, [2 V: R$ K
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
! I( f" ]5 P# o! m) J
紧靠其上添加:
: A2 m. r) L! \6 F% M
if( pWndBase == &m_wndMenu )
3 V9 Q% i& x ^. B$ s
{
+ b- N! `3 Q0 J- E
switch( nID )
1 r) i1 G- i$ P u9 t2 y
{
* l2 }% i1 S$ E- A9 u
case 2:
9 _; i6 d" C2 m' t/ }
{
m9 L. K: z7 t& U
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
+ S. P3 D& I" O% X7 z7 h# Q. i
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
C+ ?( z# F- `8 ^
{
, U L3 G) F& t
break;
/ g% X# |# c! }* m# r
}
" O6 z+ b* T. F( O& J/ c5 S
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
6 t ]! s# M" X% A7 u. L) ^+ _+ \
{
/ s d6 d! ?2 T5 ~6 q
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
# B% `. N( x+ \! f( S, a
if( !pItemElem )
" ]: d! r. n3 ^- q
continue;
! r6 U5 H6 C8 ^- e/ Y
if(pItemElem->GetExtra() > 0)
: w: i# q+ {% u& ?/ R% [
continue;
- A4 N' r& v6 O: }, R' u$ v* n/ F. Q8 W
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
B9 v( A. H- k$ T* ^/ _
continue;
, v) Q3 ^& ~! `
if( g_pPlayer->IsUsing( pItemElem ) )
0 S$ m- q" i7 Z5 C: ^2 Q: N; l% L4 s$ a
continue;
; q+ V3 A6 a! m
if( pItemElem->IsUndestructable() == TRUE )
. r7 `6 r' K: o
{
, ~& t K, X8 \4 ?) p: d
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
/ g; ]8 t" D K' }: ]
continue;
6 A: U( b/ ]& U4 S5 W; j6 o
}
( W$ U/ f( q2 j" c: [0 Y3 N5 p
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
- K, e* o" Q+ `" N8 {0 F
}
$ ]+ E T' S8 l# K
break;
$ G) R- S! [2 y0 H
}
/ ]$ S& e. O4 s# ?% X9 t
case 1:
: `; a) j8 F; n) x
{
+ s' R5 ~/ N3 I5 n, M. k
//整理背包
0 N2 S4 l2 J! H% A c0 K
//////////////////////////////////////////////////////////////////////////
' X2 t' t/ Y5 a% x; r0 R
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
. ?( {& N+ Y+ G& {/ L8 [" J) e
//////////////////////////////////////////////////////////////////////////
& i/ r6 E: y' G% O4 o
//////////////////////////////////////////////////////////////////////////
4 n! L+ Z$ S, @
CInventorySort* pInvSort = new CInventorySort;
7 K, U. i7 c- M% g8 ~
vector <sItem> vItem;
- n. f1 x# |! [4 f, I
vItem.resize(MAX_INVENTORY);//初始化大小
/ ?/ a& @* F( b
//////////////////////////////////////////////////////////////////////////
# c4 \, Z/ @& Q8 S: _6 ?
//填充数据
; l6 G# j r7 C6 q, i) A
for (int i=0;i<MAX_INVENTORY;i++)
4 s( W1 `, y- Q
{
8 g4 a& S, p" M
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
2 V% l2 e. r3 A: x- j4 i
if (!pItemElem)
# D: e) C3 d/ v6 y, r) s
{
7 t, z) U% o" G0 Z9 B+ M
vItem.dwKind2 = 0xffffffff;
! r& O) {& t; U/ j
vItem.dwItemId = 0xffffffff;
* P( x* q$ `$ L; A/ j% l
vItem.nIndex = i;
/ U" }7 v& _, ?! O# X( k4 S
}else {
4 g' S2 A. j- Y% l9 E% t
ItemProp* pProp = pItemElem->GetProp();
4 k* W. m1 x8 f
vItem.dwKind2 = pProp->dwItemKind2;
+ s2 r& ]6 y" S' `: n
vItem.dwItemId = pItemElem->m_dwItemId;
, ?- @' K3 m% I H; j9 w0 \
vItem.nIndex = i;
. k) R6 X& b! q+ I" W; C
}
+ p [) z% w$ A# D
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
$ P6 ?9 o0 Y, P! l2 B5 T5 ^# A
}
- T& Y% S! D, i$ W7 X. d h* ?. O
//////////////////////////////////////////////////////////////////////////
: u2 S" q+ S7 k
sort(vItem.begin(),vItem.end());//排序
# H- o# H& \. N; e9 G) v/ n, _
//////////////////////////////////////////////////////////////////////////
# B3 R1 H* R2 y# h5 l
//交换
; r- @8 z* T% M" |2 A8 C+ I
for (size_t i=0;i<vItem.size();i++)
/ v! I k$ M3 D, O `# i2 H8 g
{
g8 X4 @& P# j* x
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
. v* z9 ~$ q) v3 J
pInvSort->Add(vItem.nIndex);
8 U6 D0 v" _ J" J
}
; }) d5 x K7 O/ d
BYTE nDestPos = 0;
$ Z# z1 v: S N/ L& N- O: S
for (int i=0;i<MAX_INVENTORY;i++)
# q/ U$ N! d. O# \& c( `& q
{
$ L6 _0 R2 t6 H
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
. t9 ~' h4 P# R( `
if (pItemElem)
" k% E) v& [4 o
{
* `& Q% v s J' a0 t* E, K L
if (IsUsingItem(pItemElem))
5 s7 n- S2 m4 J# g- ^3 v
{
$ [# ^' H+ J6 z- q; q4 k
//这个位置无法放
. ]8 \! C% f# E5 U" O
nDestPos++;
9 X9 R/ R1 t2 }; a e! L8 h
}
9 B8 g4 H5 S- D& \7 T2 c% v
}
" w2 r" ]" K$ F1 V' Y
BYTE nSrc = pInvSort->GetItemSrc(i);
2 m$ L/ P K) I# U
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
" y* b7 T- g8 G: N, I4 o+ p
if (pItemElem)
; @2 W/ t" ^5 Y9 R+ D2 q, D, q
{
0 O" F1 w: G3 _+ [. _% X5 ~ ?
if (IsUsingItem(pItemElem))
& h; N+ h/ m$ x! g' y1 r: @
{
; c) U6 I' I" P, D& a( V" X4 G) l
//这个道具无法移动,跳过
0 @8 O4 ^; e+ v( O$ W) i
continue;
* [4 v% ?3 J- Q' A7 w2 _
}
% s7 H$ Y a- i* s: A
}else{
, I/ C% J: C( p* P5 G, a# O
//空位置 不用动
3 p+ i* ~, }( S8 x3 Z( @2 ~ K
continue;
7 X$ B& @8 Q9 p0 _# y) g# K( p8 I
}
2 e A! B# d* O% V, t! T0 Q
//////////////////////////////////////////////////////////////////////////
/ P! G, f' S( o+ ~) q2 z
//开始移动
% F* g! d# [$ i. C3 e' K
if (nSrc == nDestPos)
8 L# L* l- X6 @9 O" J/ o6 A
{
8 o6 H" g7 l7 n1 b
//原地不动
: S+ L2 E: D, L. W. n r& j: s
nDestPos++;
, d0 m5 `+ b1 ~5 G
continue;
) u# V% F& A# r* ~
}
" _% g, C% G1 f
pInvSort->MoveItem(i,nDestPos);
& \: p3 F C q2 {2 D
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
% |5 |# V! b3 R. d( C# @$ g) h0 F9 y
Sleep(5);
* V) _. i& e% ?
//Error("移动 - %d->%d",nSrc,nDestPos);
/ Z) {. _6 M _5 _5 C' `/ }) s/ x9 ]5 d
nDestPos++;
- O2 D1 C8 Z9 j2 _, z8 M5 v
}
. K8 g \) k. z- d
//取第一个元素的信息
3 V; U: F9 [! T. z0 u- f! j- r
/*
Q4 \& Z1 o& |' ?! H; b+ v3 ]
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
) l7 ?$ t: x$ W& n: y" N" \) t, B/ q
{
! ^7 V" n9 H3 N: F7 j
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
8 ^3 _. c( y& T6 S/ u& F
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
( D, N$ Z0 d- M% a$ u8 b1 T7 R# c
}
+ l7 l2 ]) A, B! U7 n
*/
* }- q3 C; i+ e9 D
//////////////////////////////////////////////////////////////////////////
6 g% z3 }# A* F4 w- ^: h" | O
break;
! w, `8 p8 ?& u: D& L; x! W. d
}
+ a( [/ C; S7 @
}
! y. w8 ?; H7 t' j, _
}
; B3 I ~# l1 ]+ U
m_wndMenu.SetVisible(FALSE);
' ^% e) f8 m A
2 [/ i0 g5 j3 R* o0 r1 Y+ }
--------------------------------------------------------------------------------------------------------
/ L$ L: ~* m' ]; e a) p' L
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
$ B+ u/ Z& e+ |# _; C* G( E/ F
{
1 _. \9 ^1 K; F1 f
BaseMouseCursor();
! L' g- T- t1 D
}
' e7 E a# H1 ^3 K: o
在其下添加:
# V0 E# l* K9 M2 m' _8 _& ~3 T2 D/ B( w
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
- J" {" A, \# Z1 P
{
, v0 m0 Y# z. w; d
m_wndMenu.DeleteAllMenu();
8 q. F2 G+ f4 r/ j' u4 d' F2 K
m_wndMenu.CreateMenu(this);
( f( H2 l1 N, S% s
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
k/ y; R& d4 B8 k3 ^* W; p
7 {) x0 o% `7 b4 W* b
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
$ [, l; C: l( u
{
0 p. X: [/ P4 @5 l
//P以上级别才可以删除所有道具
) @$ d& B. W+ T' C' T8 O
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
1 d- K& E' b! d6 Z) U6 w7 e
}
* H+ g' ~2 n7 P I! `# z5 m
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
/ A6 M/ r% f( z
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
" I: Z5 `% Q- c* z
m_wndMenu.SetFocus();
; y( a/ p5 Q9 Q: D) `; F- E2 k" I5 W
}
9 Q% _4 J5 a$ {& B
------------------------------------------------------------------------------------------------------------
A6 |) `# h/ i3 ~1 V1 `
*************************
: L5 |) }* W0 A4 \
WndField.h文件
& A6 X2 J( b! g9 [# R: `& _
*************************
$ H& F7 c- ]7 y. o1 S/ S( T+ @
搜索:BOOL m_bReport;
5 N5 D7 T! T2 i( w1 [" ~
其后添加:
( ?% R' T. g6 |. F0 o! J( t
CWndMenu m_wndMenu;
* @; W* X9 ]. \- K* Z# n/ V
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
7 S; Y H" T2 V4 {8 X5 `
其后添加:
' Y; q8 U0 [0 \. F) b( r
virtual void OnRButtonUp(UINT nFlags, CPoint point);
7 y. Y7 B, w7 b f- u5 ^0 m7 |
; @4 l/ L4 v" {' q, | q
+ {6 A, V H" m9 q% G) f" X
欢迎光临 飞飞世界论坛 (http://ffwold.com/)
Powered by Discuz! X3.2