void EffectIntimateGrail::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY //cout << "EffectIntimateGrail" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); pCreature->removeFlag(Effect::EFFECT_CLASS_INTIMATE_GRAIL); if (pCreature->isPC() ) { PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature); pPC->initAllStatAndSend(); } // pSlayer->initAllStatAndSend(); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_INTIMATE_GRAIL); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); //cout << "EffectIntimateGrail" << "unaffect END" << endl; __END_CATCH }
void EffectDetectHidden::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY //cout << "EffectDetectHidden " << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isSlayer()); // 플래그를 제거한다. pCreature->removeFlag(Effect::EFFECT_CLASS_DETECT_HIDDEN); // 마법의 힘으로 보고 있던 크리쳐들을 삭제한다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); pZone->updateHiddenScan(pCreature); // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DETECT_HIDDEN); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); //cout << "EffectDetectHidden " << "unaffect END" << endl; __END_CATCH }
void EffectAuraShield::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY //cout << "EffectAuraShield" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isSlayer()); // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_AURA_SHIELD); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_AURA_SHIELD); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); //cout << "EffectAuraShield" << "unaffect END" << endl; __END_CATCH }
void SimpleCreatureEffect::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY Assert(pCreature != NULL); // 플래그를 끈다. pCreature->removeFlag(getEffectClass()); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); if (isBroadcastingEffect() ) { pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); } else { Player* pPlayer = pCreature->getPlayer(); if (pPlayer != NULL ) pPlayer->sendPacket(&gcRemoveEffect); } __END_CATCH }
void EffectSpiritGuard::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY // cout << "EffectSpiritGuard " << "unaffect BEGIN" << endl; Assert(pCreature != NULL); if (!pCreature->isSlayer() ) return; Player* pPlayer = dynamic_cast<Player*>(pCreature->getPlayer()); Assert(pPlayer != NULL); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); // Effect를 없애고 알린다. pCreature->removeFlag(Effect::EFFECT_CLASS_SPIRIT_GUARD_1); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(m_EffectClass); pPlayer->sendPacket(&gcRemoveEffect); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect, pCreature); __END_CATCH }
void EffectFlagInsert::unaffect(Item* pItem) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG Assert(pItem != NULL); Assert(pItem->getItemClass()==Item::ITEM_CLASS_CORPSE); Assert(pItem->getItemType()==MONSTER_CORPSE); MonsterCorpse* pCorpse = dynamic_cast<MonsterCorpse*>(pItem); pCorpse->removeFlag(Effect::EFFECT_CLASS_FLAG_INSERT); Zone* pZone = pCorpse->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pItem->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_FLAG_INSERT); pZone->broadcastPacket(pCorpse->getX(), pCorpse->getY(), &gcRemoveEffect); __END_DEBUG __END_CATCH }
void EffectFrozenArmor::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY //cout << "EffectFrozenArmor" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isOusters()); // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_FROZEN_ARMOR); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); Ousters* pTargetOusters = dynamic_cast<Ousters*>(pCreature); Assert(pTargetOusters != NULL); // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_FROZEN_ARMOR); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); //cout << "EffectFrozenArmor" << "unaffect END" << endl; __END_CATCH }
void EffectGreenStalker::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG //cout << "EffectGreenStalker " << "unaffect BEGIN" << endl; Assert(pCreature != NULL); // 크리쳐에게서 플래그를 제거한다. pCreature->removeFlag(Effect::EFFECT_CLASS_GREEN_STALKER); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); // 존에서 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_GREEN_STALKER); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); //cout << "EffectGreenStalker " << "unaffect END" << endl; __END_DEBUG __END_CATCH }
void EffectLoud::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY Assert(pCreature != NULL); // Assert(pCreature->isOusters()); // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_LOUD); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); // Ousters* pTargetOusters = dynamic_cast<Ousters*>(pCreature); // Assert(pTargetOusters != NULL); // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_LOUD); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); __END_CATCH }
void EffectMephisto::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG //cout << "EffectMephisto" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isVampire()); pCreature->removeFlag(Effect::EFFECT_CLASS_MEPHISTO); Vampire* pVampire = dynamic_cast<Vampire*>(pCreature); VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); pVampire->initAllStat(); pVampire->sendRealWearingInfo(); pVampire->sendModifyInfo(prev); Zone* pZone = pVampire->getZone(); Assert(pZone != NULL); // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pVampire->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_MEPHISTO); pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcRemoveEffect); //cout << "EffectMephisto" << "unaffect END" << endl; __END_DEBUG __END_CATCH }
void EffectProtectionFromCurse::unaffect() throw(Error) { __BEGIN_TRY __BEGIN_DEBUG Creature* pCreature = dynamic_cast<Creature*>(m_pTarget); pCreature->removeFlag(Effect::EFFECT_CLASS_PROTECTION_FROM_CURSE); Resist_t resist = pCreature->getResist(MAGIC_DOMAIN_CURSE); resist = max(0,(int)(resist - m_Resist)); pCreature->setResist(MAGIC_DOMAIN_CURSE, resist); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PROTECTION_FROM_CURSE); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); __END_DEBUG __END_CATCH }
void EffectChargingPower::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG //cout << "EffectChargingPower" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isSlayer()); pCreature->removeFlag(Effect::EFFECT_CLASS_CHARGING_POWER); Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_CHARGING_POWER); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcRemoveEffect); //cout << "EffectChargingPower" << "unaffect END" << endl; __END_DEBUG __END_CATCH }
//////////////////////////////////////////////////////////////////////////////// // 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionRandomSay::execute (Creature * pCreature1 , Creature * pCreature2) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG Assert(pCreature1 != NULL); Assert(pCreature2 == NULL); Assert(pCreature1->isNPC()); // RandomSay는 아래에서 보다시피, 임의의 범위(Start와 End) 안의 // 스크립트 중 랜덤을 돌려 하나를 클라이언트에게 보내는 식이다. // 그러므로 Start와 End 사이에 존재하지 않는 스크립트가 있으면 곤란하다. // 스크립트 테이블을 만들 때, RandomSay에 사용하는 것은 // 데이터가 반드시 연속적으로 존재하게 만들어야 한다. NPC* pNPC = dynamic_cast<NPC*>(pCreature1); ScriptID_t scriptID = m_StartScriptID + random() % (m_EndScriptID - m_StartScriptID + 1); const Script* pScript = g_pPublicScriptManager->getScript(scriptID); GCNPCSay gcNPCSay; gcNPCSay.setObjectID(pNPC->getObjectID()); gcNPCSay.setScriptID(pScript->getScriptID()); gcNPCSay.setSubjectID(0); Zone * pZone = pNPC->getZone(); Assert(pZone != NULL); pZone->broadcastPacket(pNPC->getX() , pNPC->getY() , &gcNPCSay); __END_DEBUG __END_CATCH }
void EffectCauseCriticalWounds::unaffect(Creature* pCreature ) throw(Error ) { __BEGIN_TRY //cout << "EffectCauseCriticalWounds " << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isVampire() || pCreature->isOusters() || pCreature->isMonster()); pCreature->removeFlag(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect, pCreature); if (pCreature->isPC() ) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&gcRemoveEffect); } __END_CATCH }
void EffectGnomesWhisper::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY //cout << "EffectGnomesWhisper" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); // Assert(pCreature->isOusters()); // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); pZone->updateInvisibleScan(pCreature); // Ousters* pTargetOusters = dynamic_cast<Ousters*>(pCreature); // Assert(pTargetOusters != NULL); // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_GNOMES_WHISPER); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); //cout << "EffectGnomesWhisper" << "unaffect END" << endl; __END_CATCH }
void EffectExpansion::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG //cout << "EffectExpansion " << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isSlayer() == true); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); pCreature->removeFlag(Effect::EFFECT_CLASS_EXPANSION); Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_EXPANSION); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcRemoveEffect); // 현재 남아있는 체력이 최대 체력보다 크다면, 줄여야 한다. if (pSlayer->getHP(ATTR_CURRENT) > pSlayer->getHP(ATTR_MAX)) { pSlayer->setHP(pSlayer->getHP(ATTR_MAX), ATTR_CURRENT); } GCOtherModifyInfo gcOtherModifyInfo; makeGCOtherModifyInfo(&gcOtherModifyInfo, pSlayer, &prev); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcOtherModifyInfo, pSlayer); //cout << "EffectExpansion " << "unaffect END" << endl; __END_DEBUG __END_CATCH }
void EffectObservingEye::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY //cout << "EffectObservingEye" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isSlayer()); // 슬레이어말고는 걸리지 않는다. pCreature->removeFlag(Effect::EFFECT_CLASS_OBSERVING_EYE); Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_OBSERVING_EYE); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); // 이 이펙트로 보고 있었던 크리쳐들을 삭제한다. pZone->updateInvisibleScan(pCreature); GCOtherModifyInfo gcOtherModifyInfo; makeGCOtherModifyInfo(&gcOtherModifyInfo, pSlayer, &prev); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcOtherModifyInfo, pSlayer); //cout << "EffectObservingEye" << "unaffect END" << endl; __END_CATCH }
void EffectPotentialExplosion::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG //cout << "EffectPotentialExplosion " << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isSlayer()); pCreature->removeFlag(Effect::EFFECT_CLASS_POTENTIAL_EXPLOSION); Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_POTENTIAL_EXPLOSION); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcRemoveEffect); GCOtherModifyInfo gcOtherModifyInfo; makeGCOtherModifyInfo(&gcOtherModifyInfo, pSlayer, &prev); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcOtherModifyInfo, pSlayer); //cout << "EffectPotentialExplosion " << "unaffect END" << endl; __END_DEBUG __END_CATCH }
void EffectCureCriticalWounds::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY Assert(pCreature != NULL); pCreature->removeFlag(Effect::EFFECT_CLASS_CURE_CRITICAL_WOUNDS); Zone* pZone = pCreature->getZone(); Assert(pZone!=NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_CURE_CRITICAL_WOUNDS); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); __END_CATCH }
void EffectPKZoneResurrection::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCreature->getObjectID()); gcAddEffect.setEffectID(getSendEffectClass()); gcAddEffect.setDuration(28); Zone* pZone = pCreature->getZone(); if (pZone != NULL ) pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcAddEffect); pCreature->removeFlag(getEffectClass()); __END_CATCH }
void EffectPoison::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG pCreature->removeFlag(Effect::EFFECT_CLASS_POISON); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_POISON); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); __END_DEBUG __END_CATCH }
void EffectDivineGuidance::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG Assert(pCreature != NULL); pCreature->removeFlag(Effect::EFFECT_CLASS_DIVINE_GUIDANCE); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DIVINE_GUIDANCE); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); __END_DEBUG __END_CATCH }
void EffectDonation200501::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG Assert(pCreature != NULL); // 플래그를 끄고, pCreature->removeFlag(Effect::EFFECT_CLASS_DONATION_200501); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DONATION_200501); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); __END_DEBUG __END_CATCH }
void EffectPlasmaRocketLauncher::unaffect() throw(Error) { __BEGIN_TRY Creature* pCreature = dynamic_cast<Creature*>(m_pTarget); // unaffect(pCreature); if (pCreature == NULL ) return; pCreature->removeFlag(Effect::EFFECT_CLASS_PLASMA_ROCKET_LAUNCHER); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PLASMA_ROCKET_LAUNCHER); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); __END_CATCH }
void EffectArmageddon::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY Assert(pCreature != NULL); //cout << "EffectArmageddon unaffect.." << endl; // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_ARMAGEDDON); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_ARMAGEDDON); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); __END_CATCH }
void EffectEvade::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY //cout << "EffectEvade" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isOusters()); // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_EVADE); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); Ousters* pTargetOusters = dynamic_cast<Ousters*>(pCreature); Assert(pTargetOusters != NULL); OUSTERS_RECORD prev; pTargetOusters->getOustersRecord(prev); pTargetOusters->initAllStat(); pTargetOusters->sendRealWearingInfo(); pTargetOusters->sendModifyInfo(prev); // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_EVADE); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); //cout << "EffectEvade" << "unaffect END" << endl; __END_CATCH }
void EffectHallucination::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG //cout << "EffectHallucination" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_HALLUCINATION); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_HALLUCINATION); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); if (pCreature->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pCreature); Assert(pMonster != NULL); pMonster->deleteAllEnemy(); pZone->monsterScan(pMonster, pMonster->getX(), pMonster->getY(), pMonster->getDir()); } //cout << "EffectHallucination" << "unaffect END" << endl; __END_DEBUG __END_CATCH }
////////////////////////////////////////////////////////////////////////////// // 뱀파이어 셀프 ////////////////////////////////////////////////////////////////////////////// void Invisibility::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) throw(Error) { __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin" << endl; Assert(pVampire != NULL); Assert(pSkillSlot != NULL); try { Player* pPlayer = pVampire->getPlayer(); Zone* pZone = pVampire->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); GCSkillToSelfOK1 _GCSkillToSelfOK1; GCSkillToSelfOK2 _GCSkillToSelfOK2; SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); ZoneCoord_t x = pVampire->getX(); ZoneCoord_t y = pVampire->getY(); // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE ) ) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); Assert(pRankBonus != NULL); HitBonus = pRankBonus->getPoint(); } Tile& rTile = pZone->getTile(pVampire->getX(), pVampire->getY()); int RequiredMP = decreaseConsumeMP(pVampire, pSkillInfo); bool bManaCheck = hasEnoughMana(pVampire, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = checkZoneLevelToUseSkill(pVampire); bool bHitRoll = HitRoll::isSuccessMagic(pVampire, pSkillInfo, pSkillSlot, HitBonus); bool bEffected = pVampire->isFlag(Effect::EFFECT_CLASS_INVISIBILITY) || pVampire->isFlag(Effect::EFFECT_CLASS_FADE_OUT) || pVampire->hasRelicItem() || pVampire->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pVampire->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER) || rTile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL; if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); // 점점 사라지는 이펙트를 생성해서 붙인다. // 실제로 사라지는 것은 이 이펙트 내부에서다. // (한번에 '팍'하고 사라지는 게 아니라서 붙이는 이펙트다.) EffectFadeOut* pEffect= new EffectFadeOut(pVampire); pEffect->setDuration(output.Duration); pEffect->setDeadline(40); pEffect->setInvisibility(); pVampire->addEffect(pEffect); pVampire->setFlag(Effect::EFFECT_CLASS_FADE_OUT); _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); _GCSkillToSelfOK2.setObjectID(pVampire->getObjectID()); _GCSkillToSelfOK2.setSkillType(SkillType); _GCSkillToSelfOK2.setDuration(0); // Send Packet pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK2, pVampire); pSkillSlot->setRunTime(output.Delay); } else { executeSkillFailNormal(pVampire, getSkillType(), NULL); } } catch(Throwable & t) { executeSkillFailException(pVampire, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; __END_CATCH }
////////////////////////////////////////////////////////////////////////////// // 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Invisibility::execute(Monster* pMonster) throw(Error) { __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin(monster)" << endl; Assert(pMonster != NULL); try { Zone* pZone = pMonster->getZone(); Assert(pZone != NULL); GCSkillToSelfOK2 _GCSkillToSelfOK2; if (pMonster->isFlag(Effect::EFFECT_CLASS_HIDE)) { //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(monster)" << endl; return; } SkillType_t SkillType = SKILL_INVISIBILITY; SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); ZoneCoord_t x = pMonster->getX(); ZoneCoord_t y = pMonster->getY(); bool bRangeCheck = checkZoneLevelToUseSkill(pMonster); bool bHitRoll = HitRoll::isSuccessMagic(pMonster, pSkillInfo); bool bEffected = (pMonster->isFlag(Effect::EFFECT_CLASS_INVISIBILITY) || pMonster->isFlag(Effect::EFFECT_CLASS_FADE_OUT)); if (bRangeCheck && bHitRoll && !bEffected) { SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); // 점점 사라지는 이펙트를 생성해서 붙인다. // 실제로 사라지는 것은 이 이펙트 내부에서다. // (한번에 '팍'하고 사라지는 게 아니라서 붙이는 이펙트다.) EffectFadeOut* pEffect= new EffectFadeOut(pMonster); pEffect->setDuration(output.Duration); pEffect->setDeadline(40); pEffect->setInvisibility(); pMonster->addEffect(pEffect); pMonster->setFlag(Effect::EFFECT_CLASS_FADE_OUT); _GCSkillToSelfOK2.setObjectID(pMonster->getObjectID()); _GCSkillToSelfOK2.setDuration(0); _GCSkillToSelfOK2.setSkillType(SkillType); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK2); } else { executeSkillFailNormal(pMonster, getSkillType(), NULL); } } catch(Throwable & t) { executeSkillFailException(pMonster, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(monster)" << endl; __END_CATCH }
void Howl::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) throw(Error) { __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin" << endl; Assert(pVampire != NULL); // 패킷 핸들러에서 직접 수행하는 기술 핸들러이기 때문에 // 스킬 핸들러가 널이다. //Assert(pSkillSlot != NULL); try { Player* pPlayer = pVampire->getPlayer(); Zone* pZone = pVampire->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); GCSkillToSelfOK1 _GCSkillToSelfOK1; GCSkillToSelfOK2 _GCSkillToSelfOK2; SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); int RequiredMP = 10; bool bManaCheck = hasEnoughMana(pVampire, RequiredMP); bool bTimeCheck = verifyRunTime(pVampireSkillSlot); bool bRangeCheck = checkZoneLevelToUseSkill(pVampire); bool bHitRoll = (rand()%100)<output.Range; bool bEffected = pVampire->isFlag(Effect::EFFECT_CLASS_HOWL); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); ZoneCoord_t x = pVampire->getX(); ZoneCoord_t y = pVampire->getY(); ObjectID_t objectID = pVampire->getObjectID(); EffectHowl* pEffect = new EffectHowl(pVampire); pEffect->setDeadline(output.Duration); pVampire->setFlag(Effect::EFFECT_CLASS_HOWL); pVampire->addEffect(pEffect); VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); pVampire->initAllStat(); pVampire->sendModifyInfo(prev); _GCSkillToSelfOK1.setSkillType(SKILL_HOWL); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); _GCSkillToSelfOK2.setObjectID(objectID); _GCSkillToSelfOK2.setSkillType(SKILL_HOWL); _GCSkillToSelfOK2.setDuration(0); pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK2, pVampire); GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pVampire->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_HOWL); gcAddEffect.setDuration(output.Duration); pPlayer->sendPacket(&gcAddEffect); } else { executeSkillFailNormal(pVampire, getSkillType(), NULL); } } catch(Throwable & t) { executeSkillFailException(pVampire, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; __END_CATCH }