SkinBoostsСкачатьСкачать
ВЕРСИИ (2)
release
SkinBoosts 2.0.0
2.0.02 окт. 2026 г.18Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11paper, purpur
Что нового
The system has changed the global "custom-model-data" setting to a per-player setting. This means that if a player has the same custom model data as another player, the boosts will not be shared.
release
SkinBoosts 1.0.0
1.0.012 июн. 2026 г.41Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11paper, purpur
Что нового
# SkinBoosts
A Paper 1.21.x plugin that applies reward multipliers to players based on the **CustomModelData** (skin) of the tool they are holding. Supports RivalHarvesterHoes, RivalMobSwords, RivalPickaxes, and CyberLevels.
---
## How It Works
SkinBoosts listens to the native reward events fired by each supported plugin. When a reward event triggers, it reads the `CustomModelData` of the tool in the player's main hand and checks if a boost is registered for that value. If found, it multiplies the reward directly in the event before it is processed — no fallbacks, no approximations.
```
Player harvests → RivalHoes fires HoeEssenceReceiveEnchantEvent
→ SkinBoosts reads CMD from hand (e.g. 1001)
→ Finds boost: essence x1.5
→ event.setEssence(essence * 1.5)
→ Player receives boosted amount
```
The system is **stateless** — there is no per-player cache. The boost is resolved in real time on every event, so changing tools mid-session takes effect immediately on the next harvest.
---
## Supported Plugins
| Plugin | Events |
|---|---|
| RivalHarvesterHoes | Essence, Money, Tool XP |
| RivalMobSwords | Essence, Money, XP |
| RivalPickaxes | Essence, Money, XP |
| CyberLevels | XP |
All integrations are soft-depend — the plugin loads and runs normally even if any of them are absent.
---
## Requirements
- Paper 1.21.x
- Java 21
- One or more of the supported plugins (optional but needed for boosts to fire)
- PlaceholderAPI (optional, for placeholders)
---
## Installation
1. Place `SkinBoosts.jar` in your `plugins/` folder.
2. Restart the server — `plugins/SkinBoosts/config.yml` is generated automatically.
3. Register your skins with `/skinboost set` or edit `config.yml` directly.
---
## Configuration
```yaml
skins:
1001:
name: '&cFire Pick' # Display name (optional, cosmetic only)
multipliers:
essence: 1.5 # 1.0 = no change, 2.0 = double
money: 1.2
tool-xp: 1.5
cyber-xp: 1.3
max-multipliers: # Hard cap per type. 0.0 = no limit
essence: 5.0
money: 5.0
tool-xp: 5.0
cyber-xp: 5.0
prefix: '&8[&6SkinBoosts&8] &r'
```
All messages are configurable under the `messages:` section. Changes take effect after `/skinboost reload`.
---
## Commands
All commands require the `skinboosts.admin` permission (default: op).
| Command | Description |
|---|---|
| `/skinboost set <cmd\|hand> [name] <essence> <money> <tool-xp> <cyber-xp> [player]` | Register or update a skin boost. Use `hand` to read CMD from item in hand. Name and player are optional. If player is provided, applies the CMD to their item in hand. |
| `/skinboost remove <cmd>` | Remove a registered skin boost. |
| `/skinboost list` | List all registered skins and active limits. |
| `/skinboost info [cmd]` | Show multipliers for a CMD. Reads from hand if CMD is omitted. |
| `/skinboost apply <cmd> [player]` | Apply a CustomModelData to the item in hand. Player is optional in-game, required from console. |
| `/skinboost reset [player]` | Remove the CustomModelData from the item in hand and delete its registered boost. Player is optional in-game, required from console. |
| `/skinboost reload` | Reload `config.yml` without restarting. |
### Examples
```bash
# Register a boost for CMD 1001 (name optional)
/skinboost set 1001 1.5 1.2 1.5 1.3
# Register reading CMD from item in hand
/skinboost set hand Fire_Pick 2.0 1.5 2.0 1.5
# Register boost and apply CMD to your item in hand (in-game)
/skinboost set 730 3.0 3.0 3.0 3.0
# Register boost and apply CMD to a player's item in hand (console or in-game)
skinboost set 730 3.0 3.0 3.0 3.0 Steve
# Apply CMD 730 to the item in your hand
/skinboost apply 730
# Apply CMD 730 to another player's item in hand
/skinboost apply 730 Steve
# Reset item in your hand
/skinboost reset
# Reset from console
/skinboost reset Steve
```
---
## Placeholders
Requires PlaceholderAPI. All placeholders read the item in the player's **main hand**.
| Placeholder | Example value | Description |
|---|---|---|
| `%skinboosts_essence%` | `1.50` | Essence multiplier |
| `%skinboosts_money%` | `1.20` | Money multiplier |
| `%skinboosts_toolxp%` | `1.50` | Tool XP multiplier |
| `%skinboosts_cyberxp%` | `1.30` | Cyber XP multiplier |
| `%skinboosts_essence_fmt%` | `x1.50` | Essence multiplier with x prefix |
| `%skinboosts_money_fmt%` | `x1.20` | Money multiplier with x prefix |
| `%skinboosts_toolxp_fmt%` | `x1.50` | Tool XP multiplier with x prefix |
| `%skinboosts_cyberxp_fmt%` | `x1.30` | Cyber XP multiplier with x prefix |
| `%skinboosts_name%` | `Fire Pick` | Display name of the active skin |
| `%skinboosts_cmd%` | `1001` | Raw CustomModelData value |
| `%skinboosts_active%` | `true` | Whether the item has a registered boost |
Returns `1.00` / `false` / `None` / `-1` if the item has no registered boost.
---
## Building
Place the required JARs in the `libs/` folder:
```
libs/
├── RivalHarvesterHoes.jar
├── RivalMobSwords.jar
├── RivalPickaxes.jar
└── CyberLevels.jar
```
Then build with Maven:
```bash
mvn package
```
The compiled JAR will be at `target/SkinBoosts-1.0.0.jar`.
---
## Project Structure
```
src/main/java/com/minehostil/skinboosts/
├── SkinBoostsPlugin.java Main plugin class
├── commands/
│ └── SkinBoostCommand.java /skinboost command handler
├── listeners/
│ └── HarvestListener.java Native event listeners
├── manager/
│ └── SkinBoostManager.java Boost registry and config persistence
├── model/
│ ├── SkinBoostData.java Boost data POJO
│ └── Messages.java Config-driven message system
└── placeholders/
└── SkinBoostsExpansion.java PlaceholderAPI expansion
```
---
## Performance
- No schedulers, no async tasks, no per-player state.
- Boost resolution is a single `HashMap.get()` call per event — O(1).
- All reward multiplication happens synchronously inside the event handler, same as the original plugin would.