Ejemplo n.º 1
0
void GameEventMgr::FinishEvent(uint32 id)
{
	GameEventMap::iterator _event = CheckAndReturnEvent(id);
	if( _event == m_GameEventMap.end() )
	{
		sLog.outError("System tried to finish event %u, but this event does not exist!", id);
		return;
	}

	// already finished
	if( _event->second->active != true )
		return;

	// despawn etc. here
	DespawnEvent( id );
	ScriptedBackToOrig( id );
	sHookInterface.OnGameEventFinish( id );

	// set as non active
	_event->second->active = false;

	// update next start time
	if( _event->second->occurence != 0 )
	{
		_event->second->start_time += _event->second->occurence;
		_event->second->end_time = _event->second->start_time + _event->second->length;
	}

	// if user wants to save event everytime, just save it
	if( sWorld.optimized_game_event_saving == true )
	{
		sGameEventMgr.SaveEvent( id );
	}

	sLog.outDebug("Event %s (ID: %u) has just stopped.", _event->second->name, id);
}
Ejemplo n.º 2
0
void BattleGroundDS::Update(uint32 diff)
{
    BattleGround::Update(diff);
    if (GetStatus() == STATUS_IN_PROGRESS)
    {
        // despawn doors just for make a sure players don't get stuck behind it
        if(!DoorsDespawned)
        {
            DespawnEvent(DOORS_EVENT, 0);
            DoorsDespawned = true;
        }

        // knocking out of tube
        if(KnockbackCheck)
        {
            if(m_uiKnockback < diff || KnockbackSpam)
            {
                for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
                {
                    Player * plr = sObjectMgr.GetPlayer(itr->first);
                    if (plr->GetTeam() == ALLIANCE && plr->GetDistance2d(1214, 765) <= 50 && plr->GetPositionZ() > 10)
                        plr->KnockBackPlayerWithAngle(6.05f, 35.0f, 7.0f);
                    if (plr->GetTeam() == HORDE && plr->GetDistance2d(1369, 817) <= 50 && plr->GetPositionZ() > 10)
                        plr->KnockBackPlayerWithAngle(3.03f, 35.0f, 7.0f);
                }
                if(!KnockbackSpam)
                {
                    m_uiKnockSpam = 5000;
                    KnockbackSpam = true;

                    // Remove Demonic Circle
                    for(BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
                        if (Player *plr = sObjectMgr.GetPlayer(itr->first))
                            if(GameObject* obj = plr->GetGameObject(48018))
                                obj->Delete();
                }
            }
            else
                m_uiKnockback -= diff;
            
            if(KnockbackSpam)
            {
                if(m_uiKnockSpam < diff)
                    KnockbackCheck = false;
                else
                    m_uiKnockSpam -= diff;
            }
        }

        // Waterfall
        if(m_uiWaterfall < diff)
        {
            if(WaterfallActivated)
            {
                DespawnEvent(WATERFALL_EVENT, 0);
                WaterfallActivated = false;
            }
            else
            {
                SpawnEvent(WATERFALL_EVENT, 0, true);
                WaterfallActivated = true;
            }
            m_uiWaterfall = urand(30,45)*IN_MILLISECONDS;

        }
        else
            m_uiWaterfall -= diff;
    }
}