|
|
源文件中_Interface文件夹下WndField.cpp文件- w! [2 j$ A* N" [7 t
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ) H" {( Y6 q! u( V5 T
- ?$ Y' K A' B t
struct sItem
4 ^! J5 N6 a( h$ K) @{
# }& G. V+ Q t7 qDWORD dwId;( \4 I& a7 @" E$ f- H( q e
DWORD dwKind2;
& [- {! i- v% ^; R% k; n( KDWORD dwItemId;9 q6 n4 j1 M! H$ \: e9 I2 ~
BYTE nIndex;: U+ v) [; W( ]2 z; L, l
sItem(){
* V: ^3 i3 t9 q dwId = dwKind2 = dwItemId = nIndex = 0;
# {! y" C5 k' e6 S2 ~}( w: U# X; x+ X# _* S( u
bool operator < (const sItem p2)
! R% E' W$ H: H{
% a, W/ j X- O. M if (dwKind2 == p2.dwKind2)
( Q' L4 N+ F# ^7 u: a {: `# V& ]( j: H! H) ^. U
return dwItemId < p2.dwItemId;6 ` J% h6 ^7 N! f3 y* W% D0 O0 p
}else{
1 d7 I! S/ R% x+ k return dwKind2 < p2.dwKind2;
' j) W9 q# \3 }- j# K- a }
3 c. |& F/ O" R}
9 k+ V" j) {' _9 g7 C5 ~& G; n};5 A s) ^' M9 J6 I
class CInventorySort% O3 V# V6 `# P8 P
{
& C- ]5 {9 c9 q# e% y! O, z. Gpublic:
9 _. m/ o4 \+ XCInventorySort()" Z" a7 N L/ H
{
' Z. Q: C& S* p' T m_dwPos = 0;) s9 }( _- m% |. u+ _; ^* ?$ c+ f
}" a: O1 ^* d# i) g. K, Z% |
~CInventorySort(){}' I& f# T9 S( g' v
private:
; x4 Z9 ^% R) `4 j4 s/ ^sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
- V& R5 f: _" J3 ^4 MDWORD m_dwPos;+ B$ r- n9 K1 F
public:0 m6 [) F. U. f _" ]
void Add(BYTE nIndex): u9 F! g* v9 g4 g& w& l, h$ s( h
{4 i) ?& X3 F) T& _
if (m_dwPos >= MAX_INVENTORY)- }6 P/ u, A' G8 B# r
{, p+ F% v3 I2 t0 C$ w6 q' G
return;
& V+ j1 u) |9 B }
: m5 O' b) P* J5 }7 ` n m_Item[m_dwPos].nIndex = nIndex;
: J6 ~$ {0 t- r' l' ]* n m_Item[m_dwPos].dwId = m_dwPos;+ U1 U7 c, B. |8 Y' Z0 J
m_dwPos++;
4 H$ g6 A6 D* n( V& V}+ H( w0 o) G1 t7 ]
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
3 y1 C3 }7 C6 C( D: u: }{
, @8 v2 Z& F) a1 ?8 @& x; s6 M; k for (int i=0;i<MAX_INVENTORY;i++)
% {' x* f* }2 s' O# q8 C {
1 x* Q* B3 _ f1 ^& G7 c' ?6 R if (m_Item.dwId == dwId)) V$ q0 ]. S9 B) u
{
4 c" g: T: [9 B, X- N& i' `. A" d return m_Item.nIndex;: Y' L7 w3 x( o6 v5 f
}7 M8 \1 K6 w, I4 d: \4 X
}% `4 R6 z6 l9 L- S$ G, V }' ]5 Q
return 255;
, ^9 _# G( d- X}; D( _. K/ |$ e
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
+ W3 k% U2 b, S7 m. F" i$ {' ~{0 E3 u0 S2 @. z4 U1 s
BYTE nTmp = 0;. Y- X: x2 B$ O5 @
bool bDest = false,bSrc = false;/ w4 r3 w0 O2 U/ d
for (int i=0;i<MAX_INVENTORY;i++)
9 d, O5 k k! C# ?; T% Q# C" W {; o0 M0 Q9 j- ]1 h5 V
if (dwSrcId == m_Item.dwId)
( x5 u; o/ U" n3 ` {' h) `; u. ^! k9 B
//id相等 则 改变对应的dest和src7 }6 e# f9 s. V- k" A# v+ M# J
nTmp = m_Item.nIndex;1 t2 t+ \5 L' A+ ]
m_Item.nIndex = dest;6 E$ J+ W7 J) P; T- M+ f i
}
2 w& i9 c: b9 f4 P }' B7 Z" O* k% V4 {- a
//临时数据保存完毕,交换开始' G' u- w) O' e2 ?: R$ X* j
for (int i=0;i<MAX_INVENTORY;i++)
! [, d3 `4 Q, ~" z {) e% s) Y- {9 U& N
if (dest == m_Item.nIndex)2 ]8 k1 X0 h( [5 Y' @9 w% {/ N2 V
{
/ T4 I. l+ W( f m/ r" H! b //id相等 则 改变对应的dest和src
- O5 z% H' F z m_Item.nIndex = nTmp;
" C+ u# Y) n3 _ `# C }) M& I) Q5 @8 d! S, _# m
}
5 K# ^8 ~$ H* J# S7 b}
6 X- M, `% Z: H8 O. O! w};/ l$ X& Z- r- p- Q* h, S, l
-------------------------------------------------------------------------4 { U: S2 F% p7 E0 d: f m% @: K
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )% b" P/ Y: s, P/ z9 Y% K& Q; M
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);. U7 O3 C# C' H- i6 e, Y* X& j
紧靠其上添加:, q% {: s0 ^ {2 j1 t
if( pWndBase == &m_wndMenu )' m- c2 q. \" C9 R# M, M
{
& F+ r6 C1 W+ f) | switch( nID ); a0 V( N# \: T' E
{- a, K4 m( u" A
case 2:
: O4 A5 T* O2 b$ I: o' H0 }) ` {1 y- m6 n% [2 ?3 N2 Y9 M6 Z
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
; ^1 y- P8 Z4 L* } v, k! ` if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
2 c, i& ?1 j9 J# [2 r$ p" b. z {6 N3 X, M1 D- [. q7 C
break;
! A8 Q7 B* W0 G! m7 m }9 M7 `# |. G! L: G6 O
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)! A1 p# t- B( J& m7 Z) [) @
{; x9 m C3 k" z" [( O7 v$ Y
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
1 S0 ^2 m. P, P/ H0 w; G; j& x if( !pItemElem )1 e" v' [. K4 ]7 [6 [' h: k9 G Y
continue;& t1 H& k L+ m& U0 G4 y2 i
if(pItemElem->GetExtra() > 0)
4 g; o6 r( F& U# P# p; B1 B0 z, h continue;
5 e# m* R& ]8 z if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
0 S! B# T5 t% { continue;
o& _# m. W) e* F if( g_pPlayer->IsUsing( pItemElem ) )
5 q7 i0 U5 ^( G5 R+ G0 g- j! I continue;
" \9 w# t/ h3 l( @& N% ^. G5 o! j if( pItemElem->IsUndestructable() == TRUE )
. q1 r2 F' V/ l( V# n, d {
. Q* M( y, W' M3 D Z: r6 P. t) X g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
$ _8 g" T8 m% g" B3 W1 T) H continue;/ U0 s: i: s, }8 P+ j* p3 i
}1 E( O4 L0 ]9 _$ J7 x2 n2 ~) X
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
1 N/ }, f. ?- V( ?% v1 B" j }
( [& b" t. x D$ t break;3 k; R1 C8 [7 z R1 z. e
}
1 `5 e* ^* l( A case 1:
* `+ j8 p5 U! h" c7 t h4 B {
! Q" L8 B6 {" R( W, T- p //整理背包( S3 [8 p( I6 I5 a
//////////////////////////////////////////////////////////////////////////) h, @ e! U+ U$ b) R# q* p
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );& L0 B1 w& L2 P$ J) H
//////////////////////////////////////////////////////////////////////////
* m* b- l$ W" n( f: } //////////////////////////////////////////////////////////////////////////, o+ Q3 Z1 P! t
CInventorySort* pInvSort = new CInventorySort;
' ]6 C$ V2 Z& x/ v6 Q vector <sItem> vItem;, z l8 Q, C. j
vItem.resize(MAX_INVENTORY);//初始化大小
) \# d" u7 s, _# { //////////////////////////////////////////////////////////////////////////8 |& n5 l5 G" p: |. K% E) f! c
//填充数据
4 R- i0 }6 {, I/ B- d5 k' S for (int i=0;i<MAX_INVENTORY;i++)
0 l, I* `+ m3 x2 P. Z% D) {1 O {. w# w% B: F0 f% j2 `
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
, E0 B) {" f( J+ z0 L1 u if (!pItemElem)
/ |" \; c: i' N7 L {+ q& u8 u3 Z4 k. H% ^, e _
vItem.dwKind2 = 0xffffffff;
% M; U9 K N6 `9 O- C vItem.dwItemId = 0xffffffff;4 F Q2 F4 s$ ]' W# e$ G
vItem.nIndex = i;1 [9 g! b7 @ R, x6 \( M
}else {
/ w! e0 u# k2 Y% {$ i ItemProp* pProp = pItemElem->GetProp();; H0 `! J* r' b ?1 U
vItem.dwKind2 = pProp->dwItemKind2;
/ M5 ^) L# D& j* @ vItem.dwItemId = pItemElem->m_dwItemId;1 [4 ~* [5 ^ Z3 L" }; i0 ?
vItem.nIndex = i;$ o' |2 T0 f0 T/ Z+ t+ z# A$ X
}, y) o1 U! m5 b7 F
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
7 x7 |- L! d5 v8 A) E }
: a* {, Z. \6 \! x8 O //////////////////////////////////////////////////////////////////////////
& h# O f. ^, z. `% O8 G E sort(vItem.begin(),vItem.end());//排序$ r2 ` h! s# R1 l
//////////////////////////////////////////////////////////////////////////
' b) J7 ?1 g9 z' I* _0 j* o //交换& O. o% C0 t; G1 C0 q* A0 B
for (size_t i=0;i<vItem.size();i++). J0 b; P, m9 s9 C( b; p
{
/ U( C! G4 \1 b" C4 y2 [ //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
. m5 {( n7 Q- t8 k% O5 g$ J pInvSort->Add(vItem.nIndex);1 Y G) N1 S2 A+ Q
}% f: u6 g1 _9 m
BYTE nDestPos = 0;
4 l% O, B9 i+ z! p9 c2 g* ] for (int i=0;i<MAX_INVENTORY;i++)
/ m* @4 N4 L; S* ^. I {, h5 z4 `6 s( Y w+ a" W) `
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
5 q3 q. _1 _; E& r% L if (pItemElem)& ]0 V6 X/ P, B' U0 P
{
7 p& P1 f, W' v if (IsUsingItem(pItemElem))! q, D7 \) m v9 l# G% | o1 x! b4 G
{
) N# e9 Y0 o! b+ z: }* F //这个位置无法放. m) {3 h; F2 j8 Y0 M0 a3 H
nDestPos++;
: ^0 N2 R+ _5 J' W$ u+ F }6 b: b! j V3 F8 I- H& o1 j
}" t! w* I I* U( ~& M- p- j! V
BYTE nSrc = pInvSort->GetItemSrc(i);6 L0 x. G" [6 A& o
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
4 e4 F/ n. _ \4 ] if (pItemElem)
4 E& I9 J% O) h- O2 i1 r8 | {
0 C# P' F& b4 }# f if (IsUsingItem(pItemElem))
0 Y; a7 J3 C( y$ i6 I {, n* ?, W; M5 w. B" ]
//这个道具无法移动,跳过! Z k( s1 ^/ p: c7 Y" |$ B
continue;3 f9 l2 ^# O0 x; P1 `& t" \
}! y/ h$ U' k5 W2 I
}else{
, H: {0 O3 L3 E, @ //空位置 不用动7 b) d$ o* S$ }! f. Z
continue;3 ^8 i. ~! A9 c5 f# V
}
/ }: Z, F7 m/ E ?# G //////////////////////////////////////////////////////////////////////////9 K, z( U$ k: G4 Q( R; K8 W! J
//开始移动
4 \ ]4 `% S8 q( }0 z# K, T$ ]8 e if (nSrc == nDestPos)9 p* E# C9 L. s$ d: T' L0 \
{" R- g6 C# Y/ M W7 k
//原地不动
1 j3 p9 s6 V; @' Z/ _& H- j9 _) ~- H nDestPos++;
! J. |1 ^; `1 j$ g. i* l5 Z continue;
" M* K2 Q" P: j }
. d% j4 }6 f1 g* C/ g ^& Q pInvSort->MoveItem(i,nDestPos);
7 |( o6 P# C+ c$ E. T g_DPlay.SendMoveItem(0,nSrc,nDestPos);
& J M. z# y% E" D5 n7 F7 m k) f Sleep(5);
/ f$ g3 g" D. s/ L5 L- y //Error("移动 - %d->%d",nSrc,nDestPos);! R# z4 j/ {' o# s% E0 D
nDestPos++;# f, X! {1 Q7 J4 t
}
0 d; S F: W- W, w2 Z A //取第一个元素的信息$ Y- O8 N+ F! E* k9 F9 K* B
/*& W, x A" g3 S& m3 V P
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)( x/ z+ h" O1 D- f
{
! t B9 ? D0 V( W+ R Error("Move - From:%d,To:%d",vItem[0].nIndex,x);6 H n. j" s. G. K6 U ?3 D
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);2 t8 h/ h( g- f- j, I# v/ F
}$ f6 E5 E# I! [$ V# l6 y: Z4 }
*/2 e( r- a0 {9 ^! e- [; @* c
//////////////////////////////////////////////////////////////////////////
* b- I) d; M6 p" ^ break;! O# x& {' y+ E- c8 M7 l2 \
}
- d4 k0 c7 I2 O }
, K# u" H, V& @: `6 O% ^! c}
% Z. Z3 U8 q, g7 Tm_wndMenu.SetVisible(FALSE);
* s) `0 h! }$ {1 g. l
% \( x0 K6 \% \--------------------------------------------------------------------------------------------------------
. h; g9 ^) v* s+ k3 t% n6 G搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
4 F7 F; ]2 Z8 p4 h# g5 j{
3 M# w4 U0 [; P! ~- ]! mBaseMouseCursor();- H4 M# t" S" J$ C4 U5 S+ z
}; @* h; @% \+ p) y+ @1 V
在其下添加:8 P9 D: [3 L2 ?
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point). B+ M, c/ o% M3 z
{
5 U5 {- Y) m, U1 a/ N d; hm_wndMenu.DeleteAllMenu();* `; x6 [) W- I4 i' v% U
m_wndMenu.CreateMenu(this);
& K2 ~ v6 i4 }/ b5 hm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
1 J) a+ y. A# ]3 z" T0 d1 V9 x! h9 }4 _3 i8 i, I$ i
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
, _1 H4 V% D6 N* T4 n9 |{. H. r% u' b5 v! M5 b. S* X& V
//P以上级别才可以删除所有道具
! b# j( T9 H1 j* E m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
" i+ l z& @& ~4 T5 X+ V}
( e$ B2 m, x$ ^" f2 t9 Em_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );( k1 k2 {1 O7 ^8 L; B* O& o
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
% ]: s' g# d6 @' i1 r& k" b4 om_wndMenu.SetFocus();
% g) [8 K- s: S. c0 E% |9 j}0 [5 b8 U3 I1 b
------------------------------------------------------------------------------------------------------------
+ O! p' f" A) o% w2 X* y/ }*************************4 `# x) s7 S- l. ~9 w7 e o
WndField.h文件
* p/ r! N8 i# Q1 {) q*************************1 ~% y1 M9 }+ S% P. @7 C C
搜索:BOOL m_bReport;
, P; Q" O3 P! m7 t其后添加:
3 ^( F. ]7 p6 @% Q- HCWndMenu m_wndMenu;
$ Z- M5 z8 Z+ {+ T r5 c6 D搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);! G6 \2 E0 c; e% I8 d1 j
其后添加:0 W2 P" m8 U3 B1 @/ g
virtual void OnRButtonUp(UINT nFlags, CPoint point);
6 V: b9 V1 E8 G2 V* r1 l+ W0 A9 h, r7 }) u. e. G
* ?- k9 T& ~* X [% z1 i6 R# R) A |
|