|
|
源文件中_Interface文件夹下WndField.cpp文件6 W1 }8 z& ^: X- Y- i2 F' G
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )# Z; w/ b- ]3 X" _' M$ J D0 `
9 g# _( c' F8 f- l# ^
struct sItem
( ?$ k8 Z: k+ N7 a t5 K. t8 c* \, C3 `{
! `, }0 D! G, W& N1 h" {DWORD dwId;
/ b* v5 ?' N5 kDWORD dwKind2;+ T/ u5 Y! A- X& r) p4 h% j( h
DWORD dwItemId;! X5 V4 h& k" v b" ^ |$ t
BYTE nIndex;4 O( \- W7 S8 t5 K% o7 w
sItem(){
& V3 o" ]! u. x0 _' ~0 V/ c8 p2 B dwId = dwKind2 = dwItemId = nIndex = 0;2 T1 i6 {# p5 T$ Z/ [6 @, Z4 F
}' z" v8 z' B' ^/ x [
bool operator < (const sItem p2)+ f a4 }& j( |
{) `1 V- q+ V' z; C
if (dwKind2 == p2.dwKind2)
( D t9 P$ P( q' h {/ a7 j9 X4 [( k. h' t
return dwItemId < p2.dwItemId;
# P- `) g" h; P3 A8 C. u }else{5 R5 Y" r" `# N0 y' ?, N& u
return dwKind2 < p2.dwKind2;& k- D" Z5 q5 m: y. z* L: y1 W
}
8 a+ f5 W! f# c1 M: k) _6 @: H6 Q}
+ o7 b5 `& u! A, Q1 e. ^# E};: V. o& y2 P W: d# N: c% T, r3 S
class CInventorySort
1 ^. r5 F8 E: V- _6 l' o{/ Z- |1 b* e9 j) c: A; z6 f
public:
8 Z1 @* _3 N, k2 s9 `CInventorySort()' G# I8 K" f" M! e, q5 L6 x
{$ E* B8 l0 d7 F" s8 I) ]
m_dwPos = 0;
1 h* g' f) m9 T( U+ Y( V}0 W. s1 e. O2 p* Z. @4 t
~CInventorySort(){}
4 B d; o) W# h. m5 t2 jprivate:4 B0 R- l. N+ ^! }5 h# o
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
, g; e5 J5 |+ e: J/ hDWORD m_dwPos;
3 D) l8 ^9 L" m7 L5 g2 L: Vpublic:
- G0 W9 E4 E ?( Evoid Add(BYTE nIndex)! P+ n/ M; z" ?- z' _. _
{1 Z4 F6 l2 U9 j" P( ^% s
if (m_dwPos >= MAX_INVENTORY)7 f0 ~+ |) [( K) A8 Q4 e
{
* w" {" j. I6 u7 g' v return;
. e+ l, o) i! J! Z4 y% v }2 a! }5 e3 I/ C5 V$ q
m_Item[m_dwPos].nIndex = nIndex;6 d% l5 o6 h0 R
m_Item[m_dwPos].dwId = m_dwPos;
" x2 D9 V1 w6 s- G4 c m_dwPos++;$ t) o! S a, b% r5 [
}+ I! M5 ^# {, G8 F# E8 |" ^
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
; _5 E3 S7 d2 }+ @{. @9 s3 c+ {, ~6 N( I. a/ e# K8 T
for (int i=0;i<MAX_INVENTORY;i++); f# ^+ L6 M; ^
{
/ i4 Z+ g) r3 [; i. j1 v; C if (m_Item.dwId == dwId)# ~/ A. [: \9 S' W2 w3 d
{
- x- u) w! M. c: p return m_Item.nIndex;5 ?6 f5 n8 I# t4 ^" O
}* a( q; W+ V. \3 z: O
}' P5 T% M7 g5 V- o
return 255;/ u5 o& f. u! R x6 E) I: ]" w. r
}( R6 G; Y, B. X
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置0 ?: C8 H0 x/ o9 G( y0 i6 V
{" Y2 }1 P2 T" M3 q% M. {% I
BYTE nTmp = 0;2 ] Y1 ^7 b n
bool bDest = false,bSrc = false;
7 r( c B: o* r- S$ T for (int i=0;i<MAX_INVENTORY;i++)
, `% {. X/ T' N2 P- [+ _ {
9 Y( _% O1 L; }4 ], ]2 e+ X0 M if (dwSrcId == m_Item.dwId)
1 E1 P% D! X2 R; N {. H5 C* @) A) z% |
//id相等 则 改变对应的dest和src7 a7 ]) ^9 |# a( p
nTmp = m_Item.nIndex;) F( g6 `4 h( B: k/ X( i
m_Item.nIndex = dest;1 L' h+ |3 e7 [$ {2 w5 r
}& x+ k/ z' D# D5 _ h, i; S
}" r/ a% R; X' Q- |1 {( d' q; X+ B. O
//临时数据保存完毕,交换开始: @' J1 o R( h: i- K" B0 F5 ]( P
for (int i=0;i<MAX_INVENTORY;i++)- f. I& h4 d! X1 X2 n, c
{
3 i. q9 O3 G' ~) Q( e/ R if (dest == m_Item.nIndex)* n$ p6 r3 @0 ]) x! N9 g
{
* O0 [ `; Z6 t //id相等 则 改变对应的dest和src+ B% w& r2 {8 O# [! Q* m* M
m_Item.nIndex = nTmp;2 `5 i& t/ y1 @. n
}+ b; a. N% w! Z. k
}
7 e& D7 C8 I! u1 f/ c% y k}# y0 H% l% r! f3 `# `
}; J: T3 T. U" E9 s
-------------------------------------------------------------------------; k) L7 g. W2 g' x. L1 Q, o
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
+ w1 _- R Y2 w! W* e/ y7 I, c: u- z搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);& |* u) h* V# Z4 H
紧靠其上添加:
5 f& P. P) F! A, p9 l' q- v0 Nif( pWndBase == &m_wndMenu )
. A7 f+ }9 D/ n1 Y) p{6 E1 R9 I/ M8 c
switch( nID )
5 C$ ~7 }* C" b7 t# \ {
" @5 i% I, l& \" z case 2:
% [ S+ S/ j, ~8 ^% q {# w& c, L Z7 R9 U/ `: k
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
) d) K" P4 C1 P if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
2 h* b! X& V6 K' m9 `% U4 [ {
1 T0 \9 L4 d1 E0 l. i break;
8 v$ }0 s2 ^# d. P+ {3 K- F }% n9 S/ g* X/ y
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)' C @( Q% g6 R+ G+ K6 w: W
{5 ^- k; X' f0 z; L( E7 m! Z2 s# F
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);" Z3 m. E: v+ F3 ~
if( !pItemElem )- t& a! l% o# t- g, N& Z4 A
continue; `# {; ]7 [# D1 G: c1 W
if(pItemElem->GetExtra() > 0)
% c- N4 r) t' ?$ V/ L" U/ k# e continue;
" ~, K3 r+ H$ _& m! p if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
2 {, j5 y) p% `6 _8 j9 l. b1 ~1 o, | continue;: M8 E' M4 I; n8 ]
if( g_pPlayer->IsUsing( pItemElem ) )) X+ ^8 J$ t9 u$ u* _
continue;0 Y8 m$ @0 I' }& o
if( pItemElem->IsUndestructable() == TRUE ), d5 ~4 z+ ~+ `7 x1 P
{2 a1 a* }) L7 [3 I
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
& B& h' W5 Z! [9 X continue;/ g N8 U5 O* S9 ~
}
( I& R4 a3 ^0 ]1 [, T; b g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);$ V+ Q- k% s- M/ ?' R9 M4 {
}- ?* W1 g( q' `) P3 |, V7 Z
break;
1 ?2 `. n5 q. O% n! ^9 i: l }
& l' ^/ c' }; D4 w case 1:( M2 T- J Z! R- k9 \) q
{
/ v; Q( C% S5 U9 p+ M* p //整理背包
, Q' w! ]! I$ G7 N6 j" O' y //////////////////////////////////////////////////////////////////////////
+ I: j; P& c' ~ X) o# n7 s/ s //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );# C( R( @% W% {9 k; r
//////////////////////////////////////////////////////////////////////////0 o6 ?' w" l3 o3 G: u7 n2 _
//////////////////////////////////////////////////////////////////////////
6 w5 \- l* d) q8 K2 S$ \/ e CInventorySort* pInvSort = new CInventorySort;; [; t0 Q$ v, c/ l- q
vector <sItem> vItem;
) H8 M& y3 b0 N& m% j; i vItem.resize(MAX_INVENTORY);//初始化大小
# w* Y/ ^2 c1 e e //////////////////////////////////////////////////////////////////////////
1 @$ j+ y- {8 I' b' Y1 N //填充数据
0 H/ U2 v+ R+ M- f: A8 n for (int i=0;i<MAX_INVENTORY;i++)
% r% f7 v- x. L. r3 W: j {
0 T" g( X& y( @1 w; g9 F+ p CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);6 R/ C, k8 b0 Y6 W* P
if (!pItemElem)1 L: J6 s9 a; v# _3 T) |
{
8 |3 D5 \- A, _6 D: u. h vItem.dwKind2 = 0xffffffff;
4 m; X2 W, K/ a% Y ~0 Y vItem.dwItemId = 0xffffffff;( n1 t: r. Y, `+ W
vItem.nIndex = i;4 k' N! x( C& a* d% N
}else {
t3 M2 m: v6 Z9 }1 c/ [ E ItemProp* pProp = pItemElem->GetProp();+ P! ^' _$ t( ?' g" ~
vItem.dwKind2 = pProp->dwItemKind2;' V% H- S5 ?& I( g# _( ^% L6 v
vItem.dwItemId = pItemElem->m_dwItemId;" H1 k) s" r e% o
vItem.nIndex = i;; x, }: j% m. ^& A
}6 o2 k' Z* ~" ~& }% f2 m
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);5 p! I6 f$ t! e/ r
}( R9 R8 E2 u- ]1 u" f3 I/ r
//////////////////////////////////////////////////////////////////////////7 w! d. M7 [5 V+ ]9 g" o
sort(vItem.begin(),vItem.end());//排序
+ f. f6 Q' S( B //////////////////////////////////////////////////////////////////////////1 K" K6 C5 C2 M' Q
//交换8 P9 i7 Z& k4 n# v3 t8 Q' c) L
for (size_t i=0;i<vItem.size();i++); ^6 i7 ~/ Q% P( o6 V$ D
{% [( J- M) s+ A) T* d9 w
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
5 j3 X( B; c8 F' f/ C2 p, o pInvSort->Add(vItem.nIndex);6 h. s$ u3 p- M# M
}/ f" S/ Y+ u! H6 v% d
BYTE nDestPos = 0;! K$ T8 h$ h2 r( w7 l' S
for (int i=0;i<MAX_INVENTORY;i++)
" p+ U7 Q- N. z {
8 Q1 v) q4 O9 X$ l3 Z$ f4 E5 A0 O7 O CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
& S$ G0 z# ~4 X4 l# Q if (pItemElem)
- F; ?3 ` `- p1 }" Z {2 s( e1 T9 B" X- d7 G; I* {
if (IsUsingItem(pItemElem))
, l/ c4 @6 z# Z7 ]$ T {, g* w1 }/ u5 m c' W
//这个位置无法放
6 f$ K5 R* [7 Z" W" |0 i( N nDestPos++;
8 n& C% `! |( }% Y* | }+ A! B" [) ^& ~! G
}1 X' Y, M8 J9 F- w. ~5 e( O' M
BYTE nSrc = pInvSort->GetItemSrc(i);8 m/ N. B* Y. U2 a
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);" b: H, h1 N, `, O$ `
if (pItemElem)7 {% n& Z0 P- g( D r0 M& ^. r* w6 n4 q
{
' l; E7 D0 N: {$ X8 f# ` if (IsUsingItem(pItemElem))
1 ^' Y: m: |/ w5 H: ~0 i( \ {
V* H; u8 ?1 e. E& e% J0 t //这个道具无法移动,跳过0 H/ G5 s0 w }. m, f+ I
continue;
5 x) Q( {+ t) b0 @; Z }1 r' j/ c1 y7 r
}else{
) q p6 X, H4 u3 s! x$ I7 s //空位置 不用动
& W: k$ V" d4 W' p' c continue;
5 N! X) \: B/ H! P }
# g% E) ^& r8 w2 i. ^7 M //////////////////////////////////////////////////////////////////////////
" ~. |$ l1 X" U2 z/ D( H //开始移动: |2 K) F5 w# w# x
if (nSrc == nDestPos)2 U2 t$ [9 W: y6 B& C9 A' f
{
% M, U% ]( c3 H //原地不动: S8 h, s9 d7 q, L1 Y/ O
nDestPos++;
! G: I5 x* x2 o# v8 Y* d& B continue;* L6 [) P6 z2 F2 L8 R: q
}
9 [) k' n8 L+ {& H pInvSort->MoveItem(i,nDestPos);
5 k: O7 A) m3 }9 a8 h6 g, a& R g_DPlay.SendMoveItem(0,nSrc,nDestPos);9 ^* k- E( Y3 \8 a+ o# N
Sleep(5);# ~4 W$ a" f( e2 u2 |! M
//Error("移动 - %d->%d",nSrc,nDestPos);* Z- Q+ G2 Q4 L" K: w3 ~
nDestPos++;6 [% p3 w5 d$ p" S8 @0 }" o4 t. |1 n
}7 i6 u; B" Y F4 \1 k! X# E1 j
//取第一个元素的信息
9 u7 f5 X# v" U6 a n# L# d! ] /*
' g- a9 H3 x( m if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff). Z$ }6 g1 U& J9 q8 [0 Y
{; U& V1 x( d# @" x* _2 Q
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);2 o* K3 ], p0 r4 Z* A
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
o% R( l; t8 N0 U: k% ^7 } w }- |5 L3 Y$ [" U" V5 L) H
*/
4 c9 M/ B, T; ]- W //////////////////////////////////////////////////////////////////////////5 ~+ v- ~. s" V2 A% G+ Y. W
break;
3 X3 n$ r( e" i! H: ]( f }
* o1 ]% u1 C' Q }
9 @5 a$ ]4 `& \' u( g$ O+ W1 r7 f0 S}2 d4 f I5 \8 y2 O/ T' |* Q! l: R. W
m_wndMenu.SetVisible(FALSE);0 x# K! Q5 F: H) B/ S# x* |
; R4 c8 S2 a+ [7 B8 W" [8 Q- d! w--------------------------------------------------------------------------------------------------------% P: w1 t; N, K( q! P# @+ R) K
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)1 {# e" |+ Z: W: }
{3 q' _& y9 P. j+ m/ P
BaseMouseCursor();
$ J/ m( w8 N4 q5 x}
T! g# \5 g9 Q# x0 K0 ~* J在其下添加:! ~- |3 N9 W3 W# ~, X; L% i
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
0 n7 C" G M' c' a7 d' L7 |( p{! v V ]$ z- c$ F
m_wndMenu.DeleteAllMenu();
# s, u* l- |& N b2 g8 em_wndMenu.CreateMenu(this);
k; z2 ^% m# I! K2 Y* Vm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");) Z2 y- v& y# _$ _; \
* T8 V! Z5 h1 Y, [% V: r
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR)). y& T' @9 N, A% i2 a; g$ |
{" S! B+ r$ S7 h9 D3 z
//P以上级别才可以删除所有道具
; b' u' o: d7 U j m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");% `7 m% {/ \) r% r- S
}7 @5 p$ T4 [7 F/ Z
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );4 X& T, R/ [ J- o4 f9 d/ Q
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );5 U& n* i2 f# \/ J9 t0 z
m_wndMenu.SetFocus();* z7 N9 y# K3 u# z
}9 L# B1 z5 l0 A+ W
------------------------------------------------------------------------------------------------------------% t6 P( x9 ~' o; x" ^
*************************; D" Z' Q+ q: g8 \1 d* z
WndField.h文件
# ]+ |5 b8 x6 U k4 N# N+ w*************************
1 V! v: A8 y0 ?4 _% Z' b搜索:BOOL m_bReport; Q! ]. i# t7 p7 K$ F
其后添加:- B4 m' O& Q$ t" z r. {. P
CWndMenu m_wndMenu;
( u9 U1 b' ]# W搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
0 A5 A( b2 ]* R }其后添加:3 }) k3 U S2 U0 Y, z: o
virtual void OnRButtonUp(UINT nFlags, CPoint point);1 D% u3 ~. c0 Z$ d
/ W( H. q5 ]$ x: n0 n! c1 ]0 k, q. E
|
|