Factions3/src/com/massivecraft/factions/Board.java

355 lines
8.7 KiB
Java
Raw Normal View History

2011-07-18 22:06:02 +02:00
package com.massivecraft.factions;
2011-02-06 13:36:11 +01:00
import java.io.*;
2011-03-18 17:33:23 +01:00
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;
2011-03-23 12:45:21 +01:00
import java.util.TreeMap;
2011-02-06 13:36:11 +01:00
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.block.Block;
2011-07-18 22:06:02 +02:00
2011-07-27 22:56:45 +02:00
import com.google.gson.reflect.TypeToken;
import com.massivecraft.factions.iface.RelationParticipator;
2011-07-18 22:06:02 +02:00
import com.massivecraft.factions.util.AsciiCompass;
2011-10-08 23:22:02 +02:00
import com.massivecraft.factions.zcore.util.DiscUtil;
2011-02-06 13:36:11 +01:00
public class Board
{
private static transient File file = new File(P.p.getDataFolder(), "board.json");
2011-10-08 23:22:02 +02:00
private static transient HashMap<FLocation, String> flocationIds = new HashMap<FLocation, String>();
2011-03-18 17:33:23 +01:00
2011-03-19 13:00:03 +01:00
//----------------------------------------------//
// Get and Set
//----------------------------------------------//
2011-10-08 23:22:02 +02:00
public static String getIdAt(FLocation flocation)
{
if ( ! flocationIds.containsKey(flocation))
{
return "0";
2011-03-19 13:00:03 +01:00
}
2011-03-23 12:45:21 +01:00
return flocationIds.get(flocation);
2011-03-18 17:33:23 +01:00
}
2011-10-08 23:22:02 +02:00
public static Faction getFactionAt(FLocation flocation)
{
return Factions.i.get(getIdAt(flocation));
2011-02-06 13:36:11 +01:00
}
public static Faction getFactionAt(Location location)
{
return getFactionAt(new FLocation(location));
}
public static Faction getFactionAt(Block block)
{
return getFactionAt(new FLocation(block));
}
2011-02-06 13:36:11 +01:00
2011-10-08 23:22:02 +02:00
public static void setIdAt(String id, FLocation flocation)
{
if (id == "0")
{
2011-03-19 13:00:03 +01:00
removeAt(flocation);
}
2011-03-23 12:45:21 +01:00
flocationIds.put(flocation, id);
2011-02-06 13:36:11 +01:00
}
2011-10-08 23:22:02 +02: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-10-08 23:22:02 +02:00
public static void removeAt(FLocation flocation)
{
2011-03-23 12:45:21 +01:00
flocationIds.remove(flocation);
2011-02-06 13:36:11 +01:00
}
2011-04-08 16:22:00 +02:00
2011-10-08 23:22:02 +02:00
public static void unclaimAll(String factionId)
{
Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator();
while (iter.hasNext())
{
Entry<FLocation, String> entry = iter.next();
if (entry.getValue().equals(factionId))
{
2011-04-08 16:22:00 +02:00
iter.remove();
}
}
}
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-10-08 23:22:02 +02:00
public static boolean isBorderLocation(FLocation flocation)
{
2011-03-19 13:00:03 +01:00
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
}
// Is this coord connected to any coord claimed by the specified faction?
2011-10-08 23:22:02 +02:00
public static boolean isConnectedLocation(FLocation flocation, Faction faction)
{
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-10-08 23:22:02 +02:00
public static void clean()
{
Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator();
2011-03-23 12:45:21 +01:00
while (iter.hasNext()) {
2011-10-08 23:22:02 +02:00
Entry<FLocation, String> entry = iter.next();
if ( ! Factions.i.exists(entry.getValue()))
{
P.p.log("Board cleaner removed "+entry.getValue()+" from "+entry.getKey());
2011-03-23 12:45:21 +01:00
iter.remove();
}
}
}
2011-02-13 11:18:08 +01:00
//----------------------------------------------//
// Coord count
//----------------------------------------------//
2011-10-08 23:22:02 +02:00
public static int getFactionCoordCount(String factionId)
{
2011-02-06 13:36:11 +01:00
int ret = 0;
2011-10-08 23:22:02 +02:00
for (String thatFactionId : flocationIds.values())
{
if(thatFactionId.equals(factionId))
{
2011-03-23 12:45:21 +01:00
ret += 1;
2011-02-06 13:36:11 +01:00
}
}
return ret;
}
2011-02-13 11:18:08 +01:00
2011-10-08 23:22:02 +02: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-10-08 23:22:02 +02:00
public static int getFactionCoordCountInWorld(Faction faction, String worldName)
{
String factionId = faction.getId();
int ret = 0;
2011-10-08 23:22:02 +02:00
Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator();
while (iter.hasNext()) {
2011-10-08 23:22:02 +02:00
Entry<FLocation, String> entry = iter.next();
if (entry.getValue().equals(factionId) && entry.getKey().getWorldName().equals(worldName))
{
ret += 1;
}
}
return ret;
}
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(RelationParticipator observer, FLocation flocation, double inDegrees)
2011-10-08 23:22:02 +02:00
{
2011-02-06 13:36:11 +01:00
ArrayList<String> ret = new ArrayList<String>();
Faction factionLoc = getFactionAt(flocation);
ret.add(P.p.txt.titleize("("+flocation.getCoordString()+") "+factionLoc.getTag(observer)));
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;
2011-10-24 11:07:06 +02:00
//Make room for the list of tags
height--;
Map<Faction, Character> fList = new HashMap<Faction, Character>();
int chrIdx = 0;
2011-02-06 13:36:11 +01:00
// For each row
2011-10-22 17:18:44 +02:00
for (int dx = 0; dx < height; dx++)
{
2011-02-06 13:36:11 +01:00
// Draw and add that row
String row = "";
2011-10-22 17:18:44 +02:00
for (int dz = 0; dz > -width; dz--)
{
if(dz == -(halfWidth) && dx == halfHeight)
{
2011-02-06 13:36:11 +01:00
row += ChatColor.AQUA+"+";
continue;
}
FLocation flocationHere = topLeft.getRelative(dx, dz);
Faction factionHere = getFactionAt(flocationHere);
if (factionHere.isNone())
{
row += ChatColor.GRAY+"-";
2011-10-22 17:18:44 +02:00
}
2011-10-24 11:07:06 +02:00
else
2011-10-22 17:18:44 +02:00
{
2011-10-24 11:07:06 +02:00
if (!fList.containsKey(factionHere))
fList.put(factionHere, Conf.mapKeyChrs[chrIdx++]);
2011-10-24 11:07:06 +02:00
char fchar = fList.get(factionHere);
row += factionHere.getColorTo(observer) + "" + fchar;
2011-02-06 13:36:11 +01:00
}
}
ret.add(row);
}
// Get the compass
2011-10-08 23:22:02 +02:00
ArrayList<String> asciiCompass = AsciiCompass.getAsciiCompass(inDegrees, ChatColor.RED, P.p.txt.parse("<a>"));
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));
String fRow = "";
for(Faction keyfaction : fList.keySet())
{
2011-10-24 11:07:06 +02:00
fRow += ""+keyfaction.getColorTo(observer) + fList.get(keyfaction) + ": " + keyfaction.getTag() + " ";
}
2011-10-24 11:07:06 +02:00
fRow = fRow.trim();
ret.add(fRow);
2011-02-06 13:36:11 +01:00
return ret;
}
2011-03-18 17:33:23 +01:00
// -------------------------------------------- //
// Persistance
// -------------------------------------------- //
2011-10-22 17:18:44 +02:00
public static Map<String,Map<String,String>> dumpAsSaveFormat()
{
2011-10-08 23:22:02 +02:00
Map<String,Map<String,String>> worldCoordIds = new HashMap<String,Map<String,String>>();
2011-03-23 12:45:21 +01:00
2011-07-31 03:17:00 +02:00
String worldName, coords;
2011-10-08 23:22:02 +02:00
String id;
2011-07-31 03:17:00 +02:00
2011-10-22 17:18:44 +02:00
for (Entry<FLocation, String> entry : flocationIds.entrySet())
{
2011-07-31 03:17:00 +02:00
worldName = entry.getKey().getWorldName();
coords = entry.getKey().getCoordString();
id = entry.getValue();
2011-10-22 17:18:44 +02:00
if ( ! worldCoordIds.containsKey(worldName))
{
2011-10-08 23:22:02 +02:00
worldCoordIds.put(worldName, new TreeMap<String,String>());
2011-03-23 12:45:21 +01:00
}
worldCoordIds.get(worldName).put(coords, id);
}
return worldCoordIds;
}
2011-10-08 23:22:02 +02:00
public static void loadFromSaveFormat(Map<String,Map<String,String>> worldCoordIds)
{
2011-03-23 12:45:21 +01:00
flocationIds.clear();
2011-07-31 03:17:00 +02:00
String worldName;
String[] coords;
2011-10-08 23:22:02 +02:00
int x, z;
String factionId;
2011-07-31 03:17:00 +02:00
2011-10-08 23:22:02 +02:00
for (Entry<String,Map<String,String>> entry : worldCoordIds.entrySet())
{
2011-07-31 03:17:00 +02:00
worldName = entry.getKey();
2011-10-08 23:22:02 +02:00
for (Entry<String,String> entry2 : entry.getValue().entrySet())
{
2011-07-31 03:17:00 +02:00
coords = entry2.getKey().trim().split("[,\\s]+");
x = Integer.parseInt(coords[0]);
z = Integer.parseInt(coords[1]);
factionId = entry2.getValue();
2011-03-23 12:45:21 +01:00
flocationIds.put(new FLocation(worldName, x, z), factionId);
}
}
}
2011-10-08 23:22:02 +02:00
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
2011-10-08 23:22:02 +02:00
try
{
DiscUtil.write(file, P.p.gson.toJson(dumpAsSaveFormat()));
2011-10-08 23:22:02 +02:00
}
catch (Exception e)
{
2011-03-18 17:33:23 +01:00
e.printStackTrace();
2011-10-08 23:22:02 +02:00
P.p.log("Failed to save the board to disk.");
2011-03-18 17:33:23 +01:00
return false;
}
2011-03-23 12:45:21 +01:00
2011-03-18 17:33:23 +01:00
return true;
}
2011-10-08 23:22:02 +02:00
public static boolean load()
{
P.p.log("Loading board from disk");
2011-03-23 12:00:38 +01:00
2011-10-08 23:22:02 +02:00
if ( ! file.exists())
{
P.p.log("No board to load from disk. Creating new file.");
2011-03-18 17:33:23 +01:00
save();
return true;
}
2011-10-08 23:22:02 +02:00
try
{
Type type = new TypeToken<Map<String,Map<String,String>>>(){}.getType();
Map<String,Map<String,String>> worldCoordIds = P.p.gson.fromJson(DiscUtil.read(file), type);
2011-03-23 12:45:21 +01:00
loadFromSaveFormat(worldCoordIds);
2011-10-08 23:22:02 +02:00
}
catch (Exception e)
{
2011-03-18 17:33:23 +01:00
e.printStackTrace();
2011-10-08 23:22:02 +02:00
P.p.log("Failed to load the board from disk.");
2011-03-18 17:33:23 +01:00
return false;
}
return true;
}
2011-02-06 13:36:11 +01:00
}