有待一日大风起,我自乘风九万里。
大家好,你们可以叫我 扶摇 ,本期专栏的教程是用数据包实现自瞄箭塔
我选用的箭塔是由发射器和荧光物品展示框构成的:
发射器内需要箭,荧光物品展示框内需要剑

他会每秒扫描一次周围怪物,然后向它射出16伤害的箭矢。
但发射1根箭会消耗荧光物品展示框内的剑上的耐久。
而一次射出多少根箭,和箭的偏移由下方发射器决定,一共有9个格子,每当一个格子内有64根箭,就会射出1根箭,中间的格子为正心,旁边的格子为偏移(用于一次性伤害一片区域的怪物和提高命中率)
扫描范围为 长49宽49高21 的长方体,避免被地下怪物卡住扫描,无法正常工作。
数据包直接下载:
链接:https://pan.baidu.com/s/1iGr_mLupCXRe_skH4n-3LQ
提取码:1515
数据包演示:网页链接
下面教程开始:
(创建数据包的过程已跳过,把下方的:XXX 改为你数据包的名字即可)
第一步:
首先在数据包内创建tags文件夹
再在里面创建entity_types文件夹
再在里面创建ddsw文件(后缀名为.json)
打开文件(可以由记事本打开),在里面输入:
{"replace":"false","values":[
"minecraft:ender_dragon",
"minecraft:enderman",
"minecraft:endermite",
"minecraft:guardian",
"minecraft:illusioner",
"minecraft:magma_cube",
"minecraft:piglin_brute",
"minecraft:pillager",
"minecraft:silverfish",
"minecraft:vex",
"minecraft:vindicator",
"minecraft:elder_guardian",
"minecraft:cave_spider",
"minecraft:zombie_villager",
"minecraft:skeleton",
"minecraft:wither_skeleton",
"minecraft:zombified_piglin",
"minecraft:skeleton_horse",
"minecraft:phantom"]}
用来把所有敌对生物标记为一个类别
第二步:
再在数据包内创建functions文件夹
再在里面创建 ks 文件(后缀名为.mcfunction)
在里面输入:
scoreboard objectives add FSQ1 dummy "位置储存1"
scoreboard objectives add FSQ2 dummy "位置储存2"
scoreboard objectives add NJ dummy "耐久储存"
schedule function XXX:a 1s
这样一会进入游戏直接输入:/function XXX:ks
就可以直接启动了。
第三步:
再在里面创建 a 文件(后缀名为.mcfunction)
在里面输入:
execute as @e[type=glow_item_frame,nbt={Item:{id: "minecraft:iron_sword"}}] at @s if block ~ ~-1 ~ dispenser run function XXX:b
schedule function XXX:a 1s
内部意思大概为:
为内部有剑且下方有发射器的荧光物品展示框实现箭塔效果
每秒自动执行一次
第四步:
再创建 b 文件(后缀名为.mcfunction)
在里面输入:
kill @e[type=minecraft:arrow,nbt={inGround:1b,pickup:0b}]
execute positioned ~-49 ~-10 ~-49 run tag @e[dy=21,dx=99,dz=99,type=#XXX:ddsw] add sjjmz
execute if block ~ ~-3 ~ dispenser{Items:[{Count:64b,Slot:0b,id:"minecraft:arrow"}]} facing entity @e[limit=1,sort=nearest,tag=sjjmz] eyes rotated ~6 ~-3 run function XXX:c
execute if block ~ ~-3 ~ dispenser{Items:[{Count:64b,Slot:1b,id:"minecraft:arrow"}]} facing entity @e[limit=1,sort=nearest,tag=sjjmz] eyes rotated ~ ~-3 run function XXX:c
execute if block ~ ~-3 ~ dispenser{Items:[{Count:64b,Slot:2b,id:"minecraft:arrow"}]} facing entity @e[limit=1,sort=nearest,tag=sjjmz] eyes rotated ~-6 ~-3 run function XXX:c
execute if block ~ ~-3 ~ dispenser{Items:[{Count:64b,Slot:3b,id:"minecraft:arrow"}]} facing entity @e[limit=1,sort=nearest,tag=sjjmz] eyes rotated ~6 ~ run function XXX:c
execute if block ~ ~-3 ~ dispenser{Items:[{Count:64b,Slot:4b,id:"minecraft:arrow"}]} facing entity @e[limit=1,sort=nearest,tag=sjjmz] eyes rotated ~ ~ run function XXX:c
execute if block ~ ~-3 ~ dispenser{Items:[{Count:64b,Slot:3b,id:"minecraft:arrow"}]} facing entity @e[limit=1,sort=nearest,tag=sjjmz] eyes rotated ~-6 ~ run function XXX:c
execute if block ~ ~-3 ~ dispenser{Items:[{Count:64b,Slot:6b,id:"minecraft:arrow"}]} facing entity @e[limit=1,sort=nearest,tag=sjjmz] eyes rotated ~6 ~3 run function XXX:c
execute if block ~ ~-3 ~ dispenser{Items:[{Count:64b,Slot:7b,id:"minecraft:arrow"}]} facing entity @e[limit=1,sort=nearest,tag=sjjmz] eyes rotated ~ ~3 run function XXX:c
execute if block ~ ~-3 ~ dispenser{Items:[{Count:64b,Slot:8b,id:"minecraft:arrow"}]} facing entity @e[limit=1,sort=nearest,tag=sjjmz] eyes rotated ~-6 ~3 run function XXX:c
tag @e[tag=sjjmz] remove sjjmz
(sjjmz这是一个标记的名称,没有特殊含义,可更改。)
内部意思大概为:
清除掉落在地的箭(避免卡顿)
标记检测范围内最近的怪物
检测发射器内部若对应的格子含有64根箭则朝向被标记的怪物进行对应偏移的发射
解除标记
第五步:
再创建 c 文件(后缀名为.mcfunction)
在里面输入:
execute store result score @s NJ run data get entity @s Item.tag.Damage
execute store result entity @s Item.tag.Damage int 1 run scoreboard players add @s NJ 1
execute as @s[nbt={Item:{tag:{Damage:250}}}] run item replace entity @s container.0 with air
summon arrow ^ ^ ^2 {Tags:["FS1"],HasBeenShot:0b,damage:4}
summon item ~ ~ ~ {Tags:["FS2"],Invulnerable:1,NoGravity:1,PickupDelay:32767,Age:5999,Item:{id:stone,Count:1}}
execute as @e[tag=FS1] store result score @s FSQ1 run data get entity @s Pos[0] 100000
execute as @e[tag=FS1] store result score @s FSQ2 run data get entity @e[tag=FS2,limit=1,sort=nearest] Pos[0] 100000
execute as @e[tag=FS1] run scoreboard players operation @s FSQ1 -= @s FSQ2
execute as @e[tag=FS1] store result entity @s Motion[0] double 0.00002 run scoreboard players get @s FSQ1
execute as @e[tag=FS1] store result score @s FSQ1 run data get entity @s Pos[1] 100000
execute as @e[tag=FS1] store result score @s FSQ2 run data get entity @e[tag=FS2,limit=1,sort=nearest] Pos[1] 100000
execute as @e[tag=FS1] run scoreboard players operation @s FSQ1 -= @s FSQ2
execute as @e[tag=FS1] store result entity @s Motion[1] double 0.00002 run scoreboard players get @s FSQ1
execute as @e[tag=FS1] store result score @s FSQ1 run data get entity @s Pos[2] 100000
execute as @e[tag=FS1] store result score @s FSQ2 run data get entity @e[tag=FS2,limit=1,sort=nearest] Pos[2] 100000
execute as @e[tag=FS1] run scoreboard players operation @s FSQ1 -= @s FSQ2
execute as @e[tag=FS1] store result entity @s Motion[2] double 0.00002 run scoreboard players get @s FSQ1
tag @e[tag=FS1] remove FS1
kill @e[tag=FS2]
内部意思大概为:
用计分板读取耐久
减少计分板来侧面实现减少耐久
耐久不够则清除剑
生成箭,和辅助发射物
读取箭和辅助发射物的坐标,进行求差,把结果作为速度赋予给箭,让箭发射出去。
清除辅助发射物,清除对箭的标记
现在,我们的自瞄箭塔就制作完成了!
数据包直接下载:
链接:https://pan.baidu.com/s/1iGr_mLupCXRe_skH4n-3LQ
提取码:1515
数据包演示:网页链接