📄 soulchain.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : SoulChain.cpp// Written by : elca@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include "SoulChain.h"#include "EffectSoulChain.h"#include "PCFinder.h"#include "GamePlayer.h"#include "ZoneInfoManager.h"#include "PKZoneInfoManager.h"#include "Gpackets/GCSkillToSelfOK1.h"#include "Gpackets/GCSkillToSelfOK2.h"//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 伎橇 勤甸矾//////////////////////////////////////////////////////////////////////////////void SoulChain::execute(Slayer* pSlayer, const string& targetName, SkillSlot* pSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin" << endl; Assert(pSlayer != NULL); Assert(pSkillSlot != NULL); try { Player* pPlayer = pSlayer->getPlayer(); Zone* pZone = pSlayer->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer); Assert(pGamePlayer != NULL); if ( pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER) ) { executeSkillFailNormal(pSlayer, getSkillType(), NULL); return; } GCSkillToSelfOK1 _GCSkillToSelfOK1; GCSkillToSelfOK2 _GCSkillToSelfOK2; SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); // 捞 胶懦篮 葛电 浇饭捞绢 弊罚靛 付胶磐扼搁 镜 荐 乐促. // 档皋牢单 辆加等 胶懦捞 酒聪骨肺 档皋牢 吝 弥绊 饭骇阑 泅犁 档皋牢栏肺 茄促. SkillDomainType_t DomainType = pSlayer->getHighestSkillDomain(); ZoneCoord_t x = pSlayer->getX(); ZoneCoord_t y = pSlayer->getY(); bool bValidTarget = false; __ENTER_CRITICAL_SECTION( (*g_pPCFinder) ) Creature* pTarget = g_pPCFinder->getCreature_LOCKED( targetName ); if ( pTarget != NULL ) { Zone* pTargetZone = pTarget->getZone(); if ( pTargetZone != NULL ) { // Target 眉农 // 鞍篮 辆练捞绢具 茄促. bool bSlayer = pTarget->isSlayer(); // 老馆 蜡历捞咯具 等促. bool bPLAYER = pTarget->getCompetence() == PLAYER; bool bMasterLair = pTargetZone->isMasterLair(); // 蜡丰 辑厚胶 荤侩捞 啊瓷茄啊? bool bValidPay = pGamePlayer->loginPayPlay( pGamePlayer->getSocket()->getHost(), pGamePlayer->getID() ) || pGamePlayer->isFamilyFreePass() || !g_pZoneInfoManager->getZoneInfo( pTargetZone->getZoneID() )->isPayPlay(); // 具傈荤飞何, 矫寇胞瘤开, 捞亥飘版扁厘, 捞亥飘OX, 抛皋府俊肺绰 哎 荐 绝促. bool bValidZone = pTargetZone->getZoneID() != 2101 && pTargetZone->getZoneID() != 2102 && pTargetZone->getZoneID() != 1005 && pTargetZone->getZoneID() != 1006 && pTargetZone->getZoneID() != 1122 && pTargetZone->getZoneID() != 1131 && pTargetZone->getZoneID() != 1132 && pTargetZone->getZoneID() != 1133 && pTargetZone->getZoneID() != 1134 && // 己捞唱 付胶磐 饭绢肺档 卵酒哎 荐 绝促. 2003. 1.20. by bezz, Sequoia // 酒淬狼 己瘤 郴肺档 卵酒哎 荐 绝促. 2003. 2. 8. by Sequoia !pTargetZone->isHolyLand() && !pTargetZone->isCastle() && !pTargetZone->isMasterLair() && !g_pPKZoneInfoManager->isPKZone( pTargetZone->getZoneID() ); bValidTarget = bSlayer && bPLAYER && !bMasterLair && bValidPay && bValidZone; } } __LEAVE_CRITICAL_SECTION( (*g_pPCFinder) ) int RequiredMP = pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot);// bool bRangeCheck = checkZoneLevelToUseSkill(pSlayer);// bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); bool bEffected = pSlayer->isFlag(Effect::EFFECT_CLASS_SOUL_CHAIN) || pSlayer->hasRelicItem() || pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER); if (bManaCheck && bTimeCheck && !bEffected && bValidTarget) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); // 10 檬 悼救 框流老 荐 绝档废 捞棋飘甫 嘿牢促. EffectSoulChain* pEffect= new EffectSoulChain(pSlayer); pEffect->setDuration(output.Duration); pEffect->setDeadline(100); pEffect->setTargetName( targetName ); pEffect->setZone( pZone ); ObjectRegistry & objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_SOUL_CHAIN); // 版氰摹甫 棵赴促. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10*(Grade+1); int STRPoint, DEXPoint, INTPoint; switch ( DomainType ) { case SKILL_DOMAIN_BLADE: case SKILL_DOMAIN_SWORD: STRPoint = 8; DEXPoint = 1; INTPoint = 1; break; case SKILL_DOMAIN_GUN: STRPoint = 1; DEXPoint = 8; INTPoint = 1; break; case SKILL_DOMAIN_ENCHANT: case SKILL_DOMAIN_HEAL: STRPoint = 1; DEXPoint = 1; INTPoint = 8; break; default: Assert(false); } shareAttrExp(pSlayer, ExpUp, STRPoint, DEXPoint, INTPoint, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); // 菩哦阑 焊辰促. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); _GCSkillToSelfOK1.addShortData(MODIFY_EFFECT_STAT, Effect::EFFECT_CLASS_SOUL_CHAIN); _GCSkillToSelfOK2.setObjectID(pSlayer->getObjectID()); _GCSkillToSelfOK2.setSkillType(SkillType); _GCSkillToSelfOK2.setDuration(0); // Send Packet pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK2, pSlayer); pSkillSlot->setRunTime(output.Delay); } else { executeSkillFailNormal(pSlayer, getSkillType(), NULL); } } catch(Throwable & t) { executeSkillFailException(pSlayer, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢 伎橇//////////////////////////////////////////////////////////////////////////////void SoulChain::execute(Vampire* pVampire, const string& targetName, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin" << endl; Assert(pVampire != NULL); Assert(pSkillSlot != NULL); try { Player* pPlayer = pVampire->getPlayer(); Zone* pZone = pVampire->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer); Assert(pGamePlayer != NULL); if ( pVampire->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pVampire->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER) ) { executeSkillFailNormal(pVampire, getSkillType(), NULL); return; } GCSkillToSelfOK1 _GCSkillToSelfOK1; GCSkillToSelfOK2 _GCSkillToSelfOK2; SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); ZoneCoord_t x = pVampire->getX(); ZoneCoord_t y = pVampire->getY(); bool bValidTarget = false; __ENTER_CRITICAL_SECTION( (*g_pPCFinder) ) Creature* pTarget = g_pPCFinder->getCreature_LOCKED( targetName ); if ( pTarget != NULL ) { Zone* pTargetZone = pTarget->getZone(); if ( pTargetZone != NULL )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -