Create: Computing AgesDoc Brass
Périphériques

Supports de canon

Les canons de Create Big Cannons pilotés par un ordinateur : les tourner vers un angle à la vitesse de leurs arbres, tirer, les assembler et les désassembler pour recharger.

Il faut Create Big Cannons

Le support de canon et le support de canon fixe sont des blocs de Create Big Cannons. Sans ce mod, ces blocs n'existent pas, et peripheral.find("cannon_mount") renvoie nil.

Un support de canon (Cannon Mount) porte un canon de Create Big Cannons : ses arbres le font tourner et le lèvent, un signal de redstone sur une face l'assemble, sur une autre le fait tirer. Un ordinateur relié au support fait tout cela depuis un programme : il tourne le canon vers les angles demandés, tire, démonte le canon pour le recharger et le remonte. De quoi faire une tourelle qui suit une cible, une batterie qui tire chacun son tour, ou une pièce d'artillerie qui se recharge seule.

Le support de canon a le type de périphérique cannon_mount. Le support de canon fixe (Fixed Cannon Mount, pas traduit en jeu), celui qui tient un canon sur une machine animée ou un navire, a le type fixed_cannon_mount et la plupart des mêmes méthodes (chaque méthode dit quels supports l'ont). Contre l'ordinateur, un support s'appelle par sa face ("front"...) ; sur un Câble de données (Mini-ordinateur et plus récents), il reçoit un nom comme cannon_mount@12,64,-30.

Brass
local canon = peripheral.find("cannon_mount")
if not canon.assembled() then
  canon.assemble()
end
canon.aim(270, 10) -- vers l'est, fût levé de 10 degrés
while not canon.on_target() do
  sleep(0.1)
end
canon.fire()

Chaque méthode relit le bloc quand on l'appelle. Quand le support a disparu, l'appel arrête le programme avec cannon mount removed ; quand son chunk n'est pas chargé, avec peripheral is not loaded. Une méthode qui a besoin d'un canon (aim, fire, set_fire_rate) l'arrête avec no cannon assembled on the cannon mount tant qu'il n'y en a pas.

Aussi un bloc cinétique. Le support de canon est une machine de Create : le support enveloppé a donc en plus les méthodes de Blocs cinétiques de Create ; mais ses deux arbres sont à l'intérieur, et speed() ne dit rien d'eux : lisez plutôt cannon_mount.shaft_speeds(). Tant qu'un autocanon y est assemblé, le support prend aussi des objets comme un inventaire (Inventaires) : les munitions qu'on y pousse (inventory.push()) vont dans la culasse.

Méthodes
canon.assembled()true tant que le support porte un canon assemblé, false quand le canon est en blocs (ou qu'il n'y en a pas). Les deux supports l'ont.
canon.cannon()Ce que porte le support : "big_cannon" (un gros canon, qui tire avec fire), "autocannon" (un autocanon, qui tire avec set_fire_rate), ou "other" pour un canon d'un addon de Big Cannons. nil tant qu'aucun canon n'est assemblé. Les deux supports l'ont.
canon.strength()La « Cannon Strength » des Lunettes d'ingénieur : la poudre que le canon supporte avant de risquer d'éclater, comptée comme Big Cannons la compte (une charge de poudre vaut 1). Elle dépend du matériau du fût et de la culasse. Les deux supports l'ont.
canon.fire_rate()La cadence de l'autocanon en ce moment, en coups par minute, comme la montrent les Lunettes d'ingénieur ; 0 tant qu'il ne tire pas. Les deux supports l'ont.
canon.yaw()Sur un support de canon, où pointe le canon autour de la verticale : 0 sud, 90 ouest, 180 nord, 270 est. Sans canon, la direction où regarde le support. Sur un support de canon fixe, le réglage de lacet de sa case, de -45 à 45 degrés, positif vers la droite du canon.
canon.pitch()Sur un support de canon, l'angle du fût au-dessus de l'horizontale, négatif en dessous ; 0 sans canon. Sur un support de canon fixe, le réglage de tangage de sa case, de -45 à 45 degrés, positif vers le haut.
canon.pitch_limits()Jusqu'où le canon peut pointer vers le bas et vers le haut sur ce support, en degrés : min est négatif (sous l'horizontale). Big Cannons les fixe selon le canon et le support. aim garde le tangage demandé entre les deux. Support de canon seulement.
canon.shaft_speeds()La vitesse de l'arbre qui fait tourner le support (yaw, dessous) et de celui qui le lève (pitch, sur ses côtés), en tr/min, 0 quand l'un est à l'arrêt ou que son réseau est en surcharge. Un ordinateur ne tourne le support qu'aussi vite que ces arbres : tr/min × 0.75 degrés par seconde. Support de canon seulement.
canon.aim(yaw, pitch)Sur un support de canon, prend la main sur le support et tourne le canon vers ces angles à la vitesse de ses arbres (voir plus haut), puis l'y tient. L'appel revient tout de suite : cannon_mount.on_target() dit quand le canon y est. Appeler aim de nouveau change la cible, même pendant que le support tourne. Il faut un canon assemblé.
canon.target()Les angles du dernier aim, le tangage tel que gardé dans les limites ; nil quand aucun ordinateur ne tient le support (jamais visé, rendu, ou canon désassemblé depuis). Support de canon seulement.
canon.on_target()true une fois que le canon a atteint les angles du dernier aim ; false pendant qu'il tourne, ou quand aucun ordinateur ne tient le support. Support de canon seulement.
canon.release()Rend le support à ses arbres : ils le tournent de nouveau comme avant, un inverseur de rotation séquencé aussi. Ne fait rien quand aucun ordinateur ne le tient. Support de canon seulement.
canon.fire()Tire une fois avec le gros canon, comme une impulsion de redstone sur la face de tir du support : Big Cannons allume les charges et envoie l'obus, à la fin du tick. Plusieurs appels dans le même tick donnent un seul coup ; un fût vide ne fait rien. Sur un autocanon, arrête le programme avec an autocannon fires at a rate: set_fire_rate(1..15). Les deux supports l'ont.
canon.set_fire_rate(rate)Donne à l'autocanon la puissance de signal de redstone rate sur sa face de tir : il tire sans arrêt, tant qu'il a des munitions, jusqu'à set_fire_rate(0). Un changement de redstone sur la face de tir remplace la cadence. Sur un gros canon, arrête le programme avec only an autocannon has a fire rate: fire() shoots a big cannon. Les deux supports l'ont.
canon.assemble()Assemble le canon posé sur le support, comme un signal de redstone qui arrive sur sa face d'assemblage. Ne fait rien quand il est déjà assemblé. Quand Big Cannons refuse, arrête le programme avec sa raison (cannot assemble the cannon: ...) ; sans rien à assembler, avec no cannon to assemble on the cannon mount. Un support s'assemble ou se désassemble une fois par tick : un second appel dans le même tick dit d'attendre (sleep(0)). Les deux supports l'ont.
canon.disassemble()Remet le canon en blocs, dans la direction où il a été assemblé, et met fin à la prise en main du support par l'ordinateur. C'est ainsi qu'on recharge un gros canon. Ne fait rien sans canon. Les deux supports l'ont.

