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

[命令方块] 【流动UID分配器】 原版指令+ooc

[复制链接]

21

主题

96

帖子

74

积分

Lv.3 矿物能手

UID
16359
小麦
28
金锭
278
下界之星
0
发表于 2017-10-12 14:59:33 | 显示全部楼层 |阅读模式
我又双叒叕回来了......

这次给大家带来的是uid分配器
很多人不知道uid是个什么东西。简单来说uid就是玩家的编号,可以应用在许多方面。(比如局域网里快速t人,小游戏中等等等)

之前很多人做过固定的uid,就和论坛的uid一样,每个人一个不变的编号。那我要说的流动uid是个什么鬼呢...当然是流动的编号啦
固定的uid会排到几千几万,但是流动uid会根据游戏内人数调整,游戏里有10个人 那这10个人就是1到10号,100个人就是1到100号。
做这个东西的原因是有些复杂小游戏制作玩家的需要......

那么固定uid的原理很简单,就是给一个实体一分,进来一个玩家加一分......这样所有的玩家都有一个固定的分数。
那么流动uid要解决的难点在于,如果有十个玩家是1到10分,然后5分的玩家退出了,又新进来一个玩家,该给新进来的多少分呢?

于是作者想了一个聪(tou)明(lan)的办法,那就是...每次新加入玩家就重新从1排一次!(有更好的办法请各位看官指教...)
那么问题就到了怎么检测有玩家加入了。玩家的加入会引起人数的变化,而人数是可以通过某些办法转化成积分的。所以总体思路就出来了:检测到人数增加,然后分配uid

下面给出指令教程:
首先创建几个计分板:
  1. /scoreboard objectives add rs dummy
复制代码
  1. /scoreboard objectives add uid dummy
复制代码
然后召唤几个盔甲架用来寄存分数
  1. /summon ArmorStand ~ ~ ~ {CustomName:"uid",CustomNameVisible:1b,NoGravity:0,Invisible:1}
复制代码
  1. /summon ArmorStand ~ ~ ~ {CustomName:"rs1",CustomNameVisible:1b,NoGravity:0,Invisible:1}
复制代码
  1. /summon ArmorStand ~ ~ ~ {CustomName:"rs2",CustomNameVisible:1b,NoGravity:0,Invisible:1}
复制代码
  1. /summon ArmorStand ~ ~ ~ {CustomName:"rs3",CustomNameVisible:1b,NoGravity:0,Invisible:1}
复制代码
下面就开始计算部分了,时序从前到后为准(以下指令全部高频【循环+连锁】)
  1. execute [url=home.php?mod=space&uid=311230]@A[/url] ~ ~ ~ /scoreboard players add @e[name=rs1,type=ArmorStand] rs 1
复制代码
此指令可以快速得出玩家数量,并存到rs1上
  1. scoreboard players operation @e[type=ArmorStand,name=rs3] rs = @e[type=ArmorStand,name=rs1] rs
复制代码
  1. scoreboard players operation @e[type=ArmorStand,name=rs3] rs -= @e[type=ArmorStand,name=rs2] rs
复制代码
  1. scoreboard players operation @e[type=ArmorStand,name=rs2] rs = @e[type=ArmorStand,name=rs1] rs
复制代码
  1. scoreboard players set @e[name=rs1,type=ArmorStand] rs 0
复制代码
这四条指令的功能是,在每次执行中,会把此次执行探测到的人数和上一次执行时探测到的人数相减,若人数大于等于1,则说明人数增加了。
之后探测到人数变化后用下列两条指令给uid归零

  1. execute @e[name=rs3,score_rs_min=1] ~ ~ ~ /scoreboard players set @a uid 0
复制代码
  1. execute @e[name=rs3,score_rs_min=1] ~ ~ ~ /scoreboard players set @e[type=ArmorStand,name=uid] uid 0
复制代码
时序部分结束
然后再吧uid盔甲架上的分数依次加到玩家上(每执行一次就会自动加一)

  1. scoreboard players add @e[type=ArmorStand,name=uid,score_uid=499] uid 1
复制代码
  1. scoreboard players operation @a[score_uid=0,c=1] uid = @e[type=ArmorStand,name=uid] uid
复制代码
到此uid分配器就做完啦!!!
因为1.8版本的指令玩家可能对时序有点问题,特给出1.8版本ooc(手工制作)

  1. /summon MinecartCommandBlock ~ ~1 ~ {Command:kill @e[type=MinecartCommandBlock,r=1],Riding:{id:MinecartCommandBlock,Command:setblock ~ ~-1 ~-1 redstone_block,Riding:{id:MinecartCommandBlock,Command:setblock ~ ~ ~-1 command_block 0 replace {Command:fill ~ ~-3 ~ ~ ~ ~1 air},Riding:{id:MinecartCommandBlock,Command:"/tellraw @p ["",{"text":"\\n\n\n\n\n\n\n\\n\\                  无限人数流动UID分配模组\n","color":"aqua","bold":"true"},{"text":"\\n-----------------------------------\n  此模组无制作软件\n-----------------------------------                       \n功能:自动把玩家从一号开始依次排序,并始终保持序号尽量小","color":"aqua","bold":"false"},{"text":"\\n\n                                 QQ:751201787","clickEvent":{"action":"open_url","value":"751201787"},"color":"yellow","bold":"false"},{"text":"\\n                               QQ群 538478518","color":"yellow"}]",Riding:{id:MinecartCommandBlock,Command:"/scoreboard objectives setdisplay list uid ",Riding:{id:MinecartCommandBlock,Command:"/scoreboard objectives add rs dummy",Riding:{id:MinecartCommandBlock,Command:"/scoreboard objectives add uid dummy ",Riding:{id:MinecartCommandBlock,Command:" summon ArmorStand ~ ~ ~ {CustomName:"uid",CustomNameVisible:1b,NoBasePlate:1,NoGravity:1,Invisible:1} ",Riding:{id:MinecartCommandBlock,Command:" summon ArmorStand ~ ~ ~ {CustomName:"rs1",CustomNameVisible:1b,NoBasePlate:1,NoGravity:1,Invisible:1} ",Riding:{id:MinecartCommandBlock,Command:" summon ArmorStand ~ ~ ~ {CustomName:"rs2",CustomNameVisible:1b,NoBasePlate:1,NoGravity:1,Invisible:1} ",Riding:{id:MinecartCommandBlock,Command:"summon ArmorStand ~ ~ ~ {CustomName:"rs3",CustomNameVisible:1b,NoBasePlate:1,NoGravity:1,Invisible:1}",Riding:{id:MinecartCommandBlock,Command:blockdata ~-1 ~-2 ~3 {Command:fill ~1 ~ ~ ~1 ~ ~7 air},Riding:{id:MinecartCommandBlock,Command:blockdata ~1 ~-2 ~3 {Command:fill ~-1 ~ ~ ~-1 ~ ~7 redstone_block},Riding:{id:MinecartCommandBlock,Command:blockdata ~1 ~-2 ~4 {Command:"execute @a ~ ~ ~ /scoreboard players add @e[name=rs1,type=ArmorStand] rs 1 "},Riding:{id:MinecartCommandBlock,Command:blockdata ~1 ~-2 ~5 {Command:"scoreboard players operation @e[type=ArmorStand,name=rs3] rs = @e[type=ArmorStand,name=rs1] rs"},Riding:{id:MinecartCommandBlock,Command:blockdata ~1 ~-2 ~6 {Command:"scoreboard players operation @e[type=ArmorStand,name=rs3] rs -= @e[type=ArmorStand,name=rs2] rs"},Riding:{id:MinecartCommandBlock,Command:blockdata ~1 ~-2 ~7 {Command:"scoreboard players operation @e[type=ArmorStand,name=rs2] rs = @e[type=ArmorStand,name=rs1] rs"},Riding:{id:MinecartCommandBlock,Command:blockdata ~1 ~-2 ~8 {Command:"scoreboard players set @e[name=rs1,type=ArmorStand] rs 0"},Riding:{id:MinecartCommandBlock,Command:blockdata ~1 ~-2 ~9 {Command:"execute @e[name=rs3,score_rs_min=1] ~ ~ ~ /scoreboard players set @a uid 0 "},Riding:{id:MinecartCommandBlock,Command:blockdata ~1 ~-2 ~10 {Command:"execute @e[name=rs3,score_rs_min=1] ~ ~ ~ /scoreboard players set @e[type=ArmorStand,name=uid] uid 0"},Riding:{id:MinecartCommandBlock,Command:blockdata ~-1 ~-2 ~4 {Command:"scoreboard players add @e[type=ArmorStand,name=uid,score_uid=499] uid 1 "},Riding:{id:MinecartCommandBlock,Command:blockdata ~-1 ~-2 ~5 {Command:"scoreboard players operation @a[score_uid=0,c=1] uid = @e[type=ArmorStand,name=uid] uid "},Riding:{id:MinecartCommandBlock,Command:fill ~ ~-1 ~2 ~ ~-1 ~11 glowstone 0,Riding:{id:MinecartCommandBlock,Command:setblock ~ ~-2 ~3 redstone_block,Riding:{id:MinecartCommandBlock,Command:fill ~-1 ~-2 ~3 ~-1 ~-2 ~5 command_block,Riding:{id:MinecartCommandBlock,Command:fill ~1 ~-2 ~3 ~1 ~-2 ~10 command_block,Riding:{id:MinecartCommandBlock,Command:setblock ~ ~-3 ~1 wall_sign 1 replace {Text2:"{text:\\"删除模组\\",color:dark_red,italic:true,bold:true}",Text3:"{text:\\"慎点!!\\",color:dark_red,italic:true,bold:true,clickEvent:{action:\\"run_command\\",value:\\"kill @e[type=ArmorStand,r=10]\\"}}",Text4:"{text:\\"\\",clickEvent:{action:\\"run_command\\",value:\\"fill ~2 ~ ~-1 ~-2 ~2 ~11 air 0 replace\\"}}"},Riding:{id:MinecartCommandBlock,Command:setblock ~ ~-2 ~1 wall_sign 1 replace {Text2:"{text:\\"重新分配uid\\",color:dark_blue,italic:true,bold:true}",Text3:"{text:\\"按TAB查看uid \\",color:dark_blue,italic:true,bold:true}",Text4:"{text:\\"\\",clickEvent:{action:\\"run_command\\",value:\\" /scoreboard players set @e[name=rs3,type=ArmorStand] rs 1 \\"}}"},Riding:{id:MinecartCommandBlock,Command:setblock ~ ~-1 ~1 wall_sign 1 replace {Text2:"{text:\\"流动UID模组\\",color:dark_green,italic:true,bold:true}",Text3:"{text:\\"By 汤圆\\",color:dark_green,italic:true,bold:true}",Text4:"{text:\\"\\",clickEvent:{action:\\"run_command\\",value:\\"\\"}}"},Riding:{id:MinecartCommandBlock,Command:fill ~2 ~-3 ~2 ~-2 ~-1 ~11 glass 0 hollow,Riding:{id:MinecartCommandBlock,Command:gamerule commandBlockOutput false,Riding:{id:MinecartCommandBlock,Riding:{id:FallingSand,Block:activator_rail,Time:1,Riding:{id:FallingSand,Block:redstone_block,Time:1,Riding:{id:FallingSand,Block:stone,Time:1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
复制代码


评分

参与人数 1 金锭 +1 收起 理由
Hehe_dada + 1 支持原创

查看全部评分

3

主题

180

帖子

455

积分

Lv.5 农牧专家

UID
3302
小麦
401
金锭
1339
下界之星
0
发表于 2017-10-12 15:26:26 | 显示全部楼层
好吧,当初那个TP系统自动排序的问题似乎解决了呢 @翔翼之刃
会红石,但只会一点点;
会指令,但只会一点点;
会卖萌,但是我大胖子。

0

主题

48

帖子

14

积分

Lv.1 新手木匠

UID
16552
小麦
0
金锭
87
下界之星
0
发表于 2017-10-12 20:12:29 | 显示全部楼层
很好啊

33

主题

371

帖子

226

积分

Lv.5 农牧专家

UID
15824
小麦
97
金锭
934
下界之星
0

内测精英勋章

发表于 2017-10-12 22:57:56 | 显示全部楼层
如果一个玩家退出呢= =?

21

主题

96

帖子

74

积分

Lv.3 矿物能手

UID
16359
小麦
28
金锭
278
下界之星
0
 楼主| 发表于 2017-10-12 22:58:40 来自手机 | 显示全部楼层
what_name 发表于 2017-10-12 22:57
如果一个玩家退出呢= =?

2333不会重新分配,因为退出不会造成分数重复情况

27

主题

684

帖子

468

积分

Lv.5 农牧专家

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

问答斯基的方向盘

发表于 2017-10-12 23:31:59 | 显示全部楼层
本帖最后由 翔翼之刃 于 2017-10-12 23:35 编辑
DHK 发表于 2017-10-12 15:26
好吧,当初那个TP系统自动排序的问题似乎解决了呢 @翔翼之刃

嗯,这是个不错的系统,用来给玩家分配独立id很方便。
实际应用中可能还有一些问题要考虑怎么解决。比如,如果我用某几个玩家的id赋值到不同的盔甲架上,如何同时让这些玩家指定与玩家相同id的盔甲架进行操作?又比如点对点tp系统,tellraw中的点击命令似乎不能以记分板分数作为参数加入命令,这样的话就只能手动输入trigger命令set id了。不过这些都是mc本身程序的问题,这个系统是个很好的系统。
SINCE WHEN WERE YOU THE ONE IN CONTROL?
-------------------------------------------------------------
有关原版游戏基础知识及命令方块的问题,可以发帖后私信我,我会尽力回答。
如果我的回答对你有帮助,可以点击楼层右下角的评分,给我+1小麦的奖励(不会扣除自身小麦)。

21

主题

96

帖子

74

积分

Lv.3 矿物能手

UID
16359
小麦
28
金锭
278
下界之星
0
 楼主| 发表于 2017-10-12 23:48:11 来自手机 | 显示全部楼层
翔翼之刃 发表于 2017-10-12 23:31
嗯,这是个不错的系统,用来给玩家分配独立id很方便。
实际应用中可能还有一些问题要考虑怎么解决。比如 ...

点对点的话,能想到的大概是 再另一个积分板上先同步分数再把所有玩家的分数与要执行盔甲架的分数相减,得到一个分数等于0的盔甲架,再把这个盔甲架与所有玩家相减,得到分数等于0的玩家。最后0分玩家对0分盔甲架就好了

21

主题

96

帖子

74

积分

Lv.3 矿物能手

UID
16359
小麦
28
金锭
278
下界之星
0
 楼主| 发表于 2017-10-12 23:50:21 来自手机 | 显示全部楼层
翔翼之刃 发表于 2017-10-12 23:31
嗯,这是个不错的系统,用来给玩家分配独立id很方便。
实际应用中可能还有一些问题要考虑怎么解决。比如 ...

我想起来我有一个点对点的tp到扔出的鱼钩处就是这么做的,明天再发一贴

27

主题

684

帖子

468

积分

Lv.5 农牧专家

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

问答斯基的方向盘

发表于 2017-10-12 23:58:37 | 显示全部楼层
Msure 发表于 2017-10-12 23:50
我想起来我有一个点对点的tp到扔出的鱼钩处就是这么做的,明天再发一贴

玩家间相互定位和定点传送是可以实现的,但我是希望用tellraw命令在玩家的聊天框显示昵称,点击即可进行相关操作,但由于记分板记录的id不能直接添加进命令,实现起来感觉有难度。另外我设想的点对点传送是要经过对方同意的,如果多个玩家向不同目标发出传送邀请,如何处理冲突?
SINCE WHEN WERE YOU THE ONE IN CONTROL?
-------------------------------------------------------------
有关原版游戏基础知识及命令方块的问题,可以发帖后私信我,我会尽力回答。
如果我的回答对你有帮助,可以点击楼层右下角的评分,给我+1小麦的奖励(不会扣除自身小麦)。

21

主题

96

帖子

74

积分

Lv.3 矿物能手

UID
16359
小麦
28
金锭
278
下界之星
0
 楼主| 发表于 2017-10-13 00:02:21 来自手机 | 显示全部楼层
翔翼之刃 发表于 2017-10-12 23:58
玩家间相互定位和定点传送是可以实现的,但我是希望用tellraw命令在玩家的聊天框显示昵称,点击即可进行 ...

哈这我就不会了,需要各位大触进一步探究吧

27

主题

684

帖子

468

积分

Lv.5 农牧专家

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

问答斯基的方向盘

发表于 2017-10-13 00:11:15 | 显示全部楼层
Msure 发表于 2017-10-13 00:02
哈这我就不会了,需要各位大触进一步探究吧

方法应该是存在的,我相信以你的实力也是可以想到方法的~有了新思路咱们可以继续讨论讨论
SINCE WHEN WERE YOU THE ONE IN CONTROL?
-------------------------------------------------------------
有关原版游戏基础知识及命令方块的问题,可以发帖后私信我,我会尽力回答。
如果我的回答对你有帮助,可以点击楼层右下角的评分,给我+1小麦的奖励(不会扣除自身小麦)。

15

主题

182

帖子

88

积分

Lv.3 矿物能手

UID
118065
小麦
26
金锭
327
下界之星
0
发表于 2017-10-13 18:27:33 | 显示全部楼层
嘿嘿想法是不错,但我并没有明白用这个东西有何用,因为只是给玩家排个序而已,我觉得并没有什么实际的用处啊

点评

恩..其实一般我也想不到有什么用....但是某做小游戏的玩家说他需要这个.我就做了一下。 还有一个用途就是在一些局域网里t彩名玩家  发表于 2017-10-13 19:22
666

1

主题

34

帖子

12

积分

Lv.1 新手木匠

UID
153756
小麦
2
金锭
130
下界之星
0
发表于 2017-10-22 09:50:28 | 显示全部楼层
仔细想想,
在1.12下
好像不用这么麻烦
就是说进来新玩家就给它一个编号嘛
首先,必须是新玩家,再然后,编号不受当前玩家数量影响

那就给tag=!XWJ的玩家的x积分板加分
然后给负责记录编号的盔甲架加1分
然后将玩家的编号=记录下来的编号
最后给玩家加上tag XWJ 并清零x

这样既记录编号也不会有什么太大的问题
只是提出个概念awa轻喷

点评

emm其实这样做就是一个固定uid分配器了,序号会随着玩家增加而增加,相当于所有玩家都有了属于自己的永久编号。我这个系统解决的是每次玩家退出再进入游戏都会获得新编号,即只把在游戏中的玩家从1到大排列  发表于 2017-10-22 14:48

21

主题

96

帖子

74

积分

Lv.3 矿物能手

UID
16359
小麦
28
金锭
278
下界之星
0
 楼主| 发表于 2017-10-22 14:42:44 来自手机 | 显示全部楼层
jim~命令傀儡师 发表于 2017-10-22 09:50
仔细想想,
在1.12下
好像不用这么麻烦

emm其实你这样就是固定UID了,玩家的序号会随着玩家的增多不断变大。我这个解决的就是只把在线的玩家从1开始排序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部