- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】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.
本文围绕 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)是每一次发射的完整动作,其行为对持续射击模式同样适用:
- 弹药检索:通过
findAmmo(player)查找玩家手中或背包中匹配的弹射物物品;若勾选了projectileDisableAmmoCheck(跳过弹药检查),则直接构造弹射物、无需消耗弹药(第 379-395 行); - 发射判定:只有创造模式(
instabuild)或身上有弹药时才真正发射;自定义弹射物调用其shoot(...),原版箭则shootFromRotation(...)以固定 3.15 的速度射出(蓄力模式会乘以pullingPower); - 音效:播放
entity.arrow.shoot音效; - 耐久消耗:若物品设置了伤害次数(
damageCount != 0),每次发射hurtAndBreak(1, ...); - 弹药消耗:非创造模式下,若弹药栈可损耗则
hurtAndBreak(1, ...),否则stack.shrink(1)减少数量; - 事件触发:若定义了“远程物品使用后”(
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.
相关推荐
MCreator 工具效率(Efficiency)参数详解:从界面配置到代码生成原理
MCreator 工具效率(Efficiency)参数详解:从界面配置到代码生成原理 本文围绕 MCreator 的「工具」(Tool)元素中「效率」(Effi
低代码代码生成桌面应用游戏开发MCreator 进度弹窗通知(Show Toast)配置详解:从界面选项到 JSON 生成原理
MCreator 进度弹窗通知(Show Toast)配置详解:从界面选项到 JSON 生成原理 导读 本文聚焦 MCreator 中"进度(Advanceme
低代码代码生成桌面应用游戏开发MCreator 弹射物击退(Knockback)参数详解:从配置含义到生成代码实现
MCreator 弹射物击退(Knockback)参数详解:从配置含义到生成代码实现 导读 本文围绕 MCreator 项目( 项目根目录 https://li
低代码代码生成桌面应用游戏开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考