diff --git a/lib/Residence.jar b/lib/Residence.jar new file mode 100644 index 00000000..d560907e Binary files /dev/null and b/lib/Residence.jar differ diff --git a/pom.xml b/pom.xml index e417b0fd..8dce9cea 100644 --- a/pom.xml +++ b/pom.xml @@ -92,6 +92,13 @@ system ${basedir}/lib/spigot.jar + + com.bekvon.bukkit + Residence + 4.8.7.2 + system + ${basedir}/lib/Residence.jar + com.Zrips CMI diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index 3de9aa0c..1e273cde 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -34,6 +34,10 @@ import net.Indyuce.mmocore.command.WaypointsCommand; import net.Indyuce.mmocore.command.WithdrawCommand; import net.Indyuce.mmocore.comp.citizens.CitizenInteractEventListener; import net.Indyuce.mmocore.comp.citizens.CitizensMMOLoader; +import net.Indyuce.mmocore.comp.flags.DefaultFlags; +import net.Indyuce.mmocore.comp.flags.FlagPlugin; +import net.Indyuce.mmocore.comp.flags.ResidenceFlags; +import net.Indyuce.mmocore.comp.flags.WorldGuardFlags; import net.Indyuce.mmocore.comp.holograms.CMIPlugin; import net.Indyuce.mmocore.comp.holograms.HologramSupport; import net.Indyuce.mmocore.comp.holograms.HologramsPlugin; @@ -43,12 +47,12 @@ import net.Indyuce.mmocore.comp.mythicmobs.MythicMobsMMOLoader; import net.Indyuce.mmocore.comp.placeholder.DefaultParser; import net.Indyuce.mmocore.comp.placeholder.PlaceholderAPIParser; import net.Indyuce.mmocore.comp.placeholder.PlaceholderParser; +import net.Indyuce.mmocore.comp.region.DefaultRegionHandler; +import net.Indyuce.mmocore.comp.region.RegionHandler; +import net.Indyuce.mmocore.comp.region.WorldGuardMMOLoader; +import net.Indyuce.mmocore.comp.region.WorldGuardRegionHandler; import net.Indyuce.mmocore.comp.vault.VaultEconomy; import net.Indyuce.mmocore.comp.vault.VaultMMOLoader; -import net.Indyuce.mmocore.comp.worldguard.DefaultRegionHandler; -import net.Indyuce.mmocore.comp.worldguard.RegionHandler; -import net.Indyuce.mmocore.comp.worldguard.WorldGuardMMOLoader; -import net.Indyuce.mmocore.comp.worldguard.WorldGuardRegionHandler; import net.Indyuce.mmocore.listener.BlockListener; import net.Indyuce.mmocore.listener.GoldPouchesListener; import net.Indyuce.mmocore.listener.GuildListener; @@ -103,11 +107,12 @@ public class MMOCore extends JavaPlugin { public VaultEconomy economy; public HologramSupport hologramSupport; public InventoryManager inventoryManager; - public RegionHandler regionHandler; public PlayerActionBar actionBarManager; - public final SkillManager skillManager = new SkillManager(); + public RegionHandler regionHandler = new DefaultRegionHandler(); + public FlagPlugin flagPlugin = new DefaultFlags(); public PlaceholderParser placeholderParser = new DefaultParser(); public DataProvider dataProvider = new YAMLDataProvider(); + public final SkillManager skillManager = new SkillManager(); public final ClassManager classManager = new ClassManager(); public final DropTableManager dropTableManager = new DropTableManager(); public final CustomBlockManager mineManager = new CustomBlockManager(); @@ -171,9 +176,12 @@ public class MMOCore extends JavaPlugin { if (Bukkit.getPluginManager().getPlugin("WorldGuard") != null) { regionHandler = new WorldGuardRegionHandler(); + flagPlugin = new WorldGuardFlags(); getLogger().log(Level.INFO, "Hooked onto WorldGuard"); - } else - regionHandler = new DefaultRegionHandler(); + } else if (Bukkit.getPluginManager().getPlugin("Residence") != null) { + flagPlugin = new ResidenceFlags(); + getLogger().log(Level.INFO, "Hooked onto Residence"); + } if (Bukkit.getPluginManager().getPlugin("HolographicDisplays") != null) { hologramSupport = new HolographicDisplaysPlugin(); diff --git a/src/main/java/net/Indyuce/mmocore/api/skill/SkillResult.java b/src/main/java/net/Indyuce/mmocore/api/skill/SkillResult.java index abaa0cc8..4b6a9ba3 100644 --- a/src/main/java/net/Indyuce/mmocore/api/skill/SkillResult.java +++ b/src/main/java/net/Indyuce/mmocore/api/skill/SkillResult.java @@ -1,7 +1,9 @@ package net.Indyuce.mmocore.api.skill; +import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill.SkillInfo; +import net.Indyuce.mmocore.comp.flags.FlagPlugin.CustomFlag; public class SkillResult { private final SkillInfo skill; @@ -17,7 +19,11 @@ public class SkillResult { cooldown = (skill.getSkill().hasModifier("cooldown") ? data.getSkillData().getCooldown(skill) : 0); mana = (skill.getSkill().hasModifier("mana") ? skill.getModifier("mana", level) : 0); cancelReason = !data.hasSkillUnlocked(skill) ? CancelReason.LOCKED - : cooldown > 0 ? CancelReason.COOLDOWN : mana > data.getMana() ? CancelReason.MANA : null; + : cooldown > 0 ? CancelReason.COOLDOWN + : mana > data.getMana() ? CancelReason.MANA + : !MMOCore.plugin.flagPlugin.isFlagAllowed(data.getPlayer(), CustomFlag.SKILLS) + ? CancelReason.FLAG + : null; } public SkillResult(PlayerData data, SkillInfo skill, CancelReason reason) { @@ -71,6 +77,9 @@ public class SkillResult { public enum CancelReason { + // skill flag + FLAG, + // not enough mana MANA, diff --git a/src/main/java/net/Indyuce/mmocore/comp/flags/DefaultFlags.java b/src/main/java/net/Indyuce/mmocore/comp/flags/DefaultFlags.java new file mode 100644 index 00000000..1d45ad7d --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/comp/flags/DefaultFlags.java @@ -0,0 +1,21 @@ +package net.Indyuce.mmocore.comp.flags; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public class DefaultFlags implements FlagPlugin { +// @Override +// public boolean isPvpAllowed(Location loc) { +// return true; +// } + + @Override + public boolean isFlagAllowed(Player player, CustomFlag flag) { + return true; + } + + @Override + public boolean isFlagAllowed(Location loc, CustomFlag flag) { + return true; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/comp/flags/FlagPlugin.java b/src/main/java/net/Indyuce/mmocore/comp/flags/FlagPlugin.java new file mode 100644 index 00000000..8778189f --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/comp/flags/FlagPlugin.java @@ -0,0 +1,20 @@ +package net.Indyuce.mmocore.comp.flags; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public interface FlagPlugin { +// public boolean isPvpAllowed(Location loc); + + public boolean isFlagAllowed(Player player, CustomFlag flag); + + public boolean isFlagAllowed(Location loc, CustomFlag flag); + + public enum CustomFlag { + SKILLS; + + public String getPath() { + return "mmocore-" + name().toLowerCase(); + } + } +} diff --git a/src/main/java/net/Indyuce/mmocore/comp/flags/ResidenceFlags.java b/src/main/java/net/Indyuce/mmocore/comp/flags/ResidenceFlags.java new file mode 100644 index 00000000..dc605c0d --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/comp/flags/ResidenceFlags.java @@ -0,0 +1,34 @@ +package net.Indyuce.mmocore.comp.flags; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import com.bekvon.bukkit.residence.Residence; +import com.bekvon.bukkit.residence.protection.ClaimedResidence; +import com.bekvon.bukkit.residence.protection.FlagPermissions; + +public class ResidenceFlags implements FlagPlugin { + public ResidenceFlags() { + for (CustomFlag flag : CustomFlag.values()) + FlagPermissions.addFlag(flag.getPath()); + } + +// @Override +// public boolean isPvpAllowed(Location loc) { +// ClaimedResidence res = Residence.getInstance().getResidenceManager().getByLoc(loc); +// return res == null || res.getPermissions().has(Flags.pvp, true); +// } + + @SuppressWarnings("deprecation") + @Override + public boolean isFlagAllowed(Player player, CustomFlag flag) { + ClaimedResidence res = Residence.getInstance().getResidenceManager().getByLoc(player); + return res == null || res.getPermissions().playerHas(player, flag.getPath(), true); + } + + @Override + public boolean isFlagAllowed(Location loc, CustomFlag flag) { + ClaimedResidence res = Residence.getInstance().getResidenceManager().getByLoc(loc); + return res == null || res.getPermissions().has(flag.getPath(), true, true); + } +} \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmocore/comp/flags/WorldGuardFlags.java b/src/main/java/net/Indyuce/mmocore/comp/flags/WorldGuardFlags.java new file mode 100644 index 00000000..ba0c8740 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/comp/flags/WorldGuardFlags.java @@ -0,0 +1,59 @@ +package net.Indyuce.mmocore.comp.flags; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.flags.StateFlag; +import com.sk89q.worldguard.protection.flags.registry.FlagRegistry; + +public class WorldGuardFlags implements FlagPlugin { + private final WorldGuard worldguard; + private final WorldGuardPlugin worldguardPlugin; + private final Map flags = new HashMap<>(); + + public WorldGuardFlags() { + this.worldguard = WorldGuard.getInstance(); + this.worldguardPlugin = ((WorldGuardPlugin) Bukkit.getServer().getPluginManager() + .getPlugin("WorldGuard")); + + FlagRegistry registry = worldguard.getFlagRegistry(); + for (CustomFlag customFlag : CustomFlag.values()) { + StateFlag flag = new StateFlag(customFlag.getPath(), true); + try { + registry.register(flag); + flags.put(customFlag.getPath(), flag); + } catch (Exception exception) { + exception.printStackTrace(); + } + } + } + +// @Override +// public boolean isPvpAllowed(Location loc) { +// return getApplicableRegion(loc).queryState(null, Flags.PVP) != StateFlag.State.DENY; +// } + + @Override + public boolean isFlagAllowed(Location loc, CustomFlag customFlag) { + return getApplicableRegion(loc).queryValue(null, flags.get(customFlag.getPath())) != StateFlag.State.DENY; + } + + @Override + public boolean isFlagAllowed(Player player, CustomFlag customFlag) { + return getApplicableRegion(player.getLocation()).queryValue(worldguardPlugin.wrapPlayer(player), + flags.get(customFlag.getPath())) != StateFlag.State.DENY; + } + + private ApplicableRegionSet getApplicableRegion(Location loc) { + return worldguard.getPlatform().getRegionContainer().createQuery() + .getApplicableRegions(BukkitAdapter.adapt(loc)); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/comp/worldguard/DefaultRegionHandler.java b/src/main/java/net/Indyuce/mmocore/comp/region/DefaultRegionHandler.java similarity index 83% rename from src/main/java/net/Indyuce/mmocore/comp/worldguard/DefaultRegionHandler.java rename to src/main/java/net/Indyuce/mmocore/comp/region/DefaultRegionHandler.java index 81c59c89..a615ca72 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/worldguard/DefaultRegionHandler.java +++ b/src/main/java/net/Indyuce/mmocore/comp/region/DefaultRegionHandler.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.comp.worldguard; +package net.Indyuce.mmocore.comp.region; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/net/Indyuce/mmocore/comp/worldguard/RegionCondition.java b/src/main/java/net/Indyuce/mmocore/comp/region/RegionCondition.java similarity index 93% rename from src/main/java/net/Indyuce/mmocore/comp/worldguard/RegionCondition.java rename to src/main/java/net/Indyuce/mmocore/comp/region/RegionCondition.java index 32148066..6caf7476 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/worldguard/RegionCondition.java +++ b/src/main/java/net/Indyuce/mmocore/comp/region/RegionCondition.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.comp.worldguard; +package net.Indyuce.mmocore.comp.region; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/net/Indyuce/mmocore/comp/worldguard/RegionHandler.java b/src/main/java/net/Indyuce/mmocore/comp/region/RegionHandler.java similarity index 75% rename from src/main/java/net/Indyuce/mmocore/comp/worldguard/RegionHandler.java rename to src/main/java/net/Indyuce/mmocore/comp/region/RegionHandler.java index e2bba3f9..7e21cb20 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/worldguard/RegionHandler.java +++ b/src/main/java/net/Indyuce/mmocore/comp/region/RegionHandler.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.comp.worldguard; +package net.Indyuce.mmocore.comp.region; import java.util.List; diff --git a/src/main/java/net/Indyuce/mmocore/comp/worldguard/WorldGuardMMOLoader.java b/src/main/java/net/Indyuce/mmocore/comp/region/WorldGuardMMOLoader.java similarity index 89% rename from src/main/java/net/Indyuce/mmocore/comp/worldguard/WorldGuardMMOLoader.java rename to src/main/java/net/Indyuce/mmocore/comp/region/WorldGuardMMOLoader.java index 38aca762..2721595e 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/worldguard/WorldGuardMMOLoader.java +++ b/src/main/java/net/Indyuce/mmocore/comp/region/WorldGuardMMOLoader.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.comp.worldguard; +package net.Indyuce.mmocore.comp.region; import net.Indyuce.mmocore.api.droptable.condition.Condition; import net.Indyuce.mmocore.api.load.MMOLoader; diff --git a/src/main/java/net/Indyuce/mmocore/comp/worldguard/WorldGuardRegionHandler.java b/src/main/java/net/Indyuce/mmocore/comp/region/WorldGuardRegionHandler.java similarity index 92% rename from src/main/java/net/Indyuce/mmocore/comp/worldguard/WorldGuardRegionHandler.java rename to src/main/java/net/Indyuce/mmocore/comp/region/WorldGuardRegionHandler.java index 7b7d6da5..35bdc804 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/worldguard/WorldGuardRegionHandler.java +++ b/src/main/java/net/Indyuce/mmocore/comp/region/WorldGuardRegionHandler.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.comp.worldguard; +package net.Indyuce.mmocore.comp.region; import java.util.ArrayList; import java.util.List;