Add TableGenerator.java in Utils (From FisheyLP) Use TableGenerator to format list command output Add number of seconds in "Starting" status Use this status in lobby signs and list command Fix arena config file lookup: load only .yml files Don't start empty arena
355 lines
13 KiB
Java
355 lines
13 KiB
Java
package com.Geekpower14.Quake.Arena;
|
|
|
|
import com.Geekpower14.Quake.Quake;
|
|
import com.Geekpower14.Quake.Utils.FireworkEffectPlayer;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
import java.util.logging.Level;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.Color;
|
|
import org.bukkit.FireworkEffect;
|
|
import org.bukkit.Location;
|
|
import org.bukkit.configuration.file.FileConfiguration;
|
|
import org.bukkit.configuration.file.YamlConfiguration;
|
|
import org.bukkit.entity.EntityType;
|
|
import org.bukkit.entity.Firework;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.inventory.meta.FireworkMeta;
|
|
import org.bukkit.plugin.Plugin;
|
|
import org.bukkit.potion.PotionEffect;
|
|
import org.bukkit.scoreboard.DisplaySlot;
|
|
|
|
public class SArena extends Arena {
|
|
public SArena(Quake pl, String n, int ID) {
|
|
super(pl, n, ID);
|
|
}
|
|
|
|
@Override
|
|
public Boolean reloadConfig() {
|
|
if (_etat != _pregame) {
|
|
stop();
|
|
}
|
|
testConfig();
|
|
loadConfig();
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public Boolean loadConfig() {
|
|
File fichier_config = new File(_plugin.getDataFolder(), "/arenas/" + _name + ".yml");
|
|
YamlConfiguration config = YamlConfiguration.loadConfiguration((File)fichier_config);
|
|
if (config.contains("Nombre")) {
|
|
int nombre = config.getInt("Nombre");
|
|
for (int i = 0; i < nombre; i++) {
|
|
String nom = config.getString("spawn" + i);
|
|
_spawns.add(i, str2loc(nom));
|
|
}
|
|
} else {
|
|
List<Location> s = new ArrayList();
|
|
for(String spawn : config.getStringList("Spawns")) {
|
|
s.add(str2loc(spawn));
|
|
}
|
|
_spawns = s;
|
|
}
|
|
_map = config.getString("Map");
|
|
_maxplayer = config.getInt("MaxPlayers");
|
|
_minplayer = config.getInt("MinPlayers");
|
|
_Active = config.getBoolean("Active");
|
|
_NaturalDeath = config.getBoolean("Natural-Death");
|
|
_Auto_Respawn = config.getBoolean("Auto-Respawn");
|
|
_VIP = config.getBoolean("VIP");
|
|
_goal = config.getInt("Goal");
|
|
_starting = config.getInt("Time-Before");
|
|
_after = config.getLong("Time-After");
|
|
_Coins_Win = config.getInt("Coins-per-Win");
|
|
_Coins_Kill = config.getInt("Coins-per-Kill");
|
|
_VIP_M = config.getDouble("VIP-Multiplicator");
|
|
_VIPP_M = config.getDouble("VIP+-Multiplicator");
|
|
_Global_Chat = config.getBoolean("Global-Chat");
|
|
_Sneak = config.getBoolean("Sneak");
|
|
ArrayList<PotionEffect> l = new ArrayList<>();
|
|
for (String popo : config.getStringList("Potions"))
|
|
l.add(StrToPo(popo));
|
|
_potions = l;
|
|
if(config.contains("Nombre"))
|
|
saveConfig();
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public Boolean testConfig() {
|
|
YamlConfiguration config = YamlConfiguration.loadConfiguration((File)new File(_plugin.getDataFolder(), "/arenas/" + _name + ".yml"));
|
|
setDefaultConfig((FileConfiguration)config, "Version", Quake._version);
|
|
setDefaultConfig((FileConfiguration)config, "Name", _name);
|
|
setDefaultConfig((FileConfiguration)config, "Type", "Solo");
|
|
setDefaultConfig((FileConfiguration)config, "Map", "Unknown");
|
|
setDefaultConfig((FileConfiguration)config, "Active", true);
|
|
setDefaultConfig((FileConfiguration)config, "Natural-Death", false);
|
|
setDefaultConfig((FileConfiguration)config, "Auto-Respawn", false);
|
|
setDefaultConfig((FileConfiguration)config, "VIP", false);
|
|
setDefaultConfig((FileConfiguration)config, "Goal", 25);
|
|
setDefaultConfig((FileConfiguration)config, "Time-Before", 30);
|
|
setDefaultConfig((FileConfiguration)config, "Time-After", 15);
|
|
setDefaultConfig((FileConfiguration)config, "Coins-per-Win", 20);
|
|
setDefaultConfig((FileConfiguration)config, "Coins-per-Kill", 1);
|
|
setDefaultConfig((FileConfiguration)config, "VIP-Multiplicator", 2);
|
|
setDefaultConfig((FileConfiguration)config, "VIP+-Multiplicator", 3);
|
|
setDefaultConfig((FileConfiguration)config, "Global-Chat", false);
|
|
ArrayList<String> l = new ArrayList<>();
|
|
l.add("SPEED:2");
|
|
l.add("JUMP:1");
|
|
setDefaultConfig((FileConfiguration)config, "Potions", l);
|
|
setDefaultConfig((FileConfiguration)config, "MaxPlayers", 11);
|
|
setDefaultConfig((FileConfiguration)config, "MinPlayers", 2);
|
|
setDefaultConfig((FileConfiguration)config, "Sneak", true);
|
|
setDefaultConfig((FileConfiguration)config, "Spawns", new ArrayList());
|
|
try {
|
|
config.save(new File(_plugin.getDataFolder(), "/arenas/" + _name + ".yml"));
|
|
} catch (IOException e) {
|
|
_plugin.getLogger().warning("save default de " + _name + " impossible !");
|
|
disable();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public Boolean saveConfig() {
|
|
YamlConfiguration config = YamlConfiguration.loadConfiguration((File)new File(_plugin.getDataFolder(), "/arenas/" + _name + ".yml"));
|
|
config.set("Name", _name);
|
|
config.set("Type", "Solo");
|
|
config.set("Map", _map);
|
|
config.set("Active", _Active);
|
|
config.set("VIP", _VIP);
|
|
config.set("Global-Chat", _Global_Chat);
|
|
config.set("Natural-Death", _NaturalDeath);
|
|
config.set("Auto-Respawn", _Auto_Respawn);
|
|
config.set("Sneak", _Sneak);
|
|
ArrayList<String> l = new ArrayList<>();
|
|
for(PotionEffect popo : _potions)
|
|
l.add(PoToStr(popo));
|
|
|
|
config.set("Potions", l);
|
|
config.set("MaxPlayers", _maxplayer);
|
|
config.set("MinPlayers", _minplayer);
|
|
config.set("Sneak", _Sneak);
|
|
ArrayList<String> s = new ArrayList<>();
|
|
for(Location loc : _spawns)
|
|
s.add(loc2str(loc));
|
|
|
|
config.set("Spawns", s);
|
|
try {
|
|
config.save(new File(_plugin.getDataFolder(), "/arenas/" + _name + ".yml"));
|
|
_plugin.saveConfig();
|
|
} catch (IOException e) {
|
|
_plugin.getLogger().warning("save de " + _name + "impossible !");
|
|
disable();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void joinArena(Player player) {
|
|
if (_spawns.isEmpty()) {
|
|
player.sendMessage(_plugin._trad.get("Game.Arena.error.NoSpawn"));
|
|
return;
|
|
}
|
|
if (_etat > _pregame && !Quake.hasPermission(player, "Quake.JoinInGame")) {
|
|
player.sendMessage(_plugin._trad.get("Game.Arena.error.inGame"));
|
|
return;
|
|
}
|
|
if (_VIP && !Quake.hasPermission(player, "Quake.VIP")) {
|
|
player.sendMessage(_plugin._trad.get("Game.Arena.error.VIP"));
|
|
return;
|
|
}
|
|
if (_full && !Quake.hasPermission(player, "Quake.VIP")) {
|
|
player.sendMessage(_plugin._trad.get("Game.Arena.error.full"));
|
|
return;
|
|
}
|
|
if (_players.size() > _maxplayer - 1) {
|
|
_full = true;
|
|
}
|
|
APlayer ap = new APlayer(_plugin, this, player);
|
|
_players.put(player.getName(), ap);
|
|
broadcast(_plugin._trad.get("Game.Arena.Message.Join").replace("[PLAYER]", player.getName()).replace("[NUMBER]", "" + _players.size()).replace("[MAX]", "" + _maxplayer));
|
|
if (_players.size() >= _minplayer && _etat == _pregame) {
|
|
startDelayed();
|
|
}
|
|
if (_etat > _pregame && Quake.hasPermission(player, "Quake.JoinInGame")) {
|
|
tp(player);
|
|
cleaner(player);
|
|
updateScore();
|
|
ap.setInvincible(40L);
|
|
final Player p = player;
|
|
Bukkit.getScheduler().scheduleSyncDelayedTask(_plugin, new Runnable() {
|
|
|
|
@Override
|
|
public void run() {
|
|
giveStuff(p);
|
|
}
|
|
}, 20);
|
|
Bukkit.getScheduler().scheduleSyncDelayedTask((Plugin)_plugin, new Runnable() {
|
|
|
|
@Override
|
|
public void run() {
|
|
giveEffect(p);
|
|
giveEffect(p);
|
|
}
|
|
}, 35);
|
|
} else {
|
|
tp(player);
|
|
cleaner(player);
|
|
player.getInventory().setItem(8, getLeaveDoor());
|
|
player.getInventory().setHeldItemSlot(0);
|
|
try {
|
|
player.updateInventory();
|
|
}
|
|
catch (Exception p) {
|
|
// empty catch block
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void leaveArena(Player player) {
|
|
APlayer ap = getAPlayer(player);
|
|
SArena.quitcleaner(player);
|
|
player.setScoreboard(_scoremanager.getNewScoreboard());
|
|
if (_players.size() <= 2 && !_stopping && _etat == _ingame) {
|
|
stop();
|
|
}
|
|
if (_players.size() < _minplayer && !_stopping && _etat <= _starting) {
|
|
resetCountdown();
|
|
}
|
|
if (_plugin._lobby._lobbyspawn != null) {
|
|
player.teleport(_plugin._lobby._lobbyspawn);
|
|
} else {
|
|
Location wo = (Location)_spawns.get(0);
|
|
if (wo != null) {
|
|
player.teleport(wo.getWorld().getSpawnLocation());
|
|
}
|
|
}
|
|
ap.RestoreInventory();
|
|
_players.remove(player.getName());
|
|
}
|
|
|
|
@Override
|
|
public void CrashLeaveArena(Player player) {
|
|
_players.remove(player.getName());
|
|
if (_players.size() <= 1 && !_stopping && _etat == _ingame) {
|
|
stop();
|
|
}
|
|
if (_players.size() < _minplayer && !_stopping && _etat <= _starting) {
|
|
resetCountdown();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void updateScore() {
|
|
if(_players.size() <= 0)
|
|
return;
|
|
|
|
for(APlayer player2 : _players.values())
|
|
_objective.getScore(player2.getName()).setScore(player2._score);
|
|
|
|
for(APlayer player2 : _players.values())
|
|
player2.getPlayer().setScoreboard(_objective.getScoreboard());
|
|
}
|
|
|
|
@Override
|
|
public void stop() {
|
|
_stopping = true;
|
|
_plugin.getServer().getScheduler().cancelTask(_timer);
|
|
for(APlayer play : _players.values()) {
|
|
Player player = play.getPlayer();
|
|
SArena.quitcleaner(player);
|
|
player.setScoreboard(_scoremanager.getNewScoreboard());
|
|
if(_plugin._lobby._lobbyspawn != null)
|
|
player.teleport(_plugin._lobby._lobbyspawn);
|
|
play.RestoreInventory();
|
|
}
|
|
_stopping = false;
|
|
resetArena();
|
|
}
|
|
|
|
@Override
|
|
public void start() {
|
|
if( _players.values().size() == 0) {
|
|
_plugin.getLogger().info("Don't start empty Arena: Stop it!");
|
|
stop();
|
|
} else {
|
|
_etat = _ingame;
|
|
if (_objective != null) {
|
|
_objective.unregister();
|
|
}
|
|
_objective = _board.registerNewObjective(_name, "dummy");
|
|
_objective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
|
_objective.setDisplayName("Score");
|
|
for(APlayer play : _players.values()) {
|
|
Player player = play.getPlayer();
|
|
cleaner(player);
|
|
giveStuff(player);
|
|
tp(player);
|
|
updateScore();
|
|
giveEffect(player);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void addspawn(Location loc) {
|
|
_spawns.add(loc);
|
|
}
|
|
|
|
public void removespawn(String args) {
|
|
_spawns.remove(Integer.parseInt(args));
|
|
}
|
|
|
|
@Override
|
|
public void win(final Player player) {
|
|
getGainWin(player);
|
|
_finished = true;
|
|
nbroadcast(ChatColor.GOLD + "#" + ChatColor.GRAY + "--------------------" + ChatColor.GOLD + "#");
|
|
nbroadcast("" + ChatColor.GRAY);
|
|
nbroadcast(_plugin._trad.get("Game.Arena.Message.Won").replace("[NAME]", player.getName()));
|
|
nbroadcast("" + ChatColor.GRAY);
|
|
nbroadcast(ChatColor.GOLD + "#" + ChatColor.GRAY + "--------------------" + ChatColor.GOLD + "#");
|
|
_plugin.getLogger().log(Level.INFO, _plugin._trad.get("Game.Arena.Message.Won").replace("[NAME]", player.getName()));
|
|
final int nb = (int)((double)_after * 1.5);
|
|
final int infoxp = Bukkit.getScheduler().scheduleSyncRepeatingTask(_plugin, new Runnable() {
|
|
|
|
@Override
|
|
public void run() {
|
|
if(_compteur >= nb)
|
|
return;
|
|
|
|
FireworkEffectPlayer.playFirework(player);
|
|
_compteur++;
|
|
}
|
|
}, 5, 5);
|
|
Bukkit.getScheduler().scheduleSyncDelayedTask((Plugin)_plugin, new Runnable() {
|
|
|
|
@Override
|
|
public void run() {
|
|
_plugin.getServer().getScheduler().cancelTask(infoxp);
|
|
stop();
|
|
}
|
|
}, _after * 20);
|
|
}
|
|
|
|
@Override
|
|
public Location getTp(Player player) {
|
|
int higher = _spawns.size() - 1;
|
|
if (_spawns.size() < 0) {
|
|
higher = 0;
|
|
}
|
|
int random = (int)(Math.random() * (double)higher);
|
|
Location loc = (Location)_spawns.get(random);
|
|
return loc;
|
|
}
|
|
|
|
}
|