aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp39
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp93
-rw-r--r--src/server/game/DataStores/DBCStructure.h4
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp13
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp10
-rw-r--r--src/server/game/Spells/SpellEffects.cpp51
-rw-r--r--src/server/game/Spells/SpellInfo.cpp20
-rw-r--r--src/server/game/Spells/SpellInfo.h3
-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/Commands/cs_npc.cpp180
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp1
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp53
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp63
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp3
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.h3
16 files changed, 305 insertions, 243 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 01f9080fba1..361cf025647 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -771,6 +771,26 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_SUMMON_CREATURE:
if (!IsCreatureValid(e, e.action.summonCreature.creature))
return false;
+
+ for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
+ {
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
+ if (!spellInfo)
+ continue;
+
+ for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
+ {
+ if (spellInfo->Effects[j].Effect == SPELL_EFFECT_SUMMON)
+ {
+ uint32 creatureSummonEntry = spellInfo->Effects[j].MiscValue;
+
+ if (e.action.summonCreature.creature == creatureSummonEntry)
+ TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u creature summon: %u has already summon spell (SpellId: %u effect: %u)",
+ e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonCreature.creature, spellInfo->Id, j);
+ }
+ }
+ }
+
if (e.action.summonCreature.type < TEMPSUMMON_TIMED_OR_DEAD_DESPAWN || e.action.summonCreature.type > TEMPSUMMON_MANUAL_DESPAWN)
{
TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses incorrect TempSummonType %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonCreature.type);
@@ -828,6 +848,25 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_SUMMON_GO:
if (!IsGameObjectValid(e, e.action.summonGO.entry))
return false;
+
+ for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
+ {
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
+ if (!spellInfo)
+ continue;
+
+ for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
+ {
+ if (spellInfo->Effects[j].Effect == SPELL_EFFECT_SUMMON_OBJECT_WILD)
+ {
+ uint32 goSummonEntry = spellInfo->Effects[j].MiscValue;
+
+ if (e.action.summonGO.entry == goSummonEntry)
+ TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u gameobject summon: %u has already summon spell (SpellId: %u effect: %u)",
+ e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonGO.entry, spellInfo->Id, j);
+ }
+ }
+ }
break;
case SMART_ACTION_ADD_ITEM:
case SMART_ACTION_REMOVE_ITEM:
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 3d2eaffc15d..1fe9a08bfdc 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -508,103 +508,50 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans)
{
if (!m_completedAchievements.empty())
{
- bool need_execute = false;
- std::ostringstream ssdel;
- std::ostringstream ssins;
for (CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter)
{
if (!iter->second.changed)
continue;
- /// first new/changed record prefix
- if (!need_execute)
- {
- ssdel << "DELETE FROM character_achievement WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND achievement IN (";
- ssins << "INSERT INTO character_achievement (guid, achievement, date) VALUES ";
- need_execute = true;
- }
- /// next new/changed record prefix
- else
- {
- ssdel << ',';
- ssins << ',';
- }
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT);
+ stmt->setUInt16(0, iter->first);
+ stmt->setUInt32(1, GetPlayer()->GetGUID());
+ trans->Append(stmt);
- // new/changed record data
- ssdel << iter->first;
- ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << uint64(iter->second.date) << ')';
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT);
+ stmt->setUInt32(0, GetPlayer()->GetGUID());
+ stmt->setUInt16(1, iter->first);
+ stmt->setUInt32(2, uint32(iter->second.date));
+ trans->Append(stmt);
- /// mark as saved in db
iter->second.changed = false;
}
-
- if (need_execute)
- {
- ssdel << ')';
- trans->Append(ssdel.str().c_str());
- trans->Append(ssins.str().c_str());
- }
}
if (!m_criteriaProgress.empty())
{
- /// prepare deleting and insert
- bool need_execute_del = false;
- bool need_execute_ins = false;
- std::ostringstream ssdel;
- std::ostringstream ssins;
for (CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter)
{
if (!iter->second.changed)
continue;
- // deleted data (including 0 progress state)
- {
- /// first new/changed record prefix (for any counter value)
- if (!need_execute_del)
- {
- ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND criteria IN (";
- need_execute_del = true;
- }
- /// next new/changed record prefix
- else
- ssdel << ',';
-
- // new/changed record data
- ssdel << iter->first;
- }
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA);
+ stmt->setUInt32(0, GetPlayer()->GetGUID());
+ stmt->setUInt16(1, iter->first);
+ trans->Append(stmt);
- // store data only for real progress
- if (iter->second.counter != 0)
+ if (iter->second.counter)
{
- /// first new/changed record prefix
- if (!need_execute_ins)
- {
- ssins << "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES ";
- need_execute_ins = true;
- }
- /// next new/changed record prefix
- else
- ssins << ',';
-
- // new/changed record data
- ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << iter->second.counter << ',' << iter->second.date << ')';
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS);
+ stmt->setUInt32(0, GetPlayer()->GetGUID());
+ stmt->setUInt16(1, iter->first);
+ stmt->setUInt32(2, iter->second.counter);
+ stmt->setUInt32(3, uint32(iter->second.date));
+ trans->Append(stmt);
}
- /// mark as updated in db
iter->second.changed = false;
}
-
- if (need_execute_del) // DELETE ... IN (.... _)_
- ssdel << ')';
-
- if (need_execute_del || need_execute_ins)
- {
- if (need_execute_del)
- trans->Append(ssdel.str().c_str());
- if (need_execute_ins)
- trans->Append(ssins.str().c_str());
- }
}
}
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index c371fc781fd..e12f70baa41 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -1966,9 +1966,9 @@ struct VehicleSeatEntry
bool CanEnterOrExit() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT; }
bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_SWITCH; }
- bool IsUsableByOverride() const { return (m_flags & VEHICLE_SEAT_FLAG_UNCONTROLLED)
+ bool IsUsableByOverride() const { return (m_flags & (VEHICLE_SEAT_FLAG_UNCONTROLLED | VEHICLE_SEAT_FLAG_UNK18)
|| (m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 |
- VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4)); }
+ VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4))); }
bool IsEjectable() const { return m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE; }
};
diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp
index 3fc4e839651..1fcc6ec4e6e 100644
--- a/src/server/game/Guilds/GuildMgr.cpp
+++ b/src/server/game/Guilds/GuildMgr.cpp
@@ -378,20 +378,13 @@ void GuildMgr::LoadGuilds()
TC_LOG_INFO(LOG_FILTER_GUILD, "Validating data of loaded guilds...");
{
uint32 oldMSTime = getMSTime();
- std::set<Guild*> rm; // temporary storage to avoid modifying GuildStore with RemoveGuild() while iterating
- for (GuildContainer::iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr)
+ for (GuildContainer::iterator itr = GuildStore.begin(); itr != GuildStore.end();)
{
Guild* guild = itr->second;
+ ++itr;
if (guild && !guild->Validate())
- rm.insert(guild);
- }
-
- for (std::set<Guild*>::iterator itr = rm.begin(); itr != rm.end(); ++itr)
- {
- Guild* guild = *itr;
- RemoveGuild(guild->GetId());
- delete guild;
+ delete guild;
}
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Validated data of loaded guilds in %u ms", GetMSTimeDiffToNow(oldMSTime));
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 3d55d9de16f..ff4a3b5ca71 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -5113,7 +5113,7 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo
{
if (apply)
{
- Unit* caster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? GetCaster() : target;
+ Unit* caster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCaster() : target;
if (!caster)
return;
@@ -5125,13 +5125,13 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo
}
else
{
- uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? GetCasterGUID() : target->GetGUID();
+ uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCasterGUID() : target->GetGUID();
target->RemoveAura(triggeredSpellId, casterGUID, 0, aurApp->GetRemoveMode());
}
}
else if (mode & AURA_EFFECT_HANDLE_REAPPLY && apply)
{
- uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? GetCasterGUID() : target->GetGUID();
+ uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCasterGUID() : target->GetGUID();
// change the stack amount to be equal to stack amount of our aura
if (Aura* triggeredAura = target->GetAura(triggeredSpellId, casterGUID))
triggeredAura->ModStackAmount(GetBase()->GetStackAmount() - triggeredAura->GetStackAmount());
@@ -5733,7 +5733,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)
if (triggeredSpellInfo)
{
- if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? caster : target)
+ if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)
{
triggerCaster->CastSpell(target, triggeredSpellInfo, true, NULL, this);
TC_LOG_DEBUG(LOG_FILTER_SPELLS_AURAS, "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell %u Trigger %u", GetId(), triggeredSpellInfo->Id);
@@ -5753,7 +5753,7 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit*
uint32 triggerSpellId = GetSpellInfo()->Effects[m_effIndex].TriggerSpell;
if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))
{
- if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? caster : target)
+ if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)
{
int32 basepoints = GetAmount();
triggerCaster->CastCustomSpell(target, triggerSpellId, &basepoints, &basepoints, &basepoints, true, 0, this);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 91a5c35955a..edb2139bd46 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -917,13 +917,13 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex)
SpellCastTargets targets;
if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET)
{
- if (!spellInfo->NeedsToBeTriggeredByCaster())
+ if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo))
return;
targets.SetUnitTarget(unitTarget);
}
else //if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH)
{
- if (spellInfo->NeedsToBeTriggeredByCaster() && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK))
+ if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK))
return;
if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION)
@@ -969,13 +969,13 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex)
SpellCastTargets targets;
if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET)
{
- if (!spellInfo->NeedsToBeTriggeredByCaster())
+ if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo))
return;
targets.SetUnitTarget(unitTarget);
}
else //if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT)
{
- if (spellInfo->NeedsToBeTriggeredByCaster() && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK))
+ if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK))
return;
if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION)
@@ -1133,29 +1133,6 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/)
if (!unitTarget || unitTarget->IsInFlight())
return;
- // Pre effects
- switch (m_spellInfo->Id)
- {
- case 66550: // teleports outside (Isle of Conquest)
- if (Player* target = unitTarget->ToPlayer())
- {
- if (target->GetTeamId() == TEAM_ALLIANCE)
- m_targets.SetDst(442.24f, -835.25f, 44.30f, 0.06f, 628);
- else
- m_targets.SetDst(1120.43f, -762.11f, 47.92f, 2.94f, 628);
- }
- break;
- case 66551: // teleports inside (Isle of Conquest)
- if (Player* target = unitTarget->ToPlayer())
- {
- if (target->GetTeamId() == TEAM_ALLIANCE)
- m_targets.SetDst(389.57f, -832.38f, 48.65f, 3.00f, 628);
- else
- m_targets.SetDst(1174.85f, -763.24f, 48.72f, 6.26f, 628);
- }
- break;
- }
-
// If not exist data for dest location - return
if (!m_targets.HasDst())
{
@@ -3985,26 +3962,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
return;
}
- case 58941: // Rock Shards
- if (unitTarget && m_originalCaster)
- {
- for (uint32 i = 0; i < 3; ++i)
- {
- m_originalCaster->CastSpell(unitTarget, 58689, true);
- m_originalCaster->CastSpell(unitTarget, 58692, true);
- }
- if (((InstanceMap*)m_originalCaster->GetMap())->GetDifficulty() == REGULAR_DIFFICULTY)
- {
- m_originalCaster->CastSpell(unitTarget, 58695, true);
- m_originalCaster->CastSpell(unitTarget, 58696, true);
- }
- else
- {
- m_originalCaster->CastSpell(unitTarget, 60883, true);
- m_originalCaster->CastSpell(unitTarget, 60884, true);
- }
- }
- return;
case 58983: // Big Blizzard Bear
{
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 04437b82f2d..99242d622df 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1004,14 +1004,12 @@ bool SpellInfo::NeedsExplicitUnitTarget() const
return GetExplicitTargetMask() & TARGET_FLAG_UNIT_MASK;
}
-bool SpellInfo::NeedsToBeTriggeredByCaster() const
+bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const
{
- if (AttributesCu & SPELL_ATTR0_CU_TRIGGERED_BY_CASTER)
- return true;
-
if (NeedsExplicitUnitTarget())
return true;
+ /*
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
if (Effects[i].IsEffect())
@@ -1021,6 +1019,20 @@ bool SpellInfo::NeedsToBeTriggeredByCaster() const
return true;
}
}
+ */
+
+ if (triggeringSpell->IsChanneled())
+ {
+ uint32 mask = 0;
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if (Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetA.GetTarget() != TARGET_DEST_CASTER)
+ mask |= Effects[i].GetProvidedTargetMask();
+ }
+
+ if (mask & TARGET_FLAG_UNIT_MASK)
+ return true;
+ }
return false;
}
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 6acde5afa74..c2ca938d26f 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -176,7 +176,6 @@ enum SpellCustomAttributes
SPELL_ATTR0_CU_CONE_LINE = 0x00000004,
SPELL_ATTR0_CU_SHARE_DAMAGE = 0x00000008,
SPELL_ATTR0_CU_NO_INITIAL_THREAT = 0x00000010,
- SPELL_ATTR0_CU_TRIGGERED_BY_CASTER = 0x00000020, // @todo: need generic solution, some triggered spells will be casted by target instead of caster
SPELL_ATTR0_CU_AURA_CC = 0x00000040,
SPELL_ATTR0_CU_DIRECT_DAMAGE = 0x00000100,
SPELL_ATTR0_CU_CHARGE = 0x00000200,
@@ -386,7 +385,7 @@ public:
bool IsAffectingArea() const;
bool IsTargetingArea() const;
bool NeedsExplicitUnitTarget() const;
- bool NeedsToBeTriggeredByCaster() const;
+ bool NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const;
bool IsPassive() const;
bool IsAutocastable() const;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 5d471492553..29a869cf458 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2974,9 +2974,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
case 72293: // Mark of the Fallen Champion (Deathbringer Saurfang)
spellInfo->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF0;
break;
- case 38729: // Rod of Purification
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_TRIGGERED_BY_CASTER;
- break;
default:
break;
}
@@ -3750,6 +3747,13 @@ void SpellMgr::LoadSpellInfoCorrections()
// Crashes client on pressing ESC
spellInfo->AttributesEx4 &= ~SPELL_ATTR4_TRIGGERED;
break;
+ // ISLE OF CONQUEST SPELLS
+ //
+ case 66551: // Teleport
+ spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 50000yd
+ break;
+ // ENDOF ISLE OF CONQUEST SPELLS
+ //
default:
break;
}
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index df80ba3c797..c13e9d08172 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -264,7 +264,7 @@ public:
unit = player;
std::ifstream ifs("opcode.txt");
- if (ifs.bad())
+ if (ifs.fail())
return false;
// remove comments from file
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 872be042074..0dfb7181fef 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -33,15 +33,18 @@ EndScriptData */
#include "Player.h"
#include "Pet.h"
-struct NpcFlagText
+template<typename E, typename T = char const*>
+struct EnumName
{
- uint32 flag;
- int32 text;
+ E Value;
+ T Name;
};
+#define CREATE_NAMED_ENUM(VALUE) { VALUE, STRINGIZE(VALUE) }
+
#define NPCFLAG_COUNT 24
-NpcFlagText const npcFlagTexts[NPCFLAG_COUNT] =
+EnumName<NPCFlags, int32> const npcFlagTexts[NPCFLAG_COUNT] =
{
{ UNIT_NPC_FLAG_AUCTIONEER, LANG_NPCINFO_AUCTIONEER },
{ UNIT_NPC_FLAG_BANKER, LANG_NPCINFO_BANKER },
@@ -69,89 +72,76 @@ NpcFlagText const npcFlagTexts[NPCFLAG_COUNT] =
{ UNIT_NPC_FLAG_VENDOR_REAGENT, LANG_NPCINFO_VENDOR_REAGENT }
};
-struct MechanicImmune
-{
- uint32 flag;
- char const* text;
-};
-
-MechanicImmune const mechanicImmunes[MAX_MECHANIC] =
-{
- { MECHANIC_NONE , "MECHANIC_NONE" },
- { MECHANIC_CHARM , "MECHANIC_CHARM" },
- { MECHANIC_DISORIENTED , "MECHANIC_DISORIENTED" },
- { MECHANIC_DISARM , "MECHANIC_DISARM" },
- { MECHANIC_DISTRACT , "MECHANIC_DISTRACT" },
- { MECHANIC_FEAR , "MECHANIC_FEAR" },
- { MECHANIC_GRIP , "MECHANIC_GRIP" },
- { MECHANIC_ROOT , "MECHANIC_ROOT" },
- { MECHANIC_SLOW_ATTACK , "MECHANIC_SLOW_ATTACK" },
- { MECHANIC_SILENCE , "MECHANIC_SILENCE" },
- { MECHANIC_SLEEP , "MECHANIC_SLEEP" },
- { MECHANIC_SNARE , "MECHANIC_SNARE" },
- { MECHANIC_STUN , "MECHANIC_STUN" },
- { MECHANIC_FREEZE , "MECHANIC_FREEZE" },
- { MECHANIC_KNOCKOUT , "MECHANIC_KNOCKOUT" },
- { MECHANIC_BLEED , "MECHANIC_BLEED" },
- { MECHANIC_BANDAGE , "MECHANIC_BANDAGE" },
- { MECHANIC_POLYMORPH , "MECHANIC_POLYMORPH" },
- { MECHANIC_BANISH , "MECHANIC_BANISH" },
- { MECHANIC_SHIELD , "MECHANIC_SHIELD" },
- { MECHANIC_SHACKLE , "MECHANIC_SHACKLE" },
- { MECHANIC_MOUNT , "MECHANIC_MOUNT" },
- { MECHANIC_INFECTED , "MECHANIC_INFECTED" },
- { MECHANIC_TURN , "MECHANIC_TURN" },
- { MECHANIC_HORROR , "MECHANIC_HORROR" },
- { MECHANIC_INVULNERABILITY , "MECHANIC_INVULNERABILITY" },
- { MECHANIC_INTERRUPT , "MECHANIC_INTERRUPT" },
- { MECHANIC_DAZE , "MECHANIC_DAZE" },
- { MECHANIC_DISCOVERY , "MECHANIC_DISCOVERY" },
- { MECHANIC_IMMUNE_SHIELD , "MECHANIC_IMMUNE_SHIELD" },
- { MECHANIC_SAPPED , "MECHANIC_SAPPED" },
- { MECHANIC_ENRAGED , "MECHANIC_ENRAGED" }
-};
-
-
-struct UnitFlag
+EnumName<Mechanics> const mechanicImmunes[MAX_MECHANIC] =
{
- uint32 flag;
- char const* text;
+ CREATE_NAMED_ENUM(MECHANIC_NONE),
+ CREATE_NAMED_ENUM(MECHANIC_CHARM),
+ CREATE_NAMED_ENUM(MECHANIC_DISORIENTED),
+ CREATE_NAMED_ENUM(MECHANIC_DISARM),
+ CREATE_NAMED_ENUM(MECHANIC_DISTRACT),
+ CREATE_NAMED_ENUM(MECHANIC_FEAR),
+ CREATE_NAMED_ENUM(MECHANIC_GRIP),
+ CREATE_NAMED_ENUM(MECHANIC_ROOT),
+ CREATE_NAMED_ENUM(MECHANIC_SLOW_ATTACK),
+ CREATE_NAMED_ENUM(MECHANIC_SILENCE),
+ CREATE_NAMED_ENUM(MECHANIC_SLEEP),
+ CREATE_NAMED_ENUM(MECHANIC_SNARE),
+ CREATE_NAMED_ENUM(MECHANIC_STUN),
+ CREATE_NAMED_ENUM(MECHANIC_FREEZE),
+ CREATE_NAMED_ENUM(MECHANIC_KNOCKOUT),
+ CREATE_NAMED_ENUM(MECHANIC_BLEED),
+ CREATE_NAMED_ENUM(MECHANIC_BANDAGE),
+ CREATE_NAMED_ENUM(MECHANIC_POLYMORPH),
+ CREATE_NAMED_ENUM(MECHANIC_BANISH),
+ CREATE_NAMED_ENUM(MECHANIC_SHIELD),
+ CREATE_NAMED_ENUM(MECHANIC_SHACKLE),
+ CREATE_NAMED_ENUM(MECHANIC_MOUNT),
+ CREATE_NAMED_ENUM(MECHANIC_INFECTED),
+ CREATE_NAMED_ENUM(MECHANIC_TURN),
+ CREATE_NAMED_ENUM(MECHANIC_HORROR),
+ CREATE_NAMED_ENUM(MECHANIC_INVULNERABILITY),
+ CREATE_NAMED_ENUM(MECHANIC_INTERRUPT),
+ CREATE_NAMED_ENUM(MECHANIC_DAZE),
+ CREATE_NAMED_ENUM(MECHANIC_DISCOVERY),
+ CREATE_NAMED_ENUM(MECHANIC_IMMUNE_SHIELD),
+ CREATE_NAMED_ENUM(MECHANIC_SAPPED),
+ CREATE_NAMED_ENUM(MECHANIC_ENRAGED)
};
-UnitFlag const unitFlags[MAX_UNIT_FLAGS] =
+EnumName<UnitFlags> const unitFlags[MAX_UNIT_FLAGS] =
{
- { UNIT_FLAG_SERVER_CONTROLLED , "UNIT_FLAG_SERVER_CONTROLLED" },
- { UNIT_FLAG_NON_ATTACKABLE , "UNIT_FLAG_NON_ATTACKABLE" },
- { UNIT_FLAG_DISABLE_MOVE , "UNIT_FLAG_DISABLE_MOVE" },
- { UNIT_FLAG_PVP_ATTACKABLE , "UNIT_FLAG_PVP_ATTACKABLE" },
- { UNIT_FLAG_RENAME , "UNIT_FLAG_RENAME" },
- { UNIT_FLAG_PREPARATION , "UNIT_FLAG_PREPARATION" },
- { UNIT_FLAG_UNK_6 , "UNIT_FLAG_UNK_6" },
- { UNIT_FLAG_NOT_ATTACKABLE_1 , "UNIT_FLAG_NOT_ATTACKABLE_1" },
- { UNIT_FLAG_IMMUNE_TO_PC , "UNIT_FLAG_IMMUNE_TO_PC" },
- { UNIT_FLAG_IMMUNE_TO_NPC , "UNIT_FLAG_IMMUNE_TO_NPC" },
- { UNIT_FLAG_LOOTING , "UNIT_FLAG_LOOTING" },
- { UNIT_FLAG_PET_IN_COMBAT , "UNIT_FLAG_PET_IN_COMBAT" },
- { UNIT_FLAG_PVP , "UNIT_FLAG_PVP" },
- { UNIT_FLAG_SILENCED , "UNIT_FLAG_SILENCED" },
- { UNIT_FLAG_UNK_14 , "UNIT_FLAG_UNK_14" },
- { UNIT_FLAG_UNK_15 , "UNIT_FLAG_UNK_15" },
- { UNIT_FLAG_UNK_16 , "UNIT_FLAG_UNK_16" },
- { UNIT_FLAG_PACIFIED , "UNIT_FLAG_PACIFIED" },
- { UNIT_FLAG_STUNNED , "UNIT_FLAG_STUNNED" },
- { UNIT_FLAG_IN_COMBAT , "UNIT_FLAG_IN_COMBAT" },
- { UNIT_FLAG_TAXI_FLIGHT , "UNIT_FLAG_TAXI_FLIGHT" },
- { UNIT_FLAG_DISARMED , "UNIT_FLAG_DISARMED" },
- { UNIT_FLAG_CONFUSED , "UNIT_FLAG_CONFUSED" },
- { UNIT_FLAG_FLEEING , "UNIT_FLAG_FLEEING" },
- { UNIT_FLAG_PLAYER_CONTROLLED , "UNIT_FLAG_PLAYER_CONTROLLED" },
- { UNIT_FLAG_NOT_SELECTABLE , "UNIT_FLAG_NOT_SELECTABLE" },
- { UNIT_FLAG_SKINNABLE , "UNIT_FLAG_SKINNABLE" },
- { UNIT_FLAG_MOUNT , "UNIT_FLAG_MOUNT" },
- { UNIT_FLAG_UNK_28 , "UNIT_FLAG_UNK_28" },
- { UNIT_FLAG_UNK_29 , "UNIT_FLAG_UNK_29" },
- { UNIT_FLAG_SHEATHE , "UNIT_FLAG_SHEATHE" },
- { UNIT_FLAG_UNK_31 , "UNIT_FLAG_UNK_31" }
+ CREATE_NAMED_ENUM(UNIT_FLAG_SERVER_CONTROLLED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_NON_ATTACKABLE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_DISABLE_MOVE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PVP_ATTACKABLE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_RENAME),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PREPARATION),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_6),
+ CREATE_NAMED_ENUM(UNIT_FLAG_NOT_ATTACKABLE_1),
+ CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_PC),
+ CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_NPC),
+ CREATE_NAMED_ENUM(UNIT_FLAG_LOOTING),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PET_IN_COMBAT),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PVP),
+ CREATE_NAMED_ENUM(UNIT_FLAG_SILENCED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_14),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_15),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_16),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PACIFIED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_STUNNED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_IN_COMBAT),
+ CREATE_NAMED_ENUM(UNIT_FLAG_TAXI_FLIGHT),
+ CREATE_NAMED_ENUM(UNIT_FLAG_DISARMED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_CONFUSED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_FLEEING),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PLAYER_CONTROLLED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_NOT_SELECTABLE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_SKINNABLE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_MOUNT),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_28),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_29),
+ CREATE_NAMED_ENUM(UNIT_FLAG_SHEATHE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_31)
};
class npc_commandscript : public CommandScript
@@ -242,10 +232,15 @@ public:
char* team = strtok(NULL, " ");
int32 teamval = 0;
- if (team) { teamval = atoi(team); }
- if (teamval < 0) { teamval = 0; }
+ if (team)
+ teamval = atoi(team);
+
+ if (teamval < 0)
+ teamval = 0;
uint32 id = atoi(charID);
+ if (!sObjectMgr->GetCreatureTemplate(id))
+ return false;
Player* chr = handler->GetSession()->GetPlayer();
float x = chr->GetPositionX();
@@ -737,8 +732,8 @@ public:
handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS));
for (uint8 i = 0; i < MAX_UNIT_FLAGS; ++i)
- if (target->GetUInt32Value(UNIT_FIELD_FLAGS) & unitFlags[i].flag)
- handler->PSendSysMessage(unitFlags[i].text, unitFlags[i].flag);
+ if (target->GetUInt32Value(UNIT_FIELD_FLAGS) & unitFlags[i].Value)
+ handler->PSendSysMessage("%s (0x%X)", unitFlags[i].Name, unitFlags[i].Value);
handler->PSendSysMessage(LANG_NPCINFO_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS_2), target->GetUInt32Value(UNIT_DYNAMIC_FLAGS), target->getFaction());
handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str());
@@ -750,13 +745,13 @@ public:
handler->PSendSysMessage(LANG_NPCINFO_AIINFO, target->GetAIName().c_str(), target->GetScriptName().c_str());
for (uint8 i = 0; i < NPCFLAG_COUNT; i++)
- if (npcflags & npcFlagTexts[i].flag)
- handler->PSendSysMessage(npcFlagTexts[i].text, npcFlagTexts[i].flag);
+ if (npcflags & npcFlagTexts[i].Value)
+ handler->PSendSysMessage(npcFlagTexts[i].Name);
handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask);
for (uint8 i = 0; i < MAX_MECHANIC; ++i)
- if ((mechanicImmuneMask << 1) & mechanicImmunes[i].flag)
- handler->PSendSysMessage(mechanicImmunes[i].text, mechanicImmunes[i].flag);
+ if ((mechanicImmuneMask << 1) & mechanicImmunes[i].Value)
+ handler->PSendSysMessage("%s (0x%X)", mechanicImmunes[i].Name, mechanicImmunes[i].Value);
return true;
}
@@ -1361,6 +1356,9 @@ public:
if (!id)
return false;
+ if (!sObjectMgr->GetCreatureTemplate(id))
+ return false;
+
chr->SummonCreature(id, *chr, TEMPSUMMON_CORPSE_DESPAWN, 120);
return true;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
index 4c6b3ae8b3f..7fcb624c35e 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
@@ -989,6 +989,7 @@ class boss_yogg_saron : public CreatureScript
Talk(SAY_YOGG_SARON_PHASE_3);
DoCast(me, SPELL_PHASE_3_TRANSFORM);
me->RemoveAurasDueToSpell(SPELL_SHADOWY_BARRIER_YOGG);
+ me->ResetPlayerDamageReq();
break;
default:
break;
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
index e44e0ab0539..7d3d149f0ff 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellScript.h"
#include "vault_of_archavon.h"
enum Emotes
@@ -27,9 +28,12 @@ enum Emotes
enum Spells
{
-
// Spells Archavon
SPELL_ROCK_SHARDS = 58678,
+ SPELL_ROCK_SHARDS_VISUAL_L = 58689,
+ SPELL_ROCK_SHARDS_VISUAL_R = 58692,
+ SPELL_ROCK_SHARDS_DAMAGE_L = 58695,
+ SPELL_ROCK_SHARDS_DAMAGE_R = 58696,
SPELL_CRUSHING_LEAP = 58960,
SPELL_STOMP = 58663,
SPELL_IMPALE = 58666,
@@ -205,8 +209,55 @@ class npc_archavon_warder : public CreatureScript
}
};
+// 58941 - Rock Shards
+class spell_archavon_rock_shards : public SpellScriptLoader
+{
+ public:
+ spell_archavon_rock_shards() : SpellScriptLoader("spell_archavon_rock_shards") { }
+
+ class spell_archavon_rock_shards_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_archavon_rock_shards_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_VISUAL_L)
+ || !sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_VISUAL_R)
+ || !sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_DAMAGE_L)
+ || !sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_DAMAGE_R))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+
+ for (uint8 i = 0; i < 3; ++i)
+ {
+ caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_VISUAL_L, true);
+ caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_VISUAL_R, true);
+ }
+
+ caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_DAMAGE_L, true);
+ caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_DAMAGE_R, true);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHit += SpellEffectFn(spell_archavon_rock_shards_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_archavon_rock_shards_SpellScript();
+ }
+};
+
void AddSC_boss_archavon()
{
new boss_archavon();
new npc_archavon_warder();
+ new spell_archavon_rock_shards();
}
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index 8804410d814..85f655372c6 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -25,7 +25,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
-#include "SpellAuras.h"
+#include "SpellAuraEffects.h"
#include "Vehicle.h"
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
@@ -2072,8 +2072,6 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader
{
uint32 spellId = 0;
- TC_LOG_DEBUG(LOG_FILTER_SPELLS_AURAS, "spell_q12641_death_comes_from_on_high:: Caster: %s (GUID: %u) On Hit Target: Creature: %s (Entry: %u GUID: %u)",
- GetOriginalCaster()->GetName().c_str(), GetOriginalCaster()->GetGUIDLow(), GetHitCreature()->GetName().c_str(), GetHitCreature()->GetEntry(), GetHitCreature()->GetGUIDLow());
switch (GetHitCreature()->GetEntry())
{
case NPC_NEW_AVALON_FORGE:
@@ -2092,7 +2090,7 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader
return;
}
- GetOriginalCaster()->CastSpell((Unit*)NULL, spellId, true);
+ GetCaster()->CastSpell((Unit*)NULL, spellId, true);
}
void Register() OVERRIDE
@@ -2107,6 +2105,61 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader
}
};
+// 51769 - Emblazon Runeblade
+class spell_q12619_emblazon_runeblade : public SpellScriptLoader
+{
+ public:
+ spell_q12619_emblazon_runeblade() : SpellScriptLoader("spell_q12619_emblazon_runeblade") { }
+
+ class spell_q12619_emblazon_runeblade_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_q12619_emblazon_runeblade_AuraScript);
+
+ void HandleEffectPeriodic(AuraEffect const* aurEff)
+ {
+ PreventDefaultAction();
+ GetCaster()->CastSpell(GetCaster(), GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_q12619_emblazon_runeblade_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_q12619_emblazon_runeblade_AuraScript();
+ }
+};
+
+// 51770 - Emblazon Runeblade
+class spell_q12619_emblazon_runeblade_effect : public SpellScriptLoader
+{
+ public:
+ spell_q12619_emblazon_runeblade_effect() : SpellScriptLoader("spell_q12619_emblazon_runeblade_effect") { }
+
+ class spell_q12619_emblazon_runeblade_effect_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q12619_emblazon_runeblade_effect_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHit += SpellEffectFn(spell_q12619_emblazon_runeblade_effect_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_q12619_emblazon_runeblade_effect_SpellScript();
+ }
+};
+
void AddSC_quest_spell_scripts()
{
new spell_q55_sacred_cleansing();
@@ -2157,4 +2210,6 @@ void AddSC_quest_spell_scripts()
new spell_q12308_escape_from_silverbrook_summon_worgen();
new spell_q12308_escape_from_silverbrook();
new spell_q12641_death_comes_from_on_high();
+ new spell_q12619_emblazon_runeblade();
+ new spell_q12619_emblazon_runeblade_effect();
}
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 7e237614f62..fdb71dd8d1a 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -458,6 +458,9 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi INNER JOIN guild g ON g.guildid = gi.guildid INNER JOIN item_instance ii ON ii.guid = gi.item_guid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT, "DELETE FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, "DELETE FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT, "INSERT INTO character_achievement (guid, achievement, date) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, "DELETE FROM character_achievement_progress WHERE guid = ? AND criteria = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC);
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index f97dd63064d..4aeee0ac525 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -394,6 +394,9 @@ enum CharacterDatabaseStatements
CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY,
CHAR_DEL_CHAR_ACHIEVEMENT,
CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS,
+ CHAR_INS_CHAR_ACHIEVEMENT,
+ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA,
+ CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS,
CHAR_DEL_CHAR_REPUTATION_BY_FACTION,
CHAR_INS_CHAR_REPUTATION_BY_FACTION,
CHAR_UPD_CHAR_ARENA_POINTS,