一直以来都有这个想法,就是做一个具有时限的进度。我现在自定义了一个进度,在玩家获取进度后以获取者的身份运行一个函数,使得游戏在一段时间后,清除该玩家的该进度。
但到现在为止,我所知道的带有延时功能的指令只有 schedule (在一定时间后执行一个函数,或者清除将要执行的函数)。
遇到的问题
现在希望有大佬能帮我实现这一想法
但到现在为止,我所知道的带有延时功能的指令只有 schedule (在一定时间后执行一个函数,或者清除将要执行的函数)。
遇到的问题
- 自定义进度奖励的函数为func1,func1内仅有一条指令 schedule function func2 10s(10秒后执行函数func2),func2内仅有一条指令 advancement revoke @s only minecraft:skill/skill1(清除已获得的进度)
- 上面这种通过func1来运行func2的运行方法,会使func2丢失主体(因为系统认为这条质量是func1发起的,而不是获取进度的玩家发起的)
现在希望有大佬能帮我实现这一想法
- 以数据包的方式实现,不使用命令方块
- 尽量不使用计分板
给玩家加一个标签,就是 /tag @s add xxx
然后再 advancement revoke @a[tag=xxx] only minecraft:skill/skill1
然后再 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不公平
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
# 初始化
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
本帖最后由 もぺもぺ 于 2021-7-17 12:32 编辑
func2 中的末尾写入 schedule function func2 2s
中间写入给有标签的玩家加分的命令,再判断分数达到一定值时,触发命令。
这样有 0-2s 的偏差,但是性能会好一些
也可以通过 execute store result 获取 time query gametime 的返回值储存到玩家的记分板上,10s 后执行,遍历每一个玩家,用现在获取的值减去玩家的,判断下大小就知道是不是需要的那个玩家了
辅助专业户 发表于 2021-7-17 00:43
也不行,假设玩家A完成进度,获得标签计时启动,若在倒计时的过程中玩家B也完成了这个进度,那么倒计时结 ...
func2 中的末尾写入 schedule function func2 2s
中间写入给有标签的玩家加分的命令,再判断分数达到一定值时,触发命令。
这样有 0-2s 的偏差,但是性能会好一些
也可以通过 execute store result 获取 time query gametime 的返回值储存到玩家的记分板上,10s 后执行,遍历每一个玩家,用现在获取的值减去玩家的,判断下大小就知道是不是需要的那个玩家了