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

📄 monster.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : Monster.cpp// Written By  : excel96// Description ://////////////////////////////////////////////////////////////////////////////#include "Monster.h"#include "MonsterInfo.h"#include "MonsterManager.h"#include "Slayer.h"#include "Vampire.h"#include "Ousters.h"#include "MonsterAI.h"#include "AbilityBalance.h"#include "Zone.h"#include "MonsterNameManager.h"#include "Effect.h"#include "PrecedenceTable.h"#include "MonsterFunctionObject.h"#include "CreatureUtil.h"#include "VariableManager.h"#include "StringPool.h"#include "Gpackets/GCAddMonster.h"#include "Gpackets/GCMove.h"#include "Gpackets/GCStatusCurrentHP.h"#include "Gpackets/GCSay.h"#include "skill/SkillHandlerManager.h"#include "skill/EffectParalyze.h"#include "skill/EffectDoom.h"#include "skill/EffectTransformToWolf.h"#include "skill/EffectTransformToBat.h"#include "skill/EffectPeace.h"#include "skill/SummonGroundElemental.h"#include "Profile.h"//#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//#ifdef __XMAS_EVENT_CODE__	const string SantaSpeech[] = {	"捞 赤籍甸, 惑寸茄 瘤侥阑 啊柳 仇甸捞菌焙!!!",	"档噶啊磊!!!",	"乔狼 己辑狼 弥饶狼 林牢篮 唱促!!!",	"钢蹲钢蹲~ O.o o.O",	"皋府 农府胶付胶!!",	"农府胶付胶俊 背雀绰 救 啊绊 构窍绰 芭具!!!",	"郴啊 磷阑 巴 鞍栏衬!!!",	"捞繁 肯寒茄 累傈捞 绢痘霸 甸挪 芭瘤???",	"风倒橇!!! 辉阑 惶酒辑 傍拜秦儿!!!",	"捞 赤籍甸 惑寸茄 角仿阑 啊柳 仇甸捞菌焙!!!",	"栏~~~ 馆靛矫 汗荐窍摆促!!!",	"酒具~ 酒颇. 弊父 锭妨.",	"具 绢叼啊..."};const string RudolfSpeech[] = {	"况快~ 况快~", 	"播惹~", 	"掺俊~", 	"农福福~", 	"隆臂骇~",	"港港",	"墨坷~",	"柄盎~ 柄盎~",	"兵醚~ 兵醚~",	"钢蹲~ 钢蹲~ O.O",};const int SantaSpeechMax = 13;const int RudolfSpeechMax = 10;//#endif//////////////////////////////////////////////////////////////////////////////// 阁胶磐 利 牢侥 包访 窃荐//////////////////////////////////////////////////////////////////////////////bool Monster::isRealEnemy(Creature* pEnemy)	throw (Error){	__BEGIN_TRY	Assert(pEnemy != NULL);	if ( m_pBrain == NULL ) return false;	Zone* pZone = pEnemy->getZone();	// 蜡飞篮 公矫	if (pEnemy->isFlag(Effect::EFFECT_CLASS_GHOST)		// 磷篮 仇篮 利栏肺 牢侥窍瘤 臼绰促.		|| pEnemy->isFlag(Effect::EFFECT_CLASS_COMA)		// 傍吝 傍拜阑 给窍搁 冠零 惑怕狼 利篮 利栏肺 牢侥窍瘤 臼绰促.		|| ( !m_pBrain->canAttackAir() && pEnemy->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT) )		// 胶唱捞俏 葛靛狼 利档 利栏肺 牢侥窍瘤 臼绰促.		|| !pEnemy->isFlag(Effect::EFFECT_CLASS_PARALYZE)	// 籍拳 吧府搁 焊牢促绊 窍磊			&& !pZone->isMasterLair()						// 付胶磐 饭绢俊辑绰 促 焊牢促. 2002.10.16.by sigi			&& (!isFlag(Effect::EFFECT_CLASS_OBSERVING_EYE) 					&& pEnemy->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE)			// 郴啊 叼郸飘 牢厚啊 绝绰 版快俊 牢厚历喉 惑怕狼 利档 利栏肺 牢侥窍瘤 臼绰促.				|| !isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) 					&& pEnemy->isFlag(Effect::EFFECT_CLASS_INVISIBILITY))		// 酒付霸捣 吧赴 仇澜 锭府搁 救 等促. 绢瞒乔 救 嘎绰促. 2003. 1. 2. by Sequoia		|| pEnemy->isFlag(Effect::EFFECT_CLASS_ARMAGEDDON)		// 救傈瘤措 郴何甫 给 焊搁 救傈瘤措 郴何俊 乐绰 利档 利栏肺 牢昏窍瘤 臼绰促.		|| ( !m_pBrain->canSeeSafeZone() && (pZone->getZoneLevel(pEnemy->getX(), pEnemy->getY()) & SAFE_ZONE) )		)	{		return false;	}	return true;	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////////////Monster::Monster (MonsterType_t monsterType)	throw () : m_MonsterType(monsterType){	__BEGIN_TRY	try {	const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(m_MonsterType);	// 捞悼 葛靛俊 措茄 汲沥	m_MoveMode = pMonsterInfo->getMoveMode();	// STR, DEX, INT绰 DB俊辑 肺爹窍咯 檬扁拳 矫挪促.	m_STR           = pMonsterInfo->getSTR();	m_DEX           = pMonsterInfo->getDEX();	m_INT           = pMonsterInfo->getINT();	m_Exp           = pMonsterInfo->getExp();	m_Moral         = pMonsterInfo->getMoral();	m_Delay         = pMonsterInfo->getDelay();	m_AttackDelay   = pMonsterInfo->getAttackDelay();	m_Sight         = pMonsterInfo->getSight();	m_MeleeRange    = pMonsterInfo->getMeleeRange();	m_MissileRange  = pMonsterInfo->getMissileRange();	m_AttackOrder	= pMonsterInfo->getAttackOrder();	// by sigi. 2002.9.2	m_bMaster       = pMonsterInfo->isMaster();	m_bTreasure     = pMonsterInfo->hasTreasure();	m_MonsterSummonStep	= 0;	Creature::CreatureClass CClass = getCreatureClass();	BASIC_ATTR              attr;	attr.nSTR   = m_STR;	attr.nDEX   = m_DEX;	attr.nINT   = m_INT;	attr.nLevel = pMonsterInfo->getLevel();	m_HP[ATTR_MAX]         = computeHP(CClass, &attr, pMonsterInfo->getEnhanceHP());	m_ToHit                = computeToHit(CClass, &attr, pMonsterInfo->getEnhanceToHit());	m_Defense              = computeDefense(CClass, &attr, pMonsterInfo->getEnhanceDefense());	m_Protection           = computeProtection(CClass, &attr, pMonsterInfo->getEnhanceProtection());	m_Damage[ATTR_CURRENT] = computeMinDamage(CClass, &attr, pMonsterInfo->getEnhanceMinDamage());	m_Damage[ATTR_MAX]     = computeMaxDamage(CClass, &attr, pMonsterInfo->getEnhanceMaxDamage());	// InitAllStat捞尔 咯扁波尔 绢蠢霸 曼老鳖? - 2002.5.14 全芒	if (monsterType == 358 || monsterType == 359 || monsterType == 360 || monsterType == 361)		m_HP[ATTR_MAX] = m_HP[ATTR_MAX] * 10;	if(monsterType>=371 && monsterType <= 375)	{		m_HP[ATTR_MAX] = 500;   // 5000栏肺 棱囚 乐促. 抛胶飘甫 困秦辑 临牢 巴		m_Defense = 50;		m_Protection = 20;	}	m_HP[ATTR_CURRENT]     = m_HP[ATTR_MAX];	m_SilverDamage         = 0;	// 促澜 贸府罐阑 畔阑 瘤沥茄促.	getCurrentTime(m_NextTurn);	m_NextTurn.tv_sec += rand() % 3;	m_NextTurn.tv_usec += rand() % 1000000;	if (m_NextTurn.tv_usec >= 1000000) m_NextTurn.tv_sec ++;	clearAccuDelay();	// AI 努贰胶甫 积己茄促.	uint aitype = pMonsterInfo->getAIType();	m_pBrain = new MonsterAI(this, aitype);	// Monster啊 粮俊 唱鸥唱绰 规过	switch (pMonsterInfo->selectRegenType())	{		case REGENTYPE_HIDE :			setFlag( Effect::EFFECT_CLASS_HIDE );			m_MoveMode = MOVE_MODE_BURROWING;		break;		case REGENTYPE_PORTAL :			// by sigi. 2002.9.6			setFlag(Effect::EFFECT_CLASS_VAMPIRE_PORTAL);		break;		case REGENTYPE_INVISIBLE :			setFlag( Effect::EFFECT_CLASS_INVISIBILITY );		break;		case REGENTYPE_BAT :			setFlag( Effect::EFFECT_CLASS_TRANSFORM_TO_BAT );			m_MoveMode = MOVE_MODE_FLYING;		break;		default :		break;	}	// 捞抚阑 汲沥茄促.	if (m_bMaster)		m_Name = pMonsterInfo->getHName();	else		m_Name = g_pMonsterNameManager->getRandomName(this);	getCurrentTime(m_LastSpeechTime);	switch (monsterType)	{		case 358:		case 359:			m_Name = g_pStringPool->getString( STRID_EVENT_SANTA_NAME );			break;		case 360:		case 361:			m_Name = g_pStringPool->getString( STRID_EVENT_WOLF_NAME );			break;		case 371:		case 372:			m_Name = g_pStringPool->getString( STRID_SLAYER_RELIC_SHRINE );			break;		case 374:	    case 375:			m_Name = g_pStringPool->getString( STRID_VAMPIRE_RELIC_SHRINE );			break;		default:			break;	}	if ( monsterType >= 660 && monsterType <= 669 ) m_Name = g_pStringPool->getString(STRID_ORE);	// 努罚 鸥涝阑 技泼茄促.	// by sigi. 2002.10.8	m_ClanType = pMonsterInfo->getClanType();//CLAN_VAMPIRE_MONSTER;	m_OwnerObjectID = 0;	m_HostName = "";	m_HostPartyID = 0;	// InitAllStat 窃荐俊 乐绰 何盒捞瘤父,	// InitAllStat 窃荐绰 公芭款 窃荐咯辑	// 埃窜洒 咯扁辑 官肺 历亲仿阑 技泼秦 霖促.	if(monsterType>=371 && monsterType<=375)	{		m_Resist[MAGIC_DOMAIN_NO_DOMAIN] = 0;		m_Resist[MAGIC_DOMAIN_POISON]    = 70;		m_Resist[MAGIC_DOMAIN_ACID]      = 60;		m_Resist[MAGIC_DOMAIN_CURSE]     = 100;		m_Resist[MAGIC_DOMAIN_BLOOD]     = 50;	}	else	{		m_Resist[MAGIC_DOMAIN_NO_DOMAIN] = 0;		m_Resist[MAGIC_DOMAIN_POISON]    = 50;		m_Resist[MAGIC_DOMAIN_ACID]      = 0;		m_Resist[MAGIC_DOMAIN_CURSE]     = 0;		m_Resist[MAGIC_DOMAIN_BLOOD]     = 0;	}	// 扁夯 effect甸阑 汲沥茄促. by sigi. 2002.9.13	pMonsterInfo->addDefaultEffects( this );			m_LastHitCreatureClass = CREATURE_CLASS_MAX;	m_isEventMonster = false;	// 绝绰霸 -1捞促.	m_RelicIndex = -1;	// 措面 给 框流捞绰 各篮 傲 RelicIndex甫 持绢啊瘤绊 给 框流捞霸 茄促.	if ( monsterType >= 660 && monsterType <= 669 )	{		m_RelicIndex = monsterType;	}	m_bScanEnemy = false;	m_NextScanTurn.tv_sec = 0;	m_NextScanTurn.tv_usec = 0;	m_pOldEnemy = NULL;	m_bEnemyLimit = false;	// 2002.10.14	if (pMonsterInfo->isNormalRegen())	{		m_EventMonsterIndex = 0xFFFF;	}	else	{		// 角力 index绰 寇何俊辑 汲沥秦具登瘤父,		// 家券等 阁胶磐牢 版快绰 咯扁辑 荤官荤官~ 老窜 汲沥秦敌促.		m_EventMonsterIndex = 0xF000 + rand()%0x0FFF;	}	setChief( pMonsterInfo->isChief() );	} catch (Throwable& t)	{		filelog("monsterCreateBug.txt", "%s", t.toString().c_str());		throw;	}	m_pQuestItem = NULL;#ifdef __UNDERWORLD__	m_bUnderWorld = false;#endif	m_LastKiller = 0;	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////Monster::~Monster()     throw (Error){	__BEGIN_TRY	SAFE_DELETE(m_pBrain);		__END_CATCH}SpriteType_t Monster::getSpriteType () const 	throw () { 	__BEGIN_TRY	return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getSpriteType(); 		__END_CATCH}Level_t Monster::getLevel () const 	throw () { 	__BEGIN_TRY	return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getLevel(); 		__END_CATCH}uint Monster::getBodySize () const 	throw () { 	__BEGIN_TRY	return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getBodySize(); 		__END_CATCH}Color_t Monster::getMainColor () const 	throw () { 	__BEGIN_TRY	return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getMainColor(); 		__END_CATCH}Color_t Monster::getSubColor () const 	throw () { 	__BEGIN_TRY	return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getSubColor(); 		__END_CATCH}MAlignment Monster::getAlignment () const 	throw () { 	__BEGIN_TRY	return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getAlignment(); 		__END_CATCH}//////////////////////////////////////////////////////////////////////////////// registerObject //////////////////////////////////////////////////////////////////////////////void Monster::registerObject ()	throw (Error){	__BEGIN_TRY	Assert(getZone() != NULL);	ObjectRegistry & OR = getZone()->getObjectRegistry();	__ENTER_CRITICAL_SECTION(OR)	OR.registerObject_NOLOCKED(this);	__LEAVE_CRITICAL_SECTION(OR)	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 阁胶磐 AI 啊 角青登绰 皋筋靛捞促. Zone::processZone () 俊辑 粮俊 粮犁// 窍绰 葛电 阁胶磐甫 iterating 秦啊搁辑 Monster::act() 皋筋靛甫 龋免茄促.//////////////////////////////////////////////////////////////////////////////void Monster::act(const Timeval& currentTime)	throw (Error){	__BEGIN_TRY	__BEGIN_DEBUG	// 泅犁 矫埃捞 促澜 畔焊促 累促搁, 酒流 粱 歹 扁促妨具 茄促.	// 弊犯瘤 臼栏搁, 咀记阑 秒茄促.	if (currentTime < m_NextTurn) return;		// 阶咯乐绰 掉饭捞啊 乐促搁 力芭秦具 茄促.	if (m_AccuDelay.tv_sec != 0 || m_AccuDelay.tv_usec != 0)	{		m_NextTurn.tv_sec  += m_AccuDelay.tv_sec;		m_NextTurn.tv_usec += m_AccuDelay.tv_usec;		clearAccuDelay();		return;	}	__BEGIN_PROFILE_MONSTER("M_VERIFY_ENEMIES");	// 弊悼救 肺弊酒眶窍芭唱 救傈瘤措 救栏肺	// 甸绢埃 PC啊 乐栏搁 利 府胶飘俊辑 昏力甫 茄促.	verifyEnemies(); 	__END_PROFILE_MONSTER("M_VERIFY_ENEMIES");	// AI啊 绝促搁...	if (m_pBrain==NULL)	{		// delay汲沥		Timeval delay;		delay.tv_sec  = 1;		delay.tv_usec = 500000;		addAccuDelay(delay);		return;	}	// Paralyze俊 吧妨乐促搁 框流老 荐啊 绝促.	if (isFlag(Effect::EFFECT_CLASS_PARALYZE) 		|| isFlag(Effect::EFFECT_CLASS_COMA) 		|| isFlag(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS)		|| isFlag(Effect::EFFECT_CLASS_SLEEP)		|| isFlag(Effect::EFFECT_CLASS_ARMAGEDDON)		|| isFlag(Effect::EFFECT_CLASS_TRAPPED)		|| isFlag(Effect::EFFECT_CLASS_EXPLOSION_WATER)	)	{		m_pBrain->setDelay(currentTime);		return;	}/*//#ifdef __XMAS_EVENT_CODE__		if (m_LastSpeechTime < currentTime && isEventMonster(this))	{		GCSay gcSay;		gcSay.setObjectID(getObjectID());		if (m_MonsterType == 358 || m_MonsterType == 359)		{			gcSay.setMessage(SantaSpeech[rand()%SantaSpeechMax]);		}		else if (m_MonsterType == 360 || m_MonsterType == 361)		{			gcSay.setMessage(RudolfSpeech[rand()%RudolfSpeechMax]);		}		else		{			Assert(false);		}		m_pZone->broadcastPacket(m_X, m_Y, &gcSay);		m_LastSpeechTime.tv_sec = currentTime.tv_sec + 30;		m_LastSpeechTime.tv_usec = currentTime.tv_usec;	}//#endif*/	// 利捞 乐促搁 利俊 蝶扼, 老访狼 青悼阑 秒茄促.	if (hasEnemy())	{		Creature* pEnemy = getPrimaryEnemy();		if (pEnemy!=NULL) 		{			__BEGIN_PROFILE_MONSTER("M_AI_DEAL");			m_pBrain->deal(pEnemy, currentTime);			__END_PROFILE_MONSTER("M_AI_DEAL");		}	}	else	{		// 见绢乐绰 版快 眉农		if (isFlag(Effect::EFFECT_CLASS_HIDE))		{			__BEGIN_PROFILE_MONSTER("M_UNBURROW");			const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(m_MonsterType);					if ((rand() & 0x0000007F) < pMonsterInfo->getUnburrowChance())			{				SkillHandler* pSkillHandler = g_pSkillHandlerManager->getSkillHandler(SKILL_UN_BURROW);				Assert(pSkillHandler != NULL);				pSkillHandler->execute(this);				// delay汲沥				Timeval delay;				delay.tv_sec  = 1;				delay.tv_usec = 500000;				addAccuDelay(delay);			}			else			{				// 见绢乐绰 悼救档 眉农 delay甫 敌促.				m_pBrain->setDelay(currentTime);

⌨️ 快捷键说明

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