diff --git a/dough-api/pom.xml b/dough-api/pom.xml index 4bb28d00..e56160ab 100644 --- a/dough-api/pom.xml +++ b/dough-api/pom.xml @@ -443,6 +443,14 @@ <version>1.0.580</version> <scope>provided</scope> </dependency> + + <!-- Dominion --> + <dependency> + <groupId>cn.lunadeer</groupId> + <artifactId>DominionAPI</artifactId> + <version>4.2</version> + <scope>provided</scope> + </dependency> </dependencies> </project> diff --git a/dough-protection/pom.xml b/dough-protection/pom.xml index d12c8315..992f8948 100644 --- a/dough-protection/pom.xml +++ b/dough-protection/pom.xml @@ -439,6 +439,20 @@ </exclusion> </exclusions> </dependency> + + <!-- Dominion --> + <dependency> + <groupId>cn.lunadeer</groupId> + <artifactId>DominionAPI</artifactId> + <version>4.2</version> + <scope>provided</scope> + <exclusions> + <exclusion> + <artifactId>bukkit</artifactId> + <groupId>*</groupId> + </exclusion> + </exclusions> + </dependency> </dependencies> </project> 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..0732a0f4 --- /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.PLAYER_DAMAGE; + default: + return null; + } + } +}