|
|
源文件中_Interface文件夹下WndField.cpp文件+ c% A* O2 V) [, U
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )- _) y% S% M. Z3 J6 L9 [' E. j
, T9 ^5 I v: Z* U
struct sItem
$ N5 h5 c- i7 W{7 k% t' y# \* t( m* {; n4 b4 O
DWORD dwId;
, F# n( y- Y, R9 wDWORD dwKind2;& b- m/ V% G/ F g" C
DWORD dwItemId;' X/ E0 h0 X: ]0 F* Z# S
BYTE nIndex;% g& M2 A8 J I1 T- _
sItem(){/ _4 [. \! x! h8 s, n9 w: r1 M9 b
dwId = dwKind2 = dwItemId = nIndex = 0;& g% P/ O1 f; j. }9 C! [8 @! a( u
}
; F* Q4 D. I# j6 Cbool operator < (const sItem p2): l n& u3 [: O/ H9 E+ d6 `
{3 {& h4 @3 T9 b( V
if (dwKind2 == p2.dwKind2); [% y, Z* v+ D+ e5 ?" h; E
{
9 `4 y( _; N! A: h return dwItemId < p2.dwItemId;3 `$ h7 K, L2 [1 f# P9 s
}else{
1 x- @9 o# R/ g' n) r$ h- v8 o, q return dwKind2 < p2.dwKind2;% ]( G3 a4 V+ Y! P$ n
}
* f% ]7 m0 V' j' m* x}# `) O: L1 ~" i: p' R/ c1 d0 y
};9 c, @( T2 H. `" E1 H
class CInventorySort
& U/ e4 N4 h% u6 P. i6 C{
& l! I# y+ y4 R4 v8 ^public:
; ?. o# ~+ G/ m2 lCInventorySort(), i5 G# I" b3 e. M
{
. u- u- ?4 i) m0 Q1 w m_dwPos = 0;+ B+ i* j X9 h: k5 `
}3 W+ U; w6 t S% s
~CInventorySort(){}
* l* z6 D( ]- u& nprivate:
Q* i) x7 Z2 W" e4 v* osItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
2 P% H9 i! ^* F6 \( ~ i( U7 PDWORD m_dwPos;
, s N, ]5 L# K3 a. Zpublic:) D9 V( S1 b9 d4 J- l' J2 z
void Add(BYTE nIndex)- k0 o3 P9 [6 ?# C3 c0 [% W. m
{
1 m' A# [" W0 d8 ]' a if (m_dwPos >= MAX_INVENTORY)4 C9 X' F9 X$ O/ `' g& a: u
{! L/ e3 U; t K8 E
return;
( Q. P& G- j9 H) B" B }
- l& ~2 b# _/ Y( l7 Z, u m_Item[m_dwPos].nIndex = nIndex;: w: ~% |# Y# Y2 H+ F1 J
m_Item[m_dwPos].dwId = m_dwPos;1 Q1 }5 r# m: {6 {
m_dwPos++;2 @5 E0 a# @# a, m8 E/ G
}1 D$ j% N& t9 I& x# t8 T
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列$ v- q V, G; g$ f, n
{" y0 N* ]- F- x2 O2 D" J+ B
for (int i=0;i<MAX_INVENTORY;i++)
& c7 q4 n( m" Z( B+ T# y {
9 \0 x" A1 ]+ A3 m% ~# e if (m_Item.dwId == dwId)
( v) v$ _3 y: V2 i* ?* E {
# q/ @8 Z; C' I( f z1 j, ? return m_Item.nIndex;
* F3 H! \$ q# Q& G2 t }! c; Z4 \9 e) I3 E( y
}& `% W8 W; W1 j& o
return 255;
% b" g7 t7 F, @9 | o( ~4 S}
, L ]3 l V2 I) p4 m4 | }4 Cvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
2 c% A* A4 P6 G, z* h{' d6 x0 {; F" x) G' q7 [7 Z
BYTE nTmp = 0;
; _3 l m/ m7 P6 Y4 Q+ t8 S' R/ Z bool bDest = false,bSrc = false;
* F1 A( c7 M7 v; F' [+ L for (int i=0;i<MAX_INVENTORY;i++)7 U2 v4 R- S# ?+ B, f& [0 H& `
{
& p1 }' J4 @' h) U! z if (dwSrcId == m_Item.dwId)
3 W0 j4 N) ?; q7 x3 Z/ k {
1 W3 s& z8 U, u+ F" V$ M //id相等 则 改变对应的dest和src9 P6 c2 Z E6 ^! S
nTmp = m_Item.nIndex;
8 z. K( b5 I+ }! w7 a# w, ` m_Item.nIndex = dest;
# g/ N) H7 Z6 [% Q# s9 \ }' Y" b2 p0 }' \: E! @' l6 P! O. A
}6 u1 u7 d4 o7 b" ^6 h; f
//临时数据保存完毕,交换开始! o( i4 a7 s# ? c
for (int i=0;i<MAX_INVENTORY;i++)5 z: b! Z( S* }0 G" D
{
, i# }; L9 i& B" k2 s if (dest == m_Item.nIndex)* G Z8 H! d+ L5 ?+ d1 `7 a
{0 B/ [! F3 I3 Q0 \: S* x; s" M
//id相等 则 改变对应的dest和src3 h0 w; I" ]* m0 R# C: e D
m_Item.nIndex = nTmp;
, l1 ^. z$ H% N7 o }) f b, l. b( E# E- Q2 V- O# _
}
% g- Z/ s g3 X4 F4 C/ c}
+ N( Z3 }' N3 g, S};6 U2 V2 n( m$ @3 T c/ ^9 H
-------------------------------------------------------------------------8 b9 R3 b9 |2 d- U
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )% ^9 W7 J8 I/ N
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);( G; e) M$ X: I+ Q! H
紧靠其上添加:
* D3 z+ p' |, W Z* r3 \- oif( pWndBase == &m_wndMenu ). n6 _% |8 t7 }6 p
{0 y6 @ u9 X$ V6 G$ s% i
switch( nID )
! s Z' R9 e* g6 @2 u: T9 Y: [ {& K6 J6 ~% Q% O* O
case 2:! U) q+ p$ w: M ~( \5 g- q) B
{
# k' ]: U+ _$ L E7 U$ M //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);% `& \) V! c3 W4 {
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
4 O0 c/ S9 b2 V! t% [ {
. U8 q% s) u# o break;
8 B( J! h+ t' N }5 F8 ?/ @" [8 J }7 q+ p6 u: W. m& A5 L
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
" |9 r. X. X- y) s4 G {
& J5 ^8 G4 ?/ K8 a. d CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);' t% X# k: M, G5 l, S
if( !pItemElem )
" I6 `. J# d" J1 F, h* } continue;
# I( G3 @ }" p/ N6 F! m if(pItemElem->GetExtra() > 0)
* G# @: r8 T" i. B0 ` continue;
% W" e. G2 h' p) H# W( L if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) ) c, i1 J0 n! r/ s
continue; F4 l: z/ W! u( L
if( g_pPlayer->IsUsing( pItemElem ) )+ n0 i# I; E: X( t& ]4 N
continue;
7 J! G% v' S. X; h a& r% g if( pItemElem->IsUndestructable() == TRUE )* G R6 E* `0 _, n
{% Y: J3 o$ l! R+ V l+ j5 w) e) L
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
' Q1 f- }8 R9 R8 o1 ] continue;
9 V( m; T# G9 m }2 D" X- r4 ~8 C, V% o
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);. C2 f, B+ F2 {# X0 _/ ^8 t
}
* ?7 O, C Z4 x0 I9 o7 V& a break;
4 R) l) p9 b1 t; y/ F }
1 i% h9 j g7 f v/ \+ M case 1:
* z- s: [4 z2 ` {
9 P" u0 t4 C ]/ ~: } //整理背包
, e% y* E7 ^/ D) b5 U- F' k- r //////////////////////////////////////////////////////////////////////////6 ?% R. N" z+ q! h& E
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );0 @2 w6 t! u3 w b1 s4 d
//////////////////////////////////////////////////////////////////////////
* p7 Q' a( e: ~$ L) O //////////////////////////////////////////////////////////////////////////
: x$ R" h; ]3 Q7 v5 C# \, f CInventorySort* pInvSort = new CInventorySort;
2 ~; s8 `( n$ t6 y vector <sItem> vItem;, t6 t2 j( y2 N! E" Y, ~' Y/ I
vItem.resize(MAX_INVENTORY);//初始化大小/ s. }& A" q+ A3 [. `. i
//////////////////////////////////////////////////////////////////////////% m' Q9 [$ {+ x4 C, Z# V# U
//填充数据6 Q7 J/ r4 k/ n" G5 ^
for (int i=0;i<MAX_INVENTORY;i++)
0 r4 W& t+ @$ R! `2 V5 Q6 C {
, u( Z# J( k$ y; S" D5 d CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
: N1 ~. N' ?" y; d" z, k if (!pItemElem)
( q8 ?1 O/ ?) u+ N; l, Q2 ? {
& }- n: o/ H5 t, _6 y vItem.dwKind2 = 0xffffffff;
4 R- t9 t C% `$ } vItem.dwItemId = 0xffffffff;. e9 `7 ^; o2 l) L7 i8 [5 D* M
vItem.nIndex = i;5 n3 \ s+ S" E# T0 r
}else {
( X" r3 F' G9 U" \/ h ItemProp* pProp = pItemElem->GetProp();9 M- o5 x' ~! f1 S/ t' V
vItem.dwKind2 = pProp->dwItemKind2;/ b9 X' s5 a( y' m- G$ N
vItem.dwItemId = pItemElem->m_dwItemId;
6 D9 K6 `( o" M vItem.nIndex = i;8 M5 _" g0 i9 E
}
; ~5 p% c6 F7 k0 i7 n7 a' S //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);+ j& |& h1 ?' t( Y7 _: \# U1 c
}
; b& \9 u6 i: c5 ^) l //////////////////////////////////////////////////////////////////////////
. R/ i/ w: {5 ]6 ^2 p$ _, T sort(vItem.begin(),vItem.end());//排序
8 D( ~. d% P' i" S //////////////////////////////////////////////////////////////////////////6 V. _& `1 k8 M: K. Z
//交换" x- Y0 Q Q* |: K
for (size_t i=0;i<vItem.size();i++). c- b1 m( [! x) J, b% y: q# v2 L
{
, T% W4 H5 X5 w //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);3 S2 v% R% {/ H# g+ w
pInvSort->Add(vItem.nIndex);8 Q+ C3 g3 j3 }' K+ F8 q2 r
}
6 L X% \ O7 k( m, m! H C T BYTE nDestPos = 0;
/ [- h. [0 f n for (int i=0;i<MAX_INVENTORY;i++)* L% i, V* ]$ e0 Y2 J
{, R+ c- _. ^1 o$ V1 R( q1 T3 c( D
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
( x+ f2 ^4 |& R+ D% d& h5 j& t if (pItemElem)$ i+ J( @" i3 ~0 x; Q5 }. L6 v4 z8 J) J
{
0 G5 |& e3 j' { u1 r7 N7 f J if (IsUsingItem(pItemElem))
. J2 ]# l% ~% M {
4 m3 t4 C8 r" G8 P! h //这个位置无法放
& y2 |/ a! \3 ~ D: R7 w) r' k5 F: k nDestPos++;
0 i/ L8 ]- H- v, S8 k/ V* N }
% ]7 F; O, X2 N }& x3 r1 A0 a W0 d* O, m) A
BYTE nSrc = pInvSort->GetItemSrc(i);
3 Z, Q i: O/ n( r pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
8 w" L; @4 q4 @: e if (pItemElem)
9 D8 Z7 i# b* M5 a/ ~ {6 @; D) M3 o8 w% [
if (IsUsingItem(pItemElem))& A/ P3 {( F4 [/ x0 Q
{: @; t/ b+ e2 ]
//这个道具无法移动,跳过
' `" V$ P# k- Q& d( ^- T, I continue;/ F% H; g8 v- J( M
}2 c' f& F; u8 c5 N
}else{
# w: [+ U" j# ^4 P: _) \2 u: H, J //空位置 不用动; x4 D5 y3 @$ k/ W
continue;+ N; H4 W7 s. n8 x- J) X% Q8 i; Y
}
9 e3 {3 M4 s* s0 _, P1 ^ //////////////////////////////////////////////////////////////////////////
. U9 P* a3 ^6 J //开始移动
6 p- a& g1 t1 t& j, d! { if (nSrc == nDestPos)+ v' c- {& m, X# |( q, b) R
{
' q3 c. R+ n% f3 w" J+ e //原地不动
8 V' ^9 A1 z; I6 `. I1 a4 ~% J8 ] nDestPos++;
5 c# G% }% P- m% l( T% Z: E( B continue;- y: {6 D' w+ k6 n+ P2 N
}% @) }8 h( g0 n1 C
pInvSort->MoveItem(i,nDestPos);
8 z1 Z; }6 U9 q4 j g_DPlay.SendMoveItem(0,nSrc,nDestPos);
3 ~0 F j3 q$ h* u Sleep(5);
; ]; J( {- J( V) ~2 C //Error("移动 - %d->%d",nSrc,nDestPos);
- q4 U+ o& D8 J l% z' i& _- X nDestPos++; ~# R2 f0 X' ]5 _1 |
}- i' o* e4 Y& G1 M, \
//取第一个元素的信息
+ @& Q. w( `* S9 { /*0 G. V! @) ]; p& _2 ~$ c
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)( {6 N+ F* O% o
{8 s; d# G+ J& Y' X3 {: r1 ~( w% H' w
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);/ ?7 @6 w) [! E3 p3 z" V
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);, B6 a2 N* C8 j. ^
}6 a. E; ]' r" a( y- Y
*/
( v! n* g( X" t/ r! ]3 S //////////////////////////////////////////////////////////////////////////
8 \3 H5 B- ~) a' [ break;2 s+ | X. @% g0 s" V9 H
}
5 Y# `3 B. j' a7 f' O }
2 N; o5 A1 @8 ^7 ]}) v* R3 B( G: [4 P
m_wndMenu.SetVisible(FALSE);
9 ]4 K5 ]; R9 H
$ y. l; t0 _5 i--------------------------------------------------------------------------------------------------------* M# H8 ]5 j, r8 B% P
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point); F+ f% ~5 y& j( V$ B
{
# {+ Z6 J, H o2 U% r' W7 o* sBaseMouseCursor();- S# ~% e: Y' S# d# H' m7 y
}0 R5 z5 |1 R, t# V5 p
在其下添加:
/ {0 M, n, A2 Y& y1 nvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
# r. x2 R4 h/ M! T) |{, j" q/ H+ z3 ^
m_wndMenu.DeleteAllMenu();$ \/ n% C# U2 ~# i9 A
m_wndMenu.CreateMenu(this);1 H$ c9 K' R5 B# y" V
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");" \' y& B+ v6 {" ^+ c/ S# y) L
0 _) F* f3 A: v) K; d, T$ k
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
7 q$ o- n( |7 N; w, N- n{
( e* \/ F7 |% l( q: }+ c //P以上级别才可以删除所有道具$ `+ C# S( M( P$ V$ U
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
; A: U9 o; C: T/ f}
( j2 ~$ W+ U% ^+ Em_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );) U; m+ |1 g" L+ Y6 |
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );3 z) G) p* x" M+ U8 z6 n5 z
m_wndMenu.SetFocus();
3 L" ], w9 b e}
0 T+ o0 Y) M8 t9 X* f; [------------------------------------------------------------------------------------------------------------
\; b# y5 S4 z; G*************************
: M! x2 T& p! b2 C" X" ~4 SWndField.h文件: i$ E% A+ X) Y& V, W. h0 D
*************************$ T1 Q( z1 g9 @- Y2 e! N
搜索:BOOL m_bReport;
' I0 E3 K! Q _- E7 ^0 A2 \其后添加:
H& H6 K" C+ ECWndMenu m_wndMenu;
: l: Z) f* f w1 F搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);( A$ q* V# g- C
其后添加:5 J8 i# G, T u3 x; M W
virtual void OnRButtonUp(UINT nFlags, CPoint point);' X6 w6 F9 ?" y! h8 d$ h+ x. {
5 ^) P: A8 J W4 H& c% B# f8 l
. L+ p9 h2 X5 T* }$ l( U |
|