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

📄 user.cpp

📁 魔域的源代码
💻 CPP
字号:
// User.cpp: implementation of the CUser class.
//
//////////////////////////////////////////////////////////////////////

#include "User.h"
#include "NpcWorld.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CUser::CUser()
{
	memset(&m_Info, 0, sizeof(ST_USERINFO));
	SetObjType(OBJ_USER);
	m_pMap = NULL;
	m_lnkThis.Init(Cast<IRole>(this));
}

//////////////////////////////////////////////////////////////////////
CUser::~CUser()
{
	if(m_pMap)
		m_pMap->LeaveMap(this);
}

//////////////////////////////////////////////////////////////////////
bool CUser::Create(ST_USERINFO* pInfo, OBJID idMap)
{
	memcpy(&m_Info, pInfo, sizeof(ST_USERINFO));

	m_pMap	= MapManager()->QueryMap(idMap);
	if(!m_pMap)
		return false;
	m_pMap->EnterMap(this);

	m_tActive.SetInterval(PLAYERACTIVE_SECS);
	m_tActive.Update();

	return true;
}

//////////////////////////////////////////////////////////////////////
void CUser::OnTimer()
{
	if(m_tActive.ToNextTime())
	{
		int	x,y;
		FOR_9_BLOCKS(GetMap(), GetPosX(), GetPosY())
		{
			INpcSet* pNpcSet	= GetMap()->BlockByIndex(x,y).QueryNpcSet();
			for(int i = 0; i < pNpcSet->GetAmount(); i++)
			{
				CNpcPtr pNpc = pNpcSet->GetObjByIndex(i);
				if(pNpc && pNpc->IsAlive())
				{
					int nDist =  this->Distance(pNpc->GetPosX(), pNpc->GetPosY());
					if(nDist <= CELLS_PER_VIEW)
					{
						return ;	// 找到周围有NPC,不删除自己
					}
				}
			}
		} // FOR_9_BLOCKS

		// 未找到周围有NPC,删除自己
		UserManager()->QuerySet()->DelObj(GetID());
	}
}

//////////////////////////////////////////////////////////////////////
void CUser::FlyMap(OBJID idMap, int nPosX, int nPosY)
{
	CMapPtr pMap = GetMap();
	CMapPtr pTarget = MapManager()->QueryMap(idMap);
	if(!pMap || !pTarget)
		return ;

	IF_NOT(pTarget->IsValidPoint(nPosX, nPosY))
		return ;

	pMap->LeaveMap(this);
	m_pMap = pTarget;
	SetPos(nPosX, nPosY);
	pTarget->EnterMap(this);
}

//////////////////////////////////////////////////////////////////////
bool CUser::MoveForward(int nDir)
{
	m_Info.ucDir	= nDir%8;
	int	nDirX	= _DELTA_X[GetDir()];
	int	nDirY	= _DELTA_Y[GetDir()];

	int nNewPosX = GetPosX() + nDirX;
	int nNewPosY = GetPosY() + nDirY;
	IF_NOT(GetMap()->IsValidPoint(nNewPosX, nNewPosY))
		return false;

	SetPos(nNewPosX, nNewPosY);

	return true;
}

//////////////////////////////////////////////////////////////////////
void CUser::JumpPos(int nPosX, int nPosY, int nDir)
{
	IF_NOT(GetMap()->IsValidPoint(nPosX, nPosY))
		return ;

	SetPos(nPosX, nPosY);
	SetDir(nDir);
}

//////////////////////////////////////////////////////////////////////
void CUser::SetSizeAdd(int nSizeAdd)
{
	if(nSizeAdd != m_Info.ucSizeAdd)
	{
		// block npc size change
		GetMap()->LeaveMap(this);
		m_Info.ucSizeAdd	= nSizeAdd;
		GetMap()->EnterMap(this);
	}
}

//////////////////////////////////////////////////////////////////////
void CUser::SetEffect(I64 i64Effect)
{
	if((i64Effect & KEEPEFFECT_NOT_BLOCKNPC) != (m_Info.i64Effect & KEEPEFFECT_NOT_BLOCKNPC))
	{
		// block npc change
		GetMap()->LeaveMap(this);
		m_Info.i64Effect = i64Effect;
		GetMap()->EnterMap(this);
	}
	else
		m_Info.i64Effect = i64Effect;
}

//////////////////////////////////////////////////////////////////////
void CUser::SetPos(int nPosX, int nPosY)
{
	CMapPtr pMap = GetMap();
	IF_OK(pMap)
		pMap->MoveTo(this, nPosX, nPosY);

	m_Info.usPosX = nPosX;
	m_Info.usPosY = nPosY;
}

//////////////////////////////////////////////////////////////////////
OBJID CUser::GetMapID()									{ return m_pMap->GetID(); }

//////////////////////////////////////////////////////////////////////
int	 CUser::GetAttackRange(int nSizeAdd)
{
	int nItemType = GetWeaponRType();
	if(nItemType)
	{
		CItemTypeData* pType = NpcWorld()->GetItemType()->QueryItemType(nItemType);
		if(pType)
			return pType->GetInt(ITEMTYPEDATA_ATKRANGE) + (GetSizeAdd()+nSizeAdd+1)/2;
	}

	return 1 + (GetSizeAdd()+nSizeAdd+1)/2;
}



⌨️ 快捷键说明

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