飞飞世界论坛

标题: 一键整理背包 [打印本页]

作者: 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% xstruct sItem
4 q" k0 }7 n" W5 q9 [4 r7 w1 L{
. l) U5 T( a: `2 dDWORD dwId;
- g4 o. Y/ K/ H) G1 ^6 oDWORD dwKind2;
# `% t; p  K& M' v) tDWORD 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 zclass CInventorySort" ]9 w/ A- l  r
{
$ ~* C# |  l* gpublic:- 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+ Aprivate:% 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 }; ]# \" Vvoid 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) oBYTE 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# Yvoid 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 wif( 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 rm_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. ^- Wvoid 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 im_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 zm_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, KWndField.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  bCWndMenu 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