aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/AI/CreatureAI.h7
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp11
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h6
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp4
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h8
-rw-r--r--src/server/game/Chat/Chat.cpp3
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp2
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp8
-rw-r--r--src/server/game/Entities/Player/Player.cpp66
-rw-r--r--src/server/game/Entities/Player/Player.h9
-rw-r--r--src/server/game/Groups/Group.cpp2
-rw-r--r--src/server/game/Maps/MapScripts.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp14
14 files changed, 102 insertions, 42 deletions
diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h
index 953c349bad7..66fd60bfcdb 100644
--- a/src/server/game/AI/CreatureAI.h
+++ b/src/server/game/AI/CreatureAI.h
@@ -26,6 +26,7 @@
class AreaBoundary;
class AreaTrigger;
+class AuraApplication;
class Creature;
class DynamicObject;
class GameObject;
@@ -144,6 +145,12 @@ class TC_GAME_API CreatureAI : public UnitAI
// Called when a channeled spell finishes
virtual void OnChannelFinished(SpellInfo const* /*spell*/) { }
+ // Called when aura is applied
+ virtual void OnAuraApplied(AuraApplication const* /*aurApp*/) { }
+
+ // Called when aura is removed
+ virtual void OnAuraRemoved(AuraApplication const* /*aurApp*/) { }
+
// Should return true if the NPC is currently being escorted
virtual bool IsEscorted() const { return false; }
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index cdc2530617c..c210b7ea582 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -29,6 +29,7 @@
#include "PetDefines.h"
#include "Player.h"
#include "ScriptMgr.h"
+#include "SpellAuras.h"
#include "Vehicle.h"
#include "WaypointManager.h"
@@ -611,6 +612,16 @@ void SmartAI::OnSpellStart(SpellInfo const* spellInfo)
GetScript()->ProcessEventsFor(SMART_EVENT_ON_SPELL_START, nullptr, 0, 0, false, spellInfo);
}
+void SmartAI::OnAuraApplied(AuraApplication const* aurApp)
+{
+ GetScript()->ProcessEventsFor(SMART_EVENT_ON_AURA_APPLIED, nullptr, 0, 0, false, aurApp->GetBase()->GetSpellInfo());
+}
+
+void SmartAI::OnAuraRemoved(AuraApplication const* aurApp)
+{
+ GetScript()->ProcessEventsFor(SMART_EVENT_ON_AURA_REMOVED, nullptr, 0, 0, false, aurApp->GetBase()->GetSpellInfo());
+}
+
void SmartAI::DamageTaken(Unit* doneBy, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/)
{
GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED, doneBy, damage);
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index 0d1054796d2..79ab404e971 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -132,6 +132,12 @@ class TC_GAME_API SmartAI : public CreatureAI
// Called when a spell starts
void OnSpellStart(SpellInfo const* spellInfo) override;
+ // Called when aura is applied
+ void OnAuraApplied(AuraApplication const* aurApp) override;
+
+ // Called when aura is removed
+ void OnAuraRemoved(AuraApplication const* aurApp) override;
+
// Called at any Damage from any attacker (before damage apply)
void DamageTaken(Unit* doneBy, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index e1715f787b6..7eccef96070 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -3366,6 +3366,8 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
case SMART_EVENT_ON_SPELL_CAST:
case SMART_EVENT_ON_SPELL_FAILED:
case SMART_EVENT_ON_SPELL_START:
+ case SMART_EVENT_ON_AURA_APPLIED:
+ case SMART_EVENT_ON_AURA_REMOVED:
{
if (!spell)
return;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 82ec392bfdb..7fceb43a614 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -844,6 +844,8 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e)
case SMART_EVENT_ON_SPELL_CAST: return sizeof(SmartEvent::spellCast);
case SMART_EVENT_ON_SPELL_FAILED: return sizeof(SmartEvent::spellCast);
case SMART_EVENT_ON_SPELL_START: return sizeof(SmartEvent::spellCast);
+ case SMART_EVENT_ON_AURA_APPLIED: return sizeof(SmartEvent::spellCast);
+ case SMART_EVENT_ON_AURA_REMOVED: return sizeof(SmartEvent::spellCast);
case SMART_EVENT_ON_DESPAWN: return NO_PARAMS;
case SMART_EVENT_SEND_EVENT_TRIGGER: return NO_PARAMS;
case SMART_EVENT_AREATRIGGER_EXIT: return NO_PARAMS;
@@ -1255,6 +1257,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_EVENT_ON_SPELL_CAST:
case SMART_EVENT_ON_SPELL_FAILED:
case SMART_EVENT_ON_SPELL_START:
+ case SMART_EVENT_ON_AURA_APPLIED:
+ case SMART_EVENT_ON_AURA_REMOVED:
{
if (!IsSpellValid(e, e.event.spellCast.spell))
return false;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 0c57aaf5415..ea7459ac26f 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -189,8 +189,10 @@ enum SMART_EVENT
SMART_EVENT_ON_DESPAWN = 86, // NONE
SMART_EVENT_SEND_EVENT_TRIGGER = 87, // NONE
SMART_EVENT_AREATRIGGER_EXIT = 88, // NONE
+ SMART_EVENT_ON_AURA_APPLIED = 89, // SpellID, CooldownMin, CooldownMax
+ SMART_EVENT_ON_AURA_REMOVED = 90, // SpellID, CooldownMin, CooldownMax
- SMART_EVENT_END = 89
+ SMART_EVENT_END = 91
};
struct SmartEvent
@@ -1608,7 +1610,9 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{SMART_EVENT_ON_SPELL_START, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_ON_DESPAWN, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_SEND_EVENT_TRIGGER, SMART_SCRIPT_TYPE_MASK_EVENT },
- {SMART_EVENT_AREATRIGGER_EXIT, SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }
+ {SMART_EVENT_AREATRIGGER_EXIT, SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY },
+ {SMART_EVENT_ON_AURA_APPLIED, SMART_SCRIPT_TYPE_MASK_CREATURE },
+ {SMART_EVENT_ON_AURA_REMOVED, SMART_SCRIPT_TYPE_MASK_CREATURE },
};
enum SmartEventFlags
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 6cf24b10671..b9ff4085f20 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -444,9 +444,6 @@ ObjectGuid::LowType ChatHandler::extractLowGuidFromLink(char* text, HighGuid& gu
return player->GetGUID().GetCounter();
ObjectGuid guid = sCharacterCache->GetCharacterGuidByName(name);
- if (guid.IsEmpty())
- return 0;
-
return guid.GetCounter();
}
case GUID_LINK_CREATURE:
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index fcf78441463..89012688d26 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -103,7 +103,7 @@ char const* const ConditionMgr::StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX_D
ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[CONDITION_MAX] =
{
{ .Name = "None", .HasConditionValue1 = false, .HasConditionValue2 = false, .HasConditionValue3 = false, .HasConditionStringValue1 = false },
- { .Name = "Aura", .HasConditionValue1 = true, .HasConditionValue2 = true, .HasConditionValue3 = true, .HasConditionStringValue1 = false },
+ { .Name = "Aura", .HasConditionValue1 = true, .HasConditionValue2 = true, .HasConditionValue3 = false, .HasConditionStringValue1 = false },
{ .Name = "Item Stored", .HasConditionValue1 = true, .HasConditionValue2 = true, .HasConditionValue3 = true, .HasConditionStringValue1 = false },
{ .Name = "Item Equipped", .HasConditionValue1 = true, .HasConditionValue2 = false, .HasConditionValue3 = false, .HasConditionStringValue1 = false },
{ .Name = "Zone", .HasConditionValue1 = true, .HasConditionValue2 = false, .HasConditionValue3 = false, .HasConditionStringValue1 = false },
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 74aa8596a58..1ed4b4d06ca 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -894,6 +894,14 @@ void AreaTrigger::HandleUnitEnter(Unit* unit)
DoActions(unit);
_ai->OnUnitEnter(unit);
+
+ // OnUnitEnter script can despawn this areatrigger
+ if (!IsInWorld())
+ return;
+
+ // Register areatrigger in Unit after actions/scripts to allow them to determine
+ // if the unit is in one or more areatriggers with the same id
+ // without forcing every script to have additional logic excluding this areatrigger
unit->EnterAreaTrigger(this);
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index c8c75eb8279..0bcdbbd1ec7 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -5626,8 +5626,8 @@ bool Player::UpdateSkillPro(uint16 skillId, int32 chance, uint32 step)
if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
return false;
- uint16 value = m_activePlayerData->Skill->SkillRank[itr->second.pos];
- uint16 max = m_activePlayerData->Skill->SkillMaxRank[itr->second.pos];
+ uint16 value = GetSkillRankByPos(itr->second.pos);
+ uint16 max = GetSkillMaxRankByPos(itr->second.pos);
if (!max || !value || value >= max)
return false;
@@ -5666,13 +5666,13 @@ bool Player::UpdateSkillPro(uint16 skillId, int32 chance, uint32 step)
void Player::ModifySkillBonus(uint32 skillid, int32 val, bool talent)
{
SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return;
if (talent)
- SetSkillPermBonus(itr->second.pos, m_activePlayerData->Skill->SkillPermBonus[itr->second.pos] + val);
+ SetSkillPermBonus(itr->second.pos, GetSkillPermBonusByPos(itr->second.pos) + val);
else
- SetSkillTempBonus(itr->second.pos, m_activePlayerData->Skill->SkillTempBonus[itr->second.pos] + val);
+ SetSkillTempBonus(itr->second.pos, GetSkillTempBonusByPos(itr->second.pos) + val);
// Apply/Remove bonus to child skill lines
if (std::vector<SkillLineEntry const*> const* childSkillLines = sDB2Manager.GetSkillLinesForParentSkill(skillid))
@@ -5687,7 +5687,7 @@ void Player::UpdateSkillsForLevel()
for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end(); ++itr)
{
- if (itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
continue;
uint32 pskill = itr->first;
@@ -5706,7 +5706,7 @@ void Player::UpdateSkillsForLevel()
}
// Update level dependent skillline spells
- LearnSkillRewardedSpells(rcEntry->SkillID, m_activePlayerData->Skill->SkillRank[itr->second.pos], race);
+ LearnSkillRewardedSpells(rcEntry->SkillID, GetSkillRankByPos(itr->second.pos), race);
}
}
@@ -5761,7 +5761,7 @@ void Player::SetSkill(uint32 id, uint16 step, uint16 newVal, uint16 maxVal)
// Handle already stored skills
if (itr != mSkillStatus.end())
{
- currVal = m_activePlayerData->Skill->SkillRank[itr->second.pos];
+ currVal = GetSkillRankByPos(itr->second.pos);
// Activate and update skill line
if (newVal)
@@ -5879,7 +5879,7 @@ void Player::SetSkill(uint32 id, uint16 step, uint16 newVal, uint16 maxVal)
// Find a free skill slot
for (uint32 i = 0; i < PLAYER_MAX_SKILLS; ++i)
{
- if (!m_activePlayerData->Skill->SkillLineID[i])
+ if (!GetSkillLineIdByPos(i))
{
skillSlot = i;
break;
@@ -5979,7 +5979,7 @@ bool Player::HasSkill(uint32 skill) const
return false;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- return (itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED && m_activePlayerData->Skill->SkillRank[itr->second.pos]);
+ return itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED && GetSkillRankByPos(itr->second.pos);
}
uint16 Player::GetSkillStep(uint32 skill) const
@@ -5988,10 +5988,10 @@ uint16 Player::GetSkillStep(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillStep[itr->second.pos];
+ return GetSkillStepByPos(itr->second.pos);
}
uint16 Player::GetSkillValue(uint32 skill) const
@@ -6000,12 +6000,12 @@ uint16 Player::GetSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- int32 result = int32(m_activePlayerData->Skill->SkillRank[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillTempBonus[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillPermBonus[itr->second.pos]);
+ int32 result = int32(GetSkillRankByPos(itr->second.pos));
+ result += int32(GetSkillTempBonusByPos(itr->second.pos));
+ result += int32(GetSkillPermBonusByPos(itr->second.pos));
return result < 0 ? 0 : result;
}
@@ -6015,12 +6015,12 @@ uint16 Player::GetMaxSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- int32 result = int32(m_activePlayerData->Skill->SkillMaxRank[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillTempBonus[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillPermBonus[itr->second.pos]);
+ int32 result = int32(GetSkillMaxRankByPos(itr->second.pos));
+ result += int32(GetSkillTempBonusByPos(itr->second.pos));
+ result += int32(GetSkillPermBonusByPos(itr->second.pos));
return result < 0 ? 0 : result;
}
@@ -6030,10 +6030,10 @@ uint16 Player::GetPureMaxSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillMaxRank[itr->second.pos];
+ return GetSkillMaxRankByPos(itr->second.pos);
}
uint16 Player::GetBaseSkillValue(uint32 skill) const
@@ -6042,11 +6042,11 @@ uint16 Player::GetBaseSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- int32 result = int32(m_activePlayerData->Skill->SkillRank[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillPermBonus[itr->second.pos]);
+ int32 result = int32(GetSkillRankByPos(itr->second.pos));
+ result += int32(GetSkillPermBonusByPos(itr->second.pos));
return result < 0 ? 0 : result;
}
@@ -6056,10 +6056,10 @@ uint16 Player::GetPureSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillRank[itr->second.pos];
+ return GetSkillRankByPos(itr->second.pos);
}
int16 Player::GetSkillPermBonusValue(uint32 skill) const
@@ -6068,10 +6068,10 @@ int16 Player::GetSkillPermBonusValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillPermBonus[itr->second.pos];
+ return GetSkillPermBonusByPos(itr->second.pos);
}
int16 Player::GetSkillTempBonusValue(uint32 skill) const
@@ -6080,10 +6080,10 @@ int16 Player::GetSkillTempBonusValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillTempBonus[itr->second.pos];
+ return GetSkillTempBonusByPos(itr->second.pos);
}
void Player::SendActionButtons(uint32 state) const
@@ -21205,8 +21205,8 @@ void Player::_SaveSkills(CharacterDatabaseTransaction trans)
continue;
}
- uint16 value = m_activePlayerData->Skill->SkillRank[itr->second.pos];
- uint16 max = m_activePlayerData->Skill->SkillMaxRank[itr->second.pos];
+ uint16 value = GetSkillRankByPos(itr->second.pos);
+ uint16 max = GetSkillMaxRankByPos(itr->second.pos);
int8 professionSlot = int8(GetProfessionSlotFor(itr->first));
switch (itr->second.uState)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 51c91183d20..2b615518381 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2310,12 +2310,19 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue, Races race);
int32 GetProfessionSlotFor(uint32 skillId) const;
int32 FindEmptyProfessionSlotFor(uint32 skillId) const;
+ uint16 GetSkillLineIdByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillLineID[pos]; }
void SetSkillLineId(uint32 pos, uint16 skillLineId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillLineID, pos), skillLineId); }
- void SetSkillStep(uint32 pos, uint16 step) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillStep, pos), step); };
+ uint16 GetSkillStepByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillStep[pos]; }
+ void SetSkillStep(uint32 pos, uint16 step) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillStep, pos), step); }
+ uint16 GetSkillRankByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillRank[pos]; }
void SetSkillRank(uint32 pos, uint16 rank) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillRank, pos), rank); }
+ uint16 GetSkillStartingRankByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillStartingRank[pos]; }
void SetSkillStartingRank(uint32 pos, uint16 starting) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillStartingRank, pos), starting); }
+ uint16 GetSkillMaxRankByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillMaxRank[pos]; }
void SetSkillMaxRank(uint32 pos, uint16 max) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillMaxRank, pos), max); }
+ int16 GetSkillTempBonusByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillTempBonus[pos]; }
void SetSkillTempBonus(uint32 pos, uint16 bonus) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillTempBonus, pos), bonus); }
+ uint16 GetSkillPermBonusByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillPermBonus[pos]; }
void SetSkillPermBonus(uint32 pos, uint16 bonus) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillPermBonus, pos), bonus); }
TeleportLocation& GetTeleportDest() { return m_teleport_dest; }
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index aa504001619..36246c0c1a8 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -237,7 +237,7 @@ void Group::LoadGroupFromDB(Field* fields)
m_raidDifficulty = Player::CheckLoadedRaidDifficultyID(Difficulty(fields[14].GetUInt8()));
m_legacyRaidDifficulty = Player::CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[15].GetUInt8()));
- m_masterLooterGuid = ObjectGuid::Create<HighGuid::Player>(fields[16].GetUInt64());
+ m_masterLooterGuid = fields[16].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[16].GetUInt64()) : ObjectGuid::Empty;
m_pingRestriction = RestrictPingsTo(fields[18].GetInt8());
diff --git a/src/server/game/Maps/MapScripts.cpp b/src/server/game/Maps/MapScripts.cpp
index 299fef61b80..745783a536a 100644
--- a/src/server/game/Maps/MapScripts.cpp
+++ b/src/server/game/Maps/MapScripts.cpp
@@ -325,7 +325,7 @@ void Map::ScriptsProcess()
{
switch (step.sourceGUID.GetHigh())
{
- case HighGuid::Item: // as well as HIGHGUID_CONTAINER
+ case HighGuid::Item:
if (Player* player = GetPlayer(step.ownerGUID))
source = player->GetItemByGuid(step.sourceGUID);
break;
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 3d9100457c0..248fd007871 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -19,6 +19,7 @@
#include "CellImpl.h"
#include "Common.h"
#include "Containers.h"
+#include "CreatureAI.h"
#include "DynamicObject.h"
#include "GridNotifiersImpl.h"
#include "Item.h"
@@ -1593,6 +1594,19 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
}
break;
}
+
+ if (apply)
+ {
+ if (Creature* creature = target->ToCreature())
+ if (CreatureAI* ai = creature->AI())
+ ai->OnAuraApplied(aurApp);
+ }
+ else
+ {
+ if (Creature* creature = target->ToCreature())
+ if (CreatureAI* ai = creature->AI())
+ ai->OnAuraRemoved(aurApp);
+ }
}
bool Aura::CanBeAppliedOn(Unit* target)