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

📄 npc.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				CSyndicate * pSyn = SynManager()->QuerySyndicate(this->GetSynID());
				if(pSyn)
				{
					const int nRepute = 500000;
					pSyn->QueryModify()->AddData(SYNDATA_REPUTE, nRepute, true);	// 
				}
				SetData(SYNWARLETTER_OCCUPYTIME,(int)tCur,true);
			}

		}


	}
	//---jinggy---进行帮派每占领一周,军团声望增加50万的处理---end

	if(IsSynFlag())
	{
		if(m_tSynEvent.ToNextTime(FIXSYNFLAG_SECS))
		{
			// recruit life
			RecruitLife();
		}

		if(m_tBroadcastScore.ToNextTime(BROADCASTSCORE_SECS))
		{
			if(GetMap()->IsWarTime())
				BroadcastScore();

			// set war flag
			CheckFightTime();
		}
	}

	if(IsDynaNpc() && GetType() == _SYNTRANS_NPC)
	{
		time_t	tCurr	= time(NULL);
		tm*		pTm		= localtime(&tCurr);
		if(m_bFeeOK)
		{
			if(pTm->tm_hour != 00)
				m_bFeeOK	= false;
		}
		else
		{
			if(pTm->tm_hour == 00)
			{
				m_bFeeOK	= true;

				OBJID idSyn = GetSynID();
				if(idSyn != ID_NONE)
				{
					CSyndicate*	pSyn = SynManager()->QuerySyndicate(idSyn);
					IF_OK(pSyn)
						pSyn->QueryModify()->AddData(SYNDATA_MONEY, -1*TRANSNPC_FEE, true);		// mast true
				}
			}
		}
	}

	if(IsTaskNpc())
		QueryTask()->OnTimer(tCurr);
	else if(IsBetNpc())
		QueryBet()->OnTimer();
}

//////////////////////////////////////////////////////////////////////
void CNpc::BroadcastRoomMsg(CNetMsg* pMsg, bool bSendSelf)
{
	CRole::BroadcastRoomMsg(pMsg, bSendSelf);
	CHECK(GetMap());

	GetMap()->BroadcastBlockMsg(QueryMapThing(), pMsg, bSendSelf);
}

//////////////////////////////////////////////////////////////////////
void CNpc::BroadcastRoomMsg(LPCTSTR szMsg, bool bSendSelf)
{
	CMsgTalk	msg;
	if(msg.Create(GetName(), ALLUSERS_NAME, szMsg, NULL, 0xff0000, _TXTATR_SYSTEM))
		this->BroadcastRoomMsg(&msg, bSendSelf);
}

//////////////////////////////////////////////////////////////////////
void CNpc::BeKill(IRole* pTarget /*= NULL*/)
{
	CHECK(IsDynaNpc());

	if(IsDeleted())
		return ;

	// die action
	if(IsDieAction())
	{
		OBJID idAction = m_pData->GetInt(NPCDATA_LINKID);
		CHECK(idAction);

		CUser* pUser=NULL;
		if(pTarget)
			pTarget->QueryObj(OBJ_USER, IPP_OF(pUser));

		GameAction()->ProcessAction(idAction, pUser, QueryRole());
	}
	else
	{
		this->SetStatus(STATUS_DIE);
		ASSERT(DelNpc());
	}
}

//////////////////////////////////////////////////////////////////////
bool CNpc::DelNpc()			// call this mast !IsDeleted()
{
	CHECKF(IsDynaNpc() && !IsDeleted());

	if(IsLinkNpc())
	{
		if(!QueryLinkMap()->EraseMap())
			return false;
	}
	if(IsSceneNpc())
	{
		QueryScene()->DelTerrainObj();
	}

	m_pData->SetInt(NPCDATA_LIFE, 0);		// set flag to die

	// die status
	m_tDie.Startup(DYNANPCDIEDELAY_SECS);

	// set map syn id
	if(IsSynFlag())
	{
		GetMap()->SetStatus(CGameMap::STATUS_WAR, false);

		GetMap()->SetSynID(ID_NONE, true);		// set all npc

		// temporary code
		OBJID idMoreMap = GetData(SYNFLAGNPC_MOREMAPID);
		if(idMoreMap != ID_NONE)
		{
			CGameMap* pMoreMap = MapManager()->QueryMap(idMoreMap);
			if(pMoreMap)
				pMoreMap->SetSynID(ID_NONE, true);		// true: set npc in map
		}
	}

	SendLeaveFromBlock();		//??? show leave map now!
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CNpc::BeAttack(bool bMagic, IRole* pTarget, int nPower, bool bReflectEnable/*=true*/)
{
	if(IsDynaNpc())
	{
		if(IsSynNpc())
		{
			CUser * pUser = NULL;					
			CHECKF(pTarget && pTarget->QueryObj(OBJ_USER, IPP_OF(pUser)));
			
			CGameMap * pSynMap = this->GetMap();
			if(pSynMap->IsSynMap())
			{
				if( pSynMap->IsWarTime() && pSynMap->GetSynID() != pUser->GetSynID())
				{
					int nID = GetSynID();
					//在攻城战中,玩家每伤害对方建筑100点血,得到1点军团贡献度
					pUser->QuerySynAttr()->AddProffer(__max(0,nPower/100));
					return true;
				}		
				else
					return false;
			}
		}
		return true;
	}
	
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CNpc::AddAttrib(int idxAttr, __int64 i64Data, int nSynchro)
{
	CHECKF(IsDynaNpc());

	CMsgUserAttrib	msg;
	if(!msg.Create(GetID(), _USERATTRIB_NONE, _USERATTRIB_NONE))			// _USERATTRIB_NONE : 不添加
		return false;

	if(i64Data)
	{
		switch(idxAttr)
		{
		case	_USERATTRIB_LIFE:
			{
				IF_NOT(!( IsAwardScore() && !GetMap()->IsWarTime() && i64Data < 0 ))
					return false;

				if ((int)this->GetLife() + i64Data <= 0)
				{
//					this->SetStatus(STATUS_DIE);
					m_pData->SetInt(NPCDATA_LIFE, 0);
				}
				else
					m_pData->SetInt(NPCDATA_LIFE, this->GetLife() + i64Data);
				if(!msg.Append(_USERATTRIB_LIFE, GetLife()))
					return false;
			}
			break;
		case	_USERATTRIB_MANA:
//			if(!msg.Append(_USERATTRIB_MANA, GetMana()))
				return false;
			break;
		case	_USERATTRIB_EXP:
//			if(!msg.Append(_USERATTRIB_EXP, GetExp()))
				return false;
			break;
		case	_USERATTRIB_MONEY:
//			if(!msg.Append(_USERATTRIB_MONEY, GetMoney()))
				return false;
			break;
		default:
			return false;
		}
	}

	if(nSynchro != SYNCHRO_FALSE)
	{
		switch(nSynchro)
		{
		case SYNCHRO_TRUE:
			this->SendMsg(&msg);
			break;

		case SYNCHRO_BROADCAST:
			this->BroadcastRoomMsg(&msg, INCLUDE_SELF);
			break;

		default:
			break;
		}
	}

	return true;
}

/////////////////////////////////////////////////////////////////////////////
void CNpc::SaveInfo()
{
	if(m_pData && IsDynaNpc())
		m_pData->Update();
}

/////////////////////////////////////////////////////////////////////////////
void CNpc::TransPos(int nPosX, int nPosY)
{
/*
	CHECK(IsDynaNpc());

	this->SendLeaveFromBlock();
	GetMap()->LeaveRoom(QueryMapThing(), WITH_BLOCK);

	m_nPosX	= nPosX;
	m_nPosY	= nPosY;
	m_pData->SetInt(NPCDATA_POSX, nPosX_);
	m_pData->SetInt(NPCDATA_POSY, nPosY_);
	if(IsDynaNpc())
		SaveInfo();

	GetMap()->EnterRoom(QueryMapThing(), WITH_BLOCK);
	SendSelfToBlock();
*/
}

/////////////////////////////////////////////////////////////////////////////
void CNpc::SetStatus(int nStatus, bool bSynchro)
{
	I64	i64OldEffect = GetEffect();
	switch (nStatus)
	{
	case	STATUS_NORMAL:
		{
//			m_data.m_Info.dwStatus	= nStatus;
			m_i64Effect	= KEEPEFFECT_NORMAL;
		}
		break;
	case	STATUS_DIE:
		{
//			m_data.m_Info.dwStatus	= nStatus;
			m_i64Effect	&= KEEPEFFECT_NOT_CLEAR;
			m_i64Effect	|= KEEPEFFECT_DIE;

//			ClearAllStatus();
		}
		break;
	case	STATUS_TEAMLEADER:
		{
			m_i64Effect	|= KEEPEFFECT_TEAMLEADER;
		}
		break;
	case	STATUS_CRIME:
		{
			m_i64Effect	|= KEEPEFFECT_CRIME;
		}
		break;
	case	STATUS_SYNCRIME:
		{
			m_i64Effect	|= KEEPEFFECT_SYNCRIME;
		}
		break;
	case	STATUS_POISON:
		{
			m_i64Effect	|= KEEPEFFECT_POISON;
		}
		break;
	case	STATUS_PKVALUE:
		{
		}
		break;
	case	STATUS_DEFENCE1:
		{
			m_i64Effect	&= ~(KEEPEFFECT_DEFENCE2 | KEEPEFFECT_DEFENCE3);
			m_i64Effect	|= KEEPEFFECT_DEFENCE1;
		}
		break;
	case	STATUS_DEFENCE2:
		{
			m_i64Effect	&= ~(KEEPEFFECT_DEFENCE1 | KEEPEFFECT_DEFENCE3);
			m_i64Effect	|= KEEPEFFECT_DEFENCE2;
		}
		break;
	case	STATUS_DEFENCE3:
		{
			m_i64Effect	&= ~(KEEPEFFECT_DEFENCE1 | KEEPEFFECT_DEFENCE2);
			m_i64Effect	|= KEEPEFFECT_DEFENCE3;
		}
		break;
	case	STATUS_FREEZE:
		{
			m_i64Effect |= KEEPEFFECT_FREEZE;
		}
		break;
	case	STATUS_SMOKE:
		{
			m_i64Effect |= KEEPEFFECT_SMOKE;
		}
		break;
	case	STATUS_DARKNESS:
		{
			m_i64Effect |= KEEPEFFECT_DARKNESS;
		}
		break;
	case	STATUS_PALSY:
		{
			m_i64Effect |= KEEPEFFECT_PALSY;
		}
		break;
	case	STATUS_ATTACK:
		{
			m_i64Effect	|= KEEPEFFECT_ATTACK;
		}
		break;
	case	STATUS_MAGICDEFENCE:
		{
			m_i64Effect	|= KEEPEFFECT_MAGICDEFENCE;
		}
		break;
	case	STATUS_REFLECT:
		{
			m_i64Effect	|= KEEPEFFECT_REFLECT;
		}
		break;
	case	STATUS_REFLECTMAGIC:
		{
			m_i64Effect	|= KEEPEFFECT_REFLECTMAGIC;
		}
		break;
	case	STATUS_MAGICDAMAGE:
		{
			m_i64Effect	|= KEEPEFFECT_MAGICDAMAGE;
		}
		break;
	case	STATUS_ATKSPEED:
		{
			m_i64Effect	|= KEEPEFFECT_ATKSPEED;
		}
		break;
	case	STATUS_LURKER:
		{
			m_i64Effect	|= KEEPEFFECT_LURKER;
		}
		break;
	case	STATUS_SLOWDOWN1:
		{
			m_i64Effect |= KEEPEFFECT_SLOWDOWN1;
		}
		break;
	case	STATUS_SLOWDOWN2:
		{
			m_i64Effect |= KEEPEFFECT_SLOWDOWN2;
		}
		break;
	case	STATUS_MAXLIFE:
		{
			m_i64Effect |= KEEPEFFECT_MAXLIFE;
		}
		break;
	case	STATUS_HIDDEN:
		{
			m_i64Effect |= KEEPEFFECT_HIDDEN;
		}
		break;
	case	STATUS_ADD_EXP:
		{
			m_i64Effect	|= KEEPEFFECT_ADD_EXP;
		}
		break;
	// 以下是结界系统相关的状态 ================
	case	STATUS_TEAMHEALTH:
		{
			m_i64Effect	&= ~KEEPEFFECT_TEAM_ALL;
			m_i64Effect	|= KEEPEFFECT_TEAM_HEALTH;
		}
		break;
	case	STATUS_TEAMATTACK:
		{
			m_i64Effect	&= ~KEEPEFFECT_TEAM_ALL;
			m_i64Effect	|= KEEPEFFECT_TEAM_ATTACK;
		}
		break;
	case	STATUS_TEAMDEFENCE:
		{
			m_i64Effect	&= ~KEEPEFFECT_TEAM_ALL;
			m_i64Effect	|= KEEPEFFECT_TEAM_DEFENCE;
		}
		break;
	case	STATUS_TEAMSPEED:
		{
			m_i64Effect	&= ~KEEPEFFECT_TEAM_ALL;
			m_i64Effect	|= KEEPEFFECT_TEAM_SPEED;
		}
		break;
	case	STATUS_TEAMEXP:
		{
			m_i64Effect	&= ~KEEPEFFECT_TEAM_ALL;
			m_i64Effect	|= KEEPEFFECT_TEAM_EXP;
		}
		break;
	case	STATUS_TEAMSPIRIT:
		{
			m_i64Effect	&= ~KEEPEFFECT_TEAM_ALL;
			m_i64Effect	|= KEEPEFFECT_TEAM_SPIRIT;
		}
		break;
	case	STATUS_TEAMCLEAN:
		{
			m_i64Effect	&= ~KEEPEFFECT_TEAM_ALL;
			m_i64Effect	|= KEEPEFFECT_TEAM_CLEAN;
		}
		break;
	// 以上是结界系统相关状态 ===============
	case	STATUS_HEAL:
		{
			m_i64Effect |= KEEPEFFECT_HEAL;
		}
		break;
	case	STATUS_FAINT:
		{
			m_i64Effect |= KEEPEFFECT_FAINT;
		}
		break;
	case	STATUS_TRUCULENCE:
		{
			m_i64Effect |= KEEPEFFECT_TRUCULENCE;
		}
		break;
	case	STATUS_DAMAGE:
		{
			m_i64Effect |= KEEPEFFECT_DAMAGE;
		}
		break;
	case	STATUS_ATKER_DAMAGE:
		{
			m_i64Effect |= KEEPEFFECT_ATKER_DAMAGE;
		}
		break;
	case	STATUS_CONFUSION:
		{
			m_i64Effect |= KEEPEFFECT_CONFUSION;
		}
		break;
		
	default:
		ASSERT(!"switch status");
	}

	if(bSynchro && i64OldEffect != GetEffect())
	{
		CMsgUserAttrib msg;
		if (msg.Create(GetID(), _USERATTRIB_KEEPEFFECT, GetEffect()))
		{
			if (STATUS_MAXLIFE == nStatus)
			{
				msg.Append(_USERATTRIB_MAXLIFE, this->GetMaxLife());
				msg.Append(_USERATTRIB_LIFE, this->GetLife());
			}
			BroadcastRoomMsg(&msg, INCLUDE_SELF);
		}
	}
}


/////////////////////////////////////////////////////////////////////////////
void CNpc::ClsStatus(int nStatus, bool bSynchro)
{
	I64	i64OldEffect = GetEffect();
	switch (nStatus)
	{
	case	STATUS_NORMAL:
		{
			ASSERT(!"STATUS_NORMAL");
		}
		break;
	case	STATUS_DIE:
		{
			m_i64Effect	&= ~KEEPEFFECT_DIE;
		}
		break;
	case	STATUS_TEAMLEADER:
		{
			m_i64Effect	&= ~KEEPEFFECT_TEAMLEADER;
		}
		break;
	case	STATUS_CRIME:
		{
			m_i64Effect	&= ~KEEPEFFECT_CRIME;
		}
		break;
	case	STATUS_SYNCRIME:
		{
			m_i64Effect	&= ~KEEPEFFECT_SYNCRIME;
		}
		break;
	case	STATUS_POISON:
		{
			m_i64Effect	&= ~KEEPEFFECT_POISON;
		}
		break;
	case	STATUS_PKVALUE:
		{
		}
		break;
	case	STATUS_DEFENCE1:
		{
			m_i64Effect	&= ~KEEPEFFECT_DEFENCE1;
		}
		break;
	case	STATUS_DEFENCE2:
		{
			m_i64Effect	&= ~KEEPEFFECT_DEFENCE2;
		}
		break;
	case	STATUS_DEFENCE3:
		{
			m_i64Effect	&= ~KEEPEFFECT_DEFENCE3;
		}
		break;

⌨️ 快捷键说明

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