Minecraft(我的世界)中文论坛

标题: 初步实现小木斧功能 1 快速填充

作者: qaz1-qaz1-    时间: 2019-2-13 17:27
标题: 初步实现小木斧功能 1 快速填充
本帖最后由 qaz1-qaz1- 于 2019-2-13 17:29 编辑

引言
这个东西应该火星了,但是因为forge1.13还没有发出来,于是就蹭一下热度好了。我想想这个标题中的"1"要不要加,万一填补上坑就凉了,但是也许有后续呢?还是加上好了。
不废话了,上效果:

在这个帖子中,使用说明在第二页,附有下载,如果要细看则在之后的几页,我认为可供参考的地方在目录的抛砖引玉处,最后有想说的话
使用说明
安装:
百度云:
https://pan.baidu.com/s/10Rw2N8Te27r2yH0_PKG-bw
密码:hhig

使用:

这个数据包很脆弱,没有设置误操作处理,别尝试去作,用用够了,这个理论上是支持多人的。

功能实现
选择 file: .../functions/selector/set.mcfunction
这个功能主要分为两部分来实现
一、射出箭矢
二、射中时生成盔甲架
射出箭这一个部分在我之前的传送法杖一文已经讲过了,这里就不再赘述的,这里主要讲讲生成盔甲架的部分。步骤与命令如下图所示,为了文章的简略性,命令有所删减
检测箭的落地,这里只要检测箭有没有inGround标签即可
  1. execute as @e[tag=tool_arrow,nbt={inGround:1b}] at @s run function tool:selector/set
复制代码

在箭前面放置定位点,用execute命令,这里的 rotate as 非常关键,规定了以人的方向为基准执行这个命令,这样可以省去将人的Rotation复制到箭上的麻烦,而且还避免了bug(复制很可能不会成功)
  1. execute at @e[tag=tool_arrow_setting] rotated as @s positioned ^ ^ ^0.5 align y run summon minecraft:armor_stand ~ ~ ~ {...}
复制代码

功能实现
复制 file: .../functions/clone/

在这个目录下有两个函数,start 用于初始化,即搭建一个中继环境,clone用于封装复制模块,功能是把 @e[tag=tool_from] 处的方块复制到 @e[tag=tool_to] 处,这里主要讲克隆模块。
克隆主要分为两步,1.打开冰箱门把方块复制到中继处,2.将中继处的方块复制出来。
因为一个命令的两组坐标无法直接相对于两个实体,只能用中继的方法了,不然就是用结构方块。这里是这样实现的
  1. execute at @e[tag=tool_from] run clone ~ ~ ~ ~ ~ ~ -168 3 -783
  2. execute at @e[tag=tool_to] run clone -168 3 -783 -168 3 -783 ~ ~ ~
复制代码

非常的简单粗暴了

功能实现
填充 file: .../functions/fill/
初始化 file: .../function/commands/fill.mcfunction

初始化非常的简单,需要算出3个数据来:两个定位的xyz差值,再作类似于植树问题的处理不好的回忆啊,实现如下,以dx值为例
  1. execute store result score #x_temp tool_calc run data get entity @e[tag=tool_belong,scores={tool_selector=2},limit=1] Pos[0]
  2. execute store result score #x_left tool_calc run data get entity @e[tag=tool_belong,scores={tool_selector=3},limit=1] Pos[0]
  3. scoreboard players operation #x_left tool_calc -= #x_temp tool_calc
  4. execute if score #x_left tool_calc matches 0.. run scoreboard players add #x_left tool_calc 1
  5. execute if score #x_left tool_calc matches ..-1 run scoreboard players remove #x_left tool_calc 1
复制代码

详细解释如下:


位移 file: .../function/fill/

核心思想就是迭代迭代迭代迭代迭代迭代迭代迭代迭代迭代迭代迭代根本停不下来
在使用过程中会有以下的逻辑
x方向的移动
=> 如果x方向移动完了,就在y方向上移动一次,并重置x
=> 如果y方向移动完了,就在z方向上移动一次,并重置y
=> 如果z方向移动完了,就完成操作,否则继续重复
这里以移动x为例贴上具体函数(move_x.mcfunction)
  1. #x
  2. #+
  3. #如果在1上面,就向x+移动
  4. execute if score #x_left tool_calc matches 1.. run tp @s ~1 ~ ~
  5. #修改left
  6. execute if score #x_left tool_calc matches 1.. run scoreboard players remove #x_left tool_calc 1

  7. #-
  8. #如果在-1下,就向x-移动
  9. execute if score #x_left tool_calc matches ..-1 run tp @s ~-1 ~ ~
  10. #修改left
  11. execute if score #x_left tool_calc matches ..-1 run scoreboard players add #x_left tool_calc 1
复制代码

分类讨论是向正方向移动还是向负方向移动后,主要分为两个步骤:位移与记分板的运算。

重置 file: .../function/fill/

因为复制的操作是类似于打印机一样一行一行复制的,所以每次移动完x方向后,就要再在移动y方向移动1格,并且重置x坐标,接下来,以重置x坐标为例说明
  1. #获得位置
  2. execute store result score #x_temp tool_calc run data get entity @s Pos[0] 1000
  3. #将x_origin*1000
  4. scoreboard players operation #x_origin tool_calc *= #thousand tool_calc
  5. #相加
  6. scoreboard players operation #x_temp tool_calc -= #x_origin tool_calc
  7. #写入
  8. execute store result entity @s Pos[0] double 0.001 run scoreboard players get #x_temp tool_calc
  9. #将x_origin/1000
  10. scoreboard players operation #x_origin tool_calc /= #thousand tool_calc
  11. #恢复left
  12. scoreboard players operation #x_left tool_calc = #x_origin tool_calc
复制代码


对y方向上进行的重置也是同理

其他想说的

在写函数的过程中,我陷入了递归懵逼之中:为什么不行 => 改了这个应该就行了 => 为什么不行 => 改了这个应该就行了 => ...
而这一切的一切都是因为甩锅,明明就是技术不好233没有很好的调试工具,来看一看文件中随处可见的心酸的痕迹,
  1. #log
  2. # tellraw @a [">>reset x"]
  3. # execute store result score yo_y test run data get entity @s Pos[0] 1000
  4. # tellraw @a ["x: ",{"score":{"objective":"test","name":"yo_y"}}]
  5. # execute store result score yo_y test run data get entity @s Pos[1] 1000
  6. # tellraw @a ["y: ",{"score":{"objective":"test","name":"yo_y"}}]
  7. # execute store result score yo_y test run data get entity @s Pos[2] 1000
  8. # tellraw @a ["z: ",{"score":{"objective":"test","name":"yo_y"}}]
复制代码

但是我还是凑着过来了,真好。
我实现这一个东西应该是因为打fill指令挺麻烦的,希望大家能用的愉快。不愉快也轻喷


作者: qaz1-qaz1-    时间: 2019-2-13 17:30
突然间发现不会用目录了...尴尬
作者: langyo    时间: 2019-2-13 17:56
你似乎没火星……反正我是没看到过同类数据包的发布帖子……

实现起来较为简单,不过一大票写命令的却又一起咕咕咕……诶
作者: SPGoding    时间: 2019-2-13 19:08
本帖最后由 SPGoding 于 2019-2-13 19:10 编辑

用箭是一种很奇怪的方式…

在箭刚生成的时候,客户端认为它 Motion[] 全部为 0,会导致它在视野前方停顿一段时间然后再按照你设置的 Motion[] 射出,带给玩家的体验实际上…很糟。

不如直接用视线追踪找到前方方块。国外有一个还原 WorldEdit 的 datapack(BlingEdit),它的做法就类似这样,它还添加了对选中方块的高亮(也就是在那个方块的位置生成一个带有 Glowing 的实体[史莱姆潜影贝之流]。由于实体被添加到了拥有颜色的 team 里面,所以高亮边框还有颜色),效果是不错的…
作者: 阿科i    时间: 2019-2-13 23:52
66666,学到了
作者: (=°ω°)丿    时间: 2019-2-14 10:49
本帖最后由 隐退 于 2020-2-18 14:42 编辑

楼主你可以参考一下:
http://www.mcbbs.net/thread-843864-1-1.html
看来我们这种帖子几乎只有 dalao 才会看
这个模组还有一个大 BUG 没修,算了算了
准备弃坑了
作者: 为王的诞生    时间: 2019-2-14 11:51
66666
作者: YuanCH.    时间: 2019-2-14 22:32
谢谢分享,正好需要哈哈哈
作者: 小小风风520    时间: 2019-4-10 20:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小小风风520    时间: 2019-4-10 20:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: 我是Matteoo    时间: 2019-4-10 22:51
很棒啊非常棒
作者: 筱枫最帅啦    时间: 2019-4-11 19:23
学会了,这功能真不错!
作者: 3055892644    时间: 2019-4-13 19:24
虽然我不懂这个东西  但看起来好叼 不过又好像是创**mod
作者: DouXiaoBi    时间: 2019-4-14 10:40
MCBBS有你更精彩
作者: yluow    时间: 2019-4-14 13:31
学到了,666666666