--- title: Spawn With Friends description: The Spawn With Friends module automatically moves spawning players near one of their friends. --- It can be challenging to locate friends in-experience. The **SpawnWithFriends** [developer module](../../resources/modules/index.md) automatically moves spawning players near one of their friends present in the experience. This module can also be configured to teleport a player on command instead of automatically. Before spawning occurs, in order to avoid spawning a character inside the map's geometry, the system confirms that there is enough space. Thus, this module might work better in experiences with large, open spaces. ## Module Usage ### Installation To use the **SpawnWithFriends** module in an experience: 1. From Studio's **Window** menu or **Home** tab toolbar, open the [Toolbox](../../projects/assets/toolbox.md) and select the **Creator Store** tab. 1. Make sure the **Models** sorting is selected, then click the **See All** button for **Categories**. 1. Locate and click the **Packages** tile. 1. Locate the **Spawn With Friends** module and click it, or drag-and-drop it into the 3D view. 1. In the [Explorer](../../studio/explorer.md) window, move the entire **SpawnWithFriends** model into `Class.ReplicatedStorage`. Upon running the experience the module will begin running. ### Restricted Spawn Areas This module may result in players spawning in restricted areas like VIP rooms, access-only spaces, etc. To prevent players from teleporting to these areas: 1. Fill the restricted area with invisible `Class.BasePart.Anchored|Anchored` blocks. Make sure `Class.BasePart.CanCollide|CanCollide`, `Class.BasePart.CanTouch|CanTouch`, and `Class.BasePart.CanQuery|CanQuery` are **disabled** for all blocks.
Block filling the entire prison room to prevent players from spawning inside
1. Using the [Tags](../../studio/properties.md#instance-tags) section of each block's properties, apply the tag `RestrictedSpawnArea` so that `Class.CollectionService` detects them. 1. Paste the following code into a `Class.Script` within **ServerScriptService**. ```lua title="Script" local ReplicatedStorage = game:GetService("ReplicatedStorage") local CollectionService = game:GetService("CollectionService") local SpawnWithFriends = require(ReplicatedStorage.SpawnWithFriends) local function validator(playerToTeleport, destinationPlayer, teleportationPoint) -- Iterate through all tagged parts for _, area in CollectionService:GetTagged("RestrictedSpawnArea") do local relativePosition = area.CFrame:PointToObjectSpace(teleportationPoint.Position) local size = area.Size local inXBounds = relativePosition.X < size.X / 2 and relativePosition.X > -size.X / 2 local inZBounds = relativePosition.Z < size.Z / 2 and relativePosition.Z > -size.Z / 2 if inXBounds and inZBounds then return false -- Spawn destination is within restricted area; abort teleportation end end return true -- Spawn destination doesn't overlap any restricted area; proceed with teleportation end SpawnWithFriends.setTeleportationValidator(validator) ``` ## API Reference ### Functions #### configure
configure(config: `Library.table`)
Overrides default configuration options through the following keys/values in the `config` table. This function can only be called from a `Class.Script`.
Key Description Default
`teleportToFriendOnRespawn` If set to `false`, teleportation to a friend will only happen manually via [teleportToRandomFriend](#teleporttorandomfriend). true
`teleportDistance` How far away players should spawn from each other, measured in studs. 5
`maxCharacterVelocity` Characters moving faster than this value won't be picked as teleportation candidates, for instance those in moving vehicles. 48
`bypassFriendshipCheck` If set to true, **all** players will be candidates for teleportation, not just friends. false
`showLogs` Whether or not to display log messages in the output. false
```lua title="Script" highlight="5-11" local ReplicatedStorage = game:GetService("ReplicatedStorage") local SpawnWithFriends = require(ReplicatedStorage.SpawnWithFriends) SpawnWithFriends.configure({ teleportToFriendOnRespawn = true, teleportDistance = 5, maxCharacterVelocity = 48, bypassFriendshipCheck = false, showLogs = false }) ``` #### teleportToRandomFriend
teleportToRandomFriend(playerToTeleport: `Class.Player`): `boolean`
Manually triggers teleportation of a player to one of their friends in the experience. Returns a boolean indicating whether or not teleportation succeeded; failure to teleport can be caused by the absence of friends in the server or the inability to find an unobstructed teleportation point. This function can only be called from a `Class.Script`. #### setTeleportationValidator
setTeleportationValidator(validator: `function`)
Allows you to perform custom pre-teleportation checks by hooking up a validator callback function. The callback receives three parameters:
Parameter Description
`playerToTeleport` Reference to the `Class.Player` that is being teleported.
`destinationPlayer` Reference to the target `Class.Player` that `playerToTeleport` is being teleported to.
`teleportationPoint` `Datatype.CFrame` where `playerToTeleport` is teleporting to.
This function and its callback can only be used in a `Class.Script` and the callback returns a boolean indicating whether teleportation should proceed. For example, the `return` logic in the following validator function ensures that the spawning player and destination player are on the same team. ```lua title="Script" highlight="6-8, 10" local ReplicatedStorage = game:GetService("ReplicatedStorage") local SpawnWithFriends = require(ReplicatedStorage.SpawnWithFriends) -- Teleports players only if they are on the same team local function validator(playerToTeleport, destinationPlayer, teleportationPoint) return playerToTeleport.Team == destinationPlayer.Team end SpawnWithFriends.setTeleportationValidator(validator) ```