📄 crosscounter.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : CrossCounter.cpp// Written by : // Description : //////////////////////////////////////////////////////////////////////////////#include "CrossCounter.h"#include "EffectCrossCounter.h"#include "SkillHandlerManager.h"#include "Gpackets/GCSkillToSelfOK1.h"#include "Gpackets/GCSkillToSelfOK2.h"#include "Gpackets/GCCrossCounterOK1.h"#include "Gpackets/GCCrossCounterOK2.h"#include "Gpackets/GCCrossCounterOK3.h"#include "Gpackets/GCAddEffect.h"#include "Gpackets/GCRemoveEffect.h"//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 伎橇 勤甸矾//////////////////////////////////////////////////////////////////////////////void CrossCounter::execute(Slayer * pSlayer, SkillSlot * pSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin(slayerself)" << endl; Assert(pSlayer != NULL); Assert(pSkillSlot != NULL); try { Player * pPlayer = pSlayer->getPlayer(); Zone * pZone = pSlayer->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); // 公厘窍绊 乐绰 公扁啊 澄捞芭唱, 八捞 酒聪扼搁 扁贱阑 荤侩且 荐 绝促. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerself)" << endl; return; } bool bIncreaseDomainExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); GCSkillToSelfOK1 _GCSkillToSelfOK1; GCSkillToSelfOK2 _GCSkillToSelfOK2; SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); int RequiredMP = (int)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_CROSS_COUNTER); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); // 捞棋飘 努贰胶甫 父甸绢 嘿牢促. EffectCrossCounter* pEffect = new EffectCrossCounter(pSlayer); pEffect->setDeadline(output.Duration); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_CROSS_COUNTER); // 版氰摹甫 棵赴促. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10*(Grade+1); if ( bIncreaseDomainExp ) { shareAttrExp(pSlayer, ExpUp, 8, 1, 1, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); } // 菩哦阑 父甸绢 焊辰促. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); _GCSkillToSelfOK2.setObjectID(pSlayer->getObjectID()); _GCSkillToSelfOK2.setSkillType(SkillType); _GCSkillToSelfOK2.setDuration(output.Duration); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToSelfOK2, pSlayer); pPlayer->sendPacket(&_GCSkillToSelfOK1); // 捞棋飘啊 嘿菌促绊 舅妨霖促. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_CROSS_COUNTER); gcAddEffect.setDuration(output.Duration); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcAddEffect); pSkillSlot->setRunTime(output.Delay); } else { executeSkillFailNormal(pSlayer, getSkillType(), NULL); } } catch (Throwable & t) { executeSkillFailException(pSlayer, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerself)" << endl; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 农肺胶 墨款磐 眉农 窃荐// 农肺胶 墨款磐啊 惯悼登搁 true甫 府畔茄促.//////////////////////////////////////////////////////////////////////////////bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t damage, Range_t range){ __BEGIN_TRY //cout << "CheckCrossCounter Begin" << endl; Assert(pAttacker != NULL); Assert(pTargetCreature != NULL); // 浇饭捞绢父捞 捞 扁贱阑 镜 荐 乐绊, 弊 芭府绰 1捞绢具父 茄促. if (pTargetCreature->isSlayer() == false || range != 1) { //cout << "CheckCrossCounter End" << endl; return false; } bool bSuccess = false; // 扁贱捞 吧妨乐绊, 泅犁 付厚 惑怕啊 酒聪扼搁... if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_CROSS_COUNTER) && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE)) { Slayer* pTargetSlayer = dynamic_cast<Slayer*>(pTargetCreature); SkillSlot* pCrossCounterSkillSlot = pTargetSlayer->hasSkill(SKILL_CROSS_COUNTER); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_CROSS_COUNTER); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); Zone* pZone = pAttacker->getZone(); Assert(pTargetSlayer != NULL); Assert(pCrossCounterSkillSlot != NULL); Assert(pSkillInfo != NULL); Assert(pZone != NULL); Item* pWeapon = pTargetSlayer->getWearItem( Slayer::WEAR_RIGHTHAND ); if (!verifyDistance(pAttacker, pTargetCreature, 1) || // 八阑 甸绊 乐瘤 臼栏搁 惯悼登瘤 臼绰促. by Sequoia 2003.3.25 pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_SWORD ) { return false; } // hitroll捞 己傍沁促搁... if (HitRoll::isSuccess(pTargetSlayer, pAttacker) && canHit(pTargetSlayer, pAttacker, SKILL_CROSS_COUNTER)) { // counter俊辑绰 // pTargetSlayer啊 傍拜磊, pAttacker啊 傍拜寸窍绰 磊啊 等促. ObjectID_t targetID = pTargetSlayer->getObjectID(); ObjectID_t attackerID = pAttacker->getObjectID(); GCCrossCounterOK1 _GCCrossCounterOK1; GCCrossCounterOK2 _GCCrossCounterOK2; GCCrossCounterOK3 _GCCrossCounterOK3; Level_t SkillLevel = pCrossCounterSkillSlot->getExpLevel(); SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(SkillLevel); //////////////////////////////////////////////////////////// // 胶懦 弊饭捞靛俊 蝶扼辑 促弗 扁贱捞 唱埃促. // SKILL_GRADE_APPRENTICE // SKILL_GRADE_ADEPT // SKILL_GRADE_EXPERT // SKILL_GRADE_MASTER // SKILL_GRADE_GRAND_MASTER //////////////////////////////////////////////////////////// SkillType_t CounterSkillType = SKILL_ATTACK_MELEE; bool bCriticalHit; // 扁夯 单固瘤俊 胶懦 单固瘤甫 歹茄促. Damage_t Damage = computeDamage(pTargetSlayer, pAttacker, SkillLevel/5, bCriticalHit); if (Grade == SKILL_GRADE_APPRENTICE) { Damage += pTargetSlayer->getDamage(ATTR_CURRENT); } else if (Grade == SKILL_GRADE_ADEPT) { SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_DOUBLE_IMPACT); Damage_t SkillMinPoint = pSkillInfo->getMinDamage(); Damage_t SkillMaxPoint = pSkillInfo->getMaxDamage(); Damage += (int)(SkillMinPoint + (SkillMaxPoint - SkillMinPoint) * (double)(SkillLevel * 0.01)); CounterSkillType = SKILL_DOUBLE_IMPACT; } else if (Grade == SKILL_GRADE_EXPERT) { SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_TRIPLE_SLASHER); Damage_t SkillMinPoint = pSkillInfo->getMinDamage(); Damage_t SkillMaxPoint = pSkillInfo->getMaxDamage(); Damage += (int)(SkillMinPoint + (SkillMaxPoint - SkillMinPoint) * (double)(SkillLevel * 0.01)); CounterSkillType = SKILL_TRIPLE_SLASHER; } else if (Grade == SKILL_GRADE_MASTER) { SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_THUNDER_SPARK); Damage_t SkillMinPoint = pSkillInfo->getMinDamage(); Damage_t SkillMaxPoint = pSkillInfo->getMaxDamage(); Damage += (int)(SkillMinPoint + (SkillMaxPoint - SkillMinPoint) * (double)(SkillLevel * 0.01)); CounterSkillType = SKILL_THUNDER_SPARK; } else if (Grade == SKILL_GRADE_GRAND_MASTER) { SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_RAINBOW_SLASHER); Damage_t SkillMinPoint = pSkillInfo->getMinDamage(); Damage_t SkillMaxPoint = pSkillInfo->getMaxDamage(); Damage += (int)(SkillMinPoint + (SkillMaxPoint - SkillMinPoint) * (double)(SkillLevel * 0.01)); CounterSkillType = SKILL_RAINBOW_SLASHER; } _GCCrossCounterOK1.setSkillType(CounterSkillType); _GCCrossCounterOK2.setSkillType(CounterSkillType); _GCCrossCounterOK3.setSkillType(CounterSkillType); if (Random(1, 100) < 60 && !pAttacker->isSlayer()) { shareAttrExp(pTargetSlayer , Damage , 8, 1, 1, _GCCrossCounterOK1); increaseDomainExp(pTargetSlayer, DomainType, pSkillInfo->getPoint(), _GCCrossCounterOK1); increaseSkillExp(pTargetSlayer, DomainType, pCrossCounterSkillSlot, pSkillInfo, _GCCrossCounterOK1); } setDamage(pAttacker, Damage, pTargetCreature, SKILL_CROSS_COUNTER ,&_GCCrossCounterOK2, &_GCCrossCounterOK1); //SkillHandler::computeAlignmentChange(pAttacker, Damage, pTargetCreature, &_GCCrossCounterOK2, &_GCCrossCounterOK1); _GCCrossCounterOK1.setObjectID(attackerID); _GCCrossCounterOK2.setObjectID(targetID); _GCCrossCounterOK3.setObjectID(targetID); _GCCrossCounterOK3.setTargetObjectID(attackerID); pTargetSlayer->getPlayer()->sendPacket(&_GCCrossCounterOK1); if (pAttacker->isPC()) { pAttacker->getPlayer()->sendPacket(&_GCCrossCounterOK2); } else if (pAttacker->isMonster()) { Monster * pMonster = dynamic_cast<Monster*>(pAttacker); // 农肺胶墨款磐啊 惯悼登菌促绰 巴篮 阁胶磐啊 捞固 捞 浇饭捞绢甫 利栏肺 牢侥窍绊 // 傍拜阑 沁促绰 富捞骨肺, addEnemy甫 秦 临 鞘夸绰 绝促. //pMonster->addEnemy(pTargetSlayer); // 付胶磐绰 掉饭捞绝促. if (!pMonster->isMaster()#ifdef __UNDERWORLD__ && !pMonster->isUnderworld() && pMonster->getMonsterType() != 599#endif ) { Timeval NextTurn = pMonster->getNextTurn(); Timeval DelayTurn; DelayTurn.tv_sec = 0; DelayTurn.tv_usec = 200000; Timeval NewTurn = NextTurn + DelayTurn; pMonster->setNextTurn(NewTurn); } } list<Creature*> cList; cList.push_back(pTargetSlayer); cList.push_back(pAttacker); pZone->broadcastPacket(pTargetSlayer->getX(), pTargetSlayer->getY(), &_GCCrossCounterOK3, cList); bSuccess = true; } else { // CrossCounter角菩窍搁 角菩菩哦 焊郴唱?? } } //cout << "CheckCrossCounter End" << endl; return bSuccess; __END_CATCH}CrossCounter g_CrossCounter;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -