飞飞世界论坛
标题:
一键整理背包
[打印本页]
作者:
admin
时间:
2016-1-10 03:44
标题:
一键整理背包
源文件中_Interface文件夹下WndField.cpp文件
1 G1 D2 K a" Y9 w
搜索:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
( {) N n2 _8 J6 F
' t Z& N" R" L% x
struct sItem
4 q" k0 }7 n" W5 q9 [4 r7 w1 L
{
. l) U5 T( a: `2 d
DWORD dwId;
- g4 o. Y/ K/ H) G1 ^6 o
DWORD dwKind2;
# `% t; p K& M' v) t
DWORD dwItemId;
% u& p; Y2 U7 x" o4 [* x
BYTE nIndex;
, ^+ e$ o/ `# \" \0 Q6 P
sItem(){
+ ?3 s% {, I' m4 ]
dwId = dwKind2 = dwItemId = nIndex = 0;
. a. J3 d) u- m3 ^1 n) F
}
* \0 [: Q/ I0 T; i* ~
bool operator < (const sItem p2)
' ~& e' Q- p* U% h" ~
{
3 ?% q: F" A$ D2 o d
if (dwKind2 == p2.dwKind2)
7 w8 y1 t- w/ P I* T
{
; J- o1 F$ b: b s. n+ O
return dwItemId < p2.dwItemId;
8 J- Q4 `" V% p+ b, k. f- g
}else{
& ?- E9 G4 A9 U8 B
return dwKind2 < p2.dwKind2;
( {/ ^! N9 g+ @! g
}
4 ~2 W2 G1 r: t; J1 s- `- ^# m
}
. [3 ]0 {# { w! w: T7 K" r
};
# I$ s# A: f1 z
class CInventorySort
" ]9 w/ A- l r
{
$ ~* C# | l* g
public:
- R6 Q6 l8 i3 K- F4 E+ p
CInventorySort()
/ u/ P* p4 V; E$ W* D" L3 i
{
0 Z) G- {9 f& H
m_dwPos = 0;
x( z+ x3 a8 E1 d( x& `+ ^
}
H2 [) Y8 O* h4 x
~CInventorySort(){}
/ Y+ Q3 w, y; _2 v# Q+ A
private:
% U( m7 Y5 E- X m) n9 `
sItem m_Item[MAX_INVENTORY];//存放排序好的道具信息
& g: B7 N& l: ?! n2 P9 `" P- _
DWORD m_dwPos;
+ G$ F# E3 I& Q; L p% X- \
public:
2 p5 d! t, Z9 }; ]# \" V
void Add(BYTE nIndex)
, b/ w0 ]7 f8 J' {3 z$ j
{
" _6 R* i; }7 U
if (m_dwPos >= MAX_INVENTORY)
* y @. A# e! i/ @8 U3 ~. E
{
5 _& ^' w' G" J3 Q
return;
! s4 d7 `# a3 D9 {" f8 s; f& X8 e6 H
}
7 i) o2 V1 P/ \! r. X' H
m_Item[m_dwPos].nIndex = nIndex;
; A/ U! @2 M" W9 d! t' K
m_Item[m_dwPos].dwId = m_dwPos;
+ V5 P }% B& o" ^& @! P6 D: E
m_dwPos++;
' P E, j6 g$ ^+ Y5 b
}
3 [6 k' a8 s1 T6 N+ `; n) o
BYTE GetItemSrc(DWORD dwId)//Id从0到最大值排列
* B+ l1 @; S7 s1 Y8 o8 ?+ v2 [9 I
{
% B( B8 ?/ \/ c- R* ~- \0 ]9 z4 n
for (int i=0;i<MAX_INVENTORY;i++)
- ^# l. F3 @; U3 E. j. S
{
) |7 _' B2 j5 n
if (m_Item.dwId == dwId)
, M( b. i6 }0 Y) M- k
{
% @' X* l/ ]8 `
return m_Item.nIndex;
" z' Y6 x* ?4 a4 w3 m2 S
}
! ?4 ]: j, `( R: }$ l
}
6 l5 Q% W% h) \/ ?5 [2 m, e
return 255;
2 m- d$ R% r. {) m$ R' n$ ?
}
( F) ^0 Q, C/ g2 }4 G- D# Y
void MoveItem(DWORD dwSrcId,BYTE dest)//移动道具位置
4 n+ I6 a& C. g3 l/ q
{
: t( y& _# P+ F. A8 G
BYTE nTmp = 0;
& [, ^; W: e. S: Q$ ?# K
bool bDest = false,bSrc = false;
* y1 P7 [' C; ^+ b5 Z2 x
for (int i=0;i<MAX_INVENTORY;i++)
% e" Z) ?3 x7 X
{
4 l: g# |* A$ e7 P5 i
if (dwSrcId == m_Item.dwId)
# v* l0 K- k' k3 I9 S) v
{
, |4 E" |6 w' @. K
//id相等 则 改变对应的dest和src
: A* ^0 O' d% a6 A
nTmp = m_Item.nIndex;
6 a! z) Q- D0 E# m
m_Item.nIndex = dest;
0 B4 b/ }( S* O; P5 ~
}
0 M8 N% o7 ~4 u+ \
}
7 S; P: |6 ~7 G: m4 o- D
//临时数据保存完毕,交换开始
8 Y( q# x. W5 w+ E( [1 k
for (int i=0;i<MAX_INVENTORY;i++)
8 w. n1 y& C' H3 y4 n
{
* _$ j: }5 F! f- R% ]
if (dest == m_Item.nIndex)
9 d5 }, q4 t) X7 n$ S
{
6 [3 F" u, V# x( _) K: M- t
//id相等 则 改变对应的dest和src
- F2 Y" v9 X2 K4 d8 h+ z
m_Item.nIndex = nTmp;
" u& T; W+ A, O7 g/ o( ]
}
& ~5 K/ ^/ N% f
}
; d, I* h, b! u
}
6 ^& Z% g/ d/ H; f
};
: _* B# T2 d2 ?) C4 B# z& U
-------------------------------------------------------------------------
~! [& ?: {# Y' F
依然在函数体:BOOL CWndInventory::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase )
3 e! l# q4 @5 x; G5 k: j
搜索:return CWndNeuz::OnCommand(nID,dwMessage,pWndBase);
; c& }: t, |/ P
紧靠其上添加:
6 @" B+ ]5 p4 I. x1 w
if( pWndBase == &m_wndMenu )
. r9 a$ t) d* I' j2 z
{
) ?! Y& }+ W* ~% \, p; w5 m0 R8 `
switch( nID )
4 G3 L/ `, V2 p V- `. U# k
{
$ R' j( a7 _ c+ t# L
case 2:
3 c) q7 H2 S* O% ~) s
{
( e) ?, C) @8 L9 L% a4 p
//g_WndMng.OpenMessageBox("确定清空整个背包吗?",MB_OKCANCEL);
5 N4 r3 R8 x/ @, {- m8 |
if(!g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
3 |% [1 S0 f t, [ I$ @. k
{
, I; K3 h$ @; W7 r4 N* Z
break;
4 M4 P3 x! a* x, d) ?9 t
}
( e$ \: h) C, ?; {
for (int i=0;i<g_pPlayer->m_Inventory.GetSize();i++)
) l' E+ {' E( A* ^
{
1 ~. ~) s+ G: |) e7 K, j n4 Z
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
! e" ?) i. d, [* t' ?
if( !pItemElem )
. i: F' E! x: o2 }$ T: O: N
continue;
4 i# ~) i! T1 N: |7 V0 Z
if(pItemElem->GetExtra() > 0)
1 P x( ^+ S* N8 W
continue;
) C& }& U( N ~
if( g_pPlayer->m_Inventory.IsEquip( pItemElem->m_dwObjId ) )
* a# a$ A1 @$ p) Q; R/ `
continue;
8 N# d- A3 }% c* z; P- |" L
if( g_pPlayer->IsUsing( pItemElem ) )
- i& |' C- R1 D% f1 v& C* U
continue;
4 [6 b4 j. J c+ X& n
if( pItemElem->IsUndestructable() == TRUE )
* }# v3 G+ W n- |7 P( ]
{
& b% L+ p+ X, W+ ^. Z
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
) Q; k* Y8 j! D2 r& p
continue;
& w W7 c" y$ |: _, n* z
}
- Z. [' ?# S2 ^3 d
g_DPlay.SendRemoveItem( pItemElem, pItemElem->m_nItemNum);
" i& g$ t4 e, Q- n
}
/ c: {, M* e9 e! _# _: O! K9 P
break;
3 u$ y% T Y4 G+ c% E
}
$ H$ h' \0 P$ ^ m2 `
case 1:
0 ?% S8 w% b- ]
{
: w6 l5 ]! \0 I& U0 |
//整理背包
2 p8 i$ p, r8 b! s1 a2 j" y
//////////////////////////////////////////////////////////////////////////
/ S. y1 ~/ G, I# R
//g_DPlay.SendMoveItem( 0, (BYTE)( pShortcut->m_dwIndex ), (BYTE)( (DWORD)nDstIndex ) );
8 r$ g" ]. y. |7 E& ?& x
//////////////////////////////////////////////////////////////////////////
4 i _* F# A9 ^; ^; Q* @
//////////////////////////////////////////////////////////////////////////
& u1 w: }; c% \% @; F
CInventorySort* pInvSort = new CInventorySort;
% q T. |- k) B" S6 n' F2 E, ]3 h9 H
vector <sItem> vItem;
7 @% d) u! m& i
vItem.resize(MAX_INVENTORY);//初始化大小
! i( R) m" ?: o; r9 D" U
//////////////////////////////////////////////////////////////////////////
- H6 ]' V# H- `) P$ x% M1 P
//填充数据
; Q% f+ E" A0 U* J
for (int i=0;i<MAX_INVENTORY;i++)
- ^* | k L' @) P2 b
{
$ k; u! q1 d6 F$ M. F5 ?
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(i);
2 k4 O2 ^2 i( _4 T& z9 A" f
if (!pItemElem)
# A6 R7 Z( g0 t3 J' ]- ?
{
9 O5 j7 o9 Z% U
vItem.dwKind2 = 0xffffffff;
( a& g5 Y( D( j% M& J+ t; k2 \7 Q, Z
vItem.dwItemId = 0xffffffff;
2 ]. g- |5 p! T: G4 t" t! [: x) l
vItem.nIndex = i;
2 o& u7 R+ E8 D& f0 d# k
}else {
0 S# X# h( Y$ V/ T
ItemProp* pProp = pItemElem->GetProp();
; t8 F0 q' j8 x2 Q5 }
vItem.dwKind2 = pProp->dwItemKind2;
7 w/ e% q$ m. a0 {# v
vItem.dwItemId = pItemElem->m_dwItemId;
* V P6 f7 t* t
vItem.nIndex = i;
+ R) ]2 t- P$ x$ l1 j
}
3 J% A% {# s) ?
//Error("排序前 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
0 U/ [/ R, H/ i. y) |% r$ t
}
: n ?: h: a a( l
//////////////////////////////////////////////////////////////////////////
4 a- P/ T- x: k7 B
sort(vItem.begin(),vItem.end());//排序
/ m$ E2 n3 r% y" x
//////////////////////////////////////////////////////////////////////////
% n8 [! o( R( S& R* A: j( l- q( l
//交换
, u9 s1 }, G4 N1 H0 b2 m) v
for (size_t i=0;i<vItem.size();i++)
$ c9 L0 [! h4 r. t3 v5 H
{
3 ^8 D2 o+ }& p4 ?4 J2 _8 k
//Error("排序后 - nIndex:%d,Kind2:%d,ItemId:%d",vItem.nIndex,vItem.dwKind2,vItem.dwItemId);
8 q4 y$ e1 h+ s ~
pInvSort->Add(vItem.nIndex);
& E* B- |8 w; |# P
}
; |, C+ h6 G7 ]* A( `
BYTE nDestPos = 0;
8 _" a) A5 a- `) s. G
for (int i=0;i<MAX_INVENTORY;i++)
' E6 O2 ]# e N1 @$ {
{
- _+ H& O, {% s
CItemElem* pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nDestPos);
6 L* C9 c* c8 }! X" d
if (pItemElem)
" _. T& L/ y H! r; J
{
. l- x) Z% O( K' Q, V
if (IsUsingItem(pItemElem))
+ B" N# r. R1 d9 C6 M
{
, x# A6 t/ Z4 {/ d2 x3 T* H
//这个位置无法放
O. t4 U' j/ J; `
nDestPos++;
2 T# B" f; m# U. @
}
( A5 t9 n6 Y! J$ E
}
; v- k1 U) N% T3 j, Z
BYTE nSrc = pInvSort->GetItemSrc(i);
- r, v. ?, n3 I; m/ E" {: a
pItemElem = (CItemElem*)g_pPlayer->m_Inventory.GetAt(nSrc);
+ k' V6 {& g. s
if (pItemElem)
8 m4 C K& }* h& O3 p+ V, d
{
7 H8 k" i" r' W% v8 X
if (IsUsingItem(pItemElem))
% Q+ M+ Y/ q5 n4 J9 o1 b; l9 J" c
{
3 ~; U0 D* G( ?) y; C1 E2 i
//这个道具无法移动,跳过
, i/ c, f8 V) G8 V* {6 @8 G
continue;
! R- g2 [- \2 s% d+ O- @4 Y
}
" h5 ? C' H( {% Z
}else{
: i( M% m2 A, e$ Y9 M1 s/ n$ p
//空位置 不用动
0 c# x5 \7 p( |- y2 k
continue;
; |8 v- d7 M6 g; H6 Q& u: T* j
}
: G4 _$ ~; e( R- b
//////////////////////////////////////////////////////////////////////////
5 b! W- J O8 p% w
//开始移动
/ F4 a F3 A& Z' H3 Y
if (nSrc == nDestPos)
' Q( `% o7 S. L
{
* {# o5 W3 t9 w: r) d) u
//原地不动
6 L: R2 C: l( A' c9 E+ \+ ]! h+ Z
nDestPos++;
8 z+ T! r$ L7 \# J
continue;
q& q; p1 r$ _4 i& i' r+ V
}
* N4 |& v6 s- V# ^4 P
pInvSort->MoveItem(i,nDestPos);
3 J5 [, X% C/ G) h
g_DPlay.SendMoveItem(0,nSrc,nDestPos);
8 |, @6 o4 H9 j3 \- x
Sleep(5);
/ i9 ~8 W5 W* r. L. H6 B; I
//Error("移动 - %d->%d",nSrc,nDestPos);
" [* h, l9 c/ G
nDestPos++;
$ ^9 Q" P" \8 s8 `$ T& r
}
/ G9 a/ r9 @8 e0 x
//取第一个元素的信息
4 s7 Q$ [3 a( I/ |% I1 v% }; ]7 @
/*
) t8 I' x& x4 I, N7 {$ Q+ k
if (vItem[0].dwItemId > 0 && vItem[0].dwItemId < 0xffffffff)
3 p1 T- X" C3 m$ q; ~! G
{
) ^+ f" U2 `& {6 O
Error("Move - From:%d,To:%d",vItem[0].nIndex,x);
5 B! S% t. w5 }4 U% o& ^+ k- h9 F' N
g_DPlay.SendMoveItem(0,(BYTE)vItem[0].nIndex,(BYTE)x);
( B( k: Y1 u. g
}
. M) m7 D4 m3 K. A( ]
*/
, W& {, p6 |, w) ?$ T5 ], Q
//////////////////////////////////////////////////////////////////////////
1 d# B# J+ `9 D3 j5 ]1 `5 D
break;
, D9 j( p8 _/ g" a+ a b3 N
}
* [& v d" r4 h- F* O: R, j
}
# l1 L: g/ e. x
}
( k8 n' w6 L& M, V) t6 f: N4 r
m_wndMenu.SetVisible(FALSE);
* ^8 [0 f5 @6 n* W
; d! V, O# z6 j2 L: R
--------------------------------------------------------------------------------------------------------
- q. b+ g7 i2 q/ L
搜索:void CWndInventory::OnRButtonDown(UINT nFlags, CPoint point)
% W$ v& G9 X8 [8 E& ?5 @+ K( C
{
) Y R1 _3 `3 o0 r; U q/ _
BaseMouseCursor();
, y/ g3 e6 g3 z* ~4 L
}
3 @$ r( n7 s! {- v. y
在其下添加:
( r$ o- G6 K' E) p. ^- W
void CWndInventory::OnRButtonUp(UINT nFlags, CPoint point)
" A1 p# N. T* Y* Y
{
6 D+ d: d5 v6 o. z3 |8 s
m_wndMenu.DeleteAllMenu();
$ o, B( X* { R0 z5 ]+ u- _8 i
m_wndMenu.CreateMenu(this);
* Q3 n1 `2 m" ~1 \ Z% p+ _# U
m_wndMenu.AppendMenu(0,1,(LPCTSTR)"整理背包");
. g! F' Q0 @0 i$ i8 ]1 s9 c0 i
h$ T: h% \! V# I( d( V B
if (g_pPlayer->IsAuthHigher(AUTH_ADMINISTRATOR))
7 r0 b& J* @. a. A4 W0 s) K# b( m
{
9 U6 ?# B, {$ N- A2 K
//P以上级别才可以删除所有道具
; [7 C' J% T* o* `* m; @" W
m_wndMenu.AppendMenu( 0, 2,(LPCTSTR)"Clear");
* z' E9 L \* @0 ~; m6 X
}
' ?3 Y8 x! P4 y3 b3 z
m_wndMenu.Move(CPoint( m_rectCurrentWindow.left, m_rectCurrentWindow.top ) + point );
- V8 h# V' Y. S3 C2 m6 h- _! m
m_wndMenu.SetVisible( TRUE );//!m_wndMenuMover.IsVisible() );
! Y( |0 U1 v. m
m_wndMenu.SetFocus();
( F% y( s0 i3 f' w# C' a8 U, s5 o, j
}
e k. F# W& H4 S) R
------------------------------------------------------------------------------------------------------------
! j/ O. Z: j% i
*************************
! Z7 z H6 o& B: z; A, K
WndField.h文件
/ E' O, c$ ~- R: V8 k
*************************
% d1 L, b$ {) J+ b
搜索:BOOL m_bReport;
) ^8 ~# T% P v; h& ^' k
其后添加:
- k- u7 q! L5 r+ {$ s6 a b
CWndMenu m_wndMenu;
" X$ Y2 b( j2 ^- C4 |2 V/ }1 _
搜索:virtual void OnRButtonDown(UINT nFlags, CPoint point);
: y! u/ r# t+ b, M) o% n* Q3 P J
其后添加:
0 k/ F, u$ Y% t8 O, }8 g# g2 E
virtual void OnRButtonUp(UINT nFlags, CPoint point);
$ |/ m4 v4 _. d
( ^3 `! E$ G, ?0 f5 |
, s5 r" Z/ X" N6 ~ s7 z& n
欢迎光临 飞飞世界论坛 (http://www.ffwold.com/)
Powered by Discuz! X3.2