|
|
源文件中_Interface文件夹下WndField.cpp文件( c/ N9 g# l1 D( g( C7 e" \
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
+ K1 u/ Q- ?5 s3 C( L! Q( F$ M7 f" O3 F* ]) D+ L+ }! m
struct sItem
# {2 w# ~7 F0 }{2 A5 x2 u* F d% p: H) E! M3 {" z
DWORD dwId;
, } l4 Q! h9 g$ lDWORD dwKind2;
. E7 |4 l+ z% ^, W# A h8 V9 nDWORD dwItemId;
& J4 C& K1 ?; J$ V h; K0 M4 x) @BYTE nIndex;
' \- o* V: d& I# k# u2 U6 msItem(){8 C& T: D/ j0 R
dwId = dwKind2 = dwItemId = nIndex = 0;6 C5 C5 T+ e7 h8 ~
}
" {4 p! _: o, K; fbool operator < (const sItem p2)
; z7 ]9 c0 T: a) g{
7 L0 I6 R$ j, L$ D" l if (dwKind2 == p2.dwKind2)# e2 y. y0 Z5 L& ~6 c+ W
{
$ N8 b2 e+ Y& T+ c return dwItemId < p2.dwItemId;
4 Y6 N( v9 ?* [% M! @( Z }else{
5 d5 c' D- g; k2 V4 C% e return dwKind2 < p2.dwKind2;
8 q' G0 _# {2 M. o6 [6 v; q9 ^ }9 m* b2 w0 o; O+ K8 r; }1 m
}; `' K: W& F" D
};$ d5 X- t$ V& @1 X" O3 T- J
class CInventorySort% k! D! @- I) Z% E/ f
{
$ ]) ~# d1 p( R Npublic:
6 x q8 }( D% P, I% ]CInventorySort(); a4 H5 t; T/ v% ^. r7 W/ R% g! d
{
8 J8 v1 I8 a( w/ i/ V- p: e m_dwPos = 0;
: e) Q! v/ L( {( D i}
* E5 a: G0 O% f0 f~CInventorySort(){}
4 s9 \6 N8 C5 @* B" tprivate:
8 D. c' q- r% b& c$ d( qsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
6 n# D3 E$ K* c9 bDWORD m_dwPos;8 m& { L) h1 ^& `" p
public:
$ ^+ s4 I8 M- R5 Q# _void Add(BYTE nIndex)
4 L" P" ]- m( B9 ?- F# X: n{4 M, I- \- h' t+ n: A- ^
if (m_dwPos >= MAX_INVENTORY)
+ B0 T; z/ y1 v! l& y {
$ B$ q5 Y; L/ H. K' ~3 e return;. J, k+ g( u: }. L7 g! g c/ n3 \' a
}
" y o. _- B0 j/ j0 k1 @+ w2 M m_Item[m_dwPos].nIndex = nIndex;/ T- |; A) v' h) v F! O6 j6 W4 g4 a
m_Item[m_dwPos].dwId = m_dwPos;6 a# d0 V9 S) {- h
m_dwPos++;
, q9 c; R' o# b5 |$ ^; Q, T( T6 }}
. A1 I" W5 O4 ?! ]* `0 PBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列5 J* ]; \1 l- D( ^
{
! ^0 j- p1 W# F) r& Z( v2 L9 v, B for (int i=0;i<MAX_INVENTORY;i++)
* F$ u; A2 F0 P1 @# C+ h0 b {
% f& C# a0 Q7 Y& s4 W% L if (m_Item.dwId == dwId)8 Z- q3 v! x B6 C( g' v2 c9 J
{
1 K' w7 t7 A; u return m_Item.nIndex;
8 n3 h1 ^1 C/ J& W' u }
* S( F0 r5 F6 B0 I e }0 d! j) l9 a0 D& N4 X6 N
return 255;9 z" m: d% w# Q$ ^0 g
}
+ T/ _1 S6 f/ Q f+ I0 zvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置2 Q0 J! t* p8 a* |) \( U4 X
{
- F5 U X0 x, _8 w" Q: T' k) x6 o BYTE nTmp = 0;
, t0 D& N5 R9 X- z& ^ bool bDest = false,bSrc = false;
) Z0 j% w5 g) W; X- r for (int i=0;i<MAX_INVENTORY;i++)
7 t5 h7 I4 m0 V. `3 X {
( g4 {; T2 l& I9 X9 O if (dwSrcId == m_Item.dwId)
0 M4 r& ]0 O" v; N9 T5 J( K5 i: w {
+ X0 ?3 n8 |" P) p$ d& a3 I+ [ //id相等 则 改变对应的dest和src
" A) M) ^* d! `( V1 q nTmp = m_Item.nIndex;
^. S) V, y2 X2 Q: a5 e: i m_Item.nIndex = dest;0 u" }# d4 x6 F% ~/ u
}2 e# c3 N0 d, T5 O
}
! q/ j4 f6 L; o+ r //临时数据保存完毕,交换开始
: y- _- s4 c2 W! D+ N& V' x. O for (int i=0;i<MAX_INVENTORY;i++)
/ h1 r) R- J$ N# |7 U" |' { {
6 X/ }5 i% u& E) o if (dest == m_Item.nIndex)1 L5 ]+ \( T2 u9 f/ @( X2 F c
{4 J# R3 j* U- _! ?& k; [
//id相等 则 改变对应的dest和src
# d4 e# H5 ~# l8 g1 W m_Item.nIndex = nTmp;: V) l2 D. R4 v1 G3 c0 @
}. k5 H6 e* u- k7 e# y$ Y" k
}
1 j: s" J, u( I# p/ D}9 ~2 Q6 q$ x1 s! v3 g
};% l4 z, S1 C5 K1 A2 k
-------------------------------------------------------------------------/ H0 X3 M1 S* ~, F
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
$ c3 q$ e: m) e/ ]1 E$ A搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
% L0 L# d6 @% Q' N紧靠其上添加:8 ]2 R7 H+ Z5 |1 C2 n
if( pWndBase == &m_wndMenu )
; |4 Z" |: W4 |8 ^8 i' M{
( l# c# e' q1 Y- \4 o switch( nID )% A1 f3 W6 X- h
{
1 V& m( D* l$ _ case 2:" b2 a) [1 A1 {" x
{
0 g8 k$ V) }4 L+ B- \ \ //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);; Z( q5 K+ Y) g1 B% |/ [$ W
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
8 d4 E1 V$ y8 p3 I" o' g" r {& ^; J4 ]4 a& r+ Y }; f \2 o
break;
# ^5 f& U: _3 Q n8 G }& V, S2 o! U: ]
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)6 Q7 h v7 n/ C8 w( {9 U5 A
{
" J3 v& n) U Y# x o7 Z+ o0 ? CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
2 B0 n$ c8 [5 t if( !pItemElem )! I# f7 d( r- L4 v# H
continue;
1 F6 h1 x- {0 Q( ]& O if(pItemElem->GetExtra() > 0)2 L( U% n" x$ t1 w0 m0 [( q2 q
continue;
! Y$ |8 D4 o5 o% s3 Y! Q" a if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) ' X% H# U' q1 Y$ g4 V0 X
continue;- ]* l; O) e1 I5 I
if( g_pPlayer->IsUsing( pItemElem ) )$ c* X9 Y0 u" K7 ]! |/ n$ M N
continue;2 \ q/ M" [) }% S% A7 ~
if( pItemElem->IsUndestructable() == TRUE )! w, |* l, X: I4 ^
{
4 z+ F+ }- S0 G) }: j) Q g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );6 H, ?8 r# [6 x1 H6 K6 B* n% j
continue;4 {3 l4 h' u+ G4 J# S! H ^
}- l& S( F- D5 B% o9 j$ L
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
2 H& j& Z4 B }5 v4 b) i) Q' z" \ }7 I, k( N' v6 W; }
break;$ F `; e& W1 g& o* [& G/ [$ ^
}
' m7 }1 Q6 A5 M9 ^' Q* s case 1:
9 D8 e7 J# W S2 p2 _. K4 m {0 D) }! ]/ h& a( E
//整理背包
% m0 J+ s8 L8 I //////////////////////////////////////////////////////////////////////////. j2 J$ [: {, I* S8 k5 B
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );) Y8 {7 l& B2 S' @
//////////////////////////////////////////////////////////////////////////3 w# h! Z% c: y3 A8 i( X
//////////////////////////////////////////////////////////////////////////8 \ G; ^" L, K. d0 U0 N# M' n
CInventorySort* pInvSort = new CInventorySort;& P* s5 D7 [8 ~! L
vector <sItem> vItem;
% d6 [( ]( V% z; z6 k8 x vItem.resize(MAX_INVENTORY);//初始化大小
3 F* a1 l+ u. [ y$ |- S //////////////////////////////////////////////////////////////////////////, H. r6 |% `2 T' c# [& _+ @, R
//填充数据
8 s* y4 f. [- B for (int i=0;i<MAX_INVENTORY;i++): u& a5 K5 Q. X8 f( c6 B$ i
{; F! }. o2 \5 o I' y8 Q. k
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);. E; o* u- M5 U, b
if (!pItemElem)
* g! s# `0 D% K$ p& U {8 \( |! R* ], H
vItem.dwKind2 = 0xffffffff;2 W' X; I- \3 I
vItem.dwItemId = 0xffffffff;
$ k+ n" I& J' @) C) u: ~1 n1 T vItem.nIndex = i;
2 F, o! P# w% A4 E5 w) | }else { Z8 ?) r0 w* S$ }. z0 A
ItemProp* pProp = pItemElem->GetProp();+ B; F! y, P* O8 @
vItem.dwKind2 = pProp->dwItemKind2;
, p$ f$ ?! o8 i- C& c2 \ o3 H vItem.dwItemId = pItemElem->m_dwItemId;/ w* g9 E9 u0 i7 P: Y, W
vItem.nIndex = i;2 W% k. u1 a3 D ~+ P# }2 o& D
}! {) [0 K, Z% P. S
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
" e8 \6 O: ~1 n* V, K6 G, V; C }( Q# X* I# n' R% r T* _5 O
//////////////////////////////////////////////////////////////////////////
/ C; V) E3 _6 l6 {: T' ] sort(vItem.begin(),vItem.end());//排序& }" A! r+ ?. P9 `
//////////////////////////////////////////////////////////////////////////
* N6 z3 L' G% S6 L& b //交换1 e |+ }$ `( H5 V- G$ i% `! n
for (size_t i=0;i<vItem.size();i++)# n* L0 n% E2 ~8 o
{0 h( v# P5 y5 Z
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
0 c1 \$ b, K' y2 X5 B, r! ~ pInvSort->Add(vItem.nIndex);
# D2 S1 O7 d7 J# N { }4 `& j8 S" K) @+ P
BYTE nDestPos = 0;# B/ M! C, T$ |' R) X: a* y5 M
for (int i=0;i<MAX_INVENTORY;i++)
( ~; x7 _: _, d/ k: O {$ i- l% U+ D- K. z- I
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);9 q8 x; }. p% i
if (pItemElem)7 X. c6 @& O2 Y' \3 O8 A, v
{
' f3 t J3 c/ H6 Z9 R4 h if (IsUsingItem(pItemElem))0 a7 L6 V9 C! x7 I
{3 }8 ^' ]1 L7 \ i }
//这个位置无法放
1 _4 v1 X D3 r8 a" z* C u+ B U nDestPos++;
& v2 a, v, {9 ~; J8 b/ q* { }; q& t$ |; [4 y
}
* O6 L& Q4 |; C; J$ w4 a BYTE nSrc = pInvSort->GetItemSrc(i);2 j1 I2 B# O/ q7 {4 R( w
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
5 X: k1 j1 l# ~: b0 F5 Y5 | if (pItemElem)0 A& M7 R9 |- ]
{6 J0 m; i% K) z' W+ P) [
if (IsUsingItem(pItemElem))8 d2 V. t3 T; b# Y* H
{! ~: F8 q# l9 Q p1 E' P1 L' ` Z3 c
//这个道具无法移动,跳过
% v# q4 r& I, L* ~ continue;
3 |/ L7 P( w4 x5 P9 i }
0 c. s; g% `! @; A$ D5 C9 B9 R }else{
1 L8 d: [ |& {# j* `% C0 Y //空位置 不用动1 R- e0 M2 y% k, }& E
continue;1 c2 M/ ^& c9 _9 x: |
}+ p& L( X7 @( g& h- F+ ^
//////////////////////////////////////////////////////////////////////////& G. J' N7 [+ R
//开始移动
4 V3 Q5 ]& t& k7 l if (nSrc == nDestPos)
8 P& l$ F+ \0 |1 x {; a, j' ~' M* P8 D
//原地不动: _3 e; F$ S% }5 P) D0 ~
nDestPos++;
: Y7 Z" A, K2 R* h# M# d: l/ M continue;& ~ p# Q, R% t. u9 H/ Q+ N
} ?0 n+ b; D- i! M
pInvSort->MoveItem(i,nDestPos);4 ^4 _1 [& X* Z! E2 Q7 n
g_DPlay.SendMoveItem(0,nSrc,nDestPos);% W! n3 g' ]( Q2 R O, `) _
Sleep(5);( v* l5 s% W8 Z v8 H
//Error("移动 - %d->%d",nSrc,nDestPos);
' }# {5 }% F$ G3 R8 i/ S/ ]1 G/ Y nDestPos++;, w: \- \7 N- E7 Q0 R2 e
}
' ~8 l+ l: P; K+ t0 |( h //取第一个元素的信息
) d" g4 q) z8 M- Y /*4 A4 v. d" B$ Q+ L( F4 s4 g
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
+ J5 g: [6 ]. s& O {
* c/ L6 S6 ?: b1 F. ~# a" P Error("Move - From:%d,To:%d",vItem[0].nIndex,x);; K3 ^2 Y; v2 B7 R; f
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);5 i' X: N0 I( {. _: S
}
% m4 Z i: R% [" ~ ~ */& Z! m# |3 r+ }; F: V$ H5 M( f
//////////////////////////////////////////////////////////////////////////
1 z0 O* u6 S3 ? e, [ break;. `* f9 S, x. u$ d, i K
}
" x* p2 s2 y/ D; T6 O+ o } # t! ~( m4 D; U6 {
}
8 r1 p: H0 E& v+ _& C: xm_wndMenu.SetVisible(FALSE);4 Z& z( n( [) K! D
/ e3 e1 U" `6 q; ~
--------------------------------------------------------------------------------------------------------
7 ^- j# w" w2 e. e# i8 c+ y, @搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
- ?/ I+ d* v" ?/ |! y{
7 x3 H4 [) K: k1 bBaseMouseCursor();5 C3 m3 T9 C, N2 \4 i# ^, X
}' C+ c; l1 X5 z0 U- a# p
在其下添加:- {. S, I" i) c4 E& \
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)& b% [7 b2 G, n, A
{% Q( r1 r9 l6 j- E/ [* x0 e1 A
m_wndMenu.DeleteAllMenu();
) C4 X" e: s1 T8 }8 N4 pm_wndMenu.CreateMenu(this);
$ c& s* r6 D9 @m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
3 J4 M& S2 k# l0 j' ]1 Y" X- m! h3 h. y6 p
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
" H' H" `) X' o5 ~2 Z1 L{2 |9 o; ^* o0 t( j4 g4 ]
//P以上级别才可以删除所有道具5 H6 m/ Z: F8 c* U9 O6 \
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
( s$ n2 L# ^3 f: V5 V9 p}7 ?7 |* `/ C( @# T& C" F. e9 y
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
/ u# M: C* }- ~3 k4 Y; Vm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
( v( a5 q# N' n! j4 V: im_wndMenu.SetFocus();2 H5 ?% y3 S) I* h6 c- A
}2 L( z, f! w& V9 [$ b u( `* P
------------------------------------------------------------------------------------------------------------9 L8 f; c: j4 Z2 Y7 o
*************************1 J6 D A* o1 v7 z( j! ]4 D1 [
WndField.h文件+ P: |. B$ j/ x0 [+ n
*************************
8 A @ O2 o% j) t$ r: o搜索:BOOL m_bReport;9 O6 |6 n9 ?* o+ [7 F- h, m
其后添加:2 ^$ Y. x3 s; S& o2 J) ]
CWndMenu m_wndMenu;
1 J/ b2 L2 ~+ f. b- g+ n搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
3 z3 t( \: B1 l' N其后添加:7 O3 A1 ]7 c. d" J
virtual void OnRButtonUp(UINT nFlags, CPoint point);6 K2 x& q6 c( p) u3 N
# j! g3 z: K( {. d, S+ u' }7 {, [# b+ |( `: n# Y) j# c
|
|