package com.intellectualcrafters.plot.flag;
import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotArea;
import com.intellectualcrafters.plot.object.RunnableVal;
import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.MathMan;
import com.intellectualcrafters.plot.util.StringMan;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
public final class Flags {
public static final IntegerFlag MUSIC = new IntegerFlag("music");
public static final StringFlag DESCRIPTION = new StringFlag("description");
public static final IntegerListFlag ANALYSIS = (IntegerListFlag) new IntegerListFlag("analysis").reserve();
public static final StringFlag GREETING = new StringFlag("greeting");
public static final StringFlag FAREWELL = new StringFlag("farewell");
public static final IntervalFlag FEED = new IntervalFlag("feed");
public static final IntervalFlag HEAL = new IntervalFlag("heal");
public static final GameModeFlag GAMEMODE = new GameModeFlag("gamemode");
public static final GameModeFlag GUEST_GAMEMODE = new GameModeFlag("guest-gamemode");
public static final StringFlag DONE = (StringFlag) new StringFlag("done").reserve();
public static final BooleanFlag REDSTONE = new BooleanFlag("redstone");
public static final BooleanFlag FLY = new BooleanFlag("fly");
public static final BooleanFlag NOTIFY_LEAVE = new BooleanFlag("notify-leave");
public static final BooleanFlag TITLES = new BooleanFlag("titles");
public static final BooleanFlag NOTIFY_ENTER = new BooleanFlag("notify-enter");
public static final LongFlag TIME = new LongFlag("time");
public static final PlotWeatherFlag WEATHER = new PlotWeatherFlag("weather");
public static final DoubleFlag PRICE = new DoubleFlag("price") {
@Override
public Double parseValue(String input) {
Double value = super.parseValue(input);
return value != null && value > 0 ? value : null;
}
@Override
public String getValueDescription() {
return "Flag value must be a positive number.";
}
};
public static final BooleanFlag EXPLOSION = new BooleanFlag("explosion");
public static final BooleanFlag GRASS_GROW = new BooleanFlag("grass-grow");
public static final BooleanFlag VINE_GROW = new BooleanFlag("vine-grow");
public static final BooleanFlag MYCEL_GROW = new BooleanFlag("mycel-grow");
public static final BooleanFlag DISABLE_PHYSICS = new BooleanFlag("disable-physics");
public static final BooleanFlag LIQUID_FLOW = new BooleanFlag("liquid-flow");
public static final BooleanFlag SNOW_MELT = new BooleanFlag("snow-melt");
public static final BooleanFlag SNOW_FORM = new BooleanFlag("snow-form");
public static final BooleanFlag ICE_MELT = new BooleanFlag("ice-melt");
public static final BooleanFlag FIRE_SPREAD = new BooleanFlag("fire-spread");
public static final BooleanFlag BLOCK_BURN = new BooleanFlag("block-burn");
public static final BooleanFlag ICE_FORM = new BooleanFlag("ice-form");
public static final BooleanFlag BLOCK_IGNITION = new BooleanFlag("block-ignition");
public static final BooleanFlag SOIL_DRY = new BooleanFlag("soil-dry");
public static final StringListFlag BLOCKED_CMDS = new StringListFlag("blocked-cmds");
public static final PlotBlockListFlag USE = new PlotBlockListFlag("use");
public static final PlotBlockListFlag BREAK = new PlotBlockListFlag("break");
public static final PlotBlockListFlag PLACE = new PlotBlockListFlag("place");
public static final BooleanFlag DEVICE_INTERACT = new BooleanFlag("device-interact");
public static final BooleanFlag VEHICLE_BREAK = new BooleanFlag("vehicle-break");
public static final BooleanFlag VEHICLE_PLACE = new BooleanFlag("vehicle-place");
public static final BooleanFlag VEHICLE_USE = new BooleanFlag("vehicle-use");
public static final BooleanFlag HANGING_BREAK = new BooleanFlag("hanging-break");
public static final BooleanFlag HANGING_PLACE = new BooleanFlag("hanging-place");
public static final BooleanFlag HANGING_INTERACT = new BooleanFlag("hanging-interact");
public static final BooleanFlag MISC_PLACE = new BooleanFlag("misc-place");
public static final BooleanFlag MISC_BREAK = new BooleanFlag("misc-break");
public static final BooleanFlag MISC_INTERACT = new BooleanFlag("misc-interact");
public static final BooleanFlag VILLAGER_INTERACT = new BooleanFlag("villager-interact");
public static final BooleanFlag PLAYER_INTERACT = new BooleanFlag("player-interact");
public static final BooleanFlag TAMED_ATTACK = new BooleanFlag("tamed-attack");
public static final BooleanFlag TAMED_INTERACT = new BooleanFlag("tamed-interact");
public static final BooleanFlag ANIMAL_ATTACK = new BooleanFlag("animal-attack");
public static final BooleanFlag ANIMAL_INTERACT = new BooleanFlag("animal-interact");
public static final BooleanFlag HOSTILE_ATTACK = new BooleanFlag("hostile-attack");
public static final BooleanFlag HOSTILE_INTERACT = new BooleanFlag("hostile-interact");
public static final BooleanFlag MOB_PLACE = new BooleanFlag("mob-place");
public static final BooleanFlag FORCEFIELD = new BooleanFlag("forcefield");
public static final BooleanFlag INVINCIBLE = new BooleanFlag("invincible");
public static final BooleanFlag ITEM_DROP = new BooleanFlag("item-drop");
public static final BooleanFlag INSTABREAK = new BooleanFlag("instabreak");
public static final BooleanFlag DROP_PROTECTION = new BooleanFlag("drop-protection");
public static final BooleanFlag PVP = new BooleanFlag("pvp");
public static final BooleanFlag PVE = new BooleanFlag("pve");
public static final BooleanFlag NO_WORLDEDIT = new BooleanFlag("no-worldedit");
public static final IntegerFlag MISC_CAP = new IntegerFlag("misc-cap");
public static final IntegerFlag ENTITY_CAP = new IntegerFlag("entity-cap");
public static final IntegerFlag MOB_CAP = new IntegerFlag("mob-cap");
public static final IntegerFlag ANIMAL_CAP = new IntegerFlag("animal-cap");
public static final IntegerFlag HOSTILE_CAP = new IntegerFlag("hostile-cap");
public static final IntegerFlag VEHICLE_CAP = new IntegerFlag("vehicle-cap");
public static final Flag<?> KEEP = new Flag("keep") {
@Override public String valueToString(Object value) {
return value.toString();
}
@Override public Object parseValue(String value) {
if (MathMan.isInteger(value)) {
return Long.parseLong(value);
}
switch (value.toLowerCase()) {
case "true":
return true;
case "false":
return false;
default:
return MainUtil.timeToSec(value) * 1000 + System.currentTimeMillis();
}
}
@Override public String getValueDescription() {
return "Flag value must a timestamp or a boolean";
}
};
public static final BooleanFlag SLEEP = new BooleanFlag("sleep");
public static final TeleportDenyFlag DENY_TELEPORT = new TeleportDenyFlag("deny-teleport");
public static final BooleanFlag DENY_EXIT = new BooleanFlag("deny-exit");
private static final HashMap<String, Flag<?>> flags;
static {
flags = new HashMap<>();
try {
for (Field field : Flags.class.getFields()) {
String fieldName = field.getName().replace("_","-").toLowerCase();
Object fieldValue = field.get(null);
if (!(fieldValue instanceof Flag)) {
continue;
}
Flag flag = (Flag) fieldValue;
if (!flag.getName().equals(fieldName)) {
PS.debug(Flags.class + "Field doesn't match: " + fieldName + " != " + flag.getName());
}
flags.put(flag.getName(), flag);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Get an immutable collection of registered flags.
*
* @return a collection of registered flags.
*/
public static Collection<Flag<?>> getFlags() {
return Collections.unmodifiableCollection(flags.values());
}
public static Flag<?> getFlag(String flag) {
return flags.get(flag);
}
public static void registerFlag(final Flag<?> flag) {
final Flag<?> duplicate = flags.put(flag.getName(), flag);
if (duplicate != null) {
PS.get().foreachPlotArea(new RunnableVal<PlotArea>() {
@Override public void run(PlotArea value) {
Object remove;
if (value.DEFAULT_FLAGS.containsKey(duplicate)) {
remove = value.DEFAULT_FLAGS.remove(duplicate);
try {
if (remove instanceof Collection && remove.getClass().getMethod("toString").getDeclaringClass() == Object.class) {
value.DEFAULT_FLAGS.put(flag, flag.parseValue(StringMan.join((Collection) remove, ',')));
} else {
value.DEFAULT_FLAGS.put(flag, flag.parseValue("" + remove));
}
} catch (NoSuchMethodException neverHappens) {
neverHappens.printStackTrace();
}
}
}
});
PS.get().foreachPlotRaw(new RunnableVal<Plot>() {
@Override public void run(Plot value) {
if (value.getFlags().containsKey(duplicate)) {
Object remove = value.getFlags().remove(duplicate);
try {
if (remove instanceof Collection && remove.getClass().getMethod("toString").getDeclaringClass() == Object.class) {
value.getFlags().put(flag, flag.parseValue(StringMan.join((Collection) remove, ',')));
} else {
value.getFlags().put(flag, flag.parseValue("" + remove));
}
} catch (NoSuchMethodException neverHappens) {
neverHappens.printStackTrace();
}
}
}
});
}
}
}