package com.walrusone.skywars;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Logger;
import net.milkbowl.vault.chat.Chat;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.messaging.PluginMessageListener;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import com.walrusone.skywars.api.NMS;
import com.walrusone.skywars.commands.CmdManager;
import com.walrusone.skywars.config.Config;
import com.walrusone.skywars.controllers.ChestController;
import com.walrusone.skywars.controllers.GameController;
import com.walrusone.skywars.controllers.GlassController;
import com.walrusone.skywars.controllers.InventoryController;
import com.walrusone.skywars.controllers.KitController;
import com.walrusone.skywars.controllers.MapController;
import com.walrusone.skywars.controllers.ParticleController;
import com.walrusone.skywars.controllers.PlayerController;
import com.walrusone.skywars.controllers.ProjectileController;
import com.walrusone.skywars.controllers.ScoreboardController;
import com.walrusone.skywars.controllers.ShopController;
import com.walrusone.skywars.controllers.WorldController;
import com.walrusone.skywars.dataStorage.DataStorage;
import com.walrusone.skywars.dataStorage.Database;
import com.walrusone.skywars.game.Game;
import com.walrusone.skywars.game.GameMap;
import com.walrusone.skywars.game.GamePlayer;
import com.walrusone.skywars.listeners.IconMenuController;
import com.walrusone.skywars.listeners.LobbyListener;
import com.walrusone.skywars.listeners.PingListener;
import com.walrusone.skywars.listeners.PlayerListener;
import com.walrusone.skywars.listeners.ProjectileListener;
import com.walrusone.skywars.listeners.SignListener;
import com.walrusone.skywars.listeners.SpectatorListener;
import com.walrusone.skywars.runnables.CheckForMinPlayers;
import com.walrusone.skywars.runnables.SavePlayers;
import com.walrusone.skywars.utilities.BungeeUtil;
import com.walrusone.skywars.utilities.LoggerFilter;
import com.walrusone.skywars.utilities.Messaging;
import com.walrusone.skywars.utilities.SaveDefaultMaps;
public class SkyWarsReloaded extends JavaPlugin implements PluginMessageListener {
private static SkyWarsReloaded instance;
private GameController gc;
private MapController mc;
private WorldController wc;
private DataStorage ds;
private Database db;
private Config config;
private InventoryController invc;
private PlayerController pc;
private ProjectileController projc;
private ChestController cc;
private KitController kc;
private IconMenuController ic;
private GlassController glc;
private ParticleController pec;
private ShopController sc;
private ScoreboardController score;
private Messaging messaging;
private boolean finishedStartup;
private static final Logger log = Logger.getLogger("Minecraft");
public static Economy econ = null;
public static Chat chat = null;
private NMS nmsHandler;
public void onEnable() {
instance = this;
String packageName = this.getServer().getClass().getPackage().getName();
String version = packageName.substring(packageName.lastIndexOf('.') + 1);
try {
final Class<?> clazz = Class.forName("com.walrusone.skywars.nms." + version + ".NMSHandler");
// Check if we have a NMSHandler class at that location.
if (NMS.class.isAssignableFrom(clazz)) { // Make sure it actually implements NMS
this.nmsHandler = (NMS) clazz.getConstructor().newInstance(); // Set our handler
}
} catch (final Exception e) {
e.printStackTrace();
this.getLogger().severe("Could not find support for this CraftBukkit version.");
this.getLogger().info("Check for updates at URL HERE");
this.setEnabled(false);
return;
}
this.getLogger().info("Loading support for " + version);
getConfig().options().copyDefaults(true);
saveDefaultConfig();
saveConfig();
reloadConfig();
messaging = new Messaging(this);
config = new Config();
if (config.bungeeEnabled()) {
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this);
Bukkit.getPluginManager().registerEvents(new PingListener(), this);
}
boolean sqlEnabled = getConfig().getBoolean("sqldatabase.enabled");
if (sqlEnabled) {
getSWRDatabase();
}
if (config.usingExternalEcomony()) {
if (!setupEconomy() ) {
log.severe(String.format("[%s] - Disabling SkyWarsReloaded: No Economy Plugin Found!", getDescription().getName()));
getServer().getPluginManager().disablePlugin(this);
return;
}
}
setupChat();
boolean saveDefaultMaps = getConfig().getBoolean("resaveDefaultMaps");
if (saveDefaultMaps) {
SaveDefaultMaps.saveDefaultMaps();
getConfig().set("resaveDefaultMaps", false);
saveConfig();
}
if(config.logFilterEnabled()) {
getServer().getLogger().setFilter(new LoggerFilter());
}
wc = new WorldController();
mc = new MapController();
gc = new GameController();
ds = new DataStorage();
pc = new PlayerController();
invc = new InventoryController();
cc = new ChestController();
kc = new KitController();
ic = new IconMenuController();
sc = new ShopController();
glc = new GlassController();
pec = new ParticleController();
if (config.trailEffectsEnabled()) {
Bukkit.getPluginManager().registerEvents(new ProjectileListener(), this);
projc = new ProjectileController();
}
score = new ScoreboardController();
getCommand("swr").setExecutor(new CmdManager());
getCommand("global").setExecutor(new CommandExecutor() {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
boolean hasPerm = false;
if (!(sender instanceof Player)) {
hasPerm = true;
} else if (sender instanceof Player) {
Player player = (Player) sender;
if (player.hasPermission("swr.global")) {
hasPerm = true;
} else {
sender.sendMessage(new Messaging.MessageFormatter().format("error.cmd-no-perm"));
}
}
if (hasPerm) {
if (args.length == 0) {
sender.sendMessage("\247cUsage: /" + label + " <message>");
return true;
}
Player player = (Player) sender;
StringBuilder messageBuilder = new StringBuilder();
for (String arg : args) {
messageBuilder.append(arg);
messageBuilder.append(" ");
}
GamePlayer gPlayer = SkyWarsReloaded.getPC().getPlayer(player.getUniqueId());
String name = player.getDisplayName();
String prefix = "";
if (chat != null && SkyWarsReloaded.chat.getPlayerPrefix(gPlayer.getP()) != null) {
prefix = SkyWarsReloaded.chat.getPlayerPrefix(gPlayer.getP());
}
String colorMessage = ChatColor.translateAlternateColorCodes('&', messageBuilder.toString());
String message = "";
if (gPlayer.getP().hasPermission("swr.color")) {
message = colorMessage;
} else {
message = ChatColor.stripColor(colorMessage);
}
int scoreValue = gPlayer.getScore();
String score;
if (scoreValue < 0) {
score = ChatColor.RED + "(" + gPlayer.getScore() + ")";
} else {
score = ChatColor.GREEN + "(+" + gPlayer.getScore() + ")";
}
Bukkit.broadcastMessage(new Messaging.MessageFormatter()
.setVariable("score", score)
.setVariable("prefix", prefix)
.setVariable("player", name)
.setVariable("message", message)
.format("globalchat"));
return true;
}
return true;
}
});
if (config.daylightCycleDisabled()) {
Location spawn = SkyWarsReloaded.getCfg().getSpawn();
if (spawn != null) {
World world = spawn.getWorld();
world.setTime(6000);
world.setGameRuleValue("doDaylightCycle", "false");
}
}
if (config.weatherDisabled()) {
Location spawn = SkyWarsReloaded.getCfg().getSpawn();
if (spawn != null) {
World world = spawn.getWorld();
world.setStorm(false);
world.setThundering(false);
}
}
Bukkit.getPluginManager().registerEvents(new PlayerListener(), this);
Bukkit.getPluginManager().registerEvents(new LobbyListener(), this);
Bukkit.getPluginManager().registerEvents(new SignListener(), this);
Bukkit.getPluginManager().registerEvents(ic, this);
if (config.spectatingEnabled()) {
Bukkit.getPluginManager().registerEvents(new SpectatorListener(), this);
}
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new CheckForMinPlayers(), 20L, 20L);
int saveInterval = getConfig().getInt("sqldatabase.saveInterval");
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new SavePlayers(), 0, (1200 * saveInterval));
if (config.bungeeEnabled()) {
@SuppressWarnings("unused")
Game game = gc.createGame();
}
if (config.signJoinMode()) {
gc.signJoinLoad();
}
finishedStartup = true;
}
public void onDisable() {
if (finishedStartup) {
gc.shutdown();
pc.shutdown();
invc.save();
deleteWorlds();
}
instance = null;
wc = null;
ds = null;
pc = null;
ic = null;
score = null;
messaging = null;
config = null;
cc = null;
mc = null;
kc = null;
sc = null;
glc = null;
pec = null;
projc = null;
invc = null;
db = null;
gc = null;
}
public void reload() {
finishedStartup = false;
reloadConfig();
saveConfig();
gc.shutdown();
invc.save();
messaging = null;
messaging = new Messaging(this);
config = null;
config = new Config();
cc = null;
cc = new ChestController();
mc = null;
mc = new MapController();
kc = null;
kc = new KitController();
sc = null;
sc = new ShopController();
glc = null;
glc = new GlassController();
pec = null;
pec = new ParticleController();
if (SkyWarsReloaded.getCfg().trailEffectsEnabled()) {
projc = null;
projc = new ProjectileController();
}
invc = null;
invc = new InventoryController();
db = null;
boolean sqlEnabled = getConfig().getBoolean("sqldatabase.enabled");
if (sqlEnabled) {
getSWRDatabase();
}
gc = null;
gc = new GameController();
if (config.bungeeEnabled()) {
@SuppressWarnings("unused")
Game game = gc.createGame();
}
if (config.signJoinMode()) {
gc.signJoinLoad();
}
finishedStartup = true;
}
private void deleteWorlds() {
for (GameMap map: mc.getRegisteredMaps()) {
wc.deleteWorld(map.getName());
}
}
public static boolean deleteFolder(File file) {
if (file.exists()) {
boolean result = true;
if (file.isDirectory()) {
File[] contents = file.listFiles();
if (contents != null) {
for (File f : contents) {
result = result && deleteFolder(f);
}
}
}
return result && file.delete();
}
return false;
}
public boolean loadingEnded() {
return finishedStartup;
}
public static SkyWarsReloaded get() {
return instance;
}
public static GameController getGC() {
return instance.gc;
}
public static WorldController getWC() {
return instance.wc;
}
public static Messaging getMessaging() {
return instance.messaging;
}
public static MapController getMC() {
return instance.mc;
}
public static DataStorage getDS() {
return instance.ds;
}
public static Database getDB() {
return instance.db;
}
public static PlayerController getPC() {
return instance.pc;
}
public static ChestController getCC() {
return instance.cc;
}
public static ProjectileController getProjC() {
return instance.projc;
}
public static KitController getKC() {
return instance.kc;
}
public static IconMenuController getIC() {
return instance.ic;
}
public static ShopController getSC() {
return instance.sc;
}
public static InventoryController getInvC() {
return instance.invc;
}
public static GlassController getGLC() {
return instance.glc;
}
public static ParticleController getPEC() {
return instance.pec;
}
public static ScoreboardController getScore() {
return instance.score;
}
public static Config getCfg() {
return instance.config;
}
public static NMS getNMS() {
return instance.nmsHandler;
}
private boolean setupEconomy() {
if (getServer().getPluginManager().getPlugin("Vault") == null) {
return false;
}
RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
if (rsp == null) {
return false;
}
econ = rsp.getProvider();
return econ != null;
}
private void setupChat() {
RegisteredServiceProvider<Chat> chatProvider = getServer().getServicesManager().getRegistration(Chat.class);
if (chatProvider != null) {
chat = chatProvider.getProvider();
}
}
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
if (!channel.equals("BungeeCord")) {
return;
}
ByteArrayDataInput in = ByteStreams.newDataInput(message);
String subchannel = in.readUTF();
if (subchannel.equals("SkyWarsReloadedRequest")) {
short len = in.readShort();
byte[] msgbytes = new byte[len];
in.readFully(msgbytes);
Game game = gc.getGame(1);
if (game != null) {
BungeeUtil.sendSignUpdateRequest(game);
} else {
System.out.println("Game " + game + " couldn't be found, please fix your setup.");
}
}
}
private void getSWRDatabase() {
try {
db = new Database();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
try {
db.createTables();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
Connection conn = db.getConnection();
DatabaseMetaData metadata;
try {
metadata = conn.getMetaData();
ResultSet resultSet;
resultSet = metadata.getTables(null, null, "swreloaded_player", null);
if(resultSet.next()) {
resultSet = metadata.getColumns(null, null, "swreloaded_player", "playername");
if(!resultSet.next()) {
try {
db.addColumn("playername");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
metadata = conn.getMetaData();
ResultSet resultSet;
resultSet = metadata.getTables(null, null, "swreloaded_player", null);
if(resultSet.next()) {
resultSet = metadata.getColumns(null, null, "swreloaded_player", "balance");
if(!resultSet.next()) {
try {
db.addColumn("balance");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
metadata = conn.getMetaData();
ResultSet resultSet;
resultSet = metadata.getTables(null, null, "swreloaded_player", null);
if(resultSet.next()) {
resultSet = metadata.getColumns(null, null, "swreloaded_player", "glasscolor");
if(!resultSet.next()) {
try {
db.addColumn("glasscolor");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
metadata = conn.getMetaData();
ResultSet resultSet;
resultSet = metadata.getTables(null, null, "swreloaded_player", null);
if(resultSet.next()) {
resultSet = metadata.getColumns(null, null, "swreloaded_player", "effect");
if(!resultSet.next()) {
try {
db.addColumn("effect");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
metadata = conn.getMetaData();
ResultSet resultSet;
resultSet = metadata.getTables(null, null, "swreloaded_player", null);
if(resultSet.next()) {
resultSet = metadata.getColumns(null, null, "swreloaded_player", "traileffect");
if(!resultSet.next()) {
try {
db.addColumn("traileffect");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}