我的世界1.13原版枪械特性

最新版特性,喂,不是bug!:添加开 枪的声音和换弹的声音,改变后坐力的视角偏移效果,给非玩家生物添加了击退效果,玩家只能向上"跳起",为了一梭子子弹能打一个村把子弹改为140发/弹匣,稍微解决了一下生物掉落物的问题(就是生物不是因为Health被改为0以下而挂掉,而是被kill掉,只是不能掉落经验等物品总比打完不掉东西强),子弹在下届和末地会正常传播了
图片就不更新了,下载链接还在下面原来的位置。

废话少说,进入正题
本地坐标
1.13的 17w50a引入了本地坐标这个东西,局部坐标是什么呢?通俗地可以理解为视角坐标系,和世界坐 标系 区 分,
我们之前常用的~ ~1 ~就是世 界坐 标系的相 对坐标,而视角坐标系中使用的是^ ^ ^ (shift+键 盘 数 字6),
我们来比较一下~ ~ ~1和 ^ ^ ^1 有什么区别?假如一个玩家 分 别 执行了带有前面两种坐标的命令,第一种是玩家的z+1格的地方,而第二种 却 是以玩家 的 脚 为原点,平行 于 视角方向前 1格的地方,其实很好理解,可以去http://www.mcbbs.net/thread-771615-1-1.html,并且注意 下 面的有 关回复,这里就不多讲了。

本地 坐 标 引入,使得现在可以通过玩家的视角方向来让玩家检测 他 正在看 着的东西,这正是枪械的核心原理,这在之前的版本是极难实现的,而现在却变得十分简单,我之前在1.11也做过类似的枪械,http://www.mcbbs.net/thread-678367-1-1.html,看看这粗糙的做工,这缓慢的速度,而现在,我们有了这个(下载地址在图片下面):

对着你要攻 击的生物右键,在1/20秒(不卡的情况下)内 直 接 击 中 该生 物,造 成 伤 害,
该 枪(M16)和 其 弹 匣 的 模型为本人耗费3天制作(因为我是材 质 资 源新人嘛),
子 弹和 之 前的 枪 一 样仍然是35发。

该原版模组我修改了两个物品,萝卜钓竿和绿宝石,分别被修改为如下物品:


一把 M 16 和一个M16弹 药(这M  1 6一点 都 不 像,先后被人说成 M 4和 S K S,还有Mini-14 )

手持 M 16 时玩家形象:

威 力 测试:

精 准 度 和 距 离 测试:

( 图为超远 距离 击  杀一只小史莱姆)

下载:https://pan.baidu.com/s/1o9e2DNc
密码: 3hpz(发错版本了,这个下载后自行在shoot.mcfunction里吧第三条命令删掉,下个快照更新后我再传新的)
使用方法,首先打开mc18w02a,打不开1.13的需要在站内下载新的启动器(如hmcl),然后创建一个地图,开启作弊,
压缩包文件夹里有两个压缩文件--模型和数据包,因为我的电脑的压缩出了点小问题,只能压缩为rar格式,所以你需要把模型复制到minecraft\resourcepacks下,解压到当前文件夹。把数据包压缩包复制到.minecraft\saves\刚刚创建的地图名称\datapacks下,解压到当前文件,阅读说明后,设置资源包里使用m16资源包(与当前版本不匹配也正常使用)打开该地图输入/function m16:get即可获得物品

注意,说明内的部分bug已经不存在

-------------------------------------------

到 这里展 示部分就都放 完了,接下来当然是紧 张 刺 激(枯燥 乏味)的教 程了:

我说过因为 引 入视角 坐 标 而 使 做 枪 械 十 分的简单,所 以 原理 不  是 很难 懂的

这 里我 只 说 原 理,资 源 包 和 数 据 包 的 创建 方法 就 暂 时不 叙述了,

换 弹什 么 的谁都会做,这里新的 东西就是 新的 造 成 伤 害的 方式和 检测 玩 家看着  的生物

我拿出命令的一部分

  1. execute as @a[tag=!M16_loading,scores={M16_bullet=1..,M16_shoot=1}] at @s offset ~ ~1.62 ~ run function m16:shoot

复制代码

