// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#ifndef RY_TICK_EVENT_HANDLER_H
#define RY_TICK_EVENT_HANDLER_H
#include "nel/misc/types_nl.h"
#include "nel/misc/time_nl.h"
#include "nel/misc/common.h"
#include "nel/net/naming_client.h"
typedef void (* TUserSyncCallback) ();
/**
* Implements callbacks relative to the tick service
* \author Nicolas Brigand
* \author Stephane Coutelas
* \author Nevrax France
* \date 2002
*/
class CTickEventHandler
{
public :
/**
* Get the current universal game time
*/
static const NLMISC::TGameTime &getGameTime() { return _GameTime; }
/**
* Set the current universal game time
*/
static void setGameTime( NLMISC::TGameTime gameTime) { _GameTime = gameTime; }
/**
* Get the current step time of the tick service
*/
static const NLMISC::TGameTime &getGameTimeStep() { return _GameTimeStep; }
/**
* Set the current game time step
*/
static void setGameTimeStep( NLMISC::TGameTime gameTimeStep) { _GameTimeStep = gameTimeStep; }
/**
* Get the number of ellapsed game cycles
*/
inline static const NLMISC::TGameCycle &getGameCycle() { return _GameCycle; }
/**
* Get the number of ellapsed game cycles
*/
static void setGameCycle( NLMISC::TGameCycle gameCycle ) { _GameCycle = gameCycle; }
/**
* Send a tock and update the game time
*/
static void tickUpdate( NLNET::TServiceId serviceId );
static void sendTockBack( NLNET::TServiceId serviceId );
/**
* initialize the callback Array and get a pointer to the service's specific update function
*
* \param updateFunc will be call when we receive a new tick
* \param syncFunc will be call when the ticks send the syncro
* \param tockAtBeginOfTickUpdate indicates if we will send TOCK before calling updateFunc()
* instead of after.
*/
static void init(void (*updateFunc)(), void (*syncFunc)() = NULL, bool tockAtBeginOfTickUpdate=false);
/**
* Set a callback to call when receiving the first game cycle (call this method in your init())
* \param syncFunc will be call when the ticks send the syncro
* \param allowReplaceCallback true if we allow the callback to be replaced
* \return previous callback if exist, otherwise NULL
*/
static TUserSyncCallback setSyncCallback( TUserSyncCallback syncFunc, bool allowReplaceCallback = false );
static bool getTockAtBeginOfTickUpdate() { return _TockAtBeginOfTickUpdate; }
private :
/// Time according to the game (used for determining day, night...) (double in seconds)
static NLMISC::TGameTime _GameTime;
/// Game time step
static NLMISC::TGameTime _GameTimeStep;
/// Number of game cycles
static NLMISC::TGameCycle _GameCycle;
/// Shall we tock at the beginning of at the end of tickUpdate() ?
static bool _TockAtBeginOfTickUpdate;
/**
* private constructor (singleton)
*/
CTickEventHandler() { }
};
#endif// RY_TICK_EVENT_HANDLER_H