Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

查看: 1407|回复: 13

[教程] 【CBL】检测玩家是否为正版

[复制链接]
SPGoding 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
17280
钻石
性别
保密
注册时间
2018-1-18
查看详细资料
发表于 2018-12-8 23:49:48 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 SPGoding 于 2018-12-9 10:45 编辑

群里讨论的时候乙烯 dalao 出了个有趣的小问题,即用命令检测玩家是否为正版。经过一阵测试发现利用 1.14 战利品表的 minecraft:fill_player_head 函数,可以检测玩家是否为正版(正版玩家获取到的头颅拥有 SkullOwner.Properties 复合标签)。有关新版战利品表的内容可以参考此教程:http://www.mcbbs.net/thread-831542-1-2.html

由于该函数只能在 minecraft:entity 类型的战利品表中使用,为了能在不依赖其他实体的情况下执行此战利品表,我们直接修改玩家的战利品表(即 minecraft:player)。为了避免玩家正常死亡执行此战利品表,我们可以加一个 minecraft:entity_properties 的条件验证,限制只有在玩家有某个 tag 的时候才给予头颅 。

于是,minecraft:player 战利品表被写成了这样:
  1. {
  2.     "type": "minecraft:entity",
  3.     "pools": [
  4.         {
  5.             "rolls": 1,
  6.             "entries": [
  7.                 {
  8.                     "type": "minecraft:item",
  9.                     "name": "minecraft:player_head",
  10.                     "functions": [
  11.                         {
  12.                             "function": "minecraft:fill_player_head",
  13.                             "entity": "this"
  14.                         },
  15.                         {
  16.                             "function": "minecraft:set_nbt",
  17.                             "tag": "{isTester:1b}"
  18.                         }
  19.                     ],
  20.                     "conditions": [
  21.                         {
  22.                             "condition": "minecraft:entity_properties",
  23.                             "entity": "this",
  24.                             "predicate": {
  25.                                 "nbt": "{Tags:["fill_player_head"]}"
  26.                             }
  27.                         }
  28.                     ]
  29.                 }
  30.             ]
  31.         }
  32.     ]
  33. }
复制代码


然后,编写一个命令函数,使玩家调用这个战利品表。之所以使用 loot spawn 是因为 loot give 和 loot replace 在玩家背包已满的时候都不能正常工作(感谢@ruhuasiyu 提醒)。调用以后检测获取到的头颅是否有 SkullOwner.Properties 复合标签。
  1. # spgoding:foo
  2. tag @s add fill_player_head
  3. loot spawn ~ ~ ~ kill @s
  4. execute if entity @e[distance=..1,nbt={Item:{tag:{isTester:1b,SkullOwner:{Properties:{}}}}}] run me 是正版玩家
  5. execute unless entity @e[distance=..1,nbt={Item:{tag:{isTester:1b,SkullOwner:{Properties:{}}}}}] run me 是盗版玩家
  6. kill @e[distance=..1,type=minecraft:item,nbt={Item:{tag:{isTester:1b}}}]
  7. tag @s remove fill_player_head
复制代码


接下来,只要 execute as @a at @s run /function spgoding:foo,玩家便会说出自己是正版还是盗版【
(图里因为命令方块的位置肯定是被加载的,就没加 at @s)

