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

📄 effectmanager.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : EffectManager.cpp// Written by  : Reiot// Description : //////////////////////////////////////////////////////////////////////////////#include "EffectManager.h"#include "EffectInfo.h"#include "EffectEnemyErase.h"#include "Assert.h"#include "Creature.h"#include "Zone.h"#include "ZoneUtil.h"#include "Gpackets/GCAddEffect.h"#include "Profile.h"//#define __PROFILE_EM__#ifdef __PROFILE_EM__	#define __BEGIN_PROFILE_EM(name)	beginProfileEx(name);	#define __END_PROFILE_EM(name)		endProfileEx(name);#else	#define __BEGIN_PROFILE_EM(name)	((void)0);	#define __END_PROFILE_EM(name)		((void)0);#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////class isSameEffectClass {public:	isSameEffectClass(Effect::EffectClass EClass) : m_EClass(EClass) {}	bool operator () (Effect* pEffect) throw ()	{		return pEffect->getEffectClass() == m_EClass;	}	private:	Effect::EffectClass m_EClass;};////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////EffectManager::EffectManager ()     throw (Error){	__BEGIN_TRY	Assert(m_Effects.empty());	__END_CATCH}	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////EffectManager::~EffectManager ()     throw (){	__BEGIN_TRY			// 沥侥栏肺 deleteEffects() 啊 龋免登瘤 臼疽促搁, 	// 阿 effect俊 措秦辑 unaffect()甫 龋免且 鞘夸啊 绝促.	// 窜瘤 按眉父 昏力秦林搁 等促.	while (!m_Effects.empty()) 	{		// effect 按眉甫 昏力茄促.		SAFE_DELETE(m_Effects.front());		m_Effects.pop_front();	}	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectManager::save(const string & ownerID)	throw(Error){	__BEGIN_TRY	list<Effect*>::const_iterator itr = m_Effects.begin();	for(; itr != m_Effects.end(); itr++) 		(*itr)->save(ownerID);	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////bool EffectManager::isEffect(Effect::EffectClass EClass)	throw(){	__BEGIN_TRY	list<Effect*>::const_iterator itr = find_if (m_Effects.begin(), m_Effects.end(), isSameEffectClass(EClass)); 	if (itr != m_Effects.end()) return true;	return false;	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectManager::deleteEffect(ObjectID_t effectID)	throw(){	__BEGIN_TRY	__BEGIN_DEBUG	list<Effect*>::iterator current = m_Effects.begin();	int i = 0;	for(current = m_Effects.begin(); current != m_Effects.end(); current++)	{		Effect* pEffect = *current;		if (pEffect->getObjectID() == effectID)		{			m_Effects.erase(current);			pEffect->unaffect();			SAFE_DELETE(pEffect);			return;		}		i++;	}		//cerr << "EffectManager::deleteEffect俊辑 effect甫 茫瘤 给沁嚼聪促."<<endl;	Assert(false);	__END_DEBUG	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectManager::deleteEffect(Effect::EffectClass EClass)	throw(){	__BEGIN_TRY	__BEGIN_DEBUG	list<Effect*>::iterator itr = find_if (m_Effects.begin(), m_Effects.end(), isSameEffectClass(EClass)); 	if (itr != m_Effects.end()) 	{		Effect* pEffect = *itr;		m_Effects.erase(itr);		//pEffect->unaffect(); // 捞芭 窍搁 恐 救瞪鳖?		SAFE_DELETE(pEffect);	}	else	{		//cerr << "EffectManager::deleteEffect俊辑 effect甫 茫瘤 给沁嚼聪促."<<endl;	}	__END_DEBUG	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectManager::deleteEffect(Creature* pCreature, Effect::EffectClass EClass)	throw(){	__BEGIN_TRY	__BEGIN_DEBUG	list<Effect*>::iterator itr = find_if (m_Effects.begin(), m_Effects.end(), isSameEffectClass(EClass)); 	if (itr != m_Effects.end()) 	{		Effect* pEffect = *itr;		m_Effects.erase(itr);		if (pCreature)		{			if (pCreature->isFlag(EClass)) 				pCreature->removeFlag(EClass);			pEffect->destroy(pCreature->getName());		}			//pEffect->unaffect(); // 捞芭窍搁 救登匙		SAFE_DELETE(pEffect);	}	else	{		//cerr << "EffectManager::deleteEffect俊辑 effect甫 茫瘤 给沁嚼聪促."<<endl;	}	__END_DEBUG	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Effect* EffectManager::findEffect(Effect::EffectClass EClass)	throw(){	__BEGIN_TRY	list<Effect*>::iterator itr = find_if (m_Effects.begin(), m_Effects.end(), isSameEffectClass(EClass)); 	if (itr == m_Effects.end()) 	{		return NULL;	}	return *itr;		__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Effect* EffectManager::findEffect(ObjectID_t ObjectID)	throw(){	__BEGIN_TRY	list<Effect*>::iterator itr = m_Effects.begin();	for (; itr != m_Effects.end(); itr++)	{		Effect* pEffect = *itr;		if (pEffect->getObjectID() == ObjectID) return pEffect;	}	return NULL;	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Effect* EffectManager::findEffect(Effect::EffectClass EClass, string EnemyName)	throw(){	__BEGIN_TRY	list<Effect*>::const_iterator itr = m_Effects.begin();	for(; itr != m_Effects.end(); itr++) 	{		if ((*itr)->getEffectClass() == EClass && EClass == Effect::EFFECT_CLASS_ENEMY_ERASE) {			if (((EffectEnemyErase *)(*itr))->getEnemyName() == EnemyName) return *itr;		}	}	return NULL;		__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////EffectInfo* EffectManager::getEffectInfo()	throw(){	__BEGIN_TRY	__BEGIN_DEBUG	EffectInfo* pEffectInfo;	__BEGIN_PROFILE_EM( "EM_GETEFFECTINFO" );		__BEGIN_PROFILE_EM( "EM_NEW_EFFECTINFO" );	pEffectInfo = new EffectInfo();	__END_PROFILE_EM( "EM_NEW_EFFECTINFO" );	BYTE ListNum = 0;	Timeval currentTime;	__BEGIN_PROFILE_EM( "EM_GETTIME" );	getCurrentTime(currentTime);	__END_PROFILE_EM( "EM_GETTIME" );	// 捞棋飘 沥焊 备己.	for(list<Effect*>::const_iterator itr = m_Effects.begin(); itr != m_Effects.end(); itr++) 	{		Effect* pEffect = *itr;		EffectID_t EffectID = pEffect->getSendEffectClass();		/*		bool bSend = true;				switch (EffectID)		{			// 捞 捞棋飘甸篮 辑滚俊辑父 静绰 捞棋飘捞扁 锭巩俊			// 努扼捞攫飘俊霸 朝妨林瘤 臼绰促.			case Effect::EFFECT_CLASS_AFTERMATH:			case Effect::EFFECT_CLASS_ALIGNMENT_RECOVERY:			case Effect::EFFECT_CLASS_ENEMY_ERASE:			case Effect::EFFECT_CLASS_RESTORE:				bSend = false;				break;			default:				break;		}		*/				// 阿 Effect狼 constructor俊辑 client肺 焊尘 effect牢瘤 酒囱瘤甫 搬沥茄促.		// by sigi. 2002.11.14		bool bSend = pEffect->isBroadcastingEffect();		if (bSend)		{			Timeval DeadLine;			Turn_t Duration;			__BEGIN_PROFILE_EM( "EM_COMPUTE_TIME" )			// 单靛扼牢苞 泅犁 矫埃阑 哗辑 巢篮 矫埃阑 朝妨拎具 茄促.			DeadLine = (*itr)->getDeadline();			Duration = DeadLine.tv_sec - currentTime.tv_sec;			__END_PROFILE_EM( "EM_COMPUTE_TIME" )			if (EffectID == Effect::EFFECT_CLASS_BLOOD_DRAIN) 			{				// Duration 朝酒啊绰 巴捞 WORD 屈栏肺 朝酒啊绰单,				// 2官捞飘扼辑 软趋 矫埃 鞍篮 版快俊绰 呈公 辨绢				// 坷滚敲肺快啊 老绢唱霸 等促.				// 弊贰辑 促弗 捞棋飘 鞍篮 版快俊绰 10阑 蚌秦辑 朝府瘤父, 				// 软趋 捞棋飘绰 10阑 蚌秦辑 朝府瘤 臼绰促.				pEffectInfo->addListElement(EffectID, Duration);			} 			else 			{				pEffectInfo->addListElement(EffectID, Duration * 10);			}			ListNum++;		}	}	pEffectInfo->setListNum(ListNum);	__END_PROFILE_EM( "EM_GETEFFECTINFO" );	return pEffectInfo;	__END_DEBUG	__END_CATCH}////////////////////////////////////////////////////////////////////////////////// sendEffectInfo////////////////////////////////////////////////////////////////////////////////// Effect 沥焊甫 broadcasting茄促.// by sigi. 2002.11.14//////////////////////////////////////////////////////////////////////////////void EffectManager::sendEffectInfo(Creature* pCreature, Zone* pZone, ZoneCoord_t x, ZoneCoord_t y)	throw(Error){	__BEGIN_TRY	__BEGIN_DEBUG	__BEGIN_PROFILE_EM( "SEND_EFFECT_INFO" );	Assert(pCreature!=NULL);	Assert(isValidZoneCoord(pZone, x, y));		Timeval currentTime;	getCurrentTime(currentTime);	// 林困俊 谎妨霖促.	GCAddEffect gcAddEffect;	gcAddEffect.setObjectID(pCreature->getObjectID());	for(list<Effect*>::const_iterator itr = m_Effects.begin(); itr != m_Effects.end(); itr++) 	{		Effect* pEffect = *itr;		if (pEffect->isBroadcastingEffect())		{			EffectID_t EffectID = pEffect->getSendEffectClass();			gcAddEffect.setEffectID(EffectID);			// 单靛扼牢苞 泅犁 矫埃阑 哗辑 巢篮 矫埃阑 朝妨拎具 茄促.			Timeval DeadLine = (*itr)->getDeadline();			Turn_t Duration = DeadLine.tv_sec - currentTime.tv_sec;			if (EffectID == Effect::EFFECT_CLASS_BLOOD_DRAIN) 			{				// Duration 朝酒啊绰 巴捞 WORD 屈栏肺 朝酒啊绰单,				// 2官捞飘扼辑 软趋 矫埃 鞍篮 版快俊绰 呈公 辨绢				// 坷滚敲肺快啊 老绢唱霸 等促.				// 弊贰辑 促弗 捞棋飘 鞍篮 版快俊绰 10阑 蚌秦辑 朝府瘤父, 				// 软趋 捞棋飘绰 10阑 蚌秦辑 朝府瘤 臼绰促.				gcAddEffect.setDuration(Duration);			} 			else 			{				gcAddEffect.setDuration(Duration*10);			}			pZone->broadcastPacket(x, y, &gcAddEffect);		}	}	__END_PROFILE_EM( "SEND_EFFECT_INFO" );	__END_DEBUG	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectManager::addEffect (Effect* pEffect)      throw (){	__BEGIN_TRY	Assert(pEffect != NULL);	m_Effects.push_back(pEffect);	__END_CATCH}	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*int EffectManager::heartbeat ()      throw (Error){	__BEGIN_TRY	__END_DEBUG	int rvalue = 0;	Timeval currentTime;	getCurrentTime(currentTime);	list<Effect*>::iterator before  = m_Effects.end();	list<Effect*>::iterator current = m_Effects.begin();	while (current != m_Effects.end()) 	{		Assert(*current != NULL);		Effect* pEffect = *current;				// 捞棋飘啊 expire 登菌栏搁 昏力茄促.		if (currentTime > pEffect->getDeadline()) 		{			if (before == m_Effects.end()) 			{				// first effect				m_Effects.erase(current);				current = m_Effects.begin();			} 			else 			{				// !first effect				m_Effects.erase(current);				current = before;				current ++;			}			// *CAUTION			// EffectBlood Drain老 版快俊 风橇 档绰 巴阑 肛苗霖促.			// 恐? EffectBlood Drain救俊辑 Slayer狼 单捞磐啊 函屈登扁 锭巩俊.			// 促澜 Effect甫 贸府 窍搁辑 俺啊 瞪 荐档 乐促.			// 促澜俊 浇饭捞绢啊 登菌阑锭 唱赣瘤 捞棋飘甸篮 肺爹窍档废 茄促.			pEffect->unaffect();			SAFE_DELETE(pEffect);			rvalue++;		} 		else 		{			// expire 登瘤 臼篮 捞棋飘 吝俊,			// 促澜 affect 矫埃捞 登菌栏搁 affect茄促.			if (currentTime > pEffect->getNextTime()) 			{				pEffect->affect();			}			before = current ++;		}	}	return rvalue;	__BEGIN_DEBUG	__END_CATCH}*///////////////////////////////////////////////////////////////////////////////// 困狼 heartbeat尔 度鞍篮单// 矫埃阑 罐酒坷绰芭父 促福促. -_-;// getCurrentTime() 救 且妨绊.. 澜窍窍.. by sigi. 2002.5.8//////////////////////////////////////////////////////////////////////////////int EffectManager::heartbeat (const Timeval& currentTime)     throw (Error){	__BEGIN_TRY	__END_DEBUG	int rvalue = 0;	__BEGIN_PROFILE_EM( "EM_HEARTBEAT" );	list<Effect*>::iterator before  = m_Effects.end();	list<Effect*>::iterator current = m_Effects.begin();	while (current != m_Effects.end()) 	{		Assert(*current != NULL);		Effect* pEffect = *current;		// by sigi. for debugging. 2002.12.23		m_LastEffectClass = (int)pEffect->getEffectClass();				// 捞棋飘啊 expire 登菌栏搁 昏力茄促.		if (currentTime > pEffect->getDeadline()) 		{			if (before == m_Effects.end()) 			{				// first effect				m_Effects.erase(current);				current = m_Effects.begin();			} 			else 			{				// !first effect				m_Effects.erase(current);				current = before;				current ++;			}			// *CAUTION			// EffectBlood Drain老 版快俊 风橇 档绰 巴阑 肛苗霖促.			// 恐? EffectBlood Drain救俊辑 Slayer狼 单捞磐啊 函屈登扁 锭巩俊.			// 促澜 Effect甫 贸府 窍搁辑 俺啊 瞪 荐档 乐促.			// 促澜俊 浇饭捞绢啊 登菌阑锭 唱赣瘤 捞棋飘甸篮 肺爹窍档废 茄促.			// 捞亥飘 扁馆栏肺 官层辑 风橇 档绰芭 救 肛苗档 登霸 荐沥沁促. -_-			pEffect->unaffect();			SAFE_DELETE(pEffect);			rvalue++;		} 		else 		{			// expire 登瘤 臼篮 捞棋飘 吝俊,			// 促澜 affect 矫埃捞 登菌栏搁 affect茄促.			if (currentTime > pEffect->getNextTime()) 			{				pEffect->affect();			}			before = current ++;		}	}	__END_PROFILE_EM( "EM_HEARTBEAT" );	return rvalue;	__BEGIN_DEBUG	__END_CATCH}

⌨️ 快捷键说明

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