|
|
源文件中_Interface文件夹下WndField.cpp文件# `' p. g' `8 U4 G; q
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )0 W2 q# D4 N* u$ O
4 P6 m- x5 P/ t. v+ x0 O% B
struct sItem3 K. P# z5 Q3 ~9 g9 H
{
5 Z9 T G7 L8 C* Y5 v I( fDWORD dwId;
u/ J+ J5 z5 u8 _0 e- uDWORD dwKind2;. B7 B. d4 {4 O9 ]
DWORD dwItemId;" {6 w/ P7 x) t- B$ h
BYTE nIndex;
; P- l! W- f* S9 V i6 ?sItem(){" q# U" \. ?. R5 T
dwId = dwKind2 = dwItemId = nIndex = 0;# h1 D8 L1 N z+ [$ ]) l5 Y; Y
}7 L) X* T. _. ?! p) B3 t
bool operator < (const sItem p2)
) I& {9 x% t4 H1 }7 \{8 {5 K2 u1 r! r7 b4 A: m
if (dwKind2 == p2.dwKind2)
' c, {: Z# x7 C. o; |. R {
. y9 P6 n; u# X2 f return dwItemId < p2.dwItemId;5 n- r( G, J. S8 K; y
}else{
5 s1 a ~* v. G) \ a: b8 V& p return dwKind2 < p2.dwKind2;* Y5 L: u& N/ E9 M* g [
}
0 B! P! }4 E5 e% I4 _}
5 L5 U; d, K7 A y3 [( x: `};1 Q, [% s* b/ v. c( s
class CInventorySort
8 [; v: C9 k# h% v9 D) w+ f{
" Z: n0 c; C; jpublic:
* ?- o% s% ?3 u* ?( pCInventorySort()
* g5 x6 F' B8 E* j{
$ l: G9 [( T1 T s4 z' r! n. O" n+ K m_dwPos = 0;
- I. t% D+ y9 y: B! {0 Z6 ?- D8 R}, [# @4 I2 A* V& l. O
~CInventorySort(){}
/ Q* I( e; m! Y# P$ F3 Xprivate:# o9 @. P, s4 r" A0 M3 f0 V
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息( d; V |1 p0 b4 X' w6 F: q+ _
DWORD m_dwPos;& M" W* u9 g9 u
public: {1 } A/ k# i- D& L( a9 q
void Add(BYTE nIndex)
; q; Y! E: l2 j( R{5 x; H3 n7 I( l( p; R
if (m_dwPos >= MAX_INVENTORY)0 H& p* g% c, L. W% }: p+ n
{
7 f, @" C0 y+ v, J return;
8 \2 S4 p6 @% X# J7 w! F' W }
) P% y' H( w+ j$ s Y2 c m_Item[m_dwPos].nIndex = nIndex;
4 m8 d, O$ ^5 \* O/ k8 L m_Item[m_dwPos].dwId = m_dwPos;
6 ?- E$ Q y% ^ m_dwPos++;' x& g% C% t" G) i; p9 w! }5 j3 ?
}, [; l" F! i, E' i( @
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
; g1 b" d% |# p4 E- d4 Z{
; W- i w9 m: W. j+ F8 L for (int i=0;i<MAX_INVENTORY;i++)3 S7 x# N7 h( x
{
1 \, h6 C+ e8 ?& X" X6 q$ }/ B9 D if (m_Item.dwId == dwId)" l& o% w2 H; U# y) o( f
{- p2 b+ U: z) p3 T
return m_Item.nIndex;$ g! d$ q' m0 @( U. a* q
}
; q1 i6 o1 }: | }7 R+ ~# _1 i$ v2 H @- Q! ~$ _+ w
return 255;
( Q5 @2 w6 }2 E% a; c" v}. b6 |# P) A: j$ U9 _7 p6 y
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
, V3 x6 g u4 P- K# [$ L: E$ C* h{5 m. e" F& o8 q+ @2 T$ z, o
BYTE nTmp = 0;
+ j2 R/ F6 F* J) ~/ b* u bool bDest = false,bSrc = false;' d. \( y+ `7 N
for (int i=0;i<MAX_INVENTORY;i++)9 p: s# o* R2 `) Z0 M
{ ~1 E5 n6 t# l7 ]5 C2 Z/ I
if (dwSrcId == m_Item.dwId)- K: l; k$ ^ s1 K+ |3 x
{3 U( S5 E, M! \$ K1 E
//id相等 则 改变对应的dest和src J, r; _# q' w5 x& ?6 ?! L
nTmp = m_Item.nIndex;( p7 f8 A- g% x0 w; S4 m0 p3 R" I
m_Item.nIndex = dest;8 g7 ?6 k2 c0 y0 e, f
}
% p- }& C; E2 M. C! O }& C9 ?! t. z9 Q# v
//临时数据保存完毕,交换开始
; `9 \9 q, {3 s3 o for (int i=0;i<MAX_INVENTORY;i++); P4 e+ ]6 p; X9 Q" }+ a$ ]
{
/ E, g1 I; D3 `) I if (dest == m_Item.nIndex)6 j' E# ~! d5 J1 T) c
{8 L( H/ |, n S8 S b* f
//id相等 则 改变对应的dest和src9 \, |' w. ]1 }; i
m_Item.nIndex = nTmp;
3 x# g G5 r- |6 p/ C$ N3 g }! I' X& J# U7 O+ a' Q8 r/ S
}) q" w ?- _/ Z& q
}* G6 v0 R: r% Q+ j- w( K" [) I* Y
};
! p. ?6 U- |$ J-------------------------------------------------------------------------0 C# T% h1 |5 {5 c; ] C0 e- n: V
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
. Q( L4 Q7 e- H4 X搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
- I1 O' O( R+ Z3 U, B, w+ A紧靠其上添加:1 U3 P9 a* H/ d
if( pWndBase == &m_wndMenu )2 O2 j8 }+ `1 T* S4 ]6 L
{3 T \! j. j5 u$ Y5 f) X
switch( nID )0 a/ c( X( o3 n* }4 r2 C
{. }) ^1 B, \5 y' b+ h: @8 i
case 2:% @* [0 A1 m: E+ W w$ U8 _
{
1 q, Y& K2 O, s$ U$ N) L //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
, H8 {! o1 W$ V; T: X7 b. ] if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))$ ]- J, u7 g; A2 y
{
* X0 `, e; `3 z/ d. j, I break;( y, z: J, g3 [. F1 {4 M
}* R$ [1 d2 _8 F+ V+ M
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)/ i9 N7 [0 ?7 J* K2 W8 ?
{# }, \: q2 r, w. P
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
; R: |* h. F5 @3 D if( !pItemElem )$ y8 l* J% H( O8 t) x3 z/ P
continue;
( M; V7 s6 k9 }3 f' r8 t; y if(pItemElem->GetExtra() > 0)- a3 [' O" y, \0 l5 [
continue;
& {* v, ?% [. u. p' K- U if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
: A1 ]5 |. D: q5 v9 u continue;. G, G8 ~3 w$ J8 x) w# H
if( g_pPlayer->IsUsing( pItemElem ) )( E# r; u" x ~6 t& @
continue;
$ o% Y! G" T( b$ `. d: g if( pItemElem->IsUndestructable() == TRUE )7 z: s: k( Y9 H
{0 K. z; [6 Z# i. b% j- ]" K$ F0 s, p
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
% s- x2 [6 I" [5 H) h continue;
( ]: W3 A' `1 J$ n1 \ }( x2 A: g4 d( y3 ?* p
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
4 V/ A. t; t; t }! X8 g7 @4 Z/ O8 v3 n* c
break;
' f! t& Z) q: y+ f' r }9 H% ?. V$ p+ h& b( `4 ]5 a
case 1:3 b4 ~ ?$ J7 b# c
{
0 J: X+ c9 ^. ?6 p" @7 T+ [0 I //整理背包
' f+ f* u! x1 l9 s; { //////////////////////////////////////////////////////////////////////////8 k# h+ M* a1 [; W1 i x6 ]8 z
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );8 Z: f: U9 q% K1 O r
//////////////////////////////////////////////////////////////////////////4 a( a, J$ P: c; G1 y
//////////////////////////////////////////////////////////////////////////3 ~7 [4 A8 `0 o$ X
CInventorySort* pInvSort = new CInventorySort;
8 L3 q3 P# ^4 m vector <sItem> vItem;: ?3 A' p2 Z! J: e8 F9 C. i
vItem.resize(MAX_INVENTORY);//初始化大小5 q( p0 N, s& ?5 k C$ m: q
//////////////////////////////////////////////////////////////////////////
! m Z9 z4 L5 C, p; I+ N; f x5 R! j //填充数据
6 Q; N0 P M2 I for (int i=0;i<MAX_INVENTORY;i++): k. {# w( A4 u2 Q6 L* [& \" y5 H9 ^
{5 I5 v. X6 W: V( B
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);+ t7 G' L& [$ X# P7 Y& n8 d8 W
if (!pItemElem)
9 U( }/ |) C! k' I4 U {
5 z$ k9 H4 W4 O: A3 Q4 Y% M vItem.dwKind2 = 0xffffffff; c K, ?6 K) x, o
vItem.dwItemId = 0xffffffff;
0 M M" g& z2 N7 `+ `1 Q8 p: ~ vItem.nIndex = i;
" H' t$ h4 D0 Y4 F7 y }else {. }7 Q' M/ g$ l) [
ItemProp* pProp = pItemElem->GetProp();
' h* h1 H7 h! Q2 P9 \6 b9 _& R vItem.dwKind2 = pProp->dwItemKind2;1 |0 a- Y8 ]- l8 a
vItem.dwItemId = pItemElem->m_dwItemId;
$ i4 F" w7 v6 o# t vItem.nIndex = i;
3 M" @2 b! C/ S) _: g. @. M9 L }
1 }$ l+ f7 p+ X Q/ K5 ? //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);. E9 [4 M- R# A% `6 @9 P. c9 C9 H* p
}) Q. ]$ o1 P$ Q
//////////////////////////////////////////////////////////////////////////
) q) h- M% g4 A" i3 K3 b& F+ S1 ` sort(vItem.begin(),vItem.end());//排序
6 d+ l/ q/ T4 K& E7 S7 T- a6 K4 t //////////////////////////////////////////////////////////////////////////
' n* Z2 E3 @6 Q# t //交换
( t% x5 j, J5 B% H. @- ]: v( H/ a( J for (size_t i=0;i<vItem.size();i++)1 R. s- z6 V4 a9 q
{% W5 _0 l% A3 ? `3 x& x! _
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
0 x, Z* o. E7 H& c pInvSort->Add(vItem.nIndex);+ Q7 J5 F, f( L+ O: y
}
; P" s: Q( ]- v9 z5 V BYTE nDestPos = 0;7 F9 m* o' U! L& y0 I* a$ h
for (int i=0;i<MAX_INVENTORY;i++)! v% r. q- G, K! i5 L" }
{- a; \: d* ]; N, b; M
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
/ u; B) k- }2 T" q! r* _; L! @ if (pItemElem)
0 y* |% h. W6 B. ]! s {
3 [! N( R! O. I/ P. q4 I if (IsUsingItem(pItemElem))
: j& I9 T) h2 i" P! C! ` {/ I8 j$ t, _% u7 W# y& ?
//这个位置无法放
- D, c4 u7 S. V nDestPos++;
1 G, b, K/ j8 l( |2 _* y* p }* K N, z; X7 ]3 F
}
% z- T9 o2 r5 V BYTE nSrc = pInvSort->GetItemSrc(i);
2 m$ Y% U- L" A, @2 t$ a1 ^ pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);0 @) m* n" e1 b9 n5 q/ x
if (pItemElem)& S3 o/ m! Q* L: M1 N5 N$ v& z" f6 a
{
/ a2 g- R0 G+ V* A( q7 A' @ if (IsUsingItem(pItemElem))
) _7 q6 d: y- N5 l% g {
" f9 [& K% {4 c8 b9 _& g //这个道具无法移动,跳过
- S9 P! f8 D5 ] K continue;
1 S f* g* y% ^' s4 f4 ` }6 \ r$ X: u7 b" v* {
}else{1 D& r# y+ i. V/ V4 i
//空位置 不用动" P5 I6 d+ O/ e/ f: R& K
continue;
; ^4 d4 t" A% C: h+ @- W }0 Q7 E+ v! M. p, |1 k
//////////////////////////////////////////////////////////////////////////- V5 \7 q! K: y2 M' t# ~
//开始移动
" V$ N. I* K+ y) P7 h' Q' R if (nSrc == nDestPos)
$ o/ [8 y S2 S$ D; u5 @( ~3 J {( Z& E" t3 R" N$ v
//原地不动/ Z: N1 r5 o7 [7 b# D; o
nDestPos++;: u" c( S, Z2 P3 u+ y* T0 W1 q
continue;
5 ^3 R5 `! p5 d6 R/ p9 Q) X }: `# O" D: U9 n& [& _
pInvSort->MoveItem(i,nDestPos);$ W1 Z8 T2 A9 j' C+ [0 o& |
g_DPlay.SendMoveItem(0,nSrc,nDestPos);% T) y, B* M# \
Sleep(5);* d" V7 S _* ^6 ?( w' C
//Error("移动 - %d->%d",nSrc,nDestPos);0 a% p) ?! m3 a+ i3 b
nDestPos++;
& }* E3 M1 _5 ]/ u }
2 o8 L$ X* y; h8 Q* |# x //取第一个元素的信息
# v) d1 S: G$ q& f" G /*# @0 P" z0 N% s1 b
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
9 \9 d6 i. U4 F" T) e: G+ i0 r3 c {
% v! L' c8 R3 ?- U. ?( t+ q, m Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
$ H, [" {4 N* [( E! `/ [ g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
" h- z0 \, x6 r- x1 Y( e }7 t4 G8 X1 \) w: y
*/$ n( t. i! K2 t; {2 f i- t& N
//////////////////////////////////////////////////////////////////////////
7 s/ c1 n- \; x8 Q: L. @3 w; |) s break;
+ @6 F$ Z; I0 e. S& ] }% G; I# p# g7 i$ X7 ^$ J3 l3 \- r
}
7 v2 X3 h. d$ x Y" w+ |}
, b, [/ I- o* F9 P4 |m_wndMenu.SetVisible(FALSE);
1 b! J6 E' A8 I2 ?8 U' p0 d
# g' J# l0 l. z3 I--------------------------------------------------------------------------------------------------------- o M V. B) m
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)# ]1 Y0 j, L s$ c! x: e: O: F+ k
{
6 v( k5 ], J7 v( {0 M/ mBaseMouseCursor();
% N( O+ n0 k$ C) c. i: d}: y# d& M- l$ v1 o
在其下添加:9 R( j0 u: @0 F7 I
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
* W# `, b( Q D7 M) D2 W{
3 ^3 d3 `- n Jm_wndMenu.DeleteAllMenu();1 i; w! S) [, _, [6 w3 P3 j7 J
m_wndMenu.CreateMenu(this);( M# p1 S( g- Q2 z8 e( c" E
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");+ o) ?! a% `& e% Q% Z
7 G8 A7 h, H9 T" B4 D% Y* fif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))" o# `: F/ J8 `1 q
{
) J- v/ X$ x+ N0 p6 h0 D3 ~ //P以上级别才可以删除所有道具
1 h+ M0 t p/ t3 D$ |- |2 h m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");* F3 v$ A) w& _8 w
}; @% b& \: q; ^/ B
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );3 t$ V2 i( N' F! ], E- `8 D
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
$ ?& C" X8 E& Om_wndMenu.SetFocus();
& M1 f, b$ O" w# |3 @6 h}
' _ O4 o: Q. }, Y0 C- y$ s' _& r$ z9 w9 A/ {------------------------------------------------------------------------------------------------------------ T _% }$ G. L4 h+ K b( Z3 J$ O
*************************8 |% r4 R8 z, N B7 A$ ]
WndField.h文件
( @. W2 W/ n5 z1 {, ?+ A*************************1 ~! p: h3 T' ~; g( A
搜索:BOOL m_bReport;( e) y3 N! R( Y, N, K
其后添加:" h9 o. ~+ z, U$ a, T9 M
CWndMenu m_wndMenu;, e( Q5 c4 ~% d- j
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
' C* a$ K, ]! o, ]3 B3 ~其后添加:& u. f; m+ d( H- x
virtual void OnRButtonUp(UINT nFlags, CPoint point);. q6 V' M0 F3 i
! [- F" ~% Q% |% b) ?
: |# p0 s& e8 _! W. H
|
|