📄 bloodywall.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : BloodyWall.cpp// Written by : // Description : //////////////////////////////////////////////////////////////////////////////#include "BloodyWall.h"#include "EffectBloodyWall.h"#include "Creature.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"#include "Gpackets/GCSkillFailed1.h"BloodyWall::BloodyWall() throw(){ // LEFT m_BloodyWallMask[0][0].set( 0, -2 ); m_BloodyWallMask[0][1].set( 0, -1 ); m_BloodyWallMask[0][2].set( 0, 0 ); m_BloodyWallMask[0][3].set( 0, 1 ); m_BloodyWallMask[0][4].set( 0, 2 ); // LEFTDOWN m_BloodyWallMask[1][0].set( -1, -1 ); m_BloodyWallMask[1][1].set( -1, 0 ); m_BloodyWallMask[1][2].set( 0, 0 ); m_BloodyWallMask[1][3].set( 0, 1 ); m_BloodyWallMask[1][4].set( 1, 1 ); // DOWN m_BloodyWallMask[2][0].set( -2, 0 ); m_BloodyWallMask[2][1].set( -1, 0 ); m_BloodyWallMask[2][2].set( 0, 0 ); m_BloodyWallMask[2][3].set( 1, 0 ); m_BloodyWallMask[2][4].set( 2, 0 ); // RIGHTDOWN m_BloodyWallMask[3][4].set( 1, -1 ); m_BloodyWallMask[3][4].set( 1, 0 ); m_BloodyWallMask[3][4].set( 0, 0 ); m_BloodyWallMask[3][4].set( 0, 1 ); m_BloodyWallMask[3][4].set( -1, 1 ); // RIGHT m_BloodyWallMask[4][0].set( 0, -2 ); m_BloodyWallMask[4][1].set( 0, -1 ); m_BloodyWallMask[4][2].set( 0, 0 ); m_BloodyWallMask[4][3].set( 0, 1 ); m_BloodyWallMask[4][4].set( 0, 2 ); // RIGHTUP m_BloodyWallMask[5][0].set( -1, -1 ); m_BloodyWallMask[5][1].set( 0, -1 ); m_BloodyWallMask[5][2].set( 0, 0 ); m_BloodyWallMask[5][3].set( 1, 0 ); m_BloodyWallMask[5][4].set( 1, 1 ); // UP m_BloodyWallMask[6][0].set( -2, 0 ); m_BloodyWallMask[6][1].set( -1, 0 ); m_BloodyWallMask[6][2].set( 0, 0 ); m_BloodyWallMask[6][3].set( 1, 0 ); m_BloodyWallMask[6][4].set( 2, 0 ); // LEFTUP m_BloodyWallMask[7][0].set( -1, 1 ); m_BloodyWallMask[7][1].set( -1, 0 ); m_BloodyWallMask[7][2].set( 0, 0 ); m_BloodyWallMask[7][3].set( 0, -1 ); m_BloodyWallMask[7][4].set( 1, -1 );};//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void BloodyWall::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); // NoSuch力芭. by sigi. 2002.5.2 if (pTargetCreature==NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) // by sigi. 2002.10.30 ) { executeSkillFailException(pVampire, getSkillType()); return; } execute(pVampire, pTargetCreature->getX(), pTargetCreature->getY(), pVampireSkillSlot, CEffectID); } catch (Throwable & t) { executeSkillFailException(pVampire, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢 鸥老 勤甸矾//////////////////////////////////////////////////////////////////////////////void BloodyWall::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; 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; GCSkillToTileOK3 _GCSkillToTileOK3; GCSkillToTileOK4 _GCSkillToTileOK4; GCSkillToTileOK5 _GCSkillToTileOK5; GCSkillToTileOK6 _GCSkillToTileOK6; SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); // Knowledge of Blood 啊 乐促搁 hit bonus 10 int HitBonus = 0; if ( pVampire->hasRankBonus( RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD ) ) { RankBonus* pRankBonus = pVampire->getRankBonus( RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD ); 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)) bTileCheck = true; if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck) { decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); // 捞棋飘狼 瘤加矫埃阑 拌魂茄促. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); Dir_t Dir = getDirectionToPosition( myX, myY, X, Y ); list<Creature*> cList; // denier list for (int i=0; i<5; i++) { POINT& pt = m_BloodyWallMask[Dir][i]; int tileX = X+pt.x; int tileY = Y+pt.y; if (rect.ptInRect(tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); if ( tile.getEffect( Effect::EFFECT_CLASS_TRYING_POSITION )!=NULL ) continue; // 泅犁 鸥老俊促 捞棋飘甫 眠啊且 荐 乐促搁... if (tile.canAddEffect()) { // 鞍篮 effect啊 乐栏搁 瘤款促. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOODY_WALL); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID);// fix me } // 捞棋飘 努贰胶甫 积己茄促. EffectBloodyWall* pEffect = new EffectBloodyWall(pZone , tileX, tileY); pEffect->setCasterName( pVampire->getName() ); pEffect->setCasterID( pVampire->getObjectID() ); pEffect->setClan( Creature::CREATURE_CLASS_VAMPIRE, pVampire->getClanType() ); pEffect->setDamage( output.Damage ); pEffect->setDeadline(output.Duration); pEffect->setLevel(pVampire->getINT()); pEffect->setNextTime(0); pEffect->setTick(output.Tick); // Tile俊 嘿捞绰 Effect绰 ObjectID甫 殿废罐酒具 茄促. ObjectRegistry & objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); const slist<Object*>& oList = tile.getObjectList(); for(slist<Object*>::const_iterator itr = oList.begin(); itr != oList.end(); itr++) { Object* pTarget = *itr; Creature* pTargetCreature = NULL; if ( pTarget->getObjectClass() == Object::OBJECT_CLASS_CREATURE && ( (pTargetCreature = dynamic_cast<Creature*>(pTarget))->isSlayer() || pTargetCreature->isOusters() ) && !checkZoneLevelToHitTarget( pTargetCreature ) ) { cList.push_back(pTargetCreature); _GCSkillToTileOK2.addCListElement(pTargetCreature->getObjectID()); _GCSkillToTileOK4.addCListElement(pTargetCreature->getObjectID()); _GCSkillToTileOK5.addCListElement(pTargetCreature->getObjectID()); pEffect->affect(pTargetCreature); }// pEffect->affect(pTarget); } } } } _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); _GCSkillToTileOK1.setY(Y); _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Dir); _GCSkillToTileOK2.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); _GCSkillToTileOK2.setY(Y); _GCSkillToTileOK2.setDuration(output.Duration); _GCSkillToTileOK2.setRange(Dir); //_GCSkillToTileOK2.addShortData(MODIFY_VISION, BLOODY_WALL_SIGHT); _GCSkillToTileOK3.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setRange(Dir); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK5.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); _GCSkillToTileOK5.setY(Y); _GCSkillToTileOK5.setRange(Dir); _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK6.setOrgXY(myX, myY); _GCSkillToTileOK6.setSkillType(SkillType); _GCSkillToTileOK6.setX(X); _GCSkillToTileOK6.setY(Y); _GCSkillToTileOK6.setDuration(output.Duration); _GCSkillToTileOK6.setRange(Dir); //_GCSkillToTileOK6.addShortData(MODIFY_VISION, BLOODY_WALL_SIGHT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -