/** * BetonQuest - advanced quests for Bukkit * Copyright (C) 2016 Jakub "Co0sh" Sapalski * * This program 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. * * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ package pl.betoncraft.betonquest.compatibility; import java.util.ArrayList; import java.util.List; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.RegisteredServiceProvider; import ch.njol.skript.Skript; import de.slikey.effectlib.EffectManager; import me.blackvein.quests.Quests; import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.permission.Permission; import pl.betoncraft.betonlangapi.BetonLangAPI; import pl.betoncraft.betonquest.BetonQuest; import pl.betoncraft.betonquest.compatibility.betonlangapi.BetonLangAPIEvent; import pl.betoncraft.betonquest.compatibility.betonlangapi.LangChangeListener; import pl.betoncraft.betonquest.compatibility.bountifulapi.BountifulTitleEvent; import pl.betoncraft.betonquest.compatibility.citizens.CitizensListener; import pl.betoncraft.betonquest.compatibility.citizens.CitizensParticle; import pl.betoncraft.betonquest.compatibility.citizens.CitizensWalkingListener; import pl.betoncraft.betonquest.compatibility.citizens.NPCInteractObjective; import pl.betoncraft.betonquest.compatibility.citizens.NPCKillObjective; import pl.betoncraft.betonquest.compatibility.citizens.NPCMoveEvent; import pl.betoncraft.betonquest.compatibility.denizen.DenizenTaskScriptEvent; import pl.betoncraft.betonquest.compatibility.effectlib.ParticleEvent; import pl.betoncraft.betonquest.compatibility.heroes.HeroesClassCondition; import pl.betoncraft.betonquest.compatibility.heroes.HeroesExperienceEvent; import pl.betoncraft.betonquest.compatibility.heroes.HeroesMobKillListener; import pl.betoncraft.betonquest.compatibility.heroes.HeroesSkillCondition; import pl.betoncraft.betonquest.compatibility.holographicdisplays.HologramLoop; import pl.betoncraft.betonquest.compatibility.legendquest.LQAttributeCondition; import pl.betoncraft.betonquest.compatibility.legendquest.LQAttributeVariable; import pl.betoncraft.betonquest.compatibility.legendquest.LQClassCondition; import pl.betoncraft.betonquest.compatibility.legendquest.LQClassVariable; import pl.betoncraft.betonquest.compatibility.legendquest.LQKarmaCondition; import pl.betoncraft.betonquest.compatibility.legendquest.LQKarmaVariable; import pl.betoncraft.betonquest.compatibility.legendquest.LQRaceCondition; import pl.betoncraft.betonquest.compatibility.legendquest.LQRaceVariable; import pl.betoncraft.betonquest.compatibility.magic.WandCondition; import pl.betoncraft.betonquest.compatibility.mcmmo.McMMOAddExpEvent; import pl.betoncraft.betonquest.compatibility.mcmmo.McMMOSkillLevelCondition; import pl.betoncraft.betonquest.compatibility.mythicmobs.MythicMobKillObjective; import pl.betoncraft.betonquest.compatibility.mythicmobs.MythicSpawnMobEvent; import pl.betoncraft.betonquest.compatibility.placeholderapi.BetonQuestPlaceholder; import pl.betoncraft.betonquest.compatibility.placeholderapi.PlaceholderVariable; import pl.betoncraft.betonquest.compatibility.playerpoints.PlayerPointsCondition; import pl.betoncraft.betonquest.compatibility.playerpoints.PlayerPointsEvent; import pl.betoncraft.betonquest.compatibility.quests.ConditionRequirement; import pl.betoncraft.betonquest.compatibility.quests.EventReward; import pl.betoncraft.betonquest.compatibility.quests.QuestCondition; import pl.betoncraft.betonquest.compatibility.quests.QuestEvent; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCClassCondition; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCClassEvent; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCClassVariable; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCExpCondition; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCExpEvent; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCExpVariable; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCLevelCondition; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCLevelEvent; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCLevelVariable; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCManaCondition; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCManaEvent; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCRaceCondition; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCRaceEvent; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCRaceVariable; import pl.betoncraft.betonquest.compatibility.racesandclasses.RaCTraitCondition; import pl.betoncraft.betonquest.compatibility.shopkeepers.HavingShopCondition; import pl.betoncraft.betonquest.compatibility.shopkeepers.OpenShopEvent; import pl.betoncraft.betonquest.compatibility.skillapi.SkillAPIClassCondition; import pl.betoncraft.betonquest.compatibility.skillapi.SkillAPILevelCondition; import pl.betoncraft.betonquest.compatibility.skript.BQEventSkript; import pl.betoncraft.betonquest.compatibility.skript.BQEventSkript.CustomEventForSkript; import pl.betoncraft.betonquest.compatibility.skript.SkriptConditionBQ; import pl.betoncraft.betonquest.compatibility.skript.SkriptEffectBQ; import pl.betoncraft.betonquest.compatibility.skript.SkriptEventBQ; import pl.betoncraft.betonquest.compatibility.vault.MoneyCondition; import pl.betoncraft.betonquest.compatibility.vault.MoneyEvent; import pl.betoncraft.betonquest.compatibility.vault.MoneyVariable; import pl.betoncraft.betonquest.compatibility.vault.PermissionEvent; import pl.betoncraft.betonquest.compatibility.worldedit.PasteSchematicEvent; import pl.betoncraft.betonquest.compatibility.worldguard.RegionCondition; import pl.betoncraft.betonquest.compatibility.worldguard.RegionObjective; import pl.betoncraft.betonquest.config.Config; import pl.betoncraft.betonquest.database.PlayerData; import pl.betoncraft.betonquest.utils.Debug; import pl.betoncraft.betonquest.utils.PlayerConverter; /** * Compatibility with other plugins * * @author Jakub Sapalski */ public class Compatibility { private BetonQuest plugin = BetonQuest.getInstance(); private static Compatibility instance; private List<String> hooked = new ArrayList<>(); private Permission permission = null; private Economy economy = null; private EffectManager manager; private HologramLoop hologramLoop; public Compatibility() { instance = this; // hook into MythicMobs if (Bukkit.getPluginManager().isPluginEnabled("MythicMobs") && plugin.getConfig().getString("hook.mythicmobs").equalsIgnoreCase("true")) { plugin.registerObjectives("mmobkill", MythicMobKillObjective.class); plugin.registerEvents("mspawnmob", MythicSpawnMobEvent.class); hooked.add("MythicMobs"); } // hook into Citizens if (Bukkit.getPluginManager().isPluginEnabled("Citizens") && plugin.getConfig().getString("hook.citizens").equalsIgnoreCase("true")) { new CitizensListener(); new CitizensWalkingListener(); plugin.registerObjectives("npckill", NPCKillObjective.class); plugin.registerObjectives("npcinteract", NPCInteractObjective.class); plugin.registerEvents("movenpc", NPCMoveEvent.class); hooked.add("Citizens"); } // hook into Vault if (Bukkit.getPluginManager().isPluginEnabled("Vault") && plugin.getConfig().getString("hook.vault").equalsIgnoreCase("true")) { RegisteredServiceProvider<Permission> permissionProvider = Bukkit.getServer().getServicesManager() .getRegistration(net.milkbowl.vault.permission.Permission.class); if (permissionProvider != null) { permission = permissionProvider.getProvider(); } RegisteredServiceProvider<Economy> economyProvider = Bukkit.getServer().getServicesManager() .getRegistration(net.milkbowl.vault.economy.Economy.class); if (economyProvider != null) { economy = economyProvider.getProvider(); } if (economy != null) { plugin.registerEvents("money", MoneyEvent.class); plugin.registerConditions("money", MoneyCondition.class); plugin.registerVariable("money", MoneyVariable.class); } else { Debug.error("There is no economy plugin on the server!"); } if (permission != null) { plugin.registerEvents("permission", PermissionEvent.class); } else { Debug.error("Could not get permission provider!"); } hooked.add("Vault"); } // hook into Skript if (Bukkit.getPluginManager().isPluginEnabled("Skript") && plugin.getConfig().getString("hook.skript").equalsIgnoreCase("true")) { Skript.registerCondition(SkriptConditionBQ.class, "%player% (meet|meets) [betonquest] condition %string%"); Skript.registerEffect(SkriptEffectBQ.class, "fire [betonquest] event %string% for %player%"); Skript.registerEvent("betonquest", SkriptEventBQ.class, CustomEventForSkript.class, "[betonquest] event %string%"); plugin.registerEvents("skript", BQEventSkript.class); hooked.add("Skript"); } // hook into WorldGuard if (Bukkit.getPluginManager().isPluginEnabled("WorldGuard") && plugin.getConfig().getString("hook.worldguard").equalsIgnoreCase("true")) { plugin.registerConditions("region", RegionCondition.class); plugin.registerObjectives("region", RegionObjective.class); hooked.add("WorldGuard"); } // hook into WorldEdit if (Bukkit.getPluginManager().isPluginEnabled("WorldEdit") && plugin.getConfig().getString("hook.worldedit").equalsIgnoreCase("true")) { plugin.registerEvents("paste", PasteSchematicEvent.class); hooked.add("WorldEdit"); } // hook into mcMMO if (Bukkit.getPluginManager().isPluginEnabled("mcMMO") && plugin.getConfig().getString("hook.mcmmo").equalsIgnoreCase("true")) { plugin.registerConditions("mcmmolevel", McMMOSkillLevelCondition.class); plugin.registerEvents("mcmmoexp", McMMOAddExpEvent.class); hooked.add("mcMMO"); } // hook into EffectLib if (Bukkit.getPluginManager().isPluginEnabled("EffectLib") && plugin.getConfig().getString("hook.effectlib").equalsIgnoreCase("true")) { manager = new EffectManager(plugin); if (hooked.contains("Citizens")) new CitizensParticle(); plugin.registerEvents("particle", ParticleEvent.class); hooked.add("EffectLib"); } // hook into PlayerPoints if (Bukkit.getPluginManager().isPluginEnabled("PlayerPoints") && plugin.getConfig().getString("hook.playerpoints").equalsIgnoreCase("true")) { plugin.registerEvents("playerpoints", PlayerPointsEvent.class); plugin.registerConditions("playerpoints", PlayerPointsCondition.class); hooked.add("PlayerPoints"); } // hook into Heroes if (Bukkit.getPluginManager().isPluginEnabled("Heroes") && plugin.getConfig().getString("hook.heroes").equalsIgnoreCase("true")) { plugin.registerConditions("heroesclass", HeroesClassCondition.class); plugin.registerConditions("heroesskill", HeroesSkillCondition.class); plugin.registerEvents("heroesexp", HeroesExperienceEvent.class); // create mobkill listener for passing Heroes kills to // MobKillObjective new HeroesMobKillListener(); hooked.add("Heroes"); } // hook into Magic if (Bukkit.getPluginManager().isPluginEnabled("Magic") && plugin.getConfig().getString("hook.magic").equalsIgnoreCase("true")) { plugin.registerConditions("wand", WandCondition.class); hooked.add("Magic"); } // hook into Denizen if (Bukkit.getPluginManager().isPluginEnabled("Denizen") && plugin.getConfig().getString("hook.denizen").equalsIgnoreCase("true")) { plugin.registerEvents("script", DenizenTaskScriptEvent.class); hooked.add("Denizen"); } // hook into SkillAPI if (Bukkit.getPluginManager().isPluginEnabled("SkillAPI") && plugin.getConfig().getString("hook.skillapi").equalsIgnoreCase("true")) { plugin.registerConditions("skillapiclass", SkillAPIClassCondition.class); plugin.registerConditions("skillapilevel", SkillAPILevelCondition.class); hooked.add("SkillAPI"); } // hook into Quests if (Bukkit.getPluginManager().isPluginEnabled("Quests") && plugin.getConfig().getString("hook.quests").equalsIgnoreCase("true")) { plugin.registerConditions("quest", QuestCondition.class); plugin.registerEvents("quest", QuestEvent.class); Quests.getInstance().customRewards.add(new EventReward()); Quests.getInstance().customRequirements.add(new ConditionRequirement()); hooked.add("Quests"); } // hook into Shopkeepers if (Bukkit.getPluginManager().isPluginEnabled("Shopkeepers") && plugin.getConfig().getString("hook.shopkeepers").equalsIgnoreCase("true")) { plugin.registerEvents("shopkeeper", OpenShopEvent.class); plugin.registerConditions("shopamount", HavingShopCondition.class); hooked.add("Shopkeepers"); } // hook into PlaceholderAPI if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI") && plugin.getConfig().getString("hook.placeholderapi").equalsIgnoreCase("true")) { plugin.registerVariable("ph", PlaceholderVariable.class); new BetonQuestPlaceholder(plugin, "betonquest").hook(); hooked.add("PlaceholderAPI"); } // hook into HolographicDisplays if (Bukkit.getPluginManager().isPluginEnabled("HolographicDisplays") && plugin.getConfig().getString("hook.holographicdisplays").equalsIgnoreCase("true")) { hologramLoop = new HologramLoop(); hooked.add("HolographicDisplays"); } // hook into RacesAndClasses if (Bukkit.getPluginManager().isPluginEnabled("RacesAndClasses") && plugin.getConfig().getString("hook.racesandclasses").equalsIgnoreCase("true")) { plugin.registerConditions("racclass", RaCClassCondition.class); plugin.registerConditions("racrace", RaCRaceCondition.class); plugin.registerConditions("racmana", RaCManaCondition.class); plugin.registerConditions("racexp", RaCExpCondition.class); plugin.registerConditions("raclevel", RaCLevelCondition.class); plugin.registerConditions("ractrait", RaCTraitCondition.class); plugin.registerEvents("racclass", RaCClassEvent.class); plugin.registerEvents("racrace", RaCRaceEvent.class); plugin.registerEvents("racmana", RaCManaEvent.class); plugin.registerEvents("racexp", RaCExpEvent.class); plugin.registerEvents("raclevel", RaCLevelEvent.class); plugin.registerVariable("racclass", RaCClassVariable.class); plugin.registerVariable("racrace", RaCRaceVariable.class); plugin.registerVariable("racexp", RaCExpVariable.class); plugin.registerVariable("raclevel", RaCLevelVariable.class); hooked.add("RacesAndClasses"); } // hook into LegendQuest if (Bukkit.getPluginManager().isPluginEnabled("LegendQuest") && plugin.getConfig().getString("hook.legendquest").equalsIgnoreCase("true")) { plugin.registerConditions("lqclass", LQClassCondition.class); plugin.registerConditions("lqrace", LQRaceCondition.class); plugin.registerConditions("lqattribute", LQAttributeCondition.class); plugin.registerConditions("lqkarma", LQKarmaCondition.class); plugin.registerVariable("lqclass", LQClassVariable.class); plugin.registerVariable("lqrace", LQRaceVariable.class); plugin.registerVariable("lqattribute", LQAttributeVariable.class); plugin.registerVariable("lqkarma", LQKarmaVariable.class); hooked.add("LegendQuest"); } // hook into BetonLangAPI if (Bukkit.getPluginManager().isPluginEnabled("BetonLangAPI") && plugin.getConfig().getString("hook.betonlangapi").equalsIgnoreCase("true")) { new LangChangeListener(); for (Player player : Bukkit.getOnlinePlayers()) { updateLang(player); } Bukkit.getPluginManager().registerEvents( new Listener() { @EventHandler public void onJoin(PlayerJoinEvent event) { updateLang(event.getPlayer()); } }, BetonQuest.getInstance()); plugin.registerEvents("language", BetonLangAPIEvent.class); hooked.add("BetonLangAPI"); } // hook into BountifulAPI if (Bukkit.getPluginManager().isPluginEnabled("BountifulAPI") && plugin.getConfig().getString("hook.bountifulapi").equalsIgnoreCase("true")) { plugin.registerEvents("title", BountifulTitleEvent.class); hooked.add("BountifulAPI"); } // log which plugins have been hooked if (hooked.size() > 0) { StringBuilder string = new StringBuilder(); for (String plugin : hooked) { string.append(plugin + ", "); } String plugins = string.substring(0, string.length() - 2); plugin.getLogger().info("Hooked into " + plugins + "!"); } } /** * @return the permission */ public static Permission getPermission() { return instance.permission; } /** * @return the economy */ public static Economy getEconomy() { return instance.economy; } /** * @return the EffectLib effect manager */ public static EffectManager getEffectManager() { return instance.manager; } /** * Reloads all stuff connected to other plugins. */ public static void reload() { if (instance.hooked.contains("Citizens") && instance.hooked.contains("EffectLib")) { CitizensParticle.reload(); } if (instance.hooked.contains("HolographicDisplays")) { instance.hologramLoop.cancel(); instance.hologramLoop = new HologramLoop(); } } /** * Is called when BetonQuest is being disabled. Does everything the * compatible plugins require to do on disable. */ public void disable() { if (hooked.contains("EffectLib")) { manager.dispose(); } if (hooked.contains("HolographicDisplays")) { hologramLoop.cancel(); } } /** * Updates the player's language to match the one specified in BetonLangAPI. * * @param player the player whose language needs to be changed */ private void updateLang(Player player) { String lang = BetonLangAPI.getLanguage(player); if (Config.getLanguages().contains(lang)) { PlayerData data = BetonQuest.getInstance().getPlayerData(PlayerConverter.getID(player)); if (!data.getLanguage().equals(lang)) { data.setLanguage(lang); } } } }