⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quickmanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// QuickManager.cpp: implementation of the CQuickManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "QuickManager.h"
#include "ObjectManager.h"

#include "QuickDialog.h"
#include "InventoryExDialog.h"

#include "GameIn.h"
#include "QuickItem.h"
#include "./Interface/cWindowManager.h"
#include "./Interface/cScriptManager.h"
#include "ItemManager.h"
#include "MugongManager.h"
#include "SkillManager_Client.h"
#include "./Interface/cIcon.h"
#include "./Input/UserInput.h"
#include "ChatManager.h"

#include "AbilityManager.h"
#include "SuryunDialog.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
GLOBALTON(CQuickManager);

CQuickManager::CQuickManager()
{
	m_IconIndexCreator.Init(MAX_ITEMICON_NUM, IG_QUICKITEM_STARTINDEX);
	m_QuickHashForID.Initialize(100);
	m_selectedQuickAbsPos = 0;
}

CQuickManager::~CQuickManager()
{
	Release();
	m_IconIndexCreator.Release();
}
//!---------------------------------------
// 家胶 酒捞能 傅农 荐沥 &
// 窜绵芒 酒捞能 昏力
void CQuickManager::RemoveQuickItemReal(POSTYPE SrcPos, WORD wSrcItemIdx)
{
	// 努扼牢攫飘 酒捞袍 QPOSITION档 函版
	// 努扼牢攫飘 酒捞袍,公傍 QPOSITION档 函版秦!!
	POSTYPE QuickPos = 0;
	switch(GetTableIdxPosition(SrcPos))
	{
	case eItemTable_Inventory:
	case eItemTable_Weared:
		{
			CItem * item = GAMEIN->GetInventoryDialog()->GetItemForIdx(SrcPos);
			ASSERT(item);
			QuickPos = item->GetQuickPosition();
			item->SetQuickPosition(0);
		}
		break;
	case eItemTable_Mugong:
		{
			CMugongBase * pMugong = GAMEIN->GetMugongDialog()->GetMugongAbs(SrcPos);
			ASSERT(pMugong);
			QuickPos = pMugong->GetQuickPosition();
			pMugong->SetQuickPosition(0);
		}
		break;
	case eItemTable_Ability:
		{
			CAbility* pAbility = HERO->GetAbilityGroup()->GetAbility( wSrcItemIdx - MIN_ABILITY_INDEX );
			QuickPos = pAbility->GetQuickPosition();
			ABILITYMGR->SetAbilityQuickPosition( wSrcItemIdx - MIN_ABILITY_INDEX, 0, HERO->GetAbilityGroup() );
		}
		break;
	default:
		{
			ASSERT(0);
		}
	}
	

	RemQuickItem(QuickPos);
}
//!---------------------------------------
// 窜绵芒 酒捞能父 昏力 &
// 酒捞能 皋葛府 秦力 =>副府令
void CQuickManager::RemQuickItem(POSTYPE QuickPos)
{
	CQuickItem * quickOut = NULL;
	GAMEIN->GetQuickDialog()->RemQuickItem(QuickPos, (cIcon**)&quickOut);
	ReleaseQuickItem(quickOut);
}

void CQuickManager::OverlapCheck(POSTYPE SrcPos)
{
	POSTYPE QuickPos = 0;

	switch(GetTableIdxPosition(SrcPos))
	{
	case eItemTable_Inventory:
	case eItemTable_Weared:
		{
			CItem * item = GAMEIN->GetInventoryDialog()->GetItemForIdx(SrcPos);
			if( !item )
			{
				ASSERT(0);
				return;
			}

			QuickPos = item->GetQuickPosition();
			if( QuickPos == 0 ) return;
		}
		break;
	case eItemTable_Mugong:
		{
			CMugongBase * pMugong = GAMEIN->GetMugongDialog()->GetMugongAbs(SrcPos);
			if( !pMugong )
			{
				ASSERT(0);
				return;
			}

			QuickPos = pMugong->GetQuickPosition();
			if( QuickPos == 0 ) return;
		}
		break;
	case eItemTable_Ability:
		{
			CAbilityIcon* pAbilityIcon = GAMEIN->GetSuryunDialog()->GetAbilityIconAbs(SrcPos);

			if( !pAbilityIcon )
			{
				ASSERT(0);
				return;
			}

			QuickPos = pAbilityIcon->GetQuickPosition();
			if( QuickPos == 0 ) return;
		}
		break;
	default:
		{
			ASSERT(0);
		}
	}
	
	CQuickItem * quickOut = NULL;
	GAMEIN->GetQuickDialog()->RemQuickItem(QuickPos, (cIcon**)&quickOut);
	if(quickOut)
		ReleaseQuickItem(quickOut);
}

void CQuickManager::MoveQuickItemReal( POSTYPE FromSrcPos, WORD wFromSrcItemIdx, POSTYPE FromQuickPos, POSTYPE ToSrcPos, WORD wToSrcItemIdx, POSTYPE ToQuickPos)
{
	// 俊矾 眉农!!

	GAMEIN->GetQuickDialog()->MoveQuickItem(FromQuickPos, ToQuickPos);
}
void CQuickManager::NetworkMsgParse(BYTE Protocol,void* pMsg)
{
	switch(Protocol)
	{
	case MP_QUICK_ADD_ACK:
		{
			MSG_QUICK_ADD_ACK * msg = (MSG_QUICK_ADD_ACK *)pMsg;
			//棵副妨绰 酒捞袍狼 捞傈 狞酒捞袍捞 乐栏搁 瘤框
			OverlapCheck(msg->SrcPos);
			
			AddQuickItemReal(msg->QuickPos, msg->SrcPos, msg->SrcItemIdx, msg->OldSrcPos, msg->OldSrcItemIdx);
		}
		break;
	case MP_QUICK_MOVE_ACK:
		{
			MSG_QUICK_MOVE_ACK * msg = (MSG_QUICK_MOVE_ACK *)pMsg;
			MoveQuickItemReal( msg->FromSrcPos, msg->wFromSrcItemIdx, msg->FromQuickPos, msg->ToSrcPos, msg->wToSrcItemIdx, msg->ToQuickPos);
		}
		break;
	case MP_QUICK_REM_ACK:
		{
			MSG_QUICK_REM_ACK * pmsg = (MSG_QUICK_REM_ACK *)pMsg;
			RemoveQuickItemReal(pmsg->SrcPos, pmsg->SrcItemIdx);
		}
		break;
	case MP_QUICK_ADD_NACK:
		{
			MSG_WORD * msg = (MSG_WORD *)pMsg;
			//盲泼皋技瘤肺 贸府 confirm
			ASSERTMSG(0, "窜绵芒俊 吝汗登芭唱 荤侩且荐 绝绰 酒捞袍涝聪促.");
		}
		break;
	case MP_QUICK_REM_NACK:
		{
			ASSERT(0);
		}
		break;
	case MP_QUICK_MOVE_NACK:// not used
		{
			ASSERT(0);
		}
		break;
	}
}


