mirror of
https://github.com/mangosfour/server.git
synced 2025-12-17 16:37:00 +00:00
[8544] Implement implicit target type 40, TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT
Signed-off-by: Ambal <pogrebniak@gala.net>
This commit is contained in:
parent
549556c7d0
commit
f6f5b532cc
4 changed files with 39 additions and 7 deletions
|
|
@ -1035,6 +1035,7 @@ enum Targets
|
||||||
TARGET_AREAEFFECT_PARTY = 37,
|
TARGET_AREAEFFECT_PARTY = 37,
|
||||||
TARGET_SCRIPT = 38,
|
TARGET_SCRIPT = 38,
|
||||||
TARGET_SELF_FISHING = 39,
|
TARGET_SELF_FISHING = 39,
|
||||||
|
TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT= 40,
|
||||||
TARGET_TOTEM_EARTH = 41,
|
TARGET_TOTEM_EARTH = 41,
|
||||||
TARGET_TOTEM_WATER = 42,
|
TARGET_TOTEM_WATER = 42,
|
||||||
TARGET_TOTEM_AIR = 43,
|
TARGET_TOTEM_AIR = 43,
|
||||||
|
|
|
||||||
|
|
@ -488,10 +488,13 @@ void Spell::FillTargetMap()
|
||||||
if(m_spellInfo->Effect[i] == 0)
|
if(m_spellInfo->Effect[i] == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// targets for TARGET_SCRIPT_COORDINATES (A) and TARGET_SCRIPT filled in Spell::CheckCast call
|
// targets for TARGET_SCRIPT_COORDINATES (A) and TARGET_SCRIPT
|
||||||
|
// and TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT (A) if no RequiresSpellFocus set
|
||||||
|
// filled in Spell::CheckCast call
|
||||||
if( m_spellInfo->EffectImplicitTargetA[i] == TARGET_SCRIPT_COORDINATES ||
|
if( m_spellInfo->EffectImplicitTargetA[i] == TARGET_SCRIPT_COORDINATES ||
|
||||||
m_spellInfo->EffectImplicitTargetA[i] == TARGET_SCRIPT ||
|
m_spellInfo->EffectImplicitTargetA[i] == TARGET_SCRIPT ||
|
||||||
m_spellInfo->EffectImplicitTargetB[i] == TARGET_SCRIPT && m_spellInfo->EffectImplicitTargetA[i] != TARGET_SELF )
|
(m_spellInfo->EffectImplicitTargetA[i] == TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT && !m_spellInfo->RequiresSpellFocus) ||
|
||||||
|
(m_spellInfo->EffectImplicitTargetB[i] == TARGET_SCRIPT && m_spellInfo->EffectImplicitTargetA[i] != TARGET_SELF) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// TODO: find a way so this is not needed?
|
// TODO: find a way so this is not needed?
|
||||||
|
|
@ -1313,6 +1316,31 @@ void Spell::SetTargetMap(uint32 effIndex,uint32 targetMode,UnitList& TagUnitMap)
|
||||||
|
|
||||||
switch(targetMode)
|
switch(targetMode)
|
||||||
{
|
{
|
||||||
|
case TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT:
|
||||||
|
{
|
||||||
|
if(m_spellInfo->RequiresSpellFocus)
|
||||||
|
{
|
||||||
|
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
||||||
|
Cell cell(p);
|
||||||
|
cell.data.Part.reserved = ALL_DISTRICT;
|
||||||
|
|
||||||
|
GameObject* goTarget = NULL;
|
||||||
|
MaNGOS::GameObjectFocusCheck go_check(m_caster, m_spellInfo->RequiresSpellFocus);
|
||||||
|
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectFocusCheck> checker(m_caster, goTarget, go_check);
|
||||||
|
|
||||||
|
TypeContainerVisitor<MaNGOS::GameObjectSearcher<MaNGOS::GameObjectFocusCheck>, GridTypeMapContainer > object_checker(checker);
|
||||||
|
CellLock<GridReadGuard> cell_lock(cell, p);
|
||||||
|
Map& map = *m_caster->GetMap();
|
||||||
|
cell_lock->Visit(cell_lock, object_checker, map, *m_caster, map.GetVisibilityDistance());
|
||||||
|
|
||||||
|
if(goTarget)
|
||||||
|
AddGOTarget(goTarget, effIndex);
|
||||||
|
}
|
||||||
|
else if(m_targets.getGOTarget())
|
||||||
|
AddGOTarget(m_targets.getGOTarget(), effIndex);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case TARGET_RANDOM_NEARBY_LOC:
|
case TARGET_RANDOM_NEARBY_LOC:
|
||||||
radius *= sqrt(rand_norm()); // Get a random point in circle. Use sqrt(rand) to correct distribution when converting polar to Cartesian coordinates.
|
radius *= sqrt(rand_norm()); // Get a random point in circle. Use sqrt(rand) to correct distribution when converting polar to Cartesian coordinates.
|
||||||
// no 'break' expected since we use code in case TARGET_RANDOM_CIRCUMFERENCE_POINT!!!
|
// no 'break' expected since we use code in case TARGET_RANDOM_CIRCUMFERENCE_POINT!!!
|
||||||
|
|
@ -1346,7 +1374,6 @@ void Spell::SetTargetMap(uint32 effIndex,uint32 targetMode,UnitList& TagUnitMap)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TARGET_TOTEM_EARTH:
|
case TARGET_TOTEM_EARTH:
|
||||||
case TARGET_TOTEM_WATER:
|
case TARGET_TOTEM_WATER:
|
||||||
case TARGET_TOTEM_AIR:
|
case TARGET_TOTEM_AIR:
|
||||||
|
|
@ -4104,8 +4131,10 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||||
if( m_spellInfo->EffectImplicitTargetA[j] == TARGET_SCRIPT ||
|
if( m_spellInfo->EffectImplicitTargetA[j] == TARGET_SCRIPT ||
|
||||||
m_spellInfo->EffectImplicitTargetB[j] == TARGET_SCRIPT && m_spellInfo->EffectImplicitTargetA[j] != TARGET_SELF ||
|
m_spellInfo->EffectImplicitTargetB[j] == TARGET_SCRIPT && m_spellInfo->EffectImplicitTargetA[j] != TARGET_SELF ||
|
||||||
m_spellInfo->EffectImplicitTargetA[j] == TARGET_SCRIPT_COORDINATES ||
|
m_spellInfo->EffectImplicitTargetA[j] == TARGET_SCRIPT_COORDINATES ||
|
||||||
m_spellInfo->EffectImplicitTargetB[j] == TARGET_SCRIPT_COORDINATES )
|
m_spellInfo->EffectImplicitTargetB[j] == TARGET_SCRIPT_COORDINATES ||
|
||||||
|
m_spellInfo->EffectImplicitTargetA[j] == TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT )
|
||||||
{
|
{
|
||||||
|
|
||||||
SpellScriptTargetBounds bounds = spellmgr.GetSpellScriptTargetBounds(m_spellInfo->Id);
|
SpellScriptTargetBounds bounds = spellmgr.GetSpellScriptTargetBounds(m_spellInfo->Id);
|
||||||
if(bounds.first==bounds.second)
|
if(bounds.first==bounds.second)
|
||||||
sLog.outErrorDb("Spell (ID: %u) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT or TARGET_SCRIPT_COORDINATES, but does not have record in `spell_script_target`",m_spellInfo->Id);
|
sLog.outErrorDb("Spell (ID: %u) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT or TARGET_SCRIPT_COORDINATES, but does not have record in `spell_script_target`",m_spellInfo->Id);
|
||||||
|
|
|
||||||
|
|
@ -2125,7 +2125,9 @@ void SpellMgr::LoadSpellScriptTarget()
|
||||||
if( spellProto->EffectImplicitTargetA[i]==TARGET_SCRIPT ||
|
if( spellProto->EffectImplicitTargetA[i]==TARGET_SCRIPT ||
|
||||||
spellProto->EffectImplicitTargetB[i]==TARGET_SCRIPT ||
|
spellProto->EffectImplicitTargetB[i]==TARGET_SCRIPT ||
|
||||||
spellProto->EffectImplicitTargetA[i]==TARGET_SCRIPT_COORDINATES ||
|
spellProto->EffectImplicitTargetA[i]==TARGET_SCRIPT_COORDINATES ||
|
||||||
spellProto->EffectImplicitTargetB[i]==TARGET_SCRIPT_COORDINATES )
|
spellProto->EffectImplicitTargetB[i]==TARGET_SCRIPT_COORDINATES ||
|
||||||
|
spellProto->EffectImplicitTargetA[i]==TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT ||
|
||||||
|
spellProto->EffectImplicitTargetB[i]==TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT )
|
||||||
{
|
{
|
||||||
targetfound = true;
|
targetfound = true;
|
||||||
break;
|
break;
|
||||||
|
|
@ -2133,7 +2135,7 @@ void SpellMgr::LoadSpellScriptTarget()
|
||||||
}
|
}
|
||||||
if(!targetfound)
|
if(!targetfound)
|
||||||
{
|
{
|
||||||
sLog.outErrorDb("Table `spell_script_target`: spellId %u listed for TargetEntry %u does not have any implicit target TARGET_SCRIPT(38) or TARGET_SCRIPT_COORDINATES (46).",spellId,targetEntry);
|
sLog.outErrorDb("Table `spell_script_target`: spellId %u listed for TargetEntry %u does not have any implicit target TARGET_SCRIPT(38) or TARGET_SCRIPT_COORDINATES (46) or TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT (40).",spellId,targetEntry);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8543"
|
#define REVISION_NR "8544"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue