|
|
源文件中_Interface文件夹下WndField.cpp文件( T8 k: {9 k, x1 Q: S3 k
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )& X- O' S, O. `. N) b. j4 L
* ^3 W) b6 z: [8 [* P
struct sItem
0 z9 x) H" G. B" Q{
& }/ a0 K7 y4 N4 r$ G6 u2 nDWORD dwId;
4 @5 i0 a [. U, q; }DWORD dwKind2;
j$ h+ S0 Z& P- U) sDWORD dwItemId;
$ R2 a% s' d$ s1 x; E0 E7 YBYTE nIndex;
% w) w9 v5 g$ Y7 C1 S" MsItem(){8 t7 a" a7 s$ n8 _7 J: ]
dwId = dwKind2 = dwItemId = nIndex = 0;3 Q. j A% b$ `3 L
}
9 D+ ~. r4 \0 G8 X( ybool operator < (const sItem p2)
3 f% s) c$ v* a# g{
2 S$ x; Y0 O7 [1 |7 C/ z R( { if (dwKind2 == p2.dwKind2)" i. k; a/ S' R" D/ W
{
% C/ R9 M0 j# F# ^ return dwItemId < p2.dwItemId;
E) h1 e5 V ?0 z& i5 l& n/ L; n }else{
6 G$ L) K( q0 K! f1 Q return dwKind2 < p2.dwKind2;/ \( X( }* \ i; J! S6 U. m* _4 R
}5 G# V6 L6 x3 H, m: R, Q2 O
}
" v2 n& Q y8 g' v};
' W: U5 C3 k2 T: r" [class CInventorySort' B; M/ P1 n9 U6 B8 r* g, [/ ]+ ?
{$ G; E, g8 b+ O: {! M; U
public:
9 p; Z6 c1 ~. s) _. h; QCInventorySort()
# @9 G; j- f, U" \{
& }8 z, F+ L* K" J9 o! M m_dwPos = 0;
9 L+ k$ }; @3 O5 C: q! S5 F}
/ m+ j5 Z& J8 L5 s# G~CInventorySort(){}' ?/ v; X9 d* `, K9 u; X
private:) t$ u! n; b, b* O$ `
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
1 _; T' K+ D4 {% M/ rDWORD m_dwPos;
& x; }" Q. t; U# _& @public:( s4 Z8 `1 ^3 G! W" Q. M
void Add(BYTE nIndex)" e' q! y/ H" V( Z3 \
{. w1 M' t+ y' ]
if (m_dwPos >= MAX_INVENTORY): D. ~+ b' ?1 Y8 p
{
q+ |* j1 y9 r- i7 S @! f) r return;. ~' v! Q' W0 ?! H4 c+ S
}
) h6 ]5 U/ t- v+ r3 Z3 [ m_Item[m_dwPos].nIndex = nIndex;6 } S7 ~: q# S0 r
m_Item[m_dwPos].dwId = m_dwPos;- M2 S& w& o! @" \. N% X+ R9 t
m_dwPos++;- o# X4 M( z2 }/ |; h1 L3 S
}
K$ [- z' y2 ]: x" zBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
+ A* k2 m8 N8 W& T- z5 G3 J' s4 H{
! I; k, N8 q+ E5 G( A: e; N& E; l for (int i=0;i<MAX_INVENTORY;i++)) P: f& w2 E2 A I. h! R4 f
{
7 i: |4 y: E; A) p4 n/ C if (m_Item.dwId == dwId)& {7 ]/ I8 C. A b1 L
{
; O* P1 X3 L' m2 r return m_Item.nIndex;
& c5 E6 D" _0 v$ ? }) T7 n; }! J4 z8 a% P
}
2 W' ]5 {- m* I* a+ ^9 T0 U' ~5 ]! O* H return 255;. b5 Z) T' X2 G8 G/ _
}, J: A$ R0 C7 a) x
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
; `! s$ _8 c, ?0 q{, i, p. r& u- O8 V* z
BYTE nTmp = 0;% Z" d& H. V6 t6 F1 i
bool bDest = false,bSrc = false;
; F- s+ R' N7 S# v4 P2 ` for (int i=0;i<MAX_INVENTORY;i++)8 c$ k' `; O! |6 X( J; n* f- _
{
1 R/ J& b4 l% d5 e* j4 @$ V if (dwSrcId == m_Item.dwId)
5 Q4 U* I3 l( c2 z: i9 h8 C. E {3 L! h/ e. P# {2 W7 Z3 P7 h/ i8 {
//id相等 则 改变对应的dest和src
) A9 O0 `4 Q2 Q' V8 U4 @, V/ T nTmp = m_Item.nIndex;
& R4 k/ F* a5 A# L8 C: u m_Item.nIndex = dest;
% j# S. y# a. C! a1 a1 W% z }
8 [5 W! o+ E( C5 V }
4 E; s( n2 J H+ u% {9 D+ L //临时数据保存完毕,交换开始, K+ \" X1 f2 `, U; s" e, q" X
for (int i=0;i<MAX_INVENTORY;i++). K! c) P" h. e
{$ P, X: x: ]4 \( I2 t' e( n
if (dest == m_Item.nIndex)9 V" ]+ r, h4 H: h
{
8 ]; v5 Z& r$ B1 I6 L4 B //id相等 则 改变对应的dest和src/ T1 v6 D# ^& F( g$ ]
m_Item.nIndex = nTmp;" t1 P9 I- A$ C# N$ }6 Z8 p- K1 w
}
. D W: J' V r0 L: A }& q7 I" N; B5 E& z k
}
: D* n+ x% u% Y7 m+ l};
4 h# f. J; H& c# k/ c9 o& Z4 e-------------------------------------------------------------------------
" b$ E8 A. n) ~: K) T依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )5 e! ^4 Y7 R$ R8 e
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);( ]6 W9 |7 A1 n/ \# H7 k
紧靠其上添加:
3 d) `1 J" }+ s# @3 aif( pWndBase == &m_wndMenu )
( D% l0 S B0 W. P- X{, X/ _% i6 n; H, @3 N
switch( nID )
5 q8 \& h! z, y7 } {) G9 w, _! s0 p, k
case 2:
4 t3 a0 {" v) u; S" \: B5 r {
% R) J; n# |" } //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
. L' _. U8 p) C: \2 q. ?' L( i if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
/ d, v# Q; J c/ U/ ~2 x+ `( }8 p8 G {5 {- S1 k1 A' T5 t* h V5 ]: ?
break;$ k! s" R( J( {
}9 N% r7 P0 k. \+ L
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)) n- m5 c1 _3 h. e! g' f7 ?1 d
{% p. a9 l; g2 k( r" Y
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
& a+ X0 {, Y/ |2 I; p3 V if( !pItemElem )
( ~% v9 f6 ~! f continue;
4 Q: M4 ?. {" Y! O' ~" N if(pItemElem->GetExtra() > 0)
5 g' z' \7 E0 C$ t5 @) J continue;- K- {2 C4 z& G; m7 ~
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
- N; e0 L3 w% W: r continue;
' R# p9 `( h- o if( g_pPlayer->IsUsing( pItemElem ) ), i( q/ M5 g* p* ^* u2 N* b
continue;+ F7 ]6 i1 E1 |1 x; I/ ]7 B
if( pItemElem->IsUndestructable() == TRUE )
8 ^9 _, v4 V q6 T2 z, h {: N6 e! j* [6 }+ p: L
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );7 e, r" Q' {# J; x4 x1 _
continue;( |" [. u+ g( n) a5 C
}
* G' c- L! ^3 @7 c' _" N7 U g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);( ^# ?% F' z6 ^9 D8 K2 I# |% X9 ~
}
/ _4 S' O$ z# ]' _9 N2 O3 ? break;! h8 I- \1 k- M) K: N
}
n- y! }5 D5 D& ^. b3 E- [ case 1:" A) `# D5 h$ e! c V2 _2 R
{
4 R2 _6 v* b( A7 s2 l //整理背包
+ g: K$ | z6 L! E5 r //////////////////////////////////////////////////////////////////////////# j- \: A; ?( E
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
% @6 \! s% F U2 W //////////////////////////////////////////////////////////////////////////
. k+ h$ i0 ?3 B C! a //////////////////////////////////////////////////////////////////////////8 M5 K g. d. S4 t* u( ?0 W
CInventorySort* pInvSort = new CInventorySort;
+ j* i' d; ]; i; t/ j vector <sItem> vItem;# r6 K, n# }: j: {* I* K
vItem.resize(MAX_INVENTORY);//初始化大小
; z5 E& l6 F4 `6 g( K, M9 B) ?- ~ //////////////////////////////////////////////////////////////////////////' `/ x# d {& p. }, R
//填充数据
+ {0 s( j2 l3 ]: G% ] for (int i=0;i<MAX_INVENTORY;i++); s" E2 D/ ~; b, M e
{) U# {3 _0 U( L F) |7 ^# S) A2 l
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);6 j" x3 U; H, _0 p- H1 a- C5 x
if (!pItemElem)
. I8 [8 q) j/ \& O$ z# M {. P' G( N' f1 T: a/ j5 ^
vItem.dwKind2 = 0xffffffff;9 {9 S1 |9 Q& I" T/ L
vItem.dwItemId = 0xffffffff;1 t4 E- E9 y8 T
vItem.nIndex = i;
9 l9 ^) H4 Q% D V7 D3 ~! Z8 B }else {
$ n$ |/ d. M {6 S7 @! {5 { ItemProp* pProp = pItemElem->GetProp();
! f2 {( }* G ?4 O: f% ~% N vItem.dwKind2 = pProp->dwItemKind2;
9 f/ Z s; T" L& _$ |3 l vItem.dwItemId = pItemElem->m_dwItemId;
" S3 F0 j" z9 j$ a3 X vItem.nIndex = i;
8 ^% ~! J4 [5 B- z% M6 C }! ~+ m. p" P( \
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
0 ?# i0 L [( V% M }: u. J7 ]' ?5 ]+ C; e) T' w; J
//////////////////////////////////////////////////////////////////////////$ X: f# E( `% j% m; u: ^ b- Z' X
sort(vItem.begin(),vItem.end());//排序' z4 y" E! E y# ^* W/ `: y4 Y
//////////////////////////////////////////////////////////////////////////
. B( s$ D$ T# `% } //交换
, x% G; T# u) i) \1 A for (size_t i=0;i<vItem.size();i++)4 T* F+ T6 ^+ Z; ^9 g- U y
{
/ I) P8 {" ?) `" k% N" L. E2 b# o //Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
6 l5 Y1 N; F- c$ t pInvSort->Add(vItem.nIndex);
% w) J) D7 x7 _8 K6 H }" G! z) n; Y2 Q. ?6 n; U
BYTE nDestPos = 0;% `$ c& X6 o& ^5 w, ~1 x6 b# L$ F
for (int i=0;i<MAX_INVENTORY;i++)
* U: Q6 J1 n. @7 W5 t0 t {' r" i1 o' }: O- P
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);# L# e' e$ E/ R( I/ b) z
if (pItemElem): }7 C( ~; ^. |/ B# _
{0 `) `* y7 C$ |( r2 p6 `
if (IsUsingItem(pItemElem))
" [; H4 U: F; R3 ? {1 ?/ w7 n+ N0 V( q7 G
//这个位置无法放# H, u3 ^% s% `: K; F2 e9 B
nDestPos++;
+ d4 [+ k: `7 k i4 T @ }' ]8 w3 x3 h/ K- F, E9 s0 x# v
}* a* A8 h2 {( X4 k3 L! X: c3 E
BYTE nSrc = pInvSort->GetItemSrc(i);
& K9 u. N; W. ]3 `8 S pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
& }/ l% A# }6 L. E+ L8 j- P if (pItemElem)6 I4 ~% e% u5 p5 n+ Y
{2 ?- s0 {( _ t% h6 s+ G C
if (IsUsingItem(pItemElem))
& |; D4 X7 U. N& {7 }# F {' K/ v$ E- s s1 _3 F! H
//这个道具无法移动,跳过
( M; V- T U# I& \3 f continue;
3 K8 t/ O, u, \% |, L5 s }
9 E' R- A$ E3 Y* Z( e% c# R }else{ r3 ]* ^3 e1 U0 [. w& y
//空位置 不用动
9 m) b+ d9 o- q1 _5 E3 n continue;
* w" `% {& V, b1 z' s }# ~) B. p h D3 W
//////////////////////////////////////////////////////////////////////////
% P; }5 l2 ^" e6 i //开始移动
3 K8 V1 G8 ~9 H% e* `$ \ if (nSrc == nDestPos)
9 c, R) f G+ V' \* l {
& R! d6 n0 r; v! F' W+ } //原地不动, W$ m! B! t* i/ k4 p6 z
nDestPos++;
, U& A/ i5 Z. s2 A% G; g9 v continue;; N. g5 B, } ]) j
}* Q2 ]- {% X' Q/ z+ s% g1 f
pInvSort->MoveItem(i,nDestPos);
* s2 c2 w9 Z* @$ Y% b g_DPlay.SendMoveItem(0,nSrc,nDestPos);
: i t- L# w* X% d. x( J; G- @ Sleep(5);; X v0 E# l$ H7 h% x# ? Y& ]& ~1 k
//Error("移动 - %d->%d",nSrc,nDestPos); j; A& M# _ A. N | P
nDestPos++;
$ L O# a R& c* d }. K, G; g3 B% w5 {7 |) d
//取第一个元素的信息
) Y2 J3 W h! g* @% Z+ ] /*
9 _% k, T: x4 x* ] if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)% K( G: j' H( J! x
{
4 o# M; K9 C% u2 ]" U$ n Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
5 s7 ^3 D" ^! S g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
: o ~3 L. y3 ^; a5 T1 V# E, i }
& `* s- Z6 v& C' o/ [ */
: k7 P+ h# f, T //////////////////////////////////////////////////////////////////////////9 P0 d4 O& V. c J" I
break;; w2 F* x. h' Z8 r7 U
}
$ P3 i8 ~# V. ^7 b }
- D% \ @ a9 f- S}
; s% P# P @0 X) ~5 V2 n5 J' c/ km_wndMenu.SetVisible(FALSE);3 E% ~) L9 W' d, a0 |1 _. ^/ j* T* F
M- X8 A" W5 j& W1 D g1 E$ G--------------------------------------------------------------------------------------------------------4 A9 s1 a% G6 K9 v6 V3 U
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)- t0 W4 g' l; b5 h# ]* |% O/ S: _
{- g: b+ ~% |( C' B
BaseMouseCursor();: h8 m8 v1 Z. q: n" D8 ]' K% S
}
2 w! W3 A$ S& L# X$ |* q4 y3 I在其下添加:
+ x+ u4 i8 S8 [3 Z( ~void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)7 u# f, F2 c- U; g
{& w i% j& v8 o. N7 ?6 z
m_wndMenu.DeleteAllMenu();1 @, |( z3 O( ^4 [5 b- e+ W. t. \
m_wndMenu.CreateMenu(this);
8 N" t1 [! ^9 h+ v1 Z8 \m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");& U1 N5 r+ D2 u% ?% `& S+ y5 {2 P' t
2 m; a$ @8 I, I9 Fif (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
: v2 N4 d' t$ M" F6 A{
# E8 W& y, C4 E% M" @1 g //P以上级别才可以删除所有道具: T, J' K% g7 N; N! Q
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");; n1 \5 E! T3 p- h
}
$ j. z! R( S4 U8 Y" Z& E, D( Xm_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
/ Z% y7 M4 N+ r8 ~! b8 y9 u/ nm_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );* z$ p# _% L( V# p1 p, q: r, [. r
m_wndMenu.SetFocus(); o& _6 J: h; C5 Q5 i) @$ b4 b
}' ?3 u; o& s% s& f/ e/ d
------------------------------------------------------------------------------------------------------------
7 O7 m, k9 |/ S% s5 t*************************4 F2 V; p5 g; R. Y& Q- h
WndField.h文件) ~" }& K" s5 Z9 H4 W
*************************
# [+ O% g" J9 g H4 e搜索:BOOL m_bReport;
/ d4 l0 a) Y2 a+ V( A7 _其后添加:: A6 N! { Y8 M2 z. Y
CWndMenu m_wndMenu;
% v" u+ P. n3 m8 v搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
4 N( t$ f5 Z: i: K( V" o7 [其后添加:( }; O3 i- X% F5 o' E
virtual void OnRButtonUp(UINT nFlags, CPoint point);
5 _* h6 Z1 _ [! D; v7 y9 y; `1 c9 q' b6 q8 Y# b* s
! C9 ]2 V& l( }8 X |
|