package eu.mikroskeem.utils.bukkit; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import lombok.Getter; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; /** * PluginMessage class * * Checks if plugin message channel is registered and sends message if try-resource block ends. * You can use this like you would write normal plugin messages. */ public class PluginMessage implements AutoCloseable,ByteArrayDataOutput { @Getter private ByteArrayDataOutput pluginMessage = ByteStreams.newDataOutput(); private String channel; private Player player; private Plugin plugin; private boolean wasChannelRegistered = false; public PluginMessage(Plugin plugin, Player player, String channel){ this.channel = channel; this.player = player; this.plugin = plugin; /* Check if channel is registered */ if(plugin.getServer().getMessenger().isOutgoingChannelRegistered(plugin, channel)){ wasChannelRegistered = true; } else { plugin.getServer().getMessenger().registerOutgoingPluginChannel(plugin, channel); } } @Override public void write(int b) { pluginMessage.write(b); } @Override public void write(byte[] b) { pluginMessage.write(b); } @Override public void write(byte[] b, int off, int len) { pluginMessage.write(b, off, len); } @Override public void writeBoolean(boolean v) { pluginMessage.writeBoolean(v); } @Override public void writeByte(int v) { pluginMessage.writeByte(v); } @Override public void writeShort(int v) { pluginMessage.writeShort(v); } @Override public void writeChar(int v) { pluginMessage.writeChar(v); } @Override public void writeInt(int v) { pluginMessage.writeInt(v); } @Override public void writeLong(long v) { pluginMessage.writeLong(v); } @Override public void writeFloat(float v) { pluginMessage.writeFloat(v); } @Override public void writeDouble(double v) { pluginMessage.writeDouble(v); } @Override public void writeChars(String s) { pluginMessage.writeChars(s); } @Override public void writeUTF(String s) { pluginMessage.writeUTF(s); } @Override @SuppressWarnings("deprecation") public void writeBytes(String s) { pluginMessage.writeBytes(s); } @Override public byte[] toByteArray() { return pluginMessage.toByteArray(); } @Override public void close() { player.sendPluginMessage(plugin, channel, pluginMessage.toByteArray()); if(!wasChannelRegistered){ plugin.getServer().getMessenger().unregisterOutgoingPluginChannel(plugin, channel); } } }