Playtime
Requires the player to play an amount of minutes on the server. A minute counts while the player is connected, alive and awake.
{ "type": "Playtime", "title": "Play 1 hour", "description": "Time counts while you are connected, alive and awake. Sleeping does not.", "amountRequired": 60, "conditions": {}}Fields
Section titled “Fields”| Field | Type | Description |
|---|---|---|
type | string | Exactly 'Playtime' |
title | string | Short, human-readable name. Must not be empty. |
description | string | A blurb of 1 to 3 sentences. May be empty if the title is self-explanatory. |
amountRequired | integer (≥ 1) | How many minutes of play the player must play on the server. When a burst is present, this counts completed bursts instead of minutes. |
cooldown | object | null | Optional pacing limit on how fast progress adds up: at most maxAmount units of progress count in any sliding window of windowSeconds. Absent means progress adds up freely. While the window's budget is used up, further progress is ignored and the player sees a countdown to the next available moment. |
burst | object | null | Optional clustering requirement: actions only count when they arrive clustered, at least amount units within one trailing window of windowSeconds forming one burst. When present, amountRequired counts completed bursts instead of raw actions. Actions that age out of the window without completing a burst never count. Absent means no clustering. |
conditions | map | Optional conditions that restrict when progress counts. Progress is recorded only when the objective's main requirement and all of these conditions are met. Use an empty map for none. |
hideDetails | boolean | When true, hides this objective's in-game condition strip and details popup, so the description is the only explanation players get. Title, description and progress still show. Absent means false. |
What counts as playing
Section titled “What counts as playing”The plugin samples each tracked player about once a second and credits one progress point per full minute of qualifying time.
- Connected, alive and awake. All three at once. The respawn screen and sleeping do not count.
- Idle time counts. A player standing still in their base is still playing. There is no AFK detection today, but integrating the AFKAPI plugin is a possible future addition.
- Only whole minutes are credited. Partial minutes carry over in memory between samples.
Conditions filter moment to moment
Section titled “Conditions filter moment to moment”Conditions are checked at each ~1 second sample, and only qualifying seconds accumulate toward the next minute. “Spend an hour at Launch Site” is Playtime plus a Monument condition: seconds outside the monument simply do not count, however long the player stays online.
Pacing
Section titled “Pacing”Each credited minute is one action, so Cooldown and Burst can be combined to defined play schedules. This means you can use Playtime to express “play an hour a day, 7 days” or “play 2 hours in one sitting, once a week”. This is kind of an unexpected side-effect of the objective that made the planned Connect objective unnecessary and scoped out of the roadmap.
{ "type": "Playtime", "title": "Play an hour a day, 7 days", "description": "A full hour of play within a day counts once. Do it seven times.", "amountRequired": 7, "burst": { "amount": 60, "windowSeconds": 86400 }, "cooldown": { "maxAmount": 1, "windowSeconds": 86400 }}The burst turns 60 minutes inside a 24 hour window into one completed burst, the cooldown caps it at one burst per 24 hours, and amountRequired: 7 asks for seven of them. A plain cooldown alone also works: maxAmount: 30, windowSeconds: 86400 caps credit at 30 minutes a day.
Sampling efficiency
Some objectives cannot be driven by a game event, because the game never announces “this player moved 12 meters” or “this player walked into Launch Site”. Progress for those has to be measured by checking on players directly, about once a second.
Contracts does that in a single shared pass for every objective that needs it, not one pass per objective:
- Nothing runs unless something needs it. The pass only exists while the current rotation actually contains an objective that depends on it. Rotate those out and it stops completely.
- More objectives do not mean more work per player. A dozen Travel and Visit objectives spread across your categories are all served by the same pass, which reads each player once and hands that one reading to whichever objectives care.
- The expensive checks are narrow. Reading a position is cheap; the heavier work, like monument bounds and condition checks, only happens for players who have one of these objectives active and unfinished.
At this time, the Travel, Visit and Playtime objectives use this sampling pass.
- Progress ticks about once a minute while the player qualifies, so the UI advances in whole-minute steps.
amountRequiredis in minutes. In the editor you type it as a natural-language duration such as1h 30mor90. A bare number means minutes.
