mirror of
https://github.com/MassiveCraft/Factions.git
synced 2024-12-27 02:58:07 +01:00
Multiworld support
This commit is contained in:
parent
4316469ec1
commit
19e0628f27
@ -444,6 +444,7 @@ public class Commands {
|
||||
|
||||
|
||||
public static void showMap(Follower me, String mapAutoUpdating) {
|
||||
Board board = Board.get(me.getPlayer().getWorld());
|
||||
if (mapAutoUpdating.length() > 0) {
|
||||
if (Conf.aliasTrue.contains(mapAutoUpdating.toLowerCase())) {
|
||||
// Turn on
|
||||
@ -458,7 +459,7 @@ public class Commands {
|
||||
me.sendMessage(Conf.colorSystem + "Map auto update DISABLED.");
|
||||
}
|
||||
} else {
|
||||
me.sendMessage(Board.getMap(me.getFaction(), Coord.from(me), me.getPlayer().getLocation().getYaw()), false);
|
||||
me.sendMessage(board.getMap(me.getFaction(), Coord.from(me), me.getPlayer().getLocation().getYaw()), false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -618,7 +619,8 @@ public class Commands {
|
||||
}
|
||||
|
||||
Coord coord = Coord.from(me);
|
||||
Faction otherFaction = coord.getFaction();
|
||||
Board board = Board.get(me.getPlayer().getWorld());
|
||||
Faction otherFaction = board.getFactionAt(coord);
|
||||
Faction myFaction = me.getFaction();
|
||||
|
||||
if (myFaction.equals(otherFaction)) {
|
||||
@ -647,7 +649,7 @@ public class Commands {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! Board.isBorderCoord(coord)) {
|
||||
if ( ! board.isBorderCoord(coord)) {
|
||||
me.sendMessage(Conf.colorSystem+"You must start claiming land at the border of the territory.");
|
||||
return;
|
||||
}
|
||||
@ -662,7 +664,7 @@ public class Commands {
|
||||
myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" claimed some land from "+otherFaction.getTag(myFaction));
|
||||
}
|
||||
|
||||
Board.claim(coord, myFaction);
|
||||
board.claim(coord, myFaction);
|
||||
}
|
||||
|
||||
public static void unclaim(Follower me) {
|
||||
@ -677,13 +679,14 @@ public class Commands {
|
||||
}
|
||||
|
||||
Coord coord = Coord.from(me.getPlayer());
|
||||
Board board = Board.get(me.getPlayer().getWorld());
|
||||
|
||||
if ( ! me.getFaction().equals(coord.getFaction())) {
|
||||
if ( me.getFaction() != board.getFactionAt(coord)) {
|
||||
me.sendMessage(Conf.colorSystem+"You don't own this land.");
|
||||
return;
|
||||
}
|
||||
|
||||
Board.unclaim(coord);
|
||||
board.unclaim(coord);
|
||||
me.getFaction().sendMessage(me.getNameAndRelevant(me)+Conf.colorSystem+" unclaimed some land.");
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,7 @@ import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.World;
|
||||
|
||||
import com.bukkit.mcteam.factions.util.TextUtil;
|
||||
import com.bukkit.mcteam.util.AsciiCompass;
|
||||
@ -11,16 +12,17 @@ import com.bukkit.mcteam.util.AsciiCompass;
|
||||
//import com.bukkit.mcteam.factions.util.*;
|
||||
|
||||
public class Board {
|
||||
protected static Map<Coord, Integer> coordFactionIds;
|
||||
public transient Long id;
|
||||
protected Map<Coord, Integer> coordFactionIds;
|
||||
|
||||
static {
|
||||
public Board() {
|
||||
coordFactionIds = new HashMap<Coord, Integer>();
|
||||
}
|
||||
|
||||
public static Faction getFactionAt(Coord coord) {
|
||||
public Faction getFactionAt(Coord coord) {
|
||||
return Faction.get(getFactionIdAt(coord));
|
||||
}
|
||||
public static int getFactionIdAt(Coord coord) {
|
||||
public int getFactionIdAt(Coord coord) {
|
||||
Integer factionId = coordFactionIds.get(coord);
|
||||
if (factionId == null) {
|
||||
return 0; // No faction
|
||||
@ -28,12 +30,12 @@ public class Board {
|
||||
return factionId;
|
||||
}
|
||||
|
||||
public static void unclaim(Coord coord) {
|
||||
public void unclaim(Coord coord) {
|
||||
coordFactionIds.remove(coord);
|
||||
save();
|
||||
}
|
||||
|
||||
public static void claim(Coord coord, Faction faction) {
|
||||
public void claim(Coord coord, Faction faction) {
|
||||
coordFactionIds.put(coord, faction.id);
|
||||
save();
|
||||
}
|
||||
@ -41,19 +43,20 @@ public class Board {
|
||||
|
||||
// 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 static boolean isBorderCoord(Coord coord) {
|
||||
Faction faction = Board.getFactionAt(coord);
|
||||
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 != a.getFaction() || faction != b.getFaction() || faction != c.getFaction() || faction != d.getFaction();
|
||||
return faction != this.getFactionAt(a) || faction != this.getFactionAt(b) || faction != this.getFactionAt(c) || faction != this.getFactionAt(d);
|
||||
}
|
||||
|
||||
public static void purgeFaction(Faction faction) {
|
||||
purgeFaction(faction.id);
|
||||
}
|
||||
public static void purgeFaction(int factionId) {
|
||||
//----------------------------------------------//
|
||||
// Purge faction
|
||||
//----------------------------------------------//
|
||||
|
||||
public void purgeFaction(int factionId) {
|
||||
Iterator<Entry<Coord, Integer>> iter = coordFactionIds.entrySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Entry<Coord, Integer> entry = iter.next();
|
||||
@ -62,11 +65,24 @@ public class Board {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static int getFactionCoordCount(Faction faction) {
|
||||
return getFactionCoordCount(faction.id);
|
||||
public void purgeFaction(Faction faction) {
|
||||
purgeFaction(faction.id);
|
||||
}
|
||||
public static int getFactionCoordCount(int factionId) {
|
||||
|
||||
public static void purgeFactionFromAllBoards(int factionId) {
|
||||
for (Board board : getAll()) {
|
||||
board.purgeFaction(factionId);
|
||||
}
|
||||
}
|
||||
public static void purgeFactionFromAllBoards(Faction faction) {
|
||||
purgeFactionFromAllBoards(faction.id);
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Coord count
|
||||
//----------------------------------------------//
|
||||
|
||||
public int getFactionCoordCount(int factionId) {
|
||||
int ret = 0;
|
||||
for (int thatFactionId : coordFactionIds.values()) {
|
||||
if(thatFactionId == factionId) {
|
||||
@ -75,6 +91,21 @@ public class Board {
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------//
|
||||
// Map generation
|
||||
@ -85,9 +116,9 @@ public class Board {
|
||||
* north is in the direction of decreasing x
|
||||
* east is in the direction of decreasing z
|
||||
*/
|
||||
public static ArrayList<String> getMap(Faction faction, Coord coord, double inDegrees) {
|
||||
public ArrayList<String> getMap(Faction faction, Coord coord, double inDegrees) {
|
||||
ArrayList<String> ret = new ArrayList<String>();
|
||||
ret.add(TextUtil.titleize("("+coord+") "+coord.getFaction().getTag(faction)));
|
||||
ret.add(TextUtil.titleize("("+coord+") "+this.getFactionAt(coord).getTag(faction)));
|
||||
|
||||
int halfWidth = Conf.mapWidth / 2;
|
||||
int halfHeight = Conf.mapHeight / 2;
|
||||
@ -104,7 +135,7 @@ public class Board {
|
||||
row += ChatColor.AQUA+"+";
|
||||
} else {
|
||||
Coord coordHere = topLeft.getRelative(dx, dz);
|
||||
Faction factionHere = coordHere.getFaction();
|
||||
Faction factionHere = this.getFactionAt(coordHere);
|
||||
if (factionHere.id == 0) {
|
||||
row += ChatColor.GRAY+"-";
|
||||
} else {
|
||||
@ -131,8 +162,16 @@ public class Board {
|
||||
// Persistance
|
||||
//----------------------------------------------//
|
||||
|
||||
public static boolean save() {
|
||||
return EM.boardSave();
|
||||
public boolean save() {
|
||||
return EM.boardSave(this.id);
|
||||
}
|
||||
|
||||
public static Board get(World world) {
|
||||
return EM.boardGet(world);
|
||||
}
|
||||
|
||||
public static Collection<Board> getAll() {
|
||||
return EM.boardGetAll();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,10 +47,6 @@ public class Coord {
|
||||
return from(block.getX(), block.getZ());
|
||||
}
|
||||
|
||||
public Faction getFaction() {
|
||||
return Board.getFactionAt(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.x + "," + this.z;
|
||||
|
@ -4,6 +4,7 @@ import java.io.*;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.*;
|
||||
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.bukkit.mcteam.factions.Factions;
|
||||
@ -19,6 +20,7 @@ import com.google.gson.*;
|
||||
public class EM {
|
||||
protected static Map<String, Follower> followers = new HashMap<String, Follower>(); // Where String is a lowercase playername
|
||||
protected static Map<Integer, Faction> factions = new HashMap<Integer, Faction>(); // Where Integer is a primary auto increment key
|
||||
protected static Map<Long, Board> boards = new HashMap<Long, Board>(); // Where Long is the semi (sadly) unique world id.
|
||||
protected static int nextFactionId;
|
||||
|
||||
// hardcoded config
|
||||
@ -26,8 +28,8 @@ public class EM {
|
||||
protected final static File folderBase = Factions.folder;
|
||||
protected final static File folderFaction = new File(folderBase, "faction");
|
||||
protected final static File folderFollower = new File(folderBase, "follower");
|
||||
protected final static File folderBoard = new File(folderBase, "board");
|
||||
protected final static File fileConfig = new File(folderBase, "conf"+ext);
|
||||
protected final static File fileBoard = new File(folderBase, "board"+ext);
|
||||
|
||||
public final static Gson gson = new GsonBuilder()
|
||||
.setPrettyPrinting()
|
||||
@ -39,7 +41,7 @@ public class EM {
|
||||
folderBase.mkdirs();
|
||||
configLoad();
|
||||
Log.threshold = Conf.logThreshold;
|
||||
boardLoad();
|
||||
boardLoadAll();
|
||||
followerLoadAll();
|
||||
factionLoadAll();
|
||||
}
|
||||
@ -80,7 +82,7 @@ public class EM {
|
||||
//----------------------------------------------//
|
||||
// Board methods (load, save)
|
||||
//----------------------------------------------//
|
||||
public static boolean boardLoad() {
|
||||
/*public static boolean boardLoad() {
|
||||
if (fileBoard.exists()) {
|
||||
try {
|
||||
gson.fromJson(DiscUtil.read(fileBoard), Board.class);
|
||||
@ -108,6 +110,85 @@ public class EM {
|
||||
Log.warn("Failed to save the board");
|
||||
return false;
|
||||
}
|
||||
}*/
|
||||
|
||||
//----------------------------------------------//
|
||||
// Board methods (loadAll, get, save)
|
||||
//----------------------------------------------//
|
||||
|
||||
/**
|
||||
* This method loads all boards from disc into memory.
|
||||
*/
|
||||
public static void boardLoadAll() {
|
||||
Log.info("Loading all boards from disc...");
|
||||
folderBoard.mkdirs();
|
||||
|
||||
class jsonFileFilter implements FileFilter {
|
||||
public boolean accept(File file) {
|
||||
return (file.getName().toLowerCase().endsWith(ext) && file.isFile());
|
||||
}
|
||||
}
|
||||
|
||||
File[] jsonFiles = folderBoard.listFiles(new jsonFileFilter());
|
||||
|
||||
for (File jsonFile : jsonFiles) {
|
||||
// Extract the name from the filename. The name is filename minus ".json"
|
||||
String name = jsonFile.getName();
|
||||
name = name.substring(0, name.length() - ext.length());
|
||||
try {
|
||||
Board board = gson.fromJson(DiscUtil.read(jsonFile), Board.class);
|
||||
board.id = Long.parseLong(name);
|
||||
boards.put(board.id, board);
|
||||
Log.debug("loaded board "+name);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.warn("failed to load board "+name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Collection<Board> boardGetAll() {
|
||||
return boards.values();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the board object for a world
|
||||
* A new Board will be created if the world did not have one
|
||||
*/
|
||||
public static Board boardGet(World world) {
|
||||
if (boards.containsKey(world.getId())) {
|
||||
return boards.get(world.getId());
|
||||
}
|
||||
|
||||
return boardCreate(world);
|
||||
}
|
||||
|
||||
public static boolean boardSave(long id) {
|
||||
Object obj = boards.get(id);
|
||||
if (obj == null) {
|
||||
Log.warn("Could not save board "+id+" as it was not loaded");
|
||||
return false;
|
||||
}
|
||||
folderBoard.mkdirs();
|
||||
File file = new File(folderBoard, id+ext);
|
||||
try {
|
||||
DiscUtil.write(file, gson.toJson(obj));
|
||||
Log.debug("Saved the board "+id);
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Log.warn("Failed to save the board "+id);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
protected static Board boardCreate(World world) {
|
||||
Log.debug("Creating new board "+world.getId());
|
||||
Board board = new Board();
|
||||
board.id = world.getId();
|
||||
boards.put(board.id, board);
|
||||
board.save();
|
||||
return board;
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
@ -273,8 +354,8 @@ public class EM {
|
||||
// NOTE that this does not do any security checks.
|
||||
// Follower might get orphaned foreign id's
|
||||
|
||||
// purge from board
|
||||
Board.purgeFaction(id);
|
||||
// purge from all boards
|
||||
Board.purgeFactionFromAllBoards(id);
|
||||
|
||||
// Remove the file
|
||||
File file = new File(folderFaction, id+ext);
|
||||
|
@ -98,7 +98,7 @@ public class Faction {
|
||||
}
|
||||
|
||||
public int getLandRounded() {
|
||||
return Board.getFactionCoordCount(this);
|
||||
return Board.getFactionCoordCountAllBoards(this);
|
||||
}
|
||||
|
||||
public boolean hasLandInflation() {
|
||||
|
@ -257,11 +257,11 @@ public class Follower {
|
||||
// Territory
|
||||
//----------------------------------------------//
|
||||
public boolean isInOwnTerritory() {
|
||||
return Board.getFactionAt(this.getCoord()) == this.getFaction();
|
||||
return Board.get(this.getPlayer().getWorld()).getFactionAt(this.getCoord()) == this.getFaction();
|
||||
}
|
||||
|
||||
public boolean isInOthersTerritory() {
|
||||
Faction factionHere = Board.getFactionAt(this.getCoord());
|
||||
Faction factionHere = Board.get(this.getPlayer().getWorld()).getFactionAt(this.getCoord());
|
||||
return factionHere.id != 0 && factionHere != this.getFaction();
|
||||
}
|
||||
|
||||
@ -270,7 +270,7 @@ public class Follower {
|
||||
}
|
||||
|
||||
public void sendFactionHereMessage() {
|
||||
Faction factionHere = Board.getFactionAt(this.getCoord());
|
||||
Faction factionHere = Board.get(this.getPlayer().getWorld()).getFactionAt(this.getCoord());
|
||||
String msg = Conf.colorSystem+" ~ "+factionHere.getTag(this);
|
||||
if (factionHere.id != 0) {
|
||||
msg += " - "+factionHere.getDescription();
|
||||
|
@ -41,7 +41,7 @@ public class FactionsBlockListener extends BlockListener {
|
||||
|
||||
public boolean playerCanBuildDestroyBlock(Player player, Block block, String action) {
|
||||
Coord coord = Coord.parseCoord(block);
|
||||
Faction otherFaction = coord.getFaction();
|
||||
Faction otherFaction = Board.get(player.getWorld()).getFactionAt(coord);
|
||||
|
||||
if (otherFaction.id == 0) {
|
||||
return true; // This is no faction territory. You may build or break stuff here.
|
||||
@ -90,7 +90,7 @@ public class FactionsBlockListener extends BlockListener {
|
||||
Follower me = Follower.get(player);
|
||||
Faction myFaction = me.getFaction();
|
||||
Coord blockCoord = Coord.from(block.getLocation());
|
||||
Faction otherFaction = blockCoord.getFaction();
|
||||
Faction otherFaction = Board.get(player.getWorld()).getFactionAt(blockCoord);
|
||||
|
||||
if (otherFaction.id != 0 && myFaction != otherFaction) {
|
||||
me.sendMessage(Conf.colorSystem+"You can't use "+TextUtil.getMaterialName(material)+" in the territory of "+otherFaction.getTag(myFaction));
|
||||
|
@ -131,13 +131,16 @@ public class FactionsPlayerListener extends PlayerListener{
|
||||
|
||||
// Yes we did change coord (:
|
||||
Follower me = Follower.get(event.getPlayer());
|
||||
Board board = Board.get(event.getPlayer().getWorld());
|
||||
|
||||
Log.debug("Player "+me.getName()+" is in world: "+board.id);
|
||||
|
||||
if (me.isMapAutoUpdating()) {
|
||||
me.sendMessage(Board.getMap(me.getFaction(), Coord.from(me), me.getPlayer().getLocation().getYaw()), false);
|
||||
me.sendMessage(board.getMap(me.getFaction(), Coord.from(me), me.getPlayer().getLocation().getYaw()), false);
|
||||
} else {
|
||||
// Did we change "host"(faction)?
|
||||
Faction factionFrom = Board.getFactionAt(coordFrom);
|
||||
Faction factionTo = Board.getFactionAt(coordTo);
|
||||
Faction factionFrom = board.getFactionAt(coordFrom);
|
||||
Faction factionTo = board.getFactionAt(coordTo);
|
||||
if ( factionFrom != factionTo) {
|
||||
me.sendFactionHereMessage();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user