[9475] Add and use TotemSlot enum type

This commit is contained in:
VladimirMangos 2010-02-28 07:18:43 +03:00
parent 7e2d7d8324
commit ded1e3c263
10 changed files with 85 additions and 82 deletions

View file

@ -2644,6 +2644,19 @@ enum PetTameFailureReason
PETTAME_UNKNOWNERROR = 13
};
// Stored in SummonProperties.dbc with slot+1 values
enum TotemSlot
{
TOTEM_SLOT_FIRE = 0,
TOTEM_SLOT_EARTH = 1,
TOTEM_SLOT_WATER = 2,
TOTEM_SLOT_AIR = 3,
};
#define TOTEM_SLOT_NONE 255 // custom value for no slot case
#define MAX_TOTEM_SLOT 4
// we need to stick to 1 version or half of the stuff will work for someone
// others will not and opposite
// will only support WoW, WoW:TBC and WoW:WotLK 3.3.2 client build 11403...

View file

@ -4515,7 +4515,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellIconID == 33)
{
// fire totems slot
if (!m_caster->m_TotemSlot[0])
if (!m_caster->GetTotemGUID(TOTEM_SLOT_FIRE))
return SPELL_FAILED_TOTEMS;
}
break;

View file

@ -368,7 +368,7 @@ class Spell
void DoSummon(SpellEffectIndex eff_idx);
void DoSummonWild(SpellEffectIndex eff_idx, uint32 forceFaction = 0);
void DoSummonGuardian(SpellEffectIndex eff_idx, uint32 forceFaction = 0);
void DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot = 0);
void DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot_dbc = 0);
void DoSummonCritter(SpellEffectIndex eff_idx, uint32 forceFaction = 0);
void WriteSpellGoTargets( WorldPacket * data );

View file

@ -2122,17 +2122,7 @@ void Aura::TriggerSpell()
// Totemic Mastery (Skyshatter Regalia (Shaman Tier 6) - bonus)
case 38443:
{
bool all = true;
for(int i = 0; i < MAX_TOTEM; ++i)
{
if(!target->m_TotemSlot[i])
{
all = false;
break;
}
}
if(all)
if(target->IsAllTotemSlotsUsed())
target->CastSpell(target, 38437, true, NULL, this);
else
target->RemoveAurasDueToSpell(38437);

View file

@ -2214,10 +2214,7 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx)
if (m_spellInfo->SpellIconID == 33)
{
// fire totems slot
if (!m_caster->m_TotemSlot[0])
return;
Creature* totem = m_caster->GetMap()->GetCreature(m_caster->m_TotemSlot[0]);
Totem* totem = m_caster->GetTotem(TOTEM_SLOT_FIRE);
if (!totem)
return;
@ -6267,20 +6264,15 @@ void Spell::EffectApplyGlyph(SpellEffectIndex eff_idx)
}
}
void Spell::DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot)
void Spell::DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot_dbc)
{
slot = slot ? (slot - 1): 255;
// DBC store slots starting from 1, with no slot 0 value)
int slot = slot_dbc ? slot_dbc - 1 : TOTEM_SLOT_NONE;
if(slot < MAX_TOTEM)
{
uint64 guid = m_caster->m_TotemSlot[slot];
if(guid != 0)
{
Creature *OldTotem = m_caster->GetMap()->GetCreature(guid);
if(OldTotem && OldTotem->isTotem())
((Totem*)OldTotem)->UnSummon();
}
}
// unsummon old totem
if(slot < MAX_TOTEM_SLOT)
if (Totem *OldTotem = m_caster->GetTotem(TotemSlot(slot)))
OldTotem->UnSummon();
uint32 team = 0;
if (m_caster->GetTypeId()==TYPEID_PLAYER)
@ -6295,7 +6287,7 @@ void Spell::DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot)
return;
}
float angle = slot < MAX_TOTEM ? M_PI_F/MAX_TOTEM - (slot*2*M_PI_F/MAX_TOTEM) : 0;
float angle = slot < MAX_TOTEM_SLOT ? M_PI_F/MAX_TOTEM_SLOT - (slot*2*M_PI_F/MAX_TOTEM_SLOT) : 0;
float x, y, z;
m_caster->GetClosePoint(x, y, z, pTotem->GetObjectSize(), 2.0f, angle);
@ -6306,8 +6298,8 @@ void Spell::DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot)
pTotem->Relocate(x, y, z, m_caster->GetOrientation());
if(slot < MAX_TOTEM)
m_caster->m_TotemSlot[slot] = pTotem->GetGUID();
if (slot < MAX_TOTEM_SLOT)
m_caster->_AddTotem(TotemSlot(slot),pTotem);
pTotem->SetOwner(m_caster->GetGUID());
pTotem->SetTypeBySummonSpell(m_spellInfo); // must be after Create call where m_spells initilized
@ -6336,7 +6328,7 @@ void Spell::DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot)
pTotem->Summon(m_caster);
if(slot < MAX_TOTEM && m_caster->GetTypeId() == TYPEID_PLAYER)
if (slot < MAX_TOTEM_SLOT && m_caster->GetTypeId() == TYPEID_PLAYER)
{
WorldPacket data(SMSG_TOTEM_CREATED, 1 + 8 + 4 + 4);
data << uint8(slot);
@ -6938,22 +6930,17 @@ void Spell::EffectSummonAllTotems(SpellEffectIndex eff_idx)
void Spell::EffectDestroyAllTotems(SpellEffectIndex /*eff_idx*/)
{
int32 mana = 0;
for(int slot = 0; slot < MAX_TOTEM; ++slot)
for(int slot = 0; slot < MAX_TOTEM_SLOT; ++slot)
{
if(!m_caster->m_TotemSlot[slot])
continue;
Creature* totem = m_caster->GetMap()->GetCreature(m_caster->m_TotemSlot[slot]);
if(totem && totem->isTotem())
if (Totem* totem = m_caster->GetTotem(TotemSlot(slot)))
{
uint32 spell_id = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL);
SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell_id);
if(spellInfo)
if (SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell_id))
{
uint32 manacost = m_caster->GetCreateMana() * spellInfo->ManaCostPercentage / 100;
mana += manacost * damage / 100;
}
((Totem*)totem)->UnSummon();
totem->UnSummon();
}
}

View file

@ -521,15 +521,11 @@ void WorldSession::HandleTotemDestroyed( WorldPacket& recvPacket)
recvPacket >> slotId;
if (slotId >= MAX_TOTEM)
if (int(slotId) >= MAX_TOTEM_SLOT)
return;
if(!_player->m_TotemSlot[slotId])
return;
Creature* totem = GetPlayer()->GetMap()->GetCreature(_player->m_TotemSlot[slotId]);
if(totem && totem->isTotem())
((Totem*)totem)->UnSummon();
if (Totem* totem = GetPlayer()->GetTotem(TotemSlot(slotId)))
totem->UnSummon();
}
void WorldSession::HandleSelfResOpcode( WorldPacket & /*recv_data*/ )

View file

@ -90,16 +90,7 @@ void Totem::UnSummon()
if (Unit *owner = GetOwner())
{
// clear owner's totem slot
for(int i = 0; i < MAX_TOTEM; ++i)
{
if(owner->m_TotemSlot[i] == GetGUID())
{
owner->m_TotemSlot[i] = 0;
break;
}
}
owner->_RemoveTotem(this);
owner->RemoveAurasDueToSpell(GetSpell());
//remove aura all party members too

View file

@ -213,7 +213,7 @@ Unit::Unit()
m_addDmgOnce = 0;
for(int i = 0; i < MAX_TOTEM; ++i)
for(int i = 0; i < MAX_TOTEM_SLOT; ++i)
m_TotemSlot[i] = 0;
m_ObjectSlot[0] = m_ObjectSlot[1] = m_ObjectSlot[2] = m_ObjectSlot[3] = 0;
@ -8666,31 +8666,52 @@ Pet* Unit::FindGuardianWithEntry(uint32 entry)
return NULL;
}
Unit* Unit::_GetTotem(uint8 slot) const
Unit* Unit::_GetTotem(TotemSlot slot) const
{
return GetTotem(slot);
}
Totem* Unit::GetTotem( uint8 slot ) const
Totem* Unit::GetTotem(TotemSlot slot ) const
{
if(slot >= MAX_TOTEM || !IsInWorld())
if(slot >= MAX_TOTEM_SLOT || !IsInWorld())
return NULL;
Creature *totem = GetMap()->GetCreature(m_TotemSlot[slot]);
return totem && totem->isTotem() ? (Totem*)totem : NULL;
}
bool Unit::IsAllTotemSlotsUsed() const
{
for (int i = 0; i < MAX_TOTEM_SLOT; ++i)
if (!m_TotemSlot[i])
return false;
return true;
}
void Unit::_AddTotem(TotemSlot slot, Totem* totem)
{
m_TotemSlot[slot] = totem->GetGUID();
}
void Unit::_RemoveTotem(Totem* totem)
{
for(int i = 0; i < MAX_TOTEM_SLOT; ++i)
{
if (m_TotemSlot[i] == totem->GetGUID())
{
m_TotemSlot[i] = 0;
break;
}
}
}
void Unit::UnsummonAllTotems()
{
for (int8 i = 0; i < MAX_TOTEM; ++i)
{
if(!m_TotemSlot[i])
continue;
Creature *OldTotem = GetMap()->GetCreature(m_TotemSlot[i]);
if (OldTotem && OldTotem->isTotem())
((Totem*)OldTotem)->UnSummon();
}
for (int i = 0; i < MAX_TOTEM_SLOT; ++i)
if (Totem* totem = GetTotem(TotemSlot(i)))
totem->UnSummon();
}
int32 Unit::DealHeal(Unit *pVictim, uint32 addhealth, SpellEntry const *spellProto, bool critical)

