本帖最后由 t1546542 于 2019-8-23 13:58 编辑
只使用原版命令!
版本:1.12.2
如题
我想让玩家达到服务器里面的tpa效果
有玩家接受和玩家拒绝功能
求大佬解答!!!
@CHElover_C60
只使用原版命令!
版本:1.12.2
如题
我想让玩家达到服务器里面的tpa效果
有玩家接受和玩家拒绝功能
求大佬解答!!!
@CHElover_C60
这个真的做不到呢……
倒是可以做到随机传送和强制传送
倒是可以做到随机传送和强制传送

在ESS插件配置中添加玩家tpa的默认权限即可
可以自己装插件
正常服务器加装ess插件都可以达到tpa
没有插件模组单靠命令方块的话是办不到的
没有插件模组单靠命令方块的话是办不到的
1771475094 发表于 2019-8-22 12:03
正常服务器加装ess插件都可以达到tpa
没有插件模组单靠命令方块的话是办不到的 ...
办得到,之前我进别人房间时看到的
咱下个插件不好吗
给玩家加UID吧,按照领取新手礼包顺序每个玩家一个编号,然后就好做了
本帖最后由 CHElover_C60 于 2019-8-23 19:49 编辑
既然楼主邀请我答了,那我就试着写一下吧。
以下命令基于假设同时只有一个玩家尝试tpa的情况下,因为怎么防多人冲突我一直想不好
事先准备
建立计分板
复制代码然后指定一个虚拟玩家#id,让他在tpaid上拥有1分
复制代码
生成tpaid
当一名新玩家加入后,执行以下命令,为其分配tpaid
复制代码或者,如果会写函数,可以直接execute该玩家执行函数,此时可省去防止多人冲突而做的标签处理
复制代码set_tpaid.mcfunction
复制代码
寻找tpa目标
首先,让玩家输入被tpa玩家的tpaid,格式为:/trigger tpa set <被tpa玩家tpaid>
然后开始寻找在计分板tpaid上拥有分数与该玩家的tpa分数相同的玩家,并加标签做标记,后提醒该玩家是否接受tpa。这一部分和下一部分我不知道怎么防止多人冲突,希望有人能解决
复制代码
判断玩家是否接受
此处需要检测拥有tpatarget标签玩家的tpaccept的分数,然后执行不同命令,故需要将命令方块设置为条件激活。
若玩家接受
复制代码若玩家拒绝
复制代码如果用函数,就可以省去testfor,直接execute在tpaccept计分板上有分数的玩家执行函数即可,此时部分目标选择器可以换成@s
查询自己的tpaid
考虑到可能会有玩家忘记自己的tpaid,我想了一个可以让玩家查询自己的tpaid的方法,玩家手动输入/trigger tpa set 0即可。此情况多人模式下不会冲突。
复制代码
既然楼主邀请我答了,那我就试着写一下吧。
以下命令基于假设同时只有一个玩家尝试tpa的情况下,因为怎么防多人冲突我一直想不好
事先准备
建立计分板
- /scoreboard objectives add tpa trigger
- /scoreboard objectives add tpaccept trigger
- /scoreboard objectives add tpaid dummy
- /scoreboard objectives add tpassist dummy
- /scoreboard players set #id tpaid 1
生成tpaid
当一名新玩家加入后,执行以下命令,为其分配tpaid
- /scoreboard players tag @a[tag=!tpaid_set,c=1] add tpaid_setting
- /scoreboard players operation @a[tag=tpaid_setting] tpaid = #id tpaid
- /scoreboard players add #id tpaid 1
- /scoreboard players tag @a[tag=tpaid_setting] add tpaid_set
- /tellraw @a[tag=tpaid_setting] [{"text":"你的tpaid为:"},{"score":{"name":"*","objective":"tpaid"}}]
- /scoreboard players enable @a[tag=tpaid_setting] tpa
- /scoreboard players tag @a[tag=tpaid_setting,c=1] remove tpaid_setting
- /execute @a[tag=!tpaid_set] ~ ~ ~ function set_tpaid
- scoreboard players operation @s tpaid = #id tpaid
- scoreboard players add #id tpaid 1
- scoreboard players tag @s add tpaid_set
- tellraw @s [{"text":"你的tpaid为:"},{"score":{"name":"*","objective":"tpaid"}}]
- scoreboard players enable @s tpa
寻找tpa目标
首先,让玩家输入被tpa玩家的tpaid,格式为:/trigger tpa set <被tpa玩家tpaid>
然后开始寻找在计分板tpaid上拥有分数与该玩家的tpa分数相同的玩家,并加标签做标记,后提醒该玩家是否接受tpa。这一部分和下一部分我不知道怎么防止多人冲突,希望有人能解决
- /scoreboard players tag @a[score_tpa_min=1] add tpaexecute
- /execute @a ~ ~ ~ scoreboard players operation @s tpassist = @s tpaid
- /execute @a ~ ~ ~ scoreboard players operation @s tpassist -= @a[tag=tpaexecute,c=1] tpa
- /scoreboard players tag @a[score_tpassist_min=0,score_tpassist=0] add tpatarget
- /tellraw @a[tag=tpatarget] [{"selector":"@a[tag=tpaexecute]"},{"text":"想要tpa至你所在的位置,输入/trigger tpaccept set 1以接受,或输入/trigger tpaccept set 0以拒绝"}]
- /scoreboard players enable @a[tag=tpatarget] tpaccept
- /scoreboard players reset @a[tag=tpaexecute] tpa
判断玩家是否接受
此处需要检测拥有tpatarget标签玩家的tpaccept的分数,然后执行不同命令,故需要将命令方块设置为条件激活。
若玩家接受
- /testfor @a[tag=tpatarget,score_tpaccept_min=1]
- /tp @a[tag=tpaexecute] @a[tag=tpatarget]
- /scoreboard players reset @a[tag=tpatarget] tpaccept
- /scoreboard players enable @a[tag=tpaexecute] tpa
- /scoreboard players tag @a [tag=tpaexecute] tpaexecute
- /scoreboard players tag @a [tag=tpatarget] tpatarget
- /testfor @a[tag=tpatarget,score_tpaccept=0]
- /tellraw @a[tag=tpaexecute] {"text":"对方拒绝了你的tpa请求"}
- /scoreboard players reset @a[tag=tpatarget] tpaccept
- /scoreboard players enable @a[tag=tpaexecute] tpa
- /scoreboard players tag @a [tag=tpaexecute] tpaexecute
- /scoreboard players tag @a [tag=tpatarget] tpatarget
查询自己的tpaid
考虑到可能会有玩家忘记自己的tpaid,我想了一个可以让玩家查询自己的tpaid的方法,玩家手动输入/trigger tpa set 0即可。此情况多人模式下不会冲突。
- /tellraw @a[score_tpa=0] [{"text":"你的tpaid为:"},{"score":{"name":"*","objective":"tpaid"}}]
- /scoreboard players enable @a[score_tpa=0] tpa
- /scoreboard players reset @a[score_tpa=0] tpa