获取方块的放置坐标
首先
本文所介绍的内容是针对Minecraft:JE创建的。无法确定是否可以在BE上实施。
再说一遍,这不适合初学者。请努力阅读。
1. 目标
创建一个机制,获取方块的放置位置并执行函数。
2. 制作方式
2.0.准备的事项(包括创建环境等)
-
- Minecraft:JE 1.20.2
-
- 十分な広さを持つワールド(特に座標[0,0,0]あたりが自由に使えるようにする)(あと、コマンドが使える環境であること)
- テキストエディタ(データパック作成用)
2.1. 制作数据包
让我们在“(作ったワールドデータ)/datapacks/”文件夹中创建一个数据包。
{
"pack": {
"pack_format": 18,
"description": "説明文"
}
}
创建一个设定块。
玩家要创建实际放置的方块。
为了使用命令进行判定,对NBT进行调整。
{
"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
把调试棒放进灶台里,并附加自定义标签(place_detector:1b, block_name:”red_wool”)。
创建一个检测设置
{
"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
获取2.4设置的位置。
要获取已设置方块的位置,需要通过某种实体来介导。本例中,我们将使用将调试棒放置在熔炉内,以获得接近坐标[0,0,0]的位置并获取向量的方法。
{
"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
在2.5版中执行宏时,请指定标记位置。
#>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
炉子被红色羊毛所替代,摆放时发出羊毛的声音。(偶尔会听到放置石头的声音。)
增加方块种类
{
"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
3. 结束语
我们介绍了一种获取块的安装位置并执行函数的方法。
作为这一机制的应用示例,
-
- 「ブロックの設置制限を設ける」
- 「ブロックの位置にエンティティを設置する」
有以下所述的一些选项。
我使用该机制创建了分发地图并公开。请务必尝试玩一下!
感冒很痛苦