mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 04:37:00 +00:00
* Creature/GameObject guid generators moved to Map * For avoid wrong not converted cases generic function in ObjectMgr has been replaced by specilized guid generation function like sObjectMgr.GeneratePlayerLowGuid(). This let catch all cases that need update in custom code or scripts. * Drop many ObjectAcessor.h now dead code. This is also make mangos more thread safe. * Restore one more time unix build broken in prev. commits. Note: many cases when something not wotk in instance but work in continents possible magicly start work after this commit. For example, some gm commands. From large systems that need more chnages for start work in full power in instances can be referecned pool/gamevent system. Last need just small hacks drop changes but in will addded in independent commit.
176 lines
4.5 KiB
C++
176 lines
4.5 KiB
C++
/*
|
|
* Copyright (C) 2005-2011 MaNGOS <http://getmangos.com/>
|
|
*
|
|
* 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 "Log.h"
|
|
#include "CreatureAI.h"
|
|
|
|
TemporarySummon::TemporarySummon( ObjectGuid summoner ) :
|
|
Creature(CREATURE_SUBTYPE_TEMPORARY_SUMMON), m_type(TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN), m_timer(0), m_lifetime(0), m_summoner(summoner)
|
|
{
|
|
}
|
|
|
|
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_DESPAWN_OUT_OF_COMBAT:
|
|
{
|
|
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;
|
|
}
|
|
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_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_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;
|
|
}
|
|
default:
|
|
UnSummon();
|
|
sLog.outError("Temporary summoned creature (entry: %u) have unknown type %u of ",GetEntry(),m_type);
|
|
break;
|
|
}
|
|
|
|
Creature::Update( update_diff, diff );
|
|
}
|
|
|
|
void TemporarySummon::Summon(TempSummonType type, uint32 lifetime)
|
|
{
|
|
m_type = type;
|
|
m_timer = lifetime;
|
|
m_lifetime = lifetime;
|
|
|
|
AIM_Initialize();
|
|
GetMap()->Add((Creature*)this);
|
|
}
|
|
|
|
void TemporarySummon::UnSummon()
|
|
{
|
|
CombatStop();
|
|
|
|
if (GetSummonerGuid().IsCreature())
|
|
if(Creature* sum = GetMap()->GetCreature(GetSummonerGuid()))
|
|
if (sum->AI())
|
|
sum->AI()->SummonedCreatureDespawn(this);
|
|
|
|
AddObjectToRemoveList();
|
|
}
|
|
|
|
void TemporarySummon::SaveToDB()
|
|
{
|
|
}
|