跳到主要内容

枪械识别与 Provider

IGunProvider 让 FPSMatch 通过统一接口识别不同模组的枪械。GunCompatManager 保留多个 Provider,按物品栈选择能识别它的实现。

使用已有 Provider

以下片段可以放在服务端装备补给逻辑中:

IGunProvider provider = GunCompatManager.findProvider(stack);
if (provider.isAvailable() && provider.isGun(stack)) {
provider.useDummyAmmo(stack);
provider.setDummyAmmo(stack, provider.getMaxDummyAmmo(stack));
}

stack 是目标 ItemStackfindProvider() 在没有匹配时返回空实现,不是 null。不要假设全服务器只安装一种枪械模组,也不要把所有物品交给第一个 Provider。

实现自己的 Provider

创建实现 IGunProvider 的兼容类时,需要完成以下接口组:

接口组要表达的内容
getModIdisAvailable对应模组与可用条件
isGungetGunIdgetGunTabType哪些物品可识别及其稳定 ID
当前弹匣与虚拟备弹读写两类弹药的数量、上限和修改方式
getGunData从物品或 ID 取得枪械数据,可返回空 Optional
getGunHUDTexture客户端展示纹理,默认可为空

接口不会替你读取第三方 NBT 或调用它的弹药 API。应在适配类里完成这些转换,而不是把第三方实现细节散布到地图规则中。

可选依赖加载

确认目标模组存在后,才实例化引用第三方类的实现:

if (ModList.get().isLoaded("my_guns")) {
GunCompatManager.register(new MyGunProvider());
}

这是公共初始化中的接入片段;MyGunProvider 是你实现的类。模组 ID 需要与目标模组一致。将第三方类放入独立兼容类,避免它们出现在通用入口的字段或方法签名中。

区分识别与战斗事件

Provider 解决物品与弹药抽象,不自动覆盖第三方枪械的所有伤害事件。需要爆头、穿透或投掷物归属时,仍要接入对应战斗事件并交给 FPSMatch 的死亡管线