All Out proporciona una API de inventario de jugador que te permite crear objetos, dárselos a los jugadores y permitir que los jugadores organicen, usen y suelten objetos en tu juego.
Hay tres conceptos principales:
Definiciones de objetos (Item_Definition): qué es un objeto es (nombre/icono/apilamiento + tus propios campos)
Instancias de objetos (Item_Instance): una pila real en el mundo/en un inventario
Inventarios (Inventory): un contenedor de ranuras que almacena instancias de objetos
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, habilita la casilla "Auto Save Player Inventory" en la sección Edit -> Game Settings del editor
Referencia de la API de inventario
Inicio rápido (registrar + dar un objeto)
Registra las definiciones de objetos una sola vez en ao_before_scene_load, luego crea instancias y muévelas al inventario de un jugador.
Mostrando la barra rápida
Para mostrar en pantalla la interfaz estándar de barra rápida del inventario, llama a Items.draw_hotbar dentro del ao_late_update método de tu Player. ¡Sin esto, el sistema de inventario funciona en segundo plano pero el jugador no lo verá!
Items.draw_hotbar maneja por ti toda la UI de la barra rápida + el interruptor de mochila. Devuelve un Draw_Hotbar_Result con selected_item, selected_item_index, inventory_open, y dropped_item campos.
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:
También puedes comprobar cuánto espacio queda para un tipo de objeto específico antes de crearlo:
Inventarios personalizados
Puedes crear inventarios que no estén ligados a un jugador, para cosas como:
Cofres / contenedores de almacenamiento
Equipos de peces/mobs
Para acceder a los objetos:
Objetos sueltos
Si quieres que los jugadores suelten objetos en el mundo (y que otros jugadores puedan recogerlos), usa el sistema de objetos sueltos:
Generar un objeto suelto
Animación de soltar + ajuste a la navmesh
Gestionar arrastrar y soltar desde la UI de la barra rápida
Si usas Items.draw_hotbar, los jugadores pueden arrastrar un objeto fuera de la UI para soltarlo. Dropped_Item.handle_dropped_item lo elimina del inventario y genera una entidad de objeto suelto.
Los objetos sueltos 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 suelto sea exclusivo (solo visible/recogible por un jugador) usando dropped->set_exclusive(player).
// Opcional: tipos personalizados de objetos
Weapon_Definition :: class : Item_Definition {
damage: s64;
}
Weapon_Item :: class : Item_Instance {
durability: s64 @ao_serialize; // @ao_serialize hace que este campo se guarde automáticamente entre sesiones
}
sword_defn: Weapon_Definition;
ao_before_scene_load :: proc() {
sword_defn = Items.register_item_definition(
{id="sword", name="Espada de Hierro", icon=get_asset(Texture_Asset, "icons/sword.png"), stack_size=1, tier=.COMMON},
Weapon_Definition,
Weapon_Item
);
sword_defn.damage = 10;
}
give_sword :: proc(player: Player) {
item := Items.create_item_instance(sword_defn, Weapon_Item);
will_destroy: bool;
if Items.can_move_item_to_inventory(item, player.default_inventory, ref will_destroy) {
item.durability = 100;
Items.move_item_to_inventory(item, player.default_inventory);
}
else {
// Inventario lleno → destruye la instancia que creamos
Items.destroy_item_instance(item);
}
}
Player :: class : Player_Base {
ao_late_update :: method(dt: float) {
if this->is_local_or_server() {
draw_player_hotbar(this);
}
}
}
draw_player_hotbar :: proc(player: Player) {
options := Inventory_Draw_Options.default();
result := Items.draw_hotbar(player, player.default_inventory, options);
// result.selected_item es el objeto actualmente resaltado (o null)
// result.inventory_open te indica si la UI completa de la mochila está visible
}