mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 01:37:00 +00:00
[9475] Add and use TotemSlot enum type
This commit is contained in:
parent
7e2d7d8324
commit
ded1e3c263
10 changed files with 85 additions and 82 deletions
|
|
@ -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...
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 );
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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*/ )
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue