mirror of
https://e.coding.net/circlecloud/MiaoChat.git
synced 2024-12-22 19:18:47 +00:00
添加跨服聊天功能
This commit is contained in:
parent
0366ad42cf
commit
7d72c97c3b
5
pom.xml
5
pom.xml
@ -112,6 +112,11 @@
|
|||||||
<type>jar</type>
|
<type>jar</type>
|
||||||
<version>1.1</version>
|
<version>1.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.md-5</groupId>
|
||||||
|
<artifactId>bungeecord-api</artifactId>
|
||||||
|
<version>1.10-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>pw.yumc</groupId>
|
<groupId>pw.yumc</groupId>
|
||||||
<artifactId>PlaceholderAPI</artifactId>
|
<artifactId>PlaceholderAPI</artifactId>
|
||||||
|
@ -1,14 +1,17 @@
|
|||||||
package pw.yumc.MiaoChat;
|
package pw.yumc.MiaoChat;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.plugin.messaging.PluginMessageListener;
|
||||||
import pw.yumc.MiaoChat.config.ChatConfig;
|
import pw.yumc.MiaoChat.config.ChatConfig;
|
||||||
import pw.yumc.MiaoChat.listeners.ChatListener;
|
import pw.yumc.MiaoChat.listeners.ChatListener;
|
||||||
import pw.yumc.YumCore.bukkit.Log;
|
import pw.yumc.YumCore.bukkit.Log;
|
||||||
|
import pw.yumc.YumCore.bukkit.compatible.C;
|
||||||
import pw.yumc.YumCore.commands.CommandManager;
|
import pw.yumc.YumCore.commands.CommandManager;
|
||||||
import pw.yumc.YumCore.commands.annotation.Cmd;
|
import pw.yumc.YumCore.commands.annotation.Cmd;
|
||||||
import pw.yumc.YumCore.commands.annotation.Help;
|
import pw.yumc.YumCore.commands.annotation.Help;
|
||||||
@ -16,7 +19,7 @@ import pw.yumc.YumCore.commands.interfaces.CommandExecutor;
|
|||||||
import pw.yumc.YumCore.config.FileConfig;
|
import pw.yumc.YumCore.config.FileConfig;
|
||||||
import pw.yumc.YumCore.global.L10N;
|
import pw.yumc.YumCore.global.L10N;
|
||||||
|
|
||||||
public class MiaoChat extends JavaPlugin implements CommandExecutor {
|
public class MiaoChat extends JavaPlugin implements CommandExecutor, PluginMessageListener {
|
||||||
private FileConfig cfg;
|
private FileConfig cfg;
|
||||||
private ChatConfig chatConfig;
|
private ChatConfig chatConfig;
|
||||||
|
|
||||||
@ -47,6 +50,8 @@ public class MiaoChat extends JavaPlugin implements CommandExecutor {
|
|||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
new ChatListener();
|
new ChatListener();
|
||||||
new CommandManager("MiaoChat", this);
|
new CommandManager("MiaoChat", this);
|
||||||
|
Bukkit.getMessenger().registerIncomingPluginChannel(this, MiaoMessage.CHANNEL, this);
|
||||||
|
Bukkit.getMessenger().registerOutgoingPluginChannel(this, MiaoMessage.CHANNEL);
|
||||||
L10N.getName(new ItemStack(Material.AIR));
|
L10N.getName(new ItemStack(Material.AIR));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,4 +68,21 @@ public class MiaoChat extends JavaPlugin implements CommandExecutor {
|
|||||||
chatConfig.reload();
|
chatConfig.reload();
|
||||||
Log.toSender(sender, "§a配置文件已重载!");
|
Log.toSender(sender, "§a配置文件已重载!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void send(byte[] in) {
|
||||||
|
send(MiaoMessage.decode(in).getJson());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void send(String json) {
|
||||||
|
for (Player player : C.Player.getOnlinePlayers()) {
|
||||||
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "tellraw " + player.getName() + " " + json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
|
||||||
|
if (MiaoMessage.CHANNEL.equals(channel)) {
|
||||||
|
send(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
29
src/main/java/pw/yumc/MiaoChat/MiaoChatBungee.java
Normal file
29
src/main/java/pw/yumc/MiaoChat/MiaoChatBungee.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package pw.yumc.MiaoChat;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
|
import net.md_5.bungee.api.event.PluginMessageEvent;
|
||||||
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
|
import net.md_5.bungee.api.plugin.Plugin;
|
||||||
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
|
||||||
|
public class MiaoChatBungee extends Plugin implements Listener {
|
||||||
|
@EventHandler
|
||||||
|
public void handle(final PluginMessageEvent event) {
|
||||||
|
if (event.getTag().equals(MiaoMessage.CHANNEL)) {
|
||||||
|
InetSocketAddress origin = event.getSender().getAddress();
|
||||||
|
for (ServerInfo server : getProxy().getServers().values()) {
|
||||||
|
if (!server.getAddress().equals(origin) && server.getPlayers().size() > 0) {
|
||||||
|
server.sendData(MiaoMessage.CHANNEL, event.getData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
getProxy().registerChannel(MiaoMessage.CHANNEL);
|
||||||
|
getProxy().getPluginManager().registerListener(this, this);
|
||||||
|
}
|
||||||
|
}
|
37
src/main/java/pw/yumc/MiaoChat/MiaoMessage.java
Normal file
37
src/main/java/pw/yumc/MiaoChat/MiaoMessage.java
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package pw.yumc.MiaoChat;
|
||||||
|
|
||||||
|
import com.google.common.io.ByteArrayDataInput;
|
||||||
|
import com.google.common.io.ByteArrayDataOutput;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created on 16-9-8.
|
||||||
|
*/
|
||||||
|
public class MiaoMessage {
|
||||||
|
|
||||||
|
public static final String CHANNEL = "MiaoChat";
|
||||||
|
private String json;
|
||||||
|
|
||||||
|
private MiaoMessage(String json) {
|
||||||
|
this.json = json;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] encode(String in) {
|
||||||
|
return new MiaoMessage(in).encode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MiaoMessage decode(byte[] in) {
|
||||||
|
final ByteArrayDataInput input = ByteStreams.newDataInput(in);
|
||||||
|
return new MiaoMessage(input.readUTF());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getJson() {
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] encode() {
|
||||||
|
final ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||||
|
out.writeUTF(json);
|
||||||
|
return out.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
@ -1,13 +1,6 @@
|
|||||||
package pw.yumc.MiaoChat.listeners;
|
package pw.yumc.MiaoChat.listeners;
|
||||||
|
|
||||||
import java.util.Collection;
|
import me.clip.placeholderapi.PlaceholderAPI;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -18,9 +11,8 @@ import org.bukkit.event.EventPriority;
|
|||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import me.clip.placeholderapi.PlaceholderAPI;
|
|
||||||
import pw.yumc.MiaoChat.MiaoChat;
|
import pw.yumc.MiaoChat.MiaoChat;
|
||||||
|
import pw.yumc.MiaoChat.MiaoMessage;
|
||||||
import pw.yumc.MiaoChat.config.ChatConfig;
|
import pw.yumc.MiaoChat.config.ChatConfig;
|
||||||
import pw.yumc.MiaoChat.config.ChatMessagePart;
|
import pw.yumc.MiaoChat.config.ChatMessagePart;
|
||||||
import pw.yumc.MiaoChat.config.ChatRule;
|
import pw.yumc.MiaoChat.config.ChatRule;
|
||||||
@ -32,10 +24,16 @@ import pw.yumc.YumCore.statistic.Statistics;
|
|||||||
import pw.yumc.YumCore.tellraw.Tellraw;
|
import pw.yumc.YumCore.tellraw.Tellraw;
|
||||||
import pw.yumc.YumCore.update.SubscribeTask;
|
import pw.yumc.YumCore.update.SubscribeTask;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class ChatListener implements Listener {
|
public class ChatListener implements Listener {
|
||||||
public static Set<String> offList = new HashSet<>();
|
public static Set<String> offList = new HashSet<>();
|
||||||
private static Pattern ITEM_PATTERN = Pattern.compile("%([i1-9]?)");
|
private static Pattern ITEM_PATTERN = Pattern.compile("%([i1-9]?)");
|
||||||
|
|
||||||
|
private final Queue<String> queue = new LinkedList<>();
|
||||||
|
|
||||||
private MiaoChat plugin = P.getPlugin();
|
private MiaoChat plugin = P.getPlugin();
|
||||||
private ChatConfig cc = plugin.getChatConfig();
|
private ChatConfig cc = plugin.getChatConfig();
|
||||||
|
|
||||||
@ -45,6 +43,37 @@ public class ChatListener implements Listener {
|
|||||||
new SubscribeTask(true, true);
|
new SubscribeTask(true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void execute(final String commandList) {
|
||||||
|
execute(commandList, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(final String command, final boolean queued) {
|
||||||
|
final Iterator<? extends Player> it = C.Player.getOnlinePlayers().iterator();
|
||||||
|
if (it.hasNext()) {
|
||||||
|
final Player p = it.next();
|
||||||
|
p.sendPluginMessage(P.instance, MiaoMessage.CHANNEL, MiaoMessage.encode(command));
|
||||||
|
} else if (queued) {
|
||||||
|
queue.offer(command);
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("None player channel registered! Use queued");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean processQueued() {
|
||||||
|
if (!queue.isEmpty()) {
|
||||||
|
final Iterator<? extends Player> it = C.Player.getOnlinePlayers().iterator();
|
||||||
|
if (!it.hasNext()) { return false; }
|
||||||
|
final Player p = it.next();
|
||||||
|
String command = queue.poll();
|
||||||
|
while (command != null) {
|
||||||
|
p.sendPluginMessage(P.instance, MiaoMessage.CHANNEL, MiaoMessage.encode(command));
|
||||||
|
command = queue.poll();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onChat(AsyncPlayerChatEvent e) {
|
public void onChat(AsyncPlayerChatEvent e) {
|
||||||
Player p = e.getPlayer();
|
Player p = e.getPlayer();
|
||||||
@ -123,7 +152,7 @@ public class ChatListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleSend(Player p, Tellraw tr, int range) {
|
private void handleSend(Player p, Tellraw tr, int range) {
|
||||||
Collection<? extends Entity> plist = Collections.emptyList();
|
Collection<? extends Entity> plist;
|
||||||
if (range != 0) {
|
if (range != 0) {
|
||||||
plist = p.getNearbyEntities(range, range, range);
|
plist = p.getNearbyEntities(range, range, range);
|
||||||
tr.send(p);
|
tr.send(p);
|
||||||
@ -139,9 +168,7 @@ public class ChatListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleTellraw(Player player, Tellraw tr, ChatRule cr, String message) {
|
private void handleTellraw(Player player, Tellraw tr, ChatRule cr, String message) {
|
||||||
if (message.isEmpty()) {
|
if (message.isEmpty()) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (player.hasPermission("MiaoChat.color")) {
|
if (player.hasPermission("MiaoChat.color")) {
|
||||||
message = ChatColor.translateAlternateColorCodes('&', message);
|
message = ChatColor.translateAlternateColorCodes('&', message);
|
||||||
}
|
}
|
||||||
|
5
src/main/resources/bungee.yml
Normal file
5
src/main/resources/bungee.yml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
name: ${project.artifactId}
|
||||||
|
description: ${project.description}
|
||||||
|
main: ${project.groupId}.${project.artifactId}.${project.artifactId}Bungee
|
||||||
|
version: ${project.version}
|
||||||
|
author: 喵♂呜
|
Loading…
Reference in New Issue
Block a user