2011-04-08 15:51:07 +02:00
|
|
|
package org.mcteam.factions;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
import java.lang.reflect.Modifier;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.List;
|
2011-03-22 18:48:09 +01:00
|
|
|
import java.util.Map;
|
2011-03-18 17:33:23 +01:00
|
|
|
import java.util.logging.Level;
|
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
|
|
|
|
|
|
|
|
2011-03-23 17:39:56 +01:00
|
|
|
import org.bukkit.Location;
|
2011-03-18 17:33:23 +01:00
|
|
|
import org.bukkit.command.Command;
|
|
|
|
import org.bukkit.command.CommandSender;
|
2011-03-23 17:39:56 +01:00
|
|
|
import org.bukkit.entity.Player;
|
2011-02-06 13:36:11 +01:00
|
|
|
import org.bukkit.event.Event;
|
2011-03-18 17:33:23 +01:00
|
|
|
import org.bukkit.plugin.Plugin;
|
2011-02-06 13:36:11 +01:00
|
|
|
import org.bukkit.plugin.PluginManager;
|
|
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
2011-04-08 15:51:07 +02:00
|
|
|
import org.mcteam.factions.commands.FBaseCommand;
|
|
|
|
import org.mcteam.factions.commands.FCommandAdmin;
|
|
|
|
import org.mcteam.factions.commands.FCommandBypass;
|
|
|
|
import org.mcteam.factions.commands.FCommandChat;
|
|
|
|
import org.mcteam.factions.commands.FCommandClaim;
|
|
|
|
import org.mcteam.factions.commands.FCommandCreate;
|
|
|
|
import org.mcteam.factions.commands.FCommandDeinvite;
|
|
|
|
import org.mcteam.factions.commands.FCommandDescription;
|
|
|
|
import org.mcteam.factions.commands.FCommandHelp;
|
|
|
|
import org.mcteam.factions.commands.FCommandHome;
|
|
|
|
import org.mcteam.factions.commands.FCommandInvite;
|
|
|
|
import org.mcteam.factions.commands.FCommandJoin;
|
|
|
|
import org.mcteam.factions.commands.FCommandKick;
|
|
|
|
import org.mcteam.factions.commands.FCommandLeave;
|
|
|
|
import org.mcteam.factions.commands.FCommandList;
|
|
|
|
import org.mcteam.factions.commands.FCommandMap;
|
|
|
|
import org.mcteam.factions.commands.FCommandMod;
|
|
|
|
import org.mcteam.factions.commands.FCommandOpen;
|
|
|
|
import org.mcteam.factions.commands.FCommandRelationAlly;
|
|
|
|
import org.mcteam.factions.commands.FCommandRelationEnemy;
|
|
|
|
import org.mcteam.factions.commands.FCommandRelationNeutral;
|
|
|
|
import org.mcteam.factions.commands.FCommandSafeclaim;
|
|
|
|
import org.mcteam.factions.commands.FCommandSethome;
|
|
|
|
import org.mcteam.factions.commands.FCommandShow;
|
|
|
|
import org.mcteam.factions.commands.FCommandTag;
|
|
|
|
import org.mcteam.factions.commands.FCommandTitle;
|
|
|
|
import org.mcteam.factions.commands.FCommandUnclaim;
|
|
|
|
import org.mcteam.factions.commands.FCommandVersion;
|
|
|
|
import org.mcteam.factions.gson.Gson;
|
|
|
|
import org.mcteam.factions.gson.GsonBuilder;
|
|
|
|
import org.mcteam.factions.listeners.FactionsBlockListener;
|
|
|
|
import org.mcteam.factions.listeners.FactionsEntityListener;
|
|
|
|
import org.mcteam.factions.listeners.FactionsPlayerListener;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
|
|
|
|
import com.nijiko.permissions.PermissionHandler;
|
|
|
|
import com.nijikokun.bukkit.Permissions.Permissions;
|
|
|
|
|
|
|
|
import me.taylorkelly.help.Help;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-22 22:31:04 +01:00
|
|
|
/**
|
|
|
|
* The data is saved to disk every 30min and on plugin disable.
|
|
|
|
*/
|
2011-02-06 13:36:11 +01:00
|
|
|
public class Factions extends JavaPlugin {
|
2011-03-18 17:33:23 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Fields
|
|
|
|
// -------------------------------------------- //
|
|
|
|
public static Factions instance;
|
2011-04-06 12:04:57 +02:00
|
|
|
private Integer saveTask = null;
|
2011-03-18 17:33:23 +01:00
|
|
|
|
|
|
|
public final static Gson gson = new GsonBuilder()
|
|
|
|
.setPrettyPrinting()
|
|
|
|
.excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.VOLATILE)
|
2011-03-23 17:39:56 +01:00
|
|
|
.registerTypeAdapter(Location.class, new MyLocationTypeAdapter())
|
2011-03-18 17:33:23 +01:00
|
|
|
.create();
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
private final FactionsPlayerListener playerListener = new FactionsPlayerListener();
|
|
|
|
private final FactionsEntityListener entityListener = new FactionsEntityListener();
|
|
|
|
private final FactionsBlockListener blockListener = new FactionsBlockListener();
|
2011-03-18 17:33:23 +01:00
|
|
|
|
|
|
|
public static PermissionHandler Permissions;
|
|
|
|
public static Help helpPlugin;
|
2011-02-13 17:04:06 +01:00
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
// Commands
|
2011-03-22 15:45:41 +01:00
|
|
|
public List<FBaseCommand> commands = new ArrayList<FBaseCommand>();
|
2011-03-22 18:48:09 +01:00
|
|
|
|
|
|
|
private String baseCommand;
|
2011-03-18 17:33:23 +01:00
|
|
|
|
|
|
|
public Factions() {
|
|
|
|
Factions.instance = this;
|
2011-03-22 20:36:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onEnable() {
|
|
|
|
log("=== INIT START ===");
|
|
|
|
long timeInitStart = System.currentTimeMillis();
|
2011-03-22 18:48:09 +01:00
|
|
|
|
|
|
|
// Add the commands
|
|
|
|
commands.add(new FCommandHelp());
|
|
|
|
commands.add(new FCommandAdmin());
|
2011-04-06 12:04:57 +02:00
|
|
|
commands.add(new FCommandBypass());
|
2011-03-22 18:48:09 +01:00
|
|
|
commands.add(new FCommandChat());
|
|
|
|
commands.add(new FCommandClaim());
|
|
|
|
commands.add(new FCommandCreate());
|
|
|
|
commands.add(new FCommandDeinvite());
|
|
|
|
commands.add(new FCommandDescription());
|
2011-03-23 17:39:56 +01:00
|
|
|
commands.add(new FCommandHome());
|
2011-03-22 18:48:09 +01:00
|
|
|
commands.add(new FCommandInvite());
|
|
|
|
commands.add(new FCommandJoin());
|
|
|
|
commands.add(new FCommandKick());
|
|
|
|
commands.add(new FCommandLeave());
|
|
|
|
commands.add(new FCommandList());
|
|
|
|
commands.add(new FCommandMap());
|
|
|
|
commands.add(new FCommandMod());
|
|
|
|
commands.add(new FCommandOpen());
|
|
|
|
commands.add(new FCommandRelationAlly());
|
|
|
|
commands.add(new FCommandRelationEnemy());
|
|
|
|
commands.add(new FCommandRelationNeutral());
|
2011-03-23 17:39:56 +01:00
|
|
|
commands.add(new FCommandSafeclaim());
|
|
|
|
commands.add(new FCommandSethome());
|
2011-03-22 18:48:09 +01:00
|
|
|
commands.add(new FCommandShow());
|
|
|
|
commands.add(new FCommandTag());
|
|
|
|
commands.add(new FCommandTitle());
|
|
|
|
commands.add(new FCommandUnclaim());
|
|
|
|
commands.add(new FCommandVersion());
|
2011-03-18 17:33:23 +01:00
|
|
|
|
2011-03-22 18:48:09 +01:00
|
|
|
// Ensure basefolder exists!
|
|
|
|
this.getDataFolder().mkdirs();
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-22 20:36:33 +01:00
|
|
|
Conf.load();
|
2011-03-18 17:33:23 +01:00
|
|
|
FPlayer.load();
|
|
|
|
Faction.load();
|
|
|
|
Board.load();
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-22 20:36:33 +01:00
|
|
|
setupHelp();
|
|
|
|
setupPermissions();
|
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
// Register events
|
2011-02-13 17:04:06 +01:00
|
|
|
PluginManager pm = this.getServer().getPluginManager();
|
2011-02-12 18:05:05 +01:00
|
|
|
pm.registerEvent(Event.Type.PLAYER_CHAT, this.playerListener, Event.Priority.Highest, this);
|
2011-03-30 06:37:32 +02:00
|
|
|
pm.registerEvent(Event.Type.PLAYER_INTERACT, this.playerListener, Event.Priority.Normal, this);
|
2011-02-06 13:36:11 +01:00
|
|
|
pm.registerEvent(Event.Type.PLAYER_MOVE, this.playerListener, Event.Priority.Normal, this);
|
2011-03-23 17:39:56 +01:00
|
|
|
pm.registerEvent(Event.Type.PLAYER_JOIN, this.playerListener, Event.Priority.Normal, this);
|
|
|
|
pm.registerEvent(Event.Type.PLAYER_RESPAWN, this.playerListener, Event.Priority.High, this);
|
2011-03-30 11:23:20 +02:00
|
|
|
pm.registerEvent(Event.Type.PLAYER_BUCKET_EMPTY, this.playerListener, Event.Priority.Normal, this);
|
|
|
|
pm.registerEvent(Event.Type.PLAYER_BUCKET_FILL, this.playerListener, Event.Priority.Normal, this);
|
2011-02-06 13:36:11 +01:00
|
|
|
pm.registerEvent(Event.Type.ENTITY_DEATH, this.entityListener, Event.Priority.Normal, this);
|
2011-03-30 06:37:32 +02:00
|
|
|
pm.registerEvent(Event.Type.ENTITY_DAMAGE, this.entityListener, Event.Priority.Normal, this);
|
2011-03-06 21:13:48 +01:00
|
|
|
pm.registerEvent(Event.Type.ENTITY_EXPLODE, this.entityListener, Event.Priority.Normal, this);
|
2011-03-23 17:39:56 +01:00
|
|
|
pm.registerEvent(Event.Type.CREATURE_SPAWN, this.entityListener, Event.Priority.Normal, this);
|
|
|
|
pm.registerEvent(Event.Type.ENTITY_TARGET, this.entityListener, Event.Priority.Normal, this);
|
2011-03-30 06:37:32 +02:00
|
|
|
pm.registerEvent(Event.Type.BLOCK_BREAK, this.blockListener, Event.Priority.Normal, this);
|
|
|
|
pm.registerEvent(Event.Type.BLOCK_DAMAGE, this.blockListener, Event.Priority.Normal, this);
|
|
|
|
pm.registerEvent(Event.Type.BLOCK_PLACE, this.blockListener, Event.Priority.Normal, this);
|
2011-03-22 22:31:04 +01:00
|
|
|
|
|
|
|
// Register recurring tasks
|
|
|
|
long saveTicks = 20 * 60 * 30; // Approximately every 30 min
|
2011-04-06 12:04:57 +02:00
|
|
|
if (saveTask == null)
|
|
|
|
saveTask = this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new SaveTask(), saveTicks, saveTicks);
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
log("=== INIT DONE (Took "+(System.currentTimeMillis()-timeInitStart)+"ms) ===");
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDisable() {
|
2011-04-06 12:04:57 +02:00
|
|
|
if (saveTask != null) {
|
|
|
|
this.getServer().getScheduler().cancelTask(saveTask);
|
|
|
|
saveTask = null;
|
|
|
|
}
|
2011-03-22 22:31:04 +01:00
|
|
|
saveAll();
|
2011-03-22 18:48:09 +01:00
|
|
|
log("Disabled");
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------- //
|
|
|
|
// Integration with other plugins
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
2011-03-23 17:39:56 +01:00
|
|
|
private void setupHelp() {
|
|
|
|
if (helpPlugin != null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Plugin test = this.getServer().getPluginManager().getPlugin("Help");
|
|
|
|
|
|
|
|
if (test != null) {
|
|
|
|
helpPlugin = ((Help) test);
|
|
|
|
Factions.log("Found and will use plugin "+helpPlugin.getDescription().getFullName());
|
|
|
|
helpPlugin.registerCommand(this.getBaseCommand()+" help *[page]", "Factions plugin help.", this, false);
|
|
|
|
helpPlugin.registerCommand("help factions", "instead use: /f help", helpPlugin, true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
private void setupPermissions() {
|
|
|
|
if (Permissions != null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-03-22 15:45:41 +01:00
|
|
|
Plugin test = this.getServer().getPluginManager().getPlugin("Permissions");
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
if (test != null) {
|
|
|
|
Permissions = ((Permissions)test).getHandler();
|
|
|
|
Factions.log("Found and will use plugin "+((Permissions)test).getDescription().getFullName());
|
|
|
|
} else {
|
|
|
|
Factions.log("Permission system not detected, defaulting to OP");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-23 17:39:56 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Test rights
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
public static boolean hasPermParticipate(CommandSender sender) {
|
|
|
|
return hasPerm(sender, "factions.participate", false);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean hasPermCreate(CommandSender sender) {
|
|
|
|
return hasPerm(sender, "factions.create", false);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean hasPermManageSafeZone(CommandSender sender) {
|
|
|
|
return hasPerm(sender, "factions.manageSafeZone", true);
|
|
|
|
}
|
2011-04-04 14:16:53 +02:00
|
|
|
|
|
|
|
public static boolean hasPermAdminBypass(CommandSender sender) {
|
|
|
|
return hasPerm(sender, "factions.adminBypass", true);
|
|
|
|
}
|
2011-03-23 17:39:56 +01:00
|
|
|
|
|
|
|
private static boolean hasPerm(CommandSender sender, String permNode, boolean fallbackOnlyOp) {
|
|
|
|
if (Factions.Permissions == null || ! (sender instanceof Player)) {
|
|
|
|
return fallbackOnlyOp == false || sender.isOp();
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
2011-03-23 17:39:56 +01:00
|
|
|
if (sender instanceof Player) {
|
|
|
|
Player player = (Player)sender;
|
|
|
|
return Factions.Permissions.has(player, permNode);
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
2011-03-23 17:39:56 +01:00
|
|
|
|
|
|
|
return false;
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------- //
|
|
|
|
// Commands
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
2011-03-22 18:48:09 +01:00
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
public String getBaseCommand() {
|
|
|
|
if (this.baseCommand != null) {
|
|
|
|
return this.baseCommand;
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, Object> Commands = (Map<String, Object>)this.getDescription().getCommands();
|
|
|
|
this.baseCommand = Commands.keySet().iterator().next();
|
|
|
|
return this.baseCommand;
|
|
|
|
}
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
@Override
|
|
|
|
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
|
|
|
|
List<String> parameters = new ArrayList<String>(Arrays.asList(args));
|
|
|
|
this.handleCommand(sender, parameters);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void handleCommand(CommandSender sender, List<String> parameters) {
|
|
|
|
if (parameters.size() == 0) {
|
|
|
|
this.commands.get(0).execute(sender, parameters);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
String commandName = parameters.get(0).toLowerCase();
|
|
|
|
parameters.remove(0);
|
|
|
|
|
2011-03-22 15:45:41 +01:00
|
|
|
for (FBaseCommand fcommand : this.commands) {
|
2011-03-18 17:33:23 +01:00
|
|
|
if (fcommand.getAliases().contains(commandName)) {
|
|
|
|
fcommand.execute(sender, parameters);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-22 18:48:09 +01:00
|
|
|
sender.sendMessage(Conf.colorSystem+"Unknown faction command \""+commandName+"\". Try "+Conf.colorCommand+"/f help");
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------- //
|
|
|
|
// Logging
|
|
|
|
// -------------------------------------------- //
|
|
|
|
public static void log(String msg) {
|
|
|
|
log(Level.INFO, msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void log(Level level, String msg) {
|
|
|
|
Logger.getLogger("Minecraft").log(level, "["+instance.getDescription().getFullName()+"] "+msg);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
2011-03-22 22:31:04 +01:00
|
|
|
|
|
|
|
// -------------------------------------------- //
|
|
|
|
// Save all
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
public static void saveAll() {
|
|
|
|
FPlayer.save();
|
|
|
|
Faction.save();
|
|
|
|
Board.save();
|
2011-03-23 17:39:56 +01:00
|
|
|
Conf.save();
|
2011-03-22 22:31:04 +01:00
|
|
|
}
|
2011-02-06 13:36:11 +01:00
|
|
|
|
|
|
|
}
|