[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 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 // we need to stick to 1 version or half of the stuff will work for someone
// others will not and opposite // others will not and opposite
// will only support WoW, WoW:TBC and WoW:WotLK 3.3.2 client build 11403... // 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) if (m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellIconID == 33)
{ {
// fire totems slot // fire totems slot
if (!m_caster->m_TotemSlot[0]) if (!m_caster->GetTotemGUID(TOTEM_SLOT_FIRE))
return SPELL_FAILED_TOTEMS; return SPELL_FAILED_TOTEMS;
} }
break; break;

View file

@ -368,7 +368,7 @@ class Spell
void DoSummon(SpellEffectIndex eff_idx); void DoSummon(SpellEffectIndex eff_idx);
void DoSummonWild(SpellEffectIndex eff_idx, uint32 forceFaction = 0); void DoSummonWild(SpellEffectIndex eff_idx, uint32 forceFaction = 0);
void DoSummonGuardian(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 DoSummonCritter(SpellEffectIndex eff_idx, uint32 forceFaction = 0);
void WriteSpellGoTargets( WorldPacket * data ); void WriteSpellGoTargets( WorldPacket * data );

View file

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

View file

@ -2214,10 +2214,7 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx)
if (m_spellInfo->SpellIconID == 33) if (m_spellInfo->SpellIconID == 33)
{ {
// fire totems slot // fire totems slot
if (!m_caster->m_TotemSlot[0]) Totem* totem = m_caster->GetTotem(TOTEM_SLOT_FIRE);
return;
Creature* totem = m_caster->GetMap()->GetCreature(m_caster->m_TotemSlot[0]);
if (!totem) if (!totem)
return; 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) // unsummon old totem
{ if(slot < MAX_TOTEM_SLOT)
uint64 guid = m_caster->m_TotemSlot[slot]; if (Totem *OldTotem = m_caster->GetTotem(TotemSlot(slot)))
if(guid != 0) OldTotem->UnSummon();
{
Creature *OldTotem = m_caster->GetMap()->GetCreature(guid);
if(OldTotem && OldTotem->isTotem())
((Totem*)OldTotem)->UnSummon();
}
}
uint32 team = 0; uint32 team = 0;
if (m_caster->GetTypeId()==TYPEID_PLAYER) if (m_caster->GetTypeId()==TYPEID_PLAYER)
@ -6295,7 +6287,7 @@ void Spell::DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot)
return; 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; float x, y, z;
m_caster->GetClosePoint(x, y, z, pTotem->GetObjectSize(), 2.0f, angle); m_caster->GetClosePoint(x, y, z, pTotem->GetObjectSize(), 2.0f, angle);
@ -6306,14 +6298,14 @@ void Spell::DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot)
pTotem->Relocate(x, y, z, m_caster->GetOrientation()); pTotem->Relocate(x, y, z, m_caster->GetOrientation());
if(slot < MAX_TOTEM) if (slot < MAX_TOTEM_SLOT)
m_caster->m_TotemSlot[slot] = pTotem->GetGUID(); m_caster->_AddTotem(TotemSlot(slot),pTotem);
pTotem->SetOwner(m_caster->GetGUID()); pTotem->SetOwner(m_caster->GetGUID());
pTotem->SetTypeBySummonSpell(m_spellInfo); // must be after Create call where m_spells initilized pTotem->SetTypeBySummonSpell(m_spellInfo); // must be after Create call where m_spells initilized
int32 duration=GetSpellDuration(m_spellInfo); int32 duration=GetSpellDuration(m_spellInfo);
if(Player* modOwner = m_caster->GetSpellModOwner()) if (Player* modOwner = m_caster->GetSpellModOwner())
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration); modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration);
pTotem->SetDuration(duration); pTotem->SetDuration(duration);
@ -6336,7 +6328,7 @@ void Spell::DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot)
pTotem->Summon(m_caster); 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); WorldPacket data(SMSG_TOTEM_CREATED, 1 + 8 + 4 + 4);
data << uint8(slot); data << uint8(slot);
@ -6938,22 +6930,17 @@ void Spell::EffectSummonAllTotems(SpellEffectIndex eff_idx)
void Spell::EffectDestroyAllTotems(SpellEffectIndex /*eff_idx*/) void Spell::EffectDestroyAllTotems(SpellEffectIndex /*eff_idx*/)
{ {
int32 mana = 0; 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]) if (Totem* totem = m_caster->GetTotem(TotemSlot(slot)))
continue;
Creature* totem = m_caster->GetMap()->GetCreature(m_caster->m_TotemSlot[slot]);
if(totem && totem->isTotem())
{ {
uint32 spell_id = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); uint32 spell_id = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL);
SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell_id); if (SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell_id))
if(spellInfo)
{ {
uint32 manacost = m_caster->GetCreateMana() * spellInfo->ManaCostPercentage / 100; uint32 manacost = m_caster->GetCreateMana() * spellInfo->ManaCostPercentage / 100;
mana += manacost * damage / 100; mana += manacost * damage / 100;
} }
((Totem*)totem)->UnSummon(); totem->UnSummon();
} }
} }

View file

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

View file

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

View file

@ -213,7 +213,7 @@ Unit::Unit()
m_addDmgOnce = 0; 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_TotemSlot[i] = 0;
m_ObjectSlot[0] = m_ObjectSlot[1] = m_ObjectSlot[2] = m_ObjectSlot[3] = 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; return NULL;
} }
Unit* Unit::_GetTotem(uint8 slot) const Unit* Unit::_GetTotem(TotemSlot slot) const
{ {
return GetTotem(slot); 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; return NULL;
Creature *totem = GetMap()->GetCreature(m_TotemSlot[slot]); Creature *totem = GetMap()->GetCreature(m_TotemSlot[slot]);
return totem && totem->isTotem() ? (Totem*)totem : NULL; 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() void Unit::UnsummonAllTotems()
{ {
for (int8 i = 0; i < MAX_TOTEM; ++i) for (int i = 0; i < MAX_TOTEM_SLOT; ++i)
{ if (Totem* totem = GetTotem(TotemSlot(i)))
if(!m_TotemSlot[i]) totem->UnSummon();
continue;
Creature *OldTotem = GetMap()->GetCreature(m_TotemSlot[i]);
if (OldTotem && OldTotem->isTotem())
((Totem*)OldTotem)->UnSummon();
}
} }
int32 Unit::DealHeal(Unit *pVictim, uint32 addhealth, SpellEntry const *spellProto, bool critical) 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_REACTIVE 3
#define MAX_TOTEM 4
typedef std::set<uint64> GuardianPetList; typedef std::set<uint64> GuardianPetList;
@ -1441,7 +1440,12 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
Pet* CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id = 0); 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> template<typename Func>
void CallForAllControlledUnits(Func const& func, bool withTotems, bool withGuardians, bool withCharms); 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; } void DecreaseCastCounter() { if (m_castCounter) --m_castCounter; }
uint32 m_addDmgOnce; uint32 m_addDmgOnce;
uint64 m_TotemSlot[MAX_TOTEM];
uint64 m_ObjectSlot[4]; uint64 m_ObjectSlot[4];
uint32 m_detectInvisibilityMask; uint32 m_detectInvisibilityMask;
uint32 m_invisibilityMask; uint32 m_invisibilityMask;
@ -1854,7 +1857,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
float GetCombatRatingReduction(CombatRating cr) const; float GetCombatRatingReduction(CombatRating cr) const;
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) 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_state; // Even derived shouldn't modify
uint32 m_CombatTimer; uint32 m_CombatTimer;
@ -1875,6 +1878,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
ComboPointHolderSet m_ComboPointHolders; ComboPointHolderSet m_ComboPointHolders;
GuardianPetList m_guardianPets; GuardianPetList m_guardianPets;
uint64 m_TotemSlot[MAX_TOTEM_SLOT];
}; };
template<typename Func> template<typename Func>
@ -1892,8 +1897,8 @@ void Unit::CallForAllControlledUnits(Func const& func, bool withTotems, bool wit
if (withTotems) if (withTotems)
{ {
for (int8 i = 0; i < MAX_TOTEM; ++i) for (int i = 0; i < MAX_TOTEM_SLOT; ++i)
if (Unit *totem = _GetTotem(i)) if (Unit *totem = _GetTotem(TotemSlot(i)))
func(totem); func(totem);
} }
@ -1921,8 +1926,8 @@ bool Unit::CheckAllControlledUnits(Func const& func, bool withTotems, bool withG
if (withTotems) if (withTotems)
{ {
for (int8 i = 0; i < MAX_TOTEM; ++i) for (int i = 0; i < MAX_TOTEM_SLOT; ++i)
if (Unit *totem = _GetTotem(i)) if (Unit *totem = _GetTotem(TotemSlot(i)))
if (func(totem)) if (func(totem))
return true; return true;
} }

View file

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