Описание

---
### Preamble 📝
**Offline Player Cache: Directors Cut** has been completely redone from the ground up, and its framework predates `1.*` and below.
This was developed in mind to have **persistent leaderboards** for servers for their offline players.
### Content 📦
Modders may register `Record`'s linked with an id and a `Codec` to serialize/deserialize it.
Upon a player's disconnection from the server, their cached data is stored into the servers `level` data, which then can be accessed through code or through the commands the mod provides.
Upon a player's reconnection to the server, their cached data is deleted.
### Commands
#### `/opc get | `
Provides details about the current player value. If they are online, it will provide their **current** value, but if they are offline, it will provide their **cached** value.
#### `/opc remove | `
If the player with the associated username or UUID is offline, it will remove that players **cached** value based on the selected key.
If the player is **online**, nothing will occur with this command.
#### `/opc list |`
Lists all the keys and values this player has stored if they are offline, or if they are online, their current ones.
## Developers Guide
### Setup
Offline Player Cache has a [**Modrinth**](https://modrinth.com/mod/opc-directors-cut) and [**Curseforge**](https://curseforge.com/minecraft/mc-mods/opc-directors-cut) page.
In order to develop with the API, please add the following:
**`gradle.properties`**
```properties
opc_version=...
```
**`build.gradle`**
```groovy
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 this if you do not want to force your users to install the mod.
include "maven.modrinth:opc-directors-cut:${project.opc_version}"
}
```
Alternatively, if you are using Kotlin DSL:
**`build.gradle.kts`**
```kotlin
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 this if you do not want to force your users to install the mod.
include("maven.modrinth:opc-directors-cut:${properties["opc_version"]}")
}
```
## Migration to `2.*`
- There are no longer any concepts of keys. Instead, you are to register an id, a `Record`, and a `Codec`.
### Creating a Record
```java
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
public record Contract(String label, boolean signed) {
public static Codec CODEC = RecordCodecBuilder.create((instance) ->
instance.group(
Codec.STRING.fieldOf("label").forGetter(Contract::label),
Codec.BOOL.fieldOf("signed").forGetter(Contract::signed)
).apply(instance, Contract::new)
);
}
```
### Registering
```java
import maven_group.modid.concept.Contract; // Контракт :)
// somewhere during static/mod initialization
private void init() {
OfflinePlayerCacheAPI.register(CONTRACT_RECORD_ID, Contract.class, Contract.CODEC, (Player player) -> {
// within this block, you decide how to translate a player's data to the Record you chose.
return new Contract(player.getName() + ":contracted", true);
});
}
```
### Obtaining
```java
var cache = OfflinePlayerCacheAPI.getCache(server);
cache.getEntry(Contract.class, "bibi_reden").ifPresent(contract -> {
// we now know that there is a valid Contract entry for this player.
// You can also use a UUID to fetch an entry as well.
});
```
### A Special Thanks to our Sponsor
---
Use code "BAREMINIMUM" to get 15% off your first month!