📄 effectmanager.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 + -