Les angles

Les angles sont ceux de Big Cannons, ceux que les Lunettes d'ingénieur montrent sur le support :

  • le lacet (yaw), où pointe le canon autour de la verticale, de 0 à 360 degrés, comme l'écran F3 : 0 est le sud, 90 l'ouest, 180 le nord, 270 l'est ;
  • le tangage (pitch), de combien le fût est levé : positif au-dessus de l'horizontale, négatif en dessous. Jusqu'où il peut aller dépend du canon et du support : cannon_mount.pitch_limits().

Le lacet vers une cible se calcule avec la différence des coordonnées (cible moins canon) et math.atan2 :

Brass
local function lacet_vers(dx, dz)
  return math.floor(math.atan2(-dx, dz) * 180 / math.pi + 0.5) % 360
end

print(lacet_vers(0, -10)) -- nord
print(lacet_vers(10, 0))  -- est
print(lacet_vers(-5, 5))  -- sud-ouest
Écran
180
270
45

Le tangage qui atteint une distance dépend de l'obus, de la poudre et du fût : le plus simple est d'essayer quelques angles, de noter où tombent les obus, et de garder dans le programme une table des tangages par distance.

Comment un ordinateur tourne le support

Les arbres donnent la vitesse, l'ordinateur la direction. aim prend la main sur le support : ses arbres ne le tournent plus d'eux-mêmes, c'est l'ordinateur qui le tourne vers les angles demandés, par le plus court chemin, aussi vite que ses arbres l'auraient fait, quel que soit leur sens. Big Cannons tourne un support de tr/min × 0.75 degrés par seconde : 24 degrés par seconde avec des arbres à 32 tr/min, un demi-tour en moins d'une seconde à 256 tr/min. Sans rotation, ou avec un réseau en surcharge, le support ne bouge pas : cannon_mount.shaft_speeds() dit pourquoi.

Il tient jusqu'à ce qu'on le rende. Une fois en position, le support y reste, quoi que fassent ses arbres, même après la fin du programme : jusqu'à ce que cannon_mount.release() le rende à ses arbres, ou que le canon soit désassemblé. Après un redémarrage du serveur, un programme vise de nouveau : d'ici là, le support reste immobile, et retourne à ses arbres la prochaine fois que leur vitesse change.

Le support de canon fixe n'a pas d'arbres : ses deux cases de réglage tournent le canon jusqu'à 45 degrés de là où regarde le support. Sur lui, aim règle ces cases, comme un joueur, et le canon y est tout de suite.

Tirer et recharger

Un gros canon tire avec cannon_mount.fire(), comme une impulsion de redstone sur la face de tir du support : un coup de ce que contient le fût, au plus une fois par tick. Il se charge quand il est en blocs, pas quand il est assemblé : un programme de rechargement le désassemble (cannon_mount.disassemble()), laisse un chargeur de canon (Cannon Loader) pousser l'obus et ses charges, puis le réassemble.

Un autocanon tire sans arrêt tant que sa face de tir reçoit un signal de redstone, d'autant plus vite que le signal est fort : cannon_mount.set_fire_rate() lui donne cette puissance de signal, 0 pour arrêter.

La redstone marche toujours à côté de l'ordinateur : un changement de signal sur la face de tir du support règle la cadence de l'autocanon sur ce signal ; sur la face d'assemblage, un signal qui arrive assemble le canon et un signal qui s'en va le désassemble.

État

#

canon.assembled()

→ boolean

true tant que le support porte un canon assemblé, false quand le canon est en blocs (ou qu'il n'y en a pas). Les deux supports l'ont.

Renvoie
boolean
true tant qu'un canon est assemblé sur le support

Voir aussi cannon_mount.assemble() cannon_mount.cannon()

#

canon.cannon()

→ string

Ce que porte le support : "big_cannon" (un gros canon, qui tire avec fire), "autocannon" (un autocanon, qui tire avec set_fire_rate), ou "other" pour un canon d'un addon de Big Cannons. nil tant qu'aucun canon n'est assemblé. Les deux supports l'ont.

Renvoie
string
"big_cannon" ou "autocannon", nil quand aucun canon n'est assemblé
Brass
local sorte = canon.cannon()
if sorte == "autocannon" then
  canon.set_fire_rate(10)
elseif sorte == "big_cannon" then
  canon.fire()
end

Voir aussi cannon_mount.assembled()

#

canon.strength()

→ number

