跳转到内容

注册表参考

ModularShoot 通过 10 张动态注册表(DataPackRegistry)存储所有定义。全部支持 /reload 热重载和客户端同步。

注册表概览

注册表 ID用途值类型
modularshoot:guns枪械定义GunDefinition
modularshoot:plugins插件定义PluginDefinition
modularshoot:plugin_types插件种类定义PluginTypeDefinition
modularshoot:traits布尔特性定义Trait
modularshoot:attribute_meta属性元数据AttributeMeta
modularshoot:states持久状态定义StateDefinition
modularshoot:variants随机变体定义VariantDefinition
modularshoot:shooters发射者定义(独立发射配置模板)ShooterDefinition
modularshoot:gun_items物品→枪械绑定GunItemBinding
modularshoot:plugin_items物品→插件绑定PluginItemBinding

属性本体Attribute 实例)不在上述动态注册表中——须用原版 DeferredRegister 注册到 BuiltInRegistries.ATTRIBUTE。元数据表仅存储默认值、显示信息和绑定关系。

枪械定义(GunDefinition)

注册表:modularshoot:guns

字段类型必需默认值说明
name可选字符串无(回退到枪械 ID 路径部分)显示名称,支持 § 颜色代码和 lang: 翻译键前缀
texture资源路径枪械基础纹理路径,原版物品渲染管线立体化处理
shootTexture可选资源路径无(始终使用基础纹理)射击时切换的纹理路径
shootTextureMode枚举PER_SHOT射击纹理切换模式。仅在指定了 shootTexture 时生效
textureScale枚举AUTO渲染几何是否随纹理分辨率缩放。AUTO(16 像素 = 1 格,32×32 纹理渲染为 2 倍大)/ FIXED(固定 16×16 单位网格)。基础纹理与射击纹理分别按各自尺寸缩放
attributeMount枚举ITEM属性挂载点(JSON 键 attribute_mount):ITEM(默认,物品侧,框架照常写入主手属性修饰符组件)/ PLAYER(玩家侧,框架不向物品写入属性修饰符组件,挂载责任转移给声明方,如将修饰符挂在玩家实体上)
stats属性ID→浮点数映射空映射属性基础值。键为 attribute_meta 已登记条目的逻辑 id;裸键自动补 modularshoot 命名空间(如 hit_damagemodularshoot:hit_damage),显式 minecraft: 前缀同样归一为 modularshoot,其他显式命名空间原样保留。未声明的属性使用元数据表的默认值。支持任意已登记条目(不限于框架预置的 10 个):数据包新增 attribute_meta 条目后,stats 自动支持该键
traits特性ID→布尔值映射空映射枪械固有特性覆盖。枪械声明的特性始终覆盖所有插件
variants变体ID→浮点数映射空映射变体池基础权重:变体 ID → 基础权重。每发射击实时组装变体池,与插件 addsVariants 同变体求和,并经贡献者权重修饰符调整后加权随机选举(详见「变体定义(VariantDefinition)」)
extraValues命名空间数字映射空映射扩展数值字段:键为 ResourceLocation(须带命名空间)、值为数字。框架只承载与按 key 求和、不解释语义;getExtraValueSums / getExtraValue 返回时与已安装插件累加值相加(枪械定义为基础值)
slots种类ID→整数映射空映射插件插槽配置,键为插件种类 ID,值为插槽数量
sounds字符串→资源路径映射空映射音效绑定。预置槽位 shoot(射击声),可自定义槽位名称
soundRange可选浮点数无(使用音效事件自带范围,默认 16 格)射击音效可听半径(格)覆盖。JSON 键 sound_range;缺省时使用音效事件自带范围(默认 16 格)
bulletStyle可选子弹样式无(回退框架默认外观 ComposedBulletStyle.FALLBACK_BASE,billboard + 默认纹理)子弹视觉外观配置

子弹样式(BulletStyle)

v2 结构(修饰符叠加):旧版的 model 对象 + render_mode 已废弃,替换为 base + modifiers。多个来源(枪械 / 插件 / 特性 / 状态条件)的修饰符会叠加组合而非整体覆盖。

字段类型必需默认值说明
base可选对象基础外观(见下)。缺失时回退框架默认外观(billboard + 默认纹理)
modifiers可选列表空列表叠加修饰符(见下),按 "type" 分发;未知 type 容忍解码为 UnsupportedModifier 哨兵,不导致整个列表解析失败

base 子字段:

字段类型必需默认值说明
render_mode枚举渲染模式:BILLBOARD(始终面向玩家的 2D 精灵)或 THREE_D(原版静态 3D 模型)
texture可选资源路径billboard 模式纹理路径(3d 模式不填)
model可选资源路径3d 模式模型路径(billboard 模式不填)。texture / model 二选一

modifiers 修饰符类型表:

type字段合并规则
scalevalue(浮点数,>0)连乘:所有来源的 scale 值相乘为最终视觉缩放。NaN/≤0 跳过并告警
tintcolor(数组 [r,g,b][r,g,b,a],各通道 0~1)逐通道连乘:所有来源的 tint 逐通道相乘。负/NaN 通道跳过并告警;>1 clamp 到 1
attach_layerrender_mode/texture/model/follow_rotation/follow_scale/offset/scale/tint并行绘制:独立层叠加在 base 之上,不参与 scale/tint 连乘;自身 scale/tint 只作用于本层

射击纹理模式(ShootTextureMode)

枚举值说明
PER_SHOT每次射击瞬间切换到射击纹理,之后立即切回基础纹理。高速射击时纹理高频闪烁
WHILE_FIRING按住左键射击期间持续显示射击纹理,松开后切回。适合连发枪械,避免闪烁

插件定义(PluginDefinition)

注册表:modularshoot:plugins

注册方式(0.3.0 起):数据包 JSON(data/<命名空间>/modularshoot/plugins/<id>.json)或 Java API(ModularShootAPI.registerPlugin,优先于数据包同名条目且不受 /reload 影响),另支持动态定义提供者(registerPluginDefinitionProvider,查询时计算,适合随机战利品/动态词缀)。详见 API 参考「注册 API」

字段类型必需默认值说明
tags资源路径列表空列表匹配用标签。与种类 tags 存在交集即可安装。空列表时无法安装(输出 WARN)
priority整数0特性冲突优先级,越大越优先。不继承种类优先级
visualPriority可选整数无(回退 priority视觉 base 选举优先级(JSON 键 visual_priority)。仅在插件 bulletStyle 的 base 参与视觉组合选举时生效,不影响特性冲突裁决;缺省回退 priority
itemIcon资源路径插件在背包/快捷栏中的图标纹理路径
textureScale枚举AUTO图标渲染几何是否随纹理分辨率缩放,语义同枪械的 textureScaleAUTO / FIXED
modifiers修饰符列表空列表属性修饰符数组,安装后叠加到枪械属性
traits特性ID→布尔值映射空映射安装后提供的特性覆盖
addsVariants变体ID→浮点数映射空映射追加进枪械变体池的基础权重。安装后与枪械声明的同变体权重求和(详见「变体定义(VariantDefinition)」)
addsSlots种类ID→整数映射空映射槽位扩展(JSON 键 adds_slots):安装后增加指定槽位数量,或创造枪械原本没有的槽位类型。有效键集 = 枪械 slots ∪ 已装插件 adds_slots 键;有效容量 = 枪械值 + Σ 已装插件贡献。值为任意整数(负数表示占用槽位,容量 ≤ 已装数量时该槽位不可再装)。键须引用 plugin_types 注册表;裸键自动补 modularshoot 命名空间(与枪械 slots 规则一致)。安装匹配与 tooltip 插件栏均按有效槽位计算;卸载超编预检见 API 文档「卸载超编预检」
exclusiveGroup可选字符串互斥组 ID。同一枪上不能安装两个互斥组 ID 相同的插件
bulletStyle可选子弹样式子弹样式叠加。安装后与枪械的样式叠加组合:base 按 visual_priority 选举(缺省回退 priority;同值后装赢,无候选回退框架默认外观),modifiers 全部叠加(scale 连乘、tint 逐通道连乘、attach_layer 全部保留)
textureOverlay可选纹理叠加纹理叠加信息。安装后在枪械纹理上叠加图层
gunOutline可选描边规格整枪描边规格(见下文「描边规格(OutlineSpec)」)。安装后围绕枪械合成纹理的最终轮廓描边,多插件按宽度从宽到窄同心嵌套
extraValues命名空间数字映射空映射扩展数值字段:键为 ResourceLocation、值为数字。框架只承载与按 key 求和(经 ModularShootAPI.getExtraValueSums / getExtraValue 读取),不解释语义,供集成模组携带自定义数值(如稀有度值)并在插件安装/拆卸事件中累加到枪械上
name可选字符串插件显示名称,支持 § 颜色代码
brief可选字符串一行简介,tooltip 默认层级显示
description可选字符串多行详细描述,tooltip Shift 层级显示
color可选字符串插件名称颜色(如 #FF4444

修饰符(PluginModifier)

字段类型必需默认值说明
attribute字符串目标属性名。若不带命名空间,自动使用 modularshoot 命名空间
operation枚举运算类型。ADD(加算)、MULTIPLY(普通乘算)、MULTIPLY_TOTAL(最终乘算)
value浮点数修饰数值

纹理叠加(TextureOverlay)

字段类型必需默认值说明
texture资源路径叠加到枪械纹理上的图层纹理路径
layer整数层级,越大越靠上。同层级按安装顺序(后装覆盖先装)
alignment枚举TOP_LEFT九宫格对齐:TOP_LEFT / TOP_CENTER / TOP_RIGHT / CENTER_LEFT / CENTER / CENTER_RIGHT / BOTTOM_LEFT / BOTTOM_CENTER / BOTTOM_RIGHT。仅 fitNONE 时生效
fit枚举NONE适配模式:NONE(不缩放,按对齐混合,超出画布的部分被裁剪并输出 WARN)/ FILL(双线性插值拉伸铺满画布,宽高比不同会变形)/ CONTAIN(等比缩放至完整可见,居中留透明边)
tint4 元素浮点数组白色 [1,1,1,1](恒等)叠加层像素的逐通道 RGBA 乘数,混合前应用。白色恒等不变
blend枚举NORMAL与底层像素的颜色混合模式:NORMAL(普通 source-over 合成:不透明处替换、半透明处混色)/ MULTIPLY(相乘,变暗)/ SCREEN(反相相乘,变亮)/ ADD(相加并 clamp 到 1,变亮)。仅影响颜色通道,alpha 始终用普通 over 合成
outline可选描边规格沿叠加层自身 alpha 轮廓描边,格式同描边规格(OutlineSpec)。描边在 tint 之后绘制,不受 tint 影响

描边规格(OutlineSpec)

字段类型必需默认值说明
colorRGB 浮点数组描边颜色,三元素 0-1 浮点数组(如 [1.0, 0.2, 0.1]
alpha浮点数1.0描边透明度
width整数1描边宽度(像素)。多插件描边按宽度从宽到窄同心嵌套,同宽后安装覆盖先安装

动态描边(逐帧变色):描边颜色默认在合成时烘焙为静态色。集成模组若需逐帧变色,可在客户端初始化时向 DynamicOutlineTintRegistry 以插件 id 为键注册 GunOutlineTintProvider(函数式接口 (ItemStack, float partialTick) → Vector4f RGBA):

java
// 客户端初始化(如 @Mod(Dist.CLIENT) 构造函数)
DynamicOutlineTintRegistry.register(
    ResourceLocation.parse("examplemod:prismatic_core"),
    (stack, partialTick) -> /* 每帧颜色,如色相随时间旋转的彩虹 */);

渲染时凡安装该插件的枪械,其描边逐帧取 provider 颜色(白色描边遮罩 × 每帧 tint,缓存纹理无需重建);未注册 provider 的描边保持静态烘焙色。框架内置带 gun_outline 的演示插件为 modularshoot:fragment_guard(守护蓝光)与 modularshoot:fragment_shining(金色圣光),均为静态烘焙色;不内置动态描边演示,逐帧变色须由集成模组按上述方式经 DynamicOutlineTintRegistry 注册。

插件种类定义(PluginTypeDefinition)

注册表:modularshoot:plugin_types

字段类型必需默认值说明
tags资源路径列表空列表匹配用标签。与插件 tags 存在交集即可安装。空列表时无法匹配任何插件(输出 WARN)
priority整数0显示优先级(tooltip 中种类排序)+ 安装自动选择的二级排序键。不影响插件特性冲突优先级
name可选字符串种类显示名称
color可选字符串种类名称颜色(如 #FFAA00

特性定义(Trait)

注册表:modularshoot:traits

字段类型必需默认值说明
defaultValue布尔值特性默认值,枪械未声明该特性时使用
description字符串""(空字符串)说明文本
name可选字符串无(回退到特性 ID 路径部分)特性显示名称,支持 § 颜色代码和 lang: 翻译键前缀
color可选字符串特性名称颜色(如 #FF8800
brief可选字符串一行简介,tooltip Alt 层级显示
forceShow布尔值false是否强制展示。true 时无论特性值为何都在 tooltip 显示
priority整数0显示优先级,越大越靠前
visual_modifiersModifier 列表空列表视觉修饰符列表(格式同 bullet_style.modifiers)。特性激活时这些修饰符叠加进子弹视觉组合;未激活不生效

运行时行为(钩子回调)不存储在 Trait 定义中,需通过 registerTraitHook API 单独注册。

属性元数据(AttributeMeta)

注册表:modularshoot:attribute_meta

字段类型必需默认值说明
binds资源路径指向已注册的原版 Attribute ID。框架通过此字段定位 Attribute holder 参与修饰符挂载。三路径共用(挂载 / 结算 / 显示均经 binds 解析),可重绑到任意已注册原版属性。预置属性的逻辑 ID 与本体 ID 一致,binds 指向自身
defaultValue浮点数枪械未声明该属性时的基础值(参与 ADD_VALUE 计算)。可热重载。非原版 Attribute 的 base 值(后者恒为 0)
entityTypes实体类型 ID 列表[PLAYER](仅玩家)读取生效白名单(JSON 键 entity_types,默认 ["minecraft:player"]):仅列表内实体类型的属性值被框架读取,白名单外读取 0.0。挂载侧已把框架 10 个预置属性预挂载到全部实体类型(懒实例化),本字段只控制"谁的属性值生效"——纯数据包改动即可切换生效范围。shootersattribute_binds 同受此约束
description字符串""(空字符串)说明文本
color字符串""(空字符串)属性名称颜色(如 #FF4444
priority整数0显示优先级,越大越靠前
forceShow布尔值false是否强制展示。true 时即使值与默认值相同也在 tooltip 显示
unit可选字符串无(不显示单位)数值显示单位的翻译键(如 modularshoot.unit.per_second),渲染在 tooltip 数值之后;缺省不显示单位

binds 指向的属性未注册时:元数据条目保留,但修饰符不挂载、tooltip 不显示、读取返回 0。

数据包可将 binds 重绑到任意已注册原版属性(含 minecraft:*),如将 modularshoot:hit_damage 重绑到 minecraft:attack_damage。三路径(挂载/结算/显示)语义、base 偏移与 syncable 等约定见数据包格式文档

发射者定义(ShooterDefinition)

注册表:modularshoot:shooters

独立发射(炮塔、陷阱、Boss 攻击、脚本场景等非玩家发射源)的配置模板:给定数值模板,发射时从源实体实时读取属性值覆盖生成快照,交给 ModularShootAPI.fireBullet。注册表键(发射者 ID,如 modularshoot:bone_shooter)由注册表自身提供,不是 record 字段。

字段类型必需默认值说明
stats属性ID→浮点数映射—(非空)快照数值模板。JSON 键须带完整命名空间(如 "modularshoot:hit_damage"),自动补 modularshoot;空模板使条目加载失败
traits特性ID→布尔值映射空映射快照固有特性标志
bulletStyle可选子弹样式独立发射视觉样式(JSON 键 bullet_style,结构同枪械);缺失时用框架默认外观
shootSound可选发射音效发射音效(JSON 键 shoot_soundid 必填、volume/pitch 默认 1.0);缺失时静音
attributeBinds资源路径列表空列表属性绑定(JSON 键 attribute_binds):快照生成时从源实体实时读取并覆盖模板条目(可引入新键);读不到(源为 null / 未注册 WARN / 白名单未命中)保留模板值

createSnapshot(LivingEntity source, RegistryAccess registryAccess) 生成的快照遵循独立发射约定(gunId/gunInstanceUuid/shooternull),伤害类型留空由 fireBullet 门面补默认;音效不随发射自动播放,需调用 playShootSound(Level, Vec3)。Java API 经 registerShooter 注册的条目优先于数据包同名条目。JSON 字段完整说明见数据包格式文档

变体定义(VariantDefinition)

注册表:modularshoot:variants

字段类型必需默认值说明
baseWeight浮点数0.0基础权重兜底(JSON 键 base_weight)。仅当枪械/插件都未声明该变体时使用(典型场景:仅由 registerVariantContributor 引入的变体);已被枪械/插件声明的变体以声明权重为权威
traits特性ID→布尔值映射空映射选中后合并进快照:声明的特性值写入,未声明键保留原值
stats属性ID→数值映射空映射选中后只覆盖声明键(不整体替换快照属性表)
damageType可选资源路径选中后覆盖 ammo_damage_type 预设(变体优先)
bulletStyleOverride可选子弹样式视觉覆盖,格式同 bulletStyle(base + modifiers)。base 以最高优先级参与视觉组合选举(胜过枪械/插件/特性/状态条件),modifiers 照常叠加;仅服务端 compose 读取,不序列化到客户端

权重语义(三来源):变体池每发射击实时组装(不持久化),三种来源合并后按加权随机选举:

  1. 枪械定义 variants 声明的基础权重
  2. 已安装插件的 addsVariants——同变体与枪械权重求和
  3. registerVariantContributor 贡献的 AttributeModifier 权重修饰符——复用原版三阶段语义:ADD_VALUE 加算 → ADD_MULTIPLIED_BASE 只乘基础权重 → ADD_MULTIPLIED_TOTAL 乘整体。零基础且无加值时结果恒 0("火元素饰品对非火枪无效")

普通弹兜底:枪械未声明 variants 时,池中默认存在权重 1.0 的"普通子弹"候选(隐式,不写入任何 JSON);声明了 variants 的枪械无兜底。概率换算:P(变体X) = X 的最终权重 ÷ 池总权重(池总权重 = 所有正权重候选的最终权重之和,含兜底 1.0);两候选权重相等时各 50%,某变体 50% ⟺ 其权重 = 其余候选权重之和。示例:普通枪 + 火球插件 adds_variants: 1.0 → 池 {火球 1.0, 普通弹 1.0} → 火球恰 50%。

逐弹丸语义:变体对每颗弹丸独立 roll(一次选举只作用于本颗),霰弹中可混合出现不同变体或普通弹;权重全 0 或空池时本颗静默退化为普通弹。互斥单值字段(damageType / 视觉 base)必须走变体池;可叠加效果请走 registerShootEffect

状态定义(StateDefinition)

注册表:modularshoot:states

字段类型必需默认值说明
domain枚举归属域。GUN(per-gun,跟枪走,持久化在枪械 NBT)、PLAYER(per-player,跟玩家走,通过 AttachmentType 持久化)、BULLET(per-bullet,仅子弹生命周期内有效,不持久化)
valueType枚举值类型。INT / LONG / DOUBLE / FLOAT / BOOLEAN / STRING / UUID
defaultValue对象对应类型的零值初始值,类型须与 valueType 匹配。per-gun / per-player 首次访问时按此初始化
display状态显示显示元数据对象
visual_modifiers条件视觉修饰符批次列表空列表每批 = conditionstate / domain / op / value)+ modifiers 列表(格式同 bullet_style.modifiers)。条件成立时这些修饰符在子弹创建瞬间叠加进视觉组合

状态显示(StateDisplay)

字段类型必需默认值说明
name字符串状态在 tooltip 中的名称。支持 § 颜色代码和 lang: 翻译键前缀
color字符串否(可选)名称颜色(如 #FFAA00)。省略时用默认 tooltip 颜色
format字符串"{value}"显示模板,{value} 占位。如 "{value} 层" → tooltip 显示 击杀层数: 3 层
priority整数0tooltip 内排序,越大越靠前
hideDefault布尔值false值为默认值时不显示该行

物品绑定定义(GunItemBinding / PluginItemBinding)

注册表:modularshoot:gun_items / modularshoot:plugin_items

其他模组的物品绑定为枪械/插件——绑定后该物品 ID 的所有实例被视为框架枪械/插件,无需替换原物品(模型/纹理/获取途径全部保留,无"盗版"问题)。条目键(JSON 文件名)为任意 id,内容声明绑定目标。

字段类型必需说明
item资源路径被绑定的物品 ID(如 minecraft:diamond_sword
gun资源路径(gun_items)目标枪械定义 ID(modularshoot:guns 注册表中的条目)
plugin资源路径(plugin_items)目标插件定义 ID(modularshoot:plugins 注册表中的条目)

行为语义

  • 进背包即生效:绑定物品进入玩家背包(36 主格 + 副手)1 tick 内,服务端自动附加 gun_data 组件(含实例 UUID、基础属性修饰符),附加后与原生枪械运行时完全同构——可装插件、锁定、状态持久化、弹道回溯、反作弊版本号全部一致。
  • 插件绑定不附加组件:插件安装即消耗,pluginId 直接经绑定表解析。
  • 完全改造:绑定枪械左键近战由射击替代、原版附魔无效化、射击不损耗耐久。
  • 视觉 Tier 1:绑定物品保持原物品模型渲染;框架动态贴图管线(调色/叠加/描边/射击纹理切换)仅服务原生枪械。
  • 身份提示:未转化(无组件)的绑定枪械 tooltip 显示灰色标识行 枪械: <id> 与枪械定义中注册的基础属性/插槽预览;JEI、创造物品栏、背包悬停均可见。
  • 加载后校验(WARN 降级不拒收):item 必须存在于物品注册表;gun/plugin 必须存在于对应定义表;同一物品 ID 重复绑定 → 字典序最小条目键胜出,其余 WARN。
  • Java API 优先registerGunItem/registerPluginItem 注册的绑定优先于数据包条目;数据包中与 Java API 冲突的条目加载时 WARN。
  • 主菜单限制:数据包绑定在主菜单创造物品栏无提示(注册表未加载);Java API 绑定无此限制。

基于 MIT 许可发布