mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
Merge branch 'master' of git@github.com:mangos/mangos.git into procflag
This commit is contained in:
commit
6c02f00a93
115 changed files with 3209 additions and 1482 deletions
|
|
@ -270,6 +270,7 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi
|
|||
m_triggeringContainer = triggeringContainer;
|
||||
m_referencedFromCurrentSpell = false;
|
||||
m_executedCurrently = false;
|
||||
m_delayStart = 0;
|
||||
m_delayAtDamageCount = 0;
|
||||
|
||||
m_applyMultiplierMask = 0;
|
||||
|
|
@ -639,7 +640,7 @@ void Spell::FillTargetMap()
|
|||
if(m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
Player *me = (Player*)m_caster;
|
||||
for (std::list<Unit*>::const_iterator itr = tmpUnitMap.begin(); itr != tmpUnitMap.end(); itr++)
|
||||
for (std::list<Unit*>::const_iterator itr = tmpUnitMap.begin(); itr != tmpUnitMap.end(); ++itr)
|
||||
{
|
||||
Unit *owner = (*itr)->GetOwner();
|
||||
Unit *u = owner ? owner : (*itr);
|
||||
|
|
@ -2660,14 +2661,14 @@ void Spell::finish(bool ok)
|
|||
|
||||
m_spellState = SPELL_STATE_FINISHED;
|
||||
|
||||
//remove spell mods
|
||||
if (m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
((Player*)m_caster)->RemoveSpellMods(this);
|
||||
|
||||
// other code related only to successfully finished spells
|
||||
if(!ok)
|
||||
return;
|
||||
|
||||
//remove spell mods
|
||||
if (m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
((Player*)m_caster)->RemoveSpellMods(this);
|
||||
|
||||
//handle SPELL_AURA_ADD_TARGET_TRIGGER auras
|
||||
Unit::AuraList const& targetTriggers = m_caster->GetAurasByType(SPELL_AURA_ADD_TARGET_TRIGGER);
|
||||
for(Unit::AuraList::const_iterator i = targetTriggers.begin(); i != targetTriggers.end(); ++i)
|
||||
|
|
@ -2713,10 +2714,11 @@ void Spell::finish(bool ok)
|
|||
// Clear combo at finish state
|
||||
if(m_caster->GetTypeId() == TYPEID_PLAYER && NeedsComboPoints(m_spellInfo))
|
||||
{
|
||||
// Not drop combopoints if any miss exist
|
||||
// Not drop combopoints if negative spell and if any miss on enemy exist
|
||||
bool needDrop = true;
|
||||
if (!IsPositiveSpell(m_spellInfo->Id))
|
||||
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
|
||||
if (ihit->missCondition != SPELL_MISS_NONE)
|
||||
if (ihit->missCondition != SPELL_MISS_NONE && ihit->targetGUID!=m_caster->GetGUID())
|
||||
{
|
||||
needDrop = false;
|
||||
break;
|
||||
|
|
@ -2755,13 +2757,23 @@ void Spell::SendCastResult(uint8 result)
|
|||
break;
|
||||
case SPELL_FAILED_REQUIRES_AREA:
|
||||
// hardcode areas limitation case
|
||||
if( m_spellInfo->Id==41618 || m_spellInfo->Id==41620 )
|
||||
data << uint32(3842);
|
||||
else if( m_spellInfo->Id==41617 || m_spellInfo->Id==41619 )
|
||||
data << uint32(3905);
|
||||
// normal case
|
||||
else
|
||||
data << uint32(m_spellInfo->AreaId);
|
||||
switch(m_spellInfo->Id)
|
||||
{
|
||||
case 41617: // Cenarion Mana Salve
|
||||
case 41619: // Cenarion Healing Salve
|
||||
data << uint32(3905);
|
||||
break;
|
||||
case 41618: // Bottled Nethergon Energy
|
||||
case 41620: // Bottled Nethergon Vapor
|
||||
data << uint32(3842);
|
||||
break;
|
||||
case 45373: // Bloodberry Elixir
|
||||
data << uint32(4075);
|
||||
break;
|
||||
default: // default case
|
||||
data << uint32(m_spellInfo->AreaId);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SPELL_FAILED_TOTEMS:
|
||||
if(m_spellInfo->Totem[0])
|
||||
|
|
@ -2797,17 +2809,13 @@ void Spell::SendSpellStart()
|
|||
if(!IsNeedSendToClient())
|
||||
return;
|
||||
|
||||
sLog.outDebug("Sending SMSG_SPELL_START id=%u",m_spellInfo->Id);
|
||||
sLog.outDebug("Sending SMSG_SPELL_START id=%u", m_spellInfo->Id);
|
||||
|
||||
uint16 castFlags = CAST_FLAG_UNKNOWN1;
|
||||
uint32 castFlags = CAST_FLAG_UNKNOWN1;
|
||||
if(IsRangedSpell())
|
||||
castFlags |= CAST_FLAG_AMMO;
|
||||
|
||||
Unit * target;
|
||||
if(!m_targets.getUnitTarget())
|
||||
target = m_caster;
|
||||
else
|
||||
target = m_targets.getUnitTarget();
|
||||
Unit *target = m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster;
|
||||
|
||||
WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2));
|
||||
if(m_CastItem)
|
||||
|
|
@ -2835,17 +2843,13 @@ void Spell::SendSpellGo()
|
|||
if(!IsNeedSendToClient())
|
||||
return;
|
||||
|
||||
sLog.outDebug("Sending SMSG_SPELL_GO id=%u",m_spellInfo->Id);
|
||||
sLog.outDebug("Sending SMSG_SPELL_GO id=%u", m_spellInfo->Id);
|
||||
|
||||
Unit * target;
|
||||
if(!m_targets.getUnitTarget())
|
||||
target = m_caster;
|
||||
else
|
||||
target = m_targets.getUnitTarget();
|
||||
Unit *target = m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster;
|
||||
|
||||
uint16 castFlags = CAST_FLAG_UNKNOWN3;
|
||||
uint32 castFlags = CAST_FLAG_UNKNOWN3;
|
||||
if(IsRangedSpell())
|
||||
castFlags |= CAST_FLAG_AMMO;
|
||||
castFlags |= CAST_FLAG_AMMO; // arrows/bullets visual
|
||||
|
||||
WorldPacket data(SMSG_SPELL_GO, 50); // guess size
|
||||
if(m_CastItem)
|
||||
|
|
@ -2946,7 +2950,7 @@ void Spell::SendLogExecute()
|
|||
data << uint32(count1); // count1 (effect count?)
|
||||
for(uint32 i = 0; i < count1; ++i)
|
||||
{
|
||||
data << uint32(m_spellInfo->Effect[0]); // spell effect?
|
||||
data << uint32(m_spellInfo->Effect[0]); // spell effect
|
||||
uint32 count2 = 1;
|
||||
data << uint32(count2); // count2 (target count?)
|
||||
for(uint32 j = 0; j < count2; ++j)
|
||||
|
|
@ -3070,7 +3074,7 @@ void Spell::SendChannelUpdate(uint32 time)
|
|||
|
||||
WorldPacket data( MSG_CHANNEL_UPDATE, 8+4 );
|
||||
data.append(m_caster->GetPackGUID());
|
||||
data << time;
|
||||
data << uint32(time);
|
||||
|
||||
((Player*)m_caster)->GetSession()->SendPacket( &data );
|
||||
}
|
||||
|
|
@ -3107,8 +3111,8 @@ void Spell::SendChannelStart(uint32 duration)
|
|||
{
|
||||
WorldPacket data( MSG_CHANNEL_START, (8+4+4) );
|
||||
data.append(m_caster->GetPackGUID());
|
||||
data << m_spellInfo->Id;
|
||||
data << duration;
|
||||
data << uint32(m_spellInfo->Id);
|
||||
data << uint32(duration);
|
||||
|
||||
((Player*)m_caster)->GetSession()->SendPacket( &data );
|
||||
}
|
||||
|
|
@ -3134,8 +3138,8 @@ void Spell::SendPlaySpellVisual(uint32 SpellID)
|
|||
return;
|
||||
|
||||
WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 12);
|
||||
data << m_caster->GetGUID();
|
||||
data << SpellID;
|
||||
data << uint64(m_caster->GetGUID());
|
||||
data << uint32(SpellID); // spell visual id?
|
||||
((Player*)m_caster)->GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
|
|
@ -4137,7 +4141,9 @@ uint8 Spell::CanCast(bool strict)
|
|||
|
||||
if(int32(m_targets.getUnitTarget()->getLevel()) > CalculateDamage(i,m_targets.getUnitTarget()))
|
||||
return SPELL_FAILED_HIGHLEVEL;
|
||||
};break;
|
||||
|
||||
break;
|
||||
}
|
||||
case SPELL_AURA_MOUNTED:
|
||||
{
|
||||
if (m_caster->IsInWater())
|
||||
|
|
@ -4170,7 +4176,9 @@ uint8 Spell::CanCast(bool strict)
|
|||
// can be casted at non-friendly unit or own pet/charm
|
||||
if(m_caster->IsFriendlyTo(m_targets.getUnitTarget()))
|
||||
return SPELL_FAILED_TARGET_FRIENDLY;
|
||||
};break;
|
||||
|
||||
break;
|
||||
}
|
||||
case SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED:
|
||||
case SPELL_AURA_FLY:
|
||||
{
|
||||
|
|
@ -4181,7 +4189,9 @@ uint8 Spell::CanCast(bool strict)
|
|||
GetVirtualMapForMapAndZone(m_caster->GetMapId(),m_caster->GetZoneId()) != 530)
|
||||
return SPELL_FAILED_NOT_HERE;
|
||||
}
|
||||
};break;
|
||||
|
||||
break;
|
||||
}
|
||||
case SPELL_AURA_PERIODIC_MANA_LEECH:
|
||||
{
|
||||
if (!m_targets.getUnitTarget())
|
||||
|
|
@ -4192,9 +4202,11 @@ uint8 Spell::CanCast(bool strict)
|
|||
|
||||
if(m_targets.getUnitTarget()->getPowerType()!=POWER_MANA)
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
|
||||
break;
|
||||
}
|
||||
default:break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4317,14 +4329,14 @@ uint8 Spell::CheckCasterAuras() const
|
|||
else if(m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED) && m_spellInfo->PreventionType==SPELL_PREVENTION_TYPE_PACIFY)
|
||||
prevented_reason = SPELL_FAILED_PACIFIED;
|
||||
|
||||
// Attr must make flag drop spell totally immuned from all effects
|
||||
// Attr must make flag drop spell totally immune from all effects
|
||||
if(prevented_reason)
|
||||
{
|
||||
if(school_immune || mechanic_immune || dispel_immune)
|
||||
{
|
||||
//Checking auras is needed now, because you are prevented by some state but the spell grants immunity.
|
||||
Unit::AuraMap const& auras = m_caster->GetAuras();
|
||||
for(Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); itr++)
|
||||
for(Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
|
||||
{
|
||||
if(itr->second)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue