2011-03-18 17:33:23 +01:00
|
|
|
package com.bukkit.mcteam.factions;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
import java.io.File;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.lang.reflect.Type;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.Map;
|
2011-02-06 13:36:11 +01:00
|
|
|
import java.util.Map.Entry;
|
|
|
|
|
|
|
|
import org.bukkit.ChatColor;
|
|
|
|
|
|
|
|
import com.bukkit.mcteam.factions.util.TextUtil;
|
2011-03-18 17:33:23 +01:00
|
|
|
import com.bukkit.mcteam.gson.reflect.TypeToken;
|
2011-02-06 13:36:11 +01:00
|
|
|
import com.bukkit.mcteam.util.AsciiCompass;
|
2011-03-18 17:33:23 +01:00
|
|
|
import com.bukkit.mcteam.util.DiscUtil;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
|
|
|
//import com.bukkit.mcteam.factions.util.*;
|
|
|
|
|
|
|
|
public class Board {
|
2011-03-19 13:00:03 +01:00
|
|
|
protected static transient File file = new File(Factions.instance.getDataFolder(), "board.json");
|
|
|
|
private static Map<String,Map<String,Integer>> worldCoordIds = new HashMap<String,Map<String,Integer>>();
|
2011-03-18 17:33:23 +01:00
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
//----------------------------------------------//
|
|
|
|
// Get and Set
|
|
|
|
//----------------------------------------------//
|
|
|
|
public static int getIdAt(FLocation flocation) {
|
|
|
|
if ( ! worldCoordIds.containsKey(flocation.getWorldName())) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! worldCoordIds.get(flocation.getWorldName()).containsKey(flocation.getCoordString()) ) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return worldCoordIds.get(flocation.getWorldName()).get(flocation.getCoordString());
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public static Faction getFactionAt(FLocation flocation) {
|
|
|
|
return Faction.get(getIdAt(flocation));
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public static void setIdAt(int id, FLocation flocation) {
|
|
|
|
if (id == 0) {
|
|
|
|
removeAt(flocation);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! worldCoordIds.containsKey(flocation.getWorldName())) {
|
|
|
|
worldCoordIds.put(flocation.getWorldName(), new HashMap<String,Integer>());
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
2011-03-19 13:00:03 +01:00
|
|
|
|
|
|
|
worldCoordIds.get(flocation.getWorldName()).put(flocation.getCoordString(), id);
|
|
|
|
save();
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public static void setFactionAt(Faction faction, FLocation flocation) {
|
2011-03-22 17:20:21 +01:00
|
|
|
setIdAt(faction.getId(), flocation);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public static void removeAt(FLocation flocation) {
|
|
|
|
if ( ! worldCoordIds.containsKey(flocation.getWorldName())) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
worldCoordIds.get(flocation.getWorldName()).remove(flocation.getCoordString());
|
2011-02-06 13:36:11 +01:00
|
|
|
save();
|
|
|
|
}
|
2011-03-19 13:00:03 +01:00
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
// 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?
|
2011-03-19 13:00:03 +01:00
|
|
|
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);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
|
2011-02-13 11:18:08 +01:00
|
|
|
//----------------------------------------------//
|
2011-03-19 13:00:03 +01:00
|
|
|
// Cleaner. Remove orphaned foreign keys
|
2011-02-13 11:18:08 +01:00
|
|
|
//----------------------------------------------//
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public static void clean() {
|
|
|
|
for (String worldName : worldCoordIds.keySet()) {
|
|
|
|
Iterator<Entry<String, Integer>> iter = worldCoordIds.get(worldName).entrySet().iterator();
|
|
|
|
while (iter.hasNext()) {
|
|
|
|
Entry<String, Integer> 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();
|
|
|
|
}
|
2011-02-13 15:18:23 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-02-13 11:18:08 +01:00
|
|
|
//----------------------------------------------//
|
|
|
|
// Coord count
|
|
|
|
//----------------------------------------------//
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public static int getFactionCoordCount(int factionId) {
|
2011-02-06 13:36:11 +01:00
|
|
|
int ret = 0;
|
2011-03-19 13:00:03 +01:00
|
|
|
for (Map<String, Integer> coordIds : worldCoordIds.values()) {
|
|
|
|
for (int thatFactionId : coordIds.values()) {
|
|
|
|
if(thatFactionId == factionId) {
|
|
|
|
ret += 1;
|
|
|
|
}
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
2011-02-13 11:18:08 +01:00
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public static int getFactionCoordCount(Faction faction) {
|
2011-03-22 17:20:21 +01:00
|
|
|
return getFactionCoordCount(faction.getId());
|
2011-02-13 11:18:08 +01:00
|
|
|
}
|
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
//----------------------------------------------//
|
|
|
|
// Map generation
|
|
|
|
//----------------------------------------------//
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The map is relative to a coord and a faction
|
|
|
|
* north is in the direction of decreasing x
|
|
|
|
* east is in the direction of decreasing z
|
|
|
|
*/
|
2011-03-22 15:45:41 +01:00
|
|
|
public static ArrayList<String> getMap(Faction faction, FLocation flocation, double inDegrees) {
|
2011-02-06 13:36:11 +01:00
|
|
|
ArrayList<String> ret = new ArrayList<String>();
|
2011-03-22 19:25:11 +01:00
|
|
|
ret.add(TextUtil.titleize("("+flocation.getCoordString()+") "+getFactionAt(flocation).getTag(faction)));
|
2011-02-06 13:36:11 +01:00
|
|
|
|
|
|
|
int halfWidth = Conf.mapWidth / 2;
|
|
|
|
int halfHeight = Conf.mapHeight / 2;
|
2011-03-19 13:00:03 +01:00
|
|
|
FLocation topLeft = flocation.getRelative(-halfHeight, halfWidth);
|
2011-02-06 13:36:11 +01:00
|
|
|
int width = halfWidth * 2 + 1;
|
|
|
|
int height = halfHeight * 2 + 1;
|
|
|
|
|
|
|
|
// For each row
|
|
|
|
for (int dx = 0; dx < height; dx++) {
|
|
|
|
// Draw and add that row
|
|
|
|
String row = "";
|
|
|
|
for (int dz = 0; dz > -width; dz--) {
|
|
|
|
if(dz == -(halfWidth) && dx == halfHeight) {
|
|
|
|
row += ChatColor.AQUA+"+";
|
|
|
|
} else {
|
2011-03-19 13:00:03 +01:00
|
|
|
FLocation flocationHere = topLeft.getRelative(dx, dz);
|
|
|
|
Faction factionHere = getFactionAt(flocationHere);
|
2011-03-22 17:20:21 +01:00
|
|
|
if (factionHere.getId() == 0) {
|
2011-02-06 13:36:11 +01:00
|
|
|
row += ChatColor.GRAY+"-";
|
|
|
|
} else {
|
|
|
|
row += factionHere.getRelation(faction).getColor()+"+";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ret.add(row);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the compass
|
|
|
|
ArrayList<String> asciiCompass = AsciiCompass.getAsciiCompass(inDegrees, ChatColor.RED, Conf.colorChrome);
|
2011-02-07 21:42:14 +01:00
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
// Add the compass
|
|
|
|
ret.set(1, asciiCompass.get(0)+ret.get(1).substring(3*3));
|
|
|
|
ret.set(2, asciiCompass.get(1)+ret.get(2).substring(3*3));
|
|
|
|
ret.set(3, asciiCompass.get(2)+ret.get(3).substring(3*3));
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Persistance
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
public static boolean save() {
|
2011-03-19 13:00:03 +01:00
|
|
|
Factions.log("Saving board to disk");
|
2011-03-18 17:33:23 +01:00
|
|
|
|
|
|
|
try {
|
2011-03-19 13:00:03 +01:00
|
|
|
DiscUtil.write(file, Factions.gson.toJson(worldCoordIds));
|
2011-03-18 17:33:23 +01:00
|
|
|
} catch (IOException e) {
|
2011-03-19 13:00:03 +01:00
|
|
|
Factions.log("Failed to save the board to disk.");
|
2011-03-18 17:33:23 +01:00
|
|
|
e.printStackTrace();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean load() {
|
|
|
|
if ( ! file.exists()) {
|
2011-03-19 13:00:03 +01:00
|
|
|
Factions.log("No board to load from disk. Creating new file.");
|
2011-03-18 17:33:23 +01:00
|
|
|
save();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2011-03-19 13:00:03 +01:00
|
|
|
Type type = new TypeToken<Map<String,Map<String,Integer>>>(){}.getType();
|
|
|
|
worldCoordIds = Factions.gson.fromJson(DiscUtil.read(file), type);
|
2011-03-18 17:33:23 +01:00
|
|
|
} catch (IOException e) {
|
2011-03-19 13:00:03 +01:00
|
|
|
Factions.log("Failed to load the board from disk.");
|
2011-03-18 17:33:23 +01:00
|
|
|
e.printStackTrace();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|