【Minecraft21w03a】如何利用磁石指南针让指南针指向指定玩家
此文章是应小豆光辉的需求所做的文章,为了深表自己鸽了他的歉意,我决定开一个专栏来赔偿。
注:1.原本是要求利用1.16.1版本进行制作。但是限于我对loot table(战利品表)的研究其实较为有限,所以决定将版本升级为21w03a(理论在快照加入item指令后的版本都可以),这样可以用更简单的指令解决此问题。 2.其实我开专栏的第二个原因是像这一类问题运用命令方块来解决会有一定的局限性,所以我决定采用数据包来解决此问题,所以评论区比较难解释,故选择专栏来回答。
一、成品下载&使用:
链接:https://pan.baidu.com/s/1XNtnw_GvlWjuBAPUe-acVA
提取码:5ykq
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V2的分享
使用方法:将文件夹中的「指人针」文件夹放入到.minecraft/save/<指定游戏地图>/datapack里并且重新加载入地图。或者在创建世界时直接点击数据包将「指人针」文件夹放入到临时文件夹中。
使用注意事项:1、只能在同一个维度里时指针才有效 2、要给指定的玩家附上"CompassPlayer"的标签后指针就会指着他。 3、只能给一个玩家指定这个标签,否则会随机选择一个有标签的玩家指。 4、给玩家添加标签的命令:tag <玩家名> add CompassPlayer
5、给玩家删除标签的命令tag <玩家名> remove CompassPlayer
二、原理讲解:
其实这个装置的原理在少掉了loot table以后就简单了许多。但是介于1.16新加入的自定义维度,我想出了一个可以解决之前
具体想修改物品信息的情形,可以通过直接修改潜影盒内物品实现,这里不做赘述。
唯一的缺点就是,需要在255高度引入额外的方块潜影盒,这会导致原有的位于255高度的方块消失。---摘抄自MCBBS《修改玩家背包物品信息(免穷举)》
的这一问题的一个完美解决方案,那边是利用自定义维度创造一个全新的空间来作为存储的容器!
然后接下来指人的主要原理是通过在自定义维度里创建一个箱子,在箱子里放入一个指南针,并且给指南针附上带标签玩家所在的维度、位置。然后再将这里面的指南针通过item指令传到玩家的九号快捷栏。
三、具体步骤:
首先我们需要先搭建好一个datapack的框架:
1.创建一个根文件夹,并在里面装入一个文件,命名为“pack.mcmeta”,这是作为你数据包的一个基本信息,包括版本信息、介绍:
{
"pack":
{
"pack_format":7,
"description":"指人的指南针"
}
}
2.再创建一个文件夹,名字为data。
3.在data里面创建两个文件夹,一个为"minecraft"(这是修改原本数据包的渠道),另一个则为"compass_to_player"(这是自己的数据包)。
4.在minecraft文件夹里,我们需要干两件事情,一件是引用自己的函数,其次是创建一个空的世界。而在compass_to_player里面,主要只有一件事,也就是写函数指令。
5.我们先预设好我们会创建一个在minecraft命名空间下的一个文件夹叫store_place内一个叫void的维度世界。然后进入compass_to_player文件夹,创建一个functions文件夹,里面创建1个叫start.mcfunction的文件输入以下初始化指令:
#指向玩家的tag:CompassPlayer
scoreboard objectives add pointX dummy
scoreboard objectives add pointY dummy
scoreboard objectives add pointZ dummy
scoreboard objectives add timer dummy
然后创建一个main.mcfunction,输入以下指令:
scoreboard players add @a timer 1
execute as @a[scores={timer=1},
tag=!CompassPlayer] at @s in minecraft:store_space/void run function compass_to_player:place_chest
scoreboard players set @a[scores={timer=40..}] timer 0
最后再创建一个place_chest.mcfunction,输入以下指令:
forceload add ~ ~ ~ ~
setblock ~ ~ ~ chest
item block ~ ~ ~ container.0 replace compass
data modify block ~ ~ ~ Items[0].tag.LodestoneTracked set value false
data modify block ~ ~ ~ Items[0].tag.LodestoneDimension set from entity @a[limit=1,tag=CompassPlayer] Dimension
data modify block ~ ~ ~ Items[0].tag.LodestonePos.X set from entity @a[limit=1,tag=CompassPlayer] Pos[0]
data modify block ~ ~ ~ Items[0].tag.LodestonePos.Y set from entity @a[limit=1,tag=CompassPlayer] Pos[1]
data modify block ~ ~ ~ Items[0].tag.LodestonePos.Z set from entity @a[limit=1,tag=CompassPlayer] Pos[2]
item entity @s container.8 copy block ~ ~ ~ container.0
setblock ~ ~ ~ air
forceload remove ~ ~ ~ ~
完成以后我们的核心代码部分就大功告成!!
6.继续到minecraft文件夹,完成对函数的引用。
(1)创建tags文件夹
(2)在tags文件夹里创建functions文件夹
(3)在functions文件夹里创建一个tick.json(代表游戏每一刻都会调用一次这个函数脚本),输入以下json脚本:
{
"replace":false,
"values":
[
"compass_to_player:main"
]
}
(4)在functions文件夹里再创建一个load.json(代表游戏初始化世界时会调用一次这个函数脚本),输入以下json脚本:
{
"replace":false,
"values":
[
"compass_to_player:start"
]
}
7.接下来到了最后一步,创建一个自定义维度:
在minecraft文件夹里创建一个dimension的文件夹,在里面再创建一个文件夹叫store_space,再在里面创建一个文件叫void.json,输入以下脚本来创造一个只有空气的超平坦世界:
{
"type":"overworld",
"generator":
{
"type":"minecraft:flat",
"seed": 0,
"settings":
{
"layers":
[
{"block":"air","height":319}
],
"biome":"the_void",
"structures": {"stronghold": {"count": 1,"distance": 0,"spread": 0},"structures": {}}
}
}
}
最后这一切都完结后,我们的任务也就结束了!

四、效果展示:
话不多说,上几张图:


