|
|
源文件中_Interface文件夹下WndField.cpp文件: U5 _" D, v) c5 r8 c( J
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
1 Q+ s: z2 h7 o) o4 c9 y J% R+ s; S. T8 t& z
struct sItem
8 c! t0 c3 ~: G/ \+ [2 U) B* V{/ W- Z7 O" j/ i3 w
DWORD dwId;
4 N5 D& b8 d* N' @% N0 oDWORD dwKind2;
0 K/ ?6 q% J0 i, O6 i* ^* r0 _% wDWORD dwItemId;
( K! N; a& |; s( gBYTE nIndex;
5 P( {1 P2 O! bsItem(){
+ L/ Z2 b% ^0 U" B dwId = dwKind2 = dwItemId = nIndex = 0;
# \: W! g1 q! G8 S5 h}3 ^1 k# M* E' m3 E
bool operator < (const sItem p2)! x# x& J" t+ ?1 J$ R) @6 |
{
# z) s W' ^0 v if (dwKind2 == p2.dwKind2)
$ _: y/ H* u0 o7 E( r {4 Z$ U6 E* L' \+ s q, ^$ h
return dwItemId < p2.dwItemId;
! N! q g" |! ?' s8 f. c9 [ }else{) W9 [9 S- \" _* P# A
return dwKind2 < p2.dwKind2;) b1 Z, k3 `2 D/ N" c" O
}
% q9 a. d4 l+ C o1 x0 z}
' H2 y3 V4 c! K0 r/ c};
, Y$ i8 y/ r7 F, a. Eclass CInventorySort5 ?" y2 C$ G! t- L1 z/ y# E
{
1 R6 F6 l- ^; e' E& ~1 ppublic:+ @/ ~# i! J8 j2 b$ m
CInventorySort()3 D" N1 s- o0 K; e5 q& Y2 V
{& b6 s- q- O# X, A' i- u% {) X: _
m_dwPos = 0;8 V& C4 X' ]5 r( I+ J" K
}
z, i9 f8 T4 C~CInventorySort(){}% h7 |( y) z* K5 e9 u2 V& o
private:( ?2 V7 Z) `. b
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
2 b) W/ e: q* U/ z) m$ iDWORD m_dwPos;/ V* X0 I( O) D
public:) x; F9 i4 G3 k4 I
void Add(BYTE nIndex)' T+ {: {9 G0 L' o1 @) S& I
{
, ~/ C3 A- U& A" u8 @# X) T1 \ if (m_dwPos >= MAX_INVENTORY)5 ^4 N5 M; x1 b! F: w
{. \& A3 W0 _$ [
return;# W! C) I7 i. E8 {2 Q" V
}- z6 x6 b$ Q! y* I
m_Item[m_dwPos].nIndex = nIndex;
$ d" C7 V* B' A0 \/ S) ` m_Item[m_dwPos].dwId = m_dwPos;
1 G3 A6 ?" ]: S. I m_dwPos++;+ N9 o8 Q; j4 W" i9 c: m. {
}
0 A j* h" \, j0 H2 n4 L- yBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
+ I* O7 D7 C, P' ? }% E{+ V% y4 }4 }5 u5 W8 s
for (int i=0;i<MAX_INVENTORY;i++)
2 U+ p& J; B( V% H- ~) L {
* O2 I- X+ S. _( H# d9 e k2 c if (m_Item.dwId == dwId)
9 V' G! N4 ^" M- k6 D- E5 h {
; J; r1 z P4 S& ^ return m_Item.nIndex;
' c0 e& V }2 N! c }# L, o. a% Q e( s/ F: v
}& \! H" [$ m Y9 M' l, B {% E
return 255;
; A. {2 u. t0 w7 C+ \; V}
; H; Y8 a0 T: x4 mvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
: Q3 `# b) S4 U7 s0 b2 U{/ m) v# T6 P9 U9 S+ Q( U* ]
BYTE nTmp = 0;
5 W- h" f q6 H% u( u bool bDest = false,bSrc = false;
: V8 Z. O5 S* x! K5 N" N8 h for (int i=0;i<MAX_INVENTORY;i++)# `/ Q- Z* D% G7 G% z
{8 N) P% x( \% h. b
if (dwSrcId == m_Item.dwId)
j0 U0 r; w5 P* |4 O$ N5 J {
8 T$ Z; M7 h( ^# L# F //id相等 则 改变对应的dest和src
7 _1 t1 H# w- X3 R: d x) C nTmp = m_Item.nIndex;. U& Y& o' k# _1 [, Y. Z& Q4 R
m_Item.nIndex = dest;6 T0 H1 Z) O8 \; B, F A
}
# P8 f2 B( d" V }
3 w I- q( b& P H, k4 l7 C //临时数据保存完毕,交换开始
2 }# H, V2 A: \ for (int i=0;i<MAX_INVENTORY;i++)
* _# R& j. g5 _- K7 `9 S {' y5 w" e: d" M2 P
if (dest == m_Item.nIndex)
' z+ k: e+ x; _+ p7 w {2 {2 x N9 ]( @0 c% j6 m& A
//id相等 则 改变对应的dest和src+ Z7 y9 ^; M' w8 F3 w" X
m_Item.nIndex = nTmp;8 ?3 i- ] C/ F: s1 e; x, r! A
}
! E4 j5 x4 X$ E+ E" ]9 Y }
4 {: x; \% T0 _4 t}
1 u7 d1 s7 v7 d' Y6 h! D};
F, M) J+ g* v-------------------------------------------------------------------------
: P$ `; E4 ~9 k依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
: ?# Q! \8 m$ N0 R3 ~ A搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);" {* B0 H5 V. F; r2 e% E, k
紧靠其上添加:
$ M5 P( U+ n6 q- R- ^% iif( pWndBase == &m_wndMenu )
. d4 K/ L0 |0 R, q1 f{" G# H, X% H1 ]8 A$ R
switch( nID )
5 y& W( T' M8 h. R { E( u* K* `- {. z
case 2:* w0 D2 J) a- D) V6 ], `. W+ v
{, S& w, j6 `* p% n4 P7 f# l
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);# z% E- x2 U# \$ P% G. z
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))9 c4 S' f* f4 j5 q! E
{, ~( |# ]6 M2 u" p/ \4 q
break;
, }6 B9 s9 e9 f. c2 ? }
6 F1 G& v; W _ v3 u% Z for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)0 r" _1 Z/ W0 Q
{
% q3 N1 ~0 B$ q5 A J# B CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
$ a& `3 \" O5 C3 j) Q) D) H D if( !pItemElem )" I! p) i! z9 h& K. L5 ]3 m, |4 r
continue;
* h N3 I# [ L. O; |4 v9 c' g8 N if(pItemElem->GetExtra() > 0)
0 F7 E! j5 Z n0 k' u continue;/ `2 b9 d9 [ x- |
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
" m9 K" [& L# \( K0 a" O continue;: p1 J0 C- z2 c6 ^7 z) r% h
if( g_pPlayer->IsUsing( pItemElem ) )1 M0 X8 V r$ z: ?* X
continue;* k3 l% S3 x. }+ N7 g, {+ n* d4 S
if( pItemElem->IsUndestructable() == TRUE )
. s0 \2 s& T0 A9 q {8 }- I/ p S8 j4 v7 b
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
$ z9 ~1 n: F2 W# a$ d6 U: F continue;1 k/ [8 i! t" v. ?, p% J
}
! N1 i% ?; C6 f. R, f g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);6 ~. g* p8 o$ T; O
}6 W: I! n5 T- Z% H; M: t
break;
& X! @# ~' ~" K/ H$ E5 z. V }+ Z. N3 Q: O$ d+ D7 h, r
case 1:: \% c- h1 \; S/ S# T
{
' W* R5 k9 S: @3 o4 t$ d //整理背包1 U& \2 s3 v( ~" |2 {! e# d
//////////////////////////////////////////////////////////////////////////8 p7 C( D" q- b! A6 x' d
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
+ \/ ?& d/ d. _" K; R //////////////////////////////////////////////////////////////////////////
% u2 F4 c1 M. P m# t4 d+ r //////////////////////////////////////////////////////////////////////////! Y4 R O5 i; X) l4 x$ ?
CInventorySort* pInvSort = new CInventorySort;: Z( x+ t/ v, k! E% ?0 G
vector <sItem> vItem;
: T8 z7 ?! U/ v+ v9 j vItem.resize(MAX_INVENTORY);//初始化大小
& G5 @- U9 ^3 M //////////////////////////////////////////////////////////////////////////
( _, K# g! {. U/ o9 z' z //填充数据
' S" t3 ]( z7 V3 i% S9 s for (int i=0;i<MAX_INVENTORY;i++). Z! ] p: p1 e& `8 Y
{* B) t' e! {2 x+ l+ @) d
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);3 v/ U) k# Q" y5 a1 Y
if (!pItemElem)
- e7 G, O9 u* T/ e7 w: {9 A8 x. Z5 o {
* Y% A( t1 T# o" h9 c: _9 r9 i vItem.dwKind2 = 0xffffffff;
# d0 C: P$ `" a# k( r5 J8 Y vItem.dwItemId = 0xffffffff;- H+ e! [3 f' ?# n! N, E! H
vItem.nIndex = i;
5 l( S8 P5 Z) \4 A }else {
3 |3 P1 w R0 m/ C$ y; ~ ItemProp* pProp = pItemElem->GetProp();
5 [ p1 N5 c6 p2 c6 {6 p- Y vItem.dwKind2 = pProp->dwItemKind2;
+ L+ u1 H s$ c, t vItem.dwItemId = pItemElem->m_dwItemId;
* P" S @5 g0 ~) A5 Q' P+ i3 s7 j, z vItem.nIndex = i;
2 f2 v$ q% |3 Z, Y$ z, x+ ? }0 {' |( |% B* W! k8 v5 ~0 K
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
$ R( F2 z( {, T3 R' Z8 q }4 ]6 P0 g- s3 R( }( m$ a! r6 c# o
//////////////////////////////////////////////////////////////////////////' \6 A9 |1 Z! V5 e8 Y$ L, B+ b9 i$ F9 q
sort(vItem.begin(),vItem.end());//排序# m: O2 E: [! k& S9 p- V, T) x
////////////////////////////////////////////////////////////////////////// v# o0 G% I) a. X& m4 B5 S
//交换8 `: b# a' A! S
for (size_t i=0;i<vItem.size();i++)
9 q# d( Y/ J: d5 O; p1 q {+ Q+ o, B* G# g/ q% z, _
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
9 O- [5 [8 A% u- r% ]1 ?7 r& K pInvSort->Add(vItem.nIndex);
/ K% @. [$ C# C( y* B, I }9 t# G8 I4 L6 [' y2 Z( j! J/ [
BYTE nDestPos = 0;
# k4 N# Z4 U% [# H' \9 f( ?, K for (int i=0;i<MAX_INVENTORY;i++)$ B. b3 b7 T2 K! i% c. Y
{$ @4 f* |0 N W( s4 ~' \. f! d
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
" H' o& j( `/ H# q if (pItemElem)1 \( a! g; a& ~- L7 d
{
/ W' e; j1 G8 z- W' j3 u if (IsUsingItem(pItemElem))
" K, ~; A/ e2 [ y+ j. C! V6 p {7 H# o! g! p9 E4 c+ ~! V+ m
//这个位置无法放7 F" a9 ~ ]* v# _0 V& D* V% V2 T
nDestPos++;
6 h3 Q; @1 Q* g& p5 r( j: o3 n) u }8 `' Y- f( m2 e& {
}
0 N# a; o: w) p* X& i BYTE nSrc = pInvSort->GetItemSrc(i);! x, r! `+ F( d6 u' c
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);6 ~2 i5 f& l6 \3 k; _6 A* V9 L
if (pItemElem): |" F& D1 `# s! l
{
1 H4 U" F) w( W- {% i if (IsUsingItem(pItemElem))
3 Y8 O% z2 ^- @3 O; u {( F; W9 z* A( m, z
//这个道具无法移动,跳过+ X: Y8 q; _& L
continue;
! F% \4 d: m/ N' T6 R }
- e( W) _# R& U0 `" D$ n }else{
. v9 e+ {/ t( I+ F //空位置 不用动' j' B7 s$ P, _& b2 S& v
continue;- r, x c; P/ y7 C3 \6 g- T
}
@2 }0 V& T; T: c$ B8 y/ n //////////////////////////////////////////////////////////////////////////
9 q% c2 }" b0 q- e3 T! U( L6 j //开始移动
: z1 m1 C* v) b* C4 z" F/ k' } if (nSrc == nDestPos)) A+ r8 @! Z. b- b7 p% e
{! _5 g7 |3 T& X4 h3 h' M
//原地不动$ Q4 K$ J1 L! q8 B8 v
nDestPos++;$ ^8 w( U% v2 G5 B, P8 m
continue;0 s3 c7 T$ Q5 x
}% ^1 V5 ^% e! m. v0 Z- N( L
pInvSort->MoveItem(i,nDestPos);
5 j4 @8 x' Q. }) c7 `; T g_DPlay.SendMoveItem(0,nSrc,nDestPos);
% y* L, M+ b, D5 B: u% B Sleep(5);
# N. _1 b4 X' [0 z //Error("移动 - %d->%d",nSrc,nDestPos);( k' r& A- v h0 Z# O8 B$ \
nDestPos++;
. X0 }8 T0 y! R) W5 _, q3 U/ N }
4 A6 ^& w+ M) e& d, a //取第一个元素的信息6 Z# _3 b" j+ j s3 y% S
/*
0 @- V" U2 d: }' w C if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
% `! b1 p/ H2 o: y1 T {( ?! R" `- v9 h$ P
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);3 j$ V3 P* v- x0 S/ Y
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
; K+ n) s# t$ o6 R5 A }
1 f/ Q* D* d1 k0 p _- d* m */
O* K- p5 ]$ B [6 O //////////////////////////////////////////////////////////////////////////
; T$ Z+ `4 `( d break;
/ y8 T4 x! f3 E! J' u4 w( H* l }
" I! ^- C3 S1 c" E( G1 J }
7 z! H7 k) ?1 X8 q3 ^1 e}
8 m& K1 H9 g7 c3 N9 Bm_wndMenu.SetVisible(FALSE);- l: O( |' y$ a& h5 A( \
0 Y/ s' s; z. u3 g) R--------------------------------------------------------------------------------------------------------
4 k4 N" u9 j, V# P搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)' s2 b: D; C, ? _4 L$ R
{5 P4 U' c, ?' l6 F' O7 C3 H
BaseMouseCursor();
+ v6 x; c; ~3 _! d1 Q. f; G% @}( t, M2 \# M$ O
在其下添加:
: K; |$ R! Q" Y1 {; n. }" ^void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
7 C/ f. h+ R9 u+ d% t8 O{1 T0 f2 V+ B) N1 I
m_wndMenu.DeleteAllMenu();+ E6 V/ d' w) H/ b, `! {
m_wndMenu.CreateMenu(this);
; D# c# I7 a4 G4 x: L' g/ y( a1 Tm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
h6 ?/ a0 W; P: k+ p ?" \* A- s- k0 |# n
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
/ N8 U4 p% T+ l{
} T3 o! K- g/ B //P以上级别才可以删除所有道具
$ {7 M" d4 S/ m m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");) `$ G4 k+ w3 ?5 t" o
}- k4 t9 x+ r( U) k, `
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
* M. ?, C$ F( _) ^m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );4 ^3 M0 g" H$ P; l& O
m_wndMenu.SetFocus();
. o, e5 E$ G) G1 G}4 e6 d$ y6 {& F! p. k; z" x0 `
------------------------------------------------------------------------------------------------------------
* Y# H: N6 F$ A8 n+ s*************************
: p. @9 v- `' u" ~/ `WndField.h文件) i- J7 T E! d$ m
*************************
9 c# g \. O: T搜索:BOOL m_bReport;8 x c- T; X9 [4 R
其后添加:
6 d/ _, {* h4 k8 WCWndMenu m_wndMenu;
% X, c, A* v, m8 o8 L搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
- l+ J2 e: j/ E3 @* @$ `. J其后添加:" C3 n3 K6 q% l6 f/ ^: f
virtual void OnRButtonUp(UINT nFlags, CPoint point);
4 ]9 p0 ^: V# `: l0 N* b1 H9 T- H
; B0 v R8 B+ R2 ]$ B" e/ T6 s
- r8 f- c$ e7 w s1 J; | |
|