Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 13234|回复: 175

[命令] 【CBL|SPG】精确方块穿透判定

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

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

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

x
本帖最后由 SPGoding 于 2019-10-13 18:59 编辑

kongbaiyo 制作了一个更为精准的判定系统:家门边的超棒射线追踪系统
与原版的方块选择框判定完全一致,性能占用也并不高,强烈推荐!




目前常用的方块穿透判定,是把可穿透的方块 ID 写到一个 Block Tag 里,然后用 execute unless block ~ ~ ~ #foobar 来判定这个方块是否可穿透。
不过,这种做法其实是不准确的,例如台阶、楼梯、栅栏等方块,它们的模型并不是占据了一整个方块。于是本人编写了一个可复用的 Function 与相关 Tags。





spgoding:player_through
记录了所有可由玩家穿透的方块。


spgoding:through
记录了所有可由子!弹穿透的方块。继承了上一个 Tag。


spgoding:solid_four_directions
记录了所有实心的、可有四个方向的模型拓展的方块。


spgoding:is_hit
判定 Function 执行位置是否与方块撞击。
有 #####  注释的内容请在 18w31a 后启用
  1. # spgoding:is_hit
  2. # as A area_effect_cloud.
  3. # return @s spg_return
  4. #         0 - is not hitting any blocks
  5. #         1 - is hitting blocks
  6. # 获取 x 坐标小数点后 1 位
  7. summon minecraft:area_effect_cloud ~ ~ ~ {Duration:2,NoGravity:1b,Tags:["NEW"]}
  8. execute store result score $x spg_mw_tmp run data get entity @e[tag=NEW,limit=1,distance=..1,sort=nearest] Pos[0] 10
  9. scoreboard players operation $x_after_dot spg_mw_tmp = $x spg_mw_tmp
  10. scoreboard players operation $x_after_dot spg_mw_tmp %= 10 const
  11. ##### execute if score $x spg_mw_tmp matches ..-1 run scoreboard players operation $x_after_dot spg_mw_tmp *= -1 const
  12. kill @e[tag=NEW]
  13. # 获取 y 坐标小数点后 1 位
  14. summon minecraft:area_effect_cloud ~ ~ ~ {Duration:2,NoGravity:1b,Tags:["NEW"]}
  15. execute store result score $y spg_mw_tmp run data get entity @e[tag=NEW,limit=1,distance=..1,sort=nearest] Pos[1] 10
  16. scoreboard players operation $y_after_dot spg_mw_tmp = $y spg_mw_tmp
  17. scoreboard players operation $y_after_dot spg_mw_tmp %= 10 const
  18. kill @e[tag=NEW]
  19. # 获取 z 坐标小数点后 1 位
  20. summon minecraft:area_effect_cloud ~ ~ ~ {Duration:2,NoGravity:1b,Tags:["NEW"]}
  21. execute store result score $z spg_mw_tmp run data get entity @e[tag=NEW,limit=1,distance=..1,sort=nearest] Pos[2] 10
  22. scoreboard players operation $z_after_dot spg_mw_tmp = $z spg_mw_tmp
  23. scoreboard players operation $z_after_dot spg_mw_tmp %= 10 const
  24. ##### execute if score $z spg_mw_tmp matches ..-1 run scoreboard players operation $z_after_dot spg_mw_tmp *= -1 const
  25. kill @e[tag=NEW]
  26. execute unless block ~ ~ ~ #spgoding:through run scoreboard players set @s spg_return 1
  27. execute if block ~ ~ ~ #spgoding:through run scoreboard players set @s spg_return 0
  28. execute if block ~ ~ ~ #minecraft:slabs[type=bottom] if score $y_after_dot spg_mw_tmp matches 1..4 run scoreboard players set @s spg_return 1
  29. execute if block ~ ~ ~ #minecraft:slabs[type=top] if score $y_after_dot spg_mw_tmp matches 6..9 run scoreboard players set @s spg_return 1
  30. execute if block ~ ~ ~ #minecraft:slabs[type=double] run scoreboard players set @s spg_return 1
  31. execute if block ~ ~ ~ #spgoding:solid_four_directions[east=true] if score $x_after_dot spg_mw_tmp matches 6..9 run scoreboard players set @s spg_return 1
  32. execute if block ~ ~ ~ #spgoding:solid_four_directions[east=true] if score $x_after_dot spg_mw_tmp matches -4..-1 run scoreboard players set @s spg_return 1
  33. execute if block ~ ~ ~ #spgoding:solid_four_directions[west=true] if score $x_after_dot spg_mw_tmp matches 1..4 run scoreboard players set @s spg_return 1
  34. execute if block ~ ~ ~ #spgoding:solid_four_directions[west=true] if score $x_after_dot spg_mw_tmp matches -9..-6 run scoreboard players set @s spg_return 1
  35. execute if block ~ ~ ~ #spgoding:solid_four_directions[south=true] if score $z_after_dot spg_mw_tmp matches 6..9 run scoreboard players set @s spg_return 1
  36. execute if block ~ ~ ~ #spgoding:solid_four_directions[south=true] if score $z_after_dot spg_mw_tmp matches -4..-1 run scoreboard players set @s spg_return 1
  37. execute if block ~ ~ ~ #spgoding:solid_four_directions[north=true] if score $z_after_dot spg_mw_tmp matches 1..4 run scoreboard players set @s spg_return 1
  38. execute if block ~ ~ ~ #spgoding:solid_four_directions[north=true] if score $z_after_dot spg_mw_tmp matches -9..-6 run scoreboard players set @s spg_return 1
  39. execute if block ~ ~ ~ #minecraft:stairs[facing=north,half=bottom] if score $z_after_dot spg_mw_tmp matches 5..9 if score $y_after_dot spg_mw_tmp matches 5..9 run scoreboard players set @s spg_return 0
  40. execute if block ~ ~ ~ #minecraft:stairs[facing=north,half=bottom] if score $z_after_dot spg_mw_tmp matches -5..0 if score $y_after_dot spg_mw_tmp matches 5..9 run scoreboard players set @s spg_return 0
  41. execute if block ~ ~ ~ #minecraft:stairs[facing=north,half=top] if score $z_after_dot spg_mw_tmp matches 5..9 if score $y_after_dot spg_mw_tmp matches 0..5 run scoreboard players set @s spg_return 0
  42. execute if block ~ ~ ~ #minecraft:stairs[facing=north,half=top] if score $z_after_dot spg_mw_tmp matches -5..0 if score $y_after_dot spg_mw_tmp matches 0..5 run scoreboard players set @s spg_return 0
  43. execute if block ~ ~ ~ #minecraft:stairs[facing=south,half=bottom] if score $z_after_dot spg_mw_tmp matches 0..5 if score $y_after_dot spg_mw_tmp matches 5..9 run scoreboard players set @s spg_return 0
  44. execute if block ~ ~ ~ #minecraft:stairs[facing=south,half=bottom] if score $z_after_dot spg_mw_tmp matches -9..-5 if score $y_after_dot spg_mw_tmp matches 5..9 run scoreboard players set @s spg_return 0
  45. execute if block ~ ~ ~ #minecraft:stairs[facing=south,half=top] if score $z_after_dot spg_mw_tmp matches 0..5 if score $y_after_dot spg_mw_tmp matches 0..5 run scoreboard players set @s spg_return 0
  46. execute if block ~ ~ ~ #minecraft:stairs[facing=south,half=top] if score $z_after_dot spg_mw_tmp matches -9..-5 if score $y_after_dot spg_mw_tmp matches 0..5 run scoreboard players set @s spg_return 0
  47. execute if block ~ ~ ~ #minecraft:stairs[facing=west,half=bottom] if score $x_after_dot spg_mw_tmp matches 5..9 if score $y_after_dot spg_mw_tmp matches 5..9 run scoreboard players set @s spg_return 0
  48. execute if block ~ ~ ~ #minecraft:stairs[facing=west,half=bottom] if score $x_after_dot spg_mw_tmp matches -5..0 if score $y_after_dot spg_mw_tmp matches 5..9 run scoreboard players set @s spg_return 0
  49. execute if block ~ ~ ~ #minecraft:stairs[facing=west,half=top] if score $x_after_dot spg_mw_tmp matches 5..9 if score $y_after_dot spg_mw_tmp matches 0..5 run scoreboard players set @s spg_return 0
  50. execute if block ~ ~ ~ #minecraft:stairs[facing=west,half=top] if score $x_after_dot spg_mw_tmp matches -5..0 if score $y_after_dot spg_mw_tmp matches 0..5 run scoreboard players set @s spg_return 0
  51. execute if block ~ ~ ~ #minecraft:stairs[facing=east,half=bottom] if score $x_after_dot spg_mw_tmp matches 0..5 if score $y_after_dot spg_mw_tmp matches 5..9 run scoreboard players set @s spg_return 0
  52. execute if block ~ ~ ~ #minecraft:stairs[facing=east,half=bottom] if score $x_after_dot spg_mw_tmp matches -9..-5 if score $y_after_dot spg_mw_tmp matches 5..9 run scoreboard players set @s spg_return 0
  53. execute if block ~ ~ ~ #minecraft:stairs[facing=east,half=top] if score $x_after_dot spg_mw_tmp matches 0..5 if score $y_after_dot spg_mw_tmp matches 1..5 run scoreboard players set @s spg_return 0
  54. execute if block ~ ~ ~ #minecraft:stairs[facing=east,half=top] if score $x_after_dot spg_mw_tmp matches -9..-5 if score $y_after_dot spg_mw_tmp matches 1..5 run scoreboard players set @s spg_return 0
复制代码


无损升级方法:让递归函数以一个 aec marker(或其他 marker)的身份执行,在原先 execute unless block ~ ~ ~ #through 的位置之前加入 function spgoding:hit,并把后文 execute unless block ~ ~ ~ #through 改为 execute if score @s spg_return 1, execute if block ~ ~ ~ #through 改为 execute if score @s spg_return 0。





来自群组: Command Block Logic

评分

参与人数 5人气 +10 金粒 +40 收起 理由
兔与豪QAQ + 2 神乎其技,不服不行!
橘子冰 + 1 MCBBS有你更精彩~
玄素 + 3 + 40 MCBBS有你更精彩~
ruhuasiyu + 2 神乎其技,不服不行!
ETW_Derp + 2 好奇心让我展开的[/w\]

查看全部评分

ruhuasiyu 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
16689
钻石
性别
保密
注册时间
2014-10-16
查看详细资料
发表于 2018-8-4 21:00:10 | 显示全部楼层
火把,玻璃,铁栏杆什么的都有吗?
回复

使用道具 举报

SPGoding 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
15310
钻石
性别
保密
注册时间
2018-1-18
查看详细资料
 楼主| 发表于 2018-8-4 21:03:51 | 显示全部楼层
本帖最后由 SPGoding 于 2018-8-5 01:20 编辑
ruhuasiyu 发表于 2018-8-5 01:00
火把,玻璃,铁栏杆什么的都有吗?

我看火把那弱不禁风的样子就把它直接归为可穿透了【跑
玻璃、铁栏杆是正确的
回复

使用道具 举报

ruhuasiyu 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
16689
钻石
性别
保密
注册时间
2014-10-16
查看详细资料
发表于 2018-8-4 22:32:22 | 显示全部楼层
SPGoding 发表于 2018-8-4 21:03
我看火把那弱不禁风的样子就把它直接归为可穿透了【跑
玻璃、铁栏杆是正确的 ...

不过火把反正没碰撞箱就是喽
回复

使用道具 举报

削皮弹 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1053
钻石
性别
保密
注册时间
2013-6-27
查看详细资料
发表于 2018-8-4 22:59:13 | 显示全部楼层
夸爆,穿透方块完全体
回复

使用道具 举报

我的夜色 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
2661
钻石
性别
保密
注册时间
2016-2-12
查看详细资料
发表于 2018-8-5 07:54:01 | 显示全部楼层
大佬大佬(虽然我到现在也不明白1.13的函数是怎么回事)
回复

使用道具 举报

chyx 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
17507
钻石
性别
保密
注册时间
2014-3-20
查看详细资料
发表于 2018-8-5 20:02:47 来自手机 | 显示全部楼层
我想的获取方块内位置方法是先偏移再对齐(都是execute有的能力)

