mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-30 17:13:47 +00:00
Merge branch 'master' into Playerbot
# Conflicts: # src/server/game/Guilds/Guild.cpp
This commit is contained in:
@@ -2101,34 +2101,52 @@ void Pet::resetTalentsForAllPetsOf(Player* owner, Pet* onlinePet /*= nullptr*/)
|
||||
{
|
||||
// not need after this call
|
||||
if (owner->ToPlayer()->HasAtLoginFlag(AT_LOGIN_RESET_PET_TALENTS))
|
||||
{
|
||||
owner->ToPlayer()->RemoveAtLoginFlag(AT_LOGIN_RESET_PET_TALENTS, true);
|
||||
}
|
||||
|
||||
// reset for online
|
||||
if (onlinePet)
|
||||
{
|
||||
onlinePet->resetTalents();
|
||||
}
|
||||
|
||||
PetStable* petStable = owner->GetPetStable();
|
||||
if (!petStable)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::unordered_set<uint32> petIds;
|
||||
if (petStable->CurrentPet)
|
||||
{
|
||||
petIds.insert(petStable->CurrentPet->PetNumber);
|
||||
}
|
||||
|
||||
for (Optional<PetStable::PetInfo> const& stabledPet : petStable->StabledPets)
|
||||
{
|
||||
if (stabledPet)
|
||||
{
|
||||
petIds.insert(stabledPet->PetNumber);
|
||||
}
|
||||
}
|
||||
|
||||
for (PetStable::PetInfo const& unslottedPet : petStable->UnslottedPets)
|
||||
{
|
||||
petIds.insert(unslottedPet.PetNumber);
|
||||
}
|
||||
|
||||
// now need only reset for offline pets (all pets except online case)
|
||||
if (onlinePet)
|
||||
{
|
||||
petIds.erase(onlinePet->GetCharmInfo()->GetPetNumber());
|
||||
}
|
||||
|
||||
// no offline pets
|
||||
if (!petIds.empty())
|
||||
if (petIds.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool need_comma = false;
|
||||
std::ostringstream ss;
|
||||
@@ -2137,7 +2155,9 @@ void Pet::resetTalentsForAllPetsOf(Player* owner, Pet* onlinePet /*= nullptr*/)
|
||||
for (uint32 id : petIds)
|
||||
{
|
||||
if (need_comma)
|
||||
{
|
||||
ss << ',';
|
||||
}
|
||||
|
||||
ss << id;
|
||||
|
||||
@@ -2150,7 +2170,9 @@ void Pet::resetTalentsForAllPetsOf(Player* owner, Pet* onlinePet /*= nullptr*/)
|
||||
for (uint32 spell : sPetTalentSpells)
|
||||
{
|
||||
if (need_comma)
|
||||
{
|
||||
ss << ',';
|
||||
}
|
||||
|
||||
ss << spell;
|
||||
|
||||
|
||||
@@ -1462,7 +1462,10 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
|
||||
else
|
||||
{
|
||||
if (getClass() == CLASS_DEATH_KNIGHT && GetMapId() == 609 && !IsGameMaster() && !HasSpell(50977))
|
||||
{
|
||||
SendTransferAborted(mapid, TRANSFER_ABORT_UNIQUE_MESSAGE, 1);
|
||||
return false;
|
||||
}
|
||||
|
||||
// far teleport to another map
|
||||
Map* oldmap = IsInWorld() ? GetMap() : nullptr;
|
||||
@@ -6824,8 +6827,10 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt
|
||||
if (extraDPS)
|
||||
{
|
||||
float average = extraDPS * proto->Delay / 1000.0f;
|
||||
minDamage = 0.7f * average;
|
||||
maxDamage = 1.3f * average;
|
||||
float mod = ssv->IsTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;
|
||||
|
||||
minDamage = (1.0f - mod) * average;
|
||||
maxDamage = (1.0f + mod) * average;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7220,6 +7225,15 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32
|
||||
continue;
|
||||
}
|
||||
|
||||
if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_EXCLUSIVE) != 0)
|
||||
{
|
||||
Unit* checkTarget = spellInfo->IsPositive() ? this : target;
|
||||
if (checkTarget->HasAura(spellInfo->Id, GetGUID()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
float chance = pEnchant->amount[s] != 0 ? float(pEnchant->amount[s]) : GetWeaponProcChance();
|
||||
|
||||
if (entry)
|
||||
@@ -11579,7 +11593,6 @@ void Player::SendInitialPacketsAfterAddToMap()
|
||||
SendMessageToSet(&data2, true);
|
||||
}
|
||||
|
||||
GetAurasForTarget(this);
|
||||
SendEnchantmentDurations(); // must be after add to map
|
||||
SendItemDurations(); // must be after add to map
|
||||
SendQuestGiverStatusMultiple();
|
||||
@@ -11960,9 +11973,9 @@ void Player::learnSkillRewardedSpells(uint32 skill_id, uint32 skill_value)
|
||||
}
|
||||
}
|
||||
|
||||
void Player::GetAurasForTarget(Unit* target) // pussywizard: contact before changing ANYTHING!
|
||||
void Player::GetAurasForTarget(Unit* target, bool force /*= false*/)
|
||||
{
|
||||
if (!target/* || target->GetVisibleAuras()->empty()*/) // speedup things
|
||||
if (!target || (!force && target->GetVisibleAuras()->empty())) // speedup things
|
||||
return;
|
||||
|
||||
/*! Blizz sends certain movement packets sometimes even before CreateObject
|
||||
|
||||
@@ -2183,7 +2183,7 @@ public:
|
||||
void SendBGWeekendWorldStates();
|
||||
void SendBattlefieldWorldStates();
|
||||
|
||||
void GetAurasForTarget(Unit* target);
|
||||
void GetAurasForTarget(Unit* target, bool force = false);
|
||||
|
||||
PlayerMenu* PlayerTalkClass;
|
||||
std::vector<ItemSetEffect*> ItemSetEff;
|
||||
|
||||
@@ -3822,6 +3822,8 @@ void Unit::_UpdateSpells(uint32 time)
|
||||
{
|
||||
if (i->second->IsExpired())
|
||||
RemoveOwnedAura(i, AURA_REMOVE_BY_EXPIRE);
|
||||
else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
|
||||
RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
|
||||
else
|
||||
++i;
|
||||
}
|
||||
@@ -6498,11 +6500,12 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType
|
||||
}
|
||||
|
||||
//victim may be nullptr
|
||||
bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, Spell const* spellProc /*= nullptr*/)
|
||||
bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const& eventInfo)
|
||||
{
|
||||
SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
|
||||
uint32 effIndex = triggeredByAura->GetEffIndex();
|
||||
int32 triggerAmount = triggeredByAura->GetAmount();
|
||||
Spell const* spellProc = eventInfo.GetProcSpell();
|
||||
|
||||
Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && GetTypeId() == TYPEID_PLAYER
|
||||
? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
|
||||
@@ -7864,12 +7867,22 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
|
||||
if (!procSpell || !procSpell->IsPositive())
|
||||
return false;
|
||||
|
||||
// heal amount
|
||||
basepoints0 = int32(CalculatePct(std::min(damage, GetMaxHealth() - GetHealth()), triggerAmount));
|
||||
target = this;
|
||||
HealInfo const* healInfo = eventInfo.GetHealInfo();
|
||||
if (!healInfo)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (basepoints0)
|
||||
triggered_spell_id = 31786;
|
||||
uint32 effectiveHeal = healInfo->GetEffectiveHeal();
|
||||
if (effectiveHeal)
|
||||
{
|
||||
// heal amount
|
||||
basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
|
||||
target = this;
|
||||
|
||||
if (basepoints0)
|
||||
triggered_spell_id = 31786;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
|
||||
@@ -11202,16 +11215,18 @@ void Unit::UnsummonAllTotems(bool onDeath /*= false*/)
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::SendHealSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, uint32 OverHeal, uint32 Absorb, bool critical)
|
||||
void Unit::SendHealSpellLog(HealInfo const& healInfo, bool critical)
|
||||
{
|
||||
uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
|
||||
|
||||
// we guess size
|
||||
WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
|
||||
data << victim->GetPackGUID();
|
||||
data << healInfo.GetTarget()->GetPackGUID();
|
||||
data << GetPackGUID();
|
||||
data << uint32(SpellID);
|
||||
data << uint32(Damage);
|
||||
data << uint32(OverHeal);
|
||||
data << uint32(Absorb); // Absorb amount
|
||||
data << uint32(healInfo.GetSpellInfo()->Id);
|
||||
data << uint32(healInfo.GetHeal());
|
||||
data << uint32(overheal);
|
||||
data << uint32(healInfo.GetAbsorb()); // Absorb amount
|
||||
data << uint8(critical ? 1 : 0);
|
||||
data << uint8(0); // unused
|
||||
SendMessageToSet(&data, true);
|
||||
@@ -11227,7 +11242,9 @@ int32 Unit::HealBySpell(HealInfo& healInfo, bool critical)
|
||||
CalcHealAbsorb(healInfo);
|
||||
|
||||
int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
|
||||
SendHealSpellLog(healInfo.GetTarget(), healInfo.GetSpellInfo()->Id, healInfo.GetHeal(), uint32(healInfo.GetHeal() - gain), healInfo.GetAbsorb(), critical);
|
||||
healInfo.SetEffectiveHeal(gain);
|
||||
|
||||
SendHealSpellLog(healInfo, critical);
|
||||
return gain;
|
||||
}
|
||||
|
||||
@@ -16555,7 +16572,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
|
||||
case SPELL_AURA_DUMMY:
|
||||
{
|
||||
LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
|
||||
if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procSpell))
|
||||
if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
|
||||
takeCharges = true;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -806,6 +806,7 @@ private:
|
||||
Unit* const m_healer;
|
||||
Unit* const m_target;
|
||||
uint32 m_heal;
|
||||
uint32 m_effectiveHeal;
|
||||
uint32 m_absorb;
|
||||
SpellInfo const* const m_spellInfo;
|
||||
SpellSchoolMask const m_schoolMask;
|
||||
@@ -814,12 +815,17 @@ public:
|
||||
: m_healer(_healer), m_target(_target), m_heal(_heal), m_spellInfo(_spellInfo), m_schoolMask(_schoolMask)
|
||||
{
|
||||
m_absorb = 0;
|
||||
m_effectiveHeal = 0;
|
||||
}
|
||||
|
||||
void AbsorbHeal(uint32 amount)
|
||||
{
|
||||
amount = std::min(amount, GetHeal());
|
||||
m_absorb += amount;
|
||||
m_heal -= amount;
|
||||
|
||||
amount = std::min(amount, GetEffectiveHeal());
|
||||
m_effectiveHeal -= amount;
|
||||
}
|
||||
|
||||
void SetHeal(uint32 amount)
|
||||
@@ -827,9 +833,15 @@ public:
|
||||
m_heal = amount;
|
||||
}
|
||||
|
||||
void SetEffectiveHeal(uint32 amount)
|
||||
{
|
||||
m_effectiveHeal = amount;
|
||||
}
|
||||
|
||||
[[nodiscard]] Unit* GetHealer() const { return m_healer; }
|
||||
[[nodiscard]] Unit* GetTarget() const { return m_target; }
|
||||
[[nodiscard]] uint32 GetHeal() const { return m_heal; }
|
||||
[[nodiscard]] uint32 GetEffectiveHeal() const { return m_effectiveHeal; }
|
||||
[[nodiscard]] uint32 GetAbsorb() const { return m_absorb; }
|
||||
[[nodiscard]] SpellInfo const* GetSpellInfo() const { return m_spellInfo; };
|
||||
[[nodiscard]] SpellSchoolMask GetSchoolMask() const { return m_schoolMask; };
|
||||
@@ -1724,7 +1736,7 @@ public:
|
||||
[[nodiscard]] virtual bool IsUnderWater() const;
|
||||
bool isInAccessiblePlaceFor(Creature const* c) const;
|
||||
|
||||
void SendHealSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, uint32 OverHeal, uint32 Absorb, bool critical = false);
|
||||
void SendHealSpellLog(HealInfo const& healInfo, bool critical = false);
|
||||
int32 HealBySpell(HealInfo& healInfo, bool critical = false);
|
||||
void SendEnergizeSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, Powers powertype);
|
||||
void EnergizeBySpell(Unit* victim, uint32 SpellID, uint32 Damage, Powers powertype);
|
||||
@@ -2551,7 +2563,7 @@ protected:
|
||||
|
||||
private:
|
||||
bool IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent, ProcEventInfo const& eventInfo);
|
||||
bool HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, Spell const* spellProc = nullptr);
|
||||
bool HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const& eventInfo);
|
||||
bool HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool* handled);
|
||||
bool HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo& eventInfo);
|
||||
bool HandleOverrideClassScriptAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 cooldown);
|
||||
|
||||
Reference in New Issue
Block a user