辅助专业户
一直以来都有这个想法,就是做一个具有时限的进度。我现在自定义了一个进度,在玩家获取进度后以获取者的身份运行一个函数,使得游戏在一段时间后,清除该玩家的该进度。
但到现在为止,我所知道的带有延时功能的指令只有 schedule (在一定时间后执行一个函数,或者清除将要执行的函数)。

遇到的问题



现在希望有大佬能帮我实现这一想法




strings
给玩家加一个标签,就是 /tag @s add xxx

然后再 advancement revoke @a[tag=xxx] only minecraft:skill/skill1

辅助专业户
もぺもぺ 发表于 2021-7-17 00:11
给玩家加一个标签,就是 /tag @s add xxx

然后再 advancement revoke @a[tag=xxx] only minecraft:skill/s ...

也不行,假设玩家A完成进度,获得标签计时启动,若在倒计时的过程中玩家B也完成了这个进度,那么倒计时结束后玩家A和B的进度都会被同时清除,这对玩家B不公平

GF009
execute试试?第一条指令用execute as @s run schedule function func2 10s ,第二条不变

辅助专业户
GF009 发表于 2021-7-17 00:43
execute试试?第一条指令用execute as @s run schedule function func2 10s ,第二条不变

也不行,在加入了say指令后发现,执行主体还是server而不是玩家

鱼宝放心飞
不懂就问,为什么不能用记分板?
# 初始化
scoreboard objectives add foo dummy
# 在进度的 rewards 里写
tag @s add foo
# 在 tick 函数中写
execute as @a[tag=foo] run function foo:1
# 函数 foo:1
scoreboard players add @s foo 1
execute if score @s foo matches 200.. run function foo:2
# 函数 foo:2
advancement revoke @s only ...
tag @s remove foo
scoreboard players reset @s foo

strings
本帖最后由 もぺもぺ 于 2021-7-17 12:32 编辑
辅助专业户 发表于 2021-7-17 00:43
也不行,假设玩家A完成进度,获得标签计时启动,若在倒计时的过程中玩家B也完成了这个进度,那么倒计时结 ...

func2 中的末尾写入 schedule function func2 2s

中间写入给有标签的玩家加分的命令,再判断分数达到一定值时,触发命令。

这样有 0-2s 的偏差,但是性能会好一些

也可以通过 execute store result 获取 time query gametime 的返回值储存到玩家的记分板上,10s 后执行,遍历每一个玩家,用现在获取的值减去玩家的,判断下大小就知道是不是需要的那个玩家了

第一页 上一页 下一页 最后一页