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.
local coffre = peripheral.wrap("left")
print(coffre.count("minecraft:iron_ingot") .. " lingots de fer")
coffre.push("right") -- jusqu'à 64 objets dans le coffre de droitechest.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 :
| champ | contenu |
|---|---|
name | l'identifiant de l'objet, avec son espace de noms : "minecraft:iron_ingot", "create:andesite_alloy" |
count | combien d'objets il y a dans l'emplacement |
display | le 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
Combien d'emplacements a l'inventaire : 27 pour un coffre, 54 pour un grand coffre, 5 pour un entonnoir.
- number
- le nombre d'emplacements, vus par cette face
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.
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.
- 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) :
local coffre = peripheral.wrap("left")
for emplacement, pile in pairs(coffre.list()) do
print(emplacement, pile.count, pile.display)
endPour parcourir les emplacements dans l'ordre, comptez de 1 à size() et cherchez chacun :
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
endL'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()
La pile d'un seul emplacement.
slotnumber- un numéro d'emplacement, de 1 à
size()
- table|nil
- la pile de cet emplacement,
{name =, count =, display =}, ounilquand 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 :
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")
endUn 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()
Compte les objets : tous, ou seulement ceux d'un identifiant.
idstring facultatif- un identifiant d'objet, comme
"minecraft:coal"; tous les objets s'il est omis
- number
- combien d'objets contient l'inventaire, de cet identifiant ou en tout
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
Déplace des objets de cet inventaire vers un autre du même ordinateur.
targetstring- le nom de périphérique de l'inventaire à remplir : une face (
"right") ou un nom de câble ("inventory@120,64,-35") slotnumber facultatif- ne prendre que dans cet emplacement ; tous les emplacements, dans l'ordre, s'il est omis ou
nil countnumber facultatif- le nombre maximal d'objets à déplacer, 64 s'il est omis
- number
- combien d'objets ont vraiment bougé
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 avecperipheral.list("inventory"). countlimite 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
targetne désigne aucun inventaire, le programme s'arrête avecno inventory 'right'. Unslotau-delà desize()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é.
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)
endUn é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().
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))
end104 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").
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)
endLa recette Tri automatique des objets construit un trieur complet, et Alarme de stock et panneau d'affichage surveille un niveau de stock.