void TemporarySpawn::UnSummon() { CombatStop(); if (m_linkedToOwnerAura & TEMPSPAWN_LINKED_AURA_REMOVE_OWNER) RemoveAuraFromOwner(); if (GetSpawnerGuid().IsCreature()) { if (Creature* sum = GetMap()->GetCreature(GetSpawnerGuid())) if (sum->AI()) sum->AI()->SummonedCreatureDespawn(this); } if (AI()) AI()->SummonedCreatureDespawn(this); AddObjectToRemoveList(); }
void TemporarySummon::UnSummon() { CombatStop(); if (m_linkedToOwnerAura & TEMPSUMMON_LINKED_AURA_REMOVE_OWNER) RemoveAuraFromOwner(); if (GetSummonerGuid().IsCreatureOrVehicle()) { if (Creature* sum = GetMap()->GetCreature(GetSummonerGuid())) if (sum->AI()) sum->AI()->SummonedCreatureDespawn(this); } else if (GetSummonerGuid().IsPlayer()) // if player that summoned this creature was MCing it, uncharm if (Player* player = GetMap()->GetPlayer(GetSummonerGuid())) if (player->GetMover() == this) player->Uncharm(); if (AI()) AI()->SummonedCreatureDespawn(this); AddObjectToRemoveList(); }
void TemporarySummon::Update(uint32 update_diff, uint32 diff) { switch (m_type) { case TEMPSUMMON_MANUAL_DESPAWN: break; case TEMPSUMMON_TIMED_DESPAWN: { if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; break; } case TEMPSUMMON_TIMED_OOC_DESPAWN: { if (!IsInCombat()) { if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; } else if (m_timer != m_lifetime) m_timer = m_lifetime; break; } case TEMPSUMMON_CORPSE_TIMED_DESPAWN: { if (IsCorpse()) { if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; } if (IsDespawned()) { UnSummon(); return; } break; } case TEMPSUMMON_CORPSE_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (IsDead()) { UnSummon(); return; } break; } case TEMPSUMMON_DEAD_DESPAWN: { if (IsDespawned()) { UnSummon(); return; } break; } case TEMPSUMMON_TIMED_OOC_OR_CORPSE_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (IsDead()) { UnSummon(); return; } if (!IsInCombat()) { if (m_timer <= update_diff) { UnSummon(); return; } else m_timer -= update_diff; } else if (m_timer != m_lifetime) m_timer = m_lifetime; break; } case TEMPSUMMON_TIMED_OOC_OR_DEAD_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (IsDespawned()) { UnSummon(); return; } if (!IsInCombat() && IsAlive()) { if (m_timer <= update_diff) { UnSummon(); return; } else m_timer -= update_diff; } else if (m_timer != m_lifetime) m_timer = m_lifetime; break; } case TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (IsDead()) { UnSummon(); return; } if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; break; } case TEMPSUMMON_TIMED_OR_DEAD_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (IsDespawned()) { UnSummon(); return; } if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; break; } default: UnSummon(); sLog.outError("Temporary summoned creature (entry: %u) have unknown type %u of ", GetEntry(), m_type); break; } switch (m_deathState) { case ALIVE: if (m_linkedToOwnerAura & TEMPSUMMON_LINKED_AURA_OWNER_CHECK) { // we have to check if owner still have the required aura Unit* owner = GetCharmerOrOwner(); uint32 const& spellId = GetUInt32Value(UNIT_CREATED_BY_SPELL); if (!owner || !spellId || !owner->HasAura(spellId)) UnSummon(); } break; case DEAD: case CORPSE: if (m_linkedToOwnerAura & TEMPSUMMON_LINKED_AURA_REMOVE_OWNER) { RemoveAuraFromOwner(); m_linkedToOwnerAura = 0; // we dont need to recheck } default: break; } Creature::Update(update_diff, diff); }
void TemporarySpawn::Update(uint32 update_diff, uint32 diff) { switch (m_type) { case TEMPSPAWN_MANUAL_DESPAWN: break; case TEMPSPAWN_TIMED_DESPAWN: { if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; break; } case TEMPSPAWN_TIMED_OOC_DESPAWN: { if (isAlive()) { if (!isInCombat()) { if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; } else if (m_timer != m_lifetime) m_timer = m_lifetime; } else if (IsDespawned()) { UnSummon(); return; } break; } case TEMPSPAWN_CORPSE_TIMED_DESPAWN: { if (IsCorpse()) { if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; } if (IsDespawned()) { UnSummon(); return; } break; } case TEMPSPAWN_CORPSE_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (isDead()) { UnSummon(); return; } break; } case TEMPSPAWN_DEAD_DESPAWN: { if (IsDespawned()) { UnSummon(); return; } break; } case TEMPSPAWN_TIMED_OOC_OR_CORPSE_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (isDead()) { UnSummon(); return; } if (!isInCombat()) { if (m_timer <= update_diff) { UnSummon(); return; } else m_timer -= update_diff; } else if (m_timer != m_lifetime) m_timer = m_lifetime; break; } case TEMPSPAWN_TIMED_OOC_OR_DEAD_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (IsDespawned()) { UnSummon(); return; } if (!isInCombat() && isAlive() && !GetCharmerGuid()) { if (m_timer <= update_diff) { UnSummon(); return; } else m_timer -= update_diff; } else if (m_timer != m_lifetime) m_timer = m_lifetime; break; } case TEMPSPAWN_TIMED_OR_CORPSE_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (isDead()) { UnSummon(); return; } if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; break; } case TEMPSPAWN_TIMED_OR_DEAD_DESPAWN: { // if m_deathState is DEAD, CORPSE was skipped if (IsDespawned()) { UnSummon(); return; } if (m_timer <= update_diff) { UnSummon(); return; } m_timer -= update_diff; break; } default: UnSummon(); sLog.outError("Temporary summoned creature (entry: %u) have unknown type %u of ", GetEntry(), m_type); break; } switch (m_deathState) { case ALIVE: if (m_linkedToOwnerAura & TEMPSPAWN_LINKED_AURA_OWNER_CHECK) { if (!CheckAuraOnOwner()) UnSummon(); } break; case DEAD: case CORPSE: if (m_linkedToOwnerAura & TEMPSPAWN_LINKED_AURA_REMOVE_OWNER) { RemoveAuraFromOwner(); m_linkedToOwnerAura = 0; // we dont need to recheck } default: break; } Creature::Update(update_diff, diff); }