From f52b54db32fccaf1aae0eb040f6e8303abba7085 Mon Sep 17 00:00:00 2001 From: TreemanKing <67459602+TreemanKing@users.noreply.github.com> Date: Sun, 12 May 2024 12:11:34 +1000 Subject: [PATCH] feat: add permission tag & compatible block trigger list * Update DataStorage.java - Fix error in folder creation. - Use output file directly instead of asserting a new one * Fix Null PlayerDataServices * Feature: Add only compatible blocks to the trigger block list * Permission Tag Added --- .../core/AdvancedPortalsCore.java | 6 +- .../core/permissions/PortalPermissions.java | 2 +- .../core/portal/AdvancedPortal.java | 15 ++-- .../core/serializeddata/DataStorage.java | 4 +- .../core/services/PortalServices.java | 10 +-- .../core/tags/activation/NameTag.java | 7 ++ .../core/tags/activation/PermissionTag.java | 74 +++++++++++++++++++ .../advancedportals/core/warphandler/Tag.java | 2 + lang/src/main/resources/lang/en_GB.lang | 1 + .../container/SpigotServerContainer.java | 11 ++- 10 files changed, 111 insertions(+), 21 deletions(-) create mode 100644 core/src/main/java/com/sekwah/advancedportals/core/tags/activation/PermissionTag.java diff --git a/core/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java b/core/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java index c320d48b..1b0afded 100644 --- a/core/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java @@ -15,10 +15,7 @@ import com.sekwah.advancedportals.core.services.DestinationServices; import com.sekwah.advancedportals.core.services.PortalServices; import com.sekwah.advancedportals.core.services.PlayerDataServices; -import com.sekwah.advancedportals.core.tags.activation.CooldownTag; -import com.sekwah.advancedportals.core.tags.activation.DestiTag; -import com.sekwah.advancedportals.core.tags.activation.NameTag; -import com.sekwah.advancedportals.core.tags.activation.TriggerBlockTag; +import com.sekwah.advancedportals.core.tags.activation.*; import com.sekwah.advancedportals.core.util.GameScheduler; import com.sekwah.advancedportals.core.util.InfoLogger; import com.sekwah.advancedportals.core.util.Lang; @@ -121,6 +118,7 @@ private void registerTags() { this.tagRegistry.registerTag(new DestiTag()); this.tagRegistry.registerTag(new CooldownTag()); this.tagRegistry.registerTag(new TriggerBlockTag()); + this.tagRegistry.registerTag(new PermissionTag()); } /** diff --git a/core/src/main/java/com/sekwah/advancedportals/core/permissions/PortalPermissions.java b/core/src/main/java/com/sekwah/advancedportals/core/permissions/PortalPermissions.java index d1600240..62ee25a3 100644 --- a/core/src/main/java/com/sekwah/advancedportals/core/permissions/PortalPermissions.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/permissions/PortalPermissions.java @@ -16,7 +16,7 @@ public class PortalPermissions { /** - * this will not currently build the permissions for the files, but maybe at some point. I'tll just make it easier though. + * this will not currently build the permissions for the files, but maybe at some point. It'll just make it easier though. */ public static class PermissionBuilder { private final String permissionTag; diff --git a/core/src/main/java/com/sekwah/advancedportals/core/portal/AdvancedPortal.java b/core/src/main/java/com/sekwah/advancedportals/core/portal/AdvancedPortal.java index 8bb76022..20401ccf 100644 --- a/core/src/main/java/com/sekwah/advancedportals/core/portal/AdvancedPortal.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/portal/AdvancedPortal.java @@ -12,7 +12,6 @@ import com.sekwah.advancedportals.core.services.PlayerDataServices; import com.sekwah.advancedportals.core.tags.activation.TriggerBlockTag; import com.sekwah.advancedportals.core.util.Lang; -import com.sekwah.advancedportals.core.util.PlayerUtils; import com.sekwah.advancedportals.core.warphandler.ActivationData; import com.sekwah.advancedportals.core.warphandler.Tag; @@ -24,7 +23,7 @@ public class AdvancedPortal implements TagTarget { @Inject - transient TagRegistry tagRegistry; + private transient TagRegistry tagRegistry; @SerializedName("max") private BlockLocation maxLoc; @@ -33,15 +32,17 @@ public class AdvancedPortal implements TagTarget { private BlockLocation minLoc; @SerializedName("a") - private HashMap args = new HashMap<>(); + private final HashMap args = new HashMap<>(); @Inject - transient PlayerDataServices playerDataServices; + private transient PlayerDataServices playerDataServices; @Inject transient ConfigRepository configRepository; - public AdvancedPortal(BlockLocation minLoc, BlockLocation maxLoc) { + public AdvancedPortal(BlockLocation minLoc, BlockLocation maxLoc, TagRegistry tagRegistry, PlayerDataServices playerDataServices) { + this.tagRegistry = tagRegistry; + this.playerDataServices = playerDataServices; this.updateBounds(minLoc, maxLoc); } @@ -103,7 +104,7 @@ public void updateBounds(BlockLocation loc1, BlockLocation loc2) { /** * - * @param player + * @param player The player on the server attempting to use an advanced portal * @param moveActivated if the portal was activated by a move event (won't trigger knockback) * @return */ @@ -157,7 +158,6 @@ public boolean activate(PlayerContainer player, boolean moveActivated) { return false; } - public boolean isLocationInPortal(BlockLocation loc) { return this.isLocationInPortal(loc, 0); } @@ -166,7 +166,6 @@ public boolean isLocationInPortal(PlayerLocation loc) { return this.isLocationInPortal(loc.toBlockPos(), 0); } - public boolean isLocationInPortal(PlayerLocation loc, int additionalArea) { return this.isLocationInPortal(loc.toBlockPos(), additionalArea); } diff --git a/core/src/main/java/com/sekwah/advancedportals/core/serializeddata/DataStorage.java b/core/src/main/java/com/sekwah/advancedportals/core/serializeddata/DataStorage.java index e9f1b306..0f17ddae 100644 --- a/core/src/main/java/com/sekwah/advancedportals/core/serializeddata/DataStorage.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/serializeddata/DataStorage.java @@ -78,14 +78,14 @@ public T loadJson(Class dataHolder, String location) { public boolean storeJson(Object dataHolder, String location) { // Create folders if they don't exist File outFile = new File(this.dataFolder, location); - if (!outFile.exists()) { + if (!outFile.getParentFile().exists()) { // Check if parent folder exists if(!outFile.getParentFile().mkdirs()) { infoLogger.warning("Failed to create folder for file: " + location); } } String json = gson.toJson(dataHolder); try { - FileWriter fileWriter = new FileWriter(new File(this.dataFolder, location)); + FileWriter fileWriter = new FileWriter(outFile); // Use outFile directly here fileWriter.write(json); fileWriter.close(); return true; diff --git a/core/src/main/java/com/sekwah/advancedportals/core/services/PortalServices.java b/core/src/main/java/com/sekwah/advancedportals/core/services/PortalServices.java index 649e0451..a5b3763c 100644 --- a/core/src/main/java/com/sekwah/advancedportals/core/services/PortalServices.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/services/PortalServices.java @@ -25,7 +25,7 @@ public class PortalServices { private IPortalRepository portalRepository; @Inject - private PlayerDataServices playerDataServices; + private transient PlayerDataServices playerDataServices; @Inject private ConfigRepository configRepository; @@ -88,17 +88,17 @@ public void playerMove(PlayerContainer player, PlayerLocation toLoc) { || (portal.isLocationInPortal(blockEntityTopLoc) && portal.isTriggerBlock(blockEntityTopMaterial))) { notInPortal = false; - if(portal.activate(player, true)) { + if (portal.activate(player, true)) { return; } } } var playerData = playerDataServices.getPlayerData(player); - if(!notInPortal) { + if (!notInPortal) { var strength = configRepository.getThrowbackStrength(); PlayerUtils.throwPlayerBack(player, strength); } - if(playerData.isInPortal() && notInPortal) { + if (playerData.isInPortal() && notInPortal) { playerData.setInPortal(false); } } @@ -154,7 +154,7 @@ else if(this.portalRepository.containsKey(name)) { return null; } - AdvancedPortal portal = new AdvancedPortal(pos1, pos2); + AdvancedPortal portal = new AdvancedPortal(pos1, pos2, tagRegistry, playerDataServices); for (DataTag portalTag : tags) { portal.setArgValues(portalTag); diff --git a/core/src/main/java/com/sekwah/advancedportals/core/tags/activation/NameTag.java b/core/src/main/java/com/sekwah/advancedportals/core/tags/activation/NameTag.java index e8a1a0aa..e758f92d 100644 --- a/core/src/main/java/com/sekwah/advancedportals/core/tags/activation/NameTag.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/tags/activation/NameTag.java @@ -6,6 +6,7 @@ import com.sekwah.advancedportals.core.warphandler.ActivationData; import com.sekwah.advancedportals.core.warphandler.Tag; +import javax.annotation.Nullable; import java.util.List; /** @@ -46,6 +47,12 @@ public List autoComplete(String argData) { return null; } + @Nullable + @Override + public String splitString() { + return null; + } + @Override public boolean created(TagTarget target, PlayerContainer player, String[] argData) { if (argData.length > 0) { diff --git a/core/src/main/java/com/sekwah/advancedportals/core/tags/activation/PermissionTag.java b/core/src/main/java/com/sekwah/advancedportals/core/tags/activation/PermissionTag.java new file mode 100644 index 00000000..cd1c697e --- /dev/null +++ b/core/src/main/java/com/sekwah/advancedportals/core/tags/activation/PermissionTag.java @@ -0,0 +1,74 @@ +package com.sekwah.advancedportals.core.tags.activation; + +import com.sekwah.advancedportals.core.connector.containers.PlayerContainer; +import com.sekwah.advancedportals.core.permissions.PortalPermissions; +import com.sekwah.advancedportals.core.portal.AdvancedPortal; +import com.sekwah.advancedportals.core.registry.TagTarget; +import com.sekwah.advancedportals.core.repository.ConfigRepository; +import com.sekwah.advancedportals.core.services.PlayerDataServices; +import com.sekwah.advancedportals.core.util.InfoLogger; +import com.sekwah.advancedportals.core.util.Lang; +import com.sekwah.advancedportals.core.warphandler.ActivationData; +import com.sekwah.advancedportals.core.warphandler.Tag; + +import javax.annotation.Nullable; +import javax.inject.Inject; +import java.util.List; + +public class PermissionTag implements Tag.Activation{ + + @Inject + transient PlayerDataServices playerDataServices; + + @Inject + transient ConfigRepository configRepository; + + @Inject + private InfoLogger infoLogger; + + public static String TAG_NAME = "permission"; + + private final String[] aliases = new String[]{ "perm" }; + + private final TagType[] tagTypes = new TagType[]{ TagType.PORTAL }; + + @Override + public TagType[] getTagTypes() { + return tagTypes; + } + + @Override + public String getName() { + return TAG_NAME; + } + + @Nullable + @Override + public String[] getAliases() { + return new String[0]; + } + + @Override + public String description() { + return Lang.translate("tag.permission.description"); + } + + @Override + public boolean preActivated(TagTarget target, PlayerContainer player, ActivationData activeData, String[] argData) { + if (target instanceof AdvancedPortal portal) { + var portalName = portal.getName(); + if (!player.hasPermission(argData[0])) return false; + } + return false; + } + + @Override + public void postActivated(TagTarget target, PlayerContainer player, ActivationData activationData, String[] argData) { + + } + + @Override + public boolean activated(TagTarget target, PlayerContainer player, ActivationData activationData, String[] argData) { + return true; + } +} diff --git a/core/src/main/java/com/sekwah/advancedportals/core/warphandler/Tag.java b/core/src/main/java/com/sekwah/advancedportals/core/warphandler/Tag.java index f02cde93..8cbe5afb 100644 --- a/core/src/main/java/com/sekwah/advancedportals/core/warphandler/Tag.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/warphandler/Tag.java @@ -55,6 +55,8 @@ interface AutoComplete extends Tag { @Nullable List autoComplete(String argData); + @Nullable + String splitString(); } interface Split extends Tag { diff --git a/lang/src/main/resources/lang/en_GB.lang b/lang/src/main/resources/lang/en_GB.lang index 4cac766c..1846b50d 100644 --- a/lang/src/main/resources/lang/en_GB.lang +++ b/lang/src/main/resources/lang/en_GB.lang @@ -157,6 +157,7 @@ items.selector.pos=Select pos %1$s items.interact.left=Left Click items.interact.right=Right Click +tag.permission.description=Sets the permission of a portal tag.desti.description=Sets the destination of the portal tag.name.error.nospaces= The name cannot contain spaces. tag.triggerblock.description=Sets the trigger block/s of the portal. Comma seperated or multi tag. diff --git a/spigot/src/main/java/com/sekwah/advancedportals/spigot/connector/container/SpigotServerContainer.java b/spigot/src/main/java/com/sekwah/advancedportals/spigot/connector/container/SpigotServerContainer.java index 3426e199..d71a3f8d 100644 --- a/spigot/src/main/java/com/sekwah/advancedportals/spigot/connector/container/SpigotServerContainer.java +++ b/spigot/src/main/java/com/sekwah/advancedportals/spigot/connector/container/SpigotServerContainer.java @@ -5,6 +5,7 @@ import com.sekwah.advancedportals.core.connector.containers.WorldContainer; import org.bukkit.Material; import org.bukkit.Server; +import org.bukkit.block.Block; import java.util.Arrays; import java.util.List; @@ -13,7 +14,7 @@ public class SpigotServerContainer implements ServerContainer { private final Server server; - private final List triggerBlockList = Arrays.stream(Material.values()).filter(Material::isBlock).map(Enum::name) + private final List triggerBlockList = Arrays.stream(Material.values()).filter(this::isAdvancedPortalBlock).map(Enum::name) .toList(); public SpigotServerContainer(Server server) { @@ -61,4 +62,12 @@ public PlayerContainer[] getPlayers() { .map(SpigotPlayerContainer::new) .toArray(PlayerContainer[]::new); } + + // Check if it's a material compatible with making portals + private boolean isAdvancedPortalBlock(Material material) { + return switch (material) { + case WATER, LAVA, AIR, NETHER_PORTAL, END_GATEWAY, END_PORTAL -> true; + default -> false; + }; + } }