Browse docs

Combined Jobs

Use Fire and Ambulance features with one framework job while keeping fire-station and hospital offers separate.

One job, both services

A framework job such as firefighter can be registered in both sky_firejob and sky_ambulancejob. Employees keep that job while using both services. Both resources must be running, and their normal duty, grade, item and feature requirements still apply.

This guide requires the combined-job update in Jobs Base, Fire and Ambulance. Older versions can overwrite catalogs or hide a group-filtered tablet app when the other resource registers the same job. Changing resource start order does not solve that problem.

DataOwnership
Employees, ranks, permissions, society balance and dutyOne shared framework organization
Organization settings, sharing, Dispatch configuration and Training settingsThe selected primary registration
Hospital shop, vehicle offers, trunk defaults, storage and locker limitsThe hospital creator's Ambulance job definition
Fire-station shop, vehicle offers, trunk defaults, storage and locker limitsThe fire creator's Fire job definition
Purchased vehicles and stored itemsTheir existing station IDs
Fire and medical tablet apps / interactionsAll registered job groups, subject to permissions

Locations belonging to the same creator group and the same configured job use that definition's catalog. This does not add a separate catalog editor for each individual building.

1. Register the same technical job name

In /jobconfig, open Fire and configure the actual framework job, for example firefighter. Then open Ambulance and add or duplicate a medical job entry using exactly firefighter. Keep the vehicle and shop lists appropriate for each resource.

firefighter is the framework job name in this example. fire and ambulance are the Sky job group keys. They do not have to match the framework job name.

Existing entries can be edited directly under General: change Job name, Off-duty job or Society account, then save. The entry keeps its configurator ID, shop, vehicles and other settings. Changing the job name changes which framework job this configuration applies to; it does not rename a framework job, move employees or transfer stored organization data. Society and off-duty values remain as entered and are not automatically derived again for existing entries. Assign locations to the desired job separately in the creator. With the configurator disabled, use the same name in both resources' Config.Jobs lists instead.

Adding firefighter only to a hospital's additional jobs grants location access. Registering it in Ambulance is what gives it the medical job features.

2. Select the shared organization owner

Set the primary group in sky_jobs_base/config/config.lua:

Config.PrimaryJobGroups = {
    ["firefighter"] = "fire",
}

The Fire registration now controls the shared society account, management options, sharing, duty settings, and Dispatch/Training job configuration. Configure the combined fleet's Dispatch vehicles, channels and statuses in that primary job entry. Edit shared Dispatch reporters there as well. The Ambulance registration still supplies its medical features and hospital catalogs.

Choose "ambulance" if the medical registration should own the shared organization settings. Without an explicit selection, the alphabetically first registered group is used; for Fire plus Ambulance this is ambulance. If the primary resource stops, the remaining registration becomes primary until the selected resource returns.

This setting belongs to Jobs Base because it selects ownership across resources. It is not a per-resource /jobconfig setting. Apply changes during your normal resource/server restart.

Use the same society account and off-duty job pair in both entries so temporary resource stops do not switch the organization to a different account or duty mapping. For an off-duty pair, both framework jobs and their employee grades must exist.

3. Assign the locations and their catalogs

Use /firecreator for fire stations and /hospitalcreator for hospitals. Assign each location to the shared job and position its shop, garage, storage and locker points as needed.

Edit the Fire job's shop and vehicles in the Fire configurator; edit medical supplies and ambulances in the Ambulance configurator. A fire station then offers Fire items and vehicles, while the hospital offers the Ambulance list. An empty list stays empty for its own service.

The same item or vehicle model can exist in both lists at different prices, grades, liveries or trunk configurations. Purchases use the server's catalog for the selected location. A client cannot purchase a Fire-only catalog entry through a hospital garage or submit a cheaper price.

Existing vehicles keep their station, plate and catalog IDs. This update does not require SQL changes or deletion of inventories. Custom integrations that use station IDs without creator context continue to use the primary job's catalog.

4. Enable the desired tablet and dispatch mode

Both Fire reports and medical apps can be available to the same employee. Check their permissions and the corresponding feature switches if an app is missing.

For the modern Dispatch App, enable Config.Dispatch.enabled in Jobs Base and configure access for the actual job in your dispatch setup. Setting this to false disables the modern app; legacyAlertBanner = true provides legacy notifications and does not enable that app.

In Ambulance → Deathscreen → Dispatch, set Alerted jobs to the actual recipients. Hospital additional-job access does not update this list. To always alert both independent services:

-- Ambulance config.lua, when /jobconfig is disabled:
Config.DeathScreen.Dispatch.jobs = { "ambulance", "firefighter" }
Config.DeathScreen.Dispatch.fallbackJobs = {}

Use your framework job names. A group selector is expanded only when it is not also a registered job name; exact job names avoid ambiguity.

5. Optional: Fire covers medical calls when no medic is available

Set Alerted jobs to the regular medical job and Fallback jobs to the combined Fire job:

Config.DeathScreen.Dispatch.jobs = { "ambulance" }
Config.DeathScreen.Dispatch.fallbackJobs = { "firefighter" }

With /jobconfig enabled, save these values there rather than editing the plaintext defaults. The server checks availability when the downed player requests help:

  • A living, on-duty player in a primary recipient job is available: alert the primary jobs.
  • None is available: alert the fallback jobs instead.
  • An empty fallback list preserves normal routing, even when no primary recipient is available.

The requesting patient does not count as an available responder. This is a dispatch-routing rule: registering Fire in Ambulance grants medical features continuously. It does not revoke Fire's treatment permissions when a regular medic logs in, or reroute an already submitted call. Custom client dispatch hooks handle their own routing; the default server hook receives the selected recipients and can also be customized.

Verify the setup in game

Use two players: one patient and one living, on-duty responder. A downed employee cannot count as their own medic. The medic display also requires the Ambulance job entry's countsAsMedic setting to be enabled.

  1. Keep firefighter assigned and confirm Fire reports and medical features are available.
  2. Open both shops and garages; compare their different offers, prices and variants.
  3. Buy, store and retrieve one vehicle at each location; check its equipment and customization.
  4. Change only the hospital catalog in /jobconfig; verify that Fire offers remain unchanged.
  5. Check duty changes and the shared society balance from both locations.
  6. For fallback dispatch, repeat with a living medic on duty, then off duty, then downed.
  7. After a normal restart, verify both catalogs and the previously purchased vehicles again.

The message no medics available alone does not disable the dispatch button. If no alert arrives, check recipient job names, duty, Dispatch mode/access and any custom dispatch hook.