Visit
Requires the player to arrive at one of the listed monuments.
{ "type": "Visit", "title": "Visit Launch Site", "description": "Get inside the grounds. Mind the radiation.", "amountRequired": 1, "monuments": ["launch_site_1"], "conditions": {}}Fields
Section titled “Fields”| Field | Type | Description |
|---|---|---|
type | string | Exactly 'Visit' |
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 arrivals are required. When requiring more than one, pair the objective with a cooldown, otherwise players can simply enter/leave/enter the same monument to farm arrivals. |
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. |
monuments | string[] | The monuments that count as arrival targets. Each entry is matched case-insensitively against a monument's short name (such as 'launch_site_1' or 'oilrig_1') or its Monument Finder alias (such as 'TrainStation'). An empty list means arriving at any monument counts. |
What counts as an arrival
Section titled “What counts as an arrival”The plugin checks each tracked player’s position about once a second against the combined bounds of every listed monument, treated as one area.
- An arrival is going from fully outside to inside a monument. Overlapping or nested bounds never re-credit: a player moving from a train tunnel up into Launch Site, with both listed, has never left the union, so nothing new counts.
- Standing inside already counts. Tracking starts fresh when the objective activates, when the player connects, and when the plugin reloads. A player inside the bounds at that moment credits one arrival at the first check. This is deliberate: “I’m already here” should count.
- Any way in counts. Walking, flying, respawning at a bag inside the bounds, teleporting in. There is no movement requirement, only the outside-to-inside transition (or presence at tracking start).
- Leaving is required between arrivals. To credit again, the player must exit the whole union first, then come back in. The same monument is repeatable, and arrivals are never counted per distinct monument.
Pair multiple visits with a Cooldown
Section titled “Pair multiple visits with a Cooldown”When amountRequired is above 1, stepping out of the bounds and straight back in credits another arrival. That is by design, so that you have freedom over pacing, but it makes unpaced multi-visit objectives trivial to farm at a monument’s edge. Add a Cooldown such as 1 per 300 seconds so each visit has to stand on its own. The editor shows a non-blocking warning for multi-visit objectives without one.
Touring several monuments
Section titled “Touring several monuments”Arrivals are counted against the union of the list, never per distinct monument. To send players on a tour, author a Sequential contract whose objectives are single-monument Visits: “Visit Launch Site”, then “Visit The Dome”, then “Visit the Airfield”. Each step reads as clear guidance and completes in order.
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.
- Detection lags reality by up to one check (~1 second). A player clipping a monument corner between checks may not credit.
- Respawning or teleporting into the bounds counts as an arrival, and a reconnect or plugin reload while standing inside credits again. Cooldown paces these like any other re-entry.