void CQuickManager::UseQuickItem(POSTYPE pos)
{
	if( !HERO ) return;
	CQuickDialog* pQuickDlg = GAMEIN->GetQuickDialog();
	if( !pQuickDlg ) return;
	pQuickDlg->OnSelectAction( pos );

//	m_selectedQuickAbsPos = QUICK_STARTPOSITION + pQuickDlg->GetSelectedPage() * MAX_QUICKITEMPERSHEET_NUM + pos;
	m_selectedQuickAbsPos = TP_QUICK_START + pQuickDlg->GetSelectedPage() * TABCELL_QUICK_NUM + pos;
	CQuickItem * pQuickItem = pQuickDlg->GetQuickItem(m_selectedQuickAbsPos);
	if(!pQuickItem) return;
	switch(GetTableIdxPosition(pQuickItem->GetSrcPosition()))
	{
	case eItemTable_Inventory:
	case eItemTable_Weared:
		{
			CItem * pItem = GAMEIN->GetInventoryDialog()->GetItemForIdx(pQuickItem->GetSrcPosition());
			GAMEIN->GetInventoryDialog()->UseItem(pItem);
			return;
		}
		break;
	case eItemTable_Mugong:
		{
			
			if( HERO->GetCharacterTotalInfo()->bVisible == FALSE ) return;	//救焊老订 公傍给敬促.

			// 公傍  // 辑滚肺 QuickPosition阑 朝覆 : 辑滚俊辑 贸府
			//m_selectedQuickAbsPos = selectedQuickAbsPos;
			
			// 胶懦荤侩
			// 胶懦狼 辆幅俊 蝶扼 3啊瘤肺 备盒等促
			// 1. 鸥百捞 乐绰 胶懦 ( 老馆胶懦
			// 2. 鸥百捞 绝绰 胶懦 ( 规绢胶懦
			// 3. 鸥百捞 官蹿牢 胶懦 ( 瘤汾胶懦
			CActionTarget Target;
			/*
			int abspos = GetSelectedQuickAbsPos();
						CQuickItem* pQuickItem;
						pQuickItem = pQuickDlg->GetQuickItem(abspos);*/

			CSkillInfo* pInfo = SKILLMGR->GetSkillInfo(pQuickItem->GetSrcIdx());

			if(pInfo && pInfo->GetSkillInfo()->TargetKind == 0)			// 惑措
			{
				CObject * targetObj = OBJECTMGR->GetSelectedObject();
				if( targetObj )
				{
					Target.InitActionTarget(targetObj,NULL);
					HERO->EnableAutoAttack(&Target);
				}
				else
				{
					CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(400) );
					return;
				}
			}
			else if(pInfo && pInfo->GetSkillInfo()->TargetKind == 1)		// 磊脚
			{
				Target.InitActionTarget(HERO,NULL);		// 磊脚阑 鸥百栏肺
			}
						
			SKILLMGR->OnSkillCommand( HERO, &Target, TRUE );			
		}
		break;
	case eItemTable_Ability:
		{
			CAbility* pAbility = HERO->GetAbilityGroup()->GetAbility( pQuickItem->GetSrcIdx() - MIN_ABILITY_INDEX );
			if( pAbility == NULL )
				return ;
			//焊救.... 辑滚俊辑 茄锅歹 眉农窍绊 乐阑鳖?	//security

			pAbility->Use();
		}
		break;
	default:
		{
			ASSERT(0);
		}
	}
}

//void CQuickManager::InitQuickItem(POSTYPE QuickPos, POSTYPE SrcPos, WORD SrcItemIdx)
//{

//}
BOOL CQuickManager::AddQuickItemReal(POSTYPE QuickPos, POSTYPE SrcPos, WORD SrcItemIdx, POSTYPE OldSrcPos, WORD OldSrcItemIdx)
{
//	ASSERT( QuickPos );
//	if( QuickPos == 0 ) return FALSE;

	CBaseItem * pIcon = NULL;
	switch(GetTableIdxPosition(SrcPos))
	{
	case eItemTable_Inventory:
	case eItemTable_Weared:
		{
			CItem * pItem = GAMEIN->GetInventoryDialog()->GetItemForIdx(SrcPos);
			ASSERT(pItem);
			if(pItem == NULL)
				return FALSE;
			
			pItem->SetQuickPosition(QuickPos);
			pIcon = pItem;
			
		}
		break;
	case eItemTable_Mugong:
		{
			CMugongBase * pMugong = GAMEIN->GetMugongDialog()->GetMugongAbs(SrcPos);
			ASSERT(pMugong);
			if(!pMugong) return FALSE;
			pMugong->SetQuickPosition(QuickPos);
			pIcon = pMugong;
		}
		break;
	case eItemTable_Ability:
		{
			CAbilityIcon* pAbilityIcon = GAMEIN->GetSuryunDialog()->GetAbilityIconAbs(SrcPos);
			ASSERT(pAbilityIcon);
			if(!pAbilityIcon) return FALSE;
			ABILITYMGR->SetAbilityQuickPosition(SrcItemIdx - MIN_ABILITY_INDEX,QuickPos,HERO->GetAbilityGroup() );
			pIcon = pAbilityIcon;
		}
		break;
	default:
		{
			return FALSE;
		}
	}

	if(OldSrcItemIdx)
	{
		RemoveQuickItemReal(OldSrcPos, OldSrcItemIdx);
	}



	CQuickItem * pNewQItem = NewQuickItem(pIcon);

	pNewQItem->SetPosition(QuickPos);
	GAMEIN->GetQuickDialog()->AddQuickItem(QuickPos, pNewQItem);
/*
	if( GAMEIN->GetQuickDialog()->AddQuickItem(QuickPos, pNewQItem) == FALSE )
	{
		WINDOWMGR->AddListDestroyWindow( pNewQItem );
	}
*/
	return TRUE;
}