View file

@ -1049,7 +1049,6 @@ enum ReactiveType
};
#define MAX_REACTIVE 3
#define MAX_TOTEM 4
typedef std::set<uint64> GuardianPetList;
@ -1441,7 +1440,12 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
Pet* CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id = 0);
Totem* GetTotem(uint8 slot) const;
uint64 const& GetTotemGUID(TotemSlot slot) const { return m_TotemSlot[slot]; }
Totem* GetTotem(TotemSlot slot) const;
bool IsAllTotemSlotsUsed() const;
void _AddTotem(TotemSlot slot, Totem* totem); // only for call from Totem summon code
void _RemoveTotem(Totem* totem); // only for call from Totem class
template<typename Func>
void CallForAllControlledUnits(Func const& func, bool withTotems, bool withGuardians, bool withCharms);
@ -1533,7 +1537,6 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
void DecreaseCastCounter() { if (m_castCounter) --m_castCounter; }
uint32 m_addDmgOnce;
uint64 m_TotemSlot[MAX_TOTEM];
uint64 m_ObjectSlot[4];
uint32 m_detectInvisibilityMask;
uint32 m_invisibilityMask;
@ -1854,7 +1857,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
float GetCombatRatingReduction(CombatRating cr) const;
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const;
Unit* _GetTotem(uint8 slot) const; // for templated function without include need
Unit* _GetTotem(TotemSlot slot) const; // for templated function without include need
uint32 m_state; // Even derived shouldn't modify
uint32 m_CombatTimer;
@ -1875,6 +1878,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
ComboPointHolderSet m_ComboPointHolders;
GuardianPetList m_guardianPets;
uint64 m_TotemSlot[MAX_TOTEM_SLOT];
};
template<typename Func>
@ -1892,8 +1897,8 @@ void Unit::CallForAllControlledUnits(Func const& func, bool withTotems, bool wit
if (withTotems)
{
for (int8 i = 0; i < MAX_TOTEM; ++i)
if (Unit *totem = _GetTotem(i))
for (int i = 0; i < MAX_TOTEM_SLOT; ++i)
if (Unit *totem = _GetTotem(TotemSlot(i)))
func(totem);
}
@ -1921,8 +1926,8 @@ bool Unit::CheckAllControlledUnits(Func const& func, bool withTotems, bool withG
if (withTotems)
{
for (int8 i = 0; i < MAX_TOTEM; ++i)
if (Unit *totem = _GetTotem(i))
for (int i = 0; i < MAX_TOTEM_SLOT; ++i)
if (Unit *totem = _GetTotem(TotemSlot(i)))
if (func(totem))
return true;
}

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "9474"
#define REVISION_NR "9475"
#endif // __REVISION_NR_H__