Compare commits
10 Commits
main
...
3506b416f6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3506b416f6 | ||
|
|
19de3c8097 | ||
|
|
b91b28691d | ||
|
|
67fa2db30f | ||
|
|
b825c38989 | ||
|
|
abed14ab9d | ||
|
|
85a4ac0585 | ||
|
|
bbc512a044 | ||
|
|
a65b8d2ca1 | ||
|
|
abce28f863 |
378
.cursor/plans/Modernize.md
Normal file
378
.cursor/plans/Modernize.md
Normal file
@@ -0,0 +1,378 @@
|
||||
# Modernize MobScores Minecraft Plugin
|
||||
|
||||
This plan outlines the steps to modernize the MobScores plugin, migrating from an old Maven/Bukkit setup to a modern Gradle/PaperMC build, and updating project structure and configuration for best practices.
|
||||
|
||||
---
|
||||
|
||||
## 1. Analyze Current Codebase
|
||||
- [ ] Review all Java source files for deprecated or removed Bukkit API usage.
|
||||
- [ ] Identify any hardcoded Bukkit references or legacy patterns (e.g., using Player as HashMap key, old event registration, etc.).
|
||||
- [ ] Note any custom scripts or resources that may need migration.
|
||||
|
||||
## 2. Migrate Build System: Maven → Gradle
|
||||
- [ ] Initialize Gradle in the project root (if not already present).
|
||||
- [ ] Create a `build.gradle` file with:
|
||||
- Project metadata (group, version, description) from `pom.xml`.
|
||||
- PaperMC API dependency (latest stable, e.g., 1.19+).
|
||||
- JUnit (or modern test framework) for tests.
|
||||
- Java toolchain/source compatibility (Java 17+ recommended for Paper 1.19+).
|
||||
- PaperMC repository for dependencies.
|
||||
- Resource handling for `plugin.yml`.
|
||||
- Shadow plugin or equivalent for fat-jar if needed.
|
||||
- [ ] Remove Maven-specific files:
|
||||
- `pom.xml`
|
||||
- `.mvn/` directory (if present)
|
||||
- Any Maven wrapper scripts
|
||||
- [ ] Remove Eclipse-specific files (e.g., `.classpath`, `.project`, `.settings/`) if present.
|
||||
|
||||
## 3. Update .gitignore
|
||||
- [ ] Add Gradle-specific ignores:
|
||||
- `.gradle/`
|
||||
- `build/`
|
||||
- `!gradle/wrapper/`
|
||||
- `*.iml`, `.idea/` (if using IntelliJ)
|
||||
- [ ] Remove Maven-specific ignores (e.g., `target/`).
|
||||
- [ ] Remove Eclipse-specific ignores (e.g., `.classpath`, `.project`, `.settings/`).
|
||||
|
||||
## 4. Update plugin.yml
|
||||
- [ ] Ensure `plugin.yml` is present in `src/main/resources`.
|
||||
- [ ] Update API version and commands for PaperMC compatibility.
|
||||
- [ ] Add/verify all required fields (name, main, version, api-version, commands, etc.).
|
||||
|
||||
## 5. Refactor Deprecated API Usage
|
||||
- [ ] Replace all usages of `Player` as a HashMap key with `UUID`.
|
||||
- [ ] Update logger usage to `getLogger()` from `JavaPlugin`.
|
||||
- [ ] Update event listeners to use `@EventHandler` and `registerEvents`.
|
||||
- [ ] Update player lookup logic to use `getPlayerExact` or handle case sensitivity.
|
||||
- [ ] Review and update any other deprecated or removed Bukkit/Spigot API calls.
|
||||
|
||||
## 6. Test on Modern Paper Server
|
||||
- [ ] Build the plugin with Gradle (`./gradlew build`).
|
||||
- [ ] Use the provided bash scripts in `tools/bash/` to start/stop a local Paper server for testing.
|
||||
- [ ] Set `MINECRAFT_SERVER_PATH` and `MINECRAFT_SERVER_JAR` environment variables as needed.
|
||||
- [ ] Deploy the built plugin and check for errors/warnings.
|
||||
|
||||
## 7. Fix Bugs and Incompatibilities
|
||||
- [ ] Address any issues found during testing on a modern server.
|
||||
- [ ] Ensure all features work as intended.
|
||||
|
||||
## 8. Update Documentation
|
||||
- [ ] Update `README.md` with new build and usage instructions.
|
||||
- [ ] Document any new features, changes, or migration notes.
|
||||
- [ ] Update or create `CONTRIBUTING.md` with setup and development instructions.
|
||||
|
||||
## 9. Optional Improvements
|
||||
- [ ] Consider adding new features or quality-of-life improvements.
|
||||
- [ ] Add automated tests or CI configuration if desired.
|
||||
|
||||
---
|
||||
|
||||
### Summary Table
|
||||
| Step | Description |
|
||||
|-----------------------------|------------------------------------------------|
|
||||
| Analyze Codebase | Review for deprecated/legacy code |
|
||||
| Migrate to Gradle | Init Gradle, migrate metadata/deps, remove Maven|
|
||||
| Update .gitignore | Add Gradle ignores, remove Maven/Eclipse |
|
||||
| Update plugin.yml | Ensure modern, complete config |
|
||||
| Refactor Deprecated APIs | Update code for modern PaperMC |
|
||||
| Test on Paper | Build, deploy, and test on modern server |
|
||||
| Fix Bugs | Address issues found during testing |
|
||||
| Update Docs | Refresh README, CONTRIBUTING, etc. |
|
||||
| Optional Improvements | Add features, tests, CI, etc. |
|
||||
|
||||
---
|
||||
|
||||
## 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: 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` |
|
||||
|
||||
**Do not make any code or config changes until this plan is complete and reviewed.**
|
||||
|
||||
## Appendix: Codebase Analysis and Migration Notes
|
||||
|
||||
### Deprecated or Removed API Usage
|
||||
- **Logger usage:**
|
||||
- Uses `Logger.getLogger("Minecraft")`. Should use `getLogger()` from `JavaPlugin` for modern plugins.
|
||||
- **Old event registration:**
|
||||
- Uses deprecated Bukkit event registration (`pm.registerEvent(...)` with `Event.Type` and `Event.Priority`). Should use the modern event system (`@EventHandler` and `registerEvents`).
|
||||
- **Listener classes:**
|
||||
- Uses `EntityListener` and `PlayerListener` base classes, which are deprecated. Should use `Listener` interface and annotate handler methods with `@EventHandler`.
|
||||
- **Configuration API:**
|
||||
- Uses `org.bukkit.util.config.Configuration`, which is removed in modern Bukkit/Spigot/Paper. Should use `JavaPlugin#getConfig()` and the modern configuration API.
|
||||
- **Entity/Player mapping:**
|
||||
- Uses `HashMap<Entity, Player>` for claimed mobs. This is generally fine, but if player scores are stored, use `UUID` as the key for reliability across sessions.
|
||||
- **Direct CraftBukkit class names:**
|
||||
- Score table uses class names like `org.bukkit.craftbukkit.entity.CraftZombie`. Should use Bukkit API types or entity type enums for compatibility.
|
||||
|
||||
### Hardcoded Bukkit References and Legacy Patterns
|
||||
- Imports are from `org.bukkit.*`, which is compatible with Paper. No hardcoded Bukkit-only features found, but all event and config usage must be updated for Paper.
|
||||
- No use of Bukkit’s old event system in active code, but event registration and listener patterns are outdated.
|
||||
|
||||
### Custom Scripts and Resources
|
||||
- **Bash scripts in `tools/bash/`:**
|
||||
- `deploy-plugin.sh`: Deploys the built plugin jar to the server's plugins directory, using `MINECRAFT_SERVER_PATH`.
|
||||
- `build-plugin.sh`: Runs `./gradlew build` from the project root.
|
||||
- These scripts are compatible with a Gradle-based workflow and do not require migration, but should be updated if the build or deployment process changes.
|
||||
|
||||
### Recommendations for Paper Migration
|
||||
- Switch all logger usage to `getLogger()` from `JavaPlugin`.
|
||||
- Refactor all event listeners to use the modern event system (`Listener` interface, `@EventHandler`, and `registerEvents`).
|
||||
- Replace use of `org.bukkit.util.config.Configuration` with the modern configuration API (`getConfig()`, `saveConfig()`, etc.).
|
||||
- Update score table to use Bukkit entity types or enums instead of CraftBukkit class names.
|
||||
- If storing player scores, use `UUID` as the key.
|
||||
- Review and update all event and configuration usage for compatibility with modern PaperMC.
|
||||
- Ensure all commands are properly defined in `plugin.yml`.
|
||||
|
||||
#### Summary Table
|
||||
| Issue/Pattern | Status / Recommendation |
|
||||
|------------------------------|----------------------------------------|
|
||||
| Logger | ❌ Use getLogger() |
|
||||
| Old event registration | ❌ Use @EventHandler, Listener, registerEvents |
|
||||
| Listener base classes | ❌ Use Listener interface, @EventHandler|
|
||||
| Configuration API | ❌ Use getConfig(), saveConfig() |
|
||||
| Entity/Player mapping | ⚠️ Use UUID for player scores if needed|
|
||||
| CraftBukkit class names | ⚠️ Use Bukkit API/entity types |
|
||||
| Command registration | ✅ Valid, check plugin.yml |
|
||||
| Hardcoded Bukkit features | ✅ None found, but update all event/config usage |
|
||||
| Custom scripts | ✅ Compatible, update if build/deploy changes |
|
||||
10
.cursor/rules.md
Normal file
10
.cursor/rules.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# 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.
|
||||
- Create and track tasks in `TODO.md` with checkboxes to track implementation.
|
||||
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
.gradle/
|
||||
build/
|
||||
target/
|
||||
0
CONTRIBUTING.md
Normal file
0
CONTRIBUTING.md
Normal file
@@ -1,9 +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="src" path="/ScoreKeeper"/>
|
||||
<classpathentry kind="output" path="target/classes"/>
|
||||
</classpath>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>MobScores</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>
|
||||
@@ -1,5 +0,0 @@
|
||||
#Sun Feb 19 04:09:36 PST 2012
|
||||
eclipse.preferences.version=1
|
||||
encoding//src/main/java=UTF-8
|
||||
encoding//src/main/resources=UTF-8
|
||||
encoding/<project>=UTF-8
|
||||
@@ -1,6 +0,0 @@
|
||||
#Sun Feb 19 04:09:37 PST 2012
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||
org.eclipse.jdt.core.compiler.source=1.6
|
||||
@@ -1,5 +0,0 @@
|
||||
#Sun Feb 19 04:09:36 PST 2012
|
||||
activeProfiles=
|
||||
eclipse.preferences.version=1
|
||||
resolveWorkspaceProjects=true
|
||||
version=1
|
||||
@@ -1,46 +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>MobScores</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>0.2-SNAPSHOT</version>
|
||||
<name>bukkitplugin</name>
|
||||
<url>http://maven.apache.org</url>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>bukkit</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</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>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>bukkit-repo</id>
|
||||
<url>http://repo.bukkit.org/artifactory/repo</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
</project>
|
||||
@@ -1,163 +0,0 @@
|
||||
/*
|
||||
This file is part of MobScores.
|
||||
|
||||
MobScores is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
MobScores is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with MobScores. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.majinnaibu.bukkitplugins.mobscores;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Zombie;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.plugin.PluginDescriptionFile;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.util.config.Configuration;
|
||||
|
||||
import com.majinnaibu.bukkitplugins.mobscores.listeners.MobDeathListener;
|
||||
import com.majinnaibu.bukkitplugins.mobscores.listeners.PlayerConnectListener;
|
||||
import com.majinnaibu.bukkitplugins.scorekeeper.ScoreKeeperPlugin;
|
||||
|
||||
public class MobScoresPlugin extends JavaPlugin {
|
||||
private final MobDeathListener _mobDeathListener = new MobDeathListener(this);
|
||||
private final PlayerConnectListener _playerConnectListener = new PlayerConnectListener(this);
|
||||
private HashMap<Entity, Player> _claimedMobs = new HashMap<Entity, Player>();
|
||||
private HashMap<String, Integer> _scoreTable = new HashMap<String, Integer>();
|
||||
private ScoreKeeperPlugin _scoreKeeper = null;
|
||||
private Configuration _configuration = null;
|
||||
|
||||
private final String _logStart = "[" + ChatColor.AQUA + "MobScores" + ChatColor.WHITE + "] ";
|
||||
|
||||
public final Logger log = Logger.getLogger("Minecraft");
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
_configuration.setProperty("ScoreTable", _scoreTable);
|
||||
_configuration.save();
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void onEnable() {
|
||||
_configuration = getConfiguration();
|
||||
try{
|
||||
_scoreTable = (HashMap<String, Integer>)_configuration.getProperty("ScoreTable");
|
||||
}catch (Exception ex){
|
||||
_scoreTable = getDefaultScoreTable();
|
||||
}
|
||||
|
||||
if(_scoreTable == null){
|
||||
_scoreTable = getDefaultScoreTable();
|
||||
}
|
||||
|
||||
_configuration.setProperty("ScoreTable", _scoreTable);
|
||||
|
||||
|
||||
_configuration.save();
|
||||
|
||||
PluginManager pm = getServer().getPluginManager();
|
||||
_scoreKeeper = (ScoreKeeperPlugin)pm.getPlugin("ScoreKeeper");
|
||||
|
||||
if(_scoreKeeper == null){
|
||||
pm.disablePlugin(this);
|
||||
}
|
||||
|
||||
pm.registerEvent(Event.Type.ENTITY_DEATH, _mobDeathListener, Event.Priority.Monitor, this);
|
||||
pm.registerEvent(Event.Type.ENTITY_DAMAGE, _mobDeathListener, Event.Priority.Monitor, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_JOIN, _playerConnectListener, Event.Priority.Monitor, this);
|
||||
|
||||
PluginDescriptionFile pdFile = this.getDescription();
|
||||
log.info(pdFile.getName() + " version " + pdFile.getVersion() + " is enabled!");
|
||||
}
|
||||
|
||||
private HashMap<String, Integer> getDefaultScoreTable() {
|
||||
HashMap<String, Integer> scores = new HashMap<String, Integer>();
|
||||
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftZombie", 50);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftChicken", 0);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftCow", 0);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftCreeper", 50);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftGhast", 100);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftGiant", 250);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftPig", 0);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftPigZombie", 25);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftPlayer", 0);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftSheep", 0);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftSkeleton", 50);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftSlime", 100);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftSpider", 50);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftSquid", 0);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftWolf", 50);
|
||||
scores.put("org.bukkit.craftbukkit.entity.CraftZombie", 50);
|
||||
|
||||
return scores;
|
||||
}
|
||||
|
||||
public void claimMob(Entity entity, Player damager) {
|
||||
if(entity instanceof Zombie){
|
||||
_claimedMobs.put((Zombie)entity, damager);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void awardScore(Entity entity) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
if(_claimedMobs.containsKey(entity)){
|
||||
Class<?> scoreClass = entity.getClass();
|
||||
String className = scoreClass.getName();
|
||||
if(_scoreTable.containsKey(className)){
|
||||
Player player = _claimedMobs.get(entity);
|
||||
int score = _scoreTable.get(className);
|
||||
|
||||
_scoreKeeper.addScore(player, score);
|
||||
}else{
|
||||
log.warning("[MobScores] Unable to award score for {" + className + "}");
|
||||
Set<String> keys = _scoreTable.keySet();
|
||||
String str = null;
|
||||
for(Iterator<String> i = keys.iterator(); i.hasNext(); str = i.next()){
|
||||
log.info("{" + str + "}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void sendPlayerScoreTable(Player player) {
|
||||
Iterator<Map.Entry<String, Integer>> i=_scoreTable.entrySet().iterator();
|
||||
Map.Entry<String, Integer> pair = null;
|
||||
for(pair = i.next(); i.hasNext(); pair = i.next()){
|
||||
if(pair.getValue() != 0){
|
||||
String key = pair.getKey();
|
||||
if(key.startsWith("org.bukkit.craftbukkit.entity.Craft")){
|
||||
player.sendMessage(_logStart + key.substring(35) + " = " + pair.getValue().toString());
|
||||
}else{
|
||||
player.sendMessage(_logStart + key + " = " + pair.getValue().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void logInfo(String string) {
|
||||
log.info(_logStart + string);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
name: MobScores
|
||||
main: com.majinnaibu.bukkit.plugins.mobscores.MobScoresPlugin
|
||||
depend: [ScoreKeeper]
|
||||
version: 0.1
|
||||
24
TODO.md
Normal file
24
TODO.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Modernize MobScores Plugin: Implementation Tasks
|
||||
|
||||
- [x] Analyze all Java source files for deprecated or removed Bukkit API usage, including logger, event registration, listener classes, configuration API, and entity/player mapping.
|
||||
- [x] Identify and document any hardcoded Bukkit references or legacy patterns (e.g., Player as HashMap key, old event registration, CraftBukkit class names).
|
||||
- [ ] Review and list any custom scripts or resources (e.g., bash scripts in tools/bash/) that may need migration or updates.
|
||||
- [x] Initialize Gradle in the project root and create a build.gradle file with project metadata, PaperMC API dependency, JUnit, Java toolchain, repository, resource handling, and plugins as needed.
|
||||
- [x] Remove Maven-specific files (pom.xml, .mvn/ directory, Maven wrapper scripts) and Eclipse-specific files (.classpath, .project, .settings/) if present.
|
||||
- [x] Update .gitignore to add Gradle-specific ignores and remove Maven/Eclipse-specific ignores.
|
||||
- [x] Ensure plugin.yml is present in src/main/resources and update for PaperMC compatibility (api-version, commands, required fields).
|
||||
- [x] Refactor all logger usage to use getLogger() from JavaPlugin.
|
||||
- [x] Refactor all event listeners to use the modern event system (Listener interface, @EventHandler, registerEvents).
|
||||
- [x] Replace use of org.bukkit.util.config.Configuration with the modern configuration API (getConfig(), saveConfig(), etc.).
|
||||
- [x] Update score table to use Bukkit entity types or enums instead of CraftBukkit class names.
|
||||
- [ ] If storing player scores, refactor to use UUID as the key instead of Player or String.
|
||||
- [x] Build the plugin with Gradle (./gradlew build) and test on a modern Paper server using the provided bash scripts.
|
||||
- [x] Address any bugs or incompatibilities found during testing on a modern server.
|
||||
- [ ] Update README.md and CONTRIBUTING.md with new build, usage, and development instructions. _(Depends on: bugfixes)_
|
||||
- [ ] (Optional) Add new features, quality-of-life improvements, automated tests, or CI configuration. _(Depends on: docs update)_
|
||||
- [x] Update MobScores to depend on the latest version of the ScoreKeeper plugin (update dependency in build.gradle and plugin.yml as needed).
|
||||
- [ ] Test MobScores with the latest ScoreKeeper to ensure score tracking, awarding, and all integration points work as expected (including with players who have changed names).
|
||||
- [x] Refactor MobDeathListener and PlayerConnectListener to implement Listener interface and use @EventHandler annotations instead of extending EntityListener/PlayerListener.
|
||||
- [x] Update event registration in MobScoresPlugin to use getServer().getPluginManager().registerEvents(...).
|
||||
- [x] Replace all usage of org.bukkit.util.config.Configuration with the modern Bukkit configuration API (getConfig(), saveConfig(), reloadConfig(), etc.).
|
||||
- [x] Remove or refactor any code using deprecated or removed Bukkit/Spigot/Paper APIs that are not available in the modern Paper API.
|
||||
58
build.gradle
Normal file
58
build.gradle
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* This file was generated by the Gradle 'init' task.
|
||||
*
|
||||
* This project uses @Incubating APIs which are subject to change.
|
||||
*/
|
||||
|
||||
plugins {
|
||||
id 'java-library'
|
||||
id 'maven-publish'
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url = 'https://repo.papermc.io/repository/maven-public/' }
|
||||
mavenLocal()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly 'com.majinnaibu.minecraft.plugins:ScoreKeeper:0.2.1-SNAPSHOT'
|
||||
compileOnly 'io.papermc.paper:paper-api:1.21.7-R0.1-SNAPSHOT'
|
||||
compileOnly 'net.kyori:adventure-api:4.14.0'
|
||||
|
||||
testImplementation libs.junit.junit
|
||||
}
|
||||
|
||||
group = 'com.majinnaibu.minecraft.plugins'
|
||||
version = '0.2.1-SNAPSHOT'
|
||||
description = 'MobScores'
|
||||
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion = JavaLanguageVersion.of(21)
|
||||
}
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
maven(MavenPublication) {
|
||||
from(components.java)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile).configureEach {
|
||||
options.encoding = 'UTF-8'
|
||||
// options.compilerArgs << "-Xlint:deprecation"
|
||||
}
|
||||
|
||||
tasks.withType(Javadoc) {
|
||||
options.encoding = 'UTF-8'
|
||||
}
|
||||
|
||||
processResources {
|
||||
inputs.property "version", project.version
|
||||
filesMatching('plugin.yml') {
|
||||
expand(project.properties)
|
||||
}
|
||||
}
|
||||
10
gradle/libs.versions.toml
Normal file
10
gradle/libs.versions.toml
Normal file
@@ -0,0 +1,10 @@
|
||||
# This file was generated by the Gradle 'init' task.
|
||||
# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format
|
||||
|
||||
[versions]
|
||||
junit-junit = "3.8.1"
|
||||
org-bukkit-bukkit = "0.0.1-SNAPSHOT"
|
||||
|
||||
[libraries]
|
||||
junit-junit = { module = "junit:junit", version.ref = "junit-junit" }
|
||||
org-bukkit-bukkit = { module = "org.bukkit:bukkit", version.ref = "org-bukkit-bukkit" }
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
7
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
7
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
249
gradlew
vendored
Executable file
249
gradlew
vendored
Executable file
@@ -0,0 +1,249 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
} >&2
|
||||
|
||||
# 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 ;; #(
|
||||
MSYS* | 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
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
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
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
if ! command -v xargs >/dev/null 2>&1
|
||||
then
|
||||
die "xargs is not available"
|
||||
fi
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
92
gradlew.bat
vendored
Normal file
92
gradlew.bat
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@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=.
|
||||
@rem This is normally unused
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@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="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
: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 %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if %ERRORLEVEL% equ 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!
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
1
settings.gradle
Normal file
1
settings.gradle
Normal file
@@ -0,0 +1 @@
|
||||
rootProject.name = 'MobScores'
|
||||
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
This file is part of MobScores.
|
||||
|
||||
MobScores is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
MobScores is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with MobScores. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.majinnaibu.minecraft.plugins.mobscores;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Zombie;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.majinnaibu.minecraft.plugins.mobscores.listeners.MobDeathListener;
|
||||
import com.majinnaibu.minecraft.plugins.mobscores.listeners.PlayerConnectListener;
|
||||
import com.majinnaibu.minecraft.plugins.scorekeeper.ScoreKeeperPlugin;
|
||||
|
||||
public class MobScoresPlugin extends JavaPlugin {
|
||||
private Map<Entity, Player> _claimedMobs = new HashMap<Entity, Player>();
|
||||
private Map<EntityType, Integer> _scoreTable = new HashMap<EntityType, Integer>();
|
||||
private ScoreKeeperPlugin _scoreKeeper = null;
|
||||
|
||||
private final String _logPrefix = "[MobScores] ";
|
||||
private final Component _messagePrefix = Component.text("[")
|
||||
.append(Component.text("MobScores").color(NamedTextColor.AQUA))
|
||||
.append(Component.text("] ").color(NamedTextColor.WHITE));
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
getConfig().set("ScoreTable", serializeScoreTable(_scoreTable));
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
// Create the default config if it doesn't exist.
|
||||
saveDefaultConfig();
|
||||
|
||||
getConfig().set("ScoreTable", serializeScoreTable(getDefaultScoreTable()));
|
||||
saveConfig();
|
||||
|
||||
// Load our score table from config or set defaults.
|
||||
if (getConfig().isConfigurationSection("ScoreTable")) {
|
||||
deserializeScoreTable(getConfig().getConfigurationSection("ScoreTable").getValues(false));
|
||||
} else {
|
||||
_scoreTable = getDefaultScoreTable();
|
||||
getConfig().set("ScoreTable", serializeScoreTable(_scoreTable));
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
PluginManager pm = getServer().getPluginManager();
|
||||
_scoreKeeper = (ScoreKeeperPlugin)pm.getPlugin("ScoreKeeper");
|
||||
|
||||
if(_scoreKeeper == null){
|
||||
logWarning("Unable to find ScoreKeeper plugin.");
|
||||
pm.disablePlugin(this);
|
||||
}
|
||||
|
||||
pm.registerEvents(new MobDeathListener(this), this);
|
||||
pm.registerEvents(new PlayerConnectListener(this), this);
|
||||
|
||||
logInfo(getPluginMeta().getName() + " version " + getPluginMeta().getVersion() + " is enabled!");
|
||||
}
|
||||
|
||||
private HashMap<EntityType, Integer> getDefaultScoreTable() {
|
||||
HashMap<EntityType, Integer> scores = new HashMap<EntityType, Integer>();
|
||||
|
||||
scores.put(EntityType.BLAZE, 100);
|
||||
scores.put(EntityType.CAVE_SPIDER, 100);
|
||||
scores.put(EntityType.CREEPER, 50);
|
||||
scores.put(EntityType.DROWNED, 25);
|
||||
scores.put(EntityType.ELDER_GUARDIAN, 250);
|
||||
scores.put(EntityType.ENDERMAN, 100);
|
||||
scores.put(EntityType.ENDERMITE, 1000);
|
||||
scores.put(EntityType.END_CRYSTAL, 250);
|
||||
scores.put(EntityType.GHAST, 250);
|
||||
scores.put(EntityType.GIANT, 250);
|
||||
scores.put(EntityType.GUARDIAN, 250);
|
||||
scores.put(EntityType.HUSK, 25);
|
||||
scores.put(EntityType.PILLAGER, 25);
|
||||
scores.put(EntityType.RAVAGER, 50);
|
||||
scores.put(EntityType.SHULKER, 50);
|
||||
scores.put(EntityType.SILVERFISH, 0);
|
||||
scores.put(EntityType.SKELETON, 50);
|
||||
scores.put(EntityType.WITHER_SKELETON, 100);
|
||||
scores.put(EntityType.ZOMBIE, 25);
|
||||
scores.put(EntityType.SLIME, 100);
|
||||
scores.put(EntityType.SPIDER, 50);
|
||||
|
||||
return scores;
|
||||
}
|
||||
|
||||
public void claimMob(Entity entity, Player damager) {
|
||||
if(entity instanceof Zombie){
|
||||
_claimedMobs.put((Zombie)entity, damager);
|
||||
}
|
||||
}
|
||||
|
||||
public void awardScore(Entity entity) {
|
||||
|
||||
if(_claimedMobs.containsKey(entity)){
|
||||
EntityType type = entity.getType();
|
||||
if (_scoreTable.containsKey(type)) {
|
||||
Player player = _claimedMobs.get(entity);
|
||||
int score = _scoreTable.get(type);
|
||||
_scoreKeeper.addScore(player, score);
|
||||
} else {
|
||||
logWarning("Unable to award score for {" + type.toString() + "}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void sendPlayerScoreTable(Player player) {
|
||||
Iterator<Map.Entry<EntityType, Integer>> i = _scoreTable.entrySet().iterator();
|
||||
Map.Entry<EntityType, Integer> pair = null;
|
||||
for(pair = i.next(); i.hasNext(); pair = i.next()){
|
||||
if(pair.getValue() != 0){
|
||||
EntityType type = pair.getKey();
|
||||
Component entityName = Component.translatable(type.translationKey());
|
||||
sendPlayerMessage(player, entityName + " = " + pair.getValue().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Map<EntityType, Integer> deserializeScoreTable(Map<String, Object> rawValue) {
|
||||
HashMap<EntityType, Integer> scoreTable = new HashMap<>();
|
||||
if (rawValue instanceof Map) {
|
||||
scoreTable = new HashMap<>();
|
||||
for (Map.Entry<String, Object> entry : rawValue.entrySet()) {
|
||||
try {
|
||||
EntityType type = EntityType.valueOf(entry.getKey());
|
||||
Integer value = ((Number) entry.getValue()).intValue();
|
||||
scoreTable.put(type, value);
|
||||
} catch (Exception ex) {
|
||||
logError(ex);
|
||||
}
|
||||
}
|
||||
return scoreTable;
|
||||
} else {
|
||||
return getDefaultScoreTable();
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Integer> serializeScoreTable(Map<EntityType, Integer> scoreTable) {
|
||||
Map<String, Integer> serializable = new HashMap<>();
|
||||
for (Map.Entry<EntityType, Integer> entry : scoreTable.entrySet()) {
|
||||
serializable.put(entry.getKey().name(), entry.getValue());
|
||||
}
|
||||
return serializable;
|
||||
}
|
||||
|
||||
public void sendPlayerMessage(Player player, String message) {
|
||||
player.sendMessage(_messagePrefix.append(Component.text(message)));
|
||||
}
|
||||
|
||||
public void logError(Exception ex) {
|
||||
getLogger().log(Level.SEVERE, _logPrefix + ex.toString());
|
||||
}
|
||||
|
||||
public void logInfo(String messag) {
|
||||
getLogger().info(_logPrefix + messag);
|
||||
}
|
||||
|
||||
public void logWarning(String message) {
|
||||
getLogger().warning(_logPrefix + message);
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with MobScores. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.majinnaibu.bukkitplugins.mobscores.listeners;
|
||||
package com.majinnaibu.minecraft.plugins.mobscores.listeners;
|
||||
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -23,18 +23,19 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.entity.EntityDeathEvent;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.entity.EntityListener;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import com.majinnaibu.bukkitplugins.mobscores.MobScoresPlugin;
|
||||
import com.majinnaibu.minecraft.plugins.mobscores.MobScoresPlugin;
|
||||
|
||||
public class MobDeathListener extends EntityListener {
|
||||
public class MobDeathListener implements Listener {
|
||||
private MobScoresPlugin _plugin = null;
|
||||
|
||||
public MobDeathListener(MobScoresPlugin plugin) {
|
||||
_plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
@EventHandler
|
||||
public void onEntityDamage(EntityDamageEvent event) {
|
||||
if(event instanceof EntityDamageByEntityEvent){
|
||||
EntityDamageByEntityEvent ev = (EntityDamageByEntityEvent) event;
|
||||
@@ -45,12 +46,12 @@ public class MobDeathListener extends EntityListener {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@EventHandler
|
||||
public void onEntityDeath(EntityDeathEvent event) {
|
||||
_plugin.awardScore(event.getEntity());
|
||||
}
|
||||
|
||||
@Override
|
||||
@EventHandler
|
||||
public void onEntityExplode(EntityExplodeEvent event) {
|
||||
}
|
||||
|
||||
@@ -15,21 +15,22 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with MobScores. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.majinnaibu.bukkitplugins.mobscores.listeners;
|
||||
package com.majinnaibu.minecraft.plugins.mobscores.listeners;
|
||||
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerListener;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
import com.majinnaibu.bukkitplugins.mobscores.MobScoresPlugin;
|
||||
import com.majinnaibu.minecraft.plugins.mobscores.MobScoresPlugin;
|
||||
|
||||
public class PlayerConnectListener extends PlayerListener {
|
||||
public class PlayerConnectListener implements Listener {
|
||||
private MobScoresPlugin _plugin = null;
|
||||
|
||||
public PlayerConnectListener(MobScoresPlugin plugin) {
|
||||
_plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
_plugin.sendPlayerScoreTable(event.getPlayer());
|
||||
}
|
||||
23
src/main/resources/config.yml
Normal file
23
src/main/resources/config.yml
Normal file
@@ -0,0 +1,23 @@
|
||||
# MobScores default configuration
|
||||
ScoreTable:
|
||||
DROWNED: 25
|
||||
ENDERMAN: 100
|
||||
GUARDIAN: 250
|
||||
SILVERFISH: 0
|
||||
ELDER_GUARDIAN: 250
|
||||
HUSK: 25
|
||||
BLAZE: 100
|
||||
GHAST: 250
|
||||
ENDERMITE: 1000
|
||||
SPIDER: 50
|
||||
PILLAGER: 25
|
||||
GIANT: 250
|
||||
END_CRYSTAL: 250
|
||||
SKELETON: 50
|
||||
WITHER_SKELETON: 100
|
||||
CREEPER: 50
|
||||
ZOMBIE: 25
|
||||
CAVE_SPIDER: 100
|
||||
SLIME: 100
|
||||
RAVAGER: 50
|
||||
SHULKER: 50
|
||||
5
src/main/resources/plugin.yml
Normal file
5
src/main/resources/plugin.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
name: MobScores
|
||||
main: com.majinnaibu.minecraft.plugins.mobscores.MobScoresPlugin
|
||||
depend: [ScoreKeeper]
|
||||
version: ${version}
|
||||
api-version: 1.21
|
||||
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/"
|
||||
Reference in New Issue
Block a user