📄 causecriticalwounds.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : CauseCriticalWounds.cpp// Written by : // Description : //////////////////////////////////////////////////////////////////////////////#include "CauseCriticalWounds.h"#include "EffectCauseCriticalWounds.h"#include "RankBonus.h"#include "Gpackets/GCSkillToObjectOK1.h"#include "Gpackets/GCSkillToObjectOK2.h"#include "Gpackets/GCSkillToObjectOK3.h"#include "Gpackets/GCSkillToObjectOK4.h"#include "Gpackets/GCSkillToObjectOK5.h"#include "Gpackets/GCSkillToObjectOK6.h"#include "Gpackets/GCAddEffect.h"#include "SimpleMissileSkill.h"//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void CauseCriticalWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot * pSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin(slayer)" << endl; Assert( pSlayer != NULL ); Assert( pSkillSlot != NULL ); try { Player* pPlayer = pSlayer->getPlayer(); Zone* pZone = pSlayer->getZone(); Assert( pPlayer != NULL ); Assert( pZone != NULL ); Creature* pTargetCreature = pZone->getCreature( TargetObjectID ); // NPC 甫 傍拜且 荐 绝促 // 搁开捞芭唱.. by sigi. 2002.9.13 // NoSuch力芭. by sigi. 2002.5.5 if ( pTargetCreature==NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_PARALYZE) || pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) // by sigi. 2002.10.30 || pTargetCreature->isNPC() ) { executeSkillFailException( pSlayer, getSkillType() ); return; } SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo( SkillType ); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); Tile& rTile = pZone->getTile( pTargetCreature->getX(), pTargetCreature->getY() ); // 胶懦 荤侩捞 啊瓷茄瘤 眉农茄促 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 bCanHit = canHit( pSlayer, pTargetCreature, SkillType ); bool bEffected = pTargetCreature->isFlag( Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS ) || rTile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION)!=NULL; bool bPK = verifyPK( pSlayer, pTargetCreature ); if ( bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && !bEffected && bPK ) { // packet GCSkillToObjectOK1 _GCSkillToObjectOK1; GCSkillToObjectOK2 _GCSkillToObjectOK2; GCSkillToObjectOK3 _GCSkillToObjectOK3; GCSkillToObjectOK4 _GCSkillToObjectOK4; GCSkillToObjectOK5 _GCSkillToObjectOK5; GCSkillToObjectOK6 _GCSkillToObjectOK6; ZoneCoord_t prayerX = pSlayer->getX(); ZoneCoord_t prayerY = pSlayer->getY(); ZoneCoord_t targetX = pTargetCreature->getX(); ZoneCoord_t targetY = pTargetCreature->getY(); // 胶懦狼 damage, delay, duration阑 拌魂 SkillInput input( pSlayer, pSkillSlot ); SkillOutput output; computeOutput( input, output ); // Soul Smashing 捞 乐促搁 单固瘤 10% 刘啊 if ( pSlayer->hasRankBonus( RankBonus::RANK_BONUS_SOUL_SMASHING ) ) { RankBonus* pRankBonus = pSlayer->getRankBonus( RankBonus::RANK_BONUS_SOUL_SMASHING ); Assert( pRankBonus != NULL ); output.Damage += pRankBonus->getPoint(); } // 付唱甫 临牢促 decreaseMana( pSlayer, RequiredMP, _GCSkillToObjectOK1 ); // 单固瘤甫 啊窍绊, 郴备档甫 冻绢哆赴促. 傍拜措惑捞 浇饭捞绢啊 酒聪骨肺 alignment, PK 眉农且 鞘夸啊 绝促 setDamage( pTargetCreature, output.Damage, pSlayer, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1 ); computeAlignmentChange( pTargetCreature, output.Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1 ); decreaseDurability( pSlayer, pTargetCreature, 1, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2 ); // 鸥百捞 浇饭捞绢啊 酒囱 版快俊父 // 版氰摹甫 棵赴促 // Effect甫 嘿牢促 // Effect甫 宏肺靛 某胶泼 茄促 if ( !pTargetCreature->isSlayer() ) { SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel( pSlayer->getSkillDomainLevel( DomainType ) ); Exp_t ExpUp = 10 * ( Grade + 1 ); shareAttrExp( pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1 ); increaseDomainExp( pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1 ); increaseSkillExp( pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1 ); increaseAlignment( pSlayer, pTargetCreature, _GCSkillToObjectOK1 ); // Effect甫 积己秦辑 嘿牢促 EffectCauseCriticalWounds* pEffectCauseCriticalWounds = new EffectCauseCriticalWounds( pTargetCreature ); pEffectCauseCriticalWounds->setDeadline( output.Duration ); pTargetCreature->addEffect( pEffectCauseCriticalWounds ); pTargetCreature->setFlag( Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS ); // Effect 甫 宏肺靛 某胶泼 茄促 GCAddEffect gcAddEffect; gcAddEffect.setObjectID( pTargetCreature->getObjectID() ); gcAddEffect.setEffectID( Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS ); gcAddEffect.setDuration( output.Duration ); pZone->broadcastPacket( targetX, targetY, &gcAddEffect ); } else // 浇饭捞绢 老 版快 { // 浇饭捞绢 老 版快 Duration阑 0栏肺 技泼茄促. 付厚绰 窍瘤 臼绊 单固瘤父 利侩茄促. output.Duration = 0; } bool bCanSeePrayer = canSee( pTargetCreature, pSlayer ); // 胶懦阑 荤侩茄 荤恩俊霸 _GCSkillToObjectOK1.setSkillType( SkillType ); _GCSkillToObjectOK1.setCEffectID( CEffectID ); _GCSkillToObjectOK1.setTargetObjectID( TargetObjectID ); _GCSkillToObjectOK1.setDuration( output.Duration ); // 胶懦狼 措惑磊俊霸 _GCSkillToObjectOK2.setObjectID( pSlayer->getObjectID() ); _GCSkillToObjectOK2.setSkillType( SkillType ); _GCSkillToObjectOK2.setDuration( output.Duration ); // 胶懦阑 荤侩茄 荤恩父 杭 荐 乐绰 荤恩俊霸 _GCSkillToObjectOK3.setObjectID( pSlayer->getObjectID() ); _GCSkillToObjectOK3.setSkillType( SkillType ); _GCSkillToObjectOK3.setTargetXY( targetX, targetY ); // 胶懦狼 措惑磊父 阂 荐 乐绰 荤恩俊霸 _GCSkillToObjectOK4.setSkillType( SkillType ); _GCSkillToObjectOK4.setTargetObjectID( TargetObjectID ); // 胶懦 荤侩磊客 措惑磊 葛滴 杭 荐 乐绰 荤恩俊霸 _GCSkillToObjectOK5.setObjectID( pSlayer->getObjectID() ); _GCSkillToObjectOK5.setTargetObjectID( TargetObjectID ); _GCSkillToObjectOK5.setSkillType( SkillType ); _GCSkillToObjectOK5.setDuration( output.Duration ); // 胶懦 措惑磊啊 胶懦 荤侩磊甫 杭 荐 绝阑 锭 _GCSkillToObjectOK6.setXY( prayerX, prayerY ); _GCSkillToObjectOK6.setSkillType( SkillType ); _GCSkillToObjectOK6.setDuration( output.Duration ); pPlayer->sendPacket( &_GCSkillToObjectOK1 ); if ( pTargetCreature->isPC() ) { Player* pTargetPlayer = pTargetCreature->getPlayer(); Assert( pTargetPlayer != NULL ); if ( bCanSeePrayer ) pTargetPlayer->sendPacket( &_GCSkillToObjectOK2 ); else pTargetPlayer->sendPacket( &_GCSkillToObjectOK6 ); } else { Monster* pTargetMonster = dynamic_cast<Monster*>(pTargetCreature); Assert( pTargetMonster != NULL ); pTargetMonster->addEnemy( pSlayer ); } list<Creature*> cList; cList.push_back( pSlayer ); cList.push_back( pTargetCreature ); cList = pZone->broadcastSkillPacket( prayerX, prayerY, targetX, targetY, &_GCSkillToObjectOK5, cList ); pZone->broadcastPacket( prayerX, prayerY, &_GCSkillToObjectOK3, cList ); pZone->broadcastPacket( targetX, targetY, &_GCSkillToObjectOK4, cList ); pSkillSlot->setRunTime( output.Delay ); } else { executeSkillFailNormal( pSlayer, getSkillType(), pTargetCreature ); } } catch ( Throwable& t ) { executeSkillFailException( pSlayer, getSkillType() ); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayer)" << endl; __END_CATCH}CauseCriticalWounds g_CauseCriticalWounds;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -