+ TPacket
+ TJson
This commit is contained in:
		
							
								
								
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							@@ -6,7 +6,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    <groupId>me.skymc</groupId>
 | 
					    <groupId>me.skymc</groupId>
 | 
				
			||||||
    <artifactId>TabooLib</artifactId>
 | 
					    <artifactId>TabooLib</artifactId>
 | 
				
			||||||
    <version>4.58</version>
 | 
					    <version>4.6</version>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <properties>
 | 
					    <properties>
 | 
				
			||||||
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
					        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,8 @@ import com.ilummc.tlib.logger.TLogger;
 | 
				
			|||||||
import me.skymc.taboolib.TabooLibLoader;
 | 
					import me.skymc.taboolib.TabooLibLoader;
 | 
				
			||||||
import me.skymc.taboolib.commands.builder.SimpleCommandBuilder;
 | 
					import me.skymc.taboolib.commands.builder.SimpleCommandBuilder;
 | 
				
			||||||
import me.skymc.taboolib.common.configuration.TConfiguration;
 | 
					import me.skymc.taboolib.common.configuration.TConfiguration;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.common.packet.TPacketHandler;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.common.packet.TPacketListener;
 | 
				
			||||||
import org.bukkit.plugin.Plugin;
 | 
					import org.bukkit.plugin.Plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.lang.reflect.Field;
 | 
					import java.lang.reflect.Field;
 | 
				
			||||||
@@ -28,6 +30,14 @@ public class TInjectLoader implements TabooLibLoader.Loader {
 | 
				
			|||||||
                e.printStackTrace();
 | 
					                e.printStackTrace();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					        // TPacketListener Inject
 | 
				
			||||||
 | 
					        injectTypes.put(TPacketListener.class, (plugin, field, args) -> {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                TPacketHandler.addListener(plugin, ((TPacketListener) field.get(null)));
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                e.printStackTrace();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
        // TConfiguration Inject
 | 
					        // TConfiguration Inject
 | 
				
			||||||
        injectTypes.put(TConfiguration.class, (plugin, field, args) -> {
 | 
					        injectTypes.put(TConfiguration.class, (plugin, field, args) -> {
 | 
				
			||||||
            if (args.length == 0) {
 | 
					            if (args.length == 0) {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										348
									
								
								src/main/java/me/skymc/taboolib/common/json/TJsonArray.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										348
									
								
								src/main/java/me/skymc/taboolib/common/json/TJsonArray.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,348 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.common.json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.gson.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.Iterator;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Spliterator;
 | 
				
			||||||
 | 
					import java.util.function.Consumer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-10-27 23:46
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class TJsonArray implements Iterable<TJsonObject> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private JsonArray jsonArray;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    TJsonArray(JsonArray jsonArray) {
 | 
				
			||||||
 | 
					        this.jsonArray = jsonArray;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 从 Json 原代码中获取
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param json 源代码
 | 
				
			||||||
 | 
					     * @return {@link TJsonArray}
 | 
				
			||||||
 | 
					     * @throws JsonParseException    if the specified text is not valid JSON
 | 
				
			||||||
 | 
					     * @throws IllegalStateException This is not a JSON Array.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static TJsonArray fromJson(String json) throws JsonParseException, IllegalStateException {
 | 
				
			||||||
 | 
					        return new TJsonArray(new JsonParser().parse(json).getAsJsonArray());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 从 JsonArray 创建
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param jsonArray JsonArray 对象
 | 
				
			||||||
 | 
					     * @return {@link TJsonObject}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static TJsonArray fromJsonArray(JsonArray jsonArray) {
 | 
				
			||||||
 | 
					        return new TJsonArray(jsonArray);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 添加成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void add(TJsonObject obj) {
 | 
				
			||||||
 | 
					        jsonArray.add(obj.asOriginJsonElement());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 添加成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void add(Boolean obj) {
 | 
				
			||||||
 | 
					        jsonArray.add(obj);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 添加成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void add(Character obj) {
 | 
				
			||||||
 | 
					        jsonArray.add(obj);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 添加成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void add(Number obj) {
 | 
				
			||||||
 | 
					        jsonArray.add(obj);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 添加成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void add(String obj) {
 | 
				
			||||||
 | 
					        jsonArray.add(obj);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 添加所有成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param array 成员集合
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void addAll(TJsonArray array) {
 | 
				
			||||||
 | 
					        jsonArray.add(array.asOriginJsonArray());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 设置成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 位置
 | 
				
			||||||
 | 
					     * @param obj   成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void set(int index, TJsonObject obj) {
 | 
				
			||||||
 | 
					        jsonArray.set(index, obj.asOriginJsonElement());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 设置成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 位置
 | 
				
			||||||
 | 
					     * @param obj   成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void set(int index, Boolean obj) {
 | 
				
			||||||
 | 
					        jsonArray.set(index, new JsonPrimitive(obj));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 设置成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 位置
 | 
				
			||||||
 | 
					     * @param obj   成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void set(int index, Number obj) {
 | 
				
			||||||
 | 
					        jsonArray.set(index, new JsonPrimitive(obj));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 设置成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 位置
 | 
				
			||||||
 | 
					     * @param obj   成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void set(int index, String obj) {
 | 
				
			||||||
 | 
					        jsonArray.set(index, new JsonPrimitive(obj));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 移除成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void remove(JsonElement obj) {
 | 
				
			||||||
 | 
					        jsonArray.remove(obj);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 移除成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void remove(Boolean obj) {
 | 
				
			||||||
 | 
					        jsonArray.remove(new JsonPrimitive(obj));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 移除成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void remove(Number obj) {
 | 
				
			||||||
 | 
					        jsonArray.remove(new JsonPrimitive(obj));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 移除成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void remove(String obj) {
 | 
				
			||||||
 | 
					        jsonArray.remove(new JsonPrimitive(obj));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 含有成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean contains(JsonElement obj) {
 | 
				
			||||||
 | 
					        return jsonArray.contains(obj);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 含有成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean contains(Boolean obj) {
 | 
				
			||||||
 | 
					        return jsonArray.contains(new JsonPrimitive(obj));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 含有成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean contains(Number obj) {
 | 
				
			||||||
 | 
					        return jsonArray.contains(new JsonPrimitive(obj));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 含有成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param obj 成员
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean contains(String obj) {
 | 
				
			||||||
 | 
					        return jsonArray.contains(new JsonPrimitive(obj));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取成员,默认值:null
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 序号
 | 
				
			||||||
 | 
					     * @return {@link TJsonObject}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public TJsonObject getJsonObject(int index) {
 | 
				
			||||||
 | 
					        return jsonArray.get(index).isJsonObject() ? TJsonObject.fromJsonObject(jsonArray.get(index).getAsJsonObject()) : null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取成员,默认值:null
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 序号
 | 
				
			||||||
 | 
					     * @return {@link TJsonArray}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public TJsonArray getJsonArray(int index) {
 | 
				
			||||||
 | 
					        return jsonArray.get(index).isJsonArray() ? TJsonArray.fromJsonArray(jsonArray.get(index).getAsJsonArray()) : null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取成员,默认值:false
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 序号
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Boolean getBoolean(int index) {
 | 
				
			||||||
 | 
					        return jsonArray.get(index).isJsonPrimitive() && jsonArray.get(index).getAsBoolean();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 序号
 | 
				
			||||||
 | 
					     * @param def   默认值
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Boolean getBoolean(int index, boolean def) {
 | 
				
			||||||
 | 
					        return jsonArray.get(index).isJsonPrimitive() ? jsonArray.get(index).getAsBoolean() : def;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取成员,默认值:0
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 序号
 | 
				
			||||||
 | 
					     * @return number
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Number getNumber(int index) {
 | 
				
			||||||
 | 
					        return jsonArray.get(index).isJsonPrimitive() ? jsonArray.get(index).getAsNumber() : 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 序号
 | 
				
			||||||
 | 
					     * @param def   默认值
 | 
				
			||||||
 | 
					     * @return number
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Number getNumber(int index, Number def) {
 | 
				
			||||||
 | 
					        return jsonArray.get(index).isJsonPrimitive() ? jsonArray.get(index).getAsNumber() : def;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取成员,默认值:null
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 序号
 | 
				
			||||||
 | 
					     * @return string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public String getString(int index) {
 | 
				
			||||||
 | 
					        return jsonArray.get(index).isJsonPrimitive() ? jsonArray.get(index).getAsString() : null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param index 序号
 | 
				
			||||||
 | 
					     * @param def   默认值
 | 
				
			||||||
 | 
					     * @return string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public String getString(int index, String def) {
 | 
				
			||||||
 | 
					        return jsonArray.get(index).isJsonPrimitive() ? jsonArray.get(index).getAsString() : def;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 成员数量
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return int
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int size() {
 | 
				
			||||||
 | 
					        return jsonArray.size();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 转换为 JsonArray 类型
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return {@link JsonArray}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public JsonArray asOriginJsonArray() {
 | 
				
			||||||
 | 
					        return jsonArray;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Iterator<TJsonObject> iterator() {
 | 
				
			||||||
 | 
					        List<TJsonObject> jsonObjectList = new ArrayList<>();
 | 
				
			||||||
 | 
					        for (JsonElement jsonElement : jsonArray) {
 | 
				
			||||||
 | 
					            jsonObjectList.add(TJsonObject.fromJsonObject(jsonElement));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return jsonObjectList.iterator();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void forEach(Consumer<? super TJsonObject> action) {
 | 
				
			||||||
 | 
					        List<TJsonObject> jsonObjectList = new ArrayList<>();
 | 
				
			||||||
 | 
					        for (JsonElement jsonElement : jsonArray) {
 | 
				
			||||||
 | 
					            jsonObjectList.add(TJsonObject.fromJsonObject(jsonElement));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        jsonObjectList.forEach(action);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Spliterator<TJsonObject> spliterator() {
 | 
				
			||||||
 | 
					        List<TJsonObject> jsonObjectList = new ArrayList<>();
 | 
				
			||||||
 | 
					        for (JsonElement jsonElement : jsonArray) {
 | 
				
			||||||
 | 
					            jsonObjectList.add(TJsonObject.fromJsonObject(jsonElement));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return jsonObjectList.spliterator();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String toString() {
 | 
				
			||||||
 | 
					        return jsonArray.toString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										251
									
								
								src/main/java/me/skymc/taboolib/common/json/TJsonObject.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								src/main/java/me/skymc/taboolib/common/json/TJsonObject.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,251 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.common.json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.gson.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.*;
 | 
				
			||||||
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-10-27 23:06
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class TJsonObject {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private JsonElement jsonObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    TJsonObject(JsonElement jsonObject) {
 | 
				
			||||||
 | 
					        this.jsonObject = jsonObject;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 从 Json 原代码中获取
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param json 源代码
 | 
				
			||||||
 | 
					     * @return {@link TJsonObject}
 | 
				
			||||||
 | 
					     * @throws JsonParseException if the specified text is not valid JSON
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static TJsonObject fromJson(String json) throws JsonParseException {
 | 
				
			||||||
 | 
					        return new TJsonObject(new JsonParser().parse(json));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 从 JsonElement 创建
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param jsonElement JsonElement 对象
 | 
				
			||||||
 | 
					     * @return {@link TJsonObject}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static TJsonObject fromJsonObject(JsonElement jsonElement) {
 | 
				
			||||||
 | 
					        return new TJsonObject(jsonElement);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 是否含有该节点
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param path 地址
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean contains(String path) {
 | 
				
			||||||
 | 
					        return get(path) != null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取文本,默认值:空
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param path 地址
 | 
				
			||||||
 | 
					     * @return String
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public String getString(String path) {
 | 
				
			||||||
 | 
					        return getString(path, "");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取文本
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param path 地址
 | 
				
			||||||
 | 
					     * @param def  默认值
 | 
				
			||||||
 | 
					     * @return String
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public String getString(String path, String def) {
 | 
				
			||||||
 | 
					        JsonElement jsonElement = get(path);
 | 
				
			||||||
 | 
					        return !(jsonElement instanceof JsonPrimitive) || jsonElement == null ? def : jsonElement.getAsString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取数字,默认值:0
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param path 地址
 | 
				
			||||||
 | 
					     * @return Number
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Number getNumber(String path) {
 | 
				
			||||||
 | 
					        return getNumber(path, 0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取数字
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param path 地址
 | 
				
			||||||
 | 
					     * @param def  默认值
 | 
				
			||||||
 | 
					     * @return Number
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Number getNumber(String path, Number def) {
 | 
				
			||||||
 | 
					        JsonElement jsonElement = get(path);
 | 
				
			||||||
 | 
					        return !(jsonElement instanceof JsonPrimitive) || jsonElement == null ? def : jsonElement.getAsNumber();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取布尔值,默认值:false
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param path 地址
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean getBoolean(String path) {
 | 
				
			||||||
 | 
					        return getBoolean(path, false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取布尔值
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param path 地址
 | 
				
			||||||
 | 
					     * @param def  默认值
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean getBoolean(String path, boolean def) {
 | 
				
			||||||
 | 
					        JsonElement jsonElement = get(path);
 | 
				
			||||||
 | 
					        return !(jsonElement instanceof JsonPrimitive) || jsonElement == null ? def : jsonElement.getAsBoolean();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取 TJsonObject 对象,默认值:null
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param path 地址
 | 
				
			||||||
 | 
					     * @return {@link TJsonObject}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public TJsonObject getJsonObject(String path) {
 | 
				
			||||||
 | 
					        JsonElement jsonElement = get(path);
 | 
				
			||||||
 | 
					        return !(jsonElement instanceof JsonObject) || jsonElement == null ? null : TJsonObject.fromJsonObject(jsonElement);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取 TJsonArray 对象,默认值:null
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param path 地址
 | 
				
			||||||
 | 
					     * @return {@link TJsonArray}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public TJsonArray getJsonArray(String path) {
 | 
				
			||||||
 | 
					        JsonElement jsonElement = get(path);
 | 
				
			||||||
 | 
					        return !(jsonElement instanceof JsonArray) || jsonElement == null ? null : TJsonArray.fromJsonArray((JsonArray) jsonElement);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取所有成员
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return {@link Map.Entry}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Set<Map.Entry<String, TJsonObject>> entrySet() {
 | 
				
			||||||
 | 
					        return !(jsonObject instanceof JsonObject) ? new HashSet<>() : ((JsonObject) jsonObject).entrySet().stream().map(jsonElementEntry -> new HashMap.SimpleEntry<>(jsonElementEntry.getKey(), fromJsonObject(jsonElementEntry.getValue()))).collect(Collectors.toCollection(HashSet::new));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取所有键
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return {@link Set}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Set<String> keySet() {
 | 
				
			||||||
 | 
					        return !(jsonObject instanceof JsonObject) ? new HashSet<>() : ((JsonObject) jsonObject).entrySet().stream().map(Map.Entry::getKey).collect(Collectors.toCollection(HashSet::new));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取所有值
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return {@link Collection}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Collection<TJsonObject> values() {
 | 
				
			||||||
 | 
					        return !(jsonObject instanceof JsonObject) ? new ArrayList<>() : ((JsonObject) jsonObject).entrySet().stream().map(jsonElementEntry -> new TJsonObject(jsonElementEntry.getValue())).collect(Collectors.toList());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 是否为 JsonObject 类型
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean isJsonObject() {
 | 
				
			||||||
 | 
					        return jsonObject instanceof JsonObject;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 是否为 JsonArray 类型
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean isJsonArray() {
 | 
				
			||||||
 | 
					        return jsonObject instanceof JsonArray;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 是否为 JsonPrimitive 类型
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean isJsonPrimitive() {
 | 
				
			||||||
 | 
					        return jsonObject instanceof JsonPrimitive;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 转换为 JsonObject 类型
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return {@link JsonObject}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public JsonObject asOriginJsonObject() {
 | 
				
			||||||
 | 
					        return (JsonObject) jsonObject;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 转换为 JsonArray 类型
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return {@link JsonArray}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public JsonArray asOriginJsonArray() {
 | 
				
			||||||
 | 
					        return (JsonArray) jsonObject;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 转换为 JsonElement 类型
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return {@link JsonElement}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public JsonElement asOriginJsonElement() {
 | 
				
			||||||
 | 
					        return jsonObject;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 转换为 JsonPrimitive 类型
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return {@link JsonPrimitive}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public JsonPrimitive asOriginJsonPrimitive() {
 | 
				
			||||||
 | 
					        return (JsonPrimitive) jsonObject;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String toString() {
 | 
				
			||||||
 | 
					        return jsonObject.toString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // *********************************
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    //         Private Methods
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // *********************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private JsonElement get(String path) {
 | 
				
			||||||
 | 
					        JsonElement subElement = jsonObject;
 | 
				
			||||||
 | 
					        for (String p : path.split("/")) {
 | 
				
			||||||
 | 
					            if (subElement instanceof JsonObject && ((JsonObject) subElement).has(p)) {
 | 
				
			||||||
 | 
					                subElement = ((JsonObject) subElement).get(p);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return subElement;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.common.packet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.common.collect.Lists;
 | 
				
			||||||
 | 
					import com.google.common.collect.Maps;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.common.packet.channel.ChannelExecutor;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.common.versioncontrol.SimpleVersionControl;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.listener.TListener;
 | 
				
			||||||
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					import org.bukkit.event.EventHandler;
 | 
				
			||||||
 | 
					import org.bukkit.event.Listener;
 | 
				
			||||||
 | 
					import org.bukkit.event.player.PlayerJoinEvent;
 | 
				
			||||||
 | 
					import org.bukkit.event.player.PlayerQuitEvent;
 | 
				
			||||||
 | 
					import org.bukkit.event.server.PluginDisableEvent;
 | 
				
			||||||
 | 
					import org.bukkit.plugin.Plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Collection;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-10-28 14:52
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@TListener
 | 
				
			||||||
 | 
					public class TPacketHandler implements Listener {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static Map<String, List<TPacketListener>> packetListeners = Maps.newHashMap();
 | 
				
			||||||
 | 
					    private static ChannelExecutor channelExecutor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public TPacketHandler() {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            channelExecutor = (ChannelExecutor) SimpleVersionControl.create()
 | 
				
			||||||
 | 
					                    .from("v1_8_R3")
 | 
				
			||||||
 | 
					                    .target("me.skymc.taboolib.common.packet.channel.InternalChannelExecutor")
 | 
				
			||||||
 | 
					                    .translate()
 | 
				
			||||||
 | 
					                    .newInstance();
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @EventHandler
 | 
				
			||||||
 | 
					    public void onJoin(PlayerJoinEvent e) {
 | 
				
			||||||
 | 
					        channelExecutor.addPlayerChannel(e.getPlayer());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @EventHandler
 | 
				
			||||||
 | 
					    public void onQuit(PlayerQuitEvent e) {
 | 
				
			||||||
 | 
					        channelExecutor.removePlayerChannel(e.getPlayer());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @EventHandler
 | 
				
			||||||
 | 
					    public void onDisable(PluginDisableEvent e) {
 | 
				
			||||||
 | 
					        removeListener(e.getPlugin());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void sendPacket(Player player, Object packet) {
 | 
				
			||||||
 | 
					        channelExecutor.sendPacket(player, packet);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void addListener(Plugin plugin, TPacketListener listener) {
 | 
				
			||||||
 | 
					        packetListeners.computeIfAbsent(plugin.getName(), name -> Lists.newArrayList()).add(listener);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void removeListener(Plugin plugin) {
 | 
				
			||||||
 | 
					        packetListeners.remove(plugin.getName());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void removeListener(Plugin plugin, TPacketListener listener) {
 | 
				
			||||||
 | 
					        Optional.ofNullable(packetListeners.get(plugin.getName())).ifPresent(list -> list.remove(listener));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static Collection<List<TPacketListener>> getListeners() {
 | 
				
			||||||
 | 
					        return packetListeners.values();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.common.packet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-10-28 14:35
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public abstract class TPacketListener {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public boolean onSend(Player player, Object packet) {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public boolean onReceive(Player player, Object packet) {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.common.packet.channel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import io.netty.channel.Channel;
 | 
				
			||||||
 | 
					import io.netty.channel.ChannelDuplexHandler;
 | 
				
			||||||
 | 
					import io.netty.channel.ChannelHandlerContext;
 | 
				
			||||||
 | 
					import io.netty.channel.ChannelPromise;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.common.packet.TPacketHandler;
 | 
				
			||||||
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Collection;
 | 
				
			||||||
 | 
					import java.util.concurrent.ExecutorService;
 | 
				
			||||||
 | 
					import java.util.concurrent.Executors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-10-28 14:34
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public abstract class ChannelExecutor {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private ExecutorService addChannelService = Executors.newSingleThreadExecutor();
 | 
				
			||||||
 | 
					    private ExecutorService removeChannelService = Executors.newSingleThreadExecutor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public abstract void sendPacket(Player player, Object packet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public abstract Channel getPlayerChannel(Player player);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void addPlayerChannel(Player player) {
 | 
				
			||||||
 | 
					        addChannelService.submit(() -> {
 | 
				
			||||||
 | 
					            getPlayerChannel(player).pipeline().addBefore("packet_handler", "taboolib_packet_handler", new ChannelHandler(player));
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void removePlayerChannel(Player player) {
 | 
				
			||||||
 | 
					        removeChannelService.submit(() -> {
 | 
				
			||||||
 | 
					            Channel playerChannel = getPlayerChannel(player);
 | 
				
			||||||
 | 
					            if (playerChannel.pipeline().get("taboolib_packet_handler") != null) {
 | 
				
			||||||
 | 
					                playerChannel.pipeline().remove("taboolib_packet_handler");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class ChannelHandler extends ChannelDuplexHandler {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private Player player;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public ChannelHandler(Player player) {
 | 
				
			||||||
 | 
					            this.player = player;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public void write(ChannelHandlerContext channelHandlerContext, Object o, ChannelPromise channelPromise) throws Exception {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                if (TPacketHandler.getListeners().stream().flatMap(Collection::stream).anyMatch(packetListener -> !packetListener.onSend(player, o))) {
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                e.printStackTrace();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            super.write(channelHandlerContext, o, channelPromise);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public void channelRead(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                if (TPacketHandler.getListeners().stream().flatMap(Collection::stream).anyMatch(packetListener -> !packetListener.onReceive(player, o))) {
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                e.printStackTrace();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            super.channelRead(channelHandlerContext, o);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.common.packet.channel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.ilummc.tlib.logger.TLogger;
 | 
				
			||||||
 | 
					import io.netty.channel.Channel;
 | 
				
			||||||
 | 
					import net.minecraft.server.v1_8_R3.Packet;
 | 
				
			||||||
 | 
					import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
 | 
				
			||||||
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-10-28 15:12
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class InternalChannelExecutor extends ChannelExecutor {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void sendPacket(Player player, Object packet) {
 | 
				
			||||||
 | 
					        if (packet instanceof Packet) {
 | 
				
			||||||
 | 
					            ((CraftPlayer) player).getHandle().playerConnection.sendPacket((Packet) packet);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            TLogger.getGlobalLogger().warn("Invalid packet: " + packet.getClass().getName());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Channel getPlayerChannel(Player player) {
 | 
				
			||||||
 | 
					        return ((CraftPlayer) player).getHandle().playerConnection.networkManager.channel;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user