dvander@564: /** dvander@564: * vim: set ts=4 : ds@1330: * ============================================================================= dvander@1226: * SourceMod dvander@1226: * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved. ds@1330: * ============================================================================= dvander@564: * ds@1330: * This program is free software; you can redistribute it and/or modify it under ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the ds@1330: * Free Software Foundation. dvander@564: * ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ds@1330: * details. dvander@1226: * ds@1330: * You should have received a copy of the GNU General Public License along with ds@1330: * this program. If not, see . dvander@1226: * ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants ds@1330: * this exception to all derivative works. AlliedModders LLC defines further ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), ds@1330: * or . dvander@564: * dvander@564: * Version: $Id$ dvander@564: */ dvander@564: dvander@564: #ifndef _INCLUDE_SOURCEMOD_TIMER_SYSTEM_H_ dvander@564: #define _INCLUDE_SOURCEMOD_TIMER_SYSTEM_H_ dvander@564: faluco@620: /** faluco@620: * @file ITimerSystem.h faluco@620: * @brief Contains functions for creating and managing timers. faluco@620: */ faluco@620: faluco@620: dvander@564: #include faluco@587: #include dvander@564: faluco@587: #define SMINTERFACE_TIMERSYS_NAME "ITimerSys" dvander@1459: #define SMINTERFACE_TIMERSYS_VERSION 3 dvander@564: dvander@564: namespace SourceMod dvander@564: { dvander@564: class ITimer; dvander@564: dvander@1414: /** dvander@1414: * @brief Interface for map timers. dvander@1414: */ dvander@1414: class IMapTimer dvander@1414: { dvander@1414: public: dvander@1414: /** dvander@1414: * Returns the current map time limit in seconds. dvander@1414: * dvander@1414: * @return Time limit, in seconds, or dvander@1414: * 0 if there is no limit. dvander@1414: */ dvander@1414: virtual int GetMapTimeLimit() =0; dvander@1414: dvander@1414: /** dvander@1414: * Extends the map limit (either positively or negatively) in seconds. dvander@1414: * dvander@1414: * @param extra_time Time to extend map by. If 0, the map will dvander@1414: * be set to have no time limit. dvander@1414: */ dvander@1414: virtual void ExtendMapTimeLimit(int extra_time) =0; dvander@1414: dvander@1414: /** dvander@1414: * Tells the map timer whether it is being used or not. dvander@1414: * dvander@1414: * Map timers are automatically enabled when they are set, and dvander@1414: * automatically disabled if being un-set. dvander@1414: * dvander@1414: * @param enabled True if enabling, false if disabling. dvander@1414: */ dvander@1414: virtual void SetMapTimerStatus(bool enabled) =0; dvander@1414: }; dvander@1407: dvander@564: /** dvander@564: * @brief Event callbacks for when a timer is executed. dvander@564: */ dvander@564: class ITimedEvent dvander@564: { dvander@564: public: dvander@564: /** dvander@564: * @brief Called when a timer is executed. dvander@564: * dvander@564: * @param pTimer Pointer to the timer instance. dvander@564: * @param pData Private pointer passed from host. faluco@587: * @return Pl_Stop to stop timer, Pl_Continue to continue. dvander@564: */ dvander@564: virtual ResultType OnTimer(ITimer *pTimer, void *pData) =0; dvander@564: dvander@564: /** dvander@564: * @brief Called when the timer has been killed. dvander@564: * dvander@564: * @param pTimer Pointer to the timer instance. dvander@564: * @param pData Private data pointer passed from host. dvander@564: */ faluco@587: virtual void OnTimerEnd(ITimer *pTimer, void *pData) =0; dvander@564: }; dvander@564: dvander@1108: #define TIMER_FLAG_REPEAT (1<<0) /**< Timer will repeat until stopped */ dvander@1108: #define TIMER_FLAG_NO_MAPCHANGE (1<<1) /**< Timer will not carry over mapchanges */ dvander@564: dvander@564: class ITimerSystem : public SMInterface dvander@564: { dvander@564: public: dvander@564: const char *GetInterfaceName() dvander@564: { dvander@564: return SMINTERFACE_TIMERSYS_NAME; dvander@564: } dvander@564: unsigned int GetInterfaceVersion() dvander@564: { dvander@564: return SMINTERFACE_TIMERSYS_VERSION; dvander@564: } dvander@564: public: dvander@564: /** dvander@564: * @brief Creates a timed event. dvander@564: * dvander@564: * @param pCallbacks Pointer to ITimedEvent callbacks. dvander@564: * @param fInterval Interval, in seconds, of the timed event to occur. dvander@564: * The smallest allowed interval is 0.1 seconds. dvander@564: * @param pData Private data to pass on to the timer. dvander@564: * @param flags Extra flags to pass on to the timer. dvander@1407: * @return An ITimer pointer on success, NULL on dvander@1407: * failure. dvander@564: */ dvander@564: virtual ITimer *CreateTimer(ITimedEvent *pCallbacks, dvander@564: float fInterval, dvander@564: void *pData, dvander@564: int flags) =0; dvander@564: dvander@564: /** dvander@564: * @brief Kills a timer. dvander@564: * dvander@564: * @param pTimer Pointer to the ITimer structure. dvander@564: * @return dvander@564: */ dvander@564: virtual void KillTimer(ITimer *pTimer) =0; dvander@564: dvander@564: /** dvander@564: * @brief Arbitrarily fires a timer. If the timer is not a repeating dvander@564: * timer, this will also kill the timer. dvander@564: * dvander@564: * @param pTimer Pointer to the ITimer structure. dvander@564: * @param delayExec If true, and the timer is repeating, the dvander@1407: * next execution will be delayed by its dvander@1407: * interval. dvander@564: * @return dvander@564: */ dvander@564: virtual void FireTimerOnce(ITimer *pTimer, bool delayExec=false) =0; dvander@1407: dvander@1407: /** dvander@1414: * @brief Sets the interface for dealing with map time limits. dvander@1407: * dvander@1414: * @param pMapTimer Map timer interface pointer. dvander@1414: * @return Old pointer. dvander@1407: */ dvander@1414: virtual IMapTimer *SetMapTimer(IMapTimer *pTimer) =0; dvander@1414: dvander@1414: /** dvander@1415: * @brief Notification that the map's time left has changed dvander@1415: * via a change in the time limit or a change in the game rules ( dvander@1415: * such as mp_restartgame). dvander@1415: */ dvander@1415: virtual void MapTimeLeftChanged() =0; dvander@1415: dvander@1415: /** dvander@1415: * @brief Returns the current universal tick time. This dvander@1415: * replacement for gpGlobals->curtime and engine->Time() correctly dvander@1415: * keeps track of ticks. dvander@1414: * dvander@1415: * During simulation, it is incremented by the difference between dvander@1415: * gpGlobals->curtime and the last simulated tick. Otherwise, dvander@1415: * it is incremented by the interval per tick. dvander@1415: * dvander@1415: * It is not reset past map changes. dvander@1415: * dvander@1415: * @return Universal ticked time. dvander@1414: */ dvander@1415: virtual float GetTickedTime() =0; dvander@1459: dvander@1459: /** dvander@1459: * @brief Notification that the "starting point" in the game has has dvander@1459: * changed. This does not invoke MapTimeLeftChanged() automatically. dvander@1459: * dvander@1459: * @param offset Optional offset to add to the new time. dvander@1459: */ dvander@1459: virtual void NotifyOfGameStart(float offset = 0.0f) =0; dvander@1459: dvander@1459: /** dvander@1459: * @brief Returns the time left in the map. dvander@1459: * dvander@1459: * @param pTime Pointer to store time left, in seconds. dvander@1462: * If there is no time limit, the number will dvander@1462: * be below 0. dvander@1462: * @return True on success, false if no support. dvander@1459: */ dvander@1459: virtual bool GetMapTimeLeft(float *pTime) =0; dvander@564: }; dvander@564: } dvander@564: dvander@564: #endif //_INCLUDE_SOURCEMOD_TIMER_SYSTEM_H_