/*
* 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.hooks.regions;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.eclipse.jdt.annotation.Nullable;
import ch.njol.skript.hooks.Hook;
import ch.njol.skript.hooks.regions.classes.Region;
import ch.njol.skript.variables.Variables;
import ch.njol.yggdrasil.ClassResolver;
/**
* @author Peter Güttinger
*/
// REMIND support more plugins?
public abstract class RegionsPlugin<P extends Plugin> extends Hook<P> {
public RegionsPlugin() throws IOException {}
public static Collection<RegionsPlugin<?>> plugins = new ArrayList<RegionsPlugin<?>>(2);
static {
Variables.yggdrasil.registerClassResolver(new ClassResolver() {
@Override
@Nullable
public String getID(final Class<?> c) {
for (final RegionsPlugin<?> p : plugins)
if (p.getRegionClass() == c)
return c.getClass().getSimpleName();
return null;
}
@Override
@Nullable
public Class<?> getClass(final String id) {
for (final RegionsPlugin<?> p : plugins)
if (id.equals(p.getRegionClass().getSimpleName()))
return p.getRegionClass();
return null;
}
});
}
@Override
protected boolean init() {
plugins.add(this);
return true;
}
public abstract boolean canBuild_i(Player p, Location l);
public final static boolean canBuild(final Player p, final Location l) {
for (final RegionsPlugin<?> pl : plugins) {
if (!pl.canBuild_i(p, l))
return false;
}
return true;
}
public abstract Collection<? extends Region> getRegionsAt_i(Location l);
public final static Set<? extends Region> getRegionsAt(final Location l) {
final Set<Region> r = new HashSet<Region>();
for (final RegionsPlugin<?> pl : plugins) {
r.addAll(pl.getRegionsAt_i(l));
}
return r;
}
@Nullable
public abstract Region getRegion_i(World world, String name);
@Nullable
public final static Region getRegion(final World world, final String name) {
for (final RegionsPlugin<?> pl : plugins) {
return pl.getRegion_i(world, name);
}
return null;
}
public abstract boolean hasMultipleOwners_i();
public final static boolean hasMultipleOwners() {
for (final RegionsPlugin<?> pl : plugins) {
if (pl.hasMultipleOwners_i())
return true;
}
return false;
}
protected abstract Class<? extends Region> getRegionClass();
@Nullable
public static RegionsPlugin<?> getPlugin(final String name) {
for (final RegionsPlugin<?> pl : plugins) {
if (pl.getName().equalsIgnoreCase(name))
return pl;
}
return null;
}
}