diff options
Diffstat (limited to 'src/game/TemporarySummon.cpp')
-rw-r--r-- | src/game/TemporarySummon.cpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/game/TemporarySummon.cpp b/src/game/TemporarySummon.cpp new file mode 100644 index 00000000000..130c4a7904a --- /dev/null +++ b/src/game/TemporarySummon.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "TemporarySummon.h" +#include "WorldPacket.h" +#include "MapManager.h" +#include "Log.h" +#include "ObjectAccessor.h" +#include "CreatureAI.h" + +TemporarySummon::TemporarySummon( uint64 summoner ) : +Creature(), m_type(TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN), m_timer(0), m_lifetime(0), m_summoner(summoner) +{ +} + +void TemporarySummon::Update( uint32 diff ) +{ + switch(m_type) + { + case TEMPSUMMON_MANUAL_DESPAWN: + break; + case TEMPSUMMON_TIMED_DESPAWN: + { + if (m_timer <= diff) + { + UnSummon(); + return; + } + + m_timer -= diff; + break; + } + case TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT: + { + if (!isInCombat()) + { + if (m_timer <= diff) + { + UnSummon(); + return; + } + + m_timer -= diff; + } + else if (m_timer != m_lifetime) + m_timer = m_lifetime; + + break; + } + + case TEMPSUMMON_CORPSE_TIMED_DESPAWN: + { + if ( m_deathState == CORPSE) + { + if (m_timer <= diff) + { + UnSummon(); + return; + } + + m_timer -= diff; + } + break; + } + case TEMPSUMMON_CORPSE_DESPAWN: + { + // if m_deathState is DEAD, CORPSE was skipped + if ( m_deathState == CORPSE || m_deathState == DEAD) + { + UnSummon(); + return; + } + + break; + } + case TEMPSUMMON_DEAD_DESPAWN: + { + if ( m_deathState == DEAD ) + { + UnSummon(); + return; + } + break; + } + case TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN: + { + // if m_deathState is DEAD, CORPSE was skipped + if ( m_deathState == CORPSE || m_deathState == DEAD) + { + UnSummon(); + return; + } + + if (!isInCombat()) + { + if (m_timer <= diff) + { + UnSummon(); + return; + } + else + m_timer -= diff; + } + else if (m_timer != m_lifetime) + m_timer = m_lifetime; + break; + } + case TEMPSUMMON_TIMED_OR_DEAD_DESPAWN: + { + // if m_deathState is DEAD, CORPSE was skipped + if (m_deathState == DEAD) + { + UnSummon(); + return; + } + + if (!isInCombat() && isAlive() ) + { + if (m_timer <= diff) + { + UnSummon(); + return; + } + else + m_timer -= diff; + } + else if (m_timer != m_lifetime) + m_timer = m_lifetime; + break; + } + default: + UnSummon(); + sLog.outError("Temporary summoned creature (entry: %u) have unknown type %u of ",GetEntry(),m_type); + break; + } + + Creature::Update( diff ); +} + +void TemporarySummon::Summon(TempSummonType type, uint32 lifetime) +{ + m_type = type; + m_timer = lifetime; + m_lifetime = lifetime; + + MapManager::Instance().GetMap(GetMapId(), this)->Add((Creature*)this); + + AIM_Initialize(); +} + +void TemporarySummon::UnSummon() +{ + CombatStop(); + + CleanupsBeforeDelete(); + AddObjectToRemoveList(); + + Unit* sum = m_summoner ? ObjectAccessor::GetUnit(*this, m_summoner) : NULL; + if (sum && sum->GetTypeId() == TYPEID_UNIT && ((Creature*)sum)->AI()) + { + ((Creature*)sum)->AI()->SummonedCreatureDespawn(this); + } +} + +void TemporarySummon::SaveToDB() +{ +} |