|
|
源文件中_Interface文件夹下WndField.cpp文件
, H7 ]3 ?" Q1 H& S% w搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )$ |- B$ n6 a9 z0 ], K
6 s2 m5 f8 t, k7 }2 |$ Y" \struct sItem) g. k6 N U. A. s
{% n6 A# T3 ?3 I5 _
DWORD dwId;3 @% Z' R- t- p( [- X
DWORD dwKind2;! V# ]2 b5 X" e% V- m
DWORD dwItemId;
% d- h: D! W9 F P: ]BYTE nIndex;
! a% A+ k0 F4 a: N& QsItem(){% \0 W7 _" t+ c
dwId = dwKind2 = dwItemId = nIndex = 0;
% p6 k8 `5 `3 T1 r- U}
* a- u M6 @3 Z, Obool operator < (const sItem p2)
) l4 a. Q [+ Q! m6 v0 P{
, a; M% d+ {( V$ O! g$ [! \! I if (dwKind2 == p2.dwKind2)- H: N4 A0 [" s1 v V( G+ G
{ d/ c8 B2 u7 k5 {7 {: o$ k
return dwItemId < p2.dwItemId;; x5 A( K- [% q" R0 h
}else{
$ Z. Y( Q0 t5 ^/ ]7 L- d/ n# G return dwKind2 < p2.dwKind2;& e0 I1 o: f0 a' g' B
}
0 A' [/ ]# H( ?% H; z, C* B}0 N: P! P0 P5 p0 k% C; y
};1 K# p- H8 x$ m) H7 r2 K5 ?/ X
class CInventorySort2 i5 t/ h Z9 K% [
{2 S0 m k: E g7 G3 {7 k1 G; a
public:' }: Z: R+ ]$ H* ^4 X
CInventorySort()* L+ N+ L2 l& n- |: c- p# Z2 I
{- x/ {0 v$ `' _0 b
m_dwPos = 0;8 g8 {% o* y$ ^$ A6 M
}( q% v% s$ U$ Y) |- m( \, [) e; a
~CInventorySort(){}
" j6 Y& `/ n0 j9 Jprivate: t/ N* H6 E& D( K- t2 M5 ]2 i
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息6 E3 P i+ {; j! W
DWORD m_dwPos;
) V3 B+ H$ L! a+ | V' h- Z3 {public:
* u7 Z @4 F" F# q e2 tvoid Add(BYTE nIndex)
2 _* F6 r! h9 z9 S{
- U5 d0 B3 B5 E' _9 d' W if (m_dwPos >= MAX_INVENTORY)- M) w0 t% s0 d- Z- F4 ^& E
{( I* T& u. S2 Q2 s7 _4 f" T2 S, T
return;$ I, y7 b F6 U
}0 U! u) {, D4 b! O/ Z1 R0 o: d
m_Item[m_dwPos].nIndex = nIndex;
& \! j9 O; c2 S" e+ x8 M [ m_Item[m_dwPos].dwId = m_dwPos;
# |" f$ h$ q" Q- L m_dwPos++;
( w6 q* {$ _: I: [} Z* q! R* L" W8 T3 C
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
% ^. b( b; ]: G' j2 y- e- G; {0 |{
6 A4 K4 V D; D5 l1 W9 c1 D/ k8 q6 d/ } for (int i=0;i<MAX_INVENTORY;i++)
& F0 ~- a1 x4 l {: f$ l! _- H% D+ N- Y
if (m_Item.dwId == dwId)# Q0 r& c" m' {+ W& l- }0 Z
{
. `! P1 T2 y3 g+ V/ I( b4 [ return m_Item.nIndex;
{% i/ X7 J; Y; T; Y; u+ b }
1 N% P8 O4 Q0 ]& U4 \/ ^/ q7 | }. J7 h% R" ?, c
return 255;# e& Q& A6 |+ A$ O4 O; t" R
}
6 e8 [. ]3 E9 | C7 Cvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
5 b/ g) m7 j! w1 N{
" s ] m5 L! J1 P4 n/ C BYTE nTmp = 0;
1 R9 a! T. a7 u( u bool bDest = false,bSrc = false;
1 ^" t. T% A3 H2 o for (int i=0;i<MAX_INVENTORY;i++)" ^8 z7 T1 ]7 @
{$ R- S) I: Z- S2 F) f8 ^
if (dwSrcId == m_Item.dwId)" b$ T) {" T$ o' a
{$ C C( X; _3 v; M" f
//id相等 则 改变对应的dest和src; Q$ G# n, Z$ F" [
nTmp = m_Item.nIndex;
( n& x8 D/ s9 w m$ l; G4 j m_Item.nIndex = dest;7 v0 ]5 h5 B6 s3 ]
}
; L1 h4 M% I7 S/ T" u) _! A1 W/ ~: k }
. z/ F# c8 Q; w% D6 o //临时数据保存完毕,交换开始: C2 g9 g3 O4 Z6 i8 `" C5 F
for (int i=0;i<MAX_INVENTORY;i++)$ y/ l/ ~! W1 E. ]5 _
{
9 o- j- j2 { v) Z if (dest == m_Item.nIndex)
# A, |, u O8 D- R( E {" y, G" Q6 F' N: ~2 J& _
//id相等 则 改变对应的dest和src3 ^1 K1 [% { F
m_Item.nIndex = nTmp;
! V5 s$ Y9 s1 ~! u2 U }5 \9 |. y3 D% t/ F4 j2 u! I
}5 V# m, [9 v6 U3 s! s J. s. T. o
}
4 c* x' g6 }$ \4 ^$ r& E) j};& E9 n4 e' x+ d3 t" e3 O
-------------------------------------------------------------------------
7 x1 e7 Z3 ]6 T' t6 Z, b- W2 b1 H依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
6 U4 ~/ ~6 W) T5 [搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
) X3 I1 }3 v7 J- ]% p' ?紧靠其上添加: M7 s* j: i% o: q* ~* b, Q0 ?
if( pWndBase == &m_wndMenu )9 v7 r( s8 e+ _* f5 w
{) [: G1 j. h M- H
switch( nID )
- ~1 [% z! Q6 g5 W$ n {) }8 G1 [" m) u7 h) N4 a/ S
case 2:# N5 S5 d4 m) v7 t
{5 g. [+ `* q: O
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);; K) \& g( i* j n" G
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))& _. K, o! ]6 b7 @
{
; k3 j; R/ R) N break;/ ?: W& x6 f ~6 V) W5 [3 X' H
}6 {2 D" O; e% N5 ]/ s: I" M/ z
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
5 A* y, {, I, B1 }. i, I* c$ l {6 v2 x4 y' y! n" L2 }# o" i
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
' L: L% w, b4 H3 x5 | if( !pItemElem )
* z* w% y- B! O! j, Y continue;- i' b8 l( @8 F' S' o; T
if(pItemElem->GetExtra() > 0)* z9 ?' a6 I( B
continue;
% o* ?- `+ y) \& Q2 K if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) ; {) a/ y2 H$ c, K# w+ W1 k
continue;) O6 J% K2 C3 n4 }8 N
if( g_pPlayer->IsUsing( pItemElem ) )6 i! {# I: i& o; V( P
continue;& l& P3 g e; q9 u3 g/ P
if( pItemElem->IsUndestructable() == TRUE )
7 K5 o0 u# L* k! F0 H% k( X7 g5 A& g {
6 l1 ~6 x- f4 T7 q6 V+ F, W0 e g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );0 u2 a# _# A0 h" H1 _3 Q' y
continue;
1 Y( S) B, X2 D ]& b6 d% A' U }
7 f8 M& m$ E( p/ n g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);& |% b+ T. j) _5 K5 E- y: @
}
2 u- Y4 P, e! ?, \5 Z5 w break;0 I* u5 ]; X( A# i8 S
}; k5 F" e/ Z+ c* B1 f- D
case 1:2 h4 Q# c; b' \6 K
{
: O8 d8 w1 }' C! w, W) Q //整理背包' [/ R; e$ f9 z% w# J# E+ _" i5 [
//////////////////////////////////////////////////////////////////////////( ^% w3 A, y) f% @, I( q+ [5 C
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );7 k6 e; z- Z0 d. u- a7 i& ~
//////////////////////////////////////////////////////////////////////////+ M% v6 j% E+ z4 X" h1 F
//////////////////////////////////////////////////////////////////////////5 h7 B1 N2 S+ y+ k: ^% b, N
CInventorySort* pInvSort = new CInventorySort;
8 u2 r7 w* [0 H vector <sItem> vItem;
8 h8 E7 d) ?9 a' W% L vItem.resize(MAX_INVENTORY);//初始化大小
; F8 R" w2 j4 g( O3 y- z0 }, } //////////////////////////////////////////////////////////////////////////
* a9 _) M, B# u1 Y# [+ } //填充数据
( X j/ D0 O/ c1 o3 o+ R for (int i=0;i<MAX_INVENTORY;i++)1 ?" N8 r1 p. z A' L9 z
{2 U) j9 B6 h. q
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);6 p4 T4 s) o3 K4 z, }$ [& F
if (!pItemElem)
( G& Q9 l/ d" M! h# ` {
9 Y5 _3 E: u/ p4 x vItem.dwKind2 = 0xffffffff;6 h) B% b- l" |% m5 O8 S$ ^: k2 d- [7 `
vItem.dwItemId = 0xffffffff;
{+ Z; t8 F- M9 m9 N; s$ t2 j vItem.nIndex = i;1 e( r+ [* z$ {+ k) o( j0 }: O6 E
}else {
: H! y3 s$ I) F; O ItemProp* pProp = pItemElem->GetProp();
# Z `) p# N* p1 F4 Z vItem.dwKind2 = pProp->dwItemKind2;
4 F, x' T' i- n. S vItem.dwItemId = pItemElem->m_dwItemId;! i% i9 g; b M1 B
vItem.nIndex = i;
- v! v* Q. e5 K' |7 h7 ?/ J9 V }! [/ g2 ]/ Q" a8 x5 _' i% d
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);6 B0 u6 p/ a( ^" e
}
7 S( D! M5 _* w3 {( |* h# z //////////////////////////////////////////////////////////////////////////
2 o3 j. V' Y! a. h' O sort(vItem.begin(),vItem.end());//排序9 a, Y6 v' e' z+ b/ h
//////////////////////////////////////////////////////////////////////////& W) S ?5 S; _* [* M+ L7 o z
//交换
( x! k( }$ N9 O* q' g5 m for (size_t i=0;i<vItem.size();i++)
. Y* A! j+ Z4 X5 O0 H L6 z% [ {
% Y( ^9 a2 L$ D) g2 g% B //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);8 F2 U; X/ m$ L) x
pInvSort->Add(vItem.nIndex);
' i, ~3 @9 M/ `; k, u+ P ?7 O G' W }
/ Y8 p5 {6 k$ { BYTE nDestPos = 0;* \: G( y- w& R# L. J% k
for (int i=0;i<MAX_INVENTORY;i++)
3 L& N# U! h0 N7 a8 o {
2 t6 b+ ]+ ]3 A" e CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);' _& W4 ]. y9 A) e* T
if (pItemElem)
C/ S# M* r, m7 L" P% x {# G: C' N3 k& [
if (IsUsingItem(pItemElem))
1 n5 X3 r1 C0 Y: i {
/ w; b/ h! K% U: d, m6 J //这个位置无法放8 n1 W4 {* |9 r5 G' T, y
nDestPos++;+ F; R+ M8 {& ^% M- F, A+ O+ ?7 E
}7 }- r; [: W5 ~
}: }( u0 U/ g4 @
BYTE nSrc = pInvSort->GetItemSrc(i);8 q9 j4 t+ S' Q' j) S" V0 k
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);2 {# S. C, v |9 f3 T
if (pItemElem)1 M+ h( h- N# I9 B8 ^
{
) ]8 z" }" Z5 c% \2 z7 r9 @7 l if (IsUsingItem(pItemElem))# _+ U+ t5 Z" G: h
{, X! V# [) N8 [! Z. }
//这个道具无法移动,跳过
* T p- F( @' h- r' `5 F continue;
" g, e* {: W* e7 V4 \" V& e8 ^ }
, s, c4 p# k' c( L1 r* U4 W }else{
" w% w1 N D: j! N //空位置 不用动
! d3 z0 [5 ^" s% z; w* p) b6 G+ ~& ~. u) A continue;
9 P/ p8 }8 g; B7 ^; e/ V }5 W! E) o4 R8 a; n0 `: ^3 P7 J8 `, m
//////////////////////////////////////////////////////////////////////////1 m0 |# E" }0 K$ U7 a' c. l1 g
//开始移动1 r: p' h; `) ~( \
if (nSrc == nDestPos)* q1 x7 Y' C2 `0 |, k0 d& G
{
9 c" D$ B* s( a [- ^( j0 I7 D R //原地不动
. @! ?2 T- m$ I3 S8 [% h, K nDestPos++;
- ?* v4 h( r5 Z0 w2 @ continue;
5 q6 m, C% T: F( b7 h9 G" n$ N }
+ G6 F* ]" b9 P4 ^7 t2 r9 g4 C pInvSort->MoveItem(i,nDestPos);
" H0 X% c f# e% w) a& |4 e0 f g_DPlay.SendMoveItem(0,nSrc,nDestPos);4 a2 S; _' R6 _- h
Sleep(5);
8 \: L. w; x! K3 O9 T! Z) V //Error("移动 - %d->%d",nSrc,nDestPos);5 p: f& W* m3 @
nDestPos++;$ B: z" S; G9 T7 U" X k
}3 K7 z: a; G% K6 s7 u4 r. R5 S7 W9 `* N
//取第一个元素的信息
8 Q" P. ]8 l1 V1 s% V8 d, G /*5 j2 J# _+ Z" q' t9 t C+ J
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
( P9 v. c( m9 F7 s {
1 Q& z0 ]9 k7 e" s) H% w Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
- a/ j* G+ \6 l. @) o g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);0 O( G j3 g8 t( k: }- _9 ~" c
}2 T' L$ O3 n U' ?0 W) ]
*/* c. X& D; j0 p4 U
//////////////////////////////////////////////////////////////////////////; s2 C: m P' k4 R
break;
$ M8 R/ m8 ^* G, O; Q }
. A. f: {* P: \9 E }
8 K$ @1 D1 v" F* i}9 c- G: ]6 M& z3 z2 x& Y" r% |+ l
m_wndMenu.SetVisible(FALSE);
9 i( f% h) p( W) }+ } e) A. o# \* D9 I; j# S' L# t- W" X+ |3 T8 \7 E
--------------------------------------------------------------------------------------------------------9 K; g7 u% g4 V; O$ I
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
' V+ d$ J) R5 a5 `# C{
2 N! H! ]- d5 w+ u1 V. G- G( gBaseMouseCursor();& s5 o- G8 \3 k* A
}: }5 X# h' N0 D2 E b8 C
在其下添加:
! F6 h" v( O' dvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
4 M3 f N& \" ]3 {0 w! ]! S. t{
1 J# K4 r* Z7 t5 |' r$ K) _% bm_wndMenu.DeleteAllMenu();: T3 H- S, g2 O5 u' |
m_wndMenu.CreateMenu(this);. x+ p; j/ y* G4 o, m" Q
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");. f% A+ X9 l5 b/ |: W
6 f. ]) S/ q1 M. _7 O* O5 x1 x
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))$ U/ j W$ Y1 _/ W: A& A
{
2 V$ Q! Q+ G1 f/ m! c" g0 r //P以上级别才可以删除所有道具
- x6 E; D4 T) W( o m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
% t" U* V$ }& N0 k$ ?9 D+ H}
0 I3 y/ A# K6 L; O9 D+ w* km_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );& r* s( R6 ~$ r0 ]" S' `+ Z
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
! h+ Y0 k! H. b+ g, M p# T* Am_wndMenu.SetFocus();) s7 e* s3 o) x# \! s
}9 z' ]1 ~9 v' v/ O
------------------------------------------------------------------------------------------------------------
7 s) {, l0 Y- l- e$ q: K*************************" E6 U4 B* m/ k4 B$ J% j% h- O- y
WndField.h文件
4 Z+ {) `+ D( o1 e2 b*************************
' P4 V l" x- _, G' s3 l搜索:BOOL m_bReport;
( `9 X( m; f+ y) u0 [8 F其后添加:
# {3 x$ j8 P e$ k! b! ?" x" {CWndMenu m_wndMenu;
# W4 E' }& T+ j& @搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);: w/ L5 ?; C: |; g
其后添加:: ]8 [, ~: t, X7 H$ I/ _
virtual void OnRButtonUp(UINT nFlags, CPoint point);
/ I8 L- t( d+ g+ z+ Z+ @3 K& R1 n! E8 M* j2 O; H* G/ P
' r g- L6 m2 P8 s3 U! G |
|