在我的世界服务器实现有偿召唤其他玩家的功能

联机侠
在我的世界服务器实现有偿召唤其他玩家的功能

先介绍一下要实现的功能:

大召唤术:耗费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:对已经处理过的请求再次点击历史记录中的同意/拒绝时,实际处理的是新的请求。(不过应该不太影响使用

联机侠

发表评论

您必须 登录 才能发表留言!