Create: Computing AgesDoc Brass
Périphériques

Inventaires

Coffres, tonneaux, coffres renforcés et dépôts de Create, et tout bloc qui contient des objets : lire ce qu'il y a dedans et le déplacer.

Tout bloc qui contient des objets est un périphérique de type inventory : coffres, tonneaux, boîtes de Shulker, entonnoirs, fourneaux, Coffres à objet renforcés, dépôts, bassins et meules de Create, et les blocs de stockage des autres mods. Un programme compte ce qu'il y a dedans, regarde chaque emplacement, et déplace des piles d'un inventaire à l'autre : la base de toute alarme de stock, de tout trieur et de tout tableau de bord d'usine.

Brass
local coffre = peripheral.wrap("left")
print(coffre.count("minecraft:iron_ingot") .. " lingots de fer")
coffre.push("right")  -- jusqu'à 64 objets dans le coffre de droite
Méthodes
chest.size()Combien d'emplacements a l'inventaire : 27 pour un coffre, 54 pour un grand coffre, 5 pour un entonnoir.
chest.list()Toutes les piles de l'inventaire, dans une seule table : list()[3] est la pile de l'emplacement 3, ou nil quand cet emplacement est vide.
chest.get(slot)La pile d'un seul emplacement.
chest.count([id])Compte les objets : tous, ou seulement ceux d'un identifiant.
chest.push(target [, slot [, count]])Déplace des objets de cet inventaire vers un autre du même ordinateur.

Installation

Le joindre. Posez l'inventaire contre une face de l'ordinateur (peripheral.wrap("left")), ou contre un Câble de données du réseau de l'ordinateur, à partir du Mini-ordinateur : il prend alors le nom de ses coordonnées, comme inventory@120,64,-35. peripheral.find("inventory") prend le premier, et peripheral.list("inventory") donne les noms de tous. Voir Périphériques.

La face compte. L'ordinateur voit l'inventaire par la face qui le touche (ou qui touche le câble), et certains blocs montrent des emplacements différents selon la face. Un fourneau sous l'ordinateur montre sa face du dessus : un seul emplacement, celui de ce qui cuit. À côté de l'ordinateur, il montre un côté : l'emplacement du combustible. Les coffres, les tonneaux et les coffres renforcés de Create montrent tout, sur toutes leurs faces.

Les blocs à plusieurs métiers. Une meule est aussi un bloc cinétique et un bassin aussi un réservoir : la table obtenue a les méthodes de chacun. Leur nom sur un câble prend leur premier type (kinetic@... pour la meule, inventory@... pour le bassin), mais peripheral.find("inventory") les trouve tous.

Les coffres renforcés sur un câble. Un coffre renforcé de Create qui touche le câble par plusieurs de ses blocs apparaît sous plusieurs noms, un par bloc : tous mènent au même coffre renforcé.

À quoi ressemblent les emplacements. Les emplacements sont numérotés à partir de 1, dans l'ordre propre au bloc. Une pile est décrite par une table :

champcontenu
namel'identifiant de l'objet, avec son espace de noms : "minecraft:iron_ingot", "create:andesite_alloy"
countcombien d'objets il y a dans l'emplacement
displayle nom qu'un joueur voit sur l'objet, nom donné à l'enclume compris

Un coffre renforcé de Create a 20 emplacements par bloc (sauf si le serveur l'a changé). Un dépôt en a 9 : l'emplacement 1 est l'objet posé dessus, les emplacements 2 à 9 gardent ce qu'une machine en a fait.

Lecture

#

chest.size()

→ number

Combien d'emplacements a l'inventaire : 27 pour un coffre, 54 pour un grand coffre, 5 pour un entonnoir.

Renvoie
number
le nombre d'emplacements, vus par cette face
Brass
local coffre = peripheral.wrap("left")
print(coffre.size(), "emplacements")

Quand le bloc n'est plus un inventaire (cassé, remplacé), toutes les méthodes de cette page arrêtent le programme avec not an inventory anymore.

#

chest.list()

→ table⚙ coût 1 par emplacement

Toutes les piles de l'inventaire, dans une seule table : list()[3] est la pile de l'emplacement 3, ou nil quand cet emplacement est vide.

Renvoie
table
les piles, indexées par numéro d'emplacement ; les emplacements vides manquent

Comme les emplacements vides laissent des trous, parcourez la table avec pairs, pas avec ipairs (qui s'arrête au premier trou) ni avec # (qui ne veut rien dire pour une table à trous) :

Brass
local coffre = peripheral.wrap("left")
for emplacement, pile in pairs(coffre.list()) do
  print(emplacement, pile.count, pile.display)
end

Pour parcourir les emplacements dans l'ordre, comptez de 1 à size() et cherchez chacun :

Brass
local coffre = peripheral.wrap("left")
local objets = coffre.list()
for emplacement = 1, coffre.size() do
  if objets[emplacement] then
    print(emplacement .. " : " .. objets[emplacement].name)
  end
end

L'appel coûte une instruction par emplacement, et la table prend de la mémoire pour chaque pile : sur un grand coffre renforcé, lisez-la une fois et gardez la table plutôt que d'appeler list() dans une boucle.

Voir aussi inventory.get() inventory.count()

#

chest.get(slot)

→ table|nil

La pile d'un seul emplacement.

Paramètres
slot number
un numéro d'emplacement, de 1 à size()
Renvoie
table|nil
la pile de cet emplacement, {name =, count =, display =}, ou nil quand il est vide

Moins coûteux que list() quand un seul emplacement vous intéresse, par exemple l'objet posé sur un dépôt :

Brass
local depot = peripheral.wrap("top")
local pile = depot.get(1)
if pile then
  print("sur le dépôt : " .. pile.count .. " " .. pile.display)
else
  print("le dépôt est vide")
end

Un numéro en dehors de l'inventaire renvoie aussi nil. Un nombre à virgule arrête le programme avec bad argument #1 to 'get' (number has no integer representation).

Voir aussi inventory.list()

#

chest.count([id])

→ number⚙ coût 1 par emplacement

Compte les objets : tous, ou seulement ceux d'un identifiant.

Paramètres
id string facultatif
un identifiant d'objet, comme "minecraft:coal" ; tous les objets s'il est omis
Renvoie
number
combien d'objets contient l'inventaire, de cet identifiant ou en tout
Brass
local coffre = peripheral.wrap("left")
print(coffre.count())                         -- tout
print(coffre.count("minecraft:coal"))         -- seulement le charbon
print(coffre.count("create:andesite_alloy"))

L'identifiant doit être complet, avec son espace de noms : count("coal") ne compte rien et renvoie 0. Pour trouver l'identifiant exact d'un objet, regardez list(), ou appuyez sur F3 + H en jeu pour afficher les identifiants dans les infobulles.

Voir aussi inventory.list()

Déplacer des objets

#

chest.push(target [, slot [, count]])

→ number⚙ coût 1 par emplacement

Déplace des objets de cet inventaire vers un autre du même ordinateur.

Paramètres
target string
le nom de périphérique de l'inventaire à remplir : une face ("right") ou un nom de câble ("inventory@120,64,-35")
slot number facultatif
ne prendre que dans cet emplacement ; tous les emplacements, dans l'ordre, s'il est omis ou nil
count number facultatif
le nombre maximal d'objets à déplacer, 64 s'il est omis
Renvoie
number
combien d'objets ont vraiment bougé
Brass
local coffre = peripheral.wrap("left")
coffre.push("right")            -- jusqu'à 64 objets, des premiers emplacements qui en ont
coffre.push("right", 1, 16)     -- 16 objets de l'emplacement 1
coffre.push("right", nil, 640)  -- jusqu'à 640 objets, de n'importe quel emplacement
  • La cible est un nom, celui que vous donneriez à peripheral.wrap, pas une table obtenue. Les noms se trouvent avec peripheral.list("inventory").
  • count limite le total déplacé par cet appel, sur tous les emplacements visités ; il ne se limite pas à une pile.
  • Elle renvoie le nombre d'objets déplacés : 0 quand la source est vide, la cible pleine, ou que la cible refuse cet objet (l'emplacement du combustible d'un fourneau refuse le fer).
  • Les objets ne sont jamais détruits. Dans le cas rare où la cible prend moins que promis et que la source refuse de reprendre le reste, ce reste tombe par terre au-dessus de la source.
  • Les deux inventaires sont joints par la face qui touche l'ordinateur ou le câble : la face de la cible décide donc des emplacements qu'elle remplit (l'entrée d'un fourneau par le dessus, son combustible par le côté).
  • Quand target ne désigne aucun inventaire, le programme s'arrête avec no inventory 'right'. Un slot au-delà de size() peut l'arrêter avec une erreur interne : vérifiez-le avant.

Il n'y a pas de pull : pour déplacer des objets dans l'autre sens, prenez l'autre inventaire et poussez depuis lui.

Voir aussi inventory.list()

Exemples

Vider un coffre dans un coffre renforcé

Les mineurs déposent leur butin dans un coffre à gauche de l'ordinateur ; un Coffre à objet renforcé se trouve à droite. Toutes les dix secondes, tout part dans le coffre renforcé.

Brass
local coffre = peripheral.wrap("left")
while true do
  local deplaces = coffre.push("right", nil, 64 * coffre.size())
  if deplaces > 0 then
    print(deplaces .. " objets rangés")
  end
  sleep(10)
end

Un état des stocks, du plus gros au plus petit

Additionne les piles par objet et affiche les dix plus gros totaux. Ici, le contenu d'un petit coffre est écrit en toutes lettres, pour que vous voyiez la forme de ce que renvoie list(), trous compris ; dans le monde, la première ligne serait local objets = coffre.list().

Brass
local objets = {
  [1] = {name = "minecraft:iron_ingot", count = 64, display = "Lingot de fer"},
  [2] = {name = "minecraft:coal", count = 40, display = "Charbon"},
  [4] = {name = "minecraft:iron_ingot", count = 23, display = "Lingot de fer"},
  [7] = {name = "create:andesite_alloy", count = 64, display = "Alliage d'andésite"},
  [9] = {name = "minecraft:coal", count = 64, display = "Charbon"},
}
local totaux = {}
for _, pile in pairs(objets) do
  totaux[pile.display] = (totaux[pile.display] or 0) + pile.count
end
local lignes = {}
for nom, total in pairs(totaux) do
  table.insert(lignes, {nom = nom, total = total})
end
table.sort(lignes, function(a, b) return a.total > b.total end)
for i = 1, math.min(10, #lignes) do
  print(string.format("%5d  %s", lignes[i].total, lignes[i].nom))
end
Écran
  104  Charbon
   87  Lingot de fer
   64  Alliage d'andésite

Un trieur automatique

Tout arrive dans un coffre posé sur l'ordinateur (par un entonnoir, un entonnoir de Create ou un tapis roulant). Le fer, l'or et le charbon vont dans leurs propres coffres sur le câble ; tout le reste part dans le coffre de trop-plein à gauche. Les noms viennent de peripheral.list("inventory").

Brass
local arrivee = peripheral.wrap("top")
local ROUTES = {
  ["minecraft:iron_ingot"] = "inventory@120,64,-35",
  ["minecraft:gold_ingot"] = "inventory@121,64,-35",
  ["minecraft:coal"] = "inventory@122,64,-35",
}
local TROP_PLEIN = "left"
while true do
  for emplacement, pile in pairs(arrivee.list()) do
    local cible = ROUTES[pile.name] or TROP_PLEIN
    arrivee.push(cible, emplacement, pile.count)
  end
  sleep(2)
end

La recette Tri automatique des objets construit un trieur complet, et Alarme de stock et panneau d'affichage surveille un niveau de stock.