spigot/CraftBukkit-Patches/0083-BungeeCord-Chat-API.patch
2021-07-13 19:18:55 +10:00

324 lines
13 KiB
Diff

From d7e759c781d8c839a8b9bfe3fb364555f3cfb910 Mon Sep 17 00:00:00 2001
From: md_5 <git@md-5.net>
Date: Sat, 13 Dec 2014 03:06:05 +0100
Subject: [PATCH] BungeeCord Chat API
diff --git a/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutChat.java b/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutChat.java
index c7dd76c51..b98dcd1a8 100644
--- a/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutChat.java
+++ b/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutChat.java
@@ -10,6 +10,7 @@ import net.minecraft.network.protocol.Packet;
public class PacketPlayOutChat implements Packet<PacketListenerPlayOut> {
private final IChatBaseComponent message;
+ public net.md_5.bungee.api.chat.BaseComponent[] components; // Spigot
private final ChatMessageType type;
private final UUID sender;
@@ -27,7 +28,13 @@ public class PacketPlayOutChat implements Packet<PacketListenerPlayOut> {
@Override
public void a(PacketDataSerializer packetdataserializer) {
- packetdataserializer.a(this.message);
+ // Spigot start
+ if (components != null) {
+ packetdataserializer.a(net.md_5.bungee.chat.ComponentSerializer.toString(components));
+ } else {
+ packetdataserializer.a(this.message);
+ }
+ // Spigot end
packetdataserializer.writeByte(this.type.a());
packetdataserializer.a(this.sender);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 8771e7a3f..9fa2e42fa 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -225,6 +225,8 @@ import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.SafeConstructor;
import org.yaml.snakeyaml.error.MarkedYAMLException;
+import net.md_5.bungee.api.chat.BaseComponent; // Spigot
+
public final class CraftServer implements Server {
private final String serverName = "CraftBukkit";
private final String serverVersion;
@@ -2089,6 +2091,20 @@ public final class CraftServer implements Server {
public void restart() {
org.spigotmc.RestartCommand.restart();
}
+
+ @Override
+ public void broadcast(BaseComponent component) {
+ for (Player player : getOnlinePlayers()) {
+ player.spigot().sendMessage(component);
+ }
+ }
+
+ @Override
+ public void broadcast(BaseComponent... components) {
+ for (Player player : getOnlinePlayers()) {
+ player.spigot().sendMessage(components);
+ }
+ }
};
public org.bukkit.Server.Spigot spigot()
diff --git a/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java
index 6d251a56f..92b18858d 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java
@@ -103,6 +103,29 @@ public abstract class ServerCommandSender implements CommandSender {
// Spigot start
private final org.bukkit.command.CommandSender.Spigot spigot = new org.bukkit.command.CommandSender.Spigot()
{
+ @Override
+ public void sendMessage(net.md_5.bungee.api.chat.BaseComponent component)
+ {
+ ServerCommandSender.this.sendMessage(net.md_5.bungee.api.chat.TextComponent.toLegacyText(component));
+ }
+
+ @Override
+ public void sendMessage(net.md_5.bungee.api.chat.BaseComponent... components)
+ {
+ ServerCommandSender.this.sendMessage(net.md_5.bungee.api.chat.TextComponent.toLegacyText(components));
+ }
+
+ @Override
+ public void sendMessage(UUID sender, net.md_5.bungee.api.chat.BaseComponent... components)
+ {
+ this.sendMessage(components);
+ }
+
+ @Override
+ public void sendMessage(UUID sender, net.md_5.bungee.api.chat.BaseComponent component)
+ {
+ this.sendMessage(component);
+ }
};
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
index dbd2dcad0..ab90b361f 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -7,6 +7,7 @@ import com.google.common.collect.Lists;
import java.util.List;
import java.util.Set;
import java.util.UUID;
+import net.md_5.bungee.api.chat.BaseComponent;
import net.minecraft.core.BlockPosition;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
@@ -1075,6 +1076,26 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
// Spigot start
private final org.bukkit.entity.Entity.Spigot spigot = new org.bukkit.entity.Entity.Spigot()
{
+
+ @Override
+ public void sendMessage(net.md_5.bungee.api.chat.BaseComponent component)
+ {
+ }
+
+ @Override
+ public void sendMessage(net.md_5.bungee.api.chat.BaseComponent... components)
+ {
+ }
+
+ @Override
+ public void sendMessage(UUID sender, BaseComponent... components)
+ {
+ }
+
+ @Override
+ public void sendMessage(UUID sender, BaseComponent component)
+ {
+ }
};
public org.bukkit.entity.Entity.Spigot spigot()
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 48f69b501..058b387cd 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -128,6 +128,8 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.messaging.StandardMessenger;
import org.bukkit.scoreboard.Scoreboard;
+import net.md_5.bungee.api.chat.BaseComponent; // Spigot
+
@DelegateDeserialization(CraftOfflinePlayer.class)
public class CraftPlayer extends CraftHumanEntity implements Player {
private long firstPlayed = 0;
@@ -1767,6 +1769,58 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return java.util.Collections.unmodifiableSet( ret );
}
+
+ @Override
+ public void sendMessage(BaseComponent component) {
+ sendMessage( new BaseComponent[] { component } );
+ }
+
+ @Override
+ public void sendMessage(BaseComponent... components) {
+ if ( getHandle().connection == null ) return;
+
+ PacketPlayOutChat packet = new PacketPlayOutChat(null, net.minecraft.network.chat.ChatMessageType.SYSTEM, SystemUtils.NIL_UUID);
+ packet.components = components;
+ getHandle().connection.sendPacket(packet);
+ }
+
+ @Override
+ public void sendMessage(UUID sender, BaseComponent component) {
+ this.sendMessage(net.md_5.bungee.api.ChatMessageType.CHAT, sender, component);
+ }
+
+ @Override
+ public void sendMessage(UUID sender, BaseComponent... components) {
+ this.sendMessage(net.md_5.bungee.api.ChatMessageType.CHAT, sender, components);
+ }
+
+ @Override
+ public void sendMessage(net.md_5.bungee.api.ChatMessageType position, BaseComponent component) {
+ sendMessage( position, new BaseComponent[] { component } );
+ }
+
+ @Override
+ public void sendMessage(net.md_5.bungee.api.ChatMessageType position, BaseComponent... components) {
+ if ( getHandle().connection == null ) return;
+
+ PacketPlayOutChat packet = new PacketPlayOutChat(null, net.minecraft.network.chat.ChatMessageType.a((byte) position.ordinal()), SystemUtils.NIL_UUID);
+ packet.components = components;
+ getHandle().connection.sendPacket(packet);
+ }
+
+ @Override
+ public void sendMessage(net.md_5.bungee.api.ChatMessageType position, UUID sender, BaseComponent component) {
+ sendMessage( position, sender, new BaseComponent[] { component } );
+ }
+
+ @Override
+ public void sendMessage(net.md_5.bungee.api.ChatMessageType position, UUID sender, BaseComponent... components) {
+ if ( getHandle().connection == null ) return;
+
+ PacketPlayOutChat packet = new PacketPlayOutChat(null, net.minecraft.network.chat.ChatMessageType.a((byte) position.ordinal()), sender == null ? SystemUtils.NIL_UUID : sender);
+ packet.components = components;
+ getHandle().connection.sendPacket(packet);
+ }
};
public Player.Spigot spigot()
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
index 2d403ad21..4cdc504df 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
@@ -24,6 +24,9 @@ import org.bukkit.inventory.meta.BookMeta.Generation;
// Spigot start
import static org.spigotmc.ValidateUtils.*;
+import java.util.AbstractList;
+import net.md_5.bungee.api.chat.BaseComponent;
+import net.md_5.bungee.chat.ComponentSerializer;
// Spigot end
@DelegateDeserialization(SerializableMeta.class)
@@ -439,6 +442,94 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
// Spigot start
private BookMeta.Spigot spigot = new SpigotMeta();
private class SpigotMeta extends BookMeta.Spigot {
+
+ private String pageToJSON(String page) {
+ if (CraftMetaBook.this instanceof CraftMetaBookSigned) {
+ // Page data is already in JSON format:
+ return page;
+ } else {
+ // Convert from plain String to JSON (similar to conversion between writable books and written books):
+ IChatBaseComponent component = CraftChatMessage.fromString(page, true, true)[0];
+ return CraftChatMessage.toJSON(component);
+ }
+ }
+
+ private String componentsToPage(BaseComponent[] components) {
+ // asserted: components != null
+ if (CraftMetaBook.this instanceof CraftMetaBookSigned) {
+ // Pages are in JSON format:
+ return ComponentSerializer.toString(components);
+ } else {
+ // Convert component to plain String:
+ return CraftChatMessage.fromJSONComponent(ComponentSerializer.toString(components));
+ }
+ }
+
+ @Override
+ public BaseComponent[] getPage(final int page) {
+ Validate.isTrue(isValidPage(page), "Invalid page number");
+ return ComponentSerializer.parse(pageToJSON(pages.get(page - 1)));
+ }
+
+ @Override
+ public void setPage(final int page, final BaseComponent... text) {
+ if (!isValidPage(page)) {
+ throw new IllegalArgumentException("Invalid page number " + page + "/" + getPageCount());
+ }
+
+ BaseComponent[] newText = text == null ? new BaseComponent[0] : text;
+ CraftMetaBook.this.pages.set(page - 1, componentsToPage(newText));
+ }
+
+ @Override
+ public void setPages(final BaseComponent[]... pages) {
+ setPages(Arrays.asList(pages));
+ }
+
+ @Override
+ public void addPage(final BaseComponent[]... pages) {
+ for (BaseComponent[] page : pages) {
+ if (page == null) {
+ page = new BaseComponent[0];
+ }
+
+ CraftMetaBook.this.internalAddPage(componentsToPage(page));
+ }
+ }
+
+ @Override
+ public List<BaseComponent[]> getPages() {
+ if (CraftMetaBook.this.pages == null) return ImmutableList.of();
+ final List<String> copy = ImmutableList.copyOf(CraftMetaBook.this.pages);
+ return new AbstractList<BaseComponent[]>() {
+
+ @Override
+ public BaseComponent[] get(int index) {
+ return ComponentSerializer.parse(pageToJSON(copy.get(index)));
+ }
+
+ @Override
+ public int size() {
+ return copy.size();
+ }
+ };
+ }
+
+ @Override
+ public void setPages(List<BaseComponent[]> pages) {
+ if (pages.isEmpty()) {
+ CraftMetaBook.this.pages = null;
+ return;
+ }
+
+ if (CraftMetaBook.this.pages != null) {
+ CraftMetaBook.this.pages.clear();
+ }
+
+ for (BaseComponent[] page : pages) {
+ addPage(page);
+ }
+ }
};
@Override
--
2.25.1