Timer Manager

The timer manager object provides library support for calling functions with a time interval i.e. waiting one second before calling a function. It is loaded in all game modes and provides similar but not identical functionality in each.

It is rare for game scripts to need direct access to the timer manager. The timer manager is automatically created as the script libraries are loaded, and both the battle_manager and campaign_manager provide pass-through functions to the timer manager which game scripts typically use instead of calling the timer manager directly. For the campaign these functions are documented in the Timer Callbacks section of this documentation, and in battle they are documented here: Timer Callbacks.

Direct access to the timer manager might be more useful for frontend scripts, but they are rarer in themselves. The core function core:get_tm can be used to get a handle to the timer manager after it has been created.

Loaded in Campaign Loaded in Campaign
Loaded in Battle Loaded in Battle
Loaded in Frontend Loaded in Frontend
Back to top

Campaign

The campaign construction function timer_manager:new_campaign is automatically called by the campaign_manager during the loading sequence (when the WorldCreated model event is received), so there should be no need for client scripts to call it.

The mechanics of the underlying campaign model timing system is very different to the equivalent system in battle. As such, the campaign constructor provides versions of timer_manager:callback, timer_manager:repeat_callback and timer_manager:remove_callback which are different from those provided in battle. The usage of the campaign version of these functions is the same as for battle, with the key difference that model time in campaign is expressed in seconds in campaign and milliseconds in battle. Real Timers use milliseconds in all game modes.

During the end-turn sequence the update rate of the campaign model can accelerate wildly. This will cause a function registered to be called after five seconds to happen near-instantly during the end turn sequence, for example. To ameliorate this effect, the timer manager will automatically check the real world time once the interval has completed. If the real world time is less than would be expected then the callback is retried repeatedly until the real world interval has elapsed. This behaviour is only active in singleplayer mode as it would cause desyncs in multiplayer.

timer_manager:new_campaign(game_interface game interface)

Creates and returns a timer manager in campaign. This function should be supplied a game_interface, which requires that it is created when the NewSession script event is received (or later). The timer manager is automatically created by the campaign_manager so there should be no need for game scripts to call this function.

Parameters:

1

game_interface

game interface

Returns:

  1. timer_manager timer manager

defined in ../../Warhammer/working_data/script/_lib/lib_timer_manager.lua, line 62

Back to top

Battle

The battle-specific constructor timer_manager:new_battle is automatically called by the battle_manager when it is created, so there should be no need for client scripts to call it.

The mechanics of the underlying battle model timing system is very different to the equivalent system in campaign. Therefore, the battle constructor provides versions of timer_manager:callback, timer_manager:repeat_callback and timer_manager:remove_callback which are different from those provided in campaign. The usage of these functions is the same in battle and campaign, with the key difference that model time in campaign is expressed in seconds in campaign and milliseconds in battle. Real Timers use milliseconds in all game modes.

timer_manager:new_battle(battle battle interface)

Creates and returns a timer manager in battle. This function should be supplied a battle game object. The timer manager is automatically created by the battle_manager so there should be no need for game scripts to call this function.

Parameters:

1

battle

battle interface

Returns:

  1. timer_manager timer manager

defined in ../../Warhammer/working_data/script/_lib/lib_timer_manager.lua, line 241

Back to top

Frontend

The frontend-specific constructor timer_manager:new_frontend is automatically called in lib_header.lua as it's loaded, so there should be no need for client scripts to call it.

There is no game model to provide timer functionality in the frontend, so only the real timer is available. The frontend-specific constructor creates timer_manager:callback, timer_manager:repeat_callback and timer_manager:remove_callback functions but these remap to timer_manager:real_callback, timer_manager:repeat_real_callback and timer_manager:remove_callback respectively.

timer_manager:new_frontend()

Creates and returns a timer manager in frontend.

Returns:

  1. timer_manager timer manager

defined in ../../Warhammer/working_data/script/_lib/lib_timer_manager.lua, line 400

Back to top

Model Timers

Model timers are synchronised to the game model in campaign and battle. They are the main timers used by game scripts. Both the campaign manager and battle manager provide pass-through interfaces to the functionality documented here - see Timer Callbacks (campaign) and Timer Callbacks (battle). It is intended that game scripts call these pass-through functions rather than the timer manager itself.

When a callback is created with an interval of one second, then the callback function would be called as part of a model update where at least one second of model time has elapsed. This means:

  • Model timers are confined to the resolution of the game model update, which is currently between 100ms and 200ms. A model timer callback with an interval of 250ms, for example, would not be called until the following model tick, at 300-400ms after the callback was created.
  • Model updates will speed up and slow down in battle if the player changes their battle speed, and also speed up a lot during the end turn sequence in battle. Model updates are also stopped when the game is paused. For these reasons a model timer callback of one second cannot be relied on to trigger after one second has passed in the real world. See Real Timers for callback functions linked to a timer synchronised to real time.
  • As model updates are synchronised between all clients in a multiplayer game, so too are model timers.
  • There is no game model present in the frontend, so only real timers are available. The functions timer_manager:callback, timer_manager:repeat_callback and timer_manager:remove_callback are available in the frontend but will redirect to the real timer equivalents.

It is strongly recommended that game scripts rely on model timers as their primary mode of script timing, and only use real timers in certain specific situations, usually to do with UI manipulation.

timer_manager:callback(function callback, number interval, [string name])

Adds a model callback to be called after the supplied interval has elapsed.

Parameters:

1

function

Callback to call.

2

number

Interval after which to call the callback. This should be in milliseconds in battle and in the frontend, and in seconds in campaign.

3

string

optional, default value=nil

Callback name, by which it may be later removed with timer_manager:remove_callback. If omitted the callback may not be cancelled.

Returns:

  1. nil

defined in ../../Warhammer/working_data/script/_lib/lib_timer_manager.lua, line 456

timer_manager:repeat_callback(function callback, number interval, [string name])

Adds a repeating model callback to be called each time the supplied interval elapses.

Parameters:

1

function

Callback to call.

2

number

Interval after which to call the callback. This should be in milliseconds in battle and in the frontend, and in seconds in campaign.

3

string

optional, default value=nil

Callback name, by which it may be later removed with timer_manager:remove_callback. If omitted the repeating callback may not be cancelled.

Returns:

  1. nil

defined in ../../Warhammer/working_data/script/_lib/lib_timer_manager.lua, line 464

timer_manager:remove_callback(string name)

Removes a real callback previously added with timer_manager:callback or timer_manager:repeat_callback by name. All callbacks with a name matching that supplied will be cancelled and removed.

Parameters:

1

string

Name of callback to remove.

Returns:

  1. nil

defined in ../../Warhammer/working_data/script/_lib/lib_timer_manager.lua, line 471

Back to top

Real Timers

Real timers are synchronised to user-interface updates rather than game model updates, like Model Timers. In practice, this means:

  • Real timers continue to tick and will call their callback even if model updates are paused (e.g. the game is paused in battle).
  • Real timers do not change speed with the model (in battle, and also in campaign during the end-turn sequence).
  • Real timers can have a resolution greater than a model tick (100-200ms).
  • Real timers have a variable resolution - as the frame rate changes, so does the frequency with which real timers get checked.
  • Real timers work in the frontend where no game model is present.
  • Synchronicity between different clients in a multiplayer game cannot be guaranteed (and is highly unlikely to be achieved).
  • Due to the lack of synchronisation between the real timer and the model, the latter may not be in a suitable state to be queried when a real timer is called.

It is strongly recommended that game scripts rely on model timers as their primary mode of script timing, and only use real timers in certain specific situations, usually to do with UI manipulation.

timer_manager:real_callback(function callback, number interval, [string name])

Adds a real callback to be called after the supplied interval has elapsed.

Parameters:

1

function

Callback to call.

2

number

Interval after which to call the callback. This should be in milliseconds, regardless of game mode.

3

string

optional, default value=nil

Callback name, by which it may be later removed with timer_manager:remove_real_callback. If omitted the callback may not be cancelled.

Returns:

  1. nil

defined in ../../Warhammer/working_data/script/_lib/lib_timer_manager.lua, line 547

timer_manager:repeat_real_callback(function callback, number interval, [string name])

Adds a repeating real callback to be called each time the supplied interval elapses.

Parameters:

1

function

Callback to call.

2

number

Repeating interval after which to call the callback. This should be in milliseconds, regardless of game mode.

3

string

optional, default value=nil

Callback name, by which it may be later removed with timer_manager:remove_real_callback. If omitted the repeating callback may not be cancelled.

Returns:

  1. nil

defined in ../../Warhammer/working_data/script/_lib/lib_timer_manager.lua, line 565

timer_manager:remove_real_callback(string name)

Removes a real callback previously added with timer_manager:real_callback or timer_manager:repeat_real_callback by name. All callbacks with a name matching that supplied will be cancelled and removed.

Parameters:

1

string

Name of callback to remove.

Returns:

  1. nil

defined in ../../Warhammer/working_data/script/_lib/lib_timer_manager.lua, line 579

Last updated 12/08/2022 11:56:59