☰
MCreator 远程武器“持续射击”选项详解:从界面配置到代码生成原理
2026/10/17 2:30:38 网站建设 项目流程
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】MCreator

MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.

项目地址:https://gitcode.com/gh_mirrors/mc/MCreator
点击查看免费下载

本文围绕 MCreator 远程物品(Ranged Item)编辑器中“Shoot constantly when active?”(持续射击)这一选项展开。该选项让远程武器在玩家按住右键期间持续发射弹射物,是实现“机关枪”“自动炮台”类自定义物品的关键开关。读完本文,你将掌握该选项在编辑界面中的位置与联动逻辑、它生成的 Minecraft 代码形态、与“蓄力射击”的互斥关系,以及弹药、耐久和触发事件在持续射击模式下的行为。

MCreator 是一款开源的 Minecraft Java 版模组、基岩版 Add-On、资源包与数据包制作工具,其内置的可视化物品编辑器支持定义远程武器(可发射弹射物的物品)。帮助文档(默认英文) 对该选项的核心语义描述为:“If checked, the ranged item will constantly shoot when the player right-clicks it.”(勾选后,玩家右击远程物品时将不断射击),对应的简体中文帮助条目表述为“如果勾选该参数,在玩家右击时远程物品时将不断射击”。本文将以这一选项为线索,结合仓库源码说明其完整工作链路。

一、选项位置:远程物品属性面板

在 MCreator 的 GUI 编辑界面中,该选项位于Ranged item properties(远程物品属性)面板。从源码看,面板布局与选项组织定义在 ItemGUI.java:

  • 面板包含enableRanged(是否启用远程/发射弹射物)、projectile(选择弹射物)、projectileDisableAmmoCheck(是否跳过弹药检查)、shootConstantly(持续射击)与rangedItemChargesPower(是否蓄力射击)五个控件;
  • 每个控件都通过HelpUtils.wrapWithHelpButton绑定对应的帮助条目,其中shootConstantly绑定的正是item/shoot_constantly帮助文档,点击问号即可看到本文开头引用的说明文字;
  • 选项文案 “Shoot constantly when active?” 定义于本地化文件 texts.properties。

二、与“蓄力射击”的互斥联动

shootConstantly与rangedItemChargesPower(蓄力射击,类似原版弓的拉弦蓄力)在逻辑上是互斥的。这一联动在 ItemGUI.java 中实现:

shootConstantly.addActionListener(_ -> { rangedItemChargesPower.setEnabled(!shootConstantly.isSelected()); if (shootConstantly.isSelected()) rangedItemChargesPower.setSelected(false); });

即:一旦勾选“持续射击”,“蓄力射击”复选框会立即被取消勾选并置灰;反过来取消“持续射击”后,“蓄力射击”重新可选。这符合游戏机制——持续射击模式每次发射都是满威力直发,不需要也不应该存在“按住蓄力”的行为。

另外,该选项只有在enableRanged(启用远程)被勾选时才可用。updateRangedPanel()方法(ItemGUI.java)负责联动:启用远程时,shootConstantly、projectile、projectileDisableAmmoCheck等控件全部激活;关闭远程时则全部禁用,且界面会自动把使用时长(use duration)恢复为 0、把渲染类型和动画切回普通物品。

三、保存与加载的数据模型

该选项在数据模型层面对应物品元素(Item)的一个布尔字段。定义见 Item.java:

public boolean enableRanged; public boolean shootConstantly; public boolean rangedItemChargesPower; @NonNullIf("enableRanged") public ProjectileEntry projectile;
  • shootConstantly与enableRanged、rangedItemChargesPower并列,均为布尔字段;
  • projectile字段带有@NonNullIf("enableRanged")注解,表示只要启用了远程射击就必须指定弹射物;
  • 与之配套的还有 useDuration(使用时长)字段,其初始值为 0、取值范围为 -100 ~ 128000。

界面读写时通过shootConstantly.setSelected(item.shootConstantly)加载、item.shootConstantly = shootConstantly.isSelected()保存(见 ItemGUI.java 与 ItemGUI.java)。

值得注意的是,RangedItemToProjectileAndItemConverter(2023.4 版本引入的转换器)也会引用该字段——这是 MCreator 将旧版“远程物品”模型迁移为新“远程物品 + 弹射物”模型时保留该选项语义的证据。

四、代码生成:持续射击的底层实现

MCreator 生成模组代码时,会把该选项翻译成 MinecraftItem子类中对releaseUsing与onUseTick两个方法的重写。核心逻辑位于 NeoForge 生成器模板 item.java.ftl。

4.1 普通远程武器:松开右键才发射

当enableRanged为真且shootConstantly为假时,模板生成releaseUsing(...)方法,即玩家松开右键时才执行发射逻辑(模板第 330-354 行):

<#if hasProcedure(data.onStoppedUsing) || (data.enableRanged && !data.shootConstantly)> @Override public void releaseUsing(ItemStack itemstack, Level world, LivingEntity entity, int time) { ... <#if data.enableRanged && !data.shootConstantly> if (!world.isClientSide() && entity instanceof ServerPlayer player) { <#if data.rangedItemChargesPower> float pullingPower = BowItem.getPowerForTime(this.getUseDuration(itemstack, player) - time); if (pullingPower < 0.1) return; </#if> <@arrowShootCode/> } </#if> } </#if>

可以看到:若同时启用了蓄力射击(rangedItemChargesPower),还会通过BowItem.getPowerForTime(...)计算拉弦力度,力度过小(< 0.1)则不发射——这正是原版弓的手感。

4.2 持续射击:每 tick 发射并立即结束使用

当enableRanged与shootConstantly同时为真时,模板生成onUseTick(...)方法(模板第 356-376 行):

<#if hasProcedure(data.everyTickWhileUsing) || (data.enableRanged && data.shootConstantly)> @Override public void onUseTick(Level world, LivingEntity entity, ItemStack itemstack, int time) { ... <#if data.enableRanged && data.shootConstantly> if (!world.isClientSide() && entity instanceof ServerPlayer player) { <@arrowShootCode/> entity.releaseUsingItem(); } </#if> } </#if>

onUseTick是 Minecraft 中“物品正在被使用期间每个游戏刻(tick,1/20 秒)回调”的钩子。该模板在每个 tick都执行一次arrowShootCode(发射弹射物),随后立即调用entity.releaseUsingItem()结束本次使用。由于玩家仍按住右键,物品会立刻重新进入使用状态,于是下一个 tick 再次发射——最终呈现的效果就是“按住右键持续连射”,也就是帮助文档所说的“不断射击”。

同时注意第 330 行的条件:当shootConstantly为真时,releaseUsing只在存在“停止使用”事件(onStoppedUsing流程)时生成,避免与onUseTick中的自动releaseUsingItem产生重复发射。

五、发射宏:弹药、耐久与触发事件

模板中的<@arrowShootCode/>宏(item.java.ftl)是每一次发射的完整动作,其行为对持续射击模式同样适用:

  1. 弹药检索:通过findAmmo(player)查找玩家手中或背包中匹配的弹射物物品;若勾选了projectileDisableAmmoCheck(跳过弹药检查),则直接构造弹射物、无需消耗弹药(第 379-395 行);
  2. 发射判定:只有创造模式(instabuild)或身上有弹药时才真正发射;自定义弹射物调用其shoot(...),原版箭则shootFromRotation(...)以固定 3.15 的速度射出(蓄力模式会乘以pullingPower);
  3. 音效:播放entity.arrow.shoot音效;
  4. 耐久消耗:若物品设置了伤害次数(damageCount != 0),每次发射hurtAndBreak(1, ...);
  5. 弹药消耗:非创造模式下,若弹药栈可损耗则hurtAndBreak(1, ...),否则stack.shrink(1)减少数量;
  6. 事件触发:若定义了“远程物品使用后”(onRangedItemUsed)流程,每次发射都会执行。

因此在持续射击模式下,只要玩家背包弹药充足(或处于创造模式),武器会以每 tick 一发(每秒 20 发)的频率倾泻弹药,同时以同样频率消耗耐久与触发事件流程——设计自动武器时必须留意弹药消耗速度与耐久上限。

六、不同生成器版本的一致性

同样的选项逻辑也存在于较新的生成器插件中。在 generator-26.3.x 的 neoforge-26.3 模板 中,releaseUsing与onUseTick的生成条件、持续射击分支结构与 1.21.1 生成器完全一致(releaseUsing仅在enableRanged && !shootConstantly时发射、onUseTick在enableRanged && shootConstantly时每 tick 发射并releaseUsingItem)。这意味着你在 MCreator 中基于不同 Minecraft 版本的生成器制作远程武器时,“持续射击”的行为保持一致。

七、使用时长(Use Duration)与注意事项

持续射击依赖“按住右键期间物品一直处于使用中”这一前提,因此useDuration(使用时长)必须足够长。界面逻辑会在启用远程时自动将使用时长调整为 72000 tick(即 Minecraft 中一小时,约等于无限使用时间),见 ItemGUI.java:

if ((int) useDuration.getValue() == 0) useDuration.setValue(72000);

与此对应,若使用时长为 0,“停止使用”事件(onStoppedUsing)会被禁用(ItemGUI.java)。也就是说,持续射击模式通常与 72000 的默认使用时长配合使用,不建议手动把时长改小,否则可能在一次右键期间无法完成足够多次发射。

从源码结构看,还有两点值得注意:

  • 若同时勾选“持续射击”并在“使用中每 tick”事件(everyTickWhileUsing)中编写了流程,则每个 tick 会先执行该流程、再执行发射(见模板第 358-368 行),可用于实现射击冷却、连发数统计等自定义逻辑;
  • 仓库的集成测试数据生成器 TestWorkspaceDataProvider.java 中,测试用例刻意将shootConstantly与rangedItemChargesPower设为互斥取值(item.rangedItemChargesPower = !item.shootConstantly),印证了二者不可同时启用的设计约束。

八、小结

“持续射击”是 MCreator 远程物品编辑器中一个“小而关键”的开关:它在 GUI 上表现为一个复选框,在数据模型中对应Item.shootConstantly布尔字段,在生成代码层面则通过onUseTick每 tick 发射并调用releaseUsingItem实现按住右键的自动连发。它与“蓄力射击”互斥,依赖 72000 tick 的长使用时长,并受弹药检查、耐久消耗与事件触发等既有机制的共同约束。理解这一选项的完整链路,可以帮助你更精确地设计诸如自动步枪、机关炮台、激光炮等自定义远程武器。

延伸阅读

  • 远程物品帮助条目(英文默认)、简体中文版本
  • Item 数据模型定义
  • 物品 GUI 面板与联动逻辑
  • NeoForge 1.21.1 物品代码模板
  • NeoForge 26.3 物品代码模板
  • 集成测试中的选项互斥验证
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】MCreator

MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.

项目地址:https://gitcode.com/gh_mirrors/mc/MCreator
点击查看免费下载

相关推荐

上一篇:Rivet Actors Rust SDK 之 NsApi 解析:用 `create_namespace` 创建 Namespace 的完整指南
下一篇:TanStack Form TypeScript 完全指南:类型安全表单状态管理的内核解析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询