2026-03-08.20-55-19.mp4
サーバー・クライアント間のデータ同期を手軽に行えるようにする簡易的なライブラリです。
※個人用・所属するプロジェクト用に開発したものですので、バグ等が発生したとしても自己責任でお願いします。バグ修正については Issue を作成して頂ければ対応するかもです。
- サーバー参加時の整合性チェック & 不足・不一致データのダウンロード
- サーバー参加後の単一データ同期
- クライアント側キャッシュの難読化
このライブラリを使用する際は、サーバー・クライアント両方に以下のMODを導入してください。
| MOD | 備考 |
|---|---|
| owo-lib | SyncLibのコンフィグ生成に使用しています |
| Fabric Kotlin Language | FabricModをKotlinで作成するために必須の前提MODです |
SyncLibを使用するには、各データ専用のレジストリを作成し、そこに @Serializableアノテーションが適用されたデータ用のクラスを格納する必要があります。
自身のプロジェクトの build.gradleに Kotlin Seriaizationを依存関係として追加する必要があります。
SyncLibの最新バージョンは 0.3.1 です。
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '2.3.0'
id 'org.jetbrains.kotlin.plugin.serialization' version '2.3.0'
}
repositories {
mavenCentral()
maven { url = uri("https://jitpack.io") } // For SyncLib
}
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0"
modImplementation("com.github.kuripasanda:SyncLib:$syncLibVersion")
}データはパケットで送信する前にKotlinxSerializationでJSONにパースしてから送信されます。
import kotlinx.serialization.Serializable
@Serializable
data class ExampleData(
val id: Int,
val message: String,
)ヘルパー関数を使用することで、新規作成後、登録されたレジストリのインスタンスを取得できます。
また、レジストリは「プレイヤー別でデータが保管・同期されるレジストリ」と「全プレイヤー共通のレジストリ」の二種類が存在します。
※レジストリのIDは、レジストリの種類が異なっていても同じものは使用できません。
// レジストリを登録
val exampleDataRegistry = SyncHelper.createRegistry(
id = ResourceLocation.fromNamespaceAndPath(MOD_ID, "example"), // レジストリのID
serializer = ExampleData.serializer(), // 同期対象のデータのシリアライザ
obfuscatedClientSide = false, // クライアント側でキャッシュする際に難読化するかどうか
onRegister = { registry, key, newData -> newData }, // データがレジストリに登録される前に呼び出されるコールバック関数。ここで登録されるデータを編集できます。
onUnregister = { data -> } // データがレジストリから削除されたときに呼び出されるコールバック関数。
)val exampleDataPlayerRegistry = SyncHelper.createPlayerRegistry(
id = ResourceLocation.fromNamespaceAndPath(SyncLib.MOD_ID, "example_player"),
serializer = serializer(),
obfuscatedClientSide = true,
onRegister = { registry, uuid, key, data -> data },
onUnregister = { uuid, data -> }
)レジストリにデータを登録します。
exampleDataRegistry.register(
"key", // レジストリ内の要素のキー
ExampleData(id = 1, message = "Hello, world!") // 登録するデータ
)exampleDataPlayerRegistry.register(
player.uuid, // プレイヤーのUUID
"key", // レジストリ内の要素のキー
ExampleData(id = 1, message = "Hello, world!") // 登録するデータ
)