Chat basado en proximidad

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Este ejemplo muestra cómo implementar un chat exclusivo para usuarios que están cerca el uno del otro en el mundo del juego.Extiende la llamada de devolución con una función que utiliza TextSource para identificar las ubicaciones de un usuario que podría ser un receptor de mensajes potencial.Si esta función devuelve false , significa que el usuario se localiza más allá del rango válido predeterminado del remitente del mensaje, por lo que el sistema no envía el mensaje a ese usuario.

Añade lo siguiente a un Script en ServerScriptService :

Servidor

local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
-- Obtenga el canal de chat para el chat basado en la proximidad
-- Puedes reemplazar este canal general con un canal dedicado
local generalChannel: TextChannel = TextChatService:WaitForChild("TextChannels").RBXGeneral
-- Función para obtener la posición del personaje de un usuario
local function getPositionFromUserId(userId: number)
-- Obtener al jugador asociado con el ID de usuario dado
local targetPlayer = Players:GetPlayerByUserId(userId)
-- Si el jugador existe, obtener la posición de su personaje
if targetPlayer then
local targetCharacter = targetPlayer.Character
if targetCharacter then
return targetCharacter:GetPivot().Position
end
end
-- Devolver una posición predeterminada si el jugador o personaje no se puede encontrar
return Vector3.zero
end
-- Establece la llamada de devolución para el canal general para controlar la entrega de mensajes
generalChannel.ShouldDeliverCallback = function(textChatMessage: TextChatMessage, targetTextSource: TextSource)
-- Obtener las posiciones del remitente y del destinatario del mensaje
local sourcePos = getPositionFromUserId(textChatMessage.TextSource.UserId)
local targetPos = getPositionFromUserId(targetTextSource.UserId)
-- Entregar mensaje si la distancia entre el remitente y el destinatario es menor a 50 unidades
return (targetPos - sourcePos).Magnitude < 50
end