野性对战API

野性对战API

Cobblemon的共享野对战AI API。

基础库

如果您喜欢这个模组并且能负担得起,请考虑在 ko-fi 上支持我,即使 1 美元我也很感激。Ko-fi


我允许任何希望将我的模组添加到整合包中的人这样做


野性对战 API

野性对战 API 是 Cobblemon 的一个共享野性对战 AI 框架。

对于玩家和整合包作者,它提供了可配置的更智能的野性对战行为,内置预设和管理员工具。对于开发者,它提供了一个受支持的公共 API,用于注册自定义野性 BattleAI 实现,而无需直接替换 Cobblemon 的内部机制。

野性对战 API 在对战开始时为野性对战参与者安装一个委托 AI。在每个 AI 决策时:

  • 首先检查更高优先级的提供者。
  • 第一个返回非空 BattleAI 的提供者将被使用。
  • 返回 null 会委托给较低优先级的提供者。
  • 如果没有提供者声明该上下文,则使用参与者原始的 Cobblemon AI 作为回退。

这让多个模组可以安全地协同工作,同时在没有任何自定义提供者适用时仍保留可靠的回退路径。

包含的功能

  • 野性对战 AI 扩展的共享 API
  • 基于优先级的提供者解析
  • 安全回退到参与者原始的 Cobblemon AI
  • 内置可配置的智能野性 AI 行为
  • 从 easy 到 extreme 的难度预设
  • 管理员 UI 和调试命令
  • 支持 Minecraft 1.21.1 的 Fabric 和 NeoForge

管理员命令

野性对战 API 包含用于测试和配置的操作员/管理员命令。

命令:

  • /wildbattleapi ui
  • /wildbattleapi difficulty <easy|medium|hard|extreme>
  • /wildbattleapi debug on
  • /wildbattleapi debug off
  • /wildbattleapi debug status

别名:

  • /wba ui
  • /wba difficulty <easy|medium|hard|extreme>
  • /wba debug on|off|status

这些命令需要权限等级 2。

开发者用法

开发者用法

受支持的公共 API

仅使用这些类进行第三方集成:

  • com.github.raguto.wildbattleapi.api.WildBattleAPI
  • com.github.raguto.wildbattleapi.api.WildAIProvider
  • com.github.raguto.wildbattleapi.api.WildAIContext

不要依赖诸如 impl、mixin、config 或 network 等内部包。

运行时依赖

在任何您的依赖模组加载的地方安装野性对战 API。在普通的整合包中,这意味着客户端和服务端都需要安装。

模组 ID:

  • wild_battle_api

同时在您的模组元数据中将其声明为依赖。

Fabric (fabric.mod.json):

{
  "depends": {
    "wild_battle_api": "*"
  }
}

NeoForge (META-INF/neoforge.mods.toml):

[[dependencies.your_mod_id]]
modId = "wild_battle_api"
type = "required"
versionRange = "[1.0.0,)"
ordering = "AFTER"
side = "BOTH"

将最低版本调整为您的模组支持的第一个野性对战 API 版本。

编译时依赖

如果您没有使用已发布的 Maven 构件,请直接针对特定加载器的 jar 文件进行编译。

Fabric 示例:

dependencies {
    modCompileOnly files("libs/wild_battle_api-fabric-1.0.0.jar")
}

NeoForge 示例:

dependencies {
    compileOnly files("libs/wild_battle_api-neoforge-1.0.0.jar")
}

为您的环境使用适合的加载器 jar 文件。

注册提供者

在您的模组的通用初始化期间注册一次您的提供者。

import com.github.raguto.wildbattleapi.api.WildBattleAPI;
import com.github.raguto.wildbattleapi.api.WildAIContext;

public final class MyWildAIRegistration {
    public static void init() {
        WildBattleAPI.registerProvider(150, context -> {
            if (shouldUseMyAI(context)) {
                return new MyCustomWildBattleAI();
            }
            return null;
        });
    }

    private static boolean shouldUseMyAI(WildAIContext context) {
        return context.getBattle() != null && context.getActor() != null;
    }
}

您也可以使用默认优先级注册:

WildBattleAPI.registerProvider(context -> null);

优先级指导

  • 0:兜底或默认提供者
  • 50:标准覆盖
  • 100+:高优先级或 Boss 特定覆盖
  • 200+:硬覆盖,请谨慎使用

如果您的提供者只处理特定情况,请为其他所有情况返回 null。

实现您自己的 BattleAI

您可以提供任何实现 Cobblemon 的 BattleAI 的类。

import com.cobblemon.mod.common.api.battles.model.PokemonBattle;
import com.cobblemon.mod.common.api.battles.model.ai.BattleAI;
import com.cobblemon.mod.common.battles.ActiveBattlePokemon;
import com.cobblemon.mod.common.battles.BattleSide;
import com.cobblemon.mod.common.battles.PassActionResponse;
import com.cobblemon.mod.common.battles.ShowdownActionResponse;
import com.cobblemon.mod.common.battles.ShowdownMoveset;
import com.cobblemon.mod.common.net.messages.client.battle.BattleHealthChangePacket;
import org.jetbrains.annotations.Nullable;

public final class MyCustomWildBattleAI implements BattleAI {
    @Override
    public ShowdownActionResponse choose(
        ActiveBattlePokemon activeBattlePokemon,
        PokemonBattle battle,
        BattleSide side,
        @Nullable ShowdownMoveset moveset,
        boolean forceSwitch
    ) {
        if (forceSwitch || moveset == null) {
            return PassActionResponse.INSTANCE;
        }

        // 用您自己的招式或换人逻辑替换此处。
        return PassActionResponse.INSTANCE;
    }

    @Override
    public void onHealthChange(BattleHealthChangePacket packet) {
        // 可选的状态跟踪。
    }
}

WildAIContext

WildAIContext 为提供者提供决定是否声明野性对战参与者所需的信息。

始终可用:

  • getActor()
  • getPokemonList()
  • getBattle()
  • isForceSwitch()

根据当前决策可能为空:

  • getActiveBattlePokemon()
  • getAiSide()
  • getMoveset()

在使用可空字段之前请进行判空保护。

集成说明

  • 保持提供者逻辑快速且可预测。
  • 当您的模组不希望声明当前上下文时返回 null。
  • 避免从提供者或 AI 逻辑中抛出异常。
  • 在专用服务器和集成单人游戏中进行测试。
  • 如果多个模组注册了提供者,则数值较高优先级会首先被检查。

许可

野性对战 API 代码和二进制文件保留所有权利。

第三方使用和分发权限由模组页面上的作者政策定义。