monstermanager.cpp

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

CPP
2,206
字号
				&& currentTime >= info.regenTime)			{				//cout << i << " ";				MonsterType_t monsterType = info.monsterType;				// 粮狼 后 谅钎甫 茫酒辰促.				ZoneCoord_t x, y;				if (!findPosition(monsterType, x, y))				{					Assert(false);					return;				}				// 阁胶磐 按眉甫 积己窍绊 瓷仿摹 殿阑 檬扁拳茄促.				Monster* pMonster = new Monster(monsterType);				Assert(pMonster != NULL);				pMonster->setEventMonsterIndex( i );				try				{					m_pZone->addCreature(pMonster , x , y , Directions(rand()%8));				}				catch (EmptyTileNotExistException&)				{					//cerr << "MonsterManager::processCreatures() : 磊府啊 绝匙?" << endl;					SAFE_DELETE(pMonster);				}			}			/*			else			{				if (!info.bExist)					cout << "f ";				else					cout << "t ";			}			*/		}		//cout << endl;	}	__END_DEBUG	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////bool MonsterManager::findPosition(MonsterType_t monsterType, ZoneCoord_t& RX, ZoneCoord_t& RY) const	throw(){	__BEGIN_TRY	const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(monsterType);	int count = 0;	// 公茄 风橇牢单... 趣矫扼档 巩力啊 乐阑鳖?	while (true)	{		const BPOINT& pt = m_pZone->getRandomMonsterRegenPosition();		Tile& rTile = m_pZone->getTile(pt.x,pt.y);		// 1. 鸥老捞 喉废登绢 乐瘤 臼绊		// 2. 鸥老俊 器呕捞 粮犁窍瘤 臼栏哥,		// 3. 救傈瘤措啊 酒聪扼搁		if (!rTile.isBlocked(pMonsterInfo->getMoveMode()) && 			!rTile.hasPortal() && 			!(m_pZone->getZoneLevel(pt.x, pt.y) & SAFE_ZONE))		{			RX = pt.x;			RY = pt.y;			return true;		}		if (++count >= 300)		{			cerr << "MonsterManager::findPosition() : Max Count Exceeded" << endl;			throw ("MonsterManager::findPosition() : Max Count Exceeded");		}	}	// 困俊辑 公茄 风橇聪鳖, 咯扁鳖瘤 给 坷摆瘤?	return false;	__END_CATCH}////////////////////////////////////////////////////////////////////////////////// 磷篮 农府贸甫 贸府茄促.////////////////////////////////////////////////////////////////////////////////void MonsterManager::killCreature (Creature* pDeadCreature)	throw (Error){	__BEGIN_TRY	__BEGIN_DEBUG	Assert(pDeadCreature->isDead());	Zone* pZone = pDeadCreature->getZone();	Assert(m_pZone == pZone);	Monster* pDeadMonster = dynamic_cast<Monster*>(pDeadCreature);	ZoneCoord_t cx = pDeadMonster->getX();	ZoneCoord_t cy = pDeadMonster->getY();	// 磷菌栏聪鳖 快急鼻阑 拌魂秦霖促.	PrecedenceTable* pTable = pDeadMonster->getPrecedenceTable();		pTable->compute();	if ( pTable->getHostName() == "" )	{		// 酒公档 锭赴 逞捞 绝促搁 酒捞袍阑 救 持绰促.		pDeadMonster->setTreasure( false );	}	else	{		pDeadMonster->setHostName(pTable->getHostName());		pDeadMonster->setHostPartyID(pTable->getHostPartyID());	}	// 刚历 官蹿俊 静矾哆府扼绊, 捞棋飘甫 谎赴促.	GCAddEffect gcAddEffect;	gcAddEffect.setObjectID(pDeadCreature->getObjectID());	gcAddEffect.setEffectID(Effect::EFFECT_CLASS_COMA);	gcAddEffect.setDuration(0);	pZone->broadcastPacket(cx, cy, &gcAddEffect);	// 阁胶磐 力芭	Tile & tile = m_pZone->getTile(cx , cy);	tile.deleteCreature(pDeadMonster->getObjectID());	// 弊扼款靛 郡府膏呕篮 矫眉档 绝瘤氛	if ( pDeadMonster->getMonsterType() == GROUND_ELEMENTAL_TYPE )	{		GCDeleteObject* pGCDO = new GCDeleteObject;		pGCDO->setObjectID( pDeadMonster->getObjectID() );		EffectPacketSend* pEffectPacketSend = new EffectPacketSend( pDeadMonster->getZone(), pDeadMonster->getX(), pDeadMonster->getY() );		pEffectPacketSend->setPacket( pGCDO );		// 1檬 第俊 菩哦 焊郴具零~		pEffectPacketSend->setDeadline(10);		pDeadMonster->getZone()->registerObject( pEffectPacketSend );		pDeadMonster->getZone()->addEffect( pEffectPacketSend );		SAFE_DELETE( pDeadMonster );		return;	}	// 矫眉 按眉甫 积己窍绊, OID 甫 且寸罐绰促.	MonsterCorpse* pMonsterCorpse = new MonsterCorpse(pDeadMonster);	pMonsterCorpse->setHostName(pDeadMonster->getHostName());	pMonsterCorpse->setHostPartyID(pDeadMonster->getHostPartyID());	pMonsterCorpse->setQuestHostName( pTable->getQuestHostName() );	pMonsterCorpse->setLevel( (int)(pDeadMonster->getLevel()) );	pMonsterCorpse->setExp( (Exp_t)computeCreatureExp(pDeadMonster, BLOODDRAIN_EXP) );	pMonsterCorpse->setLastKiller( pDeadMonster->getLastKiller() );	// 磷篮 阁胶磐 辆幅俊 蝶扼辑 矫眉俊 酒捞袍阑 眠啊秦敌促.	addItem(pDeadMonster, pMonsterCorpse);	// by sigi. 2002.12.12	addCorpseToZone( pMonsterCorpse, m_pZone, cx, cy );	// 农府贸啊 磷菌促绊 林函俊 舅妨霖促.	GCCreatureDied gcCreatureDied;	gcCreatureDied.setObjectID(pDeadMonster->getObjectID());	m_pZone->broadcastPacket(cx , cy , &gcCreatureDied);	// 付胶磐牢 版快俊 磷栏搁辑 茄 付叼 窍绰芭.. by sigi. 2002.9.13	if (pDeadMonster->isMaster())	{		//MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo( pDeadMonster->getMonsterType() );		MasterLairInfo* pMasterLairInfo = g_pMasterLairInfoManager->getMasterLairInfo( pZone->getZoneID() );		if (pMasterLairInfo!=NULL			&& pMasterLairInfo->getMasterMonsterType()==pDeadMonster->getMonsterType())		{			GCSay gcSay;			gcSay.setObjectID( pDeadMonster->getObjectID() );			gcSay.setColor( MASTER_SAY_COLOR );			if (pDeadMonster->getLastHitCreatureClass() == Creature::CREATURE_CLASS_SLAYER)			{				gcSay.setMessage( pMasterLairInfo->getRandomMasterDeadSlayerSay() );			}			else			{				gcSay.setMessage( pMasterLairInfo->getRandomMasterDeadVampireSay() );			}			if (!gcSay.getMessage().empty())				pZone->broadcastPacket(cx, cy, &gcSay);		}	}	// 农府媚甫 昏力茄促.	SAFE_DELETE(pDeadMonster);	__END_DEBUG	__END_CATCH}////////////////////////////////////////////////////////////////////////////////// addCreature//// (x, y) 辟贸俊 // monsterType狼 Monster甫 num付府 眠啊茄促.////////////////////////////////////////////////////////////////////////////////voidMonsterManager::addMonsters(ZoneCoord_t x, ZoneCoord_t y, MonsterType_t monsterType, int num, const SUMMON_INFO& summonInfo, list<Monster*>* pSummonedMonsters){	TPOINT pt;	ClanType_t clanType = CLAN_VAMPIRE_MONSTER;	// default	// group 傈眉啊 鞍篮 clan	if (summonInfo.clanType==SUMMON_INFO::CLAN_TYPE_RANDOM_GROUP		|| summonInfo.clanType==SUMMON_INFO::CLAN_TYPE_GROUP)	{		clanType = summonInfo.clanID;//rand()%90+2;	}	// 粮狼 后 谅钎甫 茫酒辰促.	for (int i=0; i<num; i++)	{		pt = findSuitablePosition(m_pZone, x, y, Creature::MOVE_MODE_WALKING);		// 困摹甫 茫瘤 给沁芭唱, 救傈瘤措扼搁 眠啊且 荐 绝促.		if (pt.x == -1 || (m_pZone->getZoneLevel(pt.x, pt.y) & SAFE_ZONE))		{			return;		}		Monster* pMonster = NULL;		// 阁胶磐 按眉甫 积己窍绊 瓷仿摹 殿阑 檬扁拳茄促.		try {			pMonster = new Monster(monsterType);			//cout << "阁胶磐 眠啊" << endl;			// 家券等 阁胶磐啊 酒捞袍阑 啊瘤绰啊?			pMonster->setTreasure( summonInfo.hasItem );			////////////////////////////////////////////////////////////////////////////////			// 阁胶磐甫 眠啊窍绰 矫痢俊辑 捞亥飘 阁胶磐牢瘤 八荤甫 茄促.			//  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 << "捞亥飘 阁胶磐 捞抚: " << MonsterName;			}			*/			///////////////////////////////////////////////////////////////////////////			Assert(pMonster != NULL);			if (summonInfo.regenType==REGENTYPE_PORTAL)			{				// 趣矫 捞固 汲沥蹬乐阑瘤档 葛福绰 巴甸阑 力芭秦霖促.				pMonster->removeFlag( Effect::EFFECT_CLASS_HIDE );				pMonster->removeFlag( Effect::EFFECT_CLASS_INVISIBILITY );				pMonster->removeFlag( Effect::EFFECT_CLASS_TRANSFORM_TO_BAT );				pMonster->setFlag(Effect::EFFECT_CLASS_VAMPIRE_PORTAL);				pMonster->setMoveMode( Creature::MOVE_MODE_WALKING );			}			if (summonInfo.initHPPercent!=0)			{				int currentHP = pMonster->getHP(ATTR_CURRENT);				int MaxHP = currentHP * 100 / summonInfo.initHPPercent;				pMonster->setHP(MaxHP, ATTR_MAX);			}		} catch (OutOfBoundException& t) {			filelog("MonsterManagerBug.log", "addMonsters : %s", t.toString().c_str());			SAFE_DELETE(pMonster);			return;		} catch (NoSuchElementException& t) {			filelog("MonsterManagerBug.log", "addMonsters : %s", t.toString().c_str());			SAFE_DELETE(pMonster);			return;		}		try		{			m_pZone->addCreature(pMonster , pt.x , pt.y , Directions(rand()%8));			// SUMMON_INFO			if (summonInfo.clanType==SUMMON_INFO::CLAN_TYPE_RANDOM_EACH)			{				pMonster->setClanType( rand()%90+2 );			}			else			{				pMonster->setClanType( clanType );			}			//cout << "clanType=" << (int)pMonster->getClanType() << endl;			// 			if (summonInfo.canScanEnemy)			{				pMonster->setScanEnemy();				m_pZone->monsterScan(pMonster, pt.x, pt.y, pMonster->getDir());			}			else if (summonInfo.scanEnemy)			{				m_pZone->monsterScan(pMonster, pt.x, pt.y, pMonster->getDir());			}			if (pSummonedMonsters!=NULL)			{				pSummonedMonsters->push_back( pMonster );			}			}		catch (EmptyTileNotExistException&)		{			//cerr << "MonsterManager::processCreatures() : 磊府啊 绝匙?" << endl;			SAFE_DELETE(pMonster);		}	}}////////////////////////////////////////////////////////////////////////////////// 磷篮 阁胶磐俊霸辑 酒捞袍阑 积己茄促.////////////////////////////////////////////////////////////////////////////////void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorpse)	throw (Error){	__BEGIN_TRY	// 涅胶飘 酒捞袍 眠啊	if ( pDeadMonster->getQuestItem() != NULL )	{		pMonsterCorpse->addTreasure( pDeadMonster->getQuestItem() );		pDeadMonster->setQuestItem( NULL );	}	if ( g_pVariableManager->getVariable( PREMIUM_TRIAL_EVENT ) != 0 && pDeadMonster->getMonsterType() == 705 )	{		if ( rand()%100 < 30 )		{			int Num = 5 + (rand()%5); // 5~9			for ( int i=0; i<Num; ++i )			{				Item* pItem = g_pItemFactoryManager->createItem( Item::ITEM_CLASS_LUCKY_BAG, 3, list<OptionType_t>() );				pMonsterCorpse->addTreasure( pItem );			}		}	}	// 酒捞袍捞 救 唱坷绰 阁胶磐 眉农(==付胶磐 家券 阁胶磐)	// by sigi. 2002.9.2	if (!pDeadMonster->hasTreasure())		return;	MonsterType_t MonsterType = pDeadMonster->getMonsterType();	const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(MonsterType);	TreasureList* pTreasureList = NULL;	//----------------------------------------------------------------------	// 2002斥 眠籍 捞亥飘 酒捞袍	// 价祈捞 老沥 犬伏肺 唱柯 第俊绰 促弗 酒捞袍篮 唱坷瘤 臼酒具 茄促. 	//----------------------------------------------------------------------	bool isHarvestFestivalItemAppeared = false;	int  PartialSumOfCakeRatio = 0;	int  itemBonusPercent = 0;	if (g_pVariableManager->getHarvestFestivalItemRatio() > 0 &&  rand() % g_pVariableManager->getHarvestFestivalItemRatio() == 0) 	{		// 酒捞袍篮 5啊瘤 吝俊辑 唱棵 荐 乐促.		ITEM_TEMPLATE ricecake_template;		ricecake_template.NextOptionRatio = 0;		bool bOK = false;		int EventSelector = rand() % m_SumOfCakeRatio;		for (int i=0; i<5; i++)		{			PartialSumOfCakeRatio += m_RICE_CAKE_PROB_RATIO[i];			// 父距 Dice 规侥栏肺 利侩等促搁			if ( EventSelector < PartialSumOfCakeRatio)			{				if ( i == 0 )				{					if (pDeadMonster->getLastHitCreatureClass() == Creature::CREATURE_CLASS_SLAYER)					{						ricecake_template.ItemClass = Item::ITEM_CLASS_POTION;						ricecake_template.ItemType  = 11;					}					else					{						ricecake_template.ItemClass = Item::ITEM_CLASS_SERUM;						ricecake_template.ItemType  = 5;					}				}				else				{					// 喊					ricecake_template.ItemClass = Item::ITEM_CLASS_EVENT_STAR;					ricecake_template.ItemType = i + 7;				}				bOK = true;				break;			}		}		//cout << "捞亥飘 酒捞袍 积己"  << "[" << i >> "," << EventSelector << "]" << m_SumOfCakeRatio << endl 			 //<< "(" << ricecake_template.ItemClass << " " << ricecake_template.ItemType << ")" << endl;		if (bOK)		{			Item* pItem = g_pItemFactoryManager->createItem(ricecake_template.ItemClass,ricecake_template.ItemType, ricecake_template.OptionType);			Assert(pItem != NULL);			pMonsterCorpse->addTreasure(pItem);			isHarvestFestivalItemAppeared = true;		}	}	//----------------------------------------------------------------------	// 农府胶付胶 气磷 眠啊

⌨️ 快捷键说明

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