|
|
源文件中_Interface文件夹下WndField.cpp文件( {- U6 D! @" j
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
' h K8 ~3 E$ w- X: C8 I t4 z
struct sItem6 F! H/ s: ]6 t) ?' `# O
{$ `, g' C7 _# _* {$ j( ^3 Y; h/ G# p
DWORD dwId;
4 J# S q- u6 m+ _+ \$ j0 m: [DWORD dwKind2;8 e& I6 x! R [
DWORD dwItemId;
8 w. ]5 k6 m( T1 V( C8 {8 ]BYTE nIndex;
5 V" u' V) _$ ]4 KsItem(){+ O7 _0 m0 ^! L: l! l
dwId = dwKind2 = dwItemId = nIndex = 0;
, y9 G1 f- _" s- `' _. v}
! s) ~. E/ z! G. _bool operator < (const sItem p2)
7 h/ F. g5 I6 p' g# E# n{
* O* ?: \: e; D8 e, h; O. R if (dwKind2 == p2.dwKind2)
3 j* v! ~! P( }6 F1 Q/ y8 _* @ {* v" Y7 ~8 s+ {. Z
return dwItemId < p2.dwItemId;1 s9 ^; v/ [9 E% T2 T Z& e/ f, @' e
}else{2 W+ [5 o1 X& }9 w4 J/ q% T x I
return dwKind2 < p2.dwKind2;
2 A- k) }- J4 y( E* j) J }4 Z7 Z8 n, Z; J% Z0 U. i3 U
}
1 s _( @2 T+ h% r2 M};2 Z! t, `& ~- V G; B' C
class CInventorySort
) m) F/ r+ Z. w! L* e& g{
+ x) v) _' y$ F* p; fpublic:+ s6 f( o) F: i9 ~0 W2 ~
CInventorySort()' Q* s6 x2 B& L- l# ~; V2 e6 Y
{
: j* i' {7 ?' B E; s! ?5 q* a m_dwPos = 0;
, S3 p- g0 f' Y8 D# j; q ^' O/ `}4 p6 Z. h$ L8 K1 L$ i
~CInventorySort(){}8 J5 R" g# |2 X
private:3 a$ r: X/ l- @+ J- t+ [0 p
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
, C8 c# V+ S2 Y+ Z6 l/ y' i2 PDWORD m_dwPos;3 L& T( v7 {. O2 g& J$ F
public:
! h7 I' ? H/ rvoid Add(BYTE nIndex)
7 H+ q+ Q( Z9 l( H6 o, [{
: q6 {! G1 o' W- ]/ @7 M7 J& A6 d if (m_dwPos >= MAX_INVENTORY)" ~( J6 v8 n0 N/ z" r3 Q
{
. |* Z$ C) t9 f/ f" }# J return;3 U, f( \9 g ~, i" w6 c
}
& q- z/ f* ]5 S* n m_Item[m_dwPos].nIndex = nIndex;
' q% b# B; m7 w7 ?3 z# Q m_Item[m_dwPos].dwId = m_dwPos;
7 X. P( T" P! v' ^' n m_dwPos++;
+ ?$ W& {6 V& w$ }$ v}
6 v# b% E/ M( i" ~$ wBYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列, W) S: c' L) \) @# W2 m7 s
{4 `- C" _& w# ~% T! Q6 f( F( ~. F
for (int i=0;i<MAX_INVENTORY;i++)
7 ?5 T4 c3 T) {% z. R. \: o8 c6 e4 d: D {
5 v- _/ G0 z5 |5 ]# m if (m_Item.dwId == dwId)
6 s) _! |+ A& ?6 T, x0 e {
; Y2 Z9 t: n6 r* o5 @- G# a# x( q return m_Item.nIndex;
. _3 {# c( A: b( _2 Q, y }. K6 a5 G4 w1 B% w7 K$ N
}7 f }* S7 f k- ]5 y/ s
return 255;
8 M+ z F* V* [5 s k}
; |- p ^7 g3 Y* D6 gvoid MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置. s* l, g1 k" R3 b
{% N! D$ G1 f ?7 {1 ^8 [0 q
BYTE nTmp = 0;
* Q- }- J% a$ i: y& v$ P bool bDest = false,bSrc = false;4 d( ~8 A& Y( t
for (int i=0;i<MAX_INVENTORY;i++)
2 j- x6 Y. P3 Y+ j2 Q/ m5 `# [3 b {
0 S0 ]1 m$ ]" P, M2 B7 {+ H if (dwSrcId == m_Item.dwId)7 d# G$ C9 w9 Z6 ~* N( F. L. [
{
0 P& Q1 u, \) S; \* s8 Q, ? e7 V //id相等 则 改变对应的dest和src& F% C$ A+ p! B: T0 p0 [
nTmp = m_Item.nIndex;
' I3 C1 E1 Q/ _3 E6 `9 H0 q m_Item.nIndex = dest;( d0 P6 S* U6 F6 S4 T
}" b* X, X, c; L
}. u. N5 o K! Q# t1 q0 z5 r
//临时数据保存完毕,交换开始, v0 W* f; [( t! P* ^
for (int i=0;i<MAX_INVENTORY;i++)& y6 ^2 [) `2 t/ `6 Y( n
{- J* p, z/ j( \: }7 |' ~7 w
if (dest == m_Item.nIndex)
8 m0 t! I F5 { @2 s7 m {
, u! H v( C7 W7 _5 p7 M //id相等 则 改变对应的dest和src
% T( i s$ m6 [, p$ f, T3 T8 I" _# }0 M1 o m_Item.nIndex = nTmp;
* E/ x% X( `$ r. N }
+ o! Y3 f, n, _, ^1 n8 u# G }
& a/ y* P! m! E( H1 T# K}
7 e! U, f3 Y: g' [' l6 |};" R" a/ e2 |/ L/ u% M2 \# W
-------------------------------------------------------------------------
6 w; X7 w- m/ U5 o5 A依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )& W7 o/ ~1 H$ g2 z! @* y
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);2 w& Z) i7 W0 Z. Y
紧靠其上添加:
! V r& ?4 Z1 q$ \/ ?: q- Uif( pWndBase == &m_wndMenu ); s2 ]! j2 W2 k) ^, ^2 b
{0 y! a- g9 o4 }7 s
switch( nID )* [7 P8 W- ^& S$ E! S3 ~+ N
{
5 I3 [& p* Z9 K( [9 ]9 }% O2 x case 2:
3 U5 A, J! D; { {5 V. G, A w( t7 g* P" V# g' Q( W& t
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);! R _7 R2 B# D& j
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))- @ K; e5 g7 ^& v, e, O6 E
{
; K0 I, ~1 ?8 m break;
6 a( D4 ?$ A. e r6 F/ H, u }; ?5 ?5 t& @+ U) }5 ]& x5 b+ T5 W1 K
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++): W1 o* F# _4 }) ]) B/ f
{2 V9 w3 o$ i, b% U. z) u, C$ p
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);) S" o' u# f7 V$ m
if( !pItemElem )/ h* A) G0 n6 A+ O
continue;
5 u N2 W9 j* V$ j0 b% U+ Z if(pItemElem->GetExtra() > 0)) g7 h: h% i6 Q% N) a
continue;
! }% V1 [0 J0 z8 y8 _5 U2 T if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
- ]6 F1 y5 F+ q0 v" |# s continue;8 a p" T9 q2 [3 F5 D y5 A
if( g_pPlayer->IsUsing( pItemElem ) )
3 q8 R5 S T2 t7 C% \ continue;) w7 |+ B9 _) K6 F- J# G9 U4 R
if( pItemElem->IsUndestructable() == TRUE )
9 H* W8 e' T" I. \( q {
# a; o: Y( a% z8 M g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );3 e6 M. y) T7 v: z
continue;8 { w+ L4 A6 s
}
- R1 R# ^5 }& H8 z- Z/ v. X g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
* n' }1 E( B" C) Z5 w ~ }
5 q2 b6 n8 X$ X' C6 W) c break;5 R5 p' O- y$ _) y5 k# x
}8 X2 k3 V; q. F% s/ m
case 1:: H: A0 F u$ G3 [/ ?
{4 a/ u1 e _) c. k- M
//整理背包% r5 k" L1 u" w
//////////////////////////////////////////////////////////////////////////
) ]' a$ U' `1 i( q0 b4 e5 V6 e //g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );4 u5 X; S; E; p$ v
//////////////////////////////////////////////////////////////////////////
9 A, w- y: W, M; m8 k% k U //////////////////////////////////////////////////////////////////////////
/ \' z/ _% I/ C. T5 e CInventorySort* pInvSort = new CInventorySort;2 n0 d: b! ~+ T0 T, ^
vector <sItem> vItem;
1 ~1 D' z% i. b! W: \, l/ _ vItem.resize(MAX_INVENTORY);//初始化大小
. q. j) X; e6 ^4 i& K; J& k1 \: ^* ? //////////////////////////////////////////////////////////////////////////
- ~# }) X M( T" Z //填充数据
; O5 }9 Q% @4 j- l+ s3 x: r for (int i=0;i<MAX_INVENTORY;i++)' m. W" k; V+ N% Z
{
. M' {' X4 ~( w' K CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
, C: N; x; `9 Q& y if (!pItemElem)# U) Z0 U7 r: `: u' o
{
+ A5 ~1 ^' O6 ? vItem.dwKind2 = 0xffffffff;
/ R) B1 f) ]) e vItem.dwItemId = 0xffffffff;: s9 n8 x+ u3 E- U' C& W) O7 z
vItem.nIndex = i;
* [4 Y8 m0 A8 _) A# n+ k# F }else {% r( g% n+ r* x; o: ?; b$ G
ItemProp* pProp = pItemElem->GetProp();
/ }) ^2 x3 ]6 e# K N* ? vItem.dwKind2 = pProp->dwItemKind2;
; G: w) D& B3 v7 G* p! T vItem.dwItemId = pItemElem->m_dwItemId;
9 b! @5 B: j; W" ^( |8 B vItem.nIndex = i;( V! F4 |) }- Y: D1 A
}
8 b, S* c0 Q$ O( D7 l //Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);" ]' ]8 B5 S) |) B
}% A R9 [$ |" |8 A- u
//////////////////////////////////////////////////////////////////////////) {' d7 y# U U$ e" d
sort(vItem.begin(),vItem.end());//排序7 P+ |1 H& R; f9 \
//////////////////////////////////////////////////////////////////////////4 ?2 e3 ]# F' `1 X7 H' ^3 ^; I
//交换
" S" B& T1 Q, z9 U8 ~: I1 t7 r for (size_t i=0;i<vItem.size();i++)! l8 @9 a5 E% X! j: P
{/ }5 j+ H n+ ?/ Z; L+ b
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);( O( z6 u, g" J- d0 \9 D# o6 V+ D
pInvSort->Add(vItem.nIndex);9 n' Q7 W9 X/ e/ [+ G/ M8 g
}
/ x3 B/ Y; _( j5 k% ` BYTE nDestPos = 0;, D9 f- X# ?$ X0 a5 y
for (int i=0;i<MAX_INVENTORY;i++)" o4 G1 X. c7 \" j$ J0 [
{
" C# j* P, {2 c. @ CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
_3 j. @( g6 y, B: _ if (pItemElem)
0 b) y- S' i) o1 D9 y {5 z0 v$ q8 N. v' [, R3 f
if (IsUsingItem(pItemElem))
@$ I+ \+ j" f3 f {
2 T1 X9 @0 M: H8 l# ^ //这个位置无法放
$ L# G1 R/ t' n8 ^& Q7 x nDestPos++;. M2 Y4 t8 l) u
}) f3 @3 O, G8 W9 i& d
}
) W8 ]3 z& F6 f, [' C BYTE nSrc = pInvSort->GetItemSrc(i);7 L, {, \* `. {
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
! C. K4 a8 C2 R- `) w if (pItemElem)
3 G2 T# H/ O0 j( t! O7 P% r( d {
! C# v9 \; `7 [# l6 X& Z if (IsUsingItem(pItemElem))
2 P) Z `3 D( j; W q {; V& t& t6 [# L$ u$ U4 d
//这个道具无法移动,跳过
3 c, e5 J8 q: x% A- y continue;/ n) }3 |& t; D' f! }
}
, z" D: O8 ?! Z3 A1 C$ f5 B. E' J }else{5 @0 N- i4 d2 m& h: W9 B
//空位置 不用动
, P. V& {0 T. W G: V) P continue;$ f# ^" m1 z4 `( b8 g" {/ c+ A
}
% r i t6 c6 N" G0 I) W2 d //////////////////////////////////////////////////////////////////////////
! ~4 K- ^; z! M V+ U3 H //开始移动% N: V+ q" ?& [! V! g
if (nSrc == nDestPos)
% Y" X7 b% H' R" `# ? {3 t9 R) f0 t% G$ k
//原地不动
$ d7 f* O1 D- G7 h" o nDestPos++;- M2 i P& {+ H: p4 x5 t6 h
continue;
" t" d9 E* L8 A, S" A- u }" i/ e& |" t1 O! B' \
pInvSort->MoveItem(i,nDestPos);
# p# ~. B. N: {0 a9 n$ U g_DPlay.SendMoveItem(0,nSrc,nDestPos);
* O; j8 k$ H4 D/ }3 V Sleep(5);8 T$ x7 F( L/ f- @: } O
//Error("移动 - %d->%d",nSrc,nDestPos);
2 i0 U8 w: M" L$ F" i( l/ L: s nDestPos++;% _2 c3 ^* Q0 l6 d* {7 y6 U
}
# I& W- |' J7 ]1 W //取第一个元素的信息
% [! O" g( z& E/ e0 S: k /*3 [+ @& u8 T3 a: R% p$ x
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)2 v: b9 `, `7 R) r9 I
{4 R5 E: F1 P% c
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);2 _( M: p) Y0 b4 @9 x) E4 s
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
4 \7 p. v, Z) i/ { }
# v% o" Z# B) u7 C( Q2 S) t8 ~9 ^ */
: T; }* O1 A) u* o4 W4 ^ //////////////////////////////////////////////////////////////////////////
0 V6 D# }$ y% s. g2 O" P break;
+ g9 G8 D( y1 o3 r }2 l1 \+ w, P, A& h7 f( ^& j9 n+ e
} : g8 k2 C: X* ~7 A" w$ y& v
}) C4 }* Y' C$ |9 _0 p
m_wndMenu.SetVisible(FALSE);
$ C* r- q2 \% h9 p4 ?
5 O* W4 V# E1 j--------------------------------------------------------------------------------------------------------8 W0 U3 S: ^5 d/ E r' P
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)1 r3 I+ `- `7 t: Y8 R
{; o0 F% E! k" w* ]" S
BaseMouseCursor();- z2 `4 `' y2 Y' c6 D
}; U3 E2 v' D, \. P
在其下添加:
0 N& r: a! Y- D; k/ N. q3 Rvoid CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)/ U' g3 v2 E% g
{
) {# Z# l) ~/ am_wndMenu.DeleteAllMenu();0 A. s6 T5 S# r( ~# V7 N* [
m_wndMenu.CreateMenu(this);
6 v, I( z1 |( Q/ D$ H( W# d) Wm_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");& v0 x* s ]/ q/ O% g: h0 w* Y
1 [, x' p0 r( [3 [. b8 D; J9 i
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
, W5 y+ S6 A$ d- ]$ {7 V{% E# y. H2 `) t% H
//P以上级别才可以删除所有道具
* Y! |/ ]2 n; i2 j m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");, F; h% J/ c8 X) H! ~7 I' V1 ?( ]$ M
}
% Y9 X$ y, G3 z& r4 E$ ~/ X Om_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );" v x; u9 k1 l
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );" p$ @5 I7 k% A+ r
m_wndMenu.SetFocus();/ i: B2 u' `! t+ S
}
& R: K1 E$ K+ j+ K------------------------------------------------------------------------------------------------------------& `$ c. v% |5 d3 m. {) l5 R
*************************# a* J, o. n7 T9 E0 c3 h) }2 x
WndField.h文件5 L! J9 M# w, g! x
*************************: c4 t" A/ U( H
搜索:BOOL m_bReport;
. M- m7 c6 x1 y% n( M" j. ?其后添加:
. M) \9 }4 ~' uCWndMenu m_wndMenu;
b' j2 y0 p, _0 L1 a7 O搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
* z2 ]7 l9 g7 g1 ^其后添加:
& p T5 ^' r, A. Evirtual void OnRButtonUp(UINT nFlags, CPoint point);
* B; P$ p) N8 q( t' N/ U
8 I5 T; {# a: J' c' o
% X; K n4 i$ f5 u z |
|