|
|
源文件中_Interface文件夹下WndField.cpp文件, n0 h. i G# N" J& U: w
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
9 Q3 O3 _# \* V8 C6 V; l$ r1 q1 ]9 Z' ~* C- R, U- H
struct sItem
: y5 H' D3 x2 T$ u. \3 P{
- @' Y7 s3 I5 E4 A/ e9 O+ x U2 oDWORD dwId;3 k8 v7 R( ?; D6 E
DWORD dwKind2;: @% l# ~, k1 T) I! T
DWORD dwItemId;
2 f F0 U. j3 s- `* ^5 O5 jBYTE nIndex;+ n1 J& ~; \9 `& K& z0 J
sItem(){5 H: Q' N3 k/ F1 D# b h5 H) c" [4 |
dwId = dwKind2 = dwItemId = nIndex = 0;
0 H! Q- C. t H$ i% j}
- |8 t( Q- W' p' ]2 J5 { Wbool operator < (const sItem p2)- V. U0 X* P- Y9 c" j( K3 d
{5 p" T } J) H; K; H/ s
if (dwKind2 == p2.dwKind2) c$ K- W. r* F; d1 C+ o) v& [4 M# Q
{
" X" T) E J+ ]% [& L# ?' Y) N return dwItemId < p2.dwItemId;2 F' j- x& o$ d9 S1 _ L/ g; [
}else{3 c k* V) S5 p0 q% _ g7 c. T
return dwKind2 < p2.dwKind2;
5 q7 u, C2 d7 ?* H7 M& c }* `# n- F& L# ]. K" t7 e
}- N. E* z+ O/ b
};' }! g( ?% W! k( w& D# @
class CInventorySort, B) Y, v3 S) H0 E8 q3 ]1 o4 K$ y
{" d$ D5 o% d* m( d" E
public:
- e% D) q! M; w# dCInventorySort()
4 }0 J0 m- b- r* Y' ~5 G h{
" N" Q9 M0 _, h3 _( D2 r: | m_dwPos = 0;; e, |0 ^9 T! F% Q
}2 w0 a; ]' d& ]+ z. B# P! ]
~CInventorySort(){}7 H2 i: v9 K( v% d+ }
private:5 A1 D1 j4 F& N( n
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
: l8 ^% k, F0 v. \" WDWORD m_dwPos;
* `7 t# j8 t* rpublic:7 h$ P6 L* C4 z6 S
void Add(BYTE nIndex)
) G: G9 ^0 [2 ?8 s# ]3 |6 X( i9 b# h- v& k& t{7 {/ ^, O2 S7 ~1 P. ?& o* Z+ D6 @
if (m_dwPos >= MAX_INVENTORY)) D" z. [' e- M
{
* u/ V y6 o' L8 u B return; Z, M( _% E+ s$ f; Z5 M n0 F" ]
}4 }, T9 ~9 b& `& o6 X) z
m_Item[m_dwPos].nIndex = nIndex;
. {2 d$ J, a2 F( a5 E' [, E& K m_Item[m_dwPos].dwId = m_dwPos;( k: h f) J" j6 z9 M9 u
m_dwPos++;, Y Q! K) x- p' d! R
}: a7 F6 R5 G* @" i' \% }2 G8 L
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
3 l- g( z* p$ I: E* c+ s+ Q/ t{
' c+ F4 t- V* G) I } for (int i=0;i<MAX_INVENTORY;i++)
/ [6 C7 W" ~$ k5 u# j$ K5 G/ l {; F9 i0 ^# D6 s9 E% Z7 t
if (m_Item.dwId == dwId)
$ t J' ?- Y7 D+ y {& v6 m7 A# F/ a+ o2 d# E; V
return m_Item.nIndex;
7 S( U; O3 ^+ t! U/ L4 y }
V$ I2 [, M* H" j5 i+ i }1 n8 B/ |* m2 o
return 255;
% \+ Z: X( Z% T9 I7 A3 h* \}# k! e4 z- d! H/ H
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置; n; M+ p1 W/ d, w4 v+ V8 @( e
{& s4 S: b2 |1 U
BYTE nTmp = 0;
7 y) }' q$ E* u ~0 S8 s6 v bool bDest = false,bSrc = false;
+ Q [- U8 s$ [7 W; E+ ]1 M for (int i=0;i<MAX_INVENTORY;i++)* `6 S* S6 H' i1 |, ^' j- Y
{8 [9 g% p3 p4 d) @9 w/ ?' R5 r
if (dwSrcId == m_Item.dwId)5 R" C3 ^3 V! }$ Z/ u8 X
{: N7 D, s2 _* O8 E9 g* |/ [
//id相等 则 改变对应的dest和src
; U" m5 M+ @. A0 F nTmp = m_Item.nIndex;
5 J, ?0 V, `9 d5 X- Y1 \ m_Item.nIndex = dest;5 W ^$ J5 z7 c6 Y. Z* i( [
}
2 v) k* Z. q* P) H, E# E }' e( ]) [8 a( ^. q% I7 i
//临时数据保存完毕,交换开始# n5 n4 O. e% S, {( s) w w' d3 j
for (int i=0;i<MAX_INVENTORY;i++)- W; [+ J3 t8 l6 K
{
% q+ i! z1 ^/ ^/ }+ @5 q! U, y! Z if (dest == m_Item.nIndex)
( A2 S: E @7 d, O. b, | {" d* a! R! D1 X6 b' D
//id相等 则 改变对应的dest和src( z5 @7 D, o: Q& X; D4 ~" L' e
m_Item.nIndex = nTmp;1 ]1 c' `& n* o+ l- D/ g
}/ i2 c5 o7 }& a
}3 K: C/ q% r) h1 _5 O
}
/ o: D( O! _* Y( O) n0 z- Q};
% b+ {: X Q. U3 r0 w+ V-------------------------------------------------------------------------3 E2 w/ X" f/ a& f% {
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )4 ], a1 k3 D( y; z, @ ^
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
) _, g% V- q8 w, P紧靠其上添加:
# b! \8 ~2 d5 m' O. nif( pWndBase == &m_wndMenu )
l8 D G" q$ A{
6 J% h' r/ ]6 h3 W$ q switch( nID )
, X7 o! D7 ^1 s A( _. S7 b. V {5 Y/ J( ^4 [; ^( n+ s2 y
case 2:( s$ n" Z( E* h& x* A
{
& W/ P8 C% |) a6 w! b. ~- H: { //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
. r- Q" h' @/ u7 r6 H' I5 J( ] if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
0 x5 J+ R* v0 J# ]$ B& ~ {/ @/ e! v9 F k7 G
break;( M! ?. k# \: |
}# J0 p, v) i# {! ^4 R* C8 T
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
. ^% m _7 h/ C% a+ b* [ {7 m; |/ N& `5 a. j7 t {$ k( g
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
: B/ W! B0 C8 P' v+ z0 t if( !pItemElem )
+ u. O! u- ?& X2 j8 H continue;
- a# t5 D0 T& f4 _ if(pItemElem->GetExtra() > 0)
7 u7 H4 g5 Q- q" x' d. Z continue;1 J* s8 o% D5 z/ [' D+ U. ]
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
, E3 T- D, I4 G8 y continue;
1 `" Z" X7 @1 a4 @ w4 I) X if( g_pPlayer->IsUsing( pItemElem ) )
; G1 q& r) c; ?4 X7 Z+ x continue;8 \; i8 w+ @' u# h7 j
if( pItemElem->IsUndestructable() == TRUE ). C- [' l6 t9 I$ U7 w
{" D. W# L! @, ^6 Y: @
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
3 m5 N% e3 S& Y" j! s' A continue;
/ _ p' v, \# H! h+ E }
1 B K) n2 H0 z/ I- u2 A g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);' c" w/ H: Z+ U4 O" k6 w
}# F& ?' b3 G3 R7 L7 i
break;8 C- s7 Z3 o! y5 o
}
& m, M, a, e2 S7 g. a case 1:
% y e: h9 y, f- d1 C. z' C {$ G% @* Q/ N" R- p
//整理背包
; W! G7 \3 w0 S, O8 F9 j& F //////////////////////////////////////////////////////////////////////////1 Z2 x3 T) U6 t% e9 V
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
, v1 A5 [+ P) x" L5 Z7 t3 r5 l k) \ //////////////////////////////////////////////////////////////////////////
/ b2 d/ x# J$ ]$ b //////////////////////////////////////////////////////////////////////////
& Z( v. P% `( H/ q CInventorySort* pInvSort = new CInventorySort;3 z. L1 t5 q2 }7 ]$ [9 t
vector <sItem> vItem; Q0 w7 |# x/ N0 o
vItem.resize(MAX_INVENTORY);//初始化大小$ p5 ]9 ?' T5 ^: v/ Q
//////////////////////////////////////////////////////////////////////////
- h% X9 b$ Q. ?' Y; }- J //填充数据
" ~% V$ v3 b. b' b+ ?; F5 k for (int i=0;i<MAX_INVENTORY;i++)4 F9 a! u& u2 A6 C2 _
{
" `. P+ s$ q; G# ]1 M: A" ]. A CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
8 a$ G7 `2 _+ i if (!pItemElem)
: _+ `& G9 ]" { e3 t {
0 m; V$ V9 ~ f# n vItem.dwKind2 = 0xffffffff;
3 O/ D& a. I$ h6 |5 _2 ~9 a R vItem.dwItemId = 0xffffffff;" {6 c9 a, @/ i. @% R5 m
vItem.nIndex = i;
) z' Z7 w# `" A/ _6 O# f' l& z }else {1 s, Z7 D, o' ?- y" o$ W7 e* Z7 B
ItemProp* pProp = pItemElem->GetProp();. l, e' {8 R' C0 ^3 w$ X# e$ s9 c
vItem.dwKind2 = pProp->dwItemKind2;
7 |, }' i1 s( ?$ O; c vItem.dwItemId = pItemElem->m_dwItemId;! W6 p+ ^/ E! j" C/ N
vItem.nIndex = i;
; x4 Z; n" }! ]) F9 X- p. B }5 z& V2 H5 Q, U# N0 I. A3 @3 d8 r
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);- J& z( h8 J) I+ l4 ?3 ]
}0 d! i3 q& {. @$ Y) R" R
//////////////////////////////////////////////////////////////////////////
0 D; Z- g6 `+ K' D7 ]1 O sort(vItem.begin(),vItem.end());//排序
/ D2 K7 G2 h4 Q6 T: N6 @; H //////////////////////////////////////////////////////////////////////////
% e3 I* P. }5 n3 R+ b8 ^" X //交换
. \* K! C9 G, t for (size_t i=0;i<vItem.size();i++)) i- B- g$ Q" y1 [; |) h
{9 x( e. `( A; ^7 t T
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
: e4 O6 K7 Y: }4 k pInvSort->Add(vItem.nIndex);3 ]8 i7 R1 ^9 Z( W3 M& ^
}
* u c( _. Q: A BYTE nDestPos = 0;+ [6 E) U/ w! z5 s; F5 f
for (int i=0;i<MAX_INVENTORY;i++); v3 m& y' }1 |0 l; [/ `" V" I) i
{7 ~1 ?1 d: f) x( _! h
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
/ {+ N5 R! D# R! Z3 Q! P if (pItemElem)7 a' W7 B9 Y' N' A2 K
{) s. q# q0 _+ b3 L
if (IsUsingItem(pItemElem))" v, ^" t* a) l- G1 c1 k
{8 K& R/ B: u/ S) V
//这个位置无法放
! n8 S: `3 E, `" `; s4 ` nDestPos++;
0 z* i5 f% |, I }
) w, ^5 Z" @- Z" U; ` }9 ~& y* K: ^: {3 H3 w/ o7 x& J3 L
BYTE nSrc = pInvSort->GetItemSrc(i);
# Z$ ~9 ?' `5 g* ]" G! K$ z pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
3 [4 z9 W8 ^& Q5 V1 J if (pItemElem)
& q7 R3 F1 w9 \0 X1 g( S {
% u* ^9 p+ T( I if (IsUsingItem(pItemElem))' g, T5 s0 `1 u( Z
{
h. E8 w* a5 k0 b! A: o! A5 u: N" h2 m //这个道具无法移动,跳过8 D6 y0 k7 @1 D% H* E5 R w8 [0 n0 g
continue;+ w% t! }5 Z: u+ L
}
& P( d& P; ^. q Q- A* v }else{, e- L- l; g9 k9 @2 ]% u' R! D
//空位置 不用动+ c- Y% x5 ]1 |1 q
continue;! ^; w- H. P/ \9 I# K3 J
}
5 F1 t' Q$ X R2 _: i) w //////////////////////////////////////////////////////////////////////////
6 K# D% ~/ `1 ~9 h0 ~% Q2 I5 C //开始移动
$ l# z3 _# h& w' V6 d if (nSrc == nDestPos)2 a& v2 L# r% e2 x' H+ u% S7 b1 Q
{6 D" ~/ l1 x7 r
//原地不动0 o" B* i4 g& J1 T
nDestPos++;
- A3 {1 o0 Z8 t" r/ o( I. _- d continue;6 P1 C6 f/ u7 `( j* u: G
}
* o! {/ V& s, P1 [2 a9 | pInvSort->MoveItem(i,nDestPos);
3 O" @/ N1 G8 j- u- {" D g_DPlay.SendMoveItem(0,nSrc,nDestPos);
% i' E6 w& E% s$ ^* T2 _ H Sleep(5); s: `8 ~! E* C7 l# I
//Error("移动 - %d->%d",nSrc,nDestPos);8 x s; @3 I5 ~; {2 q
nDestPos++;
* D9 N2 t) O. A6 ^7 M8 m }
' W6 o6 k1 f- K# X# T. V7 Z //取第一个元素的信息1 S" i' R1 W3 H& ^
/*8 f) y7 R9 D# |6 V7 m* Z9 d
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)' d+ z6 M3 g- p1 a0 I p V
{
, c \- f& s2 P9 o( X Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
: m6 H4 E9 z" s9 g( \( w& a g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);1 v, r6 r3 t. Y
}$ T$ ]. u. _- v9 I: K( d
*// I& S! d/ p8 \* C
//////////////////////////////////////////////////////////////////////////
3 ]3 B# t2 ?9 L1 {7 i break;3 M/ R7 l, {9 D7 x
}* k/ I% R" T- p, p7 e: p2 U
} / @' w* Z3 \2 A" Q3 U# W( M
}- B2 l- w6 ~; @/ \
m_wndMenu.SetVisible(FALSE);- B8 c% Q5 {2 }9 Y: c; A
|: Z* p* M8 }--------------------------------------------------------------------------------------------------------8 A( H( n. \+ o0 Y4 \' x, @
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
6 o' o* |0 t. [# S5 {0 l" ~5 u{( r& ?1 ^: I* L/ R6 j
BaseMouseCursor(); `$ Z5 ~4 M3 a
}4 n5 G1 r N3 F2 h1 W
在其下添加:# h/ H2 M3 Y0 G# y/ Q+ c; J3 W
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
& \2 W; Y4 m0 h4 `4 ?{
; N$ }: r7 t( n3 _3 ~m_wndMenu.DeleteAllMenu();1 [5 s+ B! W! {/ c
m_wndMenu.CreateMenu(this);
|( H3 P* B7 D8 E s+ Am_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
- M5 _( _$ I1 F( \; P' @
8 Y b2 j+ l) }* k% O2 _- [if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))0 h* b7 j# D6 t+ T* @5 |+ {
{/ ~+ e6 q, C* n5 V _
//P以上级别才可以删除所有道具
4 w! a5 \+ \8 ]" d1 @+ e& S5 l2 V m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");9 e( k( {% J- P* P) R d4 d
}
' e+ q# ^8 u7 b2 J7 j5 U5 _2 X5 Mm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
0 \( `- H. H; x1 D# F8 km_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
+ x1 q6 E- r) }& am_wndMenu.SetFocus();
2 u6 R6 _/ I7 g' S, h9 I}
' J' s0 \2 j$ `/ I- _" ~------------------------------------------------------------------------------------------------------------
" `9 }1 T6 e6 x- O8 \' T& s% L*************************
1 n2 J& d- Q8 i; K* WWndField.h文件
, g* d7 e* d! J5 U7 u3 s*************************+ R. S" W3 o* r3 u9 {- C
搜索:BOOL m_bReport;
3 d: f" U0 Y( n/ E其后添加:
~% \5 @6 Z1 oCWndMenu m_wndMenu;
4 z" w$ d: Z4 t- c2 a+ G: T7 G搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
V6 Z) e# }( Q其后添加:
% c1 j$ R* p! O1 z: ~" M. B+ S) hvirtual void OnRButtonUp(UINT nFlags, CPoint point);
1 ]( y. N3 v+ r$ W7 L2 [4 z* W" A/ W5 B
2 d. E; J6 P. C |
|