Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ jobs:
teams-api(optional)
ezcountdown(optional)
ezeconomy(optional)
pvpmanager(optional)
simple-combatlog(optional)

# ──────────────────────────────────────────────────────────────────────
# 8. DISCORD NOTIFICATION
Expand Down
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,29 @@ Release tags use the `v` prefix (e.g. `v3.0.2`).

---

## [3.3.0] - 2026-05-16

### Added

- **PvP tag integration**: EzRTP now detects when a player enters combat and cancels their
pending teleport or active countdown. Three plugins are supported out of the box:
- **[CombatLogX](https://www.spigotmc.org/resources/combatlogx.31689/)** — auto-detected at startup; soft dependency.
- **[PvPManager](https://modrinth.com/plugin/pvpmanager)** — auto-detected at startup; soft dependency.
- **[Simple Combat Log](https://modrinth.com/plugin/simple-combatlog)** (NikeyV1/CombatLog) — auto-detected at startup; soft dependency.
- All three are added to `softdepend` in `plugin.yml` so they load before EzRTP when
present. No configuration change is required on servers that do not use any of them.
- New `pvp-tag-integration` section in `rtp.yml`:
- `cancel-countdown-on-pvp-tag` (default `true`): cancel an active countdown the moment
the player is tagged.
- `cancel-queued-on-pvp-tag` (default `true`): skip a queued teleport if the player is
already in combat when their slot is dispatched.
- New message keys `countdown-pvp-cancel` and `queue-pvp-tag-cancel` in `messages/*.yml`
for the cancellation notifications.
- Modrinth release metadata now declares `pvpmanager` and `simple-combatlog` as optional
dependencies.

---

## [3.2.3] - 2026-05-16

### Fixed
Expand Down
24 changes: 24 additions & 0 deletions docs/config/rtp.md
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,30 @@ Supported values: `worldguard`, `griefprevention`, `teamsapi`.

---

## PvP tag integration

Cancels a pending teleport or active countdown when the player enters combat.
Requires one of the supported PvP tag plugins to be installed (all are soft-dependencies):
[CombatLogX](https://www.spigotmc.org/resources/combatlogx.31689/),
[PvPManager](https://modrinth.com/plugin/pvpmanager), or
[Simple Combat Log](https://modrinth.com/plugin/simple-combatlog).

| Key | Default | Description |
| :--- | :--- | :--- |
| `pvp-tag-integration.cancel-countdown-on-pvp-tag` | `true` | Cancel an active countdown the moment the player receives a PvP tag. |
| `pvp-tag-integration.cancel-queued-on-pvp-tag` | `true` | Skip a queued teleport if the player is already in combat when their slot is dispatched. |

```yml
pvp-tag-integration:
cancel-countdown-on-pvp-tag: true
cancel-queued-on-pvp-tag: true
```

If no supported PvP tag plugin is installed the section is silently ignored.
See the [PvP Tag integration guide](../integrations/pvp-tag) for setup details.

---

## Particles (arrival effect)

An optional particle burst played at the destination when the player arrives.
Expand Down
9 changes: 9 additions & 0 deletions docs/integrations/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,12 @@ has_children: true

EzRTP integrates with several popular plugins. Browse the pages below to
set up each one.

| Page | Plugins covered |
| :--- | :--- |
| [Vault / Economy](vault-economy) | Vault, EzEconomy |
| [PlaceholderAPI](placeholderapi) | PlaceholderAPI |
| [Chunky](chunky) | Chunky (world pre-generation) |
| [Protection](protection-worldguard-griefprevention) | WorldGuard, GriefPrevention, TeamsAPI |
| [PvP Tag](pvp-tag) | CombatLogX, PvPManager, Simple Combat Log |
| [Network / Proxy](network-proxy) | BungeeCord / Velocity proxy destinations |
72 changes: 72 additions & 0 deletions docs/integrations/pvp-tag.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
title: PvP Tag (CombatLogX / PvPManager / Simple Combat Log)
nav_order: 5
parent: Integrations
---

# PvP Tag Integration

Use this integration when you want EzRTP to cancel a pending teleport or active
countdown the moment a player enters combat.

## Supported plugins

All three plugins are optional soft-dependencies. EzRTP auto-detects whichever
ones are present and registers them at startup. You can have more than one
installed simultaneously.

| Plugin | Where to get it |
| :--- | :--- |
| [CombatLogX](https://www.spigotmc.org/resources/combatlogx.31689/) | SpigotMC (597 K+ downloads) |
| [PvPManager](https://modrinth.com/plugin/pvpmanager) | Modrinth · [SpigotMC (free)](https://www.spigotmc.org/resources/pvpmanager-lite.845/) |
| [Simple Combat Log](https://modrinth.com/plugin/simple-combatlog) | Modrinth · [GitHub](https://github.com/NikeyV1/CombatLog) |

No configuration change is required on servers that do not use any of them.

## What this integration does

- **Countdown cancellation** — if a player receives a PvP tag while a countdown is
ticking, the teleport is cancelled and a configurable message is sent.
- **Queue cancellation** — if a queued teleport slot is dispatched while the player
is already tagged, the teleport is skipped and the player must re-queue.

## Where to configure it

File: `plugins/EzRTP/rtp.yml`

```yml
pvp-tag-integration:
cancel-countdown-on-pvp-tag: true
cancel-queued-on-pvp-tag: true
```

### Key settings

- `cancel-countdown-on-pvp-tag`
- `true`: cancel the active countdown as soon as the player is tagged.
- `false`: ignore combat tags during countdown (teleport proceeds regardless).
- `cancel-queued-on-pvp-tag`
- `true`: skip the queued teleport if the player is in combat at dispatch time.
- `false`: dispatch the queued teleport even while in combat.

## Messages

Add or override these keys in `plugins/EzRTP/messages/en.yml`:

| Key | Default text |
| :--- | :--- |
| `countdown-pvp-cancel` | `<red>Teleport cancelled — you entered combat!</red>` |
| `queue-pvp-tag-cancel` | `<red>Teleport skipped — you are in combat!</red>` |

## Startup log

When a supported plugin is detected, EzRTP logs a confirmation on enable:

```text
[EzRTP] PvP tag integration: CombatLogX detected.
[EzRTP] PvP tag integration: PvPManager detected.
[EzRTP] PvP tag integration: Simple Combat Log detected.
```

If none of the supported plugins are installed, no message is printed and the
feature is effectively disabled.
4 changes: 2 additions & 2 deletions ezrtp-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
<parent>
<groupId>com.skyblockexp</groupId>
<artifactId>ezrtp-parent</artifactId>
<version>3.2.3</version>
<version>3.3.0</version>
<relativePath>../pom.xml</relativePath>
</parent>

<groupId>com.skyblockexp</groupId>
<artifactId>ezrtp-api</artifactId>
<version>3.2.3</version>
<version>3.3.0</version>
<packaging>jar</packaging>
<name>EzRTP API</name>
<description>Lightweight public API for EzRTP intended for third-party plugins.</description>
Expand Down
6 changes: 3 additions & 3 deletions ezrtp-bukkit/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
<parent>
<groupId>com.skyblockexp</groupId>
<artifactId>ezrtp-parent</artifactId>
<version>3.2.3</version>
<version>3.3.0</version>
<relativePath>../pom.xml</relativePath>
</parent>

<groupId>com.skyblockexp</groupId>
<artifactId>ezrtp-bukkit</artifactId>
<version>3.2.3</version>
<version>3.3.0</version>
<packaging>jar</packaging>
<name>EzRTP (Bukkit)</name>
<description>EzRTP Bukkit-compatible plugin module.</description>
Expand Down Expand Up @@ -111,7 +111,7 @@
<dependency>
<groupId>com.skyblockexp</groupId>
<artifactId>ezrtp-common</artifactId>
<version>3.2.3</version>
<version>3.3.0</version>
</dependency>
</dependencies>

Expand Down
32 changes: 30 additions & 2 deletions ezrtp-common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
<parent>
<groupId>com.skyblockexp</groupId>
<artifactId>ezrtp-parent</artifactId>
<version>3.2.3</version>
<version>3.3.0</version>
<relativePath>../pom.xml</relativePath>
</parent>

<groupId>com.skyblockexp</groupId>
<artifactId>ezrtp-common</artifactId>
<version>3.2.3</version>
<version>3.3.0</version>
<packaging>jar</packaging>
<name>EzRTP Common</name>
<description>Shared utilities for EzRTP (platform-independent)</description>
Expand Down Expand Up @@ -89,6 +89,34 @@
<version>7.0.2</version>
</dependency>

<!-- CombatLogX integration — optional soft-dependency; classes only loaded when plugin is present -->
<dependency>
<groupId>com.github.sirblobman.api</groupId>
<artifactId>core</artifactId>
<version>2.9-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.sirblobman.combatlogx</groupId>
<artifactId>api</artifactId>
<version>11.6-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- PvPManager integration — optional soft-dependency; classes only loaded when plugin is present -->
<dependency>
<groupId>me.chancesd.pvpmanager</groupId>
<artifactId>pvpmanager</artifactId>
<version>4.0.8</version>
<scope>provided</scope>
</dependency>
<!-- Simple Combat Log integration — optional soft-dependency; Modrinth: simple-combatlog -->
<dependency>
<groupId>com.github.NikeyV1</groupId>
<artifactId>CombatLog</artifactId>
<version>master-SNAPSHOT</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import org.bukkit.plugin.Plugin;
import com.skyblockexp.ezrtp.teleport.ChunkyProvider;
import com.skyblockexp.ezrtp.teleport.ChunkyRuntimeProvider;
import com.skyblockexp.ezrtp.pvptag.PvpTagService;
// Chunky API is optional; use runtime loader via ChunkyRuntimeProvider

import java.io.File;
Expand Down Expand Up @@ -86,6 +87,7 @@ public final class EzRtpPluginBootstrap {
private UsageResetScheduler usageResetScheduler;
private final HeatmapSimulationStore heatmapSimulationStore = new HeatmapSimulationStore();
private com.skyblockexp.ezrtp.teleport.ChunkyWarmupCoordinator chunkyWarmupCoordinator;
private PvpTagService pvpTagService;

public EzRtpPluginBootstrap(EzRtpPlugin plugin) {
this.plugin = plugin;
Expand Down Expand Up @@ -238,6 +240,24 @@ public void reloadPluginConfiguration() {
plugin.getLogger().info("Chunky integration disabled in configuration.");
chunkyAPI = null;
}

// Initialize PvP tag providers once; registered only when the corresponding plugin is present.
if (pvpTagService == null) {
pvpTagService = new PvpTagService();
if (plugin.getServer().getPluginManager().isPluginEnabled("CombatLogX")) {
pvpTagService.registerProvider(new com.skyblockexp.ezrtp.pvptag.CombatLogXPvpTagProvider());
plugin.getLogger().info("PvP tag integration: CombatLogX detected.");
}
if (plugin.getServer().getPluginManager().isPluginEnabled("PvPManager")) {
pvpTagService.registerProvider(new com.skyblockexp.ezrtp.pvptag.PvpManagerPvpTagProvider());
plugin.getLogger().info("PvP tag integration: PvPManager detected.");
}
if (plugin.getServer().getPluginManager().isPluginEnabled("CombatLog")) {
pvpTagService.registerProvider(new com.skyblockexp.ezrtp.pvptag.SimpleCombatLogPvpTagProvider());
plugin.getLogger().info("PvP tag integration: Simple Combat Log detected.");
}
}

messageProvider = configurationService.getMessageProvider();
// Initialize text rendering settings (force legacy conversion for older clients)
boolean forceLegacy = configurationService.getEffectiveBaseConfiguration().getBoolean("messages.force-legacy-colors", false);
Expand Down Expand Up @@ -272,7 +292,7 @@ public void reloadPluginConfiguration() {
teleportService = new RandomTeleportService(plugin, defaultSettings,
configuration.getQueueSettings(), economyService,
(player, settings) -> configuration.resolveTeleportCost(player, settings),
protectionRegistry, messageProvider, ChunkLoadStrategyRegistry.get(), PlatformRuntimeRegistry.get(), chunkyAPI, chunkyWarmupCoordinator);
protectionRegistry, messageProvider, ChunkLoadStrategyRegistry.get(), PlatformRuntimeRegistry.get(), chunkyAPI, chunkyWarmupCoordinator, pvpTagService);
try { EzRtpAPI.registerProvider(plugin, teleportService); } catch (Throwable ignored) {}
} else {
teleportService.reload(defaultSettings, configuration.getQueueSettings());
Expand Down
Loading
Loading