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

📄 acidswamp.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : AcidSwamp.cpp// Written by  : excel96// Description : //////////////////////////////////////////////////////////////////////////////#include "AcidSwamp.h"#include "EffectAcidSwamp.h"#include "RankBonus.h"#include "Gpackets/GCSkillToTileOK1.h"#include "Gpackets/GCSkillToTileOK2.h"#include "Gpackets/GCSkillToTileOK3.h"#include "Gpackets/GCSkillToTileOK4.h"#include "Gpackets/GCSkillToTileOK5.h"#include "Gpackets/GCSkillToTileOK6.h"#include "Gpackets/GCAddEffect.h"//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void AcidSwamp::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID)    throw(Error){    __BEGIN_TRY	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << "begin " << endl;	Assert(pVampire != NULL);	Assert(pVampireSkillSlot != NULL);    try    {		Zone* pZone = pVampire->getZone();		Assert(pZone != NULL);		Creature* pTargetCreature = pZone->getCreature(TargetObjectID);		//Assert(pTargetCreature != NULL);		// NPC绰 傍拜且 荐啊 绝促.		if (pTargetCreature==NULL	// NoSuch力芭 锭巩俊.. by sigi. 2002.5.2			|| pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) // by sigi. 2002.10.30			|| pTargetCreature->isNPC())		{			executeSkillFailException(pVampire, getSkillType());			//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl;			return;		}		execute(pVampire, pTargetCreature->getX(), pTargetCreature->getY(), pVampireSkillSlot, CEffectID);    } 	catch (Throwable & t) 	{		executeSkillFailException(pVampire, getSkillType());        //cout << t.toString() << endl;    }	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl;    __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢 鸥老 勤甸矾//////////////////////////////////////////////////////////////////////////////void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID)	throw(Error){	__BEGIN_TRY	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << "begin " << endl;	try 	{		Player* pPlayer = pVampire->getPlayer();		Zone* pZone = pVampire->getZone();		Assert(pPlayer != NULL);		Assert(pZone != NULL);		GCSkillToTileOK1 _GCSkillToTileOK1;		GCSkillToTileOK2 _GCSkillToTileOK2;		GCSkillToTileOK3 _GCSkillToTileOK3;		GCSkillToTileOK4 _GCSkillToTileOK4;		GCSkillToTileOK5 _GCSkillToTileOK5;		GCSkillToTileOK6 _GCSkillToTileOK6;		SkillType_t SkillType  = pVampireSkillSlot->getSkillType();		SkillInfo*  pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType);		// Knowledge of Acid 啊 乐促搁 hit bonus 10		int HitBonus = 0;		if ( pVampire->hasRankBonus( RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID ) )		{			RankBonus* pRankBonus = pVampire->getRankBonus( RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID );			Assert( pRankBonus != NULL );			HitBonus = pRankBonus->getPoint();		}		int  RequiredMP  = decreaseConsumeMP(pVampire, pSkillInfo);		bool bManaCheck  = hasEnoughMana(pVampire, RequiredMP);		bool bTimeCheck  = verifyRunTime(pVampireSkillSlot);		bool bRangeCheck = verifyDistance(pVampire, X, Y, pSkillInfo->getRange());		bool bHitRoll    = HitRoll::isSuccessMagic(pVampire, pSkillInfo, pVampireSkillSlot, HitBonus);		bool bTileCheck = false;		VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1);		if (rect.ptInRect(X, Y))		{			Tile& tile = pZone->getTile(X, Y);			if (tile.canAddEffect()) bTileCheck = true;			// 赣矫 弊扼款靛 乐澜 眠啊 给茄寸.			if ( tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL ) bTileCheck=false;			if ( tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL ) bTileCheck=false;		}		if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck)		{			decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1);			Tile&   tile  = pZone->getTile(X, Y);			Range_t Range = 1;	// 亲惑 1捞促.						// 鞍篮 捞棋飘啊 捞固 粮犁茄促搁 昏力茄促.			Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ACID_SWAMP);			if (pOldEffect != NULL)			{				ObjectID_t effectID = pOldEffect->getObjectID();				pZone->deleteEffect(effectID);			}			checkMine( pZone, X, Y );						// 单固瘤客 瘤加 矫埃阑 拌魂茄促.			SkillInput input(pVampire);			SkillOutput output;			computeOutput(input, output);			// Wisdom of Swamp 啊 乐促搁 瘤加矫埃 20% 刘啊			if ( pVampire->hasRankBonus( RankBonus::RANK_BONUS_WISDOM_OF_SWAMP ) )			{				RankBonus* pRankBonus = pVampire->getRankBonus( RankBonus::RANK_BONUS_WISDOM_OF_SWAMP );				Assert( pRankBonus != NULL );				output.Duration += getPercentValue( output.Duration, pRankBonus->getPoint() );			}			// 捞棋飘 坷宏璃飘甫 积己茄促.			EffectAcidSwamp* pEffect = new EffectAcidSwamp(pZone, X, Y);			pEffect->setUserObjectID( pVampire->getObjectID() );			pEffect->setDeadline(output.Duration);			pEffect->setNextTime(0);			pEffect->setTick(output.Tick);			pEffect->setDamage(output.Damage);			pEffect->setLevel(pSkillInfo->getLevel()/2);			pEffect->setVampire();			if ( tile.hasCreature( Creature::MOVE_MODE_WALKING ) )			{				pEffect->setWalkingTargetObjectID( tile.getCreature( Creature::MOVE_MODE_WALKING )->getObjectID() );			}			if ( tile.hasCreature( Creature::MOVE_MODE_BURROWING ) )			{				pEffect->setBurrowingTargetObjectID( tile.getCreature( Creature::MOVE_MODE_BURROWING )->getObjectID() );			}			// 鸥老俊 嘿篮 捞棋飘绰 OID甫 罐酒具 茄促.			ObjectRegistry & objectregister = pZone->getObjectRegistry();			objectregister.registerObject(pEffect);					// 粮 棺 鸥老俊促啊 捞棋飘甫 眠啊茄促.			pZone->addEffect(pEffect);				tile.addEffect(pEffect);			// 鸥老 困俊 农府媚啊 乐促搁 官肺 康氢阑 林档废 茄促.			bool bEffected = false;			Creature* pTargetCreature = NULL;			if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) 				pTargetCreature = tile.getCreature(Creature::MOVE_MODE_WALKING);			ZoneCoord_t myX = pVampire->getX();			ZoneCoord_t myY = pVampire->getY();			if (pTargetCreature != NULL)			{				if (pTargetCreature->isSlayer()||pTargetCreature->isOusters())				{					pEffect->affect();					bEffected = true;					Player* pTargetPlayer = pTargetCreature->getPlayer();					bool bCanSee = canSee(pTargetCreature, pVampire);					if (bCanSee)					{						_GCSkillToTileOK2.setObjectID(pVampire->getObjectID());						_GCSkillToTileOK2.setSkillType(SkillType);						_GCSkillToTileOK2.setX(X);						_GCSkillToTileOK2.setY(Y);						_GCSkillToTileOK2.setDuration(output.Duration);						_GCSkillToTileOK2.setRange(Range);						pTargetPlayer->sendPacket(&_GCSkillToTileOK2);					} 					else 					{						_GCSkillToTileOK6.setOrgXY(myX, myY);						_GCSkillToTileOK6.setSkillType(SkillType);						_GCSkillToTileOK6.setX(X);						_GCSkillToTileOK6.setY(Y);						_GCSkillToTileOK6.setDuration(output.Duration);						_GCSkillToTileOK6.setRange(Range);						pTargetPlayer->sendPacket(&_GCSkillToTileOK6);					}				}				else if (pTargetCreature->isMonster())				{					Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature);					pEffect->affect();					bEffected = true;					pMonster->addEnemy(pVampire);				}			}			_GCSkillToTileOK1.setSkillType(SkillType);			_GCSkillToTileOK1.setCEffectID(CEffectID);			_GCSkillToTileOK1.setX(X);			_GCSkillToTileOK1.setY(Y);			_GCSkillToTileOK1.setDuration(output.Duration);			_GCSkillToTileOK1.setRange(Range);					_GCSkillToTileOK3.setObjectID(pVampire->getObjectID());			_GCSkillToTileOK3.setSkillType(SkillType);			_GCSkillToTileOK3.setX(X);			_GCSkillToTileOK3.setY(Y);						_GCSkillToTileOK4.setSkillType(SkillType);			_GCSkillToTileOK4.setX(X);			_GCSkillToTileOK4.setY(Y);			_GCSkillToTileOK4.setDuration(output.Duration);			_GCSkillToTileOK4.setRange(Range);					_GCSkillToTileOK5.setObjectID(pVampire->getObjectID());			_GCSkillToTileOK5.setSkillType(SkillType);			_GCSkillToTileOK5.setX(X);			_GCSkillToTileOK5.setY(Y);			_GCSkillToTileOK5.setDuration(output.Duration);			_GCSkillToTileOK5.setRange(Range);			if (bEffected) 			{				_GCSkillToTileOK1.addCListElement(pTargetCreature->getObjectID());				_GCSkillToTileOK4.addCListElement(pTargetCreature->getObjectID());				_GCSkillToTileOK5.addCListElement(pTargetCreature->getObjectID());			}					pPlayer->sendPacket(&_GCSkillToTileOK1);					list<Creature*> cList;			cList.push_back(pVampire);			if (bEffected) cList.push_back(pTargetCreature);			cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList);			pZone->broadcastPacket(myX, myY,  &_GCSkillToTileOK3 , cList);			pZone->broadcastPacket(X, Y,  &_GCSkillToTileOK4 , cList);			pVampireSkillSlot->setRunTime(output.Delay);		} 		else 		{			executeSkillFailNormal(pVampire, getSkillType(), NULL);		}	}	catch (Throwable & t) 	{		executeSkillFailException(pVampire, getSkillType());		//cout << t.toString() << endl;	}	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl;	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 阁胶磐 鸥老 勤甸矾//////////////////////////////////////////////////////////////////////////////void AcidSwamp::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y)	throw(Error){	__BEGIN_TRY	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << "begin(monster) " << endl;	try 	{		Zone* pZone = pMonster->getZone();		Assert(pZone != NULL);		GCSkillToTileOK2 _GCSkillToTileOK2;		GCSkillToTileOK3 _GCSkillToTileOK3;		GCSkillToTileOK4 _GCSkillToTileOK4;		GCSkillToTileOK5 _GCSkillToTileOK5;		GCSkillToTileOK6 _GCSkillToTileOK6;		SkillType_t SkillType  = SKILL_ACID_SWAMP;		SkillInfo*  pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType);		bool bRangeCheck = verifyDistance(pMonster, X, Y, pSkillInfo->getRange());		bool bHitRoll    = HitRoll::isSuccessMagic(pMonster, pSkillInfo);		bool bTileCheck = false;		VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1);		if (rect.ptInRect(X, Y))		{			Tile& tile = pZone->getTile(X, Y);			if (tile.canAddEffect()) bTileCheck = true;			// 赣矫 弊扼款靛 乐澜 眠啊 给茄寸.			if ( tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL ) bTileCheck=false;		}		if (bRangeCheck && bHitRoll && bTileCheck)		{			if( rand() % 100 < 50 ) {				checkMine( pZone, X, Y );			}			Tile&   tile  = pZone->getTile(X, Y);			Range_t Range = 1;	// 亲惑 1捞促.						// 鞍篮 捞棋飘啊 捞固 粮犁茄促搁 昏力茄促.			Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ACID_SWAMP);			if (pOldEffect != NULL)			{				ObjectID_t effectID = pOldEffect->getObjectID();				pZone->deleteEffect(effectID);			}						// 单固瘤客 瘤加 矫埃阑 拌魂茄促.			SkillInput input(pMonster);			SkillOutput output;			computeOutput(input, output);					// 捞棋飘 坷宏璃飘甫 积己茄促.			EffectAcidSwamp* pEffect = new EffectAcidSwamp(pZone, X, Y);			pEffect->setUserObjectID( pMonster->getObjectID() );			pEffect->setDeadline(output.Duration);			pEffect->setNextTime(0);			pEffect->setTick(output.Tick);			pEffect->setDamage(output.Damage);			pEffect->setLevel(pSkillInfo->getLevel()/2);			// 鸥老俊 嘿篮 捞棋飘绰 OID甫 罐酒具 茄促.			ObjectRegistry & objectregister = pZone->getObjectRegistry();			objectregister.registerObject(pEffect);					// 粮 棺 鸥老俊促啊 捞棋飘甫 眠啊茄促.			pZone->addEffect(pEffect);				tile.addEffect(pEffect);			// 鸥老 困俊 农府媚啊 乐促搁 官肺 康氢阑 林档废 茄促.			bool bEffected = false;			Creature* pTargetCreature = NULL;			if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) 				pTargetCreature = tile.getCreature(Creature::MOVE_MODE_WALKING);			ZoneCoord_t myX = pMonster->getX();			ZoneCoord_t myY = pMonster->getY();			if (pTargetCreature != NULL)			{				if (pTargetCreature->isPC())				{					pEffect->affect();					Player* pTargetPlayer = pTargetCreature->getPlayer();					bool bCanSee = canSee(pTargetCreature, pMonster);					if (bCanSee)					{						_GCSkillToTileOK2.setObjectID(pMonster->getObjectID());						_GCSkillToTileOK2.setSkillType(SkillType);						_GCSkillToTileOK2.setX(X);						_GCSkillToTileOK2.setY(Y);						_GCSkillToTileOK2.setDuration(output.Duration);						_GCSkillToTileOK2.setRange(Range);						pTargetPlayer->sendPacket(&_GCSkillToTileOK2);					} 					else 					{						_GCSkillToTileOK6.setOrgXY(myX, myY);						_GCSkillToTileOK6.setSkillType(SkillType);						_GCSkillToTileOK6.setX(X);						_GCSkillToTileOK6.setY(Y);						_GCSkillToTileOK6.setDuration(output.Duration);						_GCSkillToTileOK6.setRange(Range);						pTargetPlayer->sendPacket(&_GCSkillToTileOK6);					}				}				else if (pTargetCreature->isMonster())				{					Monster* pTargetMonster = dynamic_cast<Monster*>(pTargetCreature);					pEffect->affect();					pTargetMonster->addEnemy(pMonster);				}			}			_GCSkillToTileOK3.setObjectID(pMonster->getObjectID());			_GCSkillToTileOK3.setSkillType(SkillType);			_GCSkillToTileOK3.setX(X);			_GCSkillToTileOK3.setY(Y);						_GCSkillToTileOK4.setSkillType(SkillType);			_GCSkillToTileOK4.setX(X);			_GCSkillToTileOK4.setY(Y);			_GCSkillToTileOK4.setDuration(output.Duration);			_GCSkillToTileOK4.setRange(Range);					_GCSkillToTileOK5.setObjectID(pMonster->getObjectID());			_GCSkillToTileOK5.setSkillType(SkillType);			_GCSkillToTileOK5.setX(X);			_GCSkillToTileOK5.setY(Y);			_GCSkillToTileOK5.setDuration(output.Duration);			_GCSkillToTileOK5.setRange(Range);			if (bEffected) 			{				_GCSkillToTileOK4.addCListElement(pTargetCreature->getObjectID());				_GCSkillToTileOK5.addCListElement(pTargetCreature->getObjectID());			}					list<Creature*> cList;			cList.push_back(pMonster);			if (bEffected) cList.push_back(pTargetCreature);			cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList);			pZone->broadcastPacket(myX, myY,  &_GCSkillToTileOK3 , cList);			pZone->broadcastPacket(X, Y,  &_GCSkillToTileOK4 , cList);		} 		else 		{			executeSkillFailNormal(pMonster, getSkillType(), NULL);		}	}	catch (Throwable & t) 	{		executeSkillFailException(pMonster, getSkillType());	}	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end(monster) " << endl;	__END_CATCH}AcidSwamp g_AcidSwamp;

⌨️ 快捷键说明

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