aboutsummaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/game')
-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
6 files changed, 148 insertions, 47 deletions
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();