toDelete = cfg.getStringList("todelete");
- if (toDelete != null){
+ if (!toDelete.isEmpty()){
for (String jar : toDelete) {
- PAA_Uninstall.remove(jar);
+ PAA_Modules.remove(jar);
}
cfg.set("todelete", null);
saveConfig();
@@ -475,7 +432,6 @@ public void onEnable() {
Help.init(getConfig().getString("language", "en"));
StatisticsManager.initialize();
- ArenaPlayer.initiate();
getServer().getPluginManager()
.registerEvents(new BlockListener(), this);
@@ -501,14 +457,7 @@ public void onEnable() {
ArenaManager.readShortcuts(getConfig().getConfigurationSection("shortcuts"));
}
- updater = new Updater(this, getFile());
-
- if (ArenaManager.count() > 0) {
- if (PVPArena.instance.getConfig().getBoolean("tracker", true)) {
- final Tracker trackMe = new Tracker();
- trackMe.start();
- }
- }
+ updateChecker = new UpdateChecker(this.getFile());
Language.logInfo(MSG.LOG_PLUGIN_ENABLED, getDescription().getFullName());
}
diff --git a/src/net/slipcor/pvparena/arena/Arena.java b/src/net/slipcor/pvparena/arena/Arena.java
index 4e2e18e70..7aa3a1ea5 100644
--- a/src/net/slipcor/pvparena/arena/Arena.java
+++ b/src/net/slipcor/pvparena/arena/Arena.java
@@ -1,6 +1,5 @@
package net.slipcor.pvparena.arena;
-import com.google.common.collect.ImmutableMap;
import net.slipcor.pvparena.PVPArena;
import net.slipcor.pvparena.arena.ArenaPlayer.Status;
import net.slipcor.pvparena.classes.*;
@@ -19,6 +18,7 @@
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
+import org.bukkit.attribute.Attribute;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.command.CommandSender;
@@ -35,12 +35,18 @@
import org.bukkit.plugin.IllegalPluginAccessException;
import org.bukkit.projectiles.ProjectileSource;
import org.bukkit.scheduler.BukkitRunnable;
-import org.bukkit.scoreboard.*;
+import org.bukkit.scoreboard.DisplaySlot;
+import org.bukkit.scoreboard.Objective;
+import org.bukkit.scoreboard.Scoreboard;
+import org.bukkit.scoreboard.Team;
import org.bukkit.util.Vector;
import java.io.File;
import java.io.IOException;
import java.util.*;
+import java.util.stream.Collectors;
+
+import static java.util.Optional.ofNullable;
/**
*
@@ -219,7 +225,7 @@ public void addRegion(final ArenaRegion region) {
if (cfg.getBoolean(CFG.JOIN_FORCE)) {
region.initTimer();
}
- } else if (region.getType() == RegionType.WATCH) {
+ } else if (region.getType() == RegionType.WATCH || region.getType() == RegionType.LOUNGE) {
region.initTimer();
}
}
@@ -410,15 +416,9 @@ public Player getEntityOwner(final Entity entity) {
* hand over everyone being part of the arena
*/
public Set getEveryone() {
-
- final Set players = new HashSet<>();
-
- for (final ArenaPlayer ap : ArenaPlayer.getAllArenaPlayers()) {
- if (equals(ap.getArena())) {
- players.add(ap);
- }
- }
- return players;
+ return ArenaPlayer.getAllArenaPlayers().stream()
+ .filter(ap -> this.equals(ap.getArena()))
+ .collect(Collectors.toSet());
}
/**
@@ -485,14 +485,12 @@ public String getPrefix() {
public Material getReadyBlock() {
getDebugger().i("reading ready block");
- final String sMat = cfg.getString(CFG.READY_BLOCK);
try {
- Material mMat;
- mMat = Material.getMaterial(sMat);
+ Material mMat = cfg.getMaterial(CFG.READY_BLOCK, Material.STICK);
getDebugger().i("mMat now is " + mMat.name());
return mMat;
} catch (final Exception e) {
- Language.logWarn(MSG.ERROR_MAT_NOT_FOUND, sMat);
+ Language.logWarn(MSG.ERROR_MAT_NOT_FOUND, "ready block");
}
return Material.IRON_BLOCK;
}
@@ -531,86 +529,63 @@ public Set getSpawns() {
}
private Scoreboard getSpecialScoreboard() {
- if (scoreboard == null) {
- scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
-/*
- Objective oBM = Bukkit.getScoreboardManager().getMainScoreboard().getObjective(DisplaySlot.BELOW_NAME);
- if (oBM != null) {
- oBM = scoreboard.registerNewObjective(oBM.getCriteria(), oBM.getDisplayName());
- oBM.setDisplaySlot(DisplaySlot.BELOW_NAME);
-
- }
-
- Objective oTB = Bukkit.getScoreboardManager().getMainScoreboard().getObjective(DisplaySlot.PLAYER_LIST);
- if (oTB != null) {
- oTB = scoreboard.registerNewObjective(oTB.getCriteria(), oTB.getDisplayName());
- oTB.setDisplaySlot(DisplaySlot.PLAYER_LIST);
- }
-*/
- for (final ArenaTeam team : getTeams()) {
-
- try {
- scoreboard.registerNewTeam(team.getName());
- final Team bukkitTeam = scoreboard.getTeam(team.getName());
- if (!getArenaConfig().getBoolean(CFG.PLAYER_COLLISION)) {
- bukkitTeam.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
- }
- bukkitTeam.setPrefix(team.getColor().toString());
- bukkitTeam.addEntry(team.getName());
- bukkitTeam.setAllowFriendlyFire(getArenaConfig().getBoolean(CFG.PERMS_TEAMKILL));
+ if (this.scoreboard == null) {
+ this.scoreboard = this.getCommonScoreboard(true);
- bukkitTeam.setCanSeeFriendlyInvisibles(!isFreeForAll());
- } catch (final Exception e) {
- e.printStackTrace();
- }
- }
+ // length = 18 without arena name
+ String sbHeaderPrefix = ChatColor.GREEN + "PVP Arena" + ChatColor.RESET + " - " + ChatColor.YELLOW;
+ String sbHeaderName = sbHeaderPrefix + this.getName();
- if (scoreboard.getObjective("lives") != null) {
- scoreboard.getObjective("lives").unregister();
- if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) {
- scoreboard.getObjective(DisplaySlot.SIDEBAR).unregister();
+ if (sbHeaderName.length() > 32) {
+ if (this.prefix.length() <= 14) {
+ sbHeaderName = sbHeaderPrefix + this.prefix;
+ } else {
+ sbHeaderName = sbHeaderName.substring(0, 32);
}
}
- Objective obj = scoreboard.registerNewObjective("lives", "dummy"); //deathCount
-
- String name = ChatColor.GREEN + "PVP Arena" + ChatColor.RESET + " - " + ChatColor.YELLOW + getName();
-
- if (name.length() > 32) {
- if (prefix.length() < getName().length()) {
- name = ChatColor.GREEN + "PVP Arena" + ChatColor.RESET + " - " + ChatColor.YELLOW + prefix;
- } else {
- name = name.substring(0, 32);
+ if (this.scoreboard.getObjective("lives") != null) {
+ this.scoreboard.getObjective("lives").unregister();
+ if (this.scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) {
+ this.scoreboard.getObjective(DisplaySlot.SIDEBAR).unregister();
}
}
- obj.setDisplayName(name);
+ Objective obj = this.scoreboard.registerNewObjective("lives", "dummy", sbHeaderName); //deathCount
if (this.isFightInProgress()) {
obj.setDisplaySlot(DisplaySlot.SIDEBAR);
}
}
- return scoreboard;
+ return this.scoreboard;
}
private Scoreboard getStandardScoreboard() {
- if (scoreboard == null) {
- scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
- for (final ArenaTeam team : getTeams()) {
- final Team sTeam = scoreboard.registerNewTeam(team.getName());
- sTeam.setPrefix(team.getColor().toString());
- sTeam.setCanSeeFriendlyInvisibles(!isFreeForAll());
- if (!getArenaConfig().getBoolean(CFG.PLAYER_COLLISION)) {
- sTeam.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
+ if (this.scoreboard == null) {
+ return this.getCommonScoreboard(false);
+ }
+ return this.scoreboard;
+ }
+
+ private Scoreboard getCommonScoreboard(boolean addTeamEntry) {
+ if (this.scoreboard == null) {
+ this.scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
+ for (final ArenaTeam team : this.getTeams()) {
+ final Team sbTeam = this.scoreboard.registerNewTeam(team.getName());
+ sbTeam.setPrefix(team.getColor().toString());
+ sbTeam.setSuffix(ChatColor.RESET.toString());
+ sbTeam.setColor(team.getColor());
+ sbTeam.setCanSeeFriendlyInvisibles(!this.isFreeForAll());
+ sbTeam.setAllowFriendlyFire(this.getArenaConfig().getBoolean(CFG.PERMS_TEAMKILL));
+ if (!this.getArenaConfig().getBoolean(CFG.PLAYER_COLLISION)) {
+ sbTeam.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
}
- for (final ArenaPlayer aPlayer : team.getTeamMembers()) {
- sTeam.addEntry(aPlayer.getName());
+
+ if(addTeamEntry) {
+ sbTeam.addEntry(team.getName());
}
- } /*
- for (Objective o : scoreboard.getObjectives()) {
- o.setDisplaySlot(DisplaySlot.PLAYER_LIST);
- } */
+ }
}
- return scoreboard;
+ return this.scoreboard;
}
public ArenaTeam getTeam(final String name) {
@@ -685,12 +660,8 @@ public void giveRewards(final Player player) {
getDebugger().i("giving rewards to " + player.getName(), player);
ArenaModuleManager.giveRewards(this, player);
- final String sItems = cfg.getString(CFG.ITEMS_REWARDS, "none");
+ ItemStack[] items = cfg.getItems(CFG.ITEMS_REWARDS);
- String[] items = sItems.split(",");
- if ("none".equals(sItems)) {
- items = null;
- }
final boolean isRandom = cfg.getBoolean(CFG.ITEMS_RANDOM);
final Random rRandom = new Random();
@@ -711,7 +682,7 @@ public void giveRewards(final Player player) {
if (items[i] == null) {
continue;
}
- final ItemStack stack = StringParser.getItemStackFromString(items[i]);
+ final ItemStack stack = items[i];
if (stack == null) {
PVPArena.instance.getLogger().warning(
"unrecognized item: " + items[i]);
@@ -823,7 +794,7 @@ public boolean isFightInProgress() {
}
public boolean isFreeForAll() {
- return free;
+ return this.free;
}
public boolean isLocked() {
@@ -894,6 +865,7 @@ public String parseDeathCause(final Player player, final DamageCause cause,
switch (cause) {
case ENTITY_ATTACK:
+ case ENTITY_SWEEP_ATTACK:
if (damager instanceof Player && team != null) {
return team.colorizePlayer(aPlayer.get()) + ChatColor.YELLOW;
}
@@ -946,8 +918,7 @@ public String parseDeathCause(final Player player, final DamageCause cause,
default:
break;
}
- MSG string = MSG.getByName("DEATHCAUSE_"
- + cause.toString());
+ MSG string = MSG.getByName("DEATHCAUSE_" + cause.toString());
if (string == null) {
PVPArena.instance.getLogger().warning("Unknown cause: " + cause.toString());
string = MSG.DEATHCAUSE_VOID;
@@ -964,22 +935,6 @@ public static void pmsg(final CommandSender sender, final String msg) {
sender.sendMessage(Language.parse(MSG.MESSAGES_GENERAL, PVPArena.instance.getConfig().getString("globalPrefix", "PVP Arena"), msg));
}
- /**
- * @deprecated use {@link #playerLeave(Player, CFG, boolean, boolean), boolean}
- */
- @Deprecated
- public void playerLeave(final Player player, final CFG location, final boolean silent) {
- playerLeave(player, location, silent, !silent, silent);
- }
-
- /**
- * @deprecated use {@link #playerLeave(Player, CFG, boolean, boolean), boolean}
- */
- @Deprecated
- public void playerLeave(final Player player, final CFG location, final boolean silent, final boolean force) {
- playerLeave(player, location, silent, force, !force);
- }
-
/**
* a player leaves from the arena
*
@@ -1327,46 +1282,50 @@ public void resetPlayers(final boolean force) {
}
private void resetScoreboard(final Player player, final boolean force, final boolean soft) {
- if (getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
- getDebugger().i("ScoreBoards: "+(soft?"(soft) ":"")+"remove: " + player.getName(), player);
+ if (this.getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
+ this.getDebugger().i("ScoreBoards: "+(soft?"(soft) ":"")+"remove: " + player.getName(), player);
try {
- if (scoreboard != null) {
- for (final Team team : scoreboard.getTeams()) {
+ if (this.scoreboard != null) {
+ for (final Team team : this.scoreboard.getTeams()) {
if (team.hasEntry(player.getName())) {
team.removeEntry(player.getName());
if (soft) {
- updateScoreboards();
+ this.updateScoreboards();
return;
}
- scoreboard.resetScores(player.getName());
+ this.scoreboard.resetScores(player.getName());
}
}
} else {
- getDebugger().i("ScoreBoards: scoreboard is null!");
+ this.getDebugger().i("ScoreBoards: scoreboard is null!");
return;
}
+
final ArenaPlayer ap = ArenaPlayer.parsePlayer(player.getName());
- class RunLater implements Runnable {
- @Override
- public void run() {
- if (ap.hasBackupScoreboard()) {
- player.setScoreboard(ap.getBackupScoreboard());
+ if (ap.hasBackupScoreboard()) {
+ this.getDebugger().i("ScoreBoards: restoring " + ap.get());
+
+ class RunLater extends BukkitRunnable {
+ @Override
+ public void run() {
+ Scoreboard backupScoreboard = ap.getBackupScoreboard();
if (ap.getBackupScoreboardTeam() != null && !force) {
- ap.getBackupScoreboardTeam().addEntry(ap.getName());
+ backupScoreboard.getTeam(ap.getBackupScoreboardTeam()).addEntry(ap.getName());
}
+ player.setScoreboard(backupScoreboard);
ap.setBackupScoreboardTeam(null);
ap.setBackupScoreboard(null);
}
}
- }
- getDebugger().i("ScoreBoards: maybe restoring " + ap.get());
- if (force) {
- new RunLater().run();
- } else {
- try {
- Bukkit.getScheduler().runTaskLater(PVPArena.instance, new RunLater(), 2L);
- } catch (IllegalStateException e) {
+ if (force) {
+ new RunLater().run();
+ } else {
+ try {
+ new RunLater().runTaskLater(PVPArena.instance, 2L);
+ } catch (IllegalStateException ignored) {
+
+ }
}
}
@@ -1374,7 +1333,7 @@ public void run() {
e.printStackTrace();
}
} else {
- Team team = getStandardScoreboard().getEntryTeam(player.getName());
+ Team team = this.getStandardScoreboard().getEntryTeam(player.getName());
if (team != null) {
team.removeEntry(player.getName());
if (soft) {
@@ -1382,23 +1341,19 @@ public void run() {
}
}
final ArenaPlayer ap = ArenaPlayer.parsePlayer(player.getName());
- try {
- Bukkit.getScheduler().runTaskLater(PVPArena.instance, new Runnable() {
- @Override
- public void run() {
-
- if (ap.hasBackupScoreboard()) {
- player.setScoreboard(ap.getBackupScoreboard());
- if (ap.getBackupScoreboardTeam() != null) {
- ap.getBackupScoreboardTeam().addEntry(ap.getName());
- }
- ap.setBackupScoreboardTeam(null);
- ap.setBackupScoreboard(null);
+ if (ap.hasBackupScoreboard()) {
+ try {
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, () -> {
+ Scoreboard backupScoreboard = ap.getBackupScoreboard();
+ if (ap.getBackupScoreboardTeam() != null) {
+ backupScoreboard.getTeam(ap.getBackupScoreboardTeam()).addEntry(ap.getName());
}
- }
- }, 3L);
- } catch (IllegalPluginAccessException e) {
+ player.setScoreboard(backupScoreboard);
+ ap.setBackupScoreboardTeam(null);
+ }, 3L);
+ } catch (IllegalPluginAccessException ignored) {
+ }
}
}
}
@@ -1528,10 +1483,10 @@ public boolean removeCustomScoreBoardEntry(final ArenaModule module, final int v
* reset a player to his pre-join values
*
* @param player the player to reset
- * @param string the teleport location
+ * @param destination the teleport location
* @param soft if location should be preserved (another tp incoming)
*/
- private void resetPlayer(final Player player, final String string, final boolean soft,
+ private void resetPlayer(final Player player, final String destination, final boolean soft,
final boolean force) {
if (player == null) {
return;
@@ -1548,30 +1503,28 @@ private void resetPlayer(final Player player, final String string, final boolean
if (aPlayer.getState() != null) {
aPlayer.getState().unload(soft);
}
- resetScoreboard(player, force, soft);
+ this.resetScoreboard(player, force, soft);
//noinspection deprecation
- ArenaModuleManager.resetPlayer(this, player, force);
ArenaModuleManager.resetPlayer(this, player, soft, force);
- String sClass = "";
- if (aPlayer.getArenaClass() != null) {
- sClass = aPlayer.getArenaClass().getName();
- }
-
- if (!soft && (!"custom".equalsIgnoreCase(sClass) ||
- cfg.getBoolean(CFG.GENERAL_CUSTOMRETURNSGEAR))) {
+ if (!soft && (!aPlayer.hasCustomClass() || cfg.getBoolean(CFG.GENERAL_CUSTOMRETURNSGEAR))) {
ArenaPlayer.reloadInventory(this, player, true);
}
+ this.teleportPlayerAfterReset(destination, soft, force, aPlayer);
+ }
+
+ private void teleportPlayerAfterReset(final String destination, final boolean soft, final boolean force, final ArenaPlayer aPlayer) {
+ final Player player = aPlayer.get();
class RunLater implements Runnable {
@Override
public void run() {
- getDebugger().i("string = " + string, player);
+ getDebugger().i("string = " + destination, player);
aPlayer.setTelePass(true);
- if ("old".equalsIgnoreCase(string)) {
+ if ("old".equalsIgnoreCase(destination)) {
getDebugger().i("tping to old", player);
if (aPlayer.getSavedLocation() != null) {
getDebugger().i("location is fine", player);
@@ -1584,13 +1537,13 @@ public void run() {
aPlayer.setTeleporting(false);
}
} else {
- Location offset = getOffset(string);
+ Location offset = getOffset(destination);
if (offset == null) {
offset = new Location(Bukkit.getWorlds().get(0), 0, 0, 0);
}
- final PALocation loc = SpawnManager.getSpawnByExactName(Arena.this, string);
+ final PALocation loc = SpawnManager.getSpawnByExactName(Arena.this, destination);
if (loc == null) {
- new Exception("RESET Spawn null: " + getName() + "->" + string).printStackTrace();
+ new Exception("RESET Spawn null: " + getName() + "->" + destination).printStackTrace();
} else {
player.teleport(loc.toLocation().add(offset.toVector()));
aPlayer.setTelePass(false);
@@ -1613,92 +1566,51 @@ public void run() {
final RunLater runLater = new RunLater();
aPlayer.setTeleporting(true);
- if (cfg.getInt(CFG.TIME_RESETDELAY) > -1 && !force) {
- Bukkit.getScheduler().runTaskLater(PVPArena.instance, runLater, cfg.getInt(CFG.TIME_RESETDELAY));
- } else {
+ if (cfg.getInt(CFG.TIME_RESETDELAY) > 0 && !force) {
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, runLater, cfg.getInt(CFG.TIME_RESETDELAY) * 20);
+ } else if (PVPArena.instance.isShuttingDown()) {
runLater.run();
+ } else {
+ // Waiting two ticks in order to avoid player death bug
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, runLater, 2);
}
}
- public void setupScoreboard(final Player player) {
- if (getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
- final ArenaPlayer ap = ArenaPlayer.parsePlayer(player.getName());
- getDebugger().i("ScoreBoards: Initiating scoreboard for player " + player.getName());
- if (!ap.hasBackupScoreboard() && player.getScoreboard() != null) {
- ap.setBackupScoreboard(player.getScoreboard());
- ap.setBackupScoreboardTeam(player.getScoreboard().getEntryTeam(ap.getName()));
- } else if (ap.hasBackupScoreboard()) {
- getDebugger().i("ScoreBoards: has backup: " + ap.hasBackupScoreboard());
- getDebugger().i("ScoreBoards: player.getScoreboard == null: " + (player.getScoreboard() == null));
- } else {
- getDebugger().i("ScoreBoards: has backup: false");
- getDebugger().i("ScoreBoards: player.getScoreboard == null: " + (player.getScoreboard() == null));
- }
+ public void setupScoreboard(final ArenaPlayer ap) {
+ Player player = ap.get();
- // first, check if the scoreboard exists
- class RunLater implements Runnable {
- final Scoreboard board = getSpecialScoreboard();
- @Override
- public void run() {
+ this.getDebugger().i("ScoreBoards: Initiating scoreboard for player " + player.getName());
+ this.getDebugger().i("ScoreBoards: has backup: " + ap.hasBackupScoreboard());
+ this.getDebugger().i("ScoreBoards: player.getScoreboard == null: " + (player.getScoreboard() == null));
+ if (!ap.hasBackupScoreboard() && player.getScoreboard() != null) {
+ ap.setBackupScoreboard(player.getScoreboard());
+ ofNullable(player.getScoreboard().getEntryTeam(ap.getName())).ifPresent(team ->
+ ap.setBackupScoreboardTeam(team.getName())
+ );
+ }
+ if (this.getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, () -> {
+ final Scoreboard board = this.getSpecialScoreboard();
- for (final ArenaTeam team : getTeams()) {
+ Optional optBoardTeam = ofNullable(ap.getArenaTeam()).map(team -> board.getTeam(team.getName()));
+ optBoardTeam.ifPresent(boardTeam -> boardTeam.addEntry(player.getName()));
- if (team == ArenaPlayer.parsePlayer(player.getName()).getArenaTeam()) {
- board.getTeam(team.getName()).addEntry(player.getName());
- updateScoreboard(player);
- return;
- }
- }
- try {
- ArenaTeam team = ap.getArenaTeam();
- if (team == null) {
- updateScoreboard(player);
- return;
- }
- scoreboard.registerNewTeam(team.getName());
- final Team bukkitTeam = scoreboard.getTeam(team.getName());
- bukkitTeam.setPrefix(team.getColor().toString());
- bukkitTeam.addEntry(team.getName());
- bukkitTeam.setAllowFriendlyFire(getArenaConfig().getBoolean(CFG.PERMS_TEAMKILL));
- bukkitTeam.setCanSeeFriendlyInvisibles(!isFreeForAll());
- } catch (final Exception e) {
- e.printStackTrace();
- }
+ this.updateScoreboard(player);
- if (getArenaConfig().getBoolean(CFG.USES_SCOREBOARDROUNDDISPLAY)) {
- addCustomScoreBoardEntry(null, Language.parse(MSG.ROUNDS_DISPLAY,
- String.valueOf(getRound()),
- String.valueOf(getRoundCount())), 199);
- addCustomScoreBoardEntry(null, Language.parse(MSG.ROUNDS_DISPLAYSEPARATOR), 198);
- }
+ if (this.getArenaConfig().getBoolean(CFG.USES_SCOREBOARDROUNDDISPLAY)) {
+ this.addCustomScoreBoardEntry(null, Language.parse(MSG.ROUNDS_DISPLAY,
+ String.valueOf(this.getRound()),
+ String.valueOf(this.getRoundCount())), 199);
+ this.addCustomScoreBoardEntry(null, Language.parse(MSG.ROUNDS_DISPLAYSEPARATOR), 198);
}
-
- }
- Bukkit.getScheduler().runTaskLater(PVPArena.instance, new RunLater(), 1L);
+ }, 1L);
} else {
- final Scoreboard board = getStandardScoreboard();
- ArenaPlayer ap = ArenaPlayer.parsePlayer(player.getName());
- final ArenaTeam team = ap.getArenaTeam();
- if (!ap.hasBackupScoreboard() && player.getScoreboard() != null) {
- ap.setBackupScoreboard(player.getScoreboard());
- ap.setBackupScoreboardTeam(player.getScoreboard().getEntryTeam(ap.getName()));
- }
+ final Scoreboard board = this.getStandardScoreboard();
player.setScoreboard(board);
- if (team == null) {
- return;
- }
- for (final Team sTeam : board.getTeams()) {
- if (sTeam.getName().equals(team.getName())) {
- sTeam.addEntry(player.getName());
- return;
- }
- }
- final Team sTeam = board.registerNewTeam(team.getName());
- sTeam.setPrefix(team.getColor().toString());
- sTeam.addEntry(player.getName());
- sTeam.setCanSeeFriendlyInvisibles(!isFreeForAll());
+ Optional optBoardTeam = ofNullable(ap.getArenaTeam()).map(team -> board.getTeam(team.getName()));
+ optBoardTeam.ifPresent(boardTeam -> boardTeam.addEntry(player.getName()));
}
}
@@ -1710,17 +1622,16 @@ public void run() {
public void unKillPlayer(final Player player, final DamageCause cause, final Entity damager) {
getDebugger().i("respawning player " + player.getName(), player);
- int iHealth = cfg.getInt(CFG.PLAYER_HEALTH, -1);
+ double iHealth = cfg.getInt(CFG.PLAYER_HEALTH, -1);
if (iHealth < 1) {
- iHealth = (int) player.getMaxHealth();
+ iHealth = player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue();
}
PlayerState.playersetHealth(player, iHealth);
player.setFoodLevel(cfg.getInt(CFG.PLAYER_FOODLEVEL, 20));
player.setSaturation(cfg.getInt(CFG.PLAYER_SATURATION, 20));
- player.setExhaustion((float) cfg.getDouble(
- CFG.PLAYER_EXHAUSTION, 0.0));
+ player.setExhaustion((float) cfg.getDouble(CFG.PLAYER_EXHAUSTION, 0.0));
player.setVelocity(new Vector());
player.setFallDistance(0);
@@ -1869,7 +1780,7 @@ public void spawnCampPunish() {
.setLastDamageCause(
new EntityDamageEvent(locationArenaPlayerEntry.getValue().get(),
DamageCause.CUSTOM,
- new EnumMap(ImmutableMap.of(EntityDamageEvent.DamageModifier.BASE, Double.valueOf(1002))), new EnumMap(ImmutableMap.of(EntityDamageEvent.DamageModifier.BASE, 0))));
+ 1002));
locationArenaPlayerEntry.getValue()
.get()
.damage(cfg.getInt(
@@ -2022,18 +1933,35 @@ public String toString() {
return name;
}
+ public void tpPlayerToCoordName(ArenaPlayer player, String place) {
+ Location destination = this.prepareTeleportation(player, place);
+ this.teleportPlayer(place, player, destination);
+ this.execPostTeleportationFixes(player);
+ }
+
/**
* teleport a given player to the given coord string
*
* @param player the player to teleport
* @param place the coord string
*/
- public void tpPlayerToCoordName(final Player player, final String place) {
+ public void tpPlayerToCoordNameForJoin(final ArenaPlayer player, final String place, boolean async) {
+ Location destination = this.prepareTeleportation(player, place);
+ int delay = async ? 2 : 0;
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, () -> {
+ teleportPlayer(place, player, destination);
+ setupScoreboard(player);
+ }, delay);
+ this.execPostTeleportationFixes(player);
+ }
+
+ private Location prepareTeleportation(ArenaPlayer aPlayer, String place) {
+ Player player = aPlayer.get();
getDebugger().i("teleporting " + player + " to coord " + place, player);
if (player == null) {
PVPArena.instance.getLogger().severe("Player null!");
- return;
+ throw new RuntimeException("Player null!");
}
if (player.isInsideVehicle()) {
@@ -2042,8 +1970,6 @@ public void tpPlayerToCoordName(final Player player, final String place) {
ArenaModuleManager.tpPlayerToCoordName(this, player, place);
- final ArenaPlayer aPlayer = ArenaPlayer.parsePlayer(player.getName());
-
if ("spectator".equals(place)) {
if (getFighters().contains(aPlayer)) {
aPlayer.setStatus(Status.LOST);
@@ -2056,8 +1982,7 @@ public void tpPlayerToCoordName(final Player player, final String place) {
loc = aPlayer.getSavedLocation();
}
if (loc == null) {
- new Exception("TP Spawn null: " + name + "->" + place).printStackTrace();
- return;
+ throw new RuntimeException("TP Spawn null: " + name + "->" + place);
}
debug.i("raw location: " + loc.toString());
@@ -2070,27 +1995,13 @@ public void tpPlayerToCoordName(final Player player, final String place) {
aPlayer.setTeleporting(true);
aPlayer.setTelePass(true);
- player.teleport(loc.toLocation().add(offset.getX(),offset.getY(),offset.getZ()));
- player.setNoDamageTicks(cfg.getInt(CFG.TIME_TELEPORTPROTECT) * 20);
- if (place.contains("lounge")) {
- getDebugger().i("setting TelePass later!");
- Bukkit.getScheduler().runTaskLater(PVPArena.instance, new Runnable() {
- @Override
- public void run() {
- aPlayer.setTelePass(false);
- aPlayer.setTeleporting(false);
- }
- }, cfg.getInt(CFG.TIME_TELEPORTPROTECT) * 20);
-
- } else {
- getDebugger().i("setting TelePass now!");
- aPlayer.setTelePass(false);
- aPlayer.setTeleporting(false);
- }
+ return loc.toLocation().add(offset.getX(), offset.getY(), offset.getZ());
+ }
+ private void execPostTeleportationFixes(ArenaPlayer aPlayer) {
if (cfg.getBoolean(CFG.PLAYER_REMOVEARROWS)) {
try {
- new ArrowHack(player);
+ new ArrowHack(aPlayer.get());
} catch (final Exception e) {
}
}
@@ -2104,7 +2015,7 @@ public void run() {
public void run() {
for (final ArenaPlayer player : getFighters()) {
if (player.get() != null) {
- player.get().showPlayer(aPlayer.get());
+ player.get().showPlayer(PVPArena.instance, aPlayer.get());
}
}
}
@@ -2115,13 +2026,34 @@ public void run() {
Bukkit.getScheduler().runTaskLater(PVPArena.instance, new Runnable() {
@Override
public void run() {
- player.setAllowFlight(false);
- player.setFlying(false);
+ aPlayer.get().setAllowFlight(false);
+ aPlayer.get().setFlying(false);
}
}, 5L);
}
}
+ private void teleportPlayer(String place, final ArenaPlayer aPlayer, Location location) {
+ Player player = aPlayer.get();
+ player.teleport(location);
+ player.setNoDamageTicks(cfg.getInt(CFG.TIME_TELEPORTPROTECT) * 20);
+ if (place.contains("lounge")) {
+ getDebugger().i("setting TelePass later!");
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, new Runnable() {
+ @Override
+ public void run() {
+ aPlayer.setTelePass(false);
+ aPlayer.setTeleporting(false);
+ }
+ }, cfg.getInt(CFG.TIME_TELEPORTPROTECT) * 20);
+
+ } else {
+ getDebugger().i("setting TelePass now!");
+ aPlayer.setTelePass(false);
+ aPlayer.setTeleporting(false);
+ }
+ }
+
/**
* last resort to put a player into an arena (when no goal/module wants to)
*
@@ -2138,7 +2070,6 @@ public boolean tryJoin(final Player player, final ArenaTeam team) {
if ("ALL".equals(clear) || clear.contains(player.getGameMode().name())) {
player.getInventory().clear();
- player.updateInventory();
ArenaPlayer.backupAndClearInventory(this, player);
aPlayer.dump();
}
@@ -2221,7 +2152,7 @@ && getClass(autoClass) == null) {
for (final PASpawn spawn : spawns) {
if (--pos < 0) {
- tpPlayerToCoordName(player, spawn.getName());
+ this.tpPlayerToCoordName(aPlayer, spawn.getName());
break;
}
}
@@ -2396,34 +2327,32 @@ public void updateRounds() {
}
public void updateScoreboards() {
- if (getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
- Bukkit.getScheduler().runTaskLater(PVPArena.instance, new Runnable() {
- @Override
- public void run() {
- if (isFreeForAll()) {
- for (ArenaPlayer ap : getEveryone()) {
- int value = PACheck.handleGetLives(Arena.this, ap);
- if (value >= 0) {
- getSpecialScoreboard().getObjective("lives").getScore(ap.getName()).setScore(value);
- }
- Player player = ap.get();
- if (player != null && (player.getScoreboard() == null || !player.getScoreboard().equals(getSpecialScoreboard()))) {
- player.setScoreboard(getSpecialScoreboard());
- }
+ if (this.getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, () -> {
+ final Scoreboard currentScoreboard = this.getSpecialScoreboard();
+ if (this.isFreeForAll()) {
+ for (ArenaPlayer ap : this.getEveryone()) {
+ int value = PACheck.handleGetLives(this, ap);
+ if (value >= 0 && ap.getStatus() != Status.WATCH) {
+ currentScoreboard.getObjective("lives").getScore(ap.getName()).setScore(value);
}
- } else {
- for (ArenaTeam team : getTeams()) {
- for (ArenaPlayer ap : team.getTeamMembers()) {
- getSpecialScoreboard().getObjective("lives").getScore(team.getName()).setScore(
- PACheck.handleGetLives(Arena.this, ap));
- break;
- }
+ Player player = ap.get();
+ if (player != null && !currentScoreboard.equals(player.getScoreboard())) {
+ player.setScoreboard(currentScoreboard);
}
- for (ArenaPlayer ap : getEveryone()) {
- Player player = ap.get();
- if (player != null && (player.getScoreboard() == null || !player.getScoreboard().equals(getSpecialScoreboard()))) {
- player.setScoreboard(getSpecialScoreboard());
- }
+ }
+ } else {
+ for (ArenaTeam team : this.getTeams()) {
+ team.getTeamMembers().stream().findFirst().ifPresent(randomTeamPlayer ->
+ currentScoreboard.getObjective("lives")
+ .getScore(team.getName())
+ .setScore(PACheck.handleGetLives(this, randomTeamPlayer))
+ );
+ }
+ for (ArenaPlayer ap : this.getEveryone()) {
+ Player player = ap.get();
+ if (player != null && !currentScoreboard.equals(player.getScoreboard())) {
+ player.setScoreboard(currentScoreboard);
}
}
}
@@ -2432,72 +2361,57 @@ public void run() {
}
private void updateScoreboard(final Player player) {
- if (getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
+ if (this.getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
+ Scoreboard currentScoreboard = this.getSpecialScoreboard();
final ArenaPlayer ap = ArenaPlayer.parsePlayer(player.getName());
- if (ap.getArenaTeam() == null) {
- // a spectator, special case. Just update and do not add to the scores
- if (player.getScoreboard() == null || !player.getScoreboard().equals(getSpecialScoreboard())) {
- player.setScoreboard(getSpecialScoreboard());
- }
- return;
- }
- if (isFreeForAll()) {
- final Score score = getSpecialScoreboard().getObjective("lives").getScore(player.getName());
- score.setScore(PACheck.handleGetLives(this, ArenaPlayer.parsePlayer(player.getName())));
- } else {
- getSpecialScoreboard().getObjective("lives").getScore(ap.getArenaTeam().getName()).setScore(PACheck.handleGetLives(this, ap));
- }
- if (player.getScoreboard() == null || !player.getScoreboard().equals(getSpecialScoreboard())) {
- player.setScoreboard(getSpecialScoreboard());
+
+ // if player is a spectator, special case. Just update and do not add to the scores
+ if (ap.getArenaTeam() != null) {
+ currentScoreboard.getObjective("lives")
+ .getScore(this.isFreeForAll() ? player.getName() : ap.getArenaTeam().getName())
+ .setScore(PACheck.handleGetLives(this, ap));
}
+
+ player.setScoreboard(currentScoreboard);
}
}
public void updateScoreboardTeam(final Player player, final ArenaTeam oldTeam, final ArenaTeam newTeam) {
- if (getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
- final Scoreboard board = getSpecialScoreboard();
- class RunLater implements Runnable {
+ if (this.getArenaConfig().getBoolean(CFG.USES_SCOREBOARD)) {
+ final Scoreboard board = this.getSpecialScoreboard();
- @Override
- public void run() {
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, () -> {
+ board.getTeam(oldTeam.getName()).removeEntry(player.getName());
- final ArenaPlayer aPlayer = ArenaPlayer.parsePlayer(player.getName());
- if (aPlayer.getArenaTeam() != null) {
- board.getTeam(oldTeam.getName()).removeEntry(player.getName());
+ Team sTeam = board.getTeams().stream()
+ .filter(t -> t.getName().equals(newTeam.getName()))
+ .findFirst()
+ .orElseGet(() -> this.addNewTeam(board, newTeam));
+ sTeam.addEntry(player.getName());
- for (final Team sTeam : board.getTeams()) {
- if (sTeam.getName().equals(newTeam.getName())) {
- sTeam.addEntry(player.getName());
- return;
- }
- }
- final Team sTeam = board.registerNewTeam(newTeam.getName());
- sTeam.setPrefix(newTeam.getColor().toString());
- sTeam.addEntry(player.getName());
- sTeam.setCanSeeFriendlyInvisibles(!isFreeForAll());
- }
- updateScoreboard(player);
- }
-
- }
- Bukkit.getScheduler().runTaskLater(PVPArena.instance, new RunLater(), 1L);
+ this.updateScoreboard(player);
+ }, 1L);
} else {
- Scoreboard board = getStandardScoreboard();
+ Scoreboard board = this.getStandardScoreboard();
board.getTeam(oldTeam.getName()).removeEntry(player.getName());
- for (final Team sTeam : board.getTeams()) {
- if (sTeam.getName().equals(newTeam.getName())) {
- sTeam.addEntry(player.getName());
- return;
- }
- }
- final Team sTeam = board.registerNewTeam(newTeam.getName());
- sTeam.setPrefix(newTeam.getColor().toString());
- sTeam.setCanSeeFriendlyInvisibles(!isFreeForAll());
+ Team sTeam = board.getTeams().stream()
+ .filter(t -> t.getName().equals(newTeam.getName()))
+ .findFirst()
+ .orElseGet(() -> this.addNewTeam(board, newTeam));
sTeam.addEntry(player.getName());
}
}
+ private Team addNewTeam(Scoreboard board, ArenaTeam newTeam) {
+ final Team sTeam = board.registerNewTeam(newTeam.getName());
+ sTeam.setPrefix(newTeam.getColor().toString());
+ sTeam.setSuffix(ChatColor.RESET.toString());
+ sTeam.setColor(newTeam.getColor());
+ sTeam.setCanSeeFriendlyInvisibles(!this.isFreeForAll());
+ return sTeam;
+ }
+
public YamlConfiguration getLanguage() {
return language;
}
diff --git a/src/net/slipcor/pvparena/arena/ArenaClass.java b/src/net/slipcor/pvparena/arena/ArenaClass.java
index 9b6cd40b1..0a78c7397 100644
--- a/src/net/slipcor/pvparena/arena/ArenaClass.java
+++ b/src/net/slipcor/pvparena/arena/ArenaClass.java
@@ -3,22 +3,24 @@
import net.slipcor.pvparena.PVPArena;
import net.slipcor.pvparena.classes.PABlockLocation;
import net.slipcor.pvparena.core.Debug;
-import net.slipcor.pvparena.core.StringParser;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Chest;
+import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
-import org.bukkit.inventory.meta.SpawnEggMeta;
-import org.bukkit.material.SpawnEgg;
import org.bukkit.plugin.IllegalPluginAccessException;
import java.io.File;
import java.io.IOException;
import java.util.*;
+import static java.util.Arrays.asList;
+import static net.slipcor.pvparena.core.ItemStackUtils.getItemStacksFromConfig;
+
/**
* Arena Class class
*
@@ -39,50 +41,8 @@ public final class ArenaClass {
private static final Map globals = new HashMap<>();
- // private statics: item definitions
- private static final List ARMORS_TYPE = new LinkedList<>();
- private static final List HELMETS_TYPE = new LinkedList<>();
- private static final List CHESTPLATES_TYPE = new LinkedList<>();
- private static final List LEGGINGS_TYPE = new LinkedList<>();
- private static final List BOOTS_TYPE = new LinkedList<>();
-
- // static filling of the items array
- static {
- HELMETS_TYPE.add(Material.LEATHER_HELMET);
- HELMETS_TYPE.add(Material.GOLD_HELMET);
- HELMETS_TYPE.add(Material.CHAINMAIL_HELMET);
- HELMETS_TYPE.add(Material.IRON_HELMET);
- HELMETS_TYPE.add(Material.DIAMOND_HELMET);
-
- HELMETS_TYPE.add(Material.WOOL);
- HELMETS_TYPE.add(Material.PUMPKIN);
- HELMETS_TYPE.add(Material.JACK_O_LANTERN);
- HELMETS_TYPE.add(Material.SKULL_ITEM);
-
- CHESTPLATES_TYPE.add(Material.LEATHER_CHESTPLATE);
- CHESTPLATES_TYPE.add(Material.GOLD_CHESTPLATE);
- CHESTPLATES_TYPE.add(Material.CHAINMAIL_CHESTPLATE);
- CHESTPLATES_TYPE.add(Material.IRON_CHESTPLATE);
- CHESTPLATES_TYPE.add(Material.DIAMOND_CHESTPLATE);
- CHESTPLATES_TYPE.add(Material.ELYTRA);
-
- LEGGINGS_TYPE.add(Material.LEATHER_LEGGINGS);
- LEGGINGS_TYPE.add(Material.GOLD_LEGGINGS);
- LEGGINGS_TYPE.add(Material.CHAINMAIL_LEGGINGS);
- LEGGINGS_TYPE.add(Material.IRON_LEGGINGS);
- LEGGINGS_TYPE.add(Material.DIAMOND_LEGGINGS);
-
- BOOTS_TYPE.add(Material.LEATHER_BOOTS);
- BOOTS_TYPE.add(Material.GOLD_BOOTS);
- BOOTS_TYPE.add(Material.CHAINMAIL_BOOTS);
- BOOTS_TYPE.add(Material.IRON_BOOTS);
- BOOTS_TYPE.add(Material.DIAMOND_BOOTS);
-
- ARMORS_TYPE.addAll(HELMETS_TYPE);
- ARMORS_TYPE.addAll(CHESTPLATES_TYPE);
- ARMORS_TYPE.addAll(LEGGINGS_TYPE);
- ARMORS_TYPE.addAll(BOOTS_TYPE);
- }
+ private static final List OTHER_HELMET_LIST = asList(Material.PUMPKIN, Material.JACK_O_LANTERN, Material.PLAYER_HEAD);
+
public static void addGlobalClasses() {
globals.clear();
@@ -106,14 +66,20 @@ public static void addGlobalClasses() {
}
for (final String className : cfg.getConfigurationSection("classes").getKeys(false)) {
- final String sItemList;
+ ItemStack[] items;
+ ItemStack offHand;
+ ItemStack[] armors;
try {
- sItemList = (String) cfg.getConfigurationSection("classes").get(className);
+ ConfigurationSection classesCfg = cfg.getConfigurationSection("classes").getConfigurationSection(className);
+ items = getItemStacksFromConfig(classesCfg.getList("items"));
+ offHand = getItemStacksFromConfig(classesCfg.getList("items"))[0];
+ armors = getItemStacksFromConfig(classesCfg.getList("items"));
} catch (final Exception e) {
Bukkit.getLogger().severe(
"[PVP Arena] Error while parsing class, skipping: "
+ className);
+ e.printStackTrace();
continue;
}
final String classChest;
@@ -122,49 +88,12 @@ public static void addGlobalClasses() {
PABlockLocation loc = new PABlockLocation(classChest);
Chest c = (Chest) loc.toLocation().getBlock().getState();
ItemStack[] contents = c.getInventory().getContents();
- final ItemStack[] items = Arrays.copyOfRange(contents, 0, contents.length-5);
- final ItemStack offHand = contents[contents.length-5];
- final ItemStack[] armors = Arrays.copyOfRange(contents, contents.length-4, contents.length);
+ items = Arrays.copyOfRange(contents, 0, contents.length-5);
+ offHand = contents[contents.length-5];
+ armors = Arrays.copyOfRange(contents, contents.length-4, contents.length);
globals.put(className, new ArenaClass(className, items, offHand, armors));
} catch (Exception e) {
- final String[] sItems = sItemList.split(",");
- final ItemStack[] items = new ItemStack[sItems.length];
- final ItemStack[] offhand = new ItemStack[1];
- final ItemStack[] armors = new ItemStack[4];
-
- for (int i = 0; i < sItems.length; i++) {
-
- if (sItems[i].contains(">>!<<")) {
- final String[] split = sItems[i].split(">>!<<");
-
- final int id = Integer.parseInt(split[0]);
- armors[id] = StringParser.getItemStackFromString(split[1]);
-
- if (armors[id] == null) {
- PVPArena.instance.getLogger().warning(
- "unrecognized armor item: " + split[1]);
- }
-
- sItems[i] = "AIR";
- } else if (sItems[i].contains(">>O<<")) {
- final String[] split = sItems[i].split(">>O<<");
-
- final int id = Integer.parseInt(split[0]);
- offhand[id] = StringParser.getItemStackFromString(split[1]);
-
- if (offhand[id] == null) {
- PVPArena.instance.getLogger().warning(
- "unrecognized armor item: " + split[1]);
- }
- }
-
- items[i] = StringParser.getItemStackFromString(sItems[i]);
- if (items[i] == null) {
- PVPArena.instance.getLogger().warning(
- "unrecognized item: " + items[i]);
- }
- }
- globals.put(className, new ArenaClass(className, items, offhand[0], armors));
+ globals.put(className, new ArenaClass(className, items, offHand, armors));
}
}
}
@@ -176,24 +105,24 @@ public static void addGlobalClasses(final Arena arena) {
}
public static void equip(final Player player, final ItemStack[] items) {
- ItemStack last = items[items.length-1];
+ int i = 0;
for (final ItemStack item : items) {
- if (ARMORS_TYPE.contains(item.getType())) {
+ if (isArmorItem(item.getType())) {
equipArmor(item, player.getInventory());
} else {
- if (last != null && last == item) {
- player.getInventory().setItemInOffHand(last);
+ if (i == items.length - 1) {
+ player.getInventory().setItemInOffHand(item);
continue;
}
- if (item.getType() == Material.MONSTER_EGG && item.hasItemMeta() && item.getItemMeta().hasDisplayName() && "SPAWN".equals(item.getItemMeta().getDisplayName())) {
- final SpawnEggMeta egg = (SpawnEggMeta) item.getItemMeta();
+ if (item.hasItemMeta() && item.getItemMeta().hasDisplayName() && "SPAWN".equals(item.getItemMeta().getDisplayName())) {
+ final String eggType = item.getType().name().replace("_SPAWN_EGG", "");
try {
Bukkit.getScheduler().runTaskLater(PVPArena.instance, new Runnable(){
@Override
public void run() {
ArenaPlayer.parsePlayer(player.getName()).getArena().addEntity(
- player, player.getWorld().spawnEntity(player.getLocation(), egg.getSpawnedType()));
+ player, player.getWorld().spawnEntity(player.getLocation(), EntityType.valueOf(eggType)));
}
}, 20L);
} catch(final IllegalPluginAccessException e) {
@@ -202,57 +131,80 @@ public void run() {
} else {
player.getInventory().addItem(item);
}
- debug.i("- " + StringParser.getStringFromItemStack(item), player);
+ }
+ i++;
+ }
+ }
+
+ public static void equip(final Player player, final ItemStack[][] itemArray) {
+ try {
+ player.getInventory().setItemInOffHand(itemArray[1][0]);
+ } catch(ArrayIndexOutOfBoundsException e) {
+ player.getInventory().setItemInOffHand(new ItemStack(Material.AIR));
+ }
+
+ for(ItemStack itemStack : itemArray[2]) {
+ equipArmor(itemStack, player.getInventory());
+ }
+
+ for (final ItemStack item : itemArray[0]) {
+ if (item.getType().name().endsWith("_SPAWN_EGG")) {
+ final String eggType = item.getType().name().replace("_SPAWN_EGG", "");
+
+ try {
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, () ->
+ ArenaPlayer.parsePlayer(player.getName()).getArena().addEntity(
+ player, player.getWorld().spawnEntity(player.getLocation(), EntityType.valueOf(eggType))), 20L);
+ } catch(final IllegalPluginAccessException ignored) {
+
+ }
+ } else {
+ player.getInventory().addItem(item);
}
}
- player.updateInventory();
}
public void equip(final Player player) {
debug.i("Equipping player " + player.getName() + " with items!", player);
- for (ItemStack item : armors) {
+ for (ItemStack item : this.armors) {
if (item != null) {
- debug.i("armor: "+StringParser.getStringFromItemStack(item));
equipArmor(item, player.getInventory());
}
}
- for (final ItemStack item : items) {
+ for (final ItemStack item : this.items) {
if (item == null) {
continue;
}
- if (ARMORS_TYPE.contains(item.getType())) {
+ if (isArmorItem(item.getType())) {
equipArmor(item, player.getInventory());
} else {
player.getInventory().addItem(item);
- debug.i("- " + StringParser.getStringFromItemStack(item), player);
}
}
- player.getInventory().setItemInOffHand(offHand);
- player.updateInventory();
+ player.getInventory().setItemInOffHand(this.offHand);
}
private static void equipArmor(final ItemStack stack, final PlayerInventory inv) {
- debug.i("- " + StringParser.getStringFromItemStack(stack), (Player) inv.getHolder());
final Material type = stack.getType();
- if (HELMETS_TYPE.contains(type)) {
+ if (isHelmetItem(type)) {
if (inv.getHelmet() != null && inv.getHelmet().getType() != Material.AIR) {
inv.addItem(stack);
} else {
inv.setHelmet(stack);
}
- } else if (CHESTPLATES_TYPE.contains(type)) {
+ } else if (isChestplateItem(type)) {
if (inv.getChestplate() != null && inv.getChestplate().getType() != Material.AIR) {
inv.addItem(stack);
} else {
inv.setChestplate(stack);
}
- } else if (LEGGINGS_TYPE.contains(type)) {
+ } else if (isLeggingsItem(type)) {
if (inv.getLeggings() != null && inv.getLeggings().getType() != Material.AIR) {
inv.addItem(stack);
} else {
inv.setLeggings(stack);
}
- } else if (BOOTS_TYPE.contains(type)) {
+ } else if (isBootsItem(type)) {
if (inv.getBoots() != null && inv.getBoots().getType() != Material.AIR) {
inv.addItem(stack);
} else {
@@ -261,32 +213,43 @@ private static void equipArmor(final ItemStack stack, final PlayerInventory inv)
}
}
- /**
- * Backwards compatible offhand-less implementation of the constructor
- *
- * @deprecated use {@link #ArenaClass(String, ItemStack[], ItemStack, ItemStack[])} } instead.
- */
- @Deprecated
- public ArenaClass(final String className, final ItemStack[] classItems, final ItemStack[] armors) {
- this(className, classItems, null, armors);
- }
-
public ArenaClass(final String className, final ItemStack[] classItems, final ItemStack offHand, final ItemStack[] armors) {
- name = className;
+ this.name = className;
this.offHand = offHand;
- items = classItems.clone();
+ this.items = classItems.clone();
this.armors = armors.clone();
}
public String getName() {
- return name;
+ return this.name;
}
public ItemStack[] getArmors() {
- return armors.clone();
+ return this.armors.clone();
}
public ItemStack[] getItems() {
- return items.clone();
+ return this.items.clone();
+ }
+
+ private static boolean isHelmetItem(Material material) {
+ return material.name().endsWith("_HELMET") || material.name().endsWith("_WOOL") ||
+ OTHER_HELMET_LIST.contains(material);
+ }
+
+ private static boolean isChestplateItem(Material material) {
+ return material.name().endsWith("_CHESTPLATE") || material == Material.ELYTRA;
+ }
+
+ private static boolean isLeggingsItem(Material material) {
+ return material.name().endsWith("_LEGGINGS");
+ }
+
+ private static boolean isBootsItem(Material material) {
+ return material.name().endsWith("_BOOTS");
+ }
+
+ private static boolean isArmorItem(Material material) {
+ return isBootsItem(material) || isLeggingsItem(material) || isChestplateItem(material) || isHelmetItem(material);
}
-}
\ No newline at end of file
+}
diff --git a/src/net/slipcor/pvparena/arena/ArenaPlayer.java b/src/net/slipcor/pvparena/arena/ArenaPlayer.java
index cd1fa5f60..483ba0908 100644
--- a/src/net/slipcor/pvparena/arena/ArenaPlayer.java
+++ b/src/net/slipcor/pvparena/arena/ArenaPlayer.java
@@ -4,16 +4,16 @@
import net.slipcor.pvparena.classes.PABlockLocation;
import net.slipcor.pvparena.classes.PALocation;
import net.slipcor.pvparena.classes.PAStatMap;
+import net.slipcor.pvparena.core.ColorUtils;
import net.slipcor.pvparena.core.Config;
import net.slipcor.pvparena.core.Config.CFG;
import net.slipcor.pvparena.core.Debug;
-import net.slipcor.pvparena.core.StringParser;
import net.slipcor.pvparena.events.PAPlayerClassChangeEvent;
import net.slipcor.pvparena.loadables.ArenaModuleManager;
import net.slipcor.pvparena.managers.ArenaManager;
import net.slipcor.pvparena.managers.InventoryManager;
import net.slipcor.pvparena.managers.SpawnManager;
-import net.slipcor.pvparena.managers.StatisticsManager.type;
+import net.slipcor.pvparena.managers.StatisticsManager.Type;
import org.bukkit.*;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.*;
@@ -24,11 +24,12 @@
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.projectiles.ProjectileSource;
import org.bukkit.scoreboard.Scoreboard;
-import org.bukkit.scoreboard.Team;
import java.io.File;
import java.util.*;
+import static java.util.Optional.ofNullable;
+
/**
*
* Arena Player class
@@ -64,7 +65,7 @@ public class ArenaPlayer {
private final Map statistics = new HashMap<>();
private Scoreboard backupBoard;
- private Team backupBoardTeam;
+ private String backupBoardTeam;
/**
* Status
@@ -101,6 +102,7 @@ public enum Status {
*/
public enum PlayerPrevention {
BREAK, PLACE, TNT, TNTBREAK, DROP, INVENTORY, PICKUP, CRAFT;
+
public static boolean has(int value, PlayerPrevention s) {
return (((int) Math.pow(2, s.ordinal()) & value) > 0);
}
@@ -110,28 +112,11 @@ public static boolean has(int value, PlayerPrevention s) {
private final PABlockLocation[] selection = new PABlockLocation[2];
private ArenaPlayer(final String playerName) {
- name = playerName;
-
- totalPlayers.put(name, this);
- }
-
- private ArenaPlayer(final Player player, final Arena arena) {
- name = player.getName();
- this.arena = arena;
-
- totalPlayers.put(name, this);
- }
-
- public static int countPlayers() {
- return totalPlayers.size();
+ this.name = playerName;
}
public static Set getAllArenaPlayers() {
- final Set players = new HashSet<>();
- for (final ArenaPlayer ap : totalPlayers.values()) {
- players.add(ap);
- }
- return players;
+ return new HashSet<>(totalPlayers.values());
}
public boolean getFlyState() {
@@ -184,7 +169,8 @@ public static Player getLastDamagingPlayer(final Event eEvent, final Player dama
}
}
debug.i("last damaging player is null", damagee);
- debug.i("last damaging event: " + eEvent.getEventName(), damagee);
+ debug.i("last damaging event: " + ofNullable(eEvent).map(Event::getEventName)
+ .orElse("unknown cause"), damagee);
return null;
}
@@ -207,58 +193,47 @@ public static void givePlayerFightItems(final Arena arena, final Player player)
if (arena.getArenaConfig().getBoolean(CFG.USES_WOOLHEAD)) {
final ArenaTeam aTeam = aPlayer.getArenaTeam();
- final String color = aTeam.getColor().name();
+ final ChatColor color = aTeam.getColor();
arena.getDebugger().i("forcing woolhead: " + aTeam.getName() + '/'
- + color, player);
+ + color.name(), player);
player.getInventory().setHelmet(
- new ItemStack(Material.WOOL, 1, StringParser
- .getColorDataFromENUM(color)));
+ new ItemStack(ColorUtils.getWoolMaterialFromChatColor(color)));
}
}
- public static void initiate() {
- debug.i("creating offline arena players");
-
- if (!PVPArena.instance.getConfig().getBoolean("stats")) {
- return;
- }
-
- final YamlConfiguration cfg = new YamlConfiguration();
- try {
- cfg.load(PVPArena.instance.getDataFolder() + "/players.yml");
-
- final Set arenas = cfg.getKeys(false);
-
- for (final String arenaname : arenas) {
-
- final Set players = cfg.getConfigurationSection(arenaname).getKeys(false);
- for (final String player : players) {
- totalPlayers.put(player, ArenaPlayer.parsePlayer(player));
- }
+ /**
+ * get an ArenaPlayer from a player name
+ *
+ * @param name the playername to use
+ * @return an ArenaPlayer instance belonging to that player
+ */
+ public static ArenaPlayer parsePlayer(final String name) {
+ synchronized (ArenaPlayer.class) {
+ Player player = Bukkit.getPlayerExact(name);
+ // Offline player or NPC
+ if (player == null) {
+ return new ArenaPlayer(name);
}
- } catch (final Exception e) {
- e.printStackTrace();
+ if (!totalPlayers.containsKey(name)) {
+ ArenaPlayer ap = new ArenaPlayer(player.getName());
+ totalPlayers.putIfAbsent(name, ap);
+ }
+ return totalPlayers.get(name);
}
}
/**
- * get an ArenaPlayer from a player name
+ * add an ArenaPlayer (used to load statistics)
*
* @param name the playername to use
* @return an ArenaPlayer instance belonging to that player
*/
- public static ArenaPlayer parsePlayer(final String name) {
+ public static ArenaPlayer addPlayer(final String name) {
synchronized (ArenaPlayer.class) {
- if (totalPlayers.get(name) == null) {
- if (Bukkit.getPlayerExact(name) == null) {
- totalPlayers.put(name, new ArenaPlayer(name));
- } else {
- totalPlayers.put(name,
- new ArenaPlayer(Bukkit.getPlayerExact(name), null));
- }
- }
+ ArenaPlayer aPlayer = new ArenaPlayer(name);
+ totalPlayers.putIfAbsent(name, aPlayer);
return totalPlayers.get(name);
}
}
@@ -291,8 +266,9 @@ public static void reloadInventory(final Arena arena, final Player player, final
final ArenaPlayer aPlayer = parsePlayer(player.getName());
- if (!"none".equals(arena.getArenaConfig().getString(CFG.ITEMS_TAKEOUTOFGAME))) {
- final ItemStack[] items = StringParser.getItemStacksFromString(arena.getArenaConfig().getString(CFG.ITEMS_TAKEOUTOFGAME));
+ if (arena.getArenaConfig().getYamlConfiguration().get(CFG.ITEMS_TAKEOUTOFGAME.getNode()) != null) {
+ final ItemStack[] items =
+ arena.getArenaConfig().getItems(CFG.ITEMS_TAKEOUTOFGAME);
final List allowedMats = new ArrayList<>();
@@ -338,20 +314,22 @@ public void run() {
if (instant) {
- debug.i("adding " + StringParser.getStringFromItemStacks(aPlayer.savedInventory), player);
+ debug.i("adding saved inventory", player);
player.getInventory().setContents(aPlayer.savedInventory);
} else {
class GiveLater implements Runnable {
final ItemStack[] inv;
+
GiveLater(final ItemStack[] inv) {
this.inv = inv.clone();
- }
+ }
+
@Override
public void run() {
- debug.i("adding " + StringParser.getStringFromItemStacks(inv),
+ debug.i("adding saved inventory",
player);
player.getInventory().setContents(inv);
- }
+ }
}
final GiveLater gl = new GiveLater(aPlayer.savedInventory);
try {
@@ -363,18 +341,18 @@ public void run() {
}
public void addDeath() {
- getStatistics(arena).incStat(type.DEATHS);
+ getStatistics(arena).incStat(Type.DEATHS);
}
public void addKill() {
- getStatistics(arena).incStat(type.KILLS);
+ getStatistics(arena).incStat(Type.KILLS);
}
public void addLosses() {
- getStatistics(arena).incStat(type.LOSSES);
+ getStatistics(arena).incStat(Type.LOSSES);
}
- public void addStatistic(final String arenaName, final type type,
+ public void addStatistic(final String arenaName, final Type type,
final int value) {
if (!statistics.containsKey(arenaName)) {
statistics.put(arenaName, new PAStatMap());
@@ -384,7 +362,7 @@ public void addStatistic(final String arenaName, final type type,
}
public void addWins() {
- getStatistics(arena).incStat(type.WINS);
+ getStatistics(arena).incStat(Type.WINS);
}
private void clearDump() {
@@ -435,9 +413,6 @@ public void debugPrint() {
name);
debug.i("location: " + location, name);
debug.i("status: " + status.name(), name);
- debug.i("savedInventory: "
- + StringParser.getStringFromItemStacks(savedInventory),
- name);
debug.i("tempPermissions:", name);
for (final PermissionAttachment pa : tempPermissions) {
debug.i("> " + pa, name);
@@ -499,6 +474,7 @@ public Arena getArena() {
public ArenaClass getArenaClass() {
return aClass;
}
+
public ArenaClass getNextArenaClass() {
return naClass;
}
@@ -519,7 +495,7 @@ public Scoreboard getBackupScoreboard() {
return backupBoard;
}
- public Team getBackupScoreboardTeam() {
+ public String getBackupScoreboardTeam() {
return backupBoardTeam;
}
@@ -592,7 +568,7 @@ public Set getTempPermissions() {
return tempPermissions;
}
- public int getTotalStatistics(final type statType) {
+ public int getTotalStatistics(final Type statType) {
int sum = 0;
for (final PAStatMap stat : statistics.values()) {
@@ -618,6 +594,10 @@ public boolean isPublicChatting() {
return publicChatting;
}
+ public boolean hasCustomClass() {
+ return this.getArenaClass() != null && "custom".equalsIgnoreCase(this.getArenaClass().getName());
+ }
+
public void readDump() {
debug.i("reading dump: " + name, name);
debugPrint();
@@ -676,34 +656,34 @@ public void reset() {
if (arena != null) {
final String arenaName = arena.getName();
cfg.set(arenaName + '.' + name + ".losses", getStatistics()
- .getStat(type.LOSSES)
- + getTotalStatistics(type.LOSSES));
+ .getStat(Type.LOSSES)
+ + getTotalStatistics(Type.LOSSES));
cfg.set(arenaName + '.' + name + ".wins",
getStatistics()
- .getStat(type.WINS)
- + getTotalStatistics(type.WINS));
+ .getStat(Type.WINS)
+ + getTotalStatistics(Type.WINS));
cfg.set(arenaName + '.' + name + ".kills",
getStatistics().getStat(
- type.KILLS)
- + getTotalStatistics(type.KILLS));
+ Type.KILLS)
+ + getTotalStatistics(Type.KILLS));
cfg.set(arenaName + '.' + name + ".deaths", getStatistics()
- .getStat(type.DEATHS)
- + getTotalStatistics(type.DEATHS));
+ .getStat(Type.DEATHS)
+ + getTotalStatistics(Type.DEATHS));
cfg.set(arenaName + '.' + name + ".damage", getStatistics()
- .getStat(type.DAMAGE)
- + getTotalStatistics(type.DAMAGE));
+ .getStat(Type.DAMAGE)
+ + getTotalStatistics(Type.DAMAGE));
cfg.set(arenaName + '.' + name + ".maxdamage",
getStatistics().getStat(
- type.MAXDAMAGE)
- + getTotalStatistics(type.MAXDAMAGE));
+ Type.MAXDAMAGE)
+ + getTotalStatistics(Type.MAXDAMAGE));
cfg.set(arenaName + '.' + name + ".damagetake",
getStatistics().getStat(
- type.DAMAGETAKE)
- + getTotalStatistics(type.DAMAGETAKE));
+ Type.DAMAGETAKE)
+ + getTotalStatistics(Type.DAMAGETAKE));
cfg.set(arenaName + '.' + name + ".maxdamagetake",
getStatistics().getStat(
- type.MAXDAMAGETAKE)
- + getTotalStatistics(type.MAXDAMAGETAKE));
+ Type.MAXDAMAGETAKE)
+ + getTotalStatistics(Type.MAXDAMAGETAKE));
}
cfg.save(file);
@@ -767,11 +747,11 @@ public final void setArena(final Arena arena) {
* @param aClass the arena class to set
*/
public void setArenaClass(final ArenaClass aClass) {
- final PAPlayerClassChangeEvent event = new PAPlayerClassChangeEvent(arena, get(), aClass);
+ final PAPlayerClassChangeEvent event = new PAPlayerClassChangeEvent(this.arena, this.get(), aClass);
Bukkit.getServer().getPluginManager().callEvent(event);
this.aClass = event.getArenaClass();
- if (arena != null) {
- ArenaModuleManager.parseClassChange(arena, get(), this.aClass);
+ if (this.arena != null && this.getStatus() != Status.NULL) {
+ ArenaModuleManager.parseClassChange(this.arena, this.get(), this.aClass);
}
}
@@ -797,8 +777,8 @@ public void setBackupScoreboard(Scoreboard board) {
backupBoard = board;
}
- public void setBackupScoreboardTeam(Team team) {
- backupBoardTeam = team;
+ public void setBackupScoreboardTeam(String sbTeamName) {
+ this.backupBoardTeam = sbTeamName;
}
public void setMayDropInventory(boolean value) {
@@ -833,7 +813,7 @@ public void setSelection(final Location loc, final boolean second) {
}
}
- public void setStatistic(final String arenaName, final type type,
+ public void setStatistic(final String arenaName, final Type type,
final int value) {
if (!statistics.containsKey(arenaName)) {
statistics.put(arenaName, new PAStatMap());
@@ -855,7 +835,7 @@ public void setStatus(final Status status) {
*/
public void setTelePass(final boolean canTeleport) {
if (arena != null) {
- arena.getDebugger().i("TelePass := "+canTeleport);
+ arena.getDebugger().i("TelePass := " + canTeleport);
}
telePass = canTeleport;
}
@@ -868,8 +848,7 @@ public void showBloodParticles() {
Player player = get();
player.getLocation()
.getWorld()
- .playEffect(player.getEyeLocation(),
- Effect.STEP_SOUND, Material.NETHER_WART_BLOCK.getId());
+ .playEffect(player.getEyeLocation(), Effect.STEP_SOUND, Material.NETHER_WART_BLOCK);
}
@@ -877,8 +856,7 @@ public void showBloodParticles() {
public String toString() {
final ArenaTeam team = getArenaTeam();
- return team == null ? name : team.getColorCodeString() + name
- + ChatColor.RESET;
+ return team == null ? name : team.getColorCodeString() + name + ChatColor.RESET;
}
public void unsetSelection() {
diff --git a/src/net/slipcor/pvparena/arena/ArenaTeam.java b/src/net/slipcor/pvparena/arena/ArenaTeam.java
index d2c62ce4f..d5d48c1d3 100644
--- a/src/net/slipcor/pvparena/arena/ArenaTeam.java
+++ b/src/net/slipcor/pvparena/arena/ArenaTeam.java
@@ -1,8 +1,8 @@
package net.slipcor.pvparena.arena;
import net.slipcor.pvparena.arena.ArenaPlayer.Status;
+import net.slipcor.pvparena.core.ColorUtils;
import net.slipcor.pvparena.core.Debug;
-import net.slipcor.pvparena.core.StringParser;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
@@ -34,7 +34,7 @@ public class ArenaTeam {
*/
public ArenaTeam(final String name, final String color) {
players = new HashSet<>();
- this.color = StringParser.getChatColorFromWoolEnum(color);
+ this.color = ColorUtils.getChatColorFromDyeColor(color);
this.name = name;
}
@@ -125,4 +125,12 @@ public boolean isEveryoneReady() {
public void remove(final ArenaPlayer player) {
players.remove(player);
}
-}
\ No newline at end of file
+
+ @Override
+ public String toString() {
+ return "ArenaTeam{" +
+ "color=" + this.color +
+ ", name='" + this.name + '\'' +
+ '}';
+ }
+}
diff --git a/src/net/slipcor/pvparena/arena/PlayerState.java b/src/net/slipcor/pvparena/arena/PlayerState.java
index 8b6929556..f9e92494e 100644
--- a/src/net/slipcor/pvparena/arena/PlayerState.java
+++ b/src/net/slipcor/pvparena/arena/PlayerState.java
@@ -105,7 +105,7 @@ public static void fullReset(final Arena arena, final Player player) {
}
if (arena.getArenaConfig().getInt(CFG.PLAYER_MAXHEALTH) > 0) {
- player.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(arena.getArenaConfig().getInt(CFG.PLAYER_MAXHEALTH));
+ player.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(arena.getArenaConfig().getInt(CFG.PLAYER_MAXHEALTH));
}
if (iHealth > player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue()) {
@@ -115,12 +115,9 @@ public static void fullReset(final Arena arena, final Player player) {
}
player.setFireTicks(0);
try {
- Bukkit.getScheduler().runTaskLater(PVPArena.instance, new Runnable() {
- @Override
- public void run() {
- if (player.getFireTicks() > 0) {
- player.setFireTicks(0);
- }
+ Bukkit.getScheduler().runTaskLater(PVPArena.instance, () -> {
+ if (player.getFireTicks() > 0) {
+ player.setFireTicks(0);
}
}, 5L);
} catch (Exception e) {
@@ -129,8 +126,7 @@ public void run() {
player.setVelocity(new Vector());
player.setFoodLevel(arena.getArenaConfig().getInt(CFG.PLAYER_FOODLEVEL));
player.setSaturation(arena.getArenaConfig().getInt(CFG.PLAYER_SATURATION));
- player.setExhaustion((float) arena.getArenaConfig().getDouble(
- CFG.PLAYER_EXHAUSTION));
+ player.setExhaustion((float) arena.getArenaConfig().getDouble(CFG.PLAYER_EXHAUSTION));
player.setLevel(0);
player.setExp(0);
if (arena.getArenaConfig().getInt(CFG.GENERAL_GAMEMODE) > -1) {
@@ -242,7 +238,7 @@ public void run() {
* @param player the player to set
* @param value the health value
*/
- public static void playersetHealth(final Player player, final int value) {
+ public static void playersetHealth(final Player player, final double value) {
debug.i("setting health to " + value + "/20", player);
if (Bukkit.getServer().getPluginManager().getPlugin("Heroes") == null) {
player.setHealth(value);
@@ -250,8 +246,7 @@ public static void playersetHealth(final Player player, final int value) {
final double current = player.getHealth();
final double regain = value - current;
- final EntityRegainHealthEvent event = new EntityRegainHealthEvent(player, regain,
- RegainReason.CUSTOM);
+ final EntityRegainHealthEvent event = new EntityRegainHealthEvent(player, regain, RegainReason.CUSTOM);
Bukkit.getPluginManager().callEvent(event);
}
diff --git a/src/net/slipcor/pvparena/classes/PABlock.java b/src/net/slipcor/pvparena/classes/PABlock.java
index 3878c176d..e41259fe7 100644
--- a/src/net/slipcor/pvparena/classes/PABlock.java
+++ b/src/net/slipcor/pvparena/classes/PABlock.java
@@ -5,24 +5,24 @@ public class PABlock {
private final String name;
public PABlock(final PABlockLocation loc, final String string) {
- location = loc;
- name = string;
+ this.location = loc;
+ this.name = string;
}
@Override
public boolean equals(final Object o) {
if (o instanceof PABlock) {
final PABlock other = (PABlock) o;
- return name.equals(other.name) && location.equals(other.location);
+ return this.name.equals(other.name) && this.location.equals(other.location);
}
return false;
}
public PABlockLocation getLocation() {
- return location;
+ return this.location;
}
public String getName() {
- return name;
+ return this.name;
}
}
diff --git a/src/net/slipcor/pvparena/classes/PABlockLocation.java b/src/net/slipcor/pvparena/classes/PABlockLocation.java
index 3cf916ea8..75b40a592 100644
--- a/src/net/slipcor/pvparena/classes/PABlockLocation.java
+++ b/src/net/slipcor/pvparena/classes/PABlockLocation.java
@@ -30,30 +30,30 @@ public PABlockLocation(final String world, final int x, final int y, final int z
public PABlockLocation(final String value) {
String[] split = value.split(":");
- world = split[0];
+ this.world = split[0];
String[] ints = split[1].split(",");
- x = Integer.parseInt(ints[0]);
- y = Integer.parseInt(ints[1]);
- z = Integer.parseInt(ints[2]);
+ this.x = Integer.parseInt(ints[0]);
+ this.y = Integer.parseInt(ints[1]);
+ this.z = Integer.parseInt(ints[2]);
}
public PABlockLocation(final Location bukkitLocation) {
- world = bukkitLocation.getWorld().getName();
- x = bukkitLocation.getBlockX();
- y = bukkitLocation.getBlockY();
- z = bukkitLocation.getBlockZ();
+ this.world = bukkitLocation.getWorld().getName();
+ this.x = bukkitLocation.getBlockX();
+ this.y = bukkitLocation.getBlockY();
+ this.z = bukkitLocation.getBlockZ();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + (world == null ? 0 : world.hashCode());
- result = prime * result + x;
- result = prime * result + y;
- result = prime * result + z;
+ result = prime * result + (this.world == null ? 0 : this.world.hashCode());
+ result = prime * result + this.x;
+ result = prime * result + this.y;
+ result = prime * result + this.z;
return result;
}
@@ -65,24 +65,24 @@ public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
- if (getClass() != obj.getClass()) {
+ if (this.getClass() != obj.getClass()) {
return false;
}
final PABlockLocation other = (PABlockLocation) obj;
- if (world == null) {
+ if (this.world == null) {
if (other.world != null) {
return false;
}
- } else if (!world.equals(other.world)) {
+ } else if (!this.world.equals(other.world)) {
return false;
}
- if (x != other.x) {
+ if (this.x != other.x) {
return false;
}
- if (y != other.y) {
+ if (this.y != other.y) {
return false;
}
- return z == other.z;
+ return this.z == other.z;
}
public double getDistance(final PABlockLocation otherLocation) {
@@ -90,14 +90,14 @@ public double getDistance(final PABlockLocation otherLocation) {
throw new IllegalArgumentException(
"Cannot measure distance to a null location");
}
- if (!otherLocation.world.equals(world)) {
+ if (!otherLocation.world.equals(this.world)) {
throw new IllegalArgumentException(
- "Cannot measure distance between " + world + " and "
+ "Cannot measure distance between " + this.world + " and "
+ otherLocation.world);
}
- return Math.sqrt(Math.pow(x - otherLocation.x, 2.0D)
- + Math.pow(y - otherLocation.y, 2.0D) + Math.pow(z - otherLocation.z, 2.0D));
+ return Math.sqrt(Math.pow(this.x - otherLocation.x, 2.0D)
+ + Math.pow(this.y - otherLocation.y, 2.0D) + Math.pow(this.z - otherLocation.z, 2.0D));
}
public double getDistanceSquared(final PABlockLocation otherLocation) {
@@ -105,77 +105,77 @@ public double getDistanceSquared(final PABlockLocation otherLocation) {
throw new IllegalArgumentException(
"Cannot measure distance to a null location");
}
- if (!otherLocation.world.equals(world)) {
+ if (!otherLocation.world.equals(this.world)) {
throw new IllegalArgumentException(
- "Cannot measure distance between " + world + " and "
+ "Cannot measure distance between " + this.world + " and "
+ otherLocation.world);
}
- return Math.pow(x - otherLocation.x, 2.0D)
- + Math.pow(y - otherLocation.y, 2.0D) + Math.pow(z - otherLocation.z, 2.0D);
+ return Math.pow(this.x - otherLocation.x, 2.0D)
+ + Math.pow(this.y - otherLocation.y, 2.0D) + Math.pow(this.z - otherLocation.z, 2.0D);
}
public PABlockLocation getMidpoint(final PABlockLocation location) {
- return new PABlockLocation(world, (x + location.x) / 2, (y + location.y) / 2,
- (z + location.z) / 2);
+ return new PABlockLocation(this.world, (this.x + location.x) / 2, (this.y + location.y) / 2,
+ (this.z + location.z) / 2);
}
public String getWorldName() {
- return world;
+ return this.world;
}
public int getX() {
- return x;
+ return this.x;
}
public int getY() {
- return y;
+ return this.y;
}
public int getZ() {
- return z;
+ return this.z;
}
public boolean isInAABB(final PABlockLocation min, final PABlockLocation max) {
- if (x < min.x || x > max.x) {
+ if (this.x < min.x || this.x > max.x) {
return false;
}
- if (y < min.y || y > max.y) {
+ if (this.y < min.y || this.y > max.y) {
return false;
}
- return !(z < min.z || z > max.z);
+ return !(this.z < min.z || this.z > max.z);
}
public PABlockLocation pointTo(final PABlockLocation dest, final Double length) {
- final Vector source = new Vector(x, y, z);
+ final Vector source = new Vector(this.x, this.y, this.z);
final Vector destination = new Vector(dest.x, dest.y, dest.z);
Vector goal = source.subtract(destination);
goal = goal.normalize().multiply(length);
- return new PABlockLocation(world, x + x + goal.getBlockX(), y
- + goal.getBlockY(), z + goal.getBlockZ());
+ return new PABlockLocation(this.world, this.x + this.x + goal.getBlockX(), this.y
+ + goal.getBlockY(), this.z + goal.getBlockZ());
}
public void setX(final int value) {
- x = value;
+ this.x = value;
}
public void setY(final int value) {
- y = value;
+ this.y = value;
}
public void setZ(final int value) {
- z = value;
+ this.z = value;
}
public Location toLocation() {
- return new Location(Bukkit.getWorld(world), x, y, z);
+ return new Location(Bukkit.getWorld(this.world), this.x, this.y, this.z);
}
@Override
public String toString() {
- return world + ':' + x + ',' + y + ',' + z;
+ return this.world + ':' + this.x + ',' + this.y + ',' + this.z;
}
}
diff --git a/src/net/slipcor/pvparena/classes/PACheck.java b/src/net/slipcor/pvparena/classes/PACheck.java
index 925505d48..2cba17dd8 100644
--- a/src/net/slipcor/pvparena/classes/PACheck.java
+++ b/src/net/slipcor/pvparena/classes/PACheck.java
@@ -11,7 +11,6 @@
import net.slipcor.pvparena.core.Debug;
import net.slipcor.pvparena.core.Language;
import net.slipcor.pvparena.core.Language.MSG;
-import net.slipcor.pvparena.core.StringParser;
import net.slipcor.pvparena.events.PAJoinEvent;
import net.slipcor.pvparena.events.PAStartEvent;
import net.slipcor.pvparena.loadables.ArenaGoal;
@@ -334,19 +333,20 @@ public static boolean handleJoin(final Arena arena,
final ArenaTeam team;
- if (args.length < 1 || arena.getTeam(args[0]) == null) {
+ if (args.length < 1) {
// usage: /pa {arenaname} join | join an arena
team = arena.getTeam(TeamManager.calcFreeTeam(arena));
+ } else if(arena.getTeam(args[0]) == null) {
+ arena.msg(sender, Language.parse(arena, MSG.ERROR_TEAMNOTFOUND, args[0]));
+ return false;
} else {
ArenaTeam aTeam = arena.getTeam(args[0]);
int maxPlayers = arena.getArenaConfig().getInt(CFG.READY_MAXPLAYERS);
int maxTeamPlayers = arena.getArenaConfig().getInt(CFG.READY_MAXTEAMPLAYERS);
- if (aTeam == null) {
- team = aTeam;
- } else if (maxPlayers > 0 && arena.getFighters().size() > maxPlayers) {
+ if (maxPlayers > 0 && arena.getFighters().size() > maxPlayers) {
arena.msg(sender, Language.parse(arena, MSG.ERROR_JOIN_ARENA_FULL));
return false;
} else if (maxTeamPlayers > 0 && aTeam.getTeamMembers().size() > maxTeamPlayers) {
@@ -357,11 +357,6 @@ public static boolean handleJoin(final Arena arena,
}
}
- if (team == null && args.length > 0) {
- arena.msg(sender,
- Language.parse(arena, MSG.ERROR_TEAMNOTFOUND, args[0]));
- return false;
- }
if (team == null) {
arena.msg(sender, Language.parse(arena, MSG.ERROR_JOIN_ARENA_FULL));
return false;
@@ -517,7 +512,7 @@ public static void handlePlayerDeath(final Arena arena,
StatisticsManager.kill(arena, player.getKiller(), player, doesRespawn);
if (arena.getArenaConfig().getBoolean(CFG.USES_DEATHMESSAGES) ||
arena.getArenaConfig().getBoolean(CFG.USES_DEATHMESSAGESCUSTOM)) {
- event.setDeathMessage(null);
+ event.setDeathMessage("");
}
if (player.getKiller() != null) {
@@ -532,15 +527,13 @@ public static void handlePlayerDeath(final Arena arena,
InventoryManager.clearInventory(player.getKiller());
ArenaPlayer.parsePlayer(player.getKiller().getName()).getArenaClass().equip(player.getKiller());
}
- if (!arena.getArenaConfig().getString(CFG.PLAYER_ITEMSONKILL).equals("none")) {
- String definition = arena.getArenaConfig().getString(CFG.PLAYER_ITEMSONKILL);
- ItemStack[] items = StringParser.getItemStacksFromString(definition);
+ if (arena.getArenaConfig().getItems(CFG.PLAYER_ITEMSONKILL) != null) {
+ ItemStack[] items = arena.getArenaConfig().getItems(CFG.PLAYER_ITEMSONKILL);
for (ItemStack item : items) {
if (item != null) {
player.getKiller().getInventory().addItem(item.clone());
}
}
- player.getKiller().updateInventory();
}
if (arena.getArenaConfig().getBoolean(CFG.USES_TELEPORTONKILL)) {
SpawnManager.respawn(arena, ArenaPlayer.parsePlayer(player.getKiller().getName()), null);
diff --git a/src/net/slipcor/pvparena/classes/PAClaimBar.java b/src/net/slipcor/pvparena/classes/PAClaimBar.java
index 8b26a240f..49378890c 100644
--- a/src/net/slipcor/pvparena/classes/PAClaimBar.java
+++ b/src/net/slipcor/pvparena/classes/PAClaimBar.java
@@ -2,7 +2,6 @@
import net.slipcor.pvparena.PVPArena;
import net.slipcor.pvparena.arena.Arena;
-import net.slipcor.pvparena.arena.ArenaPlayer;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
diff --git a/src/net/slipcor/pvparena/classes/PAStatMap.java b/src/net/slipcor/pvparena/classes/PAStatMap.java
index 81a8b9827..070af56ae 100644
--- a/src/net/slipcor/pvparena/classes/PAStatMap.java
+++ b/src/net/slipcor/pvparena/classes/PAStatMap.java
@@ -15,29 +15,29 @@
*/
public class PAStatMap {
- private final Map map = new HashMap<>();
+ private final Map map = new HashMap<>();
- public void decStat(final StatisticsManager.type type) {
+ public void decStat(final StatisticsManager.Type type) {
decStat(type, 1);
}
- public void decStat(final StatisticsManager.type type, final int value) {
+ public void decStat(final StatisticsManager.Type type, final int value) {
map.put(type, getStat(type) - value);
}
- public int getStat(final StatisticsManager.type type) {
+ public int getStat(final StatisticsManager.Type type) {
return map.containsKey(type) ? map.get(type) : 0;
}
- public void incStat(final StatisticsManager.type type) {
+ public void incStat(final StatisticsManager.Type type) {
incStat(type, 1);
}
- public void incStat(final StatisticsManager.type type, final int value) {
+ public void incStat(final StatisticsManager.Type type, final int value) {
map.put(type, getStat(type) + value);
}
- public void setStat(final StatisticsManager.type type, final int value) {
+ public void setStat(final StatisticsManager.Type type, final int value) {
map.put(type, value);
}
}
diff --git a/src/net/slipcor/pvparena/commands/AbstractGlobalCommand.java b/src/net/slipcor/pvparena/commands/AbstractGlobalCommand.java
index b3bd5e20b..259359d43 100644
--- a/src/net/slipcor/pvparena/commands/AbstractGlobalCommand.java
+++ b/src/net/slipcor/pvparena/commands/AbstractGlobalCommand.java
@@ -47,6 +47,14 @@ static boolean argCountValid(final CommandSender sender, final String[] args,
public abstract String getName();
+ /**
+ * Check if the global command also exists in arena context
+ * @return true if there is the same command for arena context
+ */
+ public boolean hasVersionForArena() {
+ return false;
+ }
+
@Override
public boolean hasPerms(final CommandSender sender, final Arena arena) {
// tabComplete check
diff --git a/src/net/slipcor/pvparena/commands/PAA_Class.java b/src/net/slipcor/pvparena/commands/PAA_Class.java
index ce90b9220..c6769c098 100644
--- a/src/net/slipcor/pvparena/commands/PAA_Class.java
+++ b/src/net/slipcor/pvparena/commands/PAA_Class.java
@@ -8,7 +8,7 @@
import net.slipcor.pvparena.core.Help.HELP;
import net.slipcor.pvparena.core.Language;
import net.slipcor.pvparena.core.Language.MSG;
-import net.slipcor.pvparena.core.StringParser;
+import net.slipcor.pvparena.managers.InventoryManager;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@@ -17,6 +17,8 @@
import java.util.Collections;
import java.util.List;
+import static net.slipcor.pvparena.core.Utils.getSerializableItemStacks;
+
/**
*
* PVP Arena CLASS Command class
@@ -69,42 +71,20 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
final Player player = (Player) sender;
final List items = new ArrayList<>();
- for (final ItemStack is : player.getInventory().getStorageContents()) {
- if (is != null) {
- items.add(is);
- }
- }
-
- final ItemStack[] isItems = new ItemStack[items.size()];
- int position = 0;
- for (final ItemStack is : items) {
- isItems[position++] = is;
- }
-
- final String sItems = isItems.length < 1 ? "AIR"
- : StringParser.getStringFromItemStacks(isItems);
- final StringBuilder armor = new StringBuilder("");
- int pos = 0;
- for (final ItemStack item : player.getInventory().getArmorContents()) {
- armor.append(',');
- armor.append(pos++);
- armor.append(">>!<<");
- armor.append(StringParser.getStringFromItemStack(item));
- }
- if (player.getInventory().getItemInOffHand() != null) {
- armor.append(',');
- armor.append(0);
- armor.append(">>O<<");
- armor.append(StringParser.getStringFromItemStack(player.getInventory().getItemInOffHand()));
- }
-
- arena.getArenaConfig().setManually("classitems." + args[1], sItems + armor);
+ arena.getArenaConfig().setManually("classitems." + args[1] + ".items", getSerializableItemStacks(player.getInventory().getStorageContents()));
+ arena.getArenaConfig().setManually("classitems." + args[1] + ".offhand", getSerializableItemStacks(player.getInventory().getItemInOffHand()));
+ arena.getArenaConfig().setManually("classitems." + args[1] + ".armor", getSerializableItemStacks(player.getInventory().getArmorContents()));
arena.getArenaConfig().save();
- arena.addClass(args[1], StringParser.getItemStacksFromString(sItems), player.getInventory().getItemInOffHand(), player.getInventory().getArmorContents());
+
+ arena.addClass(args[1], player.getInventory().getStorageContents(), player.getInventory().getItemInOffHand(), player.getInventory().getArmorContents());
Arena.pmsg(player, Language.parse(arena, MSG.CLASS_SAVED, args[1]));
} else if ("load".equalsIgnoreCase(args[0])) {
final ArenaPlayer aPlayer = ArenaPlayer.parsePlayer(sender.getName());
- ArenaPlayer.backupAndClearInventory(arena, aPlayer.get());
+ if(aPlayer.getArenaClass() == null) {
+ ArenaPlayer.backupAndClearInventory(arena, aPlayer.get());
+ } else {
+ InventoryManager.clearInventory(aPlayer.get());
+ }
arena.selectClass(aPlayer, args[1]);
} else if ("remove".equalsIgnoreCase(args[0])) {
final Player player = (Player) sender;
diff --git a/src/net/slipcor/pvparena/commands/PAA_ForceWin.java b/src/net/slipcor/pvparena/commands/PAA_ForceWin.java
index f7b9b041e..cb22a6604 100644
--- a/src/net/slipcor/pvparena/commands/PAA_ForceWin.java
+++ b/src/net/slipcor/pvparena/commands/PAA_ForceWin.java
@@ -55,7 +55,8 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
for (final ArenaPlayer ap : team.getTeamMembers()) {
if (ap.getStatus() == ArenaPlayer.Status.FIGHT) {
ap.get().getWorld().strikeLightningEffect(ap.get().getLocation());
- final EntityDamageEvent e = new EntityDamageEvent(ap.get(), EntityDamageEvent.DamageCause.LIGHTNING, new EnumMap(ImmutableMap.of(EntityDamageEvent.DamageModifier.BASE, Double.valueOf((double) 10))), new EnumMap(ImmutableMap.of(EntityDamageEvent.DamageModifier.BASE, -0.0D)));
+ final EntityDamageEvent e = new EntityDamageEvent(ap.get(), EntityDamageEvent.DamageCause.LIGHTNING,
+ 10.0);
PlayerListener.finallyKillPlayer(arena, ap.get(), e);
}
}
@@ -74,7 +75,8 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
}
if (ap.getStatus() == ArenaPlayer.Status.FIGHT) {
ap.get().getWorld().strikeLightningEffect(ap.get().getLocation());
- final EntityDamageEvent e = new EntityDamageEvent(ap.get(), EntityDamageEvent.DamageCause.LIGHTNING, new EnumMap(ImmutableMap.of(EntityDamageEvent.DamageModifier.BASE, Double.valueOf((double) 10))), new EnumMap(ImmutableMap.of(EntityDamageEvent.DamageModifier.BASE, -0.0D)));
+ final EntityDamageEvent e = new EntityDamageEvent(ap.get(), EntityDamageEvent.DamageCause.LIGHTNING,
+ 10.0);
PlayerListener.finallyKillPlayer(arena, ap.get(), e);
}
}
@@ -87,7 +89,8 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
for (final ArenaPlayer ap : team.getTeamMembers()) {
if (ap.getStatus() == ArenaPlayer.Status.FIGHT) {
ap.get().getWorld().strikeLightningEffect(ap.get().getLocation());
- final EntityDamageEvent e = new EntityDamageEvent(ap.get(), EntityDamageEvent.DamageCause.LIGHTNING, new EnumMap(ImmutableMap.of(EntityDamageEvent.DamageModifier.BASE, Double.valueOf((double) 10))), new EnumMap(ImmutableMap.of(EntityDamageEvent.DamageModifier.BASE, -0.0D)));
+ final EntityDamageEvent e = new EntityDamageEvent(ap.get(), EntityDamageEvent.DamageCause.LIGHTNING,
+ 10.0);
PlayerListener.finallyKillPlayer(arena, ap.get(), e);
}
}
diff --git a/src/net/slipcor/pvparena/commands/PAA_Install.java b/src/net/slipcor/pvparena/commands/PAA_Install.java
deleted file mode 100644
index 3258ad348..000000000
--- a/src/net/slipcor/pvparena/commands/PAA_Install.java
+++ /dev/null
@@ -1,280 +0,0 @@
-package net.slipcor.pvparena.commands;
-
-import net.slipcor.pvparena.PVPArena;
-import net.slipcor.pvparena.arena.Arena;
-import net.slipcor.pvparena.core.Help;
-import net.slipcor.pvparena.core.Help.HELP;
-import net.slipcor.pvparena.core.Language;
-import net.slipcor.pvparena.core.Language.MSG;
-import net.slipcor.pvparena.loadables.ArenaGoal;
-import net.slipcor.pvparena.loadables.ArenaModule;
-import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.file.YamlConfiguration;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- *
- * PVP Arena INSTALL Command class
- *
- *
- * A command to install modules
- *
- * @author slipcor
- * @version v0.10.0
- */
-
-public class PAA_Install extends AbstractGlobalCommand {
-
- public PAA_Install() {
- super(new String[]{"pvparena.cmds.install"});
- }
-
- @Override
- public void commit(final CommandSender sender, final String[] args) {
- if (!hasPerms(sender)) {
- return;
- }
-
- if (!argCountValid(sender, args, new Integer[]{0, 1})) {
- return;
- }
-
- // pa install
- // pa install ctf
-
- if (!PVPArena.instance.getConfig().getBoolean("update.modules", true)) {
- Arena.pmsg(sender, ChatColor.DARK_RED+Language.parse(MSG.ERROR_MODULE_UPDATE));
- return;
- }
-
- final YamlConfiguration config = new YamlConfiguration();
- try {
- config.load(PVPArena.instance.getDataFolder().getPath()
- + "/install.yml");
- } catch (final Exception e) {
- e.printStackTrace();
- return;
- }
-
- if (args.length == 0) {
- listVersions(sender, config, null);
- return;
- }
-
- if (config.get(args[0]) != null) {
- listVersions(sender, config, args[0]);
- return;
- }
-
- Set list = (config == null || config.getConfigurationSection("goals") == null)?new HashSet():config.getConfigurationSection("goals").getKeys(false);
- if (list.contains(args[0].toLowerCase())) {
- for (final String key : list) {
- if (key.equalsIgnoreCase(args[0])) {
- if (download("pa_g_" + key + ".jar")) {
- PVPArena.instance.getAgm().reload();
- Arena.pmsg(sender,
- Language.parse(MSG.INSTALL_DONE, key));
- return;
- }
- Arena.pmsg(sender, Language.parse(MSG.ERROR_INSTALL, key));
- return;
- }
- }
- } else if (list.size() == 0) {
- if (download("pa_g_" + args[0].toLowerCase() + ".jar")) {
- PVPArena.instance.getAgm().reload();
- Arena.pmsg(sender,
- Language.parse(MSG.INSTALL_DONE, args[0].toLowerCase()));
- return;
- }
- Arena.pmsg(sender, Language.parse(MSG.ERROR_INSTALL, args[0].toLowerCase()));
- }
-
- list = (config == null || config.getConfigurationSection("mods") == null)?new HashSet():config.getConfigurationSection("mods").getKeys(false);
- if (list.contains(args[0].toLowerCase())) {
- for (final String key : list) {
- if (key.equalsIgnoreCase(args[0])) {
- if (download("pa_m_" + key + ".jar")) {
- PVPArena.instance.getAmm().reload();
- Arena.pmsg(sender,
- Language.parse(MSG.INSTALL_DONE, key));
- return;
- }
- Arena.pmsg(sender, Language.parse(MSG.ERROR_INSTALL, key));
- }
- }
- } else if (list.size() == 0) {
- if (download("pa_m_" + args[0].toLowerCase() + ".jar")) {
- PVPArena.instance.getAmm().reload();
- Arena.pmsg(sender,
- Language.parse(MSG.INSTALL_DONE, args[0].toLowerCase()));
- return;
- }
- Arena.pmsg(sender, Language.parse(MSG.ERROR_INSTALL, args[0].toLowerCase()));
- }
- }
-
- private void listVersions(final CommandSender sender, final YamlConfiguration cfg,
- final String sub) {
- Arena.pmsg(sender, "--- PVP Arena Version Update information ---");
- Arena.pmsg(sender, "[" + ChatColor.COLOR_CHAR + "7uninstalled" + ChatColor.COLOR_CHAR + "r | " + ChatColor.COLOR_CHAR + "einstalled" + ChatColor.COLOR_CHAR + "r]");
- Arena.pmsg(sender, "[" + ChatColor.COLOR_CHAR + "coutdated" + ChatColor.COLOR_CHAR + "r | " + ChatColor.COLOR_CHAR + "alatest version" + ChatColor.COLOR_CHAR + "r]");
- if (sub == null || "goals".equalsIgnoreCase(sub)) {
- Arena.pmsg(sender, ChatColor.COLOR_CHAR + "c--- Arena Goals ----> /goals");
- if (cfg.contains("goals")) {
- final Set entries = cfg.getConfigurationSection("goals").getKeys(
- false);
- for (final String key : entries) {
- final String latest = cfg.getString("goals." + key);
- final ArenaGoal goal = PVPArena.instance.getAgm().getGoalByName(key);
- final boolean installed = goal != null;
- String version = null;
- if (installed) {
- version = goal.version();
- }
- Arena.pmsg(sender, (installed ? ChatColor.COLOR_CHAR + "e" : ChatColor.COLOR_CHAR + "7")
- + key
- + ChatColor.COLOR_CHAR + "r - "
- + (installed ? latest.equals(version) ? ChatColor.COLOR_CHAR + "a" : ChatColor.COLOR_CHAR + "c"
- : "") + version + ChatColor.COLOR_CHAR + "f(" + latest + ')');
- }
- }
- }
- if (sub == null || "mods".equalsIgnoreCase(sub)) {
- Arena.pmsg(sender, ChatColor.COLOR_CHAR + "a--- Arena Mods ----> /mods");
- if (cfg.contains("mods")) {
- final Set entries = cfg.getConfigurationSection("mods").getKeys(
- false);
- for (final String key : entries) {
- final String latest = cfg.getString("mods." + key);
- final ArenaModule mod = PVPArena.instance.getAmm().getModByName(key);
- final boolean installed = mod != null;
- String version = null;
- if (installed) {
- version = mod.version();
- }
- Arena.pmsg(sender, (installed ? ChatColor.COLOR_CHAR + "e" : ChatColor.COLOR_CHAR + "7")
- + key
- + ChatColor.COLOR_CHAR + "r - "
- + (installed ? latest.equals(version) ? ChatColor.COLOR_CHAR + "a" : ChatColor.COLOR_CHAR + "c"
- : "") + version + ChatColor.COLOR_CHAR + "f(" + latest + ')');
- }
- }
- }
- }
- private boolean download(final String file) {
- return download(file, false);
- }
-
- private boolean download(final String file, final boolean silent) {
-
- final File source = new File(PVPArena.instance.getDataFolder().getPath()
- + "/files/" + file);
-
- if (!source.exists()) {
- if (!silent) {
- Arena.pmsg(
- Bukkit.getConsoleSender(),
- ChatColor.COLOR_CHAR + "cFile '" + ChatColor.COLOR_CHAR + 'r'
- + file
- + ChatColor.COLOR_CHAR + "c' not found. Please extract the file to /files before trying to install!");
- }
- return false;
- }
-
- String folder = null;
- if (file.startsWith("pa_g")) {
- folder = "/goals/";
- } else if (file.startsWith("pa_m")) {
- folder = "/mods/";
- }
- if (folder == null) {
- PVPArena.instance.getLogger()
- .severe("unable to save file: " + file);
- return false;
- }
- try {
- final File destination = new File(PVPArena.instance.getDataFolder()
- .getPath() + folder + '/' + file);
- final FileInputStream stream = new FileInputStream(source);
-
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- final byte[] buffer = new byte[8192];
- int bytesRead;
- while ((bytesRead = stream.read(buffer)) > 0) {
- baos.write(buffer, 0, bytesRead);
- }
-
- final FileOutputStream fos = new FileOutputStream(destination);
- fos.write(baos.toByteArray());
- fos.close();
-
- PVPArena.instance.getLogger().info("Installed module " + file);
- stream.close();
- return true;
- } catch (final Exception e) {
- e.printStackTrace();
- }
- return false;
- }
-
- @Override
- public String getName() {
- return getClass().getName();
- }
-
- @Override
- public void displayHelp(final CommandSender sender) {
- Arena.pmsg(sender, Help.parse(HELP.INSTALL));
- }
-
- @Override
- public List getMain() {
- return Collections.singletonList("install");
- }
-
- @Override
- public List getShort() {
- return Collections.singletonList("!i");
- }
-
- @Override
- public CommandTree getSubs(final Arena nothing) {
- final CommandTree result = new CommandTree<>(null);
- result.define(new String[]{"mods"});
- result.define(new String[]{"goals"});
- for (final String string : PVPArena.instance.getAgm().getAllGoalNames()) {
- result.define(new String[]{string});
- }
- final YamlConfiguration config = new YamlConfiguration();
- try {
- config.load(PVPArena.instance.getDataFolder().getPath()
- + "/install.yml");
- } catch (final Exception e) {
- e.printStackTrace();
- return result;
- }
-
- Set list = config.getConfigurationSection("goals").getKeys(false);
-
- for (final String key : list) {
- result.define(new String[]{key});
- }
-
- list = config.getConfigurationSection("mods").getKeys(false);
- for (final String key : list) {
- result.define(new String[]{key});
- }
- return result;
- }
-}
diff --git a/src/net/slipcor/pvparena/commands/PAA_Modules.java b/src/net/slipcor/pvparena/commands/PAA_Modules.java
new file mode 100644
index 000000000..f2b742a63
--- /dev/null
+++ b/src/net/slipcor/pvparena/commands/PAA_Modules.java
@@ -0,0 +1,291 @@
+package net.slipcor.pvparena.commands;
+
+import net.slipcor.pvparena.PVPArena;
+import net.slipcor.pvparena.arena.Arena;
+import net.slipcor.pvparena.core.Help;
+import net.slipcor.pvparena.core.Help.HELP;
+import net.slipcor.pvparena.core.Language;
+import net.slipcor.pvparena.core.Language.MSG;
+import net.slipcor.pvparena.loadables.ArenaModule;
+import net.slipcor.pvparena.ncloader.NCBLoadable;
+import net.slipcor.pvparena.updater.ModulesUpdater;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.FileConfiguration;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.*;
+
+/**
+ *
+ * PVP Arena MODULES Command class
+ *
+ *
+ * A command to manage modules (list, install, uninstall, update, download and upgrade)
+ *
+ * @author Eredrim
+ * @version v1.15
+ */
+
+public class PAA_Modules extends AbstractGlobalCommand {
+
+ public PAA_Modules() {
+ super(new String[]{"pvparena.cmds.modules"});
+ }
+
+ private static final File FILES_DIR = new File(PVPArena.instance.getDataFolder(),"/files/");
+ private static final File MODS_DIR = new File(PVPArena.instance.getDataFolder(),"/mods/");
+
+ @Override
+ public void commit(final CommandSender sender, final String[] args) {
+ if (!this.hasPerms(sender)) {
+ return;
+ }
+
+ if (!argCountValid(sender, args, new Integer[]{0, 1, 2})) {
+ return;
+ }
+
+ // pa modules
+ if (args.length == 0) {
+ listModules(sender);
+ } else if (args.length == 1) {
+ switch (args[0]) {
+ case "list":
+ listModules(sender);
+ break;
+ case "update":
+ updateModules(sender);
+ break;
+ case "download":
+ ModulesUpdater.downloadModulePack(sender);
+ break;
+ case "upgrade":
+ ModulesUpdater.downloadModulePack(sender);
+ updateModules(sender);
+ break;
+ case "install":
+ case "uninstall":
+ Arena.pmsg(sender, Language.parse(MSG.ERROR_INVALID_ARGUMENT_COUNT, "1", "2"));
+ break;
+ default:
+ // Show specific help
+ }
+ } else { // 2 args only (if more args, caught above)
+ if("install".equalsIgnoreCase(args[0])) {
+ installModule(sender, args[1]);
+ } else if ("uninstall".equalsIgnoreCase(args[0])) {
+ uninstallModule(sender, args[1]);
+ } else {
+ Arena.pmsg(sender, Language.parse(MSG.ERROR_INVALID_ARGUMENT_COUNT, "2", "1"));
+ }
+ }
+ }
+
+ /**
+ * List all modules status to sender
+ * @param sender User who typed the command
+ */
+ private static void listModules(final CommandSender sender) {
+ Arena.pmsg(sender, "--- PVP Arena Version Update information ---");
+ Arena.pmsg(sender, "[" + ChatColor.GRAY + "uninstalled" + ChatColor.RESET + " | " + ChatColor.YELLOW + "installed" + ChatColor.RESET + "]");
+ Arena.pmsg(sender, ChatColor.GREEN + "--- Installed Arena Mods ---->");
+
+ for (final String modName : getModInFilesFolder()) {
+ final ArenaModule mod = PVPArena.instance.getAmm().getModByName(modName);
+ Arena.pmsg(sender, (mod != null ? ChatColor.YELLOW : ChatColor.GRAY) + modName + ChatColor.RESET);
+ }
+ }
+
+ /**
+ * Install a module (copying from /files to /mods)
+ * @param sender User who typed the command
+ * @param name Module named typed by user
+ */
+ private static void installModule(CommandSender sender, String name) {
+ Set modList = getModInFilesFolder();
+ String modName = name.toLowerCase();
+ if (modList.size() != 0 && modList.contains(modName)) {
+
+ if (copyFile("pa_m_" + modName + ".jar")) {
+ PVPArena.instance.getAmm().reload();
+ Arena.pmsg(sender, Language.parse(MSG.INSTALL_DONE, modName));
+ } else {
+ Arena.pmsg(sender, Language.parse(MSG.ERROR_INSTALL, modName));
+ }
+ } else {
+ Arena.pmsg(sender, Language.parse(MSG.ERROR_UNKNOWN_MODULE, name));
+ }
+ }
+
+ /**
+ * Uninstall a module
+ * Unload it and remove it from /mods directory
+ * @param sender User who typed the command
+ * @param name Module named typed by user
+ */
+ private static void uninstallModule(CommandSender sender, String name) {
+ final ArenaModule mod = PVPArena.instance.getAmm().getModByName(name);
+ if (mod != null) {
+ String modName = mod.getName();
+ String jarName = "pa_m_" + modName.toLowerCase() + ".jar";
+ if (remove(jarName)) {
+ PVPArena.instance.getAmm().reload();
+ Arena.pmsg(sender, Language.parse(MSG.UNINSTALL_DONE, modName));
+ } else {
+ Arena.pmsg(sender, Language.parse(MSG.ERROR_UNINSTALL, modName));
+ FileConfiguration cfg = PVPArena.instance.getConfig();
+ List toDelete = cfg.getStringList("todelete");
+ toDelete.add(jarName);
+ cfg.set("todelete", toDelete);
+ PVPArena.instance.saveConfig();
+ Arena.pmsg(sender, Language.parse(MSG.ERROR_UNINSTALL2));
+ }
+ }
+ }
+
+ /**
+ * Replace all modules of /mods directory by ones of /files directory
+ * @param sender User who typed the command
+ */
+ private static void updateModules(CommandSender sender) {
+ final Set modules = new HashSet<>(PVPArena.instance.getAmm().getAllMods());
+
+ modules.stream()
+ .filter(mod -> !mod.isInternal())
+ .forEach(mod -> {
+ final File jarFile = new File(FILES_DIR, "pa_m_" + mod.getName().toLowerCase() + ".jar");
+
+ if (jarFile.exists()) {
+ uninstallModule(sender, mod.getName());
+ installModule(sender, mod.getName());
+ }
+ });
+ }
+
+ /**
+ * List all mods in /files folder
+ * @return List of mod names
+ */
+ private static Set getModInFilesFolder() {
+ Set modList = new HashSet<>();
+ for (final File file : FILES_DIR.listFiles()) {
+ final String fileName = file.getName();
+ if (fileName.startsWith("pa_m_") && fileName.endsWith(".jar")) {
+ String modName = fileName.substring(5, fileName.length() - 4);
+ modList.add(modName);
+ }
+ }
+ return modList;
+ }
+
+ /**
+ * Copy a file from /files folder to /mod folder
+ * @param file file name
+ * @return true if install was successful
+ */
+ private static boolean copyFile(final String file) {
+
+ final File source = new File(FILES_DIR, file);
+
+ if (!source.exists()) {
+ Arena.pmsg(
+ Bukkit.getConsoleSender(),
+ String.format("%sFile '%s%s%s' not found. Please extract the file to /files before trying to install!", ChatColor.RED, ChatColor.RESET, file, ChatColor.RED));
+ return false;
+ }
+
+ try {
+ final File destination = new File(MODS_DIR, file);
+ final FileInputStream stream = new FileInputStream(source);
+
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ final byte[] buffer = new byte[8192];
+ int bytesRead;
+ while ((bytesRead = stream.read(buffer)) > 0) {
+ baos.write(buffer, 0, bytesRead);
+ }
+
+ final FileOutputStream fos = new FileOutputStream(destination);
+ fos.write(baos.toByteArray());
+ fos.close();
+
+ PVPArena.instance.getLogger().info("Installed module " + file);
+ stream.close();
+ return true;
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ /**
+ * Remove a mod from /mods folder
+ * @param file module file name
+ * @return true if deletion was successful
+ */
+ public static boolean remove(final String file) {
+ if (!MODS_DIR.exists()) {
+ PVPArena.instance.getLogger().severe("unable to fetch file: " + file);
+ return false;
+ }
+
+ final File destFile = new File(MODS_DIR, file);
+
+ boolean exists = destFile.exists();
+ boolean deleted = false;
+ if (exists) {
+ deleted = destFile.delete();
+ if (!deleted) {
+ PVPArena.instance.getLogger().severe("could not delete file: " + file);
+ }
+ } else {
+ PVPArena.instance.getLogger().warning("file does not exist: " + file);
+ }
+
+ return exists && deleted;
+ }
+
+ @Override
+ public String getName() {
+ return this.getClass().getName();
+ }
+
+ @Override
+ public void displayHelp(final CommandSender sender) {
+ Arena.pmsg(sender, Help.parse(HELP.INSTALL));
+ }
+
+ @Override
+ public List getMain() {
+ return Collections.singletonList("modules");
+ }
+
+ @Override
+ public List getShort() {
+ return Collections.singletonList("!m");
+ }
+
+ @Override
+ public CommandTree getSubs(final Arena nothing) {
+ final CommandTree result = new CommandTree<>(null);
+
+ result.define(new String[]{"download"});
+ result.define(new String[]{"list"});
+ result.define(new String[]{"update"});
+ result.define(new String[]{"upgrade"});
+
+ getModInFilesFolder().forEach(modName -> result.define(new String[]{"install", modName}));
+
+ PVPArena.instance.getAmm().getAllMods().stream()
+ .filter(mod -> !mod.isInternal())
+ .map(ArenaModule::getName)
+ .forEach(modName -> result.define(new String[]{"uninstall", modName}));
+
+ return result;
+ }
+}
diff --git a/src/net/slipcor/pvparena/commands/PAA_PlayerClass.java b/src/net/slipcor/pvparena/commands/PAA_PlayerClass.java
index c57d1b44e..13439c8f3 100644
--- a/src/net/slipcor/pvparena/commands/PAA_PlayerClass.java
+++ b/src/net/slipcor/pvparena/commands/PAA_PlayerClass.java
@@ -7,15 +7,14 @@
import net.slipcor.pvparena.core.Help.HELP;
import net.slipcor.pvparena.core.Language;
import net.slipcor.pvparena.core.Language.MSG;
-import net.slipcor.pvparena.core.StringParser;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import static net.slipcor.pvparena.core.Utils.getSerializableItemStacks;
+
/**
*
* PVP Arena PLAYERCLASS Command class
@@ -66,40 +65,13 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
final Player player = (Player) sender;
if ("save".equalsIgnoreCase(args[0])) {
- final List items = new ArrayList<>();
-
- for (final ItemStack is : player.getInventory().getStorageContents()) {
- if (is != null) {
- items.add(is);
- }
- }
-
- final ItemStack[] isItems = new ItemStack[items.size()];
- int position = 0;
- for (final ItemStack is : items) {
- isItems[position++] = is;
- }
- final String sItems = isItems.length < 1 ? "AIR"
- : StringParser.getStringFromItemStacks(isItems);
- final StringBuilder armor = new StringBuilder("");
- int pos = 0;
- for (final ItemStack item : player.getInventory().getArmorContents()) {
- armor.append(',');
- armor.append(pos++);
- armor.append(">>!<<");
- armor.append(StringParser.getStringFromItemStack(item));
- }
- if (player.getInventory().getItemInOffHand() != null) {
- armor.append(',');
- armor.append(0);
- armor.append(">>O<<");
- armor.append(StringParser.getStringFromItemStack(player.getInventory().getItemInOffHand()));
- }
-
- arena.getArenaConfig().setManually("classitems." + className, sItems + armor);
+ arena.getArenaConfig().setManually("classitems." + className + ".items", getSerializableItemStacks(player.getInventory().getStorageContents()));
+ arena.getArenaConfig().setManually("classitems." + className + ".offhand", getSerializableItemStacks(player.getInventory().getItemInOffHand()));
+ arena.getArenaConfig().setManually("classitems." + className + ".armor", getSerializableItemStacks(player.getInventory().getArmorContents()));
arena.getArenaConfig().save();
- arena.addClass(className, isItems, player.getInventory().getItemInOffHand(), player.getInventory().getArmorContents());
+
+ arena.addClass(className, player.getInventory().getStorageContents(), player.getInventory().getItemInOffHand(), player.getInventory().getArmorContents());
Arena.pmsg(player, Language.parse(arena, MSG.CLASS_SAVED, className));
} else if ("remove".equalsIgnoreCase(args[0])) {
diff --git a/src/net/slipcor/pvparena/commands/PAA_Region.java b/src/net/slipcor/pvparena/commands/PAA_Region.java
index a0812ee69..376f3ebcf 100644
--- a/src/net/slipcor/pvparena/commands/PAA_Region.java
+++ b/src/net/slipcor/pvparena/commands/PAA_Region.java
@@ -64,6 +64,7 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
if (sender.getName().equals(selector)) {
arena.msg(sender, Language.parse(arena, MSG.ERROR_REGION_YOUSELECTEXIT));
selector = null;
+ activeSelections.remove(sender.getName());
} else {
arena.msg(sender, Language.parse(arena, MSG.ERROR_REGION_YOUSELECT, arena.getName()));
arena.msg(sender, Language.parse(arena, MSG.ERROR_REGION_YOUSELECT2));
@@ -88,12 +89,12 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
region.getShape().showBorder((Player) sender);
return;
}
- if (args.length == 2 && args[0].equalsIgnoreCase("remove")) {
- // usage: /pa {arenaname} region remove [regionname] | remove a region
- final ArenaRegion region = arena.getRegion(args[1]);
+ if (args.length == 2 && args[1].equalsIgnoreCase("remove")) {
+ // usage: /pa {arenaname} region [regionname] remove | remove a region
+ final ArenaRegion region = arena.getRegion(args[0]);
if (region == null) {
- arena.msg(sender, Language.parse(arena, MSG.ERROR_REGION_NOTFOUND, args[1]));
+ arena.msg(sender, Language.parse(arena, MSG.ERROR_REGION_NOTFOUND, args[0]));
return;
}
arena.getArenaConfig().setManually("arenaregion." + region.getRegionName(), null);
diff --git a/src/net/slipcor/pvparena/commands/PAA_ReloadAll.java b/src/net/slipcor/pvparena/commands/PAA_ReloadAll.java
new file mode 100644
index 000000000..3e751d230
--- /dev/null
+++ b/src/net/slipcor/pvparena/commands/PAA_ReloadAll.java
@@ -0,0 +1,96 @@
+package net.slipcor.pvparena.commands;
+
+import net.slipcor.pvparena.PVPArena;
+import net.slipcor.pvparena.arena.Arena;
+import net.slipcor.pvparena.core.Help;
+import net.slipcor.pvparena.core.Help.HELP;
+import net.slipcor.pvparena.core.Language;
+import net.slipcor.pvparena.managers.ArenaManager;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.FileConfiguration;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * PVP Arena DEBUG Command class
+ *
+ * A command to toggle debugging
+ *
+ * @author slipcor
+ * @version v0.10.0
+ */
+
+public class PAA_ReloadAll extends AbstractGlobalCommand {
+
+ public PAA_ReloadAll() {
+ super(new String[]{"pvparena.cmds.reload"});
+ }
+
+ @Override
+ public void commit(final CommandSender sender, final String[] args) {
+ if (!hasPerms(sender)) {
+ return;
+ }
+
+ if (!argCountValid(sender, args, new Integer[]{0, 1})) {
+ return;
+ }
+
+ final PAA_Reload scmd = new PAA_Reload();
+
+ PVPArena.instance.reloadConfig();
+
+ final FileConfiguration config = PVPArena.instance.getConfig();
+ Language.init(config.getString("language", "en"));
+ Help.init(config.getString("language", "en"));
+
+ if (args.length > 1 && args[1].equalsIgnoreCase("ymls")) {
+ Arena.pmsg(sender, Language.parse(Language.MSG.RELOAD_YMLS_DONE));
+ return;
+ }
+
+ final String[] emptyArray = new String[0];
+
+ for (Arena a : ArenaManager.getArenas()) {
+ scmd.commit(a, sender, emptyArray);
+ }
+
+ ArenaManager.load_arenas();
+ if (config.getBoolean("use_shortcuts") || config.getBoolean("only_shortcuts")) {
+ ArenaManager.readShortcuts(config.getConfigurationSection("shortcuts"));
+ }
+ }
+
+ @Override
+ public boolean hasVersionForArena() {
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return getClass().getName();
+ }
+
+ @Override
+ public void displayHelp(final CommandSender sender) {
+ Arena.pmsg(sender, Help.parse(HELP.DEBUG));
+ }
+
+ @Override
+ public List getMain() {
+ return Collections.singletonList("reload");
+ }
+
+ @Override
+ public List getShort() {
+ return Collections.singletonList("!rl");
+ }
+
+ @Override
+ public CommandTree getSubs(final Arena nothing) {
+ final CommandTree result = new CommandTree<>(null);
+ result.define(new String[]{"ymls"});
+ return result;
+ }
+}
diff --git a/src/net/slipcor/pvparena/commands/PAA_Set.java b/src/net/slipcor/pvparena/commands/PAA_Set.java
index c0d907df4..bf4fdd49d 100644
--- a/src/net/slipcor/pvparena/commands/PAA_Set.java
+++ b/src/net/slipcor/pvparena/commands/PAA_Set.java
@@ -6,7 +6,6 @@
import net.slipcor.pvparena.core.Help.HELP;
import net.slipcor.pvparena.core.Language;
import net.slipcor.pvparena.core.Language.MSG;
-import net.slipcor.pvparena.core.StringParser;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
@@ -18,6 +17,8 @@
import java.util.List;
import java.util.Map;
+import static net.slipcor.pvparena.core.Utils.getSerializableItemStacks;
+
/**
* PVP Arena SET Command class
*
@@ -152,22 +153,20 @@ private void set(final CommandSender player, final Arena arena, final String nod
Language.parse(arena, MSG.SET_DONE, node,
String.valueOf(dValue)));
} else if ("tp".equals(type)) {
- if (!"exit".equals(value) && !"old".equals(value)
- && !"spectator".equals(value)) {
+ if (!"exit".equals(value) && !"old".equals(value) && !"spectator".equals(value)) {
arena.msg(player, Language.parse(arena, MSG.ERROR_ARGUMENT_TYPE, value,
"tp (exit|old|spectator|...)"));
return;
}
- arena.getArenaConfig().setManually(node, String.valueOf(value));
+ arena.getArenaConfig().setManually(node, value);
arena.msg(
player,
- Language.parse(arena, MSG.SET_DONE, node,
- String.valueOf(value)));
+ Language.parse(arena, MSG.SET_DONE, node, value));
} else if ("material".equals(type)) {
if ("hand".equals(value)) {
if (player instanceof Player) {
- String itemDefinition = StringParser.getStringFromItemStack(((Player) player).getEquipment().getItemInMainHand());
+ String itemDefinition = ((Player) player).getEquipment().getItemInMainHand().getType().name();
arena.getArenaConfig().setManually(node, itemDefinition);
arena.msg(
player,
@@ -180,13 +179,10 @@ private void set(final CommandSender player, final Arena arena, final String nod
}
try {
- final Material mat = Material.valueOf(value);
+ final Material mat = Material.valueOf(value.toUpperCase());
if (mat != Material.AIR) {
arena.getArenaConfig().setManually(node, mat.name());
- arena.msg(
- player,
- Language.parse(arena, MSG.SET_DONE, node,
- String.valueOf(mat.name())));
+ arena.msg(player, Language.parse(arena, MSG.SET_DONE, node, mat.name()));
}
arena.getArenaConfig().save();
@@ -200,12 +196,12 @@ private void set(final CommandSender player, final Arena arena, final String nod
if ("hand".equals(value)) {
if (player instanceof Player) {
- String itemDefinition = StringParser.getStringFromItemStack(((Player) player).getEquipment().getItemInMainHand());
- arena.getArenaConfig().setManually(node, itemDefinition);
+ ItemStack item = ((Player) player).getInventory().getItemInMainHand();
+ arena.getArenaConfig().setManually(node, getSerializableItemStacks(item));
arena.msg(
player,
- Language.parse(arena, MSG.SET_DONE, node,
- itemDefinition));
+ Language.parse(arena, MSG.SET_DONE, node, item.getType().name()));
+ arena.getArenaConfig().save();
} else {
arena.msg(player, Language.parse(arena, MSG.ERROR_ONLY_PLAYERS));
}
@@ -214,36 +210,18 @@ private void set(final CommandSender player, final Arena arena, final String nod
if ("inventory".equals(value)) {
if (player instanceof Player) {
- final String newValue = StringParser.getStringFromItemStacks(((Player) player).getInventory().getContents());
- arena.getArenaConfig().setManually(node, newValue);
+ final ItemStack[] items = ((Player) player).getInventory().getContents();
+ arena.getArenaConfig().setManually(node, getSerializableItemStacks(items));
arena.msg(
player,
- Language.parse(arena, MSG.SET_DONE, node,
- newValue));
+ Language.parse(arena, MSG.SET_DONE, node, "inventory"));
arena.getArenaConfig().save();
} else {
arena.msg(player, Language.parse(arena, MSG.ERROR_ONLY_PLAYERS));
}
return;
}
-
- final String[] split = value.split(",");
- final ItemStack[] items = new ItemStack[split.length];
-
- for (int i = 0; i < split.length; i++) {
- items[i] = StringParser.getItemStackFromString(split[i]);
- if (items[i] == null) {
- arena.msg(player, Language.parse(arena, MSG.ERROR_ARGUMENT_TYPE, String.valueOf(items[i]),
- "item"));
- return;
- }
- }
-
- arena.getArenaConfig().setManually(node, String.valueOf(value));
- arena.msg(
- player,
- Language.parse(arena, MSG.SET_DONE, node,
- String.valueOf(value)));
+ arena.msg(player, Language.parse(arena, MSG.SET_ITEMS_NOT));
} else {
arena.msg(
player,
diff --git a/src/net/slipcor/pvparena/commands/PAA_Setup.java b/src/net/slipcor/pvparena/commands/PAA_Setup.java
index d51c22016..0f1b35d82 100644
--- a/src/net/slipcor/pvparena/commands/PAA_Setup.java
+++ b/src/net/slipcor/pvparena/commands/PAA_Setup.java
@@ -74,15 +74,15 @@ public void displayHelp(final CommandSender sender) {
public static void chat(final Player player, final String message) {
final Arena arena = activeSetups.get(player.getName());
- /**
- * help | ?
- *
- * show [region|spawn|block] | display a region/spawn/block with wool blocks",
- * region [region] move 2 up | move region [region] 2 blocks up",
- * region [region] expand 10 north | expand region [region] 10 block to the north",
- * region [region] expand 15 | expand region [region] 15 blocks in all directions",
- * all arguments can be abbreviated, e.g. 'r' = 'region', 'e' = 'expand', 'm' = 'move'",
- * done | exit setup mode",
+ /*
+ help | ?
+
+ show [region|spawn|block] | display a region/spawn/block with wool blocks",
+ region [region] move 2 up | move region [region] 2 blocks up",
+ region [region] expand 10 north | expand region [region] 10 block to the north",
+ region [region] expand 15 | expand region [region] 15 blocks in all directions",
+ all arguments can be abbreviated, e.g. 'r' = 'region', 'e' = 'expand', 'm' = 'move'",
+ done | exit setup mode",
*/
if (message.length() < 1) {
return;
@@ -107,7 +107,7 @@ class Remover implements Runnable {
@Override
public void run() {
- player.sendBlockChange(location, location.getBlock().getType(), location.getBlock().getData());
+ player.sendBlockChange(location, location.getBlock().getType().createBlockData());
}
}
@@ -122,7 +122,8 @@ public void run() {
final Set spawns = SpawnManager.getPASpawnsStartingWith(arena, word[2]);
for (final PASpawn spawn : spawns) {
final Location loc = spawn.getLocation().toLocation();
- player.sendBlockChange(loc, Material.WOOL, (byte) 0);
+
+ player.sendBlockChange(loc, Material.WHITE_WOOL.createBlockData());
new Remover(loc);
}
return;
@@ -131,17 +132,18 @@ public void run() {
final Set blocks = SpawnManager.getPABlocksContaining(arena, word[2]);
for (final PABlock block : blocks) {
final Location loc = block.getLocation().toLocation();
- player.sendBlockChange(loc, Material.WOOL, (byte) 0);
+
+ player.sendBlockChange(loc, Material.WHITE_WOOL.createBlockData());
new Remover(loc);
}
return;
}
}
} else if (word[0].startsWith("r")) {
- /**
- * region [region] move 2 up | move region [region] 2 blocks up",
- * region [region] expand 10 north | expand region [region] 10 block to the north",
- * region [region] expand 15 out | expand region [region] 15 blocks in all directions",
+ /*
+ region [region] move 2 up | move region [region] 2 blocks up",
+ region [region] expand 10 north | expand region [region] 10 block to the north",
+ region [region] expand 15 out | expand region [region] 15 blocks in all directions",
*/
if (word.length == 5) {
final ArenaRegion region = arena.getRegion(word[1]);
diff --git a/src/net/slipcor/pvparena/commands/PAA_Teams.java b/src/net/slipcor/pvparena/commands/PAA_Teams.java
index fd8ece169..627f1043a 100644
--- a/src/net/slipcor/pvparena/commands/PAA_Teams.java
+++ b/src/net/slipcor/pvparena/commands/PAA_Teams.java
@@ -8,9 +8,9 @@
import net.slipcor.pvparena.core.Language.MSG;
import net.slipcor.pvparena.core.StringParser;
import org.bukkit.ChatColor;
-import org.bukkit.DyeColor;
import org.bukkit.command.CommandSender;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -71,10 +71,10 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
} else if ("add".equals(args[0])) {
try {
- final DyeColor dColor = DyeColor.valueOf(args[2].toUpperCase());
- final ArenaTeam newTeam = new ArenaTeam(args[1], dColor.name());
+ final ChatColor color = ChatColor.valueOf(args[2].toUpperCase());
+ final ArenaTeam newTeam = new ArenaTeam(args[1], color.name());
arena.getTeams().add(newTeam);
- arena.getArenaConfig().setManually("teams." + newTeam.getName(), dColor.name());
+ arena.getArenaConfig().setManually("teams." + newTeam.getName(), color.name());
arena.getArenaConfig().save();
arena.msg(sender, Language.parse(arena, MSG.TEAMS_ADD, newTeam.getColoredName()));
@@ -128,7 +128,9 @@ public CommandTree getSubs(final Arena arena) {
}
for (final String team : arena.getTeamNames()) {
result.define(new String[]{"remove", team});
- result.define(new String[]{"set", team});
+ Arrays.stream(ChatColor.values()).forEach(color ->
+ result.define(new String[]{"set", team, color.name()})
+ );
}
return result;
}
diff --git a/src/net/slipcor/pvparena/commands/PAA_Uninstall.java b/src/net/slipcor/pvparena/commands/PAA_Uninstall.java
deleted file mode 100644
index d437cc362..000000000
--- a/src/net/slipcor/pvparena/commands/PAA_Uninstall.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package net.slipcor.pvparena.commands;
-
-import net.slipcor.pvparena.PVPArena;
-import net.slipcor.pvparena.arena.Arena;
-import net.slipcor.pvparena.core.Help;
-import net.slipcor.pvparena.core.Help.HELP;
-import net.slipcor.pvparena.core.Language;
-import net.slipcor.pvparena.core.Language.MSG;
-import net.slipcor.pvparena.loadables.ArenaGoal;
-import net.slipcor.pvparena.loadables.ArenaModule;
-import org.bukkit.ChatColor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * PVP Arena UNINSTALL Command class
- *
- * A command to uninstall modules
- *
- * @author slipcor
- * @version v0.10.0
- */
-
-public class PAA_Uninstall extends AbstractGlobalCommand {
-
- public PAA_Uninstall() {
- super(new String[]{"pvparena.cmds.uninstall"});
- }
-
- @Override
- public void commit(final CommandSender sender, final String[] args) {
- if (!hasPerms(sender)) {
- return;
- }
-
- if (!argCountValid(sender, args,
- new Integer[]{0, 1})) {
- return;
- }
-
- if (!PVPArena.instance.getConfig().getBoolean("update.modules", true)) {
- Arena.pmsg(sender, ChatColor.DARK_RED+Language.parse(MSG.ERROR_MODULE_UPDATE));
- return;
- }
-
- // pa install
- // pa install ctf
-
- final YamlConfiguration config = new YamlConfiguration();
- try {
- config.load(PVPArena.instance.getDataFolder().getPath() + "/install.yml");
- } catch (final Exception e) {
- }
-
- if (args.length == 0) {
- listVersions(sender, config, null);
- return;
- }
-
- if (config.get(args[0]) != null) {
- listVersions(sender, config, args[1]);
- return;
- }
-
- final String name = args[0].toLowerCase();
- final ArenaGoal goal = PVPArena.instance.getAgm().getGoalByName(name);
- if (goal != null) {
- if (remove("pa_g_" + goal.getName().toLowerCase() + ".jar")) {
- PVPArena.instance.getAgm().reload();
- Arena.pmsg(sender, Language.parse(MSG.UNINSTALL_DONE, goal.getName()));
- return;
- }
- Arena.pmsg(sender, Language.parse(MSG.ERROR_UNINSTALL, goal.getName()));
- FileConfiguration cfg = PVPArena.instance.getConfig();
- List toDelete = cfg.getStringList("todelete");
- if (toDelete == null){
- toDelete = new ArrayList<>();
- }
- toDelete.add("pa_g_" + goal.getName().toLowerCase() + ".jar");
- cfg.set("todelete", toDelete);
- PVPArena.instance.saveConfig();
- Arena.pmsg(sender, Language.parse(MSG.ERROR_UNINSTALL2));
- return;
- }
- final ArenaModule mod = PVPArena.instance.getAmm().getModByName(name);
- if (mod != null) {
- if (remove("pa_m_" + mod.getName().toLowerCase() + ".jar")) {
- PVPArena.instance.getAmm().reload();
- Arena.pmsg(sender, Language.parse(MSG.UNINSTALL_DONE, mod.getName()));
- return;
- }
- Arena.pmsg(sender, Language.parse(MSG.ERROR_UNINSTALL, mod.getName()));
- FileConfiguration cfg = PVPArena.instance.getConfig();
- List toDelete = cfg.getStringList("todelete");
- if (toDelete == null){
- toDelete = new ArrayList<>();
- }
- toDelete.add("pa_m_" + mod.getName().toLowerCase() + ".jar");
- cfg.set("todelete", toDelete);
- PVPArena.instance.saveConfig();
- Arena.pmsg(sender, Language.parse(MSG.ERROR_UNINSTALL2));
- }
- }
-
- private void listVersions(final CommandSender sender, final YamlConfiguration cfg,
- final String sub) {
- Arena.pmsg(sender, "--- PVP Arena Version Update information ---");
- Arena.pmsg(sender, "[" + ChatColor.COLOR_CHAR + "7uninstalled" + ChatColor.COLOR_CHAR + "r | " + ChatColor.COLOR_CHAR + "einstalled" + ChatColor.COLOR_CHAR + "r]");
- Arena.pmsg(sender, "[" + ChatColor.COLOR_CHAR + "coutdated" + ChatColor.COLOR_CHAR + "r | " + ChatColor.COLOR_CHAR + "alatest version" + ChatColor.COLOR_CHAR + "r]");
- if (sub == null || "arenas".equalsIgnoreCase(sub)) {
- Arena.pmsg(sender, ChatColor.COLOR_CHAR + "c--- Arena Goals ----> /goals");
- final Set entries = cfg.getConfigurationSection("goals").getKeys(
- false);
- for (final String key : entries) {
- final String value = cfg.getString("goals." + key);
- final ArenaGoal goal = PVPArena.instance.getAgm().getGoalByName(key);
- final boolean installed = goal != null;
- String version = null;
- if (installed) {
- version = goal.version();
- }
- Arena.pmsg(sender, (installed ? ChatColor.COLOR_CHAR + "e" : ChatColor.COLOR_CHAR + "7")
- + key
- + ChatColor.COLOR_CHAR + "r - "
- + (installed ? value.equals(version) ? ChatColor.COLOR_CHAR + "a" : ChatColor.COLOR_CHAR + "c"
- : "") + value);
- }
- }
- if (sub == null || "mods".equalsIgnoreCase(sub)) {
- Arena.pmsg(sender, ChatColor.COLOR_CHAR + "a--- Arena Mods ----> /mods");
- final Set entries = cfg.getConfigurationSection("mods").getKeys(
- false);
- for (final String key : entries) {
- final String value = cfg.getString("mods." + key);
- final ArenaModule mod = PVPArena.instance.getAmm().getModByName(key);
- final boolean installed = mod != null;
- String version = null;
- if (installed) {
- version = mod.version();
- }
- Arena.pmsg(sender, (installed ? ChatColor.COLOR_CHAR + "e" : ChatColor.COLOR_CHAR + "7")
- + key
- + ChatColor.COLOR_CHAR + "r - "
- + (installed ? value.equals(version) ? ChatColor.COLOR_CHAR + "a" : ChatColor.COLOR_CHAR + "c"
- : "") + value);
- }
-
- }
- }
-
- @Override
- public String getName() {
- return getClass().getName();
- }
-
- public static boolean remove(final String file) {
- String folder = null;
- if (file.startsWith("pa_g")) {
- folder = "/goals/";
- } else if (file.startsWith("pa_m")) {
- folder = "/mods/";
- }
- if (folder == null) {
- PVPArena.instance.getLogger().severe("unable to fetch file: " + file);
- return false;
- }
- final File destination = new File(PVPArena.instance.getDataFolder().getPath()
- + folder);
-
- final File destFile = new File(destination, file);
-
- boolean exists = destFile.exists();
- boolean deleted = false;
- if (exists) {
- deleted = destFile.delete();
- if (!deleted) {
- PVPArena.instance.getLogger().severe("could not delete file: " + file);
- }
- } else {
- PVPArena.instance.getLogger().warning("file does not exist: " + file);
- }
-
- return exists && deleted;
- }
-
- @Override
- public void displayHelp(final CommandSender sender) {
- Arena.pmsg(sender, Help.parse(HELP.UNINSTALL));
- }
-
- @Override
- public List getMain() {
- return Collections.singletonList("uninstall");
- }
-
- @Override
- public List getShort() {
- return Collections.singletonList("!ui");
- }
-
- @Override
- public CommandTree getSubs(final Arena nothing) {
- final CommandTree result = new CommandTree<>(null);
- for (final String string : PVPArena.instance.getAgm().getAllGoalNames()) {
- result.define(new String[]{string});
- }
- for (final ArenaModule mod : PVPArena.instance.getAmm().getAllMods()) {
- result.define(new String[]{mod.getName()});
- }
- return result;
- }
-}
diff --git a/src/net/slipcor/pvparena/commands/PAA_Update.java b/src/net/slipcor/pvparena/commands/PAA_Update.java
deleted file mode 100644
index 89aecadf1..000000000
--- a/src/net/slipcor/pvparena/commands/PAA_Update.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package net.slipcor.pvparena.commands;
-
-import net.slipcor.pvparena.PVPArena;
-import net.slipcor.pvparena.arena.Arena;
-import net.slipcor.pvparena.core.Help;
-import net.slipcor.pvparena.core.Help.HELP;
-import net.slipcor.pvparena.core.Language;
-import net.slipcor.pvparena.loadables.ArenaModule;
-import net.slipcor.pvparena.ncloader.NCBLoadable;
-import org.bukkit.ChatColor;
-import org.bukkit.command.CommandSender;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * PVP Arena UPDATE Command class
- *
- * A command to update modules
- *
- * @author slipcor
- * @version v0.10.0
- */
-
-public class PAA_Update extends AbstractGlobalCommand {
-
- public PAA_Update() {
- super(new String[]{"pvparena.cmds.update"});
- }
-
- @Override
- public void commit(final CommandSender sender, final String[] args) {
- if (!PVPArena.instance.getConfig().getBoolean("update.modules", true)) {
- Arena.pmsg(sender, ChatColor.DARK_RED+ Language.parse(Language.MSG.ERROR_MODULE_UPDATE));
- return;
- }
- if (!hasPerms(sender)) {
- return;
- }
-
- final Set modules = new HashSet<>();
-
- if (args.length < 1 || "mods".equals(args[0])) {
- modules.addAll(PVPArena.instance.getAmm().getAllMods());
- } else if (args.length < 1 || "goals".equals(args[0])) {
- modules.addAll(PVPArena.instance.getAgm().getAllGoals());
- } else if (args.length < 1 || "regionshapes".equals(args[0])) {
- modules.addAll(PVPArena.instance.getArsm().getRegions());
- }
-
- if (!modules.isEmpty()) {
- for (final NCBLoadable mod : modules) {
- if (mod.isInternal()) {
- continue;
- }
-
- final File destination = new File(PVPArena.instance.getDataFolder().getPath()
- + "/files/");
- final File destFileG = new File(destination, "pa_g_" + mod.getName().toLowerCase() + ".jar");
- final File destFileM = new File(destination, "pa_m_" + mod.getName().toLowerCase() + ".jar");
-
- if (!destFileG.exists() && !destFileM.exists()) {
- continue;
- }
-
- final PAA_Uninstall uninstall = new PAA_Uninstall();
- if (!uninstall.hasPerms(sender)) {
- return;
- }
- uninstall.commit(sender, new String[]{mod.getName()});
- final PAA_Install install = new PAA_Install();
- if (!install.hasPerms(sender)) {
- return;
- }
- install.commit(sender, new String[]{mod.getName()});
- }
- return;
- }
-
- final PAA_Uninstall uninstall = new PAA_Uninstall();
- uninstall.commit(sender, args);
- final PAA_Install install = new PAA_Install();
- install.commit(sender, args);
- }
-
-
- @Override
- public String getName() {
- return getClass().getName();
- }
-
- @Override
- public void displayHelp(final CommandSender sender) {
- Arena.pmsg(sender, Help.parse(HELP.UPDATE));
- }
-
- @Override
- public List getMain() {
- return Collections.singletonList("update");
- }
-
- @Override
- public List getShort() {
- return Collections.singletonList("!u");
- }
-
- @Override
- public CommandTree getSubs(final Arena nothing) {
- final CommandTree result = new CommandTree<>(null);
- result.define(new String[]{"mods"});
- result.define(new String[]{"goals"});
- for (final String string : PVPArena.instance.getAgm().getAllGoalNames()) {
- result.define(new String[]{string});
- }
- for (final ArenaModule mod : PVPArena.instance.getAmm().getAllMods()) {
- result.define(new String[]{mod.getName()});
- }
- return result;
- }
-}
diff --git a/src/net/slipcor/pvparena/commands/PAG_Arenaclass.java b/src/net/slipcor/pvparena/commands/PAG_Arenaclass.java
index 6b5a0e5d9..429ff74db 100644
--- a/src/net/slipcor/pvparena/commands/PAG_Arenaclass.java
+++ b/src/net/slipcor/pvparena/commands/PAG_Arenaclass.java
@@ -22,6 +22,10 @@
import java.util.Set;
import java.util.TreeSet;
+import static java.util.Arrays.asList;
+import static net.slipcor.pvparena.arena.ArenaPlayer.Status.FIGHT;
+import static net.slipcor.pvparena.arena.ArenaPlayer.Status.LOUNGE;
+
/**
* PVP Arena JOIN Command class
*
@@ -38,7 +42,7 @@ public PAG_Arenaclass() {
@Override
public void commit(final Arena arena, final CommandSender sender, final String[] args) {
- if (!hasPerms(sender, arena) || !arena.getArenaConfig().getBoolean(CFG.USES_INGAMECLASSSWITCH)) {
+ if (!hasPerms(sender, arena)) {
return;
}
@@ -46,10 +50,25 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
return;
}
- if (args.length < 1) {
+ if (!(sender instanceof Player)) {
+ Arena.pmsg(sender, Language.parse(arena, MSG.ERROR_ONLY_PLAYERS));
+ return;
+ }
+
+ final ArenaPlayer aPlayer = ArenaPlayer.parsePlayer(sender.getName());
+
+ ArenaPlayer.Status pStatus = aPlayer.getStatus();
+
+ // Player can change arena class only in lounge or in fight with ingameClassSwith parameter set to true
+ if(!arena.equals(aPlayer.getArena()) || !asList(LOUNGE, FIGHT).contains(pStatus) ||
+ (pStatus == FIGHT && !arena.getArenaConfig().getBoolean(CFG.USES_INGAMECLASSSWITCH))) {
+ return;
+ }
+
+ if (args.length < 1 || "custom".equalsIgnoreCase(args[0])) {
Set classes = new TreeSet<>();
for (ArenaClass ac : arena.getClasses()) {
- if (ac.getName().equals("custom")) {
+ if ("custom".equalsIgnoreCase(ac.getName())) {
continue;
}
classes.add(ChatColor.GREEN + ac.getName() + ChatColor.WHITE);
@@ -58,13 +77,6 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
return;
}
- if (!(sender instanceof Player)) {
- Arena.pmsg(sender, Language.parse(arena, MSG.ERROR_ONLY_PLAYERS));
- return;
- }
-
- final ArenaPlayer aPlayer = ArenaPlayer.parsePlayer(sender.getName());
-
final ArenaClass aClass = arena.getClass(args[0]);
if (aClass == null) {
@@ -151,12 +163,13 @@ public List getShort() {
@Override
public CommandTree getSubs(final Arena arena) {
final CommandTree result = new CommandTree<>(null);
- if (arena == null) {
- return result;
- }
- for (final ArenaClass aClass : arena.getClasses()) {
- result.define(new String[]{aClass.getName()});
+
+ if (arena != null) {
+ arena.getClasses().stream()
+ .filter(aClass -> !"custom".equalsIgnoreCase(aClass.getName()))
+ .forEach(aClass -> result.define(new String[]{aClass.getName()}));
}
+
return result;
}
}
diff --git a/src/net/slipcor/pvparena/commands/PAG_Join.java b/src/net/slipcor/pvparena/commands/PAG_Join.java
index 8b495367b..94f1c61dc 100644
--- a/src/net/slipcor/pvparena/commands/PAG_Join.java
+++ b/src/net/slipcor/pvparena/commands/PAG_Join.java
@@ -86,9 +86,7 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
arena.getDebugger().i("Join_2", sender);
arena.msg(sender, Language.parse(arena, MSG.ERROR_ARENA_ALREADY_PART_OF, ArenaManager.getIndirectArenaName(arena)));
} else {
- if (PACheck.handleJoin(arena, sender, args)) {
- arena.setupScoreboard(aPlayer.get());
- }
+ PACheck.handleJoin(arena, sender, args);
}
} else {
final Arena pArena = aPlayer.getArena();
diff --git a/src/net/slipcor/pvparena/commands/PAG_Leave.java b/src/net/slipcor/pvparena/commands/PAG_Leave.java
index da8e053b5..501eb4ff7 100644
--- a/src/net/slipcor/pvparena/commands/PAG_Leave.java
+++ b/src/net/slipcor/pvparena/commands/PAG_Leave.java
@@ -7,6 +7,7 @@
import net.slipcor.pvparena.core.Help.HELP;
import net.slipcor.pvparena.core.Language;
import net.slipcor.pvparena.core.Language.MSG;
+import net.slipcor.pvparena.loadables.ArenaModule;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -45,9 +46,19 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
final ArenaPlayer aPlayer = ArenaPlayer.parsePlayer(sender.getName());
- if (!arena.hasPlayer(aPlayer.get())) {
+ // Handle modules which need to leave even if players aren't in an arena
+ for (final ArenaModule mod : arena.getMods()) {
+ if(mod.handleSpecialLeave(aPlayer)) {
+ return;
+ }
+ }
- arena.msg(sender, Language.parse(arena, MSG.ERROR_NOT_IN_ARENA));
+ if (!arena.hasPlayer(aPlayer.get())) {
+ if(PAA_Edit.activeEdits.containsKey(sender.getName())) {
+ new PAA_Edit().commit(arena, sender, args);
+ } else {
+ arena.msg(sender, Language.parse(arena, MSG.ERROR_NOT_IN_ARENA));
+ }
return;
}
arena.callLeaveEvent(aPlayer.get());
diff --git a/src/net/slipcor/pvparena/commands/PAG_Spectate.java b/src/net/slipcor/pvparena/commands/PAG_Spectate.java
index 40082880a..a46415d67 100644
--- a/src/net/slipcor/pvparena/commands/PAG_Spectate.java
+++ b/src/net/slipcor/pvparena/commands/PAG_Spectate.java
@@ -49,9 +49,7 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
return;
}
- if (PACheck.handleSpectate(arena, sender)) {
- arena.setupScoreboard((Player) sender);
- }
+ PACheck.handleSpectate(arena, sender);
}
@Override
diff --git a/src/net/slipcor/pvparena/commands/PAI_ArenaList.java b/src/net/slipcor/pvparena/commands/PAI_ArenaList.java
index 2655405ac..fcdd5b628 100644
--- a/src/net/slipcor/pvparena/commands/PAI_ArenaList.java
+++ b/src/net/slipcor/pvparena/commands/PAI_ArenaList.java
@@ -52,6 +52,11 @@ public void commit(final CommandSender sender, final String[] args) {
Arena.pmsg(sender, Language.parse(MSG.ARENA_LIST, StringParser.joinList(names, ", ")));
}
+ @Override
+ public boolean hasVersionForArena() {
+ return true;
+ }
+
@Override
public String getName() {
return getClass().getName();
diff --git a/src/net/slipcor/pvparena/commands/PAI_GlobalStats.java b/src/net/slipcor/pvparena/commands/PAI_GlobalStats.java
new file mode 100644
index 000000000..f42826180
--- /dev/null
+++ b/src/net/slipcor/pvparena/commands/PAI_GlobalStats.java
@@ -0,0 +1,73 @@
+package net.slipcor.pvparena.commands;
+
+import net.slipcor.pvparena.arena.Arena;
+import net.slipcor.pvparena.core.Help;
+import net.slipcor.pvparena.core.Help.HELP;
+import net.slipcor.pvparena.managers.StatisticsManager.Type;
+import org.bukkit.command.CommandSender;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * PVP Arena STATS Command class
+ *
+ * A command to display the player statistics
+ *
+ * @author slipcor
+ * @version v0.10.0
+ */
+
+public class PAI_GlobalStats extends AbstractGlobalCommand {
+
+ public PAI_GlobalStats() {
+ super(new String[]{"pvparena.user", "pvparena.cmds.stats"});
+ }
+
+ @Override
+ public void commit(final CommandSender sender, final String[] args) {
+ if (!hasPerms(sender)) {
+ return;
+ }
+
+ if (!argCountValid(sender, args, new Integer[]{1})) {
+ return;
+ }
+
+ new PAI_Stats().commit(null, sender, args);
+ }
+
+ @Override
+ public boolean hasVersionForArena() {
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return getClass().getName();
+ }
+
+ @Override
+ public void displayHelp(final CommandSender sender) {
+ Arena.pmsg(sender, Help.parse(HELP.STATS));
+ }
+
+ @Override
+ public List getMain() {
+ return Collections.singletonList("stats");
+ }
+
+ @Override
+ public List getShort() {
+ return Collections.singletonList("-s");
+ }
+
+ @Override
+ public CommandTree getSubs(final Arena arena) {
+ final CommandTree result = new CommandTree<>(null);
+ for (final Type val : Type.values()) {
+ result.define(new String[]{val.name()});
+ }
+ return result;
+ }
+}
diff --git a/src/net/slipcor/pvparena/commands/PAI_Info.java b/src/net/slipcor/pvparena/commands/PAI_Info.java
index 4ea4e2fae..42ce9da7b 100644
--- a/src/net/slipcor/pvparena/commands/PAI_Info.java
+++ b/src/net/slipcor/pvparena/commands/PAI_Info.java
@@ -123,7 +123,7 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
arena.msg(sender, "minplayers: " +
arena.getArenaConfig().getInt(CFG.ITEMS_MINPLAYERS) + " | " +
"rewards: " +
- arena.getArenaConfig().getString(CFG.ITEMS_REWARDS) + " | " +
+ StringParser.getItems(arena.getArenaConfig().getItems(CFG.ITEMS_REWARDS)) + " | " +
StringParser.colorVar("random",
arena.getArenaConfig().getBoolean(CFG.ITEMS_RANDOM)));
diff --git a/src/net/slipcor/pvparena/commands/PAI_Stats.java b/src/net/slipcor/pvparena/commands/PAI_Stats.java
index f2e1eab77..862e25942 100644
--- a/src/net/slipcor/pvparena/commands/PAI_Stats.java
+++ b/src/net/slipcor/pvparena/commands/PAI_Stats.java
@@ -7,11 +7,13 @@
import net.slipcor.pvparena.core.Language.MSG;
import net.slipcor.pvparena.core.StringParser;
import net.slipcor.pvparena.managers.StatisticsManager;
-import net.slipcor.pvparena.managers.StatisticsManager.type;
+import net.slipcor.pvparena.managers.StatisticsManager.Type;
import org.bukkit.command.CommandSender;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
+import java.util.Map;
/**
* PVP Arena STATS Command class
@@ -38,23 +40,21 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
return;
}
- final type statType = type.getByString(args[0]);
+ final Type statType = Type.getByString(args[0]);
if (statType == null) {
- Arena.pmsg(sender, Language.parse(arena, MSG.STATS_TYPENOTFOUND, StringParser.joinArray(type.values(), ", ").replace("NULL, ", "")));
+ Arena.pmsg(sender, Language.parse(arena, MSG.STATS_TYPENOTFOUND, StringParser.joinArray(Type.values(), ", ").replace("NULL, ", "")));
return;
}
- final String[] values = StatisticsManager.read(StatisticsManager.getStats(arena, statType), statType, arena == null);
- final String[] names = StatisticsManager.read(StatisticsManager.getStats(arena, statType), type.NULL, arena == null);
+ Map playersStats = StatisticsManager.getStats(arena, statType);
int max = 10;
if (args.length > 1) {
try {
max = Integer.parseInt(args[1]);
- } catch (final Exception e) {
- max = 10;
+ } catch (NumberFormatException ignored) {
}
}
@@ -65,9 +65,10 @@ public void commit(final Arena arena, final CommandSender sender, final String[]
Arena.pmsg(sender, s1);
- for (int i = 0; i < max && i < names.length && i < values.length; i++) {
- Arena.pmsg(sender, names[i] + ": " + values[i]);
- }
+ playersStats.entrySet().stream()
+ .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
+ .limit(max)
+ .forEach(stat -> Arena.pmsg(sender, stat.getKey() + " : " + stat.getValue()));
}
@Override
@@ -93,7 +94,7 @@ public List getShort() {
@Override
public CommandTree getSubs(final Arena arena) {
final CommandTree result = new CommandTree<>(null);
- for (final type val : type.values()) {
+ for (final Type val : Type.values()) {
result.define(new String[]{val.name()});
}
return result;
diff --git a/src/net/slipcor/pvparena/core/ColorUtils.java b/src/net/slipcor/pvparena/core/ColorUtils.java
new file mode 100644
index 000000000..abe8b17c1
--- /dev/null
+++ b/src/net/slipcor/pvparena/core/ColorUtils.java
@@ -0,0 +1,148 @@
+package net.slipcor.pvparena.core;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.DyeColor;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.block.data.Directional;
+import org.bukkit.block.data.Rotatable;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public final class ColorUtils {
+
+ private static final Debug DEBUG = new Debug(18);
+
+ private ColorUtils() {
+ }
+
+ public static Material getWoolMaterialFromDyeColor(final String color) {
+ return getColoredMaterial(DyeColor.valueOf(color), Material.WHITE_WOOL);
+ }
+
+ public static Material getWoolMaterialFromChatColor(final ChatColor color) {
+ return getColoredMaterialFromChatColor(color, Material.WHITE_WOOL);
+ }
+
+ /**
+ * Get a colored Material from a chat color and any colorable material
+ * @param color Color from chat
+ * @param material Colorable material like Wool, Concrete or Stained glass
+ * @return
+ */
+ public static Material getColoredMaterialFromChatColor(final ChatColor color, final Material material) {
+ /*
+ Unsupported:
+ ChatColor.AQUA
+ Material.BROWN_WOOL
+ */
+
+ DyeColor dyeColor = getDyeColorFromChatColor(color);
+ return getColoredMaterial(dyeColor, material);
+ }
+
+ public static DyeColor getDyeColorFromChatColor(ChatColor color) {
+ try {
+ return DyeColor.valueOf(parseDyeColorToChatColor(color.name(), false));
+ } catch (IllegalArgumentException e) {
+ DEBUG.i("ChatColor " + color.name() + " can't be cast to DyeColor => set BROWN");
+ return DyeColor.BROWN;
+ }
+ }
+
+ public static ChatColor getChatColorFromDyeColor(final String color) {
+ return ChatColor.valueOf(parseDyeColorToChatColor(color, true));
+ }
+
+ private static String parseDyeColorToChatColor(final String color, final boolean forward) {
+ /*
+ following colors are the sames (ignore): WHITE, YELLOW, BLACK
+ colors not being able to parse: chat-AQUA, wool-brown
+ */
+
+ final List wool = Arrays.asList("ORANGE", "MAGENTA", "LIGHT_BLUE", "LIME", "PINK", "GRAY", "LIGHT_GRAY",
+ "PURPLE", "BLUE", "GREEN", "RED", "CYAN");
+ final List chat = Arrays.asList("GOLD", "LIGHT_PURPLE", "BLUE", "GREEN", "RED", "DARK_GRAY", "GRAY",
+ "DARK_PURPLE", "DARK_BLUE", "DARK_GREEN", "DARK_RED", "DARK_AQUA");
+
+ if (forward) {
+ if (wool.contains(color)) {
+ return chat.get(wool.indexOf(color));
+ }
+ } else {
+ if (chat.contains(color)) {
+ return wool.get(chat.indexOf(color));
+ }
+ }
+ return color;
+ }
+
+ /**
+ * Check if a material can be colored
+ * @param type Material to check
+ * @return true if material can be colored
+ */
+ public static boolean isColorableMaterial(Material type) {
+ return getColorableSuffixes().contains(getMaterialSuffix(type));
+ }
+
+ /**
+ * Get a colored material applying dye color on a material
+ * @param dyeColor DyeColor to get color
+ * @param typeMaterial Material used to get type
+ * @return colored material
+ */
+ public static Material getColoredMaterial(DyeColor dyeColor, Material typeMaterial) {
+ String color = dyeColor.name();
+ String materialSuffix = getMaterialSuffix(typeMaterial);
+ return Material.valueOf(color + "_" + materialSuffix);
+ }
+
+ public static boolean isSubType(Material type, Material check) {
+ return (type == check) || (isColorableMaterial(type) && getMaterialSuffix(type).equals(getMaterialSuffix(check)));
+ }
+
+ private static String getMaterialSuffix(Material material) {
+ return getColorableSuffixes().stream()
+ .filter(suffix -> material.name().endsWith(suffix))
+ .findFirst()
+ .orElse("");
+ }
+
+ /**
+ * Get the list of all colorable blocks
+ */
+ private static List getColorableSuffixes() {
+ return Stream.of(Material.values())
+ .filter(m -> m.name().startsWith("MAGENTA_"))
+ .filter(Material::isBlock)
+ .map(m -> m.name().split("MAGENTA_", 2)[1])
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * Change flag color keeping rotation and facing
+ * @param flagBlock Block (location) of the flag
+ * @param flagColor New flag color
+ */
+ public static void setNewFlagColor(Block flagBlock, ChatColor flagColor) {
+ final BlockData originalBlockData = flagBlock.getBlockData().clone();
+ Material newMaterial = ColorUtils.getColoredMaterialFromChatColor(flagColor, flagBlock.getType());
+ BlockData newData = Bukkit.getServer().createBlockData(newMaterial);
+
+ if(originalBlockData instanceof Directional) {
+ ((Directional) newData).setFacing(((Directional) originalBlockData).getFacing());
+ }
+
+ if(originalBlockData instanceof Rotatable) {
+ ((Rotatable) newData).setRotation(((Rotatable) originalBlockData).getRotation());
+ }
+
+ flagBlock.setBlockData(newData);
+ }
+}
diff --git a/src/net/slipcor/pvparena/core/Config.java b/src/net/slipcor/pvparena/core/Config.java
index 051e3f4f8..a6af40978 100644
--- a/src/net/slipcor/pvparena/core/Config.java
+++ b/src/net/slipcor/pvparena/core/Config.java
@@ -20,6 +20,9 @@
import java.io.File;
import java.util.*;
+import static net.slipcor.pvparena.core.ItemStackUtils.getItemStacksFromConfig;
+import static net.slipcor.pvparena.core.Utils.getSerializableItemStacks;
+
/**
*
* Configuration class
@@ -74,16 +77,17 @@ public enum CFG {
GENERAL_SMARTSPAWN("general.smartspawn", false, null),
GENERAL_TIME("general.time", -1, null),
GENERAL_TYPE("general.type", "none", null),
- GENERAL_WAND("general.wand", Material.STICK.name(), false, null),
+ GENERAL_WAND("general.wand", Material.STICK, null),
GOAL_ADDLIVESPERPLAYER("goal.livesPerPlayer", false, null),
- ITEMS_EXCLUDEFROMDROPS("items.excludeFromDrops", "none", true, null),
- ITEMS_KEEPONRESPAWN("items.keepOnRespawn", "none", true, null),
+ ITEMS_EXCLUDEFROMDROPS("items.excludeFromDrops", new ItemStack[0], null),
+ ITEMS_KEEPONRESPAWN("items.keepOnRespawn", new ItemStack[0], null),
+ ITEMS_KEEPALLONRESPAWN("items.keepAllOnRespawn", false, null),
ITEMS_MINPLAYERS("items.minplayers", 2, null),
ITEMS_RANDOM("items.random", true, null),
- ITEMS_REWARDS("items.rewards", "none", true, null),
- ITEMS_TAKEOUTOFGAME("items.takeOutOfGame", "none", true, null),
+ ITEMS_REWARDS("items.rewards", new ItemStack[0], null),
+ ITEMS_TAKEOUTOFGAME("items.takeOutOfGame", new ItemStack[0], null),
JOIN_RANGE("join.range", 0, null),
JOIN_FORCE("join.forceregionjoin", false, null),
@@ -124,7 +128,7 @@ public enum CFG {
PLAYER_HEALTH("player.health", -1, null),
PLAYER_HEALFORKILL("player.healforkill", false, null),
PLAYER_HUNGER("player.hunger", true, null),
- PLAYER_ITEMSONKILL("player.itemsonkill", "none", true, null),
+ PLAYER_ITEMSONKILL("player.itemsonkill", new ItemStack[0], null),
PLAYER_MAYCHANGEARMOR("player.mayChangeArmor", true, null),
PLAYER_MAXHEALTH("player.maxhealth", -1, null),
PLAYER_PREVENTDEATH("player.preventDeath", true, null),
@@ -140,7 +144,7 @@ public enum CFG {
PROTECT_SPAWN("protection.spawn", 0, null),
READY_AUTOCLASS("ready.autoClass", "none", null),
- READY_BLOCK("ready.block", Material.IRON_BLOCK.name(), false, null),
+ READY_BLOCK("ready.block", Material.IRON_BLOCK, null),
READY_CHECKEACHPLAYER("ready.checkEachPlayer", false, null),
READY_CHECKEACHTEAM("ready.checkEachTeam", true, null),
READY_ENFORCECOUNTDOWN("ready.enforceCountdown", false, null),
@@ -180,17 +184,7 @@ public enum CFG {
USES_WOOLHEAD("uses.woolHead", false, null),
// ----------
-
- GOAL_BEACONS_ANNOUNCEOFFSET("goal.beacons.spamoffset", 3, "Beacons"),
- GOAL_BEACONS_BOSSBAR("goal.beacons.beacBossBar", true, "Beacons"),
- GOAL_BEACONS_CHANGESECONDS("goal.beacons.changeseconds", 30, "Beacons"),
- GOAL_BEACONS_CHANGEONCLAIM("goal.beacons.changeonclaim", false, "Beacons"),
- GOAL_BEACONS_CLAIMRANGE("goal.beacons.claimrange", 3, "Beacons"),
- GOAL_BEACONS_LIVES("goal.beacons.blives", 10, "Beacons"),
- GOAL_BEACONS_TICKINTERVAL("goal.beacons.tickinterval", 60, "Beacons"),
- GOAL_BEACONS_TICKREWARD("goal.beacons.tickreward", 1, "Beacons"),
-
- GOAL_BLOCKDESTROY_BLOCKTYPE("goal.blockdestroy.blocktype", "IRON_BLOCK", false, "BlockDestroy"),
+ GOAL_BLOCKDESTROY_BLOCKTYPE("goal.blockdestroy.blocktype", Material.IRON_BLOCK, "BlockDestroy"),
GOAL_BLOCKDESTROY_LIVES("goal.blockdestroy.bdlives", 1, "BlockDestroy"),
GOAL_CHECKPOINTS_CLAIMRANGE("goal.checkpoints.cpclaimrange", 5, "CheckPoints"),
@@ -202,15 +196,16 @@ public enum CFG {
GOAL_DOM_CLAIMRANGE("goal.dom.claimrange", 3, "Domination"),
GOAL_DOM_LIVES("goal.dom.dlives", 10, "Domination"),
GOAL_DOM_ONLYWHENMORE("goal.dom.onlywhenmore", false, "Domination"),
- GOAL_DOM_PARTICLECIRCLE("goal.dom.particlecircle", false, "Domination"),
+ GOAL_DOM_PARTICLECIRCLE("goal.dom.particlecircle", true, "Domination"),
GOAL_DOM_TICKINTERVAL("goal.dom.tickinterval", 60, "Domination"),
GOAL_DOM_TICKREWARD("goal.dom.tickreward", 1, "Domination"),
- GOAL_FLAGS_FLAGTYPE("goal.flags.flagType", "WOOL", false, "Flags"),
+ GOAL_FLAGS_FLAGTYPE("goal.flags.flagType", Material.WHITE_WOOL, "Flags"),
GOAL_FLAGS_LIVES("goal.flags.flives", 3, "Flags"),
GOAL_FLAGS_MUSTBESAFE("goal.flags.mustBeSafe", true, "Flags"),
GOAL_FLAGS_WOOLFLAGHEAD("goal.flags.woolFlagHead", true, "Flags"),
GOAL_FLAGS_FLAGEFFECT("goal.flags.effect", "none", "Flags"),
+ GOAL_FLAGS_ALTERONCATCH("goal.flags.alterOnCatch", true, "Flags"),
GOAL_FOOD_FMAXITEMS("goal.food.fmaxitems", 50, "Food"),
GOAL_FOOD_FPLAYERITEMS("goal.food.fplayeritems", 10, "Food"),
@@ -224,10 +219,17 @@ public enum CFG {
GOAL_LLIVES_LIVES("goal.liberation.llives", 3, "Liberation"),
GOAL_PDM_LIVES("goal.playerdm.pdlives", 3, "PlayerDeathMatch"),
+
+ GOAL_PFLAGS_FLAGTYPE("goal.physicalflags.flagType", Material.WHITE_WOOL, "PhysicalFlags"),
+ GOAL_PFLAGS_LIVES("goal.physicalflags.flives", 3, "PhysicalFlags"),
+ GOAL_PFLAGS_MUSTBESAFE("goal.physicalflags.mustBeSafe", true, "PhysicalFlags"),
+ GOAL_PFLAGS_WOOLFLAGHEAD("goal.physicalflags.woolFlagHead", true, "PhysicalFlags"),
+ GOAL_PFLAGS_FLAGEFFECT("goal.physicalflags.effect", "none", "PhysicalFlags"),
+
GOAL_PLIVES_LIVES("goal.playerlives.plives", 3, "PlayerLives"),
GOAL_TANK_LIVES("goal.tank.tlives", 1, "Tank"),
GOAL_TDC_LIVES("goal.teamdc.tdclives", 10, "TeamDeathConfirm"),
- GOAL_TDC_ITEM("goal.teamdc.tdcitem", "WOOL", false, "TeamDeathConfirm"),
+ GOAL_TDC_ITEM("goal.teamdc.tdcitem", Material.WHITE_WOOL, "TeamDeathConfirm"),
GOAL_TDM_LIVES("goal.teamdm.tdlives", 10, "TeamDeathMatch"),
GOAL_TDM_SUICIDESCORE("goal.teamdm.suicideScore", false, "TeamDeathMatch"),
GOAL_TLIVES_LIVES("goal.teamlives.tlives", 10, "TeamLives"),
@@ -252,11 +254,6 @@ public enum CFG {
GOAL_PLAYERKILLREWARD_GRADUALLYDOWN("goal.playerkillreward.graduallyDown", false, "PlayerKillReward"),
GOAL_PLAYERKILLREWARD_ONLYGIVE("goal.playerkillreward.onlyGive", false, "PlayerKillReward"),
- GOAL_RESCUE_RESCUETYPE("goal.rescue.flagType", "VILLAGER", "Rescue"),
- GOAL_RESCUE_LIVES("goal.rescue.rlives", 1, "Rescue"),
- GOAL_RESCUE_MUSTBESAFE("goal.rescue.mustBeSafe", true, "Rescue"),
- GOAL_RESCUE_RESCUEEFFECT("goal.rescue.effect", "none", "Rescue"),
-
// -----------
MODULES_AFTERMATCH_AFTERMATCH("modules.aftermatch.aftermatch", "off", "AfterMatch"),
@@ -304,13 +301,34 @@ public enum CFG {
MODULES_BLOCKRESTORE_RESTORECHESTS("modules.blockrestore.restorechests", false, "BlockRestore"),
MODULES_BLOCKDISSOLVE_CALCOFFSET("modules.blockdissolve.calcoffset", 0.333, "BlockDissolve"),
- MODULES_BLOCKDISSOLVE_MATERIALS("modules.blockdissolve.materials", "SNOW,WOOL", true, "BlockDissolve"),
+ MODULES_BLOCKDISSOLVE_MATERIALS("modules.blockdissolve.materials", new ItemStack[]{
+ new ItemStack(Material.SNOW_BLOCK, 1),
+
+ new ItemStack(Material.BLACK_WOOL, 1),
+ new ItemStack(Material.BLUE_WOOL, 1),
+ new ItemStack(Material.CYAN_WOOL, 1),
+ new ItemStack(Material.BROWN_WOOL, 1),
+
+ new ItemStack(Material.GRAY_WOOL, 1),
+ new ItemStack(Material.GREEN_WOOL, 1),
+ new ItemStack(Material.LIGHT_BLUE_WOOL, 1),
+ new ItemStack(Material.LIGHT_GRAY_WOOL, 1),
+
+ new ItemStack(Material.LIME_WOOL, 1),
+ new ItemStack(Material.MAGENTA_WOOL, 1),
+ new ItemStack(Material.ORANGE_WOOL, 1),
+ new ItemStack(Material.RED_WOOL, 1),
+
+ new ItemStack(Material.PINK_WOOL, 1),
+ new ItemStack(Material.PURPLE_WOOL, 1),
+ new ItemStack(Material.YELLOW_WOOL, 1),
+ new ItemStack(Material.WHITE_WOOL, 1)}, "BlockDissolve"),
MODULES_BLOCKDISSOLVE_STARTSECONDS("modules.blockdissolve.startseconds", 10, "BlockDissolve"),
MODULES_BLOCKDISSOLVE_TICKS("modules.blockdissolve.ticks", 40, "BlockDissolve"),
MODULES_CHESTFILLER_CHESTLOCATION("modules.chestfiller.chestlocation", "none", "ChestFiller"),
MODULES_CHESTFILLER_CLEAR("modules.chestfiller.clear", false, "ChestFiller"),
- MODULES_CHESTFILLER_ITEMS("modules.chestfiller.cfitems", "1", true, "ChestFiller"),
+ MODULES_CHESTFILLER_ITEMS("modules.chestfiller.cfitems", new ItemStack[]{new ItemStack(Material.STONE)}, "ChestFiller"),
MODULES_CHESTFILLER_MAXITEMS("modules.chestfiller.cfmaxitems", 5, "ChestFiller"),
MODULES_CHESTFILLER_MINITEMS("modules.chestfiller.cfminitems", 0, "ChestFiller"),
@@ -323,7 +341,7 @@ public enum CFG {
MODULES_FIXINVENTORYLOSS_INVENTORY("modules.fixinventoryloss.inventory", false, "FixInventoryLoss"),
MODULES_ITEMS_INTERVAL("modules.items.interval", 0, "Items"),
- MODULES_ITEMS_ITEMS("modules.items.items", "none", true, "Items"),
+ MODULES_ITEMS_ITEMS("modules.items.items", new ItemStack[0], "Items"),
MODULES_RESPAWNRELAY_INTERVAL("modules.respawnrelay.respawnseconds", 10, "RespawnRelay"),
MODULES_RESPAWNRELAY_CHOOSESPAWN("modules.respawnrelay.choosespawn", false, "RespawnRelay"),
@@ -341,6 +359,11 @@ public enum CFG {
MODULES_POWERUPS_DROPSPAWN("modules.powerups.dropspawn", false, "Powerups"),
MODULES_POWERUPS_USAGE("modules.powerups.usage", "off", "Powerups"),
+ MODULES_PROJECTILES_SNOWBALL("modules.projectiles.snowball", true, "Projectiles"),
+ MODULES_PROJECTILES_EGG("modules.projectiles.egg", true, "Projectiles"),
+ MODULES_PROJECTILES_FISHHOOK("modules.projectiles.fishHook", false, "Projectiles"),
+ MODULES_PROJECTILES_ENDERPEARL("modules.projectiles.enderPearl", false, "Projectiles"),
+
MODULES_SKINS_VANILLA("modules.skins.vanilla", false, "Skins"),
MODULES_SPECIALJOIN_SHOWPLAYERS("modules.specialjoin.showplayers", true, "SpecialJoin"),
@@ -386,7 +409,7 @@ public enum CFG {
MODULES_VAULT_REWARD_TRIGGER("modules.vault.reward.trigger", 0.0d, "Vault"),
MODULES_VAULT_REWARD_WIN("modules.vault.reward.playerWin", 0.0d, "Vault"),
- MODULES_WALLS_MATERIAL("modules.walls.wallmaterial", "SAND", false, "Walls"),
+ MODULES_WALLS_MATERIAL("modules.walls.wallmaterial", Material.SAND, "Walls"),
MODULES_WALLS_SCOREBOARDCOUNTDOWN("modules.walls.scoreboardcountdown", false, "Walls"),
MODULES_WALLS_SECONDS("modules.walls.wallseconds", 300, "Walls"),
@@ -438,10 +461,17 @@ public static CFG getByNode(final String node) {
module = source;
}
- CFG(final String node, final String value, final boolean multiple, final String source) {
+ CFG(final String node, final ItemStack[] value, final String source) {
this.node = node;
- this.value = value;
- type = multiple ? "items" : "material";
+ this.value = getSerializableItemStacks(value);
+ type = "items";
+ module = source;
+ }
+
+ CFG(final String node, final Material value, final String source) {
+ this.node = node;
+ this.value = value.name();
+ type = "material";
module = source;
}
@@ -502,7 +532,7 @@ public String getType() {
}
public String getModule() {
- return module;
+ return this.module;
}
public boolean hasModule() {
@@ -736,16 +766,19 @@ public Material getMaterial(final CFG cfg, final Material def) {
}
public ItemStack[] getItems(final CFG cfg) {
- return getItems(cfg, StringParser.getItemStacksFromString((String) cfg.getValue()));
- }
-
- public ItemStack[] getItems(final CFG cfg, final ItemStack[] def) {
final String path = cfg.getNode();
- final String result = strings.get(path);
- if (result == null || "none".equals(result)) {
- return def;
+ try {
+ String test = this.cfg.getString(path);
+ if ("none".equalsIgnoreCase(test)) {
+ return new ItemStack[0];
+ }
+ } catch (Exception e) {
+ }
+ try {
+ return getItemStacksFromConfig(this.cfg.getList(path));
+ } catch (NullPointerException e) {
+ return new ItemStack[0];
}
- return StringParser.getItemStacksFromString(result);
}
public Set getKeys(final String path) {
@@ -757,6 +790,10 @@ public Set getKeys(final String path) {
return section.getKeys(false);
}
+ public List getStringList(final CFG cfg) {
+ return this.getStringList(cfg.getNode(), null);
+ }
+
public List getStringList(final String path, final List def) {
if (cfg.get(path) == null) {
return def == null ? new LinkedList() : def;
@@ -765,6 +802,7 @@ public List getStringList(final String path, final List def) {
return cfg.getStringList(path);
}
+
// /////////////////////////////////////////////////////////////////////////
// //
// MUTATORS //
@@ -906,7 +944,13 @@ public static ArenaRegion parseRegion(final Arena arena,
final Integer flags = parseInteger(parts[8]);
final Integer prots = parseInteger(parts[9]);
- if (Bukkit.getWorld(parts[0]) == null || x1 == null || y1 == null
+ if (Bukkit.getWorld(parts[0]) == null) {
+ PVPArena.instance.getLogger().severe(String.format("%s caused an error while loading region %s",
+ arena.getName(), regionName));
+ throw new IllegalArgumentException(String.format("World %s not recognized. Is it loaded ?", parts[0]));
+ }
+
+ if (x1 == null || y1 == null
|| z1 == null || x2 == null || y2 == null || z2 == null
|| flags == null || prots == null) {
PVPArena.instance.getLogger().severe(arena.getName() + " caused an error while loading region " + regionName);
diff --git a/src/net/slipcor/pvparena/core/Debug.java b/src/net/slipcor/pvparena/core/Debug.java
index 9924601ef..e9136a088 100644
--- a/src/net/slipcor/pvparena/core/Debug.java
+++ b/src/net/slipcor/pvparena/core/Debug.java
@@ -13,8 +13,8 @@
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.*;
-import java.util.logging.*;
import java.util.logging.Formatter;
+import java.util.logging.*;
/**
diff --git a/src/net/slipcor/pvparena/core/ItemStackUtils.java b/src/net/slipcor/pvparena/core/ItemStackUtils.java
new file mode 100644
index 000000000..87cef1960
--- /dev/null
+++ b/src/net/slipcor/pvparena/core/ItemStackUtils.java
@@ -0,0 +1,189 @@
+package net.slipcor.pvparena.core;
+
+import net.slipcor.pvparena.PVPArena;
+import org.bukkit.Bukkit;
+import org.bukkit.Color;
+import org.bukkit.Material;
+import org.bukkit.configuration.serialization.ConfigurationSerializable;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.inventory.meta.LeatherArmorMeta;
+import org.bukkit.inventory.meta.PotionMeta;
+import org.bukkit.potion.PotionEffect;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.bukkit.configuration.serialization.ConfigurationSerialization.deserializeObject;
+
+public class ItemStackUtils {
+ /**
+ * List of "meta-type" config keys which can be drop
+ */
+ private enum HandledMetaType {
+ POTION, ENCHANTED, BOOK_SIGNED, BOOK, BANNER, MAP, FIREWORK, LEATHER_ARMOR, UNSPECIFIC
+ }
+
+ private static boolean isAnHandledMetaType(String metaTypeString) {
+ try{
+ HandledMetaType.valueOf(metaTypeString);
+ return true;
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Check the meta keyset to deduce which meta-type is associated
+ * @param keySet The meta config node values
+ * @return Right "meta-type" value
+ */
+ private static HandledMetaType getRightMetaType(Collection keySet) {
+ if(keySet.contains("potion-type") || keySet.contains("custom-effects")) {
+ return HandledMetaType.POTION;
+ }
+ if(keySet.contains("stored-enchants")) {
+ return HandledMetaType.ENCHANTED;
+ }
+ if(keySet.contains("map-id")) {
+ return HandledMetaType.MAP;
+ }
+ if(keySet.contains("patterns")) {
+ return HandledMetaType.BANNER;
+ }
+ if(keySet.contains("pages")) {
+ if(keySet.contains("author")) {
+ return HandledMetaType.BOOK_SIGNED;
+ }
+ return HandledMetaType.BOOK;
+ }
+ if(keySet.contains("firework-effects")) {
+ return HandledMetaType.FIREWORK;
+ }
+ if(keySet.contains("color")) {
+ return HandledMetaType.LEATHER_ARMOR;
+ }
+ return HandledMetaType.UNSPECIFIC;
+ }
+
+
+ /**
+ * Pseudo-serializer which creates a map version of objects in order to prettify the yaml after serialization
+ * @param itemStack A bukkit ItemStack object
+ * @return Serializable map
+ */
+ public static Map getItemStackMap(ItemStack itemStack) {
+ Map result = new LinkedHashMap<>();
+ result.put("type", itemStack.getType().name());
+ if (itemStack.getAmount() != 1) {
+ result.put("amount", itemStack.getAmount());
+ }
+
+ ItemMeta meta = itemStack.getItemMeta();
+ if (!Bukkit.getItemFactory().equals(meta, null)) {
+ Map metaMap = new LinkedHashMap<>(meta.serialize());
+ if(isAnHandledMetaType(metaMap.get("meta-type").toString())) {
+ metaMap.remove("meta-type");
+
+ // Simplify leather armor colors
+ if(meta instanceof LeatherArmorMeta) {
+ metaMap.put("color", ((LeatherArmorMeta) meta).getColor().serialize());
+ }
+
+ // Simplify custom potion effects
+ if(meta instanceof PotionMeta) {
+ PotionMeta potionMeta = (PotionMeta) meta;
+
+ if(potionMeta.hasCustomEffects()) {
+ List