请选择 进入手机版 | 继续访问电脑版
查看: 3324|回复: 42

[命令方块] 在服务器实现“有偿”召唤其他玩家的功能

[复制链接]

27

主题

684

帖子

468

积分

Lv.5 农牧专家

UID
42139
小麦
262
金锭
1470
下界之星
0

问答斯基的方向盘

发表于 2017-9-29 12:02:17 | 显示全部楼层 |阅读模式
起因是这个帖子:
https://mc.netease.com/thread-66621-1-1.html
原楼主@老西医 提出想实现“大召唤术”的概念,于是研究了一会把成品做出来了。在这里分享给大家。
如果有开租赁服服的朋友想要实现类似功能的可以参考一下。

先介绍一下要实现的功能:
大召唤术:耗费5金币使用(金币为游戏内管理员自行设定的通货,金币不足则提示无法使用)
使用后除使用者以外的人在聊天框可以看到召唤信息。
在大召唤术被使用的10秒内,若其他人点击召唤信息则会被传送到使用者位置,并扣除5金币(若金币<5则提示金币不足并取消传送)
这里为了避免召唤混乱或重复使用,限定当大召唤术触发期间任何人不能重复使用大召唤术。
另外,如果大召唤术被使用超过10秒,或使用者中途退出游戏,则传送者点击聊天框命令将无任何提示,且不会传送,但也不会扣除金币。

布置如图(也可以考虑做成竖向的):
2017-09-28_20.26.43.png
2017-09-28_19.23.55.png
2017-09-28_19.24.04.png

使用的计分板目标:
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号更新:目前已经加入大传送术发起者的“接受/拒绝”功能,详细可以点击本楼层的“下一页”查看
对本文内容有任何建议欢迎回复和指正!

本文为原创内容,转载请注明作者“翔翼之刃”


评分

参与人数 8 小麦 +9 金锭 +42 收起 理由
MCSugar_cane + 1 + 3 支持原创
白酒 + 1 + 10 优秀作品
红石”凶“ + 1 大佬好厉害,当年玩服务器的时候也有这个,.
我是小辉XH + 1 乐于助人
老西医 + 1 + 2 优秀作品
会飞的面包 + 3 + 15 优秀作品
砖头 + 2 6666
DHK + 10 咦?CBL?我也在研究同一装置呢,观摩观摩

查看全部评分

SINCE WHEN WERE YOU THE ONE IN CONTROL?
-------------------------------------------------------------
有关原版游戏基础知识及命令方块的问题,可以发帖后私信我,我会尽力回答。
如果我的回答对你有帮助,可以点击楼层右下角的评分,给我+1小麦的奖励(不会扣除自身小麦)。

3

主题

180

帖子

455

积分

Lv.5 农牧专家

UID
3302
小麦
401
金锭
1339
下界之星
0
发表于 2017-9-29 12:44:39 | 显示全部楼层
本帖最后由 DHK 于 2017-9-29 12:49 编辑

哦,我明白了,你的思路是:
A玩家发起召唤,B玩家响应后,就把B玩家传送到A玩家处,对吧

有没有办法做到B玩家发起申请,A玩家同意后,就把B玩家传送到A玩家的方法

我这里有一张群里不知道谁发的图,是不是你这个系统
QQ图片20170929124749.png
会红石,但只会一点点;
会指令,但只会一点点;
会卖萌,但是我大胖子。

27

主题

684

帖子

468

积分

Lv.5 农牧专家

UID
42139
小麦
262
金锭
1470
下界之星
0

问答斯基的方向盘

 楼主| 发表于 2017-9-29 12:54:47 | 显示全部楼层
本帖最后由 翔翼之刃 于 2017-9-29 12:56 编辑
DHK 发表于 2017-9-29 12:44
哦,我明白了,你的思路是:
A玩家发起召唤,B玩家响应后,就把B玩家传送到A玩家处,对吧

关于同意和拒绝传送的部分目前还没有做出来,大致思路是先给每个玩家一个编号,用于区分玩家,传送时将编号临时赋值到某个计分板目标,如果对方同意传送则将对应编号的玩家传送过去。这部分我有时间会继续补充的。
另外这个系统还可以进一步优化成允许多人同时开启大传送术,只要做好发起者的区分就行。
哇原来早就有人已经做出来啦好难过

