aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2013-08-11 18:37:31 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2013-08-11 18:37:31 +0200
commitf506ee3077a5a8c86d3a02ab06c1c3e91b7d8d7e (patch)
treef0844a12facac7cd7a94c47cbab56d2bb55962a4
parentfa0aaa5fa4ed93992e54cce411944e41d1fd831d (diff)
parenteefdceea71135c6b281d181233da04159e63b179 (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Entities/Player/Player.h src/server/game/Spells/SpellMgr.cpp
-rw-r--r--sql/updates/world/2013_08_11_00_world_spell_script_names.sql3
-rw-r--r--sql/updates/world/2013_08_11_01_world_eai_335.sql3
-rw-r--r--src/server/game/AI/CreatureAI.cpp5
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp26
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp11
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h10
-rw-r--r--src/server/game/Entities/Player/Player.cpp63
-rw-r--r--src/server/game/Entities/Player/Player.h23
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp29
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Quests/QuestDef.h2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp8
-rw-r--r--src/server/game/Spells/SpellMgr.cpp10
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp107
15 files changed, 226 insertions, 77 deletions
diff --git a/sql/updates/world/2013_08_11_00_world_spell_script_names.sql b/sql/updates/world/2013_08_11_00_world_spell_script_names.sql
new file mode 100644
index 00000000000..00aee104022
--- /dev/null
+++ b/sql/updates/world/2013_08_11_00_world_spell_script_names.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spell_script_names` WHERE `spell_id`=66545;
+INSERT INTO `spell_script_names` (`spell_id` ,`ScriptName`) VALUES
+(66545, 'spell_paletress_summon_memory');
diff --git a/sql/updates/world/2013_08_11_01_world_eai_335.sql b/sql/updates/world/2013_08_11_01_world_eai_335.sql
new file mode 100644
index 00000000000..94b5324e50e
--- /dev/null
+++ b/sql/updates/world/2013_08_11_01_world_eai_335.sql
@@ -0,0 +1,3 @@
+UPDATE `creature_ai_scripts` SET `action1_param1`=15 WHERE `id`=1730003; -- Call For Help radius from 0 to 15
+UPDATE `creature_ai_scripts` SET `action1_type`=`action2_type`,`action2_type`=0,`action1_param1`=`action2_param1`,`action2_param1`=0 WHERE `id` IN (1772701,3547605); -- Action type gap
+UPDATE `creature_ai_scripts` SET `action1_param1`=10255 WHERE `id`=1688002; -- Wrong quest credit (used npc id, should use quest id), fixes quest Testing the Antidote (or at least it should)
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp
index a494507919a..cbb79b47958 100644
--- a/src/server/game/AI/CreatureAI.cpp
+++ b/src/server/game/AI/CreatureAI.cpp
@@ -225,8 +225,9 @@ bool CreatureAI::_EnterEvadeMode()
if (!me->IsAlive())
return false;
- // dont remove vehicle auras, passengers arent supposed to drop off the vehicle
- me->RemoveAllAurasExceptType(SPELL_AURA_CONTROL_VEHICLE);
+ // don't remove vehicle auras, passengers aren't supposed to drop off the vehicle
+ // don't remove clone caster on evade (to be verified)
+ me->RemoveAllAurasExceptType(SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_CLONE_CASTER);
// sometimes bosses stuck in combat?
me->DeleteThreatList();
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index c4c208e596e..65b1e6c331e 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -489,28 +489,6 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
delete targets;
break;
}
- case SMART_ACTION_SEND_CASTCREATUREORGO:
- {
- if (!GetBaseObject())
- break;
-
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- break;
-
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
- {
- if (IsPlayer(*itr))
- {
- (*itr)->ToPlayer()->CastedCreatureOrGO(e.action.castedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.castedCreatureOrGO.spell);
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SEND_CASTCREATUREORGO: Player guidLow %u.org Creature: %u, BaseObject GUID: "UI64FMTD", Spell: %u",
- (*itr)->GetGUIDLow(), e.action.castedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.castedCreatureOrGO.spell);
- }
- }
-
- delete targets;
- break;
- }
case SMART_ACTION_CAST:
{
if (!me)
@@ -800,9 +778,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
if (IsPlayer((*itr)))
{
- (*itr)->ToPlayer()->CastedCreatureOrGO(e.action.castedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.castedCreatureOrGO.spell);
+ (*itr)->ToPlayer()->CastedCreatureOrGO(e.action.callCastedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.callCastedCreatureOrGO.spell);
TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_CASTEDCREATUREORGO: Player %u, target %u, spell %u",
- (*itr)->GetGUIDLow(), e.action.castedCreatureOrGO.creature, e.action.castedCreatureOrGO.spell);
+ (*itr)->GetGUIDLow(), e.action.callCastedCreatureOrGO.creature, e.action.callCastedCreatureOrGO.spell);
}
}
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index feb0d1a03b8..6563aeec700 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -682,13 +682,6 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false;
}
break;
- case SMART_ACTION_SEND_CASTCREATUREORGO:
- if (!IsQuestValid(e, e.action.castCreatureOrGO.quest))
- return false;
-
- if (!IsSpellValid(e, e.action.castCreatureOrGO.spell))
- return false;
- break;
case SMART_ACTION_SET_EVENT_PHASE:
if (e.action.setEventPhase.phase >= SMART_EVENT_PHASE_MAX)
{
@@ -709,10 +702,10 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
}
break;
case SMART_ACTION_CALL_CASTEDCREATUREORGO:
- if (!IsCreatureValid(e, e.action.castedCreatureOrGO.creature))
+ if (!IsCreatureValid(e, e.action.callCastedCreatureOrGO.creature))
return false;
- if (!IsSpellValid(e, e.action.castedCreatureOrGO.spell))
+ if (!IsSpellValid(e, e.action.callCastedCreatureOrGO.spell))
return false;
break;
case SMART_ACTION_REMOVEAURASFROMSPELL:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index ef7080bf9db..e5f30a9709d 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -398,7 +398,7 @@ enum SMART_ACTION
SMART_ACTION_THREAT_SINGLE_PCT = 13, // Threat%
SMART_ACTION_THREAT_ALL_PCT = 14, // Threat%
SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS = 15, // QuestID
- SMART_ACTION_SEND_CASTCREATUREORGO = 16, // QuestID, SpellId
+ SMART_ACTION_UNUSED_16 = 16, // UNUSED
SMART_ACTION_SET_EMOTE_STATE = 17, // emoteID
SMART_ACTION_SET_UNIT_FLAG = 18, // Flags (may be more than one field OR'd together), Target
SMART_ACTION_REMOVE_UNIT_FLAG = 19, // Flags (may be more than one field OR'd together), Target
@@ -578,12 +578,6 @@ struct SmartAction
struct
{
- uint32 quest;
- uint32 spell;
- } castCreatureOrGO;
-
- struct
- {
uint32 flag1;
uint32 flag2;
uint32 flag3;
@@ -627,7 +621,7 @@ struct SmartAction
{
uint32 creature;
uint32 spell;
- } castedCreatureOrGO;
+ } callCastedCreatureOrGO;
struct
{
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 41a75f424ae..5a43e87a151 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -15475,7 +15475,10 @@ bool Player::SatisfyQuestSkill(Quest const* qInfo, bool msg) const
if (GetSkillValue(skill) < qInfo->GetRequiredSkillValue())
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestSkill: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required skill value.", qInfo->GetQuestId());
+ }
return false;
}
@@ -15488,13 +15491,19 @@ bool Player::SatisfyQuestLevel(Quest const* qInfo, bool msg)
if (getLevel() < qInfo->GetMinLevel())
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_QUEST_FAILED_LOW_LEVEL);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestLevel: Sent INVALIDREASON_QUEST_FAILED_LOW_LEVEL (questId: %u) because player does not have required (min) level.", qInfo->GetQuestId());
+ }
return false;
}
else if (qInfo->GetMaxLevel() > 0 && getLevel() > qInfo->GetMaxLevel())
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestLevel: Sent INVALIDREASON_QUEST_FAILED_LOW_LEVEL (questId: %u) because player does not have required (max) level.", qInfo->GetQuestId());
+ }
return false;
}
return true;
@@ -15551,11 +15560,14 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg)
if (exclude_Id == prevId)
continue;
- // alternative quest from group also must be completed and rewarded(reported)
+ // alternative quest from group also must be completed and rewarded (reported)
if (m_RewardedQuests.find(exclude_Id) == m_RewardedQuests.end())
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (1).", qInfo->GetQuestId());
+ }
return false;
}
}
@@ -15588,7 +15600,11 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg)
if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE)
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (2).", qInfo->GetQuestId());
+
+ }
return false;
}
}
@@ -15600,7 +15616,10 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg)
// Has only positive prev. quests in non-rewarded state
// and negative prev. quests in non-active state
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (3).", qInfo->GetQuestId());
+ }
return false;
}
@@ -15615,7 +15634,10 @@ bool Player::SatisfyQuestClass(Quest const* qInfo, bool msg) const
if ((reqClass & getClassMask()) == 0)
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestClass: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required class.", qInfo->GetQuestId());
+ }
return false;
}
@@ -15631,7 +15653,11 @@ bool Player::SatisfyQuestRace(Quest const* qInfo, bool msg)
if ((reqraces & getRaceMask()) == 0)
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_QUEST_FAILED_WRONG_RACE);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestRace: Sent INVALIDREASON_QUEST_FAILED_WRONG_RACE (questId: %u) because player does not have required race.", qInfo->GetQuestId());
+
+ }
return false;
}
return true;
@@ -15643,7 +15669,10 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg)
if (fIdMin && GetReputationMgr().GetReputation(fIdMin) < qInfo->GetRequiredMinRepValue())
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (min).", qInfo->GetQuestId());
+ }
return false;
}
@@ -15651,7 +15680,10 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg)
if (fIdMax && GetReputationMgr().GetReputation(fIdMax) >= qInfo->GetRequiredMaxRepValue())
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (max).", qInfo->GetQuestId());
+ }
return false;
}
@@ -15661,7 +15693,10 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg)
if (fIdObj && GetReputationMgr().GetReputation(fIdObj) >= qInfo->GetRepObjectiveValue2())
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (ReputationObjective2).", qInfo->GetQuestId());
+ }
return false;
}
@@ -15673,7 +15708,10 @@ bool Player::SatisfyQuestStatus(Quest const* qInfo, bool msg)
if (GetQuestStatus(qInfo->GetQuestId()) != QUEST_STATUS_NONE)
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_QUEST_ALREADY_ON);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestStatus: Sent INVALIDREASON_QUEST_ALREADY_ON (questId: %u) because player quest status is not NONE.", qInfo->GetQuestId());
+ }
return false;
}
return true;
@@ -15685,7 +15723,10 @@ bool Player::SatisfyQuestConditions(Quest const* qInfo, bool msg)
if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestConditions: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not meet conditions.", qInfo->GetQuestId());
+ }
TC_LOG_DEBUG(LOG_FILTER_CONDITIONSYS, "Player::SatisfyQuestConditions: conditions not met for quest %u", qInfo->GetQuestId());
return false;
}
@@ -15697,7 +15738,10 @@ bool Player::SatisfyQuestTimed(Quest const* qInfo, bool msg)
if (!m_timedquests.empty() && qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_QUEST_ONLY_ONE_TIMED);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestTimed: Sent INVALIDREASON_QUEST_ONLY_ONE_TIMED (questId: %u) because player is already on a timed quest.", qInfo->GetQuestId());
+ }
return false;
}
return true;
@@ -15727,7 +15771,10 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg)
if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest, false))
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did daily quests in exclusive group.", qInfo->GetQuestId());
+ }
return false;
}
@@ -15736,7 +15783,10 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg)
if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && (m_RewardedQuests.find(exclude_Id) != m_RewardedQuests.end())))
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did quest in exclusive group.", qInfo->GetQuestId());
+ }
return false;
}
}
@@ -15753,7 +15803,10 @@ bool Player::SatisfyQuestNextChain(Quest const* qInfo, bool msg)
if (GetQuestStatus(nextQuest) != QUEST_STATUS_NONE) // GetQuestStatus returns QUEST_STATUS_COMPLETED for rewarded quests
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestNextChain: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did or started next quest in chain.", qInfo->GetQuestId());
+ }
return false;
}
@@ -15777,7 +15830,10 @@ bool Player::SatisfyQuestPrevChain(Quest const* qInfo, bool msg)
if (itr != m_QuestStatus.end() && itr->second.Status != QUEST_STATUS_NONE)
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestNextChain: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did or started next quest in chain.", qInfo->GetQuestId());
+ }
return false;
}
@@ -15818,7 +15874,10 @@ bool Player::SatisfyQuestDay(Quest const* qInfo, bool msg)
if (!have_slot)
{
if (msg)
+ {
SendCanTakeQuestResponse(INVALIDREASON_DAILY_QUESTS_REMAINING);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, "SatisfyQuestDay: Sent INVALIDREASON_DAILY_QUESTS_REMAINING (questId: %u) because player already did all possible quests today.", qInfo->GetQuestId());
+ }
return false;
}
@@ -16737,7 +16796,7 @@ void Player::SendQuestTimerFailed(uint32 quest_id)
}
}
-void Player::SendCanTakeQuestResponse(uint32 msg) const
+void Player::SendCanTakeQuestResponse(QuestFailedReason msg) const
{
WorldPacket data(SMSG_QUESTGIVER_QUEST_INVALID, 4);
data << uint32(msg);
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 561fad0d903..9a2a2c0429d 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1596,30 +1596,29 @@ class Player : public Unit, public GridObject<Player>
void MoneyChanged(uint32 value);
void ReputationChanged(FactionEntry const* factionEntry);
void ReputationChanged2(FactionEntry const* factionEntry);
- bool HasQuestForItem(uint32 itemid) const;
- bool HasQuestForGO(int32 GOId) const;
+ bool HasQuestForItem(uint32 itemId) const;
+ bool HasQuestForGO(int32 goId) const;
void UpdateForQuestWorldObjects();
- bool CanShareQuest(uint32 quest_id) const;
+ bool CanShareQuest(uint32 questId) const;
void SendQuestComplete(Quest const* quest);
void SendQuestReward(Quest const* quest, uint32 XP);
void SendQuestFailed(uint32 questId, InventoryResult reason = EQUIP_ERR_OK);
- void SendQuestTimerFailed(uint32 quest_id);
- void SendCanTakeQuestResponse(uint32 msg) const;
+ void SendQuestTimerFailed(uint32 questId);
+ void SendCanTakeQuestResponse(QuestFailedReason msg) const;
void SendQuestConfirmAccept(Quest const* quest, Player* pReceiver);
void SendPushToPartyResponse(Player* player, uint8 msg);
- void SendQuestUpdateAddCreatureOrGo(Quest const* quest, uint64 guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count);
- void SendQuestUpdateAddPlayer(Quest const* quest, uint16 old_count, uint16 add_count);
+ void SendQuestUpdateAddCreatureOrGo(Quest const* quest, uint64 guid, uint32 creatureOrGOIdx, uint16 oldCount, uint16 addCount);
+ void SendQuestUpdateAddPlayer(Quest const* quest, uint16 oldCount, uint16 addCount);
- uint64 GetDivider() { return m_divider; }
+ uint64 GetDivider() const { return m_divider; }
void SetDivider(uint64 guid) { m_divider = guid; }
- uint32 GetInGameTime() { return m_ingametime; }
-
+ uint32 GetInGameTime() const { return m_ingametime; }
void SetInGameTime(uint32 time) { m_ingametime = time; }
- void AddTimedQuest(uint32 quest_id) { m_timedquests.insert(quest_id); }
- void RemoveTimedQuest(uint32 quest_id) { m_timedquests.erase(quest_id); }
+ void AddTimedQuest(uint32 questId) { m_timedquests.insert(questId); }
+ void RemoveTimedQuest(uint32 questId) { m_timedquests.erase(questId); }
void SaveCUFProfile(uint8 id, CUFProfile* profile) { delete _CUFProfiles[id]; _CUFProfiles[id] = profile; } ///> Replaces a CUF profile at position 0-4
CUFProfile* GetCUFProfile(uint8 id) const { return _CUFProfiles[id]; } ///> Retrieves a CUF profile at position 0-4
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 100321fc179..a344427a989 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -3836,19 +3836,40 @@ void Unit::RemoveAllAurasExceptType(AuraType type)
for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
{
Aura const* aura = iter->second->GetBase();
- if (!aura->GetSpellInfo()->HasAura(type))
- _UnapplyAura(iter, AURA_REMOVE_BY_DEFAULT);
- else
+ if (aura->GetSpellInfo()->HasAura(type))
++iter;
+ else
+ _UnapplyAura(iter, AURA_REMOVE_BY_DEFAULT);
}
for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
{
Aura* aura = iter->second;
- if (!aura->GetSpellInfo()->HasAura(type))
+ if (aura->GetSpellInfo()->HasAura(type))
+ ++iter;
+ else
RemoveOwnedAura(iter, AURA_REMOVE_BY_DEFAULT);
+ }
+}
+
+void Unit::RemoveAllAurasExceptType(AuraType type1, AuraType type2)
+{
+ for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
+ {
+ Aura const* aura = iter->second->GetBase();
+ if (aura->GetSpellInfo()->HasAura(type1) || aura->GetSpellInfo()->HasAura(type2))
+ ++iter;
else
+ _UnapplyAura(iter, AURA_REMOVE_BY_DEFAULT);
+ }
+
+ for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
+ {
+ Aura* aura = iter->second;
+ if (aura->GetSpellInfo()->HasAura(type1) || aura->GetSpellInfo()->HasAura(type2))
++iter;
+ else
+ RemoveOwnedAura(iter, AURA_REMOVE_BY_DEFAULT);
}
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index e068d1165e0..c51be5d460e 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1754,6 +1754,7 @@ class Unit : public WorldObject
void RemoveAllAurasOnDeath();
void RemoveAllAurasRequiringDeadTarget();
void RemoveAllAurasExceptType(AuraType type);
+ void RemoveAllAurasExceptType(AuraType type1, AuraType type2); /// @todo: once we support variadic templates use them here
void DelayOwnedAuras(uint32 spellId, uint64 caster, int32 delaytime);
void _RemoveAllAuraStatMods();
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index 34c0a1fd9d8..93db5c0ce65 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -46,7 +46,7 @@ class ObjectMgr;
#define QUEST_REWARD_CURRENCY_COUNT 4
#define QUEST_REQUIRED_CURRENCY_COUNT 4
-enum QuestFailedReasons
+enum QuestFailedReason
{
INVALIDREASON_DONT_HAVE_REQ = 0,
INVALIDREASON_QUEST_FAILED_LOW_LEVEL = 1, // You are not high enough level for that quest.
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 6ac0564d433..df7c3a27a5b 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -3823,14 +3823,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
}
break;
}
- case 66545: //Summon Memory
- {
- uint8 uiRandom = urand(0, 25);
- uint32 uiSpells[26] = {66704, 66705, 66706, 66707, 66709, 66710, 66711, 66712, 66713, 66714, 66715, 66708, 66708, 66691, 66692, 66694, 66695, 66696, 66697, 66698, 66699, 66700, 66701, 66702, 66703, 66543};
-
- m_caster->CastSpell(m_caster, uiSpells[uiRandom], true);
- break;
- }
case 45668: // Ultra-Advanced Proto-Typical Shortening Blaster
{
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT)
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 25b84edc227..0b1ad422a21 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2895,10 +2895,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
switch (spellInfo->Id)
{
- case 60256:
- //Crashes client on pressing ESC (Maybe because of ReqSpellFocus and GameObject)
- spellInfo->AttributesEx4 &= ~SPELL_ATTR4_TRIGGERED;
- break;
case 1776: // Gouge
case 1777:
case 8629:
@@ -3752,6 +3748,12 @@ void SpellMgr::LoadSpellInfoCorrections()
case 49376: // Feral Charge (Cat Form)
spellInfo->AttributesEx3 &= ~SPELL_ATTR3_CANT_TRIGGER_PROC;
break;
+ case 45257: // Using Steam Tonk Controller
+ case 45440: // Steam Tonk Controller
+ case 60256: // Collect Sample
+ // Crashes client on pressing ESC
+ spellInfo->AttributesEx4 &= ~SPELL_ATTR4_TRIGGERED;
+ break;
default:
break;
}
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index da9aa9eccb3..6ef84033312 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -506,7 +506,7 @@ public:
static bool HandleDebugSendQuestInvalidMsgCommand(ChatHandler* handler, char const* args)
{
- uint32 msg = atol((char*)args);
+ QuestFailedReason msg = static_cast<QuestFailedReason>(atol((char*)args));
handler->GetSession()->GetPlayer()->SendCanTakeQuestResponse(msg);
return true;
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
index 9bc9afa4fa8..9d7a3c17b1b 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
@@ -61,7 +61,7 @@ enum Spells
SPELL_RADIANCE = 66935,
SPELL_VENGEANCE = 66865,
- //Paletress
+ // Paletress
SPELL_SMITE = 66536,
SPELL_SMITE_H = 67674,
SPELL_HOLY_FIRE = 66538,
@@ -73,7 +73,34 @@ enum Spells
SPELL_CONFESS = 66680,
SPELL_SUMMON_MEMORY = 66545,
- //Memory
+ // Memory of X (Summon)
+ SPELL_MEMORY_ALGALON = 66715,
+ SPELL_MEMORY_ARCHIMONDE = 66704,
+ SPELL_MEMORY_CHROMAGGUS = 66697,
+ SPELL_MEMORY_CYANIGOSA = 66709,
+ SPELL_MEMORY_DELRISSA = 66706,
+ SPELL_MEMORY_ECK = 66710,
+ SPELL_MEMORY_ENTROPIUS = 66707,
+ SPELL_MEMORY_GRUUL = 66702,
+ SPELL_MEMORY_HAKKAR = 66698,
+ SPELL_MEMORY_HEIGAN = 66712,
+ SPELL_MEMORY_HEROD = 66694,
+ SPELL_MEMORY_HOGGER = 66543,
+ SPELL_MEMORY_IGNIS = 66713,
+ SPELL_MEMORY_ILLIDAN = 66705,
+ SPELL_MEMORY_INGVAR = 66708,
+ SPELL_MEMORY_KALITHRESH = 66700,
+ SPELL_MEMORY_LUCIFRON = 66695,
+ SPELL_MEMORY_MALCHEZAAR = 66701,
+ SPELL_MEMORY_MUTANUS = 66692,
+ SPELL_MEMORY_ONYXIA = 66711,
+ SPELL_MEMORY_THUNDERAAN = 66696,
+ SPELL_MEMORY_VANCLEEF = 66691,
+ SPELL_MEMORY_VASHJ = 66703,
+ SPELL_MEMORY_VEKNILASH = 66699,
+ SPELL_MEMORY_VEZAX = 66714,
+
+ // Memory
SPELL_OLD_WOUNDS = 66620,
SPELL_OLD_WOUNDS_H = 67679,
SPELL_SHADOWS_PAST = 66619,
@@ -566,6 +593,81 @@ public:
}
};
+uint32 const memorySpellId[25] =
+{
+ SPELL_MEMORY_ALGALON,
+ SPELL_MEMORY_ARCHIMONDE,
+ SPELL_MEMORY_CHROMAGGUS,
+ SPELL_MEMORY_CYANIGOSA,
+ SPELL_MEMORY_DELRISSA,
+ SPELL_MEMORY_ECK,
+ SPELL_MEMORY_ENTROPIUS,
+ SPELL_MEMORY_GRUUL,
+ SPELL_MEMORY_HAKKAR,
+ SPELL_MEMORY_HEIGAN,
+ SPELL_MEMORY_HEROD,
+ SPELL_MEMORY_HOGGER,
+ SPELL_MEMORY_IGNIS,
+ SPELL_MEMORY_ILLIDAN,
+ SPELL_MEMORY_INGVAR,
+ SPELL_MEMORY_KALITHRESH,
+ SPELL_MEMORY_LUCIFRON,
+ SPELL_MEMORY_MALCHEZAAR,
+ SPELL_MEMORY_MUTANUS,
+ SPELL_MEMORY_ONYXIA,
+ SPELL_MEMORY_THUNDERAAN,
+ SPELL_MEMORY_VANCLEEF,
+ SPELL_MEMORY_VASHJ,
+ SPELL_MEMORY_VEKNILASH,
+ SPELL_MEMORY_VEZAX
+};
+
+// 66545 - Summon Memory
+class spell_paletress_summon_memory : public SpellScriptLoader
+{
+ public:
+ spell_paletress_summon_memory() : SpellScriptLoader("spell_paletress_summon_memory") { }
+
+ class spell_paletress_summon_memory_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_paletress_summon_memory_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ for (uint8 i = 0; i < 25; ++i)
+ if (!sSpellMgr->GetSpellInfo(memorySpellId[i]))
+ return false;
+ return true;
+ }
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.empty())
+ return;
+
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ GetHitUnit()->CastSpell(GetHitUnit(), memorySpellId[urand(0, 24)], true, NULL, NULL, GetCaster()->GetGUID());
+ }
+
+ void Register() OVERRIDE
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_paletress_summon_memory_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnEffectHitTarget += SpellEffectFn(spell_paletress_summon_memory_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_paletress_summon_memory_SpellScript();
+ }
+};
+
void AddSC_boss_argent_challenge()
{
new boss_eadric();
@@ -573,4 +675,5 @@ void AddSC_boss_argent_challenge()
new boss_paletress();
new npc_memory();
new npc_argent_soldier();
+ new spell_paletress_summon_memory();
}