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

(cherrypicked from e1f14215d8)
This commit is contained in:
xinef1
2017-02-05 15:39:22 +01:00
committed by Shauren
parent a68911472e
commit fe63cd3dbb
34 changed files with 233 additions and 197 deletions

View File

@@ -98,8 +98,7 @@ public:
return false;
}
creatureTarget->setDeathState(JUST_DIED);
creatureTarget->RemoveCorpse();
creatureTarget->DespawnOrUnsummon();
creatureTarget->SetHealth(0); // just for nice GM-mode view
pet->SetCreatorGUID(player->GetGUID());

View File

@@ -196,10 +196,7 @@ public:
{
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
{
if (summon->IsAlive())
summon->DisappearAndDie();
else
summon->RemoveCorpse();
summon->DespawnOrUnsummon();
}
}
}

View File

@@ -480,8 +480,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 { }

View File

@@ -499,9 +499,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();
}
}
};

View File

@@ -1174,8 +1174,7 @@ public:
uiTimer = 5000;
break;
case 3:
me->KillSelf();
me->RemoveCorpse();
me->DespawnOrUnsummon();
break;
}
} else uiTimer -=diff;

View File

@@ -228,8 +228,7 @@ 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
@@ -238,8 +237,7 @@ 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
@@ -248,8 +246,7 @@ 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();
}
}

View File

@@ -240,8 +240,7 @@ public:
Creature* boss = ObjectAccessor::GetCreature(*me, AnetheronGUID);
if (!boss || boss->isDead())
{
me->setDeathState(JUST_DIED);
me->RemoveCorpse();
me->DespawnOrUnsummon();
return;
}
}

View File

@@ -249,8 +249,7 @@ public:
Creature* boss = ObjectAccessor::GetCreature(*me, AzgalorGUID);
if (!boss || boss->isDead())
{
me->setDeathState(JUST_DIED);
me->RemoveCorpse();
me->DespawnOrUnsummon();
return;
}
}

View File

@@ -577,8 +577,7 @@ public:
{
if ((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21))
{
me->setDeathState(DEAD);
me->RemoveCorpse();
me->DespawnOrUnsummon();
}
}
}
@@ -677,8 +676,7 @@ public:
me->SetEmoteState(EMOTE_ONESHOT_ATTACK_UNARMED);
if ((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21))
{
me->setDeathState(DEAD);
me->RemoveCorpse();
me->DespawnOrUnsummon();
}
}
}

View File

@@ -207,8 +207,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;
}

View File

@@ -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

View File

@@ -936,7 +936,7 @@ public:
void npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::JustDied(Unit* /*slayer*/)
{
me->RemoveCorpse();
me->DespawnOrUnsummon();
if (!MobGUID)
return;

View File

@@ -276,7 +276,7 @@ struct boss_four_horsemen_baseAI : public BossAI
{
if (Creature* cBoss = getHorsemanHandle(boss))
{
cBoss->DespawnOrUnsummon(0);
cBoss->DespawnOrUnsummon();
cBoss->SetRespawnTime(15);
}
else

View File

@@ -248,7 +248,7 @@ class npc_iron_roots : public CreatureScript
target->RemoveAurasDueToSpell(SPELL_ROOTS_FREYA);
}
me->RemoveCorpse(false);
me->DespawnOrUnsummon();
}
private:

View File

@@ -172,8 +172,7 @@ public:
{
if (Creature* mob = ObjectAccessor::GetCreature(*me, beams[i]))
{
mob->setDeathState(DEAD);
mob->RemoveCorpse();
mob->DespawnOrUnsummon();
}
}
}

View File

@@ -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;

View File

@@ -179,11 +179,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();
@@ -191,11 +187,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();
}

View File

@@ -196,8 +196,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;

View File

@@ -232,8 +232,8 @@ class npc_nether_wraith : public CreatureScript
{
if (Die_Timer <= diff)
{
me->setDeathState(JUST_DIED);
me->RemoveCorpse();
me->DespawnOrUnsummon();
return;
}
else
Die_Timer -= diff;

View File

@@ -123,11 +123,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
@@ -155,7 +151,8 @@ public:
EnterEvadeMode();
me->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
IsNihil = true;
}else
}
else
AttackStart(caster);
}
}

View File

@@ -384,7 +384,6 @@ public:
FlyTimer = 10000;
me->SetDisableGravity(false);
me->SetVisible(true);
}
void SpellHit(Unit* caster, const SpellInfo* spell) override
@@ -428,10 +427,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);
}
}
@@ -1197,7 +1194,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
me->RemoveCorpse();
me->DespawnOrUnsummon();
if (Creature* LordIllidan = (ObjectAccessor::GetCreature(*me, LordIllidanGUID)))
ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, LordIllidan->AI())->LiveCounter();
}

View File

@@ -4426,6 +4426,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();
}
};
// 169869 - Transformation Sickness
class spell_gen_decimatus_transformation_sickness : public SpellScriptLoader
{
@@ -4752,6 +4788,7 @@ 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();
new spell_gen_decimatus_transformation_sickness();
new spell_gen_anetheron_summon_towering_infernal();
new spell_gen_mark_of_kazrogal_hellfire();