# Calls & messages

Contacts, NovaDrop, calls and group calls, emergency dispatch, messages, voicemail, payphones and Radio.

## Before making a call

Normal calls and messages need an activated, enabled SIM with coverage and a usable carrier plan. Messages also need mobile data, or Wi-Fi. Install and start `pma-voice`, the only voice resource Wolfden Phone supports. Without it, calls connect but nobody hears anything:

```cfg
ensure pma-voice
ensure wd_phone
```

Wolfden Phone Pro users can choose default call and message lines in **SIM Manager → Lines**, or choose a line each time.

## Contacts

Contacts is a tab in the Phone app, between Calls and Keypad, and the Contacts icon opens Phone on it. Add names, several numbers per contact, a company and a photo. Players can mark favourites, fill in their own **My Card**, and call or message contacts directly.

Contacts belong to the phone's Nova Account, so they appear on every phone signed in to it and work without a SIM. Without an account, they stay on the phone.

## NovaDrop

**NovaDrop** shares things with someone standing nearby: contacts and My Card, photos and videos from Gallery, and songs or playlists from Music. The other player sees an Accept / Decline prompt, and nothing is saved until they accept.

- It works within 8 metres and needs no SIM on either phone. Only sharing My Card needs one, since the card carries the phone's number.
- Players choose who may send to them in Settings → Phone & Messages → NovaDrop: Receiving Off, Contacts Only or Everyone (the default).
- Nova Wallet uses the same nearby list to pay someone standing next to you.

Change the range and limits in `Config.NovaDrop` in `config/communication.lua`.

## Calls

Use the Phone app's Keypad, a contact or Recents. The Keypad takes a copied number too: press **Ctrl+V**, or tap the number field and then **Paste**. A carried phone rings even when it is closed:

- With the phone put away, the top of the call screen peeks up from the bottom. **Y** answers and **N** declines, and the player keeps moving. The open-phone key brings the whole phone up. Set `autoOpenIncomingCall = true` in `Config.Calls` to bring the phone to hand for every incoming call instead, or `openPhoneOnAnswer = true` to open it when the player answers with **Y**.
- During a call the character holds the phone to their ear, and players can use other apps while it continues.
- Players within 15 metres hear a phone ring, in that phone's ringtone, unless it is on Silent or Do Not Disturb. Either volume button silences the ring.
- **Speakerphone** lets players standing within a few metres hear the other side, and be heard by them.
- **Mute** stops the other side hearing you; your normal voice chat is unaffected.
- A call that cannot connect says why, such as no signal, airplane mode, no credit, busy or a suspended line.
- A phone that is turned off, out of battery or out of service does not ring. The caller hears that it is unavailable, and it shows as a missed call. See [Voicemail](#voicemail).
- A call ends when the player dies or the phone leaves their inventory. Turn this off with `endCallOnDeath` and `endCallOnPhoneRemoval` in `Config.CommunicationRestrictions`.

Signal affects call quality. No Service prevents normal calls, and an active call drops when either side loses coverage. [Video calls](#/docs/wd_phone/video-calls) need a relay set up first.

**Caller ID.** Players can hide their number for all calls or the next one. The receiver sees "Unknown Caller", but the server always records the real caller. Calls from a Ghost Mobile burner eSIM always hide the number. Set `anonymousCalls = false` in `Config.Calls` to stop players hiding their number; burners still hide theirs.

**Several phones.** Each phone a player carries rings for its own SIMs, and the call screen says which phone is ringing. A player can be on one call at a time. There is no call waiting: a second caller hears that the line is busy.

**Recents.** Up to eight favourite contacts show as tiles above the list; tapping one calls it. The menu filters Recents to all calls or missed calls, opens Voicemail, and clears the history. **Edit** deletes single calls. Each row can call back or video call back.

## Group calls

Up to eight people can share one call, and up to four on video.

- **Call a group.** In a group conversation in Messages, choose **Group call** or **Group video call**. Every member's phone rings.
- **Add someone.** During any call, **Add** rings another number into it.
- **Join.** While a group conversation has a live call, its members can **Join** it from the conversation.
- **People** lists everyone in the call. Invites a player sent can be cancelled while they still ring.

The call goes on as long as two people are in it. Leaving or declining only takes that person out. A missed invite shows a "Missed group call" notification, without voicemail, and Recents shows one row per group call.

**Who pays.** Whoever rang a person pays that person's minutes, and someone who joins by themselves pays their own. On a group video call, each person pays their own data. A person whose credit or data runs out, or who loses service, drops out alone.

Payphone, emergency and collect calls stay between two people. Wolfden Phone Secure phones only share group calls with other Wolfden Phone Secure phones.

Change the limits, or turn Add and Join off, in `Config.GroupCalls` in `config/communication.lua`:

| Setting | Default | What it does |
| --- | --- | --- |
| `enabled` | `true` | Group calls on or off |
| `maxParticipants` | `8` | People in one call, ringing invites included |
| `maxVideoParticipants` | `4` | People in one video call. Every phone sends a picture to each other person, so keep it small |
| `addToCall` | `true` | The **Add** button on a live call |
| `joinOngoing` | `true` | **Join** a group conversation's live call |

Group video calls use the same relay as [Video calls](#/docs/wd_phone/video-calls).

## Emergency calls and dispatch

Emergency numbers work without a SIM, credit or signal, and from payphones for free. `911` is set up by default. Add or change numbers in `Config.EmergencyNumbers` in `config/signal.lua`. Each player can make five emergency calls a minute (`Config.EmergencyRateLimit`).

An emergency call does not reach another player. The call screen shows it as connected, but nobody is on the line: the call is logged, sends an alert to your dispatch resource, and fires the `wd_phone:server:emergencyCall` server event for your own scripts.

Emergency calls, and requests from the [Services](#/docs/wd_phone/productivity?section=services) app, can also send an alert to your police and EMS dispatch resource. Wolfden Phone finds a supported one by itself:

| Provider | Resource |
| --- | --- |
| `ps-dispatch` | Project Sloth ps-dispatch (v2 and v3) |
| `cd_dispatch3d` | Codesign Dispatch 3D |
| `cd_dispatch` | Codesign Dispatch |
| `qs-dispatch` | Quasar Dispatch & MDT |
| `rcore_dispatch` | rcore Dispatch |
| `core_dispatch` | C8RE Core Dispatch |
| `lb-tablet` | LB Tablet MDT dispatch |

With `auto`, the default, it uses the first of these that is running. To force one, or turn alerts off with `none`, set it in `config/dispatch.lua` or in `server.cfg`, which wins:

```cfg server.cfg
set wd_phone:dispatch "auto"
```

- The alert carries the caller's position, read by the server, and the street name.
- The caller's number is only sent when they show it. It is left out for a hidden caller ID, Wolfden Phone Secure, Ghost Mobile and anonymous requests. A payphone sends its own number.
- Each player sends at most one emergency alert every 10 seconds (`cooldownSeconds`).

Edit `config/dispatch.lua` to change what is sent:

| Setting | Default | What it does |
| --- | --- | --- |
| `provider` | `auto` | The dispatch resource, `none`, or one of the names above |
| `mode` | `both` | For Services requests: `both` keeps them in the Services app and sends an alert, `external` sends the alert only, `nova` never sends one |
| `emergencyCalls` | `true` | Send an alert for emergency calls |
| `emergency` | `911` alert | The jobs, code, title, message, priority and blip for each emergency number |
| `services` | `police` and `ambulance` | The same for each Service. Services not listed here never send an alert |
| `cooldownSeconds` | `10` | One emergency alert per player per this many seconds |

With `auto`, the resources are tried in the order of the `order` list. A service in `services` can set its own `mode`. With `external`, a request goes to the dispatch resource only and no longer shows for employees in the Services app. If no dispatch resource is running, nothing is lost: requests stay in the Services app.

Other dispatch scripts can be connected by a developer; see [Exports & integrations](#/docs/wd_phone/exports).

## Messages and groups

Open Messages, choose a contact or enter a number, and send your message. Players can create group chats of up to 25 people and send photos and videos (from Gallery or taken in the chat), locations, contacts, and songs, playlists and stations from Music. Links such as Nova Wallet pay links and posts shared from the social apps show as cards that open the right app.

- Delivery and read indicators show message status.
- The bell in a conversation mutes it, so it sends no notifications.
- Messages wait for the recipient to have service. Weak signal on either side delays them.
- A message that stays undelivered for 60 seconds is marked **Not Delivered**, with Retry.
- Press and hold, or right-click, a message to retry a failed send or delete it for yourself.

Deleting for yourself does not remove another person's conversation history. Sending photos and videos needs a [media host](#/docs/wd_phone/media).

**Groups.** The player who creates a group owns it: they rename it and add or remove members in its info screen. Everyone can leave, call or video call the group, and mute it. To leave, the owner first hands the group to another member, or deletes it for everyone. The conversation notes who joined, left, was added or removed, and renames.

**Privacy.** In Settings → Phone & Messages, each player can turn off **Read Receipts**, **Typing Indicators**, **Delivery Status**, and **Message Previews** and **Group Previews** in notifications. The server enforces each one.

## Blocking

Players can block a number from its contact card, or add any number in Settings → Phone & Messages → Blocked Numbers. A blocked number's messages are never delivered, its typing never shows, and its calls do not ring: the caller hears that the phone is unavailable. Set `blockedCallBehavior = 'busy'` in `Config.Blocking` to make them hear busy instead. Check the block list if one person cannot contact another while other calls and messages work.

## Voicemail

The Phone app includes a voicemail inbox with playback controls, an optional transcript and a notification for each new voicemail. Dialing the carrier's mailbox number (`555-0000` for Nova Mobile, `558-0000` for Apex Wireless, `777-0000` for Ghost Mobile) opens it.

Wolfden Phone does not record voicemail itself, and `pma-voice` cannot either, so **the inbox stays empty** until a separate recording resource fills it. That resource listens for the `wd_phone:server:voicemailRequested` event, which fires while the caller is still on the line after no answer, a decline, or a phone that is off or out of reach, and saves the message with the `LeaveVoicemail` export. See [Exports & integrations](#/docs/wd_phone/exports?section=voicemail-and-widgets).

## Payphones

Every phone box on the map is a working payphone. No phone or SIM is needed.

- Players use or answer a box through `ox_target`, or an **[E]** prompt without it, and dial on a coin-phone keypad. A coiled cord runs from the box to the player's hand, and everyone nearby sees it. Walking away hangs up.
- Each box gets its own `555-1###` number the first time it is used. Calling that number rings the box out loud, with a blinking red light on top, and anyone standing there can answer.
- Calls cost cash: a connection fee of 5 when dialling, refunded if nobody answers, then 2 for each minute after the first. **Collect calls** charge the person who answers instead. Emergency numbers are free.
- Caller ID and the receiver's Recents show the payphone's number, never who is calling. The server still records the caller.
- About 5% of boxes are out of order on any given day.

Change models, prices and the ring light in `config/payphones.lua`. Dispatch resources can locate a box with the `GetPayphoneByNumber` export, and jobs can switch areas off with `SetPayphonesOutOfOrder`; see [Exports & integrations](#/docs/wd_phone/exports).

## Radio

The **Radio** app turns the phone into a push-to-talk walkie-talkie on `pma-voice`. Players download it from Nova Store; Wolfden Phone Secure does not have it.

- Players type or dial a frequency and tune in. They talk with pma-voice's radio key, **Left Alt** by default, which the app shows.
- It stays on with the phone put away, like a call, and the Live Island shows the frequency.
- The frequency is the pma-voice radio channel, so players on the same channel in another radio resource hear each other.
- It needs no SIM, signal or mobile data. Airplane mode turns it off.
- The phone keeps up to 12 saved frequencies, its radio volume and mic clicks.
- The app shows how many people are on the frequency.
- Tuned in, the phone uses a little more battery.

The player goes off the air when the phone leaves them, turns off or goes flat, is put in lost mode or erased, or when they lose the job a frequency needs. The app says why.

Without `pma-voice`, or with its radios turned off (`voice_enableRadios 0`), the app says the radio is unavailable.

Edit `Config.Radio` in `config/radio.lua`:

| Setting | Default | What it does |
| --- | --- | --- |
| `min` / `max` | `1.00` / `999.99` | The frequencies players can tune, in MHz |
| `item` | `nil` | An item players must carry as well, such as `'radio'`. `nil` needs only the phone |
| `requireSignal` | `false` | `true` makes the radio need phone service |
| `airplaneMode` | `true` | Airplane mode turns the radio off |
| `members` | `'count'` | What the app shows about who is listening: `'count'`, `'names'` or `'none'` |
| `maxPresets` | `12` | Saved frequencies per phone |
| `restricted` | `1.00-10.99` | Frequencies only some jobs may tune |

By default, frequencies 1.00 to 10.99 are for on-duty `police`, `sheriff` and `ambulance` only:

```lua config/radio.lua
restricted = {
    ['1.00-10.99'] = { jobs = { 'police', 'sheriff', 'ambulance' }, requireOnDuty = true, label = 'Emergency services' },
},
```

A key can be one frequency, a range like `'1.00-10.99'`, or a list like `'911, 912.5'`. These limits also apply to players who tune through pma-voice directly. Do not restrict the same channels in another radio resource as well.

## Wolfden Phone Secure calls and messages

Wolfden Phone Secure messages disappear after 24 hours, together with their photos, and players can disguise their voice on calls with the voice changer. A disguised call sounds like its style even on weak signal, which only causes dropouts. Wolfden Phone Secure players can also meet in **rooms**, group chats joined with a short code instead of a number. See [Wolfden Phone Secure](#/docs/wd_phone/nova-secure).

## Server settings

Use `config/communication.lua` for messages, groups, calls, group calls, NovaDrop and Wolfden Phone Secure retention. Emergency numbers and coverage are in `config/signal.lua`, dispatch alerts in `config/dispatch.lua`, the Radio app in `config/radio.lua`, and costs in `config/plans.lua`. Test changes with two players before applying them to a live server.
