[svn] Merge branch r50 with trunk.
--HG-- branch : trunk
This commit is contained in:
@@ -773,51 +773,118 @@ enum SpellImmunity
|
||||
enum Targets
|
||||
{
|
||||
TARGET_SELF = 1,
|
||||
//TARGET_UNIT_CASTER
|
||||
TARGET_RANDOM_ENEMY_CHAIN_IN_AREA = 2, // only one spell has that, but regardless, it's a target type after all
|
||||
//TARGET_UNIT_NEARBY_ENEMY
|
||||
TARGET_UNIT_SINGLE_UNKNOWN = 3,
|
||||
TARGET_UNIT_NEARBY_ALLY = 4,
|
||||
TARGET_PET = 5,
|
||||
//TARGET_UNIT_PET
|
||||
TARGET_CHAIN_DAMAGE = 6,
|
||||
//TARGET_UNIT_TARGET_ENEMY
|
||||
TARGET_UNIT_AREA_ENTRY = 7,
|
||||
TARGET_AREAEFFECT_CUSTOM = 8,
|
||||
//TARGET_UNIT_AREA_ENTRY_GROUND
|
||||
TARGET_INNKEEPER_COORDINATES = 9, // uses in teleport to innkeeper spells
|
||||
//TARGET_DEST_HOME
|
||||
TARGET_UNIT_TARGET_DEST_CASTER = 11, // teleport target to caster
|
||||
TARGET_ALL_ENEMY_IN_AREA = 15,
|
||||
//TARGET_UNIT_AREA_ENEMY
|
||||
TARGET_ALL_ENEMY_IN_AREA_INSTANT = 16,
|
||||
//TARGET_UNIT_AREA_ENEMY_GROUND
|
||||
TARGET_TABLE_X_Y_Z_COORDINATES = 17, // uses in teleport spells and some other
|
||||
//TARGET_DEST_TABLE
|
||||
TARGET_EFFECT_SELECT = 18, // highly depends on the spell effect
|
||||
//TARGET_DEST_CASTER_GROUND
|
||||
TARGET_ALL_PARTY_AROUND_CASTER = 20,
|
||||
//TARGET_UNIT_PARTY_CASTER
|
||||
TARGET_SINGLE_FRIEND = 21,
|
||||
//TARGET_UNIT_TARGET_ALLY
|
||||
TARGET_ALL_AROUND_CASTER = 22, // used only in TargetA, target selection dependent from TargetB
|
||||
//TARGET_DEST_CASTER
|
||||
TARGET_GAMEOBJECT = 23,
|
||||
//TARGET_OBJECT_OPEN
|
||||
TARGET_IN_FRONT_OF_CASTER = 24,
|
||||
//TARGET_UNIT_CONE_ENEMY
|
||||
TARGET_DUELVSPLAYER = 25,
|
||||
//TARGET_UNIT_SINGLE
|
||||
TARGET_GAMEOBJECT_ITEM = 26,
|
||||
//TARGET_OBJECT_ITEM_PICKLOCK
|
||||
TARGET_MASTER = 27,
|
||||
//TARGET_UNIT_MASTER
|
||||
TARGET_ALL_ENEMY_IN_AREA_CHANNELED = 28,
|
||||
//TARGET_UNIT_AREA_ENEMY_CHANNEL
|
||||
TARGET_UNIT_AREA_ALLY_CHANNEL = 29, // 28,29 only used for effect 27, if interrupt channel, pstAA cancel
|
||||
TARGET_ALL_FRIENDLY_UNITS_AROUND_CASTER = 30, // in TargetB used only with TARGET_ALL_AROUND_CASTER and in self casting range in TargetA
|
||||
//TARGET_UNIT_AREA_ALLY
|
||||
TARGET_ALL_FRIENDLY_UNITS_IN_AREA = 31,
|
||||
//TARGET_UNIT_AREA_ALLY_GROUND
|
||||
TARGET_MINION = 32,
|
||||
//TARGET_DEST_SUMMON
|
||||
TARGET_ALL_PARTY = 33,
|
||||
//TARGET_UNIT_AREA_PARTY
|
||||
TARGET_ALL_PARTY_AROUND_CASTER_2 = 34, // used in Tranquility
|
||||
//TARGET_UNIT_AREA_PARTY_GROUND
|
||||
TARGET_SINGLE_PARTY = 35,
|
||||
//TARGET_UNIT_TARGET_PARTY
|
||||
TARGET_DEST_CASTER_RANDOM_UNKNOWN = 36, //unknown
|
||||
TARGET_AREAEFFECT_PARTY = 37,
|
||||
//TARGET_UNIT_PARTY_TARGET
|
||||
TARGET_SCRIPT = 38,
|
||||
//TARGET_UNIT_NEARBY_ENTRY
|
||||
TARGET_SELF_FISHING = 39,
|
||||
TARGET_TOTEM_EARTH = 41,
|
||||
TARGET_TOTEM_WATER = 42,
|
||||
TARGET_TOTEM_AIR = 43,
|
||||
TARGET_TOTEM_FIRE = 44,
|
||||
//TARGET_UNIT_CASTER_FISHING
|
||||
TARGET_OBJECT_USE = 40,
|
||||
TARGET_DEST_CASTER_FRONT_LEFT = 41, //earth totem
|
||||
TARGET_DEST_CASTER_BACK_LEFT = 42, //water totem
|
||||
TARGET_DEST_CASTER_BACK_RIGHT = 43, //air totem
|
||||
TARGET_DEST_CASTER_FRONT_RIGHT = 44, //fire totem
|
||||
TARGET_CHAIN_HEAL = 45,
|
||||
//TARGET_UNIT_CHAINHEAL
|
||||
TARGET_SCRIPT_COORDINATES = 46,
|
||||
TARGET_DYNAMIC_OBJECT = 47,
|
||||
TARGET_SUMMON = 48,
|
||||
//TARGET_DEST_TABLE_UNKNOWN
|
||||
TARGET_DEST_CASTER_FRONT = 47,
|
||||
TARGET_DEST_CASTER_BACK = 48,
|
||||
TARGET_DEST_CASTER_RIGHT = 49,
|
||||
TARGET_DEST_CASTER_LEFT = 50,
|
||||
TARGET_OBJECT_AREA = 51,
|
||||
TARGET_AREAEFFECT_CUSTOM_2 = 52,
|
||||
//TARGET_DUMMY
|
||||
TARGET_CURRENT_ENEMY_COORDINATES = 53, // set unit coordinates as dest, only 16 target B imlemented
|
||||
//TARGET_DEST_TARGET_ENEMY
|
||||
TARGET_UNIT_CONE_ENEMY_UNKNOWN = 54,
|
||||
TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell
|
||||
TARGET_RANDOM_RAID_MEMBER = 56,
|
||||
//TARGET_UNIT_AREA_RAID
|
||||
TARGET_SINGLE_FRIEND_2 = 57,
|
||||
//TARGET_UNIT_TARGET_RAID
|
||||
TARGET_UNIT_CONE_ALLY = 59,
|
||||
TARGET_UNIT_AREA_SCRIPT = 60,
|
||||
TARGET_AREAEFFECT_PARTY_AND_CLASS = 61,
|
||||
//TARGET_UNIT_CLASS_TARGET
|
||||
TARGET_TEST = 62, // for a test spell
|
||||
TARGET_DUELVSPLAYER_COORDINATES = 63,
|
||||
TARGET_BEHIND_VICTIM = 65, // uses in teleport behind spells
|
||||
//TARGET_DEST_TARGET_ENEMY_UNKNOWN
|
||||
TARGET_DEST_TARGET_FRONT = 64,
|
||||
TARGET_DEST_TARGET_BACK = 65, // uses in teleport behind spells
|
||||
TARGET_DEST_TARGET_RIGHT = 66,
|
||||
TARGET_DEST_TARGET_LEFT = 67,
|
||||
TARGET_DEST_TARGET_ENEMY_UNKNOWN2 = 70,
|
||||
TARGET_DEST_CASTER_RANDOM = 72,
|
||||
TARGET_DEST_CASTER_RADIUS = 73,
|
||||
TARGET_DEST_TARGET_RANDOM = 74,
|
||||
TARGET_DEST_TARGET_RADIUS = 75,
|
||||
TARGET_DEST_CHANNEL = 76,
|
||||
TARGET_SINGLE_ENEMY = 77,
|
||||
//TARGET_UNIT_CHANNEL
|
||||
TARGET_DEST_CASTER_FRONT_UNKNOWN = 78,
|
||||
TARGET_DEST_TABLE_UNKNOWN2 = 80,
|
||||
TARGET_DEST_DEST_RANDOM = 86,
|
||||
TARGET_SELF2 = 87,
|
||||
//TARGET_DEST_DEST
|
||||
TARGET_UNIT_AREA_ALL_CHANNEL = 88,
|
||||
TARGET_NONCOMBAT_PET = 90,
|
||||
//TARGET_UNIT_MINIPET
|
||||
};
|
||||
|
||||
enum SpellMissInfo
|
||||
|
||||
+105
-21
@@ -1183,16 +1183,114 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
|
||||
uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets;
|
||||
switch(cur)
|
||||
{
|
||||
case TARGET_TOTEM_EARTH:
|
||||
case TARGET_TOTEM_WATER:
|
||||
case TARGET_TOTEM_AIR:
|
||||
case TARGET_TOTEM_FIRE:
|
||||
case TARGET_SELF:
|
||||
// destination around caster
|
||||
case TARGET_DEST_CASTER_FRONT_LEFT:
|
||||
case TARGET_DEST_CASTER_BACK_LEFT:
|
||||
case TARGET_DEST_CASTER_BACK_RIGHT:
|
||||
case TARGET_DEST_CASTER_FRONT_RIGHT:
|
||||
case TARGET_DEST_CASTER_FRONT:
|
||||
case TARGET_DEST_CASTER_BACK:
|
||||
case TARGET_DEST_CASTER_RIGHT:
|
||||
case TARGET_DEST_CASTER_LEFT:
|
||||
case TARGET_DEST_CASTER_RANDOM:
|
||||
case TARGET_DEST_CASTER_RADIUS:
|
||||
{
|
||||
float x, y, z, angle, dist;
|
||||
|
||||
if (m_spellInfo->EffectRadiusIndex[i])
|
||||
dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
|
||||
else
|
||||
dist = 3.0f;//do we need this?
|
||||
if (cur == TARGET_DEST_CASTER_RANDOM)
|
||||
dist *= rand_norm(); // This case we need to consider caster size
|
||||
else
|
||||
dist -= m_caster->GetObjectSize(); // Size is calculated in GetNearPoint(), but we do not need it
|
||||
//need a new function to remove this repeated work
|
||||
|
||||
switch(cur)
|
||||
{
|
||||
case TARGET_DEST_CASTER_FRONT_LEFT: angle = -M_PI/4; break;
|
||||
case TARGET_DEST_CASTER_BACK_LEFT: angle = -3*M_PI/4; break;
|
||||
case TARGET_DEST_CASTER_BACK_RIGHT: angle = 3*M_PI/4; break;
|
||||
case TARGET_DEST_CASTER_FRONT_RIGHT:angle = M_PI/4; break;
|
||||
case TARGET_DEST_CASTER_FRONT: angle = 0.0f; break;
|
||||
case TARGET_DEST_CASTER_BACK: angle = M_PI; break;
|
||||
case TARGET_DEST_CASTER_RIGHT: angle = M_PI/2; break;
|
||||
case TARGET_DEST_CASTER_LEFT: angle = -M_PI/2; break;
|
||||
default: angle = rand_norm()*2*M_PI; break;
|
||||
}
|
||||
|
||||
m_caster->GetClosePoint(x, y, z, 0, dist, angle);
|
||||
m_targets.setDestination(x, y, z); // do not know if has ground visual
|
||||
TagUnitMap.push_back(m_caster); // may remove this in the future, if unitmap is empty, push m_caster
|
||||
}break;
|
||||
|
||||
// destination around target
|
||||
case TARGET_DEST_TARGET_FRONT:
|
||||
case TARGET_DEST_TARGET_BACK:
|
||||
case TARGET_DEST_TARGET_RIGHT:
|
||||
case TARGET_DEST_TARGET_LEFT:
|
||||
case TARGET_DEST_TARGET_RANDOM:
|
||||
case TARGET_DEST_TARGET_RADIUS:
|
||||
{
|
||||
Unit *target = m_targets.getUnitTarget();
|
||||
if(!target)
|
||||
{
|
||||
sLog.outError("SPELL: no unit target for spell ID %u\n", m_spellInfo->Id);
|
||||
break;
|
||||
}
|
||||
|
||||
float x, y, z, angle, dist;
|
||||
|
||||
if (m_spellInfo->EffectRadiusIndex[i])
|
||||
dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
|
||||
else
|
||||
dist = 3.0f;//do we need this?
|
||||
if (cur == TARGET_DEST_TARGET_RANDOM)
|
||||
dist *= rand_norm(); // This case we need to consider caster size
|
||||
else
|
||||
dist -= target->GetObjectSize(); // Size is calculated in GetNearPoint(), but we do not need it
|
||||
//need a new function to remove this repeated work
|
||||
|
||||
switch(cur)
|
||||
{
|
||||
case TARGET_DEST_TARGET_FRONT: angle = 0.0f; break;
|
||||
case TARGET_DEST_TARGET_BACK: angle = M_PI; break;
|
||||
case TARGET_DEST_TARGET_RIGHT: angle = M_PI/2; break;
|
||||
case TARGET_DEST_TARGET_LEFT: angle = -M_PI/2; break;
|
||||
default: angle = rand_norm()*2*M_PI; break;
|
||||
}
|
||||
|
||||
target->GetClosePoint(x, y, z, 0, dist, angle);
|
||||
m_targets.setDestination(x, y, z); // do not know if has ground visual
|
||||
TagUnitMap.push_back(m_caster); // may remove this in the future, if unitmap is empty, push m_caster
|
||||
}break;
|
||||
|
||||
// destination around destination
|
||||
case TARGET_DEST_DEST_RANDOM:
|
||||
{
|
||||
if(!(m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION))
|
||||
{
|
||||
sLog.outError("SPELL: no destination for spell ID %u\n", m_spellInfo->Id);
|
||||
break;
|
||||
}
|
||||
float x, y, z, dist, px, py, pz;
|
||||
dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
|
||||
x = m_targets.m_destX;
|
||||
y = m_targets.m_destY;
|
||||
z = m_targets.m_destZ;
|
||||
m_caster->GetRandomPoint(x, y, z, dist, px, py, pz);
|
||||
m_targets.setDestination(px, py, pz);
|
||||
TagUnitMap.push_back(m_caster);
|
||||
}break;
|
||||
case TARGET_SELF2:
|
||||
case TARGET_DYNAMIC_OBJECT:
|
||||
{
|
||||
TagUnitMap.push_back(m_caster);
|
||||
}break;
|
||||
|
||||
case TARGET_SELF:
|
||||
case TARGET_AREAEFFECT_CUSTOM:
|
||||
case TARGET_AREAEFFECT_CUSTOM_2:
|
||||
case TARGET_SUMMON:
|
||||
{
|
||||
TagUnitMap.push_back(m_caster);
|
||||
break;
|
||||
@@ -1865,20 +1963,6 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
|
||||
else
|
||||
sLog.outError( "SPELL: unknown target coordinates for spell ID %u\n", m_spellInfo->Id );
|
||||
}break;
|
||||
case TARGET_BEHIND_VICTIM:
|
||||
{
|
||||
Unit *pTarget = m_caster->getVictim();
|
||||
if(!pTarget && m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
pTarget = ObjectAccessor::GetUnit(*m_caster, ((Player*)m_caster)->GetSelection());
|
||||
|
||||
if(pTarget)
|
||||
{
|
||||
float _target_x, _target_y, _target_z;
|
||||
pTarget->GetClosePoint(_target_x, _target_y, _target_z, m_caster->GetObjectSize(), CONTACT_DISTANCE, M_PI);
|
||||
if(pTarget->IsWithinLOS(_target_x,_target_y,_target_z))
|
||||
m_targets.setDestination(_target_x, _target_y, _target_z);
|
||||
}
|
||||
}break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1919,35 +1919,6 @@ void Spell::EffectTeleportUnits(uint32 i)
|
||||
((Player*)unitTarget)->TeleportTo(st->target_mapId,st->target_X,st->target_Y,st->target_Z,st->target_Orientation,unitTarget==m_caster ? TELE_TO_SPELL : 0);
|
||||
break;
|
||||
}
|
||||
case TARGET_BEHIND_VICTIM:
|
||||
{
|
||||
// Get selected target for player (or victim for units)
|
||||
Unit *pTarget = NULL;
|
||||
if(m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
pTarget = ObjectAccessor::GetUnit(*m_caster, ((Player*)m_caster)->GetSelection());
|
||||
else
|
||||
pTarget = m_caster->getVictim();
|
||||
// No target present - return
|
||||
if (!pTarget)
|
||||
return;
|
||||
// Init dest coordinates
|
||||
uint32 mapid = m_caster->GetMapId();
|
||||
float x = m_targets.m_destX;
|
||||
float y = m_targets.m_destY;
|
||||
float z = m_targets.m_destZ;
|
||||
float orientation = pTarget->GetOrientation();
|
||||
// Teleport
|
||||
if(unitTarget->GetTypeId() == TYPEID_PLAYER)
|
||||
((Player*)unitTarget)->TeleportTo(mapid, x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (unitTarget==m_caster ? TELE_TO_SPELL : 0));
|
||||
else
|
||||
{
|
||||
MapManager::Instance().GetMap(mapid, m_caster)->CreatureRelocation((Creature*)unitTarget, x, y, z, orientation);
|
||||
WorldPacket data;
|
||||
unitTarget->BuildTeleportAckMsg(&data, x, y, z, orientation);
|
||||
unitTarget->SendMessageToSet(&data, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// If not exist data for dest location - return
|
||||
|
||||
Reference in New Issue
Block a user