Saber-Factions/src/com/bukkit/mcteam/factions/Board.java

224 lines
6.2 KiB
Java
Raw Normal View History

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
2011-03-23 12:00:38 +01:00
// TODO rework to use single layer hash map and convert from and to the formay while saving and loading!!
2011-02-06 13:36:11 +01:00
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);
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
}
2011-03-19 13:00:03 +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 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
*/
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-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-22 22:31:04 +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() {
2011-03-23 12:00:38 +01:00
Factions.log("Loading board from disk");
2011-03-18 17:33:23 +01:00
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
}