Minecraft(我的世界)中文論壇

 找回密碼
 注冊(register)
查看: 13322|回復: 176
打印 上一主題 下一主題

[命令] 【CBL|SPG】精確方塊穿透判定

  [復制鏈接]
SPGoding 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
15499
鉆石
性別
保密
注冊時間
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\]

查看全部評分

帖子永久鏈接: 

Minecraft中文論壇 - 論壇版權1、本主題所有言論和圖片純屬會員個人意見,與本論壇立場無關
2、本站所有主題由該帖子作者發表,該帖子作者享有帖子相關版權
3、其他單位或個人使用、轉載或引用本文時必須同時征得該帖子作者的同意
4、帖子作者須承擔一切因本文發表而直接或間接導致的民事或刑事法律責任
5、本帖若有內容轉載自其它媒體,不代表本站贊同其觀點和對其真實性負責
6、若本帖涉及任何版權問題,請立即告知本站,本站將及時予以刪除并致以最深的歉意
7、Minecraft(我的世界)中文論壇管理員和版主有權不事先通知發貼者而刪除本文

ruhuasiyu 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
16754
鉆石
性別
保密
注冊時間
2014-10-16
查看詳細資料
沙發
發表于 2018-8-4 21:00:10 | 只看該作者
火把,玻璃,鐵欄桿什么的都有嗎?
回復

使用道具 舉報

SPGoding 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
15499
鉆石
性別
保密
注冊時間
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
愛心
積分
16754
鉆石
性別
保密
注冊時間
2014-10-16
查看詳細資料
地板
發表于 2018-8-4 22:32:22 | 只看該作者
SPGoding 發表于 2018-8-4 21:03
我看火把那弱不禁風的樣子就把它直接歸為可穿透了【跑
玻璃、鐵欄桿是正確的 ...

不過火把反正沒碰撞箱就是嘍
回復

使用道具 舉報

削皮彈 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
1053
鉆石
性別
保密
注冊時間
2013-6-27
查看詳細資料
5#
發表于 2018-8-4 22:59:13 | 只看該作者
夸爆,穿透方塊完全體
回復

使用道具 舉報

我的夜色 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
2661
鉆石
性別
保密
注冊時間
2016-2-12
查看詳細資料
6#
發表于 2018-8-5 07:54:01 | 只看該作者
大佬大佬(雖然我到現在也不明白1.13的函數是怎么回事)
回復

使用道具 舉報

chyx 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
17513
鉆石
性別
保密
注冊時間
2014-3-20
查看詳細資料
7#
發表于 2018-8-5 20:02:47 來自手機 | 只看該作者
我想的獲取方塊內位置方法是先偏移再對齊(都是execute有的能力)

評分

參與人數 1人氣 +2 收起 理由
SPGoding + 2 神乎其技,不服不行!

查看全部評分

回復

使用道具 舉報

SPGoding 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
15499
鉆石
性別
保密
注冊時間
2018-1-18
查看詳細資料
8#
 樓主| 發表于 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
愛心
積分
16754
鉆石
性別
保密
注冊時間
2014-10-16
查看詳細資料
9#
發表于 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
查看詳細資料
受到警告 10#
發表于 2018-8-6 02:30:34 | 只看該作者
頂!    頂!    頂!    頂!   頂!    頂!    頂!    頂!  

評分

參與人數 1人氣 -2 金粒 -20 收起 理由
Zero_Exact -2 -20 灌水

查看全部評分

回復

使用道具 舉報

chyx 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
17513
鉆石
性別
保密
注冊時間
2014-3-20
查看詳細資料
11#
發表于 2018-8-6 11:14:37 | 只看該作者
ruhuasiyu 發表于 2018-8-5 22:00
偏移再對齊不還是要獲取坐標么?難道變方便了?

我想的是比如我已經知道了這個格子是一個下半磚 我先向下0.5再y對齊 如果和y對齊在同一個地方之類的……
回復

使用道具 舉報

ruhuasiyu 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
16754
鉆石
性別
保密
注冊時間
2014-10-16
查看詳細資料
12#
發表于 2018-8-6 11:23:48 | 只看該作者
chyx 發表于 2018-8-6 11:14
我想的是比如我已經知道了這個格子是一個下半磚 我先向下0.5再y對齊 如果和y對齊在同一個地方之類的…… ...

比較y并沒有比get y方便多少啊……
回復

使用道具 舉報

44964884 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
1181
鉆石
性別
保密
注冊時間
2015-5-18
查看詳細資料
13#
發表于 2018-8-6 15:28:48 | 只看該作者
看不懂都是大佬
回復

使用道具 舉報

弦心距 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
307
鉆石
性別
保密
注冊時間
2017-7-15
查看詳細資料
14#
發表于 2018-8-6 20:48:35 | 只看該作者
大佬,大佬。樓主辛苦了。這是槍戰地圖的福音
回復

使用道具 舉報

晨曦大哥 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
552
鉆石
性別
保密
注冊時間
2014-6-21
查看詳細資料
15#
發表于 2018-8-6 21:06:49 | 只看該作者
666666666666666666666

評分

參與人數 1人氣 -1 金粒 -10 收起 理由
玄素 -1 -10 無意義

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊(register)

本版積分規則

Archiver|小黑屋|Mcbbs.net ( 京ICP備15023768號-1 ) | 京公網安備 11010502037624號 | 手機版

GMT+8, 2019-11-18 01:58 , Processed in 0.047230 second(s), Total 22, Slave 21 queries , Gzip On, MemCached On.

"Minecraft"以及"我的世界"為Mojang Synergies AB的商標 本站與Mojang以及微軟公司沒有從屬關系

© 2010-2019 我的世界中文論壇 版權所有 本站原創圖文內容版權屬于原創作者,未經許可不得轉載

快速回復 返回頂部 返回列表
20码必中