|
|
源文件中_Interface文件夹下WndField.cpp文件1 s1 F" B" k4 t
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )- M- d H* p$ @6 {% b) b* l3 {& e' G
4 x& j6 x9 B# K8 T6 S6 @& t
struct sItem
' I& j% k1 I$ S$ m0 ]3 e{
5 d4 J: u* E( W' bDWORD dwId;
; L X5 Q* X" A UDWORD dwKind2;! k4 G* X0 Y' `3 k, w2 [
DWORD dwItemId;# N% j8 g& H* ?" U4 V" G! g% O
BYTE nIndex;
7 w( X9 B. z8 D9 A3 Y) OsItem(){
( c/ l3 P1 K$ |5 j- K5 F, d+ u dwId = dwKind2 = dwItemId = nIndex = 0;
: \8 o2 d7 I% A* t5 t}) j q) C' C) G& V. y* e
bool operator < (const sItem p2)
/ a, Y( h% M" ]- p& Q3 h0 ?{- E1 v. a( B( d z( T1 @
if (dwKind2 == p2.dwKind2)) h; ]3 r, Z' n# V) a
{0 V6 E: u J* N, Z
return dwItemId < p2.dwItemId;2 b, a; s2 J1 \3 U% u
}else{9 O9 J' A* A, C
return dwKind2 < p2.dwKind2;3 {2 s5 p% e# y' p8 T
}$ H: A, W/ N5 Y0 ^
}
: y" b( C- O2 m/ I- j};
3 C' f, l. Z' q( O7 w/ J2 }! Fclass CInventorySort1 {2 X; x# N1 {# C
{9 a" a) M. `$ f, ?/ e4 ^+ R3 d
public:' I. \- l. j; [$ ^1 [
CInventorySort()
. }5 z8 [. W% x8 o{' V7 \8 Z* X5 }4 m8 f1 z* y
m_dwPos = 0;5 \# j# M, u1 _; f, n
}& ^- ]2 l2 @% w: z* B
~CInventorySort(){}
5 [, a* i; Y7 a2 c& g* d4 Uprivate:
) Y# k8 M: J0 OsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
8 x7 P+ `1 q: C( |$ e2 ? Q0 H$ [DWORD m_dwPos;
/ F- K" `7 G8 T6 G( T5 cpublic:
/ }# a. H& ^ ^5 J% E: c8 hvoid Add(BYTE nIndex)
1 B3 t2 H2 T$ z{0 q+ X1 w$ n$ X, a5 ~; k6 N8 Z
if (m_dwPos >= MAX_INVENTORY)5 F: O4 L' M" _; b$ h+ }
{
6 m4 i8 s0 x, D& B7 P return;; S' H3 P# |. ^# Z ]0 W4 j! Z
}
7 t6 ^7 c/ a: n m_Item[m_dwPos].nIndex = nIndex;
7 c# p! ^: f) C! d' ~& e6 ^ m_Item[m_dwPos].dwId = m_dwPos;
1 X, l8 x, C2 P. ` m_dwPos++;3 d8 e9 S! Y" P/ ?- H9 h
}
7 Y' @, v- ~, V+ [ D! dBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
# D8 l) w8 u i J% b- m9 S3 ]) T{
- U! c3 V9 i1 l7 {1 W for (int i=0;i<MAX_INVENTORY;i++)6 V0 ~0 K( i- d& `1 p
{
' Z) Y! t/ I$ f# q6 U if (m_Item.dwId == dwId)
* P+ n/ _) H6 J. h& x {# C1 J7 u4 @6 l+ o ~( L
return m_Item.nIndex;
- B. J: p% x! R }/ C, l5 y- A( T+ \' v
}" M+ v& s5 l) ?& X5 s
return 255;
& U* u% U% f0 |( F7 O) E$ n0 p8 O}
$ i# M2 `/ n5 uvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置# m$ d# M1 f$ ?4 k! U( K5 W2 c
{- m& C+ w! X5 [! W" B' p' V& x
BYTE nTmp = 0;
# r0 e$ c9 M0 q8 ?" q9 D bool bDest = false,bSrc = false;
7 r, R( g6 A8 s/ n for (int i=0;i<MAX_INVENTORY;i++)
1 g- y! w; d5 c2 }$ b( h3 H {
6 V: C' {5 v8 x" F" r' \ if (dwSrcId == m_Item.dwId)& s' F6 x0 H$ K9 g
{; G0 {" }- z0 j% N
//id相等 则 改变对应的dest和src) V, Z0 P0 s* U- {, W# Q: W; @3 g
nTmp = m_Item.nIndex;8 x. d# b# u# Y+ F% M$ Y- e' Y
m_Item.nIndex = dest;: [5 c/ T1 K. C- {. |: _+ B
}
- Z- l& `( e# t3 E }. ?5 T0 [& _4 N% k$ K5 K
//临时数据保存完毕,交换开始
2 Q$ v8 W F$ p- W9 u for (int i=0;i<MAX_INVENTORY;i++)0 e4 [# {, Z. Y* ^7 E6 I3 H
{( A% N2 D! k+ ~6 V( v* i
if (dest == m_Item.nIndex) ^6 T! |0 c+ W9 o: t9 d' _( b
{2 d% F0 D( k& o0 G, t+ d: Z
//id相等 则 改变对应的dest和src
) Z) e& @' E' f* b m_Item.nIndex = nTmp;
5 @5 ^* d7 P7 e! k3 g- G9 r }
. k+ I# b, @+ P* ]6 e# p0 h }1 t6 i1 k7 d6 \4 ~% _+ ]- l0 u
}
~3 d ~' o7 {" c( g' X3 c& n};
S, ^" T3 t) v9 N% Y-------------------------------------------------------------------------
, Z* c! x3 i/ R) G9 z9 ~ P' m依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
- A0 `! h# o9 {5 L7 A6 V搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);9 J8 ^) `0 d1 Q
紧靠其上添加:! q0 R: O1 _: K5 i5 v# J; M3 E9 Q' t
if( pWndBase == &m_wndMenu )- e. e' n, v6 ]# U
{
; k0 G s9 X5 }0 l: g0 s switch( nID )3 @7 u4 A' ]! f0 S, l% f: c4 V: o: ^
{8 A& j0 k7 a/ F1 y3 F9 o9 t
case 2:
8 u5 o: d1 ]. o. J& i, s) b {
( X6 W. Y& s* N: t M' Y //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
' _" F- t4 a3 J$ U5 R8 o2 `) J8 T if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
& F; v. K4 G" {" z {
% m6 R) {% u( [; R% l% Y break;2 d" x) u$ {0 S# w# s1 y( W
}6 V9 B# U8 R- t
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)+ T# [: r0 s g# U& w* a
{8 e7 K" K6 V7 g3 Q' C$ n- ?5 o
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
6 `8 \% \% Z+ y if( !pItemElem )0 Z/ H0 S- ^! F0 P
continue;
- A9 C/ l4 V* @! E if(pItemElem->GetExtra() > 0)9 K: h& [: y& D7 c- d; U' X
continue;" Q3 I6 U1 H) D2 b
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
s+ B7 }5 I0 ~/ z+ `3 s4 G" @- ^; z continue;* }9 W5 a7 v+ n* F- d7 g* o
if( g_pPlayer->IsUsing( pItemElem ) )& |( ]) F! Z# c! e
continue;) s. N1 X; o! s8 R$ I0 ^& l
if( pItemElem->IsUndestructable() == TRUE )
6 A% A4 M; H# [) B# T6 \* \- ?0 | {
8 Y1 ?3 o2 z+ S2 Q, @& T g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
( D. X2 J2 a! k2 H! M continue;
2 d p1 B1 g; {$ Y6 L) b }
/ ~. D7 I& R2 O g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);4 b0 I; M* Q7 E4 R F5 f
}
7 O: b6 A% Z, [3 R9 a) G break;+ g& k: Z% w" r, J
}, ?. Y& ~" d. ^0 ?% u4 u
case 1:
/ q: Y, [# {4 i8 {( ?1 W( P! K2 q {& ~, m* M4 T% V6 c% R; f1 H
//整理背包
! I* _4 z7 z$ \5 s2 _ //////////////////////////////////////////////////////////////////////////
" t2 Z+ n3 v+ F: U! f- } //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
+ A6 [' Y9 u/ k8 k //////////////////////////////////////////////////////////////////////////
6 L3 b1 D6 g$ Y( e& Y1 k3 I //////////////////////////////////////////////////////////////////////////
2 D7 Z$ J5 M- m+ P CInventorySort* pInvSort = new CInventorySort;
( i# X7 B. Q& c: [5 a/ o2 h vector <sItem> vItem;
4 ~' X7 U. F* Q) t vItem.resize(MAX_INVENTORY);//初始化大小8 M" ^8 u. q- n) q6 D/ A( j3 N' q- `
//////////////////////////////////////////////////////////////////////////
# Y6 L' g% Q/ T; a5 w //填充数据1 _! a1 ~: C# W' e$ I2 z$ Q6 n
for (int i=0;i<MAX_INVENTORY;i++)
# a+ v% ^1 l2 V; t- W) W {
# g6 ^& @# b) r: Q# `( i. E CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
1 P: o& a# B9 G2 n if (!pItemElem)' g* ~1 X% Y* T8 y5 \9 l. y
{
4 ~: u* R \# K+ k# e; L vItem.dwKind2 = 0xffffffff;/ g: D2 ]+ y4 V, t
vItem.dwItemId = 0xffffffff;5 a$ a, `6 J$ \: b3 Z* M
vItem.nIndex = i;
. r9 v2 p* D& G$ a$ D }else {
" v/ y: t( w4 h% E1 H6 ?& m3 h. l ItemProp* pProp = pItemElem->GetProp();7 v) o. H N) E
vItem.dwKind2 = pProp->dwItemKind2;) y$ l7 K( d( R. ^ M6 l: W8 k
vItem.dwItemId = pItemElem->m_dwItemId;
; V% A+ ~0 Z# X# m6 c( n* Z e/ S& H# P vItem.nIndex = i;
/ r: K1 I3 b5 p' u5 U9 \ }
6 g' U7 U X/ V( W @( A //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
2 ~- h& D$ ?. B8 C9 w* O* V; k* x }
* c; E6 R- V" D- C9 ~ //////////////////////////////////////////////////////////////////////////
0 L, e1 y/ u. y8 t sort(vItem.begin(),vItem.end());//排序- }. \8 _) C: o
//////////////////////////////////////////////////////////////////////////
2 }) g% Y3 r! H# K ` //交换
8 Y! y; a# V! K for (size_t i=0;i<vItem.size();i++)$ o9 Q2 C" Q9 M3 U' v& k5 R) w. r
{: H0 {' B2 v8 W& [8 b$ ?
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);6 F+ ~- q' Y# c1 H. P: v" a7 K
pInvSort->Add(vItem.nIndex);6 Q- n. v8 k; F5 I
}
' w- k8 O6 P. a. u4 Q3 N: K BYTE nDestPos = 0;
: I! E5 |1 q2 j2 |( f6 K7 Q for (int i=0;i<MAX_INVENTORY;i++), I5 I( y- L" A; w+ g: g, y
{
% N- A3 @4 E+ ]9 G) J CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);& W4 f3 j* ~! Y) A& g- J
if (pItemElem)# V7 J$ }+ `3 h- ]
{/ ]: U: S7 W' L
if (IsUsingItem(pItemElem))* g5 ~9 d6 q: g9 l& s7 u0 {
{! j4 h8 q# @' X+ M
//这个位置无法放, t; ?- C4 t1 F9 v! |
nDestPos++;. y& k; a/ d! J/ K& D
}
' i$ t* X, }# v% r Y! e1 J) s }9 Y. Z: H- S% J* I Y5 k- d
BYTE nSrc = pInvSort->GetItemSrc(i);
; o- d3 `5 e( c: \ pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
" O5 J P5 N4 D9 u8 s9 h4 v/ a3 s if (pItemElem) p @5 {! y) v# S. h7 M" S& \; g
{
7 W6 e' c6 s- }9 T6 P. B2 j9 i6 d if (IsUsingItem(pItemElem))2 @* e- z! K% @( \8 l* v
{
- Q3 H( U9 C i5 c) J9 I, ]# j //这个道具无法移动,跳过# W& y9 ^1 G) i4 V# _
continue;6 p4 e- x& O W' x
}
4 R* i+ {( J# y0 Y) Y$ K, |/ @" X }else{
- u6 ]3 j% ?3 X& P //空位置 不用动
8 v6 k2 g' {* k& U* o continue;
5 |0 ~6 A" V) m5 e }7 A4 P/ a9 F" }+ P( \, M9 R; N
////////////////////////////////////////////////////////////////////////// @" j4 C) ]2 [1 c- z2 Q- ^
//开始移动* N! ~0 {2 ]* B% v4 w* O$ N& q4 v
if (nSrc == nDestPos)8 V% d! i9 r9 z+ h4 M
{
c0 V/ q. H1 @ //原地不动 T5 P' _6 S0 x( h% R0 Q
nDestPos++;" o, ]- O2 }( x
continue;
, ]+ ?7 c+ w3 J8 H, x- c }: w& M5 k" x% Q
pInvSort->MoveItem(i,nDestPos);
7 S( H% f A& x; O2 p/ p% N* a g_DPlay.SendMoveItem(0,nSrc,nDestPos);
" g' v3 J9 n K* e/ V$ f Sleep(5);. a. p) I, j" T/ }4 R
//Error("移动 - %d->%d",nSrc,nDestPos);0 p. N5 Z# p0 K" M
nDestPos++;* ^* f$ s. K/ z: H: T" r9 U+ y
}
+ r% ^5 V- D9 s4 Z% Q( D5 u //取第一个元素的信息
/ i# P5 G7 f# X7 c1 c /*
2 h0 @# {( z" d3 q: Q; A if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
3 V) n' B. ~; F1 F! @- y; ~2 }) b" P {
; R1 A$ Z+ M' @* Z9 C# r, R Error("Move - From:%d,To:%d",vItem[0].nIndex,x); m7 I2 o* _. J) y& v
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);" ]$ m0 B" t8 s
}
# R2 [/ D* T/ ?2 y */# B. W; t2 z+ E6 X8 g1 P3 D# T
//////////////////////////////////////////////////////////////////////////5 s6 d* y' }, j9 c( m3 X
break;3 ~2 Y+ B5 U& Q# M) K
}% d: f9 B, T( r) I8 t4 w
}
8 s: S; j) Y, o! C" b' G}
+ y9 O9 X' r7 D& jm_wndMenu.SetVisible(FALSE);
3 O; H# p2 J. f* }1 m! y1 g/ i8 v! g( J- h$ w: {) m- b
--------------------------------------------------------------------------------------------------------
; O# E" i: G" A- [5 n+ [8 J7 ^( o搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
: I1 X0 F l" r+ g! K9 u* u9 |{1 c0 Y5 F2 S/ i3 `: @ | H
BaseMouseCursor();* {) F4 Y& U+ r, h0 R
}- i; u- m7 K6 _; y* T3 N! F$ X
在其下添加:, L( B' L9 ^3 {5 B3 C
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
5 w S. ]5 p; {7 f{* k- ~: D- e" W" U/ d9 `/ v
m_wndMenu.DeleteAllMenu();+ n3 K0 S3 T7 D( G6 q% ]* X! t) n
m_wndMenu.CreateMenu(this);
" N2 O9 h( w t& F, U+ \2 ^m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");& b" S5 G- J2 i _
/ p+ _& X5 y4 {if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))0 s" h6 i5 q' o. V8 F2 t Q
{- {2 _7 e1 A n* g7 K1 ]
//P以上级别才可以删除所有道具; `% g/ P& O* G: r. U
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
+ r/ }. |% z7 C9 E) F# W}$ y3 f" n; }0 C4 x) ]
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
& x# X4 A& w8 x( C+ {m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
& u" g* q8 N" [; M2 {m_wndMenu.SetFocus(); T- b P! A4 C" C6 b) E
}0 z2 e: ?& `, V* r
------------------------------------------------------------------------------------------------------------8 i4 H- I, ~$ X
*************************0 U" i0 y1 ?& @7 R* N
WndField.h文件
3 E2 P8 d2 _7 i* K*************************
6 p% U) s/ v! w& @4 s1 N搜索:BOOL m_bReport;5 J: Z0 a+ w, L- @& e
其后添加:
- I4 L; B0 i W- SCWndMenu m_wndMenu;
+ [, p( N* g5 n: B, n/ Y% O9 E, o搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);0 ?* }- Y. [$ t) T& d7 a
其后添加:. U# @ X& k# Y& H( U% D
virtual void OnRButtonUp(UINT nFlags, CPoint point);2 O% ]/ A, @% _: a
d! @, U0 }; {6 M# M9 R9 C' ?; Q8 B. Q+ ~
|
|