aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2017_02_05_00_world.sql13
-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
33 files changed, 239 insertions, 194 deletions
diff --git a/sql/updates/world/3.3.5/2017_02_05_00_world.sql b/sql/updates/world/3.3.5/2017_02_05_00_world.sql
new file mode 100644
index 00000000000..bc4e3f60759
--- /dev/null
+++ b/sql/updates/world/3.3.5/2017_02_05_00_world.sql
@@ -0,0 +1,13 @@
+
+-- Franclorn Forgewright
+SET @ENTRY := 8888;
+UPDATE `creature_template` SET `npcflag`=`npcflag`&~0x8000 WHERE `entry`=@ENTRY;
+
+-- Gaeriyan
+SET @ENTRY := 9299;
+UPDATE `creature_template` SET `npcflag`=`npcflag`&~0x8000 WHERE `entry`=@ENTRY;
+UPDATE `creature_template_addon` SET `auras`='10848' WHERE `entry`=@ENTRY;
+
+-- Shroud of Death Spell
+DELETE FROM `spell_script_names` WHERE spell_id=10848;
+INSERT INTO `spell_script_names` VALUES(10848, 'spell_gen_shroud_of_death');
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();
}