📄 simpletilemeleeskill.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : SimpleTileMeleeSkill.cpp// Written by : excel96// Description : //////////////////////////////////////////////////////////////////////////////#include "SimpleTileMeleeSkill.h"#include "CrossCounter.h"#include "ZoneUtil.h"#include "Gpackets/GCSkillToTileOK1.h"#include "Gpackets/GCSkillToTileOK2.h"#include "Gpackets/GCSkillToTileOK5.h"SimpleTileMeleeSkill g_SimpleTileMeleeSkill;//////////////////////////////////////////////////////////////////////////////// class SimpleTileMeleeSkill member methods//////////////////////////////////////////////////////////////////////////////void SimpleTileMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, const SIMPLE_SKILL_INPUT& param, SIMPLE_SKILL_OUTPUT& result, CEffectID_t CEffectID, bool bForceKnockback) throw (Error){ __BEGIN_TRY Assert(pSlayer != NULL); Assert(pSkillSlot != NULL); try { Player* pPlayer = pSlayer->getPlayer(); Zone* pZone = pSlayer->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); // 父老 捞 扁贱捞 漂喊茄 公扁啊 乐绢具 矫傈且 荐 乐绰 扁贱捞扼搁... // 弊 拌凯狼 公扁甫 甸绊 乐绰瘤甫 眉农秦辑 酒聪扼搁 角菩促. bool bIncreaseExp = true; if (param.ItemClass != Item::ITEM_CLASS_MAX) { Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != param.ItemClass) { executeSkillFailException(pSlayer, param.SkillType); return; } bIncreaseExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); } GCSkillToTileOK1 _GCSkillToTileOK1; GCSkillToTileOK2 _GCSkillToTileOK2; GCSkillToTileOK5 _GCSkillToTileOK5; SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(param.SkillType); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); int RequiredMP = (int)pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); // 付唱啊 乐绢具 窍绊, 矫埃苞 芭府 眉农俊 己傍窍绊, if (bManaCheck && bTimeCheck && bRangeCheck) { // MP甫 冻绢哆赴促. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); // 谅钎客 规氢阑 备茄促. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); Damage_t Damage = 0; Damage_t MaxDamage = 0; bool bCriticalHit = false; bool bHit = false; VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1); list<Creature*> cList; list<TILE_MASK>::const_iterator itr = param.MaskList.begin(); for (; itr != param.MaskList.end(); itr++) { TILE_MASK mask = (*itr); int tileX = X + mask.x; int tileY = Y + mask.y; int penalty = mask.penalty; // 泅犁 鸥老捞 粮 郴何捞绊, 救傈瘤措啊 酒聪扼搁, 嘎阑 犬伏捞 乐促. if (rect.ptInRect(tileX, tileY)) { // 鸥老阑 罐酒柯促. Tile& tile = pZone->getTile(tileX, tileY); list<Creature*> targetList; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); targetList.push_back(pCreature); } if (tile.hasCreature(Creature::MOVE_MODE_FLYING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_FLYING); targetList.push_back(pCreature); } if (tile.hasCreature(Creature::MOVE_MODE_BURROWING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_BURROWING); targetList.push_back(pCreature); } list<Creature*>::iterator itr = targetList.begin(); for(; itr != targetList.end(); itr++) { Creature* pTargetCreature = (*itr); Assert(pTargetCreature != NULL); if (pTargetCreature->getObjectID() != pSlayer->getObjectID()) { bool bMoveModeCheck = (pTargetCreature->getMoveMode() == Creature::MOVE_MODE_WALKING) ? true : false; bool bRaceCheck = pTargetCreature->isNPC() || pTargetCreature->isSlayer(); bool bHitRoll = false; bool bCanHit = canHit(pSlayer, pTargetCreature, param.SkillType); bool bPK = verifyPK(pSlayer, pTargetCreature); bool bZoneLevelCheck = checkZoneLevelToHitTarget(pTargetCreature); bool bSetMinDamage = false; if (param.bMagicHitRoll) { bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); } else { bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, SkillLevel/2); } if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) // by sigi. 2002.10.30 || pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) // 2003.3.14 { bHitRoll = false; } // 档 拌凯狼 扁贱篮 嘎瘤 臼歹扼档 7%狼 单固瘤甫 啊柳促 - by bezz if ( param.ItemClass == Item::ITEM_CLASS_BLADE && !bHitRoll ) { bHitRoll = true; bSetMinDamage = true; } if (bMoveModeCheck && !bRaceCheck && bHitRoll && bCanHit && bPK && bZoneLevelCheck) { CheckCrossCounter(pSlayer, pTargetCreature, Damage, pSkillInfo->getRange()); bCriticalHit = false; Damage = 0; if (param.bAdd) { Damage += computeDamage(pSlayer, pTargetCreature, SkillLevel/5, bCriticalHit); } if (param.bMagicDamage) { Damage += computeMagicDamage(pTargetCreature, param.SkillDamage, param.SkillType); } else { Damage += param.SkillDamage; } // HitRoll 俊辑 角菩茄 档 拌凯狼 扁贱狼 版快 7%狼 单固瘤甫 爱档废 茄促 - by bezz if ( bSetMinDamage ) { Damage = getPercentValue( Damage, 7 ); } MaxDamage = max(Damage, MaxDamage); // 其澄萍绰 扁夯利栏肺 100捞促. Damage = getPercentValue(Damage, penalty); ObjectID_t targetObjectID = pTargetCreature->getObjectID(); cList.push_back(pTargetCreature); _GCSkillToTileOK1.addCListElement(targetObjectID); _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); // 老窜 嘎绰 仇捞 罐阑 菩哦篮 澄 惑怕肺 茄 盲肺, 单固瘤甫 霖促. setDamage(pTargetCreature, Damage, pSlayer, param.SkillType, NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); // 农府萍拿 洒飘扼搁 惑措规阑 第肺 拱矾唱霸 茄促. if (bCriticalHit || bForceKnockback) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } // 惑措规捞 浇饭捞绢啊 酒匆 版快俊父 嘎冕 吧肺 埃林茄促. if (!pTargetCreature->isSlayer()) { bHit = true; } } } } //for (; itr != objectList.end(); itr++) } // if (rect.ptInRect(tileX, tileY) && ... } // for (int count=0; count<3; count++) if (bHit) { if (bIncreaseExp) { shareAttrExp(pSlayer, MaxDamage, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToTileOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToTileOK1); } } decreaseDurability(pSlayer, NULL, pSkillInfo->getPoint(), &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(param.SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); _GCSkillToTileOK1.setY(Y); _GCSkillToTileOK1.setRange(dir); _GCSkillToTileOK1.setDuration(0); _GCSkillToTileOK2.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK2.setSkillType(param.SkillType); _GCSkillToTileOK2.setX(X); _GCSkillToTileOK2.setY(Y); _GCSkillToTileOK2.setRange(dir); _GCSkillToTileOK2.setDuration(0); _GCSkillToTileOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK5.setSkillType(param.SkillType); _GCSkillToTileOK5.setX(X); _GCSkillToTileOK5.setY(Y); _GCSkillToTileOK5.setRange(dir); _GCSkillToTileOK5.setDuration(0); pPlayer->sendPacket(&_GCSkillToTileOK1); // 捞 扁贱俊 狼秦 康氢阑 罐绰 仇甸俊霸 菩哦阑 焊郴拎具 茄促. for (list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature * pTargetCreature = *itr; Assert(pTargetCreature != NULL); if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); // HP狼 函版荤亲阑 菩哦俊促 扁废茄促. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) targetHP = (dynamic_cast<Slayer*>(pTargetCreature))->getHP(ATTR_CURRENT); else if (pTargetCreature->isVampire()) targetHP = (dynamic_cast<Vampire*>(pTargetCreature))->getHP(ATTR_CURRENT); else if (pTargetCreature->isOusters()) targetHP = (dynamic_cast<Ousters*>(pTargetCreature))->getHP(ATTR_CURRENT); _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); // 酒捞袍狼 郴备仿阑 冻绢哆赴促. decreaseDurability(NULL, pTargetCreature, pSkillInfo->getPoint(), NULL, &_GCSkillToTileOK2); // 菩哦阑 焊郴霖促. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { // 寸辟 利栏肺 牢侥茄促. Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature); pMonster->addEnemy(pSlayer); } } cList.push_back(pSlayer); pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK5 , cList); // set Next Run Time pSkillSlot->setRunTime(param.Delay); result.bSuccess = true; } else { executeSkillFailNormal(pSlayer, param.SkillType, NULL); } } catch (Throwable & t) { executeSkillFailException(pSlayer, param.SkillType); } __END_CATCH}void SimpleTileMeleeSkill::execute(Vampire* pVampire, int X, int Y, VampireSkillSlot* pVampireSkillSlot, const SIMPLE_SKILL_INPUT& param, SIMPLE_SKILL_OUTPUT& result, CEffectID_t CEffectID, bool bForceKnockback) throw (Error){ __BEGIN_TRY Assert(pVampire != NULL); Assert(pVampireSkillSlot != NULL); try { Player* pPlayer = pVampire->getPlayer(); Zone* pZone = pVampire->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); GCSkillToTileOK1 _GCSkillToTileOK1; GCSkillToTileOK2 _GCSkillToTileOK2; GCSkillToTileOK5 _GCSkillToTileOK5; SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(param.SkillType); int RequiredMP = (int)pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pVampire, RequiredMP); bool bTimeCheck = verifyRunTime(pVampireSkillSlot); bool bRangeCheck = verifyDistance(pVampire, X, Y, pSkillInfo->getRange()); // 付唱啊 乐绢具 窍绊, 矫埃苞 芭府 眉农俊 己傍窍绊, if (bManaCheck && bTimeCheck && bRangeCheck) { // MP甫 冻绢哆赴促. decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); // 谅钎客 规氢阑 备茄促. ZoneCoord_t myX = pVampire->getX();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -