I found a way to make Global Spatial Voice.
Basically the script creates another character locally per person and sets the players to the new character. This doesn’t actually remove them from the Workspace or disable their controls! So they will still be able to walk around. This could be used for intercoms or VIP Servers. Do whatever you want!
How does it work? Voice chat originates from the Humanoid. The Humanoid uses the HumanoidRootPart to push out the sound from your Microphone. The script creates a fake character that Spatial Voice will hook on to, and teleport the fake characters HumanoidRootPart to the camera allowing for you to hear users voices at an infinite distance.
THIS HAS BEEN TESTED THROUGHLY. IT WORKS BUT IM NOT SURE IF ITS VERY OPTIMIZED. USE AT YOUR OWN RISK!
Put this as a LocalScript in StarterGui
local player = game.Players.LocalPlayer
local VCPlayers = Instance.new("Folder")
VCPlayers.Name = "VCRoutes"
VCPlayers.Parent = player
for i,v in pairs(game.Players:GetChildren()) do
if v ~= player then
if VCPlayers:FindFirstChild(v.UserId) then
VCPlayers:FindFirstChild(v.UserId):Destroy()
end
local Char = Instance.new("Model",VCPlayers)
local humanoid = Instance.new("Humanoid",Char)
local Root = Instance.new("Part",Char)
Char.PrimaryPart = Root
Char.Name = v.UserId
coroutine.resume(coroutine.create(function()
game:GetService("RunService").RenderStepped:Connect(function()
Root.CFrame = game.Workspace.CurrentCamera.CFrame
end)
end))
v.Character = Char
v.CharacterAdded:Connect(function(char)
v.Character = Char
end)
end
end
game.Players.PlayerAdded:Connect(function(plr)
if VCPlayers:FindFirstChild(plr.UserId) then
VCPlayers:FindFirstChild(plr.UserId):Destroy()
end
local Char = Instance.new("Model",game.Players.LocalPlayer)
local humanoid = Instance.new("Humanoid",Char)
local Root = Instance.new("Part",Char)
Char.PrimaryPart = Root
coroutine.resume(coroutine.create(function()
game:GetService("RunService").RenderStepped:Connect(function()
Root.CFrame = game.Workspace.CurrentCamera.CFrame
end)
end))
plr.CharacterAdded:Connect(function(char)
plr.Character = Char
end)
end)
game.Players.PlayerRemoving:Connect(function(plr)
if VCPlayers:FindFirstChild(plr.UserId) then
VCPlayers:FindFirstChild(plr.UserId):Destroy()
end
end)
Obviously my code probably isn’t the best. If you have a better version go ahead and post it here for others to use!