📄 multishot.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : MultiShot.cpp// Written by : // Description : //////////////////////////////////////////////////////////////////////////////#include "MultiShot.h"#include "Gpackets/GCSkillToTileOK1.h"#include "Gpackets/GCSkillToTileOK2.h"#include "Gpackets/GCSkillToTileOK3.h"#include "Gpackets/GCSkillToTileOK4.h"#include "Gpackets/GCSkillToTileOK5.h"#include "ItemUtil.h"#include <list>//////////////////////////////////////////////////////////////////////////////// 积己磊 - 付胶农甫 檬扁拳茄促.//////////////////////////////////////////////////////////////////////////////MultiShot::MultiShot() throw(){ __BEGIN_TRY // SG 付胶农绰 规氢苞绰 包拌绝捞 亲惑 + 葛剧捞促. m_pSGMask[0].set(-1, -1); m_pSGMask[1].set(0, -1); m_pSGMask[2].set(1, -1); m_pSGMask[3].set(-1, 0); m_pSGMask[4].set(0, 0); m_pSGMask[5].set(1, 0); m_pSGMask[6].set(-1, 1); m_pSGMask[7].set(0, 1); m_pSGMask[8].set(1, 1); // AR 付胶农甫 檬扁拳矫挪促. // SwordWave客 厚搅窍瘤父, SwordWave绰 矫傈磊 林困甫 // 付胶农甫 捞侩秦 八荤窍瘤父. MultiShot篮 鸥百狼 林困甫 付胶农甫 // 捞侩秦 八荤茄促绰 巴阑 积阿秦具 茄促. // // (-1,-1)(0,-1)(1,-1) // (-1, 0)(0, 0)(1, 0) // (-1, 1)(0, 1)(1, 1) // // 阿 规氢俊 蝶扼 绢蠢 鸥老捞 疙吝 措惑捞衬甫 // 积阿窍搁 付胶农甫 捞秦窍扁 奖促. m_pARMask[LEFT][0].set(0,-1); m_pARMask[LEFT][1].set(0, 0); m_pARMask[LEFT][2].set(0, 1); m_pARMask[RIGHT][0].set(0,-1); m_pARMask[RIGHT][1].set(0, 0); m_pARMask[RIGHT][2].set(0, 1); m_pARMask[UP][0].set(-1,0); m_pARMask[UP][1].set(0,0); m_pARMask[UP][2].set(1,0); m_pARMask[DOWN][0].set(-1,0); m_pARMask[DOWN][1].set(0,0); m_pARMask[DOWN][2].set(1,0); m_pARMask[LEFTUP][0].set(1,-1); m_pARMask[LEFTUP][1].set(0, 0); m_pARMask[LEFTUP][2].set(-1, 1); m_pARMask[RIGHTDOWN][0].set(1,-1); m_pARMask[RIGHTDOWN][1].set(0, 0); m_pARMask[RIGHTDOWN][2].set(-1, 1); m_pARMask[LEFTDOWN][0].set(-1,-1); m_pARMask[LEFTDOWN][1].set(0, 0); m_pARMask[LEFTDOWN][2].set(1, 1); m_pARMask[RIGHTUP][0].set(-1,-1); m_pARMask[RIGHTUP][1].set(0, 0); m_pARMask[RIGHTUP][2].set(1, 1); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void MultiShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin" << endl; Assert(pSlayer != NULL); Assert(pSkillSlot != NULL); try { Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); //Assert(pTargetCreature != NULL); // NoSuch力芭. by sigi. 2002.5.2 if (pTargetCreature==NULL) { executeSkillFailException(pSlayer, getSkillType()); return; } // 酒捞袍捞 绝芭唱, 醚 拌凯狼 公扁啊 酒聪芭唱, SR捞扼搁 // 捞 扁贱阑 荤侩且 荐 绝促. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || !isArmsWeapon(pItem)) // SR档 荤侩 啊瓷窍霸 荐沥. by sigi. 2002.12.3 // || pItem->getItemClass() == Item::ITEM_CLASS_SR) { executeSkillFailException(pSlayer, getSkillType()); return; } Item::ItemClass IClass = pItem->getItemClass(); if (IClass == Item::ITEM_CLASS_SG) { SGexecute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID); } else if (IClass == Item::ITEM_CLASS_AR || IClass == Item::ITEM_CLASS_SMG // SR档 荤侩 啊瓷窍霸 荐沥. by sigi. 2002.12.3 || IClass == Item::ITEM_CLASS_SR) { ARSMGexecute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID); } } catch (Throwable & t) { executeSkillFailException(pSlayer, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void MultiShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY Assert(pSlayer != NULL); Assert(pSkillSlot != NULL); try { Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); // 酒捞袍捞 绝芭唱, 醚 拌凯狼 公扁啊 酒聪芭唱, SR捞扼搁 // 捞 扁贱阑 荤侩且 荐 绝促. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || !isArmsWeapon(pItem)) // SR档 荤侩 啊瓷窍霸 荐沥. by sigi. 2002.12.3 //|| pItem->getItemClass() == Item::ITEM_CLASS_SR) { executeSkillFailException(pSlayer, getSkillType()); return; } Item::ItemClass IClass = pItem->getItemClass(); if (IClass == Item::ITEM_CLASS_SG) { SGexecute(pSlayer, X, Y, pSkillSlot, CEffectID); } else if (IClass == Item::ITEM_CLASS_AR || IClass == Item::ITEM_CLASS_SMG // SR档 荤侩 啊瓷窍霸 荐沥. by sigi. 2002.12.3 || IClass == Item::ITEM_CLASS_SR) { ARSMGexecute(pSlayer, X, Y, pSkillSlot, CEffectID); } } catch (Throwable & t) { executeSkillFailException(pSlayer, getSkillType()); } __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 鸥老 勤甸矾 - SG甫 甸绊 乐阑 版快//////////////////////////////////////////////////////////////////////////////void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " SGexecute Begin" << endl; Assert(pSlayer != NULL); Assert(pSkillSlot != NULL); try { Player* pPlayer = pSlayer->getPlayer(); Zone* pZone = pSlayer->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); GCSkillToTileOK1 _GCSkillToTileOK1; GCSkillToTileOK2 _GCSkillToTileOK2; GCSkillToTileOK3 _GCSkillToTileOK3; GCSkillToTileOK4 _GCSkillToTileOK4; GCSkillToTileOK5 _GCSkillToTileOK5; SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(getSkillType()); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); Level_t SkillLevel = pSkillSlot->getExpLevel(); Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); Assert(pWeapon != NULL); bool bIncreaseExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); int RequiredMP = (int)pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, X, Y, pWeapon->getRange()); bool bBulletCheck = (getRemainBullet(pWeapon) > 0) ? true : false; // 醚舅 荐绰 公炼扒 冻绢哆赴促. Bullet_t RemainBullet = 0; if (bBulletCheck) { decreaseBullet(pWeapon); // 茄惯镜锭付促 历厘且 鞘夸 绝促. by sigi. 2002.5.9 //pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } // 单固瘤, 捧三 焊呈胶, 谅钎客 规氢阑 备茄促. int ToHitBonus = 0; int DamageBonus = 0; int ToHitPenalty = 0; int DamagePenalty = 0; ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); bool bHit = false; // 茄锅捞扼档 嘎疽绰啊甫 历厘窍扁 困茄 函荐 Damage_t Damage = 0; // 付瘤阜栏肺 涝腮 单固瘤甫 历厘窍扁 困茄 函荐 // SG老 版快俊绰 4何磐 矫累秦辑 9鳖瘤狼 splash 单固瘤甫 涝腮促. int Splash = 3 + pSkillSlot->getExpLevel()/10 + 1; if (bManaCheck && bTimeCheck && bRangeCheck && bBulletCheck) { decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); // output.ToHit蔼捞 澜荐捞扁 锭巩俊, %蔼捞 澜荐肺 倒酒柯促. ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); list<Creature*> cList; list<Creature*> creatureList; getSplashVictims(pZone, X, Y, Creature::CREATURE_CLASS_MAX, creatureList, Splash); list<Creature*>::iterator itr = creatureList.begin(); for (; itr != creatureList.end(); itr++) { Creature* pTargetCreature = (*itr); Assert(pTargetCreature != NULL); ToHitBonus = computeArmsWeaponToHitBonus(pWeapon, myX, myY, pTargetCreature->getX(), pTargetCreature->getY()); DamageBonus = computeArmsWeaponDamageBonus(pWeapon, myX, myY, pTargetCreature->getX(), pTargetCreature->getY()); bool bInvokerCheck = (pTargetCreature->getObjectID() == pSlayer->getObjectID()) ? true : false; bool bRaceCheck = pTargetCreature->isSlayer() || pTargetCreature->isNPC(); bool bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, ToHitPenalty + ToHitBonus); bool bPK = verifyPK(pSlayer, pTargetCreature); bool bZoneLevelCheck = checkZoneLevelToHitTarget(pTargetCreature); if ( pTargetCreature->isFlag( Effect::EFFECT_CLASS_NO_DAMAGE ) || pTargetCreature->isFlag( Effect::EFFECT_CLASS_COMA ) ) { bHitRoll = false; } if (!bInvokerCheck && !bRaceCheck && bHitRoll && bPK && bZoneLevelCheck) { bool bCriticalHit = false; // 单固瘤甫 拌魂秦辑 其澄萍甫 啊茄促. // 焊呈胶绰 钢萍鸡 其澄萍 锭巩俊 澜荐啊 瞪 荐档 乐促. Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel/5, bCriticalHit); DamagePenalty = getPercentValue(Damage, output.Damage); Damage = max(0, Damage + DamagePenalty + DamageBonus); // 皋牢 鸥百阑 力寇窍绊绰, 胶敲贰矫 单固瘤甫 涝绰单, // 胶敲贰矫 单固瘤绰 老馆 单固瘤狼 50%促. if (pTargetCreature->getX() != X || pTargetCreature->getY() != Y) { Damage = Damage/2; } // 家靛傀捞宏客绰 崔府 农肺胶 墨款磐 眉农绰 窍瘤 臼绰促. ObjectID_t targetObjectID = pTargetCreature->getObjectID(); cList.push_back(pTargetCreature); _GCSkillToTileOK1.addCListElement(targetObjectID); _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); setDamage(pTargetCreature, Damage, pSlayer, getSkillType(), NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); // 农府萍拿 洒飘扼搁 惑措规阑 第肺 拱矾唱霸 茄促. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, myX, myY); } // 浇饭捞绢 酒囱 版快俊父 hit茄 吧肺 埃林茄促. if (!pTargetCreature->isSlayer()) { bHit = true; } } } if (bHit) { if (bIncreaseExp) { shareAttrExp(pSlayer, Damage , 1, 8, 1, _GCSkillToTileOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToTileOK1); } } _GCSkillToTileOK1.addShortData(MODIFY_BULLET, RemainBullet); // 醚舅 箭磊甫 临捞绊, 醚舅 箭磊甫 历厘窍绊, 巢篮 醚舅 箭磊甫 罐篮 促澜俊 郴备仿阑 冻绢哆赴促. decreaseDurability(pSlayer, NULL, pSkillInfo->getPoint(), &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(getSkillType()); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -