Configurable Requirements - Closes: #29

This commit is contained in:
Sn0wStorm 2013-05-10 19:24:32 +02:00
parent 0c39816f2b
commit 1a770fd0f8
4 changed files with 147 additions and 37 deletions

View File

@ -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<String> finishedOne;
private List<String> 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<String>();
}
if (configFile.contains("mustFinishAll")) {
finishedAll = configFile.getStringList("mustFinishAll");
} else {
finishedAll = new ArrayList<String>();
}
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<String> getFinishedAll() {
return finishedAll;
}
public List<String> getFinished() {
List<String> merge = new ArrayList<String>();
merge.addAll(finishedAll);
merge.addAll(finishedOne);
return merge;
}
public boolean isSpoutCraftOnly() {
return spoutCraftOnly;
}

View File

@ -247,6 +247,7 @@ public class DGSign {
DGSign dgsign = getSign(block);
if (dgsign != null) {
if (GameWorld.canPlayDungeon(dgsign.dungeonName, player)) {
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);
@ -273,6 +274,9 @@ public class DGSign {
}
}
} else {
P.p.msg(player, P.p.language.get("Error_Requirements"));
}
} else {
File file = new File(P.p.getDataFolder() + "/dungeons/" + dgsign.dungeonName, "config.yml");
if (file != null) {

View File

@ -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!");

View File

@ -136,12 +136,89 @@ 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
Long time = getPlayerTime(dungeon, player.getName());
if (time != -1) {
if (time + (config.getTimeToNextPlay() * 1000 * 60 * 60) > System.currentTimeMillis()) {
return false;
}
}
}
} else {
return false;
}
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()) {
@ -153,19 +230,10 @@ public class GameWorld {
}
FileConfiguration playerConfig = YamlConfiguration.loadConfiguration(file);
if (playerConfig.contains(player.getName())) {
Long time = playerConfig.getLong(player.getName());
if (time + (config.getTimeToNextPlay() * 1000 * 60 * 60) > System.currentTimeMillis()) {
return false;
if (playerConfig.contains(name)) {
return playerConfig.getLong(name);
}
}
}
} else {
return false;
}
return true;
return -1;
}
public void delete() {