先介绍一下要实现的功能:
大召唤术:耗费5金币使用(金币为游戏内管理员自行设定的通货,金币不足则提示无法使用)
使用后除使用者以外的人在聊天框可以看到召唤信息。
在大召唤术被使用的10秒内,若其他人点击召唤信息则回被传送到使用者位置,并扣除5金币(若金币<5则提示金币不足并取消传送)
这里为了避免召唤混乱或重复使用,限定当大召唤术触发期间任何人不能重复使用大召唤术。
另外,如果大召唤术被使用超过10秒,或使用者中途退出游戏,则传送者点击聊天框命令将无任何提示,且不会传送,但也不会扣除金币。
布置如图(也可以考虑做成竖向的):
使用的计分板目标:
zh(召唤,类型为trigger)
cs(传送,类型为trigger)
zhtrue(标记正在使用大召唤术的玩家,类型为dummy)
tptime(大召唤术剩余时间,类型为dummy)
jb(金币,类型为dummy)
前置命令:
/gamerule commandBlockOutput false //取消命令方块在聊天框的输出
/gamerule sendCommandFeedback false //取消所有命令结果在聊天框的输出,但有潜在安全隐患,慎用
/scoreboard objectives add zh trigger
/scoreboard objectives add cs trigger
/scoreboard objectives add zhtrue dummy
/scoreboard objectives add tptime dummy
/scoreboard objectives add jb dummy
/scoreboard players set tptime tptime 0 //初始化tptime
【计时器(tptime)】
scoreboard players test tptime tptime 1 200 //(循环)检测tptime是否>=1
scoreboard players remove tptime tptime 1 //(条件制约)tptime减1
scoreboard players test tptime tptime 0 0 //(条件制约)检测tptime是否为0
scoreboard players set * zhtrue 0 //(条件制约)将所有人的zhtrue设置为0
【被传送者】
tellraw @a[score_cs=1,score_cs_min=1,score_jb=4] {"text":"金币不足,无法传送!"} //(循环)(若cs=1的人jb<5)提示金币不足
tp @a[score_cs=1,score_cs_min=1,score_jb_min=5,score_zhtrue=0] @a[score_zhtrue_min=1]//将cs=1,jb>=5,zhtrue=0的人传送到zhtrue=1的人处
tellraw @a[score_cs=1,score_cs_min=1,score_jb_min=5] {"text":"传送成功!"} //(条件制约)对cs=1,jb>=5的人显示成功信息
scoreboard players remove @a[score_cs=1,score_cs_min=1,score_jb_min=5] jb 5 //(条件制约)将cs=1,jb>=5的人的jb减5
scoreboard players set @a[score_cs_min=1] cs 0 //将cs=1的人的cs分数设置为0
【使用大召唤术(含条件检测)】
tellraw @a[score_zh=1,score_zh_min=1,score_jb=4] {"text":"金币不足,无法使用大召唤术!"} //(循环)(若zh=1的人jb<5)提示金币不足
scoreboard players test tptime tptime 1 200 //检测tptime是否不为0
tellraw @a[score_zh=1,score_zh_min=1,score_jb_min=5] {"text":"当前有人正在使用大召唤术,请稍后使用!"}
//(条件制约)对zh=1,jb>=5的人显示提示信息
scoreboard players test tptime tptime 0 0 //检测tptime是否为0
scoreboard players set @a zhtrue 0 //(条件制约)将所有人的zhtrue设置为0
scoreboard players set @p[score_zh=1,score_zh_min=1,score_jb_min=5] zhtrue 1 //(条件制约)将zh=1,jb>=5的人的zhtrue设置为1
tellraw @a[score_zhtrue_min=1] {"text":"成功使用大召唤术!"} //(条件制约)对zhtrue=1的人显示对应信息
scoreboard players remove @a[score_zhtrue_min=1] jb 5 //(条件制约)将zhtrue=1的人的jb减5
scoreboard players set tptime tptime 200 //(条件制约)tptime设为200(10秒)
tellraw @a[score_zhtrue=0] ["",{"selector":"@a[score_zhtrue_min=1]"},{"text":"花费5金币开启了大召唤术!请在10秒内","color":"green"},{"text":"点击传送","underlined":true,"color":"red","clickEvent":{"action":"run_command","value":"/trigger cs set 1"}},{"text":"到ta身边吧!","color":"green"}]
//(条件制约)对使用者以外的人在聊天框显示传送指令
scoreboard players set @a[score_zh=1,score_zh_min=1] zh 0 //将zh=1的人的zh分数设置为0
【允许触发器可用】
scoreboard players enable @a cs //(循环)启用cs
scoreboard players enable @a zh //(循环)启用zh
触发大召唤术的方法:任何玩家使用命令/trigger zh set 1(可以将命令编入工具书中,玩家点击书中文字触发大召唤术)
注意事项:所有的循环命令方块要设置成“保持开启”,并且所有的连锁命令方块的“条件制约”设定要严格按照上文所述,有几个连锁命令方块要设置成“不受制约”,否则可能无法正常运行。
目前这套装置已经在租赁服测试过可以正常使用。当然如果大家感兴趣的话也可以在自己的租赁服或者局域网做一个,帮忙测试下有没有bug。
9月30号更新:目前已经加入大传送术发起者的“接受/拒绝”功能,详细可以点击本楼层的“下一页”查看
对本文内容有任何建议欢迎回复和指正!
本文为原创内容,转载请注明作者“翔翼之刃”
之前有人提出让发动大召唤术的人有权允许或拒绝被传送者,于是这套改良过的大传送术上线了,感觉比之前的复杂一点……
惯例介绍一下实现的功能,和之前略有不同:
大召唤术:耗费5金币使用(金币不足则提示无法使用),使用后除使用者以外的人在聊天框可以看到召唤信息。
在大召唤术被使用的30秒内,若其他人点击召唤信息,则进入等待队列(若金币<5则提示金币不足)。
召唤者会收到传送请求,并可以选择同意或拒绝传送请求。
对于多人同时发送请求的情况,召唤者需要先处理前一个人的请求,系统才会跳出后一个人的请求。
若召唤者同意请求,则发出传送请求的玩家会被传送到使用者位置,并扣除5金币。
若召唤者拒绝请求,则发出传送请求的玩家不会被传送,不扣除金币。
在一次大召唤术期间,无论请求被同意或拒绝,同一名玩家只能发出一次传送请求。
为避免召唤混乱或重复使用,默认同时仅限1人使用大召唤术。
注:如果大召唤术被使用超过30秒且召唤者有未处理的传送请求(包括由于中途退出游戏而未处理的情况),则传送者点击聊天框命令将只进入等待队列,超时后也不会传送,但也不会扣除金币。
布置如下:
使用的计分板目标:
zh(“召唤”,用于使玩家触发大召唤术,类型为trigger)
cs(“传送”,用于使玩家触发传送请求)
csqq(“传送请求”,用于触发同意或拒绝传送请求的操作,类型为trigger。0:等待处理;1:同意;2:拒绝)
zhtrue(标记正在使用大召唤术的玩家,最多1名,类型为dummy)
cstrue(标记发出传送请求的玩家在等待队列中的状态,类型为dummy。0:不在等待队列;1、在排队中;2、请求在处理中;3、请求处理完毕)
cssign(虚拟玩家专用计分板目标,用于检测是否有玩家在等待请求处理,以及请求是否已发送,类型为dummy。0:无请求需要处理;1:有人在等待请求处理;2:请求已发送)
tptime(计时器,类型为dummy)
jb(金币,服务器内通货,类型为dummy)
前置命令
/scoreboard objectives add zh trigger
/scoreboard objectives add cs trigger
/scoreboard objectives add csqq trigger
/scoreboard objectives add zhtrue dummy
/scoreboard objectives add cstrue dummy
/scoreboard objectives add cssign dummy
/scoreboard objectives add tptime dummy
/scoreboard objectives add jb dummy
/scoreboard players set tptime tptime 0 //初始化tptime
/scoreboard players set cssign cssign 0 //将cssign的cssign设为0(虚拟角色cssign的作用为检测是否有人在等待请求处理)
以下为需要设置的命令方块。格式为一行命令一行//伪代码。
【允许触发器可用】
scoreboard players enable @a cs
//(循环)启用cs
scoreboard players enable @a zh
//启用zh
scoreboard players enable @a csqq
//启用csqq
【使用大召唤术(含条件检测)】
tellraw @a[score_zh=1,score_zh_min=1,score_jb=4] {"text":"金币不足,无法使用大召唤术!"}
//(循环)对zh=1,jb<5的人提示:金币不足,无法使用大召唤术。
scoreboard players test tptime tptime 1 600
//检测tptime是否不为0(即是否有人正在使用大召唤术)
tellraw @a[score_zh=1,score_zh_min=1,score_jb_min=5] {"text":"当前有人正在使用大召唤术,请稍后使用!"}
//(条件制约)对zh=1,jb>=5的人显示信息:当前有人正在使用大召唤术,请稍后使用!
scoreboard players test tptime tptime 0 0
//检测tptime是否为0
scoreboard players set @a zhtrue 0
//(条件制约)将所有人的zhtrue设置为0
scoreboard players set @p[score_zh=1,score_zh_min=1,score_jb_min=5] zhtrue 1
//(条件制约)将zh=1,jb>=5的人的zhtrue设置为1
tellraw @a[score_zhtrue_min=1] {"text":"成功使用大召唤术!"}
//(条件制约)对zhtrue=1的人显示信息:“成功使用大召唤术!”
scoreboard players remove @a[score_zhtrue_min=1] jb 5
//(条件制约)将zhtrue=1的人的jb减5
scoreboard players set tptime tptime 600
//(条件制约)tptime设为600(30秒)
scoreboard players set @a[score_zhtrue=0] cstrue 0
//(条件制约)将除发动者外所有人的cstrue分数设置为0
tellraw @a[score_zhtrue=0] ["",{"selector":"@a[score_zhtrue_min=1]"},{"text":"花费5金币开启了大召唤术!请在30秒内向他ta","color":"green"},{"text":"发送传送请求","underlined":true,"color":"red","clickEvent":{"action":"run_command","value":"/trigger cs set 1"}},{"text":"吧!(成功传送时扣除5金币)","color":"green"}]
//(条件制约)对使用者以外的人(zhtrue=0)在聊天框显示传送指令
scoreboard players set @a[score_zh=1,score_zh_min=1] zh 0
//将zh=1的人的zh分数设置为0
【被传送者进入等待队列】
scoreboard players test tptime tptime 1 600
//(循环)检测tptime是否>=1
tellraw @a[score_cs=1,score_cs_min=1,score_jb=4] {"text":"金币不足,无法传送!"}
//(条件制约)对cs=1,jb<5的人提示:金币不足,无法传送。
tellraw @a[score_cs=1,score_cs_min=1,score_cstrue=1,score_cstrue_min=1] {"text":"你已在队列中,无需重复发送请求"}
//对cs=1,cstrue=1的人提示:已经在等待队列中
tellraw @a[score_cs=1,score_cs_min=1,score_cstrue=2,score_cstrue_min=2] {"text":"请求正在处理中,无需重复发送请求"}
//对cs=1,cstrue=2的人提示:传送请求正在处理中
tellraw @a[score_cs=1,score_cs_min=1,score_cstrue=3,score_cstrue_min=3] {"text":"本次召唤的传送请求已经处理,不可重复发送请求"}
//对cs=1,cstrue=3的人提示:已经发出过请求,不能重复发送
scoreboard players test tptime tptime 1 600
//再次检测tptime是否>=1
tellraw @a[score_cs=1,score_cs_min=1,score_cstrue=0,score_jb_min=5] {"text":"请求已发送,等待对方处理……"}
/(条件制约)对cs=1,cstrue=0,jb>4的人发出信息:“请求已发送,等待对方处理……”
scoreboard players set @a[score_cs=1,score_cs_min=1,score_cstrue=0,score_jb_min=5] cstrue 1
//(条件制约)将cs=1,cstrue=0,jb>4的人加入等待列表(cstrue设为1)
scoreboard players set @a[score_cs_min=1] cs 0
//将cs=1的人的cs分数设置为0
【发送请求处理】
scoreboard players test cssign cssign 0 0
//(循环)检测cssign的cssign是否为0
scoreboard players set @r[score_cstrue=1,score_cstrue_min=1] cstrue 2
//(条件制约)随机挑选一个cstrue=1的玩家,将他的cstrue设为2
scoreboard players set cssign cssign 1
//(条件制约)将cssign的cssign设为1
testfor @a[score_zhtrue_min=1]
//检测zhtrue=1的人是否在线
scoreboard players test cssign cssign 1 1
//(条件制约)检测cssign的cssign是否为1
/tellraw @a[score_zhtrue_min=1] ["",{"selector":"@a[score_cstrue=2,score_cstrue_min=2]","color":"green"},{"text":"向你发出传送请求,是否同意?","color":"green"},{"text":"\n"},{"text":"【同意】","bold":true,"color":"green","clickEvent":{"action":"run_command","value":"/trigger csqq set 1"}},{"text":"【拒绝】","bold":true,"color":"red","clickEvent":{"action":"run_command","value":"/trigger csqq set 2"}}]
//(条件制约)向zhtrue=1的人发出一条传送请求
scoreboard players set cssign cssign 2
//(条件制约)将cssign的cssign设为2
【同意请求】
testfor @a[score_zhtrue_min=1,score_csqq=1,score_csqq_min=1]
//(循环)检测是否有人zhtrue=1,csqq=1(同意请求)
tp @a[score_cstrue=2,score_cstrue_min=2,score_jb_min=5,score_zhtrue=0] @a[score_zhtrue_min=1]
//(条件制约)将cstrue=2,jb>=5,zhtrue=0的人传送到zhtrue=1的人处(若召唤或被传送者不在线,或恰好此时被传送者金币不足,则不传送,无提示信息)
tellraw @a[score_cstrue=2,score_cstrue_min=2,score_jb_min=5] {"text":"传送成功!"}
//(条件制约)对cstrue=2,jb>=5的人显示信息:“传送成功!”
scoreboard players remove @a[score_cstrue=2,score_cstrue_min=2,score_jb_min=5] jb 5
//(条件制约)将cstrue=2,jb>=5的人的jb减5
scoreboard players set @a[score_cstrue=2,score_cstrue_min=2] cstrue 3
//(条件制约)将cstrue=2的玩家的cstrue设为3
scoreboard players set cssign cssign 0
//(条件制约)将cssign的cssign设为0
scoreboard players set @a[score_zhtrue_min=1] csqq 0
//(条件制约)将zhtrue=1的人的csqq设为0
【拒绝请求】
testfor @a[score_zhtrue_min=1,score_csqq=2,score_csqq_min=2]
//(循环)检测是否有人zhtrue=1,csqq=2(拒绝请求)
tellraw @a[score_cstrue=2,score_cstrue_min=2] {"text":"对方拒绝了你的传送请求,并向你丢出了一只猹。"}
//(条件制约)对cstrue=2的玩家发送拒绝消息
scoreboard players set @a[score_cstrue=2,score_cstrue_min=2] cstrue 3
//(条件制约)将cstrue=2的玩家的cstrue设为3
scoreboard players set cssign cssign 0
//(条件制约)将cssign的cssign设为0
scoreboard players set @a[score_zhtrue_min=1] csqq 0
//(条件制约)将zhtrue=1的人的csqq设为0
【计时器(tptime)】
scoreboard players test tptime tptime 1 600
//(循环)检测tptime是否>=1
scoreboard players remove tptime tptime 1
//(条件制约)tptime减1
scoreboard players test tptime tptime 0 0
//检测tptime是否为0
scoreboard players reset * zhtrue
//(条件制约)重置所有人的zhtrue
scoreboard players reset * cstrue
//(条件制约)重置所有人的cstrue
scoreboard players reset * csqq
//(条件制约)重置所有人的csqq
scoreboard players set cssign cssign 0
//(条件制约)将cssign的cssign设为0
以上是全部命令方块。
再次说明一下触发大召唤术的方法:任何玩家使用命令/trigger zh set 1(可以将命令编入工具书中,玩家点击书中文字触发大召唤术)
注意事项:所有的循环命令方块要设置成“保持开启”,并且所有的连锁命令方块的“条件制约”设定要严格按照上文所述,有几个连锁命令方块要设置成“不受制约”,否则可能无法正常运行。
这套装置在租赁服初步测试过,可以正常使用。这里仍旧希望大家有兴趣的话也做一个,帮忙测试下有没有bug。
目前已知bug:对已经处理过的请求再次点击历史记录中的同意/拒绝时,实际处理的是新的请求。(不过应该不太影响使用