Ejemplo n.º 1
0
bool BuffManager::CanAddBuff(const SBuffBaseData *pData, CFightObject *pSender)
{
	if (!pData)
	{
		rfalse(4,1,"BuffManager::CanAddBuff(const SBuffBaseData *pData)1");
		return false;
	}

	if (m_curObj&&pSender)
	{
		if (m_curObj->GetGID() != pSender->GetGID()) //给目标添加BUFF
		{
			if (!m_curObj->m_bPlayerAction[CST_ADDBUFF])
			{
				rfalse(2, 1, "目标当前无法添加BUFF");
				return false;
			}
		}
	}

	BuffGroup::iterator groupIt = m_buffGroup.find(pData->m_GroupID);
	if (groupIt == m_buffGroup.end())
	{
		//rfalse(2, 1, "玩家身上没有Buff组%d中的Buff", pData->m_GroupID);
		//MY_ASSERT(m_buffList.end() == m_buffList.find(pData->m_ID));
		return true;
	}

	BuffList::iterator buffIt = m_buffList.find(groupIt->second);
	if (buffIt == m_buffList.end())
	{
		rfalse(4,1,"BuffManager::CanAddBuff(const SBuffBaseData *pData)2");
		return false;
	}
	MY_ASSERT(m_buffList.end() != buffIt);
	//TODO:Tony Modify [2012-3-11]Comment:[IF语句后面有;]
	//if (pData->m_GroupID != buffIt->second->m_GroupID);
	///////////////////////////////////////////////////////////////////
	if (pData->m_GroupID != buffIt->second->m_GroupID)
	{
		rfalse(4,1,"BuffManager::CanAddBuff(const SBuffBaseData *pData)3");
		return false;
	}
	MY_ASSERT(pData->m_GroupID == buffIt->second->m_GroupID);
	
	if (!buffIt->second->m_CanBeReplaced)
		return false;

	// 如果可被替换,那么查看权重
	if (buffIt->second->m_Weight > pData->m_Weight)
		return false;

	// 顶替
	RemoveBuff(buffIt->second);

	return true;
}
Ejemplo n.º 2
0
void BuffManager::Free()
{
	BuffList copy(m_buffList);

	for (BuffList::iterator it = copy.begin(); it != copy.end(); ++it)
		RemoveBuff(it->second);

	if (g_InDebugMode)
		MY_ASSERT(m_buffList.empty() && "Buff管理器中的Buff没有被清干净!");
}
Ejemplo n.º 3
0
void BuffManager::CheckDelBuffType(DWORD delType)
{
	BuffList copy(m_buffList);

	for (BuffList::iterator it = copy.begin(); it != copy.end(); ++it)
	{
		if (delType == it->second->m_PropertyID)
			RemoveBuff(it->second);
	}
}
Ejemplo n.º 4
0
void BuffManager::CheckDelBuffSpot(DWORD delFlag)
{
	if (0 == delFlag || (delFlag & (delFlag-1)))
		return;

	BuffList copy(m_buffList);

	for (BuffList::iterator it = copy.begin(); it != copy.end(); ++it)
	{
		if ((it->second->m_DeleteType & delFlag)&& (it->second->m_InturptRate != 0 || delFlag == BDT_DEAD) )
			RemoveBuff(it->second);
	}

	return;
}
Ejemplo n.º 5
0
bool NFCBuffModule::AddBuff( const NFIDENTID& self, const std::string& strConfig, const NFIDENTID& releaserIdent )
{
    //1 死亡判断
    //2 最大MAX判断
    //3 是否BUFF免疫判断
    //4 BUFF是否存在判断
    NFIBuffConfigModule::NFCBuffConfig* pBuffConfig = m_pBuffConfigModule->GetBuffConfig( strConfig );
    if ( pBuffConfig )
    {
        //5 是否有此BUFF判断,有则更新时间
        if ( HasBuff( self, strConfig ) )
        {
            //更新时间
            SetBuffTime( self, strConfig, pBuffConfig->EffectTimeValue, pBuffConfig->EffectTimeInterval );
        }
        else
        {
            //6 同组BUFF判断
            if ( pBuffConfig->BuffGroupIDValue > 0 )
            {
                std::string strOldConfig = GetGroupBuffIndex( self, pBuffConfig->BuffGroupIDValue );
                if ( !strOldConfig.empty() )
                {
                    //同组只能一个BUFF,删掉老的
                    RemoveBuff( self, strOldConfig );
                }
            }

            //不同的类型
            if ( NFIBuffConfigModule::BuffType::BT_BUFF == pBuffConfig->BuffTypeValue )
            {
                ProcessBuffValue( self, pBuffConfig, releaserIdent );
            }
            else if ( NFIBuffConfigModule::BuffType::BT_DEBUFF == pBuffConfig->BuffTypeValue )
            {
                ProcessDeBuffValue( self, pBuffConfig, releaserIdent );
            }
        }
    }

    return true;
}