Core/Spells: Moved setting UNIT_CREATED_BY_SPELL out of spell effect handlers and sending SMSG_TOTEM_CREATED into Totem class

This commit is contained in:
Shauren
2011-05-19 22:27:18 +02:00
parent f03bdceaff
commit ac4ed1efdf
7 changed files with 109 additions and 90 deletions
+62 -33
View File
@@ -2067,40 +2067,57 @@ void WorldObject::AddObjectToRemoveList()
map->AddObjectToRemoveList(this);
}
TempSummon* Map::SummonCreature(uint32 entry, const Position &pos, SummonPropertiesEntry const *properties /*= NULL*/, uint32 duration /*= 0*/, Unit *summoner /*= NULL*/, uint32 vehId /*= 0*/, bool addToWorld /*= false*/)
TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= NULL*/, uint32 duration /*= 0*/, Unit* summoner /*= NULL*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/)
{
uint32 mask = UNIT_MASK_SUMMON;
if (properties)
{
switch(properties->Category)
switch (properties->Category)
{
case SUMMON_CATEGORY_PET: mask = UNIT_MASK_GUARDIAN; break;
case SUMMON_CATEGORY_PUPPET: mask = UNIT_MASK_PUPPET; break;
case SUMMON_CATEGORY_VEHICLE: mask = UNIT_MASK_MINION; break;
default:
switch(properties->Type)
case SUMMON_CATEGORY_PET:
mask = UNIT_MASK_GUARDIAN;
break;
case SUMMON_CATEGORY_PUPPET:
mask = UNIT_MASK_PUPPET;
break;
case SUMMON_CATEGORY_VEHICLE:
mask = UNIT_MASK_MINION;
break;
case SUMMON_CATEGORY_WILD:
case SUMMON_CATEGORY_ALLY:
case SUMMON_CATEGORY_UNK:
{
switch (properties->Type)
{
case SUMMON_TYPE_MINION:
case SUMMON_TYPE_GUARDIAN:
case SUMMON_TYPE_GUARDIAN2:
mask = UNIT_MASK_GUARDIAN; break;
case SUMMON_TYPE_TOTEM:
mask = UNIT_MASK_TOTEM; break;
case SUMMON_TYPE_VEHICLE:
case SUMMON_TYPE_VEHICLE2:
mask = UNIT_MASK_SUMMON; break;
case SUMMON_TYPE_MINIPET:
mask = UNIT_MASK_MINION; break;
default:
if (properties->Flags & 512) // Mirror Image, Summon Gargoyle
mask = UNIT_MASK_GUARDIAN;
break;
case SUMMON_TYPE_MINION:
case SUMMON_TYPE_GUARDIAN:
case SUMMON_TYPE_GUARDIAN2:
mask = UNIT_MASK_GUARDIAN;
break;
case SUMMON_TYPE_TOTEM:
mask = UNIT_MASK_TOTEM;
break;
case SUMMON_TYPE_VEHICLE:
case SUMMON_TYPE_VEHICLE2:
mask = UNIT_MASK_SUMMON;
break;
case SUMMON_TYPE_MINIPET:
mask = UNIT_MASK_MINION;
break;
default:
if (properties->Flags & 512) // Mirror Image, Summon Gargoyle
mask = UNIT_MASK_GUARDIAN;
break;
}
break;
}
default:
return NULL;
}
}
uint32 phase = PHASEMASK_NORMAL, team = 0;
uint32 phase = PHASEMASK_NORMAL;
uint32 team = 0;
if (summoner)
{
phase = summoner->GetPhaseMask();
@@ -2108,15 +2125,26 @@ TempSummon* Map::SummonCreature(uint32 entry, const Position &pos, SummonPropert
team = summoner->ToPlayer()->GetTeam();
}
TempSummon *summon = NULL;
switch(mask)
TempSummon* summon = NULL;
switch (mask)
{
case UNIT_MASK_SUMMON: summon = new TempSummon (properties, summoner); break;
case UNIT_MASK_GUARDIAN: summon = new Guardian (properties, summoner); break;
case UNIT_MASK_PUPPET: summon = new Puppet (properties, summoner); break;
case UNIT_MASK_TOTEM: summon = new Totem (properties, summoner); break;
case UNIT_MASK_MINION: summon = new Minion (properties, summoner); break;
default: return NULL;
case UNIT_MASK_SUMMON:
summon = new TempSummon(properties, summoner);
break;
case UNIT_MASK_GUARDIAN:
summon = new Guardian(properties, summoner);
break;
case UNIT_MASK_PUPPET:
summon = new Puppet(properties, summoner);
break;
case UNIT_MASK_TOTEM:
summon = new Totem(properties, summoner);
break;
case UNIT_MASK_MINION:
summon = new Minion(properties, summoner);
break;
default:
return NULL;
}
if (!summon->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), this, phase, entry, vehId, team, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()))
@@ -2125,11 +2153,12 @@ TempSummon* Map::SummonCreature(uint32 entry, const Position &pos, SummonPropert
return NULL;
}
summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, spellId);
summon->SetHomePosition(pos);
summon->InitStats(duration);
if (addToWorld)
Add(summon->ToCreature());
Add(summon->ToCreature());
summon->InitSummon();
//ObjectAccessor::UpdateObjectVisibility(summon);
+1 -2
View File
@@ -6754,8 +6754,7 @@ void Player::SendMessageToSet(WorldPacket *data, Player const* skipped_rcvr)
void Player::SendDirectMessage(WorldPacket *data)
{
if (m_session)
m_session->SendPacket(data);
m_session->SendPacket(data);
}
void Player::SendCinematicStart(uint32 CinematicSequenceId)
+24 -13
View File
@@ -24,7 +24,7 @@
#include "ObjectMgr.h"
#include "SpellMgr.h"
Totem::Totem(SummonPropertiesEntry const *properties, Unit *owner) : Minion(properties, owner)
Totem::Totem(SummonPropertiesEntry const* properties, Unit* owner) : Minion(properties, owner)
{
m_unitTypeMask |= UNIT_MASK_TOTEM;
m_duration = 0;
@@ -54,18 +54,14 @@ void Totem::InitStats(uint32 duration)
{
Minion::InitStats(duration);
// set display id depending on caster's race
if (m_owner->GetTypeId() == TYPEID_PLAYER)
// set display id depending on race
SetDisplayId(m_owner->GetModelForTotem(PlayerTotemType(m_Properties->Id)));
// Get spell casted by totem
SpellEntry const * totemSpell = sSpellStore.LookupEntry(GetSpell());
if (totemSpell)
{
// If spell have cast time -> so its active totem
if (GetSpellCastTime(totemSpell))
// Get spell cast by totem
if (SpellEntry const* totemSpell = sSpellStore.LookupEntry(GetSpell()))
if (GetSpellCastTime(totemSpell)) // If spell has cast time -> its an active totem
m_type = TOTEM_ACTIVE;
}
if (GetEntry() == SENTRY_TOTEM_ENTRY)
SetReactState(REACT_AGGRESSIVE);
@@ -73,6 +69,19 @@ void Totem::InitStats(uint32 duration)
m_duration = duration;
SetLevel(m_owner->getLevel());
// client requires SMSG_TOTEM_CREATED to be sent before adding to world
if (m_owner->GetTypeId() == TYPEID_PLAYER
&& m_Properties->Slot >= SUMMON_SLOT_TOTEM
&& m_Properties->Slot < MAX_TOTEM_SLOT)
{
WorldPacket data(SMSG_TOTEM_CREATED, 1 + 8 + 4 + 4);
data << uint8(m_Properties->Slot - 1);
data << uint64(GetGUID());
data << uint32(duration);
data << uint32(GetUInt32Value(UNIT_CREATED_BY_SPELL));
m_owner->ToPlayer()->SendDirectMessage(&data);
}
}
void Totem::InitSummon()
@@ -106,11 +115,11 @@ void Totem::UnSummon()
if (Player* owner = m_owner->ToPlayer())
{
owner->SendAutoRepeatCancel(this);
if (SpellEntry const* spell = sSpellStore.LookupEntry(GetUInt32Value(UNIT_CREATED_BY_SPELL)))
owner->SendCooldownEvent(spell);
// Not only the player can summon the totem (scripted AI)
Group* group = owner->GetGroup();
if (group)
if (Group* group = owner->GetGroup())
{
for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
{
@@ -129,7 +138,8 @@ bool Totem::IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) co
// TODO: possibly all negative auras immune?
if (GetEntry() == 5925)
return false;
switch(spellInfo->EffectApplyAuraName[index])
switch (spellInfo->EffectApplyAuraName[index])
{
case SPELL_AURA_PERIODIC_DAMAGE:
case SPELL_AURA_PERIODIC_LEECH:
@@ -139,5 +149,6 @@ bool Totem::IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) co
default:
break;
}
return Creature::IsImmunedToSpellEffect(spellInfo, index);
}
+3 -3
View File
@@ -33,13 +33,13 @@ enum TotemType
class Totem : public Minion
{
public:
explicit Totem(SummonPropertiesEntry const *properties, Unit *owner);
virtual ~Totem(){};
Totem(SummonPropertiesEntry const* properties, Unit* owner);
virtual ~Totem() {}
void Update(uint32 time);
void InitStats(uint32 duration);
void InitSummon();
void UnSummon();
uint32 GetSpell(uint8 slot=0) const { return m_spells[slot]; }
uint32 GetSpell(uint8 slot = 0) const { return m_spells[slot]; }
uint32 GetTotemDuration() const { return m_duration; }
TotemType GetTotemType() const { return m_type; }