帖子

Memorial Edition

查看: 405|回复: 8

枪械数据包,如何让两把一样的枪有独立的弹夹

[复制链接]

Lv.4 矿工

人气
15 点
金粒
551 粒
宝石
0 颗
爱心
0 颗
钻石
30 颗
贡献
0 点

Java正版勋章Windows 10正版勋章

发表于 2024-12-22 23:03:40 | 显示全部楼层 |阅读模式
悬赏300金粒已解决
最近写数据包最大的问题了,同一把武器都是共用弹夹的(但是这个问题感觉很复杂,金粒也没什么用,希望有佬能解答一下www)(如果有视频链接贴一个也行)

最佳答案

查看完整内容

在《我的世界》数据包中,要实现两把看似相同的枪有独立的弹夹,核心问题在于如何区分这两把枪,并且让它们的弹夹数据互不干扰。由于《我的世界》原生的物品系统并不支持像现实中那样直接管理独立的弹夹,你需要通过一些间接的方式来模拟这一机制。通常的方法是利用物品的 NBT 标签、ID 或自定义名称来区分不同的枪 解决方案 1.使用 NBT 标签:每把枪可以有一个独立的 NBT 标签来表示它的弹夹数量。这就能区分不同枪的弹夹数据 ...

Lv.5 农夫

人气
12 点
金粒
311 粒
宝石
1 颗
爱心
4 颗
钻石
120 颗
贡献
0 点

Java正版勋章Windows 10正版勋章石镐矿工勋章科比勋章_劲爽款

发表于 2024-12-22 23:03:41 | 显示全部楼层
本帖最后由 爱玩游戏的阿坤 于 2024-12-25 20:53 编辑

在《我的世界》数据包中,要实现两把看似相同的枪有独立的弹夹,核心问题在于如何区分这两把枪,并且让它们的弹夹数据互不干扰。由于《我的世界》原生的物品系统并不支持像现实中那样直接管理独立的弹夹,你需要通过一些间接的方式来模拟这一机制。通常的方法是利用物品的 NBT 标签、ID 或自定义名称来区分不同的枪



解决方案
1.使用 NBT 标签:每把枪可以有一个独立的 NBT 标签来表示它的弹夹数量。这就能区分不同枪的弹夹数据,避免共用

2.自定义物品名称或 ID:虽然可以通过物品名称区分,但最有效的方式还是利用 NBT 标签来标识和管理弹夹数量



实现步骤
假设你已经有了一个基础的枪械数据包,并且你需要为每把枪实现独立的弹夹

步骤 1:为每把枪定义 NBT 标签
通过在物品的 NBT 数据中添加自定义标签(比如ammo),来追踪每把枪的弹夹数量

  1. [color=#383a42][font=ui-monospace, SFMono-Regular, &quot][size=11.9px]{[/size][/font][/color]
  2. [color=#383a42][font=ui-monospace, SFMono-Regular, &quot][size=11.9px]  [/size][/font][/color][color=rgb(152, 104, 1)][font=ui-monospace, SFMono-Regular, &quot][size=11.9px]"ammo"[/size][/font][/color][color=rgb(56, 58, 66)][font=ui-monospace, SFMono-Regular, &quot][size=11.9px]:[/size][/font][/color][color=#383a42][font=ui-monospace, SFMono-Regular, &quot][size=11.9px] [/size][/font][/color][color=rgb(152, 104, 1)][font=ui-monospace, SFMono-Regular, &quot][size=11.9px]30[/size][/font][/color][color=#383a42][font=ui-monospace, SFMono-Regular, &quot][size=11.9px] [/size][/font][/color]
  3. [color=#383a42][font=ui-monospace, SFMono-Regular, &quot][size=11.9px]}[/size][/font][/color]
复制代码


在数据包中,你需要通过命令来修改和读取这些标签

步骤 2:创建枪的命令
首先,创建两把看似相同但独立的枪。假设你使用的物品是铁剑来模拟枪械



  1. # 创建枪并赋予它 NBT 标签
  2. /execute as @p run give @s minecraft:iron_sword{CustomModelData:1,display:{Name:"{"text":"AK47"}"},Ammo:30}

复制代码



上面的命令给玩家一把名字为AK47的铁剑,并且附加一个名为Ammo的 NBT 标签,表示这把枪有 30 发子弹

步骤 3:管理枪械的弹夹

每次玩家使用枪时,需要减少弹夹中的子弹数。当弹夹用完时,可以通过命令禁用枪的射击功能,或者提示玩家重新装填



  1. # 使用枪时减少子弹数量
  2. /execute as @p[nbt={SelectedItem:{id:"minecraft:iron_sword",Count:1,tag:{Name:"{"text":"AK47"}",Ammo:1}}}] run function your_namespace:shoot

复制代码


上面的命令会检测玩家是否拿着一把 AK47 的枪,并且弹夹内剩余 1 发子弹。如果满足条件,玩家发射后,子弹数减少



  1. # 在 `your_namespace:shoot` 中,减少弹夹数量并更新枪的数据
  2. /execute as @p run data modify entity @s SelectedItem.tag.Ammo set value 29

复制代码


步骤 4:检查子弹是否为零

当子弹数量为零时,你可以禁用射击行为,或者让玩家知道需要重新装填



  1. # 检查子弹是否为零
  2. /execute as @p[nbt={SelectedItem:{id:"minecraft:iron_sword",tag:{Ammo:0}}}] run say "你的枪已经没有子弹了!请重新装填!"

复制代码



步骤 5:重新装填
为了让玩家重新装填弹夹,可以通过添加一个 "装填" 命令来恢复弹夹中的子弹数




  1. # 给枪重新装填,恢复弹夹
  2. /execute as @p[nbt={SelectedItem:{id:"minecraft:iron_sword",tag:{Ammo:0}}}] run data modify entity @s SelectedItem.tag.Ammo set value 30

复制代码



进阶:使用不同的枪
你可以通过改变CustomModelData或者Name来区分不同的枪。例如:

枪1:CustomModelData:1
枪2:CustomModelData:2
然后在命令中检查具体的CustomModelDataName

来决定是哪把枪以及如何管理弹夹。


  1. # 检查是否是不同的枪,并管理不同的弹夹数量
  2. /execute as @p[nbt={SelectedItem:{CustomModelData:1}}] run data modify entity @s SelectedItem.tag.Ammo set value 30
  3. /execute as @p[nbt={SelectedItem:{CustomModelData:2}}] run data modify entity @s SelectedItem.tag.Ammo set value 50

复制代码



总结
通过利用 NBT 标签(比如Ammo),你可以为每把枪设置独立的弹夹数量,并在射击时减少弹夹里的子弹,直到其用尽。这种方法不仅让每把枪具有独立的弹夹,还可以灵活管理每把枪的属性,避免不同枪械之间的冲突

评分

参与人数 1爱心 +1 收起 理由
MRTangwin8 + 1 MCBBS有你更精彩~

查看全部评分

回复

使用道具 举报

Lv.7 猎手

人气
124 点
金粒
3855 粒
宝石
2 颗
爱心
1 颗
钻石
568 颗
贡献
0 点

Java正版勋章Windows 10正版勋章

发表于 2024-12-22 23:57:12 来自手机 | 显示全部楼层
感觉可以试试用attribute做物品独立
回复

使用道具 举报

Lv.4 矿工

人气
15 点
金粒
551 粒
宝石
0 颗
爱心
0 颗
钻石
30 颗
贡献
0 点

Java正版勋章Windows 10正版勋章

 楼主| 发表于 2024-12-24 10:07:02 | 显示全部楼层
XoHADoX 发表于 2024-12-22 23:57
感觉可以试试用attribute做物品独立

这个不是生物的属性吗
回复

使用道具 举报

Lv.7 猎手

人气
124 点
金粒
3855 粒
宝石
2 颗
爱心
1 颗
钻石
568 颗
贡献
0 点

Java正版勋章Windows 10正版勋章

发表于 2024-12-28 15:29:58 来自手机 | 显示全部楼层
Mineaster 发表于 2024-12-24 10:07
这个不是生物的属性吗

物品属性吧,在主手上加攻击力的那个
回复

使用道具 举报

Lv.7 猎手

人气
124 点
金粒
3855 粒
宝石
2 颗
爱心
1 颗
钻石
568 颗
贡献
0 点

Java正版勋章Windows 10正版勋章

发表于 2024-12-28 19:18:19 | 显示全部楼层
Mineaster 发表于 2024-12-24 10:07
这个不是生物的属性吗

搞错了
那就说说data的思路
数据提取相对来说比较简单,data get能直接获得,再用execute store score储存到计分板上做数据处理
难点应该在修改数据(data无法直接修改playerdata),可以先把物品复制到一个容器里(1.17前用replaceitem,1.17后用item),然后在修改容器里的物品数据,最后在放回主手(1.17前的话要用潜影盒大法,1.17后的话直接item就可以)
举个例子,我一般会在玩家上空生成一个箱子矿车,然后用item复制主手物品进去。
  1. summon chest_minecart ~ ~500 ~ {NoGravity:1b,Invulnerable:1b,Tags:[return]}
  2. item replace entity @e[tag=return,type=chest_minecart] container.0 from entity @s weapon.mainhand
复制代码

data就可以直接修改箱子矿车里物品的data数据
  1. data modify entity @e[limit=1,sort=nearest,type=chest_minecart,tag=return] Items[0].components set ...
复制代码

放回主手直接item,如果在1.17前的话我也不会(没用过潜影盒大法),你去b站上搜搜应该有。
  1. item replace entity @s weapon.mainhand from entity @e[limit=1,sort=nearest,type=chest_minecart,tag=return] container.0
复制代码

这样应该就可以做到物品独立了(我也没做过
回复

使用道具 举报

Lv.7 猎手

人气
124 点
金粒
3855 粒
宝石
2 颗
爱心
1 颗
钻石
568 颗
贡献
0 点

Java正版勋章Windows 10正版勋章

发表于 2024-12-28 19:22:41 | 显示全部楼层
搞错了
那就说说data的思路
数据提取相对来说比较简单,data get能直接获得,再用execute store score储存到计分板上做数据处理
难点应该在修改数据(data无法直接修改playerdata),可以先把物品复制到一个容器里(1.17前用replaceitem,1.17后用item),然后在修改容器里的物品数据,最后在放回主手(1.17前的话要用潜影盒大法,1.17后的话直接item就可以)
举个例子,我一般会在玩家上空生成一个箱子矿车,然后用item复制主手物品进去。
  1. summon chest_minecart ~ ~500 ~ {NoGravity:1b,Invulnerable:1b,Tags:[return]}
  2. item replace entity @e[tag=return,type=chest_minecart] container.0 from entity @s weapon.mainhand
复制代码

data就可以直接修改箱子矿车里物品的data数据
  1. data modify entity @e[limit=1,sort=nearest,type=chest_minecart,tag=return] Items[0].components set ...
复制代码

放回主手直接item,如果在1.17前的话我也不会(没用过潜影盒大法),你去b站上搜搜应该有。
  1. item replace entity @s weapon.mainhand from entity @e[limit=1,sort=nearest,type=chest_minecart,tag=return] container.0
复制代码

这样应该就可以做到物品独立了(我也没做过

说起来牢坛居然没给我发互动提醒,如果不是今天有兴致看到了这个,我都不知道你回复我了
回复

使用道具 举报

Lv.4 矿工

人气
15 点
金粒
551 粒
宝石
0 颗
爱心
0 颗
钻石
30 颗
贡献
0 点

Java正版勋章Windows 10正版勋章

 楼主| 发表于 2024-12-29 00:30:34 | 显示全部楼层
XoHADoX 发表于 2024-12-28 19:22
搞错了
那就说说data的思路
数据提取相对来说比较简单,data get能直接获得,再用execute store score储存 ...

这么看还是偏穷举了,不过应该也没更好的办法了,还是得一把武器一个弹夹的穷举啊
回复

使用道具 举报

Lv.4 矿工

人气
15 点
金粒
551 粒
宝石
0 颗
爱心
0 颗
钻石
30 颗
贡献
0 点

Java正版勋章Windows 10正版勋章

 楼主| 发表于 2024-12-29 00:32:22 | 显示全部楼层
爱玩游戏的阿坤 发表于 2024-12-25 20:27
在《我的世界》数据包中,要实现两把看似相同的枪有独立的弹夹,核心问题在于如何区分这两把枪,并且让它们 ...

我做的枪是计分板记录子弹的,不过竟然可以用NBT标签记录子弹数是真没想到,谢谢佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为难当前,唯有责任。

Archiver|小黑屋| MCBBS纪念版 ( 新ICP备2024014954号|兵公网安备66010002000149号 )|隐私政策| 手机版

GMT+8, 2025-1-18 13:02 , Processed in 0.116454 second(s), 32 queries , Redis On.

"Minecraft"以及"我的世界"为美国微软公司的商标 本站与微软公司没有从属关系

© 2010-2025 MCBBS纪念版 版权所有 本站内原创内容版权属于其原创作者,除作者或版规特别声明外未经许可不得转载

返回顶部