SINCE WHEN WERE YOU THE ONE IN CONTROL?
-------------------------------------------------------------
有关原版游戏基础知识及命令方块的问题,可以发帖后私信我,我会尽力回答。
如果我的回答对你有帮助,可以点击楼层右下角的评分,给我+1小麦的奖励(不会扣除自身小麦)。

3

主题

180

帖子

455

积分

Lv.5 农牧专家

UID
3302
小麦
401
金锭
1339
下界之星
0
发表于 2017-9-29 13:03:37 | 显示全部楼层
翔翼之刃 发表于 2017-9-29 12:54
关于同意和拒绝传送的部分目前还没有做出来,大致思路是先给每个玩家一个编号,用于区分玩家,传送时将编 ...

所以图片上是不是你做的...
还有玩家编号、赋值已经困扰我很久了,大佬给个思路呗
会红石,但只会一点点;
会指令,但只会一点点;
会卖萌,但是我大胖子。

16

主题

76

帖子

36

积分

Lv.2 石器学徒

UID
114693
小麦
0
金锭
124
下界之星
0
发表于 2017-9-29 13:10:06 | 显示全部楼层
本帖最后由 老西医 于 2017-9-29 13:14 编辑
翔翼之刃 发表于 2017-9-29 12:54
关于同意和拒绝传送的部分目前还没有做出来,大致思路是先给每个玩家一个编号,用于区分玩家,传送时将编 ...

更正:这个想法是面团想出来的
额楼上那个图貌似就是我发的····同意的话好像只针对第一个点击的被传送人,并且没有金币不足的提示

最开始的想法是:10秒后,显示点过传送的玩家名,点击玩家名(相当于同意),把该玩家传送过来- -

有人和我一起做服务器么?

43

主题

360

帖子

590

积分

Lv.6 附魔大师

UID
1245
小麦
456
金锭
1852
下界之星
0
发表于 2017-9-29 13:18:46 来自手机 | 显示全部楼层
玩家编号可以每个玩家第一次进游戏的时候有个记分板目标自增1赋予这个玩家。
需要被传送者同意这个操作已经可以实现了,就是发起传送请求比较麻烦,需要敲指令,类似于:“/trigger tpreq set 玩家编号”。

27

主题

684

帖子

468

积分

Lv.5 农牧专家

UID
42139
小麦
262
金锭
1470
下界之星
0

问答斯基的方向盘

 楼主| 发表于 2017-9-29 13:22:09 | 显示全部楼层
本帖最后由 翔翼之刃 于 2017-9-30 11:53 编辑
DHK 发表于 2017-9-29 13:03
所以图片上是不是你做的...
还有玩家编号、赋值已经困扰我很久了,大佬给个思路呗

你那个图片里的不是我做的啦……我这贴的内容都是自己做的
这部分我最近有时间会补充的,关于玩家编号大致思路还是写一下吧
设置一个名称为id,类型为dummy的计分板目标
给一个名为“编号”的虚拟玩家赋值id为1
玩家首次进入服务器的时候,将当前的id直接赋值给该玩家,然后将“编号”的id加1
当然这个“首次进入服务器”要单独做判定条件,这个应该比较简单。
SINCE WHEN WERE YOU THE ONE IN CONTROL?
-------------------------------------------------------------
有关原版游戏基础知识及命令方块的问题,可以发帖后私信我,我会尽力回答。
如果我的回答对你有帮助,可以点击楼层右下角的评分,给我+1小麦的奖励(不会扣除自身小麦)。

27

主题

684

帖子

468

积分

Lv.5 农牧专家

UID
42139
小麦
262
金锭
1470
下界之星
0

问答斯基的方向盘

 楼主| 发表于 2017-9-29 13:24:45 | 显示全部楼层
aiwdsj 发表于 2017-9-29 13:18
玩家编号可以每个玩家第一次进游戏的时候有个记分板目标自增1赋予这个玩家。
需要被传送者同意这个操作已经 ...

我有空会想一下怎么做成由系统判定,不用手动敲指令。
主要是如果允许自己敲编号的话会比较混乱。
SINCE WHEN WERE YOU THE ONE IN CONTROL?
-------------------------------------------------------------
有关原版游戏基础知识及命令方块的问题,可以发帖后私信我,我会尽力回答。
如果我的回答对你有帮助,可以点击楼层右下角的评分,给我+1小麦的奖励(不会扣除自身小麦)。