m16:shoot.mcfunction

  1. tag @s add M16_shooting
  2. execute if entity @s[distance=..1000] run tag @e[distance=..1.5,nbt=!{Invulnerable:1b},tag=!M16_shooting,type=!item,type=!area_effect_cloud,type=!armor_stand,type=!arrow,type=!ender_pearl,type=!eye_of_ender_signal,type=!leash_knot,type=!xp_orb,type=!item_frame,type=!falling_block,type=!painting] add M16_shoot_by
  3. execute if entity @s[distance=..1000] unless entity @e[distance=..1.5,nbt=!{Invulnerable:1b},tag=!M16_shooting,type=!item,type=!area_effect_cloud,type=!armor_stand,type=!arrow,type=!ender_pearl,type=!eye_of_ender_signal,type=!leash_knot,type=!xp_orb,type=!item_frame,type=!falling_block,type=!painting] if block ~ ~ ~ #m16:through offset ^ ^ ^0.5 run function m16:shoot

复制代码

M16_bullet=1..,M16_shoot=1代表有 子 弹 且 开 枪 了 的 玩 家
!M16_loading代 表 不 在 换 弹 的 玩 家
也 就 是  当   玩 家 正 常 开 枪 ,就 会 执  行 m16:shoot
这 个 m16:shoot是 一 个  循 环 函数,命令里去 掉 一些没什么 用的限制,剩下的  就是这样的:

  1. execute if entity @s[distance=..1000] run tag @e[distance=..1.5] add M16_shoot_by
  2. execute if entity @s[distance=..1000] unless entity @e[distance=..1.5] if block ~ ~ ~ #m16:through offset ^ ^ ^0.5 run function m16:shoot

复制代码

这两条命令是这个意思:如果执行者在1000格内,就给r=1.5内的实体加上M16_shoot_by标签,如果执行者在1000格内,但是r=1.5内没有实体,且所在的方块是可穿过方块,就以执行者朝向向前0.5格的位置为执行点再次执行本身这个function,这样就是一直往正前方移动检查1000格是否有 被 指 到的实体,直到检测到了实体或不可穿过方块
这里 如  何检测可穿过  或者 不 可穿过方块呢,利用的是1.13的新东西“标签”,可以给一些种类的方块加上同一个标签 方便检测,比如#minecraft:wool就可以代表所有种类的羊毛,可穿过方块是我手动整合出来的,如果不装该模组则无效,因为这涉及到数据包的具体用法,我就先不说了,知道这是可穿过方块就好了,主要还是要懂怎么检测玩家看的是哪个实体的原理

上面的 被加上M16_shoot_by的实 体就 是 被击 中的实体了,那么 如何 对这 个实 体造 成 伤 害呢,难道要用effect或 者是鬼 畜的弓 箭之类 的东 西??
新版本的execute可以解决这个问题

  1. execute as @e[tag=M16_shoot_by] store result score @s M16_damage run data get entity @s Health 1
  2. scoreboard players remove @e[tag=M16_shoot_by] M16_damage 8
  3. execute as @e[tag=M16_shoot_by] store result entity @s Health float 1 run scoreboard players get @s M16_damage
  4. execute as @e[tag=M16_shoot_by] run effect give @s minecraft:instant_health 1 31 true
  5. execute as @e[tag=M16_shoot_by] run effect give @s minecraft:instant_damage 1 31 true
  6. execute as @a[tag=M16_shoot_by] run effect give @s minecraft:instant_damage 1 0 true
  7. tag @e remove M16_shoot_by

复制代码

首先 被击 中的实 体,把自 己的Heal th血量 输出 到记 分板M16_damage上
减去 8分
再通 过execute赋 回Health标签,得到 的 Health就-8了,也就 是造成 了8 点伤害
但是 这样造 成伤 害生物不 会 变红
因为 31级 的瞬 间 伤害 和瞬间 治疗不会  对生物 造 成 伤害 或回 血,但是 会使 应该 受到 伤 害 的 实 体变 红,就 可以 伪 造 为 枪 造 成 伤 害 了
由于玩家 受 到 31级的瞬间 伤 害无反应,且不会被 修改Health标签,只能用 effect 一个 1级 的瞬间 伤害 这个 方法来减掉 玩家 的血量了,
因为 末影 龙 免 疫 药 水,所 以 末影龙  有 不 变 红  的bug
最后清掉标签

这样减 Health的 好 处 是毫无痕迹,但是 弊  端 是这样不会产 生 掉 落 物


更新
,在scoreboard players remove @e[tag=M16_shoot_by] M16_damage 8命令下面加了一条命令kill分数小于0的实体,就有掉落物了

其余真的没什么好说的,数据包的具体用法,可以在wiki自己研究研究

发表评论

您必须 登录 才能发表留言!