Skip to content

Using the Skungee API

LimeGlass edited this page Jun 25, 2021 · 21 revisions

Skungee API

This wiki tutorial will go over how to use the Skungee API. Skungee allows plugin developers to access the entire Bungeecord API from Spigot and send data packets between these said servers all in the network.

To begin with Skungee you will need to grab the dependency of Skungee. Skungee currently uses Jitpack and can be done in the following format for Maven or Gradle;

Jitpack:

Maven

In your pom.xml add:

<repositories>
  <repository>
      <id>jitpack.io</id>
      <url>https://jitpack.io</url>
  </repository>
</repositories>

<dependency>
    <groupId>com.github.Skungee</groupId>
    <artifactId>Skungee</artifactId>
    <version>INSERT VERSION</version>
</dependency>

Gradle

In your build.gradle add:

repositories {
  jcenter()
  maven {
    url 'https://jitpack.io'
  }
}

dependencies {
  compile 'com.github.Skungee:Skungee:INSERT VERSION'
}

Check the jitpack button above for SBT and leiningen support.

All main API methods are shared in SkungeeAPI class https://github.com/Skungee/Skungee/blob/master/src/main/java/me/limeglass/skungee/api/SkungeeAPI.java

Spigot side

An example of getting the servers players are on;

SkungeePlayer[] skungees = SkungeeAPI.getPlayersFrom((Player[]) players); //un-needed cast, just example for explanation.
SkungeePacket packet = new SkungeeAPI.SkungeePacketBuilder()
		.withType(SkungeePacketType.PLAYERSERVER)
		.withPlayers(skungees)
		.isReturnable(true)
		.build();
Set<String> servers = new HashSet<>();
try {
	servers = (Set<String>) SkungeeAPI.sendPacket(packet);
} catch (IllegalAccessException e) {
	e.printStackTrace();
}

The above will send a request to the Bungeecord and return a set of the servers in matching order of the player array input.

Alternatively you can also just directly send the packet and listen in via the event handler. Good for when you want to handle a packet type as a group of them. You can also directly input the server platforms main player handler object.

new SkungeeAPI.SkungeePacketBuilder()
		.withType(SkungeePacketType.PLAYERSERVER)
		.withPlayers((Player[]) players)
		.isReturnable(true)
		.send();

@EventHandler
public void onPacketReturning(SkungeeReturnedEvent event) {
	if (event.getPacket().getType() == SkungeePacketType.PLAYERSERVER)
		Set<String> servers = (Set<String>) event.getObject();
}

Spigot side Skungee events include;

SkungeeReturnedEvent - Called when the returned value from Bungeecord comes back from the SkungeePacket. Not cancellable.
SkungeeSendingEvent - Called when sending a SkungeePacket to the Bungeecord.
SkungeeReceivedEvent - Called when a BungeePacket has been received from Bungeecord.
SkungeeReturningEvent - Called when a BungeePacket is requesting a returned value.

Bungeecord side

An example of sending a custom packet back to Spigot and also reading an incoming one;

SkungeePlayer[] skungees = SkungeeAPI.getPlayersFrom((ProxiedPlayer[]) players); //un-needed cast, just example for explanation.
SkungeePacket packet = new SkungeeAPI.BungeePacketBuilder()
		.withType(BungeePacketType.CUSTOM) //This is not needed, it's already CUSTOM by default. For example.
		.withName("Custom-Packet-Example")
		.withObject(customObject)
		.withPlayers(skungees)
		.isReturnable(true)
		.build();
Object data;
//May return multiples if two have same name.
ConnectedServer[] servers = SkungeeAPI.getConnectedServers("Hub", "Skyblock")
try {
	data = SkungeeAPI.sendPacket(packet, servers);
} catch (IllegalAccessException e) {
	e.printStackTrace();
}

The above will send a request to the Hub Spigot server (example) and return a data object that the Spigot returns from.

You can also listen for events and use the direct send node too.

new SkungeeAPI.BungeePacketBuilder()
		.withName("Custom-Packet-Example")
		.withObject(customObject)
		.withPlayers((ProxiedPlayer[]) players)
		.isReturnable(true)
		.send(servers);

@EventHandler
public void onPacketReturning(BungeeReturnedEvent event) {
	BungeePacket packet = event.getPacket();
	if (packet.getType() == BungeePacketType.CUSTOM) {
		if (packet.getName().equalsIgnoreCase("Custom-Packet-Example")) {
			Object returned = event.getObject();
			//code here
		}
	}
}

Bungee side Skungee events are the same as Spigot just with opposite packets;

BungeeReturnedEvent - Called when the returned value from Spigot comes back from the BungeePacket. Not cancellable.
BungeeSendingEvent - Called when sending a BungeePacket to a Spigot server.
BungeeReceivedEvent - Called when a SkungeePacket has been received from a Spigot server.
BungeeReturningEvent - Called when a SkungeePacket is requesting a returned value.

Spigot side handling of a returnable

@EventHandler
public void onPacketReturning(SkungeeReturningEvent event) {
	BungeePacket packet = event.getPacket();
	if (packet.isReturnable() {
		if (packet.getType() == BungeePacketType.CUSTOM) {
			if (packet.getName().equalsIgnoreCase("Custom-Packet-Example")) {
				//code here
				packet.setObject(object);
			}
		}
	}
}
Clone this wiki locally