-
-
Notifications
You must be signed in to change notification settings - Fork 57
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Create simple networking only plugin for Bukkit
- Loading branch information
1 parent
6380f6d
commit 3dee243
Showing
8 changed files
with
264 additions
and
0 deletions.
There are no files selected for viewing
54 changes: 54 additions & 0 deletions
54
commandapi-platforms/commandapi-bukkit/commandapi-bukkit-networking-plugin/pom.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
24 changes: 24 additions & 0 deletions
24
...bukkit-networking-plugin/src/main/java/dev/jorel/commandapi/CommandAPINetworkingMain.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
...rking-plugin/src/main/java/dev/jorel/commandapi/network/BukkitHandshakePacketHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | ||
} | ||
} |
106 changes: 106 additions & 0 deletions
106
...lugin/src/main/java/dev/jorel/commandapi/network/BukkitNetworkingCommandAPIMessenger.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
28 changes: 28 additions & 0 deletions
28
...gin/src/main/java/dev/jorel/commandapi/network/BukkitNetworkingPacketHandlerProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
...networking-plugin/src/main/java/dev/jorel/commandapi/network/BukkitPlayPacketHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} |
9 changes: 9 additions & 0 deletions
9
...forms/commandapi-bukkit/commandapi-bukkit-networking-plugin/src/main/resources/plugin.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters