获取方块的放置坐标

首先

本文所介绍的内容是针对Minecraft:JE创建的。无法确定是否可以在BE上实施。

再说一遍,这不适合初学者。请努力阅读。

1. 目标

创建一个机制,获取方块的放置位置并执行函数。

設置.gif
範囲外設置.gif

2. 制作方式

2.0.准备的事项(包括创建环境等)

    • Minecraft:JE 1.20.2

 

    • 十分な広さを持つワールド(特に座標[0,0,0]あたりが自由に使えるようにする)(あと、コマンドが使える環境であること)

 

    テキストエディタ(データパック作成用)
2023-12-03_09.59.28.png

2.1. 制作数据包

让我们在“(作ったワールドデータ)/datapacks/”文件夹中创建一个数据包。

image.png
{
	"pack": {
		"pack_format": 18,
		"description": "説明文"
	}
}
2023-12-03_10.12.46.png

创建一个设定块。

玩家要创建实际放置的方块。
为了使用命令进行判定,对NBT进行调整。

image.png
{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "furnace",
                    "functions": [
                        {
                            "function": "set_name",
                            "name": {
                                "translate": "block.minecraft.red_wool",
                                "italic": false
                            }
                        },
                        {
                            "function": "set_nbt",
                            "tag": "{BlockEntityTag:{Items:[{id:\"debug_stick\",Count:1b,tag:{place_detector:1b,block_name:\"red_wool\"}}]}}"
                        }
                    ]
                }
            ]
        }
    ]
}

把它添加到路由表中就可以更轻松地管理物品了。
那么,让我们返回游戏世界并尝试取出物品吧。

/reload
/loot give @s loot place_detector:test-block
2023-12-03_10.52.59.png

把调试棒放进灶台里,并附加自定义标签(place_detector:1b, block_name:”red_wool”)。

创建一个检测设置

image.png
{
    "criteria": {
        "place": {
            "trigger": "placed_block",
            "conditions": {
                "location": [
                    {
                        "condition": "location_check",
                        "predicate": {
                            "block": {
                                "blocks": [
                                    "furnace"
                                ],
                                "nbt": "{Items:[{tag:{place_detector:1b}}]}"
                            }
                        }
                    }
                ]
            }
        }
    },
    "rewards": {
        "function": "place_detector:place"
    }
}
#>place_detector:place
say 設置した
advancement revoke @s only place_detector:place

ワールドに戻って、先ほど作ったかまどを設置してみましょう。

/reload
2023-12-03_11.05.35.png

获取2.4设置的位置。

要获取已设置方块的位置,需要通过某种实体来介导。本例中,我们将使用将调试棒放置在熔炉内,以获得接近坐标[0,0,0]的位置并获取向量的方法。

image.png
{
    "values": [
        "place_detector:scores"
    ]
}
#>place_detector:scores
# 計算用のスコア
scoreboard objectives add _ dummy
#>place_detector:place

# かまどの設置位置にマーカーを召喚
function place_detector:get_pos

# マーカーの位置でコマンドを実行
execute at @e[tag=place_detector_pos] run setblock ~ ~ ~ red_wool

# マーカーを消去
kill @e[type=marker,tag=place_detector_pos]

# 進捗の初期化
advancement revoke @s only place_detector:place
#>place_detector:get_pos

# チャンクロード
forceload add 0 0 -1 -1

# プレイヤーの周囲にある特定のかまどをコピー (ワールド外対策としてy座標を分けて実行)
clone ~5 ~-5 ~5 ~-5 ~-5 ~-5 to overworld -5 -5 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~-4 ~5 ~-5 ~-4 ~-5 to overworld -5 -4 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~-3 ~5 ~-5 ~-3 ~-5 to overworld -5 -3 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~-2 ~5 ~-5 ~-2 ~-5 to overworld -5 -2 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~-1 ~5 ~-5 ~-1 ~-5 to overworld -5 -1 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~0 ~5 ~-5 ~0 ~-5 to overworld -5 0 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~1 ~5 ~-5 ~1 ~-5 to overworld -5 1 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~2 ~5 ~-5 ~2 ~-5 to overworld -5 2 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~3 ~5 ~-5 ~3 ~-5 to overworld -5 3 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~4 ~5 ~-5 ~4 ~-5 to overworld -5 4 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}
clone ~5 ~5 ~5 ~-5 ~5 ~-5 to overworld -5 5 -5 filtered furnace{Items:[{tag:{place_detector:1b}}]}

# かまどを破壊
fill -5 -5 -5 5 5 5 air destroy

# デバッグ棒にタグをつける(検索の最適化)
tag @e[type=item,nbt={Item:{id:"minecraft:debug_stick",tag:{place_detector:1b}}}] add place_detector_vector

# マーカーをプレイヤーの位置に召喚
summon marker ~ ~ ~ {Tags:["place_detector_pos"]}

# マーカーにデバッグ棒の座標(ベクトル)を加える
execute store result score #pos _ run data get entity @e[type=marker,tag=place_detector_pos,limit=1] Pos[0]
execute store result score #vector _ run data get entity @e[type=item,tag=place_detector_vector,limit=1] Pos[0]
execute store result entity @e[type=marker,tag=place_detector_pos,limit=1] Pos[0] double 1 run scoreboard players operation #pos _ += #vector _
execute store result score #pos _ run data get entity @e[type=marker,tag=place_detector_pos,limit=1] Pos[1]
execute store result score #vector _ run data get entity @e[type=item,tag=place_detector_vector,limit=1] Pos[1]
execute store result entity @e[type=marker,tag=place_detector_pos,limit=1] Pos[1] double 1 run scoreboard players operation #pos _ += #vector _
execute store result score #pos _ run data get entity @e[type=marker,tag=place_detector_pos,limit=1] Pos[2]
execute store result score #vector _ run data get entity @e[type=item,tag=place_detector_vector,limit=1] Pos[2]
execute store result entity @e[type=marker,tag=place_detector_pos,limit=1] Pos[2] double 1 run scoreboard players operation #pos _ += #vector _

# マーカーにblock_nameをコピー
data modify entity @e[type=marker,tag=place_detector_pos,limit=1] data.block_name set from entity @e[type=item,tag=place_detector_vector,limit=1] Item.tag.block_name

# ドロップしたアイテムを消去
kill @e[x=-5,y=-5,z=-5,dx=10,dy=10,dz=10,type=item]

让我们回到World,尝试放置一个炉子吧。

/reload
2023-12-03_11.52.55.png

在2.5版中执行宏时,请指定标记位置。

image.png
#>place_detector:place

# かまどの設置位置にマーカーを召喚
function place_detector:get_pos

# マーカーの位置でコマンドを実行(変更部分!,関数のマクロ実行)
execute at @e[tag=place_detector_pos] run function place_detector:block_function/macro with entity @e[tag=place_detector_pos,limit=1] data

# マーカーを消去
kill @e[type=marker,tag=place_detector_pos]

# 進捗の初期化
advancement revoke @s only place_detector:place
#>place_detector:block_function/macro

# マクロで関数のパスを設定,実行
$function place_detector:block_function/$(block_name)
#>place_detector:block_function/red_wool

# 設置音を変える
stopsound @a block block.stone.place
playsound block.wool.place block @a ~ ~ ~ 1 1
# ブロックを設置
setblock ~ ~ ~ red_wool

让我们回到游戏世界,尝试放置一个灶台。

/reload

炉子被红色羊毛所替代,摆放时发出羊毛的声音。(偶尔会听到放置石头的声音。)

增加方块种类

image.png
{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "furnace",
                    "functions": [
                        {
                            "function": "set_name",
                            "name": {
                                "translate": "block.minecraft.diorite",
                                "italic": false
                            }
                        },
                        {
                            "function": "set_nbt",
                            "tag": "{BlockEntityTag:{Items:[{id:\"debug_stick\",Count:1b,tag:{place_detector:1b,block_name:\"diorite\"}}]}}"
                        }
                    ]
                }
            ]
        }
    ]
}
#>place_detector:block_function/diorite

# ブロックを設置
setblock ~ ~ ~ diorite

回到世界,尝试安装新建的炉子。

/reload
/loot give @s loot place_detector:test-block2
2023-12-03_12.27.36.png

3. 结束语

我们介绍了一种获取块的安装位置并执行函数的方法。
作为这一机制的应用示例,

    • 「ブロックの設置制限を設ける」

 

    「ブロックの位置にエンティティを設置する」

有以下所述的一些选项。

我使用该机制创建了分发地图并公开。请务必尝试玩一下!

game_サムネ2.png

感冒很痛苦

广告
将在 10 秒后关闭
bannerAds