离线玩家缓存:导演剪辑版

离线玩家缓存:导演剪辑版

一个API Mod,允许在玩家离线时将玩家数据缓存到服务器上。 这意味着Mods可以使用这个API来访问离线玩家的数据。

基础库

离线玩家缓存横幅

MIT许可 GitHub星标 GitHub复刻 问题追踪

Fabric Quilt Forge

文档 GitHub Java Gradle Discord


前言 📝

离线玩家缓存:导演剪辑版已从头完全重制,其框架早于 1.* 及更低版本。 本模组的设计初衷是为服务器提供持久的排行榜,以记录离线玩家的数据。

内容 📦

模组开发者可以注册与 ID 和 Codec 关联的 Record(记录),用于序列化/反序列化数据。

当玩家从服务器断开连接时,其缓存数据会存储到服务器的 level(世界)数据中,之后可通过代码或模组提供的命令进行访问。

当玩家重新连接服务器时,其缓存数据将被删除。

命令

/opc get <uuid>|<name> <key>

提供当前玩家值的详细信息。如果玩家在线,将提供其当前值;如果离线,则提供其缓存值。

/opc remove <uuid>|<name> <key>

如果具有关联用户名或 UUID 的玩家处于离线状态,将根据所选键删除该玩家的缓存值。 如果玩家在线,此命令不会执行任何操作。

/opc list <uuid>|<name>

列出该玩家离线时存储的所有键和值;如果在线,则列出其当前所有的键和值。

开发者指南

环境配置

离线玩家缓存有 Modrinth 和 Curseforge 页面。

如需使用 API 进行开发,请添加以下内容:

gradle.properties

opc_version=...

build.gradle

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

dependencies {
    modImplementation "maven.modrinth:opc-directors-cut:${project.opc_version}"
    // 如果你不希望强制用户安装本模组,请包含这一行。
    include "maven.modrinth:opc-directors-cut:${project.opc_version}"
}
或者,如果你使用 Kotlin DSL:

build.gradle.kts

repositories {
    maven {
        name = "Modrinth"
        url = uri("https://api.modrinth.com/maven")
        content {
            includeGroup("maven.modrinth")
        }
    }
}

dependencies {
    modImplementation("maven.modrinth:opc-directors-cut:${properties["opc_version"]}")
    // 如果你不希望强制用户安装本模组,请包含这一行。
    include("maven.modrinth:opc-directors-cut:${properties["opc_version"]}")
}

迁移至 2.*

  • 不再有键的概念。相反,你需要注册一个 ID、一个 Record 和一个 Codec。

创建记录

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;

public record Contract(String label, boolean signed) {
    public static Codec<Contract> CODEC = RecordCodecBuilder.create((instance) ->
        instance.group(
            Codec.STRING.fieldOf("label").forGetter(Contract::label),
            Codec.BOOL.fieldOf("signed").forGetter(Contract::signed)
        ).apply(instance, Contract::new)
    );
}

注册

import maven_group.modid.concept.Contract; // 契约 :)

// 在静态/模组初始化期间的某个地方
private void init() {
    OfflinePlayerCacheAPI.register(CONTRACT_RECORD_ID, Contract.class, Contract.CODEC, (Player player) -> {
        // 在此代码块中,你决定如何将玩家数据转换为你选择的 Record。
        return new Contract(player.getName() + ":contracted", true);
    });
}

获取

var cache = OfflinePlayerCacheAPI.getCache(server);
cache.getEntry(Contract.class, "bibi_reden").ifPresent(contract -> {
    // 现在我们知道该玩家存在有效的 Contract 条目。
    // 你也可以使用 UUID 获取条目。
});

特别感谢我们的赞助商


赞助商横幅 使用代码“BAREMINIMUM”即可享受首月 15% 折扣!