|
|
源文件中_Interface文件夹下WndField.cpp文件8 i9 ]" V6 ^. r* D3 ?/ O; T, c
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ) s7 I$ `( L$ g; p! q
" M/ G8 K4 T+ o/ y9 Kstruct sItem: t/ L4 ]( b$ ]* ~- R' M9 {' p
{
$ P$ R" G7 C& j1 }0 n9 F! T2 lDWORD dwId;( A7 i/ @. O7 T% }) N' p! V
DWORD dwKind2;4 O: c# p: w( Q G {) p) M
DWORD dwItemId;& ^9 |" p; \9 C
BYTE nIndex;7 P5 h: |. v2 d) X
sItem(){# V& }- J* \' C; ]; _
dwId = dwKind2 = dwItemId = nIndex = 0;
9 ]4 }# T; j& a* e$ ~0 \, Y M}
! g6 W1 M& H3 [bool operator < (const sItem p2): b7 m; Z, A6 p6 L4 X# S
{8 e/ T0 u. d0 G: z! b
if (dwKind2 == p2.dwKind2), y1 z8 H9 l9 X
{
' j' ~" @5 o& N return dwItemId < p2.dwItemId; X) b! t* [2 ]4 G- K
}else{
- S# N a' j9 {- T return dwKind2 < p2.dwKind2;: t0 n' K, o1 n6 l! R
}
* \3 s, k4 I" H3 J}
; @2 Y6 s/ a9 N E) `7 h};
$ V5 m3 }8 c% z$ S1 lclass CInventorySort, O$ N( x3 C) S
{$ P* }9 L: ]+ s }/ u
public:
( C: Z: [# A$ ^& l) N/ sCInventorySort()
8 C( V; t0 n9 z% s) R) V# i{, f# B) W/ Y, ]6 x
m_dwPos = 0;2 w2 U" N; s: p: \$ b
}
0 @+ ], p: e8 ^9 L$ _1 ~; V1 @7 n~CInventorySort(){}, l; l0 n9 X" f7 T+ m1 N: i
private:
; w* a7 V$ P8 l8 WsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息- ]! c! N1 z# R" ~: `! ~- N
DWORD m_dwPos;7 V4 A" d# _' u; s E7 V: f
public:, K5 ]* m h1 I7 c+ I* I; ]( g
void Add(BYTE nIndex)2 S: e& @$ p" F2 b/ U0 {
{
+ N! H0 |2 w' z: }6 o5 y) Z if (m_dwPos >= MAX_INVENTORY)
0 n% \: _6 I* m S) D- b {
2 ?: V$ q1 G+ i7 B return;
% ]' C* P( T7 F+ B( C }
) F5 ^) b7 p( ~% h3 m m_Item[m_dwPos].nIndex = nIndex;/ E# z2 R# a+ K, M
m_Item[m_dwPos].dwId = m_dwPos;* f0 [, n+ T6 S1 f0 T5 L& [7 }* c! a
m_dwPos++;$ t' z- t% F' u6 |; A
}7 o& E% P: i! @3 @; s
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列# q, `" l7 N# `1 _
{
3 w7 t! p8 [- Y for (int i=0;i<MAX_INVENTORY;i++)
& Q0 o ~( k" F1 E: r x8 K {4 ]2 p$ V8 v% t! r! ]
if (m_Item.dwId == dwId)
! j) P' p+ R& t5 j0 Y( ?) M; j) H {4 j2 d8 n" R2 m# f7 O! L* c
return m_Item.nIndex;
. J! V3 m2 R" d! L }
8 q7 h" G6 W8 m# F' {8 B }4 d7 x; q; u' _& o d
return 255;9 ]8 y4 ?6 C$ f; M$ M1 Z
}, n4 R Q% c; R) }# d
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
& Y+ E- S% n% V, }) n6 N{ s% G5 c! i% w f3 ^" _ C- q8 Y
BYTE nTmp = 0;
\1 q5 h3 W1 c6 n& d1 K% `; F bool bDest = false,bSrc = false;
4 b* `% I3 f. x' h; J/ ~9 Y for (int i=0;i<MAX_INVENTORY;i++)3 F2 r0 l+ Z& V/ K% I+ o
{
6 @& V7 J/ S- ?# e9 Z if (dwSrcId == m_Item.dwId)4 j/ J3 t$ a# s" ^, A
{
& I* p0 Z; D$ u$ l1 o7 ?4 y3 C //id相等 则 改变对应的dest和src* d2 |6 F* a$ C7 I
nTmp = m_Item.nIndex;5 a2 V Y9 M2 z6 X$ r! C. C
m_Item.nIndex = dest;+ e7 z% e9 M4 ^& V
}
+ `; u# n2 i! w3 u% V }
- T1 W+ l; w7 @! G //临时数据保存完毕,交换开始
; O U2 K( v& z) Y, {% `8 ~, e for (int i=0;i<MAX_INVENTORY;i++)
% }( n$ U. v' n" T$ S! Q7 K {
/ j+ q7 i. [; E( w$ P8 T if (dest == m_Item.nIndex)
3 E; ^0 W+ J% Z6 W {2 K& m- m6 Q2 S. j! U
//id相等 则 改变对应的dest和src$ S4 g+ f0 ]6 u( A+ _0 h+ k8 }
m_Item.nIndex = nTmp;
$ h: A: k. p7 V# d) X3 Y- j% A+ f }
2 H- ]) X& q& O/ z: ~1 o( }6 n }, {6 t, O: H4 |+ t
}. H: ^* J3 L: \: m1 E8 |
};
G& S# G0 Y6 g+ D-------------------------------------------------------------------------9 ?/ }3 \9 O2 a1 g6 H
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
! F# P% M2 X* f9 D) l Q1 O1 ^搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
2 p* `: O: Z# E. t2 m紧靠其上添加:! o; t0 V( N2 K2 X+ F
if( pWndBase == &m_wndMenu )/ I2 Z( W; M0 d4 C+ l% y' r5 O
{' e4 K4 @3 x3 y2 l$ o- w
switch( nID )
3 T, c% J) m, ]9 ?, _+ \1 n) I3 S {
, Z( t3 c( f& l- X& |+ n6 w case 2:6 f3 _2 x# Q! F9 ~: N; @0 ~
{& p' J( b& B+ x( D
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
& g9 a, @3 S5 }% E9 b5 E if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))) [/ @" k( _ L3 Z/ j8 H: g
{% ]4 I1 j9 ?2 C" h: N8 L
break;" Z' \2 j* `5 x; |0 h \
}& X, G& `$ b% j* X& x
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)8 I' c9 n" O n* |1 K
{
$ \: f2 s2 A5 F3 e* b CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i); t. Q* }4 U0 b, T
if( !pItemElem )- b5 Y t# p* ~! w: g. s9 A5 W
continue;$ n9 s: L0 d- |: C3 E2 x
if(pItemElem->GetExtra() > 0)
- C; | R, l) x/ K' b continue;, }" D, o3 |; b5 W) j
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
% ~1 f r7 m5 b/ H$ J continue;
& v( g7 [! K5 {, u ]! K if( g_pPlayer->IsUsing( pItemElem ) )
& t' b: U3 n2 Q' ]2 i continue;
' z; ^8 j, E3 X6 Z! W if( pItemElem->IsUndestructable() == TRUE )" ?! D+ u, \4 V& |$ w8 W
{6 M5 J7 y0 v# {5 }2 U! |2 [
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
% N; c. Q% L o3 W/ f continue;
6 \$ e" _: J( ^; K4 C }1 Z ~. s" h! k$ n, r
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);! p8 v9 j! j5 |) G1 }/ o# Y
}
/ Q# a# O0 H% o. q4 T: i M break;; N/ `8 Q) V* V1 Z. g, u
}
3 b$ E" s# T; x7 R1 y/ K, W+ [# R case 1:' f$ d: r8 `& Z8 n4 g
{' R6 C% `5 x6 }; w
//整理背包
2 Y/ M& S g4 b# S3 X( ?+ f4 B5 W; V7 t //////////////////////////////////////////////////////////////////////////( G9 B, ^$ K' ~( M8 y5 O0 U0 {
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );/ b! I) n I- ?$ z
//////////////////////////////////////////////////////////////////////////
6 u& J8 H) y3 I //////////////////////////////////////////////////////////////////////////
" v6 Z) h; p; D! z CInventorySort* pInvSort = new CInventorySort;
) g9 R5 s0 \' P0 A6 R- j( _2 L" x vector <sItem> vItem;
* S) Q, R% ]2 A; I, J" Q9 E vItem.resize(MAX_INVENTORY);//初始化大小
8 Q( x; H$ V. x //////////////////////////////////////////////////////////////////////////- q" d+ n! ? F& ~6 B
//填充数据
2 h/ K, O4 @# Q" J+ V4 e4 D6 k for (int i=0;i<MAX_INVENTORY;i++)
+ y2 n% t# i" q- X, Z( v {
, P2 B. \8 m6 @& t B. y9 s CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);3 K. K2 ?& T1 s( d2 L. ?' R4 T) u
if (!pItemElem)
0 O+ p5 p# y8 d% F8 U j {- ~+ {1 n& H4 b c
vItem.dwKind2 = 0xffffffff;$ z* ?6 E; p; s* _" q2 ^- y; V/ \
vItem.dwItemId = 0xffffffff;7 Z+ k4 u) p; H
vItem.nIndex = i;- P, t% C9 O- f9 e
}else {
8 B1 z, |/ @3 \5 E ItemProp* pProp = pItemElem->GetProp();
/ O6 D4 Z: Q( _' E5 ]7 k/ h6 n) @* Q vItem.dwKind2 = pProp->dwItemKind2;
! J( t2 d% u1 M vItem.dwItemId = pItemElem->m_dwItemId;# G! Q# d- `+ L* Z7 }
vItem.nIndex = i;
* E* o5 D/ R* ]7 t }
7 L, R: }; D8 o //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);& F( ]# j% T7 E* ^" {$ T
}
* W, W8 e, z* D$ }. ]. j& F //////////////////////////////////////////////////////////////////////////! C4 K/ Y, D; P8 k: ?: U
sort(vItem.begin(),vItem.end());//排序- C0 b& Q b9 g: v% L, l
//////////////////////////////////////////////////////////////////////////3 d5 Z# U0 j; K: ~$ u
//交换
2 ~3 @8 f* `9 s+ \/ e8 U: M for (size_t i=0;i<vItem.size();i++)# X7 U0 q* o" O$ x9 d: x" ?
{
8 Z2 V2 c2 ?/ d& }2 s- Y" j //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);+ F+ g, |; M+ |3 m3 e
pInvSort->Add(vItem.nIndex);
C3 s$ @$ g5 A0 R" _5 [3 K }
+ e. w' N. l6 @. `2 Q8 p1 Y BYTE nDestPos = 0;. q4 a# s4 Q8 V r1 m
for (int i=0;i<MAX_INVENTORY;i++)
9 L4 B) ]0 [4 r0 y8 G* y {
# a q2 r0 y' {+ G3 N CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
0 J# }7 l) e8 {$ j; ], a) P if (pItemElem)7 {6 _1 p; S2 W5 }& d- \
{! y9 g9 w* {1 f6 a
if (IsUsingItem(pItemElem))
+ w, s" \% [6 n) q8 l: H3 F6 S { z7 U% B8 \, Y. ?/ G$ k" g
//这个位置无法放
8 y% a/ L* [; |: @' q8 ] nDestPos++;
, W& x# z( I8 h9 f9 x1 H) I }
' `6 |2 b. Q, h& G }! X3 N4 k% `: O4 x1 {/ @! J7 l
BYTE nSrc = pInvSort->GetItemSrc(i); F' X) L- u# e1 o1 F# ~- e
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
4 K& U2 F& V0 @2 y) k) _" D! o0 f if (pItemElem)
8 c; ~: t1 q6 y% |- _ {
) k/ v0 u% v) u# S" h4 X+ I# k if (IsUsingItem(pItemElem))
/ U+ r+ _& J, x9 ~$ r {' K8 o/ l. }6 t. \. G6 P
//这个道具无法移动,跳过: q4 m4 t8 X/ L7 L9 v6 j. h5 h
continue;
0 ^) z! a6 z$ W5 G) P }8 v; a1 d2 X; E( I5 {9 J$ k; q
}else{
# a6 _1 Q: q2 N# U- S //空位置 不用动# e4 `/ R4 N2 h( i5 `# n4 G8 r
continue;
/ B; s; P# Z9 c7 F: c3 @ }
0 P5 K9 t. J. ~0 k. e //////////////////////////////////////////////////////////////////////////# |8 I7 v$ A: }- u' h! H
//开始移动* q1 U/ l' s2 k Y& r8 T }
if (nSrc == nDestPos); Q' K6 e; Q7 p% m& |5 z# t# K
{' p. M8 i5 s! T7 [
//原地不动
! I1 M( Z% o( n. n% A nDestPos++;
- q7 F* G1 ]; A" F continue;
5 a! P' E% p) ?& Z, b }1 q& f/ X, d# |4 c* ~
pInvSort->MoveItem(i,nDestPos);
7 O/ [; O/ \9 G( V! E4 Z g_DPlay.SendMoveItem(0,nSrc,nDestPos);
& _5 F% p: H. F& y Sleep(5);
0 [' G7 ^9 |, L4 \3 ^ //Error("移动 - %d->%d",nSrc,nDestPos);- ?1 I" ~/ @% W+ P1 J& j
nDestPos++;
9 }( g. O; d: W) s8 ]/ M }* O7 F# r7 b. M0 Z" v8 T/ s
//取第一个元素的信息
* B _9 b% @2 {+ y s0 m/ V% { /*
7 P, p6 u, V3 K0 ], ? if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff) Y+ U0 j3 m+ z K: @
{
. [# x+ V; w2 i( k Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
& |& @. Y2 r$ F/ g# W" [9 G# G' D g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
+ \5 Z0 Y/ N. {- [3 H* _! b* v }
! c5 \: N3 K6 b3 y& l% _+ U */
- o% m p) |$ @" Z3 z //////////////////////////////////////////////////////////////////////////
, c+ d- t1 }$ ?8 w break;5 m4 K. m3 E! N
}
/ j$ M" x" Q* W. z {9 N& Q } ) Y8 p$ a1 [) h
}
% U( [) B: _* D; }7 w' hm_wndMenu.SetVisible(FALSE);
0 F) y4 l# w7 j; @
0 J* ^+ C6 Q; o! \1 j--------------------------------------------------------------------------------------------------------
/ [! T* k6 ~' |! X# `搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)4 w, B9 l2 B0 B0 u5 R- k1 c
{, F9 c( V9 V2 h/ P& W0 f
BaseMouseCursor();
$ U! N$ I6 \8 g3 _5 u" e}
9 N, ]5 J- y! o" J7 ?9 m f在其下添加:
( D, H4 B( f9 s( P* t$ a0 P6 E. `void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
" z. c5 q( n j' w4 l/ Z* N{
% H0 e/ }+ U& u+ d: c: om_wndMenu.DeleteAllMenu();! H0 L1 {9 f6 g+ A6 Y ?
m_wndMenu.CreateMenu(this);
( B1 k+ j6 u; U: F2 x9 `- }5 i* r% fm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
], ^6 R6 l9 d' n' s1 t- Q" d4 H, l6 @& X9 W2 o9 _5 T" Z
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))2 F! D7 G$ `" e9 @* X& g
{ a, @6 M" _, l; M4 O1 V9 P+ S1 y% o# @
//P以上级别才可以删除所有道具: X" W- R; G4 y3 N2 |/ A
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
( r: _$ x" h/ u, M* L9 A4 c3 ?}) C n4 l% W* Q. A
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );( s9 M$ d8 ]. s0 M0 j
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() ); G, W" g! g" j/ p( H r
m_wndMenu.SetFocus();( O6 ^2 ]' @6 r1 y5 ]' H
}' Z8 s) N3 O: b, l; t1 C' f
------------------------------------------------------------------------------------------------------------5 Y* J7 m- Z3 h+ }3 e7 E
*************************# b& q% f; z T5 T( h8 {5 N) V
WndField.h文件
- z+ q& R1 x) H8 ]*************************: s. W7 {; a: e* W
搜索:BOOL m_bReport;3 ` T5 B; D" Q# P6 A6 f) i
其后添加:, \6 d. ~: {8 {, p( ?! u& M
CWndMenu m_wndMenu;, B/ t1 F& C, O( i3 j3 `1 S9 Y
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
4 `) L/ k( t: o4 t其后添加:& ]6 R$ O2 \" I* T7 g( q" D. ]+ Z7 {
virtual void OnRButtonUp(UINT nFlags, CPoint point);4 \8 s" D" f* u# H5 i
# i; V& w4 ?7 J9 C& t( A8 g
6 ? U; u$ c( F9 R+ ?. u" b6 R |
|