FOS Tablet System — Standard
Versión 2.2.1 · requiere FOS Essentials Core 1.3.0 o posterior · también requiere FOS Localization 1.0.1, FOS Teleport 1.0.1
Una tableta que el jugador hace aparecer delante de él: menú de teletransporte, interruptores locales, normas del mundo y un panel de moderación completo con roles, inmovilización, aislamiento, silencio y registro sincronizado.
Requiere FOS Essentials Core 1.3.0, FOS Localization 1.0.0 y FOS Teleport 1.0.0.
¿Vienes de una versión anterior? Lee antes CHANGELOG.md: un prefab que hayas modificado
no se traslada por sí solo.
Ediciones
Sección titulada «Ediciones»Este pack se entrega en ediciones, cada una en su carpeta:
Assets/FOS/TabletSystem/└── Standard/ ← estás aquíUna futura edición Pro se coloca al lado, en Pro/, con su propio ensamblado y sus
propios componentes. Añade componentes junto a los del Standard y habla con ellos por
su API pública: nunca sustituye un componente del prefab. Actualizar no te cuesta por tanto
el cableado ya hecho.
Puesta en marcha
Sección titulada «Puesta en marcha»- Coloca FOS Essentials > FOS Tablet System > Standard > FOSTabletSystem en tu escena.
- Asigna la zona de aislamiento: un Transform vacío, en algún sitio apartado. Sin ella, aislar a un jugador no hace nada.
- Asigna el campo registro de jugadores del staff manager.
FOSPlayerRegistryviene del Core y vive en su propio GameObject, nunca en el propio staff manager. VRChat aplica un solo modo de sincronización por objeto, y el registro declaraNoVariableSync: en el mismo objeto arrastraría consigo la sincronización manual del staff manager. El campo es opcional, pero sin él la lista de jugadores reserva un array en cada entrada y cada salida. - Rellena los valores restaurados del staff manager para que coincidan con los ajustes de movimiento y voz de tu mundo. Son los que recupera un jugador al ser liberado o devuelto el micrófono, y sobrescriben los que tuviera.
- Rellena tus destinos de teletransporte, tus grupos de interruptores y tus normas.
Componentes
Sección titulada «Componentes»| Componente | Función | Red |
|---|---|---|
FOSTabletManager |
Invoca, coloca y cierra la tableta | ninguna |
FOSTabletCaller |
Devuelve la tableta a un soporte fijo | ninguna |
FOSTabletSettings |
Deslizadores personales, ajustes comunitarios, normas | manual |
FOSTabletToggleGroup |
Objetos encendidos y apagados juntos | ninguna |
FOSTabletToggleButton |
Botón que gobierna un grupo | ninguna |
FOSTabletStaffManager |
Roles, inmovilización, aislamiento, silencio, autoridad | manual |
FOSTabletStaffRow |
La fila de un jugador en el panel de staff | ninguna |
FOSTabletPermissions |
Visibilidad de objetos por rol | ninguna |
FOSTabletPermissionRow |
La fila de un jugador en el panel de roles | ninguna |
FOSTabletLogManager |
Registro de moderación sincronizado | manual |
FOSTabletLogRow |
Una línea de registro | ninguna |
El modelo de seguridad
Sección titulada «El modelo de seguridad»Esta es la parte que conviene leer antes de publicar un mundo con este pack.
El propietario del staff manager es la única autoridad. Cada acción de moderación es
una petición enviada a ese propietario mediante Network Calling. El propietario comprueba
al jugador real que llama con NetworkCalling.CallingPlayer, que no se puede falsificar,
y solo entonces escribe. Un cliente modificado puede enviar la petición; será rechazada.
Las variables sincronizadas llevan estado, nunca órdenes. Eso es lo que hace seguros a
quienes llegan tarde: quien entra aplica el estado actual en lugar de repetir acciones
caducadas. Un SendCustomNetworkEvent nunca se les repite, y por eso precisamente el
estado no vive en eventos.
La propiedad queda restringida al staff. Si el propietario se va y VRChat deja el objeto en manos de un visitante, lo reclama el miembro del staff con el identificador de jugador más bajo: una regla determinista, para que actúe un cliente y no todos a la vez.
El primer admin es el primer jugador de la instancia, fijado por su nombre visible. Fiarse del master sería un agujero: el master cambia cada vez que alguien se va, y el admin acabaría recayendo en un desconocido. Quien crea la instancia también se reconoce como admin, y al fundador no se le puede degradar nunca, ni por un moderador ni por otro admin.
Las comprobaciones de los componentes de fila son comprobaciones de interfaz. Evitan enviar una petición que va a ser rechazada e impiden que un visitante pulse botones muertos. No son una barrera de seguridad y no pretenden serlo.
Qué es el aislamiento y qué no
Sección titulada «Qué es el aislamiento y qué no»El aislamiento es un confinamiento temporal dentro de la instancia actual. Un mundo de VRChat no puede —ni debe— imponer un baneo persistente. Volver a entrar lo borra, por diseño.
A un jugador aislado se le teletransporta a la zona de aislamiento y se le devuelve cada dos segundos si sale de su radio. Reaparecer tampoco lo libera.
Los roles
Sección titulada «Los roles»| Rol | Valor | Puede |
|---|---|---|
| Visitante | 0 | nada |
| VIP | 1 | nada más; el rol existe para las reglas de visibilidad |
| Moderador | 2 | inmovilizar, aislar, silenciar, asignar roles hasta moderador |
| Admin | 3 | todo eso, además de promover admins y los ajustes comunitarios |
Los rangos iguales pueden actuar entre sí: dos moderadores pueden neutralizarse. Es una elección deliberada, para el momento en que uno de ellos se desmadre.
Si se va el último admin, el primer moderador asciende automáticamente. Sin esa sucesión, una instancia pierde toda moderación hasta que se reinicia.
Asignar un rol
Sección titulada «Asignar un rol»Cada fila del panel de roles lleva cuatro botones —visitante, VIP, moderador, admin— y eso es todo lo que necesita un mundo con los cuatro roles por defecto.
Un mundo que define sus propios roles necesita algo que no crezca con su número.
FOS Essentials > FOS Tablet System > Build role selector añade uno a una fila: dos
flechas, una etiqueta y un botón de aplicar.
Clona uno de los botones de rol que ya hay en esa fila, así que el selector hereda tus colores, tu tipografía y tus dimensiones en lugar de llegar con los nuestros. Coloca los cuatro objetos que crea y guarda.
Las flechas recorren todos los roles; el botón de aplicar es el que decide. Así, un botón bloqueado dice algo preciso —ese rol no, a esa persona— en vez de parecer una avería. Sigue bloqueado mientras la selección sea el rol que el jugador ya tiene.
La etiqueta sale de la lista de roles, así que sigue tanto a tus nombres como al idioma de cada jugador.
La memoria de la instancia
Sección titulada «La memoria de la instancia»Los roles de moderador y admin se recuerdan solo durante la instancia actual, por nombre visible. Un miembro del staff que se cuelga y vuelve a la misma instancia recupera su rol.
Nada se guarda entre sesiones ni entre instancias. Grupos distintos abren instancias del mismo mundo, y los permisos de una no tienen por qué filtrarse a otra. El VIP no se recuerda, y el aislamiento tampoco, deliberadamente.
Visibilidad por rol
Sección titulada «Visibilidad por rol»FOSTabletPermissions muestra y oculta objetos según el rol del jugador local.
Los roles son acumulativos: un rol obtiene todo lo que se muestra a los roles inferiores. Un admin ve los objetos de visitante, VIP y moderador sin que los copies en cuatro listas; esa copia era el error de configuración más común y el más pesado de deshacer.
Las listas de «oculto para» son excepciones para un rol, aplicadas en último lugar. Un objeto que solo aparece en oculto para moderadores es visible para todos menos para los moderadores.
Las dos listas de staff piden una capacidad, no un rango. Mostrado a moderadores significa «a cualquier rol autorizado a abrir el panel de staff»; Mostrado a admins, «a cualquier rol autorizado a editar los ajustes comunitarios». Con los cuatro roles por defecto es exactamente lo mismo. Deja de serlo el día en que un mundo define sus propios roles: un recepcionista situado en el nivel 2 heredaría si no el panel de moderación por comparación de rangos, sin tener ni uno solo de sus poderes.
Esto es presentación, no protección. Ocultar un objeto no impide que nadie lo alcance por otra vía.
Los interruptores
Sección titulada «Los interruptores»Un FOSTabletToggleGroup guarda una lista de objetos y un estado, aplicado a todos. Un
FOSTabletToggleButton apunta a un grupo, directamente y no por una clave de texto.
Los interruptores son locales a propósito. Un ajuste de comodidad no tiene por qué imponerse al resto de la instancia, y sincronizarlo gastaría ancho de banda en algo que nadie ha pedido.
Varios botones pueden gobernar el mismo grupo: se registran en él y sus indicadores se mantienen de acuerdo.
Textos y traducciones
Sección titulada «Textos y traducciones»El texto que se ve en el juego pasa por FOS Localization. Asigna el locale manager y da las claves de traducción:
| Dónde | Claves |
|---|---|
FOSTabletStaffManager |
cuatro nombres de rol, en orden: visitante, VIP, moderador, admin |
FOSTabletSettings |
normas estándar, normas para adultos |
Sin locale manager se usan los textos de reserva escritos junto a esos campos, y la tableta funciona en un solo idioma.
Cualquier etiqueta tuya es un FOSLocalizedText, como en cualquier otro sitio de tu mundo.
El teletransporte
Sección titulada «El teletransporte»Los botones de teletransporte de la tableta son componentes de FOS Teleport: un
FOSTeleportButton por destino, con su Transform de destino. Este pack no trae su propio
teletransportador.
La única excepción es el teletransporte a un jugador del panel de staff: FOS Teleport apunta a un Transform fijo de la escena, mientras que ese destino es un jugador que se mueve y puede irse entre el clic y la llegada. Ahí sigue siendo nativo, y falla en silencio si el objetivo ya no está.
Scripting
Sección titulada «Scripting»Todos los puntos de entrada siguientes son sin parámetros, así que cualquier script puede
alcanzarlos con SendCustomEvent.
| Llamada | En | Efecto |
|---|---|---|
SummonTablet() / CloseTablet() |
FOSTabletManager |
Abre o cierra la tableta |
RecallTablet() |
FOSTabletCaller |
Trae la tableta de vuelta a su soporte |
FOSToggle() |
FOSTabletToggleGroup / FOSTabletToggleButton |
Invierte un grupo |
FOSRoleOf(id) / FOSIsStaff(id) / FOSIsAdmin(id) |
FOSTabletStaffManager |
Lee un rol |
FOSRequestFreeze/Isolation/Mute(id) |
FOSTabletStaffManager |
Pide una acción |
FOSRequestRole(id, role) |
FOSTabletStaffManager |
Pide un cambio de rol |
FOSAdultContentIsOn() |
FOSTabletSettings |
Lee el estado del contenido para adultos |
Puntos de extensión
Sección titulada «Puntos de extensión»Tres componentes publican sus cambios de estado de la misma manera. Llama a
FOSRegister(this) en uno de ellos y expón un método público sin parámetros con el nombre
correspondiente:
| Emisor | Evento que exponer |
|---|---|
FOSTabletStaffManager |
FOSApplyStaffState() |
FOSTabletToggleGroup |
FOSApplyToggleState() |
FOSLocaleManager |
FOSApplyLanguage() |
Quien escucha debería además aplicarse una vez en su propio Start: puede registrarse
después de que el emisor ya haya fijado su estado inicial.
Así es como se enchufa la edición Pro, y así es como se enchufa todo lo que este pack no cubre.
Notas y límites
Sección titulada «Notas y límites»- Un staff manager por escena. Varios se pelearían por los mismos jugadores.
- Nada persiste entre sesiones. Los roles viven solo en la instancia actual.
- El tamaño del registro cuesta ancho de banda. Cada entrada se sincroniza; 30 es un valor por defecto sensato.
- Los valores restaurados sobrescriben los ajustes del jugador. Ajústalos a tu mundo.
- Quest y PC se comportan igual: no hay código específico de plataforma, ni podría haberlo, porque Udon se compila una sola vez para ambas.