评分

参与人数 1人气 +2 收起 理由
SPGoding + 2 神乎其技,不服不行!

查看全部评分

回复

使用道具 举报

SPGoding 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
15310
钻石
性别
保密
注册时间
2018-1-18
查看详细资料
 楼主| 发表于 2018-8-5 20:17:01 | 显示全部楼层
本帖最后由 SPGoding 于 2018-8-6 02:09 编辑
chyx 发表于 2018-8-6 00:02
我想的获取方块内位置方法是先偏移再对齐(都是execute有的能力)

wdm!
原来还能这么用,我一直都是忽视了对齐那个功能的…

Edit:啊啊啊啊啊我好丢人啊啊啊啊啊啊 啊啊啊啊啊啊
回复

使用道具 举报

ruhuasiyu 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
16689
钻石
性别
保密
注册时间
2014-10-16
查看详细资料
发表于 2018-8-5 22:00:02 | 显示全部楼层
SPGoding 发表于 2018-8-5 20:17
wdm!
原来还能这么用,我一直都是忽视了对齐那个功能的…

偏移再对齐不还是要获取坐标么?难道变方便了?

评分

参与人数 1人气 +1 收起 理由
SPGoding + 1 毫无主见.spg

查看全部评分

回复

使用道具 举报

wxiaoshan 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
323
钻石
性别
保密
注册时间
2013-3-7
查看详细资料
发表于 2018-8-6 02:30:34 | 显示全部楼层
顶!    顶!    顶!    顶!   顶!    顶!    顶!    顶!  

评分

参与人数 1人气 -2 金粒 -20 收起 理由
Zero_Exact -2 -20 灌水

查看全部评分

回复

使用道具 举报

chyx 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
17507
钻石
性别
保密
注册时间
2014-3-20
查看详细资料
发表于 2018-8-6 11:14:37 | 显示全部楼层
ruhuasiyu 发表于 2018-8-5 22:00
偏移再对齐不还是要获取坐标么?难道变方便了?

我想的是比如我已经知道了这个格子是一个下半砖 我先向下0.5再y对齐 如果和y对齐在同一个地方之类的……
回复

使用道具 举报

ruhuasiyu 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
16689
钻石
性别
保密
注册时间
2014-10-16
查看详细资料
发表于 2018-8-6 11:23:48 | 显示全部楼层
chyx 发表于 2018-8-6 11:14
我想的是比如我已经知道了这个格子是一个下半砖 我先向下0.5再y对齐 如果和y对齐在同一个地方之类的…… ...

比较y并没有比get y方便多少啊……
回复

使用道具 举报

44964884 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1177
钻石
性别
保密
注册时间
2015-5-18
查看详细资料
发表于 2018-8-6 15:28:48 | 显示全部楼层
看不懂都是大佬
回复

使用道具 举报

弦心距 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
307
钻石
性别
保密
注册时间
2017-7-15
查看详细资料
发表于 2018-8-6 20:48:35 | 显示全部楼层
大佬,大佬。楼主辛苦了。这是枪战地图的福音
回复

使用道具 举报

晨曦大哥 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
552
钻石
性别
保密
注册时间
2014-6-21
查看详细资料
发表于 2018-8-6 21:06:49 | 显示全部楼层
666666666666666666666

评分

参与人数 1人气 -1 金粒 -10 收起 理由
玄素 -1 -10 无意义

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2019-11-15 11:23 , Processed in 0.051281 second(s), Total 22, Slave 21 queries , Gzip On, MemCached On.

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

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

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