So, you got a big source code revamp. Big whoop, wanna fight about it?

This commit is contained in:
Garbage Mule
2012-02-24 05:11:06 +01:00
parent e7c66be183
commit 777f6b9b07
193 changed files with 11912 additions and 12726 deletions
-302
View File
@@ -1,302 +0,0 @@
package com.garbagemule.MobArena;
import java.util.*;
import java.util.concurrent.PriorityBlockingQueue;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Wolf;
import org.bukkit.inventory.ItemStack;
import org.bukkit.permissions.PermissionAttachment;
//import org.bukkit.util.config.Configuration;
import com.garbagemule.MobArena.leaderboards.Leaderboard;
import com.garbagemule.MobArena.repairable.Repairable;
import com.garbagemule.MobArena.repairable.RepairableComparator;
import com.garbagemule.MobArena.util.Config;
import com.garbagemule.MobArena.waves.BossWave;
import com.garbagemule.MobArena.waves.Wave;
public abstract class Arena
{
private MobArena plugin;
// Setup fields
protected String name;
protected World world;
protected boolean enabled, protect, running, setup, lobbySetup, autoEquip, forceRestore, softRestore, softRestoreDrops, emptyInvJoin, emptyInvSpec, pvp, monsterInfight, allowWarp;
protected boolean edit, waveClear, detCreepers, detDamage, lightning, hellhounds, specOnDeath, shareInArena, spoutSelect;
protected Location p1, p2, l1, l2, arenaLoc, lobbyLoc, spectatorLoc;
protected Map<String,Location> spawnpoints, spawnpointsBoss, containers;
protected String logging;
// Wave/reward/entryfee fields
protected int spawnTaskId, sheepTaskId, waveDelay, waveInterval, specialModulo, spawnMonstersInt, maxIdleTime, finalWave;
protected MASpawnThread spawnThread;
protected Map<Integer,List<ItemStack>> everyWaveMap, afterWaveMap;
protected Map<Player,String> classMap;
protected Map<String,List<ItemStack>> classItems, classArmor;
protected Map<String,Map<String,Boolean>> classPerms;
protected Map<Player,PermissionAttachment> attachments;
protected List<ItemStack> entryFee;
// Player sets
protected Set<Player> arenaPlayers, lobbyPlayers, readyPlayers, specPlayers;
// Wave stuff
protected TreeSet<Wave> singleWaves, singleWavesInstance;
protected TreeSet<Wave> recurrentWaves;
protected BossWave bossWave;
protected Wave currentWave;
// Arena sets/maps
protected Set<Player> hasPaid, rewardedPlayers, notifyPlayers, randoms;
protected Set<LivingEntity> monsters, explodingSheep, plaguedPigs, madCows;
protected Set<Block> blocks;
protected Set<Wolf> pets;
protected Map<Player,Integer> petMap;
protected LinkedList<Repairable> repairables, containables;
// Spawn overriding
protected int spawnMonsters;
protected boolean allowMonsters, allowAnimals;
// Other settings
protected int minPlayers, maxPlayers, joinDistance;
protected Set<String> classes = new HashSet<String>();
protected Map<Player,Location> locations = new HashMap<Player,Location>();
protected Map<Player,Integer> healthMap = new HashMap<Player,Integer>();
protected Map<Player,Integer> hungerMap = new HashMap<Player,Integer>();
protected Map<Player,GameMode> modeMap = new HashMap<Player,GameMode>();
// Logging
protected ArenaLog log;
protected Map<Player,ArenaPlayer> arenaPlayerMap;
protected Leaderboard leaderboard;
protected MAListener eventListener;
protected PriorityBlockingQueue<Repairable> repairQueue;
public Arena() {
}
/**
* Primary constructor. Requires a name and a world.
*/
public Arena(String name, World world)
{
if (world == null)
throw new NullPointerException("[MobArena] ERROR! World for arena '" + name + "' does not exist!");
this.name = name;
this.world = world;
plugin = (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena");
arenaPlayers = new HashSet<Player>();
lobbyPlayers = new HashSet<Player>();
notifyPlayers = new HashSet<Player>();
readyPlayers = new HashSet<Player>();
specPlayers = new HashSet<Player>();
rewardedPlayers = new HashSet<Player>();
hasPaid = new HashSet<Player>();
monsters = new HashSet<LivingEntity>();
explodingSheep = new HashSet<LivingEntity>();
plaguedPigs = new HashSet<LivingEntity>();
madCows = new HashSet<LivingEntity>();
blocks = new HashSet<Block>();
pets = new HashSet<Wolf>();
petMap = new HashMap<Player,Integer>();
classMap = new HashMap<Player,String>();
randoms = new HashSet<Player>();
repairables = new LinkedList<Repairable>();
containables = new LinkedList<Repairable>();
attachments = new HashMap<Player,PermissionAttachment>();
arenaPlayerMap = new HashMap<Player,ArenaPlayer>();
running = false;
edit = false;
allowMonsters = world.getAllowMonsters();
allowAnimals = world.getAllowAnimals();
spawnMonsters = MAUtils.getSpawnMonsters(world);
eventListener = new MAListener(this, plugin);
repairQueue = new PriorityBlockingQueue<Repairable>(100, new RepairableComparator());
}
public abstract boolean startArena();
public abstract boolean endArena();
public abstract void forceStart();
public abstract void forceEnd();
public abstract void playerJoin(Player p, Location loc);
public abstract void playerReady(Player p);
public abstract void playerLeave(Player p);
public abstract void playerDeath(Player p);
public abstract void playerSpec(Player p, Location loc);
public abstract void playerKill(Player p);
public abstract void restoreInvAndGiveRewardsDelayed(final Player p);
public abstract void restoreInvAndGiveRewards(final Player p);
public abstract void storePlayerData(Player p, Location loc);
public abstract void storeContainerContents();
public abstract void restoreContainerContents();
public abstract void movePlayerToLobby(Player p);
public abstract void movePlayerToSpec(Player p);
public abstract void movePlayerToEntry(Player p);
public abstract void repairBlocks();
public abstract void queueRepairable(Repairable r);
/*////////////////////////////////////////////////////////////////////
//
// Items & Cleanup
//
////////////////////////////////////////////////////////////////////*/
public abstract void assignClass(Player p, String className);
public abstract void assignRandomClass(Player p);
public abstract void assignClassPermissions(Player p);
public abstract void removeClassPermissions(Player p);
/*////////////////////////////////////////////////////////////////////
//
// Initialization & Checks
//
////////////////////////////////////////////////////////////////////*/
public abstract void load(Config config);
public abstract void restoreRegion();
public abstract void serializeConfig();
public abstract void deserializeConfig();
public abstract boolean serializeRegion();
public abstract boolean deserializeRegion();
/**
* Check if a location is inside of the cuboid region
* that p1 and p2 span.
*/
public abstract boolean inRegion(Location loc);
/**
* Check if a location is inside of the arena region, expanded
* by 'radius' blocks. Used with explosions.
*/
public abstract boolean inRegionRadius(Location loc, int radius);
/*////////////////////////////////////////////////////////////////////
//
// Getters & Misc
//
////////////////////////////////////////////////////////////////////*/
public abstract boolean inArena(Player p);
public abstract boolean inLobby(Player p);
public abstract boolean isEnabled();
public abstract boolean isRunning();
public abstract boolean isPvpEnabled();
public abstract boolean isLightningEnabled();
public abstract boolean isBossWave();
public abstract String configName();
public abstract String arenaName();
public abstract MobArena getPlugin();
public abstract World getWorld();
public abstract Wave getWave();
public abstract void setWave(Wave wave);
public abstract void setBossWave(BossWave bossWave);
public abstract Set<String> getClasses();
public abstract List<Location> getAllSpawnpoints();
public abstract List<Location> getSpawnpoints();
public abstract Location getBossSpawnpoint();
public abstract int getPlayerCount();
public abstract void addBlock(Block b);
public abstract void addMonster(LivingEntity e);
public abstract void addExplodingSheep(LivingEntity e);
public abstract List<Player> getAllPlayers();
public abstract List<Player> getLivingPlayers();
public abstract Set<Player> getArenaPlayers();
public abstract Collection<ArenaPlayer> getArenaPlayerSet();
public abstract List<ArenaPlayerStatistics> getArenaPlayerStatistics(Comparator<ArenaPlayerStatistics> comparator);
public abstract List<Player> getNonreadyPlayers();
public abstract Set<LivingEntity> getMonsters();
public abstract Set<Wolf> getPets();
public abstract void resetIdleTimer();
public abstract void addTrunkAndLeaves(Block b);
public abstract boolean canAfford(Player p);
public abstract boolean takeFee(Player p);
public abstract boolean canJoin(Player p);
public abstract boolean canSpec(Player p);
}
@@ -0,0 +1,283 @@
package com.garbagemule.MobArena;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.permissions.PermissionAttachment;
public class ArenaClass
{
private String name;
private ItemStack helmet, chestplate, leggings, boots;
private List<ItemStack> items, armor;
private Map<String,Boolean> perms;
private int pets;
/**
* Create a new, empty arena class with the given name.
* @param name the class name
*/
public ArenaClass(String name) {
this.name = name;
this.items = new ArrayList<ItemStack>();
this.armor = new ArrayList<ItemStack>(4);
this.perms = new HashMap<String,Boolean>();
this.pets = 0;
}
/**
* Get the name of the arena class.
* @return the class name
*/
public String getName() {
return name;
}
/**
* Get the Material type of the first item in the items list.
* If the items list is empty, the method returns Material.STONE
* @return the type of the first item, or STONE if the list is empty
*/
public Material getLogo() {
if (items.isEmpty()) {
return Material.STONE;
}
return items.get(0).getType();
}
/**
* Set the helmet slot for the class.
* @param helmet an item
*/
public void setHelmet(ItemStack helmet) {
this.helmet = helmet;
}
/**
* Set the chestplate slot for the class.
* @param chestplate an item
*/
public void setChestplate(ItemStack chestplate) {
this.chestplate = chestplate;
}
/**
* Set the leggings slot for the class.
* @param leggings an item
*/
public void setLeggings(ItemStack leggings) {
this.leggings = leggings;
}
/**
* Set the boots slot for the class.
* @param boots an item
*/
public void setBoots(ItemStack boots) {
this.boots = boots;
}
/**
* Add an item to the items list.
* If the item is a weapon-type, its durability will be set to "infinite".
* If the item is a bone, the pets counter will be incremented.
* @param stack an item
*/
public void addItem(ItemStack stack) {
if (stack == null) return;
if (isWeapon(stack)) {
stack.setDurability(Short.MIN_VALUE);
}
else if (stack.getType() == Material.BONE) {
pets += stack.getAmount();
}
items.add(stack);
}
/**
* Replace the current items list with a new list of all the items in the given list.
* This method uses the addItem() method for each item to ensure consistency.
* @param stacks a list of items
*/
public void setItems(List<ItemStack> stacks) {
this.items = new ArrayList<ItemStack>(stacks.size());
for (ItemStack stack : stacks) {
addItem(stack);
}
}
/**
* Replace the current armor list with the given list.
* @param armor a list of items
*/
public void setArmor(List<ItemStack> armor) {
this.armor = armor;
}
/**
* Grants all of the class items and armor to the given player.
* The normal items will be added to the inventory normally, while the
* armor items will be verified as armor items and placed in their
* appropriate slots. If any specific armor slots are specified, they
* will overwrite any items in the armor list.
* @param p a player
*/
public void grantItems(Player p) {
PlayerInventory inv = p.getInventory();
// Fork over the items.
for (ItemStack stack : items) {
inv.addItem(stack);
}
// Check for legacy armor-node items
if (!armor.isEmpty()) {
for (ItemStack piece : armor) {
ArmorType type = ArmorType.getType(piece);
if (type == null) continue;
switch (type) {
case HELMET:
inv.setHelmet(piece);
break;
case CHESTPLATE:
inv.setChestplate(piece);
break;
case LEGGINGS:
inv.setLeggings(piece);
break;
case BOOTS:
inv.setBoots(piece);
break;
default:
break;
}
}
}
// Check type specifics.
if (helmet != null) inv.setHelmet(helmet);
if (chestplate != null) inv.setChestplate(chestplate);
if (leggings != null) inv.setLeggings(leggings);
if (boots != null) inv.setBoots(boots);
}
/**
* Add a permission value to the class.
* @param perm the permission
* @param value the value
*/
public void addPermission(String perm, boolean value) {
perms.put(perm, value);
}
/**
* Get an unmodifiable map of permissions and values for the class.
* @return a map of permissions and values
*/
public Map<String,Boolean> getPermissions() {
return Collections.unmodifiableMap(perms);
}
/**
* Grant the given player all the permissions of the class.
* All permissions will be attached to a PermissionAttachment object, which
* will be returned to the caller.
* @param plugin a MobArena instance
* @param p a player
* @return the PermissionAttachment with all the permissions
*/
public PermissionAttachment grantPermissions(MobArena plugin, Player p) {
if (perms.isEmpty()) return null;
PermissionAttachment pa = p.addAttachment(plugin);
for (Entry<String,Boolean> entry : perms.entrySet()) {
try {
pa.setPermission(entry.getKey(), entry.getValue());
}
catch (Exception e) {
String perm = entry.getKey() + ":" + entry.getValue();
String player = p.getName();
plugin.warning("[PERM00] Failed to attach permission '" + perm + "' to player '" + player + " with class " + this.name
+ "'.\nPlease verify that your class permissions are well-formed.");
}
}
return pa;
}
/**
* Get the amount of pets this class is given upon starting the arena.
* @return the number of pets this class has
*/
public int getPetAmount() {
return pets;
}
/**
* Used by isWeapon() to determine if an ItemStack is a weapon type.
*/
private static int[] weaponTypes = new int[]{256,257,258,267,268,269,270,271,272,273,274,275,276,277,278,279,283,284,285,286,290,291,292,293,294};
/**
* Returns true, if the ItemStack appears to be a weapon, in which case
* the addItem() method will set the weapon durability to the absolute
* maximum, as to give them "infinite" durability.
* @param stack an ItemStack
* @return true, if the item is a weapon
*/
private boolean isWeapon(ItemStack stack) {
int id = stack.getTypeId();
for (int type : weaponTypes) {
if (id == type) {
return true;
}
}
return false;
}
/**
* Used by the grantItems() method to determine the armor type of a given
* ItemStack. Armor pieces are auto-equipped.
* Note: This enum is only necessary for backward-compatibility with the
* 'armor'-node.
*/
public enum ArmorType {
HELMET (298,302,306,310,314),
CHESTPLATE (299,303,307,311,315),
LEGGINGS (300,304,308,312,316),
BOOTS (301,305,309,313,317);
private int[] types;
private ArmorType(int... types) {
this.types = types;
}
public static ArmorType getType(ItemStack stack) {
int id = stack.getTypeId();
for (ArmorType armorType : ArmorType.values()) {
for (int type : armorType.types) {
if (id == type) {
return armorType;
}
}
}
return null;
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,789 @@
package com.garbagemule.MobArena;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.ContainerBlock;
import org.bukkit.block.Sign;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Slime;
import org.bukkit.entity.Wolf;
import org.bukkit.event.Event.Result;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockBurnEvent;
import org.bukkit.event.block.BlockEvent;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerAnimationEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Attachable;
import org.bukkit.material.Bed;
import org.bukkit.material.Door;
import org.bukkit.material.Redstone;
import com.garbagemule.MobArena.MAUtils;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.Msg;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaListener;
import com.garbagemule.MobArena.leaderboards.Leaderboard;
import com.garbagemule.MobArena.region.ArenaRegion;
import com.garbagemule.MobArena.region.RegionPoint;
import com.garbagemule.MobArena.repairable.*;
import com.garbagemule.MobArena.util.TextUtils;
import com.garbagemule.MobArena.util.config.ConfigSection;
import com.garbagemule.MobArena.waves.MABoss;
public class ArenaListenerImpl implements ArenaListener
{
private MobArena plugin;
private Arena arena;
private ArenaRegion region;
private MonsterManager monsters;
private boolean softRestore,
softRestoreDrops,
protect;
private boolean monsterExp,
monsterInfight,
pvpEnabled,
foodRegen,
lockFoodLevel;
private boolean allowTeleport,
canShare,
allowMonsters;
private Set<Player> banned;
public ArenaListenerImpl(Arena arena, MobArena plugin) {
this.plugin = plugin;
this.arena = arena;
this.region = arena.getRegion();
this.monsters = arena.getMonsterManager();
/*
* TODO: Figure out if this is really a good idea + It saves needing all
* those methods in Arena.java + It is relatively simple + It would be
* fairly easy to implement an observer pattern - More private fields -
* Uglier code
*/
ConfigSection s = arena.getSettings();
this.softRestore = s.getBoolean("soft-restore", false);
this.softRestoreDrops = s.getBoolean("soft-restore-drops", false);
this.protect = s.getBoolean("protect", true);
this.monsterExp = s.getBoolean("monster-exp", false);
this.monsterInfight = s.getBoolean("monster-infight", false);
this.pvpEnabled = s.getBoolean("pvp-enabled", false);
this.foodRegen = s.getBoolean("food-regen", false);
this.lockFoodLevel = s.getBoolean("lock-food-level", true);
this.allowTeleport = s.getBoolean("allow-teleporting", false);
this.canShare = s.getBoolean("share-items-in-arena", true);
this.allowMonsters = arena.getWorld().getAllowMonsters();
this.banned = new HashSet<Player>();
}
public void onBlockBreak(BlockBreakEvent event) {
if (onBlockDestroy(event))
return;
event.setCancelled(true);
}
public void onBlockBurn(BlockBurnEvent event) {
if (onBlockDestroy(event))
return;
event.setCancelled(true);
}
private boolean onBlockDestroy(BlockEvent event) {
if (!arena.getRegion().contains(event.getBlock().getLocation()) || arena.inEditMode() || (!arena.isProtected() && arena.isRunning()))
return true;
Block b = event.getBlock();
if (arena.removeBlock(b) || b.getType() == Material.TNT)
return true;
if (softRestore && arena.isRunning()) {
BlockState state = b.getState();
Repairable r = null;
if (state instanceof ContainerBlock)
r = new RepairableContainer(state);
else if (state instanceof Sign)
r = new RepairableSign(state);
else if (state.getData() instanceof Attachable)
r = new RepairableAttachable(state);
else
r = new RepairableBlock(state);
arena.addRepairable(r);
if (!softRestoreDrops)
b.setTypeId(0);
return true;
}
return false;
}
public void onBlockPlace(BlockPlaceEvent event) {
Block b = event.getBlock();
// If the event didn't happen in the region, or if in edit mode, ignore
if (!arena.getRegion().contains(b.getLocation()) || arena.inEditMode()) {
return;
}
// If the arena isn't running, or if the player isn't in the arena,
// cancel.
if (!arena.isRunning() || !arena.inArena(event.getPlayer())) {
event.setCancelled(true);
return;
}
// Otherwise, block was placed during a session.
arena.addBlock(b);
switch (b.getType()){
// For doors, add the block just above (so we get both halves)
case WOODEN_DOOR:
case IRON_DOOR_BLOCK:
arena.addBlock(b.getRelative(0, 1, 0));
break;
}
}
public void onBlockForm(BlockFormEvent event) {
if (!arena.getRegion().contains(event.getBlock().getLocation()))
return;
// If a snowman forms some snow on its path, add the block
if (event.getNewState().getType() == Material.SNOW)
arena.addBlock(event.getBlock());
}
public void onBlockIgnite(BlockIgniteEvent event) {
if (!arena.getRegion().contains(event.getBlock().getLocation()))
return;
switch (event.getCause()){
case LIGHTNING:
case SPREAD:
event.setCancelled(true);
break;
case FLINT_AND_STEEL:
if (arena.isRunning())
arena.addBlock(event.getBlock().getRelative(BlockFace.UP));
else
event.setCancelled(true);
break;
default:
break;
}
}
public void onSignChange(SignChangeEvent event) {
arena.setLeaderboard(new Leaderboard(plugin, arena, event.getBlock().getLocation()));
arena.getRegion().set(RegionPoint.LEADERBOARD, event.getBlock().getLocation());
Messenger.tellPlayer(event.getPlayer(), "Leaderboard made. Now set up the stat signs!");
}
public void onCreatureSpawn(CreatureSpawnEvent event) {
if (!arena.getRegion().contains(event.getLocation())) {
if (!event.isCancelled()) {
event.setCancelled(!allowMonsters);
}
return;
}
if (event.getSpawnReason() != SpawnReason.CUSTOM) {
event.setCancelled(true);
return;
}
LivingEntity entity = (LivingEntity) event.getEntity();
if (arena.isRunning() && entity instanceof Slime)
monsters.addMonster(entity);
// If running == true, setCancelled(false), and vice versa.
event.setCancelled(!arena.isRunning());
}
public void onEntityExplode(EntityExplodeEvent event) {
if (!monsters.getMonsters().contains(event.getEntity()) && !arena.getRegion().contains(event.getLocation(), 10))
return;
monsters.removeMonster(event.getEntity());
// Cancel if the arena isn't running
if (!arena.isRunning()) {
event.setCancelled(true);
return;
}
// Uncancel, just in case.
event.setCancelled(false);
// If the arena isn't destructible, just clear the blocklist.
if (!softRestore && protect) {
List<Block> blocks = new LinkedList<Block>(arena.getBlocks());
event.blockList().retainAll(blocks);
return;
}
if (!softRestoreDrops)
event.setYield(0);
// Handle all the blocks in the block list.
for (Block b : event.blockList()) {
BlockState state = b.getState();
if (state.getData() instanceof Door && ((Door) state.getData()).isTopHalf()) {
state = b.getRelative(BlockFace.DOWN).getState();
}
else if (state.getData() instanceof Bed && ((Bed) state.getData()).isHeadOfBed()) {
state = b.getRelative(((Bed) state.getData()).getFacing().getOppositeFace()).getState();
}
// Create a Repairable from the block.
Repairable r = null;
if (state instanceof ContainerBlock)
r = new RepairableContainer(state);
else if (state instanceof Sign)
r = new RepairableSign(state);
else if (state.getData() instanceof Bed)
r = new RepairableBed(state);
else if (state.getData() instanceof Door)
r = new RepairableDoor(state);
else if (state.getData() instanceof Attachable || state.getData() instanceof Redstone)
r = new RepairableAttachable(state);
else
r = new RepairableBlock(state);
// Cakes and liquids should just get removed. If player-placed block, drop as item.
Material mat = state.getType();
if (mat == Material.CAKE_BLOCK || mat == Material.WATER || mat == Material.LAVA)
arena.removeBlock(b);
else if (arena.removeBlock(b))
arena.getWorld().dropItemNaturally(b.getLocation(), new ItemStack(state.getTypeId(), 1));
else if (softRestore)
arena.addRepairable(r);
else
arena.queueRepairable(r);
}
}
/******************************************************
*
* DEATH LISTENERS
*
******************************************************/
public void onEntityDeath(EntityDeathEvent event) {
if (event instanceof PlayerDeathEvent) {
onPlayerDeath((PlayerDeathEvent) event, (Player) event.getEntity());
}
else if (monsters.removeMonster(event.getEntity())) {
onMonsterDeath(event);
}
}
private void onPlayerDeath(PlayerDeathEvent event, Player player) {
if (arena.inArena(player) || arena.inLobby(player)) {
event.getDrops().clear();
event.setDroppedExp(0);
event.setKeepLevel(true);
arena.playerDeath(player);
}
}
public boolean onPlayerRespawn(PlayerRespawnEvent event) {
Player p = event.getPlayer();
if (!arena.isDead(p)) {
return false;
}
Location loc = arena.getRespawnLocation(p);
event.setRespawnLocation(loc);
arena.playerRespawn(p);
return true;
}
private void onMonsterDeath(EntityDeathEvent event) {
EntityDamageEvent e1 = event.getEntity().getLastDamageCause();
EntityDamageByEntityEvent e2 = (e1 instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) e1 : null;
Entity damager = (e2 != null) ? e2.getDamager() : null;
// Make sure to grab the owner of a projectile/pet
if (damager instanceof Projectile) {
damager = ((Projectile) damager).getShooter();
}
else if (damager instanceof Wolf && arena.hasPet(damager)) {
damager = (Player) ((Wolf) damager).getOwner();
}
// If the damager was a player, add to kills.
if (damager instanceof Player) {
ArenaPlayer ap = arena.getArenaPlayer((Player) damager);
if (ap != null) {
ArenaPlayerStatistics stats = ap.getStats();
if (stats != null) {
ap.getStats().inc("kills");
}
}
}
if (!monsterExp)
event.setDroppedExp(0);
event.getDrops().clear();
List<ItemStack> loot = monsters.getLoot(event.getEntity());
if (loot != null && !loot.isEmpty()) {
event.getDrops().add(getRandomItem(loot));
}
return;
}
private ItemStack getRandomItem(List<ItemStack> stacks) {
return stacks.get((new Random()).nextInt(stacks.size()));
}
/******************************************************
*
* DAMAGE LISTENERS
*
******************************************************/
public void onEntityDamage(EntityDamageEvent event) {
Entity damagee = event.getEntity();
if (!arena.isRunning() || !arena.getRegion().contains(damagee.getLocation())) {
return;
}
EntityDamageByEntityEvent edbe = (event instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) event : null;
Entity damager = null;
if (edbe != null) {
damager = edbe.getDamager();
if (damager instanceof Projectile) {
damager = ((Projectile) damager).getShooter();
}
else if (damager instanceof Wolf && arena.hasPet(damager)) {
damager = (Player) ((Wolf) damager).getOwner();
}
}
// Pet wolf
if (damagee instanceof Wolf && arena.hasPet(damagee)) {
onPetDamage(event, (Wolf) damagee, damager);
}
// Player
else if (damagee instanceof Player) {
onPlayerDamage(event, (Player) damagee, damager);
}
// Boss
else if (monsters.getBossMonsters().contains(damagee)) {
onBossDamage(event, (LivingEntity) damagee, damager);
}
// Regular monster
else if (monsters.getMonsters().contains(damagee)) {
onMonsterDamage(event, damagee, damager);
}
}
private void onPlayerDamage(EntityDamageEvent event, Player player, Entity damager) {
// Cancel all damage in the lobby and spec area
if (arena.inLobby(player) || arena.inSpec(player)) {
event.setCancelled(true);
return;
}
// If PvP is disabled and damager is a player, cancel damage
else if (arena.inArena(player)) {
if (!pvpEnabled && damager instanceof Player) {
event.setCancelled(true);
return;
}
event.setCancelled(false);
arena.getArenaPlayer(player).getStats().add("dmgTaken", event.getDamage());
}
}
private void onPetDamage(EntityDamageEvent event, Wolf pet, Entity damager) {
event.setCancelled(true);
}
private void onMonsterDamage(EntityDamageEvent event, Entity monster, Entity damager) {
if (damager instanceof Player) {
Player p = (Player) damager;
if (!arena.inArena(p)) {
event.setCancelled(true);
return;
}
ArenaPlayerStatistics aps = arena.getArenaPlayer(p).getStats();
aps.add("dmgDone", event.getDamage());
aps.inc("hits");
}
else if (damager instanceof Wolf && arena.hasPet(damager)) {
event.setDamage(1);
Player p = (Player) ((Wolf) damager).getOwner();
ArenaPlayerStatistics aps = arena.getArenaPlayer(p).getStats();
aps.add("dmgDone", event.getDamage());
// arena.getArenaPlayer(p).getStats().dmgDone += event.getDamage();
}
else if (damager instanceof LivingEntity) {
if (!monsterInfight)
event.setCancelled(true);
}
}
private void onBossDamage(EntityDamageEvent event, LivingEntity monster, Entity damager) {
// Health the boss back up.
monster.setHealth(monster.getMaxHealth());
// Damage the underlying MABoss.
MABoss boss = monsters.getBoss(monster);
boss.damage(event.getDamage());
// If it died, remove it from the arena.
if (boss.isDead()) {
monsters.removeBoss(monster);
monster.damage(10000);
}
// And "cancel out" the damage.
event.setDamage(1);
}
public void onEntityCombust(EntityCombustEvent event) {
if (monsters.getMonsters().contains(event.getEntity()))
event.setCancelled(true);
}
public void onEntityTarget(EntityTargetEvent event) {
if (!arena.isRunning() || event.isCancelled())
return;
if (arena.hasPet(event.getEntity())) {
if (event.getReason() != TargetReason.TARGET_ATTACKED_OWNER && event.getReason() != TargetReason.OWNER_ATTACKED_TARGET)
return;
if (!(event.getTarget() instanceof Player))
return;
// If the target is a player, cancel.
event.setCancelled(true);
}
else if (monsters.getMonsters().contains(event.getEntity())) {
if (event.getReason() == TargetReason.FORGOT_TARGET)
event.setTarget(MAUtils.getClosestPlayer(plugin, event.getEntity(), arena));
else if (event.getReason() == TargetReason.TARGET_DIED)
event.setTarget(MAUtils.getClosestPlayer(plugin, event.getEntity(), arena));
else if (event.getReason() == TargetReason.TARGET_ATTACKED_ENTITY)
if (arena.hasPet(event.getTarget()))
event.setCancelled(true);
else if (event.getReason() == TargetReason.CLOSEST_PLAYER)
if (!arena.inArena((Player) event.getTarget()))
event.setCancelled(true);
}
}
public void onEntityChangeBlock(EntityChangeBlockEvent event) {
if (arena.getRegion().contains(event.getBlock().getLocation()))
event.setCancelled(true);
}
public void onEntityRegainHealth(EntityRegainHealthEvent event) {
if (!arena.isRunning())
return;
if (!(event.getEntity() instanceof Player) || !arena.inArena((Player) event.getEntity()))
return;
if (!foodRegen && event.getRegainReason() == RegainReason.SATIATED) {
event.setCancelled(true);
}
}
public void onFoodLevelChange(FoodLevelChangeEvent event) {
if (!arena.isRunning())
return;
if (!(event.getEntity() instanceof Player) || !arena.inArena((Player) event.getEntity()))
return;
// If the food level is locked, cancel all changes.
if (lockFoodLevel)
event.setCancelled(true);
}
public void onPlayerAnimation(PlayerAnimationEvent event) {
if (!arena.isRunning() || !arena.inArena(event.getPlayer()))
return;
arena.getArenaPlayer(event.getPlayer()).getStats().inc("swings");
}
public void onPlayerDropItem(PlayerDropItemEvent event) {
Player p = event.getPlayer();
// If the player is active in the arena, only cancel if sharing is not
// allowed
if (arena.inArena(p)) {
if (!canShare) {
Messenger.tellPlayer(p, Msg.LOBBY_DROP_ITEM);
event.setCancelled(true);
}
}
// Else, if the player is in the lobby or a spectator, just cancel
else if (arena.inLobby(p) || arena.inSpec(p)) {
Messenger.tellPlayer(p, Msg.LOBBY_DROP_ITEM);
event.setCancelled(true);
}
/*
* If the player is not in the arena in any way (as arena player, lobby
* player or a spectator), but they -are- in the region, it must mean
* they are trying to drop items when not allowed
*/
else if (region.contains(p.getLocation())) {
Messenger.tellPlayer(p, Msg.LOBBY_DROP_ITEM);
event.setCancelled(true);
}
/*
* If the player is in the banned set, it means they got kicked or
* disconnected during a session, meaning they are more than likely
* trying to steal items, if a PlayerDropItemEvent is fired.
*/
else if (banned.contains(p)) {
plugin.warning("Player " + p.getName() + " tried to steal class items!");
event.setCancelled(true);
}
}
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) {
if (!arena.getReadyPlayersInLobby().contains(event.getPlayer()) && !arena.inArena(event.getPlayer()))
return;
if (!arena.isRunning()) {
event.getBlockClicked().getRelative(event.getBlockFace()).setTypeId(0);
event.setCancelled(true);
return;
}
Block liquid = event.getBlockClicked().getRelative(event.getBlockFace());
arena.addBlock(liquid);
}
public void onPlayerInteract(PlayerInteractEvent event) {
Player p = event.getPlayer();
if (arena.inArena(p) || !arena.inLobby(p))
return;
// Player is in the lobby, so disallow using items.
Action a = event.getAction();
if (a == Action.RIGHT_CLICK_AIR || a == Action.RIGHT_CLICK_BLOCK) {
event.setUseItemInHand(Result.DENY);
event.setCancelled(true);
}
// If there's no block involved, just return.
if (!event.hasBlock())
return;
// Iron block
if (event.getClickedBlock().getTypeId() == 42) {
handleReadyBlock(p);
}
// Sign
else if (event.getClickedBlock().getState() instanceof Sign) {
Sign sign = (Sign) event.getClickedBlock().getState();
handleSign(sign, p);
}
}
private void handleReadyBlock(Player p) {
if (arena.getArenaPlayer(p).getArenaClass() != null) {
Messenger.tellPlayer(p, Msg.LOBBY_PLAYER_READY);
arena.playerReady(p);
}
else {
Messenger.tellPlayer(p, Msg.LOBBY_PICK_CLASS);
}
}
private void handleSign(Sign sign, Player p) {
// Check if the first line is a class name.
String className = ChatColor.stripColor(sign.getLine(0)).toLowerCase();
if (!arena.getClasses().containsKey(className) && !className.equals("random"))
return;
// Check for permission.
if (!plugin.has(p, "mobarena.classes." + className) && !className.equals("random")) {
Messenger.tellPlayer(p, Msg.LOBBY_CLASS_PERMISSION);
return;
}
// Delay the inventory stuff to ensure that right-clicking works.
delayAssignClass(p, className);
}
private void delayAssignClass(final Player p, final String className) {
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin,new Runnable() {
public void run() {
arena.assignClass(p, className);
if (!className.equalsIgnoreCase("random"))
Messenger.tellPlayer(p, Msg.LOBBY_CLASS_PICKED, TextUtils.camelCase(className), arena.getClassLogo(className));
else
Messenger.tellPlayer(p, Msg.LOBBY_CLASS_RANDOM);
}
});
}
public void onPlayerQuit(PlayerQuitEvent event) {
Player p = event.getPlayer();
if (!arena.isEnabled() || (!arena.inArena(p) && !arena.inLobby(p)))
return;
arena.playerLeave(p);
banned.add(p);
scheduleUnban(p, 20);
}
public void onPlayerKick(PlayerKickEvent event) {
Player p = event.getPlayer();
if (!arena.isEnabled() || (!arena.inArena(p) && !arena.inLobby(p))) {
return;
}
arena.playerLeave(p);
banned.add(p);
scheduleUnban(p, 20);
}
private void scheduleUnban(final Player p, int ticks) {
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
public void run() {
banned.remove(p);
}
}, ticks);
}
public TeleportResponse onPlayerTeleport(PlayerTeleportEvent event) {
if (!arena.isEnabled() || !region.isSetup() || arena.inEditMode() || allowTeleport) {
return TeleportResponse.IDGAF;
}
Location to = event.getTo();
Location from = event.getFrom();
Player p = event.getPlayer();
if (region.contains(from)) {
// Players not in the arena are free to warp out.
if (!arena.inArena(p) && !arena.inLobby(p) && !arena.inSpec(p)) {
return TeleportResponse.ALLOW;
}
// Covers the case in which both locations are in the arena.
if (region.contains(to) || region.isWarp(to) || to.equals(arena.getPlayerEntry(p))) {
return TeleportResponse.ALLOW;
}
Messenger.tellPlayer(p, Msg.WARP_FROM_ARENA);
return TeleportResponse.REJECT;
}
else if (region.contains(to)) {
if (region.isWarp(from) || region.isWarp(to) || to.equals(arena.getPlayerEntry(p))) {
return TeleportResponse.ALLOW;
}
Messenger.tellPlayer(p, Msg.WARP_TO_ARENA);
return TeleportResponse.REJECT;
}
return TeleportResponse.IDGAF;
}
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
Player p = event.getPlayer();
if (event.isCancelled() || (!arena.inArena(p) && !arena.inLobby(p))) {
return;
}
// This is safe, because commands will always have at least one element.
String base = event.getMessage().split(" ")[0];
// Check if the entire base command is allowed.
if (plugin.getArenaMaster().isAllowed(base)) {
return;
}
// If not, check if the specific command is allowed.
String noslash = event.getMessage().substring(1);
if (plugin.getArenaMaster().isAllowed(noslash)) {
return;
}
// This is dirty, but it ensures that commands are indeed blocked.
event.setMessage("/");
// Cancel the event regardless.
event.setCancelled(true);
Messenger.tellPlayer(p, Msg.MISC_COMMAND_NOT_ALLOWED);
}
}
-141
View File
@@ -1,141 +0,0 @@
package com.garbagemule.MobArena;
import java.sql.Timestamp;
import java.util.Date;
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;
import com.garbagemule.MobArena.util.data.XML;
import com.garbagemule.MobArena.util.data.YAML;
public class ArenaLog
{
public MobArena plugin;
public Arena arena;
public Timestamp startTime, endTime;
public int lastWave;
public Map<Player,ArenaPlayer> players;
public Map<String,Integer> distribution;
/**
* Create a new ArenaLog.
* @param plugin MobArena instance
* @param arena The arena
*/
public ArenaLog(MobArena plugin, Arena arena)
{
this.plugin = plugin;
this.arena = arena;
this.players = new HashMap<Player,ArenaPlayer>(arena.arenaPlayers.size());
this.distribution = new HashMap<String,Integer>(arena.classes.size());
}
/**
* Start logging by creating ArenaPlayer objects and recording
* the class distributions and the start time.
*/
public void start()
{
// Populate the data maps
populatePlayerMap();
populateDistributionMap();
// Grab the current timestamp
startTime = new Timestamp((new Date()).getTime());
}
/**
* End logging by recording the last wave and the end time.
*/
public void end()
{
lastWave = arena.spawnThread.getWave() - 1;
endTime = new Timestamp((new Date()).getTime());
}
/**
* Map players to ArenaPlayer objects.
*/
private void populatePlayerMap()
{
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);
// 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()
{
if (arena.logging.equals("xml"))
XML.saveSessionData(this);
else if (arena.logging.equals("yml") || arena.logging.equals("yaml"))
YAML.saveSessionData(this);
else
PlainText.saveSessionData(this);
//CSV.saveSessionData(this, plugin);
//YAML.saveSessionData(this);
}
/**
* Update the totals-file
*/
public void updateArenaTotals()
{
Totals.updateArenaTotals(this);
if (arena.logging.equals("xml"))
XML.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).getStats().kills++;
}
public void playerDamager(Player p, int damage)
{
players.get(p).getStats().dmgDone += damage;
}
public void playerDamagee(Player p, int damage)
{
players.get(p).getStats().dmgTaken += damage;
}
}
@@ -1,147 +0,0 @@
package com.garbagemule.MobArena;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
//import org.bukkit.util.config.Configuration;
//import com.garbagemule.ArenaPlugin.Master;
public abstract class ArenaMaster //implements Master
{
protected Arena selectedArena;
// Settings
protected boolean enabled, updateNotify;
// Classes
protected Set<String> classes;
protected Map<String,List<ItemStack>> classItems, classArmor;
protected Map<String,Map<String,Boolean>> classPerms;
//protected Map<Integer,Map<Player,List<ItemStack>>> classBonuses;
protected Map<Player,Arena> arenaMap;
// Location map
protected Map<Player,Location> locations = new HashMap<Player,Location>();
// Arena list
protected List<Arena> arenas;
// Listeners
protected Set<MobArenaListener> listeners = new HashSet<MobArenaListener>();
/*/////////////////////////////////////////////////////////////////////////
//
// Arena getters
//
/////////////////////////////////////////////////////////////////////////*/
public abstract List<Arena> getEnabledArenas();
public abstract List<Arena> getPermittedArenas(Player p);
public abstract List<Arena> getEnabledAndPermittedArenas(Player p);
public abstract Arena getArenaAtLocation(Location loc);
public abstract List<Arena> getArenasInWorld(World world);
public abstract List<Player> getAllPlayers();
public abstract List<Player> getAllPlayersInArena(String arenaName);
public abstract List<Player> getAllLivingPlayers();
public abstract List<Player> getLivingPlayersInArena(String arenaName);
public abstract Arena getArenaWithPlayer(Player p);
public abstract Arena getArenaWithPlayer(String playerName);
public abstract Arena getArenaWithSpectator(Player p);
public abstract Arena getArenaWithMonster(Entity e);
public abstract Arena getArenaWithPet(Entity e);
public abstract Arena getArenaWithName(String configName);
public abstract Arena getArenaWithName(Collection<Arena> arenas, String configName);
/*/////////////////////////////////////////////////////////////////////////
//
// Initialization
//
/////////////////////////////////////////////////////////////////////////*/
public abstract void initialize();
/**
* Load the global settings.
*/
public abstract void loadSettings();
/**
* Load all class-related stuff.
*/
public abstract void loadClasses();
/**
* Load all arena-related stuff.
*/
public abstract void loadArenas();
public abstract Arena createArenaNode(String configName, World world);
public abstract void removeArenaNode(String configName);
/*/////////////////////////////////////////////////////////////////////////
//
// Update and serialization methods
//
/////////////////////////////////////////////////////////////////////////*/
/**
* Update one, two or all three of global settings, classes
* and arenas (arenas with deserialization).
*/
public abstract void update(boolean settings, boolean classes, boolean arenalist);
/**
* Serialize the global settings.
*/
public abstract void serializeSettings();
/**
* Serialize all arena configs.
*/
public abstract void serializeArenas();
/**
* Deserialize all arena configs. Updates the arena list to
* include only the current arenas (not ones added in the
* actual file) that are also in the config-file.
*/
public abstract void deserializeArenas();
public abstract void updateSettings();
public abstract void updateClasses();
public abstract void updateArenas();
public abstract void updateAll();
}
@@ -0,0 +1,591 @@
package com.garbagemule.MobArena;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.PluginManager;
import com.garbagemule.MobArena.ArenaImpl;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.ArenaClass.ArmorType;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.util.ItemParser;
import com.garbagemule.MobArena.util.TextUtils;
import com.garbagemule.MobArena.util.config.Config;
import com.garbagemule.MobArena.util.config.ConfigSection;
import com.garbagemule.MobArena.util.config.ConfigUtils;
public class ArenaMasterImpl implements ArenaMaster
{
private MobArena plugin;
private Config config;
private List<Arena> arenas;
private Map<Player, Arena> arenaMap;
private Arena selectedArena;
private Map<String, ArenaClass> classes;
private Set<String> allowedCommands;
/**
* Default constructor.
*/
public ArenaMasterImpl(MobArena plugin) {
this.plugin = plugin;
this.config = plugin.getMAConfig();
this.arenas = new LinkedList<Arena>();
this.arenaMap = new HashMap<Player, Arena>();
this.classes = new HashMap<String, ArenaClass>();
this.allowedCommands = new HashSet<String>();
}
/*
* /////////////////////////////////////////////////////////////////////////
* // // NEW METHODS IN REFACTORING //
* /////////////////////////////////////////////////////////////////////////
*/
public MobArena getPlugin() {
return plugin;
}
public boolean isEnabled() {
return config.getBoolean("global-settings.enabled", true);
}
public void setEnabled(boolean value) {
config.set("global-settings.enabled", value);
}
public boolean notifyOnUpdates() {
return config.getBoolean("global-settings.update-notification", false);
}
public Arena getSelectedArena() {
return selectedArena;
}
public void setSelectedArena(Arena arena) {
selectedArena = arena;
}
public List<Arena> getArenas() {
return arenas;
}
public Map<String, ArenaClass> getClasses() {
return classes;
}
public void addPlayer(Player p, Arena arena) {
arenaMap.put(p, arena);
}
public Arena removePlayer(Player p) {
return arenaMap.remove(p);
}
public void resetArenaMap() {
arenaMap.clear();
}
public boolean isAllowed(String command) {
return allowedCommands.contains(command);
}
/*
* /////////////////////////////////////////////////////////////////////////
* // // Arena getters //
* /////////////////////////////////////////////////////////////////////////
*/
public List<Arena> getEnabledArenas() {
List<Arena> result = new LinkedList<Arena>();
for (Arena arena : arenas)
if (arena.isEnabled())
result.add(arena);
return result;
}
public List<Arena> getPermittedArenas(Player p) {
List<Arena> result = new LinkedList<Arena>();
for (Arena arena : arenas)
if (plugin.has(p, "mobarena.arenas." + arena.configName()))
result.add(arena);
return result;
}
public List<Arena> getEnabledAndPermittedArenas(Player p) {
List<Arena> result = new LinkedList<Arena>();
for (Arena arena : arenas)
if (arena.isEnabled() && plugin.has(p, "mobarena.arenas." + arena.configName()))
result.add(arena);
return result;
}
public Arena getArenaAtLocation(Location loc) {
for (Arena arena : arenas)
if (arena.getRegion().contains(loc))
return arena;
return null;
}
public List<Arena> getArenasInWorld(World world) {
List<Arena> result = new LinkedList<Arena>();
for (Arena arena : arenas)
if (arena.getWorld().equals(world))
result.add(arena);
return result;
}
public List<Player> getAllPlayers() {
List<Player> result = new LinkedList<Player>();
for (Arena arena : arenas)
result.addAll(arena.getAllPlayers());
return result;
}
public List<Player> getAllPlayersInArena(String arenaName) {
Arena arena = getArenaWithName(arenaName);
return (arena != null) ? new LinkedList<Player>(arena.getPlayersInArena()) : new LinkedList<Player>();
}
public List<Player> getAllLivingPlayers() {
List<Player> result = new LinkedList<Player>();
for (Arena arena : arenas)
result.addAll(arena.getPlayersInArena());
return result;
}
public List<Player> getLivingPlayersInArena(String arenaName) {
Arena arena = getArenaWithName(arenaName);
return (arena != null) ? new LinkedList<Player>(arena.getPlayersInArena()) : new LinkedList<Player>();
}
public Arena getArenaWithPlayer(Player p) {
return arenaMap.get(p);
}
public Arena getArenaWithPlayer(String playerName) {
return arenaMap.get(plugin.getServer().getPlayer(playerName));
}
public Arena getArenaWithSpectator(Player p) {
for (Arena arena : arenas) {
if (arena.getSpectators().contains(p))
return arena;
}
return null;
}
public Arena getArenaWithMonster(Entity e) {
for (Arena arena : arenas)
if (arena.getMonsterManager().getMonsters().contains(e))
return arena;
return null;
}
public Arena getArenaWithPet(Entity e) {
for (Arena arena : arenas)
if (arena.hasPet(e))
return arena;
return null;
}
public Arena getArenaWithName(String configName) {
return getArenaWithName(this.arenas, configName);
}
public Arena getArenaWithName(Collection<Arena> arenas, String configName) {
for (Arena arena : arenas)
if (arena.configName().equals(configName))
return arena;
return null;
}
/*
* /////////////////////////////////////////////////////////////////////////
* // // Initialization //
* /////////////////////////////////////////////////////////////////////////
*/
public void initialize() {
config.load();
loadSettings();
loadClasses();
loadArenas();
config.save();
}
/**
* Load the global settings.
*/
public void loadSettings() {
ConfigUtils.replaceAllNodes(plugin, config, "global-settings", "global-settings.yml");
ConfigSection section = config.getConfigSection("global-settings");
// Grab the commands string
String cmds = section.getString("allowed-commands", "");
// Split by commas
String[] parts = cmds.split(",");
// Add in the /ma command.
allowedCommands.add("/ma");
// Add in each command
for (String part : parts) {
allowedCommands.add(part.trim().toLowerCase());
}
}
/**
* Load all class-related stuff.
*/
public void loadClasses() {
Set<String> classNames = config.getKeys("classes");
// If no classes were found, load the defaults.
if (classNames == null || classNames.isEmpty()) {
loadDefaultClasses();
classNames = config.getKeys("classes");
}
// Establish the map.
classes = new HashMap<String, ArenaClass>();
// Load each individual class.
for (String className : classNames) {
loadClass(className.toLowerCase());
}
}
/**
* Loads the classes in res/classes.yml into the config-file.
*/
public void loadDefaultClasses() {
ConfigUtils.addMissingNodes(plugin, config, "classes", "classes.yml");
}
/**
* Helper method for loading a single class.
*/
private ArenaClass loadClass(String className) {
// Grab the class section.
ConfigSection section = config.getConfigSection("classes." + TextUtils.camelCase(className));
// If the section doesn't exist, the class doesn't either.
if (section == null) {
plugin.error("Failed to load class '" + TextUtils.camelCase(className) + "'.");
return null;
}
ArenaClass arenaClass = new ArenaClass(className);
// Parse the items-node
String items = section.getString("items", "");
if (!items.equals("")) {
List<ItemStack> stacks = ItemParser.parseItems(items);
arenaClass.setItems(stacks);
}
// And the legacy armor-node
String armor = section.getString("armor", "");
if (!armor.equals("")) {
List<ItemStack> stacks = ItemParser.parseItems(armor);
arenaClass.setArmor(stacks);
}
// Get armor strings
String head = section.getString("helmet", null);
String chest = section.getString("chestplate", null);
String legs = section.getString("leggings", null);
String feet = section.getString("boots", null);
// Parse to ItemStacks
ItemStack helmet = ItemParser.parseItem(head);
ItemStack chestplate = ItemParser.parseItem(chest);
ItemStack leggings = ItemParser.parseItem(legs);
ItemStack boots = ItemParser.parseItem(feet);
// Set in ArenaClass
arenaClass.setHelmet(helmet);
arenaClass.setChestplate(chestplate);
arenaClass.setLeggings(leggings);
arenaClass.setBoots(boots);
// Per-class permissions
loadClassPermissions(arenaClass, section);
// Register the permission.
registerPermission("mobarena.classes." + className, PermissionDefault.TRUE).addParent("mobarena.classes", true);
// Finally add the class to the classes map.
classes.put(className, arenaClass);
return arenaClass;
}
private void loadClassPermissions(ArenaClass arenaClass, ConfigSection section) {
List<String> perms = section.getStringList("permissions", null);
if (perms.isEmpty())
return;
for (String perm : perms) {
// If the permission starts with - or ^, it must be revoked.
boolean value = true;
if (perm.startsWith("-") || perm.startsWith("^")) {
perm = perm.substring(1).trim();
value = false;
}
arenaClass.addPermission(perm, value);
}
}
public ArenaClass createClassNode(String className, PlayerInventory inv, boolean safe) {
String path = "classes." + TextUtils.camelCase(className);
if (safe && config.getConfigSection(path) != null) {
return null;
}
// Create the node.
config.set(path, "");
// Grab the section.
ConfigSection section = config.getConfigSection(path);
// Take the current items and armor.
section.set("items", ItemParser.parseString(inv.getContents()));
section.set("armor", ItemParser.parseString(inv.getArmorContents()));
// If the helmet isn't a real helmet, set it explicitly.
ItemStack helmet = inv.getHelmet();
if (helmet.getTypeId() != 0 && ArmorType.getType(helmet) != ArmorType.HELMET) {
section.set("helmet", ItemParser.parseString(helmet));
}
// Save changes.
config.save();
// Load the class
return loadClass(className.toLowerCase());
}
public void removeClassNode(String className) {
if (!classes.containsKey(className.toLowerCase()))
throw new IllegalArgumentException("Class does not exist!");
// Remove the class from the config-file and save it.
config.remove("classes." + className);
config.save();
// Remove the class from the map.
classes.remove(className.toLowerCase());
unregisterPermission("mobarena.arenas." + className.toLowerCase());
}
public boolean addClassPermission(String className, String perm) {
return addRemoveClassPermission(className, perm, true);
}
public boolean removeClassPermission(String className, String perm) {
return addRemoveClassPermission(className, perm, false);
}
private boolean addRemoveClassPermission(String className, String perm, boolean add) {
String path = "classes." + TextUtils.camelCase(className);
if (config.getConfigSection(path) == null)
return false;
// Grab the class section
ConfigSection section = config.getConfigSection(path);
// Get any previous nodes
List<String> nodes = section.getStringList("permissions", null);
if (nodes.contains(perm))
return false;
// Add or remove.
if (add) {
removeContradictions(nodes, perm);
nodes.add(perm);
}
else {
nodes.remove(perm);
}
// Replace the set.
section.set("permissions", nodes);
config.save();
// Reload the class.
loadClass(className);
return true;
}
/**
* Removes any nodes that would contradict the permission, e.g. if the node
* 'mobarena.use' is in the set, and the perm node is '-mobarena.use', the
* '-mobarena.use' node is removed as to not contradict the new
* 'mobarena.use' node.
*/
private void removeContradictions(List<String> nodes, String perm) {
if (perm.startsWith("^") || perm.startsWith("-")) {
nodes.remove(perm.substring(1).trim());
}
else {
nodes.remove("^" + perm);
nodes.remove("-" + perm);
}
}
/**
* Load all arena-related stuff.
*/
public void loadArenas() {
Set<String> arenaNames = config.getKeys("arenas");
// If no arenas were found, create a default node.
if (arenaNames == null || arenaNames.isEmpty()) {
createArenaNode("default", plugin.getServer().getWorlds().get(0));
arenaNames = config.getKeys("arenas");
}
// Establish the list.
arenas = new LinkedList<Arena>();
for (String arenaName : arenaNames) {
loadArena(arenaName);
}
selectedArena = arenas.get(0);
}
private Arena loadArena(String arenaName) {
String path = "arenas." + arenaName;
String worldName = config.getString(path + ".settings.world", "");
World world = null;
// If a string was found, try to fetch the world from the server.
if (!worldName.equals("")) {
world = plugin.getServer().getWorld(worldName);
if (world == null) {
plugin.error("The world '" + worldName + "' for arena '" + arenaName + "' does not exist!");
return null;
}
}
// Otherwise, use the default world.
else {
world = plugin.getServer().getWorlds().get(0);
plugin.warning("Could not find the world for arena '" + arenaName + "'. Using default world ('" + world.getName() + "')! Check the config-file!");
}
// Assert all settings nodes.
ConfigUtils.replaceAllNodes(plugin, config, path + ".settings", "settings.yml");
// Create an Arena with the name and world.
Arena arena = new ArenaImpl(plugin, config, arenaName, world);
// Register the permission
registerPermission("mobarena.arenas." + arenaName, PermissionDefault.TRUE);
// Finally, add it to the arena list.
arenas.add(arena);
return arena;
}
public Arena createArenaNode(String arenaName, World world) {
String path = "arenas." + arenaName;
if (config.getConfigSection(path) != null)
throw new IllegalArgumentException("Arena already exists!");
// Extract the default settings and update the world-node.
ConfigUtils.replaceAllNodes(plugin, config, path + ".settings", "settings.yml");
config.set(path + ".settings.world", world.getName());
// Extract the default waves.
ConfigUtils.replaceAllNodes(plugin, config, path + ".waves", "waves.yml");
// Extract the default rewards.
ConfigUtils.replaceAllNodes(plugin, config, path + ".rewards", "rewards.yml");
// Save the changes.
config.save();
// Load the arena
return loadArena(arenaName);
}
public void removeArenaNode(Arena arena) {
// Remove the arena from the config-file and save it.
config.remove("arenas." + arena.configName());
config.save();
// Remove the arena from the list.
arenas.remove(arena);
unregisterPermission("mobarena.arenas." + arena.configName());
}
public void reloadConfig() {
boolean wasEnabled = isEnabled();
// If MobArena was enabled, disable it before updating.
if (wasEnabled) {
setEnabled(false);
}
for (Arena a : arenas) {
a.forceEnd();
}
config.load();
loadSettings();
loadClasses();
loadArenas();
// If MobArena was enabled, re-enable it after updating.
if (wasEnabled) {
setEnabled(true);
}
}
public void saveConfig() {
config.save();
}
private Permission registerPermission(String permString, PermissionDefault value) {
PluginManager pm = plugin.getServer().getPluginManager();
Permission perm = pm.getPermission(permString);
if (perm == null) {
perm = new Permission(permString);
perm.setDefault(value);
pm.addPermission(perm);
}
return perm;
}
private void unregisterPermission(String s) {
plugin.getServer().getPluginManager().removePermission(s);
}
}
@@ -1,388 +0,0 @@
package com.garbagemule.MobArena;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.util.Config;
public class ArenaMasterStandard extends ArenaMaster
{
private MobArena plugin;
private Config config;
/**
* Default constructor.
*/
public ArenaMasterStandard(MobArenaPlugin instance)
{
plugin = (MobArena) instance;
config = plugin.getMAConfig();
arenas = new LinkedList<Arena>();
arenaMap = new HashMap<Player,Arena>();
}
/*/////////////////////////////////////////////////////////////////////////
//
// Arena getters
//
/////////////////////////////////////////////////////////////////////////*/
public List<Arena> getEnabledArenas()
{
List<Arena> result = new LinkedList<Arena>();
for (Arena arena : arenas)
if (arena.enabled)
result.add(arena);
return result;
}
public List<Arena> getPermittedArenas(Player p)
{
List<Arena> result = new LinkedList<Arena>();
for (Arena arena : arenas)
if (plugin.has(p, "mobarena.arenas." + arena.configName()))
result.add(arena);
return result;
}
public List<Arena> getEnabledAndPermittedArenas(Player p)
{
List<Arena> result = new LinkedList<Arena>();
for (Arena arena : arenas)
if (arena.enabled && plugin.has(p, "mobarena.arenas." + arena.configName()))
result.add(arena);
return result;
}
public Arena getArenaAtLocation(Location loc)
{
for (Arena arena : arenas)
if (arena.inRegion(loc))
return arena;
return null;
}
public List<Arena> getArenasInWorld(World world)
{
List<Arena> result = new LinkedList<Arena>();
for (Arena arena : arenas)
if (arena.world.equals(world))
result.add(arena);
return result;
}
public List<Player> getAllPlayers()
{
List<Player> result = new LinkedList<Player>();
for (Arena arena : arenas)
result.addAll(arena.getAllPlayers());
return result;
}
public List<Player> getAllPlayersInArena(String arenaName)
{
Arena arena = getArenaWithName(arenaName);
return (arena != null) ? arena.getLivingPlayers() : new LinkedList<Player>();
}
public List<Player> getAllLivingPlayers()
{
List<Player> result = new LinkedList<Player>();
for (Arena arena : arenas)
result.addAll(arena.getLivingPlayers());
return result;
}
public List<Player> getLivingPlayersInArena(String arenaName)
{
Arena arena = getArenaWithName(arenaName);
return (arena != null) ? arena.getLivingPlayers() : new LinkedList<Player>();
}
public Arena getArenaWithPlayer(Player p)
{
return arenaMap.get(p);
}
public Arena getArenaWithPlayer(String playerName)
{
return arenaMap.get(Bukkit.getServer().getPlayer(playerName));
}
public Arena getArenaWithSpectator(Player p)
{
for (Arena arena : arenas)
{
if (arena.specPlayers.contains(p))
return arena;
}
return null;
}
public Arena getArenaWithMonster(Entity e)
{
for (Arena arena : arenas)
if (arena.monsters.contains(e))
return arena;
return null;
}
public Arena getArenaWithPet(Entity e)
{
for (Arena arena : arenas)
if (arena.pets.contains(e))
return arena;
return null;
}
public Arena getArenaWithName(String configName)
{
return getArenaWithName(this.arenas, configName);
}
public Arena getArenaWithName(Collection<Arena> arenas, String configName)
{
for (Arena arena : arenas)
if (arena.configName().equals(configName))
return arena;
return null;
}
/*/////////////////////////////////////////////////////////////////////////
//
// Initialization
//
/////////////////////////////////////////////////////////////////////////*/
public void initialize()
{
config.load();
loadSettings();
loadClasses();
loadArenas();
config.save();
}
/**
* Load the global settings.
*/
public void loadSettings()
{
if (config.getKeys("global-settings") == null)
{
config.setProperty("global-settings.enabled", true);
config.setProperty("global-settings.update-notification", true);
}
enabled = config.getBoolean("global-settings.enabled", true);
updateNotify = config.getBoolean("global-settings.update-notification", true);
}
/**
* Load all class-related stuff.
*/
public void loadClasses()
{
classes = config.getKeys("classes");
if (classes == null)
{
config.setProperty("classes.Archer.items", "wood_sword, bow, arrow:128, grilled_pork");
config.setProperty("classes.Archer.armor", "298,299,300,301");
config.setProperty("classes.Knight.items", "diamond_sword, grilled_pork:2");
config.setProperty("classes.Knight.armor", "306,307,308,309");
config.setProperty("classes.Tank.items", "iron_sword, grilled_pork:3, apple");
config.setProperty("classes.Tank.armor", "310,311,312,313");
config.setProperty("classes.Oddjob.items", "stone_sword, flint_and_steel, netherrack:2, wood_pickaxe, tnt:4, fishing_rod, apple, grilled_pork:3");
config.setProperty("classes.Oddjob.armor", "298,299,300,301");
config.setProperty("classes.Chef.items", "stone_sword, bread:6, grilled_pork:4, mushroom_soup, cake:3, cookie:12");
config.setProperty("classes.Chef.armor", "314,315,316,317");
classes = config.getKeys("classes");
}
classItems = MAUtils.getClassItems(config, "items");
classArmor = MAUtils.getClassItems(config, "armor");
classPerms = MAUtils.getClassPerms(config);
}
/**
* Load all arena-related stuff.
*/
public void loadArenas()
{
arenas = new LinkedList<Arena>();
if (config.getKeys("arenas") == null)
createArenaNode("default", Bukkit.getServer().getWorlds().get(0));
for (String configName : config.getKeys("arenas"))
{
String arenaPath = "arenas." + configName + ".";
String worldName = config.getString(arenaPath + "settings.world", null);
World world;
if (worldName == null || worldName.equals(""))
{
MobArena.warning("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);
Arena arena = new ArenaStandard(MAUtils.nameConfigToArena(configName), world);
arena.load(config);
arenas.add(arena);
}
selectedArena = arenas.get(0);
}
public Arena createArenaNode(String configName, World world)
{
config.setProperty("arenas." + configName + ".settings.world", world.getName());
config.save();
config.load();
config.setProperty("arenas." + configName + ".settings.enabled", true);
config.save();
config.load();
config.setProperty("arenas." + configName + ".settings.protect", true);
config.save();
config.load();
config.setProperty("arenas." + configName + ".settings.entry-fee", "");
config.save();
config.load();
config.setProperty("arenas." + configName + ".settings.logging", false);
config.setProperty("arenas." + configName + ".settings.clear-wave-before-next", false);
config.setProperty("arenas." + configName + ".settings.detonate-creepers", false);
config.setProperty("arenas." + configName + ".settings.detonate-damage", false);
config.setProperty("arenas." + configName + ".settings.lightning", true);
config.setProperty("arenas." + configName + ".settings.auto-equip-armor", true);
config.setProperty("arenas." + configName + ".settings.force-restore", false);
config.setProperty("arenas." + configName + ".settings.soft-restore", false);
config.setProperty("arenas." + configName + ".settings.soft-restore-drops", false);
config.setProperty("arenas." + configName + ".settings.require-empty-inv-join", true);
config.setProperty("arenas." + configName + ".settings.require-empty-inv-spec", true);
config.setProperty("arenas." + configName + ".settings.hellhounds", false);
config.setProperty("arenas." + configName + ".settings.pvp-enabled", false);
config.setProperty("arenas." + configName + ".settings.monster-infight", false);
config.setProperty("arenas." + configName + ".settings.allow-teleporting", false);
config.setProperty("arenas." + configName + ".settings.spectate-on-death", true);
config.setProperty("arenas." + configName + ".settings.share-items-in-arena", true);
config.save();
config.load();
config.setProperty("arenas." + configName + ".settings.player-limit", 0);
config.setProperty("arenas." + configName + ".settings.max-join-distance", 0);
config.save();
config.load();
config.setProperty("arenas." + configName + ".settings.repair-delay", 5);
config.setProperty("arenas." + configName + ".settings.first-wave-delay", 5);
config.setProperty("arenas." + configName + ".settings.wave-interval", 20);
config.setProperty("arenas." + configName + ".settings.special-modulo", 4);
config.setProperty("arenas." + configName + ".settings.max-idle-time", 0);
config.save();
config.load();
Arena arena = new ArenaStandard(MAUtils.nameConfigToArena(configName), world);
arena.load(config);
return arena;
}
public void removeArenaNode(String configName)
{
config.removeProperty("arenas." + configName);
config.save();
}
/*/////////////////////////////////////////////////////////////////////////
//
// Update and serialization methods
//
/////////////////////////////////////////////////////////////////////////*/
/**
* Update one, two or all three of global settings, classes
* and arenas (arenas with deserialization).
*/
public void update(boolean settings, boolean classes, boolean arenalist)
{
boolean tmp = enabled;
enabled = false;
for (Arena arena : arenas)
arena.forceEnd();
config.load();
if (settings) loadSettings();
if (classes) loadClasses();
if (arenalist) deserializeArenas();
config.save();
enabled = tmp;
}
/**
* Serialize the global settings.
*/
public void serializeSettings()
{
String settings = "global-settings.";
config.setProperty(settings + "enabled", enabled);
config.save();
}
/**
* Serialize all arena configs.
*/
public void serializeArenas()
{
for (Arena arena : arenas)
arena.serializeConfig();
}
/**
* Deserialize all arena configs. Updates the arena list to
* include only the current arenas (not ones added in the
* actual file) that are also in the config-file.
*/
public void deserializeArenas()
{
// Get only the arenas in the config.
Set<String> strings = config.getKeys("arenas");
if (strings == null)
return;
// Get their Arena objects.
List<Arena> configArenas = new LinkedList<Arena>();
for (String s : strings)
if (getArenaWithName(s) != null)
configArenas.add(getArenaWithName(s));
// Remove all Arenas no longer in the config.
arenas.retainAll(configArenas);
for (Arena arena : arenas)
arena.deserializeConfig();
// Make sure to update the selected arena to a valid one.
if (!arenas.contains(selectedArena) && arenas.size() >= 1)
selectedArena = arenas.get(0);
}
public void updateSettings() { update(true, false, false); }
public void updateClasses() { update(false, true, false); }
public void updateArenas() { update(false, false, true); }
public void updateAll() { update(true, true, true); }
}
+41 -37
View File
@@ -1,59 +1,63 @@
package com.garbagemule.MobArena;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.garbagemule.MobArena.ArenaPlayerStatistics;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.framework.Arena;
public class ArenaPlayer
{
public MobArena plugin;
public Player player;
public String className;
public Arena arena;
public List<ItemStack> rewards;
public List<Block> blocks;
private Player player;
private ArenaClass arenaClass;
private ArenaPlayerStatistics stats;
protected boolean isDead, inArena, inLobby, inSpec, isReady;
public ArenaPlayer(Player player, Arena arena, MobArena plugin)
{
private boolean isDead;
//private List<ItemStack> rewards;
//private List<Block> blocks;
public ArenaPlayer(Player player, Arena arena, MobArena plugin) {
this.player = player;
this.arena = arena;
this.plugin = plugin;
className = arena.classMap.get(player);
rewards = new LinkedList<ItemStack>();
blocks = new LinkedList<Block>();
stats = new ArenaPlayerStatistics(this);
}
public Player getPlayer() { return player; }
public Arena getArena() { return arena; }
public String getClassName() { return className; }
public Player getPlayer() {
return player;
}
public ArenaClass getArenaClass() {
return arenaClass;
}
public void setArenaClass(ArenaClass arenaClass) {
this.arenaClass = arenaClass;
}
/**
* Check if the player is "dead", i.e. died or not.
* @return true, if the player is either a spectator or played and died, false otherwise
*/
public boolean isDead()
{
public boolean isDead() {
return isDead;
}
/**
* Set the player's death status.
* @param value true, if the player is dead, false otherwise
*/
public void setDead(boolean value)
{
public void setDead(boolean value) {
isDead = value;
}
public ArenaPlayerStatistics getStats() { return stats; }
public void resetStats() {
if (stats != null) {
stats.reset();
return;
}
stats = new ArenaPlayerStatistics(this);
}
public ArenaPlayerStatistics getStats() {
return stats;
}
}
@@ -1,91 +1,130 @@
package com.garbagemule.MobArena;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.ArenaPlayer;
import com.garbagemule.MobArena.ArenaPlayerStatistics;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.util.MutableInt;
public class ArenaPlayerStatistics
{
private String playerName, className;
private ArenaPlayer player;
public int kills, dmgDone, dmgTaken, swings, hits, lastWave;
public ArenaPlayerStatistics(ArenaPlayer player)
{
this.player = player;
private String playerName, className;
private Map<String, MutableInt> ints;
public ArenaPlayerStatistics(ArenaPlayer player) {
this.player = player;
this.playerName = player.getPlayer().getName();
this.className = player.getClassName();
this.className = player.getArenaClass().getName();
reset();
}
public ArenaPlayerStatistics(Player p, Arena arena, MobArena plugin)
{
public void reset() {
if (ints == null) {
ints = new HashMap<String, MutableInt>();
}
ints.clear();
ints.put("kills", new MutableInt());
ints.put("dmgDone", new MutableInt());
ints.put("dmgTaken", new MutableInt());
ints.put("swings", new MutableInt());
ints.put("hits", new MutableInt());
ints.put("lastWave", new MutableInt());
}
public ArenaPlayerStatistics(Player p, Arena arena, MobArena plugin) {
this(new ArenaPlayer(p, arena, plugin));
}
public ArenaPlayer getArenaPlayer()
{
public ArenaPlayer getArenaPlayer() {
return player;
}
public static Comparator<ArenaPlayerStatistics> killComparator()
{
return new Comparator<ArenaPlayerStatistics>()
{
public int compare(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2)
{
if (s1.kills > s2.kills)
return -1;
else if (s1.kills < s2.kills)
return 1;
public String getPlayerName() {
return playerName;
}
public String getClassName() {
return className;
}
public int getInt(String s) {
return ints.get(s).value();
}
public void inc(String s) {
ints.get(s).inc();
}
public void add(String s, int amount) {
ints.get(s).add(amount);
}
public static Comparator<ArenaPlayerStatistics> killComparator() {
return new Comparator<ArenaPlayerStatistics>() {
public int compare(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2) {
int s1kills = s1.getInt("kills");
int s2kills = s2.getInt("kills");
if (s1kills == s2kills)
return 0;
}
};
return (s1kills > s2kills ? -1 : 1);
}
};
}
private static int compareKills(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2)
{
if (s1.kills > s2.kills)
return -1;
else if (s1.kills < s2.kills)
return 1;
return 0;
public static Comparator<ArenaPlayerStatistics> waveComparator() {
return new Comparator<ArenaPlayerStatistics>() {
public int compare(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2) {
int result = compareWaves(s1, s2);
if (result != 0)
return result;
return compareKills(s1, s2);
}
};
}
public static Comparator<ArenaPlayerStatistics> waveComparator()
{
return new Comparator<ArenaPlayerStatistics>()
{
public int compare(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2)
{
int result = compareWaves(s1, s2);
if (result != 0) return result;
return compareKills(s1, s2);
}
};
}
private static int compareWaves(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2)
{
if (s1.lastWave > s2.lastWave)
return -1;
else if (s1.lastWave < s2.lastWave)
return 1;
return 0;
}
public static Comparator<ArenaPlayerStatistics> dmgDoneComparator()
{
return new Comparator<ArenaPlayerStatistics>()
{
public int compare(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2)
{
if (s1.dmgDone > s2.dmgDone)
return -1;
else if (s1.dmgDone < s2.dmgDone)
return 1;
public static Comparator<ArenaPlayerStatistics> dmgDoneComparator() {
return new Comparator<ArenaPlayerStatistics>() {
public int compare(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2) {
int s1dmgDone = s1.getInt("dmgDone");
int s2dmgDone = s2.getInt("dmgDone");
if (s1dmgDone == s2dmgDone)
return 0;
}
};
return (s1dmgDone > s2dmgDone ? -1 : 1);
}
};
}
private static int compareKills(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2) {
int s1kills = s1.getInt("kills");
int s2kills = s2.getInt("kills");
if (s1kills == s2kills)
return 0;
return (s1kills > s2kills ? -1 : 1);
}
private static int compareWaves(ArenaPlayerStatistics s1, ArenaPlayerStatistics s2) {
int s1wave = s1.getInt("lastWave");
int s2wave = s2.getInt("lastWave");
if (s1wave == s2wave)
return 0;
return (s1wave > s2wave ? -1 : 1);
}
}
File diff suppressed because it is too large Load Diff
@@ -1,84 +0,0 @@
package com.garbagemule.MobArena;
import org.bukkit.ChatColor;
import org.bukkit.event.block.BlockBurnEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockListener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.SignChangeEvent;
import com.garbagemule.MobArena.leaderboards.Stats;
public class MABlockListener extends BlockListener
{
private ArenaMaster am;
public MABlockListener(ArenaMaster am)
{
this.am = am;
}
public void onBlockBreak(BlockBreakEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onBlockBreak(event);
}
public void onBlockBurn(BlockBurnEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onBlockBurn(event);
}
public void onBlockPlace(BlockPlaceEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onBlockPlace(event);
}
public void onBlockIgnite(BlockIgniteEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onBlockIgnite(event);
}
public void onSignChange(SignChangeEvent event)
{
if (!event.getPlayer().hasPermission("mobarena.setup.leaderboards"))
return;
if (event.getLine(0).startsWith("[MA]"))
{
String text = event.getLine(0).substring((4));
Arena arena;
Stats stat;
if ((arena = am.getArenaWithName(text)) != null)
{
arena.eventListener.onSignChange(event);
setSignLines(event, ChatColor.GREEN + "MobArena", ChatColor.YELLOW + arena.arenaName(), ChatColor.AQUA + "Players", "---------------");
}
else if ((stat = Stats.fromString(text)) != null)
{
setSignLines(event, ChatColor.GREEN + "", "", ChatColor.AQUA + stat.getFullName(), "---------------");
MAUtils.tellPlayer(event.getPlayer(), "Stat sign created.");
}
}
}
private void setSignLines(SignChangeEvent event, String s1, String s2, String s3, String s4)
{
event.setLine(0, s1);
event.setLine(1, s2);
event.setLine(2, s3);
event.setLine(3, s4);
}
/*
public void onBlockPhysics(BlockPhysicsEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onBlockPhysics(event);
}
*/
}
-149
View File
@@ -1,149 +0,0 @@
package com.garbagemule.MobArena;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
public class MAClass
{
private String name;
private List<ItemStack> items, armor;
private Map<String,Boolean> perms;
public MAClass(String name)
{
this.name = name;
this.items = new LinkedList<ItemStack>();
this.armor = new LinkedList<ItemStack>();
this.perms = new HashMap<String,Boolean>();
}
public MAClass(String name, List<ItemStack> items, List<ItemStack> armor)
{
this.name = name;
this.items = items;
this.armor = armor;
this.perms = new HashMap<String,Boolean>();
sortArmor();
immunizeWeapons();
}
public String getName()
{
return name;
}
public List<ItemStack> getItems()
{
return items;
}
public void setItems(List<ItemStack> items)
{
this.items = items;
immunizeWeapons();
}
public void setArmor(List<ItemStack> armor)
{
this.armor = armor;
sortArmor();
}
public void setPerms(Map<String,Boolean> perms)
{
this.perms = perms;
}
public void giveItems(Player p)
{
PlayerInventory inv = p.getInventory();
for (ItemStack stack : items)
{
inv.addItem(stack.clone());
}
}
public void giveArmor(Player p)
{
PlayerInventory inv = p.getInventory();
inv.setHelmet (armor.get(0));
inv.setChestplate(armor.get(1));
inv.setLeggings (armor.get(2));
inv.setBoots (armor.get(3));
}
private void sortArmor()
{
ItemStack s0 = null, s1 = null, s2 = null, s3 = null;
for (ItemStack stack : armor)
{
if (isHelmet(stack))
s0 = stack;
else if (isChestplate(stack))
s1 = stack;
else if (isLeggings(stack))
s2 = stack;
else if (isBoots(stack))
s3 = stack;
}
armor.set(0, s0);
armor.set(1, s1);
armor.set(2, s2);
armor.set(3, s3);
}
private void immunizeWeapons()
{
for (ItemStack stack : items)
{
}
}
private boolean isHelmet(ItemStack stack)
{
return (!isChestplate(stack) && !isLeggings(stack) && !isBoots(stack));
}
private boolean isChestplate(ItemStack stack)
{
return matches(stack, 299, 303, 307, 311, 315);
}
private boolean isLeggings(ItemStack stack)
{
return matches(stack, 300, 304, 308, 312, 316);
}
private boolean isBoots(ItemStack stack)
{
return matches(stack, 301, 305, 309, 313, 317);
}
private boolean isWeapon(ItemStack stack)
{
return matches(stack, 256, 257, 258, 267, 268, 269, 270, 271, 272, 273,
274, 275, 276, 277, 278, 279, 283, 284, 285, 286,
290, 291, 292, 293, 294, 346);
}
private boolean matches(ItemStack stack, int... ids)
{
int id = stack.getTypeId();
for (int i : ids)
if (id == i)
return true;
return false;
}
}
File diff suppressed because it is too large Load Diff
@@ -1,79 +0,0 @@
package com.garbagemule.MobArena;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EndermanPickupEvent;
import org.bukkit.event.entity.EndermanPlaceEvent;
import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityListener;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import com.garbagemule.MobArena.Arena;
import com.garbagemule.MobArena.ArenaMaster;
public class MAEntityListener extends EntityListener
{
private ArenaMaster am;
public MAEntityListener(ArenaMaster am)
{
this.am = am;
}
public void onEntityRegainHealth(EntityRegainHealthEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onEntityRegainHealth(event);
}
public void onEntityDeath(EntityDeathEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onEntityDeath(event);
}
public void onEntityDamage(EntityDamageEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onEntityDamage(event);
}
public void onCreatureSpawn(CreatureSpawnEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onCreatureSpawn(event);
}
public void onEntityExplode(EntityExplodeEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onEntityExplode(event);
}
public void onEntityCombust(EntityCombustEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onEntityCombust(event);
}
public void onEntityTarget(EntityTargetEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onEntityTarget(event);
}
public void onEndermanPickup(EndermanPickupEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onEndermanPickup(event);
}
public void onEndermanPickup(EndermanPlaceEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onEndermanPlace(event);
}
}
@@ -1,724 +0,0 @@
package com.garbagemule.MobArena;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.ContainerBlock;
import org.bukkit.block.Sign;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Slime;
import org.bukkit.entity.Wolf;
import org.bukkit.event.Event.Result;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockBurnEvent;
import org.bukkit.event.block.BlockEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EndermanPickupEvent;
import org.bukkit.event.entity.EndermanPlaceEvent;
import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
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;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Attachable;
import org.bukkit.material.Bed;
import org.bukkit.material.Door;
import org.bukkit.material.Redstone;
import com.garbagemule.MobArena.leaderboards.Leaderboard;
import com.garbagemule.MobArena.repairable.*;
public class MAListener implements ArenaListener
{
private MobArena plugin;
private Arena arena;
public MAListener(Arena arena, MobArena plugin)
{
this.arena = arena;
this.plugin = plugin;
}
public void onBlockBreak(BlockBreakEvent event)
{
if (onBlockDestroy(event))
return;
event.setCancelled(true);
}
public void onBlockBurn(BlockBurnEvent event)
{
if (onBlockDestroy(event))
return;
event.setCancelled(true);
}
private boolean onBlockDestroy(BlockEvent event)
{
if (!arena.inRegion(event.getBlock().getLocation()) || arena.edit || (!arena.protect && arena.running))
return true;
Block b = event.getBlock();
if (arena.blocks.remove(b) || b.getType() == Material.TNT)
return true;
if (arena.softRestore && arena.running)
{
BlockState state = b.getState();
Repairable r = null;
if (state instanceof ContainerBlock)
r = new RepairableContainer(state);
else if (state instanceof Sign)
r = new RepairableSign(state);
else if (state.getData() instanceof Attachable)
r = new RepairableAttachable(state);
else
r = new RepairableBlock(state);
arena.repairables.add(r);
if (!arena.softRestoreDrops)
b.setTypeId(0);
return true;
}
return false;
}
public void onBlockPlace(BlockPlaceEvent event)
{
Block b = event.getBlock();
if (!arena.inRegion(b.getLocation()) || arena.edit)
return;
if (arena.running && arena.inArena(event.getPlayer()))
{
arena.blocks.add(b);
Material mat = b.getType();
if (mat == Material.WOODEN_DOOR || mat == Material.IRON_DOOR_BLOCK)
arena.blocks.add(b.getRelative(0,1,0));
return;
}
// If the arena isn't running, or if the player isn't in the arena, cancel.
event.setCancelled(true);
}
public void onBlockIgnite(BlockIgniteEvent event)
{
if (!arena.inRegion(event.getBlock().getLocation()))
return;
switch (event.getCause())
{
case LIGHTNING:
event.setCancelled(true);
break;
case SPREAD:
case FLINT_AND_STEEL:
if (arena.running)
arena.blocks.add(event.getBlock());
else
event.setCancelled(true);
break;
default:
break;
}
}
public void onSignChange(SignChangeEvent event)
{
arena.leaderboard = new Leaderboard(plugin, arena, event.getBlock().getLocation());
MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "leaderboard", event.getBlock().getLocation());
MAUtils.tellPlayer(event.getPlayer(), "Leaderboard made. Now set up the stat signs!");
}
public void onCreatureSpawn(CreatureSpawnEvent event)
{
if (!arena.inRegion(event.getLocation())) // || event.getSpawnReason() == SpawnReason.CUSTOM)
return;
LivingEntity entity = (LivingEntity) event.getEntity();
if (arena.running && entity instanceof Slime)
arena.monsters.add(entity);
// If running == true, setCancelled(false), and vice versa.
event.setCancelled(!arena.running);
}
public void onEntityExplode(EntityExplodeEvent event)
{
if (!arena.monsters.contains(event.getEntity()) && !arena.inRegionRadius(event.getLocation(), 10))
return;
arena.monsters.remove(event.getEntity());
// Cancel if the arena isn't running
if (!arena.running)
{
event.setCancelled(true);
return;
}
// Uncancel, just in case.
event.setCancelled(false);
// If the arena isn't destructible, just clear the blocklist.
if (!arena.softRestore && arena.protect)
{
List<Block> blocks = new LinkedList<Block>(arena.blocks);
event.blockList().retainAll(blocks);
return;
}
if (!arena.softRestoreDrops)
event.setYield(0);
// Handle all the blocks in the block list.
for (Block b : event.blockList())
{
BlockState state = b.getState();
if (state.getData() instanceof Door && ((Door) state.getData()).isTopHalf())
state = b.getRelative(BlockFace.DOWN).getState();
else if (state.getData() instanceof Bed && ((Bed) state.getData()).isHeadOfBed())
state = b.getRelative(((Bed) state.getData()).getFacing().getOppositeFace()).getState();
// Create a Repairable from the block.
Repairable r = null;
if (state instanceof ContainerBlock)
r = new RepairableContainer(state);
else if (state instanceof Sign)
r = new RepairableSign(state);
else if (state.getData() instanceof Bed)
r = new RepairableBed(state);
else if (state.getData() instanceof Door)
r = new RepairableDoor(state);
else if (state.getData() instanceof Attachable || state.getData() instanceof Redstone)
r = new RepairableAttachable(state);
else
r = new RepairableBlock(state);
// Cakes and liquids should just get removed. If player-placed block, drop as item.
Material mat = state.getType();
if (mat == Material.CAKE_BLOCK || mat == Material.WATER || mat == Material.LAVA)
arena.blocks.remove(b);
else if (arena.blocks.remove(b))
arena.world.dropItemNaturally(b.getLocation(), new ItemStack(state.getTypeId(), 1));
else if (arena.softRestore)
arena.repairables.add(r);
else
arena.queueRepairable(r);
}
}
/******************************************************
*
* DEATH LISTENERS
*
******************************************************/
public void onEntityDeath(EntityDeathEvent event)
{
if (event.getEntity() instanceof Player)
onPlayerDeath(event, (Player) event.getEntity());
else if (arena.monsters.remove(event.getEntity()))
onMonsterDeath(event);
}
private void onPlayerDeath(EntityDeathEvent event, Player player)
{
if (arena.inArena(player) || arena.lobbyPlayers.contains(player))
{
event.getDrops().clear();
arena.playerDeath(player);
}
}
private void onMonsterDeath(EntityDeathEvent event)
{
EntityDamageEvent e1 = event.getEntity().getLastDamageCause();
EntityDamageByEntityEvent e2 = (e1 instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) e1 : null;
Entity damager = (e2 != null) ? e2.getDamager() : null;
if (damager instanceof Player)
arena.playerKill((Player) damager);
event.getDrops().clear();
arena.resetIdleTimer();
return;
}
/******************************************************
*
* DAMAGE LISTENERS
*
******************************************************/
public void onEntityDamage(EntityDamageEvent event)
{
if (!arena.running) return;
EntityDamageByEntityEvent e = (event instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) event : null;
Entity damagee = event.getEntity();
Entity damager = null;
if (e != null)
{
damager = e.getDamager();
if (damager instanceof Projectile)
damager = ((Projectile) damager).getShooter();
}
event.setCancelled(false);
// Pet wolf
if (damagee instanceof Wolf && arena.pets.contains(damagee))
onPetDamage(event, (Wolf) damagee, damager);
// Player
else if (damagee instanceof Player)
onPlayerDamage(event, (Player) damagee, damager);
// Monster
else if (arena.monsters.contains(damagee))
onMonsterDamage(event, damagee, damager);
}
private void onPlayerDamage(EntityDamageEvent event, Player player, Entity damager)
{
// Cancel all damage in the lobby
if (arena.lobbyPlayers.contains(player))
event.setCancelled(true);
// If not in the lobby or the arena, return
else if (!arena.inArena(player))
return;
// Cancel block explosion damage if detonate-damage: false
else if (!arena.detDamage && event.getCause() == DamageCause.BLOCK_EXPLOSION)
event.setCancelled(true);
// If PvP is disabled and damager is a player, cancel damage
else if (!arena.pvp && damager instanceof Player)
event.setCancelled(true);
// Log damage
if (!event.isCancelled())
arena.arenaPlayerMap.get(player).getStats().dmgTaken += event.getDamage();
}
private void onPetDamage(EntityDamageEvent event, Wolf pet, Entity damager)
{
if (arena.hellhounds && (damager == null || damager instanceof Player))
pet.setFireTicks(32768);
event.setCancelled(true);
}
private void onMonsterDamage(EntityDamageEvent event, Entity monster, Entity damager)
{
if (damager instanceof Player)
{
Player p = (Player) damager;
if (!arena.inArena(p))
{
event.setCancelled(true);
return;
}
arena.arenaPlayerMap.get(p).getStats().dmgDone += event.getDamage();
arena.arenaPlayerMap.get(p).getStats().hits++;
}
else if (damager instanceof Wolf && arena.pets.contains(damager))
{
event.setDamage(1);
arena.arenaPlayerMap.get((Player) ((Wolf) damager).getOwner()).getStats().dmgDone += event.getDamage();
}
else if (damager instanceof LivingEntity)
{
if (!arena.monsterInfight)
event.setCancelled(true);
}
// Boss
if (arena.bossWave != null && monster.equals(arena.bossWave.getEntity()))
{
if (event.getCause() == DamageCause.LIGHTNING)
{
event.setCancelled(true);
return;
}
// Subtract boss health, and reset actual entity health
arena.bossWave.subtractHealth(event.getDamage());
arena.bossWave.getEntity().setHealth(arena.bossWave.getEntity().getMaxHealth());
// Set damage to 1 for knockback and feedback
event.setDamage(1);
// If the boss is dead, remove the entity and create an explosion!
if (arena.bossWave.getHealth() <= 0)
{
arena.bossWave.clear();
arena.bossWave = null;
}
else if (arena.bossWave.getHealth() <= 100 && !arena.bossWave.isLowHealthAnnounced())
{
MAUtils.tellAll(arena, Msg.WAVE_BOSS_LOW_HEALTH);
arena.bossWave.setLowHealthAnnounced(true);
}
}
}
public void onEntityCombust(EntityCombustEvent event)
{
if (arena.monsters.contains(event.getEntity()))
event.setCancelled(true);
}
public void onEntityTarget(EntityTargetEvent event)
{
if (!arena.running || event.isCancelled())
return;
if (arena.pets.contains(event.getEntity()))
{
if (event.getReason() != TargetReason.TARGET_ATTACKED_OWNER && event.getReason() != TargetReason.OWNER_ATTACKED_TARGET)
return;
if (!(event.getTarget() instanceof Player))
return;
// If the target is a player, cancel.
event.setCancelled(true);
}
else if (arena.monsters.contains(event.getEntity()))
{
if (event.getReason() == TargetReason.FORGOT_TARGET)
event.setTarget(MAUtils.getClosestPlayer(event.getEntity(), arena));
else if (event.getReason() == TargetReason.TARGET_DIED)
event.setTarget(MAUtils.getClosestPlayer(event.getEntity(), arena));
else if (event.getReason() == TargetReason.TARGET_ATTACKED_ENTITY)
if (arena.pets.contains(event.getTarget()))
event.setCancelled(true);
else if (event.getReason() == TargetReason.CLOSEST_PLAYER)
if (!arena.inArena((Player) event.getTarget()))
event.setCancelled(true);
}
}
public void onEndermanPickup(EndermanPickupEvent event)
{
if (arena.inRegion(event.getBlock().getLocation()))
event.setCancelled(true);
}
public void onEndermanPlace(EndermanPlaceEvent event)
{
if (arena.inRegion(event.getLocation()))
event.setCancelled(true);
}
public void onEntityRegainHealth(EntityRegainHealthEvent event)
{
if (!arena.running) return;
if (!(event.getEntity() instanceof Player) || !arena.inArena((Player)event.getEntity()))
return;
if (event.getRegainReason() == RegainReason.REGEN)
event.setCancelled(true);
}
public void onPlayerAnimation(PlayerAnimationEvent event)
{
if (!arena.running || !arena.inArena(event.getPlayer()))
return;
arena.arenaPlayerMap.get(event.getPlayer()).getStats().swings++;
}
public void onPlayerDropItem(PlayerDropItemEvent event)
{
Player p = event.getPlayer();
// Player is in the lobby
if (arena.inLobby(p))
{
MAUtils.tellPlayer(p, Msg.LOBBY_DROP_ITEM);
event.setCancelled(true);
}
// Player is in the arena
else if (arena.inArena(p))
{
if (!arena.shareInArena)
{
MAUtils.tellPlayer(p, Msg.LOBBY_DROP_ITEM);
event.setCancelled(true);
}
}
// Player died/left
else if (p.getLocation().equals(arena.spectatorLoc) || p.getLocation().equals(arena.locations.get(p)))
{
MobArena.warning("Player '" + p.getName() + "' tried to steal item " + event.getItemDrop().getItemStack().getType());
event.getItemDrop().remove();
}
// Player is in the spectator area
else if (arena.specPlayers.contains(p))
{
MAUtils.tellPlayer(p, Msg.LOBBY_DROP_ITEM);
event.setCancelled(true);
}
}
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event)
{
if (!arena.readyPlayers.contains(event.getPlayer()) && !arena.inArena(event.getPlayer()))
return;
if (!arena.running)
{
event.getBlockClicked().getRelative(event.getBlockFace()).setTypeId(0);
event.setCancelled(true);
return;
}
Block liquid = event.getBlockClicked().getRelative(event.getBlockFace());
arena.blocks.add(liquid);
}
public void onPlayerInteract(PlayerInteractEvent event)
{
Player p = event.getPlayer();
if (arena.inArena(p) || !arena.inLobby(p))
return;
// Player is in the lobby, so disallow using items.
Action a = event.getAction();
if (a == Action.RIGHT_CLICK_AIR || a == Action.RIGHT_CLICK_BLOCK)
{
event.setUseItemInHand(Result.DENY);
event.setCancelled(true);
}
// If there's no block involved, just return.
if (!event.hasBlock())
return;
// Iron block
if (event.getClickedBlock().getTypeId() == 42)
handleReadyBlock(p);
// Sign
else if (event.getClickedBlock().getState() instanceof Sign)
{
Sign sign = (Sign) event.getClickedBlock().getState();
handleSign(sign, p);
}
}
private void handleReadyBlock(Player p)
{
if (arena.classMap.containsKey(p))
{
MAUtils.tellPlayer(p, Msg.LOBBY_PLAYER_READY);
arena.playerReady(p);
}
else MAUtils.tellPlayer(p, Msg.LOBBY_PICK_CLASS);
}
private void handleSign(Sign sign, Player p)
{
// Check if the first line is a class name.
String className = ChatColor.stripColor(sign.getLine(0));
if (!arena.classes.contains(className) && !className.equalsIgnoreCase("random"))
return;
// Check for permission.
if (!plugin.has(p, "mobarena.classes." + className) && !className.equalsIgnoreCase("random"))
{
MAUtils.tellPlayer(p, Msg.LOBBY_CLASS_PERMISSION);
return;
}
// Delay the inventory stuff to ensure that right-clicking works.
delayAssignClass(p, className);
}
private void delayAssignClass(final Player p, final String className)
{
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin,
new Runnable()
{
public void run()
{
arena.assignClass(p, className);
if (!className.equalsIgnoreCase("random"))
MAUtils.tellPlayer(p, Msg.LOBBY_CLASS_PICKED, className, arena.classItems.get(className).get(0).getType());
else
MAUtils.tellPlayer(p, Msg.LOBBY_CLASS_RANDOM);
}
});
}
public void onPlayerQuit(PlayerQuitEvent event)
{
Player p = event.getPlayer();
if (!arena.enabled || (!arena.inArena(p) && !arena.inLobby(p)))
return;
arena.playerLeave(p);
}
public void onPlayerKick(PlayerKickEvent event)
{
Player p = event.getPlayer();
if (!arena.enabled || (!arena.inArena(p) && !arena.inLobby(p)))
return;
arena.playerLeave(p);
}
public void onPlayerTeleport(PlayerTeleportEvent event)
{
if (!arena.enabled || !arena.setup || arena.allowWarp || arena.edit)
return;
Location to = event.getTo();
Location from = event.getFrom();
Player p = event.getPlayer();
if (arena.inRegion(from))
{
// Covers the case in which both locations are in the arena.
if ((arena.inRegion(to) && arena.running) || isWarp(to) || to.equals(arena.locations.get(p)))
return;
MAUtils.tellPlayer(p, Msg.WARP_FROM_ARENA);
event.setCancelled(true);
}
else if (arena.inRegion(to))
{
if (isWarp(from) || isWarp(to) || to.equals(arena.locations.get(p)))
return;
MAUtils.tellPlayer(p, Msg.WARP_TO_ARENA);
event.setCancelled(true);
}
}
private boolean isWarp(Location l)
{
return l.equals(arena.arenaLoc) || l.equals(arena.lobbyLoc) || l.equals(arena.spectatorLoc);
}
/*public void onPlayerTeleport(PlayerTeleportEvent event)
{
if (!arena.running || arena.edit || !arena.enabled || !arena.setup || arena.allowWarp)
return;
Location to = event.getTo();
Location from = event.getFrom();
if (!arena.inRegion(to) && !arena.inRegion(from))
return;
Player p = event.getPlayer();
Location old = arena.locations.get(p);
if (arena.inArena(p) || arena.inLobby(p) || arena.specPlayers.contains(p))
{
if (arena.inRegion(from))
{
if (arena.inRegion(to) || to.equals(arena.arenaLoc) || to.equals(arena.lobbyLoc) || to.equals(arena.spectatorLoc) || to.equals(old))
return;
MAUtils.tellPlayer(p, Msg.WARP_FROM_ARENA);
event.setCancelled(true);
return;
}
if (arena.inRegion(to))
{
if (to.equals(arena.arenaLoc) || to.equals(arena.lobbyLoc) || to.equals(arena.spectatorLoc) || to.equals(old))
return;
MAUtils.tellPlayer(p, Msg.WARP_TO_ARENA);
event.setCancelled(true);
return;
}
return;
}
if (arena.running && arena.inRegion(to))
{
event.setCancelled(true);
return;
}
}*/
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
{
Player p = event.getPlayer();
if (!arena.inArena(p) && !arena.inLobby(p))
return;
String[] args = event.getMessage().split(" ");
if ((args.length > 1 && MACommands.COMMANDS.contains(args[1].trim())) ||
MACommands.ALLOWED_COMMANDS.contains(event.getMessage().substring(1).trim()) ||
MACommands.ALLOWED_COMMANDS.contains(args[0]))
return;
event.setCancelled(true);
MAUtils.tellPlayer(p, Msg.MISC_COMMAND_NOT_ALLOWED);
}
}
+37 -31
View File
@@ -7,104 +7,110 @@ import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.Msg;
public class MAMessages
{
public static void init(MobArenaPlugin plugin) {
public static void init(MobArena plugin) {
// Grab the file
File msgFile = new File(MobArena.dir, "anouncements.properties");
File msgFile = new File(plugin.getDataFolder(), "announcements.properties");
// If it couldn't be loaded for some reason
if (!load(msgFile))
if (!load(plugin, msgFile))
return;
// Otherwise, start parsing!
parseFile(msgFile);
parseFile(plugin, msgFile);
}
private static boolean load(File file) {
private static boolean load(MobArena plugin, File file) {
// If the file exists, continue on!
if (file.exists()) {
return true;
}
// Otherwise, create it, and populate it with the defaults.
try {
file.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
for (Msg m : Msg.values()) {
if (m.hasSpoutMsg()) {
bw.write(m.name() + "=" + m + "|" + m.toSpoutString());
} else {
}
else {
bw.write(m.name() + "=" + m);
}
bw.newLine();
}
bw.close();
return true;
}
catch (Exception e) {
MobArena.warning("Couldn't initialize announcements-file. Using defaults.");
plugin.warning("Couldn't initialize announcements-file. Using defaults.");
return false;
}
}
private static void parseFile(File file) {
private static void parseFile(MobArena plugin, File file) {
try {
FileInputStream fis = new FileInputStream(file);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
BufferedReader br = new BufferedReader(isr);
// Check for BOM character.
br.mark(1);
int bom = br.read();
if (bom != 65279)
br.reset();
String s;
while ((s = br.readLine()) != null)
process(s);
process(plugin, s);
br.close();
}
catch (Exception e) {
e.printStackTrace();
MobArena.warning("Problem with announcements-file. Using defaults.");
plugin.warning("Problem with announcements-file. Using defaults.");
return;
}
}
/**
* Helper-method for parsing the strings from the
* announcements-file.
*/
private static void process(String s) {
private static void process(MobArena plugin, String s) {
// If the line ends with = or |, just add a space
if (s.endsWith("=") || s.endsWith("|")) s += " ";
if (s.endsWith("=") || s.endsWith("|")) {
s += " ";
}
// Split the string by the equals-sign.
String[] split = s.split("=");
if (split.length != 2) {
MobArena.warning("Couldn't parse \"" + s + "\". Check announcements-file.");
plugin.warning("Couldn't parse \"" + s + "\". Check announcements-file.");
return;
}
// Split the value by the pipe-sign.
String[] vals = split[1].split("\\|");
// For simplicity...
String key = split[0];
String val = vals.length == 2 ? vals[0] : split[1];
String spoutVal = vals.length == 2 ? vals[1] : null;
try {
Msg msg = Msg.valueOf(key);
msg.set(val);
msg.setSpout(spoutVal);
}
catch (Exception e) {
MobArena.warning(key + " is not a valid key. Check announcements-file.");
plugin.warning(key + " is not a valid key. Check announcements-file.");
return;
}
}
@@ -1,96 +0,0 @@
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;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
public class MAPlayerListener extends PlayerListener
{
private MobArena plugin;
private ArenaMaster am;
public MAPlayerListener(MobArena plugin, ArenaMaster am)
{
this.plugin = plugin;
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;
for (Arena arena : am.arenas)
arena.eventListener.onPlayerInteract(event);
}
public void onPlayerDropItem(PlayerDropItemEvent event)
{
if (!am.enabled) return;
for (Arena arena : am.arenas)
arena.eventListener.onPlayerDropItem(event);
}
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event)
{
if (!am.enabled) return;
for (Arena arena : am.arenas)
arena.eventListener.onPlayerBucketEmpty(event);
}
public void onPlayerTeleport(PlayerTeleportEvent event)
{
if (!am.enabled) return;
for (Arena arena : am.arenas)
arena.eventListener.onPlayerTeleport(event);
}
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
{
if (!am.enabled) return;
for (Arena arena : am.arenas)
arena.eventListener.onPlayerCommandPreprocess(event);
}
public void onPlayerQuit(PlayerQuitEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onPlayerQuit(event);
}
public void onPlayerKick(PlayerKickEvent event)
{
for (Arena arena : am.arenas)
arena.eventListener.onPlayerKick(event);
}
public void onPlayerJoin(PlayerJoinEvent event)
{
if (!am.updateNotify || !event.getPlayer().isOp()) return;
final Player p = event.getPlayer();
Bukkit.getServer().getScheduler().scheduleAsyncDelayedTask(plugin,
new Runnable()
{
public void run()
{
MAUtils.checkForUpdates(plugin, p, false);
}
}, 60);
}
}
+287 -229
View File
@@ -1,283 +1,341 @@
package com.garbagemule.MobArena;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import org.bukkit.Location;
import org.bukkit.entity.Creeper;
import org.bukkit.World;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Creature;
import org.bukkit.entity.Entity;
import org.bukkit.inventory.ItemStack;
import com.garbagemule.MobArena.util.WaveUtils;
import com.garbagemule.MobArena.waves.Wave;
import com.garbagemule.MobArena.ArenaPlayer;
import com.garbagemule.MobArena.MAUtils;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.Msg;
import com.garbagemule.MobArena.events.NewWaveEvent;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.region.ArenaRegion;
import com.garbagemule.MobArena.waves.*;
import com.garbagemule.MobArena.waves.enums.WaveType;
import com.garbagemule.MobArena.waves.types.BossWave;
import com.garbagemule.MobArena.waves.types.SupplyWave;
import com.garbagemule.MobArena.waves.types.UpgradeWave;
/**
* Core class for handling wave spawning.
* Currently, every 4th wave is a special wave, and all other waves
* are default waves. The distribution coefficients are used to spread
* out the distribution of each default monster however the server
* 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.
*/
public class MASpawnThread implements Runnable
{
private MobArena plugin;
private Arena arena;
private int wave, taskId, previousSize, playerCount;
// NEW WAVES
private Wave defaultWave;
private TreeSet<Wave> recurrentWaves;
private TreeSet<Wave> singleWaves;
public MASpawnThread(MobArena plugin, Arena arena)
{
// WAVES
defaultWave = arena.recurrentWaves.first();
recurrentWaves = arena.recurrentWaves;
singleWaves = new TreeSet<Wave>(arena.singleWaves);
this.plugin = plugin;
this.arena = arena;
wave = 1;
playerCount = arena.arenaPlayers.size();
}
public void run()
{
// Clear out all dead monsters in the monster set.
removeDeadMonsters();
// If there are no players in the arena, return.
if (arena.arenaPlayers.isEmpty())
return;
private ArenaRegion region;
private RewardManager rewardManager;
private WaveManager waveManager;
private MonsterManager monsterManager;
// Check if wave needs to be cleared first. If so, return!
if (arena.waveClear && wave > 1 && !arena.monsters.isEmpty())
return;
// Check if we're on a boss wave
if (!arena.waveClear && arena.bossWave != null)
return;
// Grant rewards (if any) for this wave
grantRewards(wave);
// Detonate creepers if needed
detonateCreepers(arena.detCreepers);
// Check if this is the final wave, in which case, end instead of spawn
if (wave > 1 && wave == arena.finalWave)
{
for (Player p : arena.arenaPlayers)
arena.playerDeath(p);
private int playerCount, monsterLimit;
private boolean waveClear, bossClear;
/**
* Create a new monster spawner for the input arena.
* Note that the arena's WaveManager is reset
* @param plugin a MobArena instance
* @param arena an arena
*/
public MASpawnThread(MobArena plugin, Arena arena) {
this.plugin = plugin;
this.arena = arena;
this.region = arena.getRegion();
this.rewardManager = arena.getRewardManager();
this.waveManager = arena.getWaveManager();
this.monsterManager = arena.getMonsterManager();
reset();
}
/**
* Reset the spawner, so all systems and settings are
* ready for a new session.
*/
public void reset() {
waveManager.reset();
playerCount = arena.getPlayersInArena().size();
monsterLimit = arena.getSettings().getInt("monster-limit", 100);
waveClear = arena.getSettings().getBoolean("clear-wave-before-next", false);
bossClear = arena.getSettings().getBoolean("clear-boss-before-next", false);
}
public void run() {
// If the arena isn't running or if there are no players in it.
if (!arena.isRunning() || arena.getPlayersInArena().isEmpty()) {
return;
}
// Find the wave to spawn
spawnWave(wave);
// Clear out all dead monsters in the monster set.
removeDeadMonsters();
removeCheatingPlayers();
// In case some players were removed, check again.
if (!arena.isRunning()) {
return;
}
// Grab the wave number.
int nextWave = waveManager.getWaveNumber() + 1;
// Check if wave needs to be cleared first. If so, return!
if (!isWaveClear()) {
arena.scheduleTask(this, 60);
return;
}
// Fire off the event. If cancelled, try again in 3 seconds.
NewWaveEvent event = new NewWaveEvent(arena, waveManager.getNext(), nextWave);
plugin.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
arena.scheduleTask(this, 60);
return;
}
// Grant rewards (if any) for the wave about to spawn
grantRewards(nextWave);
// Check if this is the final wave, in which case, end instead of spawn
if (nextWave > 1 && (nextWave - 1) == waveManager.getFinalWave()) {
List<Player> players = new ArrayList<Player>(arena.getPlayersInArena());
for (Player p : players) {
arena.playerLeave(p);
}
return;
}
// Spawn the next wave.
spawnWave(nextWave);
// Update stats
updateStats(wave);
wave++;
if (arena.monsters.isEmpty())
arena.resetIdleTimer();
updateStats(nextWave);
// Reschedule the spawner for the next wave.
arena.scheduleTask(this, arena.getSettings().getInt("wave-interval", 3) * 20);
}
private void removeDeadMonsters()
{
List<Entity> tmp = new LinkedList<Entity>(arena.monsters);
for (Entity e : tmp)
{
if (e == null) continue;
if (e.isDead() || !arena.inRegion(e.getLocation()))
{
arena.monsters.remove(e);
private void spawnWave(int wave) {
Wave w = waveManager.next();
w.announce(arena, wave);
if (w.getType() == WaveType.UPGRADE) {
handleUpgradeWave(w);
return;
}
Map<MACreature, Integer> monsters = w.getMonstersToSpawn(wave, playerCount, arena);
List<Location> spawnpoints = w.getSpawnpoints(arena);
World world = arena.getWorld();
int totalSpawnpoints = spawnpoints.size();
int index = 0;
double mul = w.getHealthMultiplier();
for (Map.Entry<MACreature, Integer> entry : monsters.entrySet()) {
for (int i = 0; i < entry.getValue(); i++, index++) {
// Check if monster limit has been reached.
if (monsterManager.getMonsters().size() >= monsterLimit) {
return;
}
// Grab a spawnpoint
Location spawnpoint = spawnpoints.get(index % totalSpawnpoints);
// Spawn the monster
LivingEntity e = entry.getKey().spawn(arena, world, spawnpoint);
// Add it to the arena.
monsterManager.addMonster(e);
// Set the health.
int health = (int) Math.max(1D, e.getMaxHealth() * mul);
e.setHealth(Math.min(health, e.getMaxHealth()));
// Switch on the type.
switch (w.getType()){
case BOSS:
BossWave bw = (BossWave) w;
int maxHealth = bw.getMaxHealth(playerCount);
MABoss boss = monsterManager.addBoss(e, maxHealth);
bw.addMABoss(boss);
bw.activateAbilities(arena);
break;
case SWARM:
health = (int) (mul < 1D ? e.getMaxHealth() * mul : 1);
health = Math.max(1, health);
e.setHealth(Math.min(health, e.getMaxHealth()));
break;
case SUPPLY:
SupplyWave sw = (SupplyWave) w;
monsterManager.addSupplier(e, sw.getDropList());
break;
default:
break;
}
}
}
}
private void handleUpgradeWave(Wave w) {
UpgradeWave uw = (UpgradeWave) w;
for (Player p : arena.getPlayersInArena()) {
String className = arena.getArenaPlayer(p).getArenaClass().getName();
//String className = arena.getClassOfPlayer(p);
uw.grantItems(p, className);
uw.grantItems(p, "All");
}
}
/**
* Check if the wave is clear for new spawns.
* If clear-boss-before-next: true, bosses must be dead.
* If clear-wave-before-next: true, all monsters must be dead.
* @param wave the next wave number
* @return true, if the wave is "clear" for new spawns.
*/
private boolean isWaveClear() {
// Check for monster limit
if (monsterManager.getMonsters().size() >= monsterLimit) {
return false;
}
// Check for boss clear
if (bossClear && !monsterManager.getBossMonsters().isEmpty()) {
return false;
}
// Check for wave clear
if (waveClear && !monsterManager.getMonsters().isEmpty()) {
return false;
}
// Check for final wave
if (!monsterManager.getMonsters().isEmpty() && waveManager.getWaveNumber() == waveManager.getFinalWave()) {
return false;
}
return true;
}
private void removeDeadMonsters() {
List<Entity> tmp = new ArrayList<Entity>(monsterManager.getMonsters());
for (Entity e : tmp) {
if (e == null) {
continue;
}
if (e.isDead() || !region.contains(e.getLocation())) {
monsterManager.removeMonster(e);
e.remove();
}
}
}
private void grantRewards(int wave)
{
for (Map.Entry<Integer,List<ItemStack>> entry : arena.everyWaveMap.entrySet())
if (wave % entry.getKey() == 0)
private void removeCheatingPlayers() {
List<Player> players = new ArrayList<Player>(arena.getPlayersInArena());
for (Player p : players) {
if (region.contains(p.getLocation())) {
continue;
}
Messenger.tellPlayer(p, "Leaving so soon?");
p.getInventory().clear();
arena.playerLeave(p);
}
}
private void grantRewards(int wave) {
for (Map.Entry<Integer, List<ItemStack>> entry : arena.getEveryWaveEntrySet()) {
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();
}
}
else
{
SortedSet<Wave> matches = getMatchingRecurrentWaves(wave);
w = matches.isEmpty() ? defaultWave : matches.last();
}
// Notify listeners.
for (MobArenaListener listener : plugin.getAM().listeners)
listener.onWave(arena, wave, w.getName(), w.getBranch(), w.getType());
arena.setWave(w);
w.spawn(wave);
}
private void updateStats(int wave)
{
for (ArenaPlayer ap: arena.getArenaPlayerSet())
if (arena.getArenaPlayers().contains(ap.getPlayer()))
ap.getStats().lastWave++;
}
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);
List<ItemStack> after = arena.getAfterWaveReward(wave);
if (after != null) {
addReward(after);
}
return result;
}
/*////////////////////////////////////////////////////////////////////
//
// Getters/setters
//
////////////////////////////////////////////////////////////////////*/
public int getWave()
{
return wave;
private void updateStats(int wave) {
for (ArenaPlayer ap : arena.getArenaPlayerSet()) {
if (arena.getPlayersInArena().contains(ap.getPlayer())) {
ap.getStats().inc("lastWave");
}
}
}
public int getTaskId()
{
return taskId;
}
public int getPreviousSize()
{
return previousSize;
}
public int getPlayerCount()
{
/*
* ////////////////////////////////////////////////////////////////////
* //
* // Getters/setters
* //
* ////////////////////////////////////////////////////////////////////
*/
public int getPlayerCount() {
return playerCount;
}
public void setTaskId(int taskId)
{
this.taskId = taskId;
}
public void setPreviousSize(int previousSize)
{
this.previousSize = previousSize;
}
/**
* Rewards all players with an item from the input String.
*/
private void addReward(List<ItemStack> rewards)
{
for (Player p : arena.arenaPlayers)
{
if (arena.log.players.get(p) == null)
continue;
private void addReward(List<ItemStack> rewards) {
for (Player p : arena.getPlayersInArena()) {
ItemStack reward = MAUtils.getRandomReward(rewards);
arena.log.players.get(p).rewards.add(reward);
if (reward == null)
{
MAUtils.tellPlayer(p, "ERROR! Problem with economy rewards. Notify server host!");
MobArena.warning("Could not add null reward. Please check the config-file!");
}
else if (reward.getTypeId() == MobArena.ECONOMY_MONEY_ID)
{
if (plugin.Method != null)
MAUtils.tellPlayer(p, Msg.WAVE_REWARD, plugin.Method.format(reward.getAmount()));
else MobArena.warning("Tried to add money, but no economy plugin detected!");
}
else
{
MAUtils.tellPlayer(p, Msg.WAVE_REWARD, MAUtils.toCamelCase(reward.getType().toString()) + ":" + reward.getAmount(), reward.getType());
}
}
}
/**
* "Detonates" all the Creepers in the monsterSet.
*/
public void detonateCreepers(boolean really)
{
if (!really)
return;
Set<Entity> tmp = new HashSet<Entity>();
for (Entity e : arena.monsters)
{
if (!(e instanceof Creeper) || e.isDead())
continue;
tmp.add(e);
}
rewardManager.addReward(p, reward);
Location loc;
for (Entity e : tmp)
{
if (e == null) continue;
arena.monsters.remove(e);
loc = e.getLocation().getBlock().getRelative(0,2,0).getLocation();
arena.world.createExplosion(loc, 2);
e.remove();
if (reward == null) {
Messenger.tellPlayer(p, "ERROR! Problem with rewards. Notify server host!");
plugin.warning("Could not add null reward. Please check the config-file!");
}
else if (reward.getTypeId() == MobArena.ECONOMY_MONEY_ID) {
if (plugin.giveMoney(p, reward.getAmount())) {
Messenger.tellPlayer(p, Msg.WAVE_REWARD, plugin.economyFormat(reward.getAmount()));
}
else {
plugin.warning("Tried to add money, but no economy plugin detected!");
}
}
else {
Messenger.tellPlayer(p, Msg.WAVE_REWARD, MAUtils.toCamelCase(reward.getType().toString()) + ":" + reward.getAmount(), reward.getType());
}
}
}
/**
* Update the targets of all monsters, if their targets aren't alive.
*/
public void updateTargets()
{
public void updateTargets() {
Creature c;
Entity target;
for (Entity e : arena.monsters)
{
for (Entity e : monsterManager.getMonsters()) {
if (!(e instanceof Creature))
continue;
continue;
// TODO: Remove the try-catch when Bukkit API is fixed.
c = (Creature) e;
try { target = c.getTarget(); } catch (ClassCastException cce) { continue; }
if (target instanceof Player && arena.inArena((Player) target))
try {
target = c.getTarget();
}
catch (ClassCastException cce) {
continue;
c.setTarget(MAUtils.getClosestPlayer(e, arena));
}
if (target instanceof Player && arena.getPlayersInArena().contains((Player) target)) {
continue;
}
c.setTarget(MAUtils.getClosestPlayer(plugin, e, arena));
}
}
}
File diff suppressed because it is too large Load Diff
+103
View File
@@ -0,0 +1,103 @@
package com.garbagemule.MobArena;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
import com.garbagemule.MobArena.framework.Arena;
public class Messenger
{
public static boolean tellSpoutPlayer(Player p, Msg msg, String s, Material logo) {
// Grab the SpoutPlayer.
SpoutPlayer sp = MobArena.hasSpout ? SpoutManager.getPlayer(p) : null;
if (msg.hasSpoutMsg() && sp != null && sp.isSpoutCraftEnabled()) {
// Grab the message text.
String text = msg.toSpoutString(s);
// If more than 26 characters, truncate.
if (text.length() > 26)
text = text.substring(0, 26);
// If the logo is null, use an iron sword.
if (logo == null)
logo = msg.getLogo();
// Send the notification.
sp.sendNotification("MobArena", text, logo, (short) 0, 2000);
return true;
}
else {
return tellPlayer(p, msg.toString(s));
}
}
public static boolean tellSpoutPlayer(Player p, Msg msg, Material logo) {
return tellSpoutPlayer(p, msg, null, logo);
}
public static boolean tellSpoutPlayer(Player p, Msg msg, String s) {
return tellSpoutPlayer(p, msg, s, null);
}
public static boolean tellSpoutPlayer(Player p, Msg msg) {
return tellSpoutPlayer(p, msg, null, null);
}
public static boolean tellPlayer(CommandSender p, String msg) {
// If the input sender is null or the string is empty, return.
if (p == null || msg.equals(" "))
return false;
// Otherwise, send the message with the [MobArena] tag.
p.sendMessage(ChatColor.GREEN + "[MobArena] " + ChatColor.WHITE + msg);
return true;
}
public static boolean tellPlayer(CommandSender p, Msg msg, String s, boolean spout, Material logo) {
if (spout && p instanceof Player)
return tellSpoutPlayer((Player) p, msg, s, logo);
return tellPlayer(p, msg.toString(s));
}
public static boolean tellPlayer(CommandSender p, Msg msg, String s, Material logo) {
return tellPlayer(p, msg, s, MobArena.hasSpout, logo);
}
public static boolean tellPlayer(CommandSender p, Msg msg, String s) {
return tellPlayer(p, msg, s, MobArena.hasSpout, null);
}
public static boolean tellPlayer(CommandSender p, Msg msg) {
return tellPlayer(p, msg, null, MobArena.hasSpout, null);
}
public static void tellAll(Arena arena, Msg msg, String s, boolean notifyPlayers) {
List<Player> players = new ArrayList<Player>();
players.addAll(arena.getPlayersInArena());
players.addAll(arena.getPlayersInLobby());
players.addAll(arena.getSpectators());
for (Player p : players)
tellPlayer(p, msg, s);
}
public static void tellAll(Arena arena, Msg msg, String s) {
tellAll(arena, msg, s, false);
}
public static void tellAll(Arena arena, Msg msg, boolean notifyPlayers) {
tellAll(arena, msg, null, notifyPlayers);
}
public static void tellAll(Arena arena, Msg msg) {
tellAll(arena, msg, null, false);
}
}
+190 -132
View File
@@ -1,221 +1,279 @@
package com.garbagemule.MobArena;
import java.io.File;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;
import net.milkbowl.vault.economy.EconomyResponse.ResponseType;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.Event.Priority;
import org.bukkit.event.block.BlockListener;
import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.entity.EntityListener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.PluginManager;
//import org.bukkit.util.config.Configuration;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.ServicesManager;
import org.bukkit.plugin.java.JavaPlugin;
import com.garbagemule.MobArena.ArenaMasterImpl;
import com.garbagemule.MobArena.MAMessages;
import com.garbagemule.MobArena.commands.CommandHandler;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.health.HealthStrategy;
import com.garbagemule.MobArena.health.HealthStrategyHeroes;
import com.garbagemule.MobArena.health.HealthStrategyStandard;
import com.garbagemule.MobArena.listeners.MAGlobalListener;
import com.garbagemule.MobArena.listeners.MagicSpellsListener;
import com.garbagemule.MobArena.spout.Spouty;
import com.garbagemule.MobArena.util.Config;
import com.garbagemule.MobArena.listeners.SpoutScreenListener;
import com.garbagemule.MobArena.util.FileUtils;
import com.garbagemule.register.payment.Method;
import com.garbagemule.register.payment.Methods;
import com.garbagemule.MobArena.util.config.Config;
import com.garbagemule.MobArena.util.config.ConfigUtils;
import com.garbagemule.MobArena.util.inventory.InventoryManager;
/**
* MobArena
* @author garbagemule
*/
public class MobArena extends JavaPlugin implements MobArenaPlugin
public class MobArena extends JavaPlugin
{
//private Configuration config;
private Config config;
private ArenaMaster am;
private ArenaMaster arenaMaster;
// Economy stuff
protected Method Method;
// Inventories from disconnects
private Set<String> inventoriesToRestore;
// Heroes
private boolean hasHeroes;
private HealthStrategy healthStrategy;
// Vault
private Economy economy;
// Spout stuff
public static boolean hasSpout;
// Global variables
public static PluginDescriptionFile desc;
public static File dir, arenaDir;
public static final double MIN_PLAYER_DISTANCE = 15D;
public static final double MIN_PLAYER_DISTANCE_SQUARED = 225D;
public static final int ECONOMY_MONEY_ID = -29;
public static Random random = new Random();
public void onEnable()
{
// Description file and data folders
desc = getDescription();
dir = getDataFolder();
arenaDir = new File(dir, "arenas");
if (!dir.exists()) dir.mkdirs();
if (!arenaDir.exists()) arenaDir.mkdir();
public void onEnable() {
// Create default files and initialize config-file
FileUtils.extractDefaults("config.yml");
loadConfig();
FileUtils.extractDefaults(this, "config.yml");
loadConfigFile();
// Download external libraries if needed.
FileUtils.fetchLibs(config);
FileUtils.fetchLibs(this, config);
// Set up soft dependencies
setupRegister();
setupVault();
setupHeroes();
setupSpout();
setupMagicSpells();
setupStrategies();
// Set up the ArenaMaster and the announcements
am = new ArenaMasterStandard(this);
am.initialize();
// Set up the ArenaMaster
arenaMaster = new ArenaMasterImpl(this);
arenaMaster.initialize();
// Register any inventories to restore.
registerInventories();
// Make sure all the announcements are configured.
MAMessages.init(this);
// Register event listeners
registerListeners();
// Announce enable!
info("v" + desc.getVersion() + " enabled.");
info("v" + this.getDescription().getVersion() + " enabled.");
}
public void onDisable()
{
public void onDisable() {
// Disable Spout features.
hasSpout = false;
// Force all arenas to end.
if (am == null) return;
for (Arena arena : am.arenas)
if (arenaMaster == null) return;
for (Arena arena : arenaMaster.getArenas()) {
arena.forceEnd();
am.arenaMap.clear();
}
arenaMaster.resetArenaMap();
info("disabled.");
}
private void loadConfig()
{
File file = new File(dir, "config.yml");
private void loadConfigFile() {
File dir = this.getDataFolder();
if (!dir.exists()) dir.mkdir();
File file = new File(this.getDataFolder(), "config.yml");
config = new Config(file);
config.load();
updateSettings(config);
config.setHeader(getHeader());
config.save();
}
private void registerListeners()
{
private void registerListeners() {
// Bind the /ma, /mobarena commands to MACommands.
MACommands commandExecutor = new MACommands(this, am);
getCommand("ma").setExecutor(commandExecutor);
getCommand("mobarena").setExecutor(commandExecutor);
CommandHandler handler = new CommandHandler(this);
getCommand("ma").setExecutor(handler);
getCommand("mobarena").setExecutor(handler);
// Create event listeners.
PluginManager pm = getServer().getPluginManager();
PlayerListener playerListener = new MAPlayerListener(this, am);
EntityListener entityListener = new MAEntityListener(am);
BlockListener blockListener = new MABlockListener(am);
PluginManager pm = this.getServer().getPluginManager();
pm.registerEvents(new MAGlobalListener(this, arenaMaster), this);
// Register events.
pm.registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.Highest, this);
pm.registerEvent(Event.Type.BLOCK_BURN, blockListener, Priority.Highest, this);
pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Priority.Highest, this);
pm.registerEvent(Event.Type.BLOCK_IGNITE, blockListener, Priority.Highest, this);
pm.registerEvent(Event.Type.SIGN_CHANGE, blockListener, Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_INTERACT, playerListener, Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_DROP_ITEM, playerListener, Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_BUCKET_EMPTY, playerListener, Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_TELEPORT, playerListener, Priority.Normal, this);
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.ENTITY_DAMAGE, entityListener, Priority.Low, this); // Must cancel before Heroes
pm.registerEvent(Event.Type.ENTITY_DEATH, entityListener, Priority.Lowest, this); // Lowest because of Tombstone
pm.registerEvent(Event.Type.ENTITY_REGAIN_HEALTH, entityListener, Priority.Normal, this);
pm.registerEvent(Event.Type.ENTITY_EXPLODE, entityListener, Priority.Highest, this);
pm.registerEvent(Event.Type.ENTITY_COMBUST, entityListener, Priority.Normal, this);
pm.registerEvent(Event.Type.ENTITY_TARGET, entityListener, Priority.Normal, this);
pm.registerEvent(Event.Type.ENDERMAN_PICKUP, entityListener, Priority.Normal, this);
pm.registerEvent(Event.Type.ENDERMAN_PLACE, 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); // I know Monitor is bad, but other plugins suck! :(
if (hasSpout) {
pm.registerEvents(new SpoutScreenListener(this), this);
}
}
// Permissions stuff
public boolean has(Player p, String s)
{
// If the permission is set, check if player has permission
if (p.isPermissionSet(s))
return p.hasPermission(s);
// Otherwise, only allow commands that aren't admin/setup commands.
return !s.matches("^mobarena\\.setup\\..*$") && !s.matches("^mobarena\\.admin\\..*$");
public boolean has(Player p, String s) {
return p.hasPermission(s);
}
public boolean has(CommandSender sender, String s) {
if (sender instanceof ConsoleCommandSender) {
return true;
}
return has((Player) sender, s);
}
// Console printing
public static void info(String msg) { Bukkit.getServer().getLogger().info("[MobArena] " + msg); }
public static void warning(String msg) { Bukkit.getServer().getLogger().warning("[MobArena] " + msg); }
public static void error(String msg) { Bukkit.getServer().getLogger().severe("[MobArena] " + msg); }
public void info(String msg) { getServer().getLogger().info("[MobArena] " + msg); }
public void warning(String msg) { getServer().getLogger().warning("[MobArena] " + msg); }
public void error(String msg) { getServer().getLogger().severe("[MobArena] " + msg); }
@Override
public void tell(CommandSender sender, String msg) {
if (sender == null || msg.equals("") || msg.equals(" "))
private void setupVault() {
Plugin vaultPlugin = this.getServer().getPluginManager().getPlugin("Vault");
if (vaultPlugin == null) {
warning("Vault was not found. Economy rewards will not work!");
return;
}
sender.sendMessage(ChatColor.GREEN + "[MobArena] " + ChatColor.WHITE + msg);
ServicesManager manager = this.getServer().getServicesManager();
RegisteredServiceProvider<Economy> e = manager.getRegistration(net.milkbowl.vault.economy.Economy.class);
if (e != null) {
economy = e.getProvider();
} else {
warning("Vault found, but no economy plugin detected. Economy rewards will not work!");
}
}
@Override
public void tell(CommandSender sender, Msg msg) {
tell(sender, msg.toString());
private void setupHeroes() {
Plugin heroesPlugin = this.getServer().getPluginManager().getPlugin("Heroes");
if (heroesPlugin == null) return;
hasHeroes = true;
}
private void setupRegister()
{
Methods.setMethod(getServer().getPluginManager());
Method = Methods.getMethod();
if (Method != null)
info("Payment method found (" + Method.getName() + " version: " + Method.getVersion() + ")");
else
info("No payment method found!");
}
private void setupSpout()
{
if (hasSpout) return;
private void setupSpout() {
Plugin spoutPlugin = this.getServer().getPluginManager().getPlugin("Spout");
hasSpout = spoutPlugin != null;
if (!hasSpout) return;
if (spoutPlugin == null) return;
Spouty.registerEvents(this);
hasSpout = true;
}
private void setupMagicSpells()
{
private void setupMagicSpells() {
Plugin spells = this.getServer().getPluginManager().getPlugin("MagicSpells");
if (spells == null) return;
PluginManager pm = getServer().getPluginManager();
pm.registerEvent(Event.Type.CUSTOM_EVENT, new MagicSpellsListener(this), Priority.Normal, this);
this.getServer().getPluginManager().registerEvents(new MagicSpellsListener(this), this);
}
public Config getMAConfig() { return config; }
public ArenaMaster getAM() { return am; } // More convenient.
private void setupStrategies() {
healthStrategy = (hasHeroes ? new HealthStrategyHeroes() : new HealthStrategyStandard());
}
@Override
public ArenaMaster getArenaMaster() { return am; }
public HealthStrategy getHealthStrategy() {
return healthStrategy;
}
private String getHeader()
{
public Config getMAConfig() {
return config;
}
public ArenaMaster getArenaMaster() {
return arenaMaster;
}
private void updateSettings(Config config) {
Set<String> arenas = config.getKeys("arenas");
if (arenas == null) return;
for (String arena : arenas) {
String path = "arenas." + arena + ".settings";
ConfigUtils.replaceAllNodes(this, config, path, "settings.yml");
}
}
private String getHeader() {
String sep = System.getProperty("line.separator");
return "# MobArena v" + desc.getVersion() + " - Config-file" + sep +
"# Read the Wiki for details on how to set up this file: http://goo.gl/F5TTc" + sep +
"# Note: You -must- use spaces instead of tabs!";
return "MobArena v" + this.getDescription().getVersion() + " - Config-file" + sep +
"Read the Wiki for details on how to set up this file: http://goo.gl/F5TTc" + sep +
"Note: You -must- use spaces instead of tabs!\r";
}
private void registerInventories() {
this.inventoriesToRestore = new HashSet<String>();
File dir = new File(getDataFolder(), "inventories");
if (!dir.exists()) {
dir.mkdir();
return;
}
for (File f : dir.listFiles()) {
if (f.getName().endsWith(".inv")) {
inventoriesToRestore.add(f.getName().substring(0, f.getName().indexOf(".")));
}
}
}
public void restoreInventory(Player p) {
if (!inventoriesToRestore.contains(p.getName())) {
return;
}
if (InventoryManager.restoreFromFile(this, p)) {
inventoriesToRestore.remove(p.getName());
}
}
public boolean giveMoney(Player p, int amount) {
if (economy != null) {
EconomyResponse result = economy.depositPlayer(p.getName(), amount);
return (result.type == ResponseType.SUCCESS);
}
return false;
}
public boolean takeMoney(Player p, int amount) {
if (economy != null) {
EconomyResponse result = economy.withdrawPlayer(p.getName(), amount);
return (result.type == ResponseType.SUCCESS);
}
return false;
}
public boolean hasEnough(Player p, double amount) {
if (economy != null) {
return (economy.getBalance(p.getName()) >= amount);
}
return true;
}
public String economyFormat(double amount) {
if (economy != null) {
return economy.format(amount);
}
return null;
}
}
@@ -6,16 +6,18 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.framework.Arena;
public class MobArenaHandler
{
private MobArena plugin;
/**
* Primary constructor.
* The boolean 'ma' is flagged true, and the field 'plugin' is initalized, if the server is running MobArena.
* The field 'plugin' is initalized, if the server is running MobArena.
*/
public MobArenaHandler()
{
public MobArenaHandler() {
plugin = (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena");
}
@@ -32,12 +34,13 @@ public class MobArenaHandler
* @param loc A location.
* @return true, if the Location is inside of any arena region.
*/
public boolean inRegion(Location loc)
{
for (Arena arena : plugin.getAM().arenas)
if (arena.inRegion(loc))
public boolean inRegion(Location loc) {
for (Arena arena : plugin.getArenaMaster().getArenas()) {
if (arena.getRegion().contains(loc)) {
return true;
}
}
return false;
}
@@ -47,9 +50,8 @@ public class MobArenaHandler
* @param loc A location
* @return true, if the Location is inside of the arena region.
*/
public boolean inRegion(Arena arena, Location loc)
{
return (arena != null && arena.inRegion(loc));
public boolean inRegion(Arena arena, Location loc) {
return (arena != null && arena.getRegion().contains(loc));
}
/**
@@ -58,13 +60,12 @@ public class MobArenaHandler
* @param loc A location
* @return true, if the Location is inside of the arena region.
*/
public boolean inRegion(String arenaName, Location loc)
{
Arena arena = plugin.getAM().getArenaWithName(arenaName);
public boolean inRegion(String arenaName, Location loc) {
Arena arena = plugin.getArenaMaster().getArenaWithName(arenaName);
if (arena == null)
throw new NullPointerException("There is no arena with that name");
return arena.inRegion(loc);
return arena.getRegion().contains(loc);
}
/**
@@ -72,8 +73,7 @@ public class MobArenaHandler
* @param loc A location.
* @return true, if the Location is inside of the region of an arena that is currently running.
*/
public boolean inRunningRegion(Location loc)
{
public boolean inRunningRegion(Location loc) {
return inRegion(loc, false, true);
}
@@ -82,8 +82,7 @@ public class MobArenaHandler
* @param loc A location.
* @return true, if the Location is inside of the region of an arena that is currently enabled.
*/
public boolean inEnabledRegion(Location loc)
{
public boolean inEnabledRegion(Location loc) {
return inRegion(loc, true, false);
}
@@ -94,17 +93,19 @@ public class MobArenaHandler
* @param running if true, the method will check if the arena is running, overrides enabled
* @return true, if the location is inside of the region of an arena that is currently enabled/running, depending on the parameters.
*/
private boolean inRegion(Location loc, boolean enabled, boolean running)
{
private boolean inRegion(Location loc, boolean enabled, boolean running) {
// If the plugin doesn't exist, always return false.
if (plugin.getAM() == null) return false;
if (plugin.getArenaMaster() == null) return false;
// Return true if location is within just one arena's region.
for (Arena arena : plugin.getAM().arenas)
if (arena.inRegion(loc))
if ((running && arena.running) || (enabled && arena.enabled))
for (Arena arena : plugin.getArenaMaster().getArenas()) {
if (arena.getRegion().contains(loc)) {
if ((running && arena.isRunning()) || (enabled && arena.isEnabled())) {
return true;
}
}
}
return false;
}
@@ -121,9 +122,8 @@ public class MobArenaHandler
* @param player The player
* @return true, if the player is in an arena
*/
public boolean isPlayerInArena(Player player)
{
return (plugin.getAM().getArenaWithPlayer(player) != null);
public boolean isPlayerInArena(Player player) {
return (plugin.getArenaMaster().getArenaWithPlayer(player) != null);
}
/**
@@ -131,9 +131,8 @@ public class MobArenaHandler
* @param playerName The name of the player
* @return true, if the player is in an arena
*/
public boolean isPlayerInArena(String playerName)
{
return (plugin.getAM().getArenaWithPlayer(playerName) != null);
public boolean isPlayerInArena(String playerName) {
return (plugin.getArenaMaster().getArenaWithPlayer(playerName) != null);
}
/**
@@ -141,12 +140,11 @@ public class MobArenaHandler
* @param player The player
* @return The class name of the player if the player is in the arena, null otherwise
*/
public String getPlayerClass(Player player)
{
Arena arena = plugin.getAM().getArenaWithPlayer(player);
public String getPlayerClass(Player player) {
Arena arena = plugin.getArenaMaster().getArenaWithPlayer(player);
if (arena == null) return null;
return arena.classMap.get(player);
return getPlayerClass(arena, player);
}
/**
@@ -156,9 +154,14 @@ public class MobArenaHandler
* @param player The player to look up
* @return The class name of the player, if the player is in the arena, null otherwise
*/
public String getPlayerClass(Arena arena, Player player)
{
return arena.classMap.get(player);
public String getPlayerClass(Arena arena, Player player) {
ArenaPlayer ap = arena.getArenaPlayer(player);
if (ap == null) return null;
ArenaClass ac = ap.getArenaClass();
if (ac == null) return null;
return ac.getName();
}
/**
@@ -166,9 +169,8 @@ public class MobArenaHandler
* @param entity The monster entity
* @return true, if the monster is in an arena
*/
public boolean isMonsterInArena(LivingEntity entity)
{
return plugin.getAM().getArenaWithMonster(entity) != null;
public boolean isMonsterInArena(LivingEntity entity) {
return plugin.getArenaMaster().getArenaWithMonster(entity) != null;
}
/**
@@ -176,9 +178,8 @@ public class MobArenaHandler
* @param wolf The pet wolf
* @return true, if the pet is in an arena
*/
public boolean isPetInArena(LivingEntity wolf)
{
return plugin.getAM().getArenaWithPet(wolf) != null;
public boolean isPetInArena(LivingEntity wolf) {
return plugin.getArenaMaster().getArenaWithPet(wolf) != null;
}
@@ -194,9 +195,8 @@ public class MobArenaHandler
* @param loc A location
* @return an Arena object, or null
*/
public Arena getArenaAtLocation(Location loc)
{
return plugin.getAM().getArenaAtLocation(loc);
public Arena getArenaAtLocation(Location loc) {
return plugin.getArenaMaster().getArenaAtLocation(loc);
}
/**
@@ -204,9 +204,8 @@ public class MobArenaHandler
* @param p A player
* @return an Arena object, or null
*/
public Arena getArenaWithPlayer(Player p)
{
return plugin.getAM().getArenaWithPlayer(p);
public Arena getArenaWithPlayer(Player p) {
return plugin.getArenaMaster().getArenaWithPlayer(p);
}
/**
@@ -214,9 +213,8 @@ public class MobArenaHandler
* @param wolf A pet wolf
* @return an Arena object, or null
*/
public Arena getArenaWithPet(Entity wolf)
{
return plugin.getAM().getArenaWithPet(wolf);
public Arena getArenaWithPet(Entity wolf) {
return plugin.getArenaMaster().getArenaWithPet(wolf);
}
/**
@@ -224,8 +222,7 @@ public class MobArenaHandler
* @param monster A monster
* @return an Arena object, or null
*/
public Arena getArenaWithMonster(Entity monster)
{
return plugin.getAM().getArenaWithMonster(monster);
public Arena getArenaWithMonster(Entity monster) {
return plugin.getArenaMaster().getArenaWithMonster(monster);
}
}
@@ -1,25 +0,0 @@
package com.garbagemule.MobArena;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.waves.Wave.WaveBranch;
import com.garbagemule.MobArena.waves.Wave.WaveType;
public abstract class MobArenaListener
{
protected MobArena plugin;
public MobArenaListener()
{
plugin = (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena");
plugin.getAM().listeners.add(this);
}
public void onArenaStart(Arena arena) {}
public void onArenaEnd(Arena arena) {}
public void onWave(Arena arena, int waveNumber, String waveName, WaveBranch waveBranch, WaveType waveType) {}
public void onPlayerJoin(Arena arena, Player p) {}
public void onPlayerLeave(Arena arena, Player p) {}
public void onPlayerDeath(Arena arena, Player p) {}
}
@@ -1,36 +0,0 @@
package com.garbagemule.MobArena;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.util.Config;
public interface MobArenaPlugin
{
/**
* Get the Config object associated with this MobArena instance.
* @return the Config object used by MobArena
*/
public Config getMAConfig();
/**
* Get the ArenaMaster used by this instance of MobArena.
* @return the ArenaMaster object
*/
public ArenaMaster getArenaMaster();
/**
* Send a message to a player or the console.
* The message is prefixed with [MobArena].
* @param recipient the player or console to send the message to
* @param msg the message to send
*/
public void tell(CommandSender recipient, String msg);
/**
* Send a predefined announcement to a player or the console.
* Convenience method: the above method is called with Msg.toString()
* @param recipient the player or console to send the message to
* @param msg the message to send
*/
public void tell(CommandSender recipient, Msg msg);
}
@@ -0,0 +1,130 @@
package com.garbagemule.MobArena;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Wolf;
import org.bukkit.inventory.ItemStack;
import com.garbagemule.MobArena.waves.MABoss;
public class MonsterManager
{
private Set<LivingEntity> monsters, sheep;
private Set<Wolf> pets;
private Map<LivingEntity,MABoss> bosses;
private Map<LivingEntity,List<ItemStack>> suppliers;
public MonsterManager() {
this.monsters = new HashSet<LivingEntity>();
this.sheep = new HashSet<LivingEntity>();
this.pets = new HashSet<Wolf>();
this.bosses = new HashMap<LivingEntity,MABoss>();
this.suppliers = new HashMap<LivingEntity,List<ItemStack>>();
}
public void reset() {
monsters.clear();
sheep.clear();
pets.clear();
bosses.clear();
suppliers.clear();
}
public void clear() {
removeAll(monsters);
removeAll(sheep);
removeAll(pets);
removeAll(bosses.keySet());
removeAll(suppliers.keySet());
reset();
}
private void removeAll(Collection<? extends LivingEntity> collection) {
for (LivingEntity e : collection) {
if (e != null) {
e.remove();
}
}
}
public Set<LivingEntity> getMonsters() {
return monsters;
}
public void addMonster(LivingEntity e) {
monsters.add(e);
}
public boolean removeMonster(Entity e) {
return monsters.remove(e);
}
public Set<LivingEntity> getExplodingSheep() {
return sheep;
}
public void addExplodingSheep(LivingEntity e) {
sheep.add(e);
}
public boolean removeExplodingSheep(LivingEntity e) {
return sheep.remove(e);
}
public Set<Wolf> getPets() {
return pets;
}
public void addPet(Wolf w) {
pets.add(w);
}
public boolean hasPet(Entity e) {
return pets.contains(e);
}
public void removePets(Player p) {
for (Wolf w : pets) {
if (w == null || !(w.getOwner() instanceof Player) || !((Player) w.getOwner()).getName().equals(p.getName()))
continue;
w.setOwner(null);
w.remove();
}
}
public void addSupplier(LivingEntity e, List<ItemStack> drops) {
suppliers.put(e, drops);
}
public List<ItemStack> getLoot(Entity e) {
return suppliers.get(e);
}
public MABoss addBoss(LivingEntity e, int maxHealth) {
MABoss b = new MABoss(e, maxHealth);
bosses.put(e, b);
return b;
}
public MABoss removeBoss(LivingEntity e) {
return bosses.remove(e);
}
public MABoss getBoss(LivingEntity e) {
return bosses.get(e);
}
public Set<LivingEntity> getBossMonsters() {
return bosses.keySet();
}
}
+6
View File
@@ -53,6 +53,8 @@ public enum Msg
WAVE_DEFAULT("Wave #%!", "Wave #%!", Material.YELLOW_FLOWER),
WAVE_SPECIAL("Wave #%! [SPECIAL]", "Wave #%! [SPECIAL]", Material.RED_ROSE),
WAVE_SWARM("Wave #%! [SWARM]", "Wave #%! [SWARM]", Material.LONG_GRASS),
WAVE_SUPPLY("Wave #%! [SUPPLY]", "Wave #%! [SUPPLY]", Material.BREAD),
WAVE_UPGRADE("Wave #%! [UPGRADE]", "Wave #%! [UPGRADE]", Material.DIAMOND),
WAVE_BOSS("Wave #%! [BOSS]", "Wave #%! [BOSS]", Material.FIRE),
WAVE_BOSS_ABILITY("Boss used ability: %!", "Boss: %", Material.FIRE),
WAVE_BOSS_LOW_HEALTH("Boss is almost dead!", "Boss almost dead!", Material.FIRE),
@@ -61,6 +63,10 @@ public enum Msg
MISC_LIST_ARENAS("Available arenas: %"),
MISC_COMMAND_NOT_ALLOWED("You can't use that command in the arena!"),
MISC_NO_ACCESS("You don't have access to this command."),
MISC_NOT_FROM_CONSOLE("You can't use this command from the console."),
MISC_HELP("For a list of commands, type /ma help"),
MISC_MULTIPLE_MATCHES("Did you mean one of these commands?"),
MISC_NO_MATCHES("Command not found. Type /ma help"),
MISC_NONE("<none>");
private String msg, spoutMsg;
@@ -0,0 +1,108 @@
package com.garbagemule.MobArena;
import java.util.Collection;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
public class PlayerData
{
private Player player;
private int health, food, level;
private float exp;
private GameMode mode = null;
private Location entry = null;
private Collection<PotionEffect> potions;
public PlayerData(Player player) {
this.player = player;
this.mode = player.getGameMode();
this.entry = player.getLocation();
this.potions = player.getActivePotionEffects();
update();
}
/**
* Updates the information that is restored, when a player
* dies in the arena, that is, health, food level, and
* experience. Used when a player re-joins an arena while
* already being a spectator.
*/
public void update() {
this.health = player.getHealth();
this.food = player.getFoodLevel();
this.level = player.getLevel();
this.exp = player.getExp();
}
/**
* Restores health, food level, and experience as per the
* currently stored values of this object. Used when a
* player leaves the arena.
*/
public void restoreData() {
player.setFoodLevel(food);
player.setLevel(level);
player.setExp(exp);
}
public Player getPlayer() {
return player;
}
public int health() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int food() {
return food;
}
public void setFood(int food) {
this.food = food;
}
public int level() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public float exp() {
return exp;
}
public void setExp(int exp) {
this.exp = exp;
}
public GameMode getMode() {
return mode;
}
public Collection<PotionEffect> getPotionEffects() {
return potions;
}
public void setMode(GameMode mode) {
this.mode = mode;
}
public Location entry() {
return entry;
}
public void setEntry(Location entry) {
this.entry = entry;
}
}
@@ -0,0 +1,63 @@
package com.garbagemule.MobArena;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.garbagemule.MobArena.framework.Arena;
public class RewardManager
{
private MobArena plugin;
@SuppressWarnings("unused")
private Arena arena;
private Map<Player,List<ItemStack>> players;
private Set<Player> rewarded;
public RewardManager(Arena arena) {
this.plugin = arena.getPlugin();
this.arena = arena;
this.players = new HashMap<Player,List<ItemStack>>();
this.rewarded = new HashSet<Player>();
}
public void reset() {
players.clear();
rewarded.clear();
}
public void addReward(Player p, ItemStack stack) {
if (!players.containsKey(p)) {
players.put(p, new ArrayList<ItemStack>());
}
players.get(p).add(stack);
}
public void grantRewards(Player p) {
if (rewarded.contains(p)) return;
List<ItemStack> rewards = players.get(p);
if (rewards == null) return;
for (ItemStack stack : rewards) {
if (stack == null) {
continue;
}
if (stack.getTypeId() == MobArena.ECONOMY_MONEY_ID) {
plugin.giveMoney(p, stack.getAmount());
continue;
}
p.getInventory().addItem(stack);
}
rewarded.add(p);
}
}
@@ -0,0 +1,20 @@
package com.garbagemule.MobArena.commands;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.framework.ArenaMaster;
public interface Command
{
/**
* Execute the command using the given arguments.
* If any arguments are provided, the first argument is -NOT- the
* same as the command name, i.e. the CommandHandler must strip the
* array of this element.
* @param am an ArenaMaster instance
* @param sender the sender
* @param args array of arguments
* @return true, if the command was successful
*/
public boolean execute(ArenaMaster am, CommandSender sender, String... args);
}
@@ -1,123 +1,217 @@
package com.garbagemule.MobArena.commands;
import java.io.File;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.command.*;
import org.bukkit.entity.Player;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.util.classparsing.*;
import com.garbagemule.MobArena.commands.user.*;
import com.garbagemule.MobArena.commands.admin.*;
import com.garbagemule.MobArena.commands.setup.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
public class CommandHandler implements CommandExecutor
{
/* COMMAND_PATH is an incomplete package-name for all commands in MobArena,
* hence the trailing dot, and the COMMAND_TYPES array contains all the
* different types of commands (the sub-folders). Both are used in the
* loadCommands() method. */
private static final String COMMAND_PATH = "com.garbagemule.MobArena.commands.";
private static final String[] COMMAND_TYPES = new String[]{"user", "admin", "setup"};
private MobArena plugin;
private ArenaMaster am;
private MobArenaPlugin plugin;
private Map<String,MACommand> commands;
private Map<String,Command> commands;
public CommandHandler(MobArenaPlugin plugin) {
this.plugin = plugin;
this.commands = new HashMap<String,MACommand>();
loadCommands();
public CommandHandler(MobArena plugin) {
this.plugin = plugin;
this.am = plugin.getArenaMaster();
registerCommands();
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (args.length == 0) {
plugin.tell(sender, Msg.MISC_NONE);
public boolean onCommand(CommandSender sender, org.bukkit.command.Command bcmd, String label, String[] args) {
// Grab the base and arguments.
String base = (args.length > 0 ? args[0] : "");
String last = (args.length > 0 ? args[args.length - 1] : "");
// If there's no base argument, show a helpful message.
if (base.equals("")) {
Messenger.tellPlayer(sender, Msg.MISC_HELP);
return true;
}
// Grab the command from the map, and if null, didn't work.
MACommand command = commands.get(args[0]);
if (command == null) {
System.out.println("Command '" + label + "' not recognized");
// The help command is a little special
if (base.equals("?") || base.equals("help")) {
showHelp(sender);
return true;
}
// Cast if sender is a Player, null otherwise.
Player p = (sender instanceof Player) ? (Player) sender : null;
// Get all commands that match the base.
List<Command> matches = getMatchingCommands(base);
// If null, must be console.
if (p == null) {
if (!command.executeFromConsole(plugin, sender, args)) {
sender.sendMessage("Can't use that command from the console.");
// If there's more than one match, display them.
if (matches.size() > 1) {
Messenger.tellPlayer(sender, Msg.MISC_MULTIPLE_MATCHES);
for (Command cmd : matches) {
showUsage(cmd, sender);
}
return true;
}
// Otherwise, check permissions
if (!p.hasPermission(command.getPermission())) {
sender.sendMessage("No permission");
// If there are no matches at all, notify.
if (matches.size() == 0) {
Messenger.tellPlayer(sender, Msg.MISC_NO_MATCHES);
return true;
}
// Execute!
command.execute(plugin, p, trimFirstArg(args));
// Grab the only match.
Command command = matches.get(0);
CommandInfo info = command.getClass().getAnnotation(CommandInfo.class);
// First check if the sender has permission.
if (!plugin.has(sender, info.permission())) {
Messenger.tellPlayer(sender, Msg.MISC_NO_ACCESS);
return true;
}
// Check if the last argument is a ?, in which case, display usage and description
if (last.equals("?") || last.equals("help")) {
showUsage(command, sender);
return true;
}
// Otherwise, execute the command!
String[] params = trimFirstArg(args);
command.execute(am, sender, params);
return true;
}
/**
* Since Java doesn't support pointer arithmetic, this method
* attempts to remove the first element of a String[] object
* by creating a new array of the same size -1 and copying all
* the elements over.
* @param args a String[] to trim
* @return a String[] with the same elements except for the very first
* Get all commands that match a given string.
* @param arg the given string
* @return a list of commands whose patterns match the given string
*/
private String[] trimFirstArg(String[] args) {
String[] result = new String[args.length - 1];
for (int i = 0; i < result.length; i++) {
result[i] = args[i+1];
private List<Command> getMatchingCommands(String arg) {
List<Command> result = new ArrayList<Command>();
// Grab the commands that match the argument.
for (Entry<String,Command> entry : commands.entrySet()) {
if (arg.matches(entry.getKey())) {
result.add(entry.getValue());
}
}
return result;
}
/**
* Load all of the MobArena commands from either the jar or the bin
* folder into the commands-map. Each one of a commands' names/aliases
* is added to the map, such that both "/ma join" and "/ma j" work, for
* instance.
* Show the usage and description messages of a command to a player.
* The usage will only be shown, if the player has permission for the command.
* @param cmd a Command
* @param sender a CommandSender
*/
private void loadCommands() {
// Prepare a strategy for the class parser.
ClassIterationStrategy strategy = null;
File f = new File("plugins" + File.separator + "MobArena.jar");
try {
// If jar exists, use it - otherwise, use bin.
strategy = (f.exists()) ? new JarClassIterationStrategy(f) :
new DirClassIterationStrategy(new File("bin"));
private void showUsage(Command cmd, CommandSender sender) {
CommandInfo info = cmd.getClass().getAnnotation(CommandInfo.class);
if (!plugin.has(sender, info.permission())) return;
// Create a new ClassParser with the given strategy.
ClassParser parser = new ClassParser(strategy);
// Iterate through all three folders, user/admin/setup
for (String type : COMMAND_TYPES) {
Collection<Class<?>> classes = parser.getClasses(COMMAND_PATH + type);
for (Class<?> c : classes) {
// Make sure the class is indeed an instance of MACommand
Object obj = c.newInstance();
if (!(obj instanceof MACommand))
continue;
// Then cast, and add for each command name/alias
MACommand command = (MACommand) obj;
for (String name : command.getNames()) {
commands.put(name, command);
}
}
}
} catch (Exception e) {
Messenger.tellPlayer(sender, info.usage() + " " + ChatColor.YELLOW + info.desc());
}
/**
* Remove the first argument of a string. This is because the very first
* element of the arguments array will be the command itself.
* @param args an array of length n
* @return the same array minus the first element, and thus of length n-1
*/
private String[] trimFirstArg(String[] args) {
return Arrays.copyOfRange(args, 1, args.length);
}
/**
* List all the available MobArena commands for the CommandSender.
* @param sender a player or the console
*/
private void showHelp(CommandSender sender) {
Messenger.tellPlayer(sender, "Available MobArena commands:");
for (Command cmd : commands.values()) {
showUsage(cmd, sender);
}
}
/**
* Register all the commands directly.
* This could also be done with a somewhat dirty classloader/resource reader
* method, but this is neater, albeit more manual work.
*/
private void registerCommands() {
commands = new HashMap<String,Command>();
// mobarena.use
register(ArenaListCommand.class);
register(JoinCommand.class);
register(LeaveCommand.class);
register(NotReadyCommand.class);
register(SpecCommand.class);
register(PlayerListCommand.class);
// mobarena.admin
register(DisableCommand.class);
register(EnableCommand.class);
register(ForceCommand.class);
register(KickCommand.class);
register(RestoreCommand.class);
// mobarena.setup
register(AddArenaCommand.class);
register(AddClassPermCommand.class);
register(AddContainerCommand.class);
register(AddSpawnpointCommand.class);
register(ArenaCommand.class);
register(CheckDataCommand.class);
register(ConfigCommand.class);
register(ContainersCommand.class);
register(EditArenaCommand.class);
register(ExpandLobbyRegionCommand.class);
register(ExpandRegionCommand.class);
register(ListClassesCommand.class);
register(ListClassPermsCommand.class);
register(ProtectCommand.class);
register(RemoveArenaCommand.class);
register(RemoveClassCommand.class);
register(RemoveClassPermCommand.class);
register(RemoveContainerCommand.class);
register(RemoveSpawnpointCommand.class);
register(SetArenaCommand.class);
register(SetClassCommand.class);
register(SetLobbyRegionCommand.class);
register(SetRegionCommand.class);
register(SetWarpCommand.class);
register(ShowRegionCommand.class);
register(SpawnpointsCommand.class);
register(AutoGenerateCommand.class);
register(AutoDegenerateCommand.class);
}
/**
* Register a single command.
* The Command's CommandInfo annotation is queried to find its pattern
* string, which is used to map the commands.
* @param c a Command
*/
private void register(Class<? extends Command> c) {
CommandInfo info = c.getAnnotation(CommandInfo.class);
if (info == null) return;
try {
commands.put(info.pattern(), c.newInstance());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
@@ -0,0 +1,33 @@
package com.garbagemule.MobArena.commands;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface CommandInfo
{
/**
* The actual name of the command. Not really used anywhere.
*/
public String name();
/**
* A regex pattern that allows minor oddities and alternatives to the command name.
*/
public String pattern();
/**
* The usage message, i.e. how the command should be used.
*/
public String usage();
/**
* A description of what the command does.
*/
public String desc();
/**
* The permission required to execute this command.
*/
public String permission();
}
@@ -0,0 +1,31 @@
package com.garbagemule.MobArena.commands;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.Messenger;
import com.garbagemule.MobArena.Msg;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
public class Commands
{
public static boolean isPlayer(CommandSender sender) {
return (sender instanceof Player);
}
public static boolean sanityChecks(Player p, ArenaMaster am, Arena arena, String arg1, List<Arena> arenas) {
if (arenas.size() > 1 && arg1.isEmpty())
Messenger.tellPlayer(p, Msg.JOIN_ARG_NEEDED);
else if (arena == null)
Messenger.tellPlayer(p, Msg.ARENA_DOES_NOT_EXIST);
else if (am.getArenaWithPlayer(p) != null && !arena.equals(am.getArenaWithPlayer(p)))
Messenger.tellPlayer(p, Msg.JOIN_IN_OTHER_ARENA);
else
return true;
return false;
}
}
@@ -1,40 +0,0 @@
package com.garbagemule.MobArena.commands;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.MobArenaPlugin;
public interface MACommand
{
/**
* Get an array of names/aliases for this command.
* Every command must have at least one name/alias to work.
* @return a String[] of names/aliases
*/
public String[] getNames();
/**
* Get the permission required to execute this command.
* If there is no permission required, the method returns
* the empty string.
* @return a permission or null
*/
public String getPermission();
/**
* Execute the implementing command with the input Player as the executor.
* @param sender The Player executing the command
* @param args A list of arguments
* @return true, if the command was executed successfully, false otherwise
*/
public boolean execute(MobArenaPlugin plugin, Player sender, String... args);
/**
* Execute the implementing command with the console as the executor.
* @param sender The console executing the command
* @param args A list of arguments
* @return true, if the command was executed successfully, false otherwise
*/
public boolean executeFromConsole(MobArenaPlugin plugin, CommandSender sender, String... args);
}
@@ -0,0 +1,55 @@
package com.garbagemule.MobArena.commands.admin;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "disable",
pattern = "disable|off",
usage = "/ma disable (<arena>|all)",
desc = "disable MobArena or individual arenas",
permission = "mobarena.admin.enable"
)
public class DisableCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
if (arg1.equals("all")) {
for (Arena arena : am.getArenas()) {
disable(arena, sender);
}
return true;
}
if (!arg1.equals("")) {
Arena arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
return false;
}
disable(arena, sender);
return true;
}
am.setEnabled(true);
am.saveConfig();
Messenger.tellPlayer(sender, "MobArena " + ChatColor.RED + "disabled");
return true;
}
private void disable(Arena arena, CommandSender sender) {
arena.setEnabled(false);
arena.getSettings().getParent().save();
Messenger.tellPlayer(sender, "Arena '" + arena.configName() + "' " + ChatColor.RED + "disabled");
}
}
@@ -1,30 +1,55 @@
package com.garbagemule.MobArena.commands.admin;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
public class EnableCommand implements MACommand
@CommandInfo(
name = "enable",
pattern = "enable|on",
usage = "/ma enable",
desc = "enable MobArena or individual arenas",
permission = "mobarena.admin.enable"
)
public class EnableCommand implements Command
{
@Override
public String[] getNames() {
return new String[] { "enable" };
}
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
if (arg1.equals("all")) {
for (Arena arena : am.getArenas()) {
enable(arena, sender);
}
return true;
}
if (!arg1.equals("")) {
Arena arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
return false;
}
@Override
public String getPermission() {
return "mobarena.admin.enable";
enable(arena, sender);
return true;
}
am.setEnabled(true);
am.saveConfig();
Messenger.tellPlayer(sender, "MobArena " + ChatColor.GREEN + "enabled");
return true;
}
@Override
public boolean execute(MobArenaPlugin plugin, Player sender, String... args) {
return false;
}
@Override
public boolean executeFromConsole(MobArenaPlugin plugin, CommandSender sender, String... args) {
return false;
private void enable(Arena arena, CommandSender sender) {
arena.setEnabled(true);
arena.getSettings().getParent().save();
Messenger.tellPlayer(sender, "Arena '" + arena.configName() + "' " + ChatColor.GREEN + "enabled");
}
}
@@ -0,0 +1,90 @@
package com.garbagemule.MobArena.commands.admin;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "force",
pattern = "force",
usage = "/ma force start|end (<arena>)",
desc = "force start or end an arena",
permission = "mobarena.admin.force"
)
public class ForceCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
String arg2 = (args.length > 1 ? args[1] : "");
if (arg1.equals("end")) {
// With no arguments, end all.
if (arg2.equals("")) {
for (Arena arena : am.getArenas()) {
arena.forceEnd();
}
Messenger.tellPlayer(sender, Msg.FORCE_END_ENDED);
am.resetArenaMap();
return true;
}
// Otherwise, grab the arena in question.
Arena arena = am.getArenaWithName(arg2);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
return false;
}
if (arena.getAllPlayers().isEmpty()) {
Messenger.tellPlayer(sender, Msg.FORCE_END_EMPTY);
return false;
}
// And end it!
arena.forceEnd();
Messenger.tellPlayer(sender, Msg.FORCE_END_ENDED);
return true;
}
if (arg1.equals("start")) {
// Require argument.
if (arg2.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma force start <arena>");
return false;
}
// Grab the arena.
Arena arena = am.getArenaWithName(arg2);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
return false;
}
if (arena.isRunning()) {
Messenger.tellPlayer(sender, Msg.FORCE_START_RUNNING);
return false;
}
if (arena.getReadyPlayersInLobby().isEmpty()) {
Messenger.tellPlayer(sender, Msg.FORCE_START_NOT_READY);
return false;
}
// And start it!
arena.forceStart();
Messenger.tellPlayer(sender, Msg.FORCE_START_STARTED);
return true;
}
Messenger.tellPlayer(sender, "Usage: /ma force start|end (<arena name>)");
return true;
}
}
@@ -0,0 +1,47 @@
package com.garbagemule.MobArena.commands.admin;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "kick",
pattern = "kick|kcik",
usage = "/ma kick <player>",
desc = "kick a player from an arena",
permission = "mobarena.admin.kick"
)
public class KickCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Require an argument
if (arg1.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma kick <player>");
return false;
}
Arena arena = am.getArenaWithPlayer(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, "That player is not in an arena.");
return false;
}
// Grab the Player object.
Player bp = am.getPlugin().getServer().getPlayer(arg1);
// Force leave.
arena.playerLeave(bp);
Messenger.tellPlayer(sender, "Player '" + arg1 + "' was kicked from arena '" + arena.configName() + "'.");
Messenger.tellPlayer(bp, "You were kicked by " + sender.getName() + ".");
return true;
}
}
@@ -0,0 +1,43 @@
package com.garbagemule.MobArena.commands.admin;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.util.inventory.InventoryManager;
@CommandInfo(
name = "restore",
pattern = "restore",
usage = "/ma restore <player>",
desc = "restore a player's inventory",
permission = "mobarena.admin.restore"
)
public class RestoreCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Require an argument
if (arg1.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma restore <player>");
return false;
}
if (am.getArenaWithPlayer(arg1) != null) {
Messenger.tellPlayer(sender, "Player is currently in an arena.");
return false;
}
if (InventoryManager.restoreFromFile(am.getPlugin(), am.getPlugin().getServer().getPlayer(arg1))) {
Messenger.tellPlayer(sender, "Restored " + arg1 + "'s inventory!");
} else {
Messenger.tellPlayer(sender, "Failed to restore " + arg1 + "'s inventory.");
}
return true;
}
}
@@ -0,0 +1,51 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "addarena",
pattern = "(add|new)arena",
usage = "/ma addarena <arena>",
desc = "add a new arena",
permission = "mobarena.setup.addarena"
)
public class AddArenaCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
// Require an argument
if (arg1.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma addarena <arena>");
return true;
}
Arena arena = am.getArenaWithName(arg1);
if (arena != null) {
Messenger.tellPlayer(sender, "An arena with that name already exists.");
return true;
}
arena = am.createArenaNode(arg1, p.getWorld());
am.setSelectedArena(arena);
Messenger.tellPlayer(sender, "New arena with name '" + arg1 + "' created!");
return true;
}
}
@@ -0,0 +1,47 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.util.TextUtils;
@CommandInfo(
name = "addclassperm",
pattern = "add(class)?perm(.*)",
usage = "/ma addclassperm <classname> <permission>",
desc = "add a per-class permission",
permission = "mobarena.setup.classes"
)
public class AddClassPermCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
String arg2 = (args.length > 1 ? args[1] : "");
if (arg1.equals("") || arg2.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma addclassperm <classname> <permission>");
return false;
}
// Grab the arena class
ArenaClass arenaClass = am.getClasses().get(arg1);
if (arenaClass == null) {
Messenger.tellPlayer(sender, "The class '" + TextUtils.camelCase(arg1) + "' does not exist.");
return false;
}
// Try to add the permission.
if (am.addClassPermission(arg1, arg2)) {
Messenger.tellPlayer(sender, "Added permission '" + arg2 + "' to class '" + TextUtils.camelCase(arg1) + "'.");
return true;
}
// If it wasn't added, notify.
Messenger.tellPlayer(sender, "Permission '" + arg2 + "' was NOT added to class '" + TextUtils.camelCase(arg1) + "'.");
return false;
}
}
@@ -0,0 +1,47 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.block.ContainerBlock;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "addcontainer",
pattern = "add(chest|container)",
usage = "/ma addcontainer <point name>",
desc = "add a new container for the selected arena",
permission = "mobarena.setup.containers"
)
public class AddContainerCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
if (!arg1.matches("^[a-zA-Z][a-zA-Z0-9]*$")) {
Messenger.tellPlayer(sender, "Usage: /ma addcontainer <point name>");
return false;
}
if (!(p.getTargetBlock(null, 50).getState() instanceof ContainerBlock)) {
Messenger.tellPlayer(sender, "You must look at container.");
return false;
}
am.getSelectedArena().getRegion().addChest(arg1, p.getTargetBlock(null, 50).getLocation());
Messenger.tellPlayer(sender, "Container '" + arg1 + "' added for arena \"" + am.getSelectedArena().configName() + "\"");
return true;
}
}
@@ -0,0 +1,41 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "addspawn",
pattern = "addspawn(point)?",
usage = "/ma addspawn <point name>",
desc = "add a new spawnpoint for the selected arena",
permission = "mobarena.setup.spawnpoints"
)
public class AddSpawnpointCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
if (!arg1.matches("^[a-zA-Z][a-zA-Z0-9]*$")) {
Messenger.tellPlayer(sender, "Usage: /ma addspawn <point name>");
return true;
}
am.getSelectedArena().getRegion().addSpawn(arg1, p.getLocation());
Messenger.tellPlayer(sender, "Spawnpoint " + arg1 + " added for arena \"" + am.getSelectedArena().configName() + "\"");
return true;
}
}
@@ -0,0 +1,37 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "arena",
pattern = "arena",
usage = "/ma arena",
desc = "list the currently selected arena",
permission = "mobarena.setup.arena"
)
public class ArenaCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
Messenger.tellPlayer(sender, "Currently selected arena: " + ChatColor.GREEN + am.getSelectedArena().configName());
StringBuffer buffy = new StringBuffer();
if (am.getArenas().size() > 1) {
for (Arena arena : am.getArenas()) {
if (!arena.equals(am.getSelectedArena())) {
buffy.append(arena.configName() + " ");
}
}
}
else buffy.append(Msg.MISC_NONE);
Messenger.tellPlayer(sender, "Other arenas: " + buffy.toString());
return true;
}
}
@@ -0,0 +1,50 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "autodegenerate",
pattern = "auto(\\-)?degenerate",
usage = "/ma autodegenerate <arena>",
desc = "autodegenerate an existing arena",
permission = "mobarena.setup.autodegenerate"
)
public class AutoDegenerateCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the arguments, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Require an argument
if (arg1.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma autodegenerate <arena>");
return true;
}
if (am.getArenas().size() < 2) {
Messenger.tellPlayer(sender, "At least one arena must exist!");
return true;
}
// Check if arena exists.
Arena arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
return true;
}
if (!MAUtils.undoItHippieMonster(arg1, am.getPlugin(), true)) {
Messenger.tellPlayer(sender, "Could not degenerate arena.");
return true;
}
Messenger.tellPlayer(sender, "Arena with name '" + arg1 + "' degenerated.");
return true;
}
}
@@ -0,0 +1,54 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "autogenerate",
pattern = "auto(\\-)?generate",
usage = "/ma autogenerate <arena>",
desc = "autogenerate a new arena",
permission = "mobarena.setup.autogenerate"
)
public class AutoGenerateCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the arguments, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
// Require an argument
if (arg1.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma autogenerate <arena>");
return true;
}
// Check if arena already exists.
Arena arena = am.getArenaWithName(arg1);
if (arena != null) {
Messenger.tellPlayer(sender, "An arena with that name already exists.");
return true;
}
if (!MAUtils.doooooItHippieMonster(p.getLocation(), 13, arg1, am.getPlugin())) {
Messenger.tellPlayer(sender, "Could not auto-generate arena.");
return true;
}
Messenger.tellPlayer(sender, "Arena with name '" + arg1 + "' generated.");
return true;
}
}
@@ -0,0 +1,33 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "checkdata",
pattern = "checkdata",
usage = "/ma checkdata",
desc = "check if all required points are set up",
permission = "mobarena.setup.checkdata"
)
public class CheckDataCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
Arena arena = arg1.equals("") ? am.getSelectedArena() : am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
return false;
}
arena.getRegion().checkData(am.getPlugin(), sender);
return true;
}
}
@@ -0,0 +1,39 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "config",
pattern = "config|cfg",
usage = "/ma config reload|save",
desc = "reload or save the config-file",
permission = "mobarena.setup.config"
)
public class ConfigCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
if (arg1.equals("reload")) {
am.reloadConfig();
Messenger.tellPlayer(sender, "Config reloaded.");
return true;
}
if (arg1.equals("save")) {
am.saveConfig();
Messenger.tellPlayer(sender, "Config saved.");
return true;
}
// Requires an argument.
Messenger.tellPlayer(sender, "Usage: /ma config reload|save");
return false;
}
}
@@ -0,0 +1,38 @@
package com.garbagemule.MobArena.commands.setup;
import java.util.Set;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "containers",
pattern = "(containers|chests)",
usage = "/ma containers",
desc = "list containers for the selected arena",
permission = "mobarena.setup.containers"
)
public class ContainersCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
StringBuffer buffy = new StringBuffer();
Set<String> containers = am.getPlugin().getMAConfig().getKeys("arenas." + am.getSelectedArena().configName() + ".coords.containers");
if (containers != null) {
for (String c : containers) {
buffy.append(c);
buffy.append(" ");
}
}
else {
buffy.append(Msg.MISC_NONE);
}
Messenger.tellPlayer(sender, "Containers for arena '" + am.getSelectedArena().configName() + "': " + buffy.toString());
return true;
}
}
@@ -0,0 +1,75 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "editarena",
pattern = "edit(arena)?",
usage = "/ma editarena (<arena>) (true|false)",
desc = "set edit mode of an arena",
permission = "mobarena.setup.editarena"
)
public class EditArenaCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
String arg2 = (args.length > 1 ? args[1] : "");
Arena arena;
// No arguments.
if (arg1.equals("")) {
arena = am.getSelectedArena();
arena.setEditMode(!arena.inEditMode());
}
// One argument.
else if (arg2.equals("")) {
// Argument is [true|false]
if (arg1.matches("true|on") || arg1.matches("false|off")) {
arena = am.getSelectedArena();
arena.setEditMode(arg1.equals("true"));
}
// Argument is <arena name>
else {
arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, "There is no arena with that name.");
Messenger.tellPlayer(sender, "Usage: /ma editarena (true|false)");
Messenger.tellPlayer(sender, " or /ma editarena <arena> (true|false)");
return true;
}
arena.setEditMode(!arena.inEditMode());
}
}
// Two arguments
else {
if (!(arg2.matches("true|on") || arg2.matches("false|off"))) {
Messenger.tellPlayer(sender, "Usage: /ma editarena (true|false)");
Messenger.tellPlayer(sender, " or /ma editarena <arena> (true|false)");
return true;
}
arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, "There is no arena with that name.");
Messenger.tellPlayer(sender, "Usage: /ma editarena (true|false)");
Messenger.tellPlayer(sender, " or /ma editarena <arena> (true|false)");
return true;
}
arena.setEditMode(arg2.equals("true"));
}
Messenger.tellPlayer(sender, "Edit mode for arena '" + arena.configName() + "': " + ((arena.inEditMode()) ? ChatColor.GREEN + "true" : ChatColor.RED + "false"));
if (arena.inEditMode()) Messenger.tellPlayer(sender, "Remember to turn it back off after editing!");
return true;
}
}
@@ -0,0 +1,56 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "expandlobbyregion",
pattern = "expandlobby(region)?",
usage = "/ma expandlobbyregion <amount> up|down|out",
desc = "expand the arena lobby region",
permission = "mobarena.setup.expandlobbyregion"
)
public class ExpandLobbyRegionCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
String arg2 = (args.length > 1 ? args[1] : "");
if (args.length != 2 || !arg1.matches("(-)?[0-9]+")) {
Messenger.tellPlayer(sender, "Usage: /ma expandlobbyregion <amount> up|down|out");
return false;
}
if (!am.getSelectedArena().getRegion().isLobbyDefined()) {
Messenger.tellPlayer(sender, "You must first define l1 and l2");
return true;
}
if (arg2.equals("up")) {
am.getSelectedArena().getRegion().expandLobbyUp(Integer.parseInt(arg1));
}
else if (arg2.equals("down")) {
am.getSelectedArena().getRegion().expandLobbyDown(Integer.parseInt(arg1));
}
else if (arg2.equals("out")) {
am.getSelectedArena().getRegion().expandLobbyOut(Integer.parseInt(arg1));
}
else {
Messenger.tellPlayer(sender, "Usage: /ma expandlobbyregion <amount> up|down|out");
return true;
}
// In case of a "negative" region, fix it!
am.getSelectedArena().getRegion().fixRegion();
Messenger.tellPlayer(sender, "Lobby region for '" + am.getSelectedArena().configName() + "' expanded " + arg2 + " by " + arg1 + " blocks.");
am.getSelectedArena().getRegion().save();
return true;
}
}
@@ -0,0 +1,56 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "expandregion",
pattern = "expand(region)?",
usage = "/ma expandregion <amount> up|down|out",
desc = "expand the arena region",
permission = "mobarena.setup.expandregion"
)
public class ExpandRegionCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
String arg2 = (args.length > 1 ? args[1] : "");
if (args.length != 2 || !arg1.matches("(-)?[0-9]+")) {
Messenger.tellPlayer(sender, "Usage: /ma expandregion <amount> up|down|out");
return false;
}
if (!am.getSelectedArena().getRegion().isDefined()) {
Messenger.tellPlayer(sender, "You must first define p1 and p2");
return true;
}
if (arg2.equals("up")) {
am.getSelectedArena().getRegion().expandUp(Integer.parseInt(arg1));
}
else if (arg2.equals("down")) {
am.getSelectedArena().getRegion().expandDown(Integer.parseInt(arg1));
}
else if (arg2.equals("out")) {
am.getSelectedArena().getRegion().expandOut(Integer.parseInt(arg1));
}
else {
Messenger.tellPlayer(sender, "Usage: /ma expandregion <amount> up|down|out");
return true;
}
// In case of a "negative" region, fix it!
am.getSelectedArena().getRegion().fixRegion();
Messenger.tellPlayer(sender, "Region for '" + am.getSelectedArena().configName() + "' expanded " + arg2 + " by " + arg1 + " blocks.");
am.getSelectedArena().getRegion().save();
return true;
}
}
@@ -0,0 +1,57 @@
package com.garbagemule.MobArena.commands.setup;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.util.TextUtils;
@CommandInfo(
name = "listclassperms",
pattern = "(list)?classperm(.*)s",
usage = "/ma listclassperms <classname>",
desc = "list per-class permissions",
permission = "mobarena.setup.classes"
)
public class ListClassPermsCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Require an argument.
if (arg1.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma listclassperms <classname>");
return true;
}
ArenaClass arenaClass = am.getClasses().get(arg1);
String className = TextUtils.camelCase(arg1);
if (arenaClass == null) {
Messenger.tellPlayer(sender, "The class '" + className + "' does not exist.");
return true;
}
Messenger.tellPlayer(sender, "Permissions for '" + className + "':");
Map<String,Boolean> perms = arenaClass.getPermissions();
if (perms.isEmpty()) {
Messenger.tellPlayer(sender, "<none>");
return true;
}
for (Entry<String,Boolean> entry : arenaClass.getPermissions().entrySet()) {
String perm = entry.getKey();
if (!entry.getValue()) {
perm = "^" + perm;
}
Messenger.tellPlayer(sender, "- " + perm);
}
return true;
}
}
@@ -0,0 +1,34 @@
package com.garbagemule.MobArena.commands.setup;
import java.util.Set;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "listclasses",
pattern = "(list)?class(.)*",
usage = "/ma listclasses",
desc = "list all current classes",
permission = "mobarena.setup.classes"
)
public class ListClassesCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
Messenger.tellPlayer(sender, "Current classes:");
Set<String> classes = am.getClasses().keySet();
if (classes == null || classes.isEmpty()) {
Messenger.tellPlayer(sender, "<none>");
return true;
}
for (String c : classes) {
Messenger.tellPlayer(sender, "- " + c);
}
return true;
}
}
@@ -0,0 +1,75 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "protect",
pattern = "protect",
usage = "/ma protect (<arena>) (true|false)",
desc = "set the protection of an arena",
permission = "mobarena.setup.protect"
)
public class ProtectCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
String arg2 = (args.length > 1 ? args[1] : "");
Arena arena;
// No arguments
if (arg1.equals("")) {
arena = am.getSelectedArena();
arena.setProtected(!arena.isProtected());
}
// One argument
else if (arg2.equals("")) {
// true/false
if (arg1.matches("true|on") || arg1.matches("false|off")) {
arena = am.getSelectedArena();
arena.setProtected(arg1.matches("true|on"));
}
// Arena name
else {
arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, "There is no arena with that name.");
Messenger.tellPlayer(sender, "Usage: /ma protect (true|false)");
Messenger.tellPlayer(sender, " or /ma protect <arena> (true|false)");
return true;
}
arena.setProtected(!arena.isProtected());
}
}
// Two arguments
else {
if (!(arg2.matches("true|on") || arg2.matches("false|off"))) {
Messenger.tellPlayer(sender, "Usage: /ma protect (true|false)");
Messenger.tellPlayer(sender, " or /ma protect <arena name> (true|false)");
return true;
}
arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, "There is no arena with that name.");
Messenger.tellPlayer(sender, "Usage: /ma protect (true|false)");
Messenger.tellPlayer(sender, " or /ma protect <arena name> (true|false)");
return true;
}
arena.setProtected(arg2.equals("true"));
}
arena.getSettings().getParent().save();
Messenger.tellPlayer(sender, "Protection for arena '" + arena.configName() + "': " + ((arena.isProtected()) ? ChatColor.GREEN + "on" : ChatColor.RED + "off"));
return true;
}
}
@@ -0,0 +1,50 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "removearena",
pattern = "(del(.)*|r(e)?m(ove)?)arena",
usage = "/ma removearena <arena>",
desc = "remove an arena",
permission = "mobarena.setup.removearena"
)
public class RemoveArenaCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Require an argument
if (arg1.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma removearena <arena>");
return false;
}
if (am.getArenas().size() == 1) {
Messenger.tellPlayer(sender, "At least one arena must exist.");
return false;
}
Arena arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, "There is no arena with that name.");
return false;
}
am.removeArenaNode(arena);
if (am.getSelectedArena().equals(arena)) {
am.setSelectedArena(am.getArenas().get(0));
}
Messenger.tellPlayer(sender, "Arena '" + arena.configName() + "' deleted.");
return true;
}
}
@@ -0,0 +1,42 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.util.TextUtils;
@CommandInfo(
name = "removeclass",
pattern = "(del(.)*|r(e)?m(ove)?)class",
usage = "/ma removeclass <classname>",
desc = "remove the given class",
permission = "mobarena.setup.classes"
)
public class RemoveClassCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Require an argument.
if (arg1.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma removeclass <classname>");
return false;
}
// Find the class
ArenaClass arenaClass = am.getClasses().get(arg1);
String className = TextUtils.camelCase(arg1);
if (arenaClass == null) {
Messenger.tellPlayer(sender, "The class '" + className + "' does not exist.");
return false;
}
am.removeClassNode(className);
Messenger.tellPlayer(sender, "Removed class '" + className + "'.");
return true;
}
}
@@ -0,0 +1,47 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.util.TextUtils;
@CommandInfo(
name = "removeclassperm",
pattern = "(del(.)*|r(e)?m(ove)?)(class)?perm(.*)",
usage = "/ma removeclassperm <classname> <permission>",
desc = "remove a per-class permission",
permission = "mobarena.setup.classes"
)
public class RemoveClassPermCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
String arg2 = (args.length > 1 ? args[1] : "");
if (arg1.equals("") || arg2.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma removeclassperm <classname> <permission>");
return false;
}
// Grab the arena class
ArenaClass arenaClass = am.getClasses().get(arg1);
if (arenaClass == null) {
Messenger.tellPlayer(sender, "The class '" + TextUtils.camelCase(arg1) + "' does not exist.");
return false;
}
// Remove the permission.
if (am.removeClassPermission(arg1, arg2)) {
Messenger.tellPlayer(sender, "Removed permission '" + arg2 + "' from class '" + TextUtils.camelCase(arg1) + "'.");
return true;
}
// If it wasn't removed, notify.
Messenger.tellPlayer(sender, "Permission '" + arg2 + "' was NOT removed from class '" + TextUtils.camelCase(arg1) + "'.");
return false;
}
}
@@ -0,0 +1,35 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "removecontainer",
pattern = "(del(.)*|r(e)?m(ove)?)(container|chest)",
usage = "/ma removecontainer <point name>",
desc = "remove a container from the selected arena",
permission = "mobarena.setup.containers"
)
public class RemoveContainerCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Require an argument
if (!arg1.matches("^[a-zA-Z][a-zA-Z0-9]*$")) {
Messenger.tellPlayer(sender, "Usage: /ma removecontainer <point name>");
return false;
}
if (am.getSelectedArena().getRegion().removeSpawn(arg1))
Messenger.tellPlayer(sender, "Container " + arg1 + " removed for arena '" + am.getSelectedArena().configName() + "'");
else
Messenger.tellPlayer(sender, "Could not find the container " + arg1 + "for the arena '" + am.getSelectedArena().configName() + "'");
return true;
}
}
@@ -0,0 +1,35 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "delspawn",
pattern = "(del(.)*|r(e)?m(ove)?)spawn(point)?",
usage = "/ma delspawn <point name>",
desc = "add a new arena",
permission = "mobarena.setup.spawnpoints"
)
public class RemoveSpawnpointCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Require an argument
if (!arg1.matches("^[a-zA-Z][a-zA-Z0-9]*$")) {
Messenger.tellPlayer(sender, "Usage: /ma removespawn <point name>");
return true;
}
if (am.getSelectedArena().getRegion().removeSpawn(arg1))
Messenger.tellPlayer(sender, "Spawnpoint " + arg1 + " removed for arena '" + am.getSelectedArena().configName() + "'");
else
Messenger.tellPlayer(sender, "Could not find the spawnpoint " + arg1 + "for the arena '" + am.getSelectedArena().configName() + "'");
return true;
}
}
@@ -0,0 +1,41 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "setarena",
pattern = "(set|select)arena",
usage = "/ma setarena <arena>",
desc = "set an arena as the selected arena",
permission = "mobarena.setup.setarena"
)
public class SetArenaCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Require an argument
if (arg1.equals("")) {
Messenger.tellPlayer(sender, "Usage: /ma setarena <arena>");
return false;
}
Arena arena = am.getArenaWithName(arg1);
if (arena != null) {
am.setSelectedArena(arena);
Messenger.tellPlayer(sender, "Currently selected arena: " + arena.configName());
}
else {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
}
return true;
}
}
@@ -0,0 +1,65 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.util.TextUtils;
@CommandInfo(
name = "setclass",
pattern = "setclass|saveclass",
usage = "/ma setclass (safe) <classname>",
desc = "save your inventory as a class",
permission = "mobarena.setup.classes"
)
public class SetClassCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
String arg2 = (args.length > 1 ? args[1] : "");
// Cast the sender.
Player p = (Player) sender;
// Require an argument.
if (arg1.equals("")) {
Messenger.tellPlayer(p, "Usage: /ma setclass (safe) <classname>");
return true;
}
// Check if we're overwriting.
boolean safe = arg1.equals("safe");
if (safe && arg2.equals("")) {
Messenger.tellPlayer(p, "Usage: /ma setclass (safe) <classname>");
return true;
}
// If so, use arg2, otherwise, use arg1
String className = TextUtils.camelCase(safe ? arg2 : arg1);
// Create the class.
ArenaClass arenaClass = am.createClassNode(className, p.getInventory(), safe);
// If the class is null, it was not created.
if (arenaClass == null) {
Messenger.tellPlayer(p, "That class already exists!");
Messenger.tellPlayer(p, "To overwrite, omit the 'safe' parameter.");
return true;
}
// Otherwise, yay!
Messenger.tellPlayer(p, "Class '" + className + "' set with your current inventory.");
return true;
}
}
@@ -0,0 +1,41 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "setlobbyregion",
pattern = "set(lobbyregion|l)",
usage = "/ma setlobbyregion l1|l2",
desc = "set the lobby region points of an arena",
permission = "mobarena.setup.setlobbyregion"
)
public class SetLobbyRegionCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
if (!(arg1.equals("l1") || arg1.equals("l2"))) {
Messenger.tellPlayer(sender, "Usage: /ma setlobbyregion l1|l2");
return true;
}
am.getSelectedArena().getRegion().set(arg1, p.getLocation());
Messenger.tellPlayer(sender, "Lobby region point " + arg1 + " for arena '" + am.getSelectedArena().configName() + "' set.");
return true;
}
}
@@ -2,28 +2,40 @@ package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.*;
public class SetRegionCommand implements MACommand
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "setregion",
pattern = "set(region|p)",
usage = "/ma setregion p1|p2",
desc = "set the region points of an arena",
permission = "mobarena.setup.setregion"
)
public class SetRegionCommand implements Command
{
@Override
public String[] getNames() {
return new String[] { "setregion" };
}
@Override
public String getPermission() {
return "mobarena.setup.setregion";
}
@Override
public boolean execute(MobArenaPlugin plugin, Player sender, String... args) {
return false;
}
@Override
public boolean executeFromConsole(MobArenaPlugin plugin, CommandSender sender, String... args) {
return false;
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
if (!(arg1.equals("p1") || arg1.equals("p2"))) {
Messenger.tellPlayer(sender, "Usage: /ma setregion p1|p2");
return true;
}
am.getSelectedArena().getRegion().set(arg1, p.getLocation());
Messenger.tellPlayer(sender, "Region point " + arg1 + " for arena '" + am.getSelectedArena().configName() + "' set.");
return true;
}
}
@@ -0,0 +1,42 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "setwarp",
pattern = "set(warp|point)",
usage = "/ma setwarp arena|lobby|spectator",
desc = "set a warp point for an arena",
permission = "mobarena.setup.setwarp"
)
public class SetWarpCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
if (!(arg1.equals("arena") || arg1.equals("lobby") || arg1.equals("spectator"))) {
Messenger.tellPlayer(sender, "Usage: /ma setwarp arena|lobby|spectator");
return true;
}
am.getSelectedArena().getRegion().set(arg1, p.getLocation());
Messenger.tellPlayer(sender, "Warp point " + arg1 + " was set for arena '" + am.getSelectedArena().configName() + "'");
Messenger.tellPlayer(sender, "Type /ma checkdata to see if you're missing anything...");
return true;
}
}
@@ -0,0 +1,59 @@
package com.garbagemule.MobArena.commands.setup;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "showregion",
pattern = "show(region)?",
usage = "/ma showregion (<arena>)",
desc = "show an arena region",
permission = "mobarena.setup.showregion"
)
public class ShowRegionCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
Arena arena;
if (arg1.equals("")) {
arena = am.getArenaAtLocation(p.getLocation());
if (arena == null) {
arena = am.getSelectedArena();
}
if (!arena.getRegion().isDefined()) {
Messenger.tellPlayer(sender, "The region is not defined for the selected arena.");
return false;
}
}
else {
arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
return false;
}
}
arena.getRegion().showRegion(p);
return true;
}
}
@@ -0,0 +1,38 @@
package com.garbagemule.MobArena.commands.setup;
import java.util.Set;
import org.bukkit.command.CommandSender;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "spawnpoints",
pattern = "spawn(point)?s",
usage = "/ma spawnpoints",
desc = "list spawnpoints for the selected arena",
permission = "mobarena.setup.spawnpoints"
)
public class SpawnpointsCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
StringBuffer buffy = new StringBuffer();
Set<String> spawnpoints = am.getPlugin().getMAConfig().getKeys("arenas." + am.getSelectedArena().configName() + ".coords.spawnpoints");
if (spawnpoints != null) {
for (String s : spawnpoints) {
buffy.append(s);
buffy.append(" ");
}
}
else {
buffy.append(Msg.MISC_NONE);
}
Messenger.tellPlayer(sender, "Spawnpoints for arena '" + am.getSelectedArena().configName() + "': " + buffy.toString());
return true;
}
}
@@ -4,51 +4,34 @@ import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.*;
public class ArenaListCommand implements MACommand
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "arenalist",
pattern = "arenas|arenal.*|lista.*",
usage = "/ma arenas",
desc = "lists all available arenas",
permission = "mobarena.use.arenalist"
)
public class ArenaListCommand implements Command
{
@Override
public String[] getNames() {
return new String[] { "arenas" , "list" };
}
@Override
public String getPermission() {
return "mobarena.use.arenalist";
}
@Override
public boolean execute(MobArenaPlugin plugin, Player sender, String... args) {
// Grab the arena master and the args.
ArenaMaster am = plugin.getArenaMaster();
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
List<Arena> arenas;
// Get the arenas.
List<Arena> arenas = am.getEnabledAndPermittedArenas(sender);
// Turn the list into a string.
String msg = Msg.MISC_LIST_ARENAS.toString(listToString(arenas));
plugin.tell(sender, msg);
return true;
}
@Override
public boolean executeFromConsole(MobArenaPlugin plugin, CommandSender sender, String... args) {
return false;
}
private <E> String listToString(List<E> list) {
String result = "";
for (E e : list) {
result += e + ", ";
if (Commands.isPlayer(sender)) {
Player p = (Player) sender;
arenas = am.getPermittedArenas(p);
} else {
arenas = am.getArenas();
}
if (result.equals(""))
return Msg.MISC_NONE.toString();
return result.substring(0, result.length() - 2);
String list = MAUtils.listToString(arenas, am.getPlugin());
Messenger.tellPlayer(sender, Msg.MISC_LIST_ARENAS.toString(list));
return true;
}
}
@@ -1,71 +1,71 @@
package com.garbagemule.MobArena.commands.user;
import java.util.*;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.*;
public class JoinCommand implements MACommand
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "join",
pattern = "j|jo.*|j.*n",
usage = "/ma join (<arena>)",
desc = "join an arena",
permission = "mobarena.use.join"
)
public class JoinCommand implements Command
{
@Override
public String[] getNames() {
return new String[] { "join" , "j" };
}
@Override
public String getPermission() {
return "mobarena.use.join";
}
@Override
public boolean execute(MobArenaPlugin plugin, Player sender, String... args) {
// Grab the arena master and get the argument.
ArenaMaster am = plugin.getArenaMaster();
String arenaName = (args.length == 1) ? args[0] : null;
// Get all arenas this player is eligible for.
List<Arena> arenas = am.getEnabledAndPermittedArenas(sender);
// If no arenas found, just tell the player it's not enabled.
if (arenas.size() == 0) {
plugin.tell(sender, Msg.JOIN_ARENA_NOT_ENABLED);
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Require an argument in case of multiple arenas.
if (arenaName == null && arenas.size() > 1) {
plugin.tell(sender, Msg.JOIN_ARG_NEEDED);
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
List<Arena> arenas = am.getEnabledArenas();
if (!am.isEnabled() || arenas.size() < 1) {
Messenger.tellPlayer(p, Msg.JOIN_NOT_ENABLED);
return true;
}
// Grab the arena to join
Arena arena = arenas.size() == 1 ? arenas.get(0) : am.getArenaWithName(arg1);
// Run a couple of basic sanity checks
if (!Commands.sanityChecks(p, am, arena, arg1, arenas)) {
return true;
}
// Run a bunch of per-arena sanity checks
if (!arena.canJoin(p)) {
return false;
}
/* At this point in time, if there was no argument, there must be only
* a single arena in the list. If there was an argument, we can safely
* get the arena with that name, because canJoin() will do the rest of
* the sanity checks. */
Arena a = (arenaName == null) ? arenas.get(0) : am.getArenaWithName(arenaName);
// If player is in a boat/minecart, eject!
if (p.isInsideVehicle())
p.leaveVehicle();
// If the arena is null, it doesn't exist.
if (a == null) {
plugin.tell(sender, Msg.ARENA_DOES_NOT_EXIST);
// If player is in a bed, unbed!
if (p.isSleeping()) {
p.kickPlayer("Banned for life... Nah, just don't join from a bed ;)");
return false;
}
// Let the arena itself do the rest of the sanity checking.
if (!a.canJoin(sender)) {
// Join the arena!
if (!arena.playerJoin(p, p.getLocation())) {
return false;
}
// If no problems, let the guy join and notify.
a.playerJoin(sender, sender.getLocation());
plugin.tell(sender, Msg.JOIN_PLAYER_JOINED);
return true;
}
@Override
public boolean executeFromConsole(MobArenaPlugin plugin, CommandSender sender, String... args) {
return false;
}
}
@@ -2,28 +2,43 @@ package com.garbagemule.MobArena.commands.user;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.*;
public class LeaveCommand implements MACommand
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "leave",
pattern = "l|le((.*))?",
usage = "/ma leave",
desc = "leave the arena",
permission = "mobarena.use.leave"
)
public class LeaveCommand implements Command
{
@Override
public String[] getNames() {
return new String[] { "leave" , "l" };
}
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Cast the sender.
Player p = (Player) sender;
@Override
public String getPermission() {
return "mobarena.use.leave";
}
@Override
public boolean execute(MobArenaPlugin plugin, Player sender, String... args) {
Arena arena = am.getArenaWithPlayer(p);
if (arena == null) {
arena = am.getArenaWithSpectator(p);
if (arena == null) {
Messenger.tellPlayer(p, Msg.LEAVE_NOT_PLAYING);
return false;
}
}
if (arena.playerLeave(p)) {
Messenger.tellPlayer(p, Msg.LEAVE_PLAYER_LEFT);
}
return true;
}
@Override
public boolean executeFromConsole(MobArenaPlugin plugin, CommandSender sender, String... args) {
return false;
}
}
@@ -2,28 +2,52 @@ package com.garbagemule.MobArena.commands.user;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.*;
public class NotReadyCommand implements MACommand
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "notready",
pattern = "notr.*|ready",
usage = "/ma notready (<arena>)",
desc = "lists all available arenas",
permission = "mobarena.use.arenalist"
)
public class NotReadyCommand implements Command
{
@Override
public String[] getNames() {
return new String[] { "notready" , "check" };
}
@Override
public String getPermission() {
return "mobarena.use.notready";
}
@Override
public boolean execute(MobArenaPlugin plugin, Player sender, String... args) {
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any
String arg1 = (args.length > 0 ? args[0] : "");
// The arena to query.
Arena arena = null;
if (!arg1.equals("")) {
arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
return false;
}
}
else if (Commands.isPlayer(sender)) {
Player p = (Player) sender;
arena = am.getArenaWithPlayer(p);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.LEAVE_NOT_PLAYING);
return false;
}
}
else {
Messenger.tellPlayer(sender, "Usage: /ma notready <arena name>");
return false;
}
String list = MAUtils.listToString(arena.getNonreadyPlayers(), am.getPlugin());
Messenger.tellPlayer(sender, Msg.MISC_LIST_PLAYERS.toString(list));
return true;
}
@Override
public boolean executeFromConsole(MobArenaPlugin plugin, CommandSender sender, String... args) {
return false;
}
}
@@ -1,29 +1,54 @@
package com.garbagemule.MobArena.commands.user;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.*;
public class PlayerListCommand implements MACommand
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "playerlist",
pattern = "player.*|listp.*",
usage = "/ma players (<arena>)",
desc = "lists players in an arena",
permission = "mobarena.use.playerlist"
)
public class PlayerListCommand implements Command
{
@Override
public String[] getNames() {
return new String[] { "who" , "players" };
}
@Override
public String getPermission() {
return "mobarena.use.playerlist";
}
@Override
public boolean execute(MobArenaPlugin plugin, Player sender, String... args) {
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
String list = null;
if (!arg1.equals("")) {
Arena arena = am.getArenaWithName(arg1);
if (arena == null) {
Messenger.tellPlayer(sender, Msg.ARENA_DOES_NOT_EXIST);
return false;
}
list = MAUtils.listToString(arena.getPlayersInArena(), am.getPlugin());
}
else {
StringBuffer buffy = new StringBuffer();
List<Player> players = new LinkedList<Player>();
for (Arena arena : am.getArenas()) {
players.addAll(arena.getPlayersInArena());
}
buffy.append(MAUtils.listToString(players, am.getPlugin()));
list = buffy.toString();
}
Messenger.tellPlayer(sender, Msg.MISC_LIST_PLAYERS.toString(list));
return true;
}
@Override
public boolean executeFromConsole(MobArenaPlugin plugin, CommandSender sender, String... args) {
return false;
}
}
@@ -0,0 +1,70 @@
package com.garbagemule.MobArena.commands.user;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.*;
import com.garbagemule.MobArena.commands.*;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
@CommandInfo(
name = "spec",
pattern = "s|spec.*",
usage = "/ma spec (<arena>)",
desc = "spec an arena",
permission = "mobarena.use.spec"
)
public class SpecCommand implements Command
{
@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
Messenger.tellPlayer(sender, Msg.MISC_NOT_FROM_CONSOLE);
return false;
}
// Grab the argument, if any.
String arg1 = (args.length > 0 ? args[0] : "");
// Cast the sender.
Player p = (Player) sender;
List<Arena> arenas = am.getEnabledArenas();
if (!am.isEnabled() || arenas.size() < 1) {
Messenger.tellPlayer(p, Msg.JOIN_NOT_ENABLED);
return true;
}
// Grab the arena to join
Arena arena = arenas.size() == 1 ? arenas.get(0) : am.getArenaWithName(arg1);
// Run a couple of basic sanity checks
if (!Commands.sanityChecks(p, am, arena, arg1, arenas)) {
return false;
}
// Run a bunch of arena-specific sanity-checks
if (!arena.canSpec(p)) {
return false;
}
// If player is in a boat/minecart, eject!
if (p.isInsideVehicle())
p.leaveVehicle();
// If player is in a bed, unbed!
if (p.isSleeping()) {
p.kickPlayer("Banned for life... Nah, just don't join from a bed ;)");
return false;
}
// Spectate the arena!
arena.playerSpec(p, p.getLocation());
Messenger.tellPlayer(p, Msg.SPEC_PLAYER_SPECTATE);
return true;
}
}
@@ -0,0 +1,43 @@
package com.garbagemule.MobArena.events;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import com.garbagemule.MobArena.framework.Arena;
public class ArenaEndEvent extends Event implements Cancellable
{
private static final long serialVersionUID = -492437066028367597L;
private static final HandlerList handlers = new HandlerList();
private Arena arena;
private boolean cancelled;
public ArenaEndEvent(Arena arena) {
this.arena = arena;
this.cancelled = false;
}
public Arena getArena() {
return arena;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
@@ -0,0 +1,37 @@
package com.garbagemule.MobArena.events;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import com.garbagemule.MobArena.framework.Arena;
public class ArenaPlayerDeathEvent extends Event
{
private static final long serialVersionUID = 8945689670354700831L;
private static final HandlerList handlers = new HandlerList();
private Player player;
private Arena arena;
public ArenaPlayerDeathEvent(Player player, Arena arena) {
this.player = player;
this.arena = arena;
}
public Player getPlayer() {
return player;
}
public Arena getArena() {
return arena;
}
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
@@ -0,0 +1,50 @@
package com.garbagemule.MobArena.events;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import com.garbagemule.MobArena.framework.Arena;
public class ArenaPlayerJoinEvent extends Event implements Cancellable
{
private static final long serialVersionUID = -1205905192685201064L;
private static final HandlerList handlers = new HandlerList();
private Player player;
private Arena arena;
private boolean cancelled;
public ArenaPlayerJoinEvent(Player player, Arena arena) {
this.player = player;
this.arena = arena;
this.cancelled = false;
}
public Player getPlayer() {
return player;
}
public Arena getArena() {
return arena;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
@@ -0,0 +1,50 @@
package com.garbagemule.MobArena.events;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import com.garbagemule.MobArena.framework.Arena;
public class ArenaPlayerLeaveEvent extends Event implements Cancellable
{
private static final long serialVersionUID = -8942511403871825734L;
private static final HandlerList handlers = new HandlerList();
private Player player;
private Arena arena;
private boolean cancelled;
public ArenaPlayerLeaveEvent(Player player, Arena arena) {
this.player = player;
this.arena = arena;
this.cancelled = false;
}
public Player getPlayer() {
return player;
}
public Arena getArena() {
return arena;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
@@ -0,0 +1,43 @@
package com.garbagemule.MobArena.events;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import com.garbagemule.MobArena.framework.Arena;
public class ArenaStartEvent extends Event implements Cancellable
{
private static final long serialVersionUID = 4414065978731456440L;
private static final HandlerList handlers = new HandlerList();
private Arena arena;
private boolean cancelled;
public ArenaStartEvent(Arena arena) {
this.arena = arena;
this.cancelled = false;
}
public Arena getArena() {
return arena;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
@@ -0,0 +1,55 @@
package com.garbagemule.MobArena.events;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.waves.Wave;
public class NewWaveEvent extends Event implements Cancellable
{
private static final long serialVersionUID = -8743818273565357180L;
private static final HandlerList handlers = new HandlerList();
private Arena arena;
private boolean cancelled;
private Wave wave;
private int waveNo;
public NewWaveEvent(Arena arena, Wave wave, int waveNo) {
this.wave = wave;
this.waveNo = waveNo;
}
public Wave getWave() {
return wave;
}
public int getWaveNumber() {
return waveNo;
}
public Arena getArena() {
return arena;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
@@ -0,0 +1,231 @@
package com.garbagemule.MobArena.framework;
import java.util.*;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.garbagemule.MobArena.ArenaClass;
import com.garbagemule.MobArena.ArenaListenerImpl;
import com.garbagemule.MobArena.ArenaPlayer;
import com.garbagemule.MobArena.MASpawnThread;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.MonsterManager;
import com.garbagemule.MobArena.RewardManager;
import com.garbagemule.MobArena.leaderboards.Leaderboard;
import com.garbagemule.MobArena.region.ArenaRegion;
import com.garbagemule.MobArena.repairable.Repairable;
import com.garbagemule.MobArena.util.config.ConfigSection;
import com.garbagemule.MobArena.util.inventory.InventoryManager;
import com.garbagemule.MobArena.waves.Wave;
import com.garbagemule.MobArena.waves.WaveManager;
public interface Arena
{
/*/////////////////////////////////////////////////////////////////////////
//
// NEW METHODS IN REFACTORING
//
/////////////////////////////////////////////////////////////////////////*/
public ConfigSection getSettings();
public World getWorld();
public void setWorld(World world);
public boolean isEnabled();
public void setEnabled(boolean value);
public boolean isProtected();
public void setProtected(boolean value);
public boolean isRunning();
public boolean inEditMode();
public void setEditMode(boolean value);
public Material getClassLogo(String classname);
public List<ItemStack> getEntryFee();
public Set<Map.Entry<Integer,List<ItemStack>>> getEveryWaveEntrySet();
public List<ItemStack> getAfterWaveReward(int wave);
public Set<Player> getPlayersInArena();
public Set<Player> getPlayersInLobby();
public Set<Player> getReadyPlayersInLobby();
public Set<Player> getSpectators();
public MASpawnThread getSpawnThread();
public WaveManager getWaveManager();
public Location getPlayerEntry(Player p);
public ArenaListenerImpl getEventListener();
public void setLeaderboard(Leaderboard leaderboard);
public ArenaPlayer getArenaPlayer(Player p);
public Set<Block> getBlocks();
public void addBlock(Block b);
public boolean removeBlock(Block b);
public boolean hasPet(Entity e);
public void addRepairable(Repairable r);
public ArenaRegion getRegion();
public InventoryManager getInventoryManager();
public RewardManager getRewardManager();
public MonsterManager getMonsterManager();
public void revivePlayer(Player p);
public void scheduleTask(Runnable r, int delay);
public boolean startArena();
public boolean endArena();
public void forceStart();
public void forceEnd();
public boolean playerJoin(Player p, Location loc);
public void playerReady(Player p);
public boolean playerLeave(Player p);
public void playerDeath(Player p);
public void playerRespawn(Player p);
public Location getRespawnLocation(Player p);
public void playerSpec(Player p, Location loc);
public void storePlayerData(Player p, Location loc);
public void storeContainerContents();
public void restoreContainerContents();
public void movePlayerToLobby(Player p);
public void movePlayerToSpec(Player p);
public void movePlayerToEntry(Player p);
public void discardPlayer(Player p);
public void repairBlocks();
public void queueRepairable(Repairable r);
/*////////////////////////////////////////////////////////////////////
//
// Items & Cleanup
//
////////////////////////////////////////////////////////////////////*/
public void assignClass(Player p, String className);
public void assignRandomClass(Player p);
public void assignClassPermissions(Player p);
public void removeClassPermissions(Player p);
/*////////////////////////////////////////////////////////////////////
//
// Initialization & Checks
//
////////////////////////////////////////////////////////////////////*/
public void restoreRegion();
/*////////////////////////////////////////////////////////////////////
//
// Getters & Misc
//
////////////////////////////////////////////////////////////////////*/
public boolean inArena(Player p);
public boolean inLobby(Player p);
public boolean inSpec(Player p);
public boolean isDead(Player p);
public String configName();
public String arenaName();
public MobArena getPlugin();
public Wave getWave();
public Map<String,ArenaClass> getClasses();
public int getPlayerCount();
public List<Player> getAllPlayers();
public Collection<ArenaPlayer> getArenaPlayerSet();
public List<Player> getNonreadyPlayers();
public boolean canAfford(Player p);
public boolean takeFee(Player p);
public boolean refund(Player p);
public boolean canJoin(Player p);
public boolean canSpec(Player p);
}
@@ -1,4 +1,4 @@
package com.garbagemule.MobArena;
package com.garbagemule.MobArena.framework;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockIgniteEvent;
@@ -19,7 +19,11 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
public interface ArenaListener
{
{
public enum TeleportResponse {
ALLOW, REJECT, IDGAF
}
public void onBlockBreak(BlockBreakEvent event);
public void onBlockPlace(BlockPlaceEvent event);
public void onBlockIgnite(BlockIgniteEvent event);
@@ -35,6 +39,6 @@ public interface ArenaListener
public void onPlayerInteract(PlayerInteractEvent event);
public void onPlayerQuit(PlayerQuitEvent event);
public void onPlayerKick(PlayerKickEvent event);
public void onPlayerTeleport(PlayerTeleportEvent event);
public TeleportResponse onPlayerTeleport(PlayerTeleportEvent event);
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event);
}
@@ -0,0 +1,136 @@
package com.garbagemule.MobArena.framework;
import java.util.List;
import java.util.Map;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.PlayerInventory;
import com.garbagemule.MobArena.ArenaClass;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.framework.Arena;
public interface ArenaMaster
{
/*/////////////////////////////////////////////////////////////////////////
//
// NEW METHODS IN REFACTORING
//
/////////////////////////////////////////////////////////////////////////*/
public MobArena getPlugin();
public boolean isEnabled();
public void setEnabled(boolean value);
public boolean notifyOnUpdates();
public Arena getSelectedArena();
public void setSelectedArena(Arena arena);
public List<Arena> getArenas();
public Map<String,ArenaClass> getClasses();
public void addPlayer(Player p, Arena arena);
public Arena removePlayer(Player p);
public void resetArenaMap();
/*/////////////////////////////////////////////////////////////////////////
//
// Getters
//
/////////////////////////////////////////////////////////////////////////*/
public List<Arena> getEnabledArenas();
public List<Arena> getPermittedArenas(Player p);
public List<Arena> getEnabledAndPermittedArenas(Player p);
public Arena getArenaAtLocation(Location loc);
public List<Arena> getArenasInWorld(World world);
public List<Player> getAllPlayers();
public List<Player> getAllPlayersInArena(String arenaName);
public List<Player> getAllLivingPlayers();
public List<Player> getLivingPlayersInArena(String arenaName);
public Arena getArenaWithPlayer(Player p);
public Arena getArenaWithPlayer(String playerName);
public Arena getArenaWithSpectator(Player p);
public Arena getArenaWithMonster(Entity e);
public Arena getArenaWithPet(Entity e);
public Arena getArenaWithName(String configName);
public boolean isAllowed(String command);
/*/////////////////////////////////////////////////////////////////////////
//
// Initialization
//
/////////////////////////////////////////////////////////////////////////*/
public void initialize();
/**
* Load the global settings.
*/
public void loadSettings();
/**
* Load all class-related stuff.
*/
public void loadClasses();
public ArenaClass createClassNode(String className, PlayerInventory inv, boolean safe);
public void removeClassNode(String className);
public boolean addClassPermission(String className, String perm);
public boolean removeClassPermission(String className, String perm);
/**
* Load all arena-related stuff.
*/
public void loadArenas();
public Arena createArenaNode(String configName, World world);
public void removeArenaNode(Arena arena);
/*/////////////////////////////////////////////////////////////////////////
//
// Update and serialization methods
//
/////////////////////////////////////////////////////////////////////////*/
public void reloadConfig();
public void saveConfig();
}
@@ -0,0 +1,13 @@
package com.garbagemule.MobArena.health;
import org.bukkit.entity.Player;
public interface HealthStrategy
{
/**
* Set the health of a player.
* @param p a player
* @param health amount of health
*/
public void setHealth(Player p, int health);
}
@@ -0,0 +1,21 @@
package com.garbagemule.MobArena.health;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
public class HealthStrategyHeroes implements HealthStrategy
{
@Override
public void setHealth(Player p, int health) {
int current = p.getHealth();
int regain = health == 20 ? 20 : health - current;
try {
EntityRegainHealthEvent event = new EntityRegainHealthEvent(p, regain, RegainReason.CUSTOM);
Bukkit.getPluginManager().callEvent(event);
}
catch (Exception e) {} // Because Bukkit is retarded.
}
}
@@ -0,0 +1,11 @@
package com.garbagemule.MobArena.health;
import org.bukkit.entity.Player;
public class HealthStrategyStandard implements HealthStrategy
{
@Override
public void setHealth(Player p, int health) {
p.setHealth(health);
}
}
@@ -0,0 +1,57 @@
package com.garbagemule.MobArena.leaderboards;
import java.util.List;
import org.bukkit.block.Sign;
import com.garbagemule.MobArena.ArenaPlayerStatistics;
public abstract class AbstractLeaderboardColumn implements LeaderboardColumn
{
protected String statname;
private Sign header;
private List<Sign> signs;
public AbstractLeaderboardColumn(String statname, Sign header, List<Sign> signs) {
this.statname = statname;
this.header = header;
this.signs = signs;
}
public void update(List<ArenaPlayerStatistics> stats) {
// Make sure the stats will fit on the signs.
int range = Math.min(stats.size(), signs.size()*4);
for (int i = 0; i < range; i++) {
// Grab the right sign.
Sign s = signs.get(i/4);
// Call the template method.
String value = getLine(stats.get(i));
// And set the line
s.setLine(i % 4, value);
s.update();
}
}
public abstract String getLine(ArenaPlayerStatistics stats);
public void clear() {
for (Sign s : signs) {
s.setLine(0, "");
s.setLine(1, "");
s.setLine(2, "");
s.setLine(3, "");
s.update();
}
}
public Sign getHeader() {
return header;
}
public List<Sign> getSigns() {
return signs;
}
}
@@ -0,0 +1,19 @@
package com.garbagemule.MobArena.leaderboards;
import java.util.List;
import org.bukkit.block.Sign;
import com.garbagemule.MobArena.ArenaPlayerStatistics;
public class ClassLeaderboardColumn extends AbstractLeaderboardColumn
{
public ClassLeaderboardColumn(String statname, Sign header, List<Sign> signs) {
super(statname, header, signs);
}
@Override
public String getLine(ArenaPlayerStatistics stats) {
return stats.getClassName();
}
}
@@ -0,0 +1,19 @@
package com.garbagemule.MobArena.leaderboards;
import java.util.List;
import org.bukkit.block.Sign;
import com.garbagemule.MobArena.ArenaPlayerStatistics;
public class IntLeaderboardColumn extends AbstractLeaderboardColumn
{
public IntLeaderboardColumn(String statname, Sign header, List<Sign> signs) {
super(statname, header, signs);
}
@Override
public String getLine(ArenaPlayerStatistics stats) {
return "" + stats.getInt(statname);
}
}
@@ -4,19 +4,16 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
//import org.bukkit.util.config.Configuration;
import com.garbagemule.MobArena.Arena;
import com.garbagemule.MobArena.ArenaPlayer;
import com.garbagemule.MobArena.ArenaPlayerStatistics;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.util.Config;
import com.garbagemule.MobArena.framework.Arena;
public class Leaderboard
{
@@ -34,12 +31,12 @@ public class Leaderboard
private boolean isValid;
/**
* Default constructor.
* Private constructor.
* Creates a new leaderboard with no signs or locations or anything.
* @param plugin MobArena instance.
* @param arena The arena to which this leaderboard belongs.
*/
public Leaderboard(MobArena plugin, Arena arena)
private Leaderboard(MobArena plugin, Arena arena)
{
this.plugin = plugin;
this.arena = arena;
@@ -47,31 +44,6 @@ public class Leaderboard
this.stats = new ArrayList<ArenaPlayerStatistics>();
}
/**
* Config constructor.
* Used to create a leaderboard from the location persisted in the config-file.
* @param plugin MobArena instance.
* @param arena The arena to which this leaderboard belongs.
* @param config The config-file in which the location is specified.
*/
public Leaderboard(MobArena plugin, Arena arena, Config config)
{
this(plugin, arena);
// Grab the coords from the config-file.
String coords = config.getString("arenas." + arena.configName() + ".coords.leaderboard", null);
if (coords != null)
{
// Grab the top left sign.
topLeft = Config.parseLocation(arena.getWorld(), coords);
// If it is a sign, validate.
if (topLeft.getBlock().getState() instanceof Sign)
isValid = isGridWellFormed();
}
}
/**
* Location constructor.
* Used to create a leaderboard on-the-fly from the location from the SignChangeEvent.
@@ -83,6 +55,10 @@ public class Leaderboard
{
this(plugin, arena);
if (topLeft == null) {
return;
}
if (!(topLeft.getBlock().getState() instanceof Sign))
throw new IllegalArgumentException("Block must be a sign!");
@@ -118,7 +94,7 @@ public class Leaderboard
public void startTracking()
{
trackingId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin,
trackingId = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin,
new Runnable()
{
public void run()
@@ -130,7 +106,7 @@ public class Leaderboard
public void stopTracking()
{
Bukkit.getServer().getScheduler().cancelTask(trackingId);
plugin.getServer().getScheduler().cancelTask(trackingId);
}
/**
@@ -146,7 +122,7 @@ public class Leaderboard
if (!(state instanceof Sign))
{
MobArena.error("Leaderboards for '" + arena.configName() + "' could not be established!");
plugin.error("Leaderboards for '" + arena.configName() + "' could not be established!");
return false;
}
@@ -212,8 +188,21 @@ public class Leaderboard
}
// Create the column.
LeaderboardColumn column = LeaderboardColumn.create(stat.getShortName(), header, signs);
if (column == null) continue;
LeaderboardColumn column = null;
// Switch on the type of stat
switch (stat) {
case PLAYER_NAME:
column = new PlayerLeaderboardColumn(stat.getShortName(), header, signs);
break;
case CLASS_NAME:
column = new ClassLeaderboardColumn(stat.getShortName(), header, signs);
break;
default:
column = new IntLeaderboardColumn(stat.getShortName(), header, signs);
break;
}
this.boards.add(column);
}
while ((header = getAdjacentSign(header, direction)) != null);
@@ -1,116 +1,43 @@
package com.garbagemule.MobArena.leaderboards;
import java.lang.reflect.Field;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.block.Sign;
import com.garbagemule.MobArena.ArenaPlayerStatistics;
import com.garbagemule.MobArena.util.TextUtils;
public class LeaderboardColumn
public interface LeaderboardColumn
{
private Field field;
private boolean isPlayerName;
private Sign header;
private List<Sign> signs;
private LeaderboardColumn(String statname, Sign header, List<Sign> signs) throws Exception
{
this.field = ArenaPlayerStatistics.class.getDeclaredField(statname);
this.isPlayerName = statname.equals("playerName");
this.header = header;
this.signs = signs;
}
/**
* Update all the signs in this column to the current values
* of the player stat associated with this column.
*/
public void update(List<ArenaPlayerStatistics> stats);
/**
* Safely create a new LeaderboardColumn.
* Avoid the try-catch blocks by creating columns with this method.
* @param statname The name of the stat to track
* @param header The header sign
* @param signs A list of signs
* @return A new LeaderboardColumn, or null
* Get the String representation of the stat in question.
* The line is calculated by simply calling the appropriate
* getter on the ArenaPlayerStatistics object.
* @param stats an ArenaPlayerStatistics object
* @return the String representation of the stat in question
*/
public static LeaderboardColumn create(String statname, Sign header, List<Sign> signs)
{
try
{
return new LeaderboardColumn(statname, header, signs);
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public String getLine(ArenaPlayerStatistics stats);
public void update(List<ArenaPlayerStatistics> stats)
{
// Make sure the stats will fit on the signs.
int range = Math.min(stats.size(), signs.size()*4);
try
{
if (isPlayerName)
{
for (int i = 0; i < range; i++)
{
// Grab the right sign.
Sign s = signs.get(i/4);
// Get the stat value.
field.setAccessible(true);
ArenaPlayerStatistics aps = stats.get(i);
Object o = field.get(aps);
field.setAccessible(false);
String name = aps.getArenaPlayer().isDead() ? o.toString() : ChatColor.GREEN + o.toString();
// Set the value on the right line.
s.setLine(i % 4, TextUtils.truncate(name));
s.update();
}
}
else
{
for (int i = 0; i < range; i++)
{
// Grab the right sign.
Sign s = signs.get(i/4);
// Get the stat value.
field.setAccessible(true);
Object o = field.get(stats.get(i));
field.setAccessible(false);
// Set the value on the right line.
s.setLine(i % 4, o.toString());
s.update();
}
}
}
catch (Exception e) { e.printStackTrace(); }
}
/**
* Clear the text on all the signs in the column.
*/
public void clear();
public void clear()
{
for (Sign s : signs)
{
s.setLine(0, "");
s.setLine(1, "");
s.setLine(2, "");
s.setLine(3, "");
s.update();
}
}
/**
* Get the top sign of the column.
* The top sign displays the stat name.
* @return the top sign of the column
*/
public Sign getHeader();
public Sign getHeader()
{
return header;
}
public List<Sign> getSigns()
{
return signs;
}
/**
* Get all signs in the column (minus the header).
* @return all signs in the column (minus the header)
*/
public List<Sign> getSigns();
}
@@ -0,0 +1,19 @@
package com.garbagemule.MobArena.leaderboards;
import java.util.List;
import org.bukkit.block.Sign;
import com.garbagemule.MobArena.ArenaPlayerStatistics;
public class PlayerLeaderboardColumn extends AbstractLeaderboardColumn
{
public PlayerLeaderboardColumn(String statname, Sign header, List<Sign> signs) {
super(statname, header, signs);
}
@Override
public String getLine(ArenaPlayerStatistics stats) {
return stats.getPlayerName();
}
}
@@ -1,49 +1,44 @@
package com.garbagemule.MobArena.leaderboards;
import com.garbagemule.MobArena.util.WaveUtils;
public enum Stats
{
players("Players", "playerName"),
className("Class", "className"),
kills("Kills", "kills"),
dmgDone("Damage Done", "dmgDone"),
dmgTaken("Damage Taken", "dmgTaken"),
swings("Swings", "swings"),
hits("Hits", "hits"),
lastWave("Last Wave", "lastWave");
PLAYER_NAME("Players", "playerName"),
CLASS_NAME("Class", "class"),
KILLS("Kills", "kills"),
DAMAGE_DONE("Damage Done", "dmgDone"),
DAMAGE_TAKEN("Damage Taken", "dmgTaken"),
SWINGS("Swings", "swings"),
HITS("Hits", "hits"),
LAST_WAVE("Last Wave", "lastWave");
private String name, shortName;
private Stats(String name, String shortName)
{
private Stats(String name, String shortName) {
this.name = name;
this.shortName = shortName;
}
public String getShortName()
{
public String getShortName() {
return shortName;
}
public String getFullName()
{
public String getFullName() {
return name;
}
public static Stats fromString(String name)
{
if (name.equals("class"))
return Stats.className;
return WaveUtils.getEnumFromStringCaseSensitive(Stats.class, name);
}
public static Stats getByFullName(String name)
{
public static Stats getByFullName(String name) {
for (Stats s : Stats.values())
if (s.name.equals(name))
return s;
return null;
}
public static Stats getByShortName(String name) {
for (Stats s : Stats.values()) {
if (s.shortName.equalsIgnoreCase(name)) {
return s;
}
}
return null;
}
}
@@ -0,0 +1,278 @@
package com.garbagemule.MobArena.listeners;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.*;
import org.bukkit.event.entity.*;
import org.bukkit.event.player.*;
import com.garbagemule.MobArena.Messenger;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.framework.ArenaListener.TeleportResponse;
import com.garbagemule.MobArena.leaderboards.Stats;
import com.garbagemule.MobArena.util.VersionChecker;
/**
* The point of this class is to simply redirect all events to each arena's
* own listener(s).
* This means only one actual listener need be registered in Bukkit, and thus
* less overhead. Of course, this requires a little bit of "hackery" here
* and there.
*/
public class MAGlobalListener implements Listener
{
private MobArena plugin;
private ArenaMaster am;
public MAGlobalListener(MobArena plugin, ArenaMaster am) {
this.plugin = plugin;
this.am = am;
}
///////////////////////////////////////////////////////////////////////////
// //
// BLOCK EVENTS //
// //
///////////////////////////////////////////////////////////////////////////
@EventHandler(priority = EventPriority.HIGHEST)
public void blockBreak(BlockBreakEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onBlockBreak(event);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void blockBurn(BlockBurnEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onBlockBurn(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void blockForm(BlockFormEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onBlockForm(event);
}
@EventHandler(priority = EventPriority.HIGH)
public void blockIgnite(BlockIgniteEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onBlockIgnite(event);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void blockPlace(BlockPlaceEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onBlockPlace(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void signChange(SignChangeEvent event) {
if (!event.getPlayer().hasPermission("mobarena.setup.leaderboards")) {
return;
}
if (!event.getLine(0).startsWith("[MA]")) {
return;
}
String text = event.getLine(0).substring((4));
Arena arena;
Stats stat;
if ((arena = am.getArenaWithName(text)) != null) {
arena.getEventListener().onSignChange(event);
setSignLines(event, ChatColor.GREEN + "MobArena", ChatColor.YELLOW + arena.arenaName(), ChatColor.AQUA + "Players", "---------------");
}
else if ((stat = Stats.getByShortName(text)) != null) {
setSignLines(event, ChatColor.GREEN + "", "", ChatColor.AQUA + stat.getFullName(), "---------------");
Messenger.tellPlayer(event.getPlayer(), "Stat sign created.");
}
}
private void setSignLines(SignChangeEvent event, String s1, String s2, String s3, String s4) {
event.setLine(0, s1);
event.setLine(1, s2);
event.setLine(2, s3);
event.setLine(3, s4);
}
///////////////////////////////////////////////////////////////////////////
// //
// ENTITY EVENTS //
// //
///////////////////////////////////////////////////////////////////////////
@EventHandler(priority = EventPriority.HIGHEST)
public void creatureSpawn(CreatureSpawnEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onCreatureSpawn(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void onEntityChangeBlock(EntityChangeBlockEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onEntityChangeBlock(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void entityCombust(EntityCombustEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onEntityCombust(event);
}
@EventHandler(priority = EventPriority.LOW)
public void entityDamage(EntityDamageEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onEntityDamage(event);
}
@EventHandler(priority = EventPriority.LOWEST)
public void entityDeath(EntityDeathEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onEntityDeath(event);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void entityExplode(EntityExplodeEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onEntityExplode(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void entityRegainHealth(EntityRegainHealthEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onEntityRegainHealth(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void entityFoodLevelChange(FoodLevelChangeEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onFoodLevelChange(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void entityTarget(EntityTargetEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onEntityTarget(event);
}
///////////////////////////////////////////////////////////////////////////
// //
// PLAYER EVENTS //
// //
///////////////////////////////////////////////////////////////////////////
@EventHandler(priority = EventPriority.NORMAL)
public void playerAnimation(PlayerAnimationEvent event) {
if (!am.isEnabled()) return;
for (Arena arena : am.getArenas())
arena.getEventListener().onPlayerAnimation(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void playerBucketEmpty(PlayerBucketEmptyEvent event) {
if (!am.isEnabled()) return;
for (Arena arena : am.getArenas())
arena.getEventListener().onPlayerBucketEmpty(event);
}
@EventHandler(priority = EventPriority.LOWEST)
public void playerCommandPreprocess(PlayerCommandPreprocessEvent event) {
if (!am.isEnabled()) return;
for (Arena arena : am.getArenas())
arena.getEventListener().onPlayerCommandPreprocess(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void playerDropItem(PlayerDropItemEvent event) {
if (!am.isEnabled()) return;
for (Arena arena : am.getArenas())
arena.getEventListener().onPlayerDropItem(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void playerInteract(PlayerInteractEvent event) {
if (!am.isEnabled()) return;
for (Arena arena : am.getArenas())
arena.getEventListener().onPlayerInteract(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void playerJoin(PlayerJoinEvent event) {
if (!am.notifyOnUpdates() || !event.getPlayer().isOp()) return;
final Player p = event.getPlayer();
plugin.getServer().getScheduler().scheduleAsyncDelayedTask(plugin,
new Runnable()
{
public void run()
{
if (plugin.getMAConfig().getBoolean("global-settings.update-notification", false)
&& !VersionChecker.isLatest(plugin)) {
Messenger.tellPlayer(p, "There is a new version of MobArena available!");
}
}
}, 60);
}
@EventHandler(priority = EventPriority.NORMAL)
public void playerKick(PlayerKickEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onPlayerKick(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void playerQuit(PlayerQuitEvent event) {
for (Arena arena : am.getArenas())
arena.getEventListener().onPlayerQuit(event);
}
@EventHandler(priority = EventPriority.NORMAL)
public void playerRespawn(PlayerRespawnEvent event) {
for (Arena arena : am.getArenas()) {
if (arena.getEventListener().onPlayerRespawn(event)) {
return;
}
}
plugin.restoreInventory(event.getPlayer());
}
@EventHandler(priority = EventPriority.NORMAL)
public void playerTeleport(PlayerTeleportEvent event) {
if (!am.isEnabled()) return;
boolean allow = true;
for (Arena arena : am.getArenas()) {
TeleportResponse r = arena.getEventListener().onPlayerTeleport(event);
// If just one arena allows, uncancel and stop.
switch (r) {
case ALLOW:
event.setCancelled(false);
return;
case REJECT:
allow = false;
break;
}
}
// Only cancel if at least one arena has rejected the teleport.
if (!allow) {
event.setCancelled(true);
}
}
}
@@ -4,16 +4,18 @@ import java.io.File;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.util.config.Configuration;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import com.garbagemule.MobArena.Arena;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.util.FileUtils;
import com.garbagemule.MobArena.waves.Wave.WaveType;
import com.garbagemule.MobArena.util.config.Config;
import com.garbagemule.MobArena.waves.enums.*;
import com.garbagemule.MobArena.MobArena;
import com.nisovin.magicspells.events.SpellCastEvent;
import com.nisovin.magicspells.events.SpellListener;
public class MagicSpellsListener extends SpellListener
public class MagicSpellsListener implements Listener
{
private MobArena plugin;
private List<String> disabled, disabledOnBoss, disabledOnSwarm;
@@ -23,40 +25,32 @@ public class MagicSpellsListener extends SpellListener
this.plugin = plugin;
// Set up the MagicSpells config-file.
File spellFile = FileUtils.extractFile(plugin.getDataFolder(), "magicspells.yml");
Configuration spellConfig = new Configuration(spellFile);
File spellFile = FileUtils.extractFile(plugin, plugin.getDataFolder(), "magicspells.yml");
Config spellConfig = new Config(spellFile);
spellConfig.load();
setupSpells(spellConfig);
}
@EventHandler(priority = EventPriority.NORMAL)
public void onSpellCast(SpellCastEvent event)
{
Arena arena = plugin.getAM().getArenaWithPlayer(event.getCaster());
Arena arena = plugin.getArenaMaster().getArenaWithPlayer(event.getCaster());
if (arena == null || !arena.isRunning()) return;
String spell = event.getSpell().getName();
WaveType type = (arena.getWave() != null) ? arena.getWave().getType() : null;
if (disabled.contains(spell) ||
(type == WaveType.BOSS && disabledOnBoss.contains(spell)) ||
(type == WaveType.SWARM && disabledOnSwarm.contains(spell)))
(type == WaveType.BOSS && disabledOnBoss.contains(spell)) ||
(type == WaveType.SWARM && disabledOnSwarm.contains(spell))) {
event.setCancelled(true);
}
}
private void setupSpells(Configuration config)
private void setupSpells(Config config)
{
this.disabled = config.getStringList("disabled-spells", new LinkedList<String>());
this.disabledOnBoss = config.getStringList("disabled-only-on-bosses", new LinkedList<String>());
this.disabledOnSwarm = config.getStringList("disabled-only-on-swarms", new LinkedList<String>());
}
public void disableSpell(String spell)
{
disabled.add(spell);
}
public void disableSpellOnBoss(String spell)
{
disabledOnBoss.add(spell);
this.disabledOnBoss = config.getStringList("disabled-on-bosses", new LinkedList<String>());
this.disabledOnSwarm = config.getStringList("disabled-on-swarms", new LinkedList<String>());
}
}
@@ -1,62 +0,0 @@
package com.garbagemule.MobArena.listeners;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.util.config.Configuration;
import com.garbagemule.MobArena.Arena;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.util.FileUtils;
import com.garbagemule.MobArena.waves.Wave.WaveType;
import com.nisovin.MagicSpells.Events.SpellCastEvent;
import com.nisovin.MagicSpells.Events.SpellListener;
public class MagicSpellsOldListener extends SpellListener
{
private MobArena plugin;
private List<String> disabled, disabledOnBoss, disabledOnSwarm;
public MagicSpellsOldListener(MobArena plugin)
{
this.plugin = plugin;
// Set up the MagicSpells config-file.
File spellFile = FileUtils.extractFile(plugin.getDataFolder(), "magicspells.yml");
Configuration spellConfig = new Configuration(spellFile);
spellConfig.load();
setupSpells(spellConfig);
}
public void onSpellCast(SpellCastEvent event)
{
Arena arena = plugin.getAM().getArenaWithPlayer(event.getCaster());
if (arena == null || !arena.isRunning()) return;
String spell = event.getSpell().getName();
WaveType type = (arena.getWave() != null) ? arena.getWave().getType() : null;
if (disabled.contains(spell) ||
(type == WaveType.BOSS && disabledOnBoss.contains(spell)) ||
(type == WaveType.SWARM && disabledOnSwarm.contains(spell)))
event.setCancelled(true);
}
private void setupSpells(Configuration config)
{
this.disabled = config.getStringList("disabled-spells", new LinkedList<String>());
this.disabledOnBoss = config.getStringList("disabled-only-on-bosses", new LinkedList<String>());
this.disabledOnSwarm = config.getStringList("disabled-only-on-swarms", new LinkedList<String>());
}
public void disableSpell(String spell)
{
disabled.add(spell);
}
public void disableSpellOnBoss(String spell)
{
disabledOnBoss.add(spell);
}
}
@@ -1,30 +1,33 @@
package com.garbagemule.MobArena.listeners;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.getspout.spoutapi.event.screen.ButtonClickEvent;
import org.getspout.spoutapi.event.screen.ScreenListener;
import org.getspout.spoutapi.gui.Button;
import com.garbagemule.MobArena.Arena;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.spout.ClassButton;
import com.garbagemule.MobArena.MobArena;
public class MASpoutScreenListener extends ScreenListener
public class SpoutScreenListener implements Listener
{
private MobArena plugin;
public MASpoutScreenListener(MobArena plugin)
public SpoutScreenListener(MobArena plugin)
{
this.plugin = plugin;
}
@EventHandler(priority = EventPriority.NORMAL)
public void onButtonClick(ButtonClickEvent event)
{
Button b = event.getButton();
if (!(b instanceof ClassButton)) return;
Player p = event.getPlayer();
Arena arena = plugin.getAM().getArenaWithPlayer(p);
Arena arena = plugin.getArenaMaster().getArenaWithPlayer(p);
if (arena == null) return;
arena.assignClass(p, b.getText());
@@ -0,0 +1,517 @@
package com.garbagemule.MobArena.region;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.garbagemule.MobArena.Messenger;
import com.garbagemule.MobArena.MobArena;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.util.config.ConfigSection;
public class ArenaRegion
{
private Arena arena;
private World world;
private Location p1, p2, l1, l2, arenaWarp, lobbyWarp, specWarp, leaderboard;
private Map<String,Location> spawnpoints, containers;
private boolean setup, lobbySetup;
private ConfigSection coords;
private ConfigSection spawns;
private ConfigSection chests;
public ArenaRegion(ConfigSection coords, Arena arena) {
this.arena = arena;
this.world = arena.getWorld();
this.coords = coords;
this.spawns = coords.getConfigSection("spawnpoints");
this.chests = coords.getConfigSection("containers");
reloadAll();
adjustRegion();
}
public void reloadAll() {
reloadRegion();
reloadWarps();
reloadLeaderboards();
reloadSpawnpoints();
reloadChests();
verifyData();
}
public void reloadRegion() {
p1 = coords.getLocation("p1", world);
p2 = coords.getLocation("p2", world);
l1 = coords.getLocation("l1", world);
l2 = coords.getLocation("l2", world);
}
public void reloadWarps() {
arenaWarp = coords.getLocation("arena", world);
lobbyWarp = coords.getLocation("lobby", world);
specWarp = coords.getLocation("spectator", world);
leaderboard = coords.getLocation("leaderboard", world);
}
public void reloadLeaderboards() {
leaderboard = coords.getLocation("leaderboard", world);
}
public void reloadSpawnpoints() {
spawnpoints = new HashMap<String,Location>();
Set<String> keys = spawns.getKeys();
if (keys != null) {
for (String spwn : keys) {
spawnpoints.put(spwn, spawns.getLocation(spwn, world));
}
}
}
public void reloadChests() {
containers = new HashMap<String,Location>();
Set<String> keys = chests.getKeys();
if (keys != null) {
for (String chst : keys) {
containers.put(chst, chests.getLocation(chst, world));
}
}
}
public void verifyData() {
setup = (p1 != null &&
p2 != null &&
arenaWarp != null &&
lobbyWarp != null &&
specWarp != null &&
!spawnpoints.isEmpty());
lobbySetup = (l1 != null &&
l2 != null);
}
public void checkData(MobArena plugin, CommandSender s) {
if (arenaWarp == null)
Messenger.tellPlayer(s, "Missing warp: arena");
if (lobbyWarp == null)
Messenger.tellPlayer(s, "Missing warp: lobby");
if (specWarp == null)
Messenger.tellPlayer(s, "Missing warp: spectator");
if (p1 == null)
Messenger.tellPlayer(s, "Missing region point: p1");
if (p2 == null)
Messenger.tellPlayer(s, "Missing region point: p2");
if (spawnpoints.isEmpty())
Messenger.tellPlayer(s, "Missing spawnpoints");
if (setup)
Messenger.tellPlayer(s, "Arena is ready to be used!");
}
public boolean isDefined() {
return (p1 != null && p2 != null);
}
public boolean isLobbyDefined() {
return (l1 != null && l2 != null);
}
public boolean isSetup() {
return setup;
}
public boolean isLobbySetup() {
return lobbySetup;
}
public boolean isWarp(Location l) {
return (l.equals(arenaWarp) ||
l.equals(lobbyWarp) ||
l.equals(specWarp));
}
public boolean contains(Location l) {
if (!l.getWorld().getName().equals(world.getName()) || !setup) {
return false;
}
int x = l.getBlockX();
int y = l.getBlockY();
int z = l.getBlockZ();
// Check the lobby first.
if (lobbySetup) {
if ((x >= l1.getBlockX() && x <= l2.getBlockX()) &&
(z >= l1.getBlockZ() && z <= l2.getBlockZ()) &&
(y >= l1.getBlockY() && y <= l2.getBlockY()))
return true;
}
// Returns false if the location is outside of the region.
return ((x >= p1.getBlockX() && x <= p2.getBlockX()) &&
(z >= p1.getBlockZ() && z <= p2.getBlockZ()) &&
(y >= p1.getBlockY() && y <= p2.getBlockY()));
}
public boolean contains(Location l, int radius) {
if (!l.getWorld().getName().equals(world.getName()) || !setup) {
return false;
}
int x = l.getBlockX();
int y = l.getBlockY();
int z = l.getBlockZ();
if (lobbySetup) {
if ((x + radius >= l1.getBlockX() && x - radius <= l2.getBlockX()) &&
(z + radius >= l1.getBlockZ() && z - radius <= l2.getBlockZ()) &&
(y + radius >= l1.getBlockY() && y - radius <= l2.getBlockY()))
return true;
}
return ((x + radius >= p1.getBlockX() && x - radius <= p2.getBlockX()) &&
(z + radius >= p1.getBlockZ() && z - radius <= p2.getBlockZ()) &&
(y + radius >= p1.getBlockY() && y - radius <= p2.getBlockY()));
}
// Region expand
public void expandUp(int amount) {
p2.setY(Math.min(127D, p2.getY() + amount));
set(RegionPoint.P2, p2);
}
public void expandDown(int amount) {
p1.setY(Math.max(0D, p1.getY() - amount));
set(RegionPoint.P1, p1);
}
public void expandP1(int x, int z) {
p1.setX(p1.getX() - x);
p1.setZ(p1.getZ() - z);
set(RegionPoint.P1, p1);
}
public void expandP2(int x, int z) {
p2.setX(p2.getX() + x);
p2.setZ(p2.getZ() + z);
set(RegionPoint.P2, p2);
}
public void expandOut(int amount) {
expandP1(amount, amount);
expandP2(amount, amount);
}
// Lobby expand
public void expandLobbyUp(int amount) {
l2.setY(Math.min(127D, l2.getY() + amount));
set(RegionPoint.L2, l2);
}
public void expandLobbyDown(int amount) {
l1.setY(Math.max(0D, l1.getY() + amount));
set(RegionPoint.L1, l1);
}
public void expandL1(int x, int z) {
l1.setX(l1.getX() - x);
l1.setZ(l1.getZ() - z);
set(RegionPoint.L1, l1);
}
public void expandL2(int x, int z) {
l2.setX(l2.getX() + x);
l2.setZ(l2.getZ() + z);
set(RegionPoint.L2, l2);
}
public void expandLobbyOut(int amount) {
expandL1(amount, amount);
expandL2(amount, amount);
}
public void fixRegion() {
fix("p1", "p2");
}
public void fixLobbyRegion() {
fix("l1", "l2");
}
private void fix(String location1, String location2) {
Location loc1 = coords.getLocation(location1, world);
Location loc2 = coords.getLocation(location2, world);
if (loc1 == null || loc2 == null) {
return;
}
if (loc1.getX() > loc2.getX()) {
double tmp = loc1.getX();
loc1.setX(loc2.getX());
loc2.setX(tmp);
}
if (loc1.getZ() > loc2.getZ()) {
double tmp = loc1.getZ();
loc1.setZ(loc2.getZ());
loc2.setZ(tmp);
}
if (loc1.getY() > loc2.getY()) {
double tmp = loc1.getY();
loc1.setY(loc2.getY());
loc2.setY(tmp);
}
if (!arena.getWorld().getName().equals(world.getName()))
arena.setWorld(world);
coords.set(location1, loc1);
coords.set(location2, loc2);
}
private void adjustRegion() {
if (!setup) {
return;
}
// Make sure the arena warp is inside the region.
readjustRegion(arenaWarp);
// Re-adjust for all spawnpoints and containers.
for (Location spawnpoint : spawnpoints.values()) {
readjustRegion(spawnpoint);
}
for (Location chest : containers.values()) {
readjustRegion(chest);
}
}
private void readjustRegion(Location l) {
if (p1 == null || p2 == null) {
return;
}
int x = l.getBlockX();
int y = l.getBlockY();
int z = l.getBlockZ();
int p1x = p1.getBlockX();
int p1y = p1.getBlockY();
int p1z = p1.getBlockZ();
int p2x = p2.getBlockX();
int p2y = p2.getBlockY();
int p2z = p2.getBlockZ();
if (x <= p1x) {
expandP1(p1x - x + 2, 0);
}
else if (x >= p2x) {
expandP2(x - p2x + 2, 0);
}
if (y <= p1y) {
expandDown((int) (p1y - y + 2));
}
else if (y >= p2y) {
expandUp((int) (y - p2y + 2));
}
if (z <= p1z) {
expandP1(0, p1z - z + 2);
}
else if (z >= p2z) {
expandP2(0, z - p2z + 2);
}
}
public List<Chunk> getChunks() {
List<Chunk> result = new ArrayList<Chunk>();
if (p1 == null || p2 == null) {
return result;
}
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++) {
result.add(world.getChunkAt(i,j));
}
}
return result;
}
public Location getArenaWarp() {
return arenaWarp;
}
public Location getLobbyWarp() {
return lobbyWarp;
}
public Location getSpecWarp() {
return specWarp;
}
public Location getSpawnpoint(String name) {
return spawnpoints.get(name);
}
public Collection<Location> getSpawnpoints() {
return spawnpoints.values();
}
public List<Location> getSpawnpointList() {
return new ArrayList<Location>(spawnpoints.values());
}
public Collection<Location> getContainers() {
return containers.values();
}
public Location getLeaderboard() {
return leaderboard;
}
public void set(String point, Location loc) {
coords.set(point, loc);
// Adjust the region to accomodate any bounding box breaking.
if (point.equals("arena") || point.equals("lobby") || point.equals("spectator")) {
readjustRegion(loc);
}
fixRegion();
fixLobbyRegion();
reloadRegion();
reloadWarps();
reloadLeaderboards();
verifyData();
save();
}
public void addSpawn(String name, Location loc) {
spawns.set(name, loc);
readjustRegion(loc);
reloadSpawnpoints();
verifyData();
save();
}
public boolean removeSpawn(String name) {
if (spawns.getString(name) == null) {
return false;
}
spawns.set(name, null);
reloadSpawnpoints();
verifyData();
save();
return true;
}
public void addChest(String name, Location loc) {
chests.set(name, loc);
reloadChests();
save();
}
public boolean removeChest(String name) {
if (chests.getString(name) == null) {
return false;
}
chests.set(name, null);
reloadChests();
save();
return true;
}
public void save() {
spawns.getParent().save();
}
public void showRegion(final Player p) {
if (!isDefined()) {
return;
}
// Grab all the blocks, and send block change events.
final Map<Location,BlockState> blocks = new HashMap<Location,BlockState>();
for (Location l : getFramePoints()) {
Block b = l.getBlock();
blocks.put(l, b.getState());
p.sendBlockChange(l, 35, (byte) 14);
}
arena.scheduleTask(new Runnable() {
public void run() {
// If the player isn't online, just forget it.
if (!p.isOnline()) {
return;
}
// Send block "restore" events.
for (Map.Entry<Location,BlockState> entry : blocks.entrySet()) {
Location l = entry.getKey();
BlockState b = entry.getValue();
int id = b.getTypeId();
byte data = b.getRawData();
p.sendBlockChange(l, id, data);
}
}
}, 100);
}
private List<Location> getFramePoints() {
List<Location> result = new ArrayList<Location>();
int x1 = p1.getBlockX(); int y1 = p1.getBlockY(); int z1 = p1.getBlockZ();
int x2 = p2.getBlockX(); int y2 = p2.getBlockY(); int z2 = p2.getBlockZ();
for (int i = x1; i <= x2; i++) {
result.add(world.getBlockAt(i, y1, z1).getLocation());
result.add(world.getBlockAt(i, y1, z2).getLocation());
result.add(world.getBlockAt(i, y2, z1).getLocation());
result.add(world.getBlockAt(i, y2, z2).getLocation());
}
for (int j = y1; j <= y2; j++) {
result.add(world.getBlockAt(x1, j, z1).getLocation());
result.add(world.getBlockAt(x1, j, z2).getLocation());
result.add(world.getBlockAt(x2, j, z1).getLocation());
result.add(world.getBlockAt(x2, j, z2).getLocation());
}
for (int k = z1; k <= z2; k++) {
result.add(world.getBlockAt(x1, y1, k).getLocation());
result.add(world.getBlockAt(x1, y2, k).getLocation());
result.add(world.getBlockAt(x2, y1, k).getLocation());
result.add(world.getBlockAt(x2, y2, k).getLocation());
}
return result;
}
}
@@ -0,0 +1,13 @@
package com.garbagemule.MobArena.region;
public class RegionPoint
{
public static final String P1 = "p1";
public static final String P2 = "p2";
public static final String L1 = "l1";
public static final String L2 = "l2";
public static final String ARENA = "arena";
public static final String LOBBY = "lobby";
public static final String SPEC = "spectator";
public static final String LEADERBOARD = "leaderboard";
}
@@ -0,0 +1,143 @@
package com.garbagemule.MobArena.region;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import com.garbagemule.MobArena.framework.Arena;
public class RegionSerializer
{
//private UUID worldUID;
private int x1, y1, z1, x2, y2, z2;
private long width, height, length;
private int[][][] blocks;
private byte[][][] data;
//private transient World world;
public RegionSerializer(World world, Location p1, Location p2) {
//this.worldUID = world.getUID();
this.x1 = p1.getBlockX();
this.y1 = p1.getBlockY();
this.z1 = p1.getBlockZ();
this.x2 = p2.getBlockX();
this.y2 = p2.getBlockY();
this.z2 = p2.getBlockZ();
this.width = (x2 - x1) + 1;
this.height = (y2 - y1) + 1;
this.length = (z2 - z1) + 1;
int w = (int) width;
int h = (int) height;
int l = (int) length;
this.blocks = new int[w][h][l];
this.data = new byte[w][h][l];
}
public void serialize(Arena arena) {
Serializer s = new Serializer(arena);
s.start();
}
public void deserialize(Arena arena) {
Deserializer d = new Deserializer(arena);
d.start();
}
private class Serializer implements Runnable
{
private Arena arena;
private long total;
public Serializer(Arena arena) {
this.arena = arena;
}
public void start() {
// Disable the arena while serializing.
arena.setEnabled(false);
// Start serializing!
total = 0;
arena.scheduleTask(this, 1);
}
@Override
public void run() {
int y = (int) (total / (width*length));
int z = (int) ((total % (width*length)) / width);
int x = (int) ((total % (width*length)) % width);
long max = width*height*length;
int amount = (int) Math.min(20, (max - total));
for (int i = 0; i < amount; i++) {
Block b = arena.getWorld().getBlockAt(x,y,z);
blocks[x][y][z] = b.getTypeId();
data[x][y][z] = b.getData();
x = (int) ((x+1) % width);
y = (int) ((y+1) % height);
z = (int) ((z+1) % length);
}
total += amount;
if (total == max) {
arena.setEnabled(true);
return;
}
arena.scheduleTask(this, 1);
}
}
private class Deserializer implements Runnable
{
private Arena arena;
private long total;
public Deserializer(Arena arena) {
this.arena = arena;
}
public void start() {
// Disable the arena while serializing.
arena.setEnabled(false);
// Start serializing!
total = 0;
arena.scheduleTask(this, 1);
}
@Override
public void run() {
int y = (int) (total / (width*length));
int z = (int) ((total % (width*length)) / width);
int x = (int) ((total % (width*length)) % width);
long max = width*height*length;
int amount = (int) Math.min(20, (max - total));
for (int i = 0; i < 20; i++) {
Block b = arena.getWorld().getBlockAt(x,y,z);
b.setTypeIdAndData(blocks[x][y][z], data[x][y][z], false);
}
total += amount;
if (total == max) {
arena.setEnabled(true);
return;
}
arena.scheduleTask(this, 1);
}
}
}
@@ -3,54 +3,40 @@ package com.garbagemule.MobArena.repairable;
import org.bukkit.block.BlockState;
import org.bukkit.block.ContainerBlock;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import com.garbagemule.MobArena.util.InventoryItem;
import com.garbagemule.MobArena.util.inventory.SerializableInventory;
public class RepairableContainer extends RepairableBlock
{
private InventoryItem[] items;
private SerializableInventory inv;
public RepairableContainer(BlockState state, boolean clear)
{
public RepairableContainer(BlockState state, boolean clear) {
super(state);
// Grab the inventory and its contents
// Grab the inventory of the block
Inventory inv = ((ContainerBlock) state).getInventory();
ItemStack[] contents = inv.getContents();
// Initialize the items array
items = new InventoryItem[contents.length];
// Turn every ItemStack into an InventoryItem
for (int i = 0; i < items.length; i++)
items[i] = InventoryItem.parseItemStack(contents[i]);
// Make a SerializableInventory
this.inv = new SerializableInventory(inv);
// Clear the inventory if prompted
if (clear) inv.clear();
}
public RepairableContainer(BlockState state)
{
public RepairableContainer(BlockState state) {
this(state, true);
}
/**
* Repairs the container block by adding all the contents back in.
*/
public void repair()
{
public void repair() {
super.repair();
// Grab the inventory
ContainerBlock cb = (ContainerBlock) getWorld().getBlockAt(getX(),getY(),getZ()).getState();
Inventory inv = cb.getInventory();
Inventory chestInv = cb.getInventory();
// Turn every InventoryItem into an ItemStack
for (int i = 0; i < items.length; i++)
{
InventoryItem item = items[i];
inv.setItem(i, item != null ? item.toItemStack() : null);
}
SerializableInventory.loadContents(chestInv, this.inv);
}
}

Some files were not shown because too many files have changed in this diff Show More