原理:玩家头颅的 SkullOwner.Properties 属性用于存储玩家皮肤的 URL 和一些其他信息(详见 https://wiki.vg/Mojang_API)。获取玩家头颅时,Minecraft 会根据玩家的 UUID 向服务器请求这些数据。正版玩家的 UUID 是真实存在的,能够成功获取数据,因此得到的头颅会拥有 SkullOwner.Properties。而盗版玩家的 UUID 通常是启动器随机生成的,通常不存在,所以没有 SkullOwner.Properties。之所以说通常,是因为这个事情不可控,全看启动器作者的心情以及看脸,假设被分配了一个真实存在的 UUID,那么本帖讲述的方法就不靠谱了。



来自群组: Command Block Logic

评分

参与人数 3人气 +6 收起 理由
ff98sha + 2 MCBBS有你更精彩~
volta薯片~ + 2 MCBBS有你更精彩~
ruhuasiyu + 2 Ssssssssssssssssssss

查看全部评分

火星浮云 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
2715
钻石
性别
保密
注册时间
2014-1-26
查看详细资料
发表于 2018-12-8 23:56:48 | 显示全部楼层
本帖最后由 火星浮云 于 2018-12-9 00:00 编辑

North是盗版玩家哈哈哈哈
还被禁言了更骚了233333
回复

使用道具 举报

粘兽 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
10997
钻石
性别
保密
注册时间
2017-2-28
查看详细资料
发表于 2018-12-9 00:54:57 | 显示全部楼层
不是正版 地图自动爆炸
回复

使用道具 举报

SorrowRain 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
398
钻石
性别
保密
注册时间
2018-2-18
查看详细资料
发表于 2018-12-9 07:22:05 来自手机 | 显示全部楼层
前排围观
回复

使用道具 举报

ruhuasiyu 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
17798
钻石
性别
保密
注册时间
2014-10-16
查看详细资料
发表于 2018-12-9 08:08:24 | 显示全部楼层
玩家表示,我背包满了

评分

参与人数 1人气 +1 收起 理由
SPGoding + 1 盲生你发现了华点【可以改成 loot drop.

查看全部评分

回复

使用道具 举报

Abraham511 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
12496
钻石
性别
保密
注册时间
2014-9-29
查看详细资料
发表于 2018-12-9 09:08:57 | 显示全部楼层
那...玩家离线游戏的时候...无法联网获取皮肤/头颅数据....会受到影响嘛~~
回复

使用道具 举报

frea 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3791
钻石
性别
保密
注册时间
2017-2-5
查看详细资料
发表于 2018-12-9 10:32:00 | 显示全部楼层
答案很出乎意料。vanilla越来越强大了。
回复

使用道具 举报

吾王HIM0418 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
261
钻石
性别
保密
注册时间
2018-12-7
查看详细资料
发表于 2018-12-9 11:30:32 | 显示全部楼层
多谢!楼主!感谢分享!
回复

使用道具 举报

Cheng_N 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1615
钻石
性别
保密
注册时间
2017-8-9
查看详细资料
发表于 2018-12-10 22:04:04 | 显示全部楼层
!!!看来是时候买个正版了
回复

使用道具 举报

uuu2011 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1786
钻石
性别
保密
注册时间
2014-12-17
查看详细资料
发表于 2019-1-25 14:51:22 来自手机 | 显示全部楼层
whitelist 可以吗
回复

使用道具 举报

SPGoding 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
17280
钻石
性别
保密
注册时间
2018-1-18
查看详细资料
 楼主| 发表于 2019-1-25 16:11:31 | 显示全部楼层

没太明白【
回复

使用道具 举报

uuu2011 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1786
钻石
性别
保密
注册时间
2014-12-17
查看详细资料
发表于 2019-1-25 19:09:27 | 显示全部楼层

whitelist add 一个非正版玩家的ID会提示这个ID不存在
回复

使用道具 举报

SPGoding 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
17280
钻石
性别
保密
注册时间
2018-1-18
查看详细资料
 楼主| 发表于 2019-1-25 19:21:25 | 显示全部楼层
uuu2011 发表于 2019-1-25 19:09
whitelist add 一个非正版玩家的ID会提示这个ID不存在

function 没有权限使用 whitelist
另外如果存在这个 ID 的正版玩家是可以的吧【
回复

使用道具 举报

浮尔魔司Ya 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1576
钻石
性别
保密
注册时间
2017-10-28
查看详细资料
发表于 2019-1-30 10:37:04 | 显示全部楼层
hh正版有福利吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2020-2-17 14:55 , Processed in 0.049191 second(s), Total 23, Slave 22 queries, Release: Build.2020.01.19.1840, Gzip On, MemCached On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标 本站与Mojang以及微软公司没有从属关系

© 2010-2020 我的世界中文论坛 版权所有 本站原创图文内容版权属于原创作者,未经许可不得转载

快速回复 返回顶部 返回列表