|
|
源文件中_Interface文件夹下WndField.cpp文件; e0 a' ^0 U( b W
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
+ {* h$ r2 D& r: k# E1 U8 @7 ^& ~9 m1 v8 a8 |$ v0 Z
struct sItem
" T0 L3 ?* G u8 A# n/ `{& _7 R% I5 `8 f3 \+ f+ w& a U, [3 O/ v+ `/ |
DWORD dwId;
9 f8 E- z$ B7 V1 W+ a+ }+ VDWORD dwKind2;0 d1 l- F2 Y0 U3 L$ K$ k" m. O
DWORD dwItemId;& S" A' a- q+ E& v
BYTE nIndex;; ^& e8 G( c- Y/ [ E J: W; \4 |% k
sItem(){
. t. {/ v' F: v+ e$ P6 A8 G dwId = dwKind2 = dwItemId = nIndex = 0;$ F, Q' t1 `( M! i5 @
}
0 D5 n6 j$ l" s7 \* qbool operator < (const sItem p2)3 w3 z8 v- x/ T9 O5 z
{% R2 E n% m3 ]+ y- A4 a
if (dwKind2 == p2.dwKind2)
R& o3 S7 [' ~ d: G* _5 E1 ~ {
+ m$ i$ x: ?' s! `) u9 |; n9 s/ J return dwItemId < p2.dwItemId;
/ c! S0 U* A. g( E. X5 S }else{4 X+ I, E' X! \/ L
return dwKind2 < p2.dwKind2;* d6 ]" V$ X/ p n* `! m
}3 o0 O; Q7 C% y; S0 Z3 B0 |
}* J3 @8 `+ E2 b) J
};
{' Z& u' x X" l" f$ qclass CInventorySort A% |& _6 y3 A. b1 I- p4 Q+ q
{' M+ }) Q$ ~( i% ^; z F! M
public:9 S. x, O: Q% W9 R- V% m
CInventorySort()5 ~ D, t" z1 y' f! h- P; k( T8 S: G% }
{
# e4 K. T5 X, a8 W5 Z C/ { m_dwPos = 0; y5 D. T) ]1 p
}
3 P" @6 D# X- y& Y~CInventorySort(){}
5 V' o _3 R7 Rprivate:0 q1 k- @: C1 b6 _
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息# f$ k, Y1 n! ?$ y
DWORD m_dwPos;
( [7 C( s* T3 _& n' ~" Rpublic:
i. v+ X$ W4 O- Mvoid Add(BYTE nIndex)6 J# B* r5 W; f: X
{
/ M9 j \( ~( z! Q' N6 {' Y- f if (m_dwPos >= MAX_INVENTORY)$ ?6 c: P/ E" l
{
# D- b4 K3 @7 l& ~, c( b8 w$ e/ R return;/ A$ H2 i4 f# k! o1 o
}
- C Q1 b0 i0 l2 \; U: D m_Item[m_dwPos].nIndex = nIndex;
1 u$ [9 y+ l/ |3 u7 _ i% J m_Item[m_dwPos].dwId = m_dwPos;1 P0 C% o& {' ^8 \& \- e" t+ V# l
m_dwPos++;4 P1 e; W9 ?- p: ~) _" G) a' w$ `
}" w* d' P* ^: d% Q1 ]& E
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列) w5 D- T/ z. C- `, m; @
{
( F; q+ ?; \. A# O. p; j. F for (int i=0;i<MAX_INVENTORY;i++)
( w, {9 S1 ?8 Q# ]. ?' P {
! ?0 G3 e6 U/ x2 \ if (m_Item.dwId == dwId)
4 b4 m7 S& e$ x- ~0 \ g+ x {
( }0 ~9 Q* U9 w; r! T. U return m_Item.nIndex;
; v5 @. i0 Z9 q* X& Z }
& G. j1 Q* [! O: T' o4 u }8 p0 \1 M; F* C6 x
return 255;
7 l# v$ _0 p8 C) O3 l}. o: A6 e) Y2 ]! e' a& ?/ v
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置3 B* G: j0 C+ F9 j0 i0 l
{9 ^8 F7 y0 b z8 v5 B" F9 {
BYTE nTmp = 0;
2 h: y8 {) w8 m: m bool bDest = false,bSrc = false;
9 ?% [+ M, n7 x; I& C3 Y0 b for (int i=0;i<MAX_INVENTORY;i++)
" _' v- g0 a3 v6 i: \7 T5 E {
" Q3 `; Y: x+ D, l) ?; C+ d1 g9 P' G, A if (dwSrcId == m_Item.dwId)
, h# d- n8 t" z$ t, k# K$ e {
5 O8 A* _+ B4 ?9 Y- B$ X( U { //id相等 则 改变对应的dest和src( x3 [! Y' D+ q4 e
nTmp = m_Item.nIndex;
) u0 D2 L, J2 I4 | m_Item.nIndex = dest;2 M- t, j: H8 |: z; U ~: e+ H
}8 B# p' c( q! }% g* D
}
f2 u$ p U2 k //临时数据保存完毕,交换开始
$ K; J& r0 M' e- P- s* I3 Z0 P# S for (int i=0;i<MAX_INVENTORY;i++)6 l2 K# P0 Q5 }2 ^" C' u7 [, k
{3 Y s: i/ d4 Q
if (dest == m_Item.nIndex)% P+ b& c( v* n1 | Z' C5 m6 i
{
& H5 p+ H1 \' n4 v; R# w; u2 v5 Z //id相等 则 改变对应的dest和src
+ q" i1 R F; T: o2 M m_Item.nIndex = nTmp;
5 |$ S& |3 R) e' r }
" c! B0 i& h8 y }* K" I8 s! I8 a1 G/ l4 Q* [! j: K4 G
}+ ?9 _8 t% M, A. l
};
: ~" [: X7 S& s: a5 {, y$ Z-------------------------------------------------------------------------
* X) Y+ v. ]3 b' a' ~, w依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )4 D2 z( d, ? X- L/ a; K+ @9 W- `
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
$ i; G' q$ O! L5 n6 W紧靠其上添加:
6 i6 L. `0 v1 Y3 Cif( pWndBase == &m_wndMenu )7 b" R( B% ~: y( G9 v5 I* z
{
' ~. C! h/ H5 R+ |/ Z: } switch( nID )6 Z, l/ M+ f; V& M
{
) u) b# H/ n, E9 G( E8 b# ^7 L; C case 2:
( v1 M6 X" R. ~1 K" ~" Y% ? {" s h" i, Y0 E0 h( F
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);& u/ F: {. ~5 A' }+ B
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
G* p b2 P7 U4 X( ` {$ ^( v1 ~8 P( W! T
break;
# |' z8 w; }: V" f4 `" k& S }% I/ a8 G4 Y& S; w
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
( K7 X3 J' B: m. m$ t {# d- y+ z; d. P9 ?9 ~
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
# i# {7 [4 u% U' l) A if( !pItemElem )
/ B/ u" C9 K/ i" O( |- @ continue;* e0 Q0 G7 O5 N8 M( ?) K
if(pItemElem->GetExtra() > 0)' w0 f0 Z; E. Q
continue;. J: p, m$ k8 H1 q
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) 5 ~. l% h1 A# J% S
continue;, L: N: ~+ U. y, W0 N; y
if( g_pPlayer->IsUsing( pItemElem ) ). H! t5 z6 q8 C' ?% N# w; f. a
continue;
* p' c8 L! x. {5 L if( pItemElem->IsUndestructable() == TRUE )
! I8 X% a5 B, z6 D, s+ g4 E6 ] {0 h& ^0 ]- u$ |: S
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );8 F) i/ @/ [4 e
continue;6 o0 Z+ X: @3 M$ ]5 p/ h
}& U3 o: k4 Q: T1 p
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);, K: G! Z- G T& T! V0 a% B
}6 A& \8 x& ^3 V4 h- ~+ c# }, `
break;
( i; p; j) j" s R7 E }
$ a* j* v) B4 {" b case 1:
+ b, V2 v ~$ U" j g {2 k8 ]/ B \) v/ u" n5 ?" v" ]
//整理背包
/ q. H+ L s: z0 I* T# m: v8 J7 q //////////////////////////////////////////////////////////////////////////
# Q" O8 F2 O5 E/ ` //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );% Y# [% {( ], p0 Y
//////////////////////////////////////////////////////////////////////////
" L- H: f3 H2 a# l1 G/ j4 C6 V8 X //////////////////////////////////////////////////////////////////////////8 E0 A, I) D5 `9 O) @
CInventorySort* pInvSort = new CInventorySort;
. a4 K# |6 G& a4 n+ y- I vector <sItem> vItem;$ Q9 `/ m$ O4 Z0 y% O8 c
vItem.resize(MAX_INVENTORY);//初始化大小
! T- I. A* C6 ] //////////////////////////////////////////////////////////////////////////6 b* L Z# g6 _ W& @0 w5 g
//填充数据
. E, C: e. N9 h; h' ? for (int i=0;i<MAX_INVENTORY;i++)+ g" i6 e. r0 X. a" m, o5 H5 G/ B
{1 {9 ~8 R1 ]9 v5 a4 r8 ~
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);. G$ B2 m1 k% j: q( R
if (!pItemElem)
+ w1 F2 L) L% i: w; T* V2 q& G {; \) k( a0 J) J! [5 ^5 v6 b/ U
vItem.dwKind2 = 0xffffffff;" x+ {6 Y6 v% U' _5 n
vItem.dwItemId = 0xffffffff;
5 `# h1 P' I% H1 a R( n vItem.nIndex = i;
! i' t! Z" X% B8 ]/ W) R9 t6 \2 L }else {- g& [4 {; p- {* }! g9 y) }& ~( z- }
ItemProp* pProp = pItemElem->GetProp();: h V! O' D% y, a
vItem.dwKind2 = pProp->dwItemKind2;
% u: u# E, q5 p" }3 E5 p vItem.dwItemId = pItemElem->m_dwItemId;
5 F/ y! n3 }3 Q7 i# A; @- G; d vItem.nIndex = i;
, M( j J8 i5 {0 ~5 y }. ?# I. V) e1 P0 F
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
: l8 d- H+ n& f: J7 A' f }
X1 s& e# u2 D$ P" x0 _; E //////////////////////////////////////////////////////////////////////////* o; }( K# M# r0 z
sort(vItem.begin(),vItem.end());//排序
$ Z9 n7 [9 C8 h7 T4 M# ^ //////////////////////////////////////////////////////////////////////////+ n- M" I/ l$ E, |9 K/ S5 }1 O# H
//交换
. s5 N, w3 }' Q' U+ I7 M, U for (size_t i=0;i<vItem.size();i++)+ w7 h. e# U% E/ e
{
5 |3 `6 ~5 R2 g //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
* P7 c" f/ V6 G5 r; } pInvSort->Add(vItem.nIndex);
; H3 {% W6 O5 ~9 N, P* f/ V }+ {* k4 u, W- M7 s3 J
BYTE nDestPos = 0;
) X" ^- M3 a& @7 p/ @ for (int i=0;i<MAX_INVENTORY;i++), t: M" _2 V' u6 e: h
{
0 n" h, X7 M( v" ]6 k, x; B CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);& r4 H" J$ c! V/ W" A# ~ m
if (pItemElem)
) K" a) E2 e4 f" D# G7 o4 Z {
5 {7 A3 f. T0 d2 G" o# i! R if (IsUsingItem(pItemElem))4 F& H+ M1 h r7 g, u+ K! M, w8 x0 I
{% U( _# f6 U9 | _, E; v
//这个位置无法放
+ A9 _% @. A, @ nDestPos++;% r ~* c4 _- Y& o8 c6 n) @
}
5 B1 ]; R4 S# q }6 S7 N, m/ n9 ?6 M7 k& W
BYTE nSrc = pInvSort->GetItemSrc(i);
; I; d9 Y. S3 r( i4 E pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);* ^1 N D4 L+ H+ I. ?
if (pItemElem)
' ^# a+ ?8 ^; W& \ {
1 d$ ], H6 E+ {, [) L7 T if (IsUsingItem(pItemElem))
; a2 Q, W b+ V# ~; @ {' O! d8 c9 K8 R
//这个道具无法移动,跳过7 H8 D8 \7 c1 L. C
continue;2 n5 k9 x1 n& M5 W( F6 w
}
& I5 F7 Y O) W5 i }else{# {; |0 z' D+ U% H- B9 a4 i6 {
//空位置 不用动0 G) h) N5 J8 W% F
continue;$ D, I6 w$ F+ L8 |
}
7 s4 Z9 Z4 b. B3 q7 A) ~ //////////////////////////////////////////////////////////////////////////# M. ]# b3 x6 v; a/ V6 R
//开始移动+ b) o% d& K8 y a# @; s- |: i6 E
if (nSrc == nDestPos)3 P4 D# B9 w) A7 y$ [1 I
{- t) V! \( T; E3 ^: q* r, s3 j
//原地不动
% c, \' ~: }% C! t: v nDestPos++;/ ]; Q4 v5 r& p6 i6 w* e( d
continue; z d8 k8 w* u/ L ]! j
}# R5 L4 c, x" W, U1 I
pInvSort->MoveItem(i,nDestPos);: v6 B k$ N; V2 R2 L
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
' _( `3 H7 `8 P r9 X Sleep(5);
5 o/ f- {$ N* x1 g //Error("移动 - %d->%d",nSrc,nDestPos);; _1 u/ z1 e( K( ~, u
nDestPos++;: C( `. ]3 ?- o$ a
}8 G! W' k' _0 ]
//取第一个元素的信息3 _- h. ?2 z" h% ?. C. k
/*
" j4 F4 F9 R& r7 Y if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
1 h4 x7 ?$ S+ h1 D2 I" ]: v4 l5 Z {
9 Q, o u3 q' Y- w4 E! [ Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
8 y3 d# I7 ~" |- r" X$ m! u6 i g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
7 d- i9 k8 L2 }4 r }( B# s' M4 K/ O
*/ `* K5 p. X/ M j S, I5 _$ p/ ^: y
//////////////////////////////////////////////////////////////////////////) w* Q) | O' L0 @1 ~, p
break;
) q: }! T+ C, _# `9 v6 b+ u }
0 ~& |- ^5 s* a$ a% u9 q3 {, I }
* i6 K7 t" X; ?0 t5 P7 H}3 r! j6 \: z' K8 n1 w7 n
m_wndMenu.SetVisible(FALSE);5 `! s `9 {" p
" K. N5 l% E3 }8 t W
--------------------------------------------------------------------------------------------------------
T0 c! Q" h4 p4 F' ~4 Y搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
* ^. B1 z$ \- ]: \2 H; Q0 a{4 J; U0 ^. j& p* L! Z1 Y
BaseMouseCursor();' j. O4 d' l; @
}
, u" h& A% I E5 k" u; J# S在其下添加:
2 i! k4 s( ?" D Y4 J. s# S- ^% {void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
$ h3 h+ ?. a8 Q i{5 U Q& u% Q. Q0 [ P
m_wndMenu.DeleteAllMenu();
% f/ Q2 J1 C) l9 \m_wndMenu.CreateMenu(this);
- v' f, _ n* Rm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
6 c1 N6 c. r, v4 a) b+ l7 ~! I7 w; w) S
3 f. T; m$ V- {! |, Q" |if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))9 p9 F$ _$ R* t9 C
{
: ?8 k$ R2 Q7 i //P以上级别才可以删除所有道具4 F: Z( J5 T1 ~8 X$ }" C7 }+ H
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");( Z4 G4 P4 @" ^9 z9 S# q R; @
}7 s4 K8 g2 L* j' X' Q3 p1 E
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
+ Y, z. x1 o# Y7 C1 [m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );9 _9 u; t" Y/ E2 ^, L9 j' M+ X
m_wndMenu.SetFocus();9 V/ h7 X, C: B
} k6 e. |' L9 q3 {
------------------------------------------------------------------------------------------------------------
9 z4 [$ y. |4 q& O) A( ~*************************8 l& h4 ^) Q! j, c E" A4 V
WndField.h文件" U& D" L/ ~ M: G1 k( H; _3 s# s
*************************9 V7 D5 ~8 Y$ I, k0 {6 ~, ]" J! W
搜索:BOOL m_bReport;. L1 B* s& J; t# r6 X3 c
其后添加:
1 e) \2 b O7 G) P5 ~" U6 I! HCWndMenu m_wndMenu;
1 P# H* r8 y6 O, H8 h& k搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);* L( ]( A% U4 X* k2 i0 ^- g; l) O
其后添加:. @& i1 P9 v% ~5 @+ k- V: A
virtual void OnRButtonUp(UINT nFlags, CPoint point);, L" }' T+ C8 g$ Q! H
4 H' {8 y# `0 c( i7 ? ?& l
: E9 G# J( P/ h6 y. ~ D |
|