📄 masterlairmanager.cpp
字号:
////////////////////////////////////////////////////////////////////////////////// Filename : MasterLairManager.h // Written By : 江// Description : ////////////////////////////////////////////////////////////////////////////////#include "MasterLairManager.h"#include "MasterLairInfoManager.h"#include "Assert.h"#include "Zone.h"#include "VariableManager.h"#include "Timeval.h"#include "Monster.h"#include "MonsterManager.h"#include "PlayerCreature.h"#include "Inventory.h"#include "PCManager.h"#include "Item.h"#include "ItemUtil.h"#include "ItemFactoryManager.h"#include "EffectMasterLairPass.h"#include "EffectContinualGroundAttack.h"#include "PacketUtil.h"#include "Player.h"#include "MonsterCorpse.h"#include "ZoneInfoManager.h"#include "ZoneGroupManager.h"#include "StringPool.h"#include "Gpackets/GCNoticeEvent.h"#include "Gpackets/GCSystemMessage.h"#include "Gpackets/GCCreateItem.h"#include "Gpackets/GCAddEffect.h"#include "Gpackets/GCSay.h"#include <stdio.h>//////////////////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////////////////MasterLairManager::MasterLairManager (Zone* pZone) throw (Error){ __BEGIN_TRY Assert(pZone != NULL); m_pZone = pZone; MasterLairInfo* pInfo = g_pMasterLairInfoManager->getMasterLairInfo( m_pZone->getZoneID() ); Assert(pInfo!=NULL); m_MasterID = 0; // 付胶磐 茄 付府 m_MasterX = 0; m_MasterY = 0; m_bMasterReady = false; // 付胶磐啊 轿匡 霖厚啊 登菌唱? //m_nMaxSummonMonster = pInfo->getMaxSummonMonster(); // 付胶磐啊 家券且 弥措狼 阁胶磐 荐 //m_nSummonedMonster = 0; m_nMaxPassPlayer = pInfo->getMaxPassPlayer(); // 弥措 免涝 啊瓷磊 荐 m_nPassPlayer = 0; m_Event = EVENT_WAITING_REGEN; m_EventValue = 0; Timeval currentTime; getCurrentTime(currentTime); // 狼固绝寸. - -; m_EventTime.tv_sec = currentTime.tv_sec + pInfo->getFirstRegenDelay(); m_EventTime.tv_usec = 0; m_RegenTime.tv_sec = currentTime.tv_sec + pInfo->getFirstRegenDelay(); m_RegenTime.tv_usec = 0; m_Mutex.setName("MasterLairManager"); //cout << "Init MasterLairManager: zoneID=" << (int)m_pZone->getZoneID() << endl; __END_CATCH}//////////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////////MasterLairManager::~MasterLairManager () throw (){ __BEGIN_TRY __END_CATCH} //////////////////////////////////////////////////////////////////////////////////// enterCreature ( Creature* )////////////////////////////////////////////////////////////////////////////////////// Creature啊 捞 Zone(MasterLair)俊 甸绢棵 荐 乐绰瘤 眉农窍绊// 甸绢棵 荐 乐促搁 甸绢吭促绊 焊绊 眉农秦敌促.//// [炼扒]// - EVENT_WAITING_PLAYER, // EVENT_MINION_COMBAT, // EVENT_MASTER_COMBAT牢 版快父 甸绢棵 啊瓷己捞 乐促.// - EffectMasterLairPass啊 乐绊 泅犁 MasterLair狼 巴捞 嘎绰 版快绰 公炼扒 甸绢柯促.// - EVENT_WAITING_PLAYER啊 酒聪搁 给 甸绢柯促.// - 付胶磐啊 绝绰 版快 m_nPassPlayer >= m_nMaxPassPlayer牢 版快 给 甸绢咳//// 免涝 啊瓷茄 某腐磐俊霸绰 EffectMasterLairPass啊 绝促搁// - m_nPassPlayer甫 1刘啊矫虐绊 EffectMasterLairPass甫 嘿咯霖促.// - EffectMasterLairPass狼 瘤加 矫埃篮 EVENT_MASTER_COMBAT捞 场唱绰 矫埃鳖瘤捞促.//////////////////////////////////////////////////////////////////////////////////bool MasterLairManager::enterCreature(Creature* pCreature) throw(Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) if (pCreature->isDM() || pCreature->isGOD()) { m_Mutex.unlock(); goto ENTER_OK; } if (m_Event!=EVENT_WAITING_PLAYER && m_Event!=EVENT_MINION_COMBAT && m_Event!=EVENT_MASTER_COMBAT) { //cout << "[" << (int)m_pZone->getZoneID() << "] MasterLairManager: 瘤陛篮 甸绢哎 荐 绝绰 葛靛" << endl; m_Mutex.unlock(); return false; } EffectMasterLairPass* pPassEffect = NULL; // 泅犁 Zone狼 EffectMasterLairPass甫 爱绊 乐绰啊? if (pCreature->isFlag( Effect::EFFECT_CLASS_MASTER_LAIR_PASS )) { if (g_pVariableManager->isRetryMasterLair()) { Effect* pEffect = pCreature->getEffectManager()->findEffect( Effect::EFFECT_CLASS_MASTER_LAIR_PASS ); Assert(pEffect!=NULL); pPassEffect = dynamic_cast<EffectMasterLairPass*>(pEffect); if (pPassEffect->getZoneID()==m_pZone->getZoneID()) { //cout << "[" << (int)m_pZone->getZoneID() << "] MasterLairManager: " << pCreature->getName().c_str() << " has EffectPass" << endl; m_Mutex.unlock(); goto ENTER_OK; } // 促弗 Lair狼 Pass促. - -; //cout << "[" << (int)m_pZone->getZoneID() << "] MMasterLairManager: " << pCreature->getName().c_str() << " has Wrong EffectPass" << endl; } else { //cout << "[" << (int)m_pZone->getZoneID() << "] MMasterLairManager: " << pCreature->getName().c_str() << " can't enter more" << endl; m_Mutex.unlock(); return false; } } // 甸绢棵 荐 绝绰 版快 if (m_Event!=EVENT_WAITING_PLAYER) { //cout << "[" << (int)m_pZone->getZoneID() << "] MasterLairManager: Not WAITING_PLAYER: " // << m_pZone->getPCManager()->getSize() << " / " << m_nPassPlayer << "/" << m_nMaxPassPlayer << endl; m_Mutex.unlock(); return false; } //if (m_nPassPlayer >= m_nMaxPassPlayer) if (m_nPassPlayer >= g_pVariableManager->getVariable(MASTER_LAIR_PLAYER_NUM)) // by sigi. 2002.12.31 { //cout << "[" << (int)m_pZone->getZoneID() << "] MasterLairManager: Already Maximum Players: " //<< m_pZone->getPCManager()->getSize() << " / " << m_nPassPlayer << "/" << m_nMaxPassPlayer << endl; m_Mutex.unlock(); return false; } // 甸绢棵 荐 乐促绊 魄窜等 版快 m_nPassPlayer ++; if (pPassEffect==NULL) { pPassEffect = new EffectMasterLairPass(pCreature, m_pZone->getZoneID()); //cout << "[" << (int)m_pZone->getZoneID() << "] MasterLairManager: " << pCreature->getName().c_str() << " received EffectPass: " // << m_pZone->getPCManager()->getSize() << " / " << m_nPassPlayer << "/" << m_nMaxPassPlayer << endl; } else { pPassEffect->setZoneID( m_pZone->getZoneID() ); } pCreature->getEffectManager()->addEffect( pPassEffect ); pCreature->setFlag( Effect::EFFECT_CLASS_MASTER_LAIR_PASS ); __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCHENTER_OK : /* // Sniping 力芭 if (pCreature->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE)) { EffectManager* pEffectManager = pCreature->getEffectManager(); Assert(pEffectManager); pEffectManager->deleteEffect(pCreature, Effect::EFFECT_CLASS_INVISIBILITY); pCreature->removeFlag(Effect::EFFECT_CLASS_INVISIBILITY); } // Invisibility力芭 if (pCreature->isFlag(Effect::EFFECT_CLASS_INVISIBILITY)) { EffectManager* pEffectManager = pCreature->getEffectManager(); Assert(pEffectManager!=NULL); pEffectManager->deleteEffect(pCreature, Effect::EFFECT_CLASS_INVISIBILITY); pCreature->removeFlag(Effect::EFFECT_CLASS_INVISIBILITY); } */ if (m_Event==EVENT_MINION_COMBAT || m_Event==EVENT_MASTER_COMBAT) { Timeval currentTime; getCurrentTime(currentTime); int timeGap = m_EventTime.tv_sec - currentTime.tv_sec; GCNoticeEvent gcNoticeEvent; gcNoticeEvent.setCode( NOTICE_EVENT_MASTER_COMBAT_TIME ); gcNoticeEvent.setParameter( timeGap ); //m_pZone->broadcastPacket( &gcNoticeEvent ); pCreature->getPlayer()->sendPacket( &gcNoticeEvent ); } return true;}//////////////////////////////////////////////////////////////////////////////////// leaveCreature ( Creature* )////////////////////////////////////////////////////////////////////////////////////// WaitingPlayer惑怕捞搁 PassPlayer甫 窍唱 临咯霖促.//// 付胶磐 饭绢俊 促矫 甸绢哎 荐 绝绰 惑怕捞搁 EffectPass甫 绝局霖促.//////////////////////////////////////////////////////////////////////////////////bool MasterLairManager::leaveCreature(Creature* pCreature) throw(Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) if (pCreature->isDM() || pCreature->isGOD()) { m_Mutex.unlock(); return true; } // waiting player牢 版快父 箭磊甫 临牢促. if (m_Event==EVENT_WAITING_PLAYER) { if (m_nPassPlayer>0) m_nPassPlayer--; } // 唱埃 版快(磷篮 版快) 付胶磐 饭绢俊 促矫 倒酒棵 荐 绝绰 葛靛..啊 登绢乐促搁 // 唱哎 锭 EffectMasterLairPass甫 力芭茄促. if (!g_pVariableManager->isRetryMasterLair()) { if (pCreature->isFlag( Effect::EFFECT_CLASS_MASTER_LAIR_PASS )) { pCreature->getEffectManager()->deleteEffect( Effect::EFFECT_CLASS_MASTER_LAIR_PASS ); pCreature->removeFlag( Effect::EFFECT_CLASS_MASTER_LAIR_PASS ); } } __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH //cout << "[" << (int)m_pZone->getZoneID() << "] MasterLairManager: " << pCreature->getName().c_str() << " leaved: " // << m_pZone->getPCManager()->getSize() << " / " << m_nPassPlayer << "/" << m_nMaxPassPlayer << endl; return true;}//////////////////////////////////////////////////////////////////////////////////// heartbeat// ////////////////////////////////////////////////////////////////////////////////bool MasterLairManager::heartbeat() throw (Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) switch (m_Event) { case EVENT_WAITING_PLAYER : processEventWaitingPlayer(); break; case EVENT_MINION_COMBAT : processEventMinionCombat(); break; case EVENT_MASTER_COMBAT : processEventMasterCombat(); break; case EVENT_WAITING_KICK_OUT : processEventWaitingKickOut(); break; case EVENT_WAITING_REGEN : processEventWaitingRegen(); break; default : break; }; __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH return true;}//////////////////////////////////////////////////////////////////////////////////// process EventWaitingPlayer//////////////////////////////////////////////////////////////////////////////////void MasterLairManager::processEventWaitingPlayer() throw (Error){ __BEGIN_TRY Timeval currentTime; getCurrentTime(currentTime); // 措扁 矫埃捞 场唱搁.. // 付胶磐啊 阁胶磐甫 家券窍扁 窍扁 矫累茄促. if (currentTime >= m_EventTime) { // 付胶磐 饭绢啊 凯妨乐促绊 荤恩甸俊霸 舅妨霖促.// ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo( m_pZone->getZoneID() );// Assert(pZoneInfo!=NULL);// StringStream msg;// msg << "付胶磐 饭绢(" << pZoneInfo->getFullName().c_str() << ")啊 摧躯嚼聪促.";// char msg[50]; // sprintf( msg, g_pStringPool->c_str( STRID_MASTER_LAIR_CLOSED ), // pZoneInfo->getFullName().c_str() );// // string sMsg( msg );//// GCSystemMessage gcSystemMessage;// gcSystemMessage.setType(SYSTEM_MESSAGE_MASTER_LAIR);// gcSystemMessage.setMessage( sMsg );// g_pZoneGroupManager->broadcast( &gcSystemMessage ); GCNoticeEvent gcNoticeEvent; gcNoticeEvent.setCode(NOTICE_EVENT_MASTER_LAIR_CLOSED); gcNoticeEvent.setParameter( m_pZone->getZoneID() ); g_pZoneGroupManager->broadcast( &gcNoticeEvent ); // Minion苞狼 轿框 矫累 activeEventMinionCombat(); } else { int remainSec = m_EventTime.tv_sec - currentTime.tv_sec; // 1盒 付促 茄锅究 舅赴促. if (remainSec!=m_EventValue && remainSec!=0 && remainSec % 60 == 0) { // 付胶磐 饭绢啊 凯妨乐促绊 荤恩甸俊霸 舅妨霖促.// ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo( m_pZone->getZoneID() );// Assert(pZoneInfo!=NULL);// StringStream msg;// msg << "付胶磐 饭绢(" << pZoneInfo->getFullName().c_str() << ") 免涝 啊瓷 矫埃捞 "// << (remainSec/60) << "盒 巢疽嚼聪促.";// char msg[100]; // sprintf( msg, g_pStringPool->c_str( STRID_MASTER_LAIR_OPENING_COUNT_DOWN ), // pZoneInfo->getFullName().c_str(), // (int)(remainSec/60) );// // string sMsg( msg );//// GCSystemMessage gcSystemMessage;// gcSystemMessage.setType(SYSTEM_MESSAGE_MASTER_LAIR);// gcSystemMessage.setMessage( sMsg );// g_pZoneGroupManager->broadcast( &gcSystemMessage ); GCNoticeEvent gcNoticeEvent; gcNoticeEvent.setCode(NOTICE_EVENT_MASTER_LAIR_COUNT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -