functionについて

スポンサーリンク

  • このトピックには4件の返信、1人の参加者があり、最後に匿名により3週、 3日前に更新されました。
4件の返信スレッドを表示中
  • 投稿者
    投稿
    • #114220返信
      K
      参加者

      鉄ブロックを右クリックすると

      1: 鉄ブロックが消えて
      2: 木~ネザライトの斧のうちどれかが手に入って
      3: 1分後に同じ位置に鉄ブロックが復活する

      という動作をファンクションで作れますか?
      作れるならコマンドも教えて頂きたいです。

    • #114226返信
      匿名
      ゲスト

      ブロックのクリック検知はscriptAPIでしか多分できないです。

      どうしてもコマンドのみでやる場合は防具立てなどを仕様して擬似的な検知をする必要があると思います

    • #114240返信
      匿名
      ゲスト

      scriptAPIのやり方でいいので教えてください

    • #114243返信
      匿名
      ゲスト

      クリックしたブロックが鉄ブロックなら
      それを消す、ランダムな斧をクリック者に与える。
      を順に実行する。

      消した後1分後に復活するのはscore用いたコマンド式のタイマーでもscriptAPIでもどっちでも可能かと思います

    • #114589返信
      匿名
      ゲスト

      もし問題ないのであれば新たにブロックを作り、custom_componentsでクリックのイベントを検知するのが一番楽かと思います。
      以下はiron_blockそっくりのブロックを追加するjsonです。

      custom_iron_block.json

      
      {
        "format_version": "1.21.50",
        "minecraft:block": {
          "description": {
            "identifier": "custom:iron_block",
            "menu_category": {
              "category": "construction"
            }
          },
          "components": {
            "minecraft:geometry": "minecraft:geometry.full_block",
            "minecraft:material_instances": {
              "*": {
                "texture": "iron_block",
                "render_method": "opaque"
              }
            },
            "minecraft:custom_components": ["iron_block:interact"],
            "minecraft:destructible_by_mining": false // trueにするとサバイバルで壊せるようになる
          }
        }
      }
      
      

      レシピや破壊ツールなどの指定はしていませんので、そこまで再現するのであれば上記コードに更に書き足していく必要があります。
      ただ、クリエイティブで使う分には問題ありません。
      次に以下が指定された「鉄ブロックが消える、木、石、鉄、金、ダイヤ、ネザライトの斧のうちどれかが手に入る、1分後に消えた鉄ブロックの場所に鉄ブロックが復活する」のコードになります。
      main.js

      
      import { world, ItemStack, system } from "@minecraft/server";
      
      world.beforeEvents.worldInitialize.subscribe((initEvent) => {
        initEvent.blockComponentRegistry.registerCustomComponent("iron_block:interact", {
          onPlayerInteract: (e) => {
            const player = e.player;
            const block = e.block;
      
            block.dimension.setBlockType(block.location, "minecraft:air");
      
            const axe = randomGetAxe();
            const item = new ItemStack(axe, 1);
            player?.dimension.spawnItem(item, player.location);
      
            system.runTimeout(() => {
              block.dimension.setBlockType(block.location, "custom:iron_block");
            }, 20 * 60);
          },
        });
      });
      
      function randomGetAxe() {
        const axe = ["wooden_axe", "stone_axe", "iron_axe", "golden_axe", "diamond_axe", "netherite_axe"];
        const random = Math.floor(Math.random() * axe.length);
        return <code>minecraft:${axe[random]}</code>;
      }
      

      消えた状態でワールドを閉じるなどするとブロックが復活しないと思われますので、そこだけご注意ください。
      以下はアドオンのmanifest.jsonです。
      manifest.json

      
      {
        "format_version": 2,
        "header": {
          "description": "",
          "name": "Sample Addon",
          "uuid": "7b790b7c-a415-474a-b9dc-00b3eed396cd",
          "version": [1, 20, 50],
          "min_engine_version": [1, 20, 50]
        },
        "modules": [
          {
            "description": "Script",
            "type": "script",
            "language": "javascript",
            "uuid": "c6421e65-bb4d-41f7-81d6-76452064e088",
            "version": [1, 0, 0],
            "entry": "scripts/main.js"
          }
        ],
        "dependencies": [
          {
            "module_name": "@minecraft/server",
            "version": "1.16.0"
          }
        ]
      }
      

      最後に以上3ファイルの構造になります。

      
      Sample Script API
        ├─ manifest.json
        │
        ├─ blocks
        │    └─custom_iron_block.json
        │
        └─ scripts
             └─main.js
      

      ご不明点などあれば返信ください。

4件の返信スレッドを表示中
返信先: functionについて
あなたの情報: