环境探测器(API)

环境探测器(API)

环境探测器是一个轻量级的Fabric API,它通过简单的占位符和开发者API系统自动检测启动器、平台、整合包、加载器和环境信息。

基础库

Join DC [middle small]

EnvironmentDetector API

一个轻量级、防崩溃的 Minecraft 环境检测 API,支持 Fabric、Quilt 和现代整合包启动器。

EnvironmentDetector 可自动识别:

  • 启动器
  • 整合包实例
  • 加载器
  • Minecraft 版本
  • 特殊客户端环境

本 API 适用于:

  • 模组
  • 界面 (HUD)
  • 占位符系统
  • 数据分析
  • 兼容层
  • 启动器感知集成

✨ 特性

自动启动器检测

EnvironmentDetector 可自动检测:

  • Modrinth App
  • CurseForge
  • GDLauncher
  • Prism Launcher
  • MultiMC
  • ATLauncher
  • Feather Client
  • NoRisk Client
  • Lunar Client
  • Badlion Client
  • 官方 Minecraft 启动器

无需手动配置。


🧩 兼容性

支持的 Minecraft 版本

主要支持

  • Minecraft 1.21.x (1.21、1.21.1、1.21.2 等)
  • 已针对现代 Minecraft 环境进行优化和测试。

项目当前目标:

  • Java 21
  • 现代 Fabric Loader 版本
  • 当前的启动器生态

向后兼容性

EnvironmentDetector 主要依赖:

  • Fabric Loader API
  • 文件系统检查
  • 运行时分析

本 API 没有深度修改 Minecraft 内部机制,并避免为检测逻辑使用复杂 Mixin。

因此,该项目也可以移植到旧版本,如:

  • 1.20.1
  • 1.19.4

仅需少量调整:

  • 将 Java 目标版本从 21 降低到 17
  • 调整 fabric.mod.json
  • 重新构建项目

支持的模组加载器

Fabric

✅ 完全原生支持 (主要目标平台)

Quilt

✅ 完全原生支持

Quilt 原生支持 Fabric 模组,并且 EnvironmentDetector 包含专用的 Quilt 检测逻辑。

这意味着日志将正确显示:

Loader=Quilt

而不是在 Quilt 上运行时显示为 Fabric。

NeoForge / Forge

⚡ 不原生支持

EnvironmentDetector 主要是一个 Fabric 模组。

但是,通过诸如 Sinytra Connector 和 Fabric Connector 实现之类的兼容层,该模组可以正常工作。

通过这些兼容层使用时,API 甚至可以检测到环境正在运行:

  • Forge
  • NeoForge

技术要求

Java 版本

  • 对于 Minecraft 1.20.5+,需要 Java 21

Fabric Loader

  • 需要 Fabric Loader 0.16.0+

兼容性概览

特性 状态
Minecraft 1.21.x ✅ 已优化并测试
Fabric ✅ 原生支持
Quilt ✅ 原生支持
NeoForge / Forge ⚡ 仅通过连接器使用
专用服务器 ✅ 完全兼容
Java 21 🛠️ 必需

🧠 高精度检测系统

与许多其他模组不同,EnvironmentDetector 不只依赖进程名。

相反,它使用:

  • 基于文件的验证
  • 递归目录扫描
  • 启动器元数据验证
  • 类路径分析
  • 运行时环境分析

这避免了误报和重复检测。

示例: 其他模组可能仅仅扫描系统中运行的程序名 "Modrinth"。

EnvironmentDetector 则使用更先进的基于运行时的检测系统。

1. JVM 参数扫描

API 会扫描 Minecraft 启动参数(通常可以在日志和运行时启动参数中看到的相同信息)。

如果单词:

modrinth

出现在 JVM 参数、启动路径或运行时参数中,启动器将自动被检测为:

Modrinth App

这样工作非常可靠,因为 Modrinth 启动器通常会将 Modrinth 相关的路径或标识符注入 Minecraft 运行时环境。


2. 手动配置备用方案

首次启动时,EnvironmentDetector 会自动创建:

config/environmentdetector.properties

在此文件中,可以手动配置自定义值:

manual_pack_name=你的整合包名称
manual_launcher_name=你的自定义启动器

如果设置了这些值,它们将始终拥有最高优先级,并覆盖自动检测。

这允许:

  • 自定义启动器
  • 私有整合包
  • 不受支持的启动器
  • 开发环境
  • 便携式实例

与 API 可靠地协同工作。


🔍 检测逻辑

API 会扫描多个目录层级以识别启动器结构。

支持的标记

Modrinth App

  • 运行时 JVM 分析
  • 启动参数分析
  • 可选的元数据验证

CurseForge

  • CURSEFORGE_INSTANCE_NAME
  • minecraftinstance.json
  • .curseclient

Feather Client

  • feather
  • feather-core
  • .feather

NoRisk Client

  • norisk.config
  • Mod ID: norisk

GDLauncher

  • gd-launcher.json
  • gdlauncher.json

Prism Launcher / MultiMC

  • prism.config
  • prism.json
  • multimc.cfg

ATLauncher

  • instance.json
  • atlauncher.json

Lunar / Badlion

类路径关键字分析:

  • lunar
  • badlion

官方启动器

  • launcher_profiles.json

📜 标准化日志记录

初始化后,EnvironmentDetector 会输出统一的日志条目。

示例:

[EnvironmentDetector] Launcher=Modrinth App, Instance=Ultra Survival, NoRisk=false, Loader=Fabric, Version=1.21.1

其他示例:

[EnvironmentDetector] Launcher=CurseForge, Instance=BetterMC, NoRisk=false, Loader=Fabric, Version=1.21.1
[EnvironmentDetector] Launcher=NoRisk Client, Instance=Unknown Pack, NoRisk=true, Loader=Fabric, Version=1.21.1

回退日志:

[EnvironmentDetector] Unknown Environment

⚡ 性能

  • 单次启动扫描
  • 结果缓存
  • 线程安全的内部实现
  • 极低开销
  • 无后台扫描

EnvironmentDetector 仅在启动时运行一次,之后仅提供缓存数据。


🛠 开发者集成

Gradle 设置

repositories {
    exclusiveContent {
        forRepository {
            maven {
                name = "Modrinth"
                url = "https://api.modrinth.com/maven"
            }
        }
        filter {
            includeGroup "maven.modrinth"
        }
    }
}

依赖

dependencies {
    modImplementation "maven.modrinth:environmentdetector-api:版本号"
}

将 版本号 替换为最新发布版本。


💻 使用示例

public String getLauncherName() {
    if (FabricLoader.getInstance().isModLoaded("environmentdetector")) {
        return de.felixfgf.environmentdetector.EnvironmentDetectorAPI
                .getEnvironment()
                .launcher();
    }

    return "Vanilla";
}

⚠ 最佳实践

始终使用可选集成

不要硬性依赖 EnvironmentDetector。

在使用 API 之前,始终检查:

FabricLoader.getInstance().isModLoaded("environmentdetector")

🚫 常见错误

错误的包路径

正确的包路径:

de.felixfgf.environmentdetector

而不是:

de.felixfgf.environmentdetector.api

缺少 modLoaded 检查

未经检查模组是否存在而直接访问 API 可能会导致其他模组崩溃。


每帧使用占位符

不要每帧解析占位符。 在打开菜单或 HUD 时缓存值。


🐛 Bug 报告与支持

发现了 Bug 或检测问题?

请报告:

  • 使用的启动器
  • Minecraft 版本
  • 加载器
  • latest.log 文件
  • 检测到的环境输出

加入 Discord 服务器以获取支持、报告 Bug 和讨论 API:

Join DC [middle small]


🎯 目标

  • 最大环境透明度
  • 可靠的启动器识别
  • 高兼容性
  • 零配置设置
  • 防崩溃集成
  • 轻量级架构

EnvironmentDetector 旨在成为现代 Minecraft 启动器生态系统的标准环境 API 🚀