Skip to content
Contractsv1.7.0

Travel

⭐ Premium

Requires the player to cover distance, measured in meters of world displacement. Any means of getting around counts: walking, sprinting, swimming, riding a horse, driving, flying, falling.

{
"type": "Travel",
"title": "Saddle up",
"description": "Distance only counts while you are in the saddle.",
"amountRequired": 2500,
"conditions": {
"mount_condition": {
"type": "PlayerMount",
"mounts": ["ridablehorse"]
}
}
}
FieldTypeDescription
typestringExactly 'Travel'
titlestringShort, human-readable name. Must not be empty.
descriptionstringA blurb of 1 to 3 sentences. May be empty if the title is self-explanatory.
amountRequiredinteger (≥ 1)How many meters of world distance the player must cover.
cooldownobject | nullOptional 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.
burstobject | nullOptional 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.
conditionsmapOptional 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.
hideDetailsbooleanWhen 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.

The plugin samples each tracked player’s world position about once a second and credits the straight-line distance between consecutive samples.

  • Distance is 3D. Vertical movement counts: climbing a ladder, ballooning up, diving down, falling.
  • Any means counts. On foot, mounted, swimming, gliding, and even being carried: a player standing on a moving cargo ship deck still gains travel distance, because they really are moving through the world.
  • Only whole meters are credited. Leftover fractions carry over in memory between samples.
  • Teleports. A jump between samples too fast to be legitimate movement is dropped entirely. The plugin hardcodes a threshold of 150 meters per second. Moving faster than that is considered a teleport.
  • Death. Dying and respawning never credits the distance to the respawn point, however close the bag.

Pair Travel with the PlayerMount condition for by-vehicle contracts: “travel 2500m on horseback” is Travel plus PlayerMount ridablehorse, “cross 4000m by boat” is Travel plus PlayerMount with boat entities. Conditions are checked at each sample, so mounting or dismounting mid-segment misattributes at most about a second of travel.

A PlayerMovement condition covering on-foot, swimming and falling states is planned but not available yet.

Each sampled segment is one action worth its length in meters, so Cooldown and Burst compose naturally: “sprint 50m within 10s, 5 times” is a Travel objective with a burst of 50 in a 10 second window and amountRequired: 5.

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 second while the player is moving, and completion can land mid-journey between UI refreshes.