Create: Computing AgesDoc Brass
Bibliothèques

peripheral

Trouver et piloter les blocs autour de l'ordinateur et sur son câble de données.

Tous les ordinateurs

Un périphérique est un bloc avec lequel l'ordinateur peut parler : un coffre, une machine de Create, un Feu tricolore, un moniteur, un capteur de Create Aeronautics. La bibliothèque peripheral trouve ces blocs et donne au programme un objet qui porte les fonctions propres au bloc, ses méthodes : coffre.count(), feu.set("green"), controleur.set_speed(64). Tous les ordinateurs l'ont.

Brass
local coffre = peripheral.wrap("left")
print(coffre.count("minecraft:iron_ingot") .. " lingots de fer")

Les blocs contre l'ordinateur portent le nom de la face qu'ils touchent : "front", "back", "left", "right", "top" et "bottom", comme pour rs (gauche et droite vues face à l'écran). Le bloc qui entraîne l'ordinateur compte aussi : l'arbre de l'arrière (du dessous pour un Microcontrôleur) est un périphérique kinetic.

Les blocs du Câble de données. À partir du Mini-ordinateur, chaque bloc qui touche le réseau de Câble de données de l'ordinateur est aussi un périphérique, nommé type@x,y,z : son type et ses coordonnées, telles que F3 les affiche, comme inventory@120,64,-35. Le nom ne change pas tant que le bloc reste là.

  • Les simples arbres, engrenages et boîtes de vitesses le long d'un câble ne sont pas des périphériques du réseau : un câble peut longer une transmission. Contre l'ordinateur lui-même, ils le sont.
  • Les autres ordinateurs du câble ne sont pas des périphériques : les ordinateurs se parlent avec net.
  • Un côté de câble coupé à la clé ne laisse rien passer.
  • Un réseau compte au plus 2048 câbles, et seulement dans les chunks chargés. Un nouveau câble est vu tout de suite, un bloc posé contre un câble en moins d'une seconde.
  • Le Calculateur à tubes et l'Ordinateur à transistors n'ont pas de port réseau : ils n'atteignent que leurs six faces.

Les types. Ce qu'un bloc sait faire, c'est son type. Les méthodes de chaque type sont sur sa page :

typeblocspage
traffic_lightFeu tricoloreFeu tricolore
inductive_loopBoucle de détectionBoucle de détection
monitorMoniteur cathodique, Moniteur LCDMoniteurs
radio_modem, wifi_routerModem radio, Routeur Wi-FiModem radio et Routeur Wi-Fi
redstone_linkla Liaison de redstone de CreateLiaison de redstone
kinetictout bloc de Create qui tourne : meule, presse mécanique, contrôleur de vitesse de rotation...Blocs cinétiques de Create
inventorytout bloc qui contient des objets : coffre, tonneau, coffre à objet renforcé, dépôt, bassin...Inventaires
tanktout bloc qui contient des fluides : réservoir à fluide, bassin...Réservoirs
altitude_sensor, gimbal_sensor, velocity_sensor, optical_sensor, navigation_table, swivel_bearing, torsion_springles capteurs de Create AeronauticsCapteurs de Create Aeronautics
hot_air_burnerle brûleur à air chaud (Hot Air Burner) de Create AeronauticsBrûleur à air chaud

Les deux dernières lignes n'existent que si Create Aeronautics est installé. Ce que tous les objets ont en commun est sur Tous les périphériques.

Plusieurs types. Un bloc peut être plusieurs choses à la fois : une meule de Create tourne (kinetic) et contient des objets (inventory), un bassin contient des objets et des fluides. Son objet a alors les méthodes de tous ses types réunies : meule.speed() et meule.count(). peripheral.type, la méthode type() et le nom réseau donnent le premier type, dans l'ordre du tableau ci-dessus (les types d'Aeronautics d'abord) ; peripheral.list(type) et peripheral.find(type) regardent tous les types : peripheral.find("inventory") trouve donc la meule, nommée kinetic@x,y,z sur le câble.

Vu d'un côté. Un inventaire ou un réservoir est vu depuis sa face qui touche l'ordinateur (ou le câble), comme le verrait un entonnoir de ce côté : un fourneau montre son emplacement d'entrée par le dessus, celui du combustible par le côté, et son résultat par le dessous.

Les coûts. La plupart des appels coûtent une instruction, mais parcourir un réseau câblé coûte davantage, car chaque bloc autour est interrogé :

appelinstructions
peripheral.list, peripheral.find16, plus 4 par bloc voisin du réseau câblé (l'air compris), s'il y en a un
peripheral.wrap8
un nom réseau (type@x,y,z) donné à wrap, type ou call1 de plus par tranche de 4 blocs voisins du réseau câblé

Un câble droit de 20 blocs a environ 80 blocs autour de lui : peripheral.list() prend alors environ 340 instructions, plus qu'un tick entier d'un Mini-ordinateur. Cherchez vos périphériques une fois au début du programme, gardez les objets, et ne relancez la recherche que si l'installation change. Les méthodes ont leurs propres coûts, donnés sur la page de chaque type. Voir aussi Vitesse, mémoire et limites.

Fonctions
peripheral.list([type])Les noms des périphériques que l'ordinateur peut joindre, en liste. Sans type, tous les périphériques ; avec un type, seulement les blocs qui l'ont (parmi tous leurs types). Une liste vide s'il n'y en a aucun.
peripheral.find(type)Le premier périphérique d'un type, déjà prêt : le plus court chemin vers un bloc quand il est le seul de son genre. Elle regarde les faces d'abord, puis le câble. Elle coûte autant que peripheral.list, plus la recherche du nom réseau quand le bloc trouvé est sur le câble.
peripheral.type(name)Le type du bloc derrière un nom : "inventory", "kinetic", "traffic_light"... nil quand la face est vide (ou porte un bloc qui n'est pas un périphérique, comme de la pierre), et pour un nom qui ne correspond à rien.
peripheral.wrap(name)L'objet qui pilote le bloc derrière un nom. C'est une table de fonctions : appelez-les avec un point, coffre.count(), jamais avec deux-points. Tous les périphériques explique ce que tous les objets ont en commun.
peripheral.call(name, method, ...)Appelle une méthode d'un périphérique sans garder d'objet : peripheral.call("left", "set", "red") fait la même chose que peripheral.wrap("left").set("red").

Trouver des périphériques

#

peripheral.list([type])

→ table⚙ coût 16

Les noms des périphériques que l'ordinateur peut joindre, en liste. Sans type, tous les périphériques ; avec un type, seulement les blocs qui l'ont (parmi tous leurs types). Une liste vide s'il n'y en a aucun.

Paramètres
type string facultatif
seulement les périphériques de ce type, comme "inventory"
Renvoie
table
leurs noms : les faces d'abord (dans l'ordre de rs.sides), puis les blocs du câble de données
Brass
for _, nom in ipairs(peripheral.list()) do
  print(nom, peripheral.type(nom))
end

Sur un Mini-ordinateur entraîné par un arbre à l'arrière, avec une meule à sa gauche et deux coffres sur son câble, elle affiche :

Écran
back    kinetic
left    kinetic
inventory@120,64,-35    inventory
inventory@121,64,-35    inventory

Additionner une ressource sur tout le stockage. Chaque inventaire du câble, repéré une fois, puis compté toutes les 10 secondes sur une Liaison d'affichage :

Brass
local coffres = {}
for _, nom in ipairs(peripheral.list("inventory")) do
  if string.find(nom, "@") then  -- seulement les noms du câble : voir plus bas
    table.insert(coffres, peripheral.wrap(nom))
  end
end
print(#coffres .. " inventaires sur le câble")

while true do
  local fer = 0
  for _, coffre in ipairs(coffres) do
    fer = fer + coffre.count("minecraft:iron_ingot")
  end
  display.set({"Fer en stock", tostring(fer)})
  sleep(10)
end
Attention

Un bloc qui touche à la fois l'ordinateur et son câble apparaît deux fois : une fois sous le nom de sa face, une fois sous son nom réseau. Ne garder que les noms qui contiennent @ compte chaque coffre une seule fois, tant que les coffres sont sur le câble et pas contre l'ordinateur.

Si un coffre est cassé pendant que le programme tourne, son objet échoue avec not an inventory anymore et arrête le programme : relancez la recherche, ou protégez le compte avec pcall (voir Tous les périphériques).

Voir aussi peripheral.find() peripheral.type() rs.sides()

#

peripheral.find(type)

→ table⚙ coût 16

Le premier périphérique d'un type, déjà prêt : le plus court chemin vers un bloc quand il est le seul de son genre. Elle regarde les faces d'abord, puis le câble. Elle coûte autant que peripheral.list, plus la recherche du nom réseau quand le bloc trouvé est sur le câble.

Paramètres
type string
un type, comme "traffic_light"
Renvoie
table
le premier périphérique de ce type, prêt à servir, ou nil s'il n'y en a pas
Brass
local feu = peripheral.find("traffic_light")
if feu == nil then
  error("aucun feu tricolore trouvé")
end
feu.set("green")

Un type qui n'existe pas n'est pas une erreur : peripheral.find("chest") renvoie simplement nil (les coffres sont des "inventory").

Note

Comme les faces passent d'abord, peripheral.find("kinetic") renvoie le plus souvent l'arbre qui entraîne l'ordinateur, à l'arrière. Pour une machine de Create, prenez-la par sa face ou son nom réseau, ou cherchez son autre type (peripheral.find("inventory") pour une meule).

Un programme qui s'adapte à ce qu'il trouve. Un petit tableau de bord qui marche où qu'on le pose : il cherche chaque sorte de bloc qu'il connaît et n'affiche que ce qui est là.

Brass
local stock = peripheral.find("inventory")
local cuve = peripheral.find("tank")
local feu = peripheral.find("traffic_light")

while true do
  term.clear()
  term.set_cursor(1, 1)
  if stock then
    print("objets : " .. stock.count() .. " dans " .. stock.size() .. " emplacements")
  end
  if cuve then
    for _, t in ipairs(cuve.tanks()) do
      print((t.fluid or "vide") .. " : " .. t.amount .. "/" .. t.capacity .. " mB")
    end
  end
  if feu then
    print("feu : " .. feu.get())
  end
  if not (stock or cuve or feu) then
    print("rien à surveiller ici")
  end
  sleep(1)
end

Voir aussi peripheral.list() peripheral.wrap()

#

peripheral.type(name)

→ string

Le type du bloc derrière un nom : "inventory", "kinetic", "traffic_light"... nil quand la face est vide (ou porte un bloc qui n'est pas un périphérique, comme de la pierre), et pour un nom qui ne correspond à rien.

Paramètres
name string
une face ("left") ou un nom réseau ("inventory@120,64,-35")
Renvoie
string
le premier type du bloc, ou nil s'il n'y a rien à qui parler

Un moyen peu coûteux de vérifier une installation avant de s'en servir :

Brass
while peripheral.type("left") ~= "inventory" do
  print("posez un coffre à gauche")
  sleep(2)
end
print("coffre trouvé")

Voir aussi peripheral.wrap() peripheral.list()

Piloter un périphérique

#

peripheral.wrap(name)

→ table⚙ coût 8

L'objet qui pilote le bloc derrière un nom. C'est une table de fonctions : appelez-les avec un point, coffre.count(), jamais avec deux-points. Tous les périphériques explique ce que tous les objets ont en commun.

Paramètres
name string
une face ("left") ou un nom réseau ("inventory@120,64,-35")
Renvoie
table
un objet avec les méthodes du bloc, ou nil s'il n'y a rien à qui parler
Brass
local coffre = peripheral.wrap("left")
if coffre == nil then
  error("posez le coffre renforcé à gauche")
end
print(coffre.type())   -- inventory
print(coffre.count())

Jamais périmé. Chaque méthode retrouve le bloc au moment de l'appel. Cassez le coffre de gauche et posez-en un autre : le même objet lit le nouveau coffre. Si le bloc a disparu, ou n'est plus de ce genre, ses méthodes échouent avec une erreur comme not an inventory anymore ou traffic light removed, et avec peripheral is not loaded quand son chunk n'est pas chargé. Les méthodes d'un objet sont choisies au moment de wrap : si un bloc d'une autre sorte prend la place, refaites wrap.

Gardez l'objet. Faites wrap une fois, puis appelez les méthodes autant qu'il faut : chaque appel de méthode ne coûte que la méthode. Refaire wrap à chaque tour de boucle coûte 8 instructions à chaque fois, et plus pour un nom réseau.

Brass
local controleur = peripheral.wrap("right")   -- un Contrôleur de vitesse de rotation
local stock = peripheral.wrap("left")         -- le coffre renforcé de fer brut
while true do
  if stock.count("minecraft:raw_iron") > 1000 then
    controleur.set_speed(32)
  else
    controleur.set_speed(128)
  end
  sleep(5)
end

Voir aussi peripheral.find() peripheral.call()

#

peripheral.call(name, method, ...)

→ any

Appelle une méthode d'un périphérique sans garder d'objet : peripheral.call("left", "set", "red") fait la même chose que peripheral.wrap("left").set("red").

Paramètres
name string
une face ou un nom réseau
method string
le nom de la méthode, comme "count"
... any facultatif
les arguments de la méthode
Renvoie
any
ce que la méthode renvoie
Brass
peripheral.call("left", "set", "red")
local charbon = peripheral.call("inventory@120,64,-35", "count", "minecraft:coal")
print(charbon .. " charbon")

Elle retrouve le bloc à chaque appel : elle convient à une action ponctuelle. Pour des appels répétés, un peripheral.wrap unique est plus clair.

Elle arrête le programme avec no peripheral 'chest' quand le nom n'est ni une face ni un nom réseau connu, et avec peripheral 'left' has no method 'set' quand le bloc à cet endroit n'a pas cette méthode. Une face vide n'a que la méthode type, qui répond "none".

Voir aussi peripheral.wrap()