📄 cureall.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// 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 + -