CQuickItem * CQuickManager::NewQuickItem(CBaseItem * pSrcIcon)
{
	CQuickItem * pQuickItem;
	pQuickItem = new CQuickItem(pSrcIcon);
	pQuickItem->SetDurability(GAMEIN->GetInventoryDialog()->GetTotalItemDurability(pSrcIcon->GetItemIdx()));

	pQuickItem->Init(0,0,DEFAULT_ICONSIZE,DEFAULT_ICONSIZE, NULL, m_IconIndexCreator.GenerateIndex());
	GetImage(pQuickItem);
	WINDOWMGR->AddWindow(pQuickItem);	

	m_QuickHashForID.Add(pQuickItem, pQuickItem->GetID());

	return pQuickItem;

	/*
	if(pIcon->wIconIdx <= 0) return NULL;

	if(!(item = GetQuickItem(pIcon->dwDBIdx)))
	{	
		
		item = new CQuickItem;
		item->Init()
			
		item->SetIconIdx(pIcon->wIconIdx);				// taiyo modified;
		item->SetDBIdx(pIcon->dwDBIdx);					// 家胶螟 DB牢郸胶
		item->SetLinkPosition(pIcon->Position);
		if(GetIconKind(pIcon->wIconIdx) == eITEM_ICON)
		if(GetItemKind(pIcon->wIconIdx) & eYOUNGYAK_ITEM)
		{
			CItem * pitem = GAMEIN->GetInventoryDialog()->GetItemForIdx(pIcon->Position);
			item->SetDurability(pitem->GetDurability());
		}
		//item->SetPosition(pIcon->Position);			// 家胶螟 困摹
		item->Init(0,0,DEFAULT_ICONSIZE,DEFAULT_ICONSIZE, NULL, m_IconIndexCreator.GenerateIndex());

		GetImage(item);

		//item->SetAlpha(80);
		WINDOWMGR->AddWindow(item);	
	}
*/
}

CQuickItem* CQuickManager::GetQuickItem(DWORD dwDBIdx)
{
	CQuickItem* pItem;
	pItem = m_QuickHashForID.GetData(dwDBIdx);
	return pItem;
}
void CQuickManager::Release()
{
	CQuickItem* pQuick;
	m_QuickHashForID.SetPositionHead();
	while(pQuick = m_QuickHashForID.GetData())
	{
		ReleaseQuickItem(pQuick);
	}
	m_QuickHashForID.RemoveAll();
}
void CQuickManager::RefreshQickItem()
{
	CQuickItem* pQuick;
	m_QuickHashForID.SetPositionHead();
	while(pQuick = m_QuickHashForID.GetData())
	{
		if(!ITEMMGR->IsOptionItem(pQuick->GetSrcIdx(), pQuick->GetSrcDurability()) && ITEMMGR->IsDupItem(pQuick->GetSrcIdx()))
		{
			pQuick->SetDurability(GAMEIN->GetInventoryDialog()->GetTotalItemDurability(pQuick->GetSrcIdx()));
		}
	}
}

void CQuickManager::ReleaseQuickItem(CQuickItem * quick)
{
	if( quick == NULL )
	{
		ASSERT(0);
		return;
	}
	m_QuickHashForID.Remove(quick->GetID());
	m_IconIndexCreator.ReleaseIndex(quick->GetID());
	WINDOWMGR->AddListDestroyWindow( quick );
}

