有没有办法检测一个玩家踩坏耕地
详细需求:
当一个玩家踩坏耕地时,获得一个成就/获得一个tag/计分板增加一分/其他可以使目标选择器选中的判定条件
要求:
1. 纯指令完成,耕地坐标不固定,玩家ID不固定
2. 尽量不要添加新的实体,尽量不要改变方块
3. 如果可以的话,当耕地上种的是成熟小麦时才触发
琉乐艺 发表于 2023-7-5 12:38
做了个例子可以看看
我还没放游戏里实测
请问您测试了吗
看代码的话感觉可能有BUG
trigger_achievement由detect_trampled触发,条件是unless block ~ ~-1 ~ minecraft:farmland
但是trigger_achievement中调用grant_achievement的条件是if block ~ ~-1 ~ minecraft:farmland
两个条件正好相反,而且没有schedule,这俩函数在同一tick运行,是不是会导致永远无法触发grant_achievement
还有一个可能是BUG的
耕地我没记错的话应该是凹下去一点,所以farmland的判断应该是~ ~ ~(而不是~ ~-1 ~)
还有一个可能误触的,比如假如我有缓降或者漂浮到田上
或者在田旁边跳之类的有几率不会破坏田的
有没有可能导致田没有破坏但是触发成就
MoonCakeMC 发表于 2023-7-5 12:47
我还没放游戏里实测
请问您测试了吗
我没有测试过,等下我看看能不能改一下吧
我写个过程吧,你看看
结构:
复制代码trampled.json文件:
复制代码detect_trampled.mcfunction文件:
复制代码check_wheat.mcfunction:
复制代码trigger_achievement.mcfunction文件:
复制代码confirm_trampled.mcfunction文件:
复制代码pack.mcmeta文件:
复制代码
结构:
- mydatapack/
- ├── data/
- │ └── mydatapack/
- │ ├── advancements/
- │ │ └── trampled.json
- │ └── functions/
- │ ├── detect_trampled.mcfunction
- │ ├── check_wheat.mcfunction
- │ ├── trigger_achievement.mcfunction
- │ └── confirm_trampled.mcfunction
- └── pack.mcmeta
- {
- "criteria": {
- "trampled": {
- "trigger": "minecraft:impossible"
- }
- },
- "rewards": {
- "function": "mydatapack:trigger_achievement"
- },
- "requirements": [
- [
- "trampled"
- ]
- ]
- }
- execute as @a at @s unless block ~ ~-1 ~ minecraft:farmland run function mydatapack:check_wheat
- execute if block ~ ~1 ~ minecraft:wheat[age=7] run function mydatapack:confirm_trampled
- say Player has trampled farmland!
- advancement grant @s only mydatapack:trampled
- tag @s add TrampledFarmland
- scoreboard players add @s TrampledScore 1
- execute as @a at @s if block ~ ~ ~ minecraft:farmland run function mydatapack:trigger_achievement
- {
- "pack": {
- "pack_format": 7,
- "description": "My Custom Data Pack"
- }
- }
琉乐艺 发表于 2023-7-5 13:16
我写个过程吧,你看看
结构:
trampled.json文件:
能看懂
但是似乎并没有解决漂浮缓降之类的问题(?
而且依旧存在坐标冲突
顺便提醒一下,应该是有个函数要每tick执行的对吧,minecraft/tags/functions/tick.json你没写(
MoonCakeMC 发表于 2023-7-5 13:19
能看懂
但是似乎并没有解决漂浮缓降之类的问题(?
而且依旧存在坐标冲突
琉乐艺 发表于 2023-7-5 13:28
又改了一下。你看看
格式都乱了()
我讲讲我现在的思路
首先检测 ~ ~ ~ 是不是farmland,~ ~1 ~是不是小麦
如果是farmland给一个tag_1
用计分板判据判定带tag_1的是否跳跃,跳了给tag_2,没跳但是~ ~ ~不是farmland的话删tag_1
然后判定带tag_2的玩家~ ~-1 ~是不是泥土,~ ~ ~是不是空气,如果都满足触发,有一个不满足删tag_2不触发
你可以试着找一下这里面的BUG然后用数据包实现试试()
MoonCakeMC 发表于 2023-7-5 13:33
格式都乱了()
我讲讲我现在的思路
首先检测 ~ ~ ~ 是不是farmland,~ ~1 ~是不是小麦
你要测试的我的世界版本是?
琉乐艺 发表于 2023-7-5 13:39
你要测试的我的世界版本是?
1.16.5
1.16.5 版本中通过纯数据包的方式无法实现精确检测玩家踩坏耕地并触发相应操作的需求
琉乐艺 发表于 2023-7-5 13:55
1.16.5 版本中通过纯数据包的方式无法实现精确检测玩家踩坏耕地并触发相应操作的需求 ...
如果允许使用其他版本
请问需要什么版本,使用什么方法可以实现
在1.17 版本中,引入了新的数据包功能,称为数据包标签(Data Pack Tags)。这个功能可以更灵活地控制和触发各种事件和操作,包括检测玩家踩坏耕地。因此,您可以尝试在 Minecraft 1.17 版本中使用数据包来实现您的需求。虽然 Minecraft 1.17 引入了更多的数据包功能,但仍然有一些限制
琉乐艺 发表于 2023-7-5 13:59
在1.17 版本中,引入了新的数据包功能,称为数据包标签(Data Pack Tags)。这个功能可以更灵活地控制和触 ...
听起来像AI?
给个示例
我是没听说过1.17+有这个东西(
MoonCakeMC 发表于 2023-7-5 14:01
听起来像AI?
给个示例
我是想不到数据包标签是怎么监测玩家破坏耕地的
好吧,我b站和百度看了一下好像没有什么用数据包标签,我刚刚还问了一下别人,他说好像挺难的还得用到函数,哈哈我现在是真不会了awa
我想到两个方案,但均未实测,等我……
第一个,我之前注意到过,当踩到耕地上的时候,因为耕地是比普通方块矮一小截的,所以此时判断玩家当前的方块应该是耕地,如果耕地被踩坏,之后玩家位置立即上移,当前方块会立即转为空气方块。也就是说,首先判断当前方块是否是耕地(以及上面的方块是否是小麦),然后通过计分板每隔一刻+1,计算当前方块从耕地到其他方块的时间间隔,足够短者就是把耕地踩了。缺点是可能一踩上去立即离开的情况会误判。
第二个,我记得玩家有个nbt标签叫rotation还是甚么的,把y轴方向的rotation剪下来(execute store子命令)放在计分板里,判断当前方块是小麦的同时判断当前的rotation是否达到能踩坏耕地的下限。缺点是这可能得一点点试出来踩坏耕地的下限是甚么数。
第一个,我之前注意到过,当踩到耕地上的时候,因为耕地是比普通方块矮一小截的,所以此时判断玩家当前的方块应该是耕地,如果耕地被踩坏,之后玩家位置立即上移,当前方块会立即转为空气方块。也就是说,首先判断当前方块是否是耕地(以及上面的方块是否是小麦),然后通过计分板每隔一刻+1,计算当前方块从耕地到其他方块的时间间隔,足够短者就是把耕地踩了。缺点是可能一踩上去立即离开的情况会误判。
第二个,我记得玩家有个nbt标签叫rotation还是甚么的,把y轴方向的rotation剪下来(execute store子命令)放在计分板里,判断当前方块是小麦的同时判断当前的rotation是否达到能踩坏耕地的下限。缺点是这可能得一点点试出来踩坏耕地的下限是甚么数。
我刚刚鼓捣出来了个神奇的策略,就是让所有motion[1]为1以上的强制删除下面的小麦并计分(
直接解决速度下限是范围的难题(雾
如果这样可以的话,我整理整理指令发你?
直接解决速度下限是范围的难题(雾
如果这样可以的话,我整理整理指令发你?
幻心飞小骥 发表于 2023-7-5 21:55
我刚刚鼓捣出来了个神奇的策略,就是让所有motion[1]为1以上的强制删除下面的小麦并计分(
直接解决速度下 ...
也可以哈哈哈哈哈
不过这样0.5~1区间内的怎么办
其实第一种方法我觉得挺好的,你可以看看我这个帖前面说的我的思路
首先检测 ~ ~ ~ 是不是farmland,~ ~1 ~是不是小麦
如果是farmland给一个tag_1
用计分板判据判定带tag_1的是否跳跃,跳了给tag_2,没跳但是~ ~ ~不是farmland的话删tag_1
然后判定带tag_2的玩家~ ~-1 ~是不是泥土,~ ~ ~是不是空气,如果都满足触发,有一个不满足删tag_2不触发
写的比较的简略,但是应该大概能读懂
整合一下我觉得能得到一个误触率比较低的方式,即使误触也问题不大
MoonCakeMC 发表于 2023-7-5 21:58
也可以哈哈哈哈哈
不过这样0.5~1区间内的怎么办
其实第一种方法我觉得挺好的,你可以看看我这个帖前面说的 ...
- execute as @e[type=player] at @s if block ~ ~ ~ minecraft:wheat[age=7] store result score @s dirtd run data get entity @s Motion[1]
但有个bug,当motion转为计分板数据时,无论多小幅度的下落都会被识别并记录为计分板的-1数据,但是因为say 1的次数和下落时间有关,我估计可以把say 1再做成个计分板内加数,加到一定数量——亲测say 1执行2次比较适合(因为使用半砖往下踩时执行1次,从12m高空掉落往下踩是2次),即下落至落地的时间到2游戏刻及以上就算分。
怎么说,我这种方案有点取巧而且有些漏洞百出……建议再蹲一蹲其他人的解答,我明天也会试着改一改这个指令组……
(计分板记不了小数就很难崩(悲
MoonCakeMC 发表于 2023-7-5 21:58
也可以哈哈哈哈哈
不过这样0.5~1区间内的怎么办
其实第一种方法我觉得挺好的,你可以看看我这个帖前面说的 ...
但很可惜,测试后我发现,从踩上耕地,坐标在耕地方块范围内,到耕地变为泥土把玩家弹上来,中间时间间隔太短,小于1游戏刻,无法识别出来……
幻心飞小骥 发表于 2023-7-5 22:17
但很可惜,测试后我发现,从踩上耕地,坐标在耕地方块范围内,到耕地变为泥土把玩家弹上来,中间时间间隔 ...
那假如说t0的时候~ ~ ~是farmland,~ ~1 ~是wheat[age=7]
t0+1tick的时候~ ~-1 ~是dirt行吗
o对了还有一个事情忘说了
会有一个结构方块每tick(或者每rt,即2tick)执行重置田的动作
就是在farmland被踩坏之后可能不存在是dirt的tick(?
这个是一个可能导致BUG的问题,但是更新顺序我还不太清楚,也许不会导致BUG
幻心飞小骥 发表于 2023-7-5 22:14
这是我用motion nbt法整理出的代码,亲测勉强可以正常使用。
但有个bug,当motion转为计分板数据时,无论 ...
记分板有一种方法记小数: 用execute的store存记分板 在run内调用data get,并指定scale为1000.0f
读数据进data用execute store data,指定scale为0.001f
(前几天造跑酷的时候搞出来的(
提出一种可能的实现思路:
玩家的OnGround标签是表示当前玩家是否踩着方块
给每个OnGround为false的人上一个tag
如果这些人的y-1的地方是耕地 则再加一个tag,并在下一tick检测这些玩家是否落地并且脚下是否是泥土
具体实现我还在写
玩家的OnGround标签是表示当前玩家是否踩着方块
给每个OnGround为false的人上一个tag
如果这些人的y-1的地方是耕地 则再加一个tag,并在下一tick检测这些玩家是否落地并且脚下是否是泥土
具体实现我还在写
LinGCar 发表于 2023-7-6 11:15
提出一种可能的实现思路:
玩家的OnGround标签是表示当前玩家是否踩着方块
给每个OnGround为false的人上一个 ...
感谢
有考虑过哪些情况会出BUG吗
以及上面回帖里说的特殊情况忘写到主题帖了,抱歉
会有一个结构方块每tick(或者每rt,即2tick)执行重置田的动作
就是在farmland被踩坏之后可能不存在是dirt的tick
MoonCakeMC 发表于 2023-7-6 12:34
感谢
有考虑过哪些情况会出BUG吗
以及上面回帖里说的特殊情况忘写到主题帖了,抱歉
特殊情况按你说的处理了一遍
我跳了几十次没出什么问题
出BUG的情况就是y轴加速度过大(>1b/t)导致还没检测到耕地+小麦就被踩平了
但是这种情况至少要下落20个方块了 所以应该没什么问题(
MoonCakeMC 发表于 2023-7-6 13:10
感谢,待会去测一下
可以的话给你最佳
---------------update--------------------
解决:只要把这个判断逻辑放在重置前就行了