Stupid git...
This commit is contained in:
@@ -5,7 +5,6 @@ import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
@@ -13,6 +12,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
@@ -34,6 +34,9 @@ import org.bukkit.inventory.PlayerInventory;
|
||||
import org.bukkit.util.config.Configuration;
|
||||
|
||||
import com.garbagemule.MobArena.MAMessages.Msg;
|
||||
import com.garbagemule.MobArena.util.WaveUtils;
|
||||
import com.garbagemule.MobArena.waves.Wave;
|
||||
import com.garbagemule.MobArena.waves.Wave.WaveBranch;
|
||||
|
||||
public class Arena
|
||||
{
|
||||
@@ -55,11 +58,24 @@ public class Arena
|
||||
protected Map<Player,String> classMap;
|
||||
protected Map<String,List<ItemStack>> classItems, classArmor;
|
||||
protected Map<Integer,Map<Player,List<ItemStack>>> classBonuses;
|
||||
protected Map<Player,List<ItemStack>> rewardMap;
|
||||
protected List<ItemStack> entryFee;
|
||||
|
||||
// NEW IMPLEMENTATION
|
||||
//
|
||||
//
|
||||
// Player sets
|
||||
protected Set<Player> arenaPlayers, lobbyPlayers, readyPlayers, specPlayers;
|
||||
// Wave stuff
|
||||
//protected TreeSet<SingleWave> singleWaves;
|
||||
//protected TreeSet<RecurrentWave> recurrentWaves;
|
||||
protected TreeSet<Wave> singleWaves;
|
||||
protected TreeSet<Wave> recurrentWaves;
|
||||
//
|
||||
//
|
||||
// NEW IMPLEMENTATION
|
||||
|
||||
// Arena sets/maps
|
||||
protected Set<Player> arenaPlayers, lobbyPlayers, readyPlayers, specPlayers, hasPaid, rewardedPlayers, notifyPlayers, randoms;
|
||||
protected Set<Player> hasPaid, rewardedPlayers, notifyPlayers, randoms;
|
||||
protected Set<LivingEntity> monsters;
|
||||
protected Set<Block> blocks;
|
||||
protected Set<Wolf> pets;
|
||||
@@ -71,17 +87,13 @@ public class Arena
|
||||
protected boolean allowMonsters, allowAnimals;
|
||||
|
||||
// Other settings
|
||||
protected int repairDelay, playerLimit, joinDistance;
|
||||
protected int repairDelay, minPlayers, maxPlayers, joinDistance;
|
||||
protected List<String> classes = new LinkedList<String>();
|
||||
protected Map<Player,Location> locations = new HashMap<Player,Location>();
|
||||
protected Map<Player,Integer> healthMap = new HashMap<Player,Integer>();
|
||||
|
||||
// Logging
|
||||
protected ArenaLog log;
|
||||
protected List<String> classDistribution = new LinkedList<String>();
|
||||
protected Map<Player,Integer> waveMap = new HashMap<Player,Integer>();
|
||||
protected Map<Player,Integer> killMap = new HashMap<Player,Integer>();
|
||||
protected Timestamp startTime;
|
||||
protected Timestamp endTime;
|
||||
|
||||
protected MAListener eventListener;
|
||||
|
||||
@@ -96,7 +108,6 @@ public class Arena
|
||||
this.name = name;
|
||||
this.world = world;
|
||||
plugin = (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena");
|
||||
log = new ArenaLog(plugin, this);
|
||||
|
||||
arenaPlayers = new HashSet<Player>();
|
||||
lobbyPlayers = new HashSet<Player>();
|
||||
@@ -111,7 +122,6 @@ public class Arena
|
||||
petMap = new HashMap<Player,Integer>();
|
||||
classMap = new HashMap<Player,String>();
|
||||
randoms = new HashSet<Player>();
|
||||
rewardMap = new HashMap<Player,List<ItemStack>>();
|
||||
repairList = new LinkedList<int[]>();
|
||||
|
||||
running = false;
|
||||
@@ -148,9 +158,7 @@ public class Arena
|
||||
{
|
||||
p.teleport(arenaLoc);
|
||||
p.setHealth(20);
|
||||
rewardMap.put(p, new LinkedList<ItemStack>());
|
||||
waveMap.put(p, 0);
|
||||
killMap.put(p, 0);
|
||||
//rewardMap.put(p, new LinkedList<ItemStack>());
|
||||
}
|
||||
|
||||
// Spawn pets.
|
||||
@@ -160,8 +168,8 @@ public class Arena
|
||||
startSpawning();
|
||||
|
||||
// Start logging
|
||||
if (logging)
|
||||
log.start();
|
||||
log = new ArenaLog(plugin, this);
|
||||
log.start();
|
||||
|
||||
// Set the boolean.
|
||||
running = true;
|
||||
@@ -183,13 +191,9 @@ public class Arena
|
||||
// Set the boolean.
|
||||
running = false;
|
||||
|
||||
// Stop logging.
|
||||
if (logging)
|
||||
{
|
||||
log.end();
|
||||
log.serialize();
|
||||
log.clear();
|
||||
}
|
||||
log.end();
|
||||
log.saveSessionData();
|
||||
log.updateArenaTotals();
|
||||
|
||||
// Stop spawning.
|
||||
stopSpawning();
|
||||
@@ -210,9 +214,7 @@ public class Arena
|
||||
notifyPlayers.clear();
|
||||
rewardedPlayers.clear();
|
||||
classMap.clear();
|
||||
rewardMap.clear();
|
||||
waveMap.clear();
|
||||
killMap.clear();
|
||||
//rewardMap.clear();
|
||||
spawnThread = null;
|
||||
|
||||
// Notify listeners.
|
||||
@@ -224,9 +226,12 @@ public class Arena
|
||||
|
||||
public void forceStart()
|
||||
{
|
||||
if (running)
|
||||
return;
|
||||
|
||||
// Set operations.
|
||||
Set<Player> tmp = new HashSet<Player>();
|
||||
//tmp.addAll(livePlayers);
|
||||
tmp.addAll(lobbyPlayers);
|
||||
tmp.removeAll(readyPlayers);
|
||||
|
||||
// Force leave.
|
||||
@@ -239,12 +244,14 @@ public class Arena
|
||||
|
||||
public void forceEnd()
|
||||
{
|
||||
for (Player p : getAllPlayers())
|
||||
{
|
||||
plugin.getAM().arenaMap.remove(p);
|
||||
playerLeave(p);
|
||||
}
|
||||
if (!running)
|
||||
return;
|
||||
|
||||
Bukkit.getServer().getScheduler().cancelTask(spawnTaskId);
|
||||
|
||||
for (Player p : getAllPlayers())
|
||||
playerLeave(p);
|
||||
|
||||
for (Entity e : monsters)
|
||||
e.remove();
|
||||
|
||||
@@ -252,9 +259,7 @@ public class Arena
|
||||
lobbyPlayers.clear();
|
||||
readyPlayers.clear();
|
||||
|
||||
rewardMap.clear();
|
||||
waveMap.clear();
|
||||
killMap.clear();
|
||||
//rewardMap.clear();
|
||||
monsters.clear();
|
||||
|
||||
spawnTaskId = -1;
|
||||
@@ -262,105 +267,68 @@ public class Arena
|
||||
|
||||
public void playerJoin(Player p, Location loc)
|
||||
{
|
||||
if (!locations.containsKey(p))
|
||||
locations.put(p,loc);
|
||||
|
||||
// Update chunk.
|
||||
updateChunk(lobbyLoc);
|
||||
|
||||
storePlayerData(p, loc);
|
||||
p.setHealth(20);
|
||||
MAUtils.sitPets(p);
|
||||
lobbyPlayers.add(p);
|
||||
p.teleport(lobbyLoc);
|
||||
|
||||
// Notify listeners.
|
||||
for (MobArenaListener listener : plugin.getAM().listeners)
|
||||
listener.onPlayerJoin(p);
|
||||
movePlayerToLobby(p);
|
||||
}
|
||||
|
||||
public void playerReady(Player p)
|
||||
{
|
||||
readyPlayers.add(p);
|
||||
|
||||
if (minPlayers > 0 && lobbyPlayers.size() < minPlayers)
|
||||
{
|
||||
MAUtils.tellPlayer(p, MAMessages.get(Msg.LOBBY_NOT_ENOUGH_PLAYERS, "" + minPlayers));
|
||||
return;
|
||||
}
|
||||
|
||||
startArena();
|
||||
}
|
||||
|
||||
public void playerLeave(Player p)
|
||||
{
|
||||
// Clear class inventory, restore old inventory and fork over rewards.
|
||||
restoreInvAndGiveRewards(p, (arenaPlayers.contains(p) || lobbyPlayers.contains(p)));
|
||||
if (arenaPlayers.contains(p) || lobbyPlayers.contains(p))
|
||||
MAUtils.clearInventory(p);
|
||||
|
||||
// Grab the player's entry location, and warp them there.
|
||||
Location entry = locations.get(p);
|
||||
if (entry != null)
|
||||
{
|
||||
updateChunk(entry);
|
||||
p.teleport(entry);
|
||||
}
|
||||
locations.remove(p);
|
||||
|
||||
// Remove from the arenaMap and all the sets.
|
||||
plugin.getAM().arenaMap.remove(p);
|
||||
removePlayer(p);
|
||||
|
||||
// End the arena if conditions are met.
|
||||
restoreInvAndGiveRewards(p);
|
||||
if (log.players.get(p) != null) log.players.get(p).lastWave = spawnThread.wave - 1;
|
||||
movePlayerToEntry(p);
|
||||
finishWithPlayer(p);
|
||||
endArena();
|
||||
}
|
||||
|
||||
public void playerDeath(Player p)
|
||||
{
|
||||
// If spectate-on-death: false, pass on to playerLeave.
|
||||
if (!specOnDeath)
|
||||
MAUtils.clearInventory(p);
|
||||
restoreInvAndGiveRewards(p);
|
||||
log.players.get(p).lastWave = spawnThread.wave - 1;
|
||||
|
||||
if (specOnDeath)
|
||||
{
|
||||
p.teleport(arenaLoc);
|
||||
playerLeave(p);
|
||||
return;
|
||||
resetPlayer(p);
|
||||
movePlayerToSpec(p);
|
||||
}
|
||||
|
||||
// Clear class inventory, restore old inventory and fork over rewards.
|
||||
restoreInvAndGiveRewards(p, true);
|
||||
|
||||
// Remove player from sets, warp to spectator area, then add to specPlayers.
|
||||
removePlayer(p);
|
||||
p.teleport(arenaLoc); // This will sometimes force players to drop any items held (not confirmed)
|
||||
p.teleport(spectatorLoc);
|
||||
specPlayers.add(p);
|
||||
|
||||
// Update the monster targets.
|
||||
else
|
||||
{
|
||||
movePlayerToEntry(p);
|
||||
finishWithPlayer(p);
|
||||
}
|
||||
|
||||
if (running && spawnThread != null)
|
||||
spawnThread.updateTargets();
|
||||
|
||||
// Announce and notify
|
||||
MAUtils.tellAll(this, MAMessages.get(Msg.PLAYER_DIED, p.getName()));
|
||||
for (MobArenaListener listener : plugin.getAM().listeners)
|
||||
listener.onPlayerDeath(p);
|
||||
|
||||
// End the arena if conditions are met.
|
||||
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { public void run() {
|
||||
endArena();
|
||||
}});
|
||||
}
|
||||
|
||||
public void playerSpec(Player p, Location loc)
|
||||
{
|
||||
if (!locations.containsKey(p))
|
||||
locations.put(p,loc);
|
||||
|
||||
storePlayerData(p, loc);
|
||||
MAUtils.sitPets(p);
|
||||
specPlayers.add(p);
|
||||
p.teleport(spectatorLoc);
|
||||
}
|
||||
|
||||
public void removePlayer(Player p)
|
||||
{
|
||||
// Heal and put out fire.
|
||||
p.setFireTicks(0);
|
||||
p.setHealth(20);
|
||||
|
||||
// Remove pets.
|
||||
removePets(p);
|
||||
|
||||
// readyPlayers before lobbyPlayers because of startArena sanity-checks
|
||||
readyPlayers.remove(p);
|
||||
specPlayers.remove(p);
|
||||
arenaPlayers.remove(p);
|
||||
lobbyPlayers.remove(p);
|
||||
movePlayerToSpec(p);
|
||||
}
|
||||
|
||||
private void spawnPets()
|
||||
@@ -424,31 +392,26 @@ public class Arena
|
||||
|
||||
public void playerKill(Player p)
|
||||
{
|
||||
if (p == null || killMap.get(p) == null)
|
||||
if (p == null || log.players.get(p) == null)
|
||||
return;
|
||||
|
||||
killMap.put(p, killMap.get(p) + 1);
|
||||
log.players.get(p).kills++;
|
||||
}
|
||||
|
||||
public void restoreInvAndGiveRewards(final Player p, final boolean clear)
|
||||
public void restoreInvAndGiveRewards(final Player p)
|
||||
{
|
||||
final List<ItemStack> rewards = rewardMap.get(p);
|
||||
final List<ItemStack> rewards = log.players.get(p).rewards;
|
||||
//final List<ItemStack> rewards = rewardMap.get(p);
|
||||
final boolean hadRewards = rewardedPlayers.contains(p);
|
||||
|
||||
if (clear) MAUtils.clearInventory(p);
|
||||
|
||||
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin,
|
||||
new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
//if (clear)
|
||||
// MAUtils.clearInventory(p);
|
||||
|
||||
{
|
||||
if (!emptyInvJoin)
|
||||
MAUtils.restoreInventory(p);
|
||||
|
||||
//if (rewardedPlayers.contains(p))
|
||||
if (hadRewards)
|
||||
return;
|
||||
|
||||
@@ -459,6 +422,70 @@ public class Arena
|
||||
});
|
||||
}
|
||||
|
||||
public void storePlayerData(Player p, Location loc)
|
||||
{
|
||||
plugin.getAM().arenaMap.put(p, this);
|
||||
|
||||
if (!locations.containsKey(p))
|
||||
locations.put(p, loc);
|
||||
|
||||
if (!healthMap.containsKey(p))
|
||||
healthMap.put(p, p.getHealth());
|
||||
}
|
||||
|
||||
public void movePlayerToLobby(Player p)
|
||||
{
|
||||
updateChunk(lobbyLoc);
|
||||
lobbyPlayers.add(p);
|
||||
p.teleport(lobbyLoc);
|
||||
}
|
||||
|
||||
public void movePlayerToSpec(Player p)
|
||||
{
|
||||
updateChunk(spectatorLoc);
|
||||
specPlayers.add(p);
|
||||
p.teleport(spectatorLoc);
|
||||
}
|
||||
|
||||
public void movePlayerToEntry(Player p)
|
||||
{
|
||||
Location entry = locations.get(p);
|
||||
if (entry == null) return;
|
||||
|
||||
updateChunk(entry);
|
||||
p.teleport(entry);
|
||||
}
|
||||
|
||||
private void resetPlayer(Player p)
|
||||
{
|
||||
if (healthMap.containsKey(p))
|
||||
p.setHealth(healthMap.remove(p));
|
||||
|
||||
removePlayer(p);
|
||||
}
|
||||
|
||||
public void removePlayer(Player p)
|
||||
{
|
||||
// Put out fire.
|
||||
p.setFireTicks(0);
|
||||
|
||||
// Remove pets.
|
||||
removePets(p);
|
||||
|
||||
// readyPlayers before lobbyPlayers because of startArena sanity-checks
|
||||
readyPlayers.remove(p);
|
||||
specPlayers.remove(p);
|
||||
arenaPlayers.remove(p);
|
||||
lobbyPlayers.remove(p);
|
||||
}
|
||||
|
||||
private void finishWithPlayer(Player p)
|
||||
{
|
||||
locations.remove(p);
|
||||
plugin.getAM().arenaMap.remove(p);
|
||||
resetPlayer(p);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*////////////////////////////////////////////////////////////////////
|
||||
@@ -602,7 +629,8 @@ public class Arena
|
||||
specOnDeath = config.getBoolean(arenaPath + "spectate-on-death", true);
|
||||
shareInArena = config.getBoolean(arenaPath + "share-items-in-arena", true);
|
||||
joinDistance = config.getInt(arenaPath + "max-join-distance", 0);
|
||||
playerLimit = config.getInt(arenaPath + "player-limit", 0);
|
||||
minPlayers = config.getInt(arenaPath + "min-players", 0);
|
||||
maxPlayers = config.getInt(arenaPath + "max-players", 0);
|
||||
repairDelay = config.getInt(arenaPath + "repair-delay", 5);
|
||||
waveDelay = config.getInt(arenaPath + "first-wave-delay", 5) * 20;
|
||||
waveInterval = config.getInt(arenaPath + "wave-interval", 20) * 20;
|
||||
@@ -624,6 +652,23 @@ public class Arena
|
||||
spectatorLoc = MAUtils.getArenaCoord(config, world, configName, "spectator");
|
||||
spawnpoints = MAUtils.getArenaSpawnpoints(config, world, configName);
|
||||
|
||||
// NEW WAVES
|
||||
singleWaves = WaveUtils.getWaves(config, configName, WaveBranch.SINGLE);
|
||||
recurrentWaves = WaveUtils.getWaves(config, configName, WaveBranch.RECURRENT);
|
||||
|
||||
|
||||
System.out.println();
|
||||
System.out.println("ARENA: " + configName);
|
||||
System.out.println("Single waves");
|
||||
int si = singleWaves.size();
|
||||
for (int i = 0; i < si; i++)
|
||||
System.out.println("- " + singleWaves.pollFirst());
|
||||
System.out.println("Reccurent waves");
|
||||
for (Wave w : recurrentWaves)
|
||||
System.out.println("- " + w);
|
||||
System.out.println();
|
||||
|
||||
|
||||
classes = plugin.getAM().classes;
|
||||
classItems = plugin.getAM().classItems;
|
||||
classArmor = plugin.getAM().classArmor;
|
||||
@@ -847,8 +892,8 @@ public class Arena
|
||||
public void run()
|
||||
{
|
||||
// Make sure to remove any dead/removed entities first.
|
||||
List<Entity> tmp = new LinkedList<Entity>(monsters);
|
||||
for (Entity e : tmp)
|
||||
List<Entity> ms = new LinkedList<Entity>(monsters);
|
||||
for (Entity e : ms)
|
||||
if (e.isDead())
|
||||
monsters.remove(e);
|
||||
|
||||
@@ -860,7 +905,8 @@ public class Arena
|
||||
}
|
||||
|
||||
// Clear all player inventories, and "kill" all players.
|
||||
for (Player p : arenaPlayers)
|
||||
List<Player> ps = new LinkedList<Player>(arenaPlayers);
|
||||
for (Player p : ps)
|
||||
{
|
||||
MAUtils.clearInventory(p);
|
||||
MAUtils.tellPlayer(p, MAMessages.get(Msg.FORCE_END_IDLE));
|
||||
@@ -969,6 +1015,12 @@ public class Arena
|
||||
return;
|
||||
|
||||
MAUtils.giveItems(p, entryFee, false, plugin);
|
||||
hasPaid.remove(p);
|
||||
}
|
||||
|
||||
public List<String> getClasses()
|
||||
{
|
||||
return classes;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,134 +1,120 @@
|
||||
package com.garbagemule.MobArena;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.garbagemule.MobArena.util.data.PlainText;
|
||||
import com.garbagemule.MobArena.util.data.Totals;
|
||||
|
||||
public class ArenaLog
|
||||
{
|
||||
protected MobArena plugin;
|
||||
protected Arena arena;
|
||||
protected List<String> log, classDistribution;
|
||||
protected Timestamp startTime, endTime;
|
||||
public MobArena plugin;
|
||||
public Arena arena;
|
||||
public Timestamp startTime, endTime;
|
||||
public int lastWave;
|
||||
|
||||
public Map<Player,ArenaPlayer> players;
|
||||
public Map<String,Integer> distribution;
|
||||
|
||||
public ArenaLog(MobArena plugin, Arena arena)
|
||||
{
|
||||
this.plugin = plugin;
|
||||
this.arena = arena;
|
||||
log = new LinkedList<String>();
|
||||
classDistribution = new LinkedList<String>();
|
||||
this.plugin = plugin;
|
||||
this.arena = arena;
|
||||
this.players = new HashMap<Player,ArenaPlayer>(arena.arenaPlayers.size());
|
||||
this.distribution = new HashMap<String,Integer>(arena.classes.size());
|
||||
}
|
||||
|
||||
public void start()
|
||||
{
|
||||
startTime = new Timestamp((new Date()).getTime());
|
||||
// Populate the data maps
|
||||
populatePlayerMap();
|
||||
populateDistributionMap();
|
||||
|
||||
// Class distribution
|
||||
int length = 0;
|
||||
for (String c : plugin.getAM().classes)
|
||||
if (c.length() > length)
|
||||
length = c.length();
|
||||
|
||||
List<String> classList = new LinkedList<String>(arena.classMap.values());
|
||||
for (String c : plugin.getAM().classes)
|
||||
{
|
||||
int count = 0;
|
||||
int id = classList.indexOf(c);
|
||||
while (id != -1)
|
||||
{
|
||||
classList.remove(id);
|
||||
count++;
|
||||
id = classList.indexOf(c);
|
||||
}
|
||||
//int percentage = (int) (((double) count) / ((double) arena.livePlayers.size())) * 100;
|
||||
int percentage = (int) (((double) count) / ((double) arena.arenaPlayers.size())) * 100;
|
||||
classDistribution.add(MAUtils.padRight(c + ": ", length + 2) + MAUtils.padLeft("" + count, 2) + " (" + percentage + "%)");
|
||||
}
|
||||
// Grab the current timestamp
|
||||
startTime = new Timestamp((new Date()).getTime());
|
||||
}
|
||||
|
||||
public void end()
|
||||
{
|
||||
lastWave = arena.spawnThread.wave - 1;
|
||||
endTime = new Timestamp((new Date()).getTime());
|
||||
|
||||
// General stuff
|
||||
log.add("--------------------------------------------------- ENTRY ---");
|
||||
log.add("Start: " + startTime);
|
||||
log.add("End: " + endTime);
|
||||
log.add("Duration: " + MAUtils.getDuration(endTime.getTime() - startTime.getTime()));
|
||||
log.add("Last wave: " + (arena.spawnThread.wave - 1));
|
||||
log.add(" ");
|
||||
|
||||
// Class distribution
|
||||
log.add("Class Distribution: " + plugin.getAM().classes.size() + " classes");
|
||||
for (String c : classDistribution)
|
||||
log.add("- " + c);
|
||||
classDistribution.clear();
|
||||
log.add(" ");
|
||||
|
||||
// Player data
|
||||
int NAME = 12; int CLASS = 0; int WAVE = 4; int KILLS = 5;
|
||||
for (String c : plugin.getAM().classes)
|
||||
if (c.length() > CLASS)
|
||||
CLASS = c.length();
|
||||
|
||||
log.add("Player Data: " + arena.classMap.keySet().size() + " players");
|
||||
log.add("- " + MAUtils.padRight("Name", NAME + 2, ' ') + MAUtils.padRight("Class", CLASS + 2, ' ') + MAUtils.padRight("Wave", WAVE + 2, ' ') + MAUtils.padRight("Kills", KILLS + 2, ' ') + "Rewards");
|
||||
for (Map.Entry<Player,String> entry : arena.classMap.entrySet())
|
||||
{
|
||||
Player p = entry.getKey();
|
||||
StringBuffer buffy = new StringBuffer();
|
||||
buffy.append(" ");
|
||||
// Name
|
||||
String name = (p.getName().length() <= NAME) ? p.getName() : p.getName().substring(0, NAME+1);
|
||||
buffy.append(MAUtils.padRight(name, NAME + 2, ' '));
|
||||
// Class
|
||||
buffy.append(MAUtils.padRight(entry.getValue(), CLASS + 2, ' '));
|
||||
// Wave
|
||||
buffy.append(MAUtils.padLeft(arena.waveMap.remove(p).toString(), WAVE, ' ') + " ");
|
||||
// Kills
|
||||
buffy.append(MAUtils.padLeft(arena.killMap.remove(p).toString(), KILLS, ' ') + " ");
|
||||
// Rewards
|
||||
buffy.append(MAUtils.listToString(arena.rewardMap.get(p), plugin));
|
||||
log.add(buffy.toString());
|
||||
}
|
||||
|
||||
log.add(" ");
|
||||
}
|
||||
|
||||
public void serialize()
|
||||
/**
|
||||
* Map players to ArenaPlayer objects.
|
||||
*/
|
||||
private void populatePlayerMap()
|
||||
{
|
||||
try
|
||||
{
|
||||
new File(plugin.getDataFolder() + File.separator + "logs").mkdir();
|
||||
File logFile = new File(plugin.getDataFolder() + File.separator + "logs" + File.separator + arena.configName() + ".log");
|
||||
if (logFile.exists())
|
||||
logFile.createNewFile();
|
||||
|
||||
FileWriter fw = new FileWriter(logFile, true);
|
||||
BufferedWriter bw = new BufferedWriter(fw);
|
||||
for (String l : log)
|
||||
{
|
||||
bw.write(l);
|
||||
bw.write(System.getProperty("line.separator"));
|
||||
}
|
||||
|
||||
bw.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
System.out.println("[MobArena] ERROR! Could not create log file!");
|
||||
return;
|
||||
}
|
||||
for (Player p : arena.arenaPlayers)
|
||||
players.put(p, new ArenaPlayer(p, arena, plugin));
|
||||
}
|
||||
|
||||
/**
|
||||
* Map classes to amounts of players playing as the classes.
|
||||
*/
|
||||
private void populateDistributionMap()
|
||||
{
|
||||
// Initialize the map
|
||||
for (String c : arena.classes)
|
||||
distribution.put(c,0);
|
||||
|
||||
public void add(String s) { log.add(s); }
|
||||
public void clear() { log.clear(); }
|
||||
// Count occurrences
|
||||
for (String c : arena.classMap.values())
|
||||
distribution.put(c,distribution.get(c) + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the data of the current session according to the logging type.
|
||||
*/
|
||||
public void saveSessionData()
|
||||
{
|
||||
/*
|
||||
* Call saveSessionData on the correct utility class
|
||||
*/
|
||||
//XML.saveSessionData(this, plugin);
|
||||
//CSV.saveSessionData(this, plugin);
|
||||
//YAML.saveSessionData(this, plugin);
|
||||
PlainText.saveSessionData(this);
|
||||
}
|
||||
|
||||
public void updateArenaTotals()
|
||||
{
|
||||
Totals.updateArenaTotals(this);
|
||||
PlainText.updateArenaTotals(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear maps.
|
||||
*/
|
||||
public void clearSessionData()
|
||||
{
|
||||
players.clear();
|
||||
distribution.clear();
|
||||
}
|
||||
|
||||
public Arena getArena() { return arena; }
|
||||
public Timestamp getStartTime() { return startTime; }
|
||||
public Timestamp getEndTime() { return endTime; }
|
||||
public String getDuration() { return MAUtils.getDuration(endTime.getTime() - startTime.getTime()); }
|
||||
public long getDurationLong() { return endTime.getTime() - startTime.getTime(); }
|
||||
public int getLastWave() { return lastWave; }
|
||||
|
||||
public void playerKill(Player p)
|
||||
{
|
||||
players.get(p).kills++;
|
||||
}
|
||||
|
||||
public void playerDamager(Player p, int damage)
|
||||
{
|
||||
players.get(p).dmgDone += damage;
|
||||
}
|
||||
|
||||
public void playerDamagee(Player p, int damage)
|
||||
{
|
||||
players.get(p).dmgTaken += damage;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ public class ArenaMaster
|
||||
{
|
||||
plugin = instance;
|
||||
config = plugin.getConfig();
|
||||
arenas = new LinkedList<Arena>();
|
||||
}
|
||||
|
||||
|
||||
@@ -225,17 +226,14 @@ public class ArenaMaster
|
||||
for (String configName : config.getKeys("arenas"))
|
||||
{
|
||||
String arenaPath = "arenas." + configName + ".";
|
||||
String worldName = config.getString(arenaPath + "settings.world");
|
||||
String worldName = config.getString(arenaPath + "settings.world", null);
|
||||
World world;
|
||||
if (worldName == null)
|
||||
if (worldName == null || worldName.equals(""))
|
||||
{
|
||||
System.out.println("[MobArena] ERROR! Could not find the world for arena '" + configName + "'. Using default world! Check the config-file!");
|
||||
world = Bukkit.getServer().getWorlds().get(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
world = Bukkit.getServer().getWorld(worldName);
|
||||
}
|
||||
else world = Bukkit.getServer().getWorld(worldName);
|
||||
|
||||
Arena arena = new Arena(MAUtils.nameConfigToArena(configName), world);
|
||||
arena.load(config);
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.garbagemule.MobArena;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ public class MACommands implements CommandExecutor
|
||||
COMMANDS.add("delclass"); // Delete a class
|
||||
COMMANDS.add("auto-generate"); // Auto-generate arena
|
||||
COMMANDS.add("auto-degenerate"); // Restore cuboid
|
||||
COMMANDS.add("lol");
|
||||
}
|
||||
private boolean meanAdmins, showingRegion;
|
||||
private Server server;
|
||||
@@ -115,6 +116,11 @@ public class MACommands implements CommandExecutor
|
||||
//
|
||||
////////////////////////////////////////////////////////////////*/
|
||||
|
||||
if (base.equals("spawn"))
|
||||
{
|
||||
p.getWorld().setSpawnLocation(p.getLocation().getBlockX(), p.getLocation().getBlockY() + 1, p.getLocation().getBlockZ());
|
||||
}
|
||||
|
||||
/*
|
||||
* Player join
|
||||
*/
|
||||
@@ -158,7 +164,7 @@ public class MACommands implements CommandExecutor
|
||||
error = MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_ALREADY_PLAYING));
|
||||
else if (!plugin.has(p, "mobarena.arenas." + arena.configName()))
|
||||
error = MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_ARENA_PERMISSION));
|
||||
else if (arena.playerLimit > 0 && arena.lobbyPlayers.size() >= arena.playerLimit)
|
||||
else if (arena.maxPlayers > 0 && arena.lobbyPlayers.size() >= arena.maxPlayers)
|
||||
error = MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_PLAYER_LIMIT_REACHED));
|
||||
else if (arena.joinDistance > 0 && !arena.inRegionRadius(p.getLocation(), arena.joinDistance))
|
||||
error = MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_TOO_FAR));
|
||||
@@ -182,12 +188,21 @@ public class MACommands implements CommandExecutor
|
||||
if (p.isInsideVehicle())
|
||||
p.leaveVehicle();
|
||||
|
||||
am.arenaMap.put(p,arena);
|
||||
// If player is in a bed, unbed!
|
||||
if (p.isSleeping())
|
||||
{
|
||||
p.kickPlayer("Banned for life... Nah, just don't join from a bed ;)");
|
||||
return true;
|
||||
}
|
||||
|
||||
//am.arenaMap.put(p,arena);
|
||||
arena.playerJoin(p, p.getLocation());
|
||||
|
||||
MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_PLAYER_JOINED));
|
||||
if (!arena.entryFee.isEmpty())
|
||||
MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_FEE_PAID, MAUtils.listToString(arena.entryFee, plugin)));
|
||||
if (arena.hasPaid.contains(p))
|
||||
arena.hasPaid.remove(p);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -217,7 +232,7 @@ public class MACommands implements CommandExecutor
|
||||
return true;
|
||||
}
|
||||
|
||||
Arena arena = am.arenaMap.remove(p);
|
||||
Arena arena = am.arenaMap.get(p);
|
||||
arena.playerLeave(p);
|
||||
MAUtils.tellPlayer(p, MAMessages.get(Msg.LEAVE_PLAYER_LEFT));
|
||||
return true;
|
||||
@@ -489,7 +504,6 @@ public class MACommands implements CommandExecutor
|
||||
return true;
|
||||
}
|
||||
|
||||
//if (arena.livePlayers.isEmpty())
|
||||
if (arena.arenaPlayers.isEmpty())
|
||||
{
|
||||
MAUtils.tellPlayer(sender, MAMessages.get(Msg.FORCE_END_EMPTY));
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Wolf;
|
||||
import org.bukkit.event.Event.Result;
|
||||
@@ -27,6 +28,7 @@ import org.bukkit.event.entity.EntityTargetEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
|
||||
import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
|
||||
import org.bukkit.event.player.PlayerAnimationEvent;
|
||||
import org.bukkit.event.player.PlayerBucketEmptyEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
@@ -253,7 +255,6 @@ public class MAListener implements ArenaListener
|
||||
return;
|
||||
|
||||
event.getDrops().clear();
|
||||
arena.waveMap.put(p, arena.spawnThread.wave - 1);
|
||||
arena.playerDeath(p);
|
||||
return;
|
||||
}
|
||||
@@ -264,7 +265,7 @@ public class MAListener implements ArenaListener
|
||||
EntityDamageByEntityEvent e2 = (e1 instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) e1 : null;
|
||||
Entity damager = (e2 != null) ? e2.getDamager() : null;
|
||||
|
||||
if (e2 != null && damager instanceof Player)
|
||||
if (damager instanceof Player)
|
||||
arena.playerKill((Player) damager);
|
||||
|
||||
event.getDrops().clear();
|
||||
@@ -275,70 +276,93 @@ public class MAListener implements ArenaListener
|
||||
|
||||
public void onEntityDamage(EntityDamageEvent event)
|
||||
{
|
||||
if (!arena.running) return;
|
||||
|
||||
EntityDamageByEntityEvent e = (event instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) event : null;
|
||||
Entity damager = (e != null) ? e.getDamager() : null;
|
||||
Entity damagee = event.getEntity();
|
||||
|
||||
// Damagee - Pet Wolf - cancel all damage.
|
||||
if (damagee instanceof Wolf && arena.pets.contains(damagee))
|
||||
{
|
||||
if (event.getCause() == DamageCause.FIRE_TICK)
|
||||
{
|
||||
damagee.setFireTicks(32768); // For mcMMO
|
||||
if (!arena.running) return;
|
||||
|
||||
EntityDamageByEntityEvent e = (event instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) event : null;
|
||||
Entity damager = (e != null) ? e.getDamager() : null;
|
||||
Entity damagee = event.getEntity();
|
||||
|
||||
// Pet wolf
|
||||
if (damagee instanceof Wolf && arena.pets.contains(damagee))
|
||||
{
|
||||
if (damager == null)
|
||||
{
|
||||
damagee.setFireTicks(32768);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
else if (damager instanceof Player)
|
||||
event.setCancelled(true);
|
||||
else
|
||||
event.setDamage(0);
|
||||
|
||||
return;
|
||||
}
|
||||
// Arena player
|
||||
else if (damagee instanceof Player)
|
||||
{
|
||||
if (arena.lobbyPlayers.contains(damagee))
|
||||
event.setCancelled(true);
|
||||
else if (!arena.arenaPlayers.contains(damagee))
|
||||
return;
|
||||
else if (!arena.detDamage && event.getCause() == DamageCause.BLOCK_EXPLOSION)
|
||||
event.setCancelled(true);
|
||||
}
|
||||
if (e != null && damager instanceof Player)
|
||||
else if (damager instanceof Player && !arena.pvp)
|
||||
{
|
||||
// if 'inLobby' fails, and 'not inArena' fails, 'inArena' is true
|
||||
event.setCancelled(true);
|
||||
|
||||
event.setDamage(0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Damager - Pet Wolf - lower damage
|
||||
if (e != null && damager instanceof Wolf && arena.pets.contains(damager))
|
||||
{
|
||||
event.setDamage(1);
|
||||
return;
|
||||
}
|
||||
|
||||
// Damagee & Damager - Player - cancel if pvp disabled
|
||||
if (damagee instanceof Player && damager instanceof Player)
|
||||
{
|
||||
if (arena.arenaPlayers.contains(damagee) && !arena.pvp)
|
||||
event.setCancelled(true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Damagee & Damager - Monsters - cancel if no monsterInfight
|
||||
if (e != null && arena.monsters.contains(damagee) && arena.monsters.contains(damager))
|
||||
{
|
||||
if (!arena.monsterInfight)
|
||||
event.setCancelled(true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Creeper detonations
|
||||
if (arena.inRegion(damagee.getLocation()))
|
||||
{
|
||||
if (!arena.detDamage || !(damagee instanceof Player) || !arena.arenaPlayers.contains((Player) damagee))
|
||||
return;
|
||||
|
||||
if (event.getCause() == DamageCause.BLOCK_EXPLOSION)
|
||||
event.setCancelled(true);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!event.isCancelled())
|
||||
arena.log.players.get((Player) damagee).dmgTaken += event.getDamage();
|
||||
}
|
||||
// Other LivingEntity
|
||||
else if (arena.monsters.contains(damagee))
|
||||
{
|
||||
if (damager instanceof Player)
|
||||
{
|
||||
if (!arena.arenaPlayers.contains(damager))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
arena.log.players.get((Player) damager).dmgDone += event.getDamage();
|
||||
arena.log.players.get((Player) damager).hits++;
|
||||
}
|
||||
else if (damager instanceof Wolf && arena.pets.contains(damager))
|
||||
{
|
||||
event.setDamage(1);
|
||||
arena.log.players.get((Player) ((Wolf) damager).getOwner()).dmgDone += event.getDamage();
|
||||
}
|
||||
else if (damager instanceof LivingEntity)
|
||||
{
|
||||
if (!arena.monsterInfight)
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onPlayerAnimation(PlayerAnimationEvent event)
|
||||
{
|
||||
if (!arena.running || !arena.arenaPlayers.contains(event.getPlayer()))
|
||||
return;
|
||||
|
||||
arena.log.players.get(event.getPlayer()).swings++;
|
||||
}
|
||||
|
||||
public void onPlayerDropItem(PlayerDropItemEvent event)
|
||||
{
|
||||
if (arena.running && arena.shareInArena) return;
|
||||
|
||||
Player p = event.getPlayer();
|
||||
if (p.getLocation().equals(arena.spectatorLoc))
|
||||
{
|
||||
event.getItemDrop().setItemStack(new ItemStack(1, 0));
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
if (!arena.arenaPlayers.contains(p) && !arena.lobbyPlayers.contains(p))
|
||||
return;
|
||||
|
||||
@@ -348,7 +372,6 @@ public class MAListener implements ArenaListener
|
||||
|
||||
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event)
|
||||
{
|
||||
//if (!readyPlayers.contains(event.getPlayer()) && !livePlayers.contains(event.getPlayer()))
|
||||
if (!arena.readyPlayers.contains(event.getPlayer()) && !arena.arenaPlayers.contains(event.getPlayer()))
|
||||
return;
|
||||
|
||||
@@ -492,7 +515,6 @@ public class MAListener implements ArenaListener
|
||||
|
||||
if (arena.running && arena.inRegion(to))
|
||||
{
|
||||
//MAUtils.tellPlayer(p, MAMessages.get(Msg.WARP_TO_ARENA));
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
@@ -502,7 +524,6 @@ public class MAListener implements ArenaListener
|
||||
{
|
||||
Player p = event.getPlayer();
|
||||
|
||||
//if (!livePlayers.contains(p))
|
||||
if (!arena.arenaPlayers.contains(p) && !arena.lobbyPlayers.contains(p))
|
||||
return;
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ public class MAMessages
|
||||
LOBBY_CLASS_PICKED,
|
||||
LOBBY_CLASS_RANDOM,
|
||||
LOBBY_CLASS_PERMISSION,
|
||||
LOBBY_NOT_ENOUGH_PLAYERS,
|
||||
LOBBY_PLAYER_READY,
|
||||
LOBBY_DROP_ITEM,
|
||||
LOBBY_PICK_CLASS,
|
||||
@@ -108,6 +109,7 @@ public class MAMessages
|
||||
defaults.put(Msg.LOBBY_DROP_ITEM, "No sharing allowed at this time!");
|
||||
defaults.put(Msg.LOBBY_PLAYER_READY, "You have been flagged as ready!");
|
||||
defaults.put(Msg.LOBBY_PICK_CLASS, "You must first pick a class!");
|
||||
defaults.put(Msg.LOBBY_NOT_ENOUGH_PLAYERS, "Not enough players to start. Need at least % players.");
|
||||
defaults.put(Msg.LOBBY_RIGHT_CLICK, "Punch the sign. Don't right-click.");
|
||||
defaults.put(Msg.LOBBY_CLASS_PICKED, "You have chosen % as your class!");
|
||||
defaults.put(Msg.LOBBY_CLASS_RANDOM, "You will get a random class on arena start.");
|
||||
@@ -127,7 +129,7 @@ public class MAMessages
|
||||
/**
|
||||
* Initializes the msgMap by reading from the announcements-file.
|
||||
*/
|
||||
public static void init(MobArena plugin, boolean update)
|
||||
public static void init(MobArena plugin)
|
||||
{
|
||||
// Use defaults in case of any errors.
|
||||
msgMap = defaults;
|
||||
@@ -184,11 +186,6 @@ public class MAMessages
|
||||
}
|
||||
}
|
||||
|
||||
public static void init(MobArena plugin)
|
||||
{
|
||||
init(plugin, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Grabs the announcement from the msgMap, and in case of
|
||||
* s not being null, replaces the % with s.
|
||||
@@ -217,6 +214,8 @@ public class MAMessages
|
||||
*/
|
||||
private static void process(String s)
|
||||
{
|
||||
if (s.endsWith("="))
|
||||
s += " ";
|
||||
// Split the string by the equals-sign.
|
||||
String[] split = s.split("=");
|
||||
if (split.length != 2)
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.garbagemule.MobArena;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerAnimationEvent;
|
||||
import org.bukkit.event.player.PlayerBucketEmptyEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
@@ -23,6 +24,13 @@ public class MAPlayerListener extends PlayerListener
|
||||
this.am = am;
|
||||
}
|
||||
|
||||
public void onPlayerAnimation(PlayerAnimationEvent event)
|
||||
{
|
||||
if (!am.enabled) return;
|
||||
for (Arena arena : am.arenas)
|
||||
arena.eventListener.onPlayerAnimation(event);
|
||||
}
|
||||
|
||||
public void onPlayerInteract(PlayerInteractEvent event)
|
||||
{
|
||||
if (!am.enabled) return;
|
||||
|
||||
@@ -7,6 +7,8 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Wolf;
|
||||
@@ -21,6 +23,10 @@ import org.bukkit.entity.CreatureType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import com.garbagemule.MobArena.MAMessages.Msg;
|
||||
import com.garbagemule.MobArena.util.WaveUtils;
|
||||
import com.garbagemule.MobArena.waves.RecurrentWave;
|
||||
import com.garbagemule.MobArena.waves.SingleWave;
|
||||
import com.garbagemule.MobArena.waves.Wave;
|
||||
|
||||
/**
|
||||
* Core class for handling wave spawning.
|
||||
@@ -30,8 +36,6 @@ import com.garbagemule.MobArena.MAMessages.Msg;
|
||||
* host chooses. It is possible to create default waves that consist of
|
||||
* only one type of monster, or ones that have no creepers, for example.
|
||||
*/
|
||||
// TODO: Allow custom special wave monsters.
|
||||
// TODO: Allow additional "default" waves.
|
||||
public class MASpawnThread implements Runnable
|
||||
{
|
||||
protected int wave, previousSize, taskId;
|
||||
@@ -42,6 +46,14 @@ public class MASpawnThread implements Runnable
|
||||
private MobArena plugin;
|
||||
private Arena arena;
|
||||
|
||||
// NEW WAVES
|
||||
/* Single waves are waves with a frequency of 0, and they only
|
||||
* spawn once. Their priority is infinity, meaning they will always
|
||||
* spawn instead of recurrent waves, if the wave numbers clash. */
|
||||
private Wave defaultWave;
|
||||
private TreeSet<SingleWave> singleWaves;
|
||||
private TreeSet<RecurrentWave> recurrentWaves;
|
||||
|
||||
public MASpawnThread(MobArena plugin, Arena arena)
|
||||
{
|
||||
this.plugin = plugin;
|
||||
@@ -51,7 +63,6 @@ public class MASpawnThread implements Runnable
|
||||
|
||||
taskId = -32768;
|
||||
|
||||
//noOfPlayers = arena.livePlayers.size();
|
||||
noOfPlayers = arena.arenaPlayers.size();
|
||||
wave = 1;
|
||||
random = new Random();
|
||||
@@ -63,6 +74,7 @@ public class MASpawnThread implements Runnable
|
||||
dSpiders = dSkeletons + arena.distDefault.get("spiders");
|
||||
dCreepers = dSpiders + arena.distDefault.get("creepers");
|
||||
dWolves = dCreepers + arena.distDefault.get("wolves");
|
||||
if (dWolves < 1) { dZombies = 1; dSkeletons = 2; dSpiders = 3; dCreepers = 4; dWolves = 5; }
|
||||
|
||||
dPoweredCreepers = arena.distSpecial.get("powered-creepers");
|
||||
dPigZombies = dPoweredCreepers + arena.distSpecial.get("zombie-pigmen");
|
||||
@@ -71,6 +83,98 @@ public class MASpawnThread implements Runnable
|
||||
dAngryWolves = dMonsters + arena.distSpecial.get("angry-wolves");
|
||||
dGiants = dAngryWolves + arena.distSpecial.get("giants");
|
||||
dGhasts = dGiants + arena.distSpecial.get("ghasts");
|
||||
if (dGhasts < 1) { dPoweredCreepers = 1; dPigZombies = 2; dSlimes = 3; dMonsters = 4; dAngryWolves = 5; dGiants = 5; dGhasts = 5; }
|
||||
}
|
||||
|
||||
public void run2()
|
||||
{
|
||||
// Clear out all dead monsters in the monster set.
|
||||
removeDeadMonsters();
|
||||
|
||||
// If there are no players in the arena, return.
|
||||
if (arena.arenaPlayers.isEmpty())
|
||||
return;
|
||||
|
||||
// Check if wave needs to be cleared first. If so, return!
|
||||
if (arena.waveClear && wave > 1 && !arena.monsters.isEmpty())
|
||||
return;
|
||||
|
||||
// Grant rewards (if any) for this wave
|
||||
grantRewards(wave);
|
||||
|
||||
// Detonate creepers if needed
|
||||
detonateCreepers(arena.detCreepers);
|
||||
|
||||
// Find the wave to spawn
|
||||
spawnWave(wave);
|
||||
|
||||
wave++;
|
||||
if (arena.monsters.isEmpty())
|
||||
arena.resetIdleTimer();
|
||||
}
|
||||
|
||||
private void removeDeadMonsters()
|
||||
{
|
||||
List<Entity> tmp = new LinkedList<Entity>(arena.monsters);
|
||||
for (Entity e : tmp)
|
||||
if (e.isDead())
|
||||
arena.monsters.remove(e);
|
||||
}
|
||||
|
||||
private void grantRewards(int wave)
|
||||
{
|
||||
for (Map.Entry<Integer,List<ItemStack>> entry : arena.everyWaveMap.entrySet())
|
||||
if (wave % entry.getKey() == 0)
|
||||
addReward(entry.getValue());
|
||||
|
||||
if (arena.afterWaveMap.containsKey(wave))
|
||||
addReward(arena.afterWaveMap.get(wave));
|
||||
}
|
||||
|
||||
private void spawnWave(int wave)
|
||||
{
|
||||
Wave w = null;
|
||||
|
||||
// Check the first element of the single waves.
|
||||
if (!singleWaves.isEmpty() && singleWaves.first().matches(wave))
|
||||
{
|
||||
w = singleWaves.pollFirst();
|
||||
//singleWaves.pollFirst().spawn(wave, arena.spawnpoints.values());
|
||||
//return;
|
||||
}
|
||||
else
|
||||
{
|
||||
SortedSet<Wave> matches = getMatchingRecurrentWaves(wave);
|
||||
|
||||
if (matches.isEmpty())
|
||||
w = defaultWave;
|
||||
else
|
||||
w = matches.last();
|
||||
}
|
||||
|
||||
w.spawn(wave, arena.spawnpoints.values());
|
||||
/*
|
||||
// Otherwise, check the recurrent waves.
|
||||
SortedSet<Wave> matches = getMatchingRecurrentWaves(wave);
|
||||
|
||||
if (matches.isEmpty())
|
||||
defaultWave.spawn(wave, arena.spawnpoints.values());
|
||||
else
|
||||
matches.last().spawn(wave, arena.spawnpoints.values());
|
||||
*/
|
||||
}
|
||||
|
||||
private SortedSet<Wave> getMatchingRecurrentWaves(int wave)
|
||||
{
|
||||
TreeSet<Wave> result = new TreeSet<Wave>(WaveUtils.getRecurrentComparator());
|
||||
|
||||
for (Wave w : recurrentWaves)
|
||||
{
|
||||
if (w.matches(wave))
|
||||
result.add(w);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void run()
|
||||
@@ -130,14 +234,16 @@ public class MASpawnThread implements Runnable
|
||||
*/
|
||||
private void addReward(List<ItemStack> rewards)
|
||||
{
|
||||
//for (Player p : arena.livePlayers)
|
||||
for (Player p : arena.arenaPlayers)
|
||||
{
|
||||
if (arena.rewardMap.get(p) == null)
|
||||
if (arena.log.players.get(p) == null)
|
||||
continue;
|
||||
/*if (arena.rewardMap.get(p) == null)
|
||||
continue;*/
|
||||
|
||||
ItemStack reward = MAUtils.getRandomReward(rewards);
|
||||
arena.rewardMap.get(p).add(reward);
|
||||
arena.log.players.get(p).rewards.add(reward);
|
||||
//arena.rewardMap.get(p).add(reward);
|
||||
|
||||
if (reward == null)
|
||||
{
|
||||
|
||||
@@ -885,12 +885,17 @@ public class MAUtils
|
||||
|
||||
// ///////////////////////////////////////////////////////////////////// */
|
||||
|
||||
public static void error(String msg)
|
||||
{
|
||||
System.out.println("[MobArena] ERROR! " + msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a message to a player.
|
||||
*/
|
||||
public static boolean tellPlayer(CommandSender p, String msg)
|
||||
{
|
||||
if (p == null)
|
||||
if (p == null || msg.equals(" "))
|
||||
return false;
|
||||
|
||||
p.sendMessage(ChatColor.GREEN + "[MobArena] " + ChatColor.WHITE + msg);
|
||||
@@ -1045,6 +1050,7 @@ public class MAUtils
|
||||
return buffy.toString().substring(0, buffy.length() - trimLength);
|
||||
}
|
||||
public static <E> String listToString(List<E> list, MobArena plugin) { return listToString(list, true, plugin); }
|
||||
public static <E> String listToString(List<E> list) { return listToString(list, true, (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena")); }
|
||||
|
||||
/**
|
||||
* Returns a String-list version of a comma-separated list.
|
||||
@@ -1162,27 +1168,16 @@ public class MAUtils
|
||||
long hrs = ((seconds - secs) - (mins * 60)) / 60 / 60;
|
||||
return hrs + ":" + ((mins < 10) ? "0" + mins : mins) + ":" + ((secs < 10) ? "0" + secs : secs);
|
||||
}
|
||||
|
||||
public static String padRight(String s, int length) { return padRight(s, length, ' '); }
|
||||
public static String padRight(String s, int length, char pad)
|
||||
{
|
||||
StringBuffer buffy = new StringBuffer();
|
||||
buffy.append(s);
|
||||
for (int i = s.length(); i < length; i++)
|
||||
buffy.append(pad);
|
||||
return buffy.toString();
|
||||
}
|
||||
|
||||
public static String padLeft(String s, int length) { return padLeft(s, length, ' '); }
|
||||
public static String padLeft(String s, int length, char pad)
|
||||
{
|
||||
StringBuffer buffy = new StringBuffer();
|
||||
for (int i = 0; i < length - s.length(); i++)
|
||||
buffy.append(pad);
|
||||
buffy.append(s);
|
||||
return buffy.toString();
|
||||
}
|
||||
|
||||
public static long parseDuration(String duration)
|
||||
{
|
||||
String[] elements = duration.split(":");
|
||||
long hrs = Long.parseLong(elements[0]) * 60 * 60;
|
||||
long mins = Long.parseLong(elements[1]) * 60;
|
||||
long secs = Long.parseLong(elements[2]);
|
||||
|
||||
return (hrs + mins + secs) * 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stand back, I'm going to try science!
|
||||
|
||||
@@ -16,6 +16,7 @@ import org.bukkit.util.config.Configuration;
|
||||
|
||||
import com.nijiko.permissions.PermissionHandler;
|
||||
import com.nijikokun.bukkit.Permissions.Permissions;
|
||||
import com.garbagemule.MobArena.util.FileUtils;
|
||||
import com.garbagemule.register.payment.Method;
|
||||
import com.garbagemule.register.payment.Methods;
|
||||
|
||||
@@ -36,36 +37,84 @@ public class MobArena extends JavaPlugin
|
||||
protected Method Method;
|
||||
|
||||
// Global variables
|
||||
protected static final double MIN_PLAYER_DISTANCE = 256.0;
|
||||
protected static final int ECONOMY_MONEY_ID = -29;
|
||||
public static PluginDescriptionFile desc;
|
||||
public static File dir, arenaDir;
|
||||
public static final double MIN_PLAYER_DISTANCE = 256.0;
|
||||
public static final int ECONOMY_MONEY_ID = -29;
|
||||
|
||||
public void onEnable()
|
||||
{
|
||||
PluginDescriptionFile pdfFile = this.getDescription();
|
||||
{
|
||||
// Description file and data folder
|
||||
desc = getDescription();
|
||||
dir = getDataFolder();
|
||||
arenaDir = new File(dir, "arenas");
|
||||
if (!dir.exists()) dir.mkdir();
|
||||
//if (!arenaDir.exists()) arenaDir.mkdir();
|
||||
|
||||
// Config, messages and ArenaMaster initialization
|
||||
// Create default files and initialize config-file
|
||||
FileUtils.extractDefaults("config.yml", "announcements.properties");
|
||||
loadConfig();
|
||||
MAMessages.init(this);
|
||||
|
||||
// Download external libraries if needed.
|
||||
FileUtils.fetchLibs(config);
|
||||
|
||||
// Set up permissions and economy
|
||||
setupPermissions();
|
||||
setupRegister();
|
||||
|
||||
// Set up the ArenaMaster and the announcements
|
||||
am = new ArenaMaster(this);
|
||||
am.initialize();
|
||||
MAMessages.init(this);
|
||||
|
||||
// Permissions
|
||||
setupPermissions();
|
||||
// Register event listeners
|
||||
registerListeners();
|
||||
|
||||
// Economy
|
||||
Methods = new Methods();
|
||||
if (!Methods.hasMethod() && Methods.setMethod(this))
|
||||
// Announce enable!
|
||||
System.out.println("[MobArena] v" + desc.getVersion() + " enabled.");
|
||||
}
|
||||
|
||||
public void onDisable()
|
||||
{
|
||||
// TODO: Re-implement this!
|
||||
/*
|
||||
// Force all arenas to end.
|
||||
for (Arena arena : am.arenas)
|
||||
arena.forceEnd();
|
||||
am.arenaMap.clear();
|
||||
|
||||
// Permissions & Economy
|
||||
permissionHandler = null;
|
||||
if (Methods != null && Methods.hasMethod())
|
||||
{
|
||||
Method = Methods.getMethod();
|
||||
System.out.println("[MobArena] Payment method found (" + Method.getName() + " version: " + Method.getVersion() + ")");
|
||||
Methods = null;
|
||||
System.out.println("[MobArena] Payment method was disabled. No longer accepting payments.");
|
||||
}
|
||||
*/
|
||||
System.out.println("[MobArena] disabled.");
|
||||
}
|
||||
|
||||
private void loadConfig()
|
||||
{
|
||||
File file = new File(dir, "config.yml");
|
||||
if (!file.exists())
|
||||
{
|
||||
System.out.println("[MobArena] ERROR! Config-file could not be created!");
|
||||
return;
|
||||
}
|
||||
|
||||
config = new Configuration(file);
|
||||
config.load();
|
||||
}
|
||||
|
||||
private void registerListeners()
|
||||
{
|
||||
// Bind the /ma, /marena, and /mobarena commands to MACommands.
|
||||
MACommands commandExecutor = new MACommands(this, am);
|
||||
getCommand("ma").setExecutor(commandExecutor);
|
||||
getCommand("marena").setExecutor(commandExecutor);
|
||||
getCommand("mobarena").setExecutor(commandExecutor);
|
||||
|
||||
getCommand("ma").setExecutor(commandExecutor);
|
||||
getCommand("marena").setExecutor(commandExecutor);
|
||||
getCommand("mobarena").setExecutor(commandExecutor);
|
||||
|
||||
// Create event listeners.
|
||||
PluginManager pm = getServer().getPluginManager();
|
||||
PlayerListener playerListener = new MAPlayerListener(this, am);
|
||||
@@ -80,6 +129,7 @@ public class MobArena extends JavaPlugin
|
||||
pm.registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_KICK, playerListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_ANIMATION, playerListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.Highest, this);
|
||||
pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Priority.Highest, this);
|
||||
pm.registerEvent(Event.Type.ENTITY_DAMAGE, entityListener, Priority.High, this); // mcMMO is "Highest"
|
||||
@@ -90,79 +140,6 @@ public class MobArena extends JavaPlugin
|
||||
pm.registerEvent(Event.Type.ENTITY_TARGET, entityListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.CREATURE_SPAWN, entityListener, Priority.Highest, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, playerListener, Priority.Monitor, this);
|
||||
|
||||
System.out.println("[MobArena] v" + pdfFile.getVersion() + " enabled." );
|
||||
}
|
||||
|
||||
public void onDisable()
|
||||
{
|
||||
// Force all arenas to end.
|
||||
for (Arena arena : am.arenas)
|
||||
arena.forceEnd();
|
||||
am.arenaMap.clear();
|
||||
|
||||
// Permissions & Economy
|
||||
permissionHandler = null;
|
||||
if (Methods != null && Methods.hasMethod())
|
||||
{
|
||||
Methods = null;
|
||||
System.out.println("[MobArena] Payment method was disabled. No longer accepting payments.");
|
||||
}
|
||||
|
||||
System.out.println("[MobArena] disabled.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the config-file and initialize the Configuration object.
|
||||
*/
|
||||
private void loadConfig()
|
||||
{
|
||||
File file = new File(this.getDataFolder(), "config.yml");
|
||||
if (!file.exists())
|
||||
{
|
||||
try
|
||||
{
|
||||
this.getDataFolder().mkdir();
|
||||
file.createNewFile();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
}
|
||||
// TODO: Remove in v1.0
|
||||
else
|
||||
{
|
||||
Configuration tmp = new Configuration(file);
|
||||
tmp.load();
|
||||
if (tmp.getKeys("global-settings") == null)
|
||||
{
|
||||
file.renameTo(new File(this.getDataFolder(), "config_OLD.yml"));
|
||||
file = new File(this.getDataFolder(), "config.yml");
|
||||
try
|
||||
{
|
||||
this.getDataFolder().mkdir();
|
||||
file.createNewFile();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
config = new Configuration(file);
|
||||
config.load();
|
||||
fixConfig();
|
||||
config.setHeader("# MobArena Configuration-file\r\n# Please go to https://github.com/garbagemule/MobArena/wiki/Installing-MobArena for more details.");
|
||||
config.save();
|
||||
}
|
||||
}
|
||||
|
||||
config = new Configuration(file);
|
||||
config.load();
|
||||
config.setHeader("# MobArena Configuration-file\r\n# Please go to https://github.com/garbagemule/MobArena/wiki/Installing-MobArena for more details.");
|
||||
config.save();
|
||||
}
|
||||
|
||||
// Permissions stuff
|
||||
@@ -188,89 +165,17 @@ public class MobArena extends JavaPlugin
|
||||
permissionHandler = ((Permissions) permissionsPlugin).getHandler();
|
||||
}
|
||||
|
||||
private void setupRegister()
|
||||
{
|
||||
Methods = new Methods();
|
||||
if (!Methods.hasMethod() && Methods.setMethod(this))
|
||||
{
|
||||
Method = Methods.getMethod();
|
||||
System.out.println("[MobArena] Payment method found (" + Method.getName() + " version: " + Method.getVersion() + ")");
|
||||
}
|
||||
}
|
||||
|
||||
public Configuration getConfig() { return config; }
|
||||
public ArenaMaster getAM() { return am; } // More convenient.
|
||||
public ArenaMaster getArenaMaster() { return am; }
|
||||
|
||||
// TODO: Remove in v1.0
|
||||
private void fixConfig()
|
||||
{
|
||||
// If global-settings is sorted, don't do anything.
|
||||
if (config.getKeys("global-settings") != null)
|
||||
return;
|
||||
|
||||
File oldFile = new File(this.getDataFolder(), "config_OLD.yml");
|
||||
if (!oldFile.exists())
|
||||
return;
|
||||
|
||||
System.out.println("[MobArena] Config-file appears to be old. Trying to fix it...");
|
||||
|
||||
Configuration oldConfig = new Configuration(oldFile);
|
||||
oldConfig.load();
|
||||
|
||||
config.setProperty("global-settings.enabled", true);
|
||||
config.save();
|
||||
config.load();
|
||||
config.setProperty("global-settings.update-notification", true);
|
||||
config.save();
|
||||
config.load();
|
||||
|
||||
// Copy classes
|
||||
for (String s : oldConfig.getKeys("classes"))
|
||||
{
|
||||
config.setProperty("classes." + s + ".items", oldConfig.getString("classes." + s + ".items"));
|
||||
config.setProperty("classes." + s + ".armor", oldConfig.getString("classes." + s + ".armor"));
|
||||
}
|
||||
config.save();
|
||||
|
||||
// Make the default arena node.
|
||||
config.setProperty("arenas.default.settings.enabled", true);
|
||||
config.save();
|
||||
config.load();
|
||||
config.setProperty("arenas.default.settings.world", oldConfig.getString("settings.world"));
|
||||
config.save();
|
||||
config.load();
|
||||
|
||||
// Copy the coords.
|
||||
for (String s : oldConfig.getKeys("coords"))
|
||||
{
|
||||
if (s.equals("spawnpoints"))
|
||||
continue;
|
||||
|
||||
StringBuffer buffy = new StringBuffer();
|
||||
buffy.append(oldConfig.getString("coords." + s + ".x"));
|
||||
buffy.append(",");
|
||||
buffy.append(oldConfig.getString("coords." + s + ".y"));
|
||||
buffy.append(",");
|
||||
buffy.append(oldConfig.getString("coords." + s + ".z"));
|
||||
buffy.append(",");
|
||||
buffy.append(oldConfig.getString("coords." + s + ".yaw"));
|
||||
buffy.append(",");
|
||||
buffy.append(oldConfig.getString("coords." + s + ".pitch"));
|
||||
|
||||
config.setProperty("arenas.default.coords." + s, buffy.toString());
|
||||
}
|
||||
config.save();
|
||||
config.load();
|
||||
|
||||
for (String s : oldConfig.getKeys("coords.spawnpoints"))
|
||||
{
|
||||
StringBuffer buffy = new StringBuffer();
|
||||
buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".x"));
|
||||
buffy.append(",");
|
||||
buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".y"));
|
||||
buffy.append(",");
|
||||
buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".z"));
|
||||
buffy.append(",");
|
||||
buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".yaw"));
|
||||
buffy.append(",");
|
||||
buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".pitch"));
|
||||
|
||||
config.setProperty("arenas.default.coords.spawnpoints." + s, buffy.toString());
|
||||
}
|
||||
config.save();
|
||||
config.load();
|
||||
|
||||
System.out.println("[MobArena] Updated the config-file!");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user