Skip to content

Developer API

OPaperStream edited this page Oct 9, 2026 · 4 revisions

Developer API

The API is the normal Velocity API plus the PaperProxy extras. It is MIT licensed. Plugins that use it need Java 25, like current Velocity.

Dependency

Gradle (Kotlin DSL):

repositories {
    mavenCentral()
    maven("https://repo.papermc.io/repository/maven-public/") // Velocity's Brigadier
    maven("https://codeberg.org/api/packages/LucasTHCR/maven")
}

dependencies {
    compileOnly("net.paperstream:paperproxy-api:1.2.2-RELEASE")
    annotationProcessor("net.paperstream:paperproxy-api:1.2.2-RELEASE")
}

Maven:

<repositories>
  <repository>
    <id>papermc</id>
    <url>https://repo.papermc.io/repository/maven-public/</url>
  </repository>
  <repository>
    <id>paperproxy</id>
    <url>https://codeberg.org/api/packages/LucasTHCR/maven</url>
  </repository>
</repositories>

<dependencies>
  <dependency>
    <groupId>net.paperstream</groupId>
    <artifactId>paperproxy-api</artifactId>
    <version>1.2.2-RELEASE</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

The artifact contains the full Velocity API, so you do not need velocity-api as well.

Basics

PaperProxy pp = PaperProxy.get();
pp.getClientVersion(player);                       // "1.21.4"
pp.getMessage("myplugin.welcome", "player", name); // text from messages.yml
pp.isOnline("survival");                           // health check result
pp.isMaintenance("survival");
pp.getForwardingMode("survival");                  // "modern", "paperguard", ...
pp.async(() -> database.save(player));

Parties

Needs PaperProxy 1.2.0 or newer.

PartyManager parties = PaperProxy.get().getParties();

Party party = parties.create(leader);
parties.addMember(party, player);       // false if full or already in a party
parties.setLeader(party, otherMember);
parties.removeMember(player);
parties.disband(party);

parties.getParty(player).ifPresent(p -> {
  p.getLeader();
  p.getMembers();                       // leader first
  p.sendMessage(Component.text("Ready?"));
});

Events

Register them like any Velocity event with @Subscribe.

Event When
BackendHealthChangeEvent a backend goes offline or comes back
ClientVersionDeniedEvent a client version is refused for a server
PluginRuntimeChangeEvent a plugin was reloaded, loaded or unloaded at runtime
PartyJoinEvent a player joined a party (also the leader of a new one)
PartyLeaveEvent a player left, with the reason LEFT, KICKED, DISCONNECTED or DISBANDED
PartyFollowEvent a member is about to follow the leader. Cancel it to keep them where they are, for example during a minigame round
@Subscribe
public void onFollow(PartyFollowEvent event) {
  if (game.isRunning(event.getMember())) {
    event.setCancelled(true);
  }
}

Supporting plain Velocity too

On plain Velocity the PaperProxy classes do not exist. Check before you touch them:

boolean paperProxy;
try {
  Class.forName("net.paperstream.paperproxy.api.PaperProxy");
  paperProxy = true;
} catch (ClassNotFoundException e) {
  paperProxy = false;
}

Clone this wiki locally