diff options
| -rw-r--r-- | src/server/game/Spells/Auras/SpellEffects.cpp | 55 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.h | 1 |
2 files changed, 54 insertions, 2 deletions
diff --git a/src/server/game/Spells/Auras/SpellEffects.cpp b/src/server/game/Spells/Auras/SpellEffects.cpp index c64db1697a6..f819e3f1971 100644 --- a/src/server/game/Spells/Auras/SpellEffects.cpp +++ b/src/server/game/Spells/Auras/SpellEffects.cpp @@ -204,7 +204,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectHealPct, //136 SPELL_EFFECT_HEAL_PCT &Spell::EffectEnergizePct, //137 SPELL_EFFECT_ENERGIZE_PCT &Spell::EffectJump2, //138 SPELL_EFFECT_LEAP_BACK Leap back - &Spell::EffectUnused, //139 SPELL_EFFECT_CLEAR_QUEST (misc - is quest ID) + &Spell::EffectQuestClear, //139 SPELL_EFFECT_CLEAR_QUEST Reset quest status (miscValue - quest ID) &Spell::EffectForceCast, //140 SPELL_EFFECT_FORCE_CAST &Spell::EffectNULL, //141 SPELL_EFFECT_141 damage and reduce speed? &Spell::EffectTriggerSpellWithValue, //142 SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE @@ -6993,7 +6993,14 @@ void Spell::EffectQuestComplete(uint32 i) return; uint32 quest_id = m_spellInfo->EffectMiscValue[i]; - pPlayer->AreaExploredOrEventHappens(quest_id); + if (quest_id) + { + uint16 log_slot = pPlayer->FindQuestSlot(quest_id); + if (log_slot < MAX_QUEST_LOG_SIZE) + pPlayer->AreaExploredOrEventHappens(quest_id); + else + pPlayer->CompleteQuest(quest_id); // quest not in log - for internal use + } } void Spell::EffectForceDeselect(uint32 /*i*/) @@ -7155,6 +7162,50 @@ void Spell::EffectJump2(uint32 i) } } +void Spell::EffectQuestClear(uint32 i) +{ + Player *pPlayer = NULL; + if (m_caster->GetTypeId() == TYPEID_PLAYER) + pPlayer = m_caster->ToPlayer(); + else if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) + pPlayer = unitTarget->ToPlayer(); + + if (!pPlayer) + return; + + uint32 quest_id = m_spellInfo->EffectMiscValue[i]; + + Quest const* pQuest = objmgr.GetQuestTemplate(quest_id); + + if (!pQuest) + return; + + QuestStatusMap::iterator qs_itr = pPlayer->getQuestStatusMap().find(quest_id); + // Player has never done this quest + if (qs_itr == pPlayer->getQuestStatusMap().end()) + return; + + // remove all quest entries for 'entry' from quest log + for (uint8 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot) + { + uint32 quest = pPlayer->GetQuestSlotQuestId(slot); + if (quest == quest_id) + { + pPlayer->SetQuestSlot(slot, 0); + + // we ignore unequippable quest items in this case, its' still be equipped + pPlayer->TakeQuestSourceItem(quest, false); + } + } + + // set quest status to not started (will be updated in DB at next save) + pPlayer->SetQuestStatus(quest_id, QUEST_STATUS_NONE); + + // reset rewarded for restart repeatable quest + QuestStatusData &data = qs_itr->second; + data.m_rewarded = false; +} + void Spell::EffectSendTaxi(uint32 i) { if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 7b6597720e1..61014343878 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -305,6 +305,7 @@ class Spell void EffectHealMechanical(uint32 i); void EffectJump(uint32 i); void EffectJump2(uint32 i); + void EffectQuestClear(uint32 i); void EffectTeleUnitsFaceCaster(uint32 i); void EffectLearnSkill(uint32 i); void EffectAddHonor(uint32 i); |
