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

📄 blooddrain.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : BloodDrain.cpp// Written by  : elca@ewestsoft.com// Description ://////////////////////////////////////////////////////////////////////////////#include "BloodDrain.h"#include "EffectBloodDrain.h"#include "EffectPrecedence.h"#include "EffectDecreaseHP.h"#include "Gpackets/GCBloodDrainOK1.h"#include "Gpackets/GCBloodDrainOK2.h"#include "Gpackets/GCBloodDrainOK3.h"#include "Gpackets/GCStatusCurrentHP.h"#include "Gpackets/GCChangeDarkLight.h"#include "LogClient.h"//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID)	throw(Error){	__BEGIN_TRY	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin(vampire)" << endl;	Assert(pVampire != NULL);	try 	{		Player* pPlayer = pVampire->getPlayer();		Zone* pZone = pVampire->getZone();		Assert(pPlayer != NULL);		Assert(pZone != NULL);		Creature* pTargetCreature = pZone->getCreature(TargetObjectID);		//Assert(pTargetCreature != NULL);		// NPC绰 傍拜且 荐啊 绝促.		// 搁开 惑怕. by sigi. 2002.9.13		// 公利惑怕 眉农. by sigi.2002.9.5		// 磷篮 局绰 乔 弧 荐 绝促. by Sequoia.2003. 3. 20		if (pTargetCreature==NULL		// NoSuch 力芭. by sigi. 2002.5.2			|| pTargetCreature->isNPC()			|| pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_BLOOD_DRAIN)			|| pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)			|| pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)			|| pTargetCreature->isDead()		)		{			executeSkillFailException(pVampire, getSkillType());			//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(vampire)" << endl;			return;		}		GCBloodDrainOK1 _GCBloodDrainOK1;		GCBloodDrainOK2 _GCBloodDrainOK2;		GCBloodDrainOK3 _GCBloodDrainOK3;		Timeval CurrentTime;		getCurrentTime(CurrentTime);		bool bHitRoll    = HitRoll::isSuccessBloodDrain(pVampire, pTargetCreature);		bool bCanHit     = canHit(pVampire, pTargetCreature, SKILL_BLOOD_DRAIN);		bool bTimeCheck  = CurrentTime.tv_sec > 1 ? true : false;		bool bRangeCheck = verifyDistance(pVampire, pTargetCreature, 2);		bool bPK         = verifyPK(pVampire, pTargetCreature);		if (bHitRoll && bCanHit && bTimeCheck && bRangeCheck && bPK)		{			// 浇饭捞绢老 版快俊父 捞棋飘 坷宏璃飘甫 积己茄促.			if (pTargetCreature->isSlayer())			{				EffectBloodDrain* pEffectBloodDrain = new EffectBloodDrain(pTargetCreature);				pEffectBloodDrain->setLevel(pVampire->getLevel());				pEffectBloodDrain->setDeadline(BLOODDRAIN_DURATION);	// 3老??				pTargetCreature->addEffect(pEffectBloodDrain);				pEffectBloodDrain->create(pTargetCreature->getName());				_GCBloodDrainOK2.addShortData(MODIFY_EFFECT_STAT, Effect::EFFECT_CLASS_BLOOD_DRAIN);				// 鸥百捞 构电 敲贰弊绰 扒促.				pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN);				Slayer* pTargetSlayer = dynamic_cast<Slayer*>(pTargetCreature);				SLAYER_RECORD prev;				pTargetSlayer->getSlayerRecord(prev);				pTargetSlayer->initAllStat();				pTargetSlayer->sendRealWearingInfo();				pTargetSlayer->addModifyInfo(prev, _GCBloodDrainOK2);				// 肺弊甫 巢变促.				log(LOG_BLOODDRAINED, pTargetCreature->getName(), pVampire->getName());			}			// 酒快胶磐令狼 版快浚..... -_-; 力茄矫埃 绝绰 捞棋飘甫 积己茄促. 决剐洒 富秦 力茄矫埃捞 绝绰 扒 酒聪瘤父..//			else if ( pTargetCreature->isOusters() )//			{//				EffectBloodDrain* pEffectBloodDrain = new EffectBloodDrain(pTargetCreature);//				pEffectBloodDrain->setLevel(pVampire->getLevel());//				pTargetCreature->addEffect(pEffectBloodDrain);//				pEffectBloodDrain->create(pTargetCreature->getName());//				_GCBloodDrainOK2.addShortData(MODIFY_EFFECT_STAT, Effect::EFFECT_CLASS_BLOOD_DRAIN);////				// 鸥百捞 构电 敲贰弊绰 扒促.//				pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN);////				Sight_t oldSight = pTargetCreature->getSight();//				Sight_t newSight = pTargetCreature->getEffectedSight();////				if ( oldSight != newSight )//				{//					pTargetCreature->setSight(newSight);//					pZone->updateScan(pTargetCreature, oldSight, pTargetCreature->getSight());//					_GCBloodDrainOK2.addShortData(MODIFY_VISION, pTargetCreature->getSight());////					GCChangeDarkLight gcChangeDarkLight;//					gcChangeDarkLight.setDarkLevel(15);//					gcChangeDarkLight.setLightLevel(newSight);//					pTargetCreature->getPlayer()->sendPacket(&gcChangeDarkLight);//				}//			}			// 鸥百捞 构电 敲贰弊绰 扒促.			pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN);						// 棵副 版氰摹樊阑 拌魂茄促.			Exp_t Exp = computeCreatureExp(pTargetCreature, BLOODDRAIN_EXP);			int targetLevel = 0;			int targetMaxHP = 0;			// 其烙阑 棵妨霖促.			if (pTargetCreature->isSlayer()) 			{				//increaseFame(pVampire, Exp);				Slayer* pTargetSlayer  = dynamic_cast<Slayer*>(pTargetCreature);				targetLevel = pTargetSlayer->getHighestSkillDomainLevel();				targetMaxHP = pTargetSlayer->getHP(ATTR_MAX);			}			else if (pTargetCreature->isVampire()) 			{				//increaseFame(pVampire, Exp);				Vampire* pTargetVampire  = dynamic_cast<Vampire*>(pTargetCreature);				targetLevel = pTargetVampire->getLevel();				targetMaxHP = pTargetVampire->getHP(ATTR_MAX);			}			else if (pTargetCreature->isOusters()) 			{				//increaseFame(pOusters, Exp);				Ousters* pTargetOusters  = dynamic_cast<Ousters*>(pTargetCreature);				targetLevel = pTargetOusters->getLevel();				targetMaxHP = pTargetOusters->getHP(ATTR_MAX);			}			else if (pTargetCreature->isMonster())			{				Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature);				Timeval NextTurn = pMonster->getNextTurn();				Timeval DelayTurn;				DelayTurn.tv_sec = 4;				DelayTurn.tv_usec = 500000;				pMonster->addAccuDelay(DelayTurn);				pMonster->addEnemy(pVampire);				targetLevel = pMonster->getLevel();				targetMaxHP = pMonster->getHP(ATTR_MAX);			}			shareVampExp(pVampire, Exp, _GCBloodDrainOK1);			// 软趋阑 窍霸 登搁 软趋茄 荤恩狼 眉仿捞 棵扼埃促.			// Mephisto捞棋飘啊 吧妨乐栏搁 HP绰 救 棵扼埃促.			if (!pVampire->isFlag(Effect::EFFECT_CLASS_MEPHISTO))			{				HP_t HealPoint = (Exp==0? computeBloodDrainHealPoint(pTargetCreature, BLOODDRAIN_EXP) : Exp);				HP_t CurrentHP = pVampire->getHP();				HP_t MaxHP	   = pVampire->getHP(ATTR_MAX);				HP_t NewHP     = min((int)MaxHP , (int)CurrentHP + (int)HealPoint);				// 篮 单固瘤 包访 贸府甫 秦 霖促.				Silver_t newSilverDamage = max(0, (int)pVampire->getSilverDamage()-(int)HealPoint);				pVampire->saveSilverDamage(newSilverDamage);				_GCBloodDrainOK1.addShortData(MODIFY_SILVER_DAMAGE, newSilverDamage);				// 轨颇捞绢狼 HP甫 技泼茄促.				pVampire->setHP(NewHP);				GCStatusCurrentHP gcStatusCurrentHP;				gcStatusCurrentHP.setObjectID(pVampire->getObjectID());				gcStatusCurrentHP.setCurrentHP(NewHP);				pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcStatusCurrentHP, pVampire);				_GCBloodDrainOK1.addShortData(MODIFY_CURRENT_HP, NewHP);			}			// 软趋阑 寸茄 局绰 HP啊 临绢电促.			// 措惑捞 郴 饭骇焊促 臭促搁.. MaxHP狼 10~15% damage			// by sigi. 2002.9.14			int drainDamage = 0;			int myLevel = pVampire->getLevel();			if (targetLevel > myLevel)			{				drainDamage = targetMaxHP * (rand()%6+10) / 100;			}			else			{				// 饭骇 5瞒捞付促 1%究 歹~				int damagePercent = min(30, (rand()%6+10+(myLevel-targetLevel)));				drainDamage = targetMaxHP * damagePercent / 100;			}						if (drainDamage > 0)			{				//decreaseHP(pZone, pTargetCreature, drainDamage, pVampire->getObjectID()); 				EffectDecreaseHP* pEffect = new EffectDecreaseHP(pTargetCreature);				pEffect->setPoint(drainDamage);				pEffect->setDeadline( 20 );	// 2檬 饶				pEffect->setUserObjectID( pVampire->getObjectID() );				pTargetCreature->addEffect(pEffect);				pTargetCreature->setFlag(Effect::EFFECT_CLASS_DECREASE_HP);			}			// 软趋矫俊档 己氢 官柴			// by sigi. 2002.12.16			// EffectDecreaseHP俊辑 HP啊 粹酒辑 0捞 登绢具窍绰 版快啊 乐绢辑 			// EffectDecreaseHP::unaffect()肺 颗变促.			//computeAlignmentChange(pTargetCreature, drainDamage, pVampire, NULL, &_GCBloodDrainOK1);			_GCBloodDrainOK1.setObjectID(TargetObjectID);			_GCBloodDrainOK3.setObjectID(pVampire->getObjectID());			_GCBloodDrainOK3.setTargetObjectID (TargetObjectID);			pPlayer->sendPacket(&_GCBloodDrainOK1);			if (pTargetCreature != NULL && pTargetCreature->isPC()) 			{				Player* pTargetPlayer = pTargetCreature->getPlayer();				if (pTargetPlayer != NULL) 				{ 					_GCBloodDrainOK2.setObjectID(pVampire->getObjectID());					_GCBloodDrainOK2.addLongData(MODIFY_DURATION, BLOODDRAIN_DURATION);					pTargetPlayer->sendPacket(&_GCBloodDrainOK2);				}			}			list<Creature *> cList;			cList.push_back(pTargetCreature);			cList.push_back(pVampire);			pZone->broadcastPacket(pVampire->getX(), pVampire->getY(),  &_GCBloodDrainOK3 , cList);		}		else 		{			executeSkillFailNormal(pVampire, getSkillType(), pTargetCreature);		}	} 	catch (Throwable & t) 	{		executeSkillFailException(pVampire, getSkillType());	}	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(vampire)" << endl;	__END_CATCH}////////////////////////////////////////////////////////////////////////// BloodDrain::execute()////////////////////////////////////////////////////////////////////////void BloodDrain::execute(Monster* pMonster, Creature* pEnemy)	throw(Error){	__BEGIN_TRY	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin(monster)" << endl;	Assert(pMonster != NULL);	Assert(pEnemy != NULL);	bool bSuccess = false;	try 	{		Zone* pZone = pMonster->getZone();		Assert(pZone != NULL);		if (pMonster->isFlag(Effect::EFFECT_CLASS_HIDE))		{			//cout << "Monster cannot use skill while hiding." << endl;			//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(monster)" << endl;			return;

⌨️ 快捷键说明

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