Compare commits
7 Commits
10830a7de7
...
54f4eaaa6f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54f4eaaa6f | ||
|
|
69686d18fd | ||
|
|
114f935522 | ||
|
|
acbd708ffc | ||
|
|
137f8e2197 | ||
|
|
1acb909001 | ||
|
|
76bdc64e2b |
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="src" output="target/classes" path="src/main/java"/>
|
|
||||||
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
|
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
|
||||||
</classpath>
|
|
||||||
317
.cursor/plans/Modernize.md
Normal file
317
.cursor/plans/Modernize.md
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
# Modernize ScoreKeeper Minecraft Plugin
|
||||||
|
|
||||||
|
This checklist will guide the process of updating the ScoreKeeper plugin for compatibility with modern Minecraft Java servers (e.g., PaperMC, Spigot, or Bukkit 1.19+).
|
||||||
|
|
||||||
|
## Modernization Plan
|
||||||
|
|
||||||
|
- [x] **Analyze current codebase**
|
||||||
|
- Review all source files and dependencies
|
||||||
|
- Identify deprecated or removed APIs
|
||||||
|
- [ ] **Update build system**
|
||||||
|
- Update `pom.xml` to use a modern Bukkit/Spigot/PaperMC API version (e.g., 1.19+)
|
||||||
|
- Remove or update old repositories
|
||||||
|
- Ensure Java version compatibility (Java 17+ for latest servers)
|
||||||
|
- [ ] **Update plugin.yml**
|
||||||
|
- Ensure all required fields are present and up to date
|
||||||
|
- Update API version and commands
|
||||||
|
- [ ] **Refactor deprecated API usage**
|
||||||
|
- Replace removed or changed Bukkit/Spigot API calls
|
||||||
|
- Update event listeners and command registration
|
||||||
|
- [ ] **Test on a modern server**
|
||||||
|
- Build the plugin
|
||||||
|
- Run on a local PaperMC/Spigot server (latest LTS)
|
||||||
|
- Use the provided scripts (`tools/bash/start-server.sh` and `tools/bash/stop-server.sh`) to manage the server, and set the `MINECRAFT_SERVER_PATH` and `MINECRAFT_SERVER_JAR` environment variables as described in CONTRIBUTING.md.
|
||||||
|
- Check for errors and warnings
|
||||||
|
- [ ] **Fix bugs and incompatibilities**
|
||||||
|
- Address any issues found during testing
|
||||||
|
- [ ] **Add/update documentation**
|
||||||
|
- Update README with new usage instructions
|
||||||
|
- Document any new features or changes
|
||||||
|
- [ ] **Optional: Add new features or improvements**
|
||||||
|
- Consider adding quality-of-life improvements or new features
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Check off each step as you complete it to track your progress!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Appendix: Gradle vs. Maven
|
||||||
|
|
||||||
|
### Maven
|
||||||
|
**Pros:**
|
||||||
|
- Stability & Maturity: Very stable, predictable builds.
|
||||||
|
- Convention over Configuration: Standard structure and lifecycle.
|
||||||
|
- Dependency Management: Handles dependencies well, large central repository.
|
||||||
|
- Documentation: Extensive documentation and community support.
|
||||||
|
- IDE Support: Excellent integration with Java IDEs.
|
||||||
|
- Widely Used: Many Minecraft plugins and tutorials use Maven.
|
||||||
|
|
||||||
|
**Cons:**
|
||||||
|
- Verbose Configuration: `pom.xml` can become large and hard to read.
|
||||||
|
- Less Flexible: Custom build logic is harder to implement.
|
||||||
|
- Slower for Large Projects: Can be slower than Gradle for complex builds.
|
||||||
|
|
||||||
|
### Gradle
|
||||||
|
**Pros:**
|
||||||
|
- Performance: Generally faster builds, supports incremental builds and caching.
|
||||||
|
- Flexibility: Build scripts in Groovy/Kotlin allow complex logic.
|
||||||
|
- Concise Configuration: `build.gradle` files are usually shorter and easier to read.
|
||||||
|
- Modern Tooling: Better support for modern build features.
|
||||||
|
- Growing Popularity: Increasingly popular in the Java ecosystem.
|
||||||
|
|
||||||
|
**Cons:**
|
||||||
|
- Learning Curve: More complex for beginners, especially for custom logic.
|
||||||
|
- Less Convention: More freedom can lead to less consistency.
|
||||||
|
- Slightly Less Documentation: Not as much Minecraft-specific documentation as Maven.
|
||||||
|
|
||||||
|
### Which is Most Common for Minecraft Plugins?
|
||||||
|
- **Maven** is still the most common for Bukkit, Spigot, and Paper plugins, with most guides and examples using it.
|
||||||
|
- **Gradle** is gaining popularity, especially for newer projects or those needing more flexibility and speed.
|
||||||
|
|
||||||
|
**Summary:**
|
||||||
|
- For maximum compatibility with community resources, Maven is the safest choice.
|
||||||
|
- For a modern, flexible, and fast build system, Gradle is a great option if you're comfortable with it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Appendix: Choosing a Plugin API
|
||||||
|
|
||||||
|
### Bukkit
|
||||||
|
**Description:**
|
||||||
|
The original plugin API for Minecraft servers, now largely unmaintained. Most modern APIs are built on or forked from Bukkit.
|
||||||
|
|
||||||
|
**Pros:**
|
||||||
|
- Huge legacy plugin library.
|
||||||
|
- Simple, well-documented API.
|
||||||
|
- Good for very basic plugins.
|
||||||
|
|
||||||
|
**Cons:**
|
||||||
|
- No longer actively maintained.
|
||||||
|
- Lacks support for modern Minecraft features.
|
||||||
|
- Not recommended for new projects.
|
||||||
|
|
||||||
|
### Spigot
|
||||||
|
**Description:**
|
||||||
|
A high-performance fork of Bukkit, Spigot is the most widely used server software for plugins. It adds performance improvements and bug fixes.
|
||||||
|
|
||||||
|
**Pros:**
|
||||||
|
- Actively maintained and widely used.
|
||||||
|
- Large plugin ecosystem.
|
||||||
|
- Good documentation and community support.
|
||||||
|
- Compatible with most Bukkit plugins.
|
||||||
|
|
||||||
|
**Cons:**
|
||||||
|
- Lags behind the latest Minecraft features compared to Paper.
|
||||||
|
- Fewer advanced features than Paper.
|
||||||
|
|
||||||
|
### Paper
|
||||||
|
**Description:**
|
||||||
|
A fork of Spigot with additional performance optimizations, bug fixes, and new API features. Paper is now the de facto standard for modern plugin development.
|
||||||
|
|
||||||
|
**Pros:**
|
||||||
|
- Actively maintained and very popular.
|
||||||
|
- Superior performance and stability.
|
||||||
|
- Adds many new API features not in Spigot/Bukkit.
|
||||||
|
- Backwards compatible with most Spigot/Bukkit plugins.
|
||||||
|
- Large, active community.
|
||||||
|
|
||||||
|
**Cons:**
|
||||||
|
- Some Paper-specific APIs may not work on Spigot (if you ever want to support both).
|
||||||
|
- Slightly faster update cycle may require more frequent plugin updates.
|
||||||
|
|
||||||
|
### Purpur
|
||||||
|
**Description:**
|
||||||
|
A fork of Paper with even more features, configuration options, and experimental changes. Aimed at server owners who want maximum customization.
|
||||||
|
|
||||||
|
**Pros:**
|
||||||
|
- All benefits of Paper, plus more features and config options.
|
||||||
|
- Great for highly customized servers.
|
||||||
|
|
||||||
|
**Cons:**
|
||||||
|
- Some features are experimental and may be unstable.
|
||||||
|
- Smaller community than Paper/Spigot.
|
||||||
|
- Plugins using Purpur-specific features may not work elsewhere.
|
||||||
|
|
||||||
|
### Sponge
|
||||||
|
**Description:**
|
||||||
|
A completely separate API and server implementation, not based on Bukkit/Spigot/Paper. Aimed at modded servers (Forge) but also works standalone.
|
||||||
|
|
||||||
|
**Pros:**
|
||||||
|
- Designed for both plugins and mods (Forge integration).
|
||||||
|
- Modern, flexible API.
|
||||||
|
- Good for modded servers.
|
||||||
|
|
||||||
|
**Cons:**
|
||||||
|
- Much smaller plugin ecosystem for vanilla servers.
|
||||||
|
- Not compatible with Bukkit/Spigot/Paper plugins.
|
||||||
|
- Less relevant for standard server-only plugins.
|
||||||
|
|
||||||
|
### Summary & Recommendation
|
||||||
|
- **Paper** is the best choice for most modern server-only plugins: it’s fast, stable, actively maintained, and has the richest API.
|
||||||
|
- **Spigot** is a safe fallback if you want maximum compatibility, but Paper is almost always preferred now.
|
||||||
|
- **Purpur** is great for highly customized servers, but not necessary unless you want its extra features.
|
||||||
|
- **Sponge** is only recommended if you want to support modded servers or need its unique API.
|
||||||
|
|
||||||
|
**For your use case (server-only, modern, not needing experimental features):**
|
||||||
|
**Paper** is the best option. It gives you the most features, best performance, and widest compatibility for new plugin development.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Appendix: Development Setup
|
||||||
|
|
||||||
|
### Minecraft Launchers (Java Edition)
|
||||||
|
|
||||||
|
**Official Minecraft Launcher**
|
||||||
|
- Fully supported by Mojang/Microsoft.
|
||||||
|
- Works on Windows, macOS, and Linux (including WSL with GUI support).
|
||||||
|
- Easiest for vanilla play and account management.
|
||||||
|
|
||||||
|
**Prism Launcher** (formerly PolyMC)
|
||||||
|
- Open source, cross-platform (Windows, macOS, Linux).
|
||||||
|
- Great for managing multiple Minecraft instances, modpacks, and versions.
|
||||||
|
- Works well in Linux environments.
|
||||||
|
|
||||||
|
**MultiMC**
|
||||||
|
- Similar to Prism Launcher, but older and less actively maintained.
|
||||||
|
- Good for managing multiple instances.
|
||||||
|
|
||||||
|
**Recommendation:**
|
||||||
|
- Use the Official Minecraft Launcher for playing and account management.
|
||||||
|
- Use Prism Launcher for advanced instance/modpack management, especially on Linux/macOS.
|
||||||
|
|
||||||
|
### Server Software for Plugin Development
|
||||||
|
|
||||||
|
**Paper**
|
||||||
|
- Most popular for plugin development.
|
||||||
|
- Fast, stable, and actively maintained.
|
||||||
|
- Easy to run in headless/automated environments (Linux containers, CI).
|
||||||
|
- [Download Paper](https://papermc.io/downloads)
|
||||||
|
|
||||||
|
**Spigot**
|
||||||
|
- Still widely used, but less feature-rich than Paper.
|
||||||
|
- Requires building with BuildTools ([spigotmc.org/wiki/buildtools](https://www.spigotmc.org/wiki/buildtools/))
|
||||||
|
|
||||||
|
**Purpur**
|
||||||
|
- Fork of Paper with more options.
|
||||||
|
- [Download Purpur](https://purpurmc.org/downloads)
|
||||||
|
|
||||||
|
**Recommendation:**
|
||||||
|
- Use Paper for your main development and testing server.
|
||||||
|
- Download the latest Paper jar and run it directly in your Linux environment or containers.
|
||||||
|
|
||||||
|
### Automated Testing & Linux Containers
|
||||||
|
- Paper runs perfectly in headless Linux environments (including WSL, Docker, CI/CD).
|
||||||
|
- You can script server startup, plugin deployment, and automated plugin tests using bash scripts.
|
||||||
|
- For CI/CD, use GitHub Actions, GitLab CI, or any Linux-based runner.
|
||||||
|
|
||||||
|
### Summary Table
|
||||||
|
|
||||||
|
| Use Case | Recommended Launcher | Recommended Server |
|
||||||
|
|-------------------------|-----------------------------|-------------------|
|
||||||
|
| Playing Minecraft | Official Launcher / Prism | N/A |
|
||||||
|
| Plugin Development | N/A | Paper |
|
||||||
|
| Automated Testing/CI | N/A | Paper |
|
||||||
|
| Multi-instance/modpacks | Prism Launcher | Paper |
|
||||||
|
|
||||||
|
### Next Steps
|
||||||
|
- Download the Official Minecraft Launcher for playing.
|
||||||
|
- Download Prism Launcher if you want advanced management.
|
||||||
|
- Download the latest Paper server jar for plugin development and testing.
|
||||||
|
|
||||||
|
#### Server Management Scripts and Environment Variables
|
||||||
|
- Use the `tools/bash/start-server.sh` and `tools/bash/stop-server.sh` scripts to start and stop your Paper server for development and testing.
|
||||||
|
- Set the following environment variables in your shell:
|
||||||
|
- `MINECRAFT_SERVER_PATH`: The root path of your Paper server directory.
|
||||||
|
- `MINECRAFT_SERVER_JAR`: The path to your Paper server jar (relative to `MINECRAFT_SERVER_PATH` or absolute).
|
||||||
|
- See `CONTRIBUTING.md` for detailed setup instructions.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Appendix: Codebase Analysis and Migration Notes
|
||||||
|
|
||||||
|
### Deprecated or Removed API Usage
|
||||||
|
- **Player as HashMap key:**
|
||||||
|
- Uses `HashMap<Player, Integer>`. This is not reliable; use `UUID` as the key instead.
|
||||||
|
- **Logger usage:**
|
||||||
|
- Uses `Logger.getLogger("Minecraft")`. Use `getLogger()` from `JavaPlugin` for modern plugins.
|
||||||
|
- **Old event registration (commented out):**
|
||||||
|
- Uses deprecated Bukkit event registration. Modernize with `@EventHandler` and `registerEvents` if needed.
|
||||||
|
- **Player lookup:**
|
||||||
|
- Uses `getServer().getPlayer(name)`. This is case-sensitive and only matches exact names in modern Paper/Spigot. Consider using `getPlayerExact` or handling case-insensitivity.
|
||||||
|
|
||||||
|
### Hardcoded Bukkit References
|
||||||
|
- All imports are from `org.bukkit.*`, which is compatible with Paper. No hardcoded Bukkit-only features found.
|
||||||
|
- No use of Bukkit’s old event system in active code (just commented out).
|
||||||
|
|
||||||
|
### Recommendations for Paper Migration
|
||||||
|
- Switch all player score storage to use `UUID` instead of `Player` as the key.
|
||||||
|
- Use `getLogger()` from `JavaPlugin` for logging.
|
||||||
|
- If you add event listeners, use the modern event system (`@EventHandler`, `registerEvents`).
|
||||||
|
- Review and update player lookup logic for case sensitivity and exact matching.
|
||||||
|
- Ensure all commands are properly defined in `plugin.yml`.
|
||||||
|
|
||||||
|
#### Summary Table
|
||||||
|
| Issue/Pattern | Status / Recommendation |
|
||||||
|
|------------------------------|----------------------------------------|
|
||||||
|
| Player as HashMap key | ❌ Use UUID instead |
|
||||||
|
| Logger | ❌ Use getLogger() |
|
||||||
|
| Old event registration | ❌ Use @EventHandler, registerEvents |
|
||||||
|
| Command registration | ✅ Valid, check plugin.yml |
|
||||||
|
| Player lookup | ⚠️ Use getPlayerExact for safety |
|
||||||
|
| Hardcoded Bukkit features | ✅ None found |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Appendix: Migrating from Maven to Gradle
|
||||||
|
|
||||||
|
Switching from Maven to Gradle involves several steps to ensure a smooth transition and a working build system for your plugin.
|
||||||
|
|
||||||
|
### Migration Steps
|
||||||
|
- **Initialize Gradle in the Project**
|
||||||
|
- Use `gradle init` or manually create a `build.gradle` file.
|
||||||
|
- **Migrate Project Metadata**
|
||||||
|
- Set `group`, `version`, and `description` in `build.gradle`.
|
||||||
|
- **Migrate Dependencies**
|
||||||
|
- Copy dependencies from `pom.xml` to the `dependencies` block in `build.gradle`.
|
||||||
|
- Add the PaperMC (or Spigot) repository.
|
||||||
|
- **Configure Java Version**
|
||||||
|
- Set the Java toolchain or source/target compatibility in `build.gradle`.
|
||||||
|
- **Migrate Resource Handling**
|
||||||
|
- Ensure `plugin.yml` and any other resources are in `src/main/resources`.
|
||||||
|
- **Migrate Build Plugins/Tasks**
|
||||||
|
- If you used Maven plugins (e.g., for shading), add equivalent Gradle plugins (e.g., Shadow plugin).
|
||||||
|
- **Update .gitignore**
|
||||||
|
- Add Gradle-specific files (`.gradle/`, `build/`) and remove Maven-specific ones (`target/`).
|
||||||
|
- **Remove Maven Files**
|
||||||
|
- Remove `pom.xml` and any Maven wrapper files if not needed.
|
||||||
|
- **Update Documentation and Scripts**
|
||||||
|
- Update README, CONTRIBUTING, and any scripts to use Gradle commands (`./gradlew build`, etc.).
|
||||||
|
- **Test the Build**
|
||||||
|
- Run `./gradlew build` and verify the output jar works as expected.
|
||||||
|
|
||||||
|
### Task List for Migration
|
||||||
|
- [ ] Initialize Gradle build system
|
||||||
|
- [ ] Set project metadata in `build.gradle`
|
||||||
|
- [ ] Add repositories and dependencies
|
||||||
|
- [ ] Configure Java version
|
||||||
|
- [ ] Ensure resource handling for `plugin.yml`
|
||||||
|
- [ ] Add Gradle plugins as needed (e.g., Shadow)
|
||||||
|
- [ ] Update `.gitignore` for Gradle
|
||||||
|
- [ ] Remove Maven files
|
||||||
|
- [ ] Update documentation and scripts
|
||||||
|
- [ ] Test the Gradle build
|
||||||
|
|
||||||
|
#### Summary Table
|
||||||
|
| Step | Description |
|
||||||
|
|-----------------------------|------------------------------------------------|
|
||||||
|
| Initialize Gradle | Create `build.gradle` or use `gradle init` |
|
||||||
|
| Project Metadata | Set group, version, description |
|
||||||
|
| Dependencies | Add PaperMC repo and dependencies |
|
||||||
|
| Java Version | Set Java toolchain/source compatibility |
|
||||||
|
| Resource Handling | Ensure `plugin.yml` in resources |
|
||||||
|
| Build Plugins | Add Shadow or other plugins as needed |
|
||||||
|
| .gitignore | Add Gradle files, remove Maven files |
|
||||||
|
| Remove Maven Files | Delete `pom.xml`, Maven wrapper |
|
||||||
|
| Documentation/Scripts | Update to use Gradle |
|
||||||
|
| Test Build | Run and verify `./gradlew build` |
|
||||||
9
.cursor/rules.md
Normal file
9
.cursor/rules.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Cursor Rules for Modernizing ScoreKeeper
|
||||||
|
|
||||||
|
- All plans should be created in `.cursor/plans`.
|
||||||
|
- All plans should use checkboxes to track the completion state of action items or implementation steps.
|
||||||
|
- Do not add checkboxes to items that are informational, such as notes or descriptions.
|
||||||
|
- Use `bash` or `zsh` as the shell for development tasks.
|
||||||
|
- Any tool scripts should use `bash` as their shell.
|
||||||
|
- By default, the user will manually run build or test commands and provide the output. However, if the user requests, commands may be run directly—always show the command and ask for output unless instructed otherwise.
|
||||||
|
- When creating or updating plans, do not make changes to the project code or files (other than the plan files themselves). Only update plan files to reflect progress or changes.
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
/target
|
.gradle/
|
||||||
|
build/
|
||||||
|
|||||||
23
.project
23
.project
@@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>ScoreKeeper</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
2
.settings/org.eclipse.jdt.apt.core.prefs
Normal file
2
.settings/org.eclipse.jdt.apt.core.prefs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.apt.aptEnabled=false
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
#Sun Feb 19 04:11:12 PST 2012
|
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=ignore
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.6
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||||
org.eclipse.jdt.core.compiler.source=1.6
|
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.processAnnotations=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.release=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"java.configuration.updateBuildConfiguration": "interactive"
|
||||||
|
}
|
||||||
45
CONTRIBUTING.md
Normal file
45
CONTRIBUTING.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Contributing to ScoreKeeper
|
||||||
|
|
||||||
|
Thank you for your interest in contributing to the ScoreKeeper plugin! This guide will help you set up your development environment and follow best practices for working with the project.
|
||||||
|
|
||||||
|
## Development Environment Setup
|
||||||
|
|
||||||
|
To develop and test the ScoreKeeper plugin, you will need:
|
||||||
|
- A Paper Minecraft server (for plugin deployment and testing)
|
||||||
|
- The official Minecraft Java Edition client (for connecting to your test server)
|
||||||
|
|
||||||
|
### 1. Setting up the Paper Server (macOS/Linux/WSL)
|
||||||
|
1. Download the latest Paper server jar from [https://papermc.io/downloads](https://papermc.io/downloads).
|
||||||
|
2. Create a directory for your test server and place the Paper jar inside.
|
||||||
|
3. Set the following environment variables in your shell profile (e.g., `.bashrc`, `.zshrc`, or manually in your terminal):
|
||||||
|
```bash
|
||||||
|
export MINECRAFT_SERVER_PATH=/path/to/your/server
|
||||||
|
export MINECRAFT_SERVER_JAR=paper-<version>.jar # Can be relative to MINECRAFT_SERVER_PATH or absolute
|
||||||
|
```
|
||||||
|
4. Use the provided scripts to manage your server:
|
||||||
|
- To start (or restart) the server: `tools/bash/start-server.sh`
|
||||||
|
- To stop the server: `tools/bash/stop-server.sh`
|
||||||
|
These scripts use the environment variables above to locate and manage your server.
|
||||||
|
5. On first run, accept the EULA by editing `eula.txt` and setting `eula=true` in your server directory.
|
||||||
|
6. Place your built plugin jar in the `plugins/` directory.
|
||||||
|
7. Use the start script again to restart the server and load the plugin.
|
||||||
|
|
||||||
|
### 2. Setting up the Minecraft Client
|
||||||
|
- **macOS/Linux:**
|
||||||
|
- Download and install the official Minecraft Launcher from [minecraft.net](https://www.minecraft.net/en-us/download).
|
||||||
|
- Log in with your Mojang/Microsoft account and launch the Java Edition client.
|
||||||
|
- **WSL (Windows Subsystem for Linux):**
|
||||||
|
- For best performance, run the Minecraft client directly under Windows, not inside WSL.
|
||||||
|
- Download and install the official Minecraft Launcher for Windows from [minecraft.net](https://www.minecraft.net/en-us/download).
|
||||||
|
- Use WSL for server and plugin development, and connect to your test server from the Windows client.
|
||||||
|
|
||||||
|
### 3. Connecting the Client to Your Server
|
||||||
|
- Start your Paper server (see above).
|
||||||
|
- In the Minecraft client, add a new server with the address:
|
||||||
|
- `localhost` (if running both client and server on the same machine)
|
||||||
|
- Or use your machine's IP address if connecting across devices.
|
||||||
|
|
||||||
|
### 4. Notes
|
||||||
|
- You can automate server startup and plugin deployment with bash scripts for faster testing.
|
||||||
|
- For automated testing or CI, run the Paper server in a headless Linux environment (including WSL, Docker, or CI runners).
|
||||||
|
- Always use the provided scripts and environment variables for consistent server management.
|
||||||
21
README.md
Normal file
21
README.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# ScoreKeeper Plugin
|
||||||
|
|
||||||
|
## Running
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* `/score-get [playerName]` - Displays the player's score.
|
||||||
|
* `/score-add [playerName] <amount>` - Add amount points to the player's score.
|
||||||
|
* `/score-subtract [playerName] <amount>` - Subtracts amount points from the player's score.
|
||||||
|
* `/score-reset [playerName]` - Resets the player's score to 0.
|
||||||
|
* `/score-archive [playerName]` - Saves the player's score to a "High Scores" table and resets their current score to 0.
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
* All commands will use the executing player in place of [playerName] if it is omitted.
|
||||||
|
* Permissions support is coming AFTER I get archive to work.
|
||||||
|
* The commands aside from get are intended for admins and whatnot as some other plugin should be using the methods instead of letting player's execute commands.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for development environment setup instructions.
|
||||||
|
|
||||||
12
Readme.txt
12
Readme.txt
@@ -1,12 +0,0 @@
|
|||||||
Commands:
|
|
||||||
/score-get [playerName] - Displays the player's score.
|
|
||||||
/score-add [playerName] <amount> - Add amount points to the player's score.
|
|
||||||
/score-subtract [playerName] <amount> - Subtracts amount points from the player's score.
|
|
||||||
/score-reset [playerName] - Resets the player's score to 0.
|
|
||||||
/score-archive [playerName] - Saves the player's score to a "High Scores" table and resets their current score to 0.
|
|
||||||
|
|
||||||
NOTES:
|
|
||||||
* All commands will use the executing player in place of [playerName] if it is omitted.
|
|
||||||
* Permissions support is coming AFTER I get archive to work.
|
|
||||||
* The commands aside from get are intended for admins and whatnot as some other plugin should be using the methods instead of letting player's execute commands.
|
|
||||||
|
|
||||||
17
TODO.md
Normal file
17
TODO.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Migration TODOs for Paper Modernization
|
||||||
|
|
||||||
|
- [x] Switch all player score storage to use UUID instead of Player as the key
|
||||||
|
- [ ] Update logger usage to use getLogger() from JavaPlugin
|
||||||
|
- [ ] Remove or modernize any old/deprecated event registration (use @EventHandler and registerEvents)
|
||||||
|
- [ ] Review and update player lookup logic to use getPlayerExact or handle case sensitivity
|
||||||
|
- [x] Ensure all commands are properly defined in plugin.yml
|
||||||
|
- [x] Initialize Gradle build system
|
||||||
|
- [x] Set project metadata in build.gradle
|
||||||
|
- [x] Add repositories and dependencies
|
||||||
|
- [x] Configure Java version
|
||||||
|
- [x] Ensure resource handling for plugin.yml
|
||||||
|
- [x] Add Gradle plugins as needed (e.g., Shadow)
|
||||||
|
- [x] Update .gitignore for Gradle
|
||||||
|
- [x] Remove Maven files
|
||||||
|
- [x] Update documentation and scripts
|
||||||
|
- [x] Test the Gradle build
|
||||||
34
build.gradle
Normal file
34
build.gradle
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
plugins {
|
||||||
|
id 'java'
|
||||||
|
}
|
||||||
|
|
||||||
|
group = 'com.majinnaibu.minecraft.plugins.'
|
||||||
|
version = '0.2.0-SNAPSHOT'
|
||||||
|
|
||||||
|
description = "ScoreKeeper"
|
||||||
|
|
||||||
|
java {
|
||||||
|
toolchain {
|
||||||
|
languageVersion = JavaLanguageVersion.of(21)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
maven { url = 'https://repo.papermc.io/repository/maven-public/' }
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly 'io.papermc.paper:paper-api:1.21.7-R0.1-SNAPSHOT'
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType(JavaCompile).configureEach {
|
||||||
|
options.encoding = 'UTF-8'
|
||||||
|
// options.compilerArgs << "-Xlint:deprecation"
|
||||||
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
filesMatching('plugin.yml') {
|
||||||
|
expand(project.properties)
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
5
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
5
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
176
gradlew
vendored
Executable file
176
gradlew
vendored
Executable file
@@ -0,0 +1,176 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
##
|
||||||
|
## Gradle start up script for UN*X
|
||||||
|
##
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
PRG="$0"
|
||||||
|
# Need this for relative symlinks.
|
||||||
|
while [ -h "$PRG" ] ; do
|
||||||
|
ls=`ls -ld "$PRG"`
|
||||||
|
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||||
|
if expr "$link" : '/.*' > /dev/null; then
|
||||||
|
PRG="$link"
|
||||||
|
else
|
||||||
|
PRG=`dirname "$PRG"`"/$link"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
SAVED="`pwd`"
|
||||||
|
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||||
|
APP_HOME="`pwd -P`"
|
||||||
|
cd "$SAVED" >/dev/null
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS=""
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD="maximum"
|
||||||
|
|
||||||
|
warn () {
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
nonstop=false
|
||||||
|
case "`uname`" in
|
||||||
|
CYGWIN* )
|
||||||
|
cygwin=true
|
||||||
|
;;
|
||||||
|
Darwin* )
|
||||||
|
darwin=true
|
||||||
|
;;
|
||||||
|
MINGW* )
|
||||||
|
msys=true
|
||||||
|
;;
|
||||||
|
NONSTOP* )
|
||||||
|
nonstop=true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="java"
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||||
|
MAX_FD_LIMIT=`ulimit -H -n`
|
||||||
|
if [ $? -eq 0 ] ; then
|
||||||
|
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||||
|
MAX_FD="$MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
ulimit -n $MAX_FD
|
||||||
|
if [ $? -ne 0 ] ; then
|
||||||
|
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Darwin, add options to specify how the application appears in the dock
|
||||||
|
if $darwin; then
|
||||||
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
|
if $cygwin ; then
|
||||||
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
|
|
||||||
|
# We build the pattern for arguments to be converted via cygpath
|
||||||
|
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||||
|
SEP=""
|
||||||
|
for dir in $ROOTDIRSRAW ; do
|
||||||
|
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||||
|
SEP="|"
|
||||||
|
done
|
||||||
|
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||||
|
# Add a user-defined pattern to the cygpath arguments
|
||||||
|
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||||
|
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||||
|
fi
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
i=0
|
||||||
|
for arg in "$@" ; do
|
||||||
|
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||||
|
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||||
|
|
||||||
|
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||||
|
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||||
|
else
|
||||||
|
eval `echo args$i`="\"$arg\""
|
||||||
|
fi
|
||||||
|
i=$((i+1))
|
||||||
|
done
|
||||||
|
case $i in
|
||||||
|
(0) set -- ;;
|
||||||
|
(1) set -- "$args0" ;;
|
||||||
|
(2) set -- "$args0" "$args1" ;;
|
||||||
|
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||||
|
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||||
|
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||||
|
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||||
|
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||||
|
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||||
|
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Escape application args
|
||||||
|
save () {
|
||||||
|
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||||
|
echo " "
|
||||||
|
}
|
||||||
|
APP_ARGS=$(save "$@")
|
||||||
|
|
||||||
|
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||||
|
if $JAVACMD --add-opens java.base/java.lang=ALL-UNNAMED -version ; then
|
||||||
|
DEFAULT_JVM_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED $DEFAULT_JVM_OPTS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||||
|
|
||||||
|
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||||
|
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
||||||
84
gradlew.bat
vendored
Normal file
84
gradlew.bat
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS=
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:init
|
||||||
|
@rem Get command-line arguments, handling Windows variants
|
||||||
|
|
||||||
|
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||||
|
|
||||||
|
:win9xME_args
|
||||||
|
@rem Slurp the command line arguments.
|
||||||
|
set CMD_LINE_ARGS=
|
||||||
|
set _SKIP=2
|
||||||
|
|
||||||
|
:win9xME_args_slurp
|
||||||
|
if "x%~1" == "x" goto execute
|
||||||
|
|
||||||
|
set CMD_LINE_ARGS=%*
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
||||||
51
pom.xml
51
pom.xml
@@ -1,51 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>com.majinnaibu.bukkitplugins</groupId>
|
|
||||||
<artifactId>ScoreKeeper</artifactId>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
<version>0.2-SNAPSHOT</version>
|
|
||||||
<name>bukkitplugin</name>
|
|
||||||
<description></description>
|
|
||||||
<url>http://www.github.com/headhunter45/ScoreKeeper</url>
|
|
||||||
<properties>
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<scm>
|
|
||||||
<connection>scm:git:git://github.com/headhunter45/ScoreKeeper.git</connection>
|
|
||||||
<url>https://github.com/headhunter45/ScoreKeeper</url>
|
|
||||||
<developerConnection>scm:git:git@github.com:headhunter45/ScoreKeeper.git</developerConnection>
|
|
||||||
</scm>
|
|
||||||
|
|
||||||
<repositories>
|
|
||||||
<repository>
|
|
||||||
<id>majinnaibu-repo</id>
|
|
||||||
<url>http://repo.majinnaibu.com</url>
|
|
||||||
</repository>
|
|
||||||
|
|
||||||
<repository>
|
|
||||||
<id>bukkit-repo</id>
|
|
||||||
<url>http://repo.bukkit.org/content/groups/public</url>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<!-- Bukkit -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>bukkit</artifactId>
|
|
||||||
<version>1.1-R6</version>
|
|
||||||
<type>jar</type>
|
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
|
||||||
<!--
|
|
||||||
<dependency>
|
|
||||||
<groupId>junit</groupId>
|
|
||||||
<artifactId>junit</artifactId>
|
|
||||||
<version>3.8.1</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
-->
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
1
settings.gradle
Normal file
1
settings.gradle
Normal file
@@ -0,0 +1 @@
|
|||||||
|
rootProject.name = 'ScoreKeeper'
|
||||||
@@ -1,23 +1,20 @@
|
|||||||
package com.majinnaibu.bukkitplugins.scorekeeper;
|
package com.majinnaibu.minecraft.plugins.scorekeeper;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.logging.Logger;
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.plugin.PluginDescriptionFile;
|
import org.bukkit.plugin.PluginDescriptionFile;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.commands.ScoreAddCommand;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.commands.ScoreAddCommand;
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.commands.ScoreArchiveCommand;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.commands.ScoreArchiveCommand;
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.commands.ScoreGetCommand;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.commands.ScoreGetCommand;
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.commands.ScoreResetCommand;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.commands.ScoreResetCommand;
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.commands.ScoreSubtractCommand;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.commands.ScoreSubtractCommand;
|
||||||
|
|
||||||
public class ScoreKeeperPlugin extends JavaPlugin {
|
public class ScoreKeeperPlugin extends JavaPlugin {
|
||||||
private final HashMap<Player, Integer> _playerScores = new HashMap<Player, Integer>();
|
private final HashMap<UUID, Integer> _playerScores = new HashMap<UUID, Integer>();
|
||||||
|
|
||||||
public final Logger log = Logger.getLogger("Minecraft");
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
@@ -37,25 +34,28 @@ public class ScoreKeeperPlugin extends JavaPlugin {
|
|||||||
//TODO: load score data from file
|
//TODO: load score data from file
|
||||||
|
|
||||||
PluginDescriptionFile pdFile = this.getDescription();
|
PluginDescriptionFile pdFile = this.getDescription();
|
||||||
log.info(pdFile.getName() + " version " + pdFile.getVersion() + " is enabled!");
|
getLogger().info(pdFile.getName() + " version " + pdFile.getVersion() + " is enabled!");
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getPlayerScore(Player player) {
|
public int getPlayerScore(Player player) {
|
||||||
if(!_playerScores.containsKey(player)){
|
UUID uuid = player.getUniqueId();
|
||||||
_playerScores.put(player, 0);
|
if(!_playerScores.containsKey(uuid)){
|
||||||
|
_playerScores.put(uuid, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return _playerScores.get(player);
|
return _playerScores.get(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addScore(Player player, int amount) {
|
public void addScore(Player player, int amount) {
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
int score = getPlayerScore(player);
|
int score = getPlayerScore(player);
|
||||||
_playerScores.put(player, score + amount);
|
_playerScores.put(uuid, score + amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void subtractScore(Player player, int amount) {
|
public void subtractScore(Player player, int amount) {
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
int score = getPlayerScore(player);
|
int score = getPlayerScore(player);
|
||||||
_playerScores.put(player, score - amount);
|
_playerScores.put(uuid, score - amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resetPlayerScore(Player targetPlayer) {
|
public void resetPlayerScore(Player targetPlayer) {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.majinnaibu.bukkitplugins.scorekeeper.commands;
|
package com.majinnaibu.minecraft.plugins.scorekeeper.commands;
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
@@ -6,7 +6,7 @@ import org.bukkit.command.CommandExecutor;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.ScoreKeeperPlugin;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
||||||
|
|
||||||
public class ScoreAddCommand implements CommandExecutor {
|
public class ScoreAddCommand implements CommandExecutor {
|
||||||
private final ScoreKeeperPlugin _plugin;
|
private final ScoreKeeperPlugin _plugin;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.majinnaibu.bukkitplugins.scorekeeper.commands;
|
package com.majinnaibu.minecraft.plugins.scorekeeper.commands;
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
@@ -6,7 +6,7 @@ import org.bukkit.command.CommandExecutor;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.ScoreKeeperPlugin;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
||||||
|
|
||||||
public class ScoreArchiveCommand implements CommandExecutor {
|
public class ScoreArchiveCommand implements CommandExecutor {
|
||||||
private final ScoreKeeperPlugin _plugin;
|
private final ScoreKeeperPlugin _plugin;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.majinnaibu.bukkitplugins.scorekeeper.commands;
|
package com.majinnaibu.minecraft.plugins.scorekeeper.commands;
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
@@ -6,7 +6,7 @@ import org.bukkit.command.CommandExecutor;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.ScoreKeeperPlugin;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
||||||
|
|
||||||
public class ScoreGetCommand implements CommandExecutor {
|
public class ScoreGetCommand implements CommandExecutor {
|
||||||
private final ScoreKeeperPlugin _plugin;
|
private final ScoreKeeperPlugin _plugin;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.majinnaibu.bukkitplugins.scorekeeper.commands;
|
package com.majinnaibu.minecraft.plugins.scorekeeper.commands;
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
@@ -6,7 +6,7 @@ import org.bukkit.command.CommandExecutor;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.ScoreKeeperPlugin;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
||||||
|
|
||||||
public class ScoreResetCommand implements CommandExecutor {
|
public class ScoreResetCommand implements CommandExecutor {
|
||||||
private final ScoreKeeperPlugin _plugin;
|
private final ScoreKeeperPlugin _plugin;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.majinnaibu.bukkitplugins.scorekeeper.commands;
|
package com.majinnaibu.minecraft.plugins.scorekeeper.commands;
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
@@ -6,7 +6,7 @@ import org.bukkit.command.CommandExecutor;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.majinnaibu.bukkitplugins.scorekeeper.ScoreKeeperPlugin;
|
import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
||||||
|
|
||||||
public class ScoreSubtractCommand implements CommandExecutor {
|
public class ScoreSubtractCommand implements CommandExecutor {
|
||||||
private final ScoreKeeperPlugin _plugin;
|
private final ScoreKeeperPlugin _plugin;
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
name: ScoreKeeper
|
name: ScoreKeeper
|
||||||
main: com.majinnaibu.bukkit.plugins.scorekeeper.ScoreKeeperPlugin
|
main: com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin
|
||||||
version: 0.0a
|
version: ${version}
|
||||||
|
api-version: 1.21
|
||||||
commands:
|
commands:
|
||||||
score-get:
|
score-get:
|
||||||
description: Displays the player's score.
|
description: Displays the player's score.
|
||||||
|
|||||||
10
tools/bash/build-plugin.sh
Executable file
10
tools/bash/build-plugin.sh
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Find project root (two directories above this script)
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||||
|
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
./gradlew build
|
||||||
25
tools/bash/deploy-plugin.sh
Executable file
25
tools/bash/deploy-plugin.sh
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [[ -z "$MINECRAFT_SERVER_PATH" ]]; then
|
||||||
|
echo "Error: MINECRAFT_SERVER_PATH environment variable is not set."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||||
|
|
||||||
|
PLUGIN_JAR=$(ls -t "$PROJECT_ROOT"/build/libs/*.jar 2>/dev/null | head -n1)
|
||||||
|
if [[ ! -f "$PLUGIN_JAR" ]]; then
|
||||||
|
echo "Error: No plugin jar found in $PROJECT_ROOT/build/libs. Build the plugin first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Optional: Warn if jar is older than any source file
|
||||||
|
if find "$PROJECT_ROOT/src/main/java" "$PROJECT_ROOT/src/main/resources" -type f -newer "$PLUGIN_JAR" | grep -q .; then
|
||||||
|
echo "Warning: The built plugin jar is older than some source files. Consider rebuilding."
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$MINECRAFT_SERVER_PATH/plugins"
|
||||||
|
cp "$PLUGIN_JAR" "$MINECRAFT_SERVER_PATH/plugins/"
|
||||||
|
echo "Deployed $PLUGIN_JAR to $MINECRAFT_SERVER_PATH/plugins/"
|
||||||
27
tools/bash/start-server.sh
Executable file
27
tools/bash/start-server.sh
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Check required environment variables
|
||||||
|
if [[ -z "$MINECRAFT_SERVER_PATH" || -z "$MINECRAFT_SERVER_JAR" ]]; then
|
||||||
|
echo "Error: MINECRAFT_SERVER_PATH and MINECRAFT_SERVER_JAR must be set."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$MINECRAFT_SERVER_PATH"
|
||||||
|
|
||||||
|
# Find running server process (java with the server jar)
|
||||||
|
SERVER_PID=$(pgrep -f "java.*$MINECRAFT_SERVER_JAR" || true)
|
||||||
|
|
||||||
|
if [[ -n "$SERVER_PID" ]]; then
|
||||||
|
echo "Minecraft server is running (PID: $SERVER_PID). Stopping it..."
|
||||||
|
kill "$SERVER_PID"
|
||||||
|
sleep 5
|
||||||
|
else
|
||||||
|
echo "Minecraft server is not running."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start the server (in a detached screen session)
|
||||||
|
pushd "${MINECRAFT_SERVER_PATH}"
|
||||||
|
java -jar "${MINECRAFT_SERVER_JAR}"
|
||||||
|
popd
|
||||||
21
tools/bash/stop-server.sh
Executable file
21
tools/bash/stop-server.sh
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [[ -z "$MINECRAFT_SERVER_PATH" || -z "$MINECRAFT_SERVER_JAR" ]]; then
|
||||||
|
echo "Error: MINECRAFT_SERVER_PATH and MINECRAFT_SERVER_JAR must be set."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$MINECRAFT_SERVER_PATH"
|
||||||
|
|
||||||
|
SERVER_PID=$(pgrep -f "java.*$MINECRAFT_SERVER_JAR" || true)
|
||||||
|
|
||||||
|
if [[ -n "$SERVER_PID" ]]; then
|
||||||
|
echo "Minecraft server is running (PID: $SERVER_PID). Stopping it..."
|
||||||
|
kill "$SERVER_PID"
|
||||||
|
sleep 5
|
||||||
|
echo "Minecraft server stopped."
|
||||||
|
else
|
||||||
|
echo "Minecraft server is not running."
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user