|
|
源文件中_Interface文件夹下WndField.cpp文件6 y h0 [6 h1 I6 L
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )3 @* u* f4 N5 A1 c, M, \2 w
3 n$ R# ~8 S7 Istruct sItem* m, L9 O* L R# c7 G h1 Z7 c
{6 U+ k8 {$ {) S8 Z. ]! {% F
DWORD dwId; _3 f8 s9 p- z6 ]$ b3 Z' ^
DWORD dwKind2;; X2 M% o& r$ t9 J, e
DWORD dwItemId;/ F5 w% N; o" n8 t
BYTE nIndex;: b& b+ a6 ]' n$ E& d1 E* n
sItem(){& \ ?# \1 q7 V0 @0 }4 z
dwId = dwKind2 = dwItemId = nIndex = 0;
: M; [& W7 E o' l* {, V}3 q; Q8 ?6 f+ a5 U: `
bool operator < (const sItem p2)
, S8 I% d2 N7 m{
/ H+ d, x+ S$ o! N if (dwKind2 == p2.dwKind2)# H6 e% ]# R6 Y
{+ ?8 S6 y& ?$ t$ R8 G7 L
return dwItemId < p2.dwItemId;
! W& U, E) G. _1 }' P5 d0 A3 I1 f }else{
4 n d7 w3 @( o2 Y. F) q return dwKind2 < p2.dwKind2;# Q( l6 G1 g' a. z& D: g
}
3 Y) R1 Y. B$ D6 V. a$ I}, T. `: [4 J. s3 O( a2 U9 Y
};
9 U9 p q7 |' Jclass CInventorySort
- U( G+ Y- X6 H& `+ g{- F& F: m7 r, ?. A' J/ Y# ^1 e; q
public:
Z" Q0 z6 y' X3 k0 O" t: q5 hCInventorySort()* g9 [( @# T9 t, O* u9 T% G
{
& `& S" K5 M) G6 X/ x2 p+ K m_dwPos = 0;" u4 I+ p% C6 c
}
& W- ~5 G% ]6 Y~CInventorySort(){}
: m! s! e4 V4 \# X0 R' ]& Tprivate:7 v# l% O! _2 a4 V1 e8 {
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息& Q7 p. W8 L* y# a) D
DWORD m_dwPos;) f% r+ Z$ U( j7 T" ]
public:6 c. f/ ~' Y! q* T
void Add(BYTE nIndex)
, s. d2 E( @2 H{2 Q% y- \5 D: l; c! b
if (m_dwPos >= MAX_INVENTORY)2 a$ @9 D1 c: A. k+ I8 |" _5 S. }
{
2 Q) X: `$ f$ j9 B8 e return;
$ S5 K1 a2 Z7 e3 p" x* o }# B g, y) ]* Q- i; ~9 J( M3 l# z
m_Item[m_dwPos].nIndex = nIndex;. t4 ~/ V# b: x& c
m_Item[m_dwPos].dwId = m_dwPos;
0 ~; ?1 D+ [+ B+ Q- D m_dwPos++;
/ h! c G' M7 h: T}7 i7 @9 R0 B: f1 W
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列9 A9 O, q) k6 Y; @3 Z
{
. E5 H! d: Y/ X! s% q; q for (int i=0;i<MAX_INVENTORY;i++)0 i9 L9 U7 D9 b9 v8 N% p5 ` V' ~
{* V, H! Q2 Q$ E6 i
if (m_Item.dwId == dwId)
% [1 r/ E0 c: m7 _" e+ e {! `' v; i! l1 A# {, R; i
return m_Item.nIndex;$ n+ ^. Y2 Y' t! Z; ^$ _
}
: A$ \ Q5 r+ C' I" u, c }* f& a4 g+ x! j) M( s8 r
return 255;" H3 q, u3 v& a' a) l' Z6 o" N0 ~
}! ?2 f& z( F8 f" [* |
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
! M Q8 h+ P* K4 ?7 q{( \2 Q" D: B. X
BYTE nTmp = 0;7 P2 }/ u3 q$ n( i5 R4 E5 ~: f! m
bool bDest = false,bSrc = false;( E4 D# m9 k2 s
for (int i=0;i<MAX_INVENTORY;i++)
. Z( U; ?& v; {3 n' P M+ H {3 Q* P; f, u3 b5 A' F5 w% U
if (dwSrcId == m_Item.dwId)" a2 P; V8 c0 B# C I% T9 @3 l
{! m8 T) B& G# O0 e
//id相等 则 改变对应的dest和src
; h0 ]& s& n, _$ d nTmp = m_Item.nIndex;
1 l4 C% R7 P/ i# S, g m_Item.nIndex = dest;
0 G! o8 L6 T( v0 I9 Y }& l4 F% K* q' l8 ]9 i0 T s
}
8 n9 N+ ^& Z7 I4 B1 k3 o: \ //临时数据保存完毕,交换开始9 S1 k0 k8 U; ]" W* e0 `2 {' x
for (int i=0;i<MAX_INVENTORY;i++)( y; h7 i9 ]$ o" P& h7 d2 k2 ^* e3 C
{7 G8 p' z- Z; W; V& P
if (dest == m_Item.nIndex)
R0 w$ O* b" ]# n {5 c5 R* g! J7 ^5 N
//id相等 则 改变对应的dest和src1 Y4 s, S* w6 r$ Q
m_Item.nIndex = nTmp;
& F* n) _# M# u% ^- X$ N0 C" F/ Y }0 K1 Q N3 w6 b8 C5 Z6 q" m; z
}
! G1 t: E, @* A& f4 m- h}
. z' C5 z: @8 N7 ^1 u};# K% ?0 A, O+ u8 Y& T% Y5 j
-------------------------------------------------------------------------
- Y: @( F0 J9 d o& s- `依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
1 ~# F8 F/ y8 q3 ]! M搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
, r1 H' z( O' F& C, A- {紧靠其上添加:
# u7 r% K/ I0 v/ G J5 [$ [if( pWndBase == &m_wndMenu )
9 Q! e# q5 O. ]5 x; c{
- _, x( s6 F( y switch( nID )9 c# Y& I* ^& E/ x `8 S- H) i
{. ^1 w7 C2 M, l
case 2:
% y8 {+ f1 p, ~: r# f) E {
; t) [3 x1 I" C2 b) y- u3 T. _+ d //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
+ O4 m6 S, x: M! y* R" Z if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))8 w3 r/ G, @/ F$ y7 p1 t$ Q
{
) G5 G- J7 ~: u' J' r' B break;
e1 W0 z0 e# Z" ]5 T( Z }
$ q) n! L) T7 J7 w c7 S0 y for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)# }' `/ T [! B y" x$ m( O; Y
{
3 ]7 I" p( h w9 T% ^9 k c8 `3 Q CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);* f0 z+ L1 [1 f" j2 h/ P
if( !pItemElem )4 c3 _# K E4 h: u
continue; F* c# h4 m$ I
if(pItemElem->GetExtra() > 0)* t( q& n5 G& U8 t( h+ V. J; ]
continue;) N9 U% c N) K9 _ N) A, h: g9 q
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
# C) p6 c: x; _2 e% m' B8 T continue;' |6 i% v' z2 Q7 P. I! a
if( g_pPlayer->IsUsing( pItemElem ) )9 d4 S" I, e7 S& `/ [# Z4 Z
continue;
7 r5 c K- z9 F7 N0 y if( pItemElem->IsUndestructable() == TRUE )' ?7 n, L c) W
{1 b- |) o7 N( \% K# ? j
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
* e$ |+ _6 }4 G, d$ [ continue;8 ^; P- H6 J9 R% }
}
+ \3 R! H& i N+ `' @. B g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);2 m7 @7 N/ t) @% ?4 r
}, [# S! [) V# j( o) A2 B h
break;; s: i" q& [! b: ~
}$ k: E, U0 ?: W( p) v
case 1: F9 u+ _9 F& L) n' a
{- N7 a1 L( E- _5 R0 v, @* N! T3 O
//整理背包
# r( c, ]3 T, Y4 a1 ~0 e //////////////////////////////////////////////////////////////////////////
8 A) G( c# ~2 P( p3 }: x8 C* E3 U //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
6 L7 r3 W) `" m8 P8 w$ | //////////////////////////////////////////////////////////////////////////
' }6 l- G# E8 h) m8 } //////////////////////////////////////////////////////////////////////////
* f4 ?1 Y+ @0 f3 l6 H4 y" u$ p CInventorySort* pInvSort = new CInventorySort;% c) @' M+ {) V" M, U
vector <sItem> vItem;$ I. I, @6 ]' g; o/ f1 a
vItem.resize(MAX_INVENTORY);//初始化大小
t* Y* `- `8 O2 |6 x //////////////////////////////////////////////////////////////////////////6 n! J# A2 f1 s7 Y4 n _. U
//填充数据
% C2 \2 r" j, T# m3 G for (int i=0;i<MAX_INVENTORY;i++)
0 D, D# O% [) d. g9 W! ?0 v" U2 ^2 j% R {% J' S& u F w$ Q5 s% v! A
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
; J1 }- `* g/ R3 y2 M+ P8 D$ m* C if (!pItemElem): d) y% ?: w6 u
{' Q; D# x) p# f3 ~) Q% z
vItem.dwKind2 = 0xffffffff;
, Z8 l1 I) G3 I! ~. Q2 @2 S vItem.dwItemId = 0xffffffff;
# A" E) a0 _ c8 m+ Q; I vItem.nIndex = i;
+ E: `* c' s O }else {% w* D) j6 I/ k8 `9 [7 @8 @$ Y' }
ItemProp* pProp = pItemElem->GetProp();9 ]( s: X- _9 m) |9 n- j- z
vItem.dwKind2 = pProp->dwItemKind2;
1 r& q8 Z! v; n vItem.dwItemId = pItemElem->m_dwItemId;
' A8 T2 P! j# ?& U8 m vItem.nIndex = i;
2 U0 `. ]7 n: L2 d }
% r2 _/ G, x, _* G. Y' j //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
( X% v/ T( K5 a/ ]+ b }. R- ^* c8 ^( h) P7 H, Y
//////////////////////////////////////////////////////////////////////////7 ^* [4 v: l7 r( N7 c$ x' ], Z
sort(vItem.begin(),vItem.end());//排序: p9 a% P; v/ x# ^3 j* R% Q( h
//////////////////////////////////////////////////////////////////////////
; }; T/ s9 D, r" X- q- z8 f. G- O( B9 [ //交换( R9 h- J' W0 m7 o/ k7 D: L
for (size_t i=0;i<vItem.size();i++)/ ?6 q/ {( T/ w
{5 h( W7 Y3 ^+ W4 W4 X5 |; v/ l
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);8 u) m/ N9 C& r. g2 y8 P" ^ g) m
pInvSort->Add(vItem.nIndex);
7 `0 E" ]) m% m" b$ A }( A" c: Q& p- L& M+ Q
BYTE nDestPos = 0;; R1 A8 q% H- ~
for (int i=0;i<MAX_INVENTORY;i++)2 K- D; D' A5 U# C+ @, V, _
{! _, t S6 G% j* P4 C4 }2 p
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);2 R& K9 J1 l8 m! `4 B. m5 _
if (pItemElem)9 e- a+ N5 ` }4 ~ b3 `* I! d2 i8 h
{
: |# r5 y. }% r9 m) j8 x if (IsUsingItem(pItemElem)). y6 F7 y5 X3 ^& R& h
{
; `4 g9 h1 s) g9 @3 p& R3 D //这个位置无法放
5 N) r' m) e& u) J9 N+ M nDestPos++;6 p# v: K" r! g
}
% c' ?. P9 n( [2 t }+ g- |+ w3 E7 Y0 U5 h
BYTE nSrc = pInvSort->GetItemSrc(i);
' b6 x. Y5 |$ r0 k pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);6 R# C+ j3 i9 C( \, e+ m7 `9 S3 x1 f
if (pItemElem)
) z+ z2 U6 Q8 D) z. P, i {
$ |- g3 i' D/ z" n+ W) { if (IsUsingItem(pItemElem))6 t) M9 _' a+ R( n2 ]" l( Q
{+ ~ I) @, l0 x/ y$ h0 q
//这个道具无法移动,跳过
! h6 R5 `& a4 ^ H2 I continue;
0 u" q) g" ^4 A5 |% ~; |" y }
) W" H# [/ E+ b1 Q7 z; [ }else{
$ A. U/ X) }* v D) M6 q! t& [0 W //空位置 不用动
- x' R6 a& K2 c. e7 Z0 N. A, a continue;
# ]0 |1 g# H- ~, w+ L: h }2 c( T3 A. C& \* Y6 O
//////////////////////////////////////////////////////////////////////////
6 z/ G; H' P/ Q+ P //开始移动- ^5 O0 u3 \6 ]* t# |6 D' \0 o9 }
if (nSrc == nDestPos)( H- L, s' E }/ S4 ]& i
{
- V0 U! s% T& I% d( m& ^ //原地不动" K: M( \2 k; w j
nDestPos++;- P4 H7 X H. n# C" c
continue;2 {4 M7 S3 Q2 w% P
}
9 g- e N6 F- o! }- K, ~ pInvSort->MoveItem(i,nDestPos);
- @/ C) x2 n& K/ W8 A! H7 f g_DPlay.SendMoveItem(0,nSrc,nDestPos);
# s# o; ]% K% A& h u) e9 ?5 ? Sleep(5);
* l2 F+ P8 ]! {6 t7 b/ R5 q6 h //Error("移动 - %d->%d",nSrc,nDestPos);& A% X0 V! \1 r1 `+ }% b
nDestPos++;
; B# ~, W" u# @5 \2 X3 H; m0 s }
; H, m# R4 g9 H0 i //取第一个元素的信息
# k% Q0 e/ ?3 X' S* F1 A' _ /*
& f7 Y" f5 x# t4 D if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)# m5 c5 B$ p* r5 T6 {
{
4 t5 w: j. w, S, i Error("Move - From:%d,To:%d",vItem[0].nIndex,x);7 d8 s# ?$ D5 _
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
9 m$ y i5 f- K% X2 W4 G S }2 y1 K5 `# e5 ]$ Y
*/
3 k9 L$ V* I- U //////////////////////////////////////////////////////////////////////////2 W* i: p5 E% H
break;
$ _9 s. _# m- B& K/ n. w- R8 M+ j }2 @: R/ Q, w( U; ^
}
5 {4 B0 {1 x3 c}
) c9 j2 r( S9 ?1 |. D" ^m_wndMenu.SetVisible(FALSE);
; X' }1 M3 S8 N C1 d2 C+ u( W! H) S/ E. V6 F6 } {6 y- Q
--------------------------------------------------------------------------------------------------------5 m0 V+ i5 Y( j# E3 [
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)2 |3 d' x4 O$ n* r
{
2 E8 }% e7 L. F' o% M% GBaseMouseCursor();
/ ]( Y* {& ^% `5 O! s}$ Q" w3 D; H' r9 M
在其下添加:$ P2 e& {, j+ z; g; @
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)+ h6 D) w) w- P
{2 Z# [- v1 m6 c# v
m_wndMenu.DeleteAllMenu();
/ @, x3 Z2 r! ~) M$ R9 B5 om_wndMenu.CreateMenu(this);; A6 ~& U9 \7 w+ [+ `- N
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包"); q* A! \( V. L7 A' Q! C9 K
. ?9 N" N) m- W0 k3 q. Oif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
, Y( C* [5 n% |. o{1 [ x. e% I" P5 {' Q0 I
//P以上级别才可以删除所有道具
8 i& ^1 z9 l4 ]& j m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");" v" L8 S, U: }- \+ N5 U4 K$ p
}# n. q r8 f$ h0 Y* O$ g1 P" F& N
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
' p* A. s0 R% x; T8 h2 |* R4 `m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
# |. ?& D6 K5 \( e" k" h9 L- Hm_wndMenu.SetFocus();
* G/ R% z0 Y8 |}
5 u) Q4 y' J" ]& r& T------------------------------------------------------------------------------------------------------------
# l$ o' F0 q) O*************************' ], w7 U6 C: ?9 I i
WndField.h文件
. C% }; k, r1 W& d/ M# F*************************
, x% z/ h1 h" O* G- x. V7 k搜索:BOOL m_bReport;6 g( g; S' S9 _" N
其后添加:3 t8 @' } q; ]; I6 F% q/ T
CWndMenu m_wndMenu;
$ _9 C5 f: A1 Z: R* L. c, Y搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
% S, e3 ^: ~7 r, o6 Z其后添加:
4 f( f- \+ U( D4 y" cvirtual void OnRButtonUp(UINT nFlags, CPoint point);5 ]! Q9 A( [9 D+ _/ a1 w
, |, P( _& z, d4 S, Q6 E" e
6 g# j2 b: |3 |/ |3 n2 m' x5 E
|
|