https://linen.dev logo
分岐前の閉塞及び過密区間の複数列車制御に関するスクリプトの原案
# forum
r
kaizpatchとスクリプトを利用して外部modなしに信号システムを確立しようと考えています。 アルゴリズム等の原案作成に皆様のお力を借りたいです。 原案の一部です。 〇ATC第一段階(開発段階) 「分岐前の段階的な速度制御と過密区間の列車制御」 〇ATC第二段階(構想段階) 「分岐や過密区間含む全区間に閉塞を設置する」 第一段階について、私の考えられる範囲ではIFTTTで列車検知→後ろの閉塞にブロック設置orデータ変更→後ろの閉塞のATC現示を落とす というアルゴリズムを考えていますが、これ以外にもっと単純な方法や疑問点、別の手法を思いついた方に共有をお願いします。
追記:第一段階について、IFTTTで検知した段階でスクリプト制御によりワールド内のブロック設置やデータ変更は可能なのでしょうか?
u
以前他の鯖で信号開発をしていた者です 信号開発の基礎的な理論として「複数条件取得・単一条件判別」を考えると、開発が簡単になると思います 具体的には ①各閉塞は影響する全ての閉塞に対しデータを送る(いくつ先の閉塞にいるかなど) ②他の閉塞は該当データを受け取り、より低い信号を判別する ③他の閉塞や分岐は、必要あらばさらに他の設備へデータを受け渡す こんな流れになると思います ブロック設置に関しては、IFTTTのコマンドラインで、Minecraftのコマンドのsetblockあたりを使うんじゃなかろうかと認識 その場合、チャンクが凍結されていない必要があるので、スポーンチャンクなどで制御するのが望ましいと思われます 以上参考まで
r
情報ありがとうございます。いかなる形にしろやはりチャンク読み込みを正確にするということは避けられなさそうですね。開発の上で基調にしたいと思います  あとIFTTTの情報収受になるとATCもそうですが鯖でのチック遅れによる収受失敗というのも何かしらの対策が必要といったところでしょうかね
u
信号受信、WebCTCあたりでやれば解決しそう、、、じゃない?(KaizPatch依存症)
究極は「絶対に止めるマン」方式で大量に地上子置くか、車上で制限を厳格にかけて、地上子通過時の現示アップ方式の方が保安性高そう
r
webCTCから信号受信ってできるんですね 地上子からの収受は数増やすしかないのは確かに一番手っ取り早い方式ですか
個人的には閉塞より前にまずは場内信号機前の速度を段階的に落とすシステムに先行列車の接近パターンを組めればと思ってるんですけどそれって閉塞より難しいんでしょうか
h
自分も信号開発していたのでアイデアをいくつか 信号制御については一箇所に装置を集めて制御する方式と、各信号機に処理を分散させる方式の2種類に大別することができます。 ・一括制御はチャンクローダーの数を減らすことができますが、制御システムの構築が難しくなります。 ・分散制御は比較的簡単なアルゴリズムで実装できますが、設置の手間やチャンクローダーの必要数が増えるといったところです。 後者であればご提案の通りRSブロックを設置→そこから信号制御という形が一番簡単かと思われます。 前者を採用するのであれば、レッドストーンの伝播の減衰を利用するというのはどうでしょうか。
・シグコン/IFTTTを組み合わせた分散処理の例 https://x.com/hi03_s/status/1640038886809427970?s=20 ・レッドストーンを利用した一括制御の例 https://x.com/hi03_s/status/697152972266954752?s=20 (どちらも未完成に終わってるので良かったらアイデアに使ってください)
IFTTTでブロック設置は以下のような処理で実装できます(設置の処理以外は省略)
Copy code
js
importPackage(Packages.net.minecraft.init);//Blocks

function doThat(tileEntity, train, isFirstTime) {
    var world = tileEntity.func_145831_w();
    var x, y, z;//設置する座標
    setRSOutput(world, x, y, z, true);//trueでON、falseでoff  
}

function setRSOutput(world, x, y, z, output) {
    x = Math.floor(x);
    y = Math.floor(y);
    z = Math.floor(z);
    if (output) world.func_147465_d(x, y, z, Blocks.field_150451_bX, 0, 3);//RSブロック
    else world.func_147465_d(x, y, z, Blocks.field_150399_cn, 14, 3);//ガラス
}
r
ありがとうございます! スクリプト活用して実地検証してみます。
u
コンパレータ信号処理センターは流石にイケメンが過ぎる