For the complete documentation index, see llms.txt. This page is also available as Markdown.

Inventario

Descripción general

All Out ofrece una API de inventario de jugador que te permite crear objetos, dárselos a los jugadores y que los jugadores organicen, usen y suelten objetos en tu juego.

Hay tres conceptos básicos:

  • Definiciones de objeto (Item_Definition): qué es un objeto es (nombre/icono/apilamiento + tus propios campos)

  • Instancias de objeto (Item_Instance): una pila real en el mundo/en un inventario

  • Inventarios (Inventory): un contenedor de espacios que almacena instancias de objeto

Cada jugador tiene un inventario integrado en player.default_inventory.

Persistencia

Si quieres que los inventarios de los jugadores se guarden automáticamente entre sesiones de juego, activa la casilla Auto Save Player Inventory en la Editar → Configuración del juego sección del editor.

Player inventory settings in Game Config

Configura ambas opciones por programación en ao_before_scene_load, antes de que se creen o restauren los inventarios de los jugadores:

La capacidad configurada es el mínimo usado durante una restauración persistente; se conserva una capacidad mayor almacenada en la partida guardada. Cambiar la opción de la escena en Player.ao_start es demasiado tarde para el default_inventory restaurado de ese jugador y no lo redimensiona. Usa Items.set_capacity cuando necesites redimensionar intencionadamente un inventario existente. Reducirlo falla si un espacio que se va a quitar contiene un objeto.

Inventarios de jugador con nombre

Crea inventarios persistentes solo durante el ao_start del jugador. Cada clave pertenece a ese jugador:

La llamada devuelve sincrónicamente un inventario restaurado. Repetirla con el mismo jugador y la misma clave durante ao_start devuelve el mismo inventario sin restablecer su contenido ni su capacidad. Las llamadas fuera del ao_start ao_start de ese jugador fallan incluso si el inventario ya existe; guarda el inventario devuelto en un campo para usarlo más adelante. Las claves solo pueden contener letras, números, guiones bajos o guiones y no pueden estar vacías. Mantén la clave estable entre versiones del juego.

Los inventarios con nombre se guardan automáticamente de forma independiente de la opción de guardado automático del inventario predeterminado. El motor los guarda y los destruye cuando el jugador se va; no añadas una llamada correspondiente a destroy_inventory . Quitar un registro de tu juego no borra sus datos guardados. Usa con el inventario devuelto las APIs existentes de movimiento de objetos y de dibujo de inventario.

El inventario predeterminado conserva su $AO.inventory clave de guardado, formato codificado y ruta de obtención existentes. Los inventarios con nombre usan entradas de guardado separadas $AO.inventory_<key> . Ambos pasan por la ruta de inicio del jugador existente; no hace falta migración del inventario predeterminado.

Para un inventario guardado, la capacidad es la mayor entre la capacidad inicial solicitada y la capacidad guardada. Usa Items.set_capacity para cambios posteriores. Registra las definiciones de objeto antes de que se unan jugadores.

Después de modificar directamente los campos @ao_serialize de un objeto, llama a Items.mark_item_dirty(item) para guardar el inventario que lo contiene. Las operaciones normales de inventario ya marcan los cambios como pendientes de guardar. La red CSL replica los campos automáticamente.

Referencia de la API de inventario

Inicio rápido (registrar + dar un objeto)

Registra las definiciones de objeto una vez en ao_before_scene_load, luego crea instancias y muévelas al inventario de un jugador.

Cada Item_Instance campo personalizado que deba sobrevivir al guardado y la restauración del inventario necesita campos @ao_serialize@ao_serialize. Un campo sin él vuelve a su valor predeterminado normal después de la restauración. En clases personalizadas anidadas, anota tanto el campo contenedor como cada campo anidado que deba persistir.

Persiste una selección como un arma equipada usando Save.save_item_reference(player, key, item) y Save.get_item_reference(player, key). El objeto puede pertenecer al default_inventory inventario con guardado automático del jugador o a cualquier inventario de jugador con nombre. Las referencias sobreviven al reordenamiento de espacios dentro de ese inventario y al volver a conectarse. Quitar, soltar, destruir o transferir un objeto a cualquier otro inventario invalida sus referencias anteriores, incluso para el mismo jugador o aunque el objeto luego regrese. Una pila consumida por una fusión también invalida sus referencias. Crea los inventarios con nombre antes de resolver selecciones guardadas. El inventario sigue siendo la autoridad para la propiedad y los campos del objeto, así que no copies esos valores a Save.

item.entry_id_in_inventory expone el número de entrada del inventario actual para diagnóstico. Es positivo mientras el objeto está poseído, permanece sin cambios cuando se reordenan los espacios, cambia en las transferencias y se vuelve 0 cuando se separa. Las referencias guardadas incluyen la clave del inventario junto con este número. Usa Save.save_item_reference en lugar de persistir el número directamente.

Mostrar la barra rápida

Para mostrar en pantalla la interfaz estándar de la barra rápida del inventario, llama a Items.draw_hotbar dentro del método ao_late_update de tu Player. Sin ello, el sistema de inventario funciona internamente, ¡pero el jugador no lo verá!

Items.draw_hotbar gestiona por ti toda la interfaz de la barra rápida + el alternador de mochila. Devuelve un Draw_Hotbar_Result con los campos selected_item, selected_item_index, inventory_open y dropped_item .

Comprobar si un jugador ya tiene un objeto

Un patrón común es dar un objeto solo si el jugador no tiene ya uno:

Usa el ID registrado de la definición:

También puedes comprobar cuánto espacio queda para un tipo específico de objeto antes de crearlo:

Inventarios personalizados

Puedes crear inventarios que no estén vinculados a un jugador, para cosas como:

  • Cofres / contenedores de almacenamiento

  • Equipos de peces/mobs

Para acceder a los objetos:

slots() visita cada espacio en orden. item es null para un espacio vacío, y la segunda variable opcional del bucle es el índice real del espacio. Usa get_item(index) cuando necesites acceso aleatorio a un espacio.

Movimientos atómicos de objetos

Usa una transacción cuando varios movimientos de objetos deban tener todos éxito o todos fallar:

Cada instancia de objeto puede aparecer solo una vez en la transacción. Llama siempre primero a can_move_all_items ; move_all_items lanza una aserción si la transacción completa ya no cabe. Un movimiento puede fusionar una pila y destruir la instancia movida, así que no sigas usando referencias al objeto después de la transacción.

Objetos soltados

Si quieres que los jugadores suelten objetos en el mundo (y que otros jugadores los recojan), usa el sistema de objetos soltados:

Generar un objeto soltado

Animación de soltar + ajuste a la navmesh

Gestionar arrastrar y soltar desde la interfaz de la barra rápida

Si usas Items.draw_hotbar, los jugadores pueden arrastrar un objeto fuera de la interfaz para soltarlo. Dropped_Item.handle_dropped_item lo elimina del inventario y genera una entidad de objeto soltado.

Los objetos soltados desaparecen automáticamente con el tiempo (con una barra de advertencia). Mantener pulsado el botón de interactuar sobre un objeto reinicia su temporizador de desaparición.

Puedes hacer que un objeto soltado sea exclusivo (solo visible/recogible por un jugador) usando dropped.set_exclusive(player).

Última actualización