Compare commits
3 Commits
d42b9aae09
...
ddef725da5
| Author | SHA1 | Date | |
|---|---|---|---|
| ddef725da5 | |||
| 714609e5b0 | |||
| cf53783bf9 |
@@ -8,6 +8,7 @@ PAPER_USER_AGENT="majinnaibu-plugin-dev/1.0 (https://github.com/majinnaibu)"
|
|||||||
JAVA_OPTS="-Xms2G -Xmx2G"
|
JAVA_OPTS="-Xms2G -Xmx2G"
|
||||||
STOP_TIMEOUT=60
|
STOP_TIMEOUT=60
|
||||||
MINECRAFT_SERVER_JAR=paper-26.2-129.jar
|
MINECRAFT_SERVER_JAR=paper-26.2-129.jar
|
||||||
|
|
||||||
# Relative paths are resolved from the project root; ~/ is expanded.
|
# Relative paths are resolved from the project root; ~/ is expanded.
|
||||||
MINECRAFT_SERVER_PATH=./server
|
MINECRAFT_SERVER_PATH=./server
|
||||||
MINECRAFT_BACKUP_PATH=./backups
|
MINECRAFT_BACKUP_PATH=./backups
|
||||||
@@ -16,8 +17,9 @@ MINECRAFT_BACKUP_PATH=./backups
|
|||||||
# Release version is read from Gradle and checked against the jar's plugin.yml.
|
# Release version is read from Gradle and checked against the jar's plugin.yml.
|
||||||
MODRINTH_TOKEN=
|
MODRINTH_TOKEN=
|
||||||
MODRINTH_PROJECT_ID=5NYwxysp
|
MODRINTH_PROJECT_ID=5NYwxysp
|
||||||
MODRINTH_CHANGELOG="Release 0.2.2"
|
# Optional Markdown override; empty generates notes from commits since the last tag.
|
||||||
MODRINTH_GAME_VERSIONS=1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7
|
MODRINTH_CHANGELOG=
|
||||||
|
MODRINTH_GAME_VERSIONS=26.2,26.3
|
||||||
MODRINTH_LOADERS=paper
|
MODRINTH_LOADERS=paper
|
||||||
MODRINTH_VERSION_TYPE=
|
MODRINTH_VERSION_TYPE=
|
||||||
MODRINTH_DEPENDENCIES=
|
MODRINTH_DEPENDENCIES=
|
||||||
|
|||||||
24
.github/workflows/gradle.yml
vendored
24
.github/workflows/gradle.yml
vendored
@@ -43,27 +43,3 @@ jobs:
|
|||||||
path: build/libs/*.jar
|
path: build/libs/*.jar
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
|
|
||||||
dependency-submission:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v7
|
|
||||||
|
|
||||||
- name: Set up JDK 25
|
|
||||||
uses: actions/setup-java@v6
|
|
||||||
with:
|
|
||||||
java-version: '25'
|
|
||||||
distribution: 'temurin'
|
|
||||||
|
|
||||||
- name: Setup Gradle 9.8.0
|
|
||||||
uses: gradle/actions/setup-gradle@v5
|
|
||||||
with:
|
|
||||||
gradle-version: '9.8.0'
|
|
||||||
|
|
||||||
- name: Generate and submit dependency graph
|
|
||||||
uses: gradle/actions/dependency-submission@v5
|
|
||||||
with:
|
|
||||||
include-configurations: '^(compileClasspath|runtimeClasspath)$'
|
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ Setup our project folder.
|
|||||||
```bash
|
```bash
|
||||||
PROJECTS_DIR="$HOME/Projects"
|
PROJECTS_DIR="$HOME/Projects"
|
||||||
MINECRAFT_SERVER_PATH="$PROJECTS_DIR/MCServer"
|
MINECRAFT_SERVER_PATH="$PROJECTS_DIR/MCServer"
|
||||||
# Set this to the latest download url on the Paper downloads page [https://papermc.io/downloads](https://papermc.io/downloads) and update the jar name.
|
# Use Paper 26.2 or 26.3 only. The project helper scripts resolve the configured Paper build.
|
||||||
MINECRAFT_SERVER_DOWNLOAD_URI="https://fill-data.papermc.io/v1/objects/fb73c7e310215016955617ab957022d9e1d47aeba206df3a98c5ecb43756527c/paper-1.21.8-25.jar"
|
MINECRAFT_SERVER_DOWNLOAD_URI=""
|
||||||
MINECRAFT_SERVER_JAR="paper-1.21.8-25.jar"
|
MINECRAFT_SERVER_JAR="paper-26.2-129.jar"
|
||||||
mkdir -p "$MINECRAFT_SERVER_PATH"
|
mkdir -p "$MINECRAFT_SERVER_PATH"
|
||||||
# Keep this shell open we will use these variables later.
|
# Keep this shell open we will use these variables later.
|
||||||
```
|
```
|
||||||
@@ -23,9 +23,9 @@ mkdir -p "$MINECRAFT_SERVER_PATH"
|
|||||||
```powershell
|
```powershell
|
||||||
$projectsDir="$HOME\Projects"
|
$projectsDir="$HOME\Projects"
|
||||||
$minecraftServerDir="$projectsDir\MCServer"
|
$minecraftServerDir="$projectsDir\MCServer"
|
||||||
# Set this to the latest download url on the Paper downloads page [https://papermc.io/downloads](https://papermc.io/downloads) and update the jar name.
|
# Use Paper 26.2 or 26.3 only. The project helper scripts resolve the configured Paper build.
|
||||||
$minecraftServerDownloadUri="https://fill-data.papermc.io/v1/objects/fb73c7e310215016955617ab957022d9e1d47aeba206df3a98c5ecb43756527c/paper-1.21.8-25.jar"
|
$minecraftServerDownloadUri=""
|
||||||
$minecraftServerJar="paper-1.21.8-25.jar"
|
$minecraftServerJar="paper-26.2-129.jar"
|
||||||
New-Item -Type Directory $projectsDir
|
New-Item -Type Directory $projectsDir
|
||||||
New-Item -Type Directory $minecraftServerDir
|
New-Item -Type Directory $minecraftServerDir
|
||||||
# Keep this shell open we will use these variables later.
|
# Keep this shell open we will use these variables later.
|
||||||
@@ -34,18 +34,18 @@ New-Item -Type Directory $minecraftServerDir
|
|||||||
## Install the JDK
|
## Install the JDK
|
||||||
**Linux / WSL**
|
**Linux / WSL**
|
||||||
```bash
|
```bash
|
||||||
apt install openjdk-21-jdk
|
apt install openjdk-25-jdk
|
||||||
```
|
```
|
||||||
|
|
||||||
**macOS**
|
**macOS**
|
||||||
```zsh
|
```zsh
|
||||||
brew install --cask microsoft-openjdk@21
|
brew install --cask microsoft-openjdk@25
|
||||||
```
|
```
|
||||||
|
|
||||||
**Windows**
|
**Windows**
|
||||||
From Powershell
|
From Powershell
|
||||||
```powershell
|
```powershell
|
||||||
winget install --id Microsoft.OpenJDK.21 --source winget
|
winget install --id Microsoft.OpenJDK.25 --source winget
|
||||||
```
|
```
|
||||||
|
|
||||||
## Setup a PaperMC Server
|
## Setup a PaperMC Server
|
||||||
@@ -108,7 +108,7 @@ Our scripts depend on two environment variables. You can set them each time you
|
|||||||
To set them for the current session run these commands. To set for every new session add these commands to your `.bashrc` or `.zshrc` file.
|
To set them for the current session run these commands. To set for every new session add these commands to your `.bashrc` or `.zshrc` file.
|
||||||
```bash
|
```bash
|
||||||
MINECRAFT_SERVER_PATH="$HOME/Projects/MCServer"
|
MINECRAFT_SERVER_PATH="$HOME/Projects/MCServer"
|
||||||
MINECRAFT_SERVER_JAR="paper-1.21.8-25.jar"
|
MINECRAFT_SERVER_JAR="paper-26.2-129.jar"
|
||||||
```
|
```
|
||||||
|
|
||||||
**Windows**
|
**Windows**
|
||||||
@@ -116,13 +116,13 @@ MINECRAFT_SERVER_JAR="paper-1.21.8-25.jar"
|
|||||||
To set them for a single session run these commands.
|
To set them for a single session run these commands.
|
||||||
```powershell
|
```powershell
|
||||||
$env:MINECRAFT_SERVER_PATH = "$HOME\Projects\MCServer"
|
$env:MINECRAFT_SERVER_PATH = "$HOME\Projects\MCServer"
|
||||||
$env:MINECRAFT_SERVER_JAR = "paper-1.21.8-25.jar"
|
$env:MINECRAFT_SERVER_JAR = "paper-26.2-129.jar"
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want them available in all of your powershell sessions you can set them permanently like this.
|
If you want them available in all of your powershell sessions you can set them permanently like this.
|
||||||
```powershell
|
```powershell
|
||||||
[Environment]::SetEnvironmentVariable("MINECRAFT_SERVER_PATH", "$HOME\Projects\MCServer", "User")
|
[Environment]::SetEnvironmentVariable("MINECRAFT_SERVER_PATH", "$HOME\Projects\MCServer", "User")
|
||||||
[Environment]::SetEnvironmentVariable("MINECRAFT_SERVER_JAR", "paper-1.21.8-25.jar", "User")
|
[Environment]::SetEnvironmentVariable("MINECRAFT_SERVER_JAR", "paper-26.2-129.jar", "User")
|
||||||
```
|
```
|
||||||
|
|
||||||
### Start-Server.ps1 and start-server.sh
|
### Start-Server.ps1 and start-server.sh
|
||||||
|
|||||||
@@ -46,4 +46,4 @@ Other plugins can create buckets with `createBucket(id, singular, plural, initia
|
|||||||
|
|
||||||
## Compatibility
|
## Compatibility
|
||||||
|
|
||||||
Built for Paper and uses Bukkit and Adventure APIs.
|
Built exclusively for Paper 26.2 and 26.3 with the Paper API and Adventure APIs. Bukkit and Spigot servers are not supported.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "scorekeeper",
|
"id": "scorekeeper",
|
||||||
"title": "ScoreKeeper",
|
"title": "ScoreKeeper",
|
||||||
"description": "Paper Minecraft plugin for tracking and managing player scores.",
|
"description": "A reusable Paper 26.2/26.3 scoring engine with named buckets, custom reporting, persistent archives, high-score runs, player commands, and a public API for companion plugins.",
|
||||||
"docId": "ScoreKeeper",
|
"docId": "ScoreKeeper",
|
||||||
"image": {
|
"image": {
|
||||||
"url": "https://image.pollinations.ai/prompt/pixel%20art%20Minecraft%20server%20scoreboard%20with%20a%20glowing%20diamond%20and%20number%20counters%2C%20clean%20square%20game%20plugin%20thumbnail%2C%20no%20text",
|
"url": "https://image.pollinations.ai/prompt/pixel%20art%20Minecraft%20server%20scoreboard%20with%20a%20glowing%20diamond%20and%20number%20counters%2C%20clean%20square%20game%20plugin%20thumbnail%2C%20no%20text",
|
||||||
12
Project-Description.md
Normal file
12
Project-Description.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# ScoreKeeper
|
||||||
|
|
||||||
|
ScoreKeeper is a reusable scoring engine for Paper 26.2 and 26.3. It gives events, competitions, and companion plugins a shared language for points: named buckets can have custom singular/plural labels, initial values, reporting policies, archives, and high-score runs.
|
||||||
|
|
||||||
|
The plugin is both a player-facing command system and an extension point. Administrators can start target-based, timed, or manually stopped score runs, while other plugins can create buckets, award points, archive results, and build richer game loops through the public API. Scores, assignments, runs, and archives persist across server restarts. Bukkit and Spigot servers are not supported.
|
||||||
|
|
||||||
|
## Engineering Notes
|
||||||
|
|
||||||
|
- Built with Gradle and Java 25 for modern Paper.
|
||||||
|
- Uses UUID-based player identity and YAML-backed persistence.
|
||||||
|
- Includes server-free JUnit coverage for domain rules, commands, reporting, archives, and lifecycle behavior.
|
||||||
|
- Designed as the scoring foundation used by companion plugins such as MobScores.
|
||||||
10
Project.md
10
Project.md
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
## 1. What is ScoreKeeper?
|
## 1. What is ScoreKeeper?
|
||||||
|
|
||||||
ScoreKeeper is a **Paper Minecraft plugin** (Java 21, Bukkit/Adventure APIs) that manages player
|
ScoreKeeper is a **Paper Minecraft plugin** (Java 25, Paper/Adventure APIs) that manages player
|
||||||
score tracking. It exposes five in-game/console commands (`/score-get`, `/score-add`,
|
score tracking. It exposes five in-game/console commands (`/score-get`, `/score-add`,
|
||||||
`/score-subtract`, `/score-reset`, `/score-archive`) for manual score manipulation — no events,
|
`/score-subtract`, `/score-reset`, `/score-archive`) for manual score manipulation — no events,
|
||||||
no timers, no automation.
|
no timers, no automation.
|
||||||
@@ -24,11 +24,11 @@ and scoring formulas are all **future scope**. See §4 for the gap between *what
|
|||||||
| Item | Value |
|
| Item | Value |
|
||||||
|------|-------|
|
|------|-------|
|
||||||
| Language | Java 21 (Gradle auto-downloads toolchain) |
|
| Language | Java 21 (Gradle auto-downloads toolchain) |
|
||||||
| Runtime target | Paper 1.21.7 (Bukkit + Adventure APIs) |
|
| Runtime target | Paper 26.2 and 26.3 |
|
||||||
| Build tool | Gradle 8.14.3 (`gradlew`) |
|
| Build tool | Gradle 8.14.3 (`gradlew`) |
|
||||||
| Linting | Spotless (`googleJavaFormat()` + license header from `config/license-header.txt`) |
|
| Linting | Spotless (`googleJavaFormat()` + license header from `config/license-header.txt`) |
|
||||||
| Versioning | `org.danilopianini.git-sensitive-semantic-versioning`; minimum version `0.2.1`; reads `vX.Y.Z` tags |
|
| Versioning | `org.danilopianini.git-sensitive-semantic-versioning`; minimum version `0.2.1`; reads `vX.Y.Z` tags |
|
||||||
| External deps | **None at runtime.** `paper-api:1.21.7-R0.1-SNAPSHOT` is `compileOnly` only. |
|
| External deps | **None at runtime.** The Paper API is `compileOnly` only. |
|
||||||
| CI/release entry point | Run `./gradlew spotlessCheck build`, tag the release commit (for example, `git tag -a v0.2.2 -m "Release v0.2.2"`), then rebuild to produce the stable release artifact |
|
| CI/release entry point | Run `./gradlew spotlessCheck build`, tag the release commit (for example, `git tag -a v0.2.2 -m "Release v0.2.2"`), then rebuild to produce the stable release artifact |
|
||||||
|
|
||||||
### Build quickly
|
### Build quickly
|
||||||
@@ -104,7 +104,7 @@ ADMIN / CONSOLE / RCON ──▶ types a /score-* command
|
|||||||
|
|
||||||
### File: ScoreKeeperPlugin.java (`ScoreKeeperPlugin`)
|
### File: ScoreKeeperPlugin.java (`ScoreKeeperPlugin`)
|
||||||
|
|
||||||
- `main` class in `plugin.yml` (Bukkit plugin entry point)
|
- `main` class in `plugin.yml` (Paper plugin entry point)
|
||||||
- `HashMap<UUID, Integer> _playerScores` at line 38 — the sole score store
|
- `HashMap<UUID, Integer> _playerScores` at line 38 — the sole score store
|
||||||
- `onEnable()` (line 52): wires five command executors, logs \"load not implemented\" warning
|
- `onEnable()` (line 52): wires five command executors, logs \"load not implemented\" warning
|
||||||
- `onDisable()` (line 46): logs \"save not implemented\" warning — scores lost on shutdown
|
- `onDisable()` (line 46): logs \"save not implemented\" warning — scores lost on shutdown
|
||||||
@@ -227,7 +227,7 @@ asynchronously could corrupt state via non-atomic read-modify-write.
|
|||||||
|
|
||||||
### Run locally (Paper server)
|
### Run locally (Paper server)
|
||||||
|
|
||||||
1. Download Paper 1.21.7 from `https://papermc.io`
|
1. Download Paper 26.2 or 26.3 from `https://papermc.io`
|
||||||
2. Copy the built jar into `plugins/`
|
2. Copy the built jar into `plugins/`
|
||||||
3. Start the server, verify onEnable logs:
|
3. Start the server, verify onEnable logs:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
# ScoreKeeper
|
|
||||||
|
|
||||||
ScoreKeeper is a Paper Minecraft plugin for tracking player scores during server activities, events, or games. It keeps scores per player in memory and exposes commands for viewing, changing, resetting, and archiving scores.
|
|
||||||
|
|
||||||
## Details
|
|
||||||
|
|
||||||
- Built for Paper API 1.21.7 with Java 21 and Gradle.
|
|
||||||
- Registers `/score-get`, `/score-add`, `/score-subtract`, `/score-reset`, and `/score-archive`.
|
|
||||||
- Commands use the executing player when a player name is omitted.
|
|
||||||
- Scores are currently held in memory and are not persisted when the server stops.
|
|
||||||
- Score archiving is planned, but the current implementation reports that archiving is unavailable.
|
|
||||||
- The project is packaged as a Java plugin with a `plugin.yml` descriptor.
|
|
||||||
|
|
||||||
## Image
|
|
||||||
|
|
||||||
No project image asset is included in the repository. The JSON description includes a prompt-backed image URL for a future project thumbnail.
|
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
# ScoreKeeper Plugin
|
# ScoreKeeper Plugin
|
||||||
|
|
||||||
|
ScoreKeeper supports Paper 26.2 and 26.3 only. Bukkit and Spigot servers are not supported.
|
||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
||||||
### Commands
|
### Commands
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ tasks.withType(Javadoc).configureEach {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly 'io.papermc.paper:paper-api:1.21.7-R0.1-SNAPSHOT'
|
compileOnly 'io.papermc.paper:paper-api:26.2.build.129-stable'
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
|
org.gradle.configuration-cache=true
|
||||||
|
org.gradle.daemon=true
|
||||||
org.gradle.java.installations.auto-download=true
|
org.gradle.java.installations.auto-download=true
|
||||||
org.gradle.java.installations.auto-detect=false
|
org.gradle.java.installations.auto-detect=false
|
||||||
org.gradle.java.installations.fromEnv=JAVA_HOME
|
org.gradle.java.installations.fromEnv=JAVA_HOME
|
||||||
|
|
||||||
org.gradle.daemon=true
|
|
||||||
org.gradle.configuration-cache=true
|
|
||||||
@@ -27,6 +27,7 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
@@ -100,14 +101,14 @@ public class ScoreKeeperPlugin extends JavaPlugin {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
getCommand("score-get").setExecutor(new ScoreGetCommand(this));
|
Objects.requireNonNull(getCommand("score-get")).setExecutor(new ScoreGetCommand(this));
|
||||||
getCommand("score-add").setExecutor(new ScoreAddCommand(this));
|
Objects.requireNonNull(getCommand("score-add")).setExecutor(new ScoreAddCommand(this));
|
||||||
getCommand("score-subtract").setExecutor(new ScoreSubtractCommand(this));
|
Objects.requireNonNull(getCommand("score-subtract")).setExecutor(new ScoreSubtractCommand(this));
|
||||||
getCommand("score-reset").setExecutor(new ScoreResetCommand(this));
|
Objects.requireNonNull(getCommand("score-reset")).setExecutor(new ScoreResetCommand(this));
|
||||||
getCommand("score-archive").setExecutor(new ScoreArchiveCommand(this));
|
Objects.requireNonNull(getCommand("score-archive")).setExecutor(new ScoreArchiveCommand(this));
|
||||||
getCommand("score-archive-list").setExecutor(new ScoreArchiveListCommand(this));
|
Objects.requireNonNull(getCommand("score-archive-list")).setExecutor(new ScoreArchiveListCommand(this));
|
||||||
getCommand("score-bucket").setExecutor(new ScoreBucketCommand(this));
|
Objects.requireNonNull(getCommand("score-bucket")).setExecutor(new ScoreBucketCommand(this));
|
||||||
getCommand("score-run").setExecutor(new ScoreRunCommand(this));
|
Objects.requireNonNull(getCommand("score-run")).setExecutor(new ScoreRunCommand(this));
|
||||||
|
|
||||||
_buckets.put("points", new ScoreBucket("points", "point", "points", 0));
|
_buckets.put("points", new ScoreBucket("points", "point", "points", 0));
|
||||||
_bucketScores.put("points", new LinkedHashMap<>());
|
_bucketScores.put("points", new LinkedHashMap<>());
|
||||||
@@ -249,13 +250,13 @@ public class ScoreKeeperPlugin extends JavaPlugin {
|
|||||||
requireBucket(bucketId);
|
requireBucket(bucketId);
|
||||||
Map<UUID, String> previousBuckets = new LinkedHashMap<>();
|
Map<UUID, String> previousBuckets = new LinkedHashMap<>();
|
||||||
for (Player player : getServer().getOnlinePlayers()) {
|
for (Player player : getServer().getOnlinePlayers()) {
|
||||||
previousBuckets.put(player.getUniqueId(), getPlayerBucket(player));
|
previousBuckets.put(Objects.requireNonNull(player).getUniqueId(), getPlayerBucket(player));
|
||||||
}
|
}
|
||||||
_defaultBucketId = bucketId;
|
_defaultBucketId = bucketId;
|
||||||
_playerBuckets.clear();
|
_playerBuckets.clear();
|
||||||
ScoreBucket bucket = requireBucket(bucketId);
|
ScoreBucket bucket = requireBucket(bucketId);
|
||||||
for (Player player : getServer().getOnlinePlayers()) {
|
for (Player player : getServer().getOnlinePlayers()) {
|
||||||
if (!bucketId.equals(previousBuckets.get(player.getUniqueId()))) {
|
if (!bucketId.equals(previousBuckets.get(Objects.requireNonNull(player).getUniqueId()))) {
|
||||||
sendBucketChangeMessage(player, bucket);
|
sendBucketChangeMessage(player, bucket);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -307,7 +308,7 @@ public class ScoreKeeperPlugin extends JavaPlugin {
|
|||||||
|
|
||||||
// region Utiilty Methods
|
// region Utiilty Methods
|
||||||
public void sendMessage(CommandSender reciever, Component message) {
|
public void sendMessage(CommandSender reciever, Component message) {
|
||||||
reciever.sendMessage(_messagePrefix.append(message));
|
reciever.sendMessage(_messagePrefix.append(Objects.requireNonNull(message)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private ScoreBucket requireBucket(String bucketId) {
|
private ScoreBucket requireBucket(String bucketId) {
|
||||||
@@ -404,13 +405,13 @@ public class ScoreKeeperPlugin extends JavaPlugin {
|
|||||||
private void reportHighScoreRunChange(
|
private void reportHighScoreRunChange(
|
||||||
Player player, ScoreBucket bucket, HighScoreRun run, int score) {
|
Player player, ScoreBucket bucket, HighScoreRun run, int score) {
|
||||||
String message = scoreMessage(player.getName(), bucket, score);
|
String message = scoreMessage(player.getName(), bucket, score);
|
||||||
sendMessage(player, Component.text(message));
|
sendMessage(player, Component.text(Objects.requireNonNull(message)));
|
||||||
List<ScoreEntry> standings = getRankedScores(bucket.getId());
|
List<ScoreEntry> standings = getRankedScores(bucket.getId());
|
||||||
for (int place = 0; place < Math.min(run.topN, standings.size()); place++) {
|
for (int place = 0; place < Math.min(run.topN, standings.size()); place++) {
|
||||||
if (standings.get(place).playerId.equals(player.getUniqueId())) {
|
if (standings.get(place).playerId.equals(player.getUniqueId())) {
|
||||||
for (Player recipient : getServer().getOnlinePlayers()) {
|
for (Player recipient : getServer().getOnlinePlayers()) {
|
||||||
if (recipient != player) {
|
if (recipient != player) {
|
||||||
sendMessage(recipient, Component.text(message));
|
sendMessage(recipient, Component.text(Objects.requireNonNull(message)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -455,7 +456,7 @@ public class ScoreKeeperPlugin extends JavaPlugin {
|
|||||||
ScoreEntry personalEntry = null;
|
ScoreEntry personalEntry = null;
|
||||||
int personalPlace = -1;
|
int personalPlace = -1;
|
||||||
for (int place = 0; place < standings.size(); place++) {
|
for (int place = 0; place < standings.size(); place++) {
|
||||||
if (standings.get(place).playerId.equals(player.getUniqueId())) {
|
if (standings.get(place).playerId.equals(Objects.requireNonNull(player).getUniqueId())) {
|
||||||
personalEntry = standings.get(place);
|
personalEntry = standings.get(place);
|
||||||
personalPlace = place + 1;
|
personalPlace = place + 1;
|
||||||
break;
|
break;
|
||||||
@@ -700,7 +701,7 @@ public class ScoreKeeperPlugin extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String text = scoreMessage(player.getName(), bucket, score);
|
String text = scoreMessage(player.getName(), bucket, score);
|
||||||
Component message = Component.text(text);
|
Component message = Component.text(Objects.requireNonNull(text));
|
||||||
if (reporting == ScoreReporting.PLAYER) {
|
if (reporting == ScoreReporting.PLAYER) {
|
||||||
sendMessage(player, message);
|
sendMessage(player, message);
|
||||||
} else if (reporting == ScoreReporting.GLOBAL) {
|
} else if (reporting == ScoreReporting.GLOBAL) {
|
||||||
@@ -710,7 +711,7 @@ public class ScoreKeeperPlugin extends JavaPlugin {
|
|||||||
} else if (reporting == ScoreReporting.ADMIN) {
|
} else if (reporting == ScoreReporting.ADMIN) {
|
||||||
logInfo(text);
|
logInfo(text);
|
||||||
for (Player recipient : getServer().getOnlinePlayers()) {
|
for (Player recipient : getServer().getOnlinePlayers()) {
|
||||||
if (recipient.isOp() || recipient.hasPermission("scorekeeper.admin")) {
|
if (Objects.requireNonNull(recipient).isOp() || recipient.hasPermission("scorekeeper.admin")) {
|
||||||
sendMessage(recipient, message);
|
sendMessage(recipient, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@@ -76,7 +78,7 @@ public class ScoreAddCommand implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void echoError(CommandSender sender, boolean rcon, String string) {
|
private void echoError(CommandSender sender, boolean rcon, String string) {
|
||||||
_plugin.sendMessage(sender, Component.text(string).color(NamedTextColor.RED));
|
_plugin.sendMessage(sender, Component.text(Objects.requireNonNull(string)).color(NamedTextColor.RED));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void echoUsage(CommandSender sender, boolean rcon) {
|
private void echoUsage(CommandSender sender, boolean rcon) {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@@ -68,7 +70,7 @@ public class ScoreArchiveCommand implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void sendError(CommandSender sender, String message) {
|
private void sendError(CommandSender sender, String message) {
|
||||||
_plugin.sendMessage(sender, Component.text(message).color(NamedTextColor.RED));
|
_plugin.sendMessage(sender, Component.text(Objects.requireNonNull(message)).color(NamedTextColor.RED));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendUsage(CommandSender sender) {
|
private void sendUsage(CommandSender sender) {
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreReporting;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@@ -121,7 +123,7 @@ public class ScoreBucketCommand implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void sendError(CommandSender sender, String message) {
|
private void sendError(CommandSender sender, String message) {
|
||||||
_plugin.sendMessage(sender, Component.text(message).color(NamedTextColor.RED));
|
_plugin.sendMessage(sender, Component.text(Objects.requireNonNull(message)).color(NamedTextColor.RED));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendUsage(CommandSender sender) {
|
private void sendUsage(CommandSender sender) {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@@ -84,7 +86,7 @@ public class ScoreGetCommand implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void echoError(CommandSender sender, boolean rcon, String string) {
|
private void echoError(CommandSender sender, boolean rcon, String string) {
|
||||||
_plugin.sendMessage(sender, Component.text(string).color(NamedTextColor.RED));
|
_plugin.sendMessage(sender, Component.text(Objects.requireNonNull(string)).color(NamedTextColor.RED));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void echoUsage(CommandSender sender, boolean rcon) {
|
private void echoUsage(CommandSender sender, boolean rcon) {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@@ -62,7 +64,7 @@ public class ScoreResetCommand implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void echoError(CommandSender sender, boolean rcon, String string) {
|
private void echoError(CommandSender sender, boolean rcon, String string) {
|
||||||
_plugin.sendMessage(sender, Component.text(string).color(NamedTextColor.RED));
|
_plugin.sendMessage(sender, Component.text(Objects.requireNonNull(string)).color(NamedTextColor.RED));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void echoUsage(CommandSender sender, boolean rcon) {
|
private void echoUsage(CommandSender sender, boolean rcon) {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ along with ScoreKeeper. If not, see <https://www.gnu.org/licenses/agpl-3.0.txt>.
|
|||||||
package com.majinnaibu.minecraft.plugins.scorekeeper.commands;
|
package com.majinnaibu.minecraft.plugins.scorekeeper.commands;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
||||||
|
|
||||||
@@ -109,7 +110,7 @@ public class ScoreRunCommand implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void sendError(CommandSender sender, String message) {
|
private void sendError(CommandSender sender, String message) {
|
||||||
_plugin.sendMessage(sender, Component.text(message).color(NamedTextColor.RED));
|
_plugin.sendMessage(sender, Component.text(Objects.requireNonNull(message)).color(NamedTextColor.RED));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendUsage(CommandSender sender) {
|
private void sendUsage(CommandSender sender) {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@@ -76,7 +78,7 @@ public class ScoreSubtractCommand implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void echoError(CommandSender sender, boolean rcon, String string) {
|
private void echoError(CommandSender sender, boolean rcon, String string) {
|
||||||
_plugin.sendMessage(sender, Component.text(string).color(NamedTextColor.RED));
|
_plugin.sendMessage(sender, Component.text(Objects.requireNonNull(string)).color(NamedTextColor.RED));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void echoUsage(CommandSender sender, boolean rcon) {
|
private void echoUsage(CommandSender sender, boolean rcon) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
name: ScoreKeeper
|
name: ScoreKeeper
|
||||||
main: com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin
|
main: com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin
|
||||||
version: ${version}
|
version: ${version}
|
||||||
api-version: 1.21
|
api-version: '26.2'
|
||||||
commands:
|
commands:
|
||||||
score-get:
|
score-get:
|
||||||
description: Displays the player's score.
|
description: Displays the player's score.
|
||||||
|
|||||||
@@ -50,8 +50,24 @@ load_project_env
|
|||||||
|
|
||||||
MODRINTH_TOKEN="${MODRINTH_TOKEN:-}"
|
MODRINTH_TOKEN="${MODRINTH_TOKEN:-}"
|
||||||
MODRINTH_PROJECT_ID="${MODRINTH_PROJECT_ID:-5NYwxysp}"
|
MODRINTH_PROJECT_ID="${MODRINTH_PROJECT_ID:-5NYwxysp}"
|
||||||
MODRINTH_CHANGELOG="${MODRINTH_CHANGELOG:-Auto release via publish-modrinth.sh}"
|
generate_changelog() {
|
||||||
MODRINTH_GAME_VERSIONS="${MODRINTH_GAME_VERSIONS:-1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7}"
|
local current_tag previous_tag range commits
|
||||||
|
current_tag=$(git -C "$PROJECT_ROOT" describe --tags --exact-match HEAD 2>/dev/null || true)
|
||||||
|
if [[ -n "$current_tag" ]]; then
|
||||||
|
previous_tag=$(git -C "$PROJECT_ROOT" describe --tags --abbrev=0 "${current_tag}^" 2>/dev/null || true)
|
||||||
|
range="${previous_tag:+$previous_tag..}$current_tag"
|
||||||
|
else
|
||||||
|
previous_tag=$(git -C "$PROJECT_ROOT" describe --tags --abbrev=0 2>/dev/null || true)
|
||||||
|
range="${previous_tag:+$previous_tag..}HEAD"
|
||||||
|
fi
|
||||||
|
commits=$(git -C "$PROJECT_ROOT" log --no-merges --format='- %s (%h)' "$range" 2>/dev/null || true)
|
||||||
|
if [[ -z "$commits" ]]; then
|
||||||
|
commits='- No commit messages found for this release.'
|
||||||
|
fi
|
||||||
|
printf '%s\n\n%s\n' "## What's Changed" "$commits"
|
||||||
|
}
|
||||||
|
MODRINTH_CHANGELOG="${MODRINTH_CHANGELOG:-$(generate_changelog)}"
|
||||||
|
MODRINTH_GAME_VERSIONS="${MODRINTH_GAME_VERSIONS:-26.2,26.3}"
|
||||||
MODRINTH_LOADERS="${MODRINTH_LOADERS:-paper}"
|
MODRINTH_LOADERS="${MODRINTH_LOADERS:-paper}"
|
||||||
MODRINTH_VERSION_TYPE="${MODRINTH_VERSION_TYPE:-}"
|
MODRINTH_VERSION_TYPE="${MODRINTH_VERSION_TYPE:-}"
|
||||||
MODRINTH_FILE="${MODRINTH_FILE:-}"
|
MODRINTH_FILE="${MODRINTH_FILE:-}"
|
||||||
|
|||||||
Reference in New Issue
Block a user