MassiveCore - Editor Improvements. Only single singletons. Shared annotation for inner types.

This commit is contained in:
Olof Larsson 2016-06-08 13:00:40 +02:00
parent 2d8f10eb00
commit bec8286fb6
No known key found for this signature in database
GPG Key ID: BBEF14F97DA52474
21 changed files with 279 additions and 168 deletions

View File

@ -214,12 +214,10 @@
"HIDE_UNBREAKABLE"
...
]
banner-base: byte (dye color) // It seems this one never is used
banner-base: byte (dye color)
banner:
[
str (pattern id), byte (dye color),
str (pattern id), byte (dye color),
str (pattern id), byte (dye color),
*banner-pattern*
...
]

View File

@ -9,7 +9,6 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockMultiPlaceEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.scheduler.BukkitTask;
import com.massivecraft.massivecore.collections.MassiveSet;

View File

@ -9,6 +9,7 @@ import org.bukkit.permissions.Permissible;
import com.massivecraft.massivecore.command.editor.annotation.EditorName;
import com.massivecraft.massivecore.command.editor.annotation.EditorType;
import com.massivecraft.massivecore.command.type.TypeMillisDiff;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanOn;
import com.massivecraft.massivecore.store.Entity;
import com.massivecraft.massivecore.util.MUtil;
import com.massivecraft.massivecore.util.PermissionUtil;
@ -122,7 +123,7 @@ public class MassiveCoreMConf extends Entity<MassiveCoreMConf>
@EditorType(TypeMillisDiff.class)
public volatile long millisBetweenRemotePollWithPusher = TimeUnit.MILLIS_PER_MINUTE * 1;
@EditorType(fieldName = "iOn")
@EditorType(TypeBooleanOn.class)
public boolean warnOnLocalAlter = false;
// -------------------------------------------- //

View File

@ -11,8 +11,8 @@ import org.bukkit.entity.Player;
import com.massivecraft.massivecore.command.editor.annotation.EditorName;
import com.massivecraft.massivecore.command.editor.annotation.EditorNullable;
import com.massivecraft.massivecore.command.editor.annotation.EditorType;
import com.massivecraft.massivecore.command.type.TypeId;
import com.massivecraft.massivecore.command.type.enumeration.TypeSound;
import com.massivecraft.massivecore.command.type.enumeration.TypeSoundId;
import com.massivecraft.massivecore.util.MUtil;
public final class SoundEffect implements Serializable
@ -25,7 +25,7 @@ public final class SoundEffect implements Serializable
@EditorNullable(false)
@EditorName("sound")
@EditorType(value = TypeId.class, fieldName = "iSound")
@EditorType(TypeSoundId.class)
private final String soundId;
public String getSoundId() { return this.soundId; }
public Sound getSound()

View File

@ -3,7 +3,7 @@ package com.massivecraft.massivecore.command;
import java.util.List;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.type.primitive.TypeBoolean;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanOn;
import com.massivecraft.massivecore.util.Txt;
public abstract class MassiveCommandToggle extends MassiveCommand
@ -29,7 +29,7 @@ public abstract class MassiveCommandToggle extends MassiveCommand
public MassiveCommandToggle()
{
// Parameters
this.addParameter(TypeBoolean.getOn(), "on|off", "toggle");
this.addParameter(TypeBooleanOn.get(), "on|off", "toggle");
}
// -------------------------------------------- //
@ -60,7 +60,7 @@ public abstract class MassiveCommandToggle extends MassiveCommand
// Args
boolean before = this.getValue();
boolean after = this.readArg( ! before);
String afterDesc = TypeBoolean.getOn().getVisual(after, sender);
String afterDesc = TypeBooleanOn.get().getVisual(after, sender);
// NoChange
if (after == before)

View File

@ -9,9 +9,5 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
public @interface EditorType
{
// This is the type class.
Class<?> value() default void.class;
// The name of the singleton instance field to use.
String fieldName() default "i";
Class<?> value();
}

View File

@ -7,11 +7,7 @@ import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EditorTypeSet
public @interface EditorTypeInner
{
// This is the type class.
Class<?> value();
// The name of the singleton instance field to use.
String fieldName() default "i";
Class<?>[] value();
}

View File

@ -1,17 +0,0 @@
package com.massivecraft.massivecore.command.editor.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EditorTypeList
{
// This is the type class.
Class<?> value();
// The name of the singleton instance field to use.
String fieldName() default "i";
}

View File

@ -1,19 +0,0 @@
package com.massivecraft.massivecore.command.editor.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EditorTypeMap
{
// This is the type class.
Class<?> typeKey();
Class<?> typeValue();
// The name of the singleton instance field to use.
String fieldNameKey() default "i";
String fieldNameValue() default "i";
}

View File

@ -14,7 +14,7 @@ import com.massivecraft.massivecore.command.Visibility;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.command.type.TypeItemStack;
import com.massivecraft.massivecore.command.type.primitive.TypeBoolean;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanYes;
import com.massivecraft.massivecore.mson.Mson;
import com.massivecraft.massivecore.util.InventoryUtil;
@ -30,7 +30,7 @@ public class CmdMassiveCoreTest extends MassiveCommand
this.addAliases("test");
// Parameters
this.addParameter(false, TypeBoolean.getYes(), "set", "no");
this.addParameter(false, TypeBooleanYes.get(), "set", "no");
// Requirements
this.addRequirements(RequirementHasPerm.get(MassiveCorePerm.TEST));

View File

@ -8,12 +8,11 @@ import java.util.Map.Entry;
import java.util.Set;
import com.massivecraft.massivecore.collections.ExceptionSet;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.collections.MassiveMap;
import com.massivecraft.massivecore.collections.WorldExceptionSet;
import com.massivecraft.massivecore.command.editor.annotation.EditorType;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeList;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeMap;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeSet;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeInner;
import com.massivecraft.massivecore.command.type.combined.TypeDataBannerPattern;
import com.massivecraft.massivecore.command.type.combined.TypeDataPotionEffect;
import com.massivecraft.massivecore.command.type.combined.TypeEntry;
@ -44,7 +43,7 @@ import com.massivecraft.massivecore.command.type.enumeration.TypeSkeletonType;
import com.massivecraft.massivecore.command.type.enumeration.TypeSound;
import com.massivecraft.massivecore.command.type.enumeration.TypeVillagerProfession;
import com.massivecraft.massivecore.command.type.enumeration.TypeWorldType;
import com.massivecraft.massivecore.command.type.primitive.TypeBoolean;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanTrue;
import com.massivecraft.massivecore.command.type.primitive.TypeByte;
import com.massivecraft.massivecore.command.type.primitive.TypeDouble;
import com.massivecraft.massivecore.command.type.primitive.TypeFloat;
@ -64,111 +63,171 @@ public class RegistryType
// -------------------------------------------- //
private static final Map<Class<?>, Type<?>> registry = new MassiveMap<>();
public static <T> void register(Class<T> clazz, Type<? super T> type)
{
if (clazz == null) throw new NullPointerException("clazz");
if (type == null) throw new NullPointerException("type");
registry.put(clazz, type);
}
public static <T> void register(Type<T> type)
{
if (type == null) throw new NullPointerException("type");
register(type.getClazz(), type);
}
@SuppressWarnings("unchecked")
public static <T> Type<? super T> unregister(Class<T> clazz)
{
if (clazz == null) throw new NullPointerException("clazz");
return (Type<T>) registry.remove(clazz);
}
public static boolean isRegistered(Class<?> clazz)
{
if (clazz == null) throw new NullPointerException("clazz");
return registry.containsKey(clazz);
}
public static Type<?> getType(Field field)
{
try
{
EditorType annotation = field.getAnnotation(EditorType.class);
if (annotation != null)
{
Class<?> clazz = annotation.value();
if (clazz == void.class) clazz = getType(field.getGenericType()).getClass();
return getType(clazz, annotation.fieldName());
}
// -------------------------------------------- //
// GET TYPE
// -------------------------------------------- //
EditorTypeList annList = field.getAnnotation(EditorTypeList.class);
if (annList != null)
public static Type<?> getType(Field field, java.lang.reflect.Type fieldType, boolean strictThrow)
{
return TypeList.get(getType(annList.value(), annList.fieldName()));
}
EditorTypeSet annSet = field.getAnnotation(EditorTypeSet.class);
if (annSet != null)
if (field != null)
{
return TypeSet.get(getType(annSet.value(), annSet.fieldName()));
}
EditorTypeMap annMap = field.getAnnotation(EditorTypeMap.class);
if (annMap != null)
EditorType annotationType = ReflectionUtil.getAnnotation(field, EditorType.class);
if (annotationType != null)
{
return TypeMap.get(getType(annMap.typeKey(), annMap.fieldNameKey()), getType(annMap.typeValue(), annMap.fieldNameValue()));
}
}
catch (Throwable t)
{
// This has to do with backwards compatibility (Usually 1.7).
// The EditorType annotations may trigger creation of type class instances.
// Those type classes may refer to Bukkit classes not present.
// This issue was first encountered for TypeDataItemStack.
}
return getType(field.getGenericType());
}
private static Type<?> getType(Class<?> clazz, String fieldName)
{
return ReflectionUtil.getField(clazz, fieldName, null);
}
public static Type<?> getType(java.lang.reflect.Type reflectType)
{
if (reflectType instanceof Class)
{
Type<?> type = registry.get(reflectType);
if (type == null) throw new IllegalStateException(reflectType + " is not registered.");
Class<?> typeClass = annotationType.value();
Type<?> type = ReflectionUtil.getSingletonInstance(typeClass);
return type;
}
if (reflectType instanceof ParameterizedType)
if (fieldType == null)
{
ParameterizedType paramType = (ParameterizedType) reflectType;
Class<?> parent = (Class<?>) paramType.getRawType();
if (Map.class.isAssignableFrom(parent))
{
TypeEntry<?, ?> typeEntry = TypeEntry.get(getType(paramType.getActualTypeArguments()[0]), getType(paramType.getActualTypeArguments()[1]));
return TypeMap.get(typeEntry);
}
if (List.class.isAssignableFrom(parent))
{
return TypeList.get(getType(paramType.getActualTypeArguments()[0]));
}
if (Set.class.isAssignableFrom(parent))
{
return TypeSet.get(getType(paramType.getActualTypeArguments()[0]));
}
if (Entry.class.isAssignableFrom(parent))
{
return TypeEntry.get(getType(paramType.getActualTypeArguments()[0]), getType(paramType.getActualTypeArguments()[1]));
fieldType = field.getGenericType();
}
}
throw new IllegalArgumentException("Unknown type: " + reflectType);
if (fieldType != null)
{
if (fieldType instanceof ParameterizedType)
{
Class<?> fieldClass = field.getType();
List<Type<?>> innerTypes;
if (List.class.isAssignableFrom(fieldClass))
{
innerTypes = getInnerTypes(field, fieldType, 1);
return TypeList.get(innerTypes.get(0));
}
if (Set.class.isAssignableFrom(fieldClass))
{
innerTypes = getInnerTypes(field, fieldType, 1);
return TypeSet.get(innerTypes.get(0));
}
if (Entry.class.isAssignableFrom(fieldClass))
{
innerTypes = getInnerTypes(field, fieldType, 2);
return TypeEntry.get(innerTypes.get(0), innerTypes.get(1));
}
if (Map.class.isAssignableFrom(fieldClass))
{
innerTypes = getInnerTypes(field, fieldType, 2);
return TypeMap.get(innerTypes.get(0), innerTypes.get(1));
}
if (strictThrow) throw new IllegalArgumentException("Unhandled ParameterizedType: " + fieldType);
return null;
}
if (fieldType instanceof Class)
{
Type<?> type = registry.get(fieldType);
if (strictThrow && type == null) throw new IllegalStateException(fieldType + " is not registered.");
return type;
}
throw new IllegalArgumentException("Neither ParameterizedType nor Class: " + fieldType);
}
throw new IllegalArgumentException("No Information Supplied");
}
public static Type<?> getType(Field field, boolean strictThrow)
{
return getType(field, null, strictThrow);
}
public static Type<?> getType(java.lang.reflect.Type fieldType, boolean strictThrow)
{
return getType(null, fieldType, strictThrow);
}
public static Type<?> getType(Field field)
{
return getType(field, true);
}
public static Type<?> getType(java.lang.reflect.Type fieldType)
{
return getType(fieldType, true);
}
// -------------------------------------------- //
// GET INNER TYPES
// -------------------------------------------- //
public static List<Type<?>> getInnerTypes(Field field, java.lang.reflect.Type fieldType, int amountRequired)
{
// Create
List<Type<?>> ret = new MassiveList<>();
// Fill > Annotation
if (field != null)
{
EditorTypeInner annotation = ReflectionUtil.getAnnotation(field, EditorTypeInner.class);
if (annotation != null)
{
Class<?>[] innerTypeClasses = annotation.value();
for (Class<?> innerTypeClass : innerTypeClasses)
{
Type<?> innerType = ReflectionUtil.getSingletonInstance(innerTypeClass);
ret.add(innerType);
}
}
if (fieldType == null)
{
fieldType = field.getGenericType();
}
}
// Fill > Reflection
if (fieldType != null)
{
if (fieldType instanceof ParameterizedType)
{
ParameterizedType parameterizedType = (ParameterizedType)fieldType;
int count = 0;
for (java.lang.reflect.Type actualTypeArgument : parameterizedType.getActualTypeArguments())
{
boolean strictThrow = (amountRequired < 0 || count < amountRequired);
Type<?> innerType = getType(actualTypeArgument, strictThrow);
ret.add(innerType);
count++;
}
}
}
// Return
return ret;
}
// -------------------------------------------- //
@ -181,8 +240,8 @@ public class RegistryType
public static void registerAll()
{
// Primitive
register(Boolean.TYPE, TypeBoolean.getTrue());
register(Boolean.class, TypeBoolean.getTrue());
register(Boolean.TYPE, TypeBooleanTrue.get());
register(Boolean.class, TypeBooleanTrue.get());
register(Byte.TYPE, TypeByte.get());
register(Byte.class, TypeByte.get());
@ -222,6 +281,14 @@ public class RegistryType
try
{
register(TypeRabbitType.get());
}
catch (Throwable t)
{
}
try
{
register(TypeDamageModifier.get());
}
catch (Throwable t)

View File

@ -1,24 +1,30 @@
package com.massivecraft.massivecore.command.type.convert;
import org.bukkit.block.banner.PatternType;
import com.massivecraft.massivecore.command.type.Type;
import com.massivecraft.massivecore.command.type.enumeration.TypePatternType;
import com.massivecraft.massivecore.command.type.primitive.TypeString;
import com.massivecraft.massivecore.item.Converter;
import com.massivecraft.massivecore.item.ConverterFromBannerPatternType;
import com.massivecraft.massivecore.item.ConverterToBannerPatternType;
public class TypeConverterBannerPatternType extends TypeConverter<PatternType, String>
// Minecraft 1.7 Compatibility
public class TypeConverterBannerPatternType<A> extends TypeConverter<A, String>
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static TypeConverterBannerPatternType i = new TypeConverterBannerPatternType();
public static TypeConverterBannerPatternType get() { return i; }
public TypeConverterBannerPatternType()
private static TypeConverterBannerPatternType<?> i = null;
@SuppressWarnings("unchecked")
public static <T> TypeConverterBannerPatternType<T> get()
{
super(TypePatternType.get(), TypeString.get(), ConverterFromBannerPatternType.get(), ConverterToBannerPatternType.get());
if (i == null) i = new TypeConverterBannerPatternType<>(TypePatternType.get(), ConverterFromBannerPatternType.get(), ConverterToBannerPatternType.get());
return (TypeConverterBannerPatternType<T>) i;
}
public TypeConverterBannerPatternType(Type<A> typeA, Converter<A, String> a2b, Converter<String, A> b2a)
{
super(typeA, TypeString.get(), a2b, b2a);
}
}

View File

@ -0,0 +1,20 @@
package com.massivecraft.massivecore.command.type.enumeration;
import org.bukkit.Sound;
import com.massivecraft.massivecore.command.type.TypeId;
public class TypeSoundId extends TypeId<Sound>
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static TypeSoundId i = new TypeSoundId();
public static TypeSoundId get() { return i; }
public TypeSoundId()
{
super(TypeSound.get());
}
}

View File

@ -8,36 +8,32 @@ import org.bukkit.command.CommandSender;
import com.massivecraft.massivecore.collections.MassiveSet;
import com.massivecraft.massivecore.command.type.TypeAbstractChoice;
public class TypeBoolean extends TypeAbstractChoice<Boolean>
public abstract class TypeBooleanAbstract extends TypeAbstractChoice<Boolean>
{
// -------------------------------------------- //
// CONSTANTS
// -------------------------------------------- //
public static final String NAME_YES = "Yes";
public static final String NAME_TRUE = "True";
public static final String NAME_ON = "On";
public static final String NAME_NO = "No";
public static final String NAME_FALSE = "False";
public static final String NAME_OFF = "Off";
public static final Set<String> NAMES_TRUE = new MassiveSet<String>(
"Yes",
"True",
"On"
NAME_YES,
NAME_TRUE,
NAME_ON
);
public static final Set<String> NAMES_FALSE = new MassiveSet<String>(
"No",
"False",
"Off"
NAME_NO,
NAME_FALSE,
NAME_OFF
);
// -------------------------------------------- //
// INSTANCE
// -------------------------------------------- //
private static TypeBoolean iYes = new TypeBoolean("Yes", "No");
private static TypeBoolean iTrue = new TypeBoolean("True", "False");
private static TypeBoolean iOn = new TypeBoolean("On", "Off");
public static TypeBoolean getYes() { return iYes; }
public static TypeBoolean getTrue() { return iTrue; }
public static TypeBoolean getOn() { return iOn; }
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
@ -52,7 +48,7 @@ public class TypeBoolean extends TypeAbstractChoice<Boolean>
// CONSTRUCT
// -------------------------------------------- //
public TypeBoolean(String t, String f)
public TypeBooleanAbstract(String t, String f)
{
super(Boolean.class);
this.stringTrue = t;

View File

@ -0,0 +1,16 @@
package com.massivecraft.massivecore.command.type.primitive;
public class TypeBooleanOn extends TypeBooleanAbstract
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static TypeBooleanOn i = new TypeBooleanOn();
public static TypeBooleanOn get() { return i; }
public TypeBooleanOn()
{
super(NAME_ON, NAME_OFF);
}
}

View File

@ -0,0 +1,16 @@
package com.massivecraft.massivecore.command.type.primitive;
public class TypeBooleanTrue extends TypeBooleanAbstract
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static TypeBooleanTrue i = new TypeBooleanTrue();
public static TypeBooleanTrue get() { return i; }
public TypeBooleanTrue()
{
super(NAME_TRUE, NAME_FALSE);
}
}

View File

@ -0,0 +1,16 @@
package com.massivecraft.massivecore.command.type.primitive;
public class TypeBooleanYes extends TypeBooleanAbstract
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static TypeBooleanYes i = new TypeBooleanYes();
public static TypeBooleanYes get() { return i; }
public TypeBooleanYes()
{
super(NAME_YES, NAME_NO);
}
}

View File

@ -12,7 +12,7 @@ import org.bukkit.FireworkEffect;
import com.massivecraft.massivecore.collections.MassiveListDef;
import com.massivecraft.massivecore.command.editor.annotation.EditorMethods;
import com.massivecraft.massivecore.command.editor.annotation.EditorType;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeList;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeInner;
import com.massivecraft.massivecore.command.type.convert.TypeConverterColor;
import com.massivecraft.massivecore.command.type.convert.TypeConverterFireworkEffectType;
import com.massivecraft.massivecore.comparator.ComparatorSmart;
@ -46,12 +46,12 @@ public class DataFireworkEffect implements Comparable<DataFireworkEffect>
public boolean hasTrail() { return get(this.trail, DEFAULT_TRAIL); }
public DataFireworkEffect setTrail(boolean trail) { this.trail = set(trail, DEFAULT_TRAIL); return this; }
@EditorTypeList(TypeConverterColor.class)
@EditorTypeInner(TypeConverterColor.class)
private MassiveListDef<Integer> colors = null;
public List<Integer> getColors() { return get(this.colors, DEFAULT_COLORS); }
public DataFireworkEffect setColors(List<Integer> colors) { this.colors = set(colors, DEFAULT_COLORS); return this; }
@EditorTypeList(TypeConverterColor.class)
@EditorTypeInner(TypeConverterColor.class)
@SerializedName("fade-colors")
private MassiveListDef<Integer> fadeColors = null;
public List<Integer> getFadeColors() { return get(this.fadeColors, DEFAULT_FADE_COLORS); }

View File

@ -18,9 +18,7 @@ import com.massivecraft.massivecore.collections.MassiveTreeMapDef;
import com.massivecraft.massivecore.collections.MassiveTreeSetDef;
import com.massivecraft.massivecore.command.editor.annotation.EditorMethods;
import com.massivecraft.massivecore.command.editor.annotation.EditorType;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeList;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeMap;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeSet;
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeInner;
import com.massivecraft.massivecore.command.type.TypeMaterialId;
import com.massivecraft.massivecore.command.type.convert.TypeConverterColor;
import com.massivecraft.massivecore.command.type.convert.TypeConverterDyeColor;
@ -107,7 +105,7 @@ public class DataItemStack implements Comparable<DataItemStack>
public String getName() { return get(this.name, DEFAULT_NAME); }
public DataItemStack setName(String name) { this.name = set(name, DEFAULT_NAME); return this; }
@EditorTypeList(TypeStringParsed.class)
@EditorTypeInner(TypeStringParsed.class)
private MassiveListDef<String> lore = null;
public List<String> getLore() { return get(this.lore, DEFAULT_LORE); }
public DataItemStack setLore(List<String> lore) { this.lore = set(lore, DEFAULT_LORE); return this; }
@ -115,7 +113,7 @@ public class DataItemStack implements Comparable<DataItemStack>
// The Bukkit ItemMeta#getEnchants() is not sorted by the enchant id.
// There may be some sort of custom sorting order, I'm not sure.
// We are however enforcing sorting by the enchant id ourselves to be sure.
@EditorTypeMap(typeKey = TypeConverterEnchant.class, typeValue = TypeInteger.class)
@EditorTypeInner({TypeConverterEnchant.class, TypeInteger.class})
private MassiveTreeMapDef<Integer, Integer, ComparatorSmart> enchants = null;
public Map<Integer, Integer> getEnchants() { return get(this.enchants, DEFAULT_ENCHANTS); }
public DataItemStack setEnchants(Map<Integer, Integer> enchants) { this.enchants = set(enchants, DEFAULT_ENCHANTS); return this; }
@ -137,7 +135,7 @@ public class DataItemStack implements Comparable<DataItemStack>
public String getAuthor() { return get(this.author, DEFAULT_AUTHOR); }
public DataItemStack setAuthor(String author) { this.author = set(author, DEFAULT_AUTHOR); return this; }
@EditorTypeList(TypeStringParsed.class)
@EditorTypeInner(TypeStringParsed.class)
private MassiveListDef<String> pages = null;
public List<String> getPages() { return get(this.pages, DEFAULT_PAGES); }
public DataItemStack setPages(Collection<String> pages) { this.pages = set(pages, DEFAULT_PAGES); return this; }
@ -206,7 +204,7 @@ public class DataItemStack implements Comparable<DataItemStack>
// FIELDS > STORED ENCHANTS
// -------------------------------------------- //
@EditorTypeMap(typeKey = TypeConverterEnchant.class, typeValue = TypeInteger.class)
@EditorTypeInner({TypeConverterEnchant.class, TypeInteger.class})
@SerializedName("stored-enchants")
private MassiveTreeMapDef<Integer, Integer, ComparatorSmart> storedEnchants = null;
public Map<Integer, Integer> getStoredEnchants() { return get(this.storedEnchants, DEFAULT_STORED_ENCHANTS); }
@ -226,7 +224,7 @@ public class DataItemStack implements Comparable<DataItemStack>
// -------------------------------------------- //
// SINCE: 1.8
@EditorTypeSet(TypeConverterItemFlag.class)
@EditorTypeInner(TypeConverterItemFlag.class)
private MassiveTreeSetDef<String, ComparatorSmart> flags = null;
public Set<String> getFlags() { return get(this.flags, DEFAULT_FLAGS); }
public DataItemStack setFlags(Set<String> flags) { this.flags = set(flags, DEFAULT_FLAGS); return this; }

