|
|
源文件中_Interface文件夹下WndField.cpp文件+ I6 x* Z3 p/ T s: @# P! f
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ); Z9 h5 I+ f7 [8 G
/ p5 y& Y/ v! F. ^6 ]" Nstruct sItem4 u" J( G/ g% |$ H2 b
{
+ N9 _ K+ I" xDWORD dwId;* j8 I! f; x( o- ~8 x
DWORD dwKind2;8 Y) \; V" q, T2 ]
DWORD dwItemId;3 I& A& ~6 V, b2 z; [, D, N8 d
BYTE nIndex;
: Y9 V+ F) m! m2 _, i$ I' PsItem(){
9 t6 g! C' p1 m dwId = dwKind2 = dwItemId = nIndex = 0;" C G/ ]# e/ l' [1 x( R
}" @# |$ F+ t" R' y! b! v
bool operator < (const sItem p2); }% r4 s, ~) Q* P4 W$ f
{& i* T* W9 W, L U3 [- R0 Q
if (dwKind2 == p2.dwKind2)
# D0 u4 _% x( ?1 e: ^ {
2 ^3 n, X0 F s2 [0 i return dwItemId < p2.dwItemId;
" @" m5 Q2 ~2 P }else{
$ V% R W3 s4 U( ~- u7 K return dwKind2 < p2.dwKind2;
4 V c) u: q# T5 V4 D8 u }
7 l& r; c! a; H1 C4 _ |% l}
% }8 T2 k: K4 ~$ o$ A6 k; y% y' A};6 y# b t# B5 K& B3 x" B# C
class CInventorySort
& i% S! B+ |7 Y{
. p, k: f8 a6 R( Gpublic:6 Z6 Q2 m! {5 W! q* _! _
CInventorySort()2 e" r2 Z, E. C! b8 h9 z
{
2 _$ j0 G0 x1 O. {+ G* Q. d m_dwPos = 0;
( f& I) ]( b* @3 o o$ c- O+ f}
; u' y' L, U- A4 y~CInventorySort(){}) B+ F( X7 i' q+ o' G4 q% J$ M& R
private:3 a7 S* I; k; y8 P
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息, `% L2 R0 Y8 y9 A1 ]0 u6 B
DWORD m_dwPos;1 V/ z/ j" J( H9 z: M
public:5 E7 f4 Z, }1 L. W3 N
void Add(BYTE nIndex): c+ k7 R$ L$ G; [0 m2 R5 s0 C
{
8 j/ I' j: j. ?9 u8 ?( r6 r if (m_dwPos >= MAX_INVENTORY)
) A7 j+ {9 g7 |# [ {' y1 D- b) V, r/ ?' b; o" o) Y
return;- x4 h- J& c$ u) r7 N4 o* ?1 G, b7 U4 P/ A
}
9 z9 i- u. k/ L m_Item[m_dwPos].nIndex = nIndex;
: z2 y# O3 s& I m_Item[m_dwPos].dwId = m_dwPos; H8 s! o/ K5 A2 t
m_dwPos++;
1 t& M/ L5 b6 Z7 l( @! _) {, R}
$ R8 g0 i7 d7 o. [BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列( u+ H8 p5 L1 K! U& E6 o
{0 P& Q! O9 }- E! e, R3 h3 @+ L
for (int i=0;i<MAX_INVENTORY;i++)
4 ~, `; b. c! `5 }' W7 N1 w {
( ]6 P& @6 J4 X$ J, o$ a V if (m_Item.dwId == dwId)
: f* e* I3 j* l# [( H* {0 F {
. `% k: V/ ~4 N1 v2 I4 P+ [ return m_Item.nIndex;
1 e* \' n0 E& P5 ~. P. b% R. \ }
# n5 T' Y. @: e$ K: i8 d6 ^1 Y: { }
& `/ D1 j) U" [; s1 H; r9 X1 @ return 255;) q8 n6 F: C: \ g
}/ B9 T7 V1 W: d7 i t# l j
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置' q r3 ?& Q9 a) z) [5 \3 L |! a$ O
{
1 {- E: O2 i9 w1 }" P) Y BYTE nTmp = 0;6 P7 a4 s6 U0 D& R, e+ u/ Y
bool bDest = false,bSrc = false;
t" H! M$ `% Z& v( h. y for (int i=0;i<MAX_INVENTORY;i++)
, N( E: S8 e1 G1 A- E; r! g {
$ r8 Y: `' W! K( W& A$ B/ I2 Z/ o if (dwSrcId == m_Item.dwId)/ Y' Q, p5 `* A$ b2 H4 Y6 y
{
' O: a; o2 }5 [+ M5 y //id相等 则 改变对应的dest和src8 X; Q4 h+ S% y) `' J4 E: }3 G
nTmp = m_Item.nIndex;
7 Z! f. o2 o! j1 ?: g- ^ m_Item.nIndex = dest;
0 F! F! ]3 G! @& s5 }4 o3 W( U+ P }5 F* K* `% n( N0 y# u, o
}8 V+ Z" `9 f! z2 j- [
//临时数据保存完毕,交换开始: j6 X) U$ `& `0 g1 M/ ~
for (int i=0;i<MAX_INVENTORY;i++) i4 k2 U" D5 r. N) b
{
! K/ ?7 ?. Q6 q" H if (dest == m_Item.nIndex)& e# h* Y. }( z; M: O
{
$ t$ B! ^" ~5 ] //id相等 则 改变对应的dest和src5 ?3 X! h2 j. b# Y4 _( p
m_Item.nIndex = nTmp;
, C/ y+ U6 A& F {* j, r }
$ l1 K% w6 u# _# m: ? }
9 \7 v9 K0 f0 G* H3 ?( |}
2 |4 h# |, \4 R& |( }0 `};" _5 X( Z- M9 _
-------------------------------------------------------------------------
+ z7 O, K O# O c) {依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
! w4 `) v) w; ]/ ~: y) @5 x' e搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);% n: Y5 v" i# s+ b* ~
紧靠其上添加:
) a4 ^# i) D L1 D. Nif( pWndBase == &m_wndMenu )
6 n* [2 Y9 K! n4 \' k4 t1 A- b{6 P1 P- g2 f% Z: O: j6 O
switch( nID )
( g# N h- h+ k4 { {( X' J) x* b; a4 d5 R
case 2:% i. q0 P. ]5 a4 \( E0 f4 j. x
{
3 }" ~6 n1 V* I `7 s L+ q3 e2 B //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
9 N8 N1 Y, s* x: V ]& c \3 e- P if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))' _4 |- \1 ?, B8 h( K4 e: d8 B
{
$ t0 J! T. I! f break;
; {, \9 z( T3 c; L! L }8 k! @6 M: C$ q3 m
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
' X1 q/ W0 \6 \; y {
2 B+ }+ h. E) l0 V0 V CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);& H, b4 F: Y: M3 Z; }# F4 j' B
if( !pItemElem )1 l. w, o2 X) N4 S
continue;
; V& G# z' ~8 \9 V2 _' i if(pItemElem->GetExtra() > 0)9 N* b* N1 k% x1 T' t- R
continue;2 T" h7 S# S/ g( K. H
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) 7 L$ g( W$ b) H1 Z! ?
continue;
- Y7 n' X* { V7 N$ ^ if( g_pPlayer->IsUsing( pItemElem ) )8 g" ~& S5 J/ m6 v# q5 A
continue;
, y: k% H0 ^' a: W if( pItemElem->IsUndestructable() == TRUE )
6 @' v) V/ G) m. W7 P: G5 S {& C' V2 ?0 f- H- d& Z6 r
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );: a, m1 m$ I# d: E
continue;9 K8 L% f" D& ~/ i, d2 e6 V
}
' E+ L: c" Y; c1 C g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);2 f# E5 w- x& t" U. V, O
}- d, u7 |/ Z7 Q \! {: V) t% J8 Q
break;
k2 l& g/ j' ?8 P }
: ^; }8 W% h; P& _ case 1:4 _2 A5 \# _8 q8 L/ ?
{
q" [3 n @6 Q$ u! X //整理背包
4 j' T, o, u3 G& |; a3 r //////////////////////////////////////////////////////////////////////////- v3 K" M" W$ J! B
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );: D% @6 o" C6 e- n1 ]/ q
//////////////////////////////////////////////////////////////////////////- L( h b! |' i# n
//////////////////////////////////////////////////////////////////////////
9 h2 b l* I0 o+ Q4 [8 O CInventorySort* pInvSort = new CInventorySort;
1 l% c, B# ^) K m5 c& J vector <sItem> vItem;
- U& n8 I+ \1 V) C7 [ vItem.resize(MAX_INVENTORY);//初始化大小: O. [/ `4 Y6 k: U( U
//////////////////////////////////////////////////////////////////////////( B y. B3 `& J y1 W% }( U8 m; p
//填充数据: e: M8 |/ x+ K/ B0 m
for (int i=0;i<MAX_INVENTORY;i++)
, F4 y% @2 V2 [ {3 V/ O2 s [- k- Z# N
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
/ q- A2 s; v9 t" B5 N% r if (!pItemElem)
# V, j& A1 V; X! z' L( f( { {; m7 M( Z8 r5 E' p1 O
vItem.dwKind2 = 0xffffffff;1 e7 Y' d; @: x1 n
vItem.dwItemId = 0xffffffff;& g% M( T D4 D) J; G
vItem.nIndex = i;7 b# D4 r' \2 C! Z' f
}else {
# R& v8 M. t$ ?6 A+ ]9 D3 e9 h9 ^4 ^ ItemProp* pProp = pItemElem->GetProp();; }. e3 n& ^7 X( @5 v. O/ K
vItem.dwKind2 = pProp->dwItemKind2;
0 f; k' x4 j+ i3 ~( T6 L vItem.dwItemId = pItemElem->m_dwItemId;
) N, b! f* p! j8 e vItem.nIndex = i;& [/ k( m1 x5 E' ?0 s- k! d$ w% g
}
- Y* N6 X3 Q, R2 _3 v8 O8 u% q //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
( z$ X7 ^8 h0 h8 n }
: [; i4 j0 ~+ E* ^ D8 S( `" { //////////////////////////////////////////////////////////////////////////$ V; F0 R" V: t J+ o& B( B4 f) E
sort(vItem.begin(),vItem.end());//排序
; ^6 X7 H0 S! { G //////////////////////////////////////////////////////////////////////////
4 v( d- i z) @* z3 s //交换
# W9 Z/ n l) o8 r# S* [ for (size_t i=0;i<vItem.size();i++)2 ~: n4 _& t: I6 x& a
{
5 z6 A8 S. T) \5 c. F7 e //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
1 F, ]$ C7 v0 s/ T: u0 j) M" i pInvSort->Add(vItem.nIndex);
" N5 }* v" p$ z4 N( Y/ I& ]! b# p }7 |- i5 }0 D. x% T* F' C
BYTE nDestPos = 0;/ W" p# X* S+ R/ [
for (int i=0;i<MAX_INVENTORY;i++): q% R! S- k* I; f0 D& J5 |$ L8 Z
{
& w- d1 n" Y) B L5 \" ^ CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);1 u f- \' k5 L4 G' x
if (pItemElem)# |7 H8 x! V3 K. N
{3 Q0 v/ ~+ H( H0 s
if (IsUsingItem(pItemElem))
3 {; P! H- I* F. b4 i2 e {+ m0 S; L E. Q2 A" c9 _! O+ }
//这个位置无法放, h9 d5 K+ y' t8 q( V( G& f
nDestPos++;) m( E5 v; G: D' o# c) g) ^
}
1 o+ i, f: t8 u0 s }
& ?5 H% k+ m& Y& y: ? BYTE nSrc = pInvSort->GetItemSrc(i);1 E2 D4 f9 j0 E: M) H5 U7 Y8 o* D
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
+ L. F7 J) a+ C9 @ if (pItemElem)
9 e1 R# v7 d9 a7 ?) X } {
8 A' }$ m, W. s if (IsUsingItem(pItemElem))* s# O( j/ c" b2 p- j' K
{
. M( e9 P5 J4 J1 ? //这个道具无法移动,跳过
5 _3 D" p0 b" U# k5 s7 k continue;
) L' t7 ~$ y( k2 H3 k2 a9 `5 J }
/ j' n4 p3 R2 ~+ ]2 G" P( _ }else{0 }- d% i8 \1 Y- a( n
//空位置 不用动
. [. ]! G5 ~7 q5 P, c8 M4 Q8 d continue;
) `1 A% M/ `3 B }
% p$ a( g& ]9 ? //////////////////////////////////////////////////////////////////////////2 ?9 t8 l* ~& c' O' f7 d4 g
//开始移动
4 O7 ^% U# I8 g5 A, c& U3 I# y4 v if (nSrc == nDestPos)- ^' H! h* n* V0 D$ |1 ?
{0 O; N/ w6 w( `! v+ m- M
//原地不动8 E: u0 w7 S% c9 v& r
nDestPos++;5 _8 \* T3 z4 g3 ]; r* Y5 c
continue;5 q2 R" x5 J) Y' x1 l* o1 Z
}- ^, v, b0 E3 J
pInvSort->MoveItem(i,nDestPos);
% _& K$ P0 ?3 C g_DPlay.SendMoveItem(0,nSrc,nDestPos);- I3 H+ k2 k! n# N0 F' D
Sleep(5);* t3 a% |" o% D( Z H# v; P W
//Error("移动 - %d->%d",nSrc,nDestPos);
0 q( T- P+ b/ ~/ v) Q nDestPos++;
% D. [1 K0 s7 w }
$ n3 k6 f9 c0 {( A9 J //取第一个元素的信息
1 Q: D) {# C' [- F K /*" l" b* u& R) Z; a( ?8 y
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
H; y/ J* W& A% f4 `( S& D {
: A/ f0 i& s" l% x; M% q7 V6 r* P3 g# ^ Error("Move - From:%d,To:%d",vItem[0].nIndex,x);' ~' D: G6 G( k
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);' r' j/ I3 E2 d
}1 e! Y+ N$ x! j' A/ S
*/ a' c" v+ j) e9 ?+ \: @
//////////////////////////////////////////////////////////////////////////( N$ i" Z) D; X! v% ?
break;4 u8 K5 I( Z: }: E1 t5 h1 q& ]$ y
}! _3 h, ?$ B' @; e7 U
} . O" c* k* g& W" d! Y7 U3 X1 d
}
6 m: J9 q/ _: P! ?m_wndMenu.SetVisible(FALSE);2 u B! Q! n; `& k( Z/ N6 u8 Y7 N
0 l1 O' Z0 d! g" \4 W$ G
--------------------------------------------------------------------------------------------------------, D' Y- D( J$ }+ I/ M; h2 M
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
6 ~4 {. `; j, R$ z3 n. v) X{
9 f. j, f w! u! I) NBaseMouseCursor();3 M6 p N$ s( d+ w( c! M# f
}7 j4 G }1 l2 ^
在其下添加:6 J4 D% H. n' ]4 }2 _
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
' X4 L X# y3 u4 Z) J8 M{
$ ~: ^7 s" A0 A. Hm_wndMenu.DeleteAllMenu();5 x Z' ^( {0 }- V9 k
m_wndMenu.CreateMenu(this);& k' B' q; M( Q- T6 a' e
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");! R1 h C$ V1 X+ R3 P( x7 N" [
& x" T! S7 D ]* D: [5 Q+ n; I
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))1 ]: J" l# B4 g& v2 k! m- W
{0 R1 ?8 r5 m7 l6 T8 E+ H
//P以上级别才可以删除所有道具# G" r; ]$ i. F1 O' y$ ^
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
! u5 ?- z: {2 w- j @3 Z1 z}0 U r5 q/ ]5 y% h" V1 H
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
1 y. ?3 B' o* y; i7 y+ ? W' n5 xm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
/ d( I7 {9 R- \& Q8 N" `m_wndMenu.SetFocus();4 g- w- M: }7 h; y8 k' N. j
}
; a5 R; @8 @& c# W6 |+ h9 I------------------------------------------------------------------------------------------------------------; T+ E1 ~- n5 b5 c
*************************& |) @9 Z2 ^) d8 M& Z% s4 r1 D8 X
WndField.h文件
# o+ O+ k) A( B9 j( R! q6 d4 g# v*************************- n+ d6 g- p' e+ G
搜索:BOOL m_bReport;; X* p6 m9 N! A! ?' P
其后添加:
# ?1 O) H9 t6 u; \1 \CWndMenu m_wndMenu;
* h8 T5 _+ I' M& L搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
. Y2 P4 n3 p( M% ^其后添加:
: O' e+ h. J% {0 P: i8 rvirtual void OnRButtonUp(UINT nFlags, CPoint point);
- {* h1 K+ |( G; Z' {7 k! \$ |7 J" _/ o
- ?+ k8 u+ \& I5 W7 }4 L1 g
|
|