void CQuickManager::GetImage( CQuickItem * pQuickItem )
{
	cImage lowImage;
	cImage highImage;
	
	eQUICKICON_KIND eQK = GetIconKind(pQuickItem->GetSrcIdx());
	if( eQK == eITEM_ICON)
	{
		SCRIPTMGR->GetImage( ITEMMGR->GetItemInfo(pQuickItem->GetSrcIdx())->Image2DNum, &lowImage, PFT_ITEMPATH );
		pQuickItem->SetImage2(&lowImage, NULL);
	}
	else if( eQK == eMUGONG_ICON )
	{
		CSkillInfo* pSkillInfo = SKILLMGR->GetSkillInfo(pQuickItem->GetSrcIdx());
		if(pSkillInfo == NULL)
		{
			ASSERT(0);
			return;
		}

		if( pSkillInfo->GetLowImage() != -1 )
		SCRIPTMGR->GetImage( pSkillInfo->GetLowImage(), &lowImage, PFT_MUGONGPATH );
		if( pSkillInfo->GetHighImage() != -1 )
		SCRIPTMGR->GetImage( pSkillInfo->GetHighImage(), &highImage, PFT_MUGONGPATH );

		pQuickItem->SetImage2(&lowImage, &highImage);
	}
	else if( eQK == eABILITY_ICON )
	{
		CAbility* pAbility = HERO->GetAbilityGroup()->GetAbility( pQuickItem->GetSrcIdx() - MIN_ABILITY_INDEX );
		if( pAbility == NULL )
		{
			ASSERT(0);
			return;
		}
		
		SCRIPTMGR->GetImage( pAbility->GetAbilityInfo()->GetInfo()->Ability_IconIndex, &lowImage, PFT_ABILITYPATH );
		pQuickItem->SetImage2( &lowImage, NULL );	
	}
	else
	{
		ASSERT(0);
	}
}

BOOL CQuickManager::CanEquip(cIcon * pIcon)
{
	if(pIcon->GetType() == WT_QUICKITEM)
	{
		return TRUE;
	}
	else if(pIcon->GetType() == WT_ITEM)
	{
		CItem * pItem = (CItem *)pIcon;
		eITEM_KINDBIT bits = pItem->GetItemKind();
		if(bits & eYOUNGYAK_ITEM)
		{
			return TRUE;
		}
		else if(bits & eMUGONG_ITEM)
		{
			if( ITEMMGR->CanConvertToMugong(pItem->GetItemIdx()) )
				return TRUE;
			else
			{
				CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(352) );
				return FALSE;
			}
		}
		else if(bits & eEQUIP_ITEM)
		{
			if( ITEMMGR->CanEquip(pItem->GetItemIdx()) )
				return TRUE;
			else
			{
				CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(352) );
				return FALSE;
			}
				
		}
		else if(bits & eEXTRA_ITEM)
		{
			CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(352) );
			return FALSE;
		}
		return FALSE;

	}
	else if(pIcon->GetType() == WT_MUGONG ||
			pIcon->GetType() == WT_JINBUB )
	{
		CMugongBase * pMugong = (CMugongBase *)pIcon;
		if( MUGONGMGR->CanUse(pMugong) != CMugongManager::eMCUR_SungZero )
			return TRUE;
		else
		{
			CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(623) );
			return FALSE;
		}
	}
	else if(pIcon->GetType() == WT_ABILITYICON)
	{
		CAbilityIcon* pAbil = (CAbilityIcon*)pIcon;
		if(pAbil->GetState() != eAIS_Usable
			|| ( pAbil->GetAbilityInfo()->GetUseType() == eAUT_Passive
				 && pAbil->GetAbilityInfo()->GetKind() != eAGK_Job ) )
		{
			CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(352) );
			return FALSE;
		}

		return TRUE;
	}

	CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(352) );
	return FALSE;
}


BOOL CQuickManager::CheckQPosForItemIdx( WORD ItemIdx )
{
	CQuickItem* pQuick;
	m_QuickHashForID.SetPositionHead();
	while(pQuick = m_QuickHashForID.GetData())
	{
		if( pQuick->GetSrcIdx() == ItemIdx )
			return FALSE;
	}

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -