|
|
源文件中_Interface文件夹下WndField.cpp文件
: v$ s! B# K: Z! w" t( W& V搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )! Y! d6 k5 K5 W' q" E& h; f
& i6 f& r2 P. t
struct sItem
' v( i- @0 n3 {0 e" w{
# j# j* r( q( `1 c+ r0 z/ U8 L: UDWORD dwId;/ k+ g/ b5 A" f! w6 o# Q3 n* @
DWORD dwKind2;
- e) D5 f: L- G+ L& LDWORD dwItemId;
, N2 x0 D3 [. u* L2 K: m& d; rBYTE nIndex;
' E- Z6 _5 v5 t8 [9 U# n. R+ a S: c) VsItem(){
' d+ ] }: r5 n- x. S* _ dwId = dwKind2 = dwItemId = nIndex = 0;3 p; f' J: @ V' @) a; N
}; D# L2 D3 N% ]) o* W
bool operator < (const sItem p2)
2 f1 K7 ^7 [5 _/ O. t{
$ ^% A1 w; m' \4 T& [/ l if (dwKind2 == p2.dwKind2)( e/ G# X/ K9 `5 q; m: l9 z# `( W8 O
{* r0 j0 O6 `) C7 w2 h, w/ K, s
return dwItemId < p2.dwItemId;
. y* b) F* L- m4 Q3 _# e }else{' i# y6 j" {8 n4 G: J& C; K
return dwKind2 < p2.dwKind2;) j+ |" W* E( T a$ P9 h
}" k, F) d3 V7 _& [
}
$ e) O+ z, R) U* J% W};
: _( n2 D% Z1 L, n* M; aclass CInventorySort* u* f2 R* b# J
{+ n( L5 y# V3 `. i- x5 _
public:/ p5 ]' e$ a6 h$ q; Z( r B/ D0 G
CInventorySort()
( c2 a! c8 u, W$ r5 g{) B: y' C* E; Y( i T
m_dwPos = 0;3 T" M' u7 N9 F5 \- p# o8 M$ M
}9 ?- q+ P5 j. j: O
~CInventorySort(){}' T+ h5 j; z2 l! ?, ]
private:
; }( V+ G E$ _7 \6 osItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
& {8 c. b) S; [" v- Y$ r" FDWORD m_dwPos;/ w9 ^: z; u2 W- W8 P: Y5 h
public:
) ]" f: o6 A/ k& u( yvoid Add(BYTE nIndex)
/ y" d F+ k5 @3 _4 [/ U. y{ B5 a% M0 j: Y+ J
if (m_dwPos >= MAX_INVENTORY)
3 y% r9 f3 |! R6 `& X {+ z. N; G) I8 U' F+ [
return;
( W" b/ s4 K8 G$ _' U( k- X }" M+ B# S8 T/ P
m_Item[m_dwPos].nIndex = nIndex;. ~: ^- h8 q5 m
m_Item[m_dwPos].dwId = m_dwPos;
# k+ I0 _: u3 E6 y( m2 r2 n' u m_dwPos++;
1 V7 c- V$ R1 e1 n O6 M}# d7 O0 i+ s+ ~/ ]: U" {# o. l: m
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
: R8 `- A' N" C3 w1 ^+ W- j{
& _; F4 N# ~: g/ a1 O for (int i=0;i<MAX_INVENTORY;i++)( \: @# v! z5 u! v( Y& c0 }. D. a
{' \: X0 @4 R8 W4 o
if (m_Item.dwId == dwId)
) s' e& U: E+ H; a. h! J9 J, w {
" X! F; \2 Z- ?: A' d return m_Item.nIndex;8 U$ O e1 v6 r9 {
}
& Y [$ {! e+ g V+ \. h( x }- l0 C# H* g! J8 ]+ L7 b6 J6 z
return 255;
9 p& R$ _& e, I; U, j+ [9 x. I! w" b}
/ E4 ~9 s& Z% }3 L, Q0 ivoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
* _: z' N0 Y0 k4 y- b E{1 G& ]- ?$ @0 O& N* Q u8 X+ q
BYTE nTmp = 0;
; t/ E$ i& J7 W bool bDest = false,bSrc = false;. a- a& d6 S+ L7 V+ c L
for (int i=0;i<MAX_INVENTORY;i++)6 R% N! ]% ^5 N& @2 y% Q8 v
{3 D( f9 F$ j2 L- l9 K9 G
if (dwSrcId == m_Item.dwId)
* ?- p' j. @# x0 k {
* X( k2 p- g. i, R" `7 j7 ^ //id相等 则 改变对应的dest和src
8 q8 Z+ B+ `3 ?5 I nTmp = m_Item.nIndex;
0 b0 E7 a0 @5 R5 D1 k* | m_Item.nIndex = dest;
# a5 |7 P8 S! M }
6 Y5 V$ S$ T( o }
) c$ M1 M: D1 g$ J5 ]5 | //临时数据保存完毕,交换开始
2 E3 r r. z) v% f9 e for (int i=0;i<MAX_INVENTORY;i++)9 a4 Q o( ~+ M, B& E5 W
{# O# i( H( L" G* C b" R k
if (dest == m_Item.nIndex)! ] F& a8 q+ ^* h6 l# ~& @; [
{6 f7 V$ }( v' C3 }1 q% w8 C
//id相等 则 改变对应的dest和src
/ T5 s. k& r# S! m# I: ? m_Item.nIndex = nTmp;
. b. u, k0 A) u/ p J }
4 e4 ~2 s, B# Y# \, y4 G- | E* P }
$ I& B! e H1 n; R- A+ d1 @}
" }0 C2 L" S3 Q3 s) U4 g6 l};( x1 s) V% D+ c3 g* ~0 M
-------------------------------------------------------------------------
5 T: E) G- G. m' Z" K依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )" g! y3 z6 D! u6 P
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
& x4 C% Y) J5 i) j紧靠其上添加:$ E4 v& ]! V1 o+ b# H/ B, R
if( pWndBase == &m_wndMenu )" e- V) ^2 ?) A7 U
{+ d& y) O6 o, K" b/ I; N5 {
switch( nID )
$ L6 _5 ^( @2 I3 f0 N+ e {- `% \2 x6 o* ~8 j+ ~% Y) X3 i, K
case 2:
) J. A6 z6 g) l" N0 L {- t3 e! O* Y. k0 B
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);- {, O# ^' Q& _. E+ b
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
$ h/ y. J5 a5 t1 T# n/ V {
# G7 N Y4 s5 B break;! A% t& \! p2 V9 Y
}
w4 C7 U& K* V z for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)! O5 l2 |5 k3 h: B
{) x1 p1 C3 B U( A$ z
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
; T. [* E% q9 y if( !pItemElem )2 K( ?# ]( s# G$ o2 y/ Y
continue;
8 Z p0 V; J2 } if(pItemElem->GetExtra() > 0)5 C: O! y% @9 C J/ f2 [2 ]
continue;9 \, J* }/ D' p; C1 Q* V
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) 2 @ n' l! O8 A4 S
continue;
7 ~9 _& B' x; c- ?/ l( T8 A* b1 X if( g_pPlayer->IsUsing( pItemElem ) ), |! j) L. `% B: B0 G: H
continue;8 r* k, a6 k8 J2 V0 ]
if( pItemElem->IsUndestructable() == TRUE )
! {- _2 F$ T- s. V7 q6 o {9 r1 Y0 s$ E& y: u2 ?' j
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
0 p, j5 t6 y( `( T7 Q/ H3 r. @ continue;7 k5 i: H. Q7 F+ o1 i
}
( a; ?3 F1 {: [! N4 E g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
) {9 M; l$ u( J% G4 n( F5 \ } r- W& E2 M9 o. [" y7 n7 [4 \$ C1 o
break;
0 t+ \' H: A! d+ D5 v7 P- p; D4 F }
& _0 D- z) v7 {) U4 @# l+ L5 E+ y case 1:. F5 v; G# m( G( H. E) J7 }
{
3 z6 S' N6 g2 F" P/ p$ s# ], J) { //整理背包
( K N& a/ \2 y! k! i; a, Y //////////////////////////////////////////////////////////////////////////; M8 C' ~) W4 A1 s5 S( T0 |
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );/ y) Y) u' s6 F5 O8 \
//////////////////////////////////////////////////////////////////////////9 F ?* ^% g# b% t- Q2 E- q
//////////////////////////////////////////////////////////////////////////0 y2 n/ ~$ ]/ X( C2 p# |
CInventorySort* pInvSort = new CInventorySort;
3 Q1 ]! y" o; O+ D6 G- n vector <sItem> vItem;- K. L# l7 Z: D3 q& ^6 @5 f D- I) I
vItem.resize(MAX_INVENTORY);//初始化大小% o" ]" H C) ]
//////////////////////////////////////////////////////////////////////////8 @& d0 Y- n" L+ ~0 D' ?$ }
//填充数据' J9 r* h7 ]3 D1 ?. G2 L d. m
for (int i=0;i<MAX_INVENTORY;i++)
; n4 n" R4 J) _. K" e {7 n. g. o- f" t$ H
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);1 ~9 H# z5 g# H& r8 L# c# i
if (!pItemElem)
$ _6 j. k" U2 l/ D- _) J7 B {
' Z% g* h: _( M' _" p- v! S vItem.dwKind2 = 0xffffffff;- J- I0 U8 c% M1 k' Y
vItem.dwItemId = 0xffffffff;, ~6 h% @5 H5 f, G
vItem.nIndex = i;
: n1 t n: `' v7 h }else {
8 V: `! Y- Q f6 y6 y, }% t ItemProp* pProp = pItemElem->GetProp();7 ]7 V3 d, v$ X* h2 f3 X
vItem.dwKind2 = pProp->dwItemKind2;
# o$ g5 c, ^/ I1 J3 t% f vItem.dwItemId = pItemElem->m_dwItemId;
) ~& }5 V; ?6 d& T( z vItem.nIndex = i;5 P$ E7 Q6 y- b B. H" F9 I: B
}. @1 w) e) t% x q% K, z; E; w
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId); Q$ g" Y3 X+ d' i
}
9 D% y1 J7 Z2 ?( K //////////////////////////////////////////////////////////////////////////; x# ?' v, B1 }8 k- ^3 |- J
sort(vItem.begin(),vItem.end());//排序% w9 L+ R1 k( b
//////////////////////////////////////////////////////////////////////////
, L9 m1 f0 c7 O1 l //交换8 j+ A0 j$ g% a9 R8 [$ x
for (size_t i=0;i<vItem.size();i++)& R7 D4 R5 G( V& Y7 E
{, x1 u* S7 a2 v# s/ n
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);- y( Q1 C3 V! s1 \
pInvSort->Add(vItem.nIndex);/ Y, t. R& J$ P5 O4 c) G
}; c7 u# Y1 e- T- p
BYTE nDestPos = 0;
$ ~8 p; l+ `) T! H for (int i=0;i<MAX_INVENTORY;i++)
3 h: _* ?5 a; Q% w. F {
V R0 H5 \9 |, [ CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
5 Q/ ]: Y6 p1 I) W8 Y9 M" V if (pItemElem)& ]/ Y) ^' d, r/ k/ S7 a
{
; g6 g8 ^4 ?) r( c1 L& s if (IsUsingItem(pItemElem))* f- v$ O. V' C# b3 }
{
+ f# d9 X& S4 w8 _# ^- ` //这个位置无法放( _; m( V* C0 T7 l6 N
nDestPos++;" s$ E' d, T( P) d1 G
}3 U1 N5 L& N1 T- M' ~
}
& O# z* i9 b" P2 h9 i1 m/ P, E! F BYTE nSrc = pInvSort->GetItemSrc(i);" f4 Z% K% t1 O3 v0 x
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
$ ?, w2 }1 {3 H; ~ if (pItemElem)
' d$ U, ?6 P* l" b: h0 D% o4 j {4 w( s& ?. P1 q
if (IsUsingItem(pItemElem))( R% I! C1 c7 E
{. q+ q# ]/ h$ B& Q5 ], n7 G
//这个道具无法移动,跳过. w) h) ^ u* r7 B
continue;
! Z$ z5 I3 ~1 j9 w, B$ z7 b } O* e7 o; U7 C# @2 s
}else{
* ^' k Y# a' D5 A, x) z& o //空位置 不用动
( z' U& X1 f% ]/ b% e& i continue;
5 M+ w6 e }1 ~ }; M4 e! P0 e8 p7 {/ X/ E
//////////////////////////////////////////////////////////////////////////
1 W! M% |; [9 o- @. k0 Q: H- n //开始移动
6 `% { r9 X B5 T if (nSrc == nDestPos)
+ { d) {% C2 |( ~' d7 c5 p {# \2 p+ `- ^( U5 d
//原地不动1 f) K. v% F: g# p2 w1 r: f0 L
nDestPos++;% U3 a# [/ p5 ^# f0 @# i
continue;1 t! a, Y- N+ m+ `! m+ P6 X
}
6 L* O- C$ Z$ V4 f1 U6 b- s0 X3 w8 k pInvSort->MoveItem(i,nDestPos);
2 ]& s$ R7 c; U' S( q3 m g_DPlay.SendMoveItem(0,nSrc,nDestPos);
( Q& s8 ~2 B9 p, j( W. o Sleep(5);
' X' P, i9 B( u$ L9 h0 d# H //Error("移动 - %d->%d",nSrc,nDestPos);
8 s/ `) m v: G' v$ w0 L nDestPos++;
$ r) U. G* f# G7 k0 C- W- p# d }$ X% B/ B7 ?! P& V6 F+ S
//取第一个元素的信息
& h7 l9 ~# z1 y) C% W9 O /*- }$ ?$ O/ T9 v/ T. A5 R2 W
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)9 K" U% H/ g! N
{
/ F- R7 m4 t9 o, y! n Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
* d% n# t4 F6 i; v \3 I g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
$ H1 Z, \) j8 f/ w }
# E9 S$ Y% K- z3 A4 H */& o4 J' I' R7 n0 l$ j4 O
//////////////////////////////////////////////////////////////////////////
0 D4 {5 O N* h4 H4 Q; r) e break;
& U8 w* E6 E, }7 P4 S- x' v: ^ }
, n0 h x' q( y' `2 H } * ^& \* A) u7 q6 r0 g/ l4 y( k
}6 s9 B$ i. T; o z2 d
m_wndMenu.SetVisible(FALSE);$ a6 U1 P( ^3 ]5 ?1 ^
1 l4 _1 t s6 Z0 w8 |' n; |--------------------------------------------------------------------------------------------------------! S6 O M& \8 t* m3 Q* R5 P# D
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
; A. l4 [; u8 h9 u{
. I% G+ c y) e; DBaseMouseCursor();
+ B0 X y \# p, T" w& s}% u, d9 T! A5 j. h% i: \
在其下添加:" }/ x Y* R5 F- i9 u H9 Y6 c
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)0 _! ]( r5 J( } `
{
1 E1 `3 U4 k1 } h% X/ A; F; fm_wndMenu.DeleteAllMenu();
. r, A M3 w# o" pm_wndMenu.CreateMenu(this);6 L+ E) F; V) ]/ ]0 F) e
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
+ d! I; s: Y/ p" Z8 L; T1 D" a/ c$ n( i e3 n3 E+ z
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
) o0 R2 I7 C# s. J& \2 e{1 i L7 u* U @' c6 `
//P以上级别才可以删除所有道具( I/ @$ I: ~' Y0 O8 @. R# H
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");0 }7 X) K, B8 `8 G: u( a! U7 r# b
}, P4 B+ T# Y; w. {- `9 w( n% N+ S
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
0 Y# [, X4 y% S' T2 Lm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
# ~# E% U( h* T' O g9 I+ e* \# ?m_wndMenu.SetFocus();
6 P! s# H' ~* a/ W9 U0 m P}- p: e% Z1 I( J0 m) U {
------------------------------------------------------------------------------------------------------------$ ^+ M: d# G/ H$ D" m
*************************$ o# v$ B4 W. Y: Y' D- P0 P/ A" @/ r
WndField.h文件
# `# [6 x" t% ]6 _% I6 h1 ]*************************
G/ B% z1 |/ `' o6 N搜索:BOOL m_bReport;% Z8 G% k7 E/ n& N7 Y
其后添加:0 G* B$ X& t/ P- P7 k
CWndMenu m_wndMenu;3 E6 ?7 Q, h4 L' z* d3 `* y
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);$ m: u$ D) k+ Y
其后添加:
, b9 r/ v& e, a- U& r& ovirtual void OnRButtonUp(UINT nFlags, CPoint point);
5 W' ` [, w/ s/ B. e6 N1 w5 ^6 i
& B l; v( J6 B" Y" g5 a. r9 y; H7 E% d
|
|