/*
* This file is part of Skript.
*
* Skript is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Skript is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
*
*
* Copyright 2011-2014 Peter Güttinger
*
*/
package ch.njol.skript.entity;
import java.util.ArrayList;
import org.bukkit.entity.Minecart;
import org.bukkit.entity.PoweredMinecart;
import org.bukkit.entity.StorageMinecart;
import org.bukkit.entity.minecart.ExplosiveMinecart;
import org.bukkit.entity.minecart.HopperMinecart;
import org.bukkit.entity.minecart.RideableMinecart;
import org.bukkit.entity.minecart.SpawnerMinecart;
import org.eclipse.jdt.annotation.Nullable;
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.variables.Variables;
/**
* @author Peter Güttinger
*/
@SuppressWarnings("deprecation")
public class MinecartData extends EntityData<Minecart> {
@SuppressWarnings("null")
private static enum MinecartType {
ANY(Minecart.class, "minecart"),
NORMAL(Skript.classExists("org.bukkit.entity.minecart.RideableMinecart") ? RideableMinecart.class : Minecart.class, "regular minecart"),
STORAGE(Skript.classExists("org.bukkit.entity.minecart.StorageMinecart") ? org.bukkit.entity.minecart.StorageMinecart.class : StorageMinecart.class, "storage minecart"),
POWERED(Skript.classExists("org.bukkit.entity.minecart.PoweredMinecart") ? org.bukkit.entity.minecart.PoweredMinecart.class : PoweredMinecart.class, "powered minecart"),
// 1.5
HOPPER(Skript.classExists("org.bukkit.entity.minecart.HopperMinecart") ? HopperMinecart.class : null, "hopper minecart"),
EXPLOSIVE(Skript.classExists("org.bukkit.entity.minecart.ExplosiveMinecart") ? ExplosiveMinecart.class : null, "explosive minecart"),
SPAWNER(Skript.classExists("org.bukkit.entity.minecart.SpawnerMinecart") ? SpawnerMinecart.class : null, "spawner minecart");
@Nullable
final Class<? extends Minecart> c;
private final String codeName;
MinecartType(final @Nullable Class<? extends Minecart> c, final String codeName) {
this.c = c;
this.codeName = codeName;
}
@Override
public String toString() {
return codeName;
}
public static String[] codeNames;
static {
final ArrayList<String> cn = new ArrayList<String>();
for (final MinecartType t : values()) {
if (t.c != null)
cn.add(t.codeName);
}
codeNames = cn.toArray(new String[0]);
}
}
static {
register(MinecartData.class, "minecart", Minecart.class, 0, MinecartType.codeNames);
Variables.yggdrasil.registerSingleClass(MinecartType.class, "MinecartType");
}
private MinecartType type = MinecartType.ANY;
public MinecartData() {}
public MinecartData(final MinecartType type) {
this.type = type;
}
@SuppressWarnings("null")
@Override
protected boolean init(final Literal<?>[] exprs, final int matchedPattern, final ParseResult parseResult) {
type = MinecartType.values()[matchedPattern];
return true;
}
@SuppressWarnings("null")
@Override
protected boolean init(final @Nullable Class<? extends Minecart> c, final @Nullable Minecart e) {
final MinecartType[] ts = MinecartType.values();
for (int i = ts.length - 1; i >= 0; i--) {
final Class<?> mc = ts[i].c;
if (mc == null)
continue;
if (e == null ? mc.isAssignableFrom(c) : mc.isInstance(e)) {
type = ts[i];
return true;
}
}
assert false;
return false;
}
@Override
public void set(final Minecart entity) {}
@Override
public boolean match(final Minecart entity) {
if (type == MinecartType.NORMAL && type.c == Minecart.class) // pre-1.5
return !(entity instanceof PoweredMinecart || entity instanceof StorageMinecart);
return type.c != null && type.c.isInstance(entity);
}
@Override
public Class<? extends Minecart> getType() {
return type.c != null ? type.c : Minecart.class;
}
@Override
protected int hashCode_i() {
return type.hashCode();
}
@Override
protected boolean equals_i(final EntityData<?> obj) {
if (!(obj instanceof MinecartData))
return false;
final MinecartData other = (MinecartData) obj;
return type == other.type;
}
// return type.name();
@Override
protected boolean deserialize(final String s) {
try {
type = MinecartType.valueOf(s);
return true;
} catch (final IllegalArgumentException e) {
return false;
}
}
@Override
public boolean isSupertypeOf(final EntityData<?> e) {
if (e instanceof MinecartData)
return type == MinecartType.ANY || ((MinecartData) e).type == type;
return false;
}
@Override
public EntityData getSuperType() {
return new MinecartData(type);
}
}