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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 EffectRegenZone::unaffect() throw(Error) { __BEGIN_TRY MonsterCorpse* pTower = dynamic_cast<MonsterCorpse*>(m_pTarget); Assert(pTower != NULL); pTower->removeFlag(getEffectClass()); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pTower->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); pTower->getZone()->broadcastPacket(pTower->getX(), pTower->getY(), &gcRemoveEffect); __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 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 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 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 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 EffectTrying::unaffect() throw(Error) { __BEGIN_TRY /* GCDeleteEffectFromTile gcDeleteEffect; gcDeleteEffect.setEffectID(getSendEffectClass()); gcDeleteEffect.setObjectID(getObjectID()); gcDeleteEffect.setXY(m_X, m_Y); m_pZone->broadcastPacket(m_X, m_Y, &gcDeleteEffect);*/ Creature* pCreature = dynamic_cast<Creature*>(m_pTarget); Assert(pCreature != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.addEffectList(getSendEffectClass()); gcRemoveEffect.setObjectID(pCreature->getObjectID()); pCreature->getZone()->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); __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 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 EffectCureCriticalWounds::affect(Creature* pCreature) throw(Error) { __BEGIN_TRY Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); GCSkillToSelfOK1 _GCSkillToSelfOK1; GCSkillToSelfOK2 _GCSkillToSelfOK2; int X = pCreature->getX(); int Y = pCreature->getY(); Exp_t ExpUp = 0; bool bCured = false; for(int oY = -2; oY <= 2; oY++) for(int oX = -2; oX <= 2; oX++) { int tileX = X+oX; int tileY = Y+oY; if (isValidZoneCoord(pZone, tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); if (tile.hasCreature(Creature::MOVE_MODE_WALKING ) ) { const list<Object*>& oList = tile.getObjectList(); for(list<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()) { Assert(pTargetCreature != NULL); HP_t RemainHP = 0; if (pTargetCreature->isSlayer() && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA) ) { Slayer* pSlayer = dynamic_cast<Slayer*>(pTargetCreature); HP_t CurrentHP = pSlayer->getHP(ATTR_CURRENT); HP_t MaxHP = pSlayer->getHP(ATTR_MAX); if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN)) { ExpUp++; Effect* pEffect = pSlayer->findEffect(Effect::EFFECT_CLASS_BLOOD_DRAIN); EffectBloodDrain * pEffectBloodDrain = dynamic_cast<EffectBloodDrain*>(pEffect); Assert(pEffectBloodDrain != NULL); if (pEffectBloodDrain->getLevel() < CriticalBloodDrainLevel ) { // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pSlayer->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast<EffectAftermath*>(pEffect); pEffectAftermath->setDeadline(5*600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pSlayer); pEffectAftermath->setDeadline(5*600); // 5분 동안 지속된다. pSlayer->addEffect(pEffectAftermath); pSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pSlayer->getName()); } pEffectBloodDrain->destroy(pSlayer->getName()); pSlayer->deleteEffect(Effect::EFFECT_CLASS_BLOOD_DRAIN); bCured = true; SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_BLOOD_DRAIN); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcRemoveEffect); } } if(CurrentHP < MaxHP ) { ExpUp++; bCured = true; RemainHP = min(CurrentHP + m_Point,(int)MaxHP); pSlayer->setHP(RemainHP, ATTR_CURRENT); GCModifyInformation gcMI; gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pSlayer->getPlayer()->sendPacket(&gcMI); _GCSkillToSelfOK1.setSkillType(SKILL_CURE_EFFECT); _GCSkillToSelfOK1.setDuration(0); pSlayer->getPlayer()->sendPacket(&_GCSkillToSelfOK1); _GCSkillToSelfOK2.setObjectID(pSlayer->getObjectID()); _GCSkillToSelfOK2.setSkillType(SKILL_CURE_EFFECT); _GCSkillToSelfOK2.setDuration(0); pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &_GCSkillToSelfOK2, pTargetCreature); Zone* pZone = pTargetCreature->getZone(); GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetCreature->getObjectID()); gcStatusCurrentHP.setCurrentHP(RemainHP); pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &gcStatusCurrentHP); } } } } } } } SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_CURE_CRITICAL_WOUNDS); if(pSkillInfo != NULL && bCured ) { SkillSlot * pSkillSlot = ((Slayer*)pCreature)->hasSkill(SKILL_CURE_CRITICAL_WOUNDS); if(pSkillSlot != NULL ) { Slayer * pCastSlayer = dynamic_cast<Slayer*>(pCreature); GCModifyInformation gcMI; SkillDomainType_t DomainType = pSkillInfo->getDomainType(); // 경험치를 올려준다. shareAttrExp(pCastSlayer, ExpUp, 1 , 1 , 8, gcMI); increaseDomainExp(pCastSlayer, DomainType, ExpUp, gcMI); increaseSkillExp(pCastSlayer, DomainType, pSkillSlot, pSkillInfo, gcMI); pCastSlayer->getPlayer()->sendPacket(&gcMI); } } //cout << "EffectCureCriticalWounds " << "affect BEGIN" << endl; setNextTime(m_Delay); //cout << "EffectCureCriticalWounds " << "affect END" << endl; __END_CATCH }
////////////////////////////////////////////////////////////////////////////// // 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void RemoveCurse::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 { Player* pPlayer = pSlayer->getPlayer(); Zone* pZone = pSlayer->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); //Assert(pTargetCreature != NULL); // 슬레이어 외에는 치료할 수 없다. // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature==NULL || pTargetCreature->isSlayer() == false) { executeSkillFailException(pSlayer, getSkillType()); //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } GCSkillToObjectOK1 _GCSkillToObjectOK1; GCSkillToObjectOK2 _GCSkillToObjectOK2; GCSkillToObjectOK3 _GCSkillToObjectOK3; GCSkillToObjectOK4 _GCSkillToObjectOK4; GCSkillToObjectOK5 _GCSkillToObjectOK5; SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); // by sigi. 2002.12.3 SkillLevel_t SkillLevel = pSlayer->getINT()/2; //pSkillSlot->getExpLevel(); bool bDoom = false; bool bParalyze = false; bool bSeduction = false; // by sigi. 2002.12.3 //bool bHallucination = false; bool bDeath = false; bool bEffected = false; // 아무 저주나 걸려 있으면 켠다. EffectDoom* pEffectDoom = NULL; EffectParalyze* pEffectParalyze = NULL; EffectSeduction* pEffectSeduction = NULL; // by sigi. 2002.12.3 //EffectHallucination* pEffectHallucination = NULL; EffectDeath* pEffectDeath = NULL; if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_DOOM)) { pEffectDoom = (EffectDoom*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_DOOM); Assert(pEffectDoom != NULL); bDoom = HitRoll::isSuccessRemoveCurse(45, SkillLevel, 20, pEffectDoom->getLevel()/4); bEffected = true; } if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_PARALYZE)) { pEffectParalyze = (EffectParalyze*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_PARALYZE); Assert(pEffectParalyze != NULL); bParalyze = HitRoll::isSuccessRemoveCurse(45, SkillLevel, 10, pEffectParalyze->getLevel()/4); bEffected = true; } if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_SEDUCTION)) { pEffectSeduction = (EffectSeduction*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_SEDUCTION); Assert(pEffectSeduction != NULL); bSeduction = HitRoll::isSuccessRemoveCurse(45, SkillLevel, 30, pEffectSeduction->getLevel()/4); bEffected = true; } // by sigi. 2002.12.3 // if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_HALLUCINATION)) // { // pEffectHallucination = (EffectHallucination*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_HALLUCINATION); //// Assert(pEffectHallucination != NULL); // // bHallucination = HitRoll::isSuccessRemoveCurse(45, SkillLevel, 40, pEffectHallucination->getLevel()/4); // bEffected = true; // } if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_DEATH)) { pEffectDeath = (EffectDeath*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_DEATH); Assert(pEffectDeath != NULL); bDeath = HitRoll::isSuccessRemoveCurse(45, SkillLevel, 50, pEffectDeath->getLevel()/4); bEffected = true; } int RequiredMP = (int)pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, pTargetCreature, pSkillInfo->getRange()); // 마나가 있고, 시간이 됐고, 거리가 적당하며, // 저주가 하나라도 걸려있어야 한다. if (bManaCheck && bTimeCheck && bRangeCheck && bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); // 각각의 저주를 삭제하고, // 패킷에다 이펙트 삭제하라고 더한다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pTargetCreature->getObjectID()); if (bDoom) { pEffectDoom->setDeadline(0); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_DOOM); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DOOM); } if (bParalyze) { pEffectParalyze->setDeadline(0); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_PARALYZE); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PARALYZE); } if (bSeduction) { pEffectSeduction->setDeadline(0); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_SEDUCTION); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_SEDUCTION); } // by sigi. 2002.12.3 // if (bHallucination) // { // pEffectHallucination->setDeadline(0); // pTargetCreature->removeFlag(Effect::EFFECT_CLASS_HALLUCINATION); // gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_HALLUCINATION); // } if (bDeath) { pEffectDeath->setDeadline(0); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_DEATH); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DEATH); } // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10*(Grade+1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); // 패킷을 만들어 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); ZoneCoord_t targetX = pTargetCreature->getX(); ZoneCoord_t targetY = pTargetCreature->getY(); _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); _GCSkillToObjectOK1.setDuration(0); _GCSkillToObjectOK2.setObjectID(pSlayer->getObjectID()); _GCSkillToObjectOK2.setSkillType(SkillType); _GCSkillToObjectOK2.setDuration (0); _GCSkillToObjectOK3.setObjectID(pSlayer->getObjectID()); _GCSkillToObjectOK3.setSkillType(SkillType); _GCSkillToObjectOK3.setTargetXY(targetX, targetY); _GCSkillToObjectOK4.setSkillType(SkillType); _GCSkillToObjectOK4.setTargetObjectID(TargetObjectID); _GCSkillToObjectOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToObjectOK5.setSkillType(SkillType); _GCSkillToObjectOK5.setTargetObjectID (TargetObjectID); _GCSkillToObjectOK5.setDuration (0); pPlayer->sendPacket(&_GCSkillToObjectOK1); if (pTargetCreature->isPC()) { Player* pTargetPlayer = pTargetCreature->getPlayer(); pTargetPlayer->sendPacket(&_GCSkillToObjectOK2); } pZone->broadcastPacket(targetX, targetY, &gcRemoveEffect); list< Creature*> cList; cList.push_back(pSlayer); cList.push_back(pTargetCreature); cList = pZone->broadcastSkillPacket(myX, myY, targetX, targetY, &_GCSkillToObjectOK5 , cList); pZone->broadcastPacket(myX, myY, &_GCSkillToObjectOK3 , cList); pZone->broadcastPacket(targetX, targetY, &_GCSkillToObjectOK4 , cList); pSkillSlot->setRunTime(output.Delay); } else { executeSkillFailNormal(pSlayer, getSkillType(), pTargetCreature); } } catch(Throwable & t) { executeSkillFailException(pSlayer, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; __END_CATCH }
////////////////////////////////////////////////////////////////////////////// // 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Transfusion::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); //cout << "Transfusion" << endl; try { Zone* pZone = pVampire->getZone(); Assert(pZone != NULL); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); //Assert(pTargetCreature != NULL); // NPC는 공격할 수가 없다. // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature==NULL || pTargetCreature->isNPC() // HIDE 인 놈은 되살려내면 이상하게 된다. 일단 막아놓음. // 2003. 1. 17. DEW || pTargetCreature->isFlag(Effect::EFFECT_CLASS_HIDE) || (g_pConfig->hasKey("Hardcore") && g_pConfig->getPropertyInt("Hardcore")!=0 && pTargetCreature->isDead() ) ) { executeSkillFailException(pVampire, getSkillType()); //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; return; } ZoneCoord_t X = pTargetCreature->getX(); ZoneCoord_t Y = pTargetCreature->getY(); 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 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(); } // 15%를 사용 int CurrentHP = pVampire->getHP(ATTR_CURRENT); #ifdef __CHINA_SERVER__ int RequiredMP = CurrentHP*15/100; //decreaseConsumeMP(pVampire, pSkillInfo); int RecoverHP = CurrentHP*17/100; #else int RequiredMP = CurrentHP*12/100; //decreaseConsumeMP(pVampire, pSkillInfo); int RecoverHP = CurrentHP*12/100; #endif //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 bHPCheck = false; Range_t Range = 1; // 상대방의 HP가 Full이 아니고 // 자신의 HP가 30이상 if (pVampire->getHP(ATTR_CURRENT) >= 30) { if (pTargetCreature->isVampire()) { Vampire* pTargetVampire = dynamic_cast<Vampire*>(pTargetCreature); // 현재HP+SilverDamage < MaxHP 여야 한다. if (pTargetVampire->getHP(ATTR_CURRENT) + pTargetVampire->getSilverDamage() < pTargetVampire->getHP(ATTR_MAX)) bHPCheck = true; } /* // 아직 이건 필요없다. else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature); if (pMonster->getHP(ATTR_MAX) < pMonster->getHP(ATTR_MAX_HP)) bHPCHeck = true; } */ } if (bTimeCheck && bRangeCheck && bHitRoll && bHPCheck) { //cout << "Transfusion Success" << endl; decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); // 데미지와 지속 시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); // TargetCreature의 HP를 채운다 if (pTargetCreature->isVampire()) { Vampire* pTargetVampire = dynamic_cast<Vampire*>(pTargetCreature); HP_t maxHP = pTargetVampire->getHP(ATTR_MAX); HP_t currentHP = pTargetVampire->getHP(ATTR_CURRENT); HP_t newHP = min((int)maxHP, currentHP + RecoverHP); pTargetVampire->setHP(newHP); // HP가 30%가 되면(33% -_-;) 살아나게 된다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { //cout << "Target has EFFECT_COMA" << endl; if (newHP*3 >= maxHP) { //cout << "Target HP is over 1/3" << endl; EffectComa* pEffectComa = (EffectComa*)(pTargetCreature->findEffect(Effect::EFFECT_CLASS_COMA)); Assert(pEffectComa != NULL); if (pEffectComa->canResurrect()) { //cout << "Can Resurrect!" << endl; // 타겟의 이펙트 매니저에서 코마 이펙트를 삭제한다. pTargetCreature->deleteEffect(Effect::EFFECT_CLASS_COMA); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_COMA); // 코마 이펙트가 날아갔다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pTargetCreature->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_COMA); pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &gcRemoveEffect); // 이펙트 정보를 다시 보내준다. by sigi. 2002.11.14 pTargetCreature->getEffectManager()->sendEffectInfo(pTargetCreature, pZone, pTargetCreature->getX(), pTargetCreature->getY()); // EffectKillAftermath 를 붙인다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_KILL_AFTERMATH)) { Effect *pEffect = pTargetCreature->findEffect(Effect::EFFECT_CLASS_KILL_AFTERMATH); EffectKillAftermath* pEffectKillAftermath = dynamic_cast<EffectKillAftermath*>(pEffect); pEffectKillAftermath->setDeadline(5*600); } else { EffectKillAftermath* pEffectKillAftermath = new EffectKillAftermath(pTargetCreature); pEffectKillAftermath->setDeadline(5*600); pTargetCreature->addEffect(pEffectKillAftermath); pTargetCreature->setFlag(Effect::EFFECT_CLASS_KILL_AFTERMATH); pEffectKillAftermath->create(pTargetCreature->getName()); } } } } // 주위에 체력이 채워졌다는 사실을 알린다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetVampire->getObjectID()); gcStatusCurrentHP.setCurrentHP(pTargetVampire->getHP(ATTR_CURRENT)); pZone->broadcastPacket(X, Y, &gcStatusCurrentHP); // 자신의 에너지가 줄어든것도 보여주자 gcStatusCurrentHP.setObjectID(pVampire->getObjectID()); gcStatusCurrentHP.setCurrentHP(pVampire->getHP(ATTR_CURRENT)); pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcStatusCurrentHP); } ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); _GCSkillToTileOK1.setY(Y); _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK2.setX(X); _GCSkillToTileOK2.setY(Y); _GCSkillToTileOK2.setDuration(output.Duration); _GCSkillToTileOK2.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); Player* pPlayer = pVampire->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&_GCSkillToTileOK1); list<Creature*> cList; cList.push_back(pVampire); 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 { //cout << "Transfusion Failed" << endl; executeSkillFailNormal(pVampire, getSkillType(), NULL); } } catch (Throwable & t) { //cout << "Transfusion Failed2" << endl; executeSkillFailException(pVampire, getSkillType()); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; __END_CATCH }