mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-13 03:32:28 -04:00
[svn] Add SpellExtraInfoMap. Currently support:
Limited-number-of-players spell; shared damage spell; target-in-line cone spell (e.g. dark glare). Change angle of cone spells from 120 degree to 60 degree. --HG-- branch : trunk
This commit is contained in:
@@ -1226,8 +1226,11 @@ 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));
|
||||
}
|
||||
TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer > grid_object_notifier(notifier);
|
||||
cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
||||
if(!spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_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));
|
||||
}
|
||||
}
|
||||
|
||||
Unit* Spell::SearchNearbyTarget(float radius, SpellTargets TargetType, uint32 entry)
|
||||
@@ -1351,6 +1354,8 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
|
||||
m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
|
||||
case TARGET_ALL_AROUND_CASTER:
|
||||
{
|
||||
if(!unMaxTargets)
|
||||
unMaxTargets = spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_MAX_TARGETS);
|
||||
m_caster->GetPosition(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ);
|
||||
}break;
|
||||
case TARGET_CURRENT_ENEMY_COORDINATES:
|
||||
@@ -1413,10 +1418,27 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
|
||||
}
|
||||
}break;
|
||||
case TARGET_IN_FRONT_OF_CASTER:
|
||||
case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
|
||||
{
|
||||
bool inFront = m_spellInfo->SpellVisual != 3879;
|
||||
SearchAreaTarget(TagUnitMap, radius, inFront ? PUSH_IN_FRONT : PUSH_IN_BACK,SPELL_TARGETS_AOE_DAMAGE);
|
||||
switch(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_CONE_TYPE))
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE);
|
||||
break;
|
||||
case 1:
|
||||
SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE);
|
||||
break;
|
||||
case 2:
|
||||
SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE);
|
||||
break;
|
||||
}
|
||||
}break;
|
||||
case TARGET_UNIT_CONE_ALLY:
|
||||
{
|
||||
SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_FRIENDLY);
|
||||
}break;
|
||||
|
||||
|
||||
// nearby target
|
||||
case TARGET_UNIT_NEARBY_ALLY:
|
||||
|
||||
@@ -73,6 +73,7 @@ enum SpellNotifyPushType
|
||||
{
|
||||
PUSH_IN_FRONT,
|
||||
PUSH_IN_BACK,
|
||||
PUSH_IN_LINE,
|
||||
PUSH_SELF_CENTER,
|
||||
PUSH_DEST_CENTER,
|
||||
};
|
||||
@@ -602,11 +603,15 @@ namespace Trinity
|
||||
switch(i_push_type)
|
||||
{
|
||||
case PUSH_IN_FRONT:
|
||||
if(i_spell.GetCaster()->isInFront((Unit*)(itr->getSource()), i_radius, 2*M_PI/3 ))
|
||||
if(i_spell.GetCaster()->isInFront((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
|
||||
i_data->push_back(itr->getSource());
|
||||
break;
|
||||
case PUSH_IN_BACK:
|
||||
if(i_spell.GetCaster()->isInBack((Unit*)(itr->getSource()), i_radius, 2*M_PI/3 ))
|
||||
if(i_spell.GetCaster()->isInBack((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
|
||||
i_data->push_back(itr->getSource());
|
||||
break;
|
||||
case PUSH_IN_LINE:
|
||||
if(i_spell.GetCaster()->isInLine((Unit*)(itr->getSource()), i_radius ))
|
||||
i_data->push_back(itr->getSource());
|
||||
break;
|
||||
case PUSH_SELF_CENTER:
|
||||
|
||||
@@ -311,26 +311,19 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
|
||||
damage+= rand()%2 ? damage : 0;
|
||||
}
|
||||
|
||||
// Meteor like spells (divided damage to targets)
|
||||
if(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_SHARE_DAMAGE))
|
||||
{
|
||||
uint32 count = 0;
|
||||
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
|
||||
if(ihit->effectMask & (1<<effect_idx))
|
||||
++count;
|
||||
|
||||
damage /= count; // divide to all targets
|
||||
}
|
||||
|
||||
switch(m_spellInfo->Id) // better way to check unknown
|
||||
{
|
||||
// Meteor like spells (divided damage to targets)
|
||||
case 24340: case 26558: case 28884: // Meteor
|
||||
case 36837: case 38903: case 41276: // Meteor
|
||||
case 26789: // Shard of the Fallen Star
|
||||
case 31436: // Malevolent Cleave
|
||||
case 35181: // Dive Bomb
|
||||
case 40810: case 43267: case 43268: // Saber Lash
|
||||
case 42384: // Brutal Swipe
|
||||
case 45150: // Meteor Slash
|
||||
{
|
||||
uint32 count = 0;
|
||||
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
|
||||
if(ihit->effectMask & (1<<effect_idx))
|
||||
++count;
|
||||
|
||||
damage /= count; // divide to all targets
|
||||
break;
|
||||
}
|
||||
// percent from health with min
|
||||
case 25599: // Thundercrash
|
||||
{
|
||||
|
||||
@@ -1968,6 +1968,70 @@ void SpellMgr::LoadSpellPetAuras()
|
||||
sLog.outString( ">> Loaded %u spell pet auras", count );
|
||||
}
|
||||
|
||||
// set data in core for now
|
||||
void SpellMgr::LoadSpellExtraInfo()
|
||||
{
|
||||
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)
|
||||
{
|
||||
tempSpell = GetSpellStore()->LookupEntry(i);
|
||||
if(tempSpell && tempSpell->SpellVisual == 3879)
|
||||
mSpellExtraInfoMap[tempSpell->Id] = info;
|
||||
}
|
||||
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;
|
||||
for(uint32 i = 0; i < 46000; ++i)
|
||||
{
|
||||
switch(i)
|
||||
{
|
||||
case 24340: case 26558: case 28884: // Meteor
|
||||
case 36837: case 38903: case 41276: // Meteor
|
||||
case 26789: // Shard of the Fallen Star
|
||||
case 31436: // Malevolent Cleave
|
||||
case 35181: // Dive Bomb
|
||||
case 40810: case 43267: case 43268: // Saber Lash
|
||||
case 42384: // Brutal Swipe
|
||||
case 45150: // Meteor Slash
|
||||
mSpellExtraInfoMap[i] = info;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 0;
|
||||
|
||||
info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 1;
|
||||
for(uint32 i = 0; i < 46000; ++i)
|
||||
{
|
||||
switch(i)
|
||||
{
|
||||
case 44978: case 45001: case 45002: // Wild Magic
|
||||
case 45004: case 45006: case 45010: // Wild Magic
|
||||
case 31347: // Doom
|
||||
case 41635: // Prayer of Mending
|
||||
mSpellExtraInfoMap[i] = info;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 3;
|
||||
mSpellExtraInfoMap[41376] = info; //Spite
|
||||
info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 0;
|
||||
}
|
||||
|
||||
/// Some checks for spells, to prevent adding depricated/broken spells for trainers, spell book, etc
|
||||
bool SpellMgr::IsSpellValid(SpellEntry const* spellInfo, Player* pl, bool msg)
|
||||
{
|
||||
|
||||
@@ -634,6 +634,20 @@ inline bool IsProfessionSkill(uint32 skill)
|
||||
return IsPrimaryProfessionSkill(skill) || skill == SKILL_FISHING || skill == SKILL_COOKING || skill == SKILL_FIRST_AID;
|
||||
}
|
||||
|
||||
enum SpellExtraInfoType
|
||||
{
|
||||
SPELL_EXTRA_INFO_MAX_TARGETS,
|
||||
SPELL_EXTRA_INFO_CONE_TYPE,
|
||||
SPELL_EXTRA_INFO_SHARE_DAMAGE
|
||||
};
|
||||
|
||||
struct SpellExtraInfo
|
||||
{
|
||||
uint32 info[3];
|
||||
};
|
||||
|
||||
typedef std::map<uint32, SpellExtraInfo> SpellExtraInfoMap;
|
||||
|
||||
class SpellMgr
|
||||
{
|
||||
// Constructors
|
||||
@@ -832,6 +846,15 @@ class SpellMgr
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uint32 GetSpellExtraInfo(uint32 spell_id, uint32 type) const
|
||||
{
|
||||
SpellExtraInfoMap::const_iterator itr = mSpellExtraInfoMap.find(spell_id);
|
||||
if(itr != mSpellExtraInfoMap.end())
|
||||
return itr->second.info[type];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Modifiers
|
||||
public:
|
||||
static SpellMgr& Instance();
|
||||
@@ -848,6 +871,7 @@ class SpellMgr
|
||||
void LoadSpellThreats();
|
||||
void LoadSkillLineAbilityMap();
|
||||
void LoadSpellPetAuras();
|
||||
void LoadSpellExtraInfo();
|
||||
|
||||
private:
|
||||
SpellScriptTarget mSpellScriptTarget;
|
||||
@@ -861,6 +885,7 @@ class SpellMgr
|
||||
SpellProcEventMap mSpellProcEventMap;
|
||||
SkillLineAbilityMap mSkillLineAbilityMap;
|
||||
SpellPetAuraMap mSpellPetAuraMap;
|
||||
SpellExtraInfoMap mSpellExtraInfoMap;
|
||||
};
|
||||
|
||||
#define spellmgr SpellMgr::Instance()
|
||||
|
||||
@@ -3448,6 +3448,15 @@ bool Unit::isInBack(Unit const* target, float distance, float arc) const
|
||||
return IsWithinDistInMap(target, distance) && !HasInArc( 2 * M_PI - arc, target );
|
||||
}
|
||||
|
||||
bool Unit::isInLine(Unit const* target, float distance) const
|
||||
{
|
||||
if(!HasInArc(M_PI, target) || !IsWithinDistInMap(target, distance)) return false;
|
||||
float width = (GetObjectSize() / 2 + target->GetObjectSize()) / 2;
|
||||
float angle = GetAngle(target);
|
||||
angle -= GetOrientation();
|
||||
return abs(sin(angle)) * distance < width;
|
||||
}
|
||||
|
||||
bool Unit::isInAccessablePlaceFor(Creature const* c) const
|
||||
{
|
||||
if(IsInWater())
|
||||
|
||||
@@ -1095,6 +1095,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
bool isInFront(Unit const* target,float distance, float arc = M_PI) const;
|
||||
void SetInFront(Unit const* target);
|
||||
bool isInBack(Unit const* target, float distance, float arc = M_PI) const;
|
||||
bool isInLine(Unit const* target, float distance) const;
|
||||
|
||||
// Visibility system
|
||||
UnitVisibility GetVisibility() const { return m_Visibility; }
|
||||
|
||||
@@ -1095,6 +1095,9 @@ void World::SetInitialWorldSettings()
|
||||
sLog.outString( "Loading spell pet auras..." );
|
||||
spellmgr.LoadSpellPetAuras();
|
||||
|
||||
sLog.outString( "Loading spell extra infos...(TODO)" );
|
||||
spellmgr.LoadSpellExtraInfo();
|
||||
|
||||
sLog.outString( "Loading player Create Info & Level Stats..." );
|
||||
objmgr.LoadPlayerInfo();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user