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

📄 cureall.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : CureAll.cpp// Written by  : elca@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include "CureAll.h"#include "SimpleCureSkill.h"#include "Gpackets/GCSkillToObjectOK1.h"#include "Gpackets/GCSkillToObjectOK2.h"#include "Gpackets/GCSkillToObjectOK3.h"#include "Gpackets/GCSkillToObjectOK4.h"#include "Gpackets/GCSkillToObjectOK5.h"#include "Gpackets/GCSkillToSelfOK1.h"#include "Gpackets/GCSkillToSelfOK2.h"#include "EffectDoom.h"#include "EffectParalyze.h"#include "EffectSeduction.h"#include "CurePoison.h"#include "EffectPoison.h"#include "EffectYellowPoisonToCreature.h"#include "EffectDarkBluePoison.h"#include "EffectGreenStalker.h"#include "EffectBloodDrain.h"#include "EffectBlunting.h"#include "Gpackets/GCRemoveEffect.h"#include "Gpackets/GCStatusCurrentHP.h"#include "EffectAftermath.h"const uint CureAllBloodDrainLevel = 75;//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID)	throw(Error){	__BEGIN_TRY	Assert(pSlayer != NULL);	Assert(pSkillSlot != NULL);	SkillInput input(pSlayer, pSkillSlot);	SkillOutput output;	input.TargetType = SkillInput::TARGET_OTHER;	computeOutput(input, output);	SIMPLE_SKILL_INPUT param;	param.SkillType     = getSkillType();	param.SkillDamage   = output.Damage;	param.Delay         = output.Delay;	param.STRMultiplier = 1;	param.DEXMultiplier = 1;	param.INTMultiplier = 8;	param.Level         = CureAllBloodDrainLevel;	try 	{		Player* pPlayer = pSlayer->getPlayer();		Zone* pZone = pSlayer->getZone();		Assert(pPlayer != NULL);		Assert(pZone != NULL);		Creature* pTargetCreature = pZone->getCreature(TargetObjectID);		//Assert(pTargetCreature != NULL);		// NoSuch力芭. by sigi. 2002.5.2		// 浇饭捞绢 寇俊绰 摹丰且 荐啊 绝促.		if (pTargetCreature==NULL			|| pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) // by sigi. 2002.10.30			|| pTargetCreature->isSlayer() == false)		{			executeSkillFailException(pSlayer, param.SkillType);			return;		}		SkillInfo*        pSkillInfo = g_pSkillInfoManager->getSkillInfo(param.SkillType);		SkillDomainType_t DomainType = pSkillInfo->getDomainType();		Level_t 		  SkillLevel = pSkillSlot->getExpLevel();		GCSkillToObjectOK1 _GCSkillToObjectOK1;		GCSkillToObjectOK2 _GCSkillToObjectOK2;		GCSkillToObjectOK3 _GCSkillToObjectOK3;		GCSkillToObjectOK4 _GCSkillToObjectOK4;		GCSkillToObjectOK5 _GCSkillToObjectOK5;		bool bHPCheck = false;		// 眉仿捞 粹芭唱, 软趋阑 寸茄 惑怕咯具 茄促.		Slayer* pTargetSlayer = dynamic_cast<Slayer*>(pTargetCreature);		Assert(pTargetSlayer != NULL);		EffectBloodDrain* pEffectBloodDrain = NULL;		bool bEffected  = false; // 酒公 历林唱 吧妨 乐栏搁 囊促.		if (pTargetSlayer->getHP(ATTR_CURRENT) < pTargetSlayer->getHP(ATTR_MAX))		{			bHPCheck = true;		}		if (pTargetSlayer->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN))		{			Effect* pEffect = pTargetSlayer->findEffect(Effect::EFFECT_CLASS_BLOOD_DRAIN);			pEffectBloodDrain = dynamic_cast<EffectBloodDrain*>(pEffect);			Assert(pEffectBloodDrain != NULL);			if (pEffectBloodDrain->getLevel() < CureAllBloodDrainLevel) bHPCheck = true;			bEffected = true;		}		int  RequiredMP  = (int)pSkillInfo->getConsumeMP();		bool bManaCheck  = hasEnoughMana(pSlayer, RequiredMP);		bool bTimeCheck  = verifyRunTime(pSkillSlot);		bool bRangeCheck = verifyDistance(pSlayer, pTargetCreature, pSkillInfo->getRange());		bool bHitRoll    = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot);		bool bDoom      = false;		bool bBlunting	= false;		bool bParalyze  = false;		bool bSeduction = false;		EffectDoom*      pEffectDoom     = NULL;		EffectBlunting*  pEffectBlunting = NULL;		EffectParalyze*  pEffectParalyze = NULL;		EffectSeduction* pEffectSeduction = NULL;		// 历林 拌凯 秦家		if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_DOOM)) 		{			pEffectDoom = (EffectDoom*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_DOOM);			Assert(pEffectDoom != NULL);			bDoom = HitRoll::isSuccessRemoveCurse(50, SkillLevel, 10, pEffectDoom->getLevel(), 10);			bEffected = true;			bHPCheck = true;		}		if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_BLUNTING)) 		{			pEffectBlunting = (EffectBlunting*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_BLUNTING);			Assert(pEffectBlunting != NULL);			bBlunting = HitRoll::isSuccessRemoveCurse(50, SkillLevel, 15, pEffectBlunting->getLevel(), 10);			bEffected = true;			bHPCheck = true;		}		if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_PARALYZE)) 		{			pEffectParalyze = (EffectParalyze*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_PARALYZE);			Assert(pEffectParalyze != NULL);			bParalyze = HitRoll::isSuccessRemoveCurse(50, SkillLevel, 20, pEffectParalyze->getLevel(), 10);			bEffected = true;			bHPCheck = true;		}		if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_SEDUCTION)) 		{			pEffectSeduction = (EffectSeduction*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_SEDUCTION);			Assert(pEffectSeduction != NULL);			bSeduction = HitRoll::isSuccessRemoveCurse(50, SkillLevel, 30, pEffectSeduction->getLevel(), 10);			bEffected = true;			bHPCheck = true;		}		// 刀 拌凯 秦家		bool bGreenPoison    = false; // GreenPoison阑 摹丰且鳖狼 咯何		bool bYellowPoison   = false; // YellowPoison阑 摹丰且鳖狼 咯何		bool bDarkBluePoison = false; // DarkBluePoison阑 摹丰且鳖狼 咯何		bool bGreenStalker   = false; // GreenStalker甫 摹丰且鳖狼 咯何		EffectPoison*                 pEffectPoison                 = NULL;		EffectYellowPoisonToCreature* pEffectYellowPoisonToCreature = NULL;		EffectDarkBluePoison*         pEffectDBP                   = NULL;		EffectGreenStalker*           pEffectGreenStalker           = NULL;		if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_POISON)) 		{			pEffectPoison = (EffectPoison*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_POISON);			Assert(pEffectPoison != NULL);			bGreenPoison = HitRoll::isSuccessCurePoison(50, SkillLevel, 10, pEffectPoison->getLevel(), 10);			bEffected = true;			bHPCheck = true;		}		if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_YELLOW_POISON_TO_CREATURE)) 		{			pEffectYellowPoisonToCreature = (EffectYellowPoisonToCreature*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_YELLOW_POISON_TO_CREATURE);			Assert(pEffectYellowPoisonToCreature != NULL);			bYellowPoison = HitRoll::isSuccessCurePoison(50, SkillLevel, 20, pEffectYellowPoisonToCreature->getLevel(), 10);			bEffected = true;			bHPCheck = true;		}		if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_DARKBLUE_POISON)) 		{			pEffectDBP = (EffectDarkBluePoison*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_DARKBLUE_POISON);			Assert(pEffectDBP != NULL);			bDarkBluePoison = HitRoll::isSuccessCurePoison(50, SkillLevel, 30, pEffectDBP->getLevel(), 10);			bEffected = true;			bHPCheck = true;		}		if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_GREEN_STALKER)) 		{			pEffectGreenStalker = (EffectGreenStalker*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_GREEN_STALKER);			Assert(pEffectGreenStalker != NULL);			bGreenStalker = HitRoll::isSuccessCurePoison(50, SkillLevel, 40, pEffectGreenStalker->getLevel(), 10);			bEffected = true;			bHPCheck = true;		}		if (bHPCheck && bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && pTargetCreature->isAlive())		{			decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1);			uint HealPoint = param.SkillDamage;			// 阿阿狼 历林甫 昏力窍绊,			// 菩哦俊促 捞棋飘 昏力窍扼绊 歹茄促.			GCRemoveEffect gcRemoveEffect;			gcRemoveEffect.setObjectID(pTargetCreature->getObjectID());			// 软趋寸茄 惑怕扼搁 软趋 惑怕甫 朝妨霖促.			if (pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < CureAllBloodDrainLevel)			{				// 软趋 酒福官捞飘甫 规瘤窍扁 困茄 饶蜡刘 捞棋飘甫 嘿咯霖促.				if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_AFTERMATH))				{						Effect* pEffect = pTargetCreature->findEffect(Effect::EFFECT_CLASS_AFTERMATH);						EffectAftermath* pEffectAftermath = dynamic_cast<EffectAftermath*>(pEffect);						pEffectAftermath->setDeadline(5*600); // 5盒 悼救 瘤加等促.				}				else				{						EffectAftermath* pEffectAftermath = new EffectAftermath(pTargetCreature);						pEffectAftermath->setDeadline(5*600); // 5盒 悼救 瘤加等促.						pTargetCreature->addEffect(pEffectAftermath);						pTargetCreature->setFlag(Effect::EFFECT_CLASS_AFTERMATH);						pEffectAftermath->create(pTargetCreature->getName());				}				pEffectBloodDrain->destroy(pTargetSlayer->getName());				pTargetSlayer->deleteEffect(Effect::EFFECT_CLASS_BLOOD_DRAIN);				SLAYER_RECORD prev;				pTargetSlayer->getSlayerRecord(prev);				pTargetSlayer->initAllStat();				pTargetSlayer->sendRealWearingInfo();				pTargetSlayer->addModifyInfo(prev, _GCSkillToObjectOK2);				gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_BLOOD_DRAIN);			}			if (bDoom)			{				pEffectDoom->setDeadline(0);				pTargetCreature->removeFlag(Effect::EFFECT_CLASS_DOOM);				gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DOOM);			}			if (bBlunting)			{				pEffectBlunting->setDeadline(0);				pTargetCreature->removeFlag(Effect::EFFECT_CLASS_BLUNTING);				gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_BLUNTING);			}			if (bParalyze)			{				pEffectParalyze->setDeadline(0);				pTargetCreature->removeFlag(Effect::EFFECT_CLASS_PARALYZE);				gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PARALYZE);			}			if (bSeduction)			{				pEffectSeduction->setDeadline(0);				pTargetCreature->removeFlag(Effect::EFFECT_CLASS_SEDUCTION);				gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_SEDUCTION);			}			// 阿阿狼 刀付促 摹丰甫 窍绊,			// 菩哦俊促 捞棋飘 昏力窍扼绊 歹茄促.			if (bGreenPoison)			{				pEffectPoison->setDeadline(0);				pTargetCreature->removeFlag(Effect::EFFECT_CLASS_POISON);				gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_POISON);			}			if (bYellowPoison)			{				pEffectYellowPoisonToCreature->setDeadline(0);				pTargetCreature->removeFlag(Effect::EFFECT_CLASS_YELLOW_POISON_TO_CREATURE);				gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_YELLOW_POISON_TO_CREATURE);			}			if (bDarkBluePoison)			{				pEffectDBP->setDeadline(0);				pTargetCreature->removeFlag(Effect::EFFECT_CLASS_DARKBLUE_POISON);				gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DARKBLUE_POISON);			}			if (bGreenStalker)			{				pEffectGreenStalker->setDeadline(0);				pTargetCreature->removeFlag(Effect::EFFECT_CLASS_GREEN_STALKER);				gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_GREEN_STALKER);			}			if( bEffected ) {				pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &gcRemoveEffect);			}			// 促弗 荤恩阑 摹丰茄促.			HP_t CurrentHP = pTargetSlayer->getHP(ATTR_CURRENT);			HP_t MaxHP     = pTargetSlayer->getHP(ATTR_MAX);			// 角力 雀汗 荐摹甫 拌魂茄促.			int RealHealPoint = 0;			if( CurrentHP + HealPoint <= MaxHP ) {				RealHealPoint = max( (unsigned int)0, HealPoint );			} else {				RealHealPoint = max( 0, MaxHP - CurrentHP );			}			// 版氰摹甫 棵妨霖促.			shareAttrExp(pSlayer, RealHealPoint , param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToObjectOK1);			increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1);			increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1);				// HP甫 悸泼茄促.			CurrentHP = min((int)(MaxHP), (int)(CurrentHP + HealPoint));			pTargetSlayer->setHP(CurrentHP, ATTR_CURRENT);			// 摹丰啊 登菌栏聪 HP甫 宏肺靛某胶泼茄促.			GCStatusCurrentHP gcStatusCurrentHP;			gcStatusCurrentHP.setObjectID(TargetObjectID);			gcStatusCurrentHP.setCurrentHP (CurrentHP);			pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &gcStatusCurrentHP);			_GCSkillToObjectOK2.addShortData(MODIFY_CURRENT_HP, CurrentHP);						ZoneCoord_t myX     = pSlayer->getX();			ZoneCoord_t myY     = pSlayer->getY();			ZoneCoord_t targetX = pTargetCreature->getX();			ZoneCoord_t targetY = pTargetCreature->getY();			_GCSkillToObjectOK1.setSkillType(param.SkillType);			_GCSkillToObjectOK1.setCEffectID(CEffectID);			_GCSkillToObjectOK1.setTargetObjectID(TargetObjectID);			_GCSkillToObjectOK1.setDuration(0);			_GCSkillToObjectOK2.setObjectID(pSlayer->getObjectID());			_GCSkillToObjectOK2.setSkillType(param.SkillType);			_GCSkillToObjectOK2.setDuration (0);			_GCSkillToObjectOK3.setObjectID(pSlayer->getObjectID());			_GCSkillToObjectOK3.setSkillType(param.SkillType);			_GCSkillToObjectOK3.setTargetXY(targetX, targetY);			_GCSkillToObjectOK4.setSkillType(param.SkillType);

⌨️ 快捷键说明

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