/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.arkhamnetwork.arcade.minigame.skywars;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.io.FileUtils;
import org.arkhamnetwork.arcade.commons.configuration.yaml.file.FileConfiguration;
import org.arkhamnetwork.arcade.commons.configuration.yaml.file.YamlConfiguration;
import org.arkhamnetwork.arcade.commons.kit.Kit;
import org.arkhamnetwork.arcade.commons.kit.KitShop;
import org.arkhamnetwork.arcade.commons.plugin.ArcadeMiniPlugin;
import org.arkhamnetwork.arcade.commons.podium.Podium;
import org.arkhamnetwork.arcade.commons.pregame.PreGameManager;
import org.arkhamnetwork.arcade.commons.storage.ArcadeHashMap;
import org.arkhamnetwork.arcade.commons.utils.DescriptionUtils;
import org.arkhamnetwork.arcade.commons.utils.KitUtils;
import org.arkhamnetwork.arcade.commons.utils.MobUtils;
import org.arkhamnetwork.arcade.core.Arcade;
import org.arkhamnetwork.arcade.core.configuration.ArcadeConfiguration;
import org.arkhamnetwork.arcade.minigame.MinigameStage;
import org.arkhamnetwork.arcade.minigame.skywars.listener.SkywarsBlockListener;
import org.arkhamnetwork.arcade.minigame.skywars.listener.SkywarsEntityListener;
import org.arkhamnetwork.arcade.minigame.skywars.listener.SkywarsInventoryListener;
import org.arkhamnetwork.arcade.minigame.skywars.listener.SkywarsMiscListener;
import org.arkhamnetwork.arcade.minigame.skywars.listener.SkywarsPlayerListener;
import org.arkhamnetwork.arcade.minigame.skywars.manager.SkywarsMapManager;
import org.arkhamnetwork.arcade.minigame.skywars.manager.SkywarsRotationManager;
import org.arkhamnetwork.arcade.minigame.skywars.manager.SkywarsScoreboardManager;
import org.arkhamnetwork.arcade.minigame.skywars.manager.SkywarsSignsManager;
import org.arkhamnetwork.arcade.minigame.skywars.struct.SkywarsMapData;
import org.arkhamnetwork.arcade.minigame.skywars.struct.SkywarsPlayer;
import org.arkhamnetwork.arcade.minigame.skywars.tasks.SkywarsGameTask;
import org.bukkit.ChatColor;
import org.bukkit.Server;
import org.bukkit.plugin.PluginManager;
/**
*
* @author devan_000
*/
public class SkyWars extends ArcadeMiniPlugin {
@Getter
private static SkyWars skywars;
@Getter
private ArcadeHashMap<Integer, MinigameStage> stages = new ArcadeHashMap<>();
@Getter
@Setter
private MinigameStage currentStage = null;
@Getter
@Setter
private ArcadeHashMap<UUID, SkywarsPlayer> players = new ArcadeHashMap<>();
@Getter
@Setter
private SkywarsMapData currentMapData = null;
@Getter
private String WEB_CONFIG_LOCATION = "Skywars/Skywars.yml";
@Getter
private String chatFormat = null;
@Getter
private ArcadeHashMap<Integer, String> configuredMaps = new ArcadeHashMap<>();
@Getter
private SkywarsScoreboardManager scoreboardManager = null;
@Getter
private SkywarsSignsManager signsManager = null;
@Getter
private SkywarsGameTask gameTask;
@Getter
private int lastPlayedMapID = 0;
@Getter
private List<String> gameDescriptionMessage;
@Getter
private ArcadeHashMap<String, Kit> kits = new ArcadeHashMap<>();
@Getter
private ArcadeHashMap<UUID, KitShop> kitShops = new ArcadeHashMap<>();
public SkyWars(String name, String version, Server server,
List<String> pluginGameDescription) {
super(name, version, server, pluginGameDescription);
skywars = this;
stages.put(0, new MinigameStage(0, "Pre-Game"));
stages.put(1, new MinigameStage(1, "Game"));
stages.put(2, new MinigameStage(2, "End-Game"));
}
@Override
public void onEnable() {
try {
// Needed - ArcadeMiniPlugin
super.onEnable();
// Generate and load the PreGame lobby's and worlds.
PreGameManager.setup(this);
// Download the web Skywars.yml
log("Attempting to download the web Skywars.yml to the cache");
File cacheConfigLocation = new File(Arcade.getInstance()
.getDataFolder() + File.separator + "cache", "Skywars.yml");
if (cacheConfigLocation.exists()) {
cacheConfigLocation.delete();
}
FileUtils.copyURLToFile(
new URL(ArcadeConfiguration.getWebServerURL()
+ WEB_CONFIG_LOCATION), cacheConfigLocation);
log("Skywars.yml download completed succuessfuly.");
// Load the skywars web configuration.
FileConfiguration skywarsWebConfiguration = YamlConfiguration
.loadConfiguration(cacheConfigLocation);
chatFormat = skywarsWebConfiguration.getString("chatFormat");
for (String map : skywarsWebConfiguration.getStringList("maps")) {
String[] split = map.split(":");
if (split.length == 2) {
int mapID = Integer.valueOf(split[0]);
String mapName = split[1];
log("* Loaded map " + mapName + " with id " + mapID + ".");
configuredMaps.put(mapID, mapName);
}
}
for (String kitName : skywarsWebConfiguration.getConfigurationSection("kits").getKeys(false)) {
kits.put(kitName, KitUtils.getKitFromSection(skywarsWebConfiguration.getConfigurationSection("kits." + kitName)));
log("Loaded kit " + ChatColor.GREEN + kitName);
}
for (Kit kit : kits.values()) {
for (Podium podium : PreGameManager.getPodiums()) {
if (!podium.isOccupied()) {
KitShop shop = new KitShop(podium, kit);
kitShops.put(shop.getVillager().getUniqueId(), shop);
podium.setOccupied(true);
break;
}
}
}
// Load the internalDataConfig and set the last map played ID.
FileConfiguration internalDataConfig = YamlConfiguration
.loadConfiguration(new File(Arcade.getInstance()
.getDataFolder(), "internalData.yml"));
lastPlayedMapID = internalDataConfig
.getInt("skywars.lastPlayedMapID");
// Find the next map.
log("The last played map was "
+ this.getConfiguredMaps().get(lastPlayedMapID)
+ " attempting to find the next map...");
final int nextMapID = SkywarsRotationManager.getNextMap();
final String nextMapName = this.getConfiguredMaps().get(nextMapID);
log("The next map playing is " + nextMapName + ".");
// Set the lastPlayedMap as the found nextMap.
log("Saving " + nextMapName + " as the new last played map.");
internalDataConfig.set("skywars.lastPlayedMapID", nextMapID);
internalDataConfig.save(new File(Arcade.getInstance()
.getDataFolder(), "internalData.yml"));
// Download and load the next map.
log("Attempting to load the map with name " + nextMapName);
currentMapData = SkywarsMapManager.downloadAndLoadMapWithName(this,
nextMapName);
log("Map downloaded and loaded successfuly.");
// Print out the currentMap information.
log("Current map minimum players: "
+ currentMapData.getMinPlayers());
log("Current map maximum players: "
+ currentMapData.getMaxPlayers());
log("Current map timer length: "
+ currentMapData.getTimerLengthSeconds());
log("Current map authors: "
+ currentMapData.getAuthors().keySet().toString());
// Load the current gameDescription message.
this.gameDescriptionMessage = DescriptionUtils
.buildGameDescriptionMessage(this.getCustomName(), this
.getPluginDescription(), nextMapName, this
.getCurrentMapData().getAuthors(), this
.getCurrentMapData().getMinPlayers(), this
.getCurrentMapData().getMaxPlayers());
// Craft the ScoreboardManager.
this.scoreboardManager = new SkywarsScoreboardManager(this);
// Craft the signs manager.
this.signsManager = new SkywarsSignsManager(this);
// Register all events.
PluginManager pm = getServer().getPluginManager();
pm.registerEvents(new SkywarsPlayerListener(), Arcade.getInstance());
pm.registerEvents(new SkywarsBlockListener(), Arcade.getInstance());
pm.registerEvents(new SkywarsEntityListener(), Arcade.getInstance());
pm.registerEvents(new SkywarsMiscListener(), Arcade.getInstance());
pm.registerEvents(new SkywarsInventoryListener(), Arcade.getInstance());
// Set the current game stage.
currentStage = stages.get(0);
// Start the gameTask.
gameTask = new SkywarsGameTask();
gameTask.runTaskTimerAsynchronously(Arcade.getInstance(), 0L, 20L);
// Needed - ArcadeMiniPlugin
super.postEnable();
} catch (IOException | IllegalArgumentException | IllegalStateException ex) {
ex.printStackTrace();
}
}
@Override
public void onDisable() {
// Needed - ArcadeMiniPlugin
super.onDisable();
// Needed - ArcadeMiniPlugin
super.postDisable();
}
@Override
public void postEnable() {
}
@Override
public void postDisable() {
}
public boolean hasEnoughPlayersToStart() {
return this.players.size() >= this.currentMapData.getMinPlayers();
}
public boolean isFull() {
return getPlayers().size() >= getCurrentMapData().getMaxPlayers();
}
}