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

📄 statusonce.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
字号:
// StatusOnce.cpp: implementation of the CStatusOnce class.
//
//////////////////////////////////////////////////////////////////////

#include "windows.h"
#include "define.h"
#include "I_Role.h"
#include "TimeOut.h"
#include "myheap.h"
#include "StatusMore.h"
#include "StatusOnce.h"
#include "MapGroup.h"
#include "MsgUserAttrib.h"

MYHEAP_IMPLEMENTATION(CStatusOnce,s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CStatusOnce::CStatusOnce()
{
	m_pOwner	= NULL;
	m_nStatus	= 0;
}

//////////////////////////////////////////////////////////////////////
CStatusOnce::~CStatusOnce()
{
	if(m_pOwner)
		m_pOwner->ClsStatus(m_nStatus);
}

//////////////////////////////////////////////////////////////////////
int CStatusOnce::GetPower()
{
	if (m_nStatus >= STATUS_TEAM_BEGIN && m_nStatus <= STATUS_TEAM_END)
	{
		CUser* pUser = NULL;
		if (m_pOwner->QueryObj(OBJ_USER, IPP_OF(pUser)))
		{
			CTeam* pTeam = pUser->GetTeam();
			if (pTeam)
			{
				// 组队成员为4则power增加10%,组队成员为5则power增加20%
				int nAddPercent = __max(0, (pTeam->GetMemberAmount()-TEAM_STATUS_REQ_ROLES)*10);
				int nPower = m_nData * (100 + nAddPercent) / 100;
				return nPower;
			}
		}
	}
	return m_nData;
}

//////////////////////////////////////////////////////////////////////
bool CStatusOnce::GetInfo(StatusInfoStruct* pInfo)
{
	pInfo->nPower	= m_nData;
	pInfo->nStatus	= m_nStatus;
	pInfo->nSecs	= m_tKeep.GetRemain()/1000;
	pInfo->nTimes	= 0;					// Status once

	return IsValid();
}

//////////////////////////////////////////////////////////////////////
bool CStatusOnce::ChangeData(int nPower, int nSecs, int nTimes)
{
	CHECKF(nSecs > 0 && nTimes == 0);

//	if(nPower)
//	{
//		// 时间多则复盖
//		if(nSecs*1000 >= m_tKeep.GetRemain())
//		{
			m_nData		= nPower;
			m_tKeep.SetInterval(nSecs*1000);
			m_tKeep.Update();
//		}
		return true;
//	}
//	else // power == 0: 减时间
//	{
//		// 减时间
//		m_tKeep.DecInterval(nSecs*1000);
//	}
//	return false;
}

//////////////////////////////////////////////////////////////////////
bool CStatusOnce::IncTime(int nMilliSecs, int nLimit)
{
	int nInterval = __min(nMilliSecs+m_tKeep.GetRemain(), nLimit);
	m_tKeep.SetInterval(nInterval);
	m_tKeep.Update();
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CStatusOnce::ToFlash()
{
	if(!IsValid())
		return false;

	if(!m_bFlash && m_tKeep.GetRemain() <= STATUS_FLASH_REMAIN_MS)
	{
		m_bFlash = true;
		return true;
	}

	return false;
}

//////////////////////////////////////////////////////////////////////
void CStatusOnce::OnTimer(DWORD tCurr)
{
	if(!IsValid())
		return ;

	if ((m_nStatus >= STATUS_TEAM_BEGIN && m_nStatus <= STATUS_TEAM_END || m_nStatus == STATUS_ADD_EXP) 
		&& m_pOwner && m_tInterval.ToNextTime())
	{
		CUser* pUser = NULL;
		m_pOwner->QueryObj(OBJ_USER, IPP_OF(pUser));
		if (pUser)
		{
			CTeam* pTeam = pUser->GetTeam();
			if (pTeam)
			{
				// if owner is team leader
				if (pTeam->GetLeader() == pUser->GetID())
				{
					// dispatch magic status exclude self
					StatusInfoStruct	info;
					this->GetInfo(&info);
					pTeam->AttachMemberStatus(info.nStatus, info.nPower, info.nSecs, info.nTimes, pUser->GetID());
				}

				// status effects
				switch (m_nStatus)
				{
				case	STATUS_TEAMHEALTH:
					{
						if (pUser->GetLife() < pUser->GetMaxLife())
							pUser->AddAttrib(_USERATTRIB_LIFE, this->GetPower(), SYNCHRO_TRUE);
						if (pUser->GetMana() < pUser->GetMaxMana())
							pUser->AddAttrib(_USERATTRIB_MANA, this->GetPower(), SYNCHRO_TRUE);
						// 要不要广播魔法效果?
					}
					break;
				}
			}
		} // end of if (pUser)
	}
}

⌨️ 快捷键说明

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