+ nbt util

This commit is contained in:
坏黑 2019-05-25 00:08:37 +08:00
parent ad7d0c9d93
commit b09dfbde60
8 changed files with 662 additions and 10 deletions

View File

@ -5,7 +5,7 @@ plugins {
id 'com.github.johnrengelman.shadow' version '4.0.4'
}
group = 'me.skymc'
version = '4.81'
version = '4.82'
sourceCompatibility = 1.8
targetCompatibility = 1.8

View File

@ -172,9 +172,6 @@
'item.minecraft.dandelion_yellow': '蒲公英黄'
'item.minecraft.dark_oak_boat': '深色橡木船'
'item.minecraft.debug_stick': '调试棒'
'item.minecraft.debug_stick.empty': '%s不具备属性'
'item.minecraft.debug_stick.select': '已选择“%s”%s'
'item.minecraft.debug_stick.update': '将\'%s\'设为%s'
'item.minecraft.diamond': '钻石'
'item.minecraft.diamond_axe': '钻石斧'
'item.minecraft.diamond_boots': '钻石靴子'

View File

@ -1,6 +1,7 @@
package me.skymc.taboolib.common.nms;
import me.skymc.taboolib.common.function.TFunction;
import me.skymc.taboolib.common.nms.nbt.NBTCompound;
import me.skymc.taboolib.common.versioncontrol.SimpleVersionControl;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
@ -23,6 +24,8 @@ public abstract class NMSHandler {
}
}
abstract public double[] getTPS();
abstract public String getName(ItemStack itemStack);
abstract public String getName(Entity entity);
@ -31,7 +34,13 @@ public abstract class NMSHandler {
abstract public void sendActionBar(Player player, String text);
abstract public double[] getTPS();
abstract public ItemStack saveNBT(ItemStack itemStack, NBTCompound compound);
abstract public Object _NBT(ItemStack itemStack);
public NBTCompound loadNBT(ItemStack itemStack) {
return (NBTCompound) _NBT(itemStack);
}
public static NMSHandler getHandler() {
return handler;

View File

@ -1,16 +1,16 @@
package me.skymc.taboolib.common.nms;
import me.skymc.taboolib.TabooLib;
import me.skymc.taboolib.common.nms.nbt.NBTCompound;
import me.skymc.taboolib.common.packet.TPacketHandler;
import me.skymc.taboolib.common.util.SimpleReflection;
import me.skymc.taboolib.nms.NMSUtils;
import net.minecraft.server.v1_12_R1.ChatMessageType;
import net.minecraft.server.v1_12_R1.EntityVillager;
import net.minecraft.server.v1_12_R1.MinecraftServer;
import net.minecraft.server.v1_12_R1.NBTTagCompound;
import net.minecraft.server.v1_13_R2.IRegistry;
import net.minecraft.server.v1_8_R3.ChatComponentText;
import net.minecraft.server.v1_8_R3.PacketPlayOutChat;
import net.minecraft.server.v1_8_R3.PacketPlayOutTitle;
import net.minecraft.server.v1_8_R3.*;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftVillager;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
import org.bukkit.entity.Entity;
@ -20,6 +20,9 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @Author 坏黑
@ -27,8 +30,22 @@ import java.lang.reflect.Field;
*/
public class NMSHandlerImpl extends NMSHandler {
private final int VERSION = TabooLib.getVersionNumber();
private Field entityTypesField;
static {
SimpleReflection.saveField(NBTTagString.class);
SimpleReflection.saveField(NBTTagDouble.class);
SimpleReflection.saveField(NBTTagInt.class);
SimpleReflection.saveField(NBTTagFloat.class);
SimpleReflection.saveField(NBTTagShort.class);
SimpleReflection.saveField(NBTTagLong.class);
SimpleReflection.saveField(NBTTagByte.class);
SimpleReflection.saveField(NBTTagIntArray.class);
SimpleReflection.saveField(NBTTagByteArray.class);
SimpleReflection.saveField(NBTTagList.class);
}
public NMSHandlerImpl() {
if (TabooLib.getVersionNumber() >= 11300) {
for (Field declaredField : NMSUtils.getNMSClass("Entity").getDeclaredFields()) {
@ -41,6 +58,11 @@ public class NMSHandlerImpl extends NMSHandler {
}
}
@Override
public double[] getTPS() {
return MinecraftServer.getServer().recentTps;
}
@Override
public String getName(ItemStack itemStack) {
Object nmsItem = CraftItemStack.asNMSCopy(itemStack);
@ -153,7 +175,85 @@ public class NMSHandlerImpl extends NMSHandler {
}
@Override
public double[] getTPS() {
return MinecraftServer.getServer().recentTps;
public ItemStack saveNBT(ItemStack itemStack, NBTCompound compound) {
Object nmsItem = CraftItemStack.asNMSCopy(itemStack);
try {
((net.minecraft.server.v1_8_R3.ItemStack) nmsItem).setTag((net.minecraft.server.v1_8_R3.NBTTagCompound) toNBTBase(compound));
} catch (Throwable t) {
t.printStackTrace();
}
return CraftItemStack.asBukkitCopy((net.minecraft.server.v1_8_R3.ItemStack) nmsItem);
}
@Override
public Object _NBT(ItemStack itemStack) {
Object nmsItem = CraftItemStack.asNMSCopy(itemStack);
try {
return ((net.minecraft.server.v1_8_R3.ItemStack) nmsItem).hasTag() ? fromNBTBase(((net.minecraft.server.v1_8_R3.ItemStack) nmsItem).getTag()) : new NBTCompound();
} catch (Throwable t) {
t.printStackTrace();
}
return new NBTCompound();
}
private Object toNBTBase(me.skymc.taboolib.common.nms.nbt.NBTBase base) {
switch (base.getType()) {
case INT:
return new NBTTagInt(base.asInt());
case BYTE:
return new NBTTagByte(base.asByte());
case LONG:
return new NBTTagLong(base.asLong());
case FLOAT:
return new NBTTagFloat(base.asFloat());
case SHORT:
return new NBTTagShort(base.asShort());
case DOUBLE:
return new NBTTagDouble(base.asDouble());
case STRING:
return new NBTTagString(base.asString());
case INT_ARRAY:
return new NBTTagIntArray(base.asIntArray());
case BYTE_ARRAY:
return new NBTTagByteArray(base.asByteArray());
case LIST:
Object nmsList = new NBTTagList();
base.asList().forEach(value -> ((NBTTagList) nmsList).add((net.minecraft.server.v1_8_R3.NBTBase) toNBTBase(value)));
return nmsList;
case COMPOUND:
Object nmsTag = new net.minecraft.server.v1_8_R3.NBTTagCompound();
base.asCompound().forEach((k, v) -> ((net.minecraft.server.v1_8_R3.NBTTagCompound) nmsTag).set(k, (net.minecraft.server.v1_8_R3.NBTBase) toNBTBase(v)));
return nmsTag;
}
return null;
}
private Object fromNBTBase(Object base) {
if (base instanceof NBTTagString) {
return new me.skymc.taboolib.common.nms.nbt.NBTBase(SimpleReflection.getFieldValue(NBTTagString.class, base, "data", ""));
} else if (base instanceof NBTTagDouble) {
return new me.skymc.taboolib.common.nms.nbt.NBTBase(SimpleReflection.getFieldValue(NBTTagDouble.class, base, "data", 0D));
} else if (base instanceof NBTTagInt) {
return new me.skymc.taboolib.common.nms.nbt.NBTBase(SimpleReflection.getFieldValue(NBTTagInt.class, base, "data", 0));
} else if (base instanceof NBTTagFloat) {
return new me.skymc.taboolib.common.nms.nbt.NBTBase(SimpleReflection.getFieldValue(NBTTagFloat.class, base, "data", (float) 0));
} else if (base instanceof NBTTagShort) {
return new me.skymc.taboolib.common.nms.nbt.NBTBase(SimpleReflection.getFieldValue(NBTTagShort.class, base, "data", (short) 0));
} else if (base instanceof NBTTagLong) {
return new me.skymc.taboolib.common.nms.nbt.NBTBase(SimpleReflection.getFieldValue(NBTTagLong.class, base, "data", 0L));
} else if (base instanceof NBTTagByte) {
return new me.skymc.taboolib.common.nms.nbt.NBTBase(SimpleReflection.getFieldValue(NBTTagByte.class, base, "data", (byte) 0D));
} else if (base instanceof NBTTagIntArray) {
return new me.skymc.taboolib.common.nms.nbt.NBTBase(SimpleReflection.getFieldValue(NBTTagIntArray.class, base, "data", new int[0]));
} else if (base instanceof NBTTagByteArray) {
return new me.skymc.taboolib.common.nms.nbt.NBTBase(SimpleReflection.getFieldValue(NBTTagByteArray.class, base, "data", new byte[0]));
} else if (base instanceof net.minecraft.server.v1_8_R3.NBTTagCompound) {
Set<String> keys = VERSION >= 11300 ? ((net.minecraft.server.v1_13_R2.NBTTagCompound) base).getKeys() : ((net.minecraft.server.v1_8_R3.NBTTagCompound) base).c();
return keys.stream().collect(Collectors.toMap(key -> key, key -> (me.skymc.taboolib.common.nms.nbt.NBTBase) fromNBTBase(((net.minecraft.server.v1_13_R2.NBTTagCompound) base).get(key)), (a, b) -> b, me.skymc.taboolib.common.nms.nbt.NBTCompound::new));
} else if (base instanceof NBTTagList) {
List list = (List) SimpleReflection.getFieldValue(NBTTagList.class, base, "list");
return list.stream().map(this::fromNBTBase).collect(Collectors.toCollection(me.skymc.taboolib.common.nms.nbt.NBTList::new));
}
return null;
}
}

View File

@ -0,0 +1,147 @@
package me.skymc.taboolib.common.nms.nbt;
import java.util.Arrays;
import java.util.Objects;
/**
* @Author 坏黑
* @Since 2019-05-24 17:45
*/
public class NBTBase {
protected NBTType type;
protected Object data;
public NBTBase(String data) {
this.type = NBTType.STRING;
this.data = data;
}
public NBTBase(byte data) {
this.type = NBTType.BYTE;
this.data = data;
}
public NBTBase(byte[] data) {
this.type = NBTType.BYTE_ARRAY;
this.data = data;
}
public NBTBase(int data) {
this.type = NBTType.INT;
this.data = data;
}
public NBTBase(int[] data) {
this.type = NBTType.INT_ARRAY;
this.data = data;
}
public NBTBase(double data) {
this.type = NBTType.DOUBLE;
this.data = data;
}
public NBTBase(float data) {
this.type = NBTType.FLOAT;
this.data = data;
}
public NBTBase(short data) {
this.type = NBTType.SHORT;
this.data = data;
}
public NBTBase(long data) {
this.type = NBTType.LONG;
this.data = data;
}
public NBTBase(NBTCompound data) {
this.type = NBTType.COMPOUND;
this.data = data;
}
public NBTBase(NBTList data) {
this.type = NBTType.LIST;
this.data = data;
}
public String asString() {
return (String) data;
}
public byte asByte() {
return (byte) data;
}
public byte[] asByteArray() {
return (byte[]) data;
}
public int asInt() {
return (int) data;
}
public int[] asIntArray() {
return (int[]) data;
}
public double asDouble() {
return (double) data;
}
public float asFloat() {
return (float) data;
}
public short asShort() {
return (short) data;
}
public long asLong() {
return (long) data;
}
public NBTCompound asCompound() {
return (NBTCompound) data;
}
public NBTList asList() {
return (NBTList) data;
}
public NBTType getType() {
return type;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof NBTBase)) {
return false;
}
NBTBase nbtBase = (NBTBase) o;
return getType() == nbtBase.getType() &&
Objects.equals(data, nbtBase.data);
}
@Override
public int hashCode() {
return Objects.hash(getType(), data);
}
@Override
public String toString() {
switch (type) {
case INT_ARRAY:
return Arrays.toString(asIntArray());
case BYTE_ARRAY:
return Arrays.toString(asByteArray());
default:
return String.valueOf(data);
}
}
}

View File

@ -0,0 +1,162 @@
package me.skymc.taboolib.common.nms.nbt;
import com.google.common.collect.Maps;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Function;
/**
* @Author 坏黑
* @Since 2019-05-24 17:44
*/
public class NBTCompound extends NBTBase implements Map<String, NBTBase> {
private Map<String, NBTBase> value = Maps.newConcurrentMap();
public NBTCompound() {
super(0);
this.type = NBTType.COMPOUND;
}
@Override
public int size() {
return value.size();
}
@Override
public boolean isEmpty() {
return value.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return value.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return this.value.containsValue(value);
}
@Override
public NBTBase get(Object key) {
return value.get(key);
}
@Override
public NBTBase put(String key, NBTBase value) {
return this.value.put(key, value);
}
@Override
public NBTBase remove(Object key) {
return value.remove(key);
}
@Override
public void putAll(Map m) {
this.value.putAll(m);
}
@Override
public void clear() {
this.value.clear();
}
@Override
public Set keySet() {
return this.value.keySet();
}
@Override
public Collection values() {
return this.value.values();
}
@Override
public Set<Entry<String, NBTBase>> entrySet() {
return this.value.entrySet();
}
@Override
public NBTBase getOrDefault(Object key, NBTBase defaultValue) {
return this.value.getOrDefault(key, defaultValue);
}
@Override
public void forEach(BiConsumer<? super String, ? super NBTBase> action) {
this.value.forEach(action);
}
@Override
public void replaceAll(BiFunction<? super String, ? super NBTBase, ? extends NBTBase> function) {
this.value.replaceAll(function);
}
@Override
public NBTBase putIfAbsent(String key, NBTBase value) {
return this.value.putIfAbsent(key, value);
}
@Override
public boolean remove(Object key, Object value) {
return this.value.remove(key, value);
}
@Override
public boolean replace(String key, NBTBase oldValue, NBTBase newValue) {
return this.value.replace(key, oldValue, newValue);
}
@Override
public NBTBase replace(String key, NBTBase value) {
return this.value.replace(key, value);
}
@Override
public NBTBase computeIfAbsent(String key, Function<? super String, ? extends NBTBase> mappingFunction) {
return this.value.computeIfAbsent(key, mappingFunction);
}
@Override
public NBTBase computeIfPresent(String key, BiFunction<? super String, ? super NBTBase, ? extends NBTBase> remappingFunction) {
return this.value.computeIfPresent(key, remappingFunction);
}
@Override
public NBTBase compute(String key, BiFunction<? super String, ? super NBTBase, ? extends NBTBase> remappingFunction) {
return this.value.compute(key, remappingFunction);
}
@Override
public NBTBase merge(String key, NBTBase value, BiFunction<? super NBTBase, ? super NBTBase, ? extends NBTBase> remappingFunction) {
return this.value.merge(key, value, remappingFunction);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof NBTCompound)) {
return false;
}
NBTCompound that = (NBTCompound) o;
return Objects.equals(value, that.value);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), value);
}
@Override
public String toString() {
return String.valueOf(value);
}
}

View File

@ -0,0 +1,195 @@
package me.skymc.taboolib.common.nms.nbt;
import com.google.common.collect.Lists;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;
/**
* @Author 坏黑
* @Since 2019-05-24 18:37
*/
public class NBTList extends NBTBase implements List<NBTBase> {
private List<NBTBase> value = Lists.newCopyOnWriteArrayList();
public NBTList() {
super(0);
this.type = NBTType.LIST;
}
@Override
public int size() {
return value.size();
}
@Override
public boolean isEmpty() {
return value.isEmpty();
}
@Override
public boolean contains(Object o) {
return value.contains(0);
}
@Override
public Iterator<NBTBase> iterator() {
return value.iterator();
}
@Override
public Object[] toArray() {
return value.toArray();
}
@Override
public <T> T[] toArray(T[] a) {
return value.toArray(a);
}
@Override
public boolean add(NBTBase base) {
return value.add(base);
}
@Override
public boolean remove(Object o) {
return value.remove(o);
}
@Override
public boolean containsAll(Collection<?> c) {
return value.containsAll(c);
}
@Override
public boolean addAll(Collection<? extends NBTBase> c) {
return value.addAll(c);
}
@Override
public boolean addAll(int index, Collection<? extends NBTBase> c) {
return value.addAll(index, c);
}
@Override
public boolean removeAll(Collection<?> c) {
return value.removeAll(c);
}
@Override
public boolean removeIf(Predicate<? super NBTBase> filter) {
return value.removeIf(filter);
}
@Override
public boolean retainAll(Collection<?> c) {
return value.retainAll(c);
}
@Override
public void replaceAll(UnaryOperator<NBTBase> operator) {
value.replaceAll(operator);
}
@Override
public void sort(Comparator<? super NBTBase> c) {
value.sort(c);
}
@Override
public void clear() {
value.clear();
}
@Override
public NBTBase get(int index) {
return value.get(index);
}
@Override
public NBTBase set(int index, NBTBase element) {
return value.set(index, element);
}
@Override
public void add(int index, NBTBase element) {
value.add(index, element);
}
@Override
public NBTBase remove(int index) {
return value.remove(index);
}
@Override
public int indexOf(Object o) {
return value.indexOf(o);
}
@Override
public int lastIndexOf(Object o) {
return value.lastIndexOf(o);
}
@Override
public ListIterator<NBTBase> listIterator() {
return value.listIterator();
}
@Override
public ListIterator<NBTBase> listIterator(int index) {
return value.listIterator(index);
}
@Override
public List<NBTBase> subList(int fromIndex, int toIndex) {
return value.subList(fromIndex, toIndex);
}
@Override
public Spliterator<NBTBase> spliterator() {
return value.spliterator();
}
@Override
public Stream<NBTBase> stream() {
return value.stream();
}
@Override
public Stream<NBTBase> parallelStream() {
return value.parallelStream();
}
@Override
public void forEach(Consumer<? super NBTBase> action) {
value.forEach(action);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof NBTList)) {
return false;
}
NBTList nbtBases = (NBTList) o;
return Objects.equals(value, nbtBases.value);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), value);
}
@Override
public String toString() {
return String.valueOf(value);
}
}

View File

@ -0,0 +1,42 @@
package me.skymc.taboolib.common.nms.nbt;
/**
* @Author 坏黑
* @Since 2019-05-24 17:46
*/
public enum NBTType {
END(0),
BYTE(1),
SHORT(2),
INT(3),
LONG(4),
FLOAT(5),
DOUBLE(6),
BYTE_ARRAY(7),
INT_ARRAY(11),
STRING(8),
LIST(9),
COMPOUND(10);
private int id;
NBTType(int i) {
this.id = i;
}
public int getId() {
return this.id;
}
}