diff --git a/dough-api/pom.xml b/dough-api/pom.xml
index 4bb28d00..e955a069 100644
--- a/dough-api/pom.xml
+++ b/dough-api/pom.xml
@@ -443,6 +443,14 @@
1.0.580
provided
+
+
+
+ cn.lunadeer
+ DominionAPI
+ 4.3
+ provided
+
diff --git a/dough-protection/pom.xml b/dough-protection/pom.xml
index d12c8315..cb340667 100644
--- a/dough-protection/pom.xml
+++ b/dough-protection/pom.xml
@@ -439,6 +439,20 @@
+
+
+
+ cn.lunadeer
+ DominionAPI
+ 4.3
+ provided
+
+
+ bukkit
+ *
+
+
+
diff --git a/dough-protection/src/main/java/io/github/bakedlibs/dough/protection/ProtectionManager.java b/dough-protection/src/main/java/io/github/bakedlibs/dough/protection/ProtectionManager.java
index bebd5b33..881887b5 100644
--- a/dough-protection/src/main/java/io/github/bakedlibs/dough/protection/ProtectionManager.java
+++ b/dough-protection/src/main/java/io/github/bakedlibs/dough/protection/ProtectionManager.java
@@ -9,6 +9,7 @@
import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;
+import io.github.bakedlibs.dough.protection.modules.*;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.Block;
@@ -18,24 +19,6 @@
import io.github.bakedlibs.dough.common.DoughLogger;
import io.github.bakedlibs.dough.protection.loggers.CoreProtectLogger;
import io.github.bakedlibs.dough.protection.loggers.LogBlockLogger;
-import io.github.bakedlibs.dough.protection.modules.BentoBoxProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.BlockLockerProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.BoltProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.ChestProtectProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.FactionsUUIDProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.FunnyGuildsProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.GriefPreventionProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.HuskTownsProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.HuskClaimsProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.LWCProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.LandsProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.LocketteProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.PlotSquaredProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.PreciousStonesProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.RedProtectProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.ShopChestProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.TownyProtectionModule;
-import io.github.bakedlibs.dough.protection.modules.WorldGuardProtectionModule;
/**
* This Class provides a nifty API for plugins to query popular protection plugins.
@@ -97,6 +80,7 @@ private void loadModuleImplementations(Plugin plugin) {
registerModule(pm, "ShopChest", shopChest -> new ShopChestProtectionModule(shopChest));
registerModule(pm, "HuskClaims", huskClaims -> new HuskClaimsProtectionModule(huskClaims));
registerModule(pm, "Bolt", bolt -> new BoltProtectionModule(bolt));
+ registerModule(pm, "Dominion", dominion -> new DominionProtectionModule(dominion));
/*
* The following Plugins work by utilising one of the above listed
diff --git a/dough-protection/src/main/java/io/github/bakedlibs/dough/protection/modules/DominionProtectionModule.java b/dough-protection/src/main/java/io/github/bakedlibs/dough/protection/modules/DominionProtectionModule.java
new file mode 100644
index 00000000..7aca0d1b
--- /dev/null
+++ b/dough-protection/src/main/java/io/github/bakedlibs/dough/protection/modules/DominionProtectionModule.java
@@ -0,0 +1,99 @@
+package io.github.bakedlibs.dough.protection.modules;
+
+import cn.lunadeer.dominion.api.DominionAPI;
+import cn.lunadeer.dominion.api.dtos.DominionDTO;
+import cn.lunadeer.dominion.api.dtos.flag.EnvFlag;
+import cn.lunadeer.dominion.api.dtos.flag.Flag;
+import cn.lunadeer.dominion.api.dtos.flag.Flags;
+import cn.lunadeer.dominion.api.dtos.flag.PriFlag;
+import io.github.bakedlibs.dough.protection.Interaction;
+import io.github.bakedlibs.dough.protection.ProtectionModule;
+import org.bukkit.Location;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.Nullable;
+
+import javax.annotation.Nonnull;
+
+public class DominionProtectionModule implements ProtectionModule {
+
+ private final Plugin plugin;
+ private DominionAPI api;
+
+ public DominionProtectionModule(Plugin plugin) {
+ this.plugin = plugin;
+ }
+
+ /**
+ * Use this method to load instances of your API or other utilites you need
+ */
+ @Override
+ public void load() {
+ try {
+ api = DominionAPI.getInstance();
+ } catch (Exception e) {
+ plugin.getLogger().warning("Failed to load Dominion API. Disabling Dominion Protection Module.");
+ }
+ }
+
+ /**
+ * This returns the {@link Plugin} for this {@link ProtectionModule}.
+ *
+ * @return The associated {@link Plugin}
+ */
+ @Override
+ public Plugin getPlugin() {
+ return plugin;
+ }
+
+ /**
+ * This method implements the functionality of this module.
+ * Use it to allow or deny an Action based on the rules of your Protection {@link Plugin}
+ *
+ * @param p The Player that is being queried, can be offline
+ * @param l The {@link Location} of the event that is happening
+ * @param action The {@link Interaction} that is taking place.
+ * @return Whether the action was allowed by your {@link Plugin}
+ */
+ @Override
+ public boolean hasPermission(OfflinePlayer p, Location l, Interaction action) {
+ if (!p.isOnline()) {
+ return false;
+ }
+ Player player = p.getPlayer();
+ if (player == null) {
+ return true;
+ }
+ Flag flag = getDominionFlagFromInteraction(action);
+ if (flag == null) {
+ return true;
+ }
+ DominionDTO dominion = api.getDominion(l);
+ if (dominion == null) {
+ return true;
+ }
+ if (flag instanceof PriFlag) {
+ PriFlag preFlag = (PriFlag) flag;
+ return api.checkPrivilegeFlag(dominion, preFlag, player);
+ } else {
+ EnvFlag envFlag = (EnvFlag) flag;
+ return api.checkEnvironmentFlag(dominion, envFlag);
+ }
+ }
+
+ private @Nullable Flag getDominionFlagFromInteraction(@Nonnull Interaction action) {
+ switch (action) {
+ case BREAK_BLOCK:
+ return Flags.BREAK_BLOCK;
+ case PLACE_BLOCK:
+ return Flags.PLACE;
+ case INTERACT_BLOCK:
+ return Flags.CONTAINER;
+ case ATTACK_PLAYER:
+ return Flags.PVP;
+ default:
+ return null;
+ }
+ }
+}