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;