Safe zones and faction homes :D :D

This commit is contained in:
Olof Larsson 2011-03-23 17:39:56 +01:00
parent 9d4aaeae6c
commit b0f09db054
39 changed files with 562 additions and 334 deletions

View File

@ -1,5 +1,5 @@
name: Factions
version: 1.1
version: 1.1 alpha
main: com.bukkit.mcteam.factions.Factions
commands:
f:

View File

@ -126,8 +126,10 @@ public class Board {
} else {
FLocation flocationHere = topLeft.getRelative(dx, dz);
Faction factionHere = getFactionAt(flocationHere);
if (factionHere.getId() == 0) {
if (factionHere.isNone()) {
row += ChatColor.GRAY+"-";
} else if (factionHere.isSafeZone()) {
row += ChatColor.GOLD+"+";
} else {
row += factionHere.getRelation(faction).getColor()+"+";
}

View File

@ -4,6 +4,7 @@ import java.io.File;
import java.io.IOException;
import java.util.*;
import org.bukkit.*;
import org.bukkit.entity.CreatureType;
import com.bukkit.mcteam.util.DiscUtil;
@ -42,8 +43,12 @@ public class Conf {
public static String chatTagFormat = "%s"+ChatColor.WHITE+" ";
public static String factionChatFormat = "%s"+ChatColor.WHITE+" %s";
public static int mapHeight = 8;
public static int mapWidth = 49;
public static boolean allowNoSlashCommand = true;
public static double autoLeaveAfterDaysOfInactivity = 14;
public static boolean homesEnabled = true;
public static boolean homesTeleportToOnDeath = true;
public static double territoryShieldFactor = 0.5;
public static boolean territoryBlockCreepers = false;
@ -51,11 +56,12 @@ public class Conf {
public static Set<Material> territoryProtectedMaterials = new HashSet<Material>();
public static Set<Material> territoryDenyUseageMaterials = new HashSet<Material>();
public static transient Set<Material> instaDestroyMaterials = new HashSet<Material>(); // This one is not really configuration therefore transient
public static boolean allowNoSlashCommand = true;
public static double autoLeaveFactionAfterDaysOfInactivity = 14;
public static transient Set<CreatureType> safeZoneNerfedCreatureTypes = new HashSet<CreatureType>();
public static transient Set<Material> instaDestroyMaterials = new HashSet<Material>(); // This one is not really configuration therefore transient
public static transient int mapHeight = 8;
public static transient int mapWidth = 49;
static {
territoryProtectedMaterials.add(Material.WOODEN_DOOR);
@ -81,6 +87,14 @@ public class Conf {
instaDestroyMaterials.add(Material.SUGAR_CANE_BLOCK);
instaDestroyMaterials.add(Material.DIODE_BLOCK_OFF);
instaDestroyMaterials.add(Material.DIODE_BLOCK_ON);
safeZoneNerfedCreatureTypes.add(CreatureType.CREEPER);
safeZoneNerfedCreatureTypes.add(CreatureType.GHAST);
safeZoneNerfedCreatureTypes.add(CreatureType.PIG_ZOMBIE);
safeZoneNerfedCreatureTypes.add(CreatureType.SKELETON);
safeZoneNerfedCreatureTypes.add(CreatureType.SPIDER);
safeZoneNerfedCreatureTypes.add(CreatureType.SLIME);
safeZoneNerfedCreatureTypes.add(CreatureType.ZOMBIE);
}
// -------------------------------------------- //

View File

@ -353,7 +353,7 @@ public class FPlayer {
public void sendFactionHereMessage() {
Faction factionHere = Board.getFactionAt(new FLocation(this));
String msg = Conf.colorSystem+" ~ "+factionHere.getTag(this);
if (factionHere.getId() != 0) {
if (factionHere.getDescription().length() > 0) {
msg += " - "+factionHere.getDescription();
}
this.sendMessage(msg);
@ -507,9 +507,16 @@ public class FPlayer {
public static void autoLeaveOnInactivityRoutine() {
long now = System.currentTimeMillis();
double toleranceMillis = Conf.autoLeaveFactionAfterDaysOfInactivity * 24 * 60 * 60 * 1000;
double toleranceMillis = Conf.autoLeaveAfterDaysOfInactivity * 24 * 60 * 60 * 1000;
for (FPlayer fplayer : FPlayer.getAll()) {
// Test if the player is immune
if (Factions.Permissions != null) {
if (Factions.Permissions.has(fplayer.getPlayer(), "factions.autoLeaveImmunity")) {
continue;
}
}
if (now - fplayer.getLastLoginTime() > toleranceMillis) {
fplayer.leave();
}

View File

@ -8,6 +8,7 @@ import java.util.Map.Entry;
import java.util.logging.Level;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import com.bukkit.mcteam.factions.struct.Relation;
@ -32,6 +33,7 @@ public class Faction {
private boolean open;
private String tag;
private String description;
private Location home;
// -------------------------------------------- //
// Construct
@ -88,6 +90,34 @@ public class Faction {
this.description = value;
}
public void setHome(Location home) {
this.home = home;
}
public Location getHome() {
return home;
}
public boolean hasHome() {
return this.home != null;
}
// -------------------------------
// Understand the types
// -------------------------------
public boolean isNormal() {
return this.getId() > 0;
}
public boolean isNone() {
return this.getId() == 0;
}
public boolean isSafeZone() {
return this.getId() == -1;
}
// -------------------------------
// Invites - uses lowercase name
// -------------------------------
@ -124,7 +154,7 @@ public class Faction {
}
public Relation getRelation(Faction otherFaction) {
if (otherFaction.getId() == 0 || this.getId() == 0) {
if (otherFaction.isNone() || this.isNone()) {
return Relation.NEUTRAL;
}
if (otherFaction.equals(this)) {
@ -340,6 +370,15 @@ public class Faction {
instances.put(faction.id, faction);
}
// Make sure the safe zone faciton exists
if ( ! instances.containsKey(-1)) {
Faction faction = new Faction();
faction.tag = ChatColor.GOLD+"Safe Zone";
faction.description = "Free from PVP and monsters";
faction.id = -1;
instances.put(faction.id, faction);
}
return true;
}
@ -363,6 +402,14 @@ public class Faction {
return instances.get(factionId);
}
public static Faction getNone() {
return instances.get(0);
}
public static Faction getSafeZone() {
return instances.get(-1);
}
public static boolean exists(Integer factionId) {
return instances.containsKey(factionId);
}

View File

@ -10,8 +10,10 @@ import java.util.logging.Logger;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
@ -25,6 +27,7 @@ import com.bukkit.mcteam.factions.commands.FCommandCreate;
import com.bukkit.mcteam.factions.commands.FCommandDeinvite;
import com.bukkit.mcteam.factions.commands.FCommandDescription;
import com.bukkit.mcteam.factions.commands.FCommandHelp;
import com.bukkit.mcteam.factions.commands.FCommandHome;
import com.bukkit.mcteam.factions.commands.FCommandInvite;
import com.bukkit.mcteam.factions.commands.FCommandJoin;
import com.bukkit.mcteam.factions.commands.FCommandKick;
@ -36,6 +39,8 @@ import com.bukkit.mcteam.factions.commands.FCommandOpen;
import com.bukkit.mcteam.factions.commands.FCommandRelationAlly;
import com.bukkit.mcteam.factions.commands.FCommandRelationEnemy;
import com.bukkit.mcteam.factions.commands.FCommandRelationNeutral;
import com.bukkit.mcteam.factions.commands.FCommandSafeclaim;
import com.bukkit.mcteam.factions.commands.FCommandSethome;
import com.bukkit.mcteam.factions.commands.FCommandShow;
import com.bukkit.mcteam.factions.commands.FCommandTag;
import com.bukkit.mcteam.factions.commands.FCommandTitle;
@ -64,6 +69,7 @@ public class Factions extends JavaPlugin {
public final static Gson gson = new GsonBuilder()
.setPrettyPrinting()
.excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.VOLATILE)
.registerTypeAdapter(Location.class, new MyLocationTypeAdapter())
.create();
private final FactionsPlayerListener playerListener = new FactionsPlayerListener();
@ -96,6 +102,7 @@ public class Factions extends JavaPlugin {
commands.add(new FCommandCreate());
commands.add(new FCommandDeinvite());
commands.add(new FCommandDescription());
commands.add(new FCommandHome());
commands.add(new FCommandInvite());
commands.add(new FCommandJoin());
commands.add(new FCommandKick());
@ -107,6 +114,8 @@ public class Factions extends JavaPlugin {
commands.add(new FCommandRelationAlly());
commands.add(new FCommandRelationEnemy());
commands.add(new FCommandRelationNeutral());
commands.add(new FCommandSafeclaim());
commands.add(new FCommandSethome());
commands.add(new FCommandShow());
commands.add(new FCommandTag());
commands.add(new FCommandTitle());
@ -127,14 +136,15 @@ public class Factions extends JavaPlugin {
// Register events
PluginManager pm = this.getServer().getPluginManager();
pm.registerEvent(Event.Type.PLAYER_CHAT, this.playerListener, Event.Priority.Highest, this);
pm.registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_ITEM, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_JOIN, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_MOVE, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_QUIT, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_JOIN, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_RESPAWN, this.playerListener, Event.Priority.High, this);
pm.registerEvent(Event.Type.ENTITY_DEATH, this.entityListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.ENTITY_DAMAGED, this.entityListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.ENTITY_EXPLODE, this.entityListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.CREATURE_SPAWN, this.entityListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.ENTITY_TARGET, this.entityListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.BLOCK_DAMAGED, this.blockListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.BLOCK_PLACED, this.blockListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.BLOCK_INTERACT, this.blockListener, Event.Priority.Normal, this);
@ -156,6 +166,21 @@ public class Factions extends JavaPlugin {
// Integration with other plugins
// -------------------------------------------- //
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);
}
}
private void setupPermissions() {
if (Permissions != null) {
return;
@ -171,21 +196,38 @@ public class Factions extends JavaPlugin {
}
}
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);
}
// -------------------------------------------- //
// 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);
}
public static boolean hasPermAutoLeaveImmunity(CommandSender sender) {
return hasPerm(sender, "factions.autoLeaveImmunity", true);
}
private static boolean hasPerm(CommandSender sender, String permNode, boolean fallbackOnlyOp) {
if (Factions.Permissions == null || ! (sender instanceof Player)) {
return fallbackOnlyOp == false || sender.isOp();
}
if (sender instanceof Player) {
Player player = (Player)sender;
return Factions.Permissions.has(player, permNode);
}
return false;
}
// -------------------------------------------- //
// Commands
@ -247,6 +289,7 @@ public class Factions extends JavaPlugin {
FPlayer.save();
Faction.save();
Board.save();
Conf.save();
}
}

View File

@ -0,0 +1,51 @@
package com.bukkit.mcteam.factions;
import java.lang.reflect.Type;
import org.bukkit.Location;
import org.bukkit.World;
import com.bukkit.mcteam.gson.JsonDeserializationContext;
import com.bukkit.mcteam.gson.JsonDeserializer;
import com.bukkit.mcteam.gson.JsonElement;
import com.bukkit.mcteam.gson.JsonObject;
import com.bukkit.mcteam.gson.JsonParseException;
import com.bukkit.mcteam.gson.JsonSerializationContext;
import com.bukkit.mcteam.gson.JsonSerializer;
public class MyLocationTypeAdapter implements JsonDeserializer<Location>, JsonSerializer<Location> {
private static final String WORLD = "world";
private static final String X = "x";
private static final String Y = "y";
private static final String Z = "z";
private static final String YAW = "yaw";
private static final String PITCH = "pitch";
@Override
public Location deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject obj = json.getAsJsonObject();
World world = Factions.instance.getServer().getWorld(obj.get(WORLD).getAsString());
double x = obj.get(X).getAsDouble();
double y = obj.get(Y).getAsDouble();
double z = obj.get(Z).getAsDouble();
float yaw = obj.get(YAW).getAsFloat();
float pitch = obj.get(PITCH).getAsFloat();
return new Location(world, x, y, z, yaw, pitch);
}
@Override
public JsonElement serialize(Location src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject obj = new JsonObject();
obj.addProperty(WORLD, src.getWorld().getName());
obj.addProperty(X, src.getX());
obj.addProperty(Y, src.getY());
obj.addProperty(Z, src.getZ());
obj.addProperty(YAW, src.getYaw());
obj.addProperty(PITCH, src.getPitch());
return obj;
}
}

View File

@ -15,12 +15,9 @@ import com.bukkit.mcteam.factions.util.TextUtil;
public class FBaseCommand {
public List<String> aliases;
public List<String> requiredParameters;
public List<String> optionalParameters;
public String permissions;
public String helpNameAndParams;
public String helpDescription;
@ -33,12 +30,11 @@ public class FBaseCommand {
public FBaseCommand() {
aliases = new ArrayList<String>();
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
permissions = "";
senderMustBePlayer = false;
senderMustBePlayer = true;
helpNameAndParams = "fail!";
helpDescription = "no description";
@ -47,12 +43,7 @@ public class FBaseCommand {
public List<String> getAliases() {
return aliases;
}
public String getBaseName() {
// TODO fetch from the plugin.yaml or something...
return "f";
}
public void execute(CommandSender sender, List<String> parameters) {
this.sender = sender;
this.parameters = parameters;
@ -83,16 +74,14 @@ public class FBaseCommand {
}
}
// Test if the number of params is correct.
// TODO print usage
public boolean validateCall() {
if( ! testPermission(sender)) {
sendMessage("You do not have sufficient permissions to use this command.");
if ( this.senderMustBePlayer && ! (sender instanceof Player)) {
sendMessage("This command can only be used by ingame players.");
return false;
}
if ( this.senderMustBePlayer && ! (sender instanceof Player)) {
sendMessage("This command can only be used by ingame players.");
if( ! hasPermission(sender)) {
sendMessage("You lack the permissions to "+this.helpDescription.toLowerCase()+".");
return false;
}
@ -104,26 +93,29 @@ public class FBaseCommand {
return true;
}
public boolean testPermission(CommandSender sender) {
if (sender.isOp()) {
return true;
public boolean hasPermission(CommandSender sender) {
return Factions.hasPermParticipate(sender);
}
/*public boolean testPermission(CommandSender sender) {
// There are two cases where we default to op:
// 1. Permissions is not installed
// 2. The sender is not a player
if ( Factions.Permissions == null || (! (sender instanceof Player))) {
if (this.opOnly && sender.isOp()) {
return true;
}
return false;
}
// No permissions are needed to use this command.
if (this.permissions.length() == 0) {
return true;
}
if ( ! (sender instanceof Player)) {
return false;
}
if (Factions.Permissions == null) {
return false;
}
Player player = (Player)sender;
return Factions.Permissions.has(player, this.permissions);
}
}*/
// -------------------------------------------- //
// Help and usage description
@ -135,7 +127,7 @@ public class FBaseCommand {
ret += Conf.colorCommand;
}
ret += this.getBaseName()+ " " +TextUtil.implode(this.getAliases(), ",")+" ";
ret += Factions.instance.getBaseCommand()+ " " +TextUtil.implode(this.getAliases(), ",")+" ";
List<String> parts = new ArrayList<String>();
@ -167,10 +159,6 @@ public class FBaseCommand {
return getUseageTemplate(true);
}
public void helpRegister() {
Factions.helpPlugin.registerCommand(this.getUseageTemplate(false), this.helpDescription, Factions.instance, false, permissions);
}
// -------------------------------------------- //
// Assertions
// -------------------------------------------- //

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
@ -10,17 +8,10 @@ import com.bukkit.mcteam.factions.struct.Role;
public class FCommandAdmin extends FBaseCommand {
public FCommandAdmin() {
aliases = new ArrayList<String>();
aliases.add("admin");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("player name");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Hand over your admin rights";
}

View File

@ -1,21 +1,11 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
public class FCommandChat extends FBaseCommand {
public FCommandChat() {
aliases = new ArrayList<String>();
aliases.add("chat");
aliases.add("c");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
permissions = "";
senderMustBePlayer = true;
helpDescription = "Switch faction only chat on and off";
}

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Board;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FLocation;
@ -12,16 +10,8 @@ import com.bukkit.mcteam.factions.struct.Role;
public class FCommandClaim extends FBaseCommand {
public FCommandClaim() {
aliases = new ArrayList<String>();
aliases.add("claim");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
permissions = "";
senderMustBePlayer = true;
helpDescription = "Claim the land where you are standing";
}
@ -54,8 +44,17 @@ public class FCommandClaim extends FBaseCommand {
return;
}
if (otherFaction.getId() != 0) {
if ( ! otherFaction.hasLandInflation()) { // TODO more messages WARN current faction most importantly
if (otherFaction.isSafeZone()) {
sendMessage("You can not claim a SafeZone.");
return;
}
if (otherFaction.isNone()) {
myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" claimed some new land :D");
} else { //if (otherFaction.isNormal()) {
if ( ! otherFaction.hasLandInflation()) {
// TODO more messages WARN current faction most importantly
sendMessage(me.getRelationColor(otherFaction)+otherFaction.getTag()+Conf.colorSystem+" owns this land and is strong enough to keep it.");
return;
}
@ -64,11 +63,7 @@ public class FCommandClaim extends FBaseCommand {
sendMessage("You must start claiming land at the border of the territory.");
return;
}
}
if (otherFaction.getId() == 0) {
myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" claimed some new land :D");
} else {
// ASDF claimed some of your land 450 blocks NNW of you.
// ASDf claimed some land from FACTION NAME
otherFaction.sendMessage(me.getNameAndRelevant(otherFaction)+Conf.colorSystem+" stole some of your land :O");

View File

@ -2,28 +2,29 @@ package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import org.bukkit.command.CommandSender;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
import com.bukkit.mcteam.factions.Factions;
import com.bukkit.mcteam.factions.struct.Role;
public class FCommandCreate extends FBaseCommand {
public FCommandCreate() {
aliases = new ArrayList<String>();
aliases.add("create");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("faction tag");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Create a new faction";
}
@Override
public boolean hasPermission(CommandSender sender) {
return Factions.hasPermCreate(sender);
}
public void perform() {
String tag = parameters.get(0);
@ -52,8 +53,7 @@ public class FCommandCreate extends FBaseCommand {
follower.sendMessage(me.getNameAndRelevant(follower)+Conf.colorSystem+" created a new faction "+faction.getTag(follower));
}
sendMessage("You should now:");
sendMessage( new FCommandDescription().getUseageTemplate() );
sendMessage("You should now: " + new FCommandDescription().getUseageTemplate(true, true));
}
}

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
@ -10,18 +8,11 @@ import com.bukkit.mcteam.factions.struct.Role;
public class FCommandDeinvite extends FBaseCommand {
public FCommandDeinvite() {
aliases = new ArrayList<String>();
aliases.add("deinvite");
aliases.add("deinv");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("player name");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Remove a pending invitation";
}

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.struct.Role;
@ -10,17 +8,10 @@ import com.bukkit.mcteam.factions.util.TextUtil;
public class FCommandDescription extends FBaseCommand {
public FCommandDescription() {
aliases = new ArrayList<String>();
aliases.add("desc");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("desc");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Change the faction description";
}

View File

@ -2,28 +2,27 @@ package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import org.bukkit.command.CommandSender;
import com.bukkit.mcteam.factions.util.TextUtil;
public class FCommandHelp extends FBaseCommand {
public FCommandHelp() {
aliases = new ArrayList<String>();
aliases.add("help");
aliases.add("h");
aliases.add("?");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
optionalParameters.add("page");
permissions = "";
senderMustBePlayer = false;
optionalParameters.add("page");
helpDescription = "Display a help page";
}
@Override
public boolean hasPermission(CommandSender sender) {
return true;
}
public void perform() {
int page = 1;
if (parameters.size() > 0) {
@ -60,67 +59,74 @@ public class FCommandHelp extends FBaseCommand {
pageLines.add( new FCommandJoin().getUseageTemplate(true, true) );
pageLines.add( new FCommandLeave().getUseageTemplate(true, true) );
pageLines.add( new FCommandChat().getUseageTemplate(true, true) );
pageLines.add( new FCommandCreate().getUseageTemplate(true, true) );
pageLines.add( new FCommandTag().getUseageTemplate(true, true) );
pageLines.add( new FCommandDescription().getUseageTemplate(true, true) );
pageLines.add( new FCommandHome().getUseageTemplate(true, true) );
pageLines.add( "Learn how to create a faction on the next page." );
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines = new ArrayList<String>();
pageLines.add( "Create a faction using these two commands:" );
pageLines.add( new FCommandCreate().getUseageTemplate(true, true) );
pageLines.add( new FCommandDescription().getUseageTemplate(true, true) );
pageLines.add( "You might wan't to close it and use invitations:" );
pageLines.add( new FCommandOpen().getUseageTemplate(true, true) );
pageLines.add( new FCommandTitle().getUseageTemplate(true, true) );
pageLines.add( new FCommandInvite().getUseageTemplate(true, true) );
pageLines.add( new FCommandDeinvite().getUseageTemplate(true, true) );
pageLines.add( "And don't forget to set your home:" );
pageLines.add( new FCommandSethome().getUseageTemplate(true, true) );
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines.add( "Faction can claim land that will be protected." );
pageLines.add( new FCommandClaim().getUseageTemplate(true, true) );
pageLines.add( new FCommandUnclaim().getUseageTemplate(true, true) );
pageLines.add( new FCommandTag().getUseageTemplate(true, true) );
pageLines.add( new FCommandKick().getUseageTemplate(true, true) );
pageLines.add( new FCommandMod().getUseageTemplate(true, true) );
pageLines.add( new FCommandAdmin().getUseageTemplate(true, true) );
pageLines.add( new FCommandTitle().getUseageTemplate(true, true) );
pageLines.add( "Player titles are just for fun. No rules connected to them." );
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines = new ArrayList<String>();
pageLines.add( new FCommandRelationAlly().getUseageTemplate(true, true) );
pageLines.add( new FCommandRelationNeutral().getUseageTemplate(true, true) );
pageLines.add( new FCommandRelationEnemy().getUseageTemplate(true, true) );
pageLines.add("");
pageLines.add(Conf.colorSystem+"Set the relation you WISH to have with another faction.");
pageLines.add(Conf.colorSystem+"Your default relation with other factions will be neutral.");
pageLines.add("Set the relation you WISH to have with another faction.");
pageLines.add("Your default relation with other factions will be neutral.");
pageLines.add("");
pageLines.add(Conf.colorSystem+"If BOTH factions choose \"ally\" you will be allies.");
pageLines.add(Conf.colorSystem+"If ONE faction chooses \"enemy\" you will be enemies.");
pageLines.add("If BOTH factions choose \"ally\" you will be allies.");
pageLines.add("If ONE faction chooses \"enemy\" you will be enemies.");
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines.add(Conf.colorSystem+"You can never hurt members or allies.");
pageLines.add(Conf.colorSystem+"You can not hurt neutrals in their own territory.");
pageLines.add(Conf.colorSystem+"You can always hurt enemies and players without faction.");
pageLines = new ArrayList<String>();
pageLines.add("You can never hurt members or allies.");
pageLines.add("You can not hurt neutrals in their own territory.");
pageLines.add("You can always hurt enemies and players without faction.");
pageLines.add("");
pageLines.add(Conf.colorSystem+"Damage from enemies is reduced in your own territory.");
pageLines.add(Conf.colorSystem+"When you die you lose power. It is restored over time.");
pageLines.add(Conf.colorSystem+"The power of a faction is the sum of all member power.");
pageLines.add(Conf.colorSystem+"The power of a faction determines how much land it can hold.");
pageLines.add(Conf.colorSystem+"You can claim land from factions with too little power.");
pageLines.add("Damage from enemies is reduced in your own territory.");
pageLines.add("When you die you lose power. It is restored over time.");
pageLines.add("The power of a faction is the sum of all member power.");
pageLines.add("The power of a faction determines how much land it can hold.");
pageLines.add("You can claim land from factions with too little power.");
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines.add(Conf.colorSystem+"Only faction members can build and destroy in their own");
pageLines.add(Conf.colorSystem+"territory. Usage of the following items is also restricted:");
pageLines.add(Conf.colorSystem+"Door, Chest, Furnace and Dispenser.");
pageLines.add(" ");
pageLines.add(Conf.colorSystem+"Make sure to put pressure plates in front of doors for your");
pageLines.add(Conf.colorSystem+"guest visitors. Otherwise they can't get through. You can ");
pageLines.add(Conf.colorSystem+"also use this to create member only areas.");
pageLines.add(Conf.colorSystem+"As dispensers are protected, you can create traps without");
pageLines.add(Conf.colorSystem+"worrying about those arrows getting stolen.");
pageLines = new ArrayList<String>();
pageLines.add("Only faction members can build and destroy in their own");
pageLines.add("territory. Usage of the following items is also restricted:");
pageLines.add("Door, Chest, Furnace and Dispenser.");
pageLines.add("");
pageLines.add("Make sure to put pressure plates in front of doors for your");
pageLines.add("guest visitors. Otherwise they can't get through. You can");
pageLines.add("also use this to create member only areas.");
pageLines.add("As dispensers are protected, you can create traps without");
pageLines.add("worrying about those arrows getting stolen.");
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines = new ArrayList<String>();
pageLines.add("Finally some commands for the server admins:");
pageLines.add( new FCommandVersion().getUseageTemplate(true, true) );
pageLines.add( new FCommandSafeclaim().getUseageTemplate(true, true) );
helpPages.add(pageLines);
}

View File

@ -0,0 +1,36 @@
package com.bukkit.mcteam.factions.commands;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.Faction;
import com.bukkit.mcteam.factions.struct.Role;
public class FCommandHome extends FBaseCommand {
public FCommandHome() {
aliases.add("home");
helpDescription = "Teleport to the faction home";
}
public void perform() {
if ( ! assertHasFaction()) {
return;
}
if ( ! Conf.homesEnabled) {
me.sendMessage("Sorry, Faction homes are disabled on this server.");
return;
}
Faction myFaction = me.getFaction();
if ( ! myFaction.hasHome()) {
me.sendMessage("You faction does not have a home. " + (me.getRole().value < Role.MODERATOR.value ? " Ask your leader to:" : "You should:"));
me.sendMessage(new FCommandSethome().getUseageTemplate(true, true));
return;
}
player.teleportTo(myFaction.getHome());
}
}

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
@ -10,18 +8,11 @@ import com.bukkit.mcteam.factions.struct.Role;
public class FCommandInvite extends FBaseCommand {
public FCommandInvite() {
aliases = new ArrayList<String>();
aliases.add("invite");
aliases.add("inv");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("player name");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Invite a player";
}

View File

@ -1,24 +1,15 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.Faction;
public class FCommandJoin extends FBaseCommand {
public FCommandJoin() {
aliases = new ArrayList<String>();
aliases.add("join");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("faction name");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Join a faction";
}
@ -30,6 +21,11 @@ public class FCommandJoin extends FBaseCommand {
return;
}
if ( ! faction.isNormal()) {
sendMessage("You may only join normal factions. This is a system faction.");
return;
}
if (faction == me.getFaction()) {
sendMessage("You are already a member of "+faction.getTag(me));
return;

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
@ -9,17 +7,10 @@ import com.bukkit.mcteam.factions.Faction;
public class FCommandKick extends FBaseCommand {
public FCommandKick() {
aliases = new ArrayList<String>();
aliases.add("kick");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("player name");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Kick a player from the faction";
}

View File

@ -1,23 +1,20 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import org.bukkit.command.CommandSender;
public class FCommandLeave extends FBaseCommand {
public FCommandLeave() {
aliases = new ArrayList<String>();
aliases.add("leave");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
permissions = "";
senderMustBePlayer = true;
helpDescription = "Leave your faction";
}
@Override
public boolean hasPermission(CommandSender sender) {
return true;
}
public void perform() {
if ( ! assertHasFaction()) {
return;

View File

@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import org.bukkit.command.CommandSender;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.Faction;
import com.bukkit.mcteam.factions.util.TextUtil;
@ -11,25 +13,23 @@ import com.bukkit.mcteam.factions.util.TextUtil;
public class FCommandList extends FBaseCommand {
public FCommandList() {
aliases = new ArrayList<String>();
aliases.add("list");
aliases.add("ls");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
optionalParameters.add("page");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Show a list of the factions";
}
// TODO put the 0 faction at the highest position
@Override
public boolean hasPermission(CommandSender sender) {
return true;
}
public void perform() {
ArrayList<Faction> FactionList = new ArrayList<Faction>(Faction.getAll());
FactionList.remove(Faction.get(0));
FactionList.remove(Faction.getNone());
FactionList.remove(Faction.getSafeZone());
int page = 1;
if (parameters.size() > 0) {
@ -65,7 +65,7 @@ public class FCommandList extends FBaseCommand {
}
});
FactionList.add(0, Faction.get(0));
FactionList.add(0, Faction.getNone());
int maxPage = (int)Math.floor((double)FactionList.size() / 9D);
if (page < 0 || page > maxPage) {

View File

@ -1,6 +1,6 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import org.bukkit.command.CommandSender;
import com.bukkit.mcteam.factions.Board;
import com.bukkit.mcteam.factions.FLocation;
@ -8,20 +8,18 @@ import com.bukkit.mcteam.factions.FLocation;
public class FCommandMap extends FBaseCommand {
public FCommandMap() {
aliases = new ArrayList<String>();
aliases.add("map");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
optionalParameters.add("on|off");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Show territory map, set optional auto update";
}
@Override
public boolean hasPermission(CommandSender sender) {
return true;
}
public void perform() {
if (parameters.size() > 0) {
String mapAutoUpdating = parameters.get(0);

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
@ -10,17 +8,10 @@ import com.bukkit.mcteam.factions.struct.Role;
public class FCommandMod extends FBaseCommand {
public FCommandMod() {
aliases = new ArrayList<String>();
aliases.add("mod");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("player name");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Give or revoke moderator rights";
}

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.Faction;
import com.bukkit.mcteam.factions.struct.Role;
@ -9,17 +7,9 @@ import com.bukkit.mcteam.factions.struct.Role;
public class FCommandOpen extends FBaseCommand {
public FCommandOpen() {
aliases = new ArrayList<String>();
aliases.add("open");
aliases.add("close");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
permissions = "";
senderMustBePlayer = true;
helpDescription = "Switch if invitation is required to join";
}

View File

@ -1,13 +1,10 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.struct.Relation;
public class FCommandRelationAlly extends FRelationCommand {
public FCommandRelationAlly() {
aliases = new ArrayList<String>();
aliases.add("ally");
}

View File

@ -1,13 +1,10 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.struct.Relation;
public class FCommandRelationEnemy extends FRelationCommand {
public FCommandRelationEnemy() {
aliases = new ArrayList<String>();
aliases.add("enemy");
}

View File

@ -1,13 +1,10 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.struct.Relation;
public class FCommandRelationNeutral extends FRelationCommand {
public FCommandRelationNeutral() {
aliases = new ArrayList<String>();
aliases.add("neutral");
}

View File

@ -0,0 +1,30 @@
package com.bukkit.mcteam.factions.commands;
import org.bukkit.command.CommandSender;
import com.bukkit.mcteam.factions.Board;
import com.bukkit.mcteam.factions.FLocation;
import com.bukkit.mcteam.factions.Faction;
import com.bukkit.mcteam.factions.Factions;
public class FCommandSafeclaim extends FBaseCommand {
public FCommandSafeclaim() {
aliases.add("safeclaim");
aliases.add("safe");
helpDescription = "Claim land for the safezone";
}
@Override
public boolean hasPermission(CommandSender sender) {
return Factions.hasPermManageSafeZone(sender);
}
public void perform() {
FLocation flocation = new FLocation(me);
Board.setFactionAt(Faction.getSafeZone(), flocation);
sendMessage("This land is now a safe zone");
}
}

View File

@ -0,0 +1,38 @@
package com.bukkit.mcteam.factions.commands;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.Faction;
import com.bukkit.mcteam.factions.struct.Role;
public class FCommandSethome extends FBaseCommand {
public FCommandSethome() {
aliases.add("sethome");
helpDescription = "Set the faction home";
}
public void perform() {
if ( ! assertHasFaction()) {
return;
}
if ( ! assertMinRole(Role.MODERATOR)) {
return;
}
if ( ! Conf.homesEnabled) {
me.sendMessage("Sorry, Faction homes are disabled on this server.");
return;
}
// TODO may only be inside faction territory
Faction myFaction = me.getFaction();
myFaction.setHome(player.getLocation());
myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" set the home for your faction. You can now use:");
myFaction.sendMessage(new FCommandHome().getUseageTemplate(true, true));
}
}

View File

@ -1,8 +1,9 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import java.util.Collection;
import org.bukkit.command.CommandSender;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
@ -13,21 +14,19 @@ import com.bukkit.mcteam.factions.util.TextUtil;
public class FCommandShow extends FBaseCommand {
public FCommandShow() {
aliases = new ArrayList<String>();
aliases.add("show");
aliases.add("who");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
optionalParameters.add("faction tag");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Show faction information";
}
@Override
public boolean hasPermission(CommandSender sender) {
return true;
}
public void perform() {
Faction faction;
if (parameters.size() > 0) {
@ -42,7 +41,7 @@ public class FCommandShow extends FBaseCommand {
sendMessage(TextUtil.titleize(faction.getTag(me)));
sendMessage(Conf.colorChrome+"Description: "+Conf.colorSystem+faction.getDescription());
if (faction.getId() == 0) {
if ( ! faction.isNormal()) {
return;
}

View File

@ -10,17 +10,10 @@ import com.bukkit.mcteam.factions.util.TextUtil;
public class FCommandTag extends FBaseCommand {
public FCommandTag() {
aliases = new ArrayList<String>();
aliases.add("tag");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("faction tag");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Change the faction tag";
}

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
@ -10,18 +8,12 @@ import com.bukkit.mcteam.factions.util.TextUtil;
public class FCommandTitle extends FBaseCommand {
public FCommandTitle() {
aliases = new ArrayList<String>();
aliases.add("title");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("player name");
optionalParameters.add("title");
permissions = "";
senderMustBePlayer = true;
helpDescription = "Set or remove a players title";
}

View File

@ -1,31 +1,35 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import com.bukkit.mcteam.factions.Board;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FLocation;
import com.bukkit.mcteam.factions.Faction;
import com.bukkit.mcteam.factions.Factions;
import com.bukkit.mcteam.factions.struct.Role;
public class FCommandUnclaim extends FBaseCommand {
public FCommandUnclaim() {
aliases = new ArrayList<String>();
aliases.add("unclaim");
aliases.add("declaim");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
permissions = "";
senderMustBePlayer = true;
helpDescription = "Unclaim the land where you are standing";
}
public void perform() {
FLocation flocation = new FLocation(me);
Faction otherFaction = Board.getFactionAt(flocation);
if (otherFaction.isSafeZone()) {
if (Factions.hasPermManageSafeZone(sender)) {
Board.removeAt(flocation);
sendMessage("Safe zone was unclaimed.");
} else {
sendMessage("This is a safe zone. You lack permissions to unclaim.");
}
return;
}
if ( ! assertHasFaction()) {
return;
}
@ -35,8 +39,7 @@ public class FCommandUnclaim extends FBaseCommand {
}
Faction myFaction = me.getFaction();
FLocation flocation = new FLocation(me);
Faction otherFaction = Board.getFactionAt(flocation);
if ( myFaction != otherFaction) {
sendMessage("You don't own this land.");

View File

@ -1,25 +1,25 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import org.bukkit.command.CommandSender;
import com.bukkit.mcteam.factions.Factions;
public class FCommandVersion extends FBaseCommand {
public FCommandVersion() {
aliases = new ArrayList<String>();
aliases.add("version");
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
permissions = "";
senderMustBePlayer = false;
helpDescription = "Which version are you using?";
}
@Override
public boolean hasPermission(CommandSender sender) {
return true;
}
public void perform() {
sendMessage("You are running "+Factions.instance.getDescription().getFullName());
}

View File

@ -1,7 +1,5 @@
package com.bukkit.mcteam.factions.commands;
import java.util.ArrayList;
import org.bukkit.ChatColor;
import com.bukkit.mcteam.factions.Conf;
@ -13,13 +11,9 @@ import com.bukkit.mcteam.factions.struct.Role;
public class FRelationCommand extends FBaseCommand {
public FRelationCommand() {
requiredParameters = new ArrayList<String>();
optionalParameters = new ArrayList<String>();
requiredParameters.add("faction tag");
helpDescription = "Set relation wish to another faction";
permissions = "";
senderMustBePlayer = true;
helpDescription = "Set relation wish to another faction";
}
public void relation(Relation whishedRelation, String otherFactionName) {

View File

@ -14,6 +14,7 @@ import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FLocation;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
import com.bukkit.mcteam.factions.Factions;
import com.bukkit.mcteam.factions.util.TextUtil;
public class FactionsBlockListener extends BlockListener {
@ -45,11 +46,20 @@ public class FactionsBlockListener extends BlockListener {
public boolean playerCanBuildDestroyBlock(Player player, Block block, String action) {
Faction otherFaction = Board.getFactionAt(new FLocation(block));
if (otherFaction.getId() == 0) {
return true; // This is no faction territory. You may build or break stuff here.
if (otherFaction.isNone()) {
return true;
}
FPlayer me = FPlayer.get(player);
if (otherFaction.isSafeZone()) {
if (Factions.hasPermManageSafeZone(player)) {
return true;
}
me.sendMessage("You can't "+action+" in a safe zone.");
return false;
}
Faction myFaction = me.getFaction();
// Cancel if we are not in our own territory
@ -92,11 +102,12 @@ public class FactionsBlockListener extends BlockListener {
Faction myFaction = me.getFaction();
Faction otherFaction = Board.getFactionAt(new FLocation(block));
if (otherFaction != null && otherFaction.getId() != 0 && myFaction != otherFaction) {
me.sendMessage(Conf.colorSystem+"You can't use "+TextUtil.getMaterialName(material)+" in the territory of "+otherFaction.getTag(myFaction));
//otherFaction.sendMessage(me.getNameAndRelevant(otherFaction)+Conf.colorSystem+" tried to use "+TextUtil.getMaterialName(material)+" in your territory");
if (otherFaction.isNormal() && myFaction != otherFaction) {
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in the territory of "+otherFaction.getTag(myFaction));
return false;
}
// You may use doors in both safeZone and wilderness
return true;
}
}

View File

@ -7,18 +7,22 @@ import org.bukkit.entity.Creeper;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Fireball;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageByProjectileEvent;
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.EntityTargetEvent;
import com.bukkit.mcteam.factions.Board;
import com.bukkit.mcteam.factions.Conf;
import com.bukkit.mcteam.factions.FLocation;
import com.bukkit.mcteam.factions.FPlayer;
import com.bukkit.mcteam.factions.Faction;
import com.bukkit.mcteam.factions.struct.Relation;
import com.bukkit.mcteam.util.EntityUtil;
public class FactionsEntityListener extends EntityListener {
@ -30,9 +34,9 @@ public class FactionsEntityListener extends EntityListener {
}
Player player = (Player) entity;
FPlayer follower = FPlayer.get(player);
follower.onDeath();
follower.sendMessage("Your power is now "+follower.getPowerRounded()+" / "+follower.getPowerMaxRounded());
FPlayer fplayer = FPlayer.get(player);
fplayer.onDeath();
fplayer.sendMessage("Your power is now "+fplayer.getPowerRounded()+" / "+fplayer.getPowerMaxRounded());
}
/**
@ -61,7 +65,7 @@ public class FactionsEntityListener extends EntityListener {
}
// TODO what happens with the creeper or fireball then?
// TODO what happens with the creeper or fireball then? Must we delete them manually?
@Override
public void onEntityExplode(EntityExplodeEvent event)
{
@ -69,15 +73,17 @@ public class FactionsEntityListener extends EntityListener {
return;
}
Faction faction = Board.getFactionAt(new FLocation(event.getLocation()));
// Explosions may happen in the wilderness
if (Board.getIdAt(new FLocation(event.getLocation())) == 0) {
if (faction.isNone()) {
return;
}
if (Conf.territoryBlockCreepers && event.getEntity() instanceof Creeper) {
if ((Conf.territoryBlockCreepers || faction.isSafeZone()) && event.getEntity() instanceof Creeper) {
// creeper which might need prevention, if inside faction territory
event.setCancelled(true);
} else if (Conf.territoryBlockFireballs && event.getEntity() instanceof Fireball) {
} else if ((Conf.territoryBlockFireballs || faction.isSafeZone()) && event.getEntity() instanceof Fireball) {
// ghast fireball which might need prevention, if inside faction territory
event.setCancelled(true);
}
@ -87,22 +93,32 @@ public class FactionsEntityListener extends EntityListener {
Entity damager = sub.getDamager();
Entity damagee = sub.getEntity();
int damage = sub.getDamage();
if ( ! (damager instanceof Player)) {
return true;
}
if ( ! (damagee instanceof Player)) {
return true;
}
FPlayer defender = FPlayer.get((Player)damagee);
// Players can not take attack damage in a SafeZone
if (Board.getFactionAt(new FLocation(defender)).isSafeZone()) {
if (damager instanceof Player) {
FPlayer attacker = FPlayer.get((Player)damager);
attacker.sendMessage("You cant hurt other players in a SafeZone.");
defender.sendMessage(attacker.getNameAndRelevant(defender)+Conf.colorSystem+" tried to hurt you.");
}
return false;
}
if ( ! (damager instanceof Player)) {
return true;
}
FPlayer attacker = FPlayer.get((Player)damager);
Relation relation = defender.getRelation(attacker);
//Log.debug(attacker.getName() + " attacked " + defender.getName());
// Players without faction may be hurt anywhere
if (defender.getFaction().getId() == 0) {
if (defender.getFaction().isNone()) {
return true;
}
@ -121,14 +137,47 @@ public class FactionsEntityListener extends EntityListener {
// Damage will be dealt. However check if the damage should be reduced.
if (defender.isInOwnTerritory() && Conf.territoryShieldFactor > 0) {
int newDamage = (int)(damage * Conf.territoryShieldFactor);
int newDamage = (int)Math.ceil(damage * (1D - Conf.territoryShieldFactor));
sub.setDamage(newDamage);
// Send message
String perc = MessageFormat.format("{0,number,#%}", (1.0 - Conf.territoryShieldFactor));
defender.sendMessage(Conf.colorSystem+"Enemy damage reduced by "+ChatColor.RED+perc+Conf.colorSystem+".");
String perc = MessageFormat.format("{0,number,#%}", (Conf.territoryShieldFactor)); // TODO does this display correctly??
defender.sendMessage("Enemy damage reduced by "+ChatColor.RED+perc+Conf.colorSystem+".");
}
return true;
}
public void onCreatureSpawn(CreatureSpawnEvent event) {
if (event.isCancelled()) {
return;
}
if (Conf.safeZoneNerfedCreatureTypes.contains(event.getCreatureType()) && Board.getFactionAt(new FLocation(event.getLocation())).isSafeZone()) {
event.setCancelled(true);
}
}
@Override
public void onEntityTarget(EntityTargetEvent event) {
if (event.isCancelled()) {
return;
}
// if there is a target
Entity target = event.getTarget();
if (target == null) {
return;
}
// We are interested in blocking targeting for certain mobs:
if ( ! Conf.safeZoneNerfedCreatureTypes.contains(EntityUtil.creatureTypeFromEntity(event.getEntity()))) {
return;
}
// in case the target is in a safe zone.
if (Board.getFactionAt(new FLocation(target.getLocation())).isSafeZone()) {
event.setCancelled(true);
}
}
}

View File

@ -3,6 +3,7 @@ package com.bukkit.mcteam.factions.listeners;
import java.util.List;
import java.util.logging.Logger;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.CommandSender;
@ -12,6 +13,7 @@ import org.bukkit.event.player.PlayerEvent;
import org.bukkit.event.player.PlayerItemEvent;
import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import com.bukkit.mcteam.factions.Board;
import com.bukkit.mcteam.factions.Conf;
@ -99,13 +101,6 @@ public class FactionsPlayerListener extends PlayerListener{
FPlayer.autoLeaveOnInactivityRoutine();
}
@Override
public void onPlayerQuit(PlayerEvent event) {
// Save all players on player quit.
FPlayer.save();
}
@Override
public void onPlayerMove(PlayerMoveEvent event) {
FPlayer me = FPlayer.get(event.getPlayer());
@ -159,7 +154,7 @@ public class FactionsPlayerListener extends PlayerListener{
Faction otherFaction = Board.getFactionAt(new FLocation(block));
if (otherFaction.getId() == 0) {
if (otherFaction.isNone()) {
return true; // This is not faction territory. Use whatever you like here.
}
@ -174,4 +169,13 @@ public class FactionsPlayerListener extends PlayerListener{
return true;
}
@Override
public void onPlayerRespawn(PlayerRespawnEvent event) {
FPlayer me = FPlayer.get(event.getPlayer());
Location home = me.getFaction().getHome();
if (Conf.homesEnabled && Conf.homesTeleportToOnDeath && home != null) {
event.setRespawnLocation(home);
}
}
}

View File

@ -0,0 +1,18 @@
package com.bukkit.mcteam.util;
import org.bukkit.entity.Creature;
import org.bukkit.entity.CreatureType;
import org.bukkit.entity.Entity;
public class EntityUtil {
public static CreatureType creatureTypeFromEntity(Entity entity) {
if ( ! (entity instanceof Creature)) {
return null;
}
String name = entity.getClass().getSimpleName();
name = name.substring(5); // Remove "Craft"
return CreatureType.fromName(name);
}
}