package com.bergerkiller.bukkit.common.internal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import me.snowleo.bleedingmobs.BleedingMobs;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.plugin.Plugin;
import regalowl.hyperconomy.HyperConomy;
import com.bergerkiller.bukkit.common.filtering.Filter;
import com.kellerkindt.scs.ShowCaseStandalone;
import com.narrowtux.showcase.Showcase;
public class CommonEntityBlacklist implements Filter<Entity> {
private final List<BlacklistFilter> availableFilters = new ArrayList<BlacklistFilter>();
public CommonEntityBlacklist() {
// ===============================================
// ==== Initialize all available filters here ====
// ===============================================
// Showcase
availableFilters.add(new BlacklistFilter("Showcase") {
@Override
public boolean isFiltered(Entity element) {
if (element instanceof Item) {
return Showcase.instance.getItemByDrop((Item) element) != null;
}
return false;
}
});
// Showcase Standalone
availableFilters.add(new BlacklistFilter("ShowCaseStandalone") {
@Override
public boolean isFiltered(Entity element) {
if (element instanceof Item) {
ShowCaseStandalone plugin = (ShowCaseStandalone) getPlugin();
return plugin.getShopHandler().isShopItem((Item) element);
}
return false;
}
});
// HyperConomy
availableFilters.add(new BlacklistFilter("HyperConomy") {
@Override
public boolean isFiltered(Entity element) {
if (element instanceof Item) {
return HyperConomy.hyperAPI.isItemDisplay((Item) element);
}
return false;
}
});
// Bleeding Mobs
availableFilters.add(new BlacklistFilter("BleedingMobs") {
@Override
@SuppressWarnings("deprecation")
public boolean isFiltered(Entity element) {
if (element instanceof Item) {
BleedingMobs bm = (BleedingMobs) this.getPlugin();
if (bm.isSpawning() || (bm.isWorldEnabled(element.getWorld()) && bm.isParticleItem(element.getUniqueId()))) {
return true;
}
}
return false;
}
});
}
public void updateDependency(Plugin plugin, String pluginName, boolean enabled) {
for (BlacklistFilter filter : this.availableFilters) {
if (filter.matchPlugin(pluginName)) {
filter.trySetEnabled(plugin, enabled);
}
}
}
@Override
public boolean isFiltered(Entity element) {
for (BlacklistFilter filter : this.availableFilters) {
try {
if (filter.isEnabled() && filter.isFiltered(element)) {
return true;
}
} catch (Throwable t) {
CommonPlugin.LOGGER.log(Level.SEVERE, filter.getPluginName() +
" entity filter verification failed (update needed?), contact the authors!");
filter.trySetEnabled(filter.getPlugin(), false);
}
}
return false;
}
private static abstract class BlacklistFilter implements Filter<Entity> {
private final String pluginName;
private boolean enabled = false;
private Plugin pluginInstance = null;
public BlacklistFilter(String pluginName) {
this.pluginName = pluginName;
}
public void trySetEnabled(Plugin plugin, boolean enabled) {
this.enabled = enabled;
try {
onEnabledChange(plugin, enabled);
if (enabled) {
CommonPlugin.LOGGER.log(Level.INFO, pluginName + " detected: Items belonging to this plugin will be ignored");
}
} catch (Throwable t) {
CommonPlugin.LOGGER.log(Level.SEVERE, "Error while " + (enabled ? "adding" : "removing") +
" item ignore support for " + pluginName, t);
}
this.pluginInstance = enabled ? plugin : null;
}
public void onEnabledChange(Plugin plugin, boolean enabled) {
}
public boolean isEnabled() {
return this.enabled;
}
public String getPluginName() {
return pluginName;
}
public Plugin getPlugin() {
return pluginInstance;
}
public boolean matchPlugin(String pluginName) {
return pluginName.equals(this.pluginName);
}
}
}