📄 acidswamp.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : AcidSwamp.cpp// Written by : excel96// Description : //////////////////////////////////////////////////////////////////////////////#include "AcidSwamp.h"#include "EffectAcidSwamp.h"#include "RankBonus.h"#include "Gpackets/GCSkillToTileOK1.h"#include "Gpackets/GCSkillToTileOK2.h"#include "Gpackets/GCSkillToTileOK3.h"#include "Gpackets/GCSkillToTileOK4.h"#include "Gpackets/GCSkillToTileOK5.h"#include "Gpackets/GCSkillToTileOK6.h"#include "Gpackets/GCAddEffect.h"//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void AcidSwamp::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << "begin " << endl; Assert(pVampire != NULL); Assert(pVampireSkillSlot != NULL); try { Zone* pZone = pVampire->getZone(); Assert(pZone != NULL); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); //Assert(pTargetCreature != NULL); // NPC绰 傍拜且 荐啊 绝促. if (pTargetCreature==NULL // NoSuch力芭 锭巩俊.. by sigi. 2002.5.2 || pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) // by sigi. 2002.10.30 || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; return; } execute(pVampire, pTargetCreature->getX(), pTargetCreature->getY(), pVampireSkillSlot, CEffectID); } catch (Throwable & t) { executeSkillFailException(pVampire, getSkillType()); //cout << t.toString() << endl; } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢 鸥老 勤甸矾//////////////////////////////////////////////////////////////////////////////void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << "begin " << endl; try { Player* pPlayer = pVampire->getPlayer(); Zone* pZone = pVampire->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); GCSkillToTileOK1 _GCSkillToTileOK1; GCSkillToTileOK2 _GCSkillToTileOK2; GCSkillToTileOK3 _GCSkillToTileOK3; GCSkillToTileOK4 _GCSkillToTileOK4; GCSkillToTileOK5 _GCSkillToTileOK5; GCSkillToTileOK6 _GCSkillToTileOK6; SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); // Knowledge of Acid 啊 乐促搁 hit bonus 10 int HitBonus = 0; if ( pVampire->hasRankBonus( RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID ) ) { RankBonus* pRankBonus = pVampire->getRankBonus( RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID ); Assert( pRankBonus != NULL ); HitBonus = pRankBonus->getPoint(); } int RequiredMP = decreaseConsumeMP(pVampire, pSkillInfo); bool bManaCheck = hasEnoughMana(pVampire, RequiredMP); bool bTimeCheck = verifyRunTime(pVampireSkillSlot); bool bRangeCheck = verifyDistance(pVampire, X, Y, pSkillInfo->getRange()); bool bHitRoll = HitRoll::isSuccessMagic(pVampire, pSkillInfo, pVampireSkillSlot, HitBonus); bool bTileCheck = false; VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1); if (rect.ptInRect(X, Y)) { Tile& tile = pZone->getTile(X, Y); if (tile.canAddEffect()) bTileCheck = true; // 赣矫 弊扼款靛 乐澜 眠啊 给茄寸. if ( tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL ) bTileCheck=false; if ( tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL ) bTileCheck=false; } if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck) { decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); Tile& tile = pZone->getTile(X, Y); Range_t Range = 1; // 亲惑 1捞促. // 鞍篮 捞棋飘啊 捞固 粮犁茄促搁 昏力茄促. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ACID_SWAMP); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } checkMine( pZone, X, Y ); // 单固瘤客 瘤加 矫埃阑 拌魂茄促. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); // Wisdom of Swamp 啊 乐促搁 瘤加矫埃 20% 刘啊 if ( pVampire->hasRankBonus( RankBonus::RANK_BONUS_WISDOM_OF_SWAMP ) ) { RankBonus* pRankBonus = pVampire->getRankBonus( RankBonus::RANK_BONUS_WISDOM_OF_SWAMP ); Assert( pRankBonus != NULL ); output.Duration += getPercentValue( output.Duration, pRankBonus->getPoint() ); } // 捞棋飘 坷宏璃飘甫 积己茄促. EffectAcidSwamp* pEffect = new EffectAcidSwamp(pZone, X, Y); pEffect->setUserObjectID( pVampire->getObjectID() ); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); pEffect->setTick(output.Tick); pEffect->setDamage(output.Damage); pEffect->setLevel(pSkillInfo->getLevel()/2); pEffect->setVampire(); if ( tile.hasCreature( Creature::MOVE_MODE_WALKING ) ) { pEffect->setWalkingTargetObjectID( tile.getCreature( Creature::MOVE_MODE_WALKING )->getObjectID() ); } if ( tile.hasCreature( Creature::MOVE_MODE_BURROWING ) ) { pEffect->setBurrowingTargetObjectID( tile.getCreature( Creature::MOVE_MODE_BURROWING )->getObjectID() ); } // 鸥老俊 嘿篮 捞棋飘绰 OID甫 罐酒具 茄促. ObjectRegistry & objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); // 粮 棺 鸥老俊促啊 捞棋飘甫 眠啊茄促. pZone->addEffect(pEffect); tile.addEffect(pEffect); // 鸥老 困俊 农府媚啊 乐促搁 官肺 康氢阑 林档废 茄促. bool bEffected = false; Creature* pTargetCreature = NULL; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) pTargetCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); if (pTargetCreature != NULL) { if (pTargetCreature->isSlayer()||pTargetCreature->isOusters()) { pEffect->affect(); bEffected = true; Player* pTargetPlayer = pTargetCreature->getPlayer(); bool bCanSee = canSee(pTargetCreature, pVampire); if (bCanSee) { _GCSkillToTileOK2.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); _GCSkillToTileOK2.setY(Y); _GCSkillToTileOK2.setDuration(output.Duration); _GCSkillToTileOK2.setRange(Range); pTargetPlayer->sendPacket(&_GCSkillToTileOK2); } else { _GCSkillToTileOK6.setOrgXY(myX, myY); _GCSkillToTileOK6.setSkillType(SkillType); _GCSkillToTileOK6.setX(X); _GCSkillToTileOK6.setY(Y); _GCSkillToTileOK6.setDuration(output.Duration); _GCSkillToTileOK6.setRange(Range); pTargetPlayer->sendPacket(&_GCSkillToTileOK6); } } else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature); pEffect->affect(); bEffected = true; pMonster->addEnemy(pVampire); } } _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); _GCSkillToTileOK1.setY(Y); _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); _GCSkillToTileOK3.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); _GCSkillToTileOK5.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); _GCSkillToTileOK5.setY(Y); _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); if (bEffected) { _GCSkillToTileOK1.addCListElement(pTargetCreature->getObjectID()); _GCSkillToTileOK4.addCListElement(pTargetCreature->getObjectID()); _GCSkillToTileOK5.addCListElement(pTargetCreature->getObjectID()); } pPlayer->sendPacket(&_GCSkillToTileOK1); list<Creature*> cList; cList.push_back(pVampire); if (bEffected) cList.push_back(pTargetCreature); cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3 , cList); pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4 , cList); pVampireSkillSlot->setRunTime(output.Delay); } else { executeSkillFailNormal(pVampire, getSkillType(), NULL); } } catch (Throwable & t) { executeSkillFailException(pVampire, getSkillType()); //cout << t.toString() << endl; } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 阁胶磐 鸥老 勤甸矾//////////////////////////////////////////////////////////////////////////////void AcidSwamp::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << "begin(monster) " << endl; try { Zone* pZone = pMonster->getZone(); Assert(pZone != NULL); GCSkillToTileOK2 _GCSkillToTileOK2; GCSkillToTileOK3 _GCSkillToTileOK3; GCSkillToTileOK4 _GCSkillToTileOK4; GCSkillToTileOK5 _GCSkillToTileOK5; GCSkillToTileOK6 _GCSkillToTileOK6; SkillType_t SkillType = SKILL_ACID_SWAMP; SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); bool bRangeCheck = verifyDistance(pMonster, X, Y, pSkillInfo->getRange()); bool bHitRoll = HitRoll::isSuccessMagic(pMonster, pSkillInfo); bool bTileCheck = false; VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1); if (rect.ptInRect(X, Y)) { Tile& tile = pZone->getTile(X, Y); if (tile.canAddEffect()) bTileCheck = true; // 赣矫 弊扼款靛 乐澜 眠啊 给茄寸. if ( tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL ) bTileCheck=false; } if (bRangeCheck && bHitRoll && bTileCheck) { if( rand() % 100 < 50 ) { checkMine( pZone, X, Y ); } Tile& tile = pZone->getTile(X, Y); Range_t Range = 1; // 亲惑 1捞促. // 鞍篮 捞棋飘啊 捞固 粮犁茄促搁 昏力茄促. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ACID_SWAMP); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } // 单固瘤客 瘤加 矫埃阑 拌魂茄促. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); // 捞棋飘 坷宏璃飘甫 积己茄促. EffectAcidSwamp* pEffect = new EffectAcidSwamp(pZone, X, Y); pEffect->setUserObjectID( pMonster->getObjectID() ); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); pEffect->setTick(output.Tick); pEffect->setDamage(output.Damage); pEffect->setLevel(pSkillInfo->getLevel()/2); // 鸥老俊 嘿篮 捞棋飘绰 OID甫 罐酒具 茄促. ObjectRegistry & objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); // 粮 棺 鸥老俊促啊 捞棋飘甫 眠啊茄促. pZone->addEffect(pEffect); tile.addEffect(pEffect); // 鸥老 困俊 农府媚啊 乐促搁 官肺 康氢阑 林档废 茄促. bool bEffected = false; Creature* pTargetCreature = NULL; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) pTargetCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); ZoneCoord_t myX = pMonster->getX(); ZoneCoord_t myY = pMonster->getY(); if (pTargetCreature != NULL) { if (pTargetCreature->isPC()) { pEffect->affect(); Player* pTargetPlayer = pTargetCreature->getPlayer(); bool bCanSee = canSee(pTargetCreature, pMonster); if (bCanSee) { _GCSkillToTileOK2.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); _GCSkillToTileOK2.setY(Y); _GCSkillToTileOK2.setDuration(output.Duration); _GCSkillToTileOK2.setRange(Range); pTargetPlayer->sendPacket(&_GCSkillToTileOK2); } else { _GCSkillToTileOK6.setOrgXY(myX, myY); _GCSkillToTileOK6.setSkillType(SkillType); _GCSkillToTileOK6.setX(X); _GCSkillToTileOK6.setY(Y); _GCSkillToTileOK6.setDuration(output.Duration); _GCSkillToTileOK6.setRange(Range); pTargetPlayer->sendPacket(&_GCSkillToTileOK6); } } else if (pTargetCreature->isMonster()) { Monster* pTargetMonster = dynamic_cast<Monster*>(pTargetCreature); pEffect->affect(); pTargetMonster->addEnemy(pMonster); } } _GCSkillToTileOK3.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); _GCSkillToTileOK5.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); _GCSkillToTileOK5.setY(Y); _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); if (bEffected) { _GCSkillToTileOK4.addCListElement(pTargetCreature->getObjectID()); _GCSkillToTileOK5.addCListElement(pTargetCreature->getObjectID()); } list<Creature*> cList; cList.push_back(pMonster); if (bEffected) cList.push_back(pTargetCreature); cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3 , cList); pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4 , cList); } else { executeSkillFailNormal(pMonster, getSkillType(), NULL); } } catch (Throwable & t) { executeSkillFailException(pMonster, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end(monster) " << endl; __END_CATCH}AcidSwamp g_AcidSwamp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -