Add command for picking classes in the lobby.
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
name: MobArena
|
name: MobArena
|
||||||
author: garbagemule
|
author: garbagemule
|
||||||
main: com.garbagemule.MobArena.MobArena
|
main: com.garbagemule.MobArena.MobArena
|
||||||
version: 0.96.2.7
|
version: 0.96.2.8
|
||||||
softdepend: [Multiverse-Core,Towny,Heroes,MagicSpells,Vault]
|
softdepend: [Multiverse-Core,Towny,Heroes,MagicSpells,Vault]
|
||||||
commands:
|
commands:
|
||||||
ma:
|
ma:
|
||||||
@@ -37,6 +37,9 @@ permissions:
|
|||||||
mobarena.use.notready:
|
mobarena.use.notready:
|
||||||
description: Check who is not ready yet
|
description: Check who is not ready yet
|
||||||
default: true
|
default: true
|
||||||
|
mobarena.use.class:
|
||||||
|
description: Pick a class by name
|
||||||
|
default: true
|
||||||
|
|
||||||
mobarena.admin:
|
mobarena.admin:
|
||||||
description: Gives access to all admin commands
|
description: Gives access to all admin commands
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ public enum Msg {
|
|||||||
LOBBY_CLASS_PERMISSION("You don't have permission to use this class!"),
|
LOBBY_CLASS_PERMISSION("You don't have permission to use this class!"),
|
||||||
LOBBY_CLASS_PRICE("This class costs &c%&r (paid on arena start)."),
|
LOBBY_CLASS_PRICE("This class costs &c%&r (paid on arena start)."),
|
||||||
LOBBY_CLASS_TOO_EXPENSIVE("You can't afford that class (&c%&r)"),
|
LOBBY_CLASS_TOO_EXPENSIVE("You can't afford that class (&c%&r)"),
|
||||||
|
LOBBY_NO_SUCH_CLASS("There is no class named &c%&r."),
|
||||||
WARP_TO_ARENA("Warping to the arena not allowed!"),
|
WARP_TO_ARENA("Warping to the arena not allowed!"),
|
||||||
WARP_FROM_ARENA("Warping from the arena not allowed!"),
|
WARP_FROM_ARENA("Warping from the arena not allowed!"),
|
||||||
WAVE_DEFAULT("Wave &b#%&r!"),
|
WAVE_DEFAULT("Wave &b#%&r!"),
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ public class CommandHandler implements CommandExecutor
|
|||||||
register(ArenaListCommand.class);
|
register(ArenaListCommand.class);
|
||||||
register(PlayerListCommand.class);
|
register(PlayerListCommand.class);
|
||||||
register(NotReadyCommand.class);
|
register(NotReadyCommand.class);
|
||||||
|
register(PickClassCommand.class);
|
||||||
|
|
||||||
// mobarena.admin
|
// mobarena.admin
|
||||||
register(EnableCommand.class);
|
register(EnableCommand.class);
|
||||||
|
|||||||
@@ -0,0 +1,124 @@
|
|||||||
|
package com.garbagemule.MobArena.commands.user;
|
||||||
|
|
||||||
|
import com.garbagemule.MobArena.ArenaClass;
|
||||||
|
import com.garbagemule.MobArena.ClassLimitManager;
|
||||||
|
import com.garbagemule.MobArena.Messenger;
|
||||||
|
import com.garbagemule.MobArena.Msg;
|
||||||
|
import com.garbagemule.MobArena.commands.Command;
|
||||||
|
import com.garbagemule.MobArena.commands.CommandInfo;
|
||||||
|
import com.garbagemule.MobArena.commands.Commands;
|
||||||
|
import com.garbagemule.MobArena.framework.Arena;
|
||||||
|
import com.garbagemule.MobArena.framework.ArenaMaster;
|
||||||
|
import com.garbagemule.MobArena.util.TextUtils;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
@CommandInfo(
|
||||||
|
name = "class",
|
||||||
|
pattern = "(pick)?class",
|
||||||
|
usage = "/ma class <class>",
|
||||||
|
desc = "pick a class",
|
||||||
|
permission = "mobarena.use.class"
|
||||||
|
)
|
||||||
|
public class PickClassCommand implements Command
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
|
||||||
|
if (!Commands.isPlayer(sender)) {
|
||||||
|
Messenger.tell(sender, Msg.MISC_NOT_FROM_CONSOLE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Require a class name
|
||||||
|
if (args.length != 1) return false;
|
||||||
|
|
||||||
|
// Cast the sender
|
||||||
|
Player p = (Player) sender;
|
||||||
|
|
||||||
|
// Make sure the player is in an arena
|
||||||
|
Arena arena = am.getArenaWithPlayer(p);
|
||||||
|
if (arena == null) return true;
|
||||||
|
|
||||||
|
// Make sure the player is in the lobby
|
||||||
|
if (!arena.inLobby(p)) {
|
||||||
|
Messenger.tell(p, Msg.MISC_NO_ACCESS);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab the ArenaClass, if it exists
|
||||||
|
String lowercase = args[0].toLowerCase();
|
||||||
|
ArenaClass ac = am.getClasses().get(lowercase);
|
||||||
|
if (ac == null) {
|
||||||
|
Messenger.tell(p, Msg.LOBBY_NO_SUCH_CLASS, lowercase);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for permission.
|
||||||
|
if (!am.getPlugin().has(p, "mobarena.classes." + lowercase) && !lowercase.equals("random")) {
|
||||||
|
Messenger.tell(p, Msg.LOBBY_CLASS_PERMISSION);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab the old ArenaClass, if any, same => ignore
|
||||||
|
ArenaClass oldAC = arena.getArenaPlayer(p).getArenaClass();
|
||||||
|
if (ac.equals(oldAC)) return true;
|
||||||
|
|
||||||
|
// If the new class is full, inform the player.
|
||||||
|
ClassLimitManager clm = arena.getClassLimitManager();
|
||||||
|
if (!clm.canPlayerJoinClass(ac)) {
|
||||||
|
Messenger.tell(p, Msg.LOBBY_CLASS_FULL);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check price, balance, and inform
|
||||||
|
double price = ac.getPrice();
|
||||||
|
if (price > 0D) {
|
||||||
|
if (!am.getPlugin().hasEnough(p, price)) {
|
||||||
|
Messenger.tell(p, Msg.LOBBY_CLASS_TOO_EXPENSIVE, am.getPlugin().economyFormat(price));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, leave the old class, and pick the new!
|
||||||
|
clm.playerLeftClass(oldAC, p);
|
||||||
|
clm.playerPickedClass(ac, p);
|
||||||
|
|
||||||
|
if (!lowercase.equalsIgnoreCase("random")) {
|
||||||
|
if (arena.getSettings().getBoolean("use-class-chests", false)) {
|
||||||
|
Location loc = ac.getClassChest();
|
||||||
|
if (loc != null) {
|
||||||
|
Block blockChest = loc.getBlock();
|
||||||
|
InventoryHolder holder = (InventoryHolder) blockChest.getState();
|
||||||
|
ItemStack[] contents = holder.getInventory().getContents();
|
||||||
|
// Guard against double-chests for now
|
||||||
|
if (contents.length > 36) {
|
||||||
|
ItemStack[] newContents = new ItemStack[36];
|
||||||
|
System.arraycopy(contents, 0, newContents, 0, 36);
|
||||||
|
contents = newContents;
|
||||||
|
}
|
||||||
|
arena.assignClassGiveInv(p, lowercase, contents);
|
||||||
|
p.getInventory().setContents(contents);
|
||||||
|
Messenger.tell(p, Msg.LOBBY_CLASS_PICKED, TextUtils.camelCase(lowercase));
|
||||||
|
if (price > 0D) {
|
||||||
|
Messenger.tell(p, Msg.LOBBY_CLASS_PRICE, am.getPlugin().economyFormat(price));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// No linked chest? Fall through to config-file
|
||||||
|
}
|
||||||
|
arena.assignClass(p, lowercase);
|
||||||
|
Messenger.tell(p, Msg.LOBBY_CLASS_PICKED, TextUtils.camelCase(lowercase));
|
||||||
|
if (price > 0D) {
|
||||||
|
Messenger.tell(p, Msg.LOBBY_CLASS_PRICE, am.getPlugin().economyFormat(price));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
arena.addRandomPlayer(p);
|
||||||
|
Messenger.tell(p, Msg.LOBBY_CLASS_RANDOM);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user