La « Cannon Strength » des Lunettes d'ingénieur : la poudre que le canon supporte avant de risquer d'éclater, comptée comme Big Cannons la compte (une charge de poudre vaut 1). Elle dépend du matériau du fût et de la culasse. Les deux supports l'ont.

Renvoie
number
la poudre que le gros canon supporte sans risque ; nil pour un autocanon ou sans canon

Voir aussi cannon_mount.fire()

#

canon.fire_rate()

→ number

La cadence de l'autocanon en ce moment, en coups par minute, comme la montrent les Lunettes d'ingénieur ; 0 tant qu'il ne tire pas. Les deux supports l'ont.

Renvoie
number
coups par minute de l'autocanon en ce moment ; nil pour un gros canon ou sans canon

Voir aussi cannon_mount.set_fire_rate()

Viser

#

canon.yaw()

→ number

Sur un support de canon, où pointe le canon autour de la verticale : 0 sud, 90 ouest, 180 nord, 270 est. Sans canon, la direction où regarde le support. Sur un support de canon fixe, le réglage de lacet de sa case, de -45 à 45 degrés, positif vers la droite du canon.

Renvoie
number
le lacet du canon en degrés, de 0 à 360 (support de canon) ; le réglage de lacet (support fixe)
Brass
print(string.format("lacet %.1f, tangage %.1f", canon.yaw(), canon.pitch()))

Voir aussi cannon_mount.pitch() cannon_mount.aim()

#

canon.pitch()

→ number

Sur un support de canon, l'angle du fût au-dessus de l'horizontale, négatif en dessous ; 0 sans canon. Sur un support de canon fixe, le réglage de tangage de sa case, de -45 à 45 degrés, positif vers le haut.

Renvoie
number
de combien le fût est levé, en degrés (support de canon) ; le réglage de tangage (support fixe)

Voir aussi cannon_mount.yaw() cannon_mount.pitch_limits()

#

canon.pitch_limits()

→ table

Jusqu'où le canon peut pointer vers le bas et vers le haut sur ce support, en degrés : min est négatif (sous l'horizontale). Big Cannons les fixe selon le canon et le support. aim garde le tangage demandé entre les deux. Support de canon seulement.

Renvoie
table
{min=, max=}, le tangage le plus bas et le plus haut du canon ; nil sans canon
Brass
local limites = canon.pitch_limits()
print("de " .. limites.min .. " à " .. limites.max .. " degrés")

Voir aussi cannon_mount.aim()

#

canon.shaft_speeds()

→ table

La vitesse de l'arbre qui fait tourner le support (yaw, dessous) et de celui qui le lève (pitch, sur ses côtés), en tr/min, 0 quand l'un est à l'arrêt ou que son réseau est en surcharge. Un ordinateur ne tourne le support qu'aussi vite que ces arbres : tr/min × 0.75 degrés par seconde. Support de canon seulement.

Renvoie
table
{yaw=, pitch=}, les vitesses des deux arbres du support, en tr/min
Brass
local v = canon.shaft_speeds()
if v.yaw == 0 or v.pitch == 0 then
  print("le support a besoin de rotation pour tourner")
end

Voir aussi cannon_mount.aim()

#

canon.aim(yaw, pitch)

Sur un support de canon, prend la main sur le support et tourne le canon vers ces angles à la vitesse de ses arbres (voir plus haut), puis l'y tient. L'appel revient tout de suite : cannon_mount.on_target() dit quand le canon y est. Appeler aim de nouveau change la cible, même pendant que le support tourne. Il faut un canon assemblé.