View File

@ -6,7 +6,7 @@ import java.util.List;
import com.massivecraft.massivecore.Engine;
import com.massivecraft.massivecore.MassiveCoreMConf;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.command.type.primitive.TypeBoolean;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanOn;
import com.massivecraft.massivecore.util.MUtil;
import com.massivecraft.massivecore.util.ReflectionUtil;
import com.massivecraft.massivecore.util.Txt;
@ -114,7 +114,7 @@ public abstract class WriterAbstract<OA, OB, CA, CB, FA, FB, D> extends Engine
String message;
// Main
message = Txt.parse("<h>%s %s", name, TypeBoolean.getOn().getVisual(success));
message = Txt.parse("<h>%s %s", name, TypeBooleanOn.get().getVisual(success));
messages.add(message);
// Throwable

View File

@ -1,5 +1,6 @@
package com.massivecraft.massivecore.util;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
@ -240,6 +241,27 @@ public class ReflectionUtil
return fallback;
}
// -------------------------------------------- //
// ANNOTATION
// -------------------------------------------- //
public static <T extends Annotation> T getAnnotation(Field field, Class<T> annotationClass)
{
// Fail Fast
if (field == null) throw new NullPointerException("field");
if (annotationClass == null) throw new NullPointerException("annotationClass");
try
{
return field.getAnnotation(annotationClass);
}
catch (Throwable t)
{
t.printStackTrace();
return null;
}
}
// -------------------------------------------- //
// FIELD > GET
// -------------------------------------------- //