
peripheral
Trouver et piloter les blocs autour de l'ordinateur et sur son câble de données.
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.
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 :
| type | blocs | page |
|---|---|---|
traffic_light | Feu tricolore | Feu tricolore |
inductive_loop | Boucle de détection | Boucle de détection |
monitor | Moniteur cathodique, Moniteur LCD | Moniteurs |
radio_modem, wifi_router | Modem radio, Routeur Wi-Fi | Modem radio et Routeur Wi-Fi |
redstone_link | la Liaison de redstone de Create | Liaison de redstone |
kinetic | tout bloc de Create qui tourne : meule, presse mécanique, contrôleur de vitesse de rotation... | Blocs cinétiques de Create |
inventory | tout bloc qui contient des objets : coffre, tonneau, coffre à objet renforcé, dépôt, bassin... | Inventaires |
tank | tout bloc qui contient des fluides : réservoir à fluide, bassin... | Réservoirs |
altitude_sensor, gimbal_sensor, velocity_sensor, optical_sensor, navigation_table, swivel_bearing, torsion_spring | les capteurs de Create Aeronautics | Capteurs de Create Aeronautics |
hot_air_burner | le brûleur à air chaud (Hot Air Burner) de Create Aeronautics | Brû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é :
| appel | instructions |
|---|---|
peripheral.list, peripheral.find | 16, plus 4 par bloc voisin du réseau câblé (l'air compris), s'il y en a un |
peripheral.wrap | 8 |
un nom réseau (type@x,y,z) donné à wrap, type ou call | 1 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.
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
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.
typestring facultatif- seulement les périphériques de ce type, comme
"inventory"
- table
- leurs noms : les faces d'abord (dans l'ordre de
rs.sides), puis les blocs du câble de données
for _, nom in ipairs(peripheral.list()) do
print(nom, peripheral.type(nom))
endSur 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 :
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 :
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)
endUn 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()
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.
typestring- un type, comme
"traffic_light"
- table
- le premier périphérique de ce type, prêt à servir, ou nil s'il n'y en a pas
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").
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à.
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)
endVoir aussi peripheral.list() peripheral.wrap()
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.
namestring- une face (
"left") ou un nom réseau ("inventory@120,64,-35")
- 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 :
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
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.
namestring- une face (
"left") ou un nom réseau ("inventory@120,64,-35")
- table
- un objet avec les méthodes du bloc, ou nil s'il n'y a rien à qui parler
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.
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)
endVoir aussi peripheral.find() peripheral.call()
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").
namestring- une face ou un nom réseau
methodstring- le nom de la méthode, comme
"count" ...any facultatif- les arguments de la méthode
- any
- ce que la méthode renvoie
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()