From 0b96a821ce660877380dbfbd5f3503c88a5e783e Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Sat, 19 Mar 2011 13:00:03 +0100 Subject: [PATCH] More refactoring --- src/com/bukkit/mcteam/factions/Board.java | 211 +++++++----------- src/com/bukkit/mcteam/factions/Commands.java | 23 +- .../factions/{Coord.java => CoordOld.java} | 8 +- src/com/bukkit/mcteam/factions/FLocation.java | 101 +++++++++ src/com/bukkit/mcteam/factions/FPlayer.java | 177 ++++----------- src/com/bukkit/mcteam/factions/Faction.java | 10 +- src/com/bukkit/mcteam/factions/Factions.java | 3 - .../mcteam/factions/commands/FCommand.java | 74 +++++- .../factions/commands/FCommandCreate.java | 59 +++++ .../factions/commands/FCommandJoin.java | 57 +++++ .../factions/commands/FCommandLeave.java | 31 +-- .../factions/entities/{EM.java => EMOld.java} | 2 +- .../listeners/FactionsPlayerListener.java | 4 +- test.jpage | 0 14 files changed, 455 insertions(+), 305 deletions(-) rename src/com/bukkit/mcteam/factions/{Coord.java => CoordOld.java} (92%) create mode 100644 src/com/bukkit/mcteam/factions/FLocation.java create mode 100644 src/com/bukkit/mcteam/factions/commands/FCommandCreate.java create mode 100644 src/com/bukkit/mcteam/factions/commands/FCommandJoin.java rename src/com/bukkit/mcteam/factions/entities/{EM.java => EMOld.java} (99%) create mode 100644 test.jpage diff --git a/src/com/bukkit/mcteam/factions/Board.java b/src/com/bukkit/mcteam/factions/Board.java index 2f70dfa0..95406fc1 100644 --- a/src/com/bukkit/mcteam/factions/Board.java +++ b/src/com/bukkit/mcteam/factions/Board.java @@ -4,7 +4,6 @@ import java.io.File; import java.io.IOException; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -12,7 +11,6 @@ import java.util.Map.Entry; import org.bukkit.ChatColor; -import com.bukkit.mcteam.factions.entities.EM; import com.bukkit.mcteam.factions.util.TextUtil; import com.bukkit.mcteam.gson.reflect.TypeToken; import com.bukkit.mcteam.util.AsciiCompass; @@ -21,103 +19,100 @@ import com.bukkit.mcteam.util.DiscUtil; //import com.bukkit.mcteam.factions.util.*; public class Board { - protected static transient Map instances = new HashMap(); - protected static transient File file = new File(Factions.instance.getDataFolder(), "boards.json"); + protected static transient File file = new File(Factions.instance.getDataFolder(), "board.json"); + private static Map> worldCoordIds = new HashMap>(); - public transient String worldName; - protected Map coordFactionIds = new HashMap(); - - public Board() { - - } - - public Board(String worldName) { - this.worldName = worldName; - } - - public Faction getFactionAt(Coord coord) { - return Faction.get(getFactionIdAt(coord)); - } - public int getFactionIdAt(Coord coord) { - Integer factionId = coordFactionIds.get(coord); - if (factionId == null) { - return 0; // No faction + //----------------------------------------------// + // Get and Set + //----------------------------------------------// + public static int getIdAt(FLocation flocation) { + if ( ! worldCoordIds.containsKey(flocation.getWorldName())) { + return 0; } - return factionId; + + if ( ! worldCoordIds.get(flocation.getWorldName()).containsKey(flocation.getCoordString()) ) { + return 0; + } + + return worldCoordIds.get(flocation.getWorldName()).get(flocation.getCoordString()); } - public void unclaim(Coord coord) { - coordFactionIds.remove(coord); + public static Faction getFactionAt(FLocation flocation) { + return Faction.get(getIdAt(flocation)); + } + + public static void setIdAt(int id, FLocation flocation) { + if (id == 0) { + removeAt(flocation); + } + + if ( ! worldCoordIds.containsKey(flocation.getWorldName())) { + worldCoordIds.put(flocation.getWorldName(), new HashMap()); + } + + worldCoordIds.get(flocation.getWorldName()).put(flocation.getCoordString(), id); save(); } - public void claim(Coord coord, Faction faction) { - coordFactionIds.put(coord, faction.id); - save(); + public static void setFactionAt(Faction faction, FLocation flocation) { + setIdAt(faction.id, flocation); } - + public static void removeAt(FLocation flocation) { + if ( ! worldCoordIds.containsKey(flocation.getWorldName())) { + return; + } + worldCoordIds.get(flocation.getWorldName()).remove(flocation.getCoordString()); + save(); + } + // Is this coord NOT completely surrounded by coords claimed by the same faction? // Simpler: Is there any nearby coord with a faction other than the faction here? - public boolean isBorderCoord(Coord coord) { - Faction faction = getFactionAt(coord); - Coord a = coord.getRelative(1, 0); - Coord b = coord.getRelative(-1, 0); - Coord c = coord.getRelative(0, 1); - Coord d = coord.getRelative(0, -1); - return faction != this.getFactionAt(a) || faction != this.getFactionAt(b) || faction != this.getFactionAt(c) || faction != this.getFactionAt(d); + public static boolean isBorderLocation(FLocation flocation) { + Faction faction = getFactionAt(flocation); + FLocation a = flocation.getRelative(1, 0); + FLocation b = flocation.getRelative(-1, 0); + FLocation c = flocation.getRelative(0, 1); + FLocation d = flocation.getRelative(0, -1); + return faction != getFactionAt(a) || faction != getFactionAt(b) || faction != getFactionAt(c) || faction != getFactionAt(d); } + //----------------------------------------------// - // Clean boards + // Cleaner. Remove orphaned foreign keys //----------------------------------------------// - // These functions search boards for orphaned foreign keys - - public void clean() { - Iterator> iter = coordFactionIds.entrySet().iterator(); - while (iter.hasNext()) { - Entry entry = iter.next(); - if ( ! EM.factionExists(entry.getValue())) { - Factions.log("Cleaner removed coord with non existing factionId "+entry.getValue()); - iter.remove(); + public static void clean() { + for (String worldName : worldCoordIds.keySet()) { + Iterator> iter = worldCoordIds.get(worldName).entrySet().iterator(); + while (iter.hasNext()) { + Entry entry = iter.next(); + if ( ! Faction.exists(entry.getValue())) { + Factions.log("Board cleaner removed non existing faction id "+entry.getValue()+" from "+worldName+" "+entry.getKey()); + iter.remove(); + } } } - } - - public static void cleanAll() { - for (Board board : getAll()) { - Factions.log("Cleaning board for world "+board.worldName); - board.clean(); - } } //----------------------------------------------// // Coord count //----------------------------------------------// - public int getFactionCoordCount(int factionId) { + public static int getFactionCoordCount(int factionId) { int ret = 0; - for (int thatFactionId : coordFactionIds.values()) { - if(thatFactionId == factionId) { - ret += 1; + for (Map coordIds : worldCoordIds.values()) { + for (int thatFactionId : coordIds.values()) { + if(thatFactionId == factionId) { + ret += 1; + } } } return ret; } - public int getFactionCoordCount(Faction faction) { - return getFactionCoordCount(faction.id); - } - public static int getFactionCoordCountAllBoards(int factionId) { - int ret = 0; - for (Board board : getAll()) { - ret += board.getFactionCoordCount(factionId); - } - return ret; - } - public static int getFactionCoordCountAllBoards(Faction faction) { - return getFactionCoordCountAllBoards(faction.id); + public static int getFactionCoordCount(Faction faction) { + return getFactionCoordCount(faction.id); } //----------------------------------------------// @@ -129,13 +124,13 @@ public class Board { * north is in the direction of decreasing x * east is in the direction of decreasing z */ - public ArrayList getMap(Faction faction, Coord coord, double inDegrees) { + public ArrayList getMap(Faction faction, FLocation flocation, double inDegrees) { ArrayList ret = new ArrayList(); - ret.add(TextUtil.titleize("("+coord+") "+this.getFactionAt(coord).getTag(faction))); + ret.add(TextUtil.titleize("("+flocation+") "+getFactionAt(flocation).getTag(faction))); int halfWidth = Conf.mapWidth / 2; int halfHeight = Conf.mapHeight / 2; - Coord topLeft = coord.getRelative(-halfHeight, halfWidth); + FLocation topLeft = flocation.getRelative(-halfHeight, halfWidth); int width = halfWidth * 2 + 1; int height = halfHeight * 2 + 1; @@ -147,8 +142,8 @@ public class Board { if(dz == -(halfWidth) && dx == halfHeight) { row += ChatColor.AQUA+"+"; } else { - Coord coordHere = topLeft.getRelative(dx, dz); - Faction factionHere = this.getFactionAt(coordHere); + FLocation flocationHere = topLeft.getRelative(dx, dz); + Faction factionHere = getFactionAt(flocationHere); if (factionHere.id == 0) { row += ChatColor.GRAY+"-"; } else { @@ -171,45 +166,17 @@ public class Board { } - //----------------------------------------------// - // Persistance - //----------------------------------------------// - - /*public boolean save() { - return EM.boardSave(this.worldName); - } - - public static Board get(World world) { - return EM.boardGet(world); - } - - public static Collection getAll() { - return EM.boardGetAll(); - }*/ - - // -------------------------------------------- // // Persistance // -------------------------------------------- // - public boolean shouldBeSaved() { - return this.coordFactionIds.size() > 0; - } - public static boolean save() { - Factions.log("Saving boards to disk"); - - Map instancesToSave = new HashMap(); - for (Entry entry : instances.entrySet()) { - if (entry.getValue().shouldBeSaved()) { - instancesToSave.put(entry.getKey(), entry.getValue()); - } - } + Factions.log("Saving board to disk"); try { - DiscUtil.write(file, Factions.gson.toJson(instancesToSave)); + DiscUtil.write(file, Factions.gson.toJson(worldCoordIds)); } catch (IOException e) { - Factions.log("Failed to save the boards to disk."); + Factions.log("Failed to save the board to disk."); e.printStackTrace(); return false; } @@ -218,48 +185,22 @@ public class Board { public static boolean load() { if ( ! file.exists()) { - Factions.log("No boards to load from disk. Creating new file."); + Factions.log("No board to load from disk. Creating new file."); save(); return true; } try { - Type type = new TypeToken>(){}.getType(); - instances = Factions.gson.fromJson(DiscUtil.read(file), type); + Type type = new TypeToken>>(){}.getType(); + worldCoordIds = Factions.gson.fromJson(DiscUtil.read(file), type); } catch (IOException e) { + Factions.log("Failed to load the board from disk."); e.printStackTrace(); return false; } - - fillNames(); return true; } - - public static void fillNames() { - for(Entry entry : instances.entrySet()) { - entry.getValue().worldName = entry.getKey(); - } - } - - public static Board get(String worldName) { - if (instances.containsKey(worldName)) { - return instances.get(worldName); - } - - Board board = new Board(worldName); - instances.put(worldName, board); - return board; - } - - // You should use this one to be sure you do not spell the player name wrong. - public static Board get(Board board) { - return get(board.worldName); - } - - public static Collection getAll() { - return instances.values(); - } } diff --git a/src/com/bukkit/mcteam/factions/Commands.java b/src/com/bukkit/mcteam/factions/Commands.java index fa032e82..f915ef9b 100644 --- a/src/com/bukkit/mcteam/factions/Commands.java +++ b/src/com/bukkit/mcteam/factions/Commands.java @@ -243,7 +243,7 @@ public class Commands { } me.sendMessage(helpPages.get(page), false); } - + /* public static void leave(FPlayer me) { Faction faction = me.getFaction(); @@ -255,7 +255,7 @@ public class Commands { me.sendMessage("You left "+faction.getTag(me)); } - if (faction.getFollowersAll().size() == 0) { + if (faction.getFPlayers().size() == 0) { // Remove this faction for (FPlayer follower : FPlayer.getAll()) { follower.sendMessage(Conf.colorSystem+"The faction "+faction.getTag(follower)+Conf.colorSystem+" was disbanded."); @@ -313,6 +313,7 @@ public class Commands { me.sendMessage(Conf.colorSystem+"Now update your faction description. Use:"); me.sendMessage(Conf.colorCommand+Conf.aliasBase.get(0)+" "+Conf.aliasDescription.get(0)+" "+"[description]"); } + */ public static void tag(FPlayer me, String tag) { ArrayList errors = new ArrayList(); @@ -369,9 +370,9 @@ public class Commands { return 1; else if (f2.id == 0) return -1; - else if (f1.getFollowersAll().size() < f2.getFollowersAll().size()) + else if (f1.getFPlayers().size() < f2.getFPlayers().size()) return 1; - else if (f1.getFollowersAll().size() > f2.getFollowersAll().size()) + else if (f1.getFPlayers().size() > f2.getFPlayers().size()) return -1; return 0; } @@ -381,9 +382,9 @@ public class Commands { Collections.sort(FactionList, new Comparator(){ @Override public int compare(Faction f1, Faction f2) { - if (f1.getFollowersWhereOnline(true).size() < f2.getFollowersWhereOnline(true).size()) + if (f1.getFPlayersWhereOnline(true).size() < f2.getFPlayersWhereOnline(true).size()) return 1; - else if (f1.getFollowersWhereOnline(true).size() > f2.getFollowersWhereOnline(true).size()) + else if (f1.getFPlayersWhereOnline(true).size() > f2.getFPlayersWhereOnline(true).size()) return -1; return 0; } @@ -404,9 +405,9 @@ public class Commands { for (int pos = page * 9; pos < maxPos; pos++) { Faction faction = FactionList.get(pos); if (faction.id == 0) { - me.sendMessage(faction.getTag(me)+Conf.colorSystem+" "+faction.getFollowersWhereOnline(true).size() + " online"); + me.sendMessage(faction.getTag(me)+Conf.colorSystem+" "+faction.getFPlayersWhereOnline(true).size() + " online"); } else { - me.sendMessage(faction.getTag(me)+Conf.colorSystem+" "+faction.getFollowersWhereOnline(true).size()+"/"+faction.getFollowersAll().size()+" online, "+faction.getLandRounded()+"/"+faction.getPowerRounded()+"/"+faction.getPowerMaxRounded()); + me.sendMessage(faction.getTag(me)+Conf.colorSystem+" "+faction.getFPlayersWhereOnline(true).size()+"/"+faction.getFPlayers().size()+" online, "+faction.getLandRounded()+"/"+faction.getPowerRounded()+"/"+faction.getPowerMaxRounded()); } } } @@ -416,9 +417,9 @@ public class Commands { if (faction == null) { return; } - Collection admins = faction.getFollowersWhereRole(Role.ADMIN); - Collection mods = faction.getFollowersWhereRole(Role.MODERATOR); - Collection normals = faction.getFollowersWhereRole(Role.NORMAL); + Collection admins = faction.getFPlayersWhereRole(Role.ADMIN); + Collection mods = faction.getFPlayersWhereRole(Role.MODERATOR); + Collection normals = faction.getFPlayersWhereRole(Role.NORMAL); me.sendMessage(TextUtil.titleize(faction.getTag(me)), false); me.sendMessage(Conf.colorChrome+"Description: "+Conf.colorSystem+faction.getDescription()); diff --git a/src/com/bukkit/mcteam/factions/Coord.java b/src/com/bukkit/mcteam/factions/CoordOld.java similarity index 92% rename from src/com/bukkit/mcteam/factions/Coord.java rename to src/com/bukkit/mcteam/factions/CoordOld.java index 2ea4ecad..16345745 100644 --- a/src/com/bukkit/mcteam/factions/Coord.java +++ b/src/com/bukkit/mcteam/factions/CoordOld.java @@ -5,22 +5,22 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; -public class Coord { +public class CoordOld { protected static transient int cellSize = 16; public int x, z; - public Coord(int x, int z) { + public CoordOld(int x, int z) { this.x = x; this.z = z; } // TODO implements cloneable - public Coord(Coord coord) { + public CoordOld(Coord coord) { this.x = coord.x; this.z = coord.z; } - public Coord() { + public CoordOld() { // Noarg constructor for google gson. } diff --git a/src/com/bukkit/mcteam/factions/FLocation.java b/src/com/bukkit/mcteam/factions/FLocation.java new file mode 100644 index 00000000..7672b8cc --- /dev/null +++ b/src/com/bukkit/mcteam/factions/FLocation.java @@ -0,0 +1,101 @@ +package com.bukkit.mcteam.factions; + +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +public class FLocation { + + private String worldName = "world"; + private long x = 0; + private long z = 0; + + private final static transient double cellSize = 16; + + //----------------------------------------------// + // Constructors + //----------------------------------------------// + + public FLocation() { + + } + + public FLocation(String worldName, long x, long z) { + this.worldName = worldName; + this.x = x; + this.z = z; + } + + public FLocation(Location location) { + this(location.getWorld().getName(), (long) Math.floor(location.getX() / cellSize) , (long) Math.floor(location.getZ() / cellSize)); + } + + public FLocation(Player player) { + this(player.getLocation()); + } + + public FLocation(FPlayer fplayer) { + this(fplayer.getPlayer()); + } + + public FLocation(Block block) { + this(block.getLocation()); + } + + //----------------------------------------------// + // Getters and Setters + //----------------------------------------------// + + public String getWorldName() { + return worldName; + } + + public void setWorldName(String worldName) { + this.worldName = worldName; + } + + public long getX() { + return x; + } + + public void setX(long x) { + this.x = x; + } + + public long getZ() { + return z; + } + + public void setZ(long z) { + this.z = z; + } + + public String getCoordString() { + return ""+x+","+z; + } + + //----------------------------------------------// + // Misc + //----------------------------------------------// + + public FLocation getRelative(int dx, int dz) { + return new FLocation(this.worldName, this.x + dx, this.z + dz); + } + + //----------------------------------------------// + // Comparison + //----------------------------------------------// + + // TODO hash code + + @Override + public boolean equals(Object obj) { + if (obj == this) + return true; + if (!(obj instanceof FLocation)) + return false; + + FLocation o = (FLocation) obj; + return this.x == o.x && this.z == o.z && this.worldName.equals(o.worldName); + } +} \ No newline at end of file diff --git a/src/com/bukkit/mcteam/factions/FPlayer.java b/src/com/bukkit/mcteam/factions/FPlayer.java index 2af27483..726a3150 100644 --- a/src/com/bukkit/mcteam/factions/FPlayer.java +++ b/src/com/bukkit/mcteam/factions/FPlayer.java @@ -9,7 +9,8 @@ import java.util.Map.Entry; import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import com.bukkit.mcteam.factions.entities.EM; +import com.bukkit.mcteam.factions.struct.Relation; +import com.bukkit.mcteam.factions.struct.Role; import com.bukkit.mcteam.gson.reflect.TypeToken; import com.bukkit.mcteam.util.DiscUtil; @@ -18,7 +19,7 @@ public class FPlayer { public static transient File file = new File(Factions.instance.getDataFolder(), "players.json"); public transient String playername; - public transient Coord lastStoodInCoord = new Coord(); // Where did this player stand the last time we checked? + public transient FLocation lastStoodAt = new FLocation(); // Where did this player stand the last time we checked? public int factionId; public Role role; @@ -38,7 +39,17 @@ public class FPlayer { // GSON need this noarg constructor. public FPlayer() { - + this.resetFactionData(); + this.power = this.getPowerMax(); + this.lastPowerUpdateTime = System.currentTimeMillis(); + this.mapAutoUpdating = false; + } + + public void resetFactionData() { + this.factionId = 0; // The default neutral faction + this.factionChatting = false; + this.role = Role.NORMAL; + this.title = ""; } public Player getPlayer() { @@ -61,10 +72,6 @@ public class FPlayer { return ! isOnline(); } - - - - public boolean isFactionChatting() { if (this.factionId == 0) { return false; @@ -76,19 +83,7 @@ public class FPlayer { this.factionChatting = factionChatting; } - public FPlayer() { - this.resetFactionData(); - this.power = this.getPowerMax(); - this.lastPowerUpdateTime = System.currentTimeMillis(); - this.mapAutoUpdating = false; - } - - protected void resetFactionData() { - this.factionId = 0; // The default neutral faction - this.factionChatting = false; - this.role = Role.NORMAL; - this.title = ""; - } + public boolean isMapAutoUpdating() { return mapAutoUpdating; @@ -110,15 +105,15 @@ public class FPlayer { public void setTitle(String title) { this.title = title; - this.save(); + save(); } public String getName() { - return this.id; + return this.playername; } public String getTag() { - if (this.withoutFaction()) { + if ( ! this.hasFaction()) { return ""; } return this.getFaction().getTag(); @@ -180,7 +175,7 @@ public class FPlayer { // These are injected into the format of global chat messages. public String getChatTag() { - if (this.withoutFaction()) { + if ( ! this.hasFaction()) { return ""; } @@ -189,14 +184,14 @@ public class FPlayer { // Colored Chat Tag public String getChatTag(Faction faction) { - if (this.withoutFaction()) { + if ( ! this.hasFaction()) { return ""; } return this.getRelation(faction).getColor()+getChatTag(); } public String getChatTag(FPlayer follower) { - if (this.withoutFaction()) { + if ( ! this.hasFaction()) { return ""; } @@ -293,20 +288,16 @@ public class FPlayer { // Territory //----------------------------------------------// public boolean isInOwnTerritory() { - return Board.get(this.getPlayer().getWorld()).getFactionAt(this.getCoord()) == this.getFaction(); + return Board.getIdAt(new FLocation(this)) == this.factionId; } public boolean isInOthersTerritory() { - Faction factionHere = Board.get(this.getPlayer().getWorld()).getFactionAt(this.getCoord()); - return factionHere.id != 0 && factionHere != this.getFaction(); - } - - public Coord getCoord() { - return Coord.from(this); + int idHere = Board.getIdAt(new FLocation(this)); + return idHere != 0 && idHere != this.factionId; } public void sendFactionHereMessage() { - Faction factionHere = Board.get(this.getPlayer().getWorld()).getFactionAt(this.getCoord()); + Faction factionHere = Board.getFactionAt(new FLocation(this)); String msg = Conf.colorSystem+" ~ "+factionHere.getTag(this); if (factionHere.id != 0) { msg += " - "+factionHere.getDescription(); @@ -318,66 +309,12 @@ public class FPlayer { // Faction management //----------------------------------------------// public Faction getFaction() { - return EM.factionGet(factionId); + return Faction.get(factionId); } public boolean hasFaction() { return factionId != 0; } - public boolean withoutFaction() { - return factionId == 0; - } - - public ArrayList join(Faction faction) { - ArrayList errors = new ArrayList(); - if (faction.id == this.factionId) { - errors.add(Conf.colorSystem+"You are already a member of "+faction.getRelationColor(this)+faction.getTag()); - } - - if( ! faction.getOpen() && ! faction.isInvited(this)) { - errors.add(Conf.colorSystem+"This guild requires invitation."); - } - - if (this.hasFaction()) { - errors.add(Conf.colorSystem+"You must leave your current faction first."); - } - - if (errors.size() > 0) { - return errors; - } - - this.resetFactionData(); - if(faction.getFollowersAll().size() == 0) { - this.role = Role.ADMIN; - } else { - this.role = Role.NORMAL; - } - this.factionId = faction.id; - faction.deinvite(this); - this.save(); - - return errors; - } - - public ArrayList leave() { - ArrayList errors = new ArrayList(); - if (this.role == Role.ADMIN && this.getFaction().getFollowersAll().size() > 1) { - errors.add(Conf.colorSystem+"You must give the admin role to someone else first."); - } - - if(this.withoutFaction()) { - errors.add(Conf.colorSystem+"You are not member of any faction."); - } - - if (errors.size() > 0) { - return errors; - } - - this.resetFactionData(); - this.save(); - - return errors; - } public ArrayList invite(FPlayer follower) { ArrayList errors = new ArrayList(); @@ -430,30 +367,8 @@ public class FPlayer { return follower.getFaction().kick(follower); } - //----------------------------------------------// - // Login info - //----------------------------------------------// - public void sendJoinInfo() { // TODO Missplaced!? - // Do we even whant to use message of the day... - // Perhaps that is up to another plugin... - //this.getPlayer().sendMessage(ChatColor.GREEN + "This is a faction server! Type "+Conf.colorCommand+"/f"+ChatColor.GREEN +" for more info :D"); - } - - //----------------------------------------------// - // Search - //----------------------------------------------// - public static FPlayer find(String name) { // TODO felaktig! - for (FPlayer follower : EM.followerGetAll()) { - if (follower.getName().equalsIgnoreCase(name.trim())) { - return follower; - } - } - - return null; - } - // -------------------------------------------- // - // Get + // Get and search // You can only get a "skin" for online players. // The same object is always returned for the same player. // This means you can use the == operator. No .equals method necessary. @@ -473,6 +388,27 @@ public class FPlayer { return get(player.getName()); } + public static Set getAllOnline() { + Set fplayers = new HashSet(); + for (Player player : Factions.instance.getServer().getOnlinePlayers()) { + fplayers.add(FPlayer.get(player)); + } + return fplayers; + } + + public static Collection getAll() { + return instances.values(); + } + + public static FPlayer find(String playername) { + for (Entry entry : instances.entrySet()) { + if (entry.getKey().equalsIgnoreCase(playername)) { + return entry.getValue(); + } + } + return null; + } + // -------------------------------------------- // // Messages // -------------------------------------------- // @@ -486,23 +422,6 @@ public class FPlayer { } } - - //----------------------------------------------// - // Persistance and entity management - //----------------------------------------------// - /* - public boolean save() { - return EM.followerSave(this.id); - } - - public static FPlayer get(Player player) { - return EM.followerGet(player); - } - - public static Collection getAll() { - return EM.followerGetAll(); - } - */ // -------------------------------------------- // // Persistance // -------------------------------------------- // diff --git a/src/com/bukkit/mcteam/factions/Faction.java b/src/com/bukkit/mcteam/factions/Faction.java index dec839bb..30109554 100644 --- a/src/com/bukkit/mcteam/factions/Faction.java +++ b/src/com/bukkit/mcteam/factions/Faction.java @@ -83,7 +83,7 @@ public class Faction { //----------------------------------------------// public double getPower() { double ret = 0; - for (FPlayer follower : this.getFollowersAll()) { + for (FPlayer follower : this.getFPlayers()) { ret += follower.getPower(); } return ret; @@ -91,7 +91,7 @@ public class Faction { public double getPowerMax() { double ret = 0; - for (FPlayer follower : this.getFollowersAll()) { + for (FPlayer follower : this.getFPlayers()) { ret += follower.getPowerMax(); } return ret; @@ -166,7 +166,7 @@ public class Faction { // Followers // ------------------------------- - public ArrayList getFollowersAll() { + public ArrayList getFPlayers() { ArrayList ret = new ArrayList(); for (FPlayer follower : FPlayer.getAll()) { if (follower.factionId == this.id) { @@ -176,7 +176,7 @@ public class Faction { return ret; } - public ArrayList getFollowersWhereOnline(boolean online) { + public ArrayList getFPlayersWhereOnline(boolean online) { ArrayList ret = new ArrayList(); for (FPlayer follower : FPlayer.getAll()) { if (follower.factionId == this.id && follower.isOnline() == online) { @@ -186,7 +186,7 @@ public class Faction { return ret; } - public ArrayList getFollowersWhereRole(Role role) { + public ArrayList getFPlayersWhereRole(Role role) { ArrayList ret = new ArrayList(); for (FPlayer follower : FPlayer.getAll()) { diff --git a/src/com/bukkit/mcteam/factions/Factions.java b/src/com/bukkit/mcteam/factions/Factions.java index 8bfac69f..f27fca4d 100644 --- a/src/com/bukkit/mcteam/factions/Factions.java +++ b/src/com/bukkit/mcteam/factions/Factions.java @@ -4,7 +4,6 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; @@ -23,7 +22,6 @@ import com.bukkit.mcteam.factions.listeners.FactionsEntityListener; import com.bukkit.mcteam.factions.listeners.FactionsPlayerListener; import com.bukkit.mcteam.gson.Gson; import com.bukkit.mcteam.gson.GsonBuilder; -import com.bukkit.mcteam.gson.MapAsArrayTypeAdapter; import com.nijiko.permissions.PermissionHandler; import com.nijikokun.bukkit.Permissions.Permissions; @@ -39,7 +37,6 @@ public class Factions extends JavaPlugin { public final static Gson gson = new GsonBuilder() .setPrettyPrinting() .excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.VOLATILE) - .registerTypeAdapter(Map.class, new MapAsArrayTypeAdapter()) // a "must have" adapter for GSON .create(); private final FactionsPlayerListener playerListener = new FactionsPlayerListener(this); diff --git a/src/com/bukkit/mcteam/factions/commands/FCommand.java b/src/com/bukkit/mcteam/factions/commands/FCommand.java index 0059e5f8..f5e93d33 100644 --- a/src/com/bukkit/mcteam/factions/commands/FCommand.java +++ b/src/com/bukkit/mcteam/factions/commands/FCommand.java @@ -8,7 +8,9 @@ import org.bukkit.entity.Player; 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 FCommand { public List requiredParameters; @@ -22,7 +24,7 @@ public class FCommand { public CommandSender sender; public boolean senderMustBePlayer; public Player player; - public FPlayer fplayer; + public FPlayer me; public List parameters; @@ -69,7 +71,7 @@ public class FCommand { if (this.senderMustBePlayer) { this.player = (Player)sender; - this.fplayer = FPlayer.get(this.player); + this.me = FPlayer.get(this.player); } perform(); @@ -139,4 +141,72 @@ public class FCommand { Player player = (Player)sender; return Factions.Permissions.has(player, this.permissions); } + + // -------------------------------------------- // + // Commonly used logic + // -------------------------------------------- // + + public FPlayer findFPlayer(String playerName, boolean defaultToMe) { + FPlayer fp = FPlayer.find(playerName); + + if (fp == null) { + if (defaultToMe) { + return me; + } + sendMessage("The player \""+playerName+"\" could not be found"); + } + + return fp; + } + + public FPlayer findFPlayer(String playerName) { + return findFPlayer(playerName, false); + } + + + public Faction findFaction(String factionName, boolean defaultToMine) { + // First we search player names + FPlayer fp = FPlayer.find(factionName); + if (fp != null) { + return fp.getFaction(); + } + + // Secondly we search faction names + Faction faction = Faction.findByTag(factionName); + if (faction != null) { + return faction; + } + + if (defaultToMine) { + return me.getFaction(); + } + + me.sendMessage(Conf.colorSystem+"No faction or player \""+factionName+"\" was found"); + return null; + } + + public Faction findFaction(String factionName) { + return findFaction(factionName, false); + } + + public boolean canIAdministerYou(FPlayer i, FPlayer you) { + if ( ! i.getFaction().equals(you.getFaction())) { + i.sendMessage(you.getNameAndRelevant(i)+Conf.colorSystem+" is not in the same faction as you."); + return false; + } + + if (i.role.value > you.role.value || i.role.equals(Role.ADMIN) ) { + return true; + } + + if (you.role.equals(Role.ADMIN)) { + i.sendMessage(Conf.colorSystem+"Only the faction admin can do that."); + } else if (i.role.equals(Role.MODERATOR)) { + i.sendMessage(Conf.colorSystem+"Moderators can't control each other..."); + } else { + i.sendMessage(Conf.colorSystem+"You must be a faction moderator to do that."); + } + + return false; + } } diff --git a/src/com/bukkit/mcteam/factions/commands/FCommandCreate.java b/src/com/bukkit/mcteam/factions/commands/FCommandCreate.java new file mode 100644 index 00000000..ba49e723 --- /dev/null +++ b/src/com/bukkit/mcteam/factions/commands/FCommandCreate.java @@ -0,0 +1,59 @@ +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; +import com.bukkit.mcteam.factions.struct.Role; + +public class FCommandCreate extends FCommand { + + public FCommandCreate() { + requiredParameters = new ArrayList(); + optionalParameters = new ArrayList(); + requiredParameters.add("faction tag"); + + permissions = ""; + + senderMustBePlayer = true; + + helpNameAndParams = "create [faction tag]"; + helpDescription = "Create new faction"; + } + + public void perform() { + String tag = parameters.get(0); + + if (me.hasFaction()) { + sendMessage("You must leave your current faction first."); + return; + } + + if (Faction.isTagTaken(tag)) { + sendMessage("That tag is already in use."); + return; + } + + ArrayList tagValidationErrors = Faction.validateTag(tag); + if (tagValidationErrors.size() > 0) { + sendMessage(tagValidationErrors); + return; + } + + Faction faction = Faction.create(); + faction.setTag(tag); + me.role = Role.ADMIN; + me.factionId = faction.id; + Faction.save(); + FPlayer.save(); + + for (FPlayer follower : FPlayer.getAllOnline()) { + follower.sendMessage(me.getNameAndRelevant(follower)+Conf.colorSystem+" created a new faction "+faction.getTag(follower)); + } + + sendMessage("Now update your faction description. Use:"); + sendMessage(Conf.colorCommand+Conf.aliasBase.get(0)+" "+Conf.aliasDescription.get(0)+" "+"[description]"); + } + +} diff --git a/src/com/bukkit/mcteam/factions/commands/FCommandJoin.java b/src/com/bukkit/mcteam/factions/commands/FCommandJoin.java new file mode 100644 index 00000000..590b14f1 --- /dev/null +++ b/src/com/bukkit/mcteam/factions/commands/FCommandJoin.java @@ -0,0 +1,57 @@ +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; + +public class FCommandJoin extends FCommand { + + public FCommandJoin() { + requiredParameters = new ArrayList(); + optionalParameters = new ArrayList(); + requiredParameters.add("faction name"); + + permissions = ""; + + senderMustBePlayer = true; + + helpNameAndParams = "join [faction name]"; + helpDescription = "Join a faction"; + } + + public void perform() { + String factionName = parameters.get(0); + + Faction faction = findFaction(factionName); + if (faction == null) { + return; + } + + if (faction.id == me.factionId) { + sendMessage("You are already a member of "+faction.getTag(me)); + return; + } + + if (me.hasFaction()) { + sendMessage("You must leave your current faction first."); + return; + } + + if( ! faction.getOpen() && ! faction.isInvited(me)) { + sendMessage("This guild requires invitation."); + faction.sendMessage(me.getNameAndRelevant(faction)+Conf.colorSystem+" tried to join your faction."); + return; + } + + me.sendMessage(Conf.colorSystem+"You successfully joined "+faction.getTag(me)); + faction.sendMessage(me.getNameAndRelevant(faction)+Conf.colorSystem+" joined your faction."); + + me.resetFactionData(); + me.factionId = faction.id; + faction.deinvite(me); + FPlayer.save(); + } + +} diff --git a/src/com/bukkit/mcteam/factions/commands/FCommandLeave.java b/src/com/bukkit/mcteam/factions/commands/FCommandLeave.java index e6add17e..248268e6 100644 --- a/src/com/bukkit/mcteam/factions/commands/FCommandLeave.java +++ b/src/com/bukkit/mcteam/factions/commands/FCommandLeave.java @@ -2,11 +2,10 @@ package com.bukkit.mcteam.factions.commands; import java.util.ArrayList; -import org.bukkit.entity.Player; - import com.bukkit.mcteam.factions.Conf; import com.bukkit.mcteam.factions.FPlayer; import com.bukkit.mcteam.factions.Faction; +import com.bukkit.mcteam.factions.struct.Role; public class FCommandLeave extends FCommand { @@ -23,20 +22,26 @@ public class FCommandLeave extends FCommand { } public void perform() { - Faction faction = fplayer.getFaction(); - - ArrayList errors = fplayer.leave(); - fplayer.sendMessage(errors); - - if (errors.size() == 0) { - faction.sendMessage(fplayer.getNameAndRelevant(faction)+Conf.colorSystem+" left your faction."); - fplayer.sendMessage("You left "+faction.getTag(fplayer)); + if ( ! me.hasFaction()) { + sendMessage("You are not member of any faction."); + return; } - if (faction.getFollowersAll().size() == 0) { + Faction faction = me.getFaction(); + + if (me.role == Role.ADMIN && faction.getFPlayers().size() > 1) { + sendMessage("You must give the admin role to someone else first."); + return; + } + + faction.sendMessage(me.getNameAndRelevant(faction) + Conf.colorSystem + " left your faction."); + me.resetFactionData(); + FPlayer.save(); + + if (faction.getFPlayers().size() == 0) { // Remove this faction - for (FPlayer follower : FPlayer.getAll()) { - follower.sendMessage(Conf.colorSystem+"The faction "+faction.getTag(follower)+Conf.colorSystem+" was disbanded."); + for (FPlayer fplayer : FPlayer.getAllOnline()) { + fplayer.sendMessage("The faction "+faction.getTag(fplayer)+Conf.colorSystem+" was disbanded."); } Faction.delete(faction.id); } diff --git a/src/com/bukkit/mcteam/factions/entities/EM.java b/src/com/bukkit/mcteam/factions/entities/EMOld.java similarity index 99% rename from src/com/bukkit/mcteam/factions/entities/EM.java rename to src/com/bukkit/mcteam/factions/entities/EMOld.java index ba5b941b..517fe742 100644 --- a/src/com/bukkit/mcteam/factions/entities/EM.java +++ b/src/com/bukkit/mcteam/factions/entities/EMOld.java @@ -21,7 +21,7 @@ import com.bukkit.mcteam.gson.*; * Before using the the EM you should always EM.loadAll(). * The methods assume that all on disc is loaded into memory. */ -public class EM { +public class EMOld { protected static Map followers = new HashMap(); // Where String is a lowercase playername protected static Map factions = new HashMap(); // Where Integer is a primary auto increment key protected static Map boards = new HashMap(); // Where Long is the semi (sadly) unique world id. diff --git a/src/com/bukkit/mcteam/factions/listeners/FactionsPlayerListener.java b/src/com/bukkit/mcteam/factions/listeners/FactionsPlayerListener.java index a6273cd8..86639aba 100644 --- a/src/com/bukkit/mcteam/factions/listeners/FactionsPlayerListener.java +++ b/src/com/bukkit/mcteam/factions/listeners/FactionsPlayerListener.java @@ -131,14 +131,14 @@ public class FactionsPlayerListener extends PlayerListener{ FPlayer me = FPlayer.get(event.getPlayer()); // Did we change coord? - Coord coordFrom = me.lastStoodInCoord; + Coord coordFrom = me.lastStoodAt; Coord coordTo = Coord.from(event.getTo()); if (coordFrom.equals(coordTo)) { return; } // Yes we did change coord (: - me.lastStoodInCoord = coordTo; + me.lastStoodAt = coordTo; Board board = Board.get(event.getPlayer().getWorld()); if (me.isMapAutoUpdating()) { diff --git a/test.jpage b/test.jpage new file mode 100644 index 00000000..e69de29b