aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp26
-rw-r--r--src/game/Object.cpp2
-rw-r--r--src/game/Spell.cpp6
-rw-r--r--src/game/SpellEffects.cpp2
-rw-r--r--src/game/SpellMgr.cpp142
-rw-r--r--src/game/SpellMgr.h39
-rw-r--r--src/game/World.cpp4
7 files changed, 158 insertions, 63 deletions
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
index 018507dc41d..e703b4b6c26 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
@@ -157,15 +157,17 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
Timer[EVENT_BERSERK] = 600000;
FlightCount = 0;
- m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
m_creature->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
DespawnSummons(MOB_VAPOR_TRAIL);
+ m_creature->setActive(false);
}
void Aggro(Unit *who)
{
+ m_creature->setActive(true);
DoZoneInCombat();
m_creature->CastSpell(m_creature, AURA_SUNWELL_RADIANCE, true);
m_creature->CastSpell(m_creature, AURA_NOXIOUS_FUMES, true);
@@ -282,20 +284,18 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
m_creature->AttackStop();
m_creature->GetMotionMaster()->Clear(false);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->StopMoving();
DoYell(YELL_TAKEOFF, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_TAKEOFF);
Timer[EVENT_FLIGHT_SEQUENCE] = 2000;
break;
case 1:
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX()+1, m_creature->GetPositionY(), m_creature->GetPositionZ()+10);
- m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
Timer[EVENT_FLIGHT_SEQUENCE] = 0;
break;
case 2:
- if(Player* target = SelectRandomPlayer(50))
+ if(Player* target = SelectRandomPlayer(150))
{
Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
if(Vapor)
@@ -311,7 +311,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
case 3:
DespawnSummons(MOB_VAPOR_TRAIL);
//m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support
- if(Player* target = SelectRandomPlayer(50))
+ if(Player* target = SelectRandomPlayer(150))
{
//target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
@@ -330,15 +330,13 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
Timer[EVENT_FLIGHT_SEQUENCE] = 1;
break;
case 5:
- if(Player* target = SelectRandomPlayer(80))
+ if(Player* target = SelectRandomPlayer(150))
{
BreathX = target->GetPositionX();
BreathY = target->GetPositionY();
float x, y, z;
- target->GetContactPoint(m_creature, x, y, z, 40);
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
+ target->GetContactPoint(m_creature, x, y, z, 70);
m_creature->GetMotionMaster()->MovePoint(0, x, y, z+10);
- m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
}else EnterEvadeMode();
Timer[EVENT_FLIGHT_SEQUENCE] = 0;
break;
@@ -355,9 +353,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
m_creature->GetPosition(x, y, z);
x = 2 * BreathX - x;
y = 2 * BreathY - y;
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
- m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
}
Timer[EVENT_SUMMON_FOG] = 1;
Timer[EVENT_FLIGHT_SEQUENCE] = 0;
@@ -374,14 +370,12 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
{
float x, y, z;
target->GetContactPoint(m_creature, x, y, z);
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
- m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
}else EnterEvadeMode();
Timer[EVENT_FLIGHT_SEQUENCE] = 0;
break;
case 10:
- m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->StopMoving();
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
EnterPhase(PHASE_GROUND);
@@ -439,7 +433,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
Timer[EVENT_GAS_NOVA] = 20000 + rand()%5 * 1000;
break;
case EVENT_ENCAPSULATE:
- if(Unit* target = SelectRandomPlayer(50))
+ if(Unit* target = SelectRandomPlayer(150))
{
m_creature->CastSpell(target, SPELL_ENCAPSULATE_CHANNEL, false);
target->CastSpell(target, SPELL_ENCAPSULATE_EFFECT, true);// linked aura, need core patch to remove this hack
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 4486b03d80f..2d6a5786471 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -1537,5 +1537,5 @@ void WorldObject::GetRandomContactPoint( const WorldObject* obj, float &x, float
float angle_offset_ratio = 1 - object_size/12.0f;
if (angle_offset_ratio < 0.05) angle_offset_ratio = 0.05;
// angle to face `obj` to `this`plus a random angle offset(from -90 degree to 90 degree)*angle_offset_ratio using distance from distance2dMin to distance2dMax includes size of `obj`
- GetNearPoint(obj,x,y,z,object_size,distance2dMin+(distance2dMax-distance2dMin)*rand_norm(), GetAngle( obj ) + (M_PI_2 - M_PI * rand_norm()) * angle_offset_ratio);
+ GetNearPoint(obj,x,y,z,object_size,distance2dMin+(distance2dMax-distance2dMin)*rand_norm(), GetAngle( obj ) + (M_PI/2 - M_PI * rand_norm()) * angle_offset_ratio);
}
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 7387a63fadc..a3fb99fe405 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -1228,7 +1228,7 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u
TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, WorldTypeMapContainer > world_object_notifier(notifier);
cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
}
- if(!spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_MAX_TARGETS))
+ if(!spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS))
{
TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer > grid_object_notifier(notifier);
cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
@@ -1357,7 +1357,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
case TARGET_ALL_AROUND_CASTER:
{
if(!unMaxTargets)
- unMaxTargets = spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_MAX_TARGETS);
+ unMaxTargets = spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS);
m_caster->GetPosition(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ);
}break;
case TARGET_CURRENT_ENEMY_COORDINATES:
@@ -1423,7 +1423,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
case TARGET_IN_FRONT_OF_CASTER:
case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
{
- switch(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_CONE_TYPE))
+ switch(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_CONE_TYPE))
{
default:
case 0:
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 7af5316c693..25454f41462 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -312,7 +312,7 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
}
// Meteor like spells (divided damage to targets)
- if(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_SHARE_DAMAGE))
+ if(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_SHARE_DAMAGE))
{
uint32 count = 0;
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index b0db27a0b16..cd934534c2f 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -1969,29 +1969,31 @@ void SpellMgr::LoadSpellPetAuras()
}
// set data in core for now
-void SpellMgr::LoadSpellExtraInfo()
+void SpellMgr::LoadSpellExtraAttr()
{
- SpellExtraInfo info;
- info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 0;
- info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 0;
- info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 0;
-
- info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 1;
- SpellEntry const* tempSpell;
- for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
+ SpellExtraAttribute tempAttr;
+ tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0;
+ tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0;
+ tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0;
+
+ tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 1;
{
- tempSpell = GetSpellStore()->LookupEntry(i);
- if(tempSpell && tempSpell->SpellVisual == 3879)
- mSpellExtraInfoMap[tempSpell->Id] = info;
+ SpellEntry const* tempSpell;
+ for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
+ {
+ tempSpell = GetSpellStore()->LookupEntry(i);
+ if(tempSpell && tempSpell->SpellVisual == 3879)
+ mSpellExtraAttrMap[tempSpell->Id] = tempAttr;
+ }
}
- info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 2;
- mSpellExtraInfoMap[26029] = info; // dark glare
- mSpellExtraInfoMap[37433] = info; // spout
- mSpellExtraInfoMap[43140] = info; // flame breath
- mSpellExtraInfoMap[43215] = info; // flame breath
- info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 0;
-
- info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 1;
+ tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 2;
+ mSpellExtraAttrMap[26029] = tempAttr; // dark glare
+ mSpellExtraAttrMap[37433] = tempAttr; // spout
+ mSpellExtraAttrMap[43140] = tempAttr; // flame breath
+ mSpellExtraAttrMap[43215] = tempAttr; // flame breath
+ tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0;
+
+ tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 1;
for(uint32 i = 0; i < 46000; ++i)
{
switch(i)
@@ -2004,15 +2006,15 @@ void SpellMgr::LoadSpellExtraInfo()
case 40810: case 43267: case 43268: // Saber Lash
case 42384: // Brutal Swipe
case 45150: // Meteor Slash
- mSpellExtraInfoMap[i] = info;
+ mSpellExtraAttrMap[i] = tempAttr;
break;
default:
break;
}
}
- info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 0;
+ tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0;
- info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 1;
+ tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 1;
for(uint32 i = 0; i < 46000; ++i)
{
switch(i)
@@ -2021,15 +2023,101 @@ void SpellMgr::LoadSpellExtraInfo()
case 45004: case 45006: case 45010: // Wild Magic
case 31347: // Doom
case 41635: // Prayer of Mending
- mSpellExtraInfoMap[i] = info;
+ mSpellExtraAttrMap[i] = tempAttr;
break;
default:
break;
}
}
- info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 3;
- mSpellExtraInfoMap[41376] = info; //Spite
- info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 0;
+ tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 3;
+ mSpellExtraAttrMap[41376] = tempAttr; //Spite
+ tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0;
+
+ //hack here, only for those strange exceptions!
+ // Psychic Scream
+ SpellEntry *tempSpell;
+ if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8122))
+ tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+ if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8124))
+ tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+ if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10888))
+ tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+ if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10890))
+ tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+}
+
+void SpellMgr::LoadSpellLinked()
+{
+ mSpellLinkedMap.clear(); // need for reload case
+ uint32 count = 0;
+
+ // 0 1
+ QueryResult *result = WorldDatabase.Query("SELECT spell0, spell1 FROM spell_linked_spell");
+ if( !result )
+ {
+ barGoLink bar( 1 );
+ bar.step();
+ sLog.outString();
+ sLog.outString( ">> Loaded %u spell pet auras", count );
+ return;
+ }
+
+ barGoLink bar( result->GetRowCount() );
+
+ do
+ {
+ Field *fields = result->Fetch();
+
+ bar.step();
+
+ uint16 spell = fields[0].GetUInt16();
+ uint16 pet = fields[1].GetUInt16();
+ uint16 aura = fields[2].GetUInt16();
+
+ SpellPetAuraMap::iterator itr = mSpellPetAuraMap.find(spell);
+ if(itr != mSpellPetAuraMap.end())
+ {
+ itr->second.AddAura(pet, aura);
+ }
+ else
+ {
+ SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell);
+ if (!spellInfo)
+ {
+ sLog.outErrorDb("Spell %u listed in `spell_pet_auras` does not exist", spell);
+ continue;
+ }
+ int i = 0;
+ for(; i < 3; ++i)
+ if((spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA &&
+ spellInfo->EffectApplyAuraName[i] == SPELL_AURA_DUMMY) ||
+ spellInfo->Effect[i] == SPELL_EFFECT_DUMMY)
+ break;
+
+ if(i == 3)
+ {
+ sLog.outError("Spell %u listed in `spell_pet_auras` does not have dummy aura or dummy effect", spell);
+ continue;
+ }
+
+ SpellEntry const* spellInfo2 = sSpellStore.LookupEntry(aura);
+ if (!spellInfo2)
+ {
+ sLog.outErrorDb("Aura %u listed in `spell_pet_auras` does not exist", aura);
+ continue;
+ }
+
+ PetAura pa(pet, aura, spellInfo->EffectImplicitTargetA[i] == TARGET_PET, spellInfo->EffectBasePoints[i] + spellInfo->EffectBaseDice[i]);
+ mSpellPetAuraMap[spell] = pa;
+ }
+
+ ++count;
+ } while( result->NextRow() );
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u spell pet auras", count );
}
/// Some checks for spells, to prevent adding depricated/broken spells for trainers, spell book, etc
diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h
index e727e446072..b374b65857d 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -634,19 +634,21 @@ inline bool IsProfessionSkill(uint32 skill)
return IsPrimaryProfessionSkill(skill) || skill == SKILL_FISHING || skill == SKILL_COOKING || skill == SKILL_FIRST_AID;
}
-enum SpellExtraInfoType
+enum SpellExtraAttributeType
{
- SPELL_EXTRA_INFO_MAX_TARGETS,
- SPELL_EXTRA_INFO_CONE_TYPE,
- SPELL_EXTRA_INFO_SHARE_DAMAGE
+ SPELL_EXTRA_ATTR_MAX_TARGETS,
+ SPELL_EXTRA_ATTR_CONE_TYPE,
+ SPELL_EXTRA_ATTR_SHARE_DAMAGE
};
-struct SpellExtraInfo
+struct SpellExtraAttribute
{
- uint32 info[3];
+ uint32 attr[3];
};
-typedef std::map<uint32, SpellExtraInfo> SpellExtraInfoMap;
+typedef std::map<uint32, SpellExtraAttribute> SpellExtraAttrMap;
+
+typedef std::map<int32, int32> SpellLinkedMap;
class SpellMgr
{
@@ -846,11 +848,20 @@ class SpellMgr
return NULL;
}
- uint32 GetSpellExtraInfo(uint32 spell_id, uint32 type) const
+ uint32 GetSpellExtraAttr(uint32 spell_id, uint32 type) const
{
- SpellExtraInfoMap::const_iterator itr = mSpellExtraInfoMap.find(spell_id);
- if(itr != mSpellExtraInfoMap.end())
- return itr->second.info[type];
+ SpellExtraAttrMap::const_iterator itr = mSpellExtraAttrMap.find(spell_id);
+ if(itr != mSpellExtraAttrMap.end())
+ return itr->second.attr[type];
+ else
+ return 0;
+ }
+
+ int32 GetSpellLinked(int32 spell_id) const
+ {
+ SpellLinkedMap::const_iterator itr = mSpellLinkedMap.find(spell_id);
+ if(itr != mSpellLinkedMap.end())
+ return itr->second;
else
return 0;
}
@@ -871,7 +882,8 @@ class SpellMgr
void LoadSpellThreats();
void LoadSkillLineAbilityMap();
void LoadSpellPetAuras();
- void LoadSpellExtraInfo();
+ void LoadSpellExtraAttr();
+ void LoadSpellLinked();
private:
SpellScriptTarget mSpellScriptTarget;
@@ -885,7 +897,8 @@ class SpellMgr
SpellProcEventMap mSpellProcEventMap;
SkillLineAbilityMap mSkillLineAbilityMap;
SpellPetAuraMap mSpellPetAuraMap;
- SpellExtraInfoMap mSpellExtraInfoMap;
+ SpellExtraAttrMap mSpellExtraAttrMap;
+ SpellLinkedMap mSpellLinkedMap;
};
#define spellmgr SpellMgr::Instance()
diff --git a/src/game/World.cpp b/src/game/World.cpp
index de89643257f..45070615f4d 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1093,8 +1093,8 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading spell pet auras..." );
spellmgr.LoadSpellPetAuras();
- sLog.outString( "Loading spell extra infos...(TODO)" );
- spellmgr.LoadSpellExtraInfo();
+ sLog.outString( "Loading spell extra attributes...(TODO)" );
+ spellmgr.LoadSpellExtraAttr();
sLog.outString( "Loading player Create Info & Level Stats..." );
objmgr.LoadPlayerInfo();