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.
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.
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.
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 :
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-ouest180 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()
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.
- boolean
- true tant qu'un canon est assemblé sur le support
Voir aussi cannon_mount.assemble() cannon_mount.cannon()
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.
- string
- "big_cannon" ou "autocannon", nil quand aucun canon n'est assemblé
local sorte = canon.cannon()
if sorte == "autocannon" then
canon.set_fire_rate(10)
elseif sorte == "big_cannon" then
canon.fire()
endVoir aussi cannon_mount.assembled()
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.
- 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()
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.
- 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()
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.
- number
- le lacet du canon en degrés, de 0 à 360 (support de canon) ; le réglage de lacet (support fixe)
print(string.format("lacet %.1f, tangage %.1f", canon.yaw(), canon.pitch()))Voir aussi cannon_mount.pitch() cannon_mount.aim()
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.
- 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()
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.
- table
- {min=, max=}, le tangage le plus bas et le plus haut du canon ; nil sans canon
local limites = canon.pitch_limits()
print("de " .. limites.min .. " à " .. limites.max .. " degrés")Voir aussi cannon_mount.aim()
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.
- table
- {yaw=, pitch=}, les vitesses des deux arbres du support, en tr/min
local v = canon.shaft_speeds()
if v.yaw == 0 or v.pitch == 0 then
print("le support a besoin de rotation pour tourner")
endVoir 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é.
yawnumber- le lacet visé, en degrés (n'importe quel nombre : 450 vaut 90)
pitchnumber- 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) :
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()
endVoir aussi cannon_mount.on_target() cannon_mount.release() cannon_mount.yaw()
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.
- 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()
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.
- 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.
ratenumber- 0 pour arrêter, de 1 à 15 pour un tir de plus en plus rapide
canon.set_fire_rate(15)
sleep(3)
canon.set_fire_rate(0)Voir aussi cannon_mount.fire_rate()
Assemblage
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()
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.
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)
endVoir aussi cannon_mount.assemble()