This commit is contained in:
坏黑
2019-04-01 21:45:49 +08:00
parent 57ac4e072c
commit 629bc77803
63 changed files with 2204 additions and 4592 deletions

View File

@@ -20,7 +20,7 @@ import java.util.Map;
*/
public class TInjectLoader implements TabooLibLoader.Loader {
private static Map<Class<?>, TInjectTask> injectTypes = Maps.newHashMap();
private static Map<Class<?>, TInjectTask> injectTypes = Maps.newLinkedHashMap();
static {
// Instance Inject
@@ -50,11 +50,7 @@ public class TInjectLoader implements TabooLibLoader.Loader {
// TConfiguration Inject
injectTypes.put(TConfiguration.class, (plugin, field, args, instance) -> {
try {
if (args.length == 0) {
TLogger.getGlobalLogger().error("Invalid inject arguments: " + field.getName() + " (" + field.getType().getName() + ")");
} else {
field.set(instance, TConfiguration.createInResource(plugin, args[0]));
}
field.set(instance, TConfiguration.createInResource(plugin, args.length == 0 ? "config.yml" : args[0]));
} catch (Exception e) {
e.printStackTrace();
}

View File

@@ -1,7 +1,5 @@
package me.skymc.taboolib.common.nms;
import me.skymc.taboolib.TabooLib;
import me.skymc.taboolib.commands.builder.SimpleCommandBuilder;
import me.skymc.taboolib.common.function.TFunction;
import me.skymc.taboolib.common.versioncontrol.SimpleVersionControl;
import org.bukkit.entity.Player;
@@ -21,11 +19,6 @@ public abstract class NMSHandler {
} catch (Exception e) {
e.printStackTrace();
}
SimpleCommandBuilder.create("title", TabooLib.instance())
.execute((sender, args) -> {
handler.sendTitle((Player) sender, "TabooLib", 10, 40, 10, "author Bkm016", 10, 40, 10);
return true;
}).build();
}
abstract public void sendTitle(Player player, String title, int titleFadein, int titleStay, int titleFadeout, String subtitle, int subtitleFadein, int subtitleStay, int subtitleFadeout);

View File

@@ -0,0 +1,20 @@
package me.skymc.taboolib.common.serialize;
/**
* @Author 坏黑
* @Since 2019-03-08 17:28
*/
public interface TSerializable {
void read(String fieldName, String value);
String write(String fieldName, Object value);
default void read(String value) {
TSerializer.read(this, value);
}
default String write() {
return TSerializer.write(this);
}
}

View File

@@ -0,0 +1,149 @@
package me.skymc.taboolib.common.serialize;
import ch.njol.skript.classes.ConfigurationSerializer;
import com.google.gson.*;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
/**
* @Author 坏黑
* @Since 2019-03-08 17:31
*/
public class TSerializer {
public static <T extends ConfigurationSerializable> T read(String value, Class<T> type) {
return ConfigurationSerializer.deserializeCS(value, type);
}
public static TSerializable read(TSerializable serializable, String serializedString) {
try {
JsonObject jsonObject = (JsonObject) new JsonParser().parse(serializedString);
if (jsonObject.has("serializeObject")) {
JsonObject serializeObject = jsonObject.getAsJsonObject("serializeObject");
for (Map.Entry<String, JsonElement> jsonElementEntry : serializeObject.entrySet()) {
try {
Field declaredField = serializable.getClass().getDeclaredField(jsonElementEntry.getKey());
declaredField.setAccessible(true);
Optional<TSerializerElementGeneral> serializer = Arrays.stream(TSerializerElementGeneral.values()).filter(serializerElements -> serializerElements.getSerializer().matches(declaredField.getType())).findFirst();
if (serializer.isPresent()) {
declaredField.set(serializable, serializer.get().getSerializer().read(jsonElementEntry.getValue().getAsString()));
} else {
serializable.read(jsonElementEntry.getKey(), jsonElementEntry.getValue().getAsString());
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}
} catch (Throwable t) {
t.printStackTrace();
}
return serializable;
}
public static String write(ConfigurationSerializable serializable) {
return ConfigurationSerializer.serializeCS(serializable);
}
public static String write(TSerializable serializable) {
JsonObject jsonObject = new JsonObject();
JsonObject serializeObject = new JsonObject();
for (Field declaredField : serializable.getClass().getDeclaredFields()) {
try {
if (!Modifier.isStatic(declaredField.getModifiers())) {
declaredField.setAccessible(true);
Optional<TSerializerElementGeneral> serializer = Arrays.stream(TSerializerElementGeneral.values()).filter(serializerElements -> serializerElements.getSerializer().matches(declaredField.getType())).findFirst();
Object o = declaredField.get(serializable);
if (o == null) {
continue;
}
if (serializer.isPresent()) {
serializeObject.addProperty(declaredField.getName(), serializer.get().getSerializer().write(o));
} else {
Optional.ofNullable(serializable.write(declaredField.getName(), o)).ifPresent(value -> serializeObject.addProperty(declaredField.getName(), value));
}
}
} catch (Throwable t) {
t.printStackTrace();
}
}
jsonObject.add("serializeObject", serializeObject);
return jsonObject.toString();
}
public static void readMap(Map map, String serializedString, TSerializerElementGeneral elementKey, TSerializerElementGeneral elementValue) {
readMap(map, serializedString, elementKey.getSerializer(), elementValue.getSerializer());
}
public static void readMap(Map map, String serializedString, TSerializerElement elementKey, TSerializerElement elementValue) {
try {
JsonObject jsonObject = (JsonObject) new JsonParser().parse(serializedString);
for (Map.Entry<String, JsonElement> jsonElementEntry : jsonObject.entrySet()) {
try {
map.put(elementKey.read(jsonElementEntry.getKey()), elementValue.read(jsonElementEntry.getValue().getAsString()));
} catch (Throwable t) {
t.printStackTrace();
}
}
} catch (Throwable t) {
t.printStackTrace();
}
}
public static String writeMap(Map<?, ?> map, TSerializerElementGeneral elementKey, TSerializerElementGeneral elementValue) {
return writeMap(map, elementKey.getSerializer(), elementValue.getSerializer());
}
public static String writeMap(Map<?, ?> map, TSerializerElement elementKey, TSerializerElement elementValue) {
JsonObject jsonObject = new JsonObject();
for (Map.Entry<?, ?> entry : map.entrySet()) {
try {
jsonObject.addProperty(elementKey.write(entry.getKey()), elementValue.write(entry.getValue()));
} catch (Throwable t) {
t.printStackTrace();
}
}
return jsonObject.toString();
}
public static void readCollection(Collection collection, String serializedString, TSerializerElementGeneral elementValue) {
readCollection(collection, serializedString, elementValue.getSerializer());
}
public static void readCollection(Collection collection, String serializedString, TSerializerElement elementValue) {
try {
JsonArray jsonArray = (JsonArray) new JsonParser().parse(serializedString);
for (JsonElement jsonElement : jsonArray) {
try {
collection.add(elementValue.read(jsonElement.getAsString()));
} catch (Throwable t) {
t.printStackTrace();
}
}
} catch (Throwable t) {
t.printStackTrace();
}
}
public static String writeCollection(Collection collection, TSerializerElementGeneral elementValue) {
return writeCollection(collection, elementValue.getSerializer());
}
public static String writeCollection(Collection collection, TSerializerElement elementValue) {
JsonArray jsonArray = new JsonArray();
for (Object object : collection) {
try {
jsonArray.add(new JsonPrimitive(elementValue.write(object)));
} catch (Throwable t) {
t.printStackTrace();
}
}
return jsonArray.toString();
}
}

View File

@@ -0,0 +1,15 @@
package me.skymc.taboolib.common.serialize;
/**
* @Author 坏黑
* @Since 2019-03-08 17:28
*/
public interface TSerializerElement<T> {
T read(String value);
String write(Object value);
boolean matches(Class objectClass);
}

View File

@@ -0,0 +1,217 @@
package me.skymc.taboolib.common.serialize;
import ch.njol.skript.classes.ConfigurationSerializer;
import me.skymc.taboolib.other.NumberUtils;
import org.bukkit.Location;
import org.bukkit.inventory.ItemStack;
import java.util.Objects;
/**
* @Author 坏黑
* @Since 2019-03-10 18:49
*/
public enum TSerializerElementGeneral {
STRING(new TSerializerElement() {
@Override
public String read(String value) {
return String.valueOf(value);
}
@Override
public String write(Object value) {
return Objects.toString(value);
}
@Override
public boolean matches(Class objectClass) {
return String.class.equals(objectClass);
}
}),
INT(new TSerializerElement() {
@Override
public Integer read(String value) {
try {
return Integer.parseInt(value);
} catch (Throwable t) {
t.printStackTrace();
}
return 0;
}
@Override
public String write(Object value) {
return Objects.toString(value);
}
@Override
public boolean matches(Class objectClass) {
return Integer.class.equals(objectClass) || Integer.TYPE.equals(objectClass);
}
}),
LONG(new TSerializerElement() {
@Override
public Long read(String value) {
try {
return Long.parseLong(value);
} catch (Throwable t) {
t.printStackTrace();
}
return 0L;
}
@Override
public String write(Object value) {
return Objects.toString(value);
}
@Override
public boolean matches(Class objectClass) {
return Long.class.equals(objectClass) || Long.TYPE.equals(objectClass);
}
}),
SHORT(new TSerializerElement() {
@Override
public Short read(String value) {
try {
return Short.parseShort(value);
} catch (Throwable t) {
t.printStackTrace();
}
return (short) 0;
}
@Override
public String write(Object value) {
return Objects.toString(value);
}
@Override
public boolean matches(Class objectClass) {
return Short.class.equals(objectClass) || Short.TYPE.equals(objectClass);
}
}),
DOUBLE(new TSerializerElement() {
@Override
public Double read(String value) {
try {
return Double.parseDouble(value);
} catch (Throwable t) {
t.printStackTrace();
}
return 0D;
}
@Override
public String write(Object value) {
return Objects.toString(value);
}
@Override
public boolean matches(Class objectClass) {
return Double.class.equals(objectClass) || Boolean.TYPE.equals(objectClass);
}
}),
FLOAT(new TSerializerElement() {
@Override
public Float read(String value) {
try {
return Float.parseFloat(value);
} catch (Throwable t) {
t.printStackTrace();
}
return 0f;
}
@Override
public String write(Object value) {
return Objects.toString(value);
}
@Override
public boolean matches(Class objectClass) {
return Float.class.equals(objectClass) || Float.TYPE.equals(objectClass);
}
}),
BOOLEAN(new TSerializerElement() {
@Override
public Boolean read(String value) {
try {
return NumberUtils.getBooleanAbbreviation(value);
} catch (Throwable t) {
t.printStackTrace();
}
return false;
}
@Override
public String write(Object value) {
return Objects.toString(value);
}
@Override
public boolean matches(Class objectClass) {
return Boolean.class.equals(objectClass) || Boolean.TYPE.equals(objectClass);
}
}),
ITEM_STACK(new TSerializerElement() {
@Override
public ItemStack read(String value) {
return ConfigurationSerializer.deserializeCS(value, ItemStack.class);
}
@Override
public String write(Object value) {
return ConfigurationSerializer.serializeCS((ItemStack) value);
}
@Override
public boolean matches(Class objectClass) {
return ItemStack.class.equals(objectClass);
}
}),
LOCATION(new TSerializerElement() {
@Override
public Location read(String value) {
return ConfigurationSerializer.deserializeCS(value, Location.class);
}
@Override
public String write(Object value) {
return ConfigurationSerializer.serializeCS((Location) value);
}
@Override
public boolean matches(Class objectClass) {
return Location.class.equals(objectClass);
}
});
private TSerializerElement serializer;
TSerializerElementGeneral(TSerializerElement serializer) {
this.serializer = serializer;
}
public TSerializerElement getSerializer() {
return serializer;
}
}

View File

@@ -0,0 +1,85 @@
package me.skymc.taboolib.common.serialize;
import com.google.common.collect.Lists;
import java.util.Collection;
import java.util.List;
/**
* @Author 坏黑
* @Since 2019-04-01 17:49
*/
public class TSerializerExample {
public static void main(String[] args) {
// 创建对象
SimpleData date = new SimpleData();
// 修改参数
date.number = 100;
// 序列化
String value = date.write();
// 打印
System.out.println(value);
// 创建新的对象
SimpleData dataCopy = new SimpleData();
// 反序列化
dataCopy.read(value);
// 打印
System.out.println(dataCopy);
}
/**
* 创建序列化类
* 实现 TSerializable 接口
*/
public static class SimpleData implements TSerializable {
/**
* 基本类型不需要手动进行序列化
* 包含: String、int、short、long、double、float、boolean、ItemStack、Location
*/
private String text;
private int number;
/**
* 特殊类型需要进行手动序列化
* 本工具提供了基本容器的序列化方法
*/
private List<Double> list = Lists.newArrayList();
/**
* 基本类型不会执行以下两个方法
* 由 TSerializer 自动进行序列化和反序列化步骤
*/
@Override
public void read(String fieldName, String value) {
switch (fieldName) {
case "list": {
// List 类型可以直接通过 TSerializer 提供的预设方法进行反序列化
TSerializer.readCollection(list, value, TSerializerElementGeneral.DOUBLE);
break;
}
default:
}
}
@Override
public String write(String fieldName, Object value) {
switch (fieldName) {
case "list": {
// 序列化同理
return TSerializer.writeCollection((Collection) value, TSerializerElementGeneral.DOUBLE);
}
}
return null;
}
@Override
public String toString() {
return "SimpleData{" +
"text='" + text + '\'' +
", number=" + number +
", list=" + list +
'}';
}
}
}