diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index d2e340c25a..868be50c87 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -185,9 +185,11 @@ m_lootRecipient(), m_lootRecipientGroup(0), _skinner(), _pickpocketLootRestore(0 m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_regenHealth(true), m_cannotReachTarget(false), m_cannotReachTimer(0), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), -m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_waypointID(0), m_path_id(0), m_formation(nullptr), m_focusSpell(nullptr), m_focusDelay(0), m_shouldReacquireTarget(false), m_suppressedOrientation(0.0f) +m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_waypointID(0), m_path_id(0), m_formation(nullptr), m_focusSpell(nullptr), +m_focusDelay(0), m_shouldReacquireTarget(false), m_suppressedOrientation(0.0f), m_tmpEnergyReg(0.0f) { m_regenTimer = CREATURE_REGEN_INTERVAL; + m_regenTimerEnergy = CREATURE_REGEN_ENERGY_INTERVAL; m_valuesCount = UNIT_END; for (uint8 i = 0; i < MAX_CREATURE_SPELLS; ++i) @@ -685,6 +687,16 @@ void Creature::Update(uint32 diff) m_regenTimer -= diff; } + if (m_regenTimerEnergy <= diff) + { + if (getPowerType() == POWER_ENERGY) + if (!IsVehicle() || GetVehicleKit()->GetVehicleInfo()->m_powerDisplayId != POWER_PYRITE) + Regenerate(POWER_ENERGY); + m_regenTimerEnergy = CREATURE_REGEN_ENERGY_INTERVAL; + } + else + m_regenTimerEnergy -= diff; + if (m_regenTimer == 0) { bool bInCombat = IsInCombat() && (!GetVictim() || // if IsInCombat() is true and this has no victim @@ -695,12 +707,9 @@ void Creature::Update(uint32 diff) RegenerateHealth(); if (HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_REGENERATE_POWER)) - { - if (getPowerType() == POWER_ENERGY) - Regenerate(POWER_ENERGY); - else + if (getPowerType() != POWER_ENERGY) RegenerateMana(); - } + m_regenTimer = CREATURE_REGEN_INTERVAL; } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 32cf1c234d..3160f464c3 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -82,6 +82,7 @@ enum CreatureFlagsExtra : uint32 }; const uint32 CREATURE_REGEN_INTERVAL = 2 * IN_MILLISECONDS; +const uint32 CREATURE_REGEN_ENERGY_INTERVAL = 100; const uint32 CREATURE_NOPATH_EVADE_TIME = 5 * IN_MILLISECONDS; const uint8 MAX_KILL_CREDIT = 2; @@ -798,6 +799,8 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma uint32 m_waypointID; uint32 m_path_id; + float m_tmpEnergyReg; + //Formation var CreatureGroup* m_formation; bool m_TriggerJustRespawned; diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 89d0ae083a..b1ac2513e3 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -654,14 +654,32 @@ void Creature::Regenerate(Powers power) } // Apply modifiers (if any). + float modifier = 0.0f; AuraEffectList const& ModPowerRegenPCTAuras = GetAuraEffectsByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT); for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i) if (Powers((*i)->GetMiscValue()) == power) - AddPct(addvalue, (*i)->GetAmount()); + modifier += (*i)->GetAmount(); - addvalue += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, power) * (IsHunterPet()? PET_FOCUS_REGEN_INTERVAL : CREATURE_REGEN_INTERVAL) / (5 * IN_MILLISECONDS); + if (modifier) + AddPct(addvalue, modifier); - ModifyPower(power, int32(addvalue)); + if (power != POWER_ENERGY) + addvalue += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, power) * (IsHunterPet() ? PET_FOCUS_REGEN_INTERVAL : CREATURE_REGEN_INTERVAL) / (5 * IN_MILLISECONDS); + else + addvalue += (float)GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, power) * ((float)CREATURE_REGEN_INTERVAL / 5140.0f); + + if (power == POWER_ENERGY) + { + m_tmpEnergyReg += std::min((float)CREATURE_REGEN_ENERGY_INTERVAL * addvalue / CREATURE_REGEN_INTERVAL, 10.0f); + int32 enerReg = int32(m_tmpEnergyReg); + if (enerReg) + { + ModifyPower(power, enerReg); + m_tmpEnergyReg = fmod(m_tmpEnergyReg, 1); + } + } + else + ModifyPower(power, int32(addvalue)); } void Pet::Remove(PetSaveMode mode, bool returnreagent) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index e645946c46..2eb6bfe1e4 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2297,6 +2297,7 @@ class TC_GAME_API Unit : public WorldObject uint32 m_reactiveTimer[MAX_REACTIVE]; uint32 m_regenTimer; + uint32 m_regenTimerEnergy; ThreatManager m_ThreatManager;