Paramètres
yaw number
le lacet visé, en degrés (n'importe quel nombre : 450 vaut 90)
pitch number
le tangage visé, en degrés, gardé dans les limites du canon

Sur un support de canon fixe, règle ses deux cases sur ces angles, en degrés entiers gardés entre -45 et 45, à la fin du tick. Le canon y est tout de suite.

Une tourelle qui suit une cible donnée par un autre ordinateur (un message réseau avec le lacet et le tangage) :

Brass
local canon = peripheral.find("cannon_mount")
while true do
  local m = net.receive()
  canon.aim(m.data.yaw, m.data.pitch)
  while not canon.on_target() do
    sleep(0.1)
  end
  canon.fire()
end

Voir aussi cannon_mount.on_target() cannon_mount.release() cannon_mount.yaw()

#

canon.target()

→ table

Les angles du dernier aim, le tangage tel que gardé dans les limites ; nil quand aucun ordinateur ne tient le support (jamais visé, rendu, ou canon désassemblé depuis). Support de canon seulement.

Renvoie
table
{yaw=, pitch=}, les angles vers lesquels tourne le support ; nil tant que ses arbres le pilotent

Voir aussi cannon_mount.aim()

#

canon.on_target()

→ boolean

true une fois que le canon a atteint les angles du dernier aim ; false pendant qu'il tourne, ou quand aucun ordinateur ne tient le support. Support de canon seulement.

Renvoie
boolean
true quand le canon pointe là où aim l'a demandé

Voir aussi cannon_mount.aim()

#

canon.release()

Rend le support à ses arbres : ils le tournent de nouveau comme avant, un inverseur de rotation séquencé aussi. Ne fait rien quand aucun ordinateur ne le tient. Support de canon seulement.

Voir aussi cannon_mount.aim()

Tirer

#

canon.fire()

Tire une fois avec le gros canon, comme une impulsion de redstone sur la face de tir du support : Big Cannons allume les charges et envoie l'obus, à la fin du tick. Plusieurs appels dans le même tick donnent un seul coup ; un fût vide ne fait rien. Sur un autocanon, arrête le programme avec an autocannon fires at a rate: set_fire_rate(1..15). Les deux supports l'ont.

Voir aussi cannon_mount.strength() cannon_mount.disassemble()

#

canon.set_fire_rate(rate)

Donne à l'autocanon la puissance de signal de redstone rate sur sa face de tir : il tire sans arrêt, tant qu'il a des munitions, jusqu'à set_fire_rate(0). Un changement de redstone sur la face de tir remplace la cadence. Sur un gros canon, arrête le programme avec only an autocannon has a fire rate: fire() shoots a big cannon. Les deux supports l'ont.

Paramètres
rate number
0 pour arrêter, de 1 à 15 pour un tir de plus en plus rapide
Brass
canon.set_fire_rate(15)
sleep(3)
canon.set_fire_rate(0)

Voir aussi cannon_mount.fire_rate()

Assemblage

#

canon.assemble()

Assemble le canon posé sur le support, comme un signal de redstone qui arrive sur sa face d'assemblage. Ne fait rien quand il est déjà assemblé. Quand Big Cannons refuse, arrête le programme avec sa raison (cannot assemble the cannon: ...) ; sans rien à assembler, avec no cannon to assemble on the cannon mount. Un support s'assemble ou se désassemble une fois par tick : un second appel dans le même tick dit d'attendre (sleep(0)). Les deux supports l'ont.

Voir aussi cannon_mount.disassemble() cannon_mount.assembled()

#

canon.disassemble()

Remet le canon en blocs, dans la direction où il a été assemblé, et met fin à la prise en main du support par l'ordinateur. C'est ainsi qu'on recharge un gros canon. Ne fait rien sans canon. Les deux supports l'ont.

Un gros canon qui se recharge seul : un chargeur de canon derrière lui pousse un obus et ses charges pendant que la sortie de redstone à l'arrière de l'ordinateur le fait tourner.

Brass
local canon = peripheral.find("cannon_mount")
while true do
  canon.disassemble()
  rs.set("back", true) -- le chargeur tourne
  sleep(8)
  rs.set("back", false)
  sleep(0.5)
  canon.assemble()
  canon.aim(180, 30)
  while not canon.on_target() do
    sleep(0.1)
  end
  canon.fire()
  sleep(1)
end

Voir aussi cannon_mount.assemble()