You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

364 lines
11 KiB

package cx.sfy.TheBridge;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import cx.sfy.TheBridge.cmds.SetupCMD;
import cx.sfy.TheBridge.controllers.WorldController;
import cx.sfy.TheBridge.database.Cosmeticbase;
import cx.sfy.TheBridge.database.Database;
import cx.sfy.TheBridge.database.PlayerStat;
import cx.sfy.TheBridge.game.GameDuo;
import cx.sfy.TheBridge.game.GameDuo.State;
import cx.sfy.TheBridge.game.GameFour;
import cx.sfy.TheBridge.game.GameFour.FState;
import cx.sfy.TheBridge.game.InventoryData;
import cx.sfy.TheBridge.game.PlayerData;
import cx.sfy.TheBridge.hooks.PlaceholderHook;
import cx.sfy.TheBridge.kit.Hotbar;
import cx.sfy.TheBridge.kit.Kit;
import cx.sfy.TheBridge.leaderheads.TheBridgeFourGoals;
import cx.sfy.TheBridge.leaderheads.TheBridgeFourKills;
import cx.sfy.TheBridge.leaderheads.TheBridgeFourWins;
import cx.sfy.TheBridge.leaderheads.TheBridgeNormalGoals;
import cx.sfy.TheBridge.leaderheads.TheBridgeNormalKills;
import cx.sfy.TheBridge.leaderheads.TheBridgeNormalWins;
import cx.sfy.TheBridge.listeners.PlayerListener;
import cx.sfy.TheBridge.listeners.SetupListener;
import cx.sfy.TheBridge.listeners.SpectatorListener;
import cx.sfy.TheBridge.managers.ArchiManager;
import cx.sfy.TheBridge.managers.ArrowManager;
import cx.sfy.TheBridge.managers.CageManager;
import cx.sfy.TheBridge.managers.FileManager;
import cx.sfy.TheBridge.managers.GameManager;
import cx.sfy.TheBridge.managers.GlassManager;
import cx.sfy.TheBridge.managers.LocationManager;
import cx.sfy.TheBridge.managers.ScoreboardManager;
import cx.sfy.TheBridge.managers.SetupManager;
import cx.sfy.TheBridge.managers.SignManager;
import cx.sfy.TheBridge.managers.TitleManager;
import cx.sfy.TheBridge.managers.TopManager;
import cx.sfy.TheBridge.menus.AchievementsMenu;
import cx.sfy.TheBridge.menus.ArrowMenu;
import cx.sfy.TheBridge.menus.GameMenu;
import cx.sfy.TheBridge.menus.GlassMenu;
import cx.sfy.TheBridge.menus.ShopMenu;
import cx.sfy.TheBridge.menus.SpectOptionsMenu;
import cx.sfy.TheBridge.menus.SpectPlayerMenu;
import cx.sfy.TheBridge.menus.TeamMenu;
import cx.sfy.TheBridge.nms.GenericNMS;
import cx.sfy.TheBridge.nms.NMS;
import cx.sfy.TheBridge.packets.PacketMain;
import lombok.Getter;
import lombok.Setter;
public class Main extends JavaPlugin {
private static Main instance;
@Getter
@Setter
private PacketMain refl;
@Getter
private SpectOptionsMenu som;
@Getter
private SpectPlayerMenu spm;
@Getter
private TeamMenu tem;
@Getter
private boolean placeholder;
@Getter
private TitleManager tm;
@Getter
private GameManager gm;
@Getter
private GameMenu gmu;
@Getter
private ArrowMenu amu;
@Getter
private WorldController wc;
@Getter
private Settings lang;
@Getter
private Settings cages;
@Getter
private Settings signs;
@Getter
private Settings sounds;
@Getter
private Settings achievement;
@Getter
private Settings arrow;
@Getter
private NMS nms;
@Getter
private FileManager fm;
@Getter
private SetupManager sm;
@Getter
private GlassManager glm;
@Getter
private LocationManager lm;
@Getter
private Location mainLobby;
@Getter
private Kit kit;
@Getter
private Database db;
@Getter
private TopManager top;
@Getter
private SignManager sim;
@Getter
private Hotbar hotbar;
@Getter
private boolean stop;
@Getter
private ScoreboardManager sb;
@Getter
private ArchiManager am;
@Getter
private AchievementsMenu archimenu;
@Getter
private CageManager cm;
@Getter
private ArrowManager arm;
@Getter
private GlassMenu glam;
@Getter
private boolean isCage = false;
@Getter
private boolean archiDisabled = false;
@Getter
private ShopMenu shop;
@Getter
private Cosmeticbase cb;
public static Main get() {
return instance;
}
@Override
public void onEnable() {
refl = new PacketMain(this);
instance = this;
stop = false;
getServer().getMessenger().registerOutgoingPluginChannel(Main.get(), "BungeeCord");
getConfig().options().copyDefaults(true);
saveConfig();
File s = new File(getDataFolder() + "/cages");
if (!s.exists()) {
s.mkdirs();
}
saveResources();
lang = new Settings(this, "lang");
signs = new Settings(this, "signs");
cages = new Settings(this, "cages");
sounds = new Settings(this, "sounds");
achievement = new Settings(this, "achievement");
arrow = new Settings(this, "trails");
if (getServer().getPluginManager().isPluginEnabled("FastAsyncWorldEdit")) {
if (!getConfig().getBoolean("cages")) {
Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.GREEN + "You have " + ChatColor.RED
+ "FAWE installed." + ChatColor.GREEN + "Cage System Enabled");
} else {
cm = new CageManager(this);
isCage = true;
}
} else {
if (getConfig().getBoolean("cages")) {
Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.RED + "You don't have " + ChatColor.YELLOW
+ "FAWE installed." + ChatColor.RED + "Cage System Disabled");
isCage = false;
}
}
archiDisabled = getConfig().getBoolean("archievements.disable");
if (getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) {
placeholder = true;
new PlaceholderHook(this).register();
}
loadNMS();
File a = new File(getDataFolder() + "/arenas");
if (!a.exists()) {
a.mkdirs();
}
File a1 = new File(getDataFolder() + "/maps");
if (!a1.exists()) {
a1.mkdirs();
}
db = new Database(this);
cb = new Cosmeticbase(this);
kit = new Kit();
lm = new LocationManager(this);
fm = new FileManager(this);
wc = new WorldController(this);
tm = new TitleManager(this);
sim = new SignManager(this);
gm = new GameManager(this);
gmu = new GameMenu(this);
amu = new ArrowMenu(this);
sm = new SetupManager(this);
glm = new GlassManager();
arm = new ArrowManager(this);
top = new TopManager(this);
tem = new TeamMenu(this);
som = new SpectOptionsMenu(this);
spm = new SpectPlayerMenu(this);
hotbar = new Hotbar(this);
sb = new ScoreboardManager(this);
am = new ArchiManager(this);
archimenu = new AchievementsMenu(this);
glam = new GlassMenu(this);
shop = new ShopMenu(this);
lm.reloadLocations();
top.updateTops();
if (getConfig().getString("mainLobby") == null) {
Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "The main lobby hasn't been set up. Please use "
+ ChatColor.YELLOW + "/bridges setmainlobby");
} else {
mainLobby = getStringLocation(getConfig().getString("mainLobby"));
}
getCommand("bridges").setExecutor(new SetupCMD(this));
Bukkit.getServer().getPluginManager().registerEvents(new SetupListener(this), this);
Bukkit.getServer().getPluginManager().registerEvents(new PlayerListener(this), this);
Bukkit.getServer().getPluginManager().registerEvents(new SpectatorListener(this), this);
new BukkitRunnable() {
@Override
public void run() {
top.updateTops();
}
}.runTaskTimer(this, 6000, 6000);
new BukkitRunnable() {
@Override
public void run() {
for (GameDuo game : getGm().getGames()) {
if (game.isState(State.WAITING) || game.isState(State.STARTING) || game.isState(State.PREGAME)) {
game.updateGame();
}
}
for (GameFour game : getGm().getGamesFour()) {
if (game.isState(FState.WAITING) || game.isState(FState.STARTING) || game.isState(FState.PREGAME)) {
game.updateGame();
}
}
}
}.runTaskTimer(this, 20, 20);
if (getServer().getPluginManager().isPluginEnabled("LeaderHeads")) {
new TheBridgeNormalKills();
new TheBridgeNormalWins();
new TheBridgeNormalGoals();
new TheBridgeFourKills();
new TheBridgeFourWins();
new TheBridgeFourGoals();
}
}
@Override
public void onDisable() {
stop = true;
getTop().removeHolo();
for (InventoryData inv : InventoryData.getInventoryData().values()) {
inv.restore();
}
for (GameFour gamef : getGm().getGamesFour()) {
for (PlayerData pd : gamef.getPD().values()) {
pd.restore();
}
}
for (GameDuo gamef : getGm().getGames()) {
for (PlayerData pd : gamef.getPD().values()) {
pd.restore();
}
}
for (Player on : Bukkit.getOnlinePlayers()) {
getDb().saveData(PlayerStat.getPlayerStat(on));
getCb().saveData(PlayerStat.getPlayerStat(on));
}
getServer().getScheduler().cancelTasks(this);
}
public void loadNMS() {
nms = new GenericNMS();
}
public void saveResources() {
saveResource("clear.schematic", false);
saveResource("normal-red.schematic", false);
saveResource("normal-blue.schematic", false);
saveResource("normal-green.schematic", false);
saveResource("normal-yellow.schematic", false);
File cage = new File(getDataFolder(), "cages");
File c = new File(getDataFolder(), "clear.schematic");
File r = new File(getDataFolder(), "normal-red.schematic");
File b = new File(getDataFolder(), "normal-blue.schematic");
File g = new File(getDataFolder(), "normal-green.schematic");
File y = new File(getDataFolder(), "normal-yellow.schematic");
copyFiles(c, new File(cage, "clear.schematic"));
copyFiles(r, new File(cage, "normal-red.schematic"));
copyFiles(b, new File(cage, "normal-blue.schematic"));
copyFiles(g, new File(cage, "normal-green.schematic"));
copyFiles(y, new File(cage, "normal-yellow.schematic"));
c.delete();
r.delete();
g.delete();
b.delete();
y.delete();
}
public void copyFiles(File file, File file2) {
try {
if (!new ArrayList<String>(Arrays.asList("uid.dat", "session.dat")).contains(file.getName())) {
if (file.isDirectory()) {
if (!file2.exists()) {
file2.mkdirs();
}
String[] list;
for (int length = (list = file.list()).length, i = 0; i < length; ++i) {
String s = list[i];
copyFiles(new File(file, s), new File(file2, s));
}
} else {
FileOutputStream fileOutputStream;
try (FileInputStream fileInputStream = new FileInputStream(file)) {
fileOutputStream = new FileOutputStream(file2);
byte[] array = new byte[1024];
int read;
while ((read = fileInputStream.read(array)) > 0) {
fileOutputStream.write(array, 0, read);
}
}
fileOutputStream.close();
}
}
} catch (IOException ex) {
}
}
public void reloadMainLobby() {
mainLobby = getStringLocation(getConfig().getString("mainLobby"));
}
public Location getStringLocation(String location) {
String[] l = location.split(";");
World world = Bukkit.getWorld(l[0]);
double x = Double.parseDouble(l[1]);
double y = Double.parseDouble(l[2]);
double z = Double.parseDouble(l[3]);
float yaw = Float.parseFloat(l[4]);
float pitch = Float.parseFloat(l[5]);
return new Location(world, x, y, z, yaw, pitch);
}
}