diff --git a/src/com/dre/dungeonsxl/DConfig.java b/src/com/dre/dungeonsxl/DConfig.java index b85ea07a..0dd044f7 100644 --- a/src/com/dre/dungeonsxl/DConfig.java +++ b/src/com/dre/dungeonsxl/DConfig.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.ArrayList; import java.util.Map; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; @@ -33,6 +34,10 @@ public class DConfig { private int timeUntilKickOfflinePlayer = -1; + private List finishedOne; + private List finishedAll; + private int timeLastPlayed = 0; + // Spout private boolean spoutCraftOnly = false; private String spoutTexturepackURL; @@ -176,6 +181,23 @@ public class DConfig { timeUntilKickOfflinePlayer = mainConfig.timeUntilKickOfflinePlayer; } + /* Dungeon Requirements */ + if (configFile.contains("mustFinishOne")) { + finishedOne = configFile.getStringList("mustFinishOne"); + } else { + finishedOne = new ArrayList(); + } + + if (configFile.contains("mustFinishAll")) { + finishedAll = configFile.getStringList("mustFinishAll"); + } else { + finishedAll = new ArrayList(); + } + + if (configFile.contains("timeLastPlayed")) { + timeLastPlayed = configFile.getInt("timeLastPlayed"); + } + /* Spout */ if (configFile.contains("spout.spoutCraftOnly")) { spoutCraftOnly = configFile.getBoolean("spout.spoutCraftOnly"); @@ -303,6 +325,21 @@ public class DConfig { return timeUntilKickOfflinePlayer; } + public int getTimeLastPlayed() { + return timeLastPlayed; + } + + public List getFinishedAll() { + return finishedAll; + } + + public List getFinished() { + List merge = new ArrayList(); + merge.addAll(finishedAll); + merge.addAll(finishedOne); + return merge; + } + public boolean isSpoutCraftOnly() { return spoutCraftOnly; } diff --git a/src/com/dre/dungeonsxl/DGSign.java b/src/com/dre/dungeonsxl/DGSign.java index af9512ca..50218c21 100644 --- a/src/com/dre/dungeonsxl/DGSign.java +++ b/src/com/dre/dungeonsxl/DGSign.java @@ -247,31 +247,35 @@ public class DGSign { DGSign dgsign = getSign(block); if (dgsign != null) { if (GameWorld.canPlayDungeon(dgsign.dungeonName, player)) { - int sx1 = dgsign.startSign.getX(), sy1 = dgsign.startSign.getY(), sz1 = dgsign.startSign.getZ(); + if (GameWorld.checkRequirements(dgsign.dungeonName, player)) { + int sx1 = dgsign.startSign.getX(), sy1 = dgsign.startSign.getY(), sz1 = dgsign.startSign.getZ(); - Block topBlock = block.getRelative(0, sy1 - y, 0); + Block topBlock = block.getRelative(0, sy1 - y, 0); - int column; - if (dgsign.directionX != 0) { - column = Math.abs(x - sx1); - } else { - column = Math.abs(z - sz1); - } - - if ((topBlock.getState() instanceof Sign)) { - Sign topSign = (Sign) topBlock.getState(); - if (topSign.getLine(0).equals(strNewGrp)) { - if (DGroup.get(player) == null) { - dgsign.dgroups[column] = new DGroup(player, dgsign.dungeonName); - dgsign.update(); - } - } else if (topSign.getLine(0).equals(strJoinGrp)) { - if (DGroup.get(player) == null) { - dgsign.dgroups[column].addPlayer(player); - dgsign.update(); - } + int column; + if (dgsign.directionX != 0) { + column = Math.abs(x - sx1); + } else { + column = Math.abs(z - sz1); } + if ((topBlock.getState() instanceof Sign)) { + Sign topSign = (Sign) topBlock.getState(); + if (topSign.getLine(0).equals(strNewGrp)) { + if (DGroup.get(player) == null) { + dgsign.dgroups[column] = new DGroup(player, dgsign.dungeonName); + dgsign.update(); + } + } else if (topSign.getLine(0).equals(strJoinGrp)) { + if (DGroup.get(player) == null) { + dgsign.dgroups[column].addPlayer(player); + dgsign.update(); + } + } + + } + } else { + P.p.msg(player, P.p.language.get("Error_Requirements")); } } else { File file = new File(P.p.getDataFolder() + "/dungeons/" + dgsign.dungeonName, "config.yml"); diff --git a/src/com/dre/dungeonsxl/LanguageReader.java b/src/com/dre/dungeonsxl/LanguageReader.java index 5dcb17bb..e1751816 100644 --- a/src/com/dre/dungeonsxl/LanguageReader.java +++ b/src/com/dre/dungeonsxl/LanguageReader.java @@ -82,6 +82,7 @@ public class LanguageReader { defaults.put("Error_Dispenser", "&4Du kannst nicht auf diesen Dispenser zugreifen!"); defaults.put("Error_Ready", "&4Wähle zuerst eine Klasse aus!"); defaults.put("Error_Cooldown", "&4Du kannst den Dungeon nur alle &6&v1&4 Stunden betreten!"); + defaults.put("Error_Requirements", "&4Du erfüllst nicht die Anforderungen für diesen Dungeon!"); defaults.put("Error_Leftklick", "&4Du musst das Schild mit Links-klick berühren!"); defaults.put("Error_Drop", "&4Du kannst keine sicheren Objekte droppen"); defaults.put("Error_Cmd", "&4Befehle sind während des Dungeons nicht erlaubt!"); diff --git a/src/com/dre/dungeonsxl/game/GameWorld.java b/src/com/dre/dungeonsxl/game/GameWorld.java index 10d4ea2d..89769d4e 100644 --- a/src/com/dre/dungeonsxl/game/GameWorld.java +++ b/src/com/dre/dungeonsxl/game/GameWorld.java @@ -136,26 +136,13 @@ public class GameWorld { return true; } - File dungeonFolder = new File(p.getDataFolder() + "/dungeons/" + dungeon); - if (dungeonFolder.isDirectory()) { + if (new File(p.getDataFolder() + "/dungeons/" + dungeon).isDirectory()) { DConfig config = new DConfig(new File(p.getDataFolder() + "/dungeons/" + dungeon, "config.yml")); if (config.getTimeToNextPlay() != 0) { // read PlayerConfig - File file = new File(p.getDataFolder() + "/dungeons/" + dungeon, "players.yml"); - - if (!file.exists()) { - try { - file.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - FileConfiguration playerConfig = YamlConfiguration.loadConfiguration(file); - - if (playerConfig.contains(player.getName())) { - Long time = playerConfig.getLong(player.getName()); + Long time = getPlayerTime(dungeon, player.getName()); + if (time != -1) { if (time + (config.getTimeToNextPlay() * 1000 * 60 * 60) > System.currentTimeMillis()) { return false; } @@ -168,6 +155,87 @@ public class GameWorld { return true; } + public static boolean checkRequirements(String dungeon, Player player) { + /*if (p.permission.has(player, "dungeonsxl.ignoreRequirements") || player.isOp()) { + return true; + }*/ + + if (new File(p.getDataFolder() + "/dungeons/" + dungeon).isDirectory() == false) { + return false; + } + + DConfig config = new DConfig(new File(p.getDataFolder() + "/dungeons/" + dungeon, "config.yml")); + if (config.getFinished() != null && config.getFinishedAll() != null) { + if (!config.getFinished().isEmpty()) { + + long bestTime = 0; + int numOfNeeded = 0; + boolean doneTheOne = false; + + if (config.getFinished().size() == config.getFinishedAll().size()) { + doneTheOne = true; + } + + for (String played : config.getFinished()) { + for (String dungeonName : new File(p.getDataFolder() + "/dungeons").list()) { + if (new File(p.getDataFolder() + "/dungeons/" + dungeonName).isDirectory()) { + if (played.equalsIgnoreCase(dungeonName) || played.equalsIgnoreCase("any")) { + + Long time = getPlayerTime(dungeonName, player.getName()); + if (time != -1) { + if (config.getFinishedAll().contains(played)) { + numOfNeeded++; + } else { + doneTheOne = true; + } + if (bestTime < time) { + bestTime = time; + } + } + break; + + } + } + } + } + + if (bestTime == 0) { + return false; + } else { + if (config.getTimeLastPlayed() != 0) { + if (System.currentTimeMillis() - bestTime > config.getTimeLastPlayed() * (long) 3600000) { + return false; + } + } + } + + if (numOfNeeded < config.getFinishedAll().size() || !doneTheOne) { + return false; + } + + } + } + return true; + } + + public static long getPlayerTime(String dungeon, String name) { + File file = new File(p.getDataFolder() + "/dungeons/" + dungeon, "players.yml"); + + if (!file.exists()) { + try { + file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + FileConfiguration playerConfig = YamlConfiguration.loadConfiguration(file); + if (playerConfig.contains(name)) { + return playerConfig.getLong(name); + } + return -1; + } + public void delete() { gworlds.remove(this); p.getServer().unloadWorld(this.world, true);