From 15a2b866670e9e3519d786ea8fee0d0401d90994 Mon Sep 17 00:00:00 2001 From: Daniel Saukel Date: Sat, 11 Apr 2020 02:02:42 +0200 Subject: [PATCH] Overhaul requirements --- .../erethon/dungeonsxl/api/Requirement.java | 9 ++ .../dungeonsxl/api/player/GamePlayer.java | 2 +- .../dungeonsxl/api/player/GlobalPlayer.java | 11 ++ .../dungeonsxl/command/PlayCommand.java | 4 + .../erethon/dungeonsxl/config/DMessage.java | 6 + .../de/erethon/dungeonsxl/global/DPortal.java | 20 ++- .../dungeonsxl/player/DGamePlayer.java | 140 +----------------- .../dungeonsxl/player/DGlobalPlayer.java | 138 +++++++++++++++++ .../de/erethon/dungeonsxl/player/DGroup.java | 3 +- .../requirement/FeeLevelRequirement.java | 29 +++- .../requirement/FeeMoneyRequirement.java | 18 +++ .../ForbiddenItemsRequirement.java | 36 +++++ .../requirement/GroupSizeRequirement.java | 19 +++ .../requirement/KeyItemsRequirement.java | 36 +++++ .../requirement/PermissionRequirement.java | 26 +++- .../erethon/dungeonsxl/world/WorldConfig.java | 5 - .../dungeonsxl/world/block/RewardChest.java | 4 +- core/src/main/resources/languages/english.yml | 6 + core/src/main/resources/languages/french.yml | 6 + core/src/main/resources/languages/german.yml | 6 + 20 files changed, 367 insertions(+), 157 deletions(-) diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/Requirement.java b/api/src/main/java/de/erethon/dungeonsxl/api/Requirement.java index 629ebdba..ebd3a1ed 100644 --- a/api/src/main/java/de/erethon/dungeonsxl/api/Requirement.java +++ b/api/src/main/java/de/erethon/dungeonsxl/api/Requirement.java @@ -14,6 +14,7 @@ */ package de.erethon.dungeonsxl.api; +import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; @@ -39,6 +40,14 @@ public interface Requirement { */ boolean check(Player player); + /** + * Returns the message that informs the player if they fulfill the requirement. + * + * @param player the player who will receive the message + * @return the error message that is sent to the player when they do not fulfill the requirement + */ + BaseComponent[] getCheckMessage(Player player); + /** * This is fired after the {@link #check(Player)} has been accepted. It demands the requirement from the given player. This may be empty for a "key" or may * take something away for a "fee" requirement. diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/player/GamePlayer.java b/api/src/main/java/de/erethon/dungeonsxl/api/player/GamePlayer.java index a3df8669..6415f645 100644 --- a/api/src/main/java/de/erethon/dungeonsxl/api/player/GamePlayer.java +++ b/api/src/main/java/de/erethon/dungeonsxl/api/player/GamePlayer.java @@ -26,7 +26,7 @@ import org.bukkit.entity.Wolf; * * @author Daniel Saukel */ -// Implementation-specific methods: isInTestMode, setReady, [wolf, group tag, requirement, loot check methods], finishFloor +// Implementation-specific methods: isInTestMode, setReady, [wolf, group tag methods], finishFloor public interface GamePlayer extends InstancePlayer { /** diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/player/GlobalPlayer.java b/api/src/main/java/de/erethon/dungeonsxl/api/player/GlobalPlayer.java index 1bbf5385..34b1380d 100644 --- a/api/src/main/java/de/erethon/dungeonsxl/api/player/GlobalPlayer.java +++ b/api/src/main/java/de/erethon/dungeonsxl/api/player/GlobalPlayer.java @@ -16,6 +16,7 @@ package de.erethon.dungeonsxl.api.player; import de.erethon.commons.chat.MessageUtil; import de.erethon.commons.player.PlayerWrapper; +import de.erethon.dungeonsxl.api.dungeon.Dungeon; import java.util.List; import org.bukkit.Location; import org.bukkit.inventory.ItemStack; @@ -137,4 +138,14 @@ public interface GlobalPlayer extends PlayerWrapper { */ void reset(Location tpLoc, boolean keepInventory); + /** + * Performs a requirement check for the given dungeon. + *

+ * This method might send messages to the player to inform him that he does not fulfill them. + * + * @param dungeon the dungeon to check + * @return if the player fulfills the requirements or may bypass them + */ + boolean checkRequirements(Dungeon dungeon); + } diff --git a/core/src/main/java/de/erethon/dungeonsxl/command/PlayCommand.java b/core/src/main/java/de/erethon/dungeonsxl/command/PlayCommand.java index bbd77cce..90a3e769 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/command/PlayCommand.java +++ b/core/src/main/java/de/erethon/dungeonsxl/command/PlayCommand.java @@ -82,6 +82,10 @@ public class PlayCommand extends DCommand { } group.setDungeon(dungeon); + if (!dPlayer.checkRequirements(dungeon)) { + return; + } + GameWorld gameWorld = dungeon.getMap().instantiateGameWorld(false); if (gameWorld == null) { MessageUtil.sendMessage(player, DMessage.ERROR_TOO_MANY_INSTANCES.getMessage()); diff --git a/core/src/main/java/de/erethon/dungeonsxl/config/DMessage.java b/core/src/main/java/de/erethon/dungeonsxl/config/DMessage.java index d2155b78..940f4f23 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/config/DMessage.java +++ b/core/src/main/java/de/erethon/dungeonsxl/config/DMessage.java @@ -199,6 +199,12 @@ public enum DMessage implements Message { PLAYER_UNLIMITED_LIVES("player.unlimitedLives"), PLAYER_WAIT_FOR_OTHER_PLAYERS("player.waitForOtherPlayers"), REQUIREMENT_FEE("requirement.fee"), + REQUIREMENT_FEE_LEVEL("requirement.feeLevel"), + REQUIREMENT_FEE_MONEY("requirement.feeMoney"), + REQUIREMENT_FORBIDDEN_ITEMS("requirement.forbiddenItems"), + REQUIREMENT_GROUP_SIZE("requirement.groupSize"), + REQUIREMENT_KEY_ITEMS("requirement.keyItems"), + REQUIREMENT_PERMISSION("requirement.permission"), REWARD_GENERAL("reward.general"), SIGN_END("sign.end"), SIGN_FLOOR_1("sign.floor.1"), diff --git a/core/src/main/java/de/erethon/dungeonsxl/global/DPortal.java b/core/src/main/java/de/erethon/dungeonsxl/global/DPortal.java index 6627b31f..d65d577e 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/global/DPortal.java +++ b/core/src/main/java/de/erethon/dungeonsxl/global/DPortal.java @@ -21,6 +21,7 @@ import de.erethon.caliburn.item.VanillaItem; import de.erethon.commons.chat.MessageUtil; import de.erethon.commons.misc.BlockUtil; import de.erethon.dungeonsxl.DungeonsXL; +import de.erethon.dungeonsxl.api.dungeon.Dungeon; import de.erethon.dungeonsxl.api.dungeon.Game; import de.erethon.dungeonsxl.api.player.PlayerGroup; import de.erethon.dungeonsxl.api.world.GameWorld; @@ -246,15 +247,22 @@ public class DPortal extends GlobalProtection { return; } + Dungeon dungeon = group.getDungeon(); + if (dungeon == null) { + MessageUtil.sendMessage(player, DMessage.ERROR_NO_SUCH_DUNGEON.getMessage()); + return; + } + + if (!plugin.getPlayerCache().get(player).checkRequirements()) { + return; + } + GameWorld target = group.getGameWorld(); Game game = group.getGame(); if (target == null && game != null) { target = game.getWorld(); - } - - if (target == null) { - if (game != null) { + if (target == null) { for (PlayerGroup otherTeam : game.getGroups()) { if (otherTeam.getGameWorld() != null) { target = otherTeam.getGameWorld(); @@ -264,8 +272,8 @@ public class DPortal extends GlobalProtection { } } - if (target == null && group.getDungeon() != null) { - ResourceWorld resource = group.getDungeon().getMap(); + if (target == null) { + ResourceWorld resource = dungeon.getMap(); if (resource != null) { target = resource.instantiateGameWorld(false); if (target == null) { diff --git a/core/src/main/java/de/erethon/dungeonsxl/player/DGamePlayer.java b/core/src/main/java/de/erethon/dungeonsxl/player/DGamePlayer.java index 75496719..25e48551 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/player/DGamePlayer.java +++ b/core/src/main/java/de/erethon/dungeonsxl/player/DGamePlayer.java @@ -21,9 +21,6 @@ import de.erethon.caliburn.mob.VanillaMob; import de.erethon.commons.chat.MessageUtil; import de.erethon.commons.player.PlayerUtil; import de.erethon.dungeonsxl.DungeonsXL; -import de.erethon.dungeonsxl.api.Requirement; -import de.erethon.dungeonsxl.api.Reward; -import de.erethon.dungeonsxl.api.dungeon.Dungeon; import de.erethon.dungeonsxl.api.dungeon.Game; import de.erethon.dungeonsxl.api.dungeon.GameGoal; import de.erethon.dungeonsxl.api.dungeon.GameRule; @@ -40,14 +37,10 @@ import de.erethon.dungeonsxl.event.dplayer.DPlayerKickEvent; import de.erethon.dungeonsxl.event.dplayer.instance.DInstancePlayerUpdateEvent; import de.erethon.dungeonsxl.event.dplayer.instance.game.DGamePlayerFinishEvent; import de.erethon.dungeonsxl.event.dplayer.instance.game.DGamePlayerRewardEvent; -import de.erethon.dungeonsxl.event.requirement.RequirementCheckEvent; import de.erethon.dungeonsxl.trigger.DistanceTrigger; import de.erethon.dungeonsxl.world.DGameWorld; import de.erethon.dungeonsxl.world.DResourceWorld; import de.erethon.dungeonsxl.world.block.TeamFlag; -import java.io.File; -import java.util.ArrayList; -import java.util.List; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -400,7 +393,7 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer { DGamePlayerRewardEvent dGroupRewardEvent = new DGamePlayerRewardEvent(this); Bukkit.getPluginManager().callEvent(dGroupRewardEvent); if (!dGroupRewardEvent.isCancelled()) { - giveLoot(rules, rules.getState(GameRule.REWARDS), dGroup.getRewards()); + giveLoot(getGroup().getDungeon(), rules.getState(GameRule.REWARDS), dGroup.getRewards()); } getData().logTimeLastFinished(getGroup().getDungeonName()); @@ -482,134 +475,6 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer { } } - public boolean checkRequirements(Dungeon dungeon) { - if (DPermission.hasPermission(player, DPermission.IGNORE_REQUIREMENTS)) { - return true; - } - - GameRuleContainer rules = dungeon.getRules(); - - if (!checkTimeAfterStart(dungeon) && !checkTimeAfterFinish(dungeon)) { - int longestTime = rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_START) >= rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_FINISH) - ? rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_START) : rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_FINISH); - MessageUtil.sendMessage(player, DMessage.ERROR_COOLDOWN.getMessage(String.valueOf(longestTime))); - return false; - - } else if (!checkTimeAfterStart(dungeon)) { - MessageUtil.sendMessage(player, DMessage.ERROR_COOLDOWN.getMessage(String.valueOf(rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_START)))); - return false; - - } else if (!checkTimeAfterFinish(dungeon)) { - MessageUtil.sendMessage(player, DMessage.ERROR_COOLDOWN.getMessage(String.valueOf(rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_FINISH)))); - return false; - } - - for (Requirement requirement : rules.getState(GameRule.REQUIREMENTS)) { - RequirementCheckEvent event = new RequirementCheckEvent(requirement, player); - Bukkit.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - continue; - } - - if (!requirement.check(player)) { - return false; - } - } - - if (rules.getState(GameRule.MUST_FINISH_ALL) != null) { - List finished = new ArrayList<>(rules.getState(GameRule.MUST_FINISH_ALL)); - if (rules.getState(GameRule.MUST_FINISH_ONE) != null) { - finished.addAll(rules.getState(GameRule.MUST_FINISH_ONE)); - } - - if (!finished.isEmpty()) { - - long bestTime = 0; - int numOfNeeded = 0; - boolean doneTheOne = false; - - if (finished.size() == rules.getState(GameRule.MUST_FINISH_ALL).size()) { - doneTheOne = true; - } - - for (String played : finished) { - for (String dungeonName : DungeonsXL.MAPS.list()) { - if (new File(DungeonsXL.MAPS, dungeonName).isDirectory()) { - if (played.equalsIgnoreCase(dungeonName) || played.equalsIgnoreCase("any")) { - - Long time = getData().getTimeLastFinished(dungeonName); - if (time != -1) { - if (rules.getState(GameRule.MUST_FINISH_ALL).contains(played)) { - numOfNeeded++; - } else { - doneTheOne = true; - } - if (bestTime < time) { - bestTime = time; - } - } - break; - - } - } - } - } - - if (bestTime == 0) { - return false; - - } else if (rules.getState(GameRule.TIME_LAST_PLAYED_REQUIRED_DUNGEONS) != 0) { - if (System.currentTimeMillis() - bestTime > rules.getState(GameRule.TIME_LAST_PLAYED_REQUIRED_DUNGEONS) * (long) 3600000) { - return false; - } - } - - if (numOfNeeded < rules.getState(GameRule.MUST_FINISH_ALL).size() || !doneTheOne) { - return false; - } - - } - } - - return true; - } - - public boolean checkTimeAfterStart(Dungeon dungeon) { - return checkTime(dungeon, dungeon.getRules().getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_START), - getData().getTimeLastStarted(dungeon.getName())); - } - - public boolean checkTimeAfterFinish(Dungeon dungeon) { - return checkTime(dungeon, dungeon.getRules().getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_FINISH), - getData().getTimeLastFinished(dungeon.getName())); - } - - public boolean checkTime(Dungeon dungeon, int requirement, long dataTime) { - if (DPermission.hasPermission(player, DPermission.IGNORE_TIME_LIMIT)) { - return true; - } - - return dataTime == -1 || dataTime + requirement * 1000 * 60 * 60 <= System.currentTimeMillis(); - } - - public void giveLoot(GameRuleContainer rules, List ruleRewards, List groupRewards) { - if (!canLoot(rules)) { - return; - } - ruleRewards.forEach(r -> r.giveTo(player.getPlayer())); - groupRewards.forEach(r -> r.giveTo(player.getPlayer())); - getData().logTimeLastLoot(dGroup.getDungeon().getName()); - } - - public boolean canLoot(GameRuleContainer rules) { - return getTimeNextLoot(rules) <= getData().getTimeLastStarted(getGroup().getDungeonName()); - } - - public long getTimeNextLoot(GameRuleContainer rules) { - return rules.getState(GameRule.TIME_TO_NEXT_LOOT) * 60 * 60 * 1000 + getData().getTimeLastLoot(getGroup().getDungeonName()); - } - @Override public boolean ready() { return ready(true); @@ -626,8 +491,7 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer { } game.setRewards(rewards); - if (!checkRequirements(game.getDungeon())) { - MessageUtil.sendMessage(player, DMessage.ERROR_REQUIREMENTS.getMessage()); + if (rewards && !checkRequirements(game.getDungeon())) { return false; } diff --git a/core/src/main/java/de/erethon/dungeonsxl/player/DGlobalPlayer.java b/core/src/main/java/de/erethon/dungeonsxl/player/DGlobalPlayer.java index 514b9f12..e1fcb5d2 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/player/DGlobalPlayer.java +++ b/core/src/main/java/de/erethon/dungeonsxl/player/DGlobalPlayer.java @@ -20,16 +20,22 @@ import de.erethon.commons.chat.MessageUtil; import de.erethon.commons.compatibility.Internals; import de.erethon.commons.player.PlayerUtil; import de.erethon.dungeonsxl.DungeonsXL; +import de.erethon.dungeonsxl.api.Requirement; +import de.erethon.dungeonsxl.api.Reward; import de.erethon.dungeonsxl.api.dungeon.Dungeon; +import de.erethon.dungeonsxl.api.dungeon.GameRule; +import de.erethon.dungeonsxl.api.dungeon.GameRuleContainer; import de.erethon.dungeonsxl.api.player.GlobalPlayer; import de.erethon.dungeonsxl.api.player.PlayerGroup; import de.erethon.dungeonsxl.api.world.GameWorld; import de.erethon.dungeonsxl.config.DMessage; import de.erethon.dungeonsxl.dungeon.DGame; import de.erethon.dungeonsxl.event.dgroup.DGroupCreateEvent; +import de.erethon.dungeonsxl.event.requirement.RequirementCheckEvent; import de.erethon.dungeonsxl.global.DPortal; import de.erethon.dungeonsxl.util.NBTUtil; import java.io.File; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.bukkit.Bukkit; @@ -253,6 +259,138 @@ public class DGlobalPlayer implements GlobalPlayer { return DPermission.hasPermission(player, permission); } + public boolean checkRequirements(Dungeon dungeon) { + boolean fulfilled = true; + GameRuleContainer rules = dungeon.getRules(); + + if (!checkTimeAfterStart(dungeon) && !checkTimeAfterFinish(dungeon)) { + int longestTime = rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_START) >= rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_FINISH) + ? rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_START) : rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_FINISH); + MessageUtil.sendMessage(player, DMessage.ERROR_COOLDOWN.getMessage(String.valueOf(longestTime))); + fulfilled = false; + + } else if (!checkTimeAfterStart(dungeon)) { + MessageUtil.sendMessage(player, DMessage.ERROR_COOLDOWN.getMessage(String.valueOf(rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_START)))); + fulfilled = false; + + } else if (!checkTimeAfterFinish(dungeon)) { + MessageUtil.sendMessage(player, DMessage.ERROR_COOLDOWN.getMessage(String.valueOf(rules.getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_FINISH)))); + fulfilled = false; + } + + boolean genericReqs = true; + for (Requirement requirement : rules.getState(GameRule.REQUIREMENTS)) { + RequirementCheckEvent event = new RequirementCheckEvent(requirement, player); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + continue; + } + + if (!requirement.check(player)) { + fulfilled = false; + genericReqs = false; + } + } + if (!genericReqs) { + MessageUtil.sendMessage(player, DMessage.ERROR_REQUIREMENTS.getMessage()); + rules.getState(GameRule.REQUIREMENTS).forEach(r -> MessageUtil.sendMessage(player, r.getCheckMessage(player))); + } + + if (rules.getState(GameRule.MUST_FINISH_ALL) != null) { + List finished = new ArrayList<>(rules.getState(GameRule.MUST_FINISH_ALL)); + if (rules.getState(GameRule.MUST_FINISH_ONE) != null) { + finished.addAll(rules.getState(GameRule.MUST_FINISH_ONE)); + } + + if (!finished.isEmpty()) { + + long bestTime = 0; + int numOfNeeded = 0; + boolean doneTheOne = false; + + if (finished.size() == rules.getState(GameRule.MUST_FINISH_ALL).size()) { + doneTheOne = true; + } + + for (String played : finished) { + for (String dungeonName : DungeonsXL.MAPS.list()) { + if (new File(DungeonsXL.MAPS, dungeonName).isDirectory()) { + if (played.equalsIgnoreCase(dungeonName) || played.equalsIgnoreCase("any")) { + + Long time = getData().getTimeLastFinished(dungeonName); + if (time != -1) { + if (rules.getState(GameRule.MUST_FINISH_ALL).contains(played)) { + numOfNeeded++; + } else { + doneTheOne = true; + } + if (bestTime < time) { + bestTime = time; + } + } + break; + + } + } + } + } + + if (bestTime == 0) { + fulfilled = false; + + } else if (rules.getState(GameRule.TIME_LAST_PLAYED_REQUIRED_DUNGEONS) != 0) { + if (System.currentTimeMillis() - bestTime > rules.getState(GameRule.TIME_LAST_PLAYED_REQUIRED_DUNGEONS) * (long) 3600000) { + fulfilled = false; + } + } + + if (numOfNeeded < rules.getState(GameRule.MUST_FINISH_ALL).size() || !doneTheOne) { + fulfilled = false; + } + + } + } + + return fulfilled || DPermission.hasPermission(player, DPermission.IGNORE_REQUIREMENTS); + } + + public boolean checkTimeAfterStart(Dungeon dungeon) { + return checkTime(dungeon, dungeon.getRules().getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_START), + getData().getTimeLastStarted(dungeon.getName())); + } + + public boolean checkTimeAfterFinish(Dungeon dungeon) { + return checkTime(dungeon, dungeon.getRules().getState(GameRule.TIME_TO_NEXT_PLAY_AFTER_FINISH), + getData().getTimeLastFinished(dungeon.getName())); + } + + public boolean checkTime(Dungeon dungeon, int requirement, long dataTime) { + if (DPermission.hasPermission(player, DPermission.IGNORE_TIME_LIMIT)) { + return true; + } + + return dataTime == -1 || dataTime + requirement * 1000 * 60 * 60 <= System.currentTimeMillis(); + } + + public void giveLoot(Dungeon dungeon, List ruleRewards, List groupRewards) { + if (!canLoot(dungeon)) { + return; + } + ruleRewards.forEach(r -> r.giveTo(player.getPlayer())); + groupRewards.forEach(r -> r.giveTo(player.getPlayer())); + if (getGroup() != null && getGroup().getDungeon() != null) { + getData().logTimeLastLoot(getGroup().getDungeon().getName()); + } + } + + public boolean canLoot(Dungeon dungeon) { + return getTimeNextLoot(dungeon) <= getData().getTimeLastStarted(dungeon.getName()); + } + + public long getTimeNextLoot(Dungeon dungeon) { + return dungeon.getRules().getState(GameRule.TIME_TO_NEXT_LOOT) * 60 * 60 * 1000 + getData().getTimeLastLoot(dungeon.getName()); + } + /* Actions */ @Override public void sendMessage(String message) { diff --git a/core/src/main/java/de/erethon/dungeonsxl/player/DGroup.java b/core/src/main/java/de/erethon/dungeonsxl/player/DGroup.java index 0be1599a..18aab01d 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/player/DGroup.java +++ b/core/src/main/java/de/erethon/dungeonsxl/player/DGroup.java @@ -761,7 +761,6 @@ public class DGroup implements PlayerGroup { for (Requirement requirement : rules.getState(GameRule.REQUIREMENTS)) { RequirementDemandEvent requirementDemandEvent = new RequirementDemandEvent(requirement, player); Bukkit.getPluginManager().callEvent(event); - if (requirementDemandEvent.isCancelled()) { continue; } @@ -800,6 +799,7 @@ public class DGroup implements PlayerGroup { } } + // This is not used. public boolean checkTime() { if (DPermission.hasPermission(getLeader(), DPermission.IGNORE_TIME_LIMIT)) { return true; @@ -814,6 +814,7 @@ public class DGroup implements PlayerGroup { return true; } + // This is not used. public boolean checkRequirements() { if (DPermission.hasPermission(getLeader(), DPermission.IGNORE_REQUIREMENTS)) { return true; diff --git a/core/src/main/java/de/erethon/dungeonsxl/requirement/FeeLevelRequirement.java b/core/src/main/java/de/erethon/dungeonsxl/requirement/FeeLevelRequirement.java index 5e1e8540..4b6d9ff2 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/requirement/FeeLevelRequirement.java +++ b/core/src/main/java/de/erethon/dungeonsxl/requirement/FeeLevelRequirement.java @@ -24,7 +24,11 @@ import de.erethon.dungeonsxl.api.dungeon.GameRule; import de.erethon.dungeonsxl.api.dungeon.GameRuleContainer; import de.erethon.dungeonsxl.config.DMessage; import de.erethon.dungeonsxl.player.DGamePlayer; +import de.erethon.dungeonsxl.player.DGlobalPlayer; import de.erethon.dungeonsxl.player.DPlayerData; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; @@ -65,12 +69,26 @@ public class FeeLevelRequirement implements Requirement { @Override public boolean check(Player player) { + return getRelevantLevel(player) >= fee; + } + + @Override + public BaseComponent[] getCheckMessage(Player player) { + int level = getRelevantLevel(player); + ChatColor color = level >= fee ? ChatColor.GREEN : ChatColor.DARK_RED; + return new ComponentBuilder(DMessage.REQUIREMENT_FEE_LEVEL.getMessage() + ": ").color(ChatColor.GOLD) + .append(String.valueOf(level)).color(color) + .append("/" + fee).color(ChatColor.WHITE) + .create(); + } + + private int getRelevantLevel(Player player) { if (isKeepInventory(player)) { - return player.getLevel() >= fee; + return player.getLevel(); } - DGamePlayer dPlayer = (DGamePlayer) api.getPlayerCache().getGamePlayer(player); - return dPlayer != null ? dPlayer.getData().getOldLevel() >= fee : true; + DGlobalPlayer dPlayer = (DGlobalPlayer) api.getPlayerCache().get(player); + return dPlayer.getData().getOldLevel(); } @Override @@ -109,4 +127,9 @@ public class FeeLevelRequirement implements Requirement { return keepInventory; } + @Override + public String toString() { + return "FeeLevelRequirement{fee=" + fee + "}"; + } + } diff --git a/core/src/main/java/de/erethon/dungeonsxl/requirement/FeeMoneyRequirement.java b/core/src/main/java/de/erethon/dungeonsxl/requirement/FeeMoneyRequirement.java index fb56483e..82225fbd 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/requirement/FeeMoneyRequirement.java +++ b/core/src/main/java/de/erethon/dungeonsxl/requirement/FeeMoneyRequirement.java @@ -21,6 +21,9 @@ import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.api.DungeonsAPI; import de.erethon.dungeonsxl.api.Requirement; import de.erethon.dungeonsxl.config.DMessage; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; import net.milkbowl.vault.economy.Economy; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; @@ -68,6 +71,16 @@ public class FeeMoneyRequirement implements Requirement { return econ.getBalance(player) >= fee; } + @Override + public BaseComponent[] getCheckMessage(Player player) { + double money = econ.getBalance(player); + ChatColor color = money >= fee ? ChatColor.GREEN : ChatColor.DARK_RED; + return new ComponentBuilder(DMessage.REQUIREMENT_FEE_MONEY.getMessage() + ": ").color(ChatColor.GOLD) + .append(String.valueOf(money)).color(color) + .append("/" + fee).color(ChatColor.WHITE) + .create(); + } + @Override public void demand(Player player) { if (econ == null) { @@ -78,4 +91,9 @@ public class FeeMoneyRequirement implements Requirement { MessageUtil.sendMessage(player, DMessage.REQUIREMENT_FEE.getMessage(econ.format(fee))); } + @Override + public String toString() { + return "FeeMoneyRequirement{fee=" + fee + "}"; + } + } diff --git a/core/src/main/java/de/erethon/dungeonsxl/requirement/ForbiddenItemsRequirement.java b/core/src/main/java/de/erethon/dungeonsxl/requirement/ForbiddenItemsRequirement.java index 6bd3f991..b4112e97 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/requirement/ForbiddenItemsRequirement.java +++ b/core/src/main/java/de/erethon/dungeonsxl/requirement/ForbiddenItemsRequirement.java @@ -20,7 +20,13 @@ import de.erethon.caliburn.CaliburnAPI; import de.erethon.caliburn.item.ExItem; import de.erethon.dungeonsxl.api.DungeonsAPI; import de.erethon.dungeonsxl.api.Requirement; +import de.erethon.dungeonsxl.config.DMessage; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -66,8 +72,38 @@ public class ForbiddenItemsRequirement implements Requirement { return true; } + @Override + public BaseComponent[] getCheckMessage(Player player) { + ComponentBuilder builder = new ComponentBuilder(DMessage.REQUIREMENT_FORBIDDEN_ITEMS.getMessage() + ": ").color(ChatColor.GOLD); + + Set exInventory = new HashSet<>(); + for (ItemStack item : player.getInventory().getContents()) { + if (item != null) { + exInventory.add(caliburn.getExItem(item)); + } + } + + boolean first = true; + for (ExItem forbiddenItem : forbiddenItems) { + ChatColor color = exInventory.contains(forbiddenItem) ? ChatColor.DARK_RED : ChatColor.GREEN; + if (!first) { + builder.append(", ").color(ChatColor.WHITE); + } else { + first = false; + } + builder.append(forbiddenItem.getName()).color(color); + } + + return builder.create(); + } + @Override public void demand(Player player) { } + @Override + public String toString() { + return "ForbiddenItemsRequirement{items=" + forbiddenItems + "}"; + } + } diff --git a/core/src/main/java/de/erethon/dungeonsxl/requirement/GroupSizeRequirement.java b/core/src/main/java/de/erethon/dungeonsxl/requirement/GroupSizeRequirement.java index 6829fe96..55a4c266 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/requirement/GroupSizeRequirement.java +++ b/core/src/main/java/de/erethon/dungeonsxl/requirement/GroupSizeRequirement.java @@ -19,6 +19,10 @@ package de.erethon.dungeonsxl.requirement; import de.erethon.dungeonsxl.api.DungeonsAPI; import de.erethon.dungeonsxl.api.Requirement; import de.erethon.dungeonsxl.api.player.PlayerGroup; +import de.erethon.dungeonsxl.config.DMessage; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; @@ -78,8 +82,23 @@ public class GroupSizeRequirement implements Requirement { return size >= minimum && size <= maximum; } + @Override + public BaseComponent[] getCheckMessage(Player player) { + int size = api.getPlayerGroup(player).getMembers().size(); + ChatColor color = size >= minimum && size <= maximum ? ChatColor.GREEN : ChatColor.DARK_RED; + return new ComponentBuilder(DMessage.REQUIREMENT_GROUP_SIZE.getMessage() + ": ").color(ChatColor.GOLD) + .append(String.valueOf(size)).color(color) + .append("/" + minimum + "-" + maximum).color(ChatColor.WHITE) + .create(); + } + @Override public void demand(Player player) { } + @Override + public String toString() { + return "GroupSizeRequirement{minimum=" + minimum + "; maximum=" + maximum + "}"; + } + } diff --git a/core/src/main/java/de/erethon/dungeonsxl/requirement/KeyItemsRequirement.java b/core/src/main/java/de/erethon/dungeonsxl/requirement/KeyItemsRequirement.java index 57349a17..92ada6d1 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/requirement/KeyItemsRequirement.java +++ b/core/src/main/java/de/erethon/dungeonsxl/requirement/KeyItemsRequirement.java @@ -20,8 +20,14 @@ import de.erethon.caliburn.CaliburnAPI; import de.erethon.caliburn.item.ExItem; import de.erethon.dungeonsxl.api.DungeonsAPI; import de.erethon.dungeonsxl.api.Requirement; +import de.erethon.dungeonsxl.config.DMessage; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -65,8 +71,38 @@ public class KeyItemsRequirement implements Requirement { return keyItems.isEmpty(); } + @Override + public BaseComponent[] getCheckMessage(Player player) { + ComponentBuilder builder = new ComponentBuilder(DMessage.REQUIREMENT_KEY_ITEMS.getMessage() + ": ").color(ChatColor.GOLD); + + Set exInventory = new HashSet<>(); + for (ItemStack item : player.getInventory().getContents()) { + if (item != null) { + exInventory.add(caliburn.getExItem(item)); + } + } + + boolean first = true; + for (ExItem key : keyItems) { + ChatColor color = exInventory.contains(key) ? ChatColor.GREEN : ChatColor.DARK_RED; + if (!first) { + builder.append(", ").color(ChatColor.WHITE); + } else { + first = false; + } + builder.append(key.getName()).color(color); + } + + return builder.create(); + } + @Override public void demand(Player player) { } + @Override + public String toString() { + return "KeyItemsRequirement{items=" + keyItems + "}"; + } + } diff --git a/core/src/main/java/de/erethon/dungeonsxl/requirement/PermissionRequirement.java b/core/src/main/java/de/erethon/dungeonsxl/requirement/PermissionRequirement.java index 49224851..c9d3d4ab 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/requirement/PermissionRequirement.java +++ b/core/src/main/java/de/erethon/dungeonsxl/requirement/PermissionRequirement.java @@ -17,9 +17,13 @@ package de.erethon.dungeonsxl.requirement; import de.erethon.dungeonsxl.api.Requirement; +import de.erethon.dungeonsxl.config.DMessage; import de.erethon.dungeonsxl.player.DPermission; import java.util.ArrayList; import java.util.List; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; @@ -48,7 +52,7 @@ public class PermissionRequirement implements Requirement { /* Actions */ @Override public void setup(ConfigurationSection config) { - permissions = config.getStringList("permission"); + permissions = config.getStringList("permissions"); } @Override @@ -62,8 +66,28 @@ public class PermissionRequirement implements Requirement { return true; } + @Override + public BaseComponent[] getCheckMessage(Player player) { + ComponentBuilder builder = new ComponentBuilder(DMessage.REQUIREMENT_PERMISSION.getMessage() + ": ").color(ChatColor.GOLD); + boolean first = true; + for (String node : permissions) { + if (!first) { + builder.append(", ").color(ChatColor.WHITE); + } else { + first = false; + } + builder.append(node).color(player.hasPermission(node) ? ChatColor.GREEN : ChatColor.DARK_RED); + } + return builder.create(); + } + @Override public void demand(Player player) { } + @Override + public String toString() { + return "PermissionRequirement{permissions=" + permissions + "}"; + } + } diff --git a/core/src/main/java/de/erethon/dungeonsxl/world/WorldConfig.java b/core/src/main/java/de/erethon/dungeonsxl/world/WorldConfig.java index 8e9bcbac..e151601c 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/world/WorldConfig.java +++ b/core/src/main/java/de/erethon/dungeonsxl/world/WorldConfig.java @@ -135,9 +135,4 @@ public class WorldConfig extends GameRuleContainer { this.worldEnvironment = worldEnvironment; } - @Override - public String toString() { - return getClass().getSimpleName() + "{file=" + file.getPath() + "}"; - } - } diff --git a/core/src/main/java/de/erethon/dungeonsxl/world/block/RewardChest.java b/core/src/main/java/de/erethon/dungeonsxl/world/block/RewardChest.java index a42c7742..9b4a793d 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/world/block/RewardChest.java +++ b/core/src/main/java/de/erethon/dungeonsxl/world/block/RewardChest.java @@ -168,8 +168,8 @@ public class RewardChest extends GameBlock { for (Player player : group.getMembers().getOnlinePlayers()) { DGamePlayer dPlayer = (DGamePlayer) api.getPlayerCache().getGamePlayer(player); - if (dPlayer == null || !dPlayer.canLoot(game.getRules())) { - MessageUtil.sendMessage(player, DMessage.ERROR_NO_REWARDS_TIME.getMessage(SimpleDateUtil.ddMMyyyyhhmm(dPlayer.getTimeNextLoot(game.getRules())))); + if (dPlayer == null || !dPlayer.canLoot(game.getDungeon())) { + MessageUtil.sendMessage(player, DMessage.ERROR_NO_REWARDS_TIME.getMessage(SimpleDateUtil.ddMMyyyyhhmm(dPlayer.getTimeNextLoot(game.getDungeon())))); continue; } diff --git a/core/src/main/resources/languages/english.yml b/core/src/main/resources/languages/english.yml index 19bac4d6..348b19d8 100644 --- a/core/src/main/resources/languages/english.yml +++ b/core/src/main/resources/languages/english.yml @@ -213,6 +213,12 @@ player: waitForOtherPlayers: "&6Waiting for team members..." requirement: fee: "&6You have been charged &4&v1 &6for entering the dungeon." + feeLevel: "Levels" + feeMoney: "Money" + forbiddenItems: "Forbidden items" + groupSize: "Group size" + keyItems: "Keys" + permission: "Permissions" reward: general: "&6You received &4&v1 &6for finishing the dungeon." sign: diff --git a/core/src/main/resources/languages/french.yml b/core/src/main/resources/languages/french.yml index 1ed520ab..c39d9397 100644 --- a/core/src/main/resources/languages/french.yml +++ b/core/src/main/resources/languages/french.yml @@ -213,6 +213,12 @@ player: waitForOtherPlayers: "&6En attente des membres de l'équipe..." requirement: fee: "&6Vous avez été débité de &4&v1 &6pour entrer dans le donjon." + feeLevel: "Niveaux" + feeMoney: "Argent" + forbiddenItems: "Objets défendus" + groupSize: "Quantité des joueurs" + keyItems: "Clés" + permission: "Permissions" reward: general: "&6Vous avez reçu &4&v1 &6pour avoir fini le donjon." sign: diff --git a/core/src/main/resources/languages/german.yml b/core/src/main/resources/languages/german.yml index 24630b5b..4065797c 100644 --- a/core/src/main/resources/languages/german.yml +++ b/core/src/main/resources/languages/german.yml @@ -213,6 +213,12 @@ player: waitForOtherPlayers: "&6Warte auf andere Gruppenmitglieder..." requirement: fee: "&6Du hast &4&v1 &6bezahlt, um den Dungeon zu betreten." + feeLevel: "Level" + feeMoney: "Geld" + forbiddenItems: "Verbotene Items" + groupSize: "Gruppengröße" + keyItems: "Schlüssel" + permission: "Permissions" reward: general: "&6Du hast &4&v1 &6für das Beenden des Dungeons erhalten." sign: