Documentación de RBLX Essentials
Resumen
RBLX Essentials es un ecosistema de packs de Roblox que tu IA ya sabe instalar, configurar y conectar. Instalas los packs desde el plugin gratis de Studio, le dices a tu IA lo que quieres y pulsas Play. ¿Prefieres hacer clic? El plugin gratis de Studio tiene todos los ajustes.
Cada pack se conecta a un mismo núcleo compartido y a un mismo sistema de guardado. Así, un código puede dar giros y mascotas, un premio diario puede dar una mascota, y todos los packs guardan en los mismos datos de los jugadores sin conectar nada entre ellos.
Qué cambió en 3.0
- Hecho para que lo maneje una IA. El plugin gratis pone Tools en tu place: una biblioteca de operaciones (instalar, configurar, comprobar, migrar) que un agente de IA llama a través del MCP de Studio, y una guía escrita para la IA,
AI-START-HERE.md. La guía para la IA está en inglés a propósito: tu IA la lee y puede responderte en español. - Tu configuración es código de tu juego. Cada pack con opciones las guarda en pequeños módulos que son de tu juego. Las actualizaciones nunca los tocan.
- Tu interfaz es tuya. Un menú que cambias se copia antes a tu propia carpeta
Interface, así que una actualización nunca puede deshacer tu diseño. - El mismo plugin que ya conoces. Cada pack abre el mismo panel de ajustes que en 2.x, con sus vistas previas, y ahora guarda en la nueva configuración.
- Pasar a 3.0 (Move to 3.0) conserva tu juego. Un place 2.x pasa a 3.0 con un proceso guiado de comprobar y aprobar, y conserva tus ajustes, tus menús editados y los datos de los jugadores.
Catálogo de packs
| Pack | PackId | Versión | Precio | Descripción |
|---|---|---|---|---|
| Easy Pet System | EasyPetSystem |
3.3.5 | $9.99 | Huevos, animaciones de eclosión, un menú de colección, fusiones y mascotas que siguen al jugador. 28 mascotas en 5 rarezas. |
| Sound System & Music Player | SoundSystem |
3.2.2 | Gratis | Un reproductor de música en el HUD y efectos de sonido por nombre, con volumen de Music y SFX por separado. Todos los packs con sonidos los reproducen a través de él. |
| General UI Kit | GeneralUIKit |
3.5.2 | $14.99 | Los 14 menús, de Shop y Settings a Pets, Spin, Rebirth y Trade, con 11 botones del HUD más Changelogs. Los packs instalados usan los menús del kit. |
| Classic UI Kit | ClassicUIKit |
3.5.2 | $14.99 | Los mismos menús y HUD que General UI Kit con un look Stud robusto, Studded o Plain. No necesita ningún otro kit. |
| Studded Glass UI Kit | StuddedGlassUIKit |
3.5.4 | $14.99 | Los mismos 17 menús y el HUD con piezas de color con studs sobre cristal oscuro, Studded o Plain. No necesita ningún otro kit. |
| Datastore & Purchase System | DatastorePurchaseSystem |
3.4.1 | Gratis | Guarda los datos de los jugadores cada cierto tiempo, al salir y al cerrar el servidor, y gestiona pases de juego, productos de desarrollador y regalos a otros jugadores. Todos los packs guardan a través de él. |
| Leaderboards System | EasyLeaderstatsSystem |
3.2.1 | $5.99 | Leaderstats en el menú Tab y leaderboards globales en el mundo, con los tres primeros en podios con su avatar. |
| Roulette System | RouletteSystem |
3.3.4 | $5.99 | Una ruleta de premios con pesos y probabilidades reales, giros gratis cada cierto tiempo, giros de pago y tus propios módulos de premios. |
| Time Rewards System | TimeRewardsSystem |
3.3.3 | $5.99 | Una racha de premios diarios de 7 días que se mantiene aunque vuelvas a entrar, más regalos por tiempo jugado en la sesión, cada uno con su intervalo. |
| Codes System | CodesSystem |
3.3.2 | Gratis | Códigos canjeables por cash, diamonds, cualquier stat, giros, mascotas o tus propios módulos de premios, con fecha de caducidad y un canje por jugador. |
| Notifications System | NotificationsSystem |
3.3.3 | Gratis | Avisos que se apilan, un banner central y mensajes de chat, que cualquier pack puede lanzar. |
Matriz de dependencias
El núcleo compartido va dentro de cada pack: no hay nada que instalar aparte. La tabla muestra qué packs necesitan otro instalado y cuáles funcionan bien juntos. Un pack con el que solo se combina se busca con el juego en marcha: sin él, esa función se desactiva en vez de romperse.
| Pack | Necesita | Combina con |
|---|---|---|
| Datastore & Purchase Gratis | nada | Todos los packs que guardan datos de los jugadores lo necesitan. |
| Sound System Gratis | nada | Todos los packs con sonidos: General UI Kit, Notifications, Easy Pet, Codes, Roulette, Time Rewards. |
| Notifications System Gratis | nada | Datastore & Purchase (anuncios de compras), Sound System y los packs que anuncian cosas: Easy Pet, Codes, Roulette, Time Rewards. |
| Codes System Gratis | Datastore & Purchase | Roulette (códigos de Spins), Easy Pet (códigos de mascotas), Notifications, Sound System. |
| General UI Kit $14.99 | nada | Sound System (sonidos de botones), Datastore & Purchase (etiquetas que muestran valores guardados), Easy Pet. |
| Classic UI Kit $14.99 | nada | Los mismos packs que General UI Kit. Con los dos instalados, la pestaña Estilo (Style) elige uno. |
| Studded Glass UI Kit $14.99 | nada | Los mismos packs que General UI Kit. Con más de un kit instalado, la pestaña Estilo (Style) elige uno. |
| Easy Pet System $9.99 | Datastore & Purchase | General UI Kit, Notifications (mascotas nuevas, rechazos, drops raros), Sound System. |
| Leaderboards System $5.99 | Datastore & Purchase | nada más |
| Roulette System $5.99 | Datastore & Purchase | Easy Pet (casillas de mascotas), Notifications, Sound System. |
| Time Rewards System $5.99 | Datastore & Purchase | Roulette (días de Spins), Easy Pet (días de mascotas), Notifications, Sound System. |
Filosofía de la arquitectura
Hecho para que lo maneje una IA. Cada operación está en una sola biblioteca, Tools, con una guía escrita para la IA. El plugin llama a la misma biblioteca, así que una persona y una IA siempre hacen lo mismo de la misma forma.
El producto y tu juego, por separado. Las actualizaciones sustituyen enteras las carpetas de los packs y nunca tocan tu configuración, tus menús ni tus scripts, que viven en zonas propias.
Configuración en código, comprobada. Cada pack declara cada opción con su tipo, su valor por defecto y sus reglas. Un valor incorrecto nombra la opción y el pack no arranca, en vez de funcionar a medias en un juego publicado.
Un núcleo compartido. Un Kernel arranca todos los packs en orden de dependencias y le pasa a cada uno las APIs de los demás. Un pack declara solo los packs sin los que no puede funcionar; un acompañante opcional se busca con el juego en marcha, así que nunca se vuelve obligatorio.
Primeros pasos
Instala el plugin gratis una vez, instala los packs desde él y deja que tu IA los configure, o configúralos tú en el plugin. Los dos caminos escriben la misma configuración, así que puedes cambiar de uno a otro cuando quieras.
Requisitos: Roblox Studio (cualquier versión reciente) y el plugin gratis de RBLX Essentials, también cuando trabaja una IA, porque el plugin es lo que pone Tools en tu place. Para trabajar con una IA: un agente conectado a Studio a través del servidor MCP de Studio, como Claude Code, Codex o cualquier otro agente. Para instalar desde el plugin los packs que compraste: la cuenta de itch.io con la que compraste. Para probar el guardado: un place publicado con Enable Studio Access to API Services activado.
Paso 1: Instala el plugin
Descarga el plugin de RBLX Essentials (gratis, sin iniciar sesión). En Studio, abre Plugins > Plugins Folder, arrastra el archivo .rbxm a esa carpeta y reinicia Studio una vez. Aparece como RBLX Essentials en la barra de Plugins, y su botón abre la tarjeta del plugin sobre el viewport.
La tarjeta se abre en Iniciar sesión (Sign in) con un código. Ve a rblxessentials.com/link (un plugin no puede abrir un navegador, así que la tarjeta te da la dirección para copiarla), inicia sesión con la cuenta de itch.io con la que compraste e introduce el código: la tarjeta muestra tus packs unos segundos después. Inicias sesión una vez por PC. Ahora no (Not now) lo salta durante esta sesión de Studio; los packs gratis se instalan sin iniciar sesión.
Paso 2: Instala los packs
- Abre la tarjeta con el botón RBLX Essentials y ve a Mis packs (My packs). Los packs gratis y los que tienes muestran Instalar (Install); los demás muestran Comprar en itch (Buy on itch).
- Pulsa Instalar. La tarjeta muestra cada paso (Descargando, Preparando, Instalando, Listo), y un pack que necesita otro lo instala antes, Datastore & Purchase incluido.
- O deja que lo haga tu IA: pulsa Copiar (Copy) en la pestaña IA (AI) de la tarjeta y Tools, con lo que trabaja tu IA, ya está en el place, aunque aún no haya ningún pack. Con la sesión iniciada en el plugin, tu IA ve lo que tiene tu cuenta con
T.owned()y lo instala a través del plugin, dependencias primero:T.install({ website = "CodesSystem" }).
No hay un núcleo aparte que descargar: el núcleo compartido va dentro de cada pack. Arrastrar el .rbxm de un pack desde Mi biblioteca a tu place también sigue funcionando: el panel acoplado del plugin muestra Instalar en él.
Paso 3: Dile a tu IA lo que quieres
Dale a tu agente la guía, AI-START-HERE.md (o la dirección rblxessentials.com/AI-START-HERE.md; el plugin también la tiene, con un prompt para copiar, en la pestaña IA de la tarjeta y en ⋯ > Para tu IA (For your AI) del panel acoplado), y pide con palabras normales, por ejemplo:
Add codes, a pet shop and daily rewards. Make SUMMER25 give 250 Cash.
El agente lee lo que hay en tu place con T.describe(), instala cada pack con T.install() (desde la web a través del plugin con la sesión iniciada, o desde un archivo que arrastraste; Datastore & Purchase primero, porque todos los packs que guardan lo necesitan; T.owned() le dice lo que tiene tu cuenta), escribe las opciones en tus módulos de configuración, lo comprueba todo con T.validate() y luego arranca Play para demostrar que funciona. Cada cambio que hace es un paso de deshacer de Studio, así que Ctrl+Z deshace cualquiera de ellos.
¿Prefieres hacerlo a mano? Pulsa Instalar en cada pack en Mis packs de la tarjeta y cambia sus ajustes en el panel acoplado (la pestaña Ajustes (Settings) de la tarjeta lo abre). El plugin y tu IA editan los mismos módulos.
Paso 4: Pulsa Play
Cada pack arranca solo: sin código de arranque y sin conectar nada. Los códigos, las mascotas y los premios funcionan desde el principio. El Output imprime una línea de arranque [RBLXE] por lado, y cualquier cosa que un pack necesite de ti es un aviso claro que dice qué hacer.
Antes de publicar
- El Diagnóstico (Diagnostics) del plugin (en el menú ⋯ de su panel acoplado) avisa de que los códigos de ejemplo de Codes System están activos: cámbialos o bórralos. Son
WELCOME2027, másPETDAY2027si Easy Pet System se instaló antes que Codes System. Instalar desde el plugin los escribe; cuando tu IA instala conT.install, los códigos llegan como una edición que aún tiene que aplicar, y hasta entonces el juego no tiene códigos. Los IDs de productos y de pases de juego de demostración están marcados en sus filas en los ajustes de cada pack, y el Output nombra cada uno al pulsar Play. FreeMode(Modo gratis (Free mode) en el plugin) en Datastore & Purchase viene desactivado, pero un juego que pasó de 2.x lo mantiene activado si lo estaba: desactívalo si tampoco quieres compras gratis en las pruebas de Studio. En 3.0 solo funciona en Studio, y un servidor en vivo avisa al arrancar mientras está activado.- Prueba el guardado saliendo y volviendo a entrar de verdad en un place de prueba publicado.
Actualizar un pack
Cuando un pack tiene una versión más nueva, Mis packs de la tarjeta muestra Actualizar (Update) en él (el filtro Novedades (Updates) los lista todos) y el panel acoplado dice Hay actualización (Update available). Pulsa Actualizar, o pide a tu IA que ejecute T.update({ website = PackId }). Un archivo más nuevo arrastrado al place también actualiza. Se sustituyen el código propio del pack y sus menús por defecto; tus módulos de configuración, tus copias en Interface y tus extensiones nunca se tocan, y todo lo que se sustituye se copia antes en Backups.
Si vienes de 2.x
3.0 es una actualización gratis para todos los que tienen un pack 2.x: descarga el archivo 3.x actual de cada pack que tenga tu place desde Mi biblioteca, arrástralos todos y pulsa Pasar a 3.0 (Move to 3.0) en el plugin (o pide a tu IA que ejecute T.migrate()). Consulta Plugin: Pasar a 3.0.
Desinstalar un pack
Elige Desinstalar (Uninstall) en el menú Más (More) de la página del pack en el plugin, o pide a tu IA que ejecute T.uninstall(). El código del pack sale de todos los servicios y antes se hace una copia de seguridad; tus módulos de configuración se quedan, así que al instalarlo de nuevo sigues donde lo dejaste. Un pack que otros packs instalados necesitan no se puede desinstalar hasta que se desinstalen ellos.
Plugin
El plugin es la forma de hacer a mano todo lo que hace tu IA: instalar packs, cambiar cada ajuste, comprobar el place y pasar un juego 2.x a 3.0. Es gratis y funciona igual con o sin un agente de IA.
El plugin muestra sus textos en español o en inglés según el idioma de Studio. Puedes cambiarlo en la pestaña Ajustes (Settings) de la tarjeta. Esta documentación usa las etiquetas en español, con la inglesa entre paréntesis la primera vez.
Tiene dos partes. La tarjeta, que abre el botón RBLX Essentials (su único botón en la barra de Plugins), instala y actualiza packs y temas. El panel acoplado guarda los ajustes de cada pack de tu place. En un place que aún usa packs 2.x, el panel acoplado añade una pestaña Migración (Migration) hasta que el place pasa a 3.0.
La tarjeta
La tarjeta flota sobre el viewport en Edit (se oculta mientras el juego está en marcha) con cerca del 85% de la altura del viewport, así que se lee igual en cualquier pantalla; arrástrala por su cabecera, minimízala o ciérrala. Tiene cinco pestañas:
- Mis packs (My packs): todos los packs, filtrados por Todos (All), Instalados (Installed) o Novedades (Updates), cada uno con Instalar (Install), Actualizar (Update), Comprar en itch (Buy on itch) o Consíguelo en tu biblioteca (Get it from your library). Instalar muestra cada paso (Descargando, Preparando, Instalando, Listo), o por qué se paró y qué hacer. Un pack que necesita otro lo instala antes, y una actualización conserva tus ajustes y tus módulos de configuración.
- Estilo (Style): un estilo para todo tu juego, un kit de GUI y uno de sus estilos, cada uno con un acabado y una fuente (General UI Kit: Liso (Fredoka) (Plain (Fredoka)) o Studded (Fredoka); Classic UI Kit y Studded Glass UI Kit también Liso (Montserrat) (Plain (Montserrat)) y Studded (Montserrat)). La fuente va con el estilo, nunca suelta. Cada acabado muestra una imagen, y el que está en uso aparece remarcado; un clic cambia todos los menús a la vez, también los de los packs, y Studio lo muestra. Un kit de GUI que aún no tienes aparece con Instalar o Consíguelo (Get it). Sin kit de GUI, cada pack usa sus propios menús por defecto.
- IA (AI): la guía y un prompt para pegar en Claude Code, Codex o cualquier agente de IA conectado a Studio. Copiar (Copy) lo selecciona; luego pulsa Ctrl+C. También funciona sin iniciar sesión.
- Cuenta (Account): las cuentas de itch.io y de Roblox vinculadas a este Studio, y Cerrar sesión (Sign out).
- Ajustes: los packs de tu place, cada uno con sus ajustes en el panel acoplado, y arriba Gestor de packs (Pack manager), que abre el propio panel acoplado. También funciona sin iniciar sesión.
Mientras este Studio no haya iniciado sesión, la tarjeta se abre en Iniciar sesión (Sign in) con un código para introducir en rblxessentials.com/link. Ahora no (Not now) lo salta durante esta sesión de Studio, y los packs gratis se instalan sin iniciar sesión. La clave de la sesión se queda en los ajustes del plugin en este PC y nunca se pone en tu place.
El panel acoplado
El panel acoplado lista los packs instalados en tu place, cada uno con su versión y Al día (Up to date) o Hay actualización (Update available), y el núcleo compartido mientras está en el place. Pulsa un pack para abrir sus ajustes. El discreto ⋯ de su cabecera abre Diagnóstico (Diagnostics), Copias de seguridad (Backups) y Para tu IA (For your AI) (la guía y un prompt para copiar, como en la pestaña IA de la tarjeta). Un archivo de pack que arrastraste muestra aquí Instalar o Actualizar.
La página de un pack: los paneles que conoces de 2.x
Abre un pack y sus Ajustes son el panel que conoces de 2.x: las mismas secciones, editores y vistas previas en vivo, con cada fila en palabras sencillas. Los tiempos se muestran como duraciones (15 min) y se escriben como 10 min, 1h 30m o un número sin más; los colores llevan una muestra y los IDs de imagen su imagen. La ruleta de Roulette se redibuja al cambiar una casilla (de 2 a 12 casillas), Time Rewards previsualiza la barra de la racha, Codes previsualiza sus mensajes, Datastore muestra el guardado que recibe un jugador nuevo, Easy Pet gira cada mascota en 3D y comprueba que las probabilidades de un huevo suman el 100%, y Sound mide el volumen real de cada sonido.
Lo nuevo es adónde van los valores. Tus cambios se juntan en una barra Guardar (Save) abajo: Guardar los escribe en los módulos de configuración de tu juego y Descartar (Discard) los descarta. Algunas ideas de 3.0 aparecen como pequeñas marcas, como las dibujaría 2.x:
- Filas bloqueadas con un enlace Editar (Unlock) protegen valores que cambiarían los datos guardados de tus jugadores, como la versión del datastore.
- Solo servidor (Server only) marca una opción que los clientes nunca reciben, como la lista de códigos.
- Una nota marca los IDs de demostración que debes cambiar por los tuyos antes de publicar.
La Interfaz (Interface) de un pack lista sus menús y botones del HUD; la de General UI Kit se divide en MENÚS (MENUS), BOTONES (BUTTONS) y OTRAS PARTES DEL HUD (OTHER HUD PARTS). El ojo muestra uno en pantalla, el lápiz crea tu propia copia para editarla y Revertir cambios (Revert changes) devuelve tu copia a la versión del pack; las piezas de un tema vuelven desde la pestaña Themes de la tarjeta. El menú Más (More) de la cabecera del pack tiene Dónde están sus archivos (Where its files are) (sus carpetas de datos y tus propios scripts) y Desinstalar (Uninstall).
Todo lo que hace el plugin es una edición normal de Studio, así que Ctrl+Z funciona en todo, salvo Borrar datos de Studio (Wipe Studio Data), que borra para siempre los perfiles guardados en Studio.
Diagnóstico
Ábrelo desde el menú ⋯ del panel acoplado. Es la misma comprobación que tu IA hace con T.validate(): cada problema del place, cada uno con la línea que lo arregla. También lista los menús que ya no usa ningún pack y lo que se conservó de tu juego 2.x.
Pasar a 3.0
Un place 2.x pasa a 3.0 con un proceso guiado de comprobar y aprobar, y conserva tus ajustes, tus menús editados y los datos de los jugadores. No cambia nada hasta que apruebas cada paso.
- Descarga el archivo 3.x actual de cada pack de RBLX Essentials que tenga tu place (son gratis para quien tiene la 2.x en Mi biblioteca) y arrástralos todos.
- Abre la pestaña Migración y pulsa Pasar a 3.0 (Move to 3.0): hace una copia de seguridad de tus carpetas de RBLX Essentials y convierte tus ajustes. Pulsa Crear todos (Create all) para escribir tus módulos de configuración y luego Hacer paso 2 (Run step 2) para mover los packs. O pídeselo a tu IA: ejecuta
T.migrate(). - Primero lo comprueba todo y no cambia nada si algo está mal, y lista todos los problemas a la vez.
- Copia tus carpetas de RBLX Essentials a una copia de seguridad protegida, convierte cada ajuste que habías cambiado en tus nuevos módulos de configuración, conserva cada menú que editaste como tu propia copia en
Interfacey lleva tus propios scripts (premios personalizados, controladores de botones, disparadores de notificaciones) aExtensions. - Termina con un informe breve de lo que hizo y de lo que aún te necesita.
Una migración nunca toca los datos de los jugadores. Los guardados conservan su datastore y sus claves, así que los jugadores conservan todo lo que ganaron.
Copias de seguridad
Antes de sustituir algo (una actualización, una migración, una pieza que dejas de usar), Tools lo copia en ServerStorage > RBLXEssentials > Backups. Copias de seguridad, en el menú ⋯ del panel acoplado, las lista; cada copia tiene una pequeña cruz roja para borrarla, y una copia protegida pregunta dos veces. Nunca se borra nada por sí solo.
Actualizaciones y el núcleo compartido
El plugin busca packs más nuevos al abrirse, sin bloquear: tus packs locales aparecen enseguida, y un pack con una versión más nueva dice Hay actualización en el panel acoplado y muestra Actualizar en Mis packs de la tarjeta. Cada pack lleva el núcleo compartido, y el núcleo solo avanza, así que actualizar cualquier pack lleva el núcleo más nuevo a todos.
Guías
Respuestas cortas a lo que la gente quiere hacer de verdad. Cada una funciona de dos formas: pídeselo a tu IA con palabras normales, o hazlo tú en el plugin o en el Explorer.
Trabajar con tu IA
Tu IA trabaja en Studio a través del servidor MCP de Studio y lo hace todo con Tools, una biblioteca que el plugin pone en tu place. Dale una vez la guía AI-START-HERE.md; cubre las reglas, cada opción y cada comprobación.
| Operación | Qué hace |
|---|---|
T.describe() | Qué está instalado, qué espera a instalarse y qué está mal. |
T.owned() | Los packs que tiene la cuenta con la que iniciaste sesión, cuáles están instalados y cuáles instalar, dependencias primero. |
T.install(ref), T.update(ref), T.uninstall(packId) | Instala o actualiza un pack desde la web a través del plugin con la sesión iniciada ({ website = PackId }) o desde un archivo que arrastraste (por la referencia que imprime T.describe()), o quita uno. |
T.config.where(packId), T.config.create(packId) | Dónde viven los módulos de configuración de un pack, y el texto para crear los que faltan. |
T.config.reference(packId) | Cada opción de un pack, con su tipo, su valor por defecto y sus reglas. |
T.config.check(packId) | Si la configuración de un pack es válida; si no, nombra la opción que falla. |
T.validate() | Todo el place comprobado antes de Play. |
T.migrate() | Un place 2.x pasado a 3.0. |
Las buenas peticiones dicen qué hace el jugador y qué debe pasar: "añade un código SUMMER25 que dé 250 Cash y caduque a finales de agosto", "haz que el día 7 de los premios diarios dé una mascota", "pon una tabla con el top 10 de Cash junto al spawn". El agente cambia una cosa por paso, así que cada cambio es un paso de deshacer, e informa de lo que cambió y de lo que aún te necesita (como tus propios IDs de producto).
Dónde está cada cosa
3.0 divide el place en el producto, que las actualizaciones sustituyen entero, y las zonas de tu juego, que las actualizaciones nunca tocan.
ReplicatedStorage.RBLXEssentials
├── Kernel -- product: the shared core
├── Packs.<PackId> -- product: manifest, Schema, Pieces, Client
├── Config.<PackId> -- yours: options clients may read
└── Extensions.GeneralUIKit -- yours: your button handlers
ServerScriptService.RBLXEssentials
├── Kernel, Packs.<PackId> -- product
├── Config.<PackId> -- yours: server-only options
└── Extensions.<PackId> -- yours: custom rewards, triggers
StarterGui.RBLXEssentials
├── <PackId> -- product: each pack's default menus
├── Interface -- yours: the menus you changed
└── Interface.Custom -- yours: kept, not managed
ServerStorage.RBLXEssentials
├── Tools -- product: the operations library
├── Content.<ContentId> -- yours: installed themes
└── Backups -- yours: copies made before anything is replaced
SoundService.RBLXEssentials.SoundSystem
└── SFX, Music -- yours: the sound library
Para cambiar cómo se comporta un pack, cambia su configuración. Para cambiar cómo se ve, haz tu propia copia de su menú. Nunca edites las carpetas del producto: la siguiente actualización las sustituye.
¿Cómo cambio los ajustes de un pack?
En el plugin, abre el pack, cambia los valores y pulsa Guardar (Save). O pídeselo a tu IA. En los dos casos los valores acaban en dos módulos que son de tu juego: ReplicatedStorage.RBLXEssentials.Config.<PackId> para las opciones que los clientes pueden leer, y ServerScriptService.RBLXEssentials.Config.<PackId> para las que son solo del servidor. Cada módulo guarda solo lo que cambiaste; todo lo demás mantiene su valor por defecto, y una plantilla comentada lista cada opción. Un valor no válido nombra la opción, y el pack no arranca hasta que se arregla, así que una errata nunca puede funcionar a medias en un juego publicado.
¿Cómo edito la interfaz de un pack?
En la pestaña Interfaz (Interface) del pack, pulsa el lápiz junto a un menú. El plugin copia la versión del pack en StarterGui > RBLXEssentials > Interface, la muestra en pantalla y la selecciona en el Explorer. Edita esa copia como cualquier otra GUI: colores, fuentes, esquinas, imágenes, tamaños, distribución. El juego usa tu copia a partir de entonces, y las actualizaciones nunca la tocan. Revertir cambios (Revert changes) vuelve a la versión del pack y guarda la tuya en Backups.
Tres reglas para que un rediseño siga funcionando:
- No renombres lo que maneja el pack. La página de cada pack lista los pocos nombres que rellena, como el
TextBoxde un panel de Codes o elAmountde una casilla de día. Si tu copia rompe ese contrato, se usa la versión propia del pack y Diagnóstico (Diagnostics) dice por qué. - Tamaño y posición en scale, no en offset. Todo el kit está hecho así, de modo que un elemento ocupa la misma fracción de la pantalla en un móvil que en un monitor 4K.
- Los contornos son
ScaledSize. UnUIStrokeconStrokeSizingMode = ScaledSizetoma suThicknesscomo una fracción de la altura del elemento, así que una tarjeta redimensionada mantiene el grosor de su borde.
Cuando dos packs traen el mismo menú, solo se usa una copia, así que nunca tienes dos. Los menús Codes, Spin, Rewards, Daily Rewards y Pets de General UI Kit son demos: instala el pack al que pertenece uno y el menú del pack sustituye a la demo, conservando los cambios que le hiciste. Settings y Shop son propios de General UI Kit, así que se usan en lugar de las copias que traen Sound System y Easy Pet System. Las notas de Diagnóstico dicen cuál.
¿Cómo hago que un botón haga algo mío?
Pon en el atributo Action del botón un nombre y añade una función con ese nombre en el módulo de controladores de tu juego, ReplicatedStorage > RBLXEssentials > Extensions > GeneralUIKit > CustomHandlers (en ReplicatedStorage porque los botones corren en el cliente):
-- Extensions.GeneralUIKit.CustomHandlers (yours: updates never touch it)
return {
OpenCodes = function(button)
-- runs when a button whose Action says "OpenCodes" is clicked
print(button.Name, "was pressed")
end,
}
Abrir y cerrar paneles, ofrecer un pase de juego o un producto de desarrollador e invitar a amigos ya están resueltos. Si el módulo da error, el kit lo dice en el Output y sigue con sus propias acciones.
¿Cómo añado una moneda nueva y la muestro?
Gems o una moneda premium ya existen: la segunda moneda de los packs es Diamonds (Stats.Diamonds), que dan Time Rewards, Roulette y Codes. Para llamarla Gems, cambia solo el nombre que ven los jugadores. Los pasos de abajo usan Diamonds; una tercera moneda tuya sigue los mismos pasos con su propio nombre.
- Guárdala. Diamonds se guarda desde la primera vez que algo la da. Para tenerla desde la primera entrada de un jugador, en el panel de Datastore, en Default Data, abre
Statsy pulsa + Variable: llámalaDiamondsy elige número. Su ruta,Stats.Diamonds, es lo que pide todo lo demás. (Tu IA la escribe enDefaultDatay mantieneCashyWins, porque una lista que escribes sustituye entera a la de por defecto). - Muéstrala en el HUD. Añade un TextLabel, ponle la etiqueta
UI_DataBindy dale un atributoDataPathconStats.Diamonds. AñadePrefix,SuffixoFormat(Default,Short,FulloCommas) si quieres. Sigue el valor sin ningún script (esto necesita General UI Kit). - Clasifícala. En Leaderboards System, añade un leaderstat o una tabla cuya clave de datos sea
Stats.Diamonds. - Repártela. Cualquier premio de Roulette, Time Rewards o Codes acepta
Type = Diamonds. Una moneda tuya usaType = Staty su ruta comoTarget.
Una clave que añades llega a los jugadores que ya existen, en su siguiente carga. Una clave que quitas se queda en sus datos guardados, así que quitar una nunca puede hacer perder lo que alguien ganó.
¿Cómo doy un premio que el pack no ofrece?
Roulette System, Time Rewards System y Codes System aceptan un premio Custom: pon un ModuleScript tuyo en ServerScriptService > RBLXEssentials > Extensions > <PackId>, con una función Grant como los premios personalizados propios del pack (GrantPet es uno), y luego pon el Type del premio en Custom y su Target con el nombre de tu módulo. Se busca primero tu módulo y luego el del pack. Un premio que apunta a un módulo que no existe se desactiva al arrancar con un aviso, en vez de fallar la primera vez que un jugador lo gana (en Time Rewards, una casilla con Fallback da eso en su lugar). Codes System y Time Rewards System llaman a Grant(player, d, amount) una vez; Roulette System llama a Grant(player, d) una vez por cada unidad de Amount.
Lo más fácil es pedírselo a tu IA: "haz que el día 7 dé 3 Diamonds y una Golden Sword". Escribe el módulo y lo comprueba en Play.
¿Cómo añado un sonido o una canción?
Los sonidos viven en SoundService > RBLXEssentials > SoundSystem, en SFX y Music. En el panel de Sound, + Añadir sonido (+ Add sound) (+ Añadir canción (+ Add song) en Music) acepta un ID de asset o un texto rbxassetid://, más un nombre opcional; o suelta un Sound en cualquiera de los dos grupos en el Explorer. Luego reprodúcelo desde cualquier parte del cliente:
local SFX = require(game.ReplicatedStorage.RBLXEssentials.Kernel.SFX)
SFX:Play("Press")
SFX:PlayOverlap("Gold_Pickup") -- for things that fire fast
Medir todo (Measure all) lee el volumen real de cada sonido e Igualar todo (Match all) acerca a tu objetivo los que se desvían.
¿Cómo reacciono cuando pasa algo?
Cuando cambian los números de un jugador
El guardado se refleja en el jugador como objetos Value normales, así que un LocalScript puede vigilar uno sin remotes:
local player = game.Players.LocalPlayer
local data = player:WaitForChild("PlayerData")
local cash = data:WaitForChild("Stats"):WaitForChild("Cash")
cash.Changed:Connect(function(value)
print("cash is now", value)
end)
Un BoolValue DataReady en la misma carpeta se pone en true cuando ha llegado el guardado.
Cuando alguien compra algo
local hook = game:GetService("ServerScriptService").RBLXEssentials
.Packs.DatastorePurchaseSystem:FindFirstChild("PurchaseCompleted")
if hook then
hook.Event:Connect(function(player, kind, id, currencySpent)
print(player.Name, "bought", kind, id)
end)
end
Se dispara cuando se guarda la compra de un producto o se compra un pase de juego, y también con los productos que da FreeMode en Studio, así que puedes probar todo el recorrido de un producto sin gastar Robux.
Cuando quieres decir algo
local Notify = require(game.ReplicatedStorage
.RBLXEssentials.Packs.NotificationsSystem.Notify)
Notify.Toast(player, "TitleSubtitle", { Title = "Level up!", Subtitle = "You reached level 10" })
Notify.BannerAll({ Title = "Boss event", Subtitle = "The arena opens in 30 seconds" })
¿Cómo actualizo un pack sin perder mis ajustes?
Pulsa Actualizar (Update) en el pack, en Mis packs (My packs) de la tarjeta, o pídeselo a tu IA. Arrastrar el archivo nuevo también sigue funcionando. En 3.0 no hay nada que trasladar: tus ajustes son tus propios módulos de configuración, tus menús son tus propias copias en Interface y tus scripts están en Extensions, y una actualización nunca toca nada de eso. Si aun así editaste los scripts propios de un pack, la actualización te lo dice, guarda tu versión en Backups y pregunta antes de sustituirlos. Un menú por defecto que editaste en su sitio se sustituye sin preguntar, y tu copia editada se queda en una copia de seguridad protegida, así que mejor haz tu propia copia.
¿Cómo quito un pack?
Desinstalar (Uninstall), en el menú Más (More) de su página, quita su código de todos los servicios tras hacer una copia de seguridad. Tus módulos de configuración y tus menús se quedan, así que al instalarlo de nuevo sigues donde lo dejaste. Un pack que necesitan otros packs instalados, como Datastore & Purchase, se rechaza hasta que se desinstalen esos. Los acompañantes opcionales simplemente se quedan en silencio: sin Sound System los packs no suenan, sin Notifications System no muestran avisos.
Algo no aparece
| Lo que ves | Normalmente |
|---|---|
| Un pack no arrancó | Su configuración no es válida. La línea del Output [RBLXE] <PackId> failed: y el Diagnóstico del plugin nombran la opción. |
| No hay botón del HUD para un pack que instalaste | Settings y Shop de General UI Kit se usan en lugar de los de Sound System y Easy Pet System, a propósito, para que sus botones no salgan dos veces. Para Codes, Spin, Rewards, Daily Rewards y Pets gana el menú del pack: sustituye la demo del kit. Diagnóstico lo lista entre sus notas. |
| No se usa tu menú editado | En tu copia se renombró algo que el pack rellena por nombre, así que se usa la versión propia del pack. Diagnóstico dice qué falta. |
| No hay sonido en ningún sitio | Sound System no está instalado. Cada pack pide sonido esté instalado o no, y recibe silencio si no está. |
| Ningún pack muestra notificaciones | Lo mismo: Notifications System no está instalado. |
| Un premio no hace nada | Apunta a un módulo o a un pack que falta. Codes y Time Rewards lo desactivan al arrancar; Roulette lo salta cuando cae en esa casilla. El Output lo nombra. |
| Los datos no se guardan en Studio | El place no está publicado o el acceso de Studio a las APIs está desactivado. Entonces cada sesión de Play empieza de cero, y el Output lo dice una vez. |
Casi todo lo de arriba imprime un aviso en el Output cuando pasa, con qué hacer. Nada en el ecosistema falla en silencio a propósito.
Datastore & Purchase System
PackId: DatastorePurchaseSystem · Versión: 3.4.1 · Necesita: nada
En 3.0 las opciones que la 2.x guardaba en la carpeta Settings de este pack viven en el módulo de configuración de tu juego, ReplicatedStorage.RBLXEssentials.Config.DatastorePurchaseSystem. Todas las opciones de este pack son compartidas, así que no tiene módulo solo de servidor. El panel del plugin que ves en esta página las edita, y tu IA lista todas las opciones con T.config.reference("DatastorePurchaseSystem").
Qué hace
Aquí vive el progreso de tus jugadores, y es la base con la que guardan todos los demás packs. Hay un solo datastore para todo tu juego, así que un código, un giro y un huevo suman a los mismos números sin nada conectado entre ellos.
- Carga al entrar y guarda con un temporizador, al salir y al cerrar el servidor.
- Una caché en memoria, así que cada lectura durante la sesión es instantánea.
- Replicación en vivo al cliente como objetos Value, así que mostrar un dato no necesita remotes.
- Comprobación de pases de juego, en caché y recordada en el guardado.
- Recibos de productos de desarrollador gestionados con seguridad: un recibo que Roblox reintenta se confirma en vez de darse dos veces.
- Reintentos con espera creciente, control del presupuesto de peticiones y guardados repartidos, para que un servidor lleno no gaste su presupuesto de golpe.
- Seguridad en Studio: una versión de datastore aparte para pruebas, IDs de usuario inventados para los clientes de prueba y un solo aviso tranquilo en vez de una lluvia de errores en un place sin publicar.
Configuración en el plugin
Datos iniciales
Es lo que tiene un jugador nuevo al empezar. Los grupos contienen variables, y una variable es un número, un texto o un verdadero/falso. + Variable y + Grupo (+ Group) los añaden; la cruz roja los quita.
La ruta que construyes aquí, Stats.Cash o Inventory.Slots, es el texto exacto que piden todos los demás packs: el Target de una casilla de premio, la clave de datos de un leaderstat, el DataPath de una etiqueta. Añade una clave aquí y aparece al momento en esos selectores.
Una clave nueva llega a los jugadores que ya existen, en su siguiente carga: cada perfil guardado se combina con los valores por defecto actuales y se rellena lo que falte. Un valor por defecto cambiado solo afecta a los jugadores nuevos. Una clave quitada se queda en los perfiles que ya la tienen, así que borrar una aquí nunca hace perder lo que alguien ganó.
Mira exactamente qué recibe un jugador nuevo
El panel muestra el guardado completo antes de pulsar Play, con tus claves combinadas con las que añaden los packs. Es texto seleccionable, así que también es la forma más rápida de comprobar que una clave se escribe igual que en tu código.
Ajustes del datastore
| Ajuste | Viene con | Qué hace |
|---|---|---|
DataStoreVersion | "v1" | Da nombre al datastore del juego publicado, PlayerData_<this>. Cambiarlo hace empezar de cero a todos los jugadores; sus guardados antiguos se quedan en el store antiguo. Nunca lo cambies en un juego publicado salvo que sea eso lo que quieres. |
StudioDataStoreVersion | "v4" | El sufijo que se usa al probar en Studio, separado para que una prueba nunca pueda tocar los datos de los jugadores reales. |
AutoSaveInterval | 90 | Segundos entre guardados periódicos por jugador, repartidos y con variación aleatoria para respetar el presupuesto del datastore. |
Wipe Studio Data | botón | Borra todos los perfiles guardados en el datastore de Studio, para probar desde cero. Solo lo pulsas tú: haz clic una vez y luego en ¿Seguro? (Confirm?) para seguir. Se niega, y no borra nada, mientras StudioDataStoreVersion coincida con DataStoreVersion, así que nunca puede llegar a los datos reales. Necesita un place publicado con el acceso a la API desde Studio activado. Tu IA nunca borra datos guardados salvo que se lo pidas. |
Ajustes de compras
FreeMode hace que todos los pases cuenten como comprados y que un producto se entregue solo, sin Robux y sin ventana de compra. Así pruebas el recorrido de una compra cincuenta veces en una tarde.
Viene apagado y solo funciona en Studio. Un servidor en vivo siempre comprueba las compras reales y avisa al arrancar si está encendido. También sigue apagado en Studio mientras StudioDataStoreVersion coincida con DataStoreVersion (sin contar espacios ni mayúsculas), y el servidor lo dice al arrancar, para que una prueba nunca pueda dar nada en los guardados de jugadores reales.
Regalos
Desde la 3.4.0 un jugador puede comprar un objeto del Shop para otro jugador del servidor. Cada objeto que quieras que se pueda regalar lleva una línea en Gifts, en la configuración del pack: el objeto (un pase de juego, o un producto de desarrollador con un handler de premio) y su producto de regalo, un producto de desarrollador que creas para el regalo, al precio que quieras. El botón de regalo solo aparece en las fichas de esos objetos.
El comprador elige un jugador en el menú Gift y confirma; el servidor vuelve a comprobarlo todo (que no sea él mismo, que el jugador siga en el servidor, que aún no tenga el pase, que no vaya demasiado rápido) antes de que Roblox pida los Robux. El destinatario recibe el objeto y una ventana que dice quién se lo envió, y el comprador un aviso. Si el destinatario se fue antes de que se completara el pago, el regalo espera y llega cuando entre; si no puede llegar, el comprador se lo queda como regalo para enviar más tarde, gratis.
Pruébalo con FreeMode en la prueba de Clients and Servers de Studio: los regalos se completan sin Robux, como cualquier otra compra ahí.
Desinstalar
Desinstalar (Uninstall), en el menú Más (More) de la página del pack, quita el código del pack de todos los servicios. Tu módulo de configuración se queda, y los datos guardados de los jugadores no se tocan: viven en el datastore de Roblox, no en tu place. Mientras otro pack instalado lo necesite, Desinstalar se detiene y nombra esos packs; desinstálalos primero.
Eso es todo lo del plugin.
Abajo: leer y escribir un guardado desde código, mostrar valores en el cliente y gestionar compras.
Obtener la API
Cada pack arranca a través del kernel y recibe las APIs de los demás con ctx.require. Declara la dependencia en el manifest de tu propio pack y pídela en init:
-- ReplicatedStorage.RBLXEssentials.Packs.MyPack.manifest
return { id = "MyPack", version = "1.0.0", deps = { "DatastorePurchaseSystem" } }
-- ServerScriptService.RBLXEssentials.Packs.MyPack
return function(ctx)
local ds = ctx.require("DatastorePurchaseSystem")
end
El kernel garantiza que este pack ha terminado de arrancar antes de que se ejecute tu init, así que ctx.require nunca espera. Hacer un pack propio es una carpeta y un manifest; el paso a paso está en la referencia del kernel que viene con el código fuente.
API de datos
ds.Get(player)
El guardado completo del jugador. La primera llamada lo carga y lo guarda en caché; cada llamada posterior devuelve la caché al instante. Las primeras llamadas simultáneas se agrupan, así que todas reciben la misma tabla.
local data = ds.Get(player)
print(data.Stats.Cash)
ds.Update(player, mutator)
Aplica un cambio y lo envía a la réplica del cliente. El mutator recibe la tabla directamente.
ds.Update(player, function(data)
data.Stats.Cash += 100
end)
Se escribe en el siguiente guardado y cuando el jugador sale. Cambia la tabla solo con Update, o con las funciones de abajo que lo llaman, para que la réplica siga al día.
ds.GetValue · ds.SetValue · ds.Increment
Atajos por ruta para los casos comunes. La ruta es el mismo texto que muestra el plugin.
local cash = ds.GetValue(player, "Stats.Cash") -- nil if the key is not there
ds.SetValue(player, "Nickname", "Ana") -- creates missing groups on the way
ds.Increment(player, "Stats.Cash", 250) -- returns the new value
ds.Increment(player, "Stats.Cash", -500, 0) -- the last argument is a floor
Increment trata una clave que falta como 0 y rechaza una clave que guarde algo que no sea un número. Tanto él como SetValue devuelven (result, err) y avisan si fallan.
ds.Save(player)
Pone en cola un guardado antes de lo previsto, para los momentos importantes. Devuelve el control al instante; la escritura se hace en segundo plano, respetando el presupuesto.
ds.SaveAndWait(player, timeout?)
Guarda ya y espera a la escritura. Devuelve true solo cuando el guardado está confirmado, y false si no se pudo escribir (también en Studio sin acceso a la API). Pausa tus propios cambios en los datos de ese jugador hasta que termine.
ds.GetSafeUserId(player)
El ID con el que el pack guarda los datos. Un cliente de prueba de Studio, que no tiene UserId real, recibe un ID inventado que dura mientras siga en ese servidor. Úsalo siempre que uses al jugador como clave en tus propios stores.
ds.SaveAllImmediate(maxWaitPerWrite?) · ds.IsFreeMode()
La primera escribe ya todos los perfiles en caché y detiene los guardados programados, así que es solo para el cierre, que el pack ya gestiona por ti. Durante una sesión usa ds.Save o ds.SaveAndWait. La segunda es true mientras FreeMode está encendido y tiene efecto, cosa que solo pasa en Studio.
Leer datos en el cliente
El guardado de cada jugador se refleja bajo su Player como Folders y objetos Value, actualizados con cada escritura. Sin remotes.
-- LocalScript
local player = game.Players.LocalPlayer
local playerData = player:WaitForChild("PlayerData")
playerData:WaitForChild("DataReady") -- true once the first replication landed
local cash = playerData.Stats.Cash
cashLabel.Text = tostring(cash.Value)
cash:GetPropertyChangedSignal("Value"):Connect(function()
cashLabel.Text = tostring(cash.Value)
end)
Los números, textos y booleanos llegan como NumberValue, StringValue y BoolValue; las listas llegan como hijos llamados [1], [2], etc. La réplica es de solo lectura por convención: escribir en estos Values no escribe en el servidor.
Si solo quieres una etiqueta que muestre un número, no necesitas nada de esto. Ponle la etiqueta UI_DataBind y un DataPath, y General UI Kit lo hace por ti.
Compras
ds.HasPass(player, passId)
Mira la caché en memoria, luego el guardado del jugador y luego Roblox, y anota en el guardado la compra confirmada. Devuelve true para todos mientras FreeMode está encendido en Studio, y la caché se limpia sola cuando alguien compra un pase durante la sesión. ds.HasPassStrict(player, passId) hace la misma comprobación pero ignora FreeMode, y devuelve owns, ready.
if ds.HasPass(player, 123456789) then
-- give them the perk
end
ds.registerProfileHandler(productId, grant, afterCommit?)
Así se entrega un producto de desarrollador en 3.0. Un handler por producto. Recibe (player, draft, receipt): cambia solo draft, una copia del guardado del jugador, y devuelve true. El premio y el recibo se guardan juntos, y la compra se confirma a Roblox solo cuando ese guardado sale bien. Si devuelve false o da error, Roblox lo reintenta más tarde, así que no se pierde nada. El handler no puede ceder (yield). Puede devolver true, payload: entonces el afterCommit(player, payload) opcional se ejecuta cuando el guardado está confirmado, para efectos como un mensaje.
ds.registerProfileHandler(987654321, function(player, draft, receipt)
draft.Stats.Cash += 1000
return true
end)
Antiguo: el ds.registerHandler(productId, function(player, receipt)) de la 2.x aún funciona, pero es antiguo: su premio no se guarda junto con el recibo, y el servidor avisa una vez por producto. Usa registerProfileHandler en su lugar. Cada recibo entregado queda anotado en el guardado del jugador, así que un recibo que Roblox vuelve a enviar se confirma sin ejecutar tu handler otra vez. Este pack no guarda los IDs de productos ni de pases: tenlos donde los necesite tu propio código.
ds.GrantProduct(player, productId) · ds.InvalidatePass(player, passId)
La primera ejecuta el handler registrado de un producto sin compra real, y solo mientras FreeMode está encendido en Studio; así pruebas ahí el flujo de un premio. En ese caso tu handler recibe nil como receipt. La segunda borra el resultado en caché de un pase; las compras durante la sesión ya lo hacen por ti.
Saber cuándo alguien ha comprado algo
El pack publica un BindableEvent que cualquiera puede escuchar, sin declarar una dependencia:
local hook = game:GetService("ServerScriptService").RBLXEssentials
.Packs.DatastorePurchaseSystem:FindFirstChild("PurchaseCompleted")
if hook then
hook.Event:Connect(function(player, kind, id, currencySpent)
print(player.Name, "bought", kind, id)
end)
end
kind es "product" o "gamepass". Para un producto se dispara cuando el premio y el recibo están guardados. Para un pase de juego se dispara cuando Roblox informa de la compra, con currencySpent en nil. Un GrantProduct con FreeMode en Studio también lo dispara, como producto con currencySpent 0, así que todo el recorrido de un producto se puede probar ahí. Notifications System usa justo este hook, y por eso ninguno de los dos packs declara al otro.
Cómo es un guardado
{
Meta = {
SchemaVersion = 1
-- plus, at runtime: FirstJoinDate, SessionStart,
-- SessionId, LastSaveDate, SaveCount
},
Stats = {
Cash = 0,
Wins = 0
},
Pets = {
Equipped = {},
Owned = {}
},
Purchases = {
Gamepasses = {},
ReceiptHistory = {} -- appears with the first product purchase
}
}
Stats, y cualquier otra cosa que añadas, sale de Datos iniciales (Default Data), arriba. Este pack añade Pets y Purchases si no los pones, y siempre añade Meta, su propio registro, que Datos iniciales no puede definir.
Cuando un guardado no se puede leer
Un jugador cuyos datos no cargan no entra al juego con un guardado vacío. Se le pide que vuelva a entrar, y su guardado real sigue ahí cuando lo hace. Es el único caso en que no hacer nada le costaría a alguien su progreso sin que se notara. Lo mismo pasa si otro servidor toma su perfil: se le pide que vuelva a entrar en vez de dejar que dos servidores escriban un mismo guardado.
Easy Pet System
PackId: EasyPetSystem · Versión: 3.3.5 · Dependencias: Datastore & Purchase Sound System (opcional) Notifications System (opcional) General UI Kit (opcional)
En 3.0 las opciones que la 2.x guardaba en la carpeta Settings de este pack están en el módulo de configuración de tu juego, Config.EasyPetSystem en ReplicatedStorage (todas las opciones de este pack son compartidas, así que no hay módulo solo de servidor). El catálogo de mascotas, Assets.PetData, es contenido de tu juego y no configuración: lo editas donde está, y las actualizaciones conservan un catálogo que hayas cambiado. El panel del plugin que ves en esta página edita los dos, y tu IA lista todas las opciones con T.config.reference("EasyPetSystem").
Qué hace
Easy Pet System es un sistema de mascotas completo y listo para producción en Roblox. Los jugadores abren huevos para sacar mascotas, las coleccionan en distintas rarezas, fusionan duplicados en versiones más raras, equipan mascotas que los siguen por el mapa y ganan bonificaciones de multiplicador.
- Probabilidades ponderadas por huevo, para abrir uno o tres a la vez.
- Funciona con el pase de juego de apertura automática.
- Funciona con el pase de juego de apertura triple.
- Funciona con el pase de juego Extra Pet Space.
- Tres modos de movimiento de mascotas (Ground, Float (órbita) y Follow), que se pueden cambiar durante la partida.
- Fusiona 3 mascotas del mismo tipo para obtener la siguiente rareza.
- Merge All: fusiona en una sola llamada todos los grupos que se puedan.
- Equip Best: equipa automáticamente la combinación con el multiplicador más alto.
- API de multiplicador: suma o producto de los multiplicadores de todas las mascotas equipadas, accesible desde cualquier script de servidor.
- 28 modelos de mascotas incluidos en 5 rarezas (todos se pueden reemplazar).
- Carteles de huevo (BillboardGui) con botones de compra, x3 y apertura automática y con las probabilidades, más una revelación a pantalla completa en cada apertura.
- Los botones del cartel funcionan en cualquier dispositivo: E, R y T con teclado, X, Y y RB con mando, y botones redondos junto al de saltar en el móvil.
Configuración en el plugin
Obligatorio: este pack usa DataStore de Roblox. Ve a Game Settings → Security → Enable Studio Access to API Services antes de probar; si no, los datos de los jugadores no se guardarán.
Todos los ajustes se gestionan directamente desde el plugin, sin editar scripts.
General y pases de juego
Muestra los pases de juego que usa el pack. Cada ID empieza en 0, que desactiva ese pase, hasta que pegues el tuyo desde el Creator Dashboard de Roblox. Un jugador tiene un pase por su ID, así que cuando ya vendas uno, no cambies nunca su ID.
- BaseCash: el dinero que da la placa de demostración Add Cash en cada uso, multiplicado por el multiplicador total de mascotas del jugador (500 por defecto). Desde la 3.0.2 la placa solo funciona en pruebas de Studio: en un servidor publicado su indicador de interacción está desactivado. Bórrala (
Workspace > RBLXEssentials > EasyPetSystem > AddCashPart) antes de publicar, salvo que tu juego la quiera. - ExtraPetSpace: deja que un jugador equipe una mascota más que
MaxEquipped. - AutoHatch: permite a los jugadores abrir huevos de forma automática y continua.
- TripleHatch: permite a los jugadores abrir 3 huevos a la vez.
Antes de probar: crea estos pases de juego en el Creator Dashboard de Roblox para tu experiencia y pega cada ID en su campo. Mientras un ID sea 0, ese pase está desactivado.
Datos de mascotas
- MaxOwned: número máximo de mascotas que un jugador puede tener en su inventario.
- MaxEquipped: número máximo de mascotas que un jugador puede tener equipadas a la vez (una más con el pase ExtraPetSpace).
- MergeCount: número de mascotas del mismo tipo necesarias para hacer una fusión.
- ProximityDistance: a cuántos studs debe estar un jugador de un huevo para que se activen su cartel y sus botones. Alejarse también detiene la apertura automática.
- FollowMode: el modo con el que empieza cada jugador. Opciones:
Ground,Orbit,Follow.Orbitlleva la etiqueta "Float" para tus propios menús.
Rarezas
Las rarezas se definen en ReplicatedStorage > RBLXEssentials > Packs > EasyPetSystem > Assets > PetData > Rarities. El catálogo de mascotas es contenido de tu juego, así que las actualizaciones conservan un catálogo que hayas cambiado. Puedes añadir, quitar y renombrar rarezas libremente. Las mascotas se refieren a las rarezas por su nombre.
| Valor | Tipo | Controla |
|---|---|---|
order | number | Rango de la rareza, usado para ordenar las mascotas en el menú Pets y para decidir el destino de la fusión (la rareza siguiente). Menor = más débil. |
MainColor | Color3 | Borde de cada tarjeta y de cada casilla del cartel del huevo, el texto de probabilidad, el primer punto del degradado y el fondo de la revelación de mascota nueva. |
SecondaryColor | Color3 | Segundo punto del degradado. |
EggBoardTextColor | Color3 | Color del nombre de la mascota en los carteles de huevo. |
NewPetTextColor | Color3 | Texto del nombre y la rareza de la mascota en la revelación de mascota nueva. |
MenuTextColor | Color3 | Color del nombre de la mascota en el menú Pets. |
Estos valores son los que se dibujan. El borde de cada tarjeta toma el MainColor de la rareza, su degradado va de MainColor a SecondaryColor y el nombre de la mascota toma MenuTextColor; todo se aplica al construir el menú. Los colores de las plantillas que vienen con el pack coinciden con estos, así que el editor te enseña lo que verá un jugador, pero mandan los datos.
Plantillas de tarjeta de mascota
Las tarjetas de mascota del menú Pets se clonan de una plantilla por rareza, guardada dentro del propio menú Pets. En la copia del menú que trae el pack están en:
StarterGui > RBLXEssentials > EasyPetSystem > EasyPetSystemGUI
> Pets > Container > PetContainer > Container
Cada plantilla es un Frame llamado [Rarity]PetTemplate (p. ej. CommonPetTemplate, EpicPetTemplate) con una etiqueta de CollectionService del mismo nombre. Al dibujar una tarjeta de mascota, el sistema encuentra la plantilla correcta por la etiqueta:
CollectionService:GetTagged(petDef.rarity .. "PetTemplate")
La plantilla que coincide se clona, se rellena con los datos de esa mascota y luego se vuelve a colorear con los valores de su rareza. Cambia el estilo de una plantilla como quieras en tu propia copia del menú Pets: créala desde la pestaña Interfaz (Interface) del plugin (el lápiz) o pídeselo a tu IA. Las copias están en StarterGui > RBLXEssentials > Interface, donde las actualizaciones nunca las tocan. La forma, las esquinas, la disposición y las fuentes son tuyas, y los tres huecos de color se sobrescriben con los de la rareza para que la tarjeta siempre combine con el resto del pack.
Para añadir una rareza nueva, en tu copia del menú Pets crea un Frame nuevo en el contenedor, llámalo [NewRarity]PetTemplate y ponle la etiqueta de CollectionService [NewRarity]PetTemplate. Una rareza sin plantilla propia usa la plantilla de la rareza más baja.
Mascotas
La lista completa de mascotas del juego. Cada mascota tiene una imagen de vista previa (el modelo 3D), un nombre, una rareza y un valor de multiplicador. Aquí puedes añadir mascotas nuevas, borrar las que hay o cambiar cualquiera de sus propiedades.
Huevos
Define todos los huevos del juego. Cada huevo tiene un nombre, un precio, una moneda (Cash o Robux) y una tabla de porcentajes que indica qué mascotas pueden salir de él y con qué probabilidad. El total debe sumar 100%.
Abajo puedes crear un huevo nuevo de Cash con + Cash (+ Cash Egg) o uno de Robux con + Robux (+ Robux Egg).
Huevos de Robux
Los huevos de Robux usan robuxPrice (el precio que se muestra, en Robux) y un productId (el ID del producto de desarrollador del Creator Dashboard de Roblox) en lugar de un precio en Cash.
El huevo de Robux que viene con el pack, Tier6Egg, vende un producto de demostración de RBLX Essentials. Antes de publicar, pon en su productId el ID de tu propio producto de desarrollador. 0 o un ID negativo no lo desactiva: el huevo sigue apareciendo, su botón Open solo dice "This egg isn't for sale yet" y Diagnóstico (Diagnostics) lo sigue señalando. Para no tener huevo de Robux, borra su entrada, ReplicatedStorage > RBLXEssentials > Packs > EasyPetSystem > Assets > PetData > Eggs > Tier6Egg, y también su soporte en Workspace > RBLXEssentials > EasyPetSystem > Eggs. Sus cuatro mascotas Dominus se quedan en tu lista de mascotas, pero sin huevo el menú Index deja de mostrarlas y no se pueden fusionar; así que en un juego publicado cuyos jugadores puedan tenerlas, pon un ID real.
Desinstalar
Elige Desinstalar (Uninstall) en el menú Más (More) de la página del pack. Quita el pack de todos los servicios donde se instaló, huevos de demostración incluidos, y guarda una copia de seguridad en ServerStorage > RBLXEssentials > Backups, con tu catálogo de mascotas. Tu módulo Config.EasyPetSystem se queda. Las mascotas guardadas no se tocan: están en los datos del jugador, no en tu place.
Eso es todo lo del plugin.
Si no piensas modificar el código del pack ni llamar a sus APIs desde tus propios scripts, puedes parar aquí. Las secciones de abajo son para desarrolladores que quieren integrar el sistema directamente en su propio código.
API
Declara "EasyPetSystem" en el manifest.deps de tu propio pack y pídeselo al kernel:
local pets = ctx.require("EasyPetSystem")
pets.GetTotalMultiplier(player, multiply?)
Devuelve el multiplicador combinado de todas las mascotas equipadas.
-- Sum all equipped multipliers (e.g. 1 + 1.5 + 2 = 4.5)
local total = pets.GetTotalMultiplier(player)
-- Multiply all equipped multipliers (e.g. 1 * 1.5 * 2 = 3.0)
local product = pets.GetTotalMultiplier(player, true)
-- Apply to a reward (the sum is 0 with no pet equipped, so pay the base amount then)
local mult = pets.GetTotalMultiplier(player)
local reward = if mult > 0 then baseCash * mult else baseCash
pets.HatchEgg(player, eggId, count, isAuto?)
Abre el huevo indicado y saca una o tres mascotas. Devuelve una tabla de resultado.
local result = pets.HatchEgg(player, "Tier1Egg", 1)
if result.ok then
for _, pet in result.pets do
print(pet.id, pet.rarity, pet.multiplier)
end
end
Parámetros:
eggId(string): la clave de un huevo de Cash en Eggs de PetData. Un huevo de Robux solo se vende con su producto de desarrollador y aquí devuelve"invalid_egg".count(number): de1a3;3necesita el pase TripleHatch.isAuto(bool, opcional):truepara la apertura automática (necesita el pase AutoHatch).
Motivos de fallo: "invalid_egg", "insufficient_funds", "inventory_full", "need_triple_pass", "need_auto_pass", "cooldown", "busy" (otra acción de este jugador sigue en marcha).
Cada mascota de result.pets tiene: uid, id, rarity, multiplier, createdAt.
pets.EquipPet(player, uid)
Equipa una mascota por su ID único. Los jugadores pueden tener equipadas hasta MaxEquipped mascotas (3 por defecto), una más con el pase ExtraPetSpace.
pets.UnequipPet(player, uid)
Desequipa una mascota por su ID único.
pets.DeletePet(player, uid)
Borra una mascota del inventario del jugador. Antes hay que desequiparla.
pets.MergePets(player, petId)
Gasta MergeCount copias (3 por defecto) de la misma mascota y da una mascota de la rareza siguiente del mismo huevo, elegida según las probabilidades de ese huevo. Primero se usan las copias sin equipar; si no hay suficientes, las equipadas completan el resto y se desequipan antes de gastarse.
local result = pets.MergePets(player, "Cat")
if result.ok then
print("Merged into:", result.pet.rarity)
end
Motivos de fallo: "no_next_tier", "not_enough", "invalid_pet", "busy".
pets.MergeAll(player)
Fusiona mascotas sin equipar, en grupos de MergeCount, una y otra vez hasta que no quede ningún grupo. Nunca usa mascotas equipadas.
local result = pets.MergeAll(player)
print("Merges performed:", result.mergeCount)
pets.EquipBest(player)
Desequipa todas las mascotas actuales y vuelve a equipar la combinación con el multiplicador total más alto, hasta el límite de equipadas.
Configuración
Mascotas, huevos, rarezas y límites principales se definen con datos: edítalos en el Explorer o en el panel de ajustes del plugin sin tocar código. El comportamiento del movimiento de las mascotas (radio, velocidad, balanceo) es la opción PetVisuals de Config.EasyPetSystem (ver abajo).
Ajustes principales
Estos cinco límites son valores del catálogo de mascotas, Assets.PetData, que es contenido de tu juego: edítalos ahí o en el plugin. No son opciones de Config.EasyPetSystem.
| Ajuste | Por defecto | Descripción |
|---|---|---|
MaxOwned | 50 | Máximo de mascotas que un jugador puede tener en su inventario. |
MaxEquipped | 3 | Número base de mascotas que un jugador puede equipar a la vez. |
MergeCount | 3 | Número de mascotas necesarias para hacer una fusión. |
FollowMode | "Ground" | El modo con el que empieza cada jugador. Opciones: "Ground", "Orbit", "Follow". Orbit lleva la etiqueta "Float" para tus propios menús. |
ProximityDistance | 7 | A cuántos studs debe estar un jugador de un huevo para que se active su cartel. |
Cambiar el modo de seguimiento durante la partida
El modo de movimiento activo lo controla un atributo PetFollowMode en el jugador local. Cámbialo desde cualquier LocalScript, por ejemplo desde un botón de tu propio menú de ajustes:
local Players = game:GetService("Players")
Players.LocalPlayer:SetAttribute("PetFollowMode", "Orbit") -- "Ground", "Orbit", or "Follow"
Las mascotas reaccionan al momento; no hace falta volver a entrar ni reaparecer. Cada jugador empieza con el FollowMode de PetData; si el atributo no nombra un modo de Modes, las mascotas usan PetVisuals.DefaultMode.
Ajustar el movimiento de las mascotas: PetVisuals
La opción PetVisuals, en Config.EasyPetSystem (la edita la sección Pet Visuals del plugin), define cada modo de movimiento y sus parámetros. Estos son sus valores por defecto; tus valores se combinan encima, modo a modo:
PetVisuals = {
DefaultMode = "Ground",
Modes = {
Orbit = {
label = "Float", -- display name for your own menus
Radius = 4, -- studs from character center
Speed = 45, -- degrees per second
FloatHeight = 2.5, -- studs above HumanoidRootPart
BobAmount = 0.25, -- vertical bob amplitude (studs)
BobSpeed = 1.2, -- bob frequency (Hz)
LerpAlpha = 0.15,
},
Ground = {
label = "Ground",
Radius = 4,
Speed = 35,
FloatHeight = -2, -- floor level relative to HumanoidRootPart
BobAmount = 0,
BobSpeed = 0,
LerpAlpha = 0.15,
},
Follow = {
label = "Follow",
Spacing = 2.5, -- studs between each pet in the trail
FloatHeight = -2,
LerpAlpha = 0.1,
},
},
}
Ajusta aquí el radio, la velocidad de órbita, la altura de flotación, el balanceo o la separación en fila para cambiar cómo se mueven las mascotas equipadas.
Anunciar mascotas raras: RareAnnounce
También en Config.EasyPetSystem: cuando un jugador abre o fusiona una mascota cuya rareza tiene un order de al menos MinOrder (3, Rare y superiores en la escala que viene con el pack), todo el servidor recibe una línea de chat, Message ("{rarity} drop! {player} just hatched {pet}!"). Necesita Notifications System; sin él no se dice nada.
Leer la configuración en código: PetConfig
ReplicatedStorage > RBLXEssentials > Packs > EasyPetSystem > PetConfig carga todo el árbol de PetData en una tabla Lua normal con PetConfig.load, y se puede usar tanto en el cliente como en el servidor:
local pack = ReplicatedStorage.RBLXEssentials.Packs.EasyPetSystem
local PetConfig = require(pack.PetConfig)
local config = PetConfig.load(pack.Assets.PetData)
print(config.MaxOwned, config.MaxEquipped, config.MergeCount)
print(config.ProximityDistance, config.FollowMode)
local catDef = config.Pets["Cat"] -- { name, rarity, multiplier }
local eggDef = config.Eggs["Tier1Egg"] -- { name, price, currency, pets, robuxPrice?, productId? }
local rarity = config.Rarities["Epic"] -- { order, MainColor, SecondaryColor, EggBoardTextColor, NewPetTextColor, MenuTextColor }
PetConfig.getNextRarityPets(config, petId) devuelve las candidatas de fusión de una mascota (las entradas { id, percent } del mismo huevo en la rareza siguiente) o nil si la mascota ya es de la rareza más alta de su huevo:
local candidates = PetConfig.getNextRarityPets(config, "Cat")
if candidates then
for _, entry in candidates do
print(entry.id, entry.percent)
end
end
Pases de juego
Configura estos IDs de pase en los ajustes del plugin para activar las funciones correspondientes:
| Pase de juego | Efecto |
|---|---|
TripleHatch | Permite abrir 3 huevos a la vez. |
AutoHatch | Permite la apertura automática continua. |
ExtraPetSpace | Sube en uno el límite de equipadas (de 3 a 4 con el MaxEquipped por defecto). |
Un pase que se queda en 0 está apagado: su botón de la tienda dice «Not for sale» y los carteles de huevos esconden su botón «Open x3» o «Auto».
Integración en el cliente: remotes
Al arrancar, el servidor del pack crea sus remotes a través del Kernel, en ReplicatedStorage > RBLXEssentials > Kernel > Remotes > EasyPetSystem:
| Remote | Tipo | Se llama con |
|---|---|---|
BuyAndHatchEgg | RemoteFunction | { eggId = "Tier1Egg", count = 1, isAuto = false } |
GrantFreeProduct | RemoteFunction | un ID de producto de desarrollador (FreeMode solo en Studio: da un huevo de Robux sin compra) |
EquipPet | RemoteFunction | uid de la mascota |
UnequipPet | RemoteFunction | uid de la mascota |
DeletePet | RemoteFunction | uid de la mascota |
MergePets | RemoteFunction | petId |
EquipBest | RemoteFunction | nada |
MergeAll | RemoteFunction | nada |
OpenStoredEgg | RemoteFunction | { eggId = "Tier1Egg" } (abre un huevo que el jugador ya tiene) |
PremiumHatchResult | RemoteEvent | se dispara servidor → cliente con los resultados de aperturas con Robux |
Los IDs de pase que comprueba la interfaz incluida son la opción Gamepasses de Config.EasyPetSystem. El pack también pone un atributo FreeMode en ReplicatedStorage > RBLXEssentials > Packs > EasyPetSystem: cuando es true (el FreeMode de Datastore, solo en Studio), se saltan las comprobaciones de pases.
Usa estos remotes para lanzar acciones de mascotas desde tu propia interfaz:
local Remotes = ReplicatedStorage:WaitForChild("RBLXEssentials"):WaitForChild("Kernel")
:WaitForChild("Remotes"):WaitForChild("EasyPetSystem")
local result = Remotes.BuyAndHatchEgg:InvokeServer({
eggId = "Tier1Egg",
count = 1,
isAuto = false,
})
if result.ok then
print("Hatched:", result.pets[1].id)
end
Añadir modelos de huevo al mapa
Los modelos de huevo de Workspace se encuentran por etiqueta, así que puedes poner tantos como quieras. Cada Model de huevo debe:
- Tener la etiqueta
Eggde CollectionService. - Tener un atributo de texto
EggIdque coincida con una clave de la configuración de Eggs (p. ej."Tier2Egg"). - Contener una pieza llamada
Guicon unBillboardGuicon la etiquetaEggBoard: es la interfaz de apertura que usan los jugadores.
Lo más sencillo: duplica uno de los modelos de huevo incluidos, cambia su atributo EggId y cambia la malla. El cartel, la detección de proximidad y los botones de apertura se conectan solos.
Aviso de apertura
La revelación de apertura (la revelación de la mascota a pantalla completa tras abrir un huevo) son dos piezas de interfaz, HatchReveal para una mascota y HatchRevealTriple para tres. El pack las muestra solo tras cada apertura, incluidas las de Robux. Para cambiar su estilo, crea tu propia copia desde la pestaña Interfaz del plugin (el lápiz) o pídeselo a tu IA; las copias están en StarterGui > RBLXEssentials > Interface, donde las actualizaciones nunca las tocan.
Desde un módulo de pack de cliente que declare "EasyPetSystem" en manifest.deps, ctx.require("EasyPetSystem").OpenStoredEgg(eggId) abre un huevo que el jugador ya tiene y muestra la misma revelación:
local pets = ctx.require("EasyPetSystem")
local result = pets.OpenStoredEgg("Tier1Egg")
-- result.ok, or result.reason: "busy" while a reveal is playing, "not_ready" before the reveal has loaded
Mascotas incluidas
28 mascotas en 5 rarezas, diseños propios hechos para RBLX Essentials. Todos los modelos de mascota se pueden reemplazar: puedes añadirlos, quitarlos o cambiarlos cuando quieras sin tocar código.
| Rareza | Rango de multiplicador |
|---|---|
| Common | x1 a x500 |
| Uncommon | x2 a x750 |
| Rare | x4 a x80,000 |
| Epic | x25 a x200,000 |
| Legendary | x400 a x1,500,000 |
Sound System & Music Player
PackId: SoundSystem · Versión: 3.2.2 · Necesita: nada
En 3.0 las opciones que la 2.x guardaba en la carpeta Settings de este pack están en el módulo de configuración de tu juego, Config.SoundSystem en ReplicatedStorage (todas las opciones de este pack son compartidas, así que no hay módulo solo de servidor). El panel del plugin que ves en esta página las edita, y tu IA lista todas las opciones con T.config.reference("SoundSystem").
Qué hace
Sound System trae 42 efectos de sonido, quince pistas de música y siete plantillas de reproductor de música, Studded incluida. Elige una en Diseño del reproductor (Player design) en los ajustes del pack: la vista previa la muestra cerrada y abierta, y al elegirla pasa a ser tu versión en Interfaz (Interface). Cada reproductor tiene controles para abrir y ocultar que no cortan la reproducción. La música y los SFX usan grupos de volumen separados, así que silenciar uno no toca el otro.
También es lo que da sonido a todos los demás packs. Cada pack del ecosistema pide su sonido tanto si este pack está instalado como si no, y recibe silencio si no lo está, así que añadirlo más tarde activa el audio en todos a la vez, sin nada que conectar.
Configuración en el plugin
General y reproductor de música
| Ajuste | Por defecto | Qué hace |
|---|---|---|
SFXEnabled | activado | Interruptor general. Si está apagado, todos los efectos de sonido del juego quedan en silencio, para todos los jugadores. Es el valor al arrancar el servidor; con el juego en marcha, lo cambia SetSFXEnabled del pack. |
MusicPlayerEnabled | activado | La opción MusicPlayer.Enabled. Si está apagada, el reproductor de música se oculta y no suena música. Para juegos que no lo quieren. |
Template | MusicPlayer_Template_1 | Solo lectura: indica el reproductor de música que usa tu juego y lo muestra en vista previa. El lápiz de la pestaña Interfaz del plugin crea o edita tu versión, y el ojo lo muestra en pantalla. |
Start Volumes | sin definir | Volúmenes de SFX y Music, de 0 a 10, que se aplican al arrancar el servidor. Si no se definen, cada grupo mantiene el Volume que tiene en SoundService. |
Vienen siete skins: las seis originales, ahora con controles para abrir y ocultar, y una séptima, Studded. El reproductor de música es una pieza de la interfaz, SoundSystem.MusicPlayer. Para cambiar su estilo, haz tu propia copia desde la pestaña Interfaz del plugin (el lápiz) o pídeselo a tu IA; las copias están en StarterGui > RBLXEssentials > Interface, donde las actualizaciones nunca las tocan. Para usar otra skin, elígela en Diseño del reproductor en los ajustes del pack (de Diseño 1 a Diseño 7, Design 1 to 7): el plugin hace tu copia con esa skin, en un solo paso de deshacer. Las skins están en ReplicatedStorage > RBLXEssentials > Packs > SoundSystem > Assets > Templates. Para tener música sin reproductor en pantalla, pon Visible en false en el frame de tu copia. La imagen de abajo muestra los seis diseños originales.
Música
Vienen quince canciones. Cada una lleva su propio volumen, así que una pista masterizada más fuerte que las demás se puede bajar sola en vez de bajar toda la lista. El volumen del grupo, encima de ellas, las mueve todas juntas.
SFX
Vienen 42 efectos: dinero, compras, hover, pulsaciones, subidas de nivel, recogidas, impactos, movimiento y agua. Los 24 añadidos son sonidos opcionales; no se asignan solos al juego. El plugin mide el volumen de cada uno en decibelios y marca los que se apartan de tu objetivo con un botón Igualar (Match); Igualar todo (Match all) ajusta de una vez todos los que se desvían.
WindLoop, UI_Confirm_01, Water_Splash_10 y Movement_Swish_04 no se incluyen porque sus IDs de audio de Roblox no se podían distribuir. Para esos, usa PlayLoop o PlayOneShot con tus propios sonidos.
+ Añadir sonido (+ Add sound), o + Añadir canción (+ Add song) en Música, acepta un ID de asset o un texto rbxassetid://, más un nombre opcional. Ese nombre es el que pasas a SFX:Play, y el que te ofrecerá a partir de entonces cada desplegable de sonido del plugin.
Desinstalar
Elige Desinstalar (Uninstall) en el menú Más (More) de la página del pack. Quita el pack de todos los servicios donde se instaló. Todos los demás packs se quedan en silencio en vez de romperse.
Eso es todo lo del plugin.
Abajo: reproducir sonidos desde tu propio código, la estructura del reproductor de música y los controles de volumen.
Dónde están los sonidos
SoundService > RBLXEssentials > SoundSystem > SFX -- sound effects
SoundService > RBLXEssentials > SoundSystem > Music -- music tracks
Son contenido del modo edición, no algo que se crea en tiempo de ejecución, así que puedes verlos y cambiarlos en el Explorer. Los sonidos se buscan por nombre: pon un Sound en el grupo correcto y está disponible al momento, también si lo añades con el juego en marcha. El SoundGroup de cada sonido se asigna solo, así que respeta el volumen del jugador sin que tengas que indicárselo.
Reproducir un sonido
Desde cualquier LocalScript tuyo:
local SFX = require(game.ReplicatedStorage.RBLXEssentials.Kernel.SFX)
-- Plays by name. Restarts if it is already playing.
SFX:Play("Press")
-- Clones it, so several can overlap. Each clone cleans
-- itself up when it finishes. Use this for anything that
-- can fire in quick succession.
SFX:PlayOverlap("Gold_Pickup")
Esta es la fachada de sonido del propio kernel, la que llaman también todos los packs. No hace nada, en silencio, cuando Sound System no está instalado, así que el código escrito con ella nunca da error en un place que no tiene el pack.
Variación de tono y bucles propios
Dentro de un módulo de pack de cliente que inicia el Kernel, declara SoundSystem en manifest.deps y luego obtenlo con ctx.require("SoundSystem"). Así tu pack solo arranca cuando Sound System está instalado; para sonidos que nunca deben bloquear tu pack, usa la fachada SFX del Kernel de arriba. PlayOneShot(name, {volume = 0.7, pitch = 1.05}) reproduce una copia 2D sin cambiar la plantilla. PlayLoop(name, options) devuelve un bucle propio: cambia su volumen o su PlaybackSpeed y llama a Destroy() al terminar. Pon tu propio asset de bucle.
Las dos APIs pueden devolver nil mientras cargan, con el sonido silenciado o al llegar a su límite de voces. El volumen multiplica el de la plantilla (de 0 a 2); el tono es el PlaybackSpeed absoluto (de 0.5 a 2). Los sonidos sueltos permiten ocho voces y caducan a los ocho segundos; los bucles tienen un límite aparte de dos y no caducan solos a los ocho segundos.
En un punto del mundo
La reproducción con posición está en la API de servidor del pack, a la que llegas por el kernel tras declarar "SoundSystem" en el manifest.deps de tu propio pack:
local sound = ctx.require("SoundSystem")
-- Everyone hears it, wherever they are.
sound.PlayAt("Money_1", part.Position)
-- With a range, it falls off with distance instead.
sound.PlayAt("Money_1", part.Position, 30)
-- Or for one player only.
sound.PlayAtForPlayer(player, "Gem_Pickup", part.Position, 30)
Un sonido con alcance recibe una pieza invisible en ese punto, se atenúa con LinearSquare, y la pieza se destruye cuando el sonido termina. Sin alcance suena en todo el juego, clonado directamente en el grupo SFX. En los dos casos se queda en ese grupo, así que el volumen y el silencio del propio jugador siguen aplicándose.
Oír los tres antes de escribir nada
Vienen cinco piezas en Workspace > RBLXEssentials > SoundSystem > Demo, cada una con un prompt y sin nada de código. Entre todas cubren todas las formas de reproducir un sonido: directo al oído, desde un punto del mundo y desde un punto solo para un jugador, las dos últimas con y sin alcance de atenuación. Acércate, pulsa el prompt, oye la diferencia y luego borra la carpeta.
El reproductor de música
Pon tus pistas en el grupo Music y el cliente hace el resto: crea la lista, empieza con una pista al azar, pasa a la siguiente cuando una termina y se adapta si se añaden o quitan pistas con el juego en marcha.
La UI funciona con etiquetas. Pon la etiqueta MusicPlayerFrame a cualquier Frame y dale esta estructura:
Frame (tagged MusicPlayerFrame)
└── Container
├── SongName (TextLabel)
├── Duration (TextLabel)
└── Buttons
├── Mute (ImageButton with an "Icon" child)
└── Next (ImageButton)
Todo viene conectado: el nombre de la canción, el tiempo transcurrido y el total actualizados en vivo, un botón de silencio que cambia su icono y otro para saltar. Puedes etiquetar más de un frame, por ejemplo uno en el HUD y otro dentro de un panel de ajustes. Comparten un único estado de reproducción, así que silenciar en uno actualiza todos los demás al instante, y se detectan los frames que se añaden o quitan en tiempo de ejecución.
Controles de volumen
El pack registra seis acciones que puedes poner en cualquier botón dentro de un menú o elemento del HUD que gestiona el kit, poniéndole el atributo Action. Sin código.
| Acción | Qué hace |
|---|---|
ToggleMusicMute | Silencia y quita el silencio de la música, recuperando el volumen anterior. |
ToggleSFXMute | Lo mismo para los efectos de sonido. |
MusicVolumeUp / MusicVolumeDown | Sube o baja un paso el volumen de la música. |
SFXVolumeUp / SFXVolumeDown | Sube o baja un paso el volumen de los SFX. |
El volumen se mueve en una escala de nueve pasos de 0.04 a 1.0, así que cada pulsación es un cambio que se oye en vez de un avance lineal casi imperceptible. Los handlers también controlan una respuesta visual opcional: un botón de silencio con una etiqueta Status muestra ON u OFF, y un frame con un atributo VolumeGroup de "Music" o "SFX", cuyo hijo VolumeFrame contiene de Volume1 a Volume9, se dibuja como una barra de volumen en vivo.
Todo se mantiene sincronizado en todas partes, porque el silencio del reproductor de música y el del menú Settings mueven el mismo SoundGroup.
El pack trae su propio panel Settings y el botón que lo abre, así que los controles de volumen existen aunque no haya otro pack instalado. Con General UI Kit presente, gana su panel Settings y estos controles aparecen ahí. Un solo menú, sea cual sea el pack que lo puso.
General UI Kit
PackId: GeneralUIKit · Versión: 3.5.2 · Necesita: nada
En 3.0 el aspecto de General UI Kit es el estilo del juego, Plain o Studded (más abajo). Para cambiar sus menús, haz tu propia copia en StarterGui > RBLXEssentials > Interface. Tus propias acciones de botón están en ReplicatedStorage.RBLXEssentials.Extensions.GeneralUIKit.CustomHandlers. Las actualizaciones nunca tocan ninguno de los dos.
Qué hace
General UI Kit es el sistema de menús que tu juego iba a necesitar de todos modos, y el framework al que se conecta el resto del ecosistema. El comportamiento se declara con etiquetas de CollectionService y atributos de Instance, así que añadir un panel o un botón es poner una etiqueta, no editar un script.
Trae catorce menús ya hechos (Shop, Settings, Teleport, Changelogs, Pets, Codes, Daily Rewards, Rewards, Spin, Rebirth, Upgrades, Trade, Trade Inventory y Trade Request), con 11 botones del HUD en la cuadrícula más el botón Changelogs, un botón de invitar, una barra de efectos y los tooltips. Un juego que solo tenga el kit tiene todos los menús. También ofrece:
- Gestión de paneles: abrir, cerrar, modo exclusivo, transiciones animadas.
- Sonidos de botón, escala al pasar el ratón y tooltips que siguen al cursor.
- Animaciones decorativas: rotación, flotar al pasar el ratón, flotar en reposo, ciclo de colores.
- Un sistema de iconos de efecto con descripciones en tooltip.
- Enlace de datos en vivo, para que una etiqueta muestre y siga un valor guardado sin ningún script.
- Sonidos de escritura en las cajas de texto.
- Un sitio para tus propias acciones de botón que las actualizaciones del pack nunca sobrescriben.
Menús de demostración. Pets, Codes, Rewards, Daily Rewards y Spin son menús de demostración completos con el contenido que mostraba la 2.x. Se abren, se animan y suenan, y no hacen nada más hasta que el juego los conecta. Cuando se instala el pack dueño de uno de ellos (Easy Pet System, Codes System, Time Rewards System, Roulette System), el menú del pack sustituye a la demo del kit, así que solo se ve una copia, y los cambios que hiciste en la demo pasan al menú del pack.
Plantillas. Rebirth, Upgrades y Trade (con Trade Inventory y Trade Request) no tienen ningún pack detrás. Dale a sus botones un Action y conéctalo en ReplicatedStorage.RBLXEssentials.Extensions.GeneralUIKit.CustomHandlers.
Cómo funciona
El kernel descubre los elementos etiquetados en cualquier parte del PlayerGui local, tanto al arrancar como cuando van llegando. Las etiquetas dicen qué es un elemento; los atributos dicen cómo se comporta. Ponle a un Frame la etiqueta UI_Panel, define PanelId = "Shop" y ya es un panel.
Como el descubrimiento es por etiqueta y no por ruta, los menús de todos los packs acaban en el mismo sistema. Cuando dos packs traen el mismo menú (Easy Pet System también tiene un Shop), el kernel usa uno y oculta el otro, así que tienes un solo Shop y no dos. En los menús de demostración del kit (Codes, Spin, Rewards, Daily Rewards y Pets) gana el menú del pack: en cuanto ese pack está instalado, se usa su menú y no la demo. Cuando haces tu propia copia de un menú en StarterGui > RBLXEssentials > Interface, se usa tu copia y la del pack se deja tal cual.
Los clics en botones se reparten por nombre de acción. Las acciones integradas se gestionan solas; cualquier otra va a tu propio módulo CustomHandlers.
Configuración en el plugin
Interfaz
La página del pack en el plugin, en Interfaz (Interface), lista todas las piezas que trae el kit, en Menús (Menus), Botones (Buttons) y Otras partes del HUD (Other HUD parts): los 14 menús, cada uno con lo que lo abre (11 botones del HUD más el botón Changelogs), el botón de invitar, la barra de efectos y los dos tooltips. Un menú de demostración dice a qué pack sustituye y, cuando ese pack está instalado, que este lo ha reemplazado.
El lápiz junto a una pieza crea tu propia copia en StarterGui > RBLXEssentials > Interface, la muestra en pantalla y la selecciona en el Explorer, para que la diseñes en su sitio en vez de buscarla. Las actualizaciones nunca tocan tu copia. Pulsa el lápiz otra vez cuando termines. Revertir cambios (Revert changes), debajo de una copia, vuelve a la versión del kit.
Ocultar un menú o un botón
Haz tu propia copia y pon Visible en false en la copia. Para un menú, oculta el botón que lo abre. Los dos tooltips son la excepción: el kit los sigue usando sea cual sea su Visible.
Estilo: Plain o Studded
Los menús de General UI Kit vienen en dos estilos, los dos con su propia fuente, Fredoka. Liso (Fredoka) (Plain (Fredoka)) mantiene los colores planos; Studded (Fredoka) da a los mismos menús la textura de studs en sus cabeceras, botones, paneles, tarjetas y filas. Los studs son cuadrados y del mismo tamaño en cada botón y panel, en cualquier pantalla. Elige uno en la pestaña Estilo (Style) de la tarjeta: es un solo estilo para todo el juego, así que Studio lo muestra a la vez en todos los menús, y tus cambios, tus propias copias y tus ajustes se mantienen.
Desde la 3.3.2 los packs usan los menús del kit: con General UI Kit instalado, Codes, Spin, Rewards, Daily Rewards y Pets son los propios menús del kit manejados por sus packs, así que tienen el mismo aspecto y acabado que el Shop. Cada pack conserva su propio menú para los juegos sin el kit. El estilo se guarda en la configuración del juego (Config.Game: Kit = "GeneralUIKit", Style = "studded-fredoka"; un juego configurado antes de la 3.5.0 tiene Finish = "Studded", que sigue funcionando), así que las actualizaciones lo mantienen y un pack que instales después lo sigue. Para dar los mismos studs a un menú tuyo, tu IA puede copiar una capa Studs de un menú del kit (el mapa de temas explica cómo).
Temas
Los temas ya no se ofrecen: el aspecto Studded es el propio acabado Studded del kit. En un place que todavía tenga el antiguo tema Studded UI, ese tema sigue funcionando; la pestaña Estilo lo muestra como el estilo en uso, y elegir un estilo deja de usarlo (sus copias se guardan en una copia de seguridad).
El Studded UI: Design Only (no scripts) gratis es un ZIP solo con el archivo de diseño: sin scripts, así que sus botones no hacen nada. Arrastra su .rbxm a StarterGui; el plugin no lo instala, y el plugin 3.2.2 o posterior dice que es solo el diseño cuando lo encuentra en un place. Para que esos mismos menús funcionen, con animaciones y efectos de sonido, usa General UI Kit con Studded.
Para tu IA: T.style() dice el estilo del juego y los que puede elegir; T.style({ kit = "GeneralUIKit", style = "studded-fredoka" }) lo cambia.
Desinstalar
Elige Desinstalar (Uninstall) en el menú Más (More) de la página del pack. Quita el pack de todos los servicios en los que se instaló.
Eso es todo lo del plugin.
Si no piensas modificar el código del pack ni llamar a sus APIs desde tus propios scripts, puedes parar aquí. Las secciones siguientes son para desarrolladores que quieren integrar el sistema directamente en su propio código.
Referencia de etiquetas
UI_Panel
Un panel de menú que se abre y se cierra (un Frame u otro GuiObject).
| Atributo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
PanelId | string | Sí | Identificador único de este panel. |
Exclusive | bool | No | Por defecto: true. Cuando se abre un panel exclusivo, cierra cualquier otro panel abierto que también sea exclusivo. Ponlo en false para que el panel pueda quedarse abierto junto a otros: los paneles no exclusivos nunca se cierran solos. |
Animation | string | No | Animación de apertura del panel. Por defecto: "Bounce". Mira abajo las animaciones disponibles. |
Animaciones de panel. Vienen tres:
"SpinReveal"y"MaskedBounce": vienen con General UI Kit."Bounce"(la de por defecto): viene con el Kernel, así que siempre está disponible.
Un ModuleScript que devuelva function(menu: GuiObject) en la carpeta Client/PanelAnimations de General UI Kit se convierte en otro valor, con el nombre del módulo. Esa carpeta es del pack, así que una actualización la reemplaza.
UI_Button
Un botón pulsable (TextButton o ImageButton) que lanza una acción. La etiqueta en sí es solo un rótulo: lo que hace funcionar un botón es estar dentro de un menú o elemento del HUD que gestiona el kit. Un botón en un ScreenGui tuyo no se conecta.
| Atributo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
Action | string | Sí | Nombre de la acción. Las integradas de abajo se gestionan solas; cualquier otra se envía a tu módulo CustomHandlers al hacer clic. |
TargetPanel | string | No | El PanelId sobre el que actuar. Solo se lee cuando Action es TogglePanel o ClosePanel: no tiene efecto con otras acciones. |
ShowTooltip | bool | No | Si es true, muestra el tooltip compartido de botón al pasar el ratón (mira UI_Tooltip). |
TooltipText | string | No | Texto que se muestra en el tooltip de botón. Por defecto, el Name del botón. |
BuySound | bool | No | Si es true, suena el sonido de compra en vez del clic normal. |
Enlazar un botón con un panel:
Para abrir o cerrar un panel desde un botón, pon Action = "TogglePanel" y TargetPanel = "<PanelId>" en el botón. No hace falta ningún handler; es una de las acciones integradas.
Ejemplo: un botón que abre y cierra el panel Shop.
- Frame del panel: etiqueta
UI_Panel, atributosPanelId = "Shop",Exclusive = true - Botón: etiqueta
UI_Button, atributosAction = "TogglePanel",TargetPanel = "Shop"
Usa Action = "ClosePanel" (con el mismo TargetPanel) para un botón de cerrar dentro del panel. Si no pones TargetPanel en un botón ClosePanel, cierra el panel antecesor más cercano: útil para un botón X genérico.
Efecto hover del icono: un hijo directo del botón llamado Icon crece un poco al pasar el ratón y vuelve al salir. No hay que etiquetar nada.
Todo GuiButton dentro de los menús y el HUD del kit queda conectado, tenga etiqueta o no, así que un botón que añadas ahí tiene los sonidos de clic y hover gratis. Dos etiquetas lo excluyen: UI_Toggle, que se gestiona aparte, y UI_Blocker, para la lámina invisible a pantalla completa que un panel modal pone detrás de sí. Un bloqueador es un botón solo para tragarse los clics, así que no tiene sonido, ni tooltip, ni animación de icono.
UI_Animated
Un elemento decorativo de la interfaz con una animación en bucle.
| Atributo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
Animation | string | Sí | "Rotate" (giro continuo), "HoverBob" (flota al pasar el ratón), "SineBob" (flota y se balancea siempre) o "RainbowCycle" (cambia el color de fondo en ciclo). |
Speed | number | No | Duración en segundos de una vuelta completa: valores más altos giran más despacio. Por defecto: 15. Solo lo usa Rotate; las otras tres van a velocidad fija. |
UI_Tooltip
Un frame de tooltip compartido. Hay un tooltip por tipo, las piezas GeneralUIKit.ButtonDetails y GeneralUIKit.EffectDetails del kit: todo botón con ShowTooltip usa el único tooltip de botón, y todo UI_EffectIcon usa el único tooltip de efecto. No creas un tooltip por botón. ButtonDetails solo presta su aspecto (fondo, tamaño, esquinas, contorno y el estilo de texto de ButtonName) al tooltip de botón en vivo del Kernel; cualquier otra cosa que le añadas no se muestra.
| Atributo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
TooltipType | string | Sí | "Button" (sigue al cursor junto al botón señalado) o "Effect" (se ancla junto al icono de efecto señalado, sin salirse de los bordes de la pantalla). |
Contrato del contenido del tooltip. Las etiquetas de texto que rellena un tooltip se encuentran por nombre o por etiqueta, en cualquier parte dentro del frame del tooltip:
| Etiqueta | Dónde | Para qué |
|---|---|---|
ButtonName, por nombre | Dentro del tooltip de botón | TextLabel que recibe el TooltipText del botón, o su Name si no hay ninguno. |
GeneralUIKit_EffectNameLabel | Dentro del tooltip de efecto | TextLabel que recibe el Name del icono de efecto. |
GeneralUIKit_EffectDescriptionLabel | Dentro del tooltip de efecto | TextLabel que recibe la Description del icono de efecto. |
Icon, por nombre | Hijo directo de cualquier botón | Crece al pasar el ratón. |
UI_EffectIcon
Un icono que representa una mejora o un efecto del juego. Al pasar el ratón muestra el tooltip de efecto compartido, con el Name del icono como título y Description como cuerpo.
| Atributo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
Description | string | Sí | Texto que se muestra en el tooltip de efecto al pasar el ratón. |
UI_TypeSound
Pónsela a un TextBox para que suene al escribir el jugador. El sonido solo suena cuando el texto se alarga: borrar no hace ruido. No necesita atributos.
UI_DataBind
Pónsela a un TextLabel o TextButton para enlazar su texto en vivo con los datos del jugador. La etiqueta se actualiza sola cada vez que cambia el valor enlazado: sin sondeos ni refrescos a mano.
| Atributo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
DataPath | string | Sí | Ruta con puntos dentro de la carpeta replicada PlayerData, p. ej. Stats.Cash. |
Prefix | string | No | Texto que se pone delante del valor, p. ej. "$". |
Suffix | string | No | Texto que se pone detrás del valor, p. ej. " pts". |
Format | string | No | Formato del número: Default (tal cual), Short (12.5K, 3.2M, 1.1B…), Full (entero redondeado hacia abajo), Commas (1,250,000). Los valores no numéricos se muestran tal cual. |
Ejemplo: un contador de Cash en tu HUD.
- TextLabel: etiqueta
UI_DataBind, atributosDataPath = "Stats.Cash",Prefix = "$",Format = "Short"
Tus propias acciones de botón
Pon un nombre en el atributo Action de un botón y añade una función con ese nombre en tu propio módulo CustomHandlers, un ModuleScript en ReplicatedStorage.RBLXEssentials.Extensions.GeneralUIKit. Las actualizaciones nunca tocan la carpeta Extensions.
-- ReplicatedStorage.RBLXEssentials.Extensions.GeneralUIKit.CustomHandlers
return {
OpenShop = function(button)
print(button.Name, "was pressed")
end,
BuyItem = function(button)
local productId = button:GetAttribute("ProductId")
game:GetService("MarketplaceService"):PromptProductPurchase(
game.Players.LocalPlayer, productId
)
end,
}
Se le pasa el propio botón, así que puedes leer tus atributos en él y manejar varios botones con un solo handler. Una entrada llamada InviteFriends, promptGamePass o promptDevProduct sustituye a la integrada; TogglePanel y ClosePanel no se pueden sustituir.
Acciones integradas
Estas se gestionan solas. No necesitas un handler para ninguna.
| Acción | Efecto |
|---|---|
TogglePanel | Abre o cierra el panel indicado en TargetPanel. |
ClosePanel | Cierra el panel indicado en TargetPanel, o el panel antecesor más cercano del botón si TargetPanel no está puesto. |
InviteFriends | Abre el diálogo de invitar amigos de SocialService (comprueba el permiso; si las invitaciones no están disponibles, falla sin avisar). |
promptGamePass | Ofrece la compra del pase de juego del atributo GamePassId del botón. |
promptDevProduct | Ofrece la compra del producto de desarrollador del atributo ProductId del botón. |
Notas
- Sound System es opcional. Cada sonido que pide este pack pasa por el kernel, que está en silencio hasta que Sound System se registra. Instálalo y todo el kit gana a la vez sus clics, hovers y sonidos de escritura; si no lo pones, no hay ningún error.
- Todo
GuiButtondentro de los menús y el HUD del kit queda conectado a los sonidos de clic y hover sin necesidad de etiqueta. Para excluir uno, como un bloqueador de clics invisible, ponle la etiquetaUI_Blocker. - Los tooltips se limitan a intervalos de 16 ms para no saturar el layout.
- Todas las conexiones se limpian cuando se destruye la GUI, así que reapariciones y recargas no dejan nada atrás.
Classic UI Kit
PackId: ClassicUIKit · Versión: 3.5.2 · Necesita: nada
Se vende aparte de General UI Kit, y no necesita ningún otro kit. Funciona como General UI Kit; solo cambia el aspecto.
Qué hace
Classic UI Kit da a tu juego toda su interfaz de menús con un aspecto Stud grueso y con contorno: 16 menús, los 14 de General UI Kit más los dos menús de regalo de Datastore & Purchase (Shop, Settings, Teleport, Changelogs, Pets, Codes, Daily Rewards, Rewards, Spin, Rebirth, Upgrades, Trade, Trade Inventory, Trade Request, Gift y Gift Received), los 11 botones del HUD, los botones de Changelogs y de invitar, la barra de efectos y los tooltips. También trae su propio aspecto para la apertura de huevos de Easy Pet System, las tarjetas de Notifications System y el reproductor de música de Sound System.
Sus menús y botones se comportan exactamente como los de General UI Kit: las mismas acciones, los mismos menús de los packs que encajan en su sitio, los mismos CustomHandlers (los tuyos van en ReplicatedStorage.RBLXEssentials.Extensions.ClassicUIKit.CustomHandlers; un juego que viene de General UI Kit sigue usando también su Extensions.GeneralUIKit.CustomHandlers). Desde la 3.5.0 los dos kits usan un mismo motor compartido en el Kernel.
Estilo: cuatro estilos, cada uno un acabado y una fuente
La fuente es parte del estilo, así que nunca eliges una fuente por separado: Classic UI Kit viene en cuatro estilos. Studded pone la textura de stud en cada superficie de color, cuadrada y del mismo tamaño en todas partes; Plain es el mismo aspecto sin studs. Fredoka es la fuente redondeada propia del kit; Montserrat es Montserrat Black, más ancha y afilada, con el mismo contorno grueso. Elige uno en la pestaña Estilo (Style) de la tarjeta: Liso (Fredoka) (Plain (Fredoka)), Liso (Montserrat) (Plain (Montserrat)), Studded (Fredoka) (el que viene por defecto) o Studded (Montserrat). Cada texto deja un margen dentro de su botón, así que caben las dos fuentes. Si no tienes el kit, esas opciones aparecen bloqueadas, con un enlace a su página de la tienda.
También con General UI Kit
Solo se usa el kit del estilo: la pestaña Estilo elige entre ellos, y los menús del otro kit se apartan. Cada kit guarda sus propias copias de los menús que editaste, así que al volver los encuentras como los dejaste. El estilo se guarda en Config.Game (Kit = "ClassicUIKit", Style = "studded-montserrat"); para tu IA, T.style({ kit = "ClassicUIKit", style = "plain-montserrat" }) lo cambia.
Editar un menú
Como en General UI Kit: el lápiz junto a una pieza, en la página del kit en el plugin, crea tu propia copia en StarterGui > RBLXEssentials > Interface, y las actualizaciones nunca la tocan. Tu IA tiene el mapa del kit en /ai/ClassicUIKit.md.
Studded Glass UI Kit
PackId: StuddedGlassUIKit · Versión: 3.5.4 · Necesita: nada
Se vende aparte de los otros kits de GUI, y no necesita ningún otro kit. Funciona como General UI Kit; solo cambia el aspecto.
Qué hace
Studded Glass UI Kit da a tu juego toda su interfaz de menús con piezas de colores vivos (cabeceras, botones, tarjetas) con studs y un contorno oscuro grueso, sobre cuerpos de menú de cristal oscuro que dejan ver el juego. Tiene los mismos 17 menús que los otros kits (Shop, Settings, Teleport, Changelogs, Pets, Index, Codes, Daily Rewards, Rewards, Spin, Rebirth, Upgrades, Trade, Trade Inventory, Trade Request, Gift y Gift Received) y el HUD: los botones de los menús, el contador de dinero, los boosts y los botones de invitar y de novedades. También trae su propio aspecto para la apertura de huevos, los avisos y el reproductor de música.
Los menús suben desde abajo al abrirse y bajan al cerrarse; los botones crecen y se oscurecen al pasar el ratón. Todo lo demás se comporta exactamente como General UI Kit: las mismas acciones, los mismos menús de los packs que encajan en su sitio (mascotas, ruleta, premios por tiempo, códigos, avisos, regalos del datastore, sonido), los mismos CustomHandlers (los tuyos van en ReplicatedStorage.RBLXEssentials.Extensions.StuddedGlassUIKit.CustomHandlers; un juego que viene de General UI Kit sigue usando también su Extensions.GeneralUIKit.CustomHandlers).
Estilo: cuatro estilos, cada uno un acabado y una fuente
Studded pone los studs en cada pieza de color; Plain es el mismo aspecto sin studs. Cada uno viene con Fredoka o con Montserrat. Elige uno en la pestaña Estilo (Style) de la tarjeta: Liso (Fredoka) (Plain (Fredoka)), Liso (Montserrat) (Plain (Montserrat)), Studded (Fredoka) (el que viene por defecto) o Studded (Montserrat). Si no tienes el kit, esas opciones aparecen bloqueadas, con un enlace a su página de la tienda.
También con otro kit de GUI
Solo se usa el kit del estilo: la pestaña Estilo elige entre ellos, y los menús de los otros kits se apartan. Cada kit guarda sus propias copias de los menús que editaste, así que al volver los encuentras como los dejaste. El estilo se guarda en Config.Game (Kit = "StuddedGlassUIKit", Style = "studded-fredoka"); para tu IA, T.style({ kit = "StuddedGlassUIKit", style = "plain-montserrat" }) lo cambia.
Editar un menú
Como en General UI Kit: el lápiz junto a una pieza, en la página del kit en el plugin, crea tu propia copia en StarterGui > RBLXEssentials > Interface, y las actualizaciones nunca la tocan. Tu IA tiene el mapa del kit en /ai/StuddedGlassUIKit.md.
Leaderboards System
PackId: EasyLeaderstatsSystem · Versión: 3.2.1 · Dependencias: Datastore & Purchase System
En 3.0 las opciones que la 2.x guardaba en la carpeta Settings de este pack viven en el módulo de configuración de tu juego, Config.EasyLeaderstatsSystem en ReplicatedStorage (todas las opciones son compartidas). El panel del plugin que ves en esta página las edita, y tu IA lista todas las opciones con T.config.reference("EasyLeaderstatsSystem").
Qué hace
Leaderboards System añade dos funciones relacionadas a tu juego:
- Leaderstats: la lista de estadísticas del juego que se ve en el menú de Tab/escape. Los valores se leen directamente de los datos de los jugadores (que da Datastore & Purchase System) y se mantienen sincronizados solos.
- Tablas de clasificación globales: tablas físicas en el mundo que muestran los mejores jugadores de todos los tiempos en cualquier estadística, guardadas en
OrderedDataStores de Roblox y actualizadas cada cierto intervalo configurable.
Las dos funciones se configuran por completo desde el plugin. No hace falta editar ningún script para añadir o quitar estadísticas y tablas de clasificación.
Configuración en el plugin
Al seleccionar el pack en el plugin se abre un panel de ajustes con dos secciones: Leaderstats y Marcadores (Leaderboards).
Leaderstats
Cada entrada de estadística corresponde a una fila del menú de Tab. Las entradas se agrupan según el grupo de datos al que pertenecen (p. ej. Stats).
| Campo | Descripción |
|---|---|
DisplayName | Texto que se muestra en el menú de Tab (p. ej. Cash, Wins). |
Order | Orden dentro de la lista de estadísticas. Los números más bajos salen primero. |
DataKey | Ruta con puntos dentro de PlayerData (p. ej. Stats.Cash). Tiene que existir en los Default Data de Datastore & Purchase System. Una estadística que tu juego ya muestra necesita Editar (Unlock) antes de cambiarla. |
DisplayFormat | Palabra clave de formato opcional que se aplica al número en bruto (mira la tabla de palabras clave de abajo). Si está vacía, se usa Default. |
Prefix | Texto opcional que se pone delante del valor mostrado (p. ej. $). |
Suffix | Texto opcional que se pone detrás del valor mostrado (p. ej. wins). |
DisplayFormat acepta estas palabras clave (no cadenas de formato estilo printf):
| Palabra clave | Comportamiento |
|---|---|
Default | Número en bruto, tal cual. |
Short | Abreviado con un sufijo de nivel: 1.5K, 2.3M: los niveles son K, M, B, T, Qa, Qi. |
Full | Entero redondeado hacia abajo (52500.9 → 52500). |
Commas | Separadores de miles (52500 → 52,500). |
Estos campos se combinan de izquierda a derecha: Prefix + formatted value + Suffix. Cuando hay un Prefix o Suffix y el formato es Default, el valor se formatea como Full (una cadena de entero redondeado hacia abajo) para que el prefijo o sufijo lo pueda rodear.
| DisplayFormat | Prefix | Suffix | Valor en bruto | Resultado |
|---|---|---|---|---|
Default | (vacío) | (vacío) | 52500 | 52500 |
Short | (vacío) | (vacío) | 52500 | 52.5K |
Short | (vacío) | (vacío) | 2300000 | 2.3M |
Commas | $ | (vacío) | 52500 | $52,500 |
Default | $ | (vacío) | 52500.9 | $52500 (se trata como Full porque hay un prefijo) |
Full | (vacío) | wins | 7 | 7 wins |
+ Add stat crea una entrada nueva al final. Escribe su DataKey; el valor ya tiene que existir en tus Default Data de Datastore.
Tablas de clasificación
Ajustes globales
| Ajuste | Por defecto | Descripción |
|---|---|---|
RefreshInterval | 60 | Segundos entre actualizaciones de las tablas. |
MaxEntries | 50 | Número máximo de filas por tabla. |
Tablas de clasificación
Cada entrada maneja una tabla de clasificación física en el mundo: un Model con la etiqueta ELS_Leaderboard, unido a su entrada por su atributo ELS_LeaderboardId. En ejecución, el modelo puede estar en cualquier sitio del workspace. El plugin gestiona las tablas dentro de Workspace > RBLXEssentials > EasyLeaderstatsSystem > Boards: un modelo etiquetado ahí sin entrada sale como huérfano, y Eliminar (Delete) lo quita.
| Campo | Descripción |
|---|---|
StatPath | Ruta con puntos dentro de PlayerData de la estadística que sigue esta tabla (p. ej. Stats.Cash). También da nombre al almacén de la tabla, así que otra estadística hace que la tabla empiece vacía, y una tabla que ya tienes necesita Editar primero. |
Template | Cuál de los tres diseños usa el modelo de esta tabla, elegido en un desplegable. Cambiarlo sustituye el modelo en el mundo al momento, manteniendo su posición y orientación. No es una opción de configuración: el diseño pertenece al modelo. |
ValueFormat | Cómo se muestran los valores: Raw (52500), Comma (52,500) o Abbreviated (52.5K). |
Enabled | Si está en OFF, esta tabla de clasificación se salta por completo. |
+ Añadir marcador (+ Add leaderboard) pide un nombre, una ruta de estadística y una plantilla, y luego clona esa plantilla en Workspace > RBLXEssentials > EasyLeaderstatsSystem > Boards, le da su propio id y añade su entrada a tus ajustes de Marcadores. El modelo nuevo queda seleccionado en Studio, para que lo arrastres a su sitio.
La × de una tabla quita tanto su entrada como su modelo, tras un segundo clic para confirmar. En una tabla que tus ajustes ya tienen, solo aparece después de Editar.
Duplicar una tabla en Studio
Si duplicas un Model de leaderboard dentro de Workspace > RBLXEssentials > EasyLeaderstatsSystem > Boards, el plugin detecta el id repetido y le da a la copia un id nuevo y su propia entrada en tus ajustes de Marcadores.
Desinstalar
Elige Desinstalar (Uninstall) en el menú Más (More) de la página del pack. Mueve el pack, y todo lo que hay en Workspace > RBLXEssentials > EasyLeaderstatsSystem (incluidas las tablas que añadiste ahí), a una copia de seguridad protegida. Tu módulo de configuración se queda.
Eso es todo lo del plugin.
Las secciones siguientes explican cómo funciona por debajo y qué esperar en ejecución.
Cómo funciona
Leaderstats
Se crea una carpeta leaderstats en cada jugador al entrar, con una entrada por cada estadística configurada. El valor se lee del guardado replicado de ese jugador con la ruta DataKey, y una señal de cambio lo mantiene al día el resto de la sesión. Tú nunca escribes en leaderstats: cambia el valor guardado y la fila lo sigue.
El tipo de la leaderstat sigue al valor de origen en PlayerData:
| Tipo de origen | Leaderstat creada |
|---|---|
IntValue / NumberValue | IntValue: o StringValue cuando hay un DisplayFormat, Prefix o Suffix propio, para poder mostrar el texto formateado. |
StringValue | StringValue: Prefix/Suffix se siguen aplicando a la cadena. |
BoolValue | BoolValue: se muestra como true/false. |
Tablas de clasificación globales
Las estadísticas se escriben en OrderedDataStores en tres situaciones:
- Al entrar: en cuanto el guardado del jugador está listo (espera hasta 10 segundos), se escriben todas las estadísticas configuradas. Una estadística que el guardado no tiene se salta, con un aviso por jugador y sesión.
- Al salir: las estadísticas se escriben en el momento en que el jugador se desconecta.
- Periódicamente: cada 5 minutos se escriben las estadísticas de todos los jugadores conectados, para que los datos de las tablas estén frescos en sesiones largas.
La interfaz de las tablas se actualiza cada RefreshInterval segundos. La primera actualización se hace 5 segundos después de arrancar el servidor, para dar tiempo a que carguen los datos de los jugadores. En cada actualización se leen del OrderedDataStore los MaxEntries mejores jugadores y se reconstruye la lista del SurfaceGui de la tabla en el mundo. Una cuenta atrás en cada tabla muestra cuándo será la siguiente actualización.
Los ajustes de visualización de cada tabla tienen valores de reserva razonables, todos sacados del último tramo de StatPath (p. ej. Stats.Cash → Cash):
TitleLabelTextvacío →TOP <STAT>(p. ej.TOP CASH).VariableNameTextvacío →<STAT>(p. ej.CASH).ValueFormatesRawpor defecto; cualquier valor que no seaRaw,CommaoAbbreviatedno pasa la comprobación de configuración.Abbreviatedcubre los niveles K, M y B, siempre con un decimal (1.0K).
Nombres de los OrderedDataStore
Los nombres de los almacenes salen solos de la ruta de la estadística: GlobalLeaderboard_ seguido de la ruta con los puntos cambiados por guiones bajos.
-- e.g. Stats.Cash → GlobalLeaderboard_Stats_Cash
Si miras el almacén en bruto: los valores se guardan con un desplazamiento de +1 (que se resta al leer), así que un 52501 guardado significa que la estadística del jugador es 52500. Una estadística de 0 se guarda como 1 y se muestra como 0; las estadísticas negativas no se escriben.
Avatares de los maniquíes
Los tres mejores jugadores de cada tabla llevan su avatar real de Roblox en Dummy1, Dummy2 y Dummy3, al lado de la tabla, con un emote en bucle.
La escala sale del propio rig. Cada plantilla construye sus maniquíes del podio a su propio tamaño, y el pack lo mide antes de aplicar nada, así que un avatar queda al tamaño para el que se diseñó la plantilla y no a un número común para todas las tablas. Un podio que escalaste tú se mide igual y sigue funcionando.
Un puesto cuyo jugador no ha cambiado desde la última actualización se deja tal cual, así que solo un cambio real cuesta una llamada a GetHumanoidDescriptionFromUserId.
Estructura de los ajustes
Todas las opciones viven en el módulo de tu juego ReplicatedStorage > RBLXEssentials > Config > EasyLeaderstatsSystem, que ninguna actualización reemplaza. Solo devuelve lo que cambias; todo lo demás mantiene su valor por defecto. El plugin es la forma de editarlo.
return {
Leaderstats = { -- the whole list, in Tab menu order
{ DataKey = "Stats.Cash", Name = "Cash", Format = "Default", Prefix = "", Suffix = "" },
{ DataKey = "Stats.Wins", Name = "Wins" },
},
Leaderboards = {
RefreshInterval = 60, -- seconds between refreshes
MaxEntries = 50, -- rows per board, 1 to 100
Boards = { -- the whole list
{ Id = "df9dad80-8ee9-4005-a1a5-0259749b45f9", StatPath = "Stats.Cash",
Enabled = true, ValueFormat = "Raw", Title = "", Header = "" },
{ Id = "a28430f9-c7b6-4352-b3ba-9b33f0ebe37f", StatPath = "Stats.Wins",
ValueFormat = "Abbreviated" },
},
},
}
En el plugin, Name es DisplayName, Format es DisplayFormat, Title es TitleLabelText y Header es VariableNameText; el Order de una estadística es su posición en la lista. El Id de una tabla es el ELS_LeaderboardId de su modelo en el workspace. Leaderstats y Boards se reemplazan enteros, así que lista todas las estadísticas y todas las tablas que quieras. Nunca cambies el StatPath de una tabla que ya tiene puestos: da nombre al almacén de la tabla.
Los tres diseños de tabla viven en la carpeta Assets propia del pack, en el servidor. Son el catálogo del que clona + Añadir marcador; nada los lee en ejecución.
ServerScriptService.RBLXEssentials.Packs.EasyLeaderstatsSystem
└── Assets/
└── Templates/
├── LeaderboardTemplate1 [Model]
├── LeaderboardTemplate2 [Model]
└── LeaderboardTemplate3 [Model]
Montar una tabla en el mundo
Una tabla es un Model del workspace con la etiqueta ELS_Leaderboard, esté donde esté, unido a una entrada de tus ajustes de Marcadores por su atributo ELS_LeaderboardId. Las nuevas se clonan del diseño que eliges en el formulario de añadir y se colocan en Workspace > RBLXEssentials > EasyLeaderstatsSystem > Boards para tenerlo ordenado; la carpeta se crea si no existe. Cambiar Template después sustituye el modelo en su sitio, manteniendo su posición y orientación.
Copia una tabla en Studio y el plugin la detecta. Una copia dentro de esa carpeta Boards recibe un id nuevo y su propia entrada en tus ajustes de Marcadores, y tú la apuntas a otra estadística. Una tabla sin entrada nunca se rellena en ejecución.
El sistema encuentra los elementos de la interfaz por el atributo ELS_Role, no por ruta, así que la jerarquía interna del modelo puede variar entre plantillas.
[StatPath leaf] Leaderboard [Model]
├── BoardModel
│ ├── BoardBase [Part]
│ │ └── Leaderboard [SurfaceGui]
│ │ ├── Rank [TextLabel, header] ELS_Role = HeaderRank
│ │ ├── Name [TextLabel, header] ELS_Role = HeaderName
│ │ ├── Value [TextLabel, header] ELS_Role = HeaderValue (shows VariableNameText)
│ │ └── List [ScrollingFrame] ELS_Role = List
│ │ └── Template [Frame, cloned per entry, must stay hidden]
│ │ └── Frame
│ │ ├── Rank, Name, Value [TextLabel]
│ │ └── Icon [ImageLabel]
│ └── TopPart [Part]
│ └── Leaderboard [SurfaceGui]
│ └── TextLabel ELS_Role = TitleLabel (shows TitleLabelText)
├── Dummy1 / Dummy2 / Dummy3 [Model, R15 rigs for top-3 avatars]
└── Timer [Part]
└── GUI [SurfaceGui]
└── Label [TextLabel, shows "Refresh in: Xs"]
ELS_Role | Elemento | Se rellena con |
|---|---|---|
TitleLabel | TextLabel de la tabla TopPart | Ajuste TitleLabelText (p. ej. TOP CASH) |
List | ScrollingFrame que contiene las filas | (se usa como padre de las entradas clonadas) |
HeaderRank | TextLabel de cabecera del puesto | RANK (fijo, lo pone la plantilla) |
HeaderName | TextLabel de cabecera del nombre | NAME (fijo, lo pone la plantilla) |
HeaderValue | TextLabel de cabecera del valor | Ajuste VariableNameText (p. ej. CASH) |
Cada Model de tabla lleva también estos atributos (los gestiona el plugin):
| Atributo | Tipo | Para qué |
|---|---|---|
ELS_LeaderboardId | string (GUID) | Enlace único y estable con la entrada de la tabla en los ajustes de Marcadores (el Id de la entrada). |
ELS_StatPath | string | Ruta con puntos dentro de PlayerData (p. ej. Stats.Cash). |
Requisitos
- Datastore & Purchase System tiene que estar instalado y dando
PlayerDataa cada jugador. - Los API Services tienen que estar activados (Game Settings → Security → Enable Studio Access to API Services) para que los OrderedDataStores funcionen en Studio.
Notifications System
PackId: NotificationsSystem · Versión: 3.3.3 · Necesita: nada
En 3.0 las opciones que la 2.x guardaba en la carpeta Settings de este pack están en los módulos de configuración de tu juego, Config.NotificationsSystem en ReplicatedStorage (todas las opciones de este pack son compartidas, así que no hay módulo solo de servidor). El panel del plugin que ves en esta página las edita, y tu IA lista todas las opciones con T.config.reference("NotificationsSystem").
Qué hace
Este es el pack que les cuenta cosas a tus jugadores. Tres formatos, cuatro motivos ya preparados para usarlos y una línea de código para cualquier otra cosa que quieras anunciar.
- Avisos. Tarjetas que entran deslizándose, se apilan y se van solas. Vienen cuatro formas: solo título, título y subtítulo, imagen y título, e imagen con ambos.
- Líneas de chat. Un mensaje del sistema en el color que elijas. Barato, imposible de pasar por alto, y nunca tapa la pantalla.
- Banner. Una tarjeta grande y centrada para lo importante: un reinicio, un evento que empieza, un mensaje tuyo. Una línea o dos.
Instalado solo, ya anuncia cuatro cosas sin nada de código: un amigo que entra con su foto de perfil, alguien que compra con Robux (una línea para todo el servidor más una confirmación para el comprador), tus anuncios rotativos y cualquiera que entra o sale (desactivado por defecto, porque la mayoría de los places ya lo hacen a su manera).
Todos los demás packs de RBLX Essentials se activan cuando este está instalado: un código canjeado, una mascota que llega por algo que no es un huevo, un giro gratis a punto de llegar, un regalo de sesión que ya se puede reclamar. Ninguno lo necesita. Sin él, simplemente se quedan callados.
Configuración en el plugin
Plantillas
Vienen dos diseños: Toy, el diseño por defecto, con degradados vivos, un contorno grueso y un borde en relieve, y Sleek, tarjetas azul marino como el reproductor de música. Elige uno con Diseño de notificación (Notification design) arriba del todo en los ajustes del pack: crea tu propia copia de la capa de notificaciones con las tarjetas de ese diseño, y conserva la duración, el sonido y el apilado de cada plantilla, y cualquier plantilla que hayas añadido. Revertir cambios (Revert changes) en Interfaz (Interface) vuelve a la del pack. Cada tarjeta tiene una barra que se vacía a lo largo de su duración.
Vienen siete plantillas. Al desplegar una ves la propia tarjeta en sus proporciones reales, con su tamaño real en píxeles debajo. Junto a su nombre está el lápiz, el mismo que usa General UI Kit para los menús. Las plantillas del pack nunca se editan: el primer clic crea tu propia copia de la capa de notificaciones, que las actualizaciones nunca tocan. A partir de ahí, haz clic y la plantilla aparece en pantalla y queda seleccionada en el Explorer, para que la arrastres donde quieras y la diseñes en Studio. Haz clic otra vez cuando termines. El plugin te avisa si dejas una visible, porque Visible se guarda con tu place.
Triggers
| Trigger | Qué hace | De serie |
|---|---|---|
FriendJoined | Un aviso, con la foto de perfil del amigo, para los dos amigos cuando uno entra en el servidor del otro. | Activado |
Purchases | Una línea de chat para todo el servidor más el aviso de confirmación para el comprador. Necesita Datastore & Purchase System. | Activado |
Announcements | Los mensajes rotativos, cada cierto tiempo. | Activado |
JoinLeave | Una línea de chat para cualquiera que entra o sale. | Desactivado |
Cada fila lleva un ? sobre el que puedes pasar el ratón para ver qué hace ese trigger. El texto de un trigger también es una opción: el plugin muestra los textos de FriendJoined, JoinLeave y Purchases en sus propios grupos debajo de los interruptores, guardados en Config.NotificationsSystem. Para cambiar "Friend joined!", edita el Title de FriendJoined. Esos textos entienden {player}, y los de Purchases también {item} y {price}.
Anuncios
| Campo | Qué hace |
|---|---|
IntervalMinutes | Minutos entre mensajes. Cualquier valor por debajo de medio minuto cuenta como medio minuto. |
Surface | Chat o Banner. |
Shuffle | Elige al azar en vez de en orden. Nunca repite el mensaje que acaba de salir. |
Messages | Los propios mensajes, en orden (filas Message1..N en el plugin). + Añadir mensaje (+ Add message) y Borrar mensaje (Delete message) están en el plugin. Un mensaje tiene que tener algo de texto: uno vacío no pasa la comprobación de la configuración. |
Un anuncio se muestra tal cual lo escribiste: {player}, {item} y {price} no se sustituyen aquí, solo en los textos de los triggers de arriba. Para apagar toda la rotación, usa el interruptor Announcements en Triggers, no un campo de aquí.
Ganancias que vuelan al contador
Cuando sube el contador de dinero, un «+cantidad» vuela hacia él. CounterFlyout (3.3.2) decide qué ganancias vuelan:
| Campo | Qué hace |
|---|---|
MinAmount | Las ganancias menores nunca vuelan (el contador las cuenta igual). Por defecto 0. |
GroupSeconds | Las ganancias así de seguidas, como los ingresos cada segundo, vuelan una vez, más las que son 3 veces mayores (un código, una tirada). Por defecto 0: vuelan todas; con 2 se agrupan los ingresos cada segundo. |
Para quitarlos del todo, borra Assets.CounterEffects en el pack.
Desinstalar
Elige Desinstalar (Uninstall) en el menú Más (More) de la página del pack.
Eso es todo lo del plugin.
Abajo: cómo cambiar el estilo de una plantilla, escribir tu propio trigger y anunciar tus propias cosas desde código.
Diseñar las plantillas
Las siete están en la carpeta Templates de la capa de notificaciones. Primero haz tu propia copia de la capa (el lápiz en la pestaña Interfaz del plugin, o pídeselo a tu IA): va a StarterGui > RBLXEssentials > Interface, las actualizaciones nunca la tocan, y sus plantillas son tuyas para moverlas, cambiarles el tamaño y el estilo. Cambia BackgroundColor3 en el frame de una plantilla para cambiar el color de toda la tarjeta.
Están dibujadas con el lenguaje visual de General UI Kit, así que encajan junto a tus menús y no parecen de otro producto. Sus bordes son UIStrokes con StrokeSizingMode = ScaledSize, lo que hace que Thickness sea una fracción de la altura del frame y no un número de píxeles: cambia el tamaño de una tarjeta y su borde mantiene las proporciones. Así está hecho todo el kit.
Cada Position y Size está en scale, nunca en offset, con un UIAspectRatioConstraint que mantiene la forma de cada tarjeta. Una tarjeta ocupa la misma fracción de la pantalla en un móvil que en un monitor 4K. Mantenlo así cuando las muevas: arrastra con los controles de scale, no con los de offset.
Dónde aparecen y qué hace cola detrás de qué
Donde pongas una plantilla es donde aparecen sus notificaciones. StackGroup decide quién hace cola detrás de quién: da a dos plantillas el mismo nombre de grupo y sus notificaciones forman una columna, por turnos en vez de caer una encima de otra, sea cual sea la mezcla de alturas. Deja el grupo vacío y esa plantilla se apila sola.
De serie, los cuatro avisos comparten el grupo Toasts, así que una tarjeta de amigo conectado y una de premio hacen cola en una columna. Los dos banners comparten Banner. Así, una tarjeta de "amigo conectado" puede estar abajo a la izquierda mientras una de premio baja desde arriba en el centro, y nunca chocan, siempre que sus grupos sean distintos.
Nada espera nunca a que haya hueco. Cuando una plantilla ya muestra su límite de MaxOnScreen, la siguiente quita antes de tiempo la más antigua de su tipo y ocupa su lugar. Una notificación retenida hasta que se abriera un hueco llegaría contando algo que ya había dejado de ser cierto.
Crear tu propia plantilla
Duplica una en tu copia de la capa y cámbiale el nombre. Ese es todo el proceso: el nuevo nombre aparece en el plugin al momento y se puede usar en cualquier sitio donde se nombre una plantilla. Funciona porque una plantilla lleva su propio comportamiento, como atributos en el frame:
| Atributo | Qué hace |
|---|---|
Duration | Segundos en pantalla. |
StackDirection | Down, Up, Left o Right. Déjalo en Auto y la pila crece alejándose del borde más cercano. |
MaxOnScreen | Cuántas de este tipo se muestran a la vez. En el límite, una nueva sustituye a la más antigua. 0 significa sin límite. |
Sound | Un sonido de la carpeta SFX de Sound System, elegido en un desplegable con los que tienes de verdad. Sin ese pack no suena, pero no se rompe. |
Animation | Slide, Fade o Pop. |
StackGroup | En qué columna hace cola esta plantilla. |
SlideFrom | Desde qué borde entra deslizándose la tarjeta. Solo se usa cuando Animation es Slide, y solo cambia la entrada: la tarjeta se sigue parando donde la pusiste. |
El renderizador rellena tres hijos por nombre: Title, Subtitle e Image. Image es un contenedor, una placa (una insignia redonda en Toy, una casilla redondeada en Sleek) que contiene un ImageLabel llamado Content; la placa es lo que se ve mientras carga una foto de perfil. Un frame Timer con un Fill dentro se vacía a lo largo de la duración de la tarjeta. Borra uno y ese campo simplemente no se dibuja, así que tu rediseño no puede romper el pack. Añade uno a una plantilla que no lo tenía y empieza a rellenarse.
Las dos que funcionan distinto
Los banners son una tarjeta fija arriba en el centro, de 480 píxeles de ancho en una pantalla 1080p (72 de alto, 92 con subtítulo). Un título largo se encoge para caber dentro en vez de ensanchar la tarjeta, así que nunca se sale por las esquinas.
Alert está abajo en el centro. Una píldora roja en Toy, una azul marino con borde rojo en Sleek, con un "!" antes del texto. Se apila hacia arriba, porque cuelga del borde inferior. Úsala cuando algo no se pudo hacer: falta dinero, el inventario está lleno, un pase que no tienen. Se va a los tres segundos en vez de a los cinco, porque una negativa es una corrección y no una noticia, y suena Code_Error en vez del sonido de premio.
La píldora no es decoración. Su relleno y su contorno (el UIStroke) son lo que mantiene legible el texto blanco sobre el color que tenga tu juego. Conserva los dos si cambias el estilo.
Easy Pet System ya habla a través de ella: intenta abrir un huevo sin suficiente Cash, o equipar una cuarta mascota, y la línea que ves es esta plantilla.
Todo lo demás del kit es TextScaled, lo que significa que la altura de la etiqueta decide a qué tamaño se ve el texto, no TextSize. Haz una etiqueta más alta para que su texto sea más grande.
Anunciar tus propias cosas
Desde cualquier Script o LocalScript tuyo:
local Notify = require(game:GetService("ReplicatedStorage")
.RBLXEssentials.Packs.NotificationsSystem.Notify)
-- server
Notify.Toast(player, "TitleSubtitle", { Title = "Well done", Subtitle = "You found the secret!" })
Notify.ToastAll("TitleOnly", { Title = "The boss has spawned!" })
Notify.Chat("Double XP is live for the next hour!", Color3.fromRGB(255, 215, 0))
Notify.ChatTo(player, "Welcome back!")
Notify.Banner(player, { Title = "Round starting", Subtitle = "Get to the arena" })
Notify.BannerAll({ Title = "Server restarting in 5 minutes" })
-- client: Toast, Banner and Chat, without the player (this player only)
Notify.Toast("TitleOnly", { Title = "Saved!" })
La tabla de datos puede llevar Title, Subtitle, Image (un asset id), ImageUserId (se convierte en la foto de perfil de ese jugador). El color de una línea de chat es el segundo argumento de Chat y ChatTo.
También puede sustituir el comportamiento de la plantilla, solo para esa notificación. Pasa cualquiera de Duration, MaxOnScreen, Sound, Animation o SlideFrom y manda sobre lo que dice el frame:
Notify.Toast(player, "TitleOnly", { Title = "Saved!", Duration = 1, Animation = "Pop" })
Los nombres son los mismos atributos de la plantilla, así que no hay nada nuevo que aprender. Un valor que el renderizador no puede usar se ignora y se mantiene el ajuste de la plantilla, así que una errata le cuesta a esa llamada su cambio, no el mensaje. Pasar un Subtitle a una tarjeta de solo título no hace daño.
StackDirection es el único comportamiento que no puedes sustituir en cada llamada, a propósito: la dirección es de una columna, no de una tarjeta. Ponla en la plantilla, donde describe la columna.
Escribir un trigger
Pon un ModuleScript en ServerScriptService > RBLXEssentials > Extensions > NotificationsSystem, una carpeta que las actualizaciones nunca tocan, y arranca con el pack. No hay que conectar nada más:
local Players = game:GetService("Players")
local MyTrigger = {}
function MyTrigger.Start(ctx, trove)
trove:Connect(Players.PlayerAdded, function(player)
ctx.kernel.Notify:Toast(player, "TitleOnly", { Title = "Welcome!" })
end)
end
return MyTrigger
trovese limpia con el pack, así que conecta a través de él y no tendrás nada que desconectar.- Lee las opciones del pack desde
ctx.config. Elctx.settingsde la 2.x no existe en 3.0. Startno debe ceder (yield). Haz el trabajo lento en tu propiotask.spawn.- Un módulo sin atributo
Enabledestá activado: lo añadiste porque lo querías. PonEnabledenfalsepara apagarlo; los interruptores del plugin son para los cuatro triggers del pack. - Un módulo que se llama como uno de los cuatro (
FriendJoined, por ejemplo) se ejecuta en lugar del del pack, bajo el interruptor de ese trigger enConfig.NotificationsSystem.Triggers. - Un módulo que no carga, o que da error al arrancar, se salta con una advertencia. No puede llevarse por delante a los demás triggers.
Para autores de packs
Un pack no usa el módulo de arriba. Llama a la fachada del kernel:
ctx.kernel.Notify:Toast(player, "TitleSubtitle", { Title = "…" }) -- server
ctx.kernel.Notify:Toast("TitleSubtitle", { Title = "…" }) -- client
ctx.kernel.Notify no hace nada, en silencio, hasta que Notifications System se registra como su backend. Por eso ningún pack declara este en manifest.deps y ninguno comprueba si está instalado. La asimetría es deliberada: un pack quiere silencio cuando falta el pack, y una persona que escribe código quiere que se lo digan, así que el módulo de entrada da error en la línea del require.
Engancharte tú a las compras
Datastore & Purchase System publica un BindableEvent que este pack escucha, y tú también puedes:
local hook = game:GetService("ServerScriptService").RBLXEssentials
.Packs.DatastorePurchaseSystem:FindFirstChild("PurchaseCompleted")
if hook then
hook.Event:Connect(function(player, kind, id, currencySpent)
print(player.Name, "bought", kind, id, "for", currencySpent)
end)
end
kind es "product" o "gamepass". Para un producto se dispara cuando el premio y el recibo ya están guardados; para un pase de juego, cuando Roblox informa de la compra, con currencySpent en nil. También se dispara con las entregas de productos en FreeMode (con 0 gastado), y así pruebas un anuncio de compra en Studio sin gastar Robux.
Menús
Ninguno. Como Datastore & Purchase System y Leaderboards System, no tiene panel ni botón en el HUD, porque no hay nada que abrir.
Roulette System
PackId: RouletteSystem · Versión: 3.3.4 · Necesita: Datastore & Purchase System
En 3.0 las opciones que la 2.x guardaba en la carpeta Settings de este pack están en los módulos de configuración de tu juego, Config.RouletteSystem en ReplicatedStorage y en ServerScriptService. El panel del plugin que ves en esta página las edita, y tu IA lista todas las opciones con T.config.reference("RouletteSystem").
Qué hace
Roulette System añade una ruleta de premios. Los jugadores gastan giros para caer en premios, ganan un giro gratis cada cierto tiempo y pueden comprar más con productos de desarrollador. Todo se configura desde el plugin.
- Premios aleatorios con peso: Cash, Diamonds, más Spins, cualquier número del guardado del jugador (
Stat) o un módulo que escribas tú (Custom). También viene listo para usar un premio de mascota aleatoria de un huevo de Easy Pet System. - Una espera para el giro gratis cuyo reloj empieza cuando el jugador se queda sin giros, y el giro llega cuando se acaba.
- Productos de desarrollador de +1 / +3 / +10 giros. Vienen como productos de demostración: pega tus propios IDs en el plugin.
- De 2 a 12 casillas en la ruleta (siete de serie) con nombre, icono, tipo, cantidad y peso. Al escribir un nombre o un icono en el plugin, la ruleta se redibuja en Studio mientras escribes.
- Si el cliente nunca avisa de que la ruleta terminó, el servidor da el premio igualmente a los 10 segundos, y también cuando el jugador sale.
Configuración en el plugin
Giros
| Ajuste | Por defecto | Qué hace |
|---|---|---|
StartingSpins | 1 | Giros con los que empieza un jugador nuevo. |
MaxSpins | 0 | Tope de giros acumulados. 0 significa sin tope. |
FreeSpinCooldown | 900 | Segundos hasta un giro gratis cuando el jugador se queda sin ninguno. |
Productos de desarrollador
Pega el ID del producto de desarrollador que debe vender cada botón. Los IDs que vienen son productos de demostración de RBLX Essentials, así que cámbialos por los tuyos. 0 significa que ese botón se muestra pero no vende nada, y el Output del servidor lo dice al arrancar. Los recibos los gestiona Datastore & Purchase System, así que una compra se entrega una sola vez y se registra como cualquier otra.
Premios
La ruleta de arriba es la de verdad, redibujada mientras editas. Sube o baja el número de casillas, de 2 a 12, y la ruleta se redibuja con ellas. Cada casilla tiene seis campos. El premio (Type, Target, Amount, Weight) va en la opción Rewards, solo de servidor, así que los jugadores nunca ven las probabilidades; lo que los jugadores ven en la casilla (DisplayName, Icon) va en la opción compartida Wheel, una entrada por casilla:
| Campo | Qué hace |
|---|---|
Type | Cash, Diamonds, Spins, Stat (cualquier ruta con puntos en Target, como Stats.Wins) o Custom (un módulo nombrado en Target). |
Target | Solo para Stat y Custom. Para Custom el plugin lista tus módulos de premio en un desplegable. |
Amount | Cuánto se da. Para Custom, cuántas veces se ejecuta Grant. |
Weight | Probabilidad relativa. Una casilla con 100 sale el doble que una con 50. 0 no sale nunca. |
DisplayName | Texto de la casilla, en Wheel. El plugin lo muestra en la ruleta mientras escribes, y el juego lo aplica al jugar. |
Icon | Imagen de la casilla (rbxassetid://…), en Wheel. Cada casilla viene con la suya. |
Cash y Diamonds nunca bajan de cero. Un tipo desconocido, o una casilla Stat o Custom sin target, no pasa la comprobación de la configuración, y el pack no arranca hasta que se arregle. Una casilla Custom cuyo módulo falta se apaga al arrancar con una advertencia en el Output.
Qué viene en las siete casillas
| Casilla | Tipo | Cantidad | Peso |
|---|---|---|---|
| 1 | Cash | 100 | 100 |
| 2 | Cash | 250 | 80 |
| 3 | Cash | 500 | 50 |
| 4 | Cash | 1000 | 30 |
| 5 | Diamonds | 10 | 40 |
| 6 | Custom, RandomPet | 1 | 20 |
| 7 | Spins | 1 | 60 |
Desinstalar
Elige Desinstalar (Uninstall) en el menú Más (More) de la página del pack. Quita el pack de todos los servicios donde se instaló. Tus módulos Config.RouletteSystem se quedan.
Eso es todo lo del plugin.
Si no vas a escribir premios propios ni a llamar al pack desde tu código, puedes parar aquí.
Dónde está cada cosa
ReplicatedStorage.RBLXEssentials.Packs.RouletteSystem
└── manifest, Schema, Options, Pieces, RewardLabels, Client, Migrations
ReplicatedStorage.RBLXEssentials.Config.RouletteSystem -- yours: Spins, DevProducts, Wheel
ServerScriptService.RBLXEssentials.Packs.RouletteSystem
├── Roulette -- the rules
├── PaidSpins, Starter -- paid bundles, the shipped seven slots
└── CustomRewards/RandomPet, GrantPet
ServerScriptService.RBLXEssentials.Config.RouletteSystem -- yours: Rewards (server only)
ServerScriptService.RBLXEssentials.Extensions.RouletteSystem -- yours: reward modules
StarterGui.RBLXEssentials.RouletteSystem.RouletteSystemGUI
El menú Spin y su botón del HUD son piezas propias de este pack, RouletteSystem.SpinPanel y RouletteSystem.SpinButton. Para cambiarles el estilo, haz tu propia copia (el lápiz en la pestaña Interfaz (Interface) del plugin, o pídeselo a tu IA); las actualizaciones nunca la tocan.
Qué guarda
El pack escribe sus propias claves al entrar el jugador. No hay que añadir nada a los Default Data de Datastore.
d.Roulette.Spins -- spins in hand
d.Roulette.LastSpinTime -- os.time() when they ran out (0 = no countdown)
Las dos se copian en player.PlayerData.Roulette para que el cliente pueda leerlas.
Premios propios
Pon un ModuleScript en ServerScriptService > RBLXEssentials > Extensions > RouletteSystem, una carpeta que las actualizaciones nunca tocan:
local MyReward = {}
function MyReward.Grant(player, d)
-- d is the live save inside a data update; changes persist
d.Stats = d.Stats or {}
d.Stats.Diamonds = (d.Stats.Diamonds or 0) + 1
end
return MyReward
Pon el Tipo (Type) de la casilla en Custom y elige el módulo en el desplegable Módulo (Module). Cantidad (Amount) es cuántas veces se ejecuta Grant por giro. Una casilla que apunta a un módulo que no existe se apaga al arrancar con una advertencia.
Con el pack vienen dos módulos:
RandomPetes el de la casilla 6 por defecto, y funciona con o sin Easy Pet System. Abre una mascota de un huevo de Easy Pet System con las probabilidades de ese huevo, gratis, con el aviso de eclosión de siempre.EGG_IDal principio elige el huevo (Tier1Eggde serie) yFALLBACKes lo que da cuando falta Easy Pet System (25 Diamonds, onilpara nada).GrantPetda una mascota concreta, nombrada enPET_ID(Dogde serie). Necesita Easy Pet System: sin él, la casilla no da nada y el Output lo dice.
Para cambiar cualquiera de los dos, cópialo en Extensions > RouletteSystem y edita la copia: un módulo ahí se ejecuta en lugar del del pack con el mismo nombre.
API
Declara "RouletteSystem" en el manifest.deps de tu pack y luego:
local roulette = ctx.require("RouletteSystem")
-- capped by MaxSpins; false if the amount is not positive
roulette.addSpins(player, 5)
-- waits for the player's save; 0 if it could not be read
roulette.getSpins(player)
-- true, or false and why: "No spins available" ("Data not loaded" before the save loads)
local ok, why = roulette.canSpin(player)
-- inside your own ds.Update: adds spins to that save table, capped by MaxSpins
roulette.grantSpins(d, 3)
grantSpins es como Codes System y Time Rewards System dan giros. No declaran Roulette System; llegan a él con ctx.companion("RouletteSystem"), así que un premio Spins se apaga con una advertencia cuando no está instalado.
Remotes
Los crea el kernel en ReplicatedStorage > RBLXEssentials > Kernel > Remotes > RouletteSystem.
| Remote | Tipo | Descripción |
|---|---|---|
RequestSpin | RemoteFunction | Gasta un giro y devuelve { Success = true, Reward = { Index, DisplayName, Icon } } o { Success = false, Error }. El premio queda retenido hasta que la ruleta termina. |
AnimationComplete | RemoteEvent | Da el premio retenido. Un segundo RequestSpin también lo da, igual que la espera de 10 segundos y salir del juego. |
La cuenta atrás del giro gratis se calcula en el cliente a partir de Spins.FreeSpinCooldown en ReplicatedStorage.RBLXEssentials.Config.RouletteSystem, que todos los clientes pueden leer. No hay remote para reclamar el giro.
Sonidos
Roulette_Click cuando la ruleta pasa por cada casilla, Roulette_Reward cuando se para. Los dos vienen en el grupo SFX de Sound System y suenan a través del kernel, así que, si ese pack no está instalado, no suenan, pero nada se rompe.
Time Rewards System
PackId: TimeRewardsSystem · Versión: 3.3.3 · Necesita: Datastore & Purchase System
En 3.0 las opciones que la 2.x guardaba en la carpeta Settings de este pack están en el módulo de configuración de tu juego, Config.TimeRewardsSystem en ReplicatedStorage (todas las opciones de este pack son compartidas, así que no hay módulo solo de servidor). El panel del plugin que ves en esta página las edita, y tu IA lista todas las opciones con T.config.reference("TimeRewardsSystem").
Qué hace
Dos sistemas de premios que funcionan a la vez: una racha de siete días por volver, y seis regalos por tiempo por quedarse. Tipos, cantidades, iconos y tiempos son todos ajustes del plugin.
- Un ciclo de siete días con la espera que elijas. Saltarse un día no reinicia el ciclo, solo lo pausa.
- Seis regalos de sesión que se desbloquean tras unos minutos fijos de juego sin salir. El progreso de la sesión vive en memoria y empieza de nuevo cuando el jugador vuelve a entrar, porque son premios por quedarse.
- Los indicadores de los dos botones del HUD se encienden cuando hay algo que reclamar, y el panel diario se abre solo al entrar si hay un premio esperando.
- El icono de sesión cuenta atrás hasta el siguiente regalo en el propio HUD. Se limpia cuando hay un regalo esperando, porque el indicador lo dice mejor que un reloj en 00:00.
- El día actual se anuncia solo: su casilla crece, toma el degradado y su icono flota. El énfasis sigue al ciclo, así que se mueve solo.
Configuración en el plugin
Cada hueco de premio, día o regalo, comparte los mismos seis campos:
| Campo | Qué hace |
|---|---|
Type | Cash, Diamonds, Spins, Stat o Custom. |
Target | Solo para Stat (una ruta de datos como Stats.Wins) o Custom, donde el plugin lista tus módulos de premios en un desplegable. |
Amount | Cuánto se da. Una cantidad negativa quita, nunca por debajo de 0. Para Custom, el número que se pasa una vez al Grant de tu módulo (GrantPet: cuántas mascotas). |
Icon | Imagen de la casilla (rbxassetid://…). |
Enabled | Si no lo pones, el hueco está activo. false (Activo (On) desmarcado en el plugin) deja el hueco en su sitio pero nunca lo da. Un día desactivado detiene ahí el ciclo diario para cada jugador que llegue a él. |
Fallback | Opcional: lo que da el hueco en su lugar cuando falta el pack que necesita (un hueco Spins sin Roulette System, o un módulo Custom como GrantPet sin Easy Pet System). Es un premio Cash, Diamonds o Stat con su propio Amount, un Target para Stat y un Icon opcional. El hueco sigue activo, el panel muestra el premio alternativo y el servidor lo dice al arrancar. Sin él, ese hueco se desactiva. No es una fila del plugin: se escribe en Config.TimeRewardsSystem (o lo escribe tu IA), y el plugin lo conserva al guardar. |
Los rótulos de las casillas salen de esos campos: +500 para una moneda, +1 SPIN para giros, +5 Wins para una estadística. Custom es la excepción, porque no hay número que mostrar y el nombre de un módulo no es para los jugadores, así que la casilla mantiene el rótulo que le pongas.
Regalos de sesión
Los huecos de regalo añaden un campo, IntervalMinutes: los minutos de juego sin salir de la sesión antes de que se desbloquee ese regalo.
| Regalo | Intervalo | Tipo | Cantidad |
|---|---|---|---|
| 1 | 5 min | Cash | 10 |
| 2 | 10 min | Cash | 25 |
| 3 | 15 min | Cash | 50 |
| 4 | 30 min | Cash | 75 |
| 5 | 45 min | Cash | 100 |
| 6 | 60 min | Diamonds | 10 |
Premios diarios
| Ajuste | Por defecto | Qué hace |
|---|---|---|
DailyRewards.ResetMode | Hours | Hours da a cada jugador un reloj propio que empieza cuando reclama. Midnight desbloquea a todos a la vez a las 00:00 UTC, así que quien reclama a las 23:50 puede volver a reclamar diez minutos después. |
DailyRewards.CooldownHours | 24 | Horas entre reclamos; 0 significa que siempre se puede reclamar. Se ignora cuando el modo es Midnight. |
| Día | Tipo | Cantidad | Fallback |
|---|---|---|---|
| 1 | Cash | 100 | |
| 2 | Cash | 200 | |
| 3 | Spins | 1 | 300 Cash |
| 4 | Diamonds | 20 | |
| 5 | Cash | 500 | |
| 6 | Diamonds | 100 | |
| 7 | Cash | 1000 |
El ciclo funciona con cualquier combinación de packs. El día 3 es un giro, que necesita Roulette System: sin él, el día 3 da su Fallback, 300 Cash, y el panel muestra eso en su lugar. Los demás días dan Cash y Diamonds. Un día Spins necesita Roulette System y un día GrantPet necesita Easy Pet System: sin ese pack, el día da su Fallback o, si no tiene, se desactiva y el ciclo se detiene ahí para cada jugador que llegue a él. Un juego que viene de la 2.x conserva los días que tenía, y un juego que ya configuró sus días los conserva.
Un día, abierto
Un Type desconocido, o un hueco Stat o Custom sin Target, no pasa la comprobación de configuración antes de que arranque el pack. Un hueco Custom cuyo módulo falta, o un hueco Spins sin Roulette System, da su Fallback en su lugar o, si no tiene, se desactiva al arrancar. En ambos casos el Output lo dice cuando arranca el servidor, en vez de que el hueco falle la primera vez que un jugador intenta reclamarlo.
Desinstalar
Elige Desinstalar (Uninstall) en el menú Más (More) de la página del pack. Quita el pack de todos los servicios donde se instaló. Tus módulos Config.TimeRewardsSystem se quedan, así que si lo vuelves a instalar los recupera.
Eso es todo lo del plugin.
Si no vas a escribir premios propios ni a llamar al pack desde tu código, puedes parar aquí.
Qué guarda
La parte diaria guarda una clave, que se crea al entrar si no existe:
data.TimeRewards = {
Daily = {
Streak = 1, -- position in the cycle (1..7), wraps after the last day
LastClaim = 0, -- os.time() of the last successful claim
}
}
Streak es una posición en el ciclo, no un recuento de días seguidos. Avanza uno por cada reclamo y vuelve a empezar. Quien reclama el día 3 y desaparece un mes vuelve al día 4, porque la espera es el único filtro.
El estado de la sesión (cuándo entró, qué regalos tomó) vive en el servidor mientras dura la sesión y nunca se escribe en el datastore.
Premios propios
Pon un ModuleScript en ServerScriptService > RBLXEssentials > Extensions > TimeRewardsSystem, que las actualizaciones nunca tocan:
local MyReward = {}
-- `d` is the live save inside a data update: changes persist and
-- replicate on their own. `amount` is the slot's Amount field.
function MyReward.Grant(player, d, amount)
d.Stats = d.Stats or {}
d.Stats.Diamonds = (d.Stats.Diamonds or 0) + amount
end
return MyReward
Pon el Tipo (Type) del hueco en Custom y elígelo en el desplegable Módulo (Module). Un módulo también puede tener una función Prepare, que se ejecuta cuando arranca el servidor: si da error o devuelve false, cada regalo o día que nombra el módulo da su Fallback o, si no tiene, se desactiva (un día desactivado detiene ahí el ciclo diario). En el CustomRewards del propio pack viene un ejemplo GrantPet, que necesita Easy Pet System: da una mascota de la rareza indicada en PET_RARITY (Legendary por defecto) en vez de una mascota fija, así que el premio sigue coincidiendo con su rótulo después de que edites tu lista de mascotas. Pon PET_ID en su lugar para fijar una mascota concreta.
Los menús
El pack trae sus propios menús Rewards y DailyRewards y sus botones del HUD. Para cambiar el estilo de uno, haz tu propia copia (el lápiz en la pestaña Interfaz (Interface) del plugin, o pídeselo a tu IA): vive en StarterGui > RBLXEssentials > Interface, donde las actualizaciones nunca la tocan, y el pack la maneja en su lugar. El énfasis del día actual se aplica en tiempo de ejecución, así que sigue al ciclo en vez de quedarse fijo en una casilla.
| Pieza | Para qué sirve |
|---|---|
Container/Gifts/Gift<N>/ButtonFrame | Cara de reclamo: ClaimButton, TimeLeftText |
Container/Gifts/Gift<N>/RewardFrame | Cara del premio una vez reclamado: Reward/ImageLabel, Reward/AmountText |
Container/ClaimedRewards | La línea "n de total reclamados" |
Container/Days/Day<N> | Casilla del día: DayLabel, Icon, Amount, ClaimButton/StatusText |
Container/Progress | Fill (racha sobre días), ProgressText |
Container/Footer | DailyStreak, TimeLeft |
Reutilizar el movimiento del día en cualquier sitio
El vaivén del día actual es el mismo que General UI Kit da a cualquier elemento, así que puedes ponérselo a algo tuyo sin código: ponle la etiqueta UI_Animated y el atributo Animation = "SineBob". El destello del día 7 gira igual con Animation = "Rotate".
Para ajustar el propio icono del día, pon como atributos en el marco Container/Days del panel cualquiera de IdleBobAmplitude (escala), IdleBobRotation (grados) o IdleBobPeriod (segundos por ciclo).
API
local rewards = ctx.require("TimeRewardsSystem")
-- Where they are in the cycle, and how long until the next.
local daily = rewards.getDaily(player)
print(daily.dayIndex, daily.cooldownRemaining)
-- Second return: the new state, or why it was refused.
local ok, result = rewards.claimDaily(player)
-- The session half, by gift number.
rewards.getSession(player)
rewards.claim(player, 3)
Un rechazo es un motivo, nunca una frase, así que el texto en pantalla lo decides tú: NotReady, AlreadyClaimed, OnCooldown, NoSuchGift, NoSuchDay, NoDays, BadIndex, GiftDisabled, DayDisabled, NoSession, NoData, GrantFailed, AdvanceFailed.
Remotes
Se crean cuando hacen falta en ReplicatedStorage > RBLXEssentials > Kernel > Remotes > TimeRewardsSystem.
| Remote | Tipo | Descripción |
|---|---|---|
ClaimGift | RemoteFunction | Reclama un regalo de sesión por su índice. |
GetSession | RemoteFunction | El estado de sesión de quien llama, para el primer dibujado y al volver a abrir. |
ClaimDaily | RemoteFunction | Reclama el día actual. |
GetDaily | RemoteFunction | El estado diario de quien llama, incluida la espera que queda. |
Cada reclamo se valida en el servidor con las mismas reglas que muestra el panel. Nunca se confía en el cliente para decidir si se puede reclamar.
Codes System
PackId: CodesSystem · Versión: 3.3.2 · Necesita: Datastore & Purchase System
En 3.0 las opciones que la 2.x guardaba en la carpeta Settings de este pack están en los módulos de configuración de tu juego, Config.CodesSystem en ReplicatedStorage y en ServerScriptService. El panel del plugin que ves en esta página las edita, y tu IA lista todas las opciones con T.config.reference("CodesSystem").
Qué hace
Codes System te deja repartir códigos canjeables para un lanzamiento, un hito, un vídeo o un sorteo en Discord, y deja que los jugadores los canjeen desde un menú. Tú escribes los códigos en el plugin (o tu IA los escribe en Config.CodesSystem); cada jugador puede canjear cada uno una vez.
- Todos los códigos que quieras, cada uno da
Cash,Diamonds, cualquier otroStatguardado,Spinspara la ruleta de Roulette System, o un premioCustomque escribes tú. - Las mayúsculas y los espacios alrededor de un código dan igual.
welcome2027,WELCOME2027yWelcome2027son el mismo código, así que un jugador que pega uno con un espacio al final recibe igualmente su premio. El cuadro de texto pasa a mayúsculas lo que escribe el jugador, así que lo que ve es lo que se compara. - Una fecha de caducidad opcional por código, con precisión de un día.
- Un canje por jugador, recordado en su guardado.
- Los intentos están limitados en el servidor: un intento por segundo y, tras cinco códigos erróneos seguidos, una espera que empieza en 5 segundos y se duplica hasta un minuto. Un código que funciona reinicia la cuenta, y un cuadro vacío nunca cuenta en contra de nadie.
- Cada palabra que puede decir el panel es un ajuste que editas, así que el pack habla el idioma de tu juego.
Los códigos se escriben en el plugin, no se descargan de ningún sitio. Un código nuevo significa abrir el place en Studio, añadirlo y volver a publicar. A cambio no hay nada que alojar, nada que autorizar y ningún otro sitio donde mirar cuando algo falla.
Configuración en el plugin
La lista de códigos
Una fila por código: el código, lo que da y un punto que dice si está activo, caducado o rechazado. Añadir código (Add code) y Eliminar (Delete code) también están aquí, así que la lista crece y encoge sin tocar el Explorer, y ambos se deshacen con un Ctrl+Z normal.
Un código, abierto
| Campo | Qué hace |
|---|---|
Code | Lo que escribe el jugador. Escríbelo como quieras que se lea; la comparación ignora mayúsculas y espacios alrededor. |
Type | Cash, Diamonds, Spins, Stat o Custom. |
Target | Solo para Stat (una ruta de datos como Stats.Wins) o Custom, donde el plugin lista tus módulos de premios en un desplegable. |
Amount | Cuánto se da. Una cantidad negativa quita, nunca por debajo de 0. Para Custom, el número que se pasa al Grant de tu módulo (GrantPet: cuántas mascotas). |
Expires | YYYY-MM-DD en UTC, o vacío para un código que no caduca nunca. El plugin te da un calendario para elegirla. |
Tipos de premio
Spins solo hace algo con Roulette System instalado, y Custom lista tus módulos en Extensions > CodesSystem y en el CustomRewards del propio pack. Ninguno es una dependencia declarada. Sin Roulette System, un código Spins avisa en el Output cuando se canjea, responde GrantFailed y no se gasta. Sin Easy Pet System, un código GrantPet se desactiva al arrancar con un aviso y responde CodeDisabled.
Caducidad
Expires es el día en que el código deja de funcionar, no su último día. 2026-09-01 significa que caduca a las 00:00 UTC del día 1, así que el 31 de agosto es el último día en que se puede canjear. El plugin muestra ese último día bajo el campo, así que nunca tienes que acordarte de la regla.
Si quieres que un código deje de funcionar en una fecha, pon Expires en vez de borrarlo. El código sigue visible en tu configuración y su historial queda intacto.
Los códigos que vienen incluidos
| Hueco | Código | Da |
|---|---|---|
| 1 | WELCOME2027 | 500 Cash, caduca el 2027-12-31 |
| 2 | PETDAY2027 | 1 mascota, mediante GrantPet. Solo si Easy Pet System se instaló antes que Codes System; si no, la instalación lo deja fuera. |
Son ejemplos y vienen activos: el plugin y tu IA los señalan hasta que los cambies o los borres, así que hazlo antes de publicar. Un juego que viene de la 2.x nunca los recibe. Instalar desde el plugin los escribe en Config.CodesSystem en ServerScriptService. Cuando tu IA instala con T.install, ese módulo vuelve como una edición que todavía tiene que aplicar, y hasta que lo haga el juego no tiene códigos.
Lo que dice el panel
Messages, en Config.CodesSystem en ReplicatedStorage, guarda cada palabra que se le puede decir a un jugador, un campo por resultado.
| Campo | Por defecto |
|---|---|
Redeemed | Redeemed {code}! |
Empty | Type a code first! |
NoSuchCode | That code doesn't exist. |
AlreadyRedeemed | You've already used that code. |
Expired | That code has expired. |
CodeDisabled | That code isn't available. |
TooFast | Slow down a moment, then try again. |
NoData | Your data is still loading. Try again. |
GrantFailed | Something went wrong. Try again. |
Redeemed puede contener {code}, que se sustituye por el código canjeado. Un mensaje que dejes fuera del módulo mantiene su valor por defecto en vez de no decir nada, así que solo pones los que cambias.
Desinstalar
Elige Desinstalar (Uninstall) en el menú Más (More) de la página del pack. Quita el pack de todos los servicios donde se instaló. Tus módulos Config.CodesSystem se quedan, así que si lo vuelves a instalar recupera tus códigos.
Eso es todo lo del plugin.
Si no piensas escribir premios propios ni llamar al pack desde tu código, puedes parar aquí.
Qué guarda
Una clave, que se crea al entrar si no existe:
data.Codes = {
Redeemed = { WELCOME2027 = true, PETDAY2027 = true },
}
Un conjunto de los códigos que ha usado este jugador, guardados en mayúsculas. Cambiar el nombre de un código en tu configuración deja que todos lo vuelvan a canjear, y es lo correcto: es otro código.
Premios propios
Pon un ModuleScript en ServerScriptService > RBLXEssentials > Extensions > CodesSystem, que las actualizaciones nunca tocan. Devuelve una tabla con una función Grant:
local MyReward = {}
-- `d` is the live player-data table inside a datastore update:
-- changes persist and replicate on their own. `amount` is the
-- code's Amount field.
function MyReward.Grant(player, d, amount)
d.Stats = d.Stats or {}
d.Stats.Diamonds = (d.Stats.Diamonds or 0) + amount
end
return MyReward
Pon el Tipo (Type) del código en Custom y elige tu módulo en el desplegable Módulo (Module), que lista lo que haya en esa carpeta. Un módulo también puede tener una función Prepare, que se ejecuta cuando arranca el servidor: si da error o devuelve false, cada código que nombra el módulo se desactiva y responde CodeDisabled.
En el CustomRewards del propio pack viene un ejemplo GrantPet, que necesita Easy Pet System. Da una mascota de la rareza indicada en PET_RARITY (Legendary por defecto) en vez de una mascota fija, así que el premio sigue coincidiendo con su rótulo después de que edites tu lista de mascotas. Pon PET_ID en su lugar para fijar una mascota concreta.
El menú
El pack trae su propio menú Codes y su botón del HUD. Para cambiarles el estilo, haz tu propia copia (el lápiz en la pestaña Interfaz (Interface) del plugin, o pídeselo a tu IA): vive en StarterGui > RBLXEssentials > Interface, donde las actualizaciones nunca la tocan, y el pack la maneja en su lugar.
Dentro del panel, el pack maneja estas piezas por su nombre:
| Pieza | Para qué sirve |
|---|---|
Container/Code/TextBox | Donde escribe el jugador. Pasa a mayúsculas con cada tecla, con el cursor donde estaba. |
Container/Button | Canjear. |
Container/ErrorText | Rechazos. |
Container/SuccessText | Confirmaciones. |
Tu copia necesita Container/Code/TextBox y Container/Button para sustituir a la del pack. Los dos textos son opcionales: sin ellos sigue canjeando en silencio. Todo lo demás del panel puedes cambiarlo de estilo como quieras.
API
Otro pack llega a este a través del kernel, después de declararlo en su propio manifest.deps:
local codes = ctx.require("CodesSystem")
-- ok, reason | { Code, Type, Amount }
codes.redeem(player, "WELCOME2027")
-- boolean; case does not matter here either
codes.hasRedeemed(player, "welcome2027")
Los rechazos vuelven como motivos para la máquina, nunca como frases: Empty, NoSuchCode, AlreadyRedeemed, Expired, CodeDisabled, TooFast, NoData, GrantFailed. Quien llama decide el texto.
Remotes
Se crean cuando hacen falta en ReplicatedStorage > RBLXEssentials > Kernel > Remotes > CodesSystem.
| Remote | Tipo | Descripción |
|---|---|---|
Redeem | RemoteFunction | Canjea el texto recibido. Devuelve { Success = true, Code, Type, Amount } o { Success = false, Error }. |
Cada canje se valida en el servidor con las mismas reglas que muestra el panel. Nunca se confía en el cliente, y el límite de intentos vive en el servidor, no en el botón.
Historial de cambios
Lo que cambia en cada versión. Versión actual: 3.5.8
Cómo actualizar: pon el plugin nuevo en tu carpeta Plugins, reinicia Studio y actualiza los packs desde la tarjeta; tus ajustes se mantienen.
Versión 3.5.8 Versión actual
Todas las ganancias vuelan
Solo cambia Notifications System: el plugin sigue en la 3.5.6. Actualízalo desde la tarjeta.
- Notifications System 3.3.3: cada «+cantidad» vuela a su contador por defecto. Antes, las ganancias a menos de 2 segundos se agrupaban como ingresos pasivos y solo volaba la primera, así que un pad de dinero pulsado una vez por segundo solo enseñaba su «+500» tras una pausa. Con
CounterFlyout.GroupSeconds = 2vuelve la agrupación.
Versión 3.5.7
Arreglos de packs
Solo cambian packs: el plugin sigue en la 3.5.6. Actualiza estos tres desde la tarjeta.
- Roulette System 3.3.4: los precios de las tiradas conservan el icono de Robux en todos los kits de GUI, como en la tienda. Desde la 3.3.3, el precio real sustituía la etiqueta entera y lo borraba.
- Leaderboards System 3.2.1: los tableros globales enseñan el valor nuevo de un jugador en el siguiente refresco. Antes, las estadísticas de un jugador solo se guardaban en los tableros al entrar, al salir y cada cinco minutos, así que un tablero podía enseñar el valor antiguo hasta cinco minutos.
- Studded Glass UI Kit 3.5.4: las cuentas atrás bajo los botones Spin y Rewards del HUD se dibujan por encima de la fila de abajo, no por detrás.
Versión 3.5.6
Aviso de plugin nuevo
- El plugin te avisa cuando hay un plugin más nuevo: un botón rosa junto a Minimizar en la tarjeta, con el enlace de descarga para copiar. Antes solo lo decía el panel antiguo de los juegos 2.x.
Versión 3.5.5
Studded Glass UI Kit, un kit de GUI nuevo
- Studded Glass UI Kit, nuevo y a la venta aparte: los mismos 17 menús y HUD con piezas de color con studs sobre cristal oscuro, en cuatro estilos. No necesita ningún otro kit.
- Sus menús suben al abrirse y bajan al cerrarse; los botones crecen y se oscurecen al pasar el ratón.
- El plugin, Tools y el Kernel 3.5.3: la pestaña Estilo muestra los cuatro estilos del kit nuevo.
Versión 3.5.4
Arreglos
- Easy Pet System: los carteles de huevos funcionan con mando (X, Y y RB) y en el móvil, con botones redondos junto al de saltar.
- General UI Kit y Classic UI Kit: un menú que se abre solo al entrar, como Daily Rewards, ya no se cierra al instante.
- El plugin: Diagnóstico explica con palabras sencillas los ids de ejemplo y las ofertas de ejemplo de la tienda.
- El plugin indica en qué juego publicado se instalan los packs, para saber dónde se usan.
Versión 3.5.3
Arreglos
- Notifications System: los ingresos cada segundo ya no llenan la pantalla de «+5»; los códigos y las tiradas siguen volando al contador. La opción nueva
CounterFlyoutlo ajusta. - Easy Pet System: sin id de pase, los carteles de huevos esconden «Open x3» y «Auto», y R y T no hacen nada.
- Easy Pet System: su propia tienda usa los ids de pase de tus ajustes.
Versión 3.5.2
Arreglos
- General UI Kit y Classic UI Kit: las ofertas de ejemplo de la tienda dicen «Not for sale» hasta que las vendas.
- Antes de publicar, tu IA te avisa de los ids de ejemplo que venderían artículos de otro juego.
- Guía para la IA: tu IA puede añadir un contador propio al HUD, como Diamonds.
- Guía para la IA: tu IA pregunta antes de instalar un segundo kit de GUI.
Versiones anteriores
Versión 3.5.1
- Sound System: la música pasa a la siguiente canción cuando acaba una.
- Roulette System muestra el precio real de tus productos; los premios de Diamonds llegan y se ven.
- Classic UI Kit: la segunda línea de los avisos se lee bien y su portada sale en la tarjeta.
Versión 3.5.0
- Classic UI Kit, nuevo: los mismos menús y HUD con un aspecto robusto de studs, en cuatro estilos.
- El Index de mascotas es un menú propio; el plugin y la documentación están también en español.
Versión 3.4.0
- Un botón de regalo en las tarjetas de Shop y Spin compra un artículo para otro jugador.
- El regalo llega aunque el jugador se haya ido; los pases que tienes muestran OWNED.
Versión 3.3.2
- Con General UI Kit, los packs usan los menús del propio kit, así que Studded llega a todos.
- Una pestaña Estilo en la tarjeta elige un estilo para todo el juego.
Versión 3.3.1
- Un solo botón RBLX Essentials en la barra; el Gestor de packs pasa a la pestaña Ajustes de la tarjeta.
- Tu IA ve qué packs tienes y puede instalarlos todos.
Versión 3.3.0
- General UI Kit viene en dos acabados, Plain o Studded, que cambias con un clic.
- El Studded UI gratis es ahora un ZIP solo con el diseño, para tus propios menús.
Versión 3.2.2
- General UI Kit y Roulette System: los temas pueden colocar los menús a su manera.
Versión 3.2.1
- Sound System: la música siempre empieza sola.
Versión 3.2.0
- Las actualizaciones respetan tus cambios: lo que borras sigue borrado y tus scripts editados se mantienen.
- Los botones de compra sin id muestran «Not for sale».
- Easy Leaderstats System pasa a llamarse Leaderboards System.
Versión 3.1.4
- Una pestaña IA en la tarjeta del plugin con la guía y el prompt para tu IA.
Versión 3.1.3
- Easy Pet System: un huevo de Robux sin producto dice que aún no está a la venta.
Versión 3.1.2
- Sound System se instala desde el plugin, y tu biblioteca muestra todos los productos gratis.
Versión 3.1.1
- Easy Pet System: la plataforma de demo Add Cash solo funciona en Studio.
Versión 3.1.0
- Inicias sesión una vez e instalas cualquier pack desde la tarjeta del plugin.
- Notifications System: nuevos diseños Toy y Sleek. Easy Pet System: 28 mascotas nuevas.
Versión 3.0.3
- Time Rewards System: un premio alternativo cuando falta el pack que necesita un premio.
- Studded UI 3.0.1: los botones de menú salen en su sitio en Studio.
Versión 3.0.2
- El tema gratis Studded UI para General UI Kit.
Versión 3.0.1
- General UI Kit vuelve a traer los 14 menús; el menú de un pack sustituye a la demo del kit.
Versión 3.0.0 Actualización gratis para quien tiene la 2.x
- Tools para agentes de IA: tu IA instala, configura y revisa los packs desde Studio.
- Pasar a la 3.0: un proceso guiado de revisar y aprobar, con copia de seguridad antes.
- FreeMode solo funciona en Studio. En la 2.x, desactívalo en Datastore & Purchase.
- Codes System es gratis; Roulette System admite de 2 a 12 casillas.
Versiones 2.x y 1.x
- 2.1.1: los menús y botones del HUD ya no desaparecen al reaparecer el personaje.
- 2.1.0: plantillas Studded UI, más sonidos, guardado más seguro e inventario de huevos de mascotas.
- 2.0.0: el plugin instala packs autónomos; llegan Roulette, Time Rewards, Codes y Notifications.
- 1.x: el primer plugin y los primeros packs.