aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxinef1 <w.szyszko2@gmail.com>2017-02-05 15:39:22 +0100
committerShauren <shauren.trinity@gmail.com>2017-02-05 15:39:22 +0100
commite1f14215d86fc9f0cd041f0e87bf0a689c086329 (patch)
tree6bc81f6754f793687ecc5a92316e2f33bd3eb840 /src
parent38d0340c198caa73494c22876079a9b34b1dfdba (diff)
Core/Creatures: Various fixes for creatures, regarding combat conditions, despawning, and few others (#18998)
* Made some changes to kiting mechanics, simplified code and made taunt auras prolong combat no matter the distance from the spawn Unified some creature despawning code, removed some brutal direct calls in scripts Don't play death anim on forced despawn Removed some redundant visibility changes on creature despawn Fixed possible problem with pet initializing template info from difficulty greater than normal Properly keep UNIT_FLAG_IN_COMBAT on UpdateEntry call Moved RegenerateMana function to general Regenerate(Power) function Fixed increased health regeneration from polymorph for pets Implemented CREATURE_TYPE_FLAG_GHOST_VISIBLE, those creatures will be properly seen when player is dead also Removed hackfix from Gaeriyan and Franclorn Forgewright, fixed properly Simplified ForcedRespawnTime code in ForcedDespawn Do not allow to assist unit while evading or when enemy is evading Do not allow to attack other units when evading or when the unit is evading Corrected distance checking code before creature is allowed to evade, should fix some common problems Properly return summon position for summoned creatures as their respawn position Properly stop all moving units on gossip hello, no matter their npc flags
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp194
-rw-r--r--src/server/game/Entities/Creature/Creature.h12
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp35
-rw-r--r--src/server/game/Entities/Pet/Pet.h1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp22
-rw-r--r--src/server/game/Entities/Unit/Unit.h7
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp3
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp5
-rw-r--r--src/server/scripts/Commands/cs_pet.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp5
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp12
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp3
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp3
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp3
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp2
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp5
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp4
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp12
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp4
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp4
-rw-r--r--src/server/scripts/Outland/zone_blades_edge_mountains.cpp9
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp9
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp37
32 files changed, 226 insertions, 194 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 482d3a121be..959f434d586 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -184,7 +184,8 @@ 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),
+_lastDamagedTime(0)
{
m_regenTimer = CREATURE_REGEN_INTERVAL;
m_valuesCount = UNIT_END;
@@ -255,12 +256,7 @@ void Creature::RemoveFromWorld()
void Creature::DisappearAndDie()
{
- DestroyForNearbyPlayers();
- //SetVisibility(VISIBILITY_OFF);
- //ObjectAccessor::UpdateObjectVisibility(this);
- if (IsAlive())
- setDeathState(JUST_DIED);
- RemoveCorpse(false);
+ ForcedDespawn(0);
}
void Creature::SearchFormation()
@@ -277,7 +273,7 @@ void Creature::SearchFormation()
sFormationMgr->AddCreatureToGroup(frmdata->second->leaderGUID, this);
}
-void Creature::RemoveCorpse(bool setSpawnTime)
+void Creature::RemoveCorpse(bool setSpawnTime, bool destroyForNearbyPlayers)
{
if (getDeathState() != CORPSE)
return;
@@ -285,12 +281,14 @@ void Creature::RemoveCorpse(bool setSpawnTime)
m_corpseRemoveTime = time(NULL);
setDeathState(DEAD);
RemoveAllAuras();
- DestroyForNearbyPlayers(); // old UpdateObjectVisibility()
loot.clear();
uint32 respawnDelay = m_respawnDelay;
if (IsAIEnabled)
AI()->CorpseRemoved(respawnDelay);
+ if (destroyForNearbyPlayers)
+ DestroyForNearbyPlayers();
+
// Should get removed later, just keep "compatibility" with scripts
if (setSpawnTime)
m_respawnTime = time(NULL) + respawnDelay;
@@ -301,6 +299,20 @@ void Creature::RemoveCorpse(bool setSpawnTime)
float x, y, z, o;
GetRespawnPosition(x, y, z, &o);
+
+ // We were spawned on transport, calculate real position
+ if (IsSpawnedOnTransport())
+ {
+ Position& pos = m_movementInfo.transport.pos;
+ pos.m_positionX = x;
+ pos.m_positionY = y;
+ pos.m_positionZ = z;
+ pos.SetOrientation(o);
+
+ if (TransportBase* transport = GetDirectTransport())
+ transport->CalculatePassengerPosition(x, y, z, &o);
+ }
+
SetHomePosition(x, y, z, o);
GetMap()->CreatureRelocation(this, x, y, z, o);
}
@@ -317,9 +329,9 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/)
return false;
}
- // get difficulty 1 mode entry
+ // get difficulty 1 mode entry, skip for pets
CreatureTemplate const* cinfo = normalInfo;
- for (uint8 diff = uint8(GetMap()->GetSpawnMode()); diff > 0;)
+ for (uint8 diff = uint8(GetMap()->GetSpawnMode()); diff > 0 && !IsPet();)
{
// we already have valid Map pointer for current creature!
if (normalInfo->DifficultyEntry[diff - 1])
@@ -428,13 +440,16 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/,
else
SetUInt32Value(UNIT_NPC_FLAGS, npcflag);
+ // if unit is in combat, keep this flag
+ unit_flags &= ~UNIT_FLAG_IN_COMBAT;
+ if (IsInCombat())
+ unit_flags |= UNIT_FLAG_IN_COMBAT;
+
SetUInt32Value(UNIT_FIELD_FLAGS, unit_flags);
SetUInt32Value(UNIT_FIELD_FLAGS_2, cInfo->unit_flags2);
SetUInt32Value(UNIT_DYNAMIC_FLAGS, dynamicflags);
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
-
SetAttackTime(BASE_ATTACK, cInfo->BaseAttackTime);
SetAttackTime(OFF_ATTACK, cInfo->BaseAttackTime);
SetAttackTime(RANGED_ATTACK, cInfo->RangeAttackTime);
@@ -678,13 +693,11 @@ void Creature::Update(uint32 diff)
if (!IsInEvadeMode() && (!bInCombat || IsPolymorphed() || CanNotReachTarget())) // regenerate health if not in combat or if polymorphed
RegenerateHealth();
- if (HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_REGENERATE_POWER))
- {
- if (getPowerType() == POWER_ENERGY)
- Regenerate(POWER_ENERGY);
- else
- RegenerateMana();
- }
+ if (getPowerType() == POWER_ENERGY)
+ Regenerate(POWER_ENERGY);
+ else
+ Regenerate(POWER_MANA);
+
m_regenTimer = CREATURE_REGEN_INTERVAL;
}
@@ -704,36 +717,61 @@ void Creature::Update(uint32 diff)
sScriptMgr->OnCreatureUpdate(this, diff);
}
-void Creature::RegenerateMana()
+void Creature::Regenerate(Powers power)
{
- uint32 curValue = GetPower(POWER_MANA);
- uint32 maxValue = GetMaxPower(POWER_MANA);
+ uint32 curValue = GetPower(power);
+ uint32 maxValue = GetMaxPower(power);
+
+ if (!HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_REGENERATE_POWER))
+ return;
if (curValue >= maxValue)
return;
- uint32 addvalue = 0;
+ float addvalue = 0.0f;
- // Combat and any controlled creature
- if (IsInCombat() || GetCharmerOrOwnerGUID())
+ switch (power)
{
- if (!IsUnderLastManaUseEffect())
+ case POWER_FOCUS:
+ {
+ // For hunter pets.
+ addvalue = 24 * sWorld->getRate(RATE_POWER_FOCUS);
+ break;
+ }
+ case POWER_ENERGY:
+ {
+ // For deathknight's ghoul.
+ addvalue = 20;
+ break;
+ }
+ case POWER_MANA:
{
- float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA);
- float Spirit = GetStat(STAT_SPIRIT);
+ // Combat and any controlled creature
+ if (IsInCombat() || GetCharmerOrOwnerGUID())
+ {
+ if (!IsUnderLastManaUseEffect())
+ {
+ float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA);
+ float Spirit = GetStat(STAT_SPIRIT);
+
+ addvalue = uint32((Spirit / 5.0f + 17.0f) * ManaIncreaseRate);
+ }
+ }
+ else
+ addvalue = maxValue / 3;
- addvalue = uint32((Spirit / 5.0f + 17.0f) * ManaIncreaseRate);
+ break;
}
+ default:
+ return;
}
- else
- addvalue = maxValue / 3;
// Apply modifiers (if any).
- addvalue *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);
+ addvalue *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, power);
- addvalue += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) * CREATURE_REGEN_INTERVAL / (5 * IN_MILLISECONDS);
+ addvalue += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, power) * (IsHunterPet() ? PET_FOCUS_REGEN_INTERVAL : CREATURE_REGEN_INTERVAL) / (5 * IN_MILLISECONDS);
- ModifyPower(POWER_MANA, addvalue);
+ ModifyPower(power, int32(addvalue));
}
void Creature::RegenerateHealth()
@@ -749,8 +787,8 @@ void Creature::RegenerateHealth()
uint32 addvalue = 0;
- // Not only pet, but any controlled creature
- if (GetCharmerOrOwnerGUID())
+ // Not only pet, but any controlled creature (and not polymorphed)
+ if (GetCharmerOrOwnerGUID() && !IsPolymorphed())
{
float HealthIncreaseRate = sWorld->getRate(RATE_HEALTH);
float Spirit = GetStat(STAT_SPIRIT);
@@ -887,6 +925,10 @@ bool Creature::Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, u
return false;
}
+ // Allow players to see those units while dead, do it here (mayby altered by addon auras)
+ if (cinfo->type_flags & CREATURE_TYPE_FLAG_GHOST_VISIBLE)
+ m_serverSideVisibility.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_ALIVE | GHOST_VISIBILITY_GHOST);
+
if (!CreateFromProto(guidlow, entry, data, vehId))
return false;
@@ -1737,7 +1779,7 @@ void Creature::Respawn(bool force)
setDeathState(CORPSE);
}
- RemoveCorpse(false);
+ RemoveCorpse(false, false);
if (getDeathState() == DEAD)
{
@@ -1795,24 +1837,23 @@ void Creature::ForcedDespawn(uint32 timeMSToDespawn, Seconds const& forceRespawn
return;
}
+ // do it before killing creature
+ DestroyForNearbyPlayers();
+
+ bool overrideRespawnTime = true;
if (IsAlive())
{
+ setDeathState(JUST_DIED);
+
if (forceRespawnTimer > Seconds::zero())
{
- uint32 respawnDelay = m_respawnDelay;
- uint32 corpseDelay = m_corpseDelay;
- m_respawnDelay = forceRespawnTimer.count();
- m_corpseDelay = 0;
- setDeathState(JUST_DIED);
-
- m_respawnDelay = respawnDelay;
- m_corpseDelay = corpseDelay;
+ SetRespawnTime(forceRespawnTimer.count());
+ overrideRespawnTime = false;
}
- else
- setDeathState(JUST_DIED);
}
- RemoveCorpse(false);
+ // Skip corpse decay time
+ RemoveCorpse(overrideRespawnTime, false);
}
void Creature::DespawnOrUnsummon(uint32 msTimeToDespawn /*= 0*/, Seconds const& forceRespawnTimer /*= 0*/)
@@ -2126,6 +2167,14 @@ bool Creature::CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction /
if (!IsAlive())
return false;
+ // we cannot assist in evade mode
+ if (IsInEvadeMode())
+ return false;
+
+ // or if enemy is in evade mode
+ if (enemy->GetTypeId() == TYPEID_UNIT && enemy->ToCreature()->IsInEvadeMode())
+ return false;
+
// we don't need help from non-combatant ;)
if (IsCivilian())
return false;
@@ -2219,21 +2268,40 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool /*force*/) const
if (IsAIEnabled && !AI()->CanAIAttack(victim))
return false;
- if (GetMap()->IsDungeon())
- return true;
+ // we cannot attack in evade mode
+ if (IsInEvadeMode())
+ return false;
+
+ // or if enemy is in evade mode
+ if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode())
+ return false;
+
+ if (!GetCharmerOrOwnerGUID().IsPlayer())
+ {
+ if (GetMap()->IsDungeon())
+ return true;
- // if the mob is actively being damaged, do not reset due to distance unless it's a world boss
- if (!isWorldBoss())
- if (time(NULL) - GetLastDamagedTime() <= MAX_AGGRO_RESET_TIME)
+ // don't check distance to home position if recently damaged, this should include taunt auras
+ if (!isWorldBoss() && (GetLastDamagedTime() > sWorld->GetGameTime() || HasAuraType(SPELL_AURA_MOD_TAUNT)))
return true;
+ }
- //Use AttackDistance in distance check if threat radius is lower. This prevents creature bounce in and out of combat every update tick.
- float dist = std::max(GetAttackDistance(victim), sWorld->getFloatConfig(CONFIG_THREAT_RADIUS)) + m_CombatDistance;
+ // Map visibility range, but no more than 2*cell size
+ float dist = std::min<float>(GetMap()->GetVisibilityRange(), SIZE_OF_GRID_CELL*2);
if (Unit* unit = GetCharmerOrOwner())
return victim->IsWithinDist(unit, dist);
else
- return victim->IsInDist(&m_homePosition, dist);
+ {
+ // include sizes for huge npcs
+ dist += GetObjectSize() + victim->GetObjectSize();
+
+ // to prevent creatures in air ignore attacks because distance is already too high...
+ if (GetCreatureTemplate()->InhabitType & INHABIT_AIR)
+ return victim->IsInDist2d(&m_homePosition, dist);
+ else
+ return victim->IsInDist(&m_homePosition, dist);
+ }
}
CreatureAddon const* Creature::GetCreatureAddon() const
@@ -2400,6 +2468,7 @@ void Creature::GetRespawnPosition(float &x, float &y, float &z, float* ori, floa
{
if (m_spawnId)
{
+ // for npcs on transport, this will return transport offset
if (CreatureData const* data = sObjectMgr->GetCreatureData(GetSpawnId()))
{
x = data->posX;
@@ -2414,11 +2483,14 @@ void Creature::GetRespawnPosition(float &x, float &y, float &z, float* ori, floa
}
}
- x = GetPositionX();
- y = GetPositionY();
- z = GetPositionZ();
+ // changed this from current position to home position, fixes world summons with infinite duration (wg npcs for example)
+ Position homePos = GetHomePosition();
+ x = homePos.GetPositionX();
+ y = homePos.GetPositionY();
+ z = homePos.GetPositionZ();
if (ori)
- *ori = GetOrientation();
+ *ori = homePos.GetOrientation();
+
if (dist)
*dist = 0;
}
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 304d2129f36..4e7a83c33d7 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -69,6 +69,7 @@ enum CreatureFlagsExtra
CREATURE_FLAG_EXTRA_GUARD | CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING | CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ | CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK)
static const uint32 CREATURE_REGEN_INTERVAL = 2 * IN_MILLISECONDS;
+static const uint32 PET_FOCUS_REGEN_INTERVAL = 4 * IN_MILLISECONDS;
static const uint32 CREATURE_NOPATH_EVADE_TIME = 5 * IN_MILLISECONDS;
static const uint8 MAX_KILL_CREDIT = 2;
@@ -449,7 +450,8 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
ObjectGuid::LowType GetSpawnId() const { return m_spawnId; }
void Update(uint32 time) override; // overwrited Unit::Update
- void GetRespawnPosition(float &x, float &y, float &z, float* ori = nullptr, float* dist =nullptr) const;
+ void GetRespawnPosition(float &x, float &y, float &z, float* ori = nullptr, float* dist = nullptr) const;
+ bool IsSpawnedOnTransport() const { return m_creatureData && m_creatureData->mapid != GetMapId(); }
void SetCorpseDelay(uint32 delay) { m_corpseDelay = delay; }
uint32 GetCorpseDelay() const { return m_corpseDelay; }
@@ -599,7 +601,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
MovementGeneratorType GetDefaultMovementType() const { return m_defaultMovementType; }
void SetDefaultMovementType(MovementGeneratorType mgt) { m_defaultMovementType = mgt; }
- void RemoveCorpse(bool setSpawnTime = true);
+ void RemoveCorpse(bool setSpawnTime = true, bool destroyForNearbyPlayers = true);
void DespawnOrUnsummon(uint32 msTimeToDespawn = 0, Seconds const& forceRespawnTime = Seconds(0));
void DespawnOrUnsummon(Milliseconds const& time, Seconds const& forceRespawnTime = Seconds(0)) { DespawnOrUnsummon(uint32(time.count()), forceRespawnTime); }
@@ -699,6 +701,10 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
bool IsFocusing(Spell const* focusSpell = nullptr, bool withDelay = false);
void ReleaseFocus(Spell const* focusSpell = nullptr, bool withDelay = true);
+ // Part of Evade mechanics
+ time_t GetLastDamagedTime() const { return _lastDamagedTime; }
+ void SetLastDamagedTime(time_t val) { _lastDamagedTime = val; }
+
CreatureTextRepeatIds GetTextRepeatGroup(uint8 textGroup);
void SetTextRepeatId(uint8 textGroup, uint8 id);
void ClearTextRepeatGroup(uint8 textGroup);
@@ -728,7 +734,6 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
uint32 m_combatPulseDelay; // (secs) how often the creature puts the entire zone in combat (only works in dungeons)
ReactStates m_reactState; // for AI, not charmInfo
- void RegenerateMana();
void RegenerateHealth();
void Regenerate(Powers power);
MovementGeneratorType m_defaultMovementType;
@@ -778,6 +783,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
ObjectGuid m_suppressedTarget; // Stores the creature's "real" target while casting
float m_suppressedOrientation; // Stores the creature's "real" orientation while casting
+ time_t _lastDamagedTime; // Part of Evade mechanics
CreatureTextRepeatGroup m_textRepeat;
};
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index c78189fb59e..3f2723ae03d 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -633,41 +633,6 @@ void Pet::Update(uint32 diff)
Creature::Update(diff);
}
-void Creature::Regenerate(Powers power)
-{
- uint32 curValue = GetPower(power);
- uint32 maxValue = GetMaxPower(power);
-
- if (curValue >= maxValue)
- return;
-
- float addvalue = 0.0f;
-
- switch (power)
- {
- case POWER_FOCUS:
- {
- // For hunter pets.
- addvalue = 24 * sWorld->getRate(RATE_POWER_FOCUS);
- break;
- }
- case POWER_ENERGY:
- {
- // For deathknight's ghoul.
- addvalue = 20;
- break;
- }
- default:
- return;
- }
-
- // Apply modifiers (if any).
- addvalue *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, power);
-
- addvalue += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, power) * (IsHunterPet() ? PET_FOCUS_REGEN_INTERVAL : CREATURE_REGEN_INTERVAL) / (5 * IN_MILLISECONDS);
-
- ModifyPower(power, int32(addvalue));
-}
void Pet::LoseHappiness()
{
diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h
index 21786595d8a..5814a2f21a3 100644
--- a/src/server/game/Entities/Pet/Pet.h
+++ b/src/server/game/Entities/Pet/Pet.h
@@ -22,7 +22,6 @@
#include "PetDefines.h"
#include "TemporarySummon.h"
-#define PET_FOCUS_REGEN_INTERVAL 4 * IN_MILLISECONDS
#define HAPPINESS_LEVEL_SIZE 333000
struct PetSpell
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 730c4e2ff4b..76fa55b4a1c 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -267,7 +267,7 @@ Unit::Unit(bool isWorldObject) :
i_AI(NULL), i_disabledAI(NULL), m_AutoRepeatFirstCast(false), m_procDeep(0),
m_removedAurasCount(0), i_motionMaster(new MotionMaster(this)), m_regenTimer(0), m_ThreatManager(this),
m_vehicle(NULL), m_vehicleKit(NULL), m_unitTypeMask(UNIT_MASK_NONE),
- m_HostileRefManager(this), _lastDamagedTime(0), m_spellHistory(new SpellHistory(this))
+ m_HostileRefManager(this), m_spellHistory(new SpellHistory(this))
{
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
@@ -860,13 +860,16 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
victim->ModifyHealth(-(int32)damage);
if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
- {
victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
- victim->UpdateLastDamagedTime(spellProto);
- }
if (victim->GetTypeId() != TYPEID_PLAYER)
+ {
+ // Part of Evade mechanics. DoT's and Thorns / Retribution Aura do not contribute to this
+ if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
+ victim->ToCreature()->SetLastDamagedTime(sWorld->GetGameTime() + MAX_AGGRO_RESET_TIME);
+
victim->AddThreat(this, float(damage), damageSchoolMask, spellProto);
+ }
else // victim is a player
{
// random durability for items (HIT TAKEN)
@@ -14285,17 +14288,6 @@ int32 Unit::GetHighestExclusiveSameEffectSpellGroupValue(AuraEffect const* aurEf
return val;
}
-void Unit::UpdateLastDamagedTime(SpellInfo const* spellProto)
-{
- if (GetTypeId() != TYPEID_UNIT || IsPet())
- return;
-
- if (spellProto && spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD))
- return;
-
- SetLastDamagedTime(time(NULL));
-}
-
bool Unit::IsHighestExclusiveAura(Aura const* aura, bool removeOtherAuraApplications /*= false*/)
{
for (uint32 i = 0 ; i < MAX_SPELL_EFFECTS; ++i)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 0456d213887..a885147d06f 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2208,11 +2208,6 @@ class TC_GAME_API Unit : public WorldObject
// Movement info
Movement::MoveSpline * movespline;
- // Part of Evade mechanics
- time_t GetLastDamagedTime() const { return _lastDamagedTime; }
- void UpdateLastDamagedTime(SpellInfo const* spellProto);
- void SetLastDamagedTime(time_t val) { _lastDamagedTime = val; }
-
int32 GetHighestExclusiveSameEffectSpellGroupValue(AuraEffect const* aurEff, AuraType auraType, bool checkMiscValue = false, int32 miscValue = 0) const;
bool IsHighestExclusiveAura(Aura const* aura, bool removeOtherAuraApplications = false);
@@ -2343,8 +2338,6 @@ class TC_GAME_API Unit : public WorldObject
uint32 _oldFactionId; ///< faction before charm
bool _isWalkingBeforeCharm; ///< Are we walking before we were charmed?
- time_t _lastDamagedTime; // Part of Evade mechanics
-
SpellHistory* m_spellHistory;
};
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index 076ac7c35ba..34b4acd5c0b 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -319,7 +319,8 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket& recvData)
//if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
// GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
- if (unit->IsArmorer() || unit->IsCivilian() || unit->IsQuestGiver() || unit->IsServiceProvider() || unit->IsGuard())
+ // and if he has pure gossip or is banker and moves or is tabard designer?
+ //if (unit->IsArmorer() || unit->IsCivilian() || unit->IsQuestGiver() || unit->IsServiceProvider() || unit->IsGuard())
{
unit->StopMoving();
}
diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp
index 461fcb35319..231622eac4d 100644
--- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp
+++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp
@@ -177,7 +177,7 @@ bool OPvPCapturePoint::DelCreature(uint32 type)
++itr;
// Don't save respawn time
c->SetRespawnTime(0);
- c->RemoveCorpse();
+ c->DespawnOrUnsummon();
c->AddObjectToRemoveList();
}
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index b2af560c0d8..7cb3cb26c52 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -2961,7 +2961,7 @@ void AuraEffect::HandleAuraControlVehicle(AuraApplication const* aurApp, uint8 m
{
target->Kill(caster);
if (caster->GetTypeId() == TYPEID_UNIT)
- caster->ToCreature()->RemoveCorpse();
+ caster->ToCreature()->DespawnOrUnsummon();
}
if (!(mode & AURA_EFFECT_HANDLE_CHANGE_AMOUNT))
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index d5ab9e75efb..356d8115bb9 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -3633,10 +3633,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
{
caster->RewardPlayerAndGroupAtEvent(18388, unitTarget);
if (Creature* target = unitTarget->ToCreature())
- {
- target->setDeathState(CORPSE);
- target->RemoveCorpse();
- }
+ target->DespawnOrUnsummon();
}
break;
// Mug Transformation
diff --git a/src/server/scripts/Commands/cs_pet.cpp b/src/server/scripts/Commands/cs_pet.cpp
index d658876d822..1b704e29b06 100644
--- a/src/server/scripts/Commands/cs_pet.cpp
+++ b/src/server/scripts/Commands/cs_pet.cpp
@@ -93,8 +93,7 @@ public:
return false;
}
- creatureTarget->setDeathState(JUST_DIED);
- creatureTarget->RemoveCorpse();
+ creatureTarget->DespawnOrUnsummon();
creatureTarget->SetHealth(0); // just for nice GM-mode view
pet->SetGuidValue(UNIT_FIELD_CREATEDBY, player->GetGUID());
diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
index 0ff1744457e..eb65bf1dfb3 100644
--- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
+++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
@@ -193,10 +193,7 @@ public:
{
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
{
- if (summon->IsAlive())
- summon->DisappearAndDie();
- else
- summon->RemoveCorpse();
+ summon->DespawnOrUnsummon();
}
}
}
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index 8f1e35a0219..264a21d880f 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -479,8 +479,7 @@ public:
}
else
{
- me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
}
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
index 53569bdce2a..f2941a5b314 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
@@ -502,9 +502,7 @@ public:
me->SummonCreature(NPC_DEAD, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
}
(*i)->SetVisible(false);
- (*i)->setDeathState(JUST_DIED);
- if ((*i)->getDeathState() == CORPSE)
- (*i)->RemoveCorpse();
+ (*i)->DespawnOrUnsummon();
}
}
};
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index fb587cdd6e5..77b3da4eece 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
@@ -1168,8 +1168,7 @@ public:
uiTimer = 5000;
break;
case 3:
- me->KillSelf();
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
break;
}
} else uiTimer -=diff;
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
index bbed195508b..854f42e16cd 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
@@ -222,8 +222,8 @@ class instance_uldaman : public InstanceMapScript
Creature* target = instance->GetCreature(*i);
if (!target || target->isDead() || target->getFaction() != 14)
continue;
- target->setDeathState(JUST_DIED);
- target->RemoveCorpse();
+
+ target->DespawnOrUnsummon();
}
// Vault Walkers
@@ -232,8 +232,8 @@ class instance_uldaman : public InstanceMapScript
Creature* target = instance->GetCreature(*i);
if (!target || target->isDead() || target->getFaction() != 14)
continue;
- target->setDeathState(JUST_DIED);
- target->RemoveCorpse();
+
+ target->DespawnOrUnsummon();
}
// Earthen Guardians
@@ -242,8 +242,8 @@ class instance_uldaman : public InstanceMapScript
Creature* target = instance->GetCreature(*i);
if (!target || target->isDead() || target->getFaction() != 14)
continue;
- target->setDeathState(JUST_DIED);
- target->RemoveCorpse();
+
+ target->DespawnOrUnsummon();
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
index c3fdb7b12f8..9965053bfc6 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
@@ -239,8 +239,7 @@ public:
Creature* boss = ObjectAccessor::GetCreature(*me, AnetheronGUID);
if (!boss || boss->isDead())
{
- me->setDeathState(JUST_DIED);
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
return;
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
index 7e25fe6b384..e8ba1f90d37 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
@@ -248,8 +248,7 @@ public:
Creature* boss = ObjectAccessor::GetCreature(*me, AzgalorGUID);
if (!boss || boss->isDead())
{
- me->setDeathState(JUST_DIED);
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
return;
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index db68dfced7c..7eec37758ee 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
@@ -574,8 +574,7 @@ public:
{
if ((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21))
{
- me->setDeathState(DEAD);
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
}
}
}
@@ -674,8 +673,7 @@ public:
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK_UNARMED);
if ((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21))
{
- me->setDeathState(DEAD);
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
}
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
index 6a15068e329..2f76b20ea30 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
@@ -203,8 +203,7 @@ public:
//if we reach this it means event was running but at some point reset.
if (instance->GetData(TYPE_MEDIVH) == NOT_STARTED)
{
- me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
me->Respawn();
return;
}
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
index 26ccc6a9c8e..116f634893f 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
@@ -128,7 +128,7 @@ class boss_skeram : public CreatureScript
if (!me->IsSummon())
Talk(SAY_DEATH);
else
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index 65fde0e6631..c0322c98eec 100644
--- a/src/server/scripts/Kalimdor/zone_silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
@@ -932,7 +932,7 @@ public:
void npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::JustDied(Unit* /*slayer*/)
{
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
if (!MobGUID)
return;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
index b0abb6e04ad..3db0b1d4fca 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
@@ -264,7 +264,7 @@ struct boss_four_horsemen_baseAI : public BossAI
{
if (Creature* cBoss = getHorsemanHandle(boss))
{
- cBoss->DespawnOrUnsummon(0);
+ cBoss->DespawnOrUnsummon();
cBoss->SetRespawnTime(15);
}
else
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index baa91bad0d9..a3f1189da74 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
@@ -244,7 +244,7 @@ class npc_iron_roots : public CreatureScript
target->RemoveAurasDueToSpell(SPELL_ROOTS_FREYA);
}
- me->RemoveCorpse(false);
+ me->DespawnOrUnsummon();
}
private:
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
index 0bce78607d3..a7b00d4ef70 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
@@ -168,10 +168,7 @@ public:
for (uint8 i = 0; i < 2; ++i)
{
if (Creature* mob = ObjectAccessor::GetCreature(*me, beams[i]))
- {
- mob->setDeathState(DEAD);
- mob->RemoveCorpse();
- }
+ mob->DespawnOrUnsummon();
}
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
index 00cabcf0d96..febd57cc4fa 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
@@ -805,9 +805,9 @@ public:
if (!Vashj || !Vashj->IsAlive() || ENSURE_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->ToCreature()->AI())->Phase != 3)
{
// remove
- me->setDeathState(DEAD);
- me->RemoveCorpse();
me->setFaction(35);
+ me->DespawnOrUnsummon();
+ return;
}
CheckTimer = 1000;
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
index a4f10aa9eda..08b442e033b 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
@@ -176,11 +176,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript
{
Creature* creature = ObjectAccessor::GetCreature(*me, *itr);
if (creature && creature->IsAlive())
- {
- creature->GetMotionMaster()->Clear(true);
- me->DealDamage(creature, creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- creature->RemoveCorpse();
- }
+ creature->DespawnOrUnsummon();
}
adds.clear();
@@ -188,11 +184,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript
{
Creature* creature = ObjectAccessor::GetCreature(*me, *itr);
if (creature && creature->IsAlive())
- {
- creature->GetMotionMaster()->Clear(true);
- me->DealDamage(creature, creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- creature->RemoveCorpse();
- }
+ creature->DespawnOrUnsummon();
}
assassins.clear();
}
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
index 199fa3d81c1..483cf3284c3 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
@@ -194,8 +194,8 @@ class npc_ragin_flames : public CreatureScript
if (instance->GetData(DATA_NETHERMANCER_SEPRETHREA) != IN_PROGRESS)
{
//remove
- me->setDeathState(JUST_DIED);
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
+ return;
}
Check_Timer = 1000;
} else Check_Timer -= diff;
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
index 33ffa66b387..9ddca823d9e 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
@@ -231,8 +231,8 @@ class npc_nether_wraith : public CreatureScript
{
if (Die_Timer <= diff)
{
- me->setDeathState(JUST_DIED);
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
+ return;
}
else
Die_Timer -= diff;
diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
index 01a3aa7859a..6a116d89d7a 100644
--- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
@@ -121,11 +121,7 @@ public:
return;
if (id == 0)
- {
- me->setDeathState(JUST_DIED);
- me->RemoveCorpse();
- me->SetHealth(0);
- }
+ me->DespawnOrUnsummon(1);
}
void SpellHit(Unit* caster, const SpellInfo* spell) override
@@ -153,7 +149,8 @@ public:
EnterEvadeMode();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
IsNihil = true;
- }else
+ }
+ else
AttackStart(caster);
}
}
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index 8d517fbe316..3e8b3e4ca95 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -379,7 +379,6 @@ public:
FlyTimer = 10000;
me->SetDisableGravity(false);
- me->SetVisible(true);
}
void SpellHit(Unit* caster, const SpellInfo* spell) override
@@ -423,10 +422,8 @@ public:
PlayerGUID.Clear();
}
- me->SetVisible(false);
- me->SetDisableGravity(false);
- me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- me->RemoveCorpse();
+
+ me->DespawnOrUnsummon(1);
}
}
@@ -1192,7 +1189,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
- me->RemoveCorpse();
+ me->DespawnOrUnsummon();
if (Creature* LordIllidan = (ObjectAccessor::GetCreature(*me, LordIllidanGUID)))
if (LordIllidan)
ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, LordIllidan->AI())->LiveCounter();
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index fe9277cddf4..c39e91cff42 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -4386,6 +4386,42 @@ class spell_gen_pony_mount_check : public SpellScriptLoader
}
};
+class spell_gen_shroud_of_death : public SpellScriptLoader
+{
+ public:
+ spell_gen_shroud_of_death() : SpellScriptLoader("spell_gen_shroud_of_death") { }
+
+ class spell_gen_shroud_of_death_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_shroud_of_death_AuraScript);
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ PreventDefaultAction();
+ GetUnitOwner()->m_serverSideVisibility.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_GHOST);
+ GetUnitOwner()->m_serverSideVisibilityDetect.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_GHOST);
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ PreventDefaultAction();
+ GetUnitOwner()->m_serverSideVisibility.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_ALIVE);
+ GetUnitOwner()->m_serverSideVisibilityDetect.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_ALIVE);
+ }
+
+ void Register() override
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_gen_shroud_of_death_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ OnEffectRemove += AuraEffectRemoveFn(spell_gen_shroud_of_death_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_gen_shroud_of_death_AuraScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -4483,4 +4519,5 @@ void AddSC_generic_spell_scripts()
new spell_gen_landmine_knockback_achievement();
new spell_gen_clear_debuffs();
new spell_gen_pony_mount_check();
+ new spell_gen_shroud_of_death();
}