|
|
源文件中_Interface文件夹下WndField.cpp文件% ^0 U6 e2 D' n% }4 K4 q8 l( Z* h' y
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )8 { e! Z% P5 T3 R# w5 a1 T
# ~: T$ r& z7 j. J
struct sItem4 n- l! M0 C/ C9 s
{: V5 {. e! g8 ~! e% [
DWORD dwId;: A5 X, |; n. F7 d
DWORD dwKind2;, p* Z5 @* ^: _) z, A1 A
DWORD dwItemId;
/ a& d0 l; B1 G- h0 G8 cBYTE nIndex;; N& U8 \1 m, X3 z9 ?; A
sItem(){3 s8 }% d9 i1 O# A
dwId = dwKind2 = dwItemId = nIndex = 0;) }; H }1 J- x# t; Y- E+ q0 I) T
}+ Y& L# k1 ^# A w: h- T( r
bool operator < (const sItem p2)
- Z% i! W1 m/ j' V1 ~{$ W" w: F2 a$ x
if (dwKind2 == p2.dwKind2)
$ G0 M) j3 i/ m {
M! u/ W- ]6 [1 {7 l, @ return dwItemId < p2.dwItemId;
0 }# k: U7 a1 Q2 ^- ?- h }else{
! W3 T" J6 L8 l; r E+ ^$ M return dwKind2 < p2.dwKind2; l6 w; S) _( u, K; N
}
( y7 Y( j' L! D. s}
* s5 q$ j0 `8 |};5 X, |6 J5 I! L
class CInventorySort
6 r* @) H6 n G- R3 G{* v9 X' k/ m* H* Q& |7 d7 p
public:1 ?" u; T& Z' ], J" G3 e6 ~
CInventorySort()
7 u' I: b* j- s Y- a$ ~% E{; P9 T) k% S5 c3 |& i: B
m_dwPos = 0;
1 d* m+ i# C2 Z6 P& }4 J8 P}" }' }: J% P% g4 z
~CInventorySort(){}& k @! N1 l; X, X) F+ T: y; t
private:
& {" k: w8 E$ z' y3 v! w" vsItem m_Item[MAX_INVENTORY];//存放排序好的道具信息7 T$ O8 u5 H- M& B& E0 B
DWORD m_dwPos;0 F) l6 D7 [' Q* q* V8 g/ L
public:/ g& M* ~0 n& l* ]+ e
void Add(BYTE nIndex)9 \& ?* g, n! N+ L
{+ h( R& `- U3 E7 K$ @, M6 ~
if (m_dwPos >= MAX_INVENTORY)5 h8 H4 j$ A0 }& S
{% |7 w' ^8 c- t$ e2 t( S
return;3 j- ?) m8 n7 a4 A/ p+ \
}+ E# n. D( b0 O5 }
m_Item[m_dwPos].nIndex = nIndex;" C: `; \2 U6 i
m_Item[m_dwPos].dwId = m_dwPos;. P$ A, c8 C7 n, A. ]" M& U
m_dwPos++;
! F* i A% ~+ F9 D( S}' T0 H; d/ g; t8 s
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列% v" |2 }$ T. Z! x
{1 n. `; W$ P6 y7 Z! e* A: K, l
for (int i=0;i<MAX_INVENTORY;i++)4 _9 u/ j, b% _+ k' w' H
{4 B8 m9 ^& \4 ?. M7 |
if (m_Item.dwId == dwId)
% I$ R* }" o3 g4 T {
$ p. p- _/ h6 i& \. w return m_Item.nIndex; i; ]8 g; u8 `+ C, G& C& w) F
}* R" o& s% u% I( h7 `
}
' ^% N6 b' T, |, B return 255;
8 ~( u( W7 I: u$ ^- O$ @+ q3 |}+ e) z4 O. E% `1 C. ~
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置+ H; C R5 }) ]
{
, c# p; H- _8 u' L4 r BYTE nTmp = 0;
8 X1 d; _9 ?/ }9 a) X }5 |) Q5 C/ d bool bDest = false,bSrc = false;
0 s, c1 z' _) D, W for (int i=0;i<MAX_INVENTORY;i++): H! i. a5 ?/ o
{$ i3 h r7 K/ T; W6 N
if (dwSrcId == m_Item.dwId)
S t* C" ?$ J {
! l- @6 I7 _' M b" f0 c' @ //id相等 则 改变对应的dest和src
! k4 \4 K9 A; G' x( j7 i! q nTmp = m_Item.nIndex;
- a7 W) T6 `5 `& W m_Item.nIndex = dest;. l3 ^) Q; s+ t) y! G4 r5 j; J( W9 U
}
; u ~" Q# y+ B1 ~6 W1 Z }, I* \. j; l T7 T$ y
//临时数据保存完毕,交换开始
* o/ v) Q$ S; E @2 ] for (int i=0;i<MAX_INVENTORY;i++)
1 w( b* l) |" u W2 g' M { O/ h2 y; l( ]# n
if (dest == m_Item.nIndex)# f7 {/ |4 k: M0 g" Q! |- \
{
& j0 o' {2 ?1 v# o5 E //id相等 则 改变对应的dest和src, ]3 x/ Y5 |/ }: H( [9 O7 a
m_Item.nIndex = nTmp;" t1 P' Y9 \* e1 W
}+ F& e+ t+ s, S; B
}
8 W6 G) \& N" m5 b" q' D}0 N* _% B$ }% T" j
};
0 ~5 f: f W% M( F1 U; x-------------------------------------------------------------------------
% D( Q/ w' K9 K8 ^2 i0 y依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
& Z3 }- X) j6 p6 ^) ^7 _7 F搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
% y+ X, E1 u5 |& ?4 {8 G紧靠其上添加:4 f+ J( x8 _0 u) g: A% M
if( pWndBase == &m_wndMenu )2 v& j- l* n3 w
{- t" ^% g9 ~7 m, J: q% {9 c
switch( nID )' D7 Y1 Z$ i1 y! k9 _1 \3 c5 b0 M% t9 M
{+ E5 Z" b1 \* {7 |
case 2:. u. C* M" [2 r5 I9 L: a
{
- m! [; N( e0 F6 Y: z3 ~ //g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);1 O( | m9 D5 E& k4 ~1 A9 d
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
9 \ ~; t3 U, P4 ` {
z! Q- k7 |5 W3 D0 S break;, Z q# @ y/ Y
}% J( s2 C" U! v! R' Z
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
4 |6 \9 w9 s; F9 o, z {( w" [' w6 I; E4 H2 Q$ m# W
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);; C0 j# W, U' M4 Y( i
if( !pItemElem )
$ O5 H8 S& I0 C6 m0 }- m continue;4 [! ?1 T# g8 }
if(pItemElem->GetExtra() > 0)
! o* W8 U1 Y0 y' a/ S$ Y# k9 e& _ continue;5 i/ j: T8 z. g# G2 H7 \& z; O
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
0 r# c& p. k9 o s7 X continue;7 o" S1 W# n/ v
if( g_pPlayer->IsUsing( pItemElem ) )
) w- @. N6 \. Y' [- i continue;
# n# x$ q! K' i8 p( L, l if( pItemElem->IsUndestructable() == TRUE )1 @- j: _3 o3 e( x3 @4 A
{( Y7 o& P& t. i
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );! f: h9 @* p# l$ t I5 O
continue;
/ D; N* \1 i2 \# a, A5 V }
7 ^9 v# N: ]+ y% @( W( ^ g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);+ I- D) {3 x* X
}
0 T/ o3 P+ g X; F0 ^' L break;* V g4 t8 `8 L+ [/ Q& \
}
% g' o! P. m6 f. z. b, u case 1:
: g/ s6 [: S7 ]1 I( ?4 E {
2 ?: S9 B4 }# I: n$ v //整理背包
/ m9 p5 a6 d9 g, E& e9 o# y //////////////////////////////////////////////////////////////////////////
' D+ W6 t5 l- b8 ]- H1 h" X6 G, [ //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
8 m) Z- F/ t5 x' s. ~- ] //////////////////////////////////////////////////////////////////////////% ^; X" m+ J$ m; c
//////////////////////////////////////////////////////////////////////////# A9 M$ A# e# x: Y6 D/ I# x
CInventorySort* pInvSort = new CInventorySort;5 h- C; c3 i, m& I q
vector <sItem> vItem;4 [! [4 o* {7 f
vItem.resize(MAX_INVENTORY);//初始化大小
- S; O2 `: I' U6 b ////////////////////////////////////////////////////////////////////////// \4 |7 Z) A/ d2 r+ x1 D
//填充数据
7 e7 }4 n. |2 f' v- T for (int i=0;i<MAX_INVENTORY;i++)
/ a4 c5 @& L" r% U T' s {
8 ]5 H1 ~8 V5 m: y% ?. ?3 \: F CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
0 \1 l$ z! ~7 m; ` if (!pItemElem)
$ e! q4 N( C7 d- G; R5 r9 u {
9 W- E& G" h* |) P4 R6 x7 d2 U vItem.dwKind2 = 0xffffffff;( _# U' o2 i( I1 n1 z
vItem.dwItemId = 0xffffffff;
" @3 V6 l5 ?7 z vItem.nIndex = i;
! q$ J5 H- G& ?, t b/ v: {; @; B }else {7 V- l t4 n, f0 e' x8 o M5 X
ItemProp* pProp = pItemElem->GetProp();. ^4 k3 G' @" P1 a
vItem.dwKind2 = pProp->dwItemKind2;
5 n n/ ?' T7 S X/ E vItem.dwItemId = pItemElem->m_dwItemId;& e. M' C7 `, q) \
vItem.nIndex = i;( a% }0 \& P& x- [3 z, ^
}
" B% p) n+ K2 o% E. V5 `" A" h/ h //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);+ q/ N6 T+ `# ]) X6 d6 T: [/ P
}
0 Y- L8 x' c8 X! t4 I5 S9 b+ C //////////////////////////////////////////////////////////////////////////
$ F4 e9 X Z7 `% `. J/ A sort(vItem.begin(),vItem.end());//排序. l9 t9 `/ F. A. s, `7 V* v
//////////////////////////////////////////////////////////////////////////0 a2 a5 N5 ~8 ~) G5 ?, P% y% L
//交换( a( k5 M i5 X4 t+ G4 Z
for (size_t i=0;i<vItem.size();i++)
' S5 t4 G- `. X7 B3 {/ F7 K" X% j$ P" E {: t% v/ N- W/ D
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);5 y3 @% G+ m, y- i
pInvSort->Add(vItem.nIndex);1 O; ^" n5 B- Z* y3 t6 k
}
2 h% ]9 ?9 Z9 s; c BYTE nDestPos = 0;& J. n/ C$ w, |& g2 Y0 q
for (int i=0;i<MAX_INVENTORY;i++)6 P# ]4 F0 e* M9 `$ I
{ v0 z- x& S/ P
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);0 N- n2 r- q# Q. N0 ]7 S' a
if (pItemElem)5 U2 c& g# f1 L4 E
{
& C% ~$ x. f ` if (IsUsingItem(pItemElem))2 s) g0 U2 s: ?* f% v
{
! |/ `) D9 \0 B8 O$ q //这个位置无法放
1 j4 g' T: J5 s( L! G nDestPos++;
& i$ x- N6 o( a3 X1 s9 ~ }! M6 x6 q/ L" V
}1 }& |% N D# D5 i. F8 o& S9 P
BYTE nSrc = pInvSort->GetItemSrc(i);+ B/ N2 U! w7 p
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);4 z% t, n3 p+ g+ b- g6 e4 T
if (pItemElem)
0 q5 w' z$ {2 q) T9 f# N T; u {
( h, h9 |2 U' J/ G$ T1 | if (IsUsingItem(pItemElem))# B3 [; Q# e& H0 K7 p
{) o- l5 Y( E5 E+ W' c7 R& q
//这个道具无法移动,跳过
* O( g. n( y, X/ |0 a S continue;
1 ~7 |' f6 I ~; i. g }9 A D. F9 ^+ f& u
}else{" J L: w& I, K
//空位置 不用动
" ^6 s' n% Y2 D* f4 O$ Q continue;
4 J! j, e# x% [+ }8 P. Q } @3 m5 c. ]7 I
//////////////////////////////////////////////////////////////////////////
' b: u2 A- f6 `# P& P //开始移动
6 N9 I& U) w$ o if (nSrc == nDestPos)
& `" p) N' m# k, |; T9 t {
* b. G! o" y0 P, C; C0 m4 q //原地不动
: s& F: h- {9 U( {1 Y' \6 U nDestPos++;. B. b: A6 S5 w5 B& [
continue; r: O: \2 S; I3 d V# n; p. l
}
2 ~, Y7 A4 a+ Q; Z pInvSort->MoveItem(i,nDestPos); f d$ O3 T$ u6 `# \
g_DPlay.SendMoveItem(0,nSrc,nDestPos);( J& X# G, k# ]8 o* |8 K
Sleep(5);
+ H9 }! V9 F9 ^2 z: S //Error("移动 - %d->%d",nSrc,nDestPos);# Y) r0 ?1 P4 X$ c3 M
nDestPos++;, h2 ?# o$ q! D; u) @# ]: O
}
9 _% P6 N. p8 t" J; J //取第一个元素的信息
+ I$ O4 [; I* ^8 `) l /*
" P$ T4 _; t8 [$ u5 j/ u9 T& c if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
% _( b$ U9 b! U, \ Z {! b2 O6 a5 ~0 p' n# x
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
2 Q# m: N4 V1 c$ U P- d g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);! W" L8 L" R1 w, [
}& o3 c; @2 o6 Q
*/ O2 N1 _, f' }: w; z
//////////////////////////////////////////////////////////////////////////
* x+ n' j( ^8 Z b& d break;
) C/ g6 h" B7 N! N, X }+ m: M* m! @0 u6 J! k5 _
} & J; L% V: k1 F5 P
}
4 i+ P2 b j, Q4 J2 B1 Dm_wndMenu.SetVisible(FALSE);
5 X' ^4 J( i8 v: h! E9 q% \
3 e$ @; F, c$ `& |( T--------------------------------------------------------------------------------------------------------
# _' ^/ Q7 W2 C) l0 U8 d搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)' G \9 d2 n# R K/ h6 q1 E; V+ A
{% ]/ p* v7 O- c) _
BaseMouseCursor();
8 n5 L0 K9 @% M& J& T0 H( k}
) b0 @# f1 @1 {! p1 j在其下添加:! J% C6 }2 L* s2 _+ }- K% L9 V
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
5 b/ B; e2 {2 R) z/ b& h9 S, n9 f{
! K1 V" [ B2 _7 |. E* d% ~9 y( Y4 v7 [m_wndMenu.DeleteAllMenu();( b5 |: }# X, d0 g9 z- _
m_wndMenu.CreateMenu(this);) ]7 l/ a1 l! h! h( ]# E. k
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
; U' J Q+ ?; @2 n1 {# f- J7 I- `, i; A3 t% l2 `0 g% l: g8 Q
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
% w3 u" K) [# c: M& \6 P) u{
' @# w1 C$ K9 K& m5 Y7 } //P以上级别才可以删除所有道具: T0 A1 b' e* m2 v: P3 e/ m& A! n
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");. E8 s7 c. | C2 o# e) X) V, H# p
}2 j2 N) n) F! J C' o$ M: @
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );3 B' @ F) \/ l7 k+ _1 R( I/ h/ j/ t4 n% D
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );' l% j ]+ s5 @) R9 Z
m_wndMenu.SetFocus();
0 t4 E1 T' t* r( N0 L3 f/ u}8 {5 F# H, t8 E# V2 }
------------------------------------------------------------------------------------------------------------; G6 `* v) X& H' `/ F) O% U# K- T7 w
*************************/ n* O8 p; S; C' S
WndField.h文件
- V" Y9 b6 ]- D0 t: v: x8 R; s1 k, i*************************5 K3 p- H) @, s
搜索:BOOL m_bReport;. n; x0 e W6 o2 l* w
其后添加:
P% e# [/ N2 r0 n) W# i5 _CWndMenu m_wndMenu;' W/ ^( A$ v9 b( c4 o. e3 `7 ]+ v
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);+ g4 N5 V0 {2 k% ~3 K
其后添加:( o5 x# @) A5 w
virtual void OnRButtonUp(UINT nFlags, CPoint point);
% O$ |6 C7 E# {/ ^9 e
1 q5 h H' h. x8 _
, L0 H5 n# |2 B5 p4 P$ b |
|