Ir al contenido

El Inventario

Has transformado una Part. Las partículas vuelan. Aún no tienen una textura — se renderizan como cuadros planos de color sólido.

Podrías ir a la biblioteca de Roblox, buscar una chispa de fuego gratuita, copiar su id de recurso, pegar el id en el Decal del Render Template, repetir para el siguiente emisor. Después de diez emisores habrás pasado media hora copiando ids de recursos y tu entusiasmo se habrá agotado.

El Inventario es la respuesta del plugin a ese trabajo tedioso. Es un par de bibliotecas de texturas una al lado de la otra que puedes explorar, buscar, filtrar y aplicar con un clic sobre lo que tengas seleccionado. La biblioteca Inventory está curada por el plugin y se distribuye con tu instalación de Studio — unas 12.000 texturas y unos cientos de flipbooks animados organizados en las categorías de palabras clave que la comunidad de modelado VFX ha adoptado. La biblioteca Local Inventory es tuya: texturas que has subido, flipbooks que has ensamblado o diseccionado, e incluso instancias de Roblox completamente serializadas que has guardado para reinsertar más tarde.

Este capítulo recorre todo el sistema: la disposición del panel, el comportamiento de clic para aplicar, la barra de herramientas de selección, la vista de detalles, la subida en lote, la disección de spritesheets, la serialización de recursos y el formato de exportación e importación JSON que te permite compartir bibliotecas con otros usuarios del plugin.

El HUD del plugin tiene un botón de alternar Inventory. Haz clic en él. Se abre un panel de 600×380. Puedes arrastrarlo por su barra de título y redimensionarlo desde cualquier borde — la cuadrícula redistribuye automáticamente el número de columnas cuando lo haces más ancho.

Un segundo interruptor en el QMenu lo vuelve a cerrar; también lo hace el botón de cerrar del propio panel. La visibilidad persiste entre reactivaciones del plugin, así que una vez que lo hayas abierto en una estación de trabajo permanece abierto la próxima vez que inicies Studio.

El borde izquierdo del panel es una barra lateral con dos secciones plegables.

Inventory — el catálogo alimentado desde la nube. Tres submodos: Textures (recursos de imagen única, ~12.000 entradas), MeshFlipbooks (secuencias de animación con nombre, cada una una lista de ids de textura que se reproducen como fotogramas) y Assets (árboles completos de instancias de Roblox que puedes reinsertar en tu lugar). Los tres se obtienen la primera vez que abres el panel desde los archivos JSON alojados en GitHub del plugin, y se almacenan en memoria durante el resto de la sesión.

Local Inventory — la tuya. Los mismos tres submodos en espejo: Textures, MeshFlipbooks, Assets. Cualquier cosa que subas, disecciones, importes desde el workspace o pegues mediante el diálogo de importación JSON llegará aquí. Persiste entre reinicios del plugin (almacenado en plugin:GetSetting("LocalInventory")) y sobrevive a la sustitución del plugin (también se escribe un ModuleScript de respaldo en ServerStorage).

Haz clic en cualquiera de los seis botones de submodo y la cuadrícula se actualiza para mostrar esa biblioteca. El botón activo se resalta en dorado; los demás permanecen apagados. Los dos encabezados principales — Inventory y Local Inventory — se pliegan y despliegan al hacer clic, de modo que puedes contraer la mitad que no estás usando.

Encima de la cuadrícula, una fila de pestañas filtra lo que se muestra sin cambiar de modo:

  • Static — solo entradas sin ningún atributo de cuadrícula de flipbook.
  • Flipbook — solo entradas cuyos datos de origen declaran una cuadrícula de flipbook.
  • Favourites — solo entradas que hayas marcado con estrella (por entrada, véase el panel de Detalles más abajo).
  • Recents — las últimas 20 entradas que insertaste, las más recientes primero. Persiste entre reinicios del plugin.

Las pestañas son visibles solo cuando tienen sentido para el modo actual. Inventory.Textures muestra las cuatro; Inventory.MeshFlipbooks muestra solo Favourites y Recents (Static y Flipbook no aplican); los cuatro submodos Local ocultan las pestañas por completo (las bibliotecas Local son demasiado pequeñas para necesitar este tipo de filtrado).

El cuadro de búsqueda aparece en la parte superior del área de contenido, junto al desplegable Filters. Escribe algunas letras y la cuadrícula se filtra en tiempo real. La coincidencia tiene un retardo para que un mecanógrafo rápido no desencadene un rerenderizado en cada pulsación de tecla.

El índice de búsqueda se construye una vez por entrada a partir del nombre, el id de recurso y cualquier etiqueta de palabra clave. Varias palabras se unen con AND: escribir red fire muestra solo las entradas cuyo campo _search contiene tanto red como fire, en cualquier orden. Vacía el cuadro y la cuadrícula sin filtrar regresa.

Haz clic en el botón Filters ▼ (junto al cuadro de búsqueda) y aparecerá un desplegable con las categorías que se aplican a la biblioteca actual:

  • Inventory.Textures — las categorías de palabras clave en las que se agrupa la biblioteca curada. El plugin las organiza en cinco grupos principales (Shapes, Combat, Elements, Radiance, Misc) más un grupo Other para cualquier palabra clave sin categorizar.
  • Inventory.Assets y Local Inventory.Assets — el ClassName del recurso (cada ClassName distinto encontrado en la lista de recursos en caché), más un interruptor de Favourites.
  • Local.Textures y Local.MeshFlipbooks — solo Favourites (aún no hay etiquetado de palabras clave en texturas subidas por el usuario).

Los filtros son de selección múltiple: haz clic en Fire, luego en Lightning, y la cuadrícula muestra entradas etiquetadas con cualquiera de las dos palabras clave. Vuelve a hacer clic en la etiqueta para deseleccionarla. El botón All en la parte superior del desplegable borra todos los filtros activos de una vez.

El área de contenido es una cuadrícula de miniaturas pequeñas. Cada celda muestra la imagen de vista previa de la entrada (o un renderizado 3D para entradas de recursos — véase Detalle de recurso más abajo), el nombre de la entrada debajo y un pequeño icono de estrella para marcar como favorito al pasar el cursor.

La cuadrícula renderiza solo lo que está visible actualmente más un pequeño búfer, por lo que el desplazamiento se mantiene fluido incluso con 12.000 entradas.

Pasa el cursor sobre una celda para ver su nombre en un tooltip. Haz un solo clic en una celda para abrir el panel de Detail junto al inventario. Shift+clic para añadirla a una selección múltiple.

Selección — Shift+clic y selección por arrastre

Sección titulada «Selección — Shift+clic y selección por arrastre»

La selección múltiple es la forma de actuar sobre más de una entrada a la vez. Dos formas de construir una selección:

Shift+clic — alterna la pertenencia de la celda clicada. Las celdas seleccionadas obtienen un fino borde dorado alrededor de la miniatura y una marca de verificación blanca sobre fondo dorado en la esquina superior derecha.

Shift+arrastrar — selección por arrastre. Mantén pulsado Shift, presiona el ratón sobre una celda y arrástralo sobre otras celdas. El estado previo al arrastre de la primera celda determina el modo de pintura: empezar en una celda no seleccionada pinta “seleccionar” sobre cada celda que cruces; empezar en una celda seleccionada pinta “deseleccionar”. Soltar el ratón detiene el arrastre. Esto es para barrer muchas celdas de un solo movimiento cuando no quieres hacer Shift+clic en cada una individualmente.

La selección tiene un límite máximo determinado por el límite de caracteres del TextBox de Roblox (una de las cosas que puedes hacer con una selección es exportarla como texto — véase Exportar e Importar JSON más abajo). Cuando alcanzas el límite, la barra de herramientas de selección muestra (MAX) junto al contador y se niega a añadir más entradas hasta que elimines algunas.

En cuanto se selecciona una celda, aparece una barra de herramientas en línea en la parte superior derecha del panel que muestra el contador y cuatro botones de acción: Export, Dissect, Delete, Clear. La barra de herramientas es solo de selección; desaparece en el momento en que la limpias.

  • Export — empaqueta la selección en formato JSON y abre el diálogo de Exportar/Importar, con el texto JSON ya rellenado. Útil para compartir un subconjunto curado en lugar de toda tu biblioteca. La compresión se activa automáticamente cuando el JSON sin procesar superaría el límite de caracteres del TextBox de Roblox.
  • Dissect — rellena el cuadro de id del diálogo Dissect Spritesheets con los ids de recursos de cada entrada de textura simple que hayas seleccionado, listas para diseccionarlas todas a la vez. Oculto cuando no hay ninguna entrada de textura simple en la selección (Dissect no aplica a flipbooks ni a recursos).
  • Delete — elimina las entradas seleccionadas de tu biblioteca Local. Sin confirmación; el botón Clear de la barra de herramientas es la recuperación si haces clic por error. Las entradas de la nube no pueden eliminarse (se distribuyen con el plugin).
  • Clear — vacía la selección sin hacer nada más.

Observa lo que no está en esta barra de herramientas: no hay botón de Favorito. Marcar como favorito es una acción por entrada que se expone en el panel de Detalles, no una acción de la barra de herramientas de selección múltiple. El plugin trata los favoritos como una anotación de “este en concreto importa”, no como una operación masiva.

Haz un solo clic en cualquier celda y un panel de Detalles se desliza junto al inventario (a la derecha si hay espacio, a la izquierda si el inventario está demasiado a la derecha en tu pantalla). Muestra la entrada completa y es donde se encuentran todas las acciones por entrada.

Para entradas de textura:

  • Imagen de vista previa a resolución completa. Si la entrada es un spritesheet (sus datos declaran un número grid), la vista previa se anima: el plugin desplaza el rect visible fotograma a fotograma a 24 fps, recorriendo cada celda de la cuadrícula. Esta es la forma más económica de comprobar “¿este flipbook está realmente animado?”.
  • Name — editable para entradas Locales (aparece un icono de lápiz de edición junto al nombre cuando es editable; los nombres de la nube son de solo lectura).
  • Asset ID — de solo lectura, con un botón Copy junto a él que selecciona el texto del cuadro de texto para que puedas copiarlo con Ctrl+C.
  • Keywords — lista de etiquetas de la entrada separadas por comas.
  • Info — resumen en una sola línea como 8x8 flipbook, 1024px, 24 fps o Static texture.
  • Grid — solo para entradas Locales, te permite convertir una textura plana en un spritesheet escribiendo un número de cuadrícula (p. ej. 4 o 8x8). La vista previa animada del panel de detalles se actualiza para coincidir.
  • Botón Favourite — alterna el estado de favorito. Persiste mediante la configuración del plugin (InventoryFavourites).
  • Botón Insert — aplica la entrada a lo que esté seleccionado en Studio (véase Comportamiento de Insert más abajo).
  • Botón Delete — solo entradas Locales. Elimina de la biblioteca y actualiza la cuadrícula.

Para entradas de MeshFlipbook:

  • Vista previa animada — se muestra el primer id de textura, luego el siguiente, luego el siguiente, en ciclo a 24 fps. El plugin precarga cada fotograma en lotes de seis mediante ContentProvider:PreloadAsync para que la animación no se interrumpa en el primer ciclo.
  • Contador de Frames, vista previa de Texture IDs (los tres primeros más puntos suspensivos), Info con el número de fotogramas.

Para entradas de Asset:

  • Visor 3D — un ViewportFrame que muestra el árbol de instancias deserializado, rotando lentamente alrededor del bounding box. El plugin almacena en caché hasta 20 vistas previas deserializadas y las recicla usando LRU a medida que haces clic en diferentes recursos.
  • Campos Class y Location — qué es el recurso y de dónde proviene (una ruta de padre almacenada, varias rutas o simplemente el tamaño de los datos comprimidos si no se capturó ninguna ruta).

Hacer clic en Insert en el panel de Detalles (o presionar Enter mientras el panel tiene el foco) aplica la entrada a tu selección actual de Studio.

El plugin recorre cada parte de la selección y la enruta por tipo:

  • Transformed Parts — establece el Decal.Texture (o Texture.Texture) en el RenderTemplate de la part. Si es una entrada de flipbook, repuebla la carpeta MeshFlipbooks de la part con nuevos Decals.
  • Transformed Beams — establece el RenderTemplate.Texture del Beam. Los flipbooks repueblan BeamFlipbooks.
  • Transformed Trails — establece el Texture del Trail directamente.
  • Transformed ImageLabels — establece el Image tanto en el ImageLabel activo como en su RenderTemplate. Si la entrada es un spritesheet (con grid declarado), el plugin cambia automáticamente el ImageLabel al modo Spritesheet y escribe GridCols/GridRows para coincidir.
  • Native ParticleEmitters (emisores nativos de Roblox sin transformación del plugin) — establece Texture y, si la entrada tiene una cuadrícula de 2/4/8, establece FlipbookLayout al enum correspondiente Grid2x2 / Grid4x4 / Grid8x8.
  • Decals o Textures seleccionados directamente (no en ningún padre transformado) — establece Texture directamente sobre ellos.

Lo que hayas insertado también se fija mediante el Texture Pinning del plugin para que el recurso permanezca residente en la GPU — el primer emit tras una inserción no se detendrá por la decodificación de la textura.

Para entradas de Asset, Insert es diferente: el plugin deserializa los datos almacenados en una o más instancias y asigna el padre de cada una a la ruta desde la que se capturó originalmente. Si la ruta original ya no existe en tu lugar — por ejemplo, el recurso fue capturado de una carpeta ServerStorage.SwordEffects que no existe en este lugar — el plugin muestra un marco de error en rojo con un botón Create & Insert que crea automáticamente las carpetas que faltan antes de insertar.

Texturas Locales — subida individual y en lote

Sección titulada «Texturas Locales — subida individual y en lote»

Cambia a Local Inventory.Textures y la barra de herramientas encima de la cuadrícula muestra un botón Upload. Haz clic en él; se abre el selector de archivos de Studio; selecciona uno o más archivos PNG / JPG / BMP / TGA.

Cada archivo se convierte en una entrada de textura independiente. El plugin sube mediante la ruta de subida integrada de Studio (tu propia cuenta realiza la subida — no se necesita configuración de API externa), recibe un id de recurso nuevo y añade la entrada a tu biblioteca Local con el nombre del archivo como nombre de la entrada.

Las subidas se realizan en lote. Un pequeño panel de estado se acopla junto al inventario mostrando el progreso en tiempo real de cada archivo. Las subidas fallidas (fallo de red, límite de tasa, retención por moderación de recursos) se reintentan automáticamente con retroceso exponencial entre intentos; la fila de estado muestra cuentas atrás de reintento para que sepas qué está pasando. Los éxitos ponen la fila en verde; los fallos la ponen en rojo y el archivo se omite.

Dado que las subidas comparten un único vaciado de lote al final (en lugar de escribir en disco después de cada subida), los lotes grandes no saturan la persistencia de la configuración del plugin. La fila de estado permanece abierta durante tres segundos después de que el lote termine y luego se cierra automáticamente.

Import Selected — importar texturas desde tu escena

Sección titulada «Import Selected — importar texturas desde tu escena»

Junto a Upload hay un botón Import Selected. Es el atajo para “ya tengo estas texturas en Decals / Textures / Beams de mi lugar y quiero que estén en mi biblioteca Local sin volver a subirlas.”

Selecciona uno o más Decals, Textures, Beams o cualquier otra instancia con una propiedad .Texture en el Explorador de Studio. Haz clic en Import Selected. El plugin recorre la selección, extrae el id de recurso del campo Texture de cada una y añade cada una como entrada de Textura Local (usando el Nombre de la instancia como nombre de la entrada). Los duplicados de id existentes se omiten silenciosamente.

Útil al migrar un rig VFX antiguo al inventario, o cuando un recurso de un modelo libre tiene texturas que quieres reutilizar en otros emisores de tu proyecto.

MeshFlipbooks Locales — subida en lote con solicitud de nombre

Sección titulada «MeshFlipbooks Locales — subida en lote con solicitud de nombre»

El mismo flujo que Textures, con una diferencia: cuando estás en Local.MeshFlipbooks y haces clic en Upload, el plugin solicita un nombre para el flipbook antes de comenzar. Cada archivo que hayas seleccionado se convierte en un fotograma de un flipbook con ese nombre, en el orden de selección, en lugar de entradas de textura independientes.

Este es el camino manual hacia un flipbook personalizado: renderiza tu animación en Blender o en el DCC que uses, exporta cada fotograma como PNG, selecciónalos todos en el diálogo de archivo en el orden correcto, escribe un nombre y pulsa OK.

Los fotogramas se suben de uno en uno con la misma lógica de reintento que la subida de textura individual, y la entrada de flipbook resultante recibe el nombre que hayas escrito.

Import Selected — carpetas de Decals numerados en flipbooks

Sección titulada «Import Selected — carpetas de Decals numerados en flipbooks»

La barra de herramientas de Local.MeshFlipbooks también tiene un botón Import Selected, pero la entrada que espera es diferente: selecciona una o más Folders en el Explorador de Studio, donde cada carpeta contiene Decals numerados (1, 2, 3, …) que apuntan a los fotogramas de una animación.

Haz clic en Import Selected. El plugin recorre cada carpeta seleccionada, lee el .Texture de cada hijo, los ordena por nombre numérico y añade una entrada de flipbook por carpeta con el nombre de la carpeta. Las carpetas sin hijos con .Texture se omiten.

Este es el atajo correcto cuando ya has ensamblado un flipbook en tu escena (o lo has extraído de un hijo MeshFlipbooks de una Part transformada) y quieres tenerlo de nuevo en el inventario para reutilizarlo.

Si tu fuente de animación es un único spritesheet — una imagen dispuesta como una cuadrícula de N×M fotogramas — no necesitas cortarla previamente con una herramienta externa. El plugin lo diseccionará por ti, subirá cada fotograma como una textura independiente y unirá los resultados en una entrada de flipbook.

Haz clic en Dissect en la barra de herramientas de Local.MeshFlipbooks (o haz clic en Dissect en una selección múltiple de texturas simples). Se abre un diálogo con tres controles y cuatro rutas de entrada:

  • Cols y Rows — las dimensiones de la cuadrícula de cada spritesheet que vas a diseccionar. Por defecto 4×4.
  • Asset IDs — uno por línea o separados por comas. Cada id se convierte en un flipbook llamado Spritesheet_<id>.
  • From Selection — rellena el cuadro de id con el campo .Texture de cada Decal/Texture/Beam seleccionado en tu workspace de Studio.
  • Upload & Dissect — abre el selector de archivos, sube cada PNG/JPG/etc. seleccionado primero como imagen completa (para que tengas la fuente en resolución completa) y luego disecciona cada uno con el mismo Cols×Rows.
  • Dissect — ejecuta la disección en los recursos del cuadro de id.

La disección en sí es paralela — cada spritesheet en cola se ejecuta como su propia tarea. Las subidas de fotogramas tienen una pequeña pausa entre ellas para no superar los límites de tasa de AssetService. Para recursos que no te pertenecen, la infraestructura de servidor del lado del plugin gestiona el trabajo pesado para que el resultado llegue en la resolución completa de la fuente. Si esa ruta no está disponible, la herramienta vuelve a una miniatura de baja resolución (garantizada de funcionar pero visiblemente más borrosa).

Una fila de estado permanece abierta para cada disección en curso, mostrando el progreso Frame N/M y las cuentas atrás de reintento por fotograma cuando falla una subida.

Recursos Locales — instancias de Studio como entradas de inventario

Sección titulada «Recursos Locales — instancias de Studio como entradas de inventario»

El tercer submodo Local, Local Inventory.Assets, es donde guardas instancias de Roblox en sí mismas — Models, Folders, rigs de emisores transformados — como entradas de inventario que puedes reinsertar más tarde.

Para guardar un recurso:

  1. Selecciona una o más instancias en el explorador de Studio.
  2. Cambia a Local.Assets y haz clic en Import Selected en la barra de herramientas.

El plugin ejecuta cada selección a través de la API de serialización de instancias de Roblox, comprime y codifica el resultado para un almacenamiento compacto, y almacena la cadena resultante en tu biblioteca Local. El nombre de la entrada es el nombre de la instancia (con sufijos (2), (3) si ya existe una entrada con ese nombre), la clase de la entrada es el ClassName de la instancia, y la entrada recuerda de qué ruta de padre proviene.

Dos interruptores de importación — Bundle y Paths

Sección titulada «Dos interruptores de importación — Bundle y Paths»

La flecha junto a Import Selected abre un pequeño desplegable con dos casillas de verificación que cambian cómo funciona la importación:

  • Bundle (import as one) — cuando está ACTIVADO, cada instancia seleccionada se serializa juntas como una única entrada de recurso. Reinsertar la entrada restaura todo el grupo a la vez. Cuando está DESACTIVADO, cada instancia seleccionada se convierte en su propia entrada — útil cuando has seleccionado diez efectos no relacionados y quieres que cada uno esté disponible como elemento de biblioteca independiente.
  • Paths (save locations) — cuando está ACTIVADO, la ruta de padre original de cada instancia se almacena junto a los datos. Al reinsertar, el plugin intenta colocar cada una de vuelta en la misma ruta de la que provino, con un aviso Create & Insert si la ruta ya no existe. Cuando está DESACTIVADO, no se almacena ninguna ruta y la reinserción simplemente coloca la instancia bajo workspace.

El texto del botón de la barra de herramientas se actualiza en tiempo real para reflejar los interruptores: Import Selected con ambos desactivados, Import Bundle con solo Bundle activado, Import + Paths con solo Paths activado, Import Bundle + Paths con ambos activados. Ambos están desactivados por defecto — la importación simple de “una entrada por elemento seleccionado, sin seguimiento de ruta” es la base segura.

Elige la combinación que se adapte a lo que quieres poder reinsertar más tarde. Un conjunto completo de emisores de espada que siempre deben volver juntos → Bundle. Una limpieza de un lugar complejo donde cada rig debería reaparecer en su carpeta original → Paths. Ambos → reinsertar el bundle coloca cada instancia exactamente donde estaba.

El panel de Detalles para una entrada de Asset muestra un ViewportFrame 3D que previsualiza el árbol de instancias, rotando lentamente. El plugin almacena en caché las vistas previas vistas recientemente para que volver a una sea instantáneo; hacer clic en un nuevo recurso pone en cola una tarea de deserialización. La deserialización está limitada para mantener la interfaz de usuario con capacidad de respuesta.

Exportar e Importar JSON — compartir bibliotecas

Sección titulada «Exportar e Importar JSON — compartir bibliotecas»

Cada entrada del inventario Local puede exportarse como JSON. Haz clic en el botón (Exportar/Importar) en la barra de herramientas de Local y se abre un diálogo con un cuadro de texto multilínea y dos botones: Export e Import.

Export escribe tu biblioteca Local completa en el cuadro de texto como JSON: texturas, flipbooks y recursos, todos en un solo documento. Si el JSON supera el límite de caracteres del TextBox de Roblox, el plugin lo comprime automáticamente y etiqueta el resultado con un prefijo reconocible para que el importador sepa con qué está tratando. La compresión normalmente reduce una biblioteca serializada a una fracción de su tamaño sin procesar.

Import invierte el flujo. Pega una cadena JSON (comprimida o sin procesar) en el cuadro de texto, haz clic en Import y el plugin fusiona las entradas en tu biblioteca Local. Los duplicados se omiten silenciosamente — añadir el mismo id de textura dos veces no lo duplica en la lista; añadir un flipbook con un nombre que ya existe omite el duplicado (cuando las texturas coinciden) o añade un sufijo (2) (cuando las texturas difieren).

El botón Export de la barra de herramientas de selección hace la misma exportación para un subconjunto — solo las entradas que hayas seleccionado. Este es el camino para compartir un kit de efectos curado con otro usuario del plugin: selecciona cincuenta texturas y tres flipbooks, haz clic en Export, copia el texto JSON, envíalo por el canal que prefieras; el destinatario lo pega en su cuadro de Import.

El cuadro de texto del diálogo también acepta una fuente de entrada alternativa: si has dejado un cuadro de texto vacío y haces clic en Import, el plugin escanea todo el DataModel en busca de cualquier LuaSourceContainer (un Script, LocalScript o ModuleScript) que lleve el atributo ExportPart_Icle y lee el origen. Esto es para compartir bibliotecas mediante scripts de exportación adjuntos a un lugar publicado — cualquiera que se una al lugar obtiene el script de exportación, ejecuta Import y la biblioteca llega a su propia configuración del plugin. El plugin etiqueta el script de origen con un atributo por usuario para que cada instalación de Studio solo lo importe una vez.

La pestaña Recents en el modo Inventory.Textures (e Inventory.MeshFlipbooks) muestra las últimas 20 entradas que insertaste, las más recientes primero. Persistido mediante plugin:GetSetting("InventoryRecents") — sobrevive a reinicios del plugin y de Studio.

Esta es la forma más rápida de volver a encontrar una textura que usaste hace tres minutos sin recordar su nombre. La lista crece hasta 20 entradas y luego elimina la más antigua cada vez que insertas algo nuevo.

Los datos del inventario Local se almacenan en dos lugares:

  1. plugin:GetSetting("LocalInventory") — el almacenamiento canónico. El sistema de configuración del plugin de Roblox. Sobrevive a reactivaciones del plugin y reinicios de Studio.
  2. Un ModuleScript oculto en ServerStorage — una copia de seguridad escrita cada vez que se ejecuta el guardado canónico. Sobrevive a la sustitución del plugin: si reinstallas el plugin desde cero (y pierdes la configuración del plugin), la copia de seguridad sigue estando en tu archivo