飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
4 o0 ?( S" R1 t+ U
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
* S( O; G; Z5 }8 k9 P# y; t: v- Z
\ W% q" X& s8 K* m6 ~& d% g5 Q
struct sItem
' q u( {: L2 s# ]7 S
{
# q7 l+ Q5 g) m+ P1 x4 d# I# H
DWORD dwId;
# R$ v! h# p2 M4 n4 d7 C* |, Y
DWORD dwKind2;
* c& P" d: s8 r: E7 X( r! N0 N
DWORD dwItemId;
& U1 s+ v3 a3 `' B4 F$ J W. ?
BYTE nIndex;
+ @$ Q9 f5 r' o! h9 U# l4 v
sItem(){
6 T- |" D5 D$ O# S$ n" u2 K
dwId = dwKind2 = dwItemId = nIndex = 0;
. |! G: p) @( `" H0 J
}
9 @+ ?4 N: E' d$ w1 x5 R
bool operator < (const sItem p2)
, m6 {2 }) u! i
{
7 P4 V6 M/ k" M/ B, v0 }; S, [
if (dwKind2 == p2.dwKind2)
: T; e1 J0 V- q) j0 _# g
{
$ J) U; {& k6 L
return dwItemId < p2.dwItemId;
: Q" k$ R2 c& H: @% n
}else{
- n. P$ |( k( e: ?# P9 w- o7 r. L
return dwKind2 < p2.dwKind2;
6 T: h1 _+ U5 ^' w/ S# s+ ^- Y
}
! |. j. Z6 @; i5 B* ]& h
}
2 E' W' J7 T' P) R( b/ D
};
. M' ?# O" v# ~. Y7 ^; B0 K0 f! H
class CInventorySort
0 s D1 p9 G7 o
{
+ J) A: U* d/ S6 w$ `5 m u
public:
1 F+ M* T" A2 t& x# l
CInventorySort()
6 m) W7 }& d6 w
{
. Z+ L p$ a0 w. N9 _3 f$ E' j
m_dwPos = 0;
0 C% S: ]* s2 a8 |/ H: U, _8 j
}
; O2 E) }& i, @& Z
~CInventorySort(){}
4 `& E9 ?$ e. v) F2 l
private:
" X5 @+ C& d7 G7 u; M% L
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
( [% x; `. F9 ~. Q3 e
DWORD m_dwPos;
" P* }8 s+ d3 _" A+ q; J% h
public:
g5 |, d9 S/ K' |) e* `0 [. g Q
void Add(BYTE nIndex)
& v6 e D% @2 o4 W: e" H9 X; Y6 j
{
- I# @, w2 i! V
if (m_dwPos >= MAX_INVENTORY)
& T* W" p4 R' P/ r, Z
{
2 [( L$ A& Z6 t, X
return;
$ G: |" p' Z/ y
}
5 F5 B a+ V" V4 \& N4 b
m_Item[m_dwPos].nIndex = nIndex;
i" |, ]6 a8 d1 Q' \7 h
m_Item[m_dwPos].dwId = m_dwPos;
: @; c7 ]2 a4 a* Y p
m_dwPos++;
0 j& m5 M; s+ e# _- U
}
1 O$ d5 ^+ j7 Z- _! v7 _9 E
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
5 P& g) R% M& y+ i$ ~5 q2 ^
{
$ O- b9 u0 l0 r/ n) E& M
for (int i=0;i<MAX_INVENTORY;i++)
$ S$ s5 ]( z% }; b
{
: }, c6 M! A0 x4 S2 k" Z1 J
if (m_Item.dwId == dwId)
- m9 O9 d; I U/ [# @
{
# y; }5 O# E6 w5 Y
return m_Item.nIndex;
; B* R- y3 K' g* {
}
7 b" l7 U* b# w1 v
}
" ^1 U& ?, J/ W/ x! e( g5 a0 I
return 255;
( T* P: I$ _3 I
}
* w. y2 P5 x- }! V& Y# E* v U
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
; I! b" t }! P5 D, c
{
/ \) T1 N9 {0 r. V5 C
BYTE nTmp = 0;
' ^4 j' o9 z% K
bool bDest = false,bSrc = false;
' U. k: d2 X) S1 s @: a: Y; j
for (int i=0;i<MAX_INVENTORY;i++)
- ?' H7 Z$ I) J8 B3 e. y
{
" \4 V, I& J7 P# r9 a: P. u
if (dwSrcId == m_Item.dwId)
. s5 V" K; o5 L" p! }) H/ C
{
% A" I/ d1 ?4 {7 G( U5 t
//id相等 则 改变对应的dest和src
# j4 g7 D3 R; @. T3 P J% U
nTmp = m_Item.nIndex;
- p F) N( e0 b0 n% f# \" u' [6 j
m_Item.nIndex = dest;
2 \5 @$ ], Q$ m' B
}
4 _8 ]' A; W1 j& U3 Z7 D: c: y
}
+ K) R- ^0 o- E3 p
//临时数据保存完毕,交换开始
# m$ o, k( ?7 I# [9 K
for (int i=0;i<MAX_INVENTORY;i++)
* q% A( I* G& h! i' `& h7 @0 N5 s
{
. ~$ i# U5 W# Q1 \8 R# y, p$ g; f+ K4 T
if (dest == m_Item.nIndex)
% W. z7 i9 @' L, b/ C
{
& ^% |5 N- N# o; V7 X. h4 J5 o: M
//id相等 则 改变对应的dest和src
4 s/ r% G! h9 Q; n
m_Item.nIndex = nTmp;
9 B& G- E' k K1 {
}
7 `) D2 r5 K3 J! X" ^
}
% g# W4 c" B$ J4 i
}
! w% j0 ?5 d- ~3 R. t! {
};
! m- o4 s! _8 ^7 n: n& ~/ R- l
-------------------------------------------------------------------------
, @' d0 }) |5 J9 [+ f% W
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
# w4 g8 Q6 y2 v$ e3 ~5 r
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
9 C8 I, H& C3 J U
紧靠其上添加:
! J3 b- k& e" I9 ~6 O2 T
if( pWndBase == &m_wndMenu )
& A/ S# S; ]. _" L8 @8 P
{
/ j, J* z7 K* e3 {. P9 s0 e
switch( nID )
. K8 X$ j5 x0 B+ ]' A: T
{
) q$ m" p; O9 C2 P- j
case 2:
?! {( Z5 j/ f( V
{
1 S% R" j3 [$ ?$ {( t
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
; ~5 d) J) g; r1 S
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
0 i/ Y. L1 {4 v, D' D" Q# G
{
/ N0 K; A$ O l3 { \0 N
break;
, \1 P) s/ ^) N4 t" F1 a! H
}
: _! ~, x6 L$ q, H2 n
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
# w1 D$ q) [: W0 d- b4 J
{
8 Q1 X( {% i: e) L' m$ O$ w
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
9 L% W2 F4 z8 O# _, G* A
if( !pItemElem )
8 |7 v& E! i; a" V% h) L- B9 M
continue;
3 k4 z" m E+ i5 T2 i3 c
if(pItemElem->GetExtra() > 0)
/ Z: _ E8 D; g# F- n0 j$ f
continue;
5 h( [% [& k9 L; J6 O& Y
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
/ Y) B4 C2 F% \( X
continue;
1 Z1 l7 O0 x* M) N2 C
if( g_pPlayer->IsUsing( pItemElem ) )
* E2 B! t# |; n1 D2 }( r
continue;
, K, G$ B# S2 E& s. W) B
if( pItemElem->IsUndestructable() == TRUE )
4 y. c$ r" S- {; Y5 t
{
" p2 c8 q& N7 @
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
3 a) n+ s/ h' }+ [
continue;
: P3 O3 ~7 D1 ^" t6 }
}
|/ E. Z2 A4 q c
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
8 W/ R5 G9 B" [% O8 b5 ?
}
$ n( b" J; H$ `( l. W! I4 C! l: O
break;
7 h* Q2 i7 ]$ q
}
" V# t Q! s3 O& t# ?
case 1:
( O9 r; U7 g5 x, r$ t/ K0 K
{
: |2 J& S/ I+ }# z7 E2 w
//整理背包
# v3 k, u7 W$ i. ^4 o, k
//////////////////////////////////////////////////////////////////////////
! ~5 [/ }+ G3 c. y
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
/ a$ |, D# Z) g
//////////////////////////////////////////////////////////////////////////
/ T L- j0 ~( c5 ]: ~1 H" ^
//////////////////////////////////////////////////////////////////////////
0 P. P& e' g3 K7 r
CInventorySort* pInvSort = new CInventorySort;
* v# q* ]- y& A$ t6 r. W+ [; b3 L
vector <sItem> vItem;
, A0 i0 T- ?- Q4 ?( {3 H
vItem.resize(MAX_INVENTORY);//初始化大小
- r0 q; {& p+ O% [5 k
//////////////////////////////////////////////////////////////////////////
$ t2 f0 _" v+ n b
//填充数据
" B1 j0 Q |( C8 Y6 ^; U: h
for (int i=0;i<MAX_INVENTORY;i++)
: \8 p, N0 s1 R2 S* W! L: l% L
{
6 P! ~$ |0 f/ Y/ z; H% l
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
5 M) a" }+ j! R, o
if (!pItemElem)
) h7 X" V* R% f# d- D7 `- f
{
; K0 C( ], k$ [$ a
vItem.dwKind2 = 0xffffffff;
7 P9 ^, m) ~" a# O# D
vItem.dwItemId = 0xffffffff;
% F) Y) p" b! _& @% O
vItem.nIndex = i;
# z, C1 [9 i7 ~& d- K- Q L
}else {
6 F+ B5 R8 ]% j# r: o
ItemProp* pProp = pItemElem->GetProp();
1 H( _; w, ?' P. U- {+ v
vItem.dwKind2 = pProp->dwItemKind2;
. ?8 z8 e9 M, t: ~, f2 @2 n
vItem.dwItemId = pItemElem->m_dwItemId;
5 H" S; c9 c5 q$ c n
vItem.nIndex = i;
. ] s+ z, @6 E% v) p
}
! ?( \# Z% P& C% X9 ?* G% k% o) I
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
" q$ v3 H) E1 y% ~
}
0 C: [ z* T/ B; l; K X
//////////////////////////////////////////////////////////////////////////
* S4 g8 m' U! q0 C, {
sort(vItem.begin(),vItem.end());//排序
. N/ N' k# J2 m) u0 R
//////////////////////////////////////////////////////////////////////////
# Z4 {1 e" ]( Z( J( K
//交换
8 l w. Y& P* [. B
for (size_t i=0;i<vItem.size();i++)
* \6 U! _0 M% Y M
{
* y: B4 k# S6 c4 Q) l1 j6 a
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
J$ c$ Y5 P% R
pInvSort->Add(vItem.nIndex);
/ k( W9 Z; c( Z6 p4 E
}
# U' h2 i! `1 H' Z
BYTE nDestPos = 0;
: Y" b# M! j [$ U3 V0 z
for (int i=0;i<MAX_INVENTORY;i++)
X: M# j5 c; u' x+ U
{
. P: s3 U" F; [0 X' `6 F
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
7 X9 Z+ r3 L' {- w# z
if (pItemElem)
" o$ K5 q m3 l* w) ]( W# l
{
4 k! I ] A- i
if (IsUsingItem(pItemElem))
, t$ O: }3 { N$ u; G3 z; B, C. a8 K
{
& B1 x( R% B7 {( E
//这个位置无法放
8 J# `2 r* o" U" Y% N0 D
nDestPos++;
) P Q" V" K d; `7 [: i: Z
}
' M4 g6 j3 O7 Q, T$ i1 S1 N- P
}
8 x, @0 O' _8 j9 V" E5 T, Z
BYTE nSrc = pInvSort->GetItemSrc(i);
* t6 w3 `# z- t) n$ _. A
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
* A5 U" R; m6 B8 C/ {( \ L5 E5 `% [
if (pItemElem)
! U% `6 T$ r% a* l: [& T) G4 x9 S
{
' Q5 k$ V6 c7 O: r+ [ a0 S
if (IsUsingItem(pItemElem))
3 E& x' Z( [! E# _
{
- _: B( q+ i* X& F
//这个道具无法移动,跳过
+ t/ {* E& u( m8 D
continue;
0 ~6 ]( l: y, k1 F- }% B; H
}
7 x- A: q3 _/ G5 P1 u
}else{
6 D7 j; a y, q$ ]
//空位置 不用动
# r+ }7 V% D2 r
continue;
' Y8 u) o7 A0 r3 ~- F
}
8 i J6 b: Z% k8 y0 @, W
//////////////////////////////////////////////////////////////////////////
( _3 O/ W& @7 [7 @7 m1 W7 s
//开始移动
" Y! Y& t# B2 p" U" w5 m/ h
if (nSrc == nDestPos)
1 u% U# u: D3 X) g+ T& J0 u
{
5 P9 w! [, l# V3 r
//原地不动
2 u4 B/ q3 E$ N; {$ C8 t. L
nDestPos++;
% Y; `. o/ K. C5 R! |) V1 U
continue;
0 |2 D, p; v3 i9 d( B" ~' {: y
}
+ x* G# _) n& Z: m: @* G0 K
pInvSort->MoveItem(i,nDestPos);
5 `0 E4 X4 N: f7 p5 L+ T E
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
2 g2 s1 c& r7 r
Sleep(5);
; P% j: q! `8 Y' s+ j
//Error("移动 - %d->%d",nSrc,nDestPos);
5 Z, l4 N3 d$ H8 O5 C; X7 Y
nDestPos++;
1 a0 k5 ^5 H( V
}
6 a& F$ N3 y3 m6 F; F& F3 j0 x4 n
//取第一个元素的信息
- U6 t' B; G I; l
/*
* v! o* o: R) [
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
3 |" s. `8 `- z% S$ h7 @5 g
{
" ^ A2 |7 M! X: B6 u
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
" J$ @( `, }3 X8 H, Y
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
4 h& {! n- t7 D, ~
}
/ }5 M& Y" M$ n i! ? C8 g+ p9 |
*/
1 ~9 E: h# y; C& F6 z" ^2 {
//////////////////////////////////////////////////////////////////////////
. g' c2 @# o% Q0 Q5 g% J7 T6 f3 _
break;
, @* v) n) @: Y2 \4 Z
}
& G w/ I5 _8 [3 ~* ^
}
; c2 a0 h+ t7 g! t! w6 B4 p1 v1 H
}
P2 C* H" ]+ S3 N* B8 K6 S
m_wndMenu.SetVisible(FALSE);
0 G6 d1 R% i/ g+ W* @9 b c
" l8 a" w, z/ @, ]/ R9 P( J7 Z
--------------------------------------------------------------------------------------------------------
% R g B Z6 f( H
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
S* E6 _, A( i$ e: t8 k0 y8 @4 Y- B
{
# g, f, K* K% ~ m! [' I# K
BaseMouseCursor();
6 j, D; [3 J7 Y2 }, K @/ b
}
7 T3 V: }, U8 y4 s9 Q1 C- s" o; m% f
在其下添加:
1 G3 D$ S& c# w" F2 y( g
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
' r, `1 a0 n, ]; ~; `
{
& R6 m1 k8 o# q/ \7 u
m_wndMenu.DeleteAllMenu();
/ F; S/ E% h0 Y7 _/ j. g
m_wndMenu.CreateMenu(this);
' L& o* N2 g7 A+ w4 N) j' a
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
( u. ^# E$ @6 {* O# P
* I) `* s0 E7 U1 A* K% d+ B
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
5 |1 J& B4 z* A8 ~2 i9 x
{
- _1 X/ o+ I# j; H4 ^4 I
//P以上级别才可以删除所有道具
; _+ w9 u+ @& i: b
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
8 n; d1 z3 B/ n. |
}
* C6 e) s: @. _5 f# E7 L0 B
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
! p }: {) g9 a+ H* H; @
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
' P# H, I, y5 g. E6 X X/ Z
m_wndMenu.SetFocus();
0 l* \) C9 O% F- Q! ~. _& I
}
1 ?5 `0 }. |: c
------------------------------------------------------------------------------------------------------------
, Y0 D+ b) e( F! e6 I
*************************
; N6 m% h# {: z5 D5 `* l
WndField.h文件
4 R5 S" ~) L: j! t. D: K% o$ q# S
*************************
) ?0 S4 V. D+ y
搜索:BOOL m_bReport;
, m: R! a- X6 S/ h0 y, Q
其后添加:
0 w+ D9 w' L' M1 j
CWndMenu m_wndMenu;
( k7 k) H$ K' n* N
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
+ k+ A) _8 J3 G6 b6 ~
其后添加:
5 P/ L7 J0 [3 |/ p0 F0 }
virtual void OnRButtonUp(UINT nFlags, CPoint point);
& S" N* A& r2 Z$ _4 L
p3 u/ K1 o! j' g) P8 A
" I0 ^% Z/ j" ]
欢迎光临 飞飞世界论坛 (http://www.ffwold.com/)
Powered by Discuz! X3.2