# GriefPrevention3D v18.2.3
**Wiki:** [GriefPrevention3D Wiki](https://github.com/castledking/GriefPrevention3D/wiki)
## Fixes
### `/claim pvp` subcommand now works in the alias system
The `/claim pvp` subcommand was missing from both the alias configuration and the unified command handler. Running `/claim pvp` returned "Unknown subcommand" and the generated `alias.yml` had no PvP section.
**Fix:**
- Added `ClaimPvp` entry to `Alias.java` with default alias YAML (commands: `[pvp]`, standalone: `[claimpvp]`)
- Registered the `pvp` subcommand in `UnifiedClaimCommand.java` with tab completion for `true`/`false`/`confirm`
- Registered `ClaimPvp` standalone alias so the alias system can manage `/claimpvp`
- The `config_pvp_toggleCost*` gate remains — admins must opt in by setting `Claims.PvPToggle.Claim.Enabled: true` (or Subdivision) in `config.yml`
### Startup console output is now a single log line
The startup header was previously split into individual `sendMessage()` calls per line, producing separate timestamps. It now sends the entire block as one call, keeping the console log clean.
## Features
### Malay (ms_MY) locale support
The existing `messages_ms_MY.yml` file was not registered in `MessageLocalization.BUNDLED_LOCALE_FILES` or `SUPPORTED_LOCALE_CODES`. It is now active. Players and servers with `config_locale: ms_MY` will receive localized messages including the new startup strings.
### Per-locale startup console messages
Four new message keys were added to `Messages.java`:
| Key | English default |
|---|---|
| `AuthorTag` | `&7by castledking, RoboMWM and BigScary` |
| `PluginTag` | `&6The self-service anti-griefing plugin for Minecraft servers &b- Now with full 3D subdivisions` |
| `StartupDetails` | `&fStartup details: {0}` |
| `BootFinished` | `&7Boot finished in: &a{0}` |
The startup header in `startups.txt` was redesigned around these messages. Instead of hardcoding locale-specific text in each `en1[]` / `es1[]` / `pt1[]` block, the file now contains only the locale-agnostic ASCII art (p1/p2/p3) with a single `${startup}` placeholder. The combined startup block — author, plugin tag, details header, and boot time — is built at runtime from the configured locale's translations.
This means all 13 supported locales now have localized startup output:
| File | Language |
|---|---|
| `messages_en.yml` | English |
| `messages_es.yml` | Spanish |
| `messages_pt_BR.yml` | Portuguese (Brazil) |
| `messages_fr_FR.yml` | French |
| `messages_de_DE.yml` | German |
| `messages_ru_RU.yml` | Russian |
| `messages_zh_CN.yml` | Chinese (Simplified) |
| `messages_ja_JP.yml` | Japanese |
| `messages_ms_MY.yml` | Malay |
| `messages_pl_PL.yml` | Polish |
| `messages_tr_TR.yml` | Turkish |
| `messages_uk_UA.yml` | Ukrainian |
| `messages_en_PT.yml` | English (Pirate) |
Adding or customizing startup text for any locale is now a one-line change in the corresponding `messages_XX.yml` — no need to edit `startups.txt` or the `StartupHeader.java` code.
## Technical changes
- `Alias.java`: Added `ClaimPvp` enum entry with YAML defaults and subcommand arguments
- `UnifiedClaimCommand.java`: Registered `pvp` subcommand, standalone alias, `handlePvp()` delegating to `plugin.handleClaimPvpCommand()`, and `createPvpTabExecutor()` with tab completion
- `MessageLocalization.java`: Added `messages_ms_MY.yml` to `BUNDLED_LOCALE_FILES` and `ms_MY` to `SUPPORTED_LOCALE_CODES`
- `Messages.java`: Added `AuthorTag`, `PluginTag`, `StartupDetails`, `BootFinished` with docs
- `StartupHeader.java`: Rewrote to build `${startup}` from locale messages; removed `${details}` / `${startup.time}` / `${LANG_CODE}` replacements (now part of the combined block); added locale-fallback-to-any-entry for p1/p2/p3; removed `COL_WIDTH` and `formatLine`/`pad` dead code
- `startups.txt`: Stripped 9 locale-specific entries (en1-3, es1-3, pt1-3); only p1/p2/p3 remain with `${startup}` placeholder
- `messages_XX.yml` (all 13 locales + root): Added `AuthorTag`, `PluginTag`, `StartupDetails`, `BootFinished` with localized translations
- `GriefPrevention.java`: `displayEnabledHeader()` sends one combined `sendMessage()` instead of splitting by newline
Optional dependencies
QuickShop-Hikari
Any compatible version
VaultUnlocked
Any compatible version
PlaceholderAPI
Any compatible version
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }