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