mirror of
https://github.com/garbagemule/MobArena.git
synced 2024-11-26 04:25:21 +01:00
v0.90 - A bunch of bug-fixes, revamped config-file
This commit is contained in:
parent
0bc28de8d3
commit
aee63b2463
BIN
MobArena.jar
BIN
MobArena.jar
Binary file not shown.
@ -1,6 +1,6 @@
|
||||
name: MobArena
|
||||
main: com.garbagemule.MobArena.MobArena
|
||||
version: 0.89.2
|
||||
version: 0.90
|
||||
commands:
|
||||
ma:
|
||||
description: Base command for MobArena
|
||||
|
@ -3,19 +3,23 @@ package com.garbagemule.MobArena;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Item;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Slime;
|
||||
import org.bukkit.util.config.Configuration;
|
||||
|
||||
public class ArenaManager
|
||||
@ -31,7 +35,9 @@ public class ArenaManager
|
||||
protected static boolean isSetup = false;
|
||||
protected static boolean isEnabled = true;
|
||||
protected static boolean isProtected = true;
|
||||
protected static boolean checkUpdates = true;
|
||||
protected static int spawnTaskId = -1;
|
||||
protected static int waveDelay, waveInterval, specialModulo, repairDelay;
|
||||
protected static boolean checkUpdates, lightning;
|
||||
|
||||
// Location variables for the arena region.
|
||||
protected static Location p1 = null;
|
||||
@ -46,13 +52,13 @@ public class ArenaManager
|
||||
protected static int dPoweredCreepers, dPigZombies, dSlimes, dMonsters,
|
||||
dAngryWolves, dGiants, dGhasts;
|
||||
|
||||
// Set and Maps for storing players, their locations, items, armor, etc.
|
||||
// Sets and Maps for storing players, their locations, and their rewards.
|
||||
protected static Set<Player> playerSet = new HashSet<Player>();
|
||||
protected static Set<Player> readySet = new HashSet<Player>();
|
||||
protected static Map<Player,String> rewardMap = new HashMap<Player,String>();
|
||||
protected static Map<Player,Location> locationMap = new HashMap<Player,Location>();
|
||||
|
||||
// Maps for storing class items and armor.
|
||||
// Maps for storing player classes, class items and armor.
|
||||
protected static List<String> classes = new ArrayList<String>();
|
||||
protected static Map<Player,String> classMap = new HashMap<Player,String>();
|
||||
protected static Map<String,String> classItemMap = new HashMap<String,String>();
|
||||
@ -65,7 +71,6 @@ public class ArenaManager
|
||||
// Entities, blocks and items on MobArena floor.
|
||||
protected static Set<LivingEntity> monsterSet = new HashSet<LivingEntity>();
|
||||
protected static Set<Block> blockSet = new HashSet<Block>();
|
||||
protected static Set<Item> dropSet = new HashSet<Item>();
|
||||
|
||||
|
||||
|
||||
@ -88,6 +93,8 @@ public class ArenaManager
|
||||
plugin = instance;
|
||||
server = plugin.getServer();
|
||||
world = MAUtils.getWorld();
|
||||
lightning = MAUtils.getBoolean("settings.lightning", true);
|
||||
repairDelay = MAUtils.getInt("settings.repairdelay", 5);
|
||||
|
||||
// Class list and maps.
|
||||
classes = MAUtils.getClasses();
|
||||
@ -95,6 +102,9 @@ public class ArenaManager
|
||||
classArmorMap = MAUtils.getClassItems("armor");
|
||||
|
||||
// Waves and rewards.
|
||||
waveDelay = MAUtils.getInt("settings.firstwavedelay", 5) * 20;
|
||||
waveInterval = MAUtils.getInt("settings.waveinterval", 20) * 20;
|
||||
specialModulo = MAUtils.getInt("settings.specialmodulo", 4);
|
||||
everyWaveMap = MAUtils.getWaveMap("every");
|
||||
afterWaveMap = MAUtils.getWaveMap("after");
|
||||
|
||||
@ -121,7 +131,7 @@ public class ArenaManager
|
||||
p1 = MAUtils.getCoords("p1");
|
||||
p2 = MAUtils.getCoords("p2");
|
||||
spawnpoints = MAUtils.getSpawnPoints();
|
||||
checkUpdates = MAUtils.getUpdateNotification();
|
||||
checkUpdates = MAUtils.getBoolean("settings.updatenotification", true);
|
||||
|
||||
// Set the boolean if all variables are valid.
|
||||
ArenaManager.isSetup = MAUtils.verifyData();
|
||||
@ -149,6 +159,7 @@ public class ArenaManager
|
||||
public static void startArena()
|
||||
{
|
||||
isRunning = true;
|
||||
readySet.clear();
|
||||
|
||||
for (Player p : playerSet)
|
||||
{
|
||||
@ -157,7 +168,7 @@ public class ArenaManager
|
||||
}
|
||||
|
||||
MASpawnThread thread = new MASpawnThread();
|
||||
server.getScheduler().scheduleSyncRepeatingTask(plugin,thread,100,400);
|
||||
spawnTaskId = server.getScheduler().scheduleSyncRepeatingTask(plugin,thread,(long)waveDelay,(long)waveInterval);
|
||||
|
||||
tellAll("Let the slaughter begin!");
|
||||
}
|
||||
@ -170,10 +181,11 @@ public class ArenaManager
|
||||
public static void endArena()
|
||||
{
|
||||
isRunning = false;
|
||||
server.getScheduler().cancelTasks(plugin);
|
||||
server.getScheduler().cancelTask(spawnTaskId);
|
||||
|
||||
killMonsters();
|
||||
clearBlocks();
|
||||
clearDrops();
|
||||
clearEntities();
|
||||
giveRewards();
|
||||
|
||||
// TO-DO: Fix this, maybe add a Set<Player> dead
|
||||
@ -204,7 +216,7 @@ public class ArenaManager
|
||||
}
|
||||
if (isRunning)
|
||||
{
|
||||
tellPlayer(p, "Arena in progress. Type /marena spectate to watch.");
|
||||
tellPlayer(p, "Arena in progress. Type /ma spec to watch.");
|
||||
return;
|
||||
}
|
||||
if (!MAUtils.hasEmptyInventory(p))
|
||||
@ -238,24 +250,21 @@ public class ArenaManager
|
||||
return;
|
||||
}
|
||||
|
||||
if (playerSet.contains(p))
|
||||
{
|
||||
playerSet.remove(p);
|
||||
MAUtils.clearInventory(p);
|
||||
}
|
||||
|
||||
//if (readySet.contains(p))
|
||||
// This must occur before playerSet.remove(p) to avoid teleport block.
|
||||
p.teleport(locationMap.get(p));
|
||||
locationMap.remove(p);
|
||||
readySet.remove(p);
|
||||
|
||||
//if (classMap.keySet().contains(p))
|
||||
classMap.remove(p);
|
||||
|
||||
// This must occur after playerSet.remove(p) to avoid teleport block.
|
||||
p.teleport(locationMap.remove(p));
|
||||
if (playerSet.remove(p))
|
||||
MAUtils.clearInventory(p);
|
||||
|
||||
if (isRunning && playerSet.isEmpty())
|
||||
endArena();
|
||||
|
||||
if (!readySet.isEmpty() && readySet.equals(playerSet))
|
||||
startArena();
|
||||
|
||||
tellPlayer(p, "You left the arena. Thanks for playing!");
|
||||
}
|
||||
|
||||
@ -267,11 +276,8 @@ public class ArenaManager
|
||||
readySet.add(p);
|
||||
|
||||
if (readySet.equals(playerSet))
|
||||
{
|
||||
readySet.clear();
|
||||
startArena();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a dead player from the arena session.
|
||||
@ -360,6 +366,57 @@ public class ArenaManager
|
||||
tellPlayer(p, "Not ready: " + list.substring(0, list.length() - 2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Forcefully starts the arena, causing all players in the
|
||||
* playerSet who aren't ready to leave, and starting the
|
||||
* arena for everyone else.
|
||||
*/
|
||||
public static void forceStart(Player p)
|
||||
{
|
||||
if (ArenaManager.isRunning)
|
||||
{
|
||||
ArenaManager.tellPlayer(p, "Arena has already started.");
|
||||
return;
|
||||
}
|
||||
if (ArenaManager.readySet.isEmpty())
|
||||
{
|
||||
ArenaManager.tellPlayer(p, "Can't force start, no players are ready.");
|
||||
return;
|
||||
}
|
||||
|
||||
Iterator<Player> iterator = ArenaManager.playerSet.iterator();
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
Player player = iterator.next();
|
||||
if (!ArenaManager.readySet.contains(player))
|
||||
ArenaManager.playerLeave(player);
|
||||
}
|
||||
|
||||
ArenaManager.tellPlayer(p, "Forced arena start.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Forcefully ends the arena, causing all players to leave and
|
||||
* all relevant sets and maps to be cleared.
|
||||
*/
|
||||
public static void forceEnd(Player p)
|
||||
{
|
||||
if (ArenaManager.playerSet.isEmpty())
|
||||
{
|
||||
ArenaManager.tellPlayer(p, "No one is in the arena.");
|
||||
return;
|
||||
}
|
||||
|
||||
Iterator<Player> iterator = ArenaManager.playerSet.iterator();
|
||||
while (iterator.hasNext())
|
||||
ArenaManager.playerLeave(iterator.next());
|
||||
|
||||
// Just for good measure.
|
||||
endArena();
|
||||
|
||||
ArenaManager.tellPlayer(p, "Forced arena end.");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ///////////////////////////////////////////////////////////////////// //
|
||||
@ -389,24 +446,28 @@ public class ArenaManager
|
||||
{
|
||||
// Remove all blocks, then clear the Set.
|
||||
for (Block b : blockSet)
|
||||
{
|
||||
b.setType(Material.AIR);
|
||||
}
|
||||
|
||||
blockSet.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all items on the arena floor.
|
||||
* Removes all items and slimes in the arena region.
|
||||
*/
|
||||
public static void clearDrops()
|
||||
public static void clearEntities()
|
||||
{
|
||||
// Remove all blocks, then clear the Set.
|
||||
for (Item i : dropSet)
|
||||
{
|
||||
i.remove();
|
||||
}
|
||||
Chunk c1 = world.getChunkAt(p1);
|
||||
Chunk c2 = world.getChunkAt(p2);
|
||||
|
||||
dropSet.clear();
|
||||
/* Yes, ugly nesting, but it's necessary. This bit
|
||||
* removes all the entities in the arena region without
|
||||
* bloatfully iterating through all entities in the
|
||||
* world. Much faster on large servers especially. */
|
||||
for (int i = c1.getX(); i <= c2.getX(); i++)
|
||||
for (int j = c1.getZ(); j <= c2.getZ(); j++)
|
||||
for (Entity e : world.getChunkAt(i,j).getEntities())
|
||||
if ((e instanceof Item) || (e instanceof Slime))
|
||||
e.remove();
|
||||
}
|
||||
|
||||
|
||||
@ -468,6 +529,9 @@ public class ArenaManager
|
||||
*/
|
||||
public static void tellPlayer(Player p, String msg)
|
||||
{
|
||||
if (p == null)
|
||||
return;
|
||||
|
||||
p.sendMessage(ChatColor.GREEN + "[MobArena] " + ChatColor.WHITE + msg);
|
||||
}
|
||||
|
||||
@ -476,9 +540,14 @@ public class ArenaManager
|
||||
*/
|
||||
public static void tellAll(String msg)
|
||||
{
|
||||
for (Player p : playerSet)
|
||||
{
|
||||
tellPlayer(p, msg);
|
||||
}
|
||||
Chunk c1 = world.getChunkAt(p1);
|
||||
Chunk c2 = world.getChunkAt(p2);
|
||||
|
||||
for (int i = c1.getX(); i <= c2.getX(); i++)
|
||||
for (int j = c1.getZ(); j <= c2.getZ(); j++)
|
||||
for (Entity p : world.getChunkAt(i,j).getEntities())
|
||||
if (p instanceof Player)
|
||||
tellPlayer((Player)p, msg);
|
||||
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@ import org.bukkit.World;
|
||||
* NOTE: I (garbagemule) DID NOT WRITE THIS CLASS (notice the author below)
|
||||
* @author creadri
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class EntityPosition implements Serializable{
|
||||
private double x;
|
||||
private double y;
|
||||
|
@ -5,7 +5,7 @@ import org.bukkit.block.Block;
|
||||
import org.bukkit.event.block.BlockListener;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.block.BlockDamageEvent;
|
||||
//import org.bukkit.event.block.BlockDamageEvent;
|
||||
|
||||
/**
|
||||
* This listener serves as a protection class. Blocks within
|
||||
@ -16,13 +16,11 @@ import org.bukkit.event.block.BlockDamageEvent;
|
||||
*/
|
||||
public class MABlockListener extends BlockListener
|
||||
{
|
||||
private MobArena plugin;
|
||||
|
||||
public MABlockListener(MobArena instance)
|
||||
{
|
||||
plugin = instance;
|
||||
}
|
||||
|
||||
/* Removed for testing purposes.
|
||||
public void onBlockDamage(BlockDamageEvent event)
|
||||
{
|
||||
if (!ArenaManager.isSetup || !ArenaManager.isProtected)
|
||||
@ -33,10 +31,16 @@ public class MABlockListener extends BlockListener
|
||||
if (ArenaManager.blockSet.contains(b))
|
||||
return;
|
||||
|
||||
System.out.println("This is block damage.");
|
||||
|
||||
if (MAUtils.inRegion(b.getLocation()))
|
||||
event.setCancelled(true);
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Prevents blocks from breaking if block protection is on.
|
||||
*/
|
||||
public void onBlockBreak(BlockBreakEvent event)
|
||||
{
|
||||
if (!ArenaManager.isSetup || !ArenaManager.isProtected)
|
||||
@ -44,13 +48,20 @@ public class MABlockListener extends BlockListener
|
||||
|
||||
Block b = event.getBlock();
|
||||
|
||||
if (ArenaManager.blockSet.contains(b))
|
||||
if (ArenaManager.blockSet.remove(b) || b.getType() == Material.TNT)
|
||||
return;
|
||||
|
||||
System.out.println("This is block break.");
|
||||
|
||||
if (MAUtils.inRegion(b.getLocation()))
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds player-placed blocks to a set for removal and item
|
||||
* drop purposes. If the block is placed within the arena
|
||||
* region, cancel the event if protection is on.
|
||||
*/
|
||||
public void onBlockPlace(BlockPlaceEvent event)
|
||||
{
|
||||
if (!ArenaManager.isSetup || !ArenaManager.isProtected)
|
||||
@ -58,15 +69,21 @@ public class MABlockListener extends BlockListener
|
||||
|
||||
Block b = event.getBlock();
|
||||
|
||||
if (MAUtils.inRegion(b.getLocation()))
|
||||
{
|
||||
if (!MAUtils.inRegion(b.getLocation()))
|
||||
return;
|
||||
|
||||
if (ArenaManager.isRunning && ArenaManager.playerSet.contains(event.getPlayer()))
|
||||
{
|
||||
ArenaManager.blockSet.add(b);
|
||||
Material type = b.getType();
|
||||
|
||||
// Make sure to add the top parts of doors.
|
||||
if (type == Material.WOODEN_DOOR || type == Material.IRON_DOOR_BLOCK)
|
||||
ArenaManager.blockSet.add(b.getRelative(0,1,0));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,16 +1,11 @@
|
||||
package com.garbagemule.MobArena;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.entity.Creature;
|
||||
import org.bukkit.entity.CreatureType;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
|
||||
public class MACommands implements CommandExecutor
|
||||
{
|
||||
@ -131,20 +126,24 @@ public class MACommands implements CommandExecutor
|
||||
return true;
|
||||
}
|
||||
|
||||
// ma force end
|
||||
// ma force [start|end]
|
||||
if (cmd.equals("force"))
|
||||
{
|
||||
if (!arg.equals("end"))
|
||||
// Start arena.
|
||||
if (arg.equals("start"))
|
||||
{
|
||||
ArenaManager.tellPlayer(p, "/ma force end");
|
||||
ArenaManager.forceStart(p);
|
||||
return true;
|
||||
}
|
||||
|
||||
// End the arena.
|
||||
Iterator<Player> iterator = ArenaManager.playerSet.iterator();
|
||||
while (iterator.hasNext())
|
||||
ArenaManager.playerLeave(iterator.next());
|
||||
ArenaManager.tellPlayer(p, "Forced arena end.");
|
||||
if (arg.equals("end"))
|
||||
{
|
||||
ArenaManager.forceEnd(p);
|
||||
return true;
|
||||
}
|
||||
|
||||
ArenaManager.tellPlayer(p, "/ma force [start|end]");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -275,7 +274,7 @@ public class MACommands implements CommandExecutor
|
||||
return true;
|
||||
}
|
||||
|
||||
// ma protect true/false
|
||||
// ma protect [true|false]
|
||||
if (cmd.equals("protect"))
|
||||
{
|
||||
if (!arg.equals("true") && !arg.equals("false"))
|
||||
@ -302,6 +301,7 @@ public class MACommands implements CommandExecutor
|
||||
}
|
||||
}
|
||||
|
||||
// ma undo it hippie monster
|
||||
if (cmd.equals("undo"))
|
||||
{
|
||||
if (args.length != 4)
|
||||
|
@ -18,11 +18,8 @@ import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||
// TO-DO: Perhaps implement TeamFluff's respawn-packet-code.
|
||||
public class MADamageListener extends EntityListener
|
||||
{
|
||||
private MobArena plugin;
|
||||
|
||||
public MADamageListener(MobArena instance)
|
||||
{
|
||||
plugin = instance;
|
||||
}
|
||||
|
||||
public void onEntityDamage(EntityDamageEvent event)
|
||||
@ -76,7 +73,7 @@ public class MADamageListener extends EntityListener
|
||||
|
||||
/**
|
||||
* Prevents monsters from spawning inside the arena unless
|
||||
* it's running, and adds mini-slimes to the monsterSet.
|
||||
* it's running.
|
||||
*/
|
||||
public void onCreatureSpawn(CreatureSpawnEvent event)
|
||||
{
|
||||
@ -86,18 +83,7 @@ public class MADamageListener extends EntityListener
|
||||
if (!(event.getEntity() instanceof LivingEntity))
|
||||
return;
|
||||
|
||||
System.out.println("This is the spawn command");
|
||||
|
||||
LivingEntity e = (LivingEntity) event.getEntity();
|
||||
|
||||
if (ArenaManager.isRunning)
|
||||
{
|
||||
if (!ArenaManager.monsterSet.contains(e))
|
||||
ArenaManager.monsterSet.add(e);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!ArenaManager.isRunning)
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
package com.garbagemule.MobArena;
|
||||
|
||||
import java.util.Arrays;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerListener;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
|
@ -1,10 +1,7 @@
|
||||
package com.garbagemule.MobArena;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerListener;
|
||||
import org.bukkit.event.player.PlayerEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.player.PlayerKickEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
@ -16,11 +13,8 @@ import org.bukkit.event.player.PlayerJoinEvent;
|
||||
*/
|
||||
public class MADisconnectListener extends PlayerListener
|
||||
{
|
||||
private MobArena plugin;
|
||||
|
||||
public MADisconnectListener(MobArena instance)
|
||||
{
|
||||
plugin = instance;
|
||||
}
|
||||
|
||||
public void onPlayerQuit(PlayerQuitEvent event)
|
||||
|
@ -1,13 +1,14 @@
|
||||
package com.garbagemule.MobArena;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event.Result;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.player.PlayerBucketEmptyEvent;
|
||||
import org.bukkit.event.player.PlayerListener;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||
|
||||
/**
|
||||
* This listener prevents players from sharing class-specific
|
||||
@ -16,11 +17,8 @@ import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||
// TO-DO: Merge with MASignListener and MAReadyListener into MALobbyListener
|
||||
public class MALobbyListener extends PlayerListener
|
||||
{
|
||||
private MobArena plugin;
|
||||
|
||||
public MALobbyListener(MobArena instance)
|
||||
{
|
||||
plugin = instance;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -34,15 +32,31 @@ public class MALobbyListener extends PlayerListener
|
||||
return;
|
||||
|
||||
if (ArenaManager.isRunning)
|
||||
{
|
||||
ArenaManager.dropSet.add(event.getItemDrop());
|
||||
return;
|
||||
}
|
||||
|
||||
ArenaManager.tellPlayer(p, "No sharing before the arena starts!");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds liquid blocks to the blockset when players empty their buckets.
|
||||
*/
|
||||
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event)
|
||||
{
|
||||
if (!ArenaManager.playerSet.contains(event.getPlayer()))
|
||||
return;
|
||||
|
||||
if (!ArenaManager.isRunning)
|
||||
{
|
||||
event.getBlockClicked().getFace(event.getBlockFace()).setTypeId(0);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
Block liquid = event.getBlockClicked().getFace(event.getBlockFace());
|
||||
ArenaManager.blockSet.add(liquid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the player hits an iron block or a sign, or if the player
|
||||
* is trying to use an item.
|
||||
@ -58,6 +72,15 @@ public class MALobbyListener extends PlayerListener
|
||||
if (!ArenaManager.playerSet.contains(p))
|
||||
return;
|
||||
|
||||
Action a = event.getAction();
|
||||
|
||||
// Check if player is trying to use an item.
|
||||
if ((a == Action.RIGHT_CLICK_AIR) || (a == Action.RIGHT_CLICK_BLOCK))
|
||||
{
|
||||
event.setUseItemInHand(Result.DENY);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
// Iron block
|
||||
if (event.hasBlock() && event.getClickedBlock().getTypeId() == 42)
|
||||
{
|
||||
@ -76,6 +99,12 @@ public class MALobbyListener extends PlayerListener
|
||||
// Sign
|
||||
if (event.hasBlock() && event.getClickedBlock().getState() instanceof Sign)
|
||||
{
|
||||
if (a == Action.RIGHT_CLICK_BLOCK)
|
||||
{
|
||||
ArenaManager.tellPlayer(p, "Punch the sign. Don't right-click.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Cast the block to a sign to get the text on it.
|
||||
Sign sign = (Sign) event.getClickedBlock().getState();
|
||||
|
||||
@ -89,16 +118,5 @@ public class MALobbyListener extends PlayerListener
|
||||
ArenaManager.tellPlayer(p, "You have chosen " + className + " as your class!");
|
||||
return;
|
||||
}
|
||||
|
||||
// Trying to use stuff
|
||||
Action a = event.getAction();
|
||||
|
||||
// Check if player is trying to use an item.
|
||||
if ((a == Action.RIGHT_CLICK_AIR) || (a == Action.RIGHT_CLICK_BLOCK))
|
||||
{
|
||||
if (ArenaManager.playerSet.contains(p))
|
||||
event.setUseItemInHand(Result.DENY);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@ package com.garbagemule.MobArena;
|
||||
import java.util.HashMap;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.event.entity.EntityListener;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.entity.EntityCombustEvent;
|
||||
@ -23,24 +24,41 @@ public class MAMonsterListener extends EntityListener
|
||||
plugin = instance;
|
||||
}
|
||||
|
||||
// Creeper explosions
|
||||
/**
|
||||
* Handles all explosion events, also from TNT.
|
||||
*/
|
||||
public void onEntityExplode(EntityExplodeEvent event)
|
||||
{
|
||||
/* This could be done by simply cancelling the event, but that
|
||||
* also cancels the explosion animation. This is a workaround. */
|
||||
if (MAUtils.inRegion(event.getLocation()))
|
||||
{
|
||||
// Don't drop any blocks.
|
||||
if (!MAUtils.inRegion(event.getLocation()))
|
||||
return;
|
||||
|
||||
// Don't drop any blocks from the explosion.
|
||||
event.setYield(0);
|
||||
|
||||
// Store the blocks and their values.
|
||||
// Store the blocks and their values in the map.
|
||||
final HashMap<Block,Integer> blockMap = new HashMap<Block,Integer>();
|
||||
|
||||
for (Block b : event.blockList())
|
||||
{
|
||||
if (b.getType() == Material.CAKE_BLOCK)
|
||||
blockMap.put(b, 0);
|
||||
else
|
||||
blockMap.put(b, b.getTypeId());
|
||||
// Doors are wonky, so don't store them. Just smile and wave, and remove from set.
|
||||
if (b.getType() == Material.WOODEN_DOOR || b.getType() == Material.IRON_DOOR_BLOCK || b.getType() == Material.CAKE_BLOCK)
|
||||
{
|
||||
ArenaManager.blockSet.remove(b);
|
||||
continue;
|
||||
}
|
||||
|
||||
// If a block is in the blockSet, make sure it drops "naturally" so Oddjob doesn't cry.
|
||||
if (ArenaManager.blockSet.remove(b))
|
||||
{
|
||||
ArenaManager.world.dropItemNaturally(b.getLocation(), new ItemStack(b.getTypeId(), 1));
|
||||
continue;
|
||||
}
|
||||
|
||||
// If a block has extra data, store it as a fourth digit (thousand).
|
||||
int type = b.getTypeId() + (b.getData() * 1000);
|
||||
blockMap.put(b, type);
|
||||
}
|
||||
|
||||
// Wait a couple of ticks, then rebuild the blocks.
|
||||
@ -51,11 +69,20 @@ public class MAMonsterListener extends EntityListener
|
||||
{
|
||||
for (Block b : blockMap.keySet())
|
||||
{
|
||||
b.getLocation().getBlock().setTypeId(blockMap.get(b));
|
||||
int type = blockMap.get(b);
|
||||
|
||||
// Modulo 1000 to get the actual type id.
|
||||
b.getLocation().getBlock().setTypeId(type % 1000);
|
||||
|
||||
/* If the type ID is greater than 1000, it means the block
|
||||
* has extra data (stairs, levers, etc.). We subtract the
|
||||
* block type data by dividing by 1000. Integer division
|
||||
* always rounds by truncation. */
|
||||
if (type > 1000)
|
||||
b.getLocation().getBlock().setData((byte) (type / 1000));
|
||||
}
|
||||
}
|
||||
}, 5);
|
||||
}
|
||||
}, ArenaManager.repairDelay);
|
||||
}
|
||||
|
||||
// Zombie/skeleton combustion from the sun.
|
||||
|
@ -1,7 +1,5 @@
|
||||
package com.garbagemule.MobArena;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Random;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Wolf;
|
||||
@ -12,8 +10,6 @@ import org.bukkit.entity.Creature;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.CreatureType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
|
||||
/**
|
||||
* Core class for handling wave spawning.
|
||||
@ -28,7 +24,7 @@ import org.bukkit.inventory.PlayerInventory;
|
||||
// TO-DO: Allow additional "default" waves.
|
||||
public class MASpawnThread implements Runnable
|
||||
{
|
||||
private int wave, ran, noOfSpawnPoints, noOfPlayers;
|
||||
private int wave, ran, noOfSpawnPoints, noOfPlayers, modulo;
|
||||
private int dZombies, dSkeletons, dSpiders, dCreepers, dWolves;
|
||||
private int dPoweredCreepers, dPigZombies, dSlimes, dMonsters, dAngryWolves, dGiants, dGhasts;
|
||||
private Random random;
|
||||
@ -36,6 +32,9 @@ public class MASpawnThread implements Runnable
|
||||
|
||||
public MASpawnThread()
|
||||
{
|
||||
modulo = ArenaManager.specialModulo;
|
||||
if (modulo <= 0) modulo = -32768;
|
||||
|
||||
noOfPlayers = ArenaManager.playerSet.size();
|
||||
noOfSpawnPoints = ArenaManager.spawnpoints.size();
|
||||
wave = 1;
|
||||
@ -89,8 +88,7 @@ public class MASpawnThread implements Runnable
|
||||
}
|
||||
|
||||
// Check if this is a special wave.
|
||||
// TO-DO: Get this value from the config-file.
|
||||
if (wave % 4 == 0)
|
||||
if (wave % modulo == 0)
|
||||
{
|
||||
ArenaManager.tellAll("Get ready for wave #" + wave + "! [SPECIAL]");
|
||||
specialWave();
|
||||
@ -132,9 +130,6 @@ public class MASpawnThread implements Runnable
|
||||
LivingEntity e = ArenaManager.world.spawnCreature(loc,mob);
|
||||
ArenaManager.monsterSet.add(e);
|
||||
|
||||
//if (mob == CreatureType.WOLF)
|
||||
// ((Wolf)e).setAngry(true);
|
||||
|
||||
// Grab a random target.
|
||||
Creature c = (Creature) e;
|
||||
c.setTarget(getClosestPlayer(e));
|
||||
@ -166,41 +161,32 @@ public class MASpawnThread implements Runnable
|
||||
|
||||
// 5 on purpose - Ghasts act weird in Overworld.
|
||||
switch(mob)
|
||||
//switch (random.nextInt(5))
|
||||
{
|
||||
case CREEPER:
|
||||
//mob = CreatureType.CREEPER;
|
||||
count = noOfPlayers * 3;
|
||||
break;
|
||||
case PIG_ZOMBIE:
|
||||
//mob = CreatureType.PIG_ZOMBIE;
|
||||
count = noOfPlayers * 2;
|
||||
break;
|
||||
case SLIME:
|
||||
//mob = CreatureType.SLIME;
|
||||
count = noOfPlayers * 4;
|
||||
slime = true;
|
||||
break;
|
||||
case MONSTER:
|
||||
//mob = CreatureType.MONSTER;
|
||||
count = noOfPlayers + 1;
|
||||
break;
|
||||
case WOLF:
|
||||
//mob = CreatureType.WOLF;
|
||||
count = noOfPlayers * 3;
|
||||
wolf = true;
|
||||
break;
|
||||
case GIANT:
|
||||
//mob = CreatureType.GIANT;
|
||||
count = 1;
|
||||
break;
|
||||
case GHAST:
|
||||
//mob = CreatureType.GHAST;
|
||||
count = 2;
|
||||
ghast = true;
|
||||
break;
|
||||
default:
|
||||
//mob = CreatureType.CHICKEN;
|
||||
count = 50;
|
||||
break;
|
||||
}
|
||||
@ -229,6 +215,9 @@ public class MASpawnThread implements Runnable
|
||||
c.setTarget(getClosestPlayer(e));
|
||||
}
|
||||
|
||||
if (!ArenaManager.lightning)
|
||||
return;
|
||||
|
||||
// Lightning, just for effect ;)
|
||||
for (Location spawn : ArenaManager.spawnpoints)
|
||||
{
|
||||
|
@ -8,33 +8,49 @@ import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
/**
|
||||
* This listener prevents players from warping out of the arena, if
|
||||
* they are in the arena session.
|
||||
* Also prevents players from warping into the arena during a session.
|
||||
*/
|
||||
// TO-DO: Fix the bug that causes the message when people get stuck in walls.
|
||||
public class MATeleportListener extends PlayerListener
|
||||
{
|
||||
private MobArena plugin;
|
||||
|
||||
public MATeleportListener(MobArena instance)
|
||||
{
|
||||
plugin = instance;
|
||||
}
|
||||
|
||||
public void onPlayerTeleport(PlayerTeleportEvent event)
|
||||
{
|
||||
Player p = event.getPlayer();
|
||||
if (!ArenaManager.playerSet.contains(p))
|
||||
return;
|
||||
|
||||
Location to = event.getTo();
|
||||
|
||||
if (ArenaManager.arenaLoc.equals(to) ||
|
||||
ArenaManager.lobbyLoc.equals(to) ||
|
||||
ArenaManager.spectatorLoc.equals(to))
|
||||
// If the player teleports from outside of the arena..
|
||||
if (!ArenaManager.playerSet.contains(p))
|
||||
{
|
||||
if (!MAUtils.inRegion(to))
|
||||
return;
|
||||
|
||||
if (!ArenaManager.isRunning)
|
||||
return;
|
||||
|
||||
if (ArenaManager.spectatorLoc.equals(to))
|
||||
return;
|
||||
|
||||
// ..into the region during a battle; cancel
|
||||
ArenaManager.tellPlayer(p, "Can't warp to the arena during battle!");
|
||||
ArenaManager.tellPlayer(p, "Type /ma spec to watch.");
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
ArenaManager.tellPlayer(p, "Can't warp in arena! To leave, type /ma leave");
|
||||
// Otherwise, only warp if to is in the locationMap, or a valid warp
|
||||
if (ArenaManager.locationMap.get(p).equals(to) ||
|
||||
ArenaManager.arenaLoc.equals(to) ||
|
||||
ArenaManager.lobbyLoc.equals(to) ||
|
||||
ArenaManager.spectatorLoc.equals(to))
|
||||
return;
|
||||
|
||||
// If warp isn't valid, notify the player
|
||||
ArenaManager.tellPlayer(p, "Warping not allowed in the arena!");
|
||||
ArenaManager.tellPlayer(p, "Type /ma leave to leave");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
package com.garbagemule.MobArena;
|
||||
|
||||
import java.net.URL;
|
||||
import java.net.URI;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.io.File;
|
||||
@ -8,15 +7,13 @@ import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.util.Scanner;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
import java.util.Random;
|
||||
import java.util.Iterator;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Location;
|
||||
@ -78,7 +75,7 @@ public class MAUtils
|
||||
public static void giveItems(boolean reward, Player p, String... strings)
|
||||
{
|
||||
// Variables used.
|
||||
ItemStack stack, current;
|
||||
ItemStack stack;
|
||||
int id, amount;
|
||||
|
||||
PlayerInventory inv;
|
||||
@ -170,61 +167,6 @@ public class MAUtils
|
||||
|
||||
// ///////////////////////////////////////////////////////////////////// */
|
||||
|
||||
/**
|
||||
* Replaces all tabs with 4 spaces in config.yml
|
||||
|
||||
public static void fixConfigFile()
|
||||
{
|
||||
new File("plugins/MobArena").mkdir();
|
||||
File configFile = new File("plugins/MobArena/config.yml");
|
||||
|
||||
try
|
||||
{
|
||||
if(!configFile.exists())
|
||||
{
|
||||
configFile.createNewFile();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Create an inputstream from the file
|
||||
FileInputStream fis = new FileInputStream(configFile);
|
||||
|
||||
// Read the file into a byte array, and make a String out of it.
|
||||
byte[] bytes = new byte[(int)configFile.length()];
|
||||
fis.read(bytes);
|
||||
String input = new String(bytes);
|
||||
|
||||
// Close the stream.
|
||||
fis.close();
|
||||
|
||||
// Replace all tabs with 4 spaces.
|
||||
String output = "";
|
||||
for (char c : input.toCharArray())
|
||||
{
|
||||
if (c == '\t')
|
||||
output += " ";
|
||||
else
|
||||
output += c;
|
||||
}
|
||||
|
||||
// Create an outputstream from the file.
|
||||
FileOutputStream fos = new FileOutputStream(configFile);
|
||||
|
||||
// Write all the bytes to it.
|
||||
for (byte b : output.getBytes())
|
||||
fos.write(b);
|
||||
|
||||
// Close the stream.
|
||||
fos.close();
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
System.out.println("[MobArena] ERROR: Config file could not be created.");
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Creates a Configuration object from the config.yml file.
|
||||
*/
|
||||
@ -249,25 +191,13 @@ public class MAUtils
|
||||
return new Configuration(configFile);
|
||||
}
|
||||
|
||||
public static boolean getUpdateNotification()
|
||||
{
|
||||
Configuration c = ArenaManager.config;
|
||||
c.load();
|
||||
|
||||
boolean result = c.getBoolean("updatenotification", false);
|
||||
c.setProperty("updatenotification", result);
|
||||
c.save();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static List<String> getDisabledCommands()
|
||||
{
|
||||
Configuration c = ArenaManager.config;
|
||||
c.load();
|
||||
|
||||
String commands = c.getString("disabledcommands", "kill");
|
||||
c.setProperty("disabledcommands", commands);
|
||||
String commands = c.getString("settings.disabledcommands", "/kill");
|
||||
c.setProperty("settings.disabledcommands", commands);
|
||||
c.save();
|
||||
|
||||
List<String> result = new LinkedList<String>();
|
||||
@ -286,8 +216,8 @@ public class MAUtils
|
||||
Configuration c = ArenaManager.config;
|
||||
c.load();
|
||||
|
||||
String world = c.getString("world", ArenaManager.server.getWorlds().get(0).getName());
|
||||
c.setProperty("world", world);
|
||||
String world = c.getString("settings.world", ArenaManager.server.getWorlds().get(0).getName());
|
||||
c.setProperty("settings.world", world);
|
||||
|
||||
c.save();
|
||||
return ArenaManager.server.getWorld(world);
|
||||
@ -306,11 +236,11 @@ public class MAUtils
|
||||
{
|
||||
c.setProperty("classes.Archer.items", "wood_sword, bow, arrow:128, grilled_pork");
|
||||
c.setProperty("classes.Archer.armor", "298,299,300,301");
|
||||
c.setProperty("classes.Knight.items", "diamond_sword, grilled_pork");
|
||||
c.setProperty("classes.Knight.items", "diamond_sword, grilled_pork:2");
|
||||
c.setProperty("classes.Knight.armor", "306,307,308,309");
|
||||
c.setProperty("classes.Tank.items", "iron_sword, grilled_pork:2");
|
||||
c.setProperty("classes.Tank.items", "iron_sword, grilled_pork:3, apple");
|
||||
c.setProperty("classes.Tank.armor", "310,311,312,313");
|
||||
c.setProperty("classes.Oddjob.items", "stone_sword, flint_and_steel, netherrack:2, wood_pickaxe, wood_door, fishing_rod, apple, grilled_pork:3");
|
||||
c.setProperty("classes.Oddjob.items", "stone_sword, flint_and_steel, netherrack:2, wood_pickaxe, tnt:4, fishing_rod, apple, grilled_pork:3");
|
||||
c.setProperty("classes.Oddjob.armor", "298,299,300,301");
|
||||
c.setProperty("classes.Chef.items", "stone_sword, bread:6, grilled_pork:4, mushroom_soup, cake:3, cookie:12");
|
||||
c.setProperty("classes.Chef.armor", "314,315,316,317");
|
||||
@ -436,7 +366,7 @@ public class MAUtils
|
||||
if (c.getInt("waves." + type + "." + monster, -1) == -1)
|
||||
{
|
||||
int dist = 10;
|
||||
if (monster.equals("giants") || monster.equals("ghasts") || monster.equals("slimes"))
|
||||
if (monster.equals("giants") || monster.equals("ghasts"))
|
||||
dist = 0;
|
||||
|
||||
c.setProperty("waves." + type + "." + monster, dist);
|
||||
@ -446,6 +376,36 @@ public class MAUtils
|
||||
return c.getInt("waves." + type + "." + monster, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Grabs an integer from the config-file.
|
||||
*/
|
||||
public static int getInt(String path, int def)
|
||||
{
|
||||
Configuration c = ArenaManager.config;
|
||||
c.load();
|
||||
|
||||
int result = c.getInt(path, def);
|
||||
c.setProperty(path, result);
|
||||
|
||||
c.save();
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Grabs a boolean from the config-file.
|
||||
*/
|
||||
public static boolean getBoolean(String path, boolean def)
|
||||
{
|
||||
Configuration c = ArenaManager.config;
|
||||
c.load();
|
||||
|
||||
boolean result = c.getBoolean(path, def);
|
||||
c.setProperty(path, result);
|
||||
|
||||
c.save();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* ///////////////////////////////////////////////////////////////////// //
|
||||
|
||||
@ -842,7 +802,7 @@ public class MAUtils
|
||||
ArenaManager.world.getBlockAt(i,j,k).setTypeId(0);
|
||||
|
||||
// Place the hippie signs
|
||||
java.util.Iterator iterator = ArenaManager.classes.iterator();
|
||||
Iterator<String> iterator = ArenaManager.classes.iterator();
|
||||
for (int i = lx1+2; i <= lx2-2; i++) // Signs
|
||||
{
|
||||
ArenaManager.world.getBlockAt(i,ly1+1,lz2-1).setTypeIdAndData(63, (byte)0x8, false);
|
||||
@ -874,7 +834,7 @@ public class MAUtils
|
||||
{
|
||||
FileInputStream fis = new FileInputStream("plugins/MobArena/precious.tmp");
|
||||
ObjectInputStream ois = new ObjectInputStream(fis);
|
||||
preciousPatch = (HashMap) ois.readObject();
|
||||
preciousPatch = (HashMap<EntityPosition,Integer>) ois.readObject();
|
||||
ois.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -1,8 +1,6 @@
|
||||
package com.garbagemule.MobArena;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Iterator;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.Event.Priority;
|
||||
import org.bukkit.event.block.BlockListener;
|
||||
@ -59,12 +57,13 @@ public class MobArena extends JavaPlugin
|
||||
pm.registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, commandListener, Priority.Monitor, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_INTERACT, lobbyListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_DROP_ITEM, lobbyListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_BUCKET_EMPTY, lobbyListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_TELEPORT, teleportListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_QUIT, discListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_KICK, discListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.PLAYER_JOIN, discListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.BLOCK_DAMAGE, blockListener, Priority.Normal, this);
|
||||
//pm.registerEvent(Event.Type.BLOCK_DAMAGE, blockListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.ENTITY_DAMAGE, damageListener, Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.ENTITY_DEATH, damageListener, Priority.Normal, this);
|
||||
@ -77,10 +76,8 @@ public class MobArena extends JavaPlugin
|
||||
|
||||
public void onDisable()
|
||||
{
|
||||
Iterator<Player> iterator = ArenaManager.playerSet.iterator();
|
||||
while (iterator.hasNext())
|
||||
ArenaManager.playerLeave(iterator.next());
|
||||
|
||||
System.out.println("WAIT! WHAT ARE YOU DOING?!");
|
||||
|
||||
ArenaManager.forceEnd(null);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user