43

主题

360

帖子

590

积分

Lv.6 附魔大师

UID
1245
小麦
456
金锭
1852
下界之星
0
发表于 2017-9-29 13:30:44 来自手机 | 显示全部楼层
翔翼之刃 发表于 2017-9-29 13:24
我有空会想一下怎么做成由系统判定,不用手动敲指令。
主要是如果允许自己敲编号的话会比较混乱。

我现在想法是指令书,点击后对传送请求者 展现所有在线人名,点击某个人名即向其发送传送请求。不过还没实现。。。

27

主题

684

帖子

468

积分

Lv.5 农牧专家

UID
42139
小麦
262
金锭
1470
下界之星
0

问答斯基的方向盘

 楼主| 发表于 2017-9-29 13:32:13 | 显示全部楼层
aiwdsj 发表于 2017-9-29 13:30
我现在想法是指令书,点击后对传送请求者 展现所有在线人名,点击某个人名即向其发送传送请求。不过还没 ...

这个是单人对单人发起传送请求吧?感觉是不错的想法,应该是可以实现的,我有空也想想看~
SINCE WHEN WERE YOU THE ONE IN CONTROL?
-------------------------------------------------------------
有关原版游戏基础知识及命令方块的问题,可以发帖后私信我,我会尽力回答。
如果我的回答对你有帮助,可以点击楼层右下角的评分,给我+1小麦的奖励(不会扣除自身小麦)。

3

主题

180

帖子

455

积分

Lv.5 农牧专家

UID
3302
小麦
401
金锭
1339
下界之星
0
发表于 2017-9-29 14:05:53 | 显示全部楼层
aiwdsj 发表于 2017-9-29 13:30
我现在想法是指令书,点击后对传送请求者 展现所有在线人名,点击某个人名即向其发送传送请求。不过还没 ...

就是这个问题,我想了很久不知道怎么实现,无从下手
会红石,但只会一点点;
会指令,但只会一点点;
会卖萌,但是我大胖子。

3

主题

180

帖子

455

积分

Lv.5 农牧专家

UID
3302
小麦
401
金锭
1339
下界之星
0
发表于 2017-9-29 14:12:51 | 显示全部楼层
翔翼之刃 发表于 2017-9-29 13:22
那个不是我做的啦……
这部分我最近有时间会补充的,关于玩家编号大致思路还是写一下吧
设置一个名称为 ...

可是这样编号的话传送部分该怎么办,传送要指定编号吧。玩家越来越多,编号越来越大,怎么指定。
会红石,但只会一点点;
会指令,但只会一点点;
会卖萌,但是我大胖子。

101

主题

3659

帖子

1097

积分

管理员

会玩不熊听指挥

UID
11683
小麦
71
金锭
1446
下界之星
0

内测精英勋章

发表于 2017-9-29 15:43:31 | 显示全部楼层
不好意思,走错房间了,你们聊

27

主题

684

帖子

468

积分

Lv.5 农牧专家

UID
42139
小麦
262
金锭
1470
下界之星
0

问答斯基的方向盘

 楼主| 发表于 2017-9-30 11:56:01 | 显示全部楼层
DHK 发表于 2017-9-29 14:12
可是这样编号的话传送部分该怎么办,传送要指定编号吧。玩家越来越多,编号越来越大,怎么指定。

编号可以直接用scoreboard从一个计分对象的的某个计分板目标赋值到另一个,这样就可以实现指定目标了。
不过我现在这套系统避开这个问题了,我用了另外一种方法实现了对所有请求传送的玩家的接受/拒绝功能了。更新在这贴里了,有空的话看一下~
SINCE WHEN WERE YOU THE ONE IN CONTROL?
-------------------------------------------------------------
有关原版游戏基础知识及命令方块的问题,可以发帖后私信我,我会尽力回答。
如果我的回答对你有帮助,可以点击楼层右下角的评分,给我+1小麦的奖励(不会扣除自身小麦)。

1

主题

48

帖子

13

积分

Lv.1 新手木匠

UID
651758
小麦
0
金锭
11
下界之星
0
发表于 2017-10-1 08:39:57 | 显示全部楼层
23333
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部