merge/1/MERGE
Coding 2016-11-03 22:13:41 +08:00
commit 0fc805345a
10 changed files with 162 additions and 37 deletions

22
pom.xml
View File

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>pw.yumc</groupId>
<artifactId>MiaoChat</artifactId>
<version>1.3.3</version>
<version>1.5</version>
<build>
<finalName>${project.name}</finalName>
<resources>
@ -62,6 +62,9 @@
<options>
<option>-repackageclasses \ʼ.ʽ.ʾ.${project.artifactId}</option>
<option>-keep class ${project.groupId}.${project.artifactId}.${project.artifactId}</option>
<option>-keep class
${project.groupId}.${project.artifactId}.${project.artifactId}Bungee
</option>
</options>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
@ -112,12 +115,17 @@
<type>jar</type>
<version>1.1</version>
</dependency>
<dependency>
<groupId>pw.yumc</groupId>
<artifactId>PlaceholderAPI</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/PlaceholderAPI.jar</systemPath>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.10-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>pw.yumc</groupId>
<artifactId>PlaceholderAPI</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/PlaceholderAPI.jar</systemPath>
</dependency>
</dependencies>
</project>

View File

@ -26,7 +26,9 @@
-keepclassmembers class * implements org.bukkit.event.Listener {
@org.bukkit.event.EventHandler <methods>;
}
-keepclassmembers class * implements net.md_5.bungee.api.plugin.Listener {
@net.md_5.bungee.event.EventHandler <methods>;
}
# -----保护枚举方法的完整性-----
-keepclassmembers enum * {
public static **[] values();

View File

@ -1,14 +1,17 @@
package pw.yumc.MiaoChat;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.messaging.PluginMessageListener;
import pw.yumc.MiaoChat.config.ChatConfig;
import pw.yumc.MiaoChat.listeners.ChatListener;
import pw.yumc.YumCore.bukkit.Log;
import pw.yumc.YumCore.bukkit.compatible.C;
import pw.yumc.YumCore.commands.CommandManager;
import pw.yumc.YumCore.commands.annotation.Cmd;
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.global.L10N;
public class MiaoChat extends JavaPlugin implements CommandExecutor {
public class MiaoChat extends JavaPlugin implements CommandExecutor, PluginMessageListener {
private FileConfig cfg;
private ChatConfig chatConfig;
@ -47,6 +50,13 @@ public class MiaoChat extends JavaPlugin implements CommandExecutor {
public void onEnable() {
new ChatListener();
new CommandManager("MiaoChat", this);
if (getChatConfig().isBungeeCord()) {
Log.info("已开启 BUngeeCord 模式!");
Bukkit.getMessenger().registerIncomingPluginChannel(this, MiaoMessage.CHANNEL, this);
Bukkit.getMessenger().registerOutgoingPluginChannel(this, MiaoMessage.CHANNEL);
Bukkit.getMessenger().registerIncomingPluginChannel(this, MiaoMessage.NORMALCHANNEL, this);
Bukkit.getMessenger().registerOutgoingPluginChannel(this, MiaoMessage.NORMALCHANNEL);
}
L10N.getName(new ItemStack(Material.AIR));
}
@ -63,4 +73,25 @@ public class MiaoChat extends JavaPlugin implements CommandExecutor {
chatConfig.reload();
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);
} else if (MiaoMessage.NORMALCHANNEL.equals(channel)) {
for (Player p : C.Player.getOnlinePlayers()) {
p.sendMessage(MiaoMessage.decode(message).getJson());
}
}
}
}

View File

@ -0,0 +1,31 @@
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) || event.getTag().equals(MiaoMessage.NORMALCHANNEL)) {
InetSocketAddress origin = event.getSender().getAddress();
for (ServerInfo server : getProxy().getServers().values()) {
if (!server.getAddress().equals(origin) && server.getPlayers().size() > 0) {
server.sendData(event.getTag(), event.getData());
}
}
}
}
@Override
public void onEnable() {
getProxy().registerChannel(MiaoMessage.CHANNEL);
getProxy().registerChannel(MiaoMessage.NORMALCHANNEL);
getProxy().getPluginManager().registerListener(this, this);
getLogger().info("注意: 通过BC转发的聊天信息将不会在控制台显示 仅客户端可见!");
}
}

View File

@ -0,0 +1,39 @@
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";
public static final String NORMALCHANNEL = "MiaoChatNM";
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() {
if (json.getBytes().length > 32000) { return null; }
final ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF(json);
return out.toByteArray();
}
}

View File

@ -3,5 +3,5 @@ package pw.yumc.MiaoChat.config;
public enum CLICKTYPE {
COMMAND,
SUGGEST,
OPENURL;
OPENURL
}

View File

@ -1,17 +1,12 @@
package pw.yumc.MiaoChat.config;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import org.bukkit.entity.Player;
import pw.yumc.YumCore.bukkit.Log;
import pw.yumc.YumCore.bukkit.P;
import pw.yumc.YumCore.config.FileConfig;
import java.util.*;
/**
*
* @since 201699 4:40:50
@ -24,9 +19,11 @@ public class ChatConfig {
private LinkedList<ChatRule> rules;
private FileConfig config;
private FileConfig format;
private boolean BungeeCord;
public ChatConfig() {
config = P.getConfig();
BungeeCord = config.getBoolean("BungeeCord");
format = new FileConfig("format.yml");
rulecomp = new RuleComparator();
formats = new HashMap<>();
@ -34,6 +31,13 @@ public class ChatConfig {
load();
}
/**
* @return BC
*/
public boolean isBungeeCord() {
return BungeeCord;
}
/**
*
*
@ -43,9 +47,7 @@ public class ChatConfig {
public ChatRule getChatRule(Player player) {
for (ChatRule cr : rules) {
Log.debug(cr.getName());
if (cr.check(player)) {
return cr;
}
if (cr.check(player)) { return cr; }
}
return null;
}

View File

@ -1,13 +1,6 @@
package pw.yumc.MiaoChat.listeners;
import java.util.Collection;
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 me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@ -18,9 +11,8 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.inventory.ItemStack;
import me.clip.placeholderapi.PlaceholderAPI;
import pw.yumc.MiaoChat.MiaoChat;
import pw.yumc.MiaoChat.MiaoMessage;
import pw.yumc.MiaoChat.config.ChatConfig;
import pw.yumc.MiaoChat.config.ChatMessagePart;
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.update.SubscribeTask;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChatListener implements Listener {
public static Set<String> offList = new HashSet<>();
private static Pattern ITEM_PATTERN = Pattern.compile("%([i1-9]?)");
private final Queue<String> queue = new LinkedList<>();
private MiaoChat plugin = P.getPlugin();
private ChatConfig cc = plugin.getChatConfig();
@ -45,7 +43,7 @@ public class ChatListener implements Listener {
new SubscribeTask(true, true);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onChat(AsyncPlayerChatEvent e) {
Player p = e.getPlayer();
ChatRule cr = cc.getChatRule(e.getPlayer());
@ -123,14 +121,23 @@ public class ChatListener implements Listener {
}
private void handleSend(Player p, Tellraw tr, int range) {
Collection<? extends Entity> plist = Collections.emptyList();
Collection<? extends Entity> plist;
if (range != 0) {
plist = p.getNearbyEntities(range, range, range);
tr.send(p);
} else {
plist = C.Player.getOnlinePlayers();
if (cc.isBungeeCord()) {
byte[] mm = MiaoMessage.encode(tr.toJsonString());
if (mm == null) {
p.sendPluginMessage(P.instance, MiaoMessage.NORMALCHANNEL, MiaoMessage.encode(tr.toOldMessageFormat()));
} else {
p.sendPluginMessage(P.instance, MiaoMessage.CHANNEL, mm);
}
}
}
for (Entity ne : plist) {
// 此处必须进行强制转换 老版本服务器的Entity没有getName()
if (ne instanceof Player && !offList.contains(((Player) ne).getName())) {
tr.send(ne);
}
@ -139,9 +146,7 @@ public class ChatListener implements Listener {
}
private void handleTellraw(Player player, Tellraw tr, ChatRule cr, String message) {
if (message.isEmpty()) {
return;
}
if (message.isEmpty()) { return; }
if (player.hasPermission("MiaoChat.color")) {
message = ChatColor.translateAlternateColorCodes('&', message);
}

View File

@ -0,0 +1,5 @@
name: ${project.artifactId}
description: ${project.description}
main: ${project.groupId}.${project.artifactId}.${project.artifactId}Bungee
version: ${project.version}
author: 喵♂呜

View File

@ -1,6 +1,8 @@
#配置文件版本号 请勿修改
Version: 1.2
Version: 1.3
#BC跨服模式
BungeeCord: true
#格式列表
Formats:
#格式名称 对应当前文件夹下的default.yml