monstermanager.cpp

来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 2,206 行 · 第 1/5 页

CPP
2,206
字号
////////////////////////////////////////////////////////////////////////////////// Filename    : MonsterManager.h // Written By  : Reiot// Revised by  : 辫己刮// Description : ////////////////////////////////////////////////////////////////////////////////#include "MonsterManager.h"#include <stdlib.h>			// atoi()#include "Assert.h"#include "LogClient.h"#include "MonsterInfo.h"#include "ItemInfoManager.h"#include "Creature.h"#include "GamePlayer.h"#include "MonsterCorpse.h"#include "Tile.h"#include "Zone.h"#include "Player.h"#include "Monster.h"#include "OptionInfo.h"#include "Skull.h"#include "DB.h"#include "Treasure.h"#include "Thread.h"#include "ItemFactoryManager.h"#include "ZoneUtil.h"#include "CreatureUtil.h"#include "VariableManager.h"#include "MonsterNameManager.h"#include "MasterLairInfoManager.h"#include "LuckInfo.h"#include "ItemUtil.h"#include "EventItemUtil.h"#include "WarSystem.h"#include "Properties.h"#include "CastleInfoManager.h"#include "SweeperBonusManager.h"#include "skill/SummonGroundElemental.h"#include "EffectPacketSend.h"#include "ItemGradeManager.h"#include <fstream.h>#include "Gpackets/GCCreatureDied.h"#include "Gpackets/GCAddEffect.h"#include "Gpackets/GCAddEffectToTile.h"#include "Gpackets/GCDeleteObject.h"#include "Gpackets/GCSay.h"#include "Profile.h"#define __MONSTER_FIGHTING__extern bool isPotentialEnemy(Monster* pMonster, Creature* pCreature);//#define __PROFILE_MONSTER__#ifdef __PROFILE_MONSTER__	#define __BEGIN_PROFILE_MONSTER(name)	beginProfileEx(name);	#define __END_PROFILE_MONSTER(name)		endProfileEx(name);#else	#define __BEGIN_PROFILE_MONSTER(name)	((void)0);	#define __END_PROFILE_MONSTER(name)		((void)0);#endif////////////////////////////////////////////////////////////////////////////////// 蜡丰拳粮 酒捞袍 风泼犬伏 焊呈胶 欺季飘//////////////////////////////////////////////////////////////////////////////////const uint g_pVariableManager->getPremiumItemProbePercent() = 220;bool isLottoWinning();//////////////////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////////////////MonsterManager::MonsterManager (Zone* pZone) 	throw (Error){	__BEGIN_TRY			Assert(pZone != NULL);	m_pZone = pZone;	Assert(g_pCastleInfoManager!=NULL);	m_CastleZoneID = 0;	g_pCastleInfoManager->getCastleZoneID( m_pZone->getZoneID(), m_CastleZoneID );	m_nEventMonster = 0;	m_pEventMonsterInfo = NULL;	getCurrentTime(m_RegenTime);	__END_CATCH}//////////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////////MonsterManager::~MonsterManager () 	throw (){	__BEGIN_TRY	SAFE_DELETE(m_pEventMonsterInfo);	__END_CATCH}////////////////////////////////////////////////////////////////////////////////// load from database////////////////////////////////////////////////////////////////////////////////void MonsterManager::load ()	throw (Error){	__BEGIN_TRY	Statement* pStmt = NULL;	Result*    pResult = NULL;	string     text, eventText;	m_RICE_CAKE_PROB_RATIO[0] = 100;	m_RICE_CAKE_PROB_RATIO[1] = 33;	m_RICE_CAKE_PROB_RATIO[2] = 33;	m_RICE_CAKE_PROB_RATIO[3] = 33;	m_RICE_CAKE_PROB_RATIO[4] = 1;	m_SumOfCakeRatio = 0;	for (int i=0; i<5; i++)		m_SumOfCakeRatio += m_RICE_CAKE_PROB_RATIO[i];	// 捞固 乐促搁 扁粮狼 MonsterCounter甸阑 葛滴 瘤款促.	bool bReload = false;	hash_map< SpriteType_t, MonsterCounter* >::iterator iMC = m_Monsters.begin();	while (iMC!=m_Monsters.end())	{		MonsterCounter* pMC = iMC->second;		SAFE_DELETE(pMC);		iMC ++;		// m_Monsters啊 捞固 乐菌促搁 reload茄 巴捞促..扼绊 夯促. by sigi. 2002.9.19		bReload = true;	}	BEGIN_DB	{		pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();		pResult = pStmt->executeQuery(		"SELECT MonsterList, EventMonsterList from ZoneInfo WHERE ZoneID=%d", m_pZone->getZoneID());		if (pResult->getRowCount() <= 0) 		{			SAFE_DELETE(pStmt);//			throw Error("MonsterManager::load() : 粮捞 粮犁窍瘤 臼嚼聪促.");			return;		}		pResult->next();		text = pResult->getString(1);		eventText = pResult->getString(2);		SAFE_DELETE(pStmt);	}	END_DB(pStmt)	parseMonsterList( text, bReload );	parseEventMonsterList( eventText, bReload );	__END_CATCH}void MonsterManager::parseMonsterList(const string& text, bool bReload)	throw (Error){	if (text.size() <= 0) return;	//--------------------------------------------------------------------------------	//	// text 颇扼固磐绰 ZoneInfo 抛捞喉狼 Monsters (TEXT) 拿烦蔼阑 唱鸥辰促.	// 器杆篮 促澜苞 鞍促.	//	// (MonsterType1,#Monster1) (MonsterType2,#Monter2)(..,..)	// i            j         k i            j        k    	//	//--------------------------------------------------------------------------------		uint i = 0 , j = 0 , k = 0;	do 	{		// parse string		i = text.find_first_of('(',k);		j = text.find_first_of(',',i+1);		k = text.find_first_of(')',j+1);		if (i==string::npos || j==string::npos || k==string::npos			|| i > j || j > k) break;		// 阁胶磐 鸥涝苞 弥措 俺荐甫 备茄促. 阁胶磐 鸥涝苞 弥措 俺荐甫 备茄促.		uint monsterType = atoi(text.substr(i+1,j-i-1).c_str());		uint maxMonsters = atoi(text.substr(j+1,k-j-1).c_str());		Assert(maxMonsters > 0);		// 阁胶磐 牢器肺 何磐 Monster Sprite Type阑 罐酒柯促.		const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(monsterType);		SpriteType_t spriteType = pMonsterInfo->getSpriteType();		// 捞固 粮犁窍绰瘤狼 咯何甫 眉农茄促.		hash_map< SpriteType_t , MonsterCounter* >::iterator itr = m_Monsters.find(spriteType);		if (itr != m_Monsters.end()) 		{			WORD CurrentMaxCount = itr->second->getMaxMonsters();			WORD NewMaxCount = CurrentMaxCount + maxMonsters;			itr->second->setMaxMonsters(NewMaxCount);		} 		else 		{			// 阁胶磐墨款磐 按眉甫 积己, hash_map 俊 殿废茄促.			MonsterCounter* pMonsterCounter = new MonsterCounter(monsterType , maxMonsters, 0);			// 粮犁窍瘤 臼绰 版快, 眠啊茄促.			m_Monsters[spriteType] = pMonsterCounter;		}		//--------------------------------------------------------------------------------		// 秦寸窍绰 鸥涝狼 阁胶磐甫 粮俊 眠啊茄促.		//--------------------------------------------------------------------------------		if (!bReload) // reload啊 酒聪搁..		{			for (uint m = 0 ; m < maxMonsters ; m ++) 			{				// 粮狼 后 谅钎甫 茫酒辰促.				ZoneCoord_t x, y;				if (!findPosition(monsterType, x, y))				{					Assert(false);					return;				}				// 阁胶磐 按眉甫 积己窍绊 瓷仿摹 殿阑 檬扁拳茄促.				Monster* pMonster = new Monster(monsterType);				////////////////////////////////////////////////////////////////////////////////				// 岿靛呐 捞亥飘 包访(7岿 1老何磐绰 绝绢咙)				/*				if(rand()%g_pVariableManager->getEventRatio() == 0 &&						g_pVariableManager->getEventActivate() == 1)				{				  pMonster->setEventMonsterFlag(true);				  string MonsterName =  g_pMonsterNameManager->getRandomName(pMonster, true);				  pMonster->setName(MonsterName);				  //cout << "捞亥飘 阁胶磐 捞抚: " << pMonster->getName();				}				*/				///////////////////////////////////////////////////////////////////////////				Assert(pMonster != NULL);				try				{					m_pZone->addCreature(pMonster , x , y , Directions(rand() & 0x07));				}				catch (EmptyTileNotExistException&)				{					//cerr << "MonsterManager::load() : 磊府啊 绝匙?" << endl;					SAFE_DELETE(pMonster);				}			}		}	} while (k < text.size() - 1);}void MonsterManager::parseEventMonsterList(const string& text, bool bReload)	throw (Error){	if (text.size() <= 0) return;	//--------------------------------------------------------------------------------	//	// text 颇扼固磐绰 ZoneInfo 抛捞喉狼 Monsters (TEXT) 拿烦蔼阑 唱鸥辰促.	// 器杆篮 促澜苞 鞍促.	//	// (MonsterType1,#Monster1,RegenDelay) (MonsterType2,#Monter2,RegenDelay)(..,..)	// i            j         k          l i            j        k          l	//	//--------------------------------------------------------------------------------		uint i = 0 , j = 0 , k = 0, l = 0;	do 	{		// parse string		i = text.find_first_of('(',l);		j = text.find_first_of(',',i+1);		k = text.find_first_of(',',j+1);		l = text.find_first_of(')',k+1);		if (i==string::npos || j==string::npos || k==string::npos || l==string::npos			|| i > j || j > k || k > l) break;		// 阁胶磐 鸥涝苞 弥措 俺荐甫 备茄促. 阁胶磐 鸥涝苞 弥措 俺荐甫 备茄促.		uint monsterType = atoi(text.substr(i+1,j-i-1).c_str());		uint maxMonsters = atoi(text.substr(j+1,k-j-1).c_str());		uint regenDelay  = atoi(text.substr(k+1,l-k-1).c_str());		Assert(maxMonsters > 0);		//--------------------------------------------------------------------------------		// 秦寸窍绰 鸥涝狼 阁胶磐甫 粮俊 眠啊茄促.		//--------------------------------------------------------------------------------		if (!bReload) // reload啊 酒聪搁..		{			//cout << "[MM] load EventMonsterList: [" << m_pZone->getZoneID() << "] mtype=" << monsterType			//	<< ", maxMonsters=" << maxMonsters			//	<< ", regenDelay=" << regenDelay << endl;			if (m_pEventMonsterInfo==NULL)			{				m_pEventMonsterInfo = new vector<EventMonsterInfo>;				//m_pEventMonsterInfo->resize( maxMonsters );			}			/*			if (m_pEventMonsterInfo->size() + maxMonsters < m_pEventMonsterInfo->capacity())			{				m_pEventMonsterInfo->resize( m_pEventMonsterInfo->size() + maxMonsters );			}			*/			for (uint m = 0 ; m < maxMonsters ; m ++) 			{				if (g_pVariableManager->isActiveChiefMonster())				{					// 粮狼 后 谅钎甫 茫酒辰促.					ZoneCoord_t x, y;					if (!findPosition(monsterType, x, y))					{						Assert(false);						return;					}					// 阁胶磐 按眉甫 积己窍绊 瓷仿摹 殿阑 檬扁拳茄促.					Monster* pMonster = new Monster(monsterType);					Assert(pMonster != NULL);					pMonster->setEventMonsterIndex( m_nEventMonster++ );					EventMonsterInfo info;					info.monsterType = monsterType;					info.regenDelay = regenDelay;					info.bExist = true;					m_pEventMonsterInfo->push_back( info );					try					{						m_pZone->addCreature(pMonster , x , y , Directions(rand() & 0x07));					}					catch (EmptyTileNotExistException&)					{						//cerr << "MonsterManager::load() : 磊府啊 绝匙?" << endl;						SAFE_DELETE(pMonster);					}				}				else				{					m_nEventMonster++;					EventMonsterInfo info;					info.monsterType = monsterType;					info.regenDelay = regenDelay;					getCurrentTime( info.regenTime );					info.bExist = false;					m_pEventMonsterInfo->push_back( info );				}			}		}	} while (l < text.size() - 1);}////////////////////////////////////////////////////////////////////////////////void MonsterManager::addCreature (Creature* pCreature)	throw (DuplicatedException , Error){	__BEGIN_TRY	Monster* pMonster = dynamic_cast<Monster*>(pCreature);	// 农府贸 秦浆甘俊 眠啊茄促.	CreatureManager::addCreature(pMonster);	// event monster绰 MonsterCounter俊 甸绢啊瘤 臼霸 茄促. by sigi. 2002.10.14	if (m_pEventMonsterInfo!=NULL 		&& pMonster->isEventMonster())	{		uint index = pMonster->getEventMonsterIndex();		if (index < m_pEventMonsterInfo->size())		{			EventMonsterInfo& info = (*m_pEventMonsterInfo)[index];			getCurrentTime( info.regenTime );			info.regenTime.tv_sec += info.regenDelay;			info.bExist = true;		}		//cout << "[MM] add EventMonster: [" << pMonster->getEventMonsterIndex()		//	<< "] = " << info.monsterType << ", delay = " << info.regenDelay << endl;		return;	}	// 弊繁 阁胶磐 鸥涝捞 粮俊 粮犁且 荐 乐绰瘤 眉农茄促.	hash_map< SpriteType_t , MonsterCounter* >::iterator itr = m_Monsters.find(pMonster->getSpriteType());	if (itr == m_Monsters.end()) 	{		StringStream msg;		msg << "泅犁 粮俊 粮犁且 荐 绝绰 鸥涝狼 阁胶磐啊 眠啊登菌嚼聪促.\n" 			<< "泅犁 粮篮 [" << m_pZone->getZoneID() << "]涝聪促.\n"			<< "眠啊窍妨绊 茄 阁胶磐狼 鸥涝篮 [" << pMonster->getMonsterType() << "]涝聪促.\n";		//throw Error(msg.toString());	}	else	{ 		// 阁胶磐 墨款磐甫 刘啊矫挪促.		itr->second->addMonster();	}	__END_CATCH}

⌨️ 快捷键说明

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