Skip to content

Commit

Permalink
Create simple networking only plugin for Bukkit
Browse files Browse the repository at this point in the history
  • Loading branch information
willkroboth committed Feb 29, 2024
1 parent 6380f6d commit 3dee243
Show file tree
Hide file tree
Showing 8 changed files with 264 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<parent>
<artifactId>commandapi-bukkit</artifactId>
<groupId>dev.jorel</groupId>
<version>9.4.0-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>commandapi-bukkit-networking-plugin</artifactId>

<dependencies>
<dependency>
<groupId>dev.jorel</groupId>
<artifactId>commandapi-core</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>${paper.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- Fill ${project.version} in plugin.yml -->
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package dev.jorel.commandapi;

import org.bukkit.plugin.java.JavaPlugin;

import dev.jorel.commandapi.network.BukkitNetworkingCommandAPIMessenger;

/**
* Main CommandAPI networking plugin entrypoint
*/
public class CommandAPINetworkingMain extends JavaPlugin {
private BukkitNetworkingCommandAPIMessenger messenger;

@Override
public void onEnable() {
messenger = new BukkitNetworkingCommandAPIMessenger(this);
}

/**
* @return The {@link BukkitNetworkingCommandAPIMessenger} handling packets.
*/
public BukkitNetworkingCommandAPIMessenger getMessenger() {
return messenger;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dev.jorel.commandapi.network;

import dev.jorel.commandapi.CommandAPINetworkingMain;
import dev.jorel.commandapi.network.packets.SetVersionPacket;
import org.bukkit.entity.Player;

/**
* A {@link HandshakePacketHandler} for handling {@link CommandAPIPacket}s sent to Bukkit by {@link Player} connections.
*/
public class BukkitHandshakePacketHandler implements HandshakePacketHandler<Player> {
private final CommandAPINetworkingMain plugin;

protected BukkitHandshakePacketHandler(CommandAPINetworkingMain plugin) {
this.plugin = plugin;
}

@Override
public void handleSetVersionPacket(Player sender, SetVersionPacket packet) {
plugin.getMessenger().setProtocolVersion(sender, packet.protocolVersion());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package dev.jorel.commandapi.network;

import dev.jorel.commandapi.CommandAPINetworkingMain;
import dev.jorel.commandapi.network.packets.SetVersionPacket;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRegisterChannelEvent;
import org.bukkit.plugin.messaging.Messenger;
import org.bukkit.plugin.messaging.PluginMessageListener;

import java.util.HashMap;
import java.util.Map;

// Based on https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/
/**
* A {@link CommandAPIMessenger} for sending and receiving messages to and from CommandAPIBukkit and {@link Player}s
* connected to the Bukkit server.
*/
public class BukkitNetworkingCommandAPIMessenger extends CommandAPIMessenger<Player, Player> implements PluginMessageListener, Listener {
private final CommandAPINetworkingMain plugin;
private final Map<Player, Integer> protocolVersionPerPlayer;

/**
* Creates a new {@link BukkitNetworkingCommandAPIMessenger}.
*
* @param plugin The plugin sending and receiving messages.
*/
public BukkitNetworkingCommandAPIMessenger(CommandAPINetworkingMain plugin) {
super(new BukkitNetworkingPacketHandlerProvider(plugin));
this.plugin = plugin;

this.protocolVersionPerPlayer = new HashMap<>();

// Register to listen for and send plugin messages on each channel
Messenger messenger = Bukkit.getServer().getMessenger();
for (String channelIdentifier : CommandAPIProtocol.getAllChannelIdentifiers()) {
messenger.registerIncomingPluginChannel(this.plugin, channelIdentifier, this);
messenger.registerOutgoingPluginChannel(this.plugin, channelIdentifier);
}
// Register to listen for player join and leave
Bukkit.getPluginManager().registerEvents(this, this.plugin);
}

@EventHandler
public void onPlayerRegisterChannel(PlayerRegisterChannelEvent event) {
// Run once the handshake channel is registered
// We can't send messages until the channel is registered, so this is the earliest this can happen
if (!event.getChannel().equals(CommandAPIProtocol.HANDSHAKE.getChannelIdentifier())) return;

// Send SetVersionPacket to inform player of our capabilities
this.sendPacket(event.getPlayer(), new SetVersionPacket(CommandAPIProtocol.PROTOCOL_VERSION));
}

@EventHandler
public void onPlayerLeave(PlayerQuitEvent event) {
// Remove player from our protocol version map, so we don't keep track of useless data
this.protocolVersionPerPlayer.remove(event.getPlayer());
}

@Override
public void close() {
// Unregister this listener
Messenger messenger = Bukkit.getServer().getMessenger();
for (String channelIdentifier : CommandAPIProtocol.getAllChannelIdentifiers()) {
messenger.unregisterIncomingPluginChannel(this.plugin, channelIdentifier);
messenger.unregisterOutgoingPluginChannel(this.plugin, channelIdentifier);
}
HandlerList.unregisterAll(this);
}

/**
* Sets the {@link CommandAPIProtocol#PROTOCOL_VERSION} being used by the given player. This is only intended to be
* called by {@link BukkitHandshakePacketHandler#handleSetVersionPacket(Player, SetVersionPacket)} when a
* {@link SetVersionPacket} is received.
*
* @param sender The player that sent the {@link SetVersionPacket}.
* @param protocolVersion The {@link CommandAPIProtocol#PROTOCOL_VERSION} in the {@link SetVersionPacket}.
*/
public void setProtocolVersion(Player sender, int protocolVersion) {
this.protocolVersionPerPlayer.put(sender, protocolVersion);
}

@Override
public int getConnectionProtocolVersion(Player target) {
return this.protocolVersionPerPlayer.getOrDefault(target, 0);
}

@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
// A plugin message was sent to Bukkit, check if it is for us
CommandAPIProtocol protocol = CommandAPIProtocol.getProtocolForChannel(channel);
if (protocol == null) return;

// Handle the message
messageReceived(protocol, player, message);
}

@Override
public void sendRawBytes(CommandAPIProtocol protocol, Player target, byte[] bytes) {
target.sendPluginMessage(this.plugin, protocol.getChannelIdentifier(), bytes);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package dev.jorel.commandapi.network;

import org.bukkit.entity.Player;

import dev.jorel.commandapi.CommandAPINetworkingMain;

/**
* A {@link CommandAPIPacketHandlerProvider} for the barebones netowrking plugin for Bukkit.
*/
public class BukkitNetworkingPacketHandlerProvider implements CommandAPIPacketHandlerProvider<Player> {
private final BukkitHandshakePacketHandler handshakePacketHandler;
private final BukkitPlayPacketHandler playPacketHandler;

protected BukkitNetworkingPacketHandlerProvider(CommandAPINetworkingMain plugin) {
handshakePacketHandler = new BukkitHandshakePacketHandler(plugin);
playPacketHandler = new BukkitPlayPacketHandler(plugin);
}

@Override
public BukkitHandshakePacketHandler getHandshakePacketHandler() {
return handshakePacketHandler;
}

@Override
public BukkitPlayPacketHandler getPlayPacketHandler() {
return playPacketHandler;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dev.jorel.commandapi.network;

import dev.jorel.commandapi.CommandAPINetworkingMain;
import dev.jorel.commandapi.network.packets.UpdateRequirementsPacket;
import org.bukkit.entity.Player;

/**
* A {@link PlayPacketHandler} for handling {@link CommandAPIPacket}s sent to Bukkit by {@link Player} connections.
*/
public class BukkitPlayPacketHandler implements PlayPacketHandler<Player> {
private final CommandAPINetworkingMain plugin;

protected BukkitPlayPacketHandler(CommandAPINetworkingMain plugin) {
this.plugin = plugin;
}

@Override
public void handleUpdateRequirementsPacket(Player sender, UpdateRequirementsPacket packet) {
sender.updateCommands();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name: CommandAPINetworking
main: dev.jorel.commandapi.CommandAPINetworkingMain
version: ${project.version}
description: A barebones plugin that only handles plugin messages sent by the CommandAPI
authors:
- Will Kroboth
website: https://www.jorel.dev/CommandAPI/
api-version: 1.13
folia-supported: true
1 change: 1 addition & 0 deletions commandapi-platforms/commandapi-bukkit/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<module>commandapi-bukkit-plugin</module>
<module>commandapi-bukkit-test</module>
<module>commandapi-bukkit-shade</module>
<module>commandapi-bukkit-networking-plugin</module>

<module>commandapi-bukkit-plugin-mojang-mapped</module>
<module>commandapi-bukkit-shade-mojang-mapped</module>
Expand Down

0 comments on commit 3dee243

Please sign in to comment.