Started the refactoring
This commit is contained in:
parent
35d7985fb2
commit
1da8b6b30a
@ -1,23 +1,38 @@
|
||||
package com.bukkit.mcteam.factions.entities;
|
||||
package com.bukkit.mcteam.factions;
|
||||
|
||||
import java.util.*;
|
||||
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;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.World;
|
||||
|
||||
import com.bukkit.mcteam.factions.util.Log;
|
||||
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;
|
||||
import com.bukkit.mcteam.util.DiscUtil;
|
||||
|
||||
//import com.bukkit.mcteam.factions.util.*;
|
||||
|
||||
public class Board {
|
||||
protected static transient Map<String, Board> instances = new HashMap<String, Board>();
|
||||
protected static transient File file = new File(Factions.instance.getDataFolder(), "boards.json");
|
||||
|
||||
public transient String worldName;
|
||||
protected Map<Coord, Integer> coordFactionIds;
|
||||
protected Map<Coord, Integer> coordFactionIds = new HashMap<Coord, Integer>();
|
||||
|
||||
public Board() {
|
||||
coordFactionIds = new HashMap<Coord, Integer>();
|
||||
|
||||
}
|
||||
|
||||
public Board(String worldName) {
|
||||
this.worldName = worldName;
|
||||
}
|
||||
|
||||
public Faction getFactionAt(Coord coord) {
|
||||
@ -64,7 +79,7 @@ public class Board {
|
||||
while (iter.hasNext()) {
|
||||
Entry<Coord, Integer> entry = iter.next();
|
||||
if ( ! EM.factionExists(entry.getValue())) {
|
||||
Log.debug("Cleaner removed coord with non existing factionId "+entry.getValue());
|
||||
Factions.log("Cleaner removed coord with non existing factionId "+entry.getValue());
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
@ -72,37 +87,11 @@ public class Board {
|
||||
|
||||
public static void cleanAll() {
|
||||
for (Board board : getAll()) {
|
||||
Log.debug("Cleaning board for world "+board.worldName);
|
||||
Factions.log("Cleaning board for world "+board.worldName);
|
||||
board.clean();
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Purge faction Currently skipped and we use clean instead as that will solve orphaned keys to :)
|
||||
//----------------------------------------------//
|
||||
/*
|
||||
public void purgeFaction(int factionId) {
|
||||
Iterator<Entry<Coord, Integer>> iter = coordFactionIds.entrySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Entry<Coord, Integer> entry = iter.next();
|
||||
if (entry.getValue().equals(factionId)) {
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
public void purgeFaction(Faction faction) {
|
||||
purgeFaction(faction.id);
|
||||
}
|
||||
|
||||
public static void purgeFactionFromAllBoards(int factionId) {
|
||||
for (Board board : getAll()) {
|
||||
board.purgeFaction(factionId);
|
||||
}
|
||||
}
|
||||
public static void purgeFactionFromAllBoards(Faction faction) {
|
||||
purgeFactionFromAllBoards(faction.id);
|
||||
}*/
|
||||
|
||||
//----------------------------------------------//
|
||||
// Coord count
|
||||
//----------------------------------------------//
|
||||
@ -186,7 +175,7 @@ public class Board {
|
||||
// Persistance
|
||||
//----------------------------------------------//
|
||||
|
||||
public boolean save() {
|
||||
/*public boolean save() {
|
||||
return EM.boardSave(this.worldName);
|
||||
}
|
||||
|
||||
@ -196,6 +185,80 @@ public class Board {
|
||||
|
||||
public static Collection<Board> getAll() {
|
||||
return EM.boardGetAll();
|
||||
}*/
|
||||
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Persistance
|
||||
// -------------------------------------------- //
|
||||
|
||||
public boolean shouldBeSaved() {
|
||||
return this.coordFactionIds.size() > 0;
|
||||
}
|
||||
|
||||
public static boolean save() {
|
||||
Factions.log("Saving boards to disk");
|
||||
|
||||
Map<String, Board> instancesToSave = new HashMap<String, Board>();
|
||||
for (Entry<String, Board> entry : instances.entrySet()) {
|
||||
if (entry.getValue().shouldBeSaved()) {
|
||||
instancesToSave.put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
DiscUtil.write(file, Factions.gson.toJson(instancesToSave));
|
||||
} catch (IOException e) {
|
||||
Factions.log("Failed to save the boards to disk.");
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean load() {
|
||||
if ( ! file.exists()) {
|
||||
Factions.log("No boards to load from disk. Creating new file.");
|
||||
save();
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
Type type = new TypeToken<Map<String, Board>>(){}.getType();
|
||||
instances = Factions.gson.fromJson(DiscUtil.read(file), type);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
||||
fillNames();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void fillNames() {
|
||||
for(Entry<String, Board> 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<Board> getAll() {
|
||||
return instances.values();
|
||||
}
|
||||
}
|
||||
|
@ -98,12 +98,12 @@ public class Commands {
|
||||
|
||||
// Update to work with tag and follower names
|
||||
|
||||
public static Follower findFollower(Follower me, String name, boolean defaultsToMe) {
|
||||
public static FPlayer findFollower(FPlayer me, String name, boolean defaultsToMe) {
|
||||
if (name.length() == 0 && defaultsToMe) {
|
||||
return me;
|
||||
}
|
||||
|
||||
Follower follower = Follower.find(name);
|
||||
FPlayer follower = FPlayer.find(name);
|
||||
if (follower != null) {
|
||||
return follower;
|
||||
}
|
||||
@ -112,13 +112,13 @@ public class Commands {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Faction findFaction(Follower me, String name, boolean defaultsToMe) {
|
||||
public static Faction findFaction(FPlayer me, String name, boolean defaultsToMe) {
|
||||
if (name.length() == 0 && defaultsToMe) {
|
||||
return me.getFaction();
|
||||
}
|
||||
|
||||
// Search player names
|
||||
Follower follower = Follower.find(name);
|
||||
FPlayer follower = FPlayer.find(name);
|
||||
if (follower != null) {
|
||||
return follower.getFaction();
|
||||
}
|
||||
@ -133,7 +133,7 @@ public class Commands {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean canIAdministerYou(Follower i, Follower you) {
|
||||
public static 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;
|
||||
@ -158,7 +158,7 @@ public class Commands {
|
||||
// The base command
|
||||
//----------------------------------------------//
|
||||
|
||||
public static void base(Follower me, ArrayList<String> tokens) {
|
||||
public static void base(FPlayer me, ArrayList<String> tokens) {
|
||||
if (tokens.size() == 0) {
|
||||
help(me);
|
||||
return;
|
||||
@ -230,11 +230,11 @@ public class Commands {
|
||||
//----------------------------------------------//
|
||||
// The other commands
|
||||
//----------------------------------------------//
|
||||
public static void help(Follower me) {
|
||||
public static void help(FPlayer me) {
|
||||
help(me, 1);
|
||||
}
|
||||
|
||||
public static void help(Follower me, Integer page) {
|
||||
public static void help(FPlayer me, Integer page) {
|
||||
me.sendMessage(TextUtil.titleize("Factions Help ("+page+"/"+helpPages.size()+")"), false);
|
||||
page -= 1;
|
||||
if (page < 0 || page >= helpPages.size()) {
|
||||
@ -244,7 +244,7 @@ public class Commands {
|
||||
me.sendMessage(helpPages.get(page), false);
|
||||
}
|
||||
|
||||
public static void leave(Follower me) {
|
||||
public static void leave(FPlayer me) {
|
||||
Faction faction = me.getFaction();
|
||||
|
||||
ArrayList<String> errors = me.leave();
|
||||
@ -257,14 +257,14 @@ public class Commands {
|
||||
|
||||
if (faction.getFollowersAll().size() == 0) {
|
||||
// Remove this faction
|
||||
for (Follower follower : Follower.getAll()) {
|
||||
for (FPlayer follower : FPlayer.getAll()) {
|
||||
follower.sendMessage(Conf.colorSystem+"The faction "+faction.getTag(follower)+Conf.colorSystem+" was disbanded.");
|
||||
}
|
||||
EM.factionDelete(faction.id);
|
||||
}
|
||||
}
|
||||
|
||||
public static void join(Follower me, String name) {
|
||||
public static void join(FPlayer me, String name) {
|
||||
Faction faction = findFaction(me, name, false);
|
||||
if (faction == null) {
|
||||
return;
|
||||
@ -281,7 +281,7 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void create(Follower me, String tag) {
|
||||
public static void create(FPlayer me, String tag) {
|
||||
ArrayList<String> errors = new ArrayList<String>();
|
||||
|
||||
if (me.hasFaction()) {
|
||||
@ -306,7 +306,7 @@ public class Commands {
|
||||
me.role = Role.ADMIN;
|
||||
me.save();
|
||||
|
||||
for (Follower follower : Follower.getAll()) {
|
||||
for (FPlayer follower : FPlayer.getAll()) {
|
||||
follower.sendMessage(me.getNameAndRelevant(follower)+Conf.colorSystem+" created a new faction "+faction.getTag(follower));
|
||||
}
|
||||
|
||||
@ -314,7 +314,7 @@ public class Commands {
|
||||
me.sendMessage(Conf.colorCommand+Conf.aliasBase.get(0)+" "+Conf.aliasDescription.get(0)+" "+"[description]");
|
||||
}
|
||||
|
||||
public static void tag(Follower me, String tag) {
|
||||
public static void tag(FPlayer me, String tag) {
|
||||
ArrayList<String> errors = new ArrayList<String>();
|
||||
|
||||
if (me.withoutFaction()) {
|
||||
@ -349,7 +349,7 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void list(Follower me, String inPage) {
|
||||
public static void list(FPlayer me, String inPage) {
|
||||
ArrayList<Faction> FactionList = new ArrayList<Faction>(Faction.getAll());
|
||||
|
||||
int page = 1;
|
||||
@ -411,14 +411,14 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void showFaction(Follower me, String name) {
|
||||
public static void showFaction(FPlayer me, String name) {
|
||||
Faction faction = findFaction(me, name, true);
|
||||
if (faction == null) {
|
||||
return;
|
||||
}
|
||||
Collection<Follower> admins = faction.getFollowersWhereRole(Role.ADMIN);
|
||||
Collection<Follower> mods = faction.getFollowersWhereRole(Role.MODERATOR);
|
||||
Collection<Follower> normals = faction.getFollowersWhereRole(Role.NORMAL);
|
||||
Collection<FPlayer> admins = faction.getFollowersWhereRole(Role.ADMIN);
|
||||
Collection<FPlayer> mods = faction.getFollowersWhereRole(Role.MODERATOR);
|
||||
Collection<FPlayer> normals = faction.getFollowersWhereRole(Role.NORMAL);
|
||||
|
||||
me.sendMessage(TextUtil.titleize(faction.getTag(me)), false);
|
||||
me.sendMessage(Conf.colorChrome+"Description: "+Conf.colorSystem+faction.getDescription());
|
||||
@ -462,7 +462,7 @@ public class Commands {
|
||||
// List the members...
|
||||
String onlineList = Conf.colorChrome+"Members online: ";
|
||||
String offlineList = Conf.colorChrome+"Members offline: ";
|
||||
for (Follower follower : admins) {
|
||||
for (FPlayer follower : admins) {
|
||||
listpart = follower.getNameAndTitle(me)+Conf.colorSystem+", ";
|
||||
if (follower.isOnline()) {
|
||||
onlineList += listpart;
|
||||
@ -470,7 +470,7 @@ public class Commands {
|
||||
offlineList += listpart;
|
||||
}
|
||||
}
|
||||
for (Follower follower : mods) {
|
||||
for (FPlayer follower : mods) {
|
||||
listpart = follower.getNameAndTitle(me)+Conf.colorSystem+", ";
|
||||
if (follower.isOnline()) {
|
||||
onlineList += listpart;
|
||||
@ -478,7 +478,7 @@ public class Commands {
|
||||
offlineList += listpart;
|
||||
}
|
||||
}
|
||||
for (Follower follower : normals) {
|
||||
for (FPlayer follower : normals) {
|
||||
listpart = follower.getNameAndTitle(me)+Conf.colorSystem+", ";
|
||||
if (follower.isOnline()) {
|
||||
onlineList += listpart;
|
||||
@ -499,7 +499,7 @@ public class Commands {
|
||||
}
|
||||
|
||||
|
||||
public static void showMap(Follower me, String mapAutoUpdating) {
|
||||
public static void showMap(FPlayer me, String mapAutoUpdating) {
|
||||
Board board = Board.get(me.getPlayer().getWorld());
|
||||
if (mapAutoUpdating.length() > 0) {
|
||||
if (Conf.aliasTrue.contains(mapAutoUpdating.toLowerCase())) {
|
||||
@ -519,8 +519,8 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void invite(Follower me, String name) {
|
||||
Follower follower = findFollower(me, name, false);
|
||||
public static void invite(FPlayer me, String name) {
|
||||
FPlayer follower = findFollower(me, name, false);
|
||||
if (follower == null) {
|
||||
return;
|
||||
}
|
||||
@ -534,8 +534,8 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void deinvite(Follower me, String name) { // TODO Move out!
|
||||
Follower follower = findFollower(me, name, false);
|
||||
public static void deinvite(FPlayer me, String name) { // TODO Move out!
|
||||
FPlayer follower = findFollower(me, name, false);
|
||||
if (follower == null) {
|
||||
return;
|
||||
}
|
||||
@ -549,7 +549,7 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void open(Follower me) {
|
||||
public static void open(FPlayer me) {
|
||||
if (me.role.value < Role.MODERATOR.value) {
|
||||
me.sendMessage(Conf.colorSystem+"You must be moderator to do this");
|
||||
return;
|
||||
@ -569,7 +569,7 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void title(Follower me, ArrayList<String> tokens) {
|
||||
public static void title(FPlayer me, ArrayList<String> tokens) {
|
||||
if (tokens.size() == 0) {
|
||||
me.sendMessage(Conf.colorSystem+"You must specify a player name");
|
||||
return;
|
||||
@ -578,7 +578,7 @@ public class Commands {
|
||||
String name = tokens.get(0);
|
||||
tokens.remove(0);
|
||||
|
||||
Follower you = findFollower(me, name, true);
|
||||
FPlayer you = findFollower(me, name, true);
|
||||
if (you == null) {
|
||||
return;
|
||||
}
|
||||
@ -596,13 +596,13 @@ public class Commands {
|
||||
myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" changed a title: "+you.getNameAndRelevant(myFaction));
|
||||
}
|
||||
|
||||
public static void kick(Follower me, String name) {
|
||||
public static void kick(FPlayer me, String name) {
|
||||
if (name.length() == 0) {
|
||||
me.sendMessage(Conf.colorSystem+"You must specify a player name.");
|
||||
return;
|
||||
}
|
||||
|
||||
Follower you = findFollower(me, name, false);
|
||||
FPlayer you = findFollower(me, name, false);
|
||||
if (you == null) {
|
||||
return;
|
||||
}
|
||||
@ -617,7 +617,7 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void roleChange(Follower me, Role targetRole, String name) {
|
||||
public static void roleChange(FPlayer me, Role targetRole, String name) {
|
||||
if (me.role.value < Role.ADMIN.value) {
|
||||
me.sendMessage(Conf.colorSystem+"You must be faction admin to do this");
|
||||
return;
|
||||
@ -628,7 +628,7 @@ public class Commands {
|
||||
return;
|
||||
}
|
||||
|
||||
Follower targetFollower = findFollower(me, name, false);
|
||||
FPlayer targetFollower = findFollower(me, name, false);
|
||||
if (targetFollower == null) {
|
||||
return;
|
||||
}
|
||||
@ -648,7 +648,7 @@ public class Commands {
|
||||
targetFollower.role = Role.ADMIN;
|
||||
|
||||
// Inform all players
|
||||
for (Follower follower : Follower.getAll()) {
|
||||
for (FPlayer follower : FPlayer.getAll()) {
|
||||
if (follower.factionId == me.factionId) {
|
||||
follower.sendMessage(me.getNameAndRelevant(me)+Conf.colorSystem+" gave "+targetFollower.getNameAndRelevant(me)+Conf.colorSystem+" the leadership of your faction.");
|
||||
} else {
|
||||
@ -668,7 +668,7 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void claim(Follower me) {
|
||||
public static void claim(FPlayer me) {
|
||||
if (me.withoutFaction()) {
|
||||
me.sendMessage(Conf.colorSystem+"You are not part of any faction.");
|
||||
return;
|
||||
@ -723,7 +723,7 @@ public class Commands {
|
||||
board.claim(coord, myFaction);
|
||||
}
|
||||
|
||||
public static void unclaim(Follower me) {
|
||||
public static void unclaim(FPlayer me) {
|
||||
if (me.withoutFaction()) {
|
||||
me.sendMessage(Conf.colorSystem+"You are not part of any faction");
|
||||
return;
|
||||
@ -746,7 +746,7 @@ public class Commands {
|
||||
me.getFaction().sendMessage(me.getNameAndRelevant(me)+Conf.colorSystem+" unclaimed some land.");
|
||||
}
|
||||
|
||||
public static void relation(Follower me, Relation whishedRelation, String otherFactionName) {
|
||||
public static void relation(FPlayer me, Relation whishedRelation, String otherFactionName) {
|
||||
if (me.withoutFaction()) {
|
||||
me.sendMessage(Conf.colorSystem+"You are not part of any faction.");
|
||||
return;
|
||||
@ -791,7 +791,7 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void description(Follower me, String desc) {
|
||||
public static void description(FPlayer me, String desc) {
|
||||
if (me.withoutFaction()) {
|
||||
me.sendMessage(Conf.colorSystem+"You are not part of any faction");
|
||||
return;
|
||||
@ -807,13 +807,13 @@ public class Commands {
|
||||
me.sendMessage(Conf.colorSystem+"The new description was set :D");
|
||||
|
||||
// Broadcast the description to everyone
|
||||
for (Follower follower : EM.followerGetAll()) {
|
||||
for (FPlayer follower : EM.followerGetAll()) {
|
||||
follower.sendMessage(Conf.colorSystem+"The faction "+follower.getRelationColor(me)+me.getFaction().getTag()+Conf.colorSystem+" changed their description to:");
|
||||
follower.sendMessage(Conf.colorSystem+desc);
|
||||
}
|
||||
}
|
||||
|
||||
public static void chat(Follower me, String msg) {
|
||||
public static void chat(FPlayer me, String msg) {
|
||||
if (me.withoutFaction()) {
|
||||
me.sendMessage(Conf.colorSystem+"You are not part of any faction");
|
||||
return;
|
||||
@ -830,8 +830,8 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
|
||||
public static void version(Follower me) {
|
||||
me.sendMessage(Conf.colorSystem+"You are running "+Factions.factions.getDescription().getFullName());
|
||||
public static void version(FPlayer me) {
|
||||
me.sendMessage(Conf.colorSystem+"You are running "+Factions.instance.getDescription().getFullName());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,15 @@
|
||||
package com.bukkit.mcteam.factions.entities;
|
||||
package com.bukkit.mcteam.factions;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import org.bukkit.*;
|
||||
|
||||
import com.bukkit.mcteam.util.DiscUtil;
|
||||
|
||||
public class Conf {
|
||||
public static transient File file = new File(Factions.instance.getDataFolder(), "conf.json");
|
||||
|
||||
// Colors
|
||||
public static ChatColor colorMember = ChatColor.GREEN;
|
||||
public static ChatColor colorAlly = ChatColor.LIGHT_PURPLE;
|
||||
@ -14,8 +20,6 @@ public class Conf {
|
||||
public static ChatColor colorChrome = ChatColor.GOLD;
|
||||
public static ChatColor colorCommand = ChatColor.AQUA;
|
||||
public static ChatColor colorParameter = ChatColor.DARK_AQUA;
|
||||
|
||||
public static Integer logThreshold = 10;
|
||||
|
||||
// Power
|
||||
public static double powerPlayerMax = 10;
|
||||
@ -154,11 +158,37 @@ public class Conf {
|
||||
aliasTrue.add("+");
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// -------------------------------------------- //
|
||||
// Persistance
|
||||
//----------------------------------------------//
|
||||
// -------------------------------------------- //
|
||||
|
||||
public static boolean save() {
|
||||
return EM.configSave();
|
||||
Factions.log("Saving config to disk.");
|
||||
try {
|
||||
DiscUtil.write(file, Factions.gson.toJson(new Conf()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Factions.log("Failed to save the config to disk.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean load() {
|
||||
if ( ! file.exists()) {
|
||||
Factions.log("No conf to load from disk. Creating new file.");
|
||||
save();
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
Factions.gson.fromJson(DiscUtil.read(file), Conf.class);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Factions.log("Failed to load the config from disk.");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,9 +1,10 @@
|
||||
package com.bukkit.mcteam.factions.entities;
|
||||
package com.bukkit.mcteam.factions;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
|
||||
public class Coord {
|
||||
protected static transient int cellSize = 16;
|
||||
public int x, z;
|
||||
@ -35,7 +36,7 @@ public class Coord {
|
||||
return from(player.getLocation());
|
||||
}
|
||||
|
||||
public static Coord from(Follower follower) {
|
||||
public static Coord from(FPlayer follower) {
|
||||
return from(follower.getPlayer());
|
||||
}
|
||||
|
@ -1,16 +1,23 @@
|
||||
package com.bukkit.mcteam.factions.entities;
|
||||
package com.bukkit.mcteam.factions;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.bukkit.mcteam.factions.Factions;
|
||||
import com.bukkit.mcteam.factions.struct.*;
|
||||
import com.bukkit.mcteam.util.ChatFixUtil;
|
||||
import com.bukkit.mcteam.factions.entities.EM;
|
||||
import com.bukkit.mcteam.gson.reflect.TypeToken;
|
||||
import com.bukkit.mcteam.util.DiscUtil;
|
||||
|
||||
public class Follower {
|
||||
public transient String id; // The is the name of the player
|
||||
public class FPlayer {
|
||||
public static transient Map<String, FPlayer> instances = new HashMap<String, 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 int factionId;
|
||||
@ -21,6 +28,43 @@ public class Follower {
|
||||
private boolean mapAutoUpdating;
|
||||
private boolean factionChatting;
|
||||
|
||||
public FPlayer(Player player) {
|
||||
this.playername = player.getName();
|
||||
}
|
||||
|
||||
public FPlayer(String playername) {
|
||||
this.playername = playername;
|
||||
}
|
||||
|
||||
// GSON need this noarg constructor.
|
||||
public FPlayer() {
|
||||
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return Factions.instance.getServer().getPlayer(playername);
|
||||
}
|
||||
|
||||
public String getPlayerName() {
|
||||
return this.playername;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Online / Offline State Checking
|
||||
// -------------------------------------------- //
|
||||
|
||||
public boolean isOnline() {
|
||||
return Factions.instance.getServer().getPlayer(playername) != null;
|
||||
}
|
||||
|
||||
public boolean isOffline() {
|
||||
return ! isOnline();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public boolean isFactionChatting() {
|
||||
if (this.factionId == 0) {
|
||||
return false;
|
||||
@ -32,7 +76,7 @@ public class Follower {
|
||||
this.factionChatting = factionChatting;
|
||||
}
|
||||
|
||||
public Follower() {
|
||||
public FPlayer() {
|
||||
this.resetFactionData();
|
||||
this.power = this.getPowerMax();
|
||||
this.lastPowerUpdateTime = System.currentTimeMillis();
|
||||
@ -46,14 +90,6 @@ public class Follower {
|
||||
this.title = "";
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return Factions.factions.getServer().getPlayer(this.getName());
|
||||
}
|
||||
|
||||
public boolean isOnline() {
|
||||
return this.getPlayer() != null;
|
||||
}
|
||||
|
||||
public boolean isMapAutoUpdating() {
|
||||
return mapAutoUpdating;
|
||||
}
|
||||
@ -113,14 +149,14 @@ public class Follower {
|
||||
public String getNameAndTitle(Faction faction) {
|
||||
return this.getRelationColor(faction)+this.getNameAndTitle();
|
||||
}
|
||||
public String getNameAndTitle(Follower follower) {
|
||||
public String getNameAndTitle(FPlayer follower) {
|
||||
return this.getRelationColor(follower)+this.getNameAndTitle();
|
||||
}
|
||||
|
||||
public String getNameAndTag(Faction faction) {
|
||||
return this.getRelationColor(faction)+this.getNameAndTag();
|
||||
}
|
||||
public String getNameAndTag(Follower follower) {
|
||||
public String getNameAndTag(FPlayer follower) {
|
||||
return this.getRelationColor(follower)+this.getNameAndTag();
|
||||
}
|
||||
|
||||
@ -136,7 +172,7 @@ public class Follower {
|
||||
// For non members we show tag
|
||||
return rel.getColor() + this.getNameAndTag();
|
||||
}
|
||||
public String getNameAndRelevant(Follower follower) {
|
||||
public String getNameAndRelevant(FPlayer follower) {
|
||||
return getNameAndRelevant(follower.getFaction());
|
||||
}
|
||||
|
||||
@ -159,7 +195,7 @@ public class Follower {
|
||||
|
||||
return this.getRelation(faction).getColor()+getChatTag();
|
||||
}
|
||||
public String getChatTag(Follower follower) {
|
||||
public String getChatTag(FPlayer follower) {
|
||||
if (this.withoutFaction()) {
|
||||
return "";
|
||||
}
|
||||
@ -175,7 +211,7 @@ public class Follower {
|
||||
return faction.getRelation(this);
|
||||
}
|
||||
|
||||
public Relation getRelation(Follower follower) {
|
||||
public Relation getRelation(FPlayer follower) {
|
||||
return this.getFaction().getRelation(follower);
|
||||
}
|
||||
|
||||
@ -183,7 +219,7 @@ public class Follower {
|
||||
return faction.getRelationColor(this);
|
||||
}
|
||||
|
||||
public ChatColor getRelationColor(Follower follower) {
|
||||
public ChatColor getRelationColor(FPlayer follower) {
|
||||
return this.getRelation(follower).getColor();
|
||||
}
|
||||
|
||||
@ -343,7 +379,7 @@ public class Follower {
|
||||
return errors;
|
||||
}
|
||||
|
||||
public ArrayList<String> invite(Follower follower) {
|
||||
public ArrayList<String> invite(FPlayer follower) {
|
||||
ArrayList<String> errors = new ArrayList<String>();
|
||||
|
||||
//Log.debug("this.role: "+this.role);
|
||||
@ -361,7 +397,7 @@ public class Follower {
|
||||
return this.getFaction().invite(follower);
|
||||
}
|
||||
|
||||
public ArrayList<String> deinvite(Follower follower) {
|
||||
public ArrayList<String> deinvite(FPlayer follower) {
|
||||
ArrayList<String> errors = new ArrayList<String>();
|
||||
|
||||
if (this.role.value < Role.MODERATOR.value) {
|
||||
@ -375,7 +411,7 @@ public class Follower {
|
||||
return this.getFaction().deinvite(follower);
|
||||
}
|
||||
|
||||
public ArrayList<String> kick(Follower follower) {
|
||||
public ArrayList<String> kick(FPlayer follower) {
|
||||
ArrayList<String> errors = new ArrayList<String>();
|
||||
|
||||
if ( ! follower.getFaction().equals(this.getFaction())) {
|
||||
@ -403,31 +439,11 @@ public class Follower {
|
||||
//this.getPlayer().sendMessage(ChatColor.GREEN + "This is a faction server! Type "+Conf.colorCommand+"/f"+ChatColor.GREEN +" for more info :D");
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Messages - Directly connected to ChatFixUtil
|
||||
//----------------------------------------------//
|
||||
public void sendMessage(String message, boolean fix) {
|
||||
Player player = this.getPlayer();
|
||||
ChatFixUtil.sendMessage(player, message, fix);
|
||||
}
|
||||
public void sendMessage(List<String> messages, boolean fix) {
|
||||
Player player = this.getPlayer();
|
||||
ChatFixUtil.sendMessage(player, messages, fix);
|
||||
}
|
||||
public void sendMessage(String message) {
|
||||
Player player = this.getPlayer();
|
||||
ChatFixUtil.sendMessage(player, message, true);
|
||||
}
|
||||
public void sendMessage(List<String> messages) {
|
||||
Player player = this.getPlayer();
|
||||
ChatFixUtil.sendMessage(player, messages, true);
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Search
|
||||
//----------------------------------------------//
|
||||
public static Follower find(String name) {
|
||||
for (Follower follower : EM.followerGetAll()) {
|
||||
public static FPlayer find(String name) { // TODO felaktig!
|
||||
for (FPlayer follower : EM.followerGetAll()) {
|
||||
if (follower.getName().equalsIgnoreCase(name.trim())) {
|
||||
return follower;
|
||||
}
|
||||
@ -436,19 +452,110 @@ public class Follower {
|
||||
return null;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Get
|
||||
// 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.
|
||||
// -------------------------------------------- //
|
||||
public static FPlayer get(String playername) {
|
||||
if (instances.containsKey(playername)) {
|
||||
return instances.get(playername);
|
||||
}
|
||||
|
||||
FPlayer vplayer = new FPlayer(playername);
|
||||
instances.put(playername, vplayer);
|
||||
return vplayer;
|
||||
}
|
||||
|
||||
// You should use this one to be sure you do not spell the player name wrong.
|
||||
public static FPlayer get(Player player) {
|
||||
return get(player.getName());
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Messages
|
||||
// -------------------------------------------- //
|
||||
public void sendMessage(String message) {
|
||||
this.getPlayer().sendMessage(Conf.colorSystem + message);
|
||||
}
|
||||
|
||||
public void sendMessage(List<String> messages) {
|
||||
for(String message : messages) {
|
||||
this.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------//
|
||||
// Persistance and entity management
|
||||
//----------------------------------------------//
|
||||
|
||||
/*
|
||||
public boolean save() {
|
||||
return EM.followerSave(this.id);
|
||||
}
|
||||
|
||||
public static Follower get(Player player) {
|
||||
public static FPlayer get(Player player) {
|
||||
return EM.followerGet(player);
|
||||
}
|
||||
|
||||
public static Collection<Follower> getAll() {
|
||||
public static Collection<FPlayer> getAll() {
|
||||
return EM.followerGetAll();
|
||||
}
|
||||
*/
|
||||
// -------------------------------------------- //
|
||||
// Persistance
|
||||
// -------------------------------------------- //
|
||||
|
||||
public boolean shouldBeSaved() {
|
||||
return this.factionId != 0;
|
||||
}
|
||||
|
||||
public static boolean save() {
|
||||
Factions.log("Saving players to disk");
|
||||
|
||||
// We only wan't to save the vplayers with non default values
|
||||
Map<String, FPlayer> vplayersToSave = new HashMap<String, FPlayer>();
|
||||
for (Entry<String, FPlayer> entry : instances.entrySet()) {
|
||||
if (entry.getValue().shouldBeSaved()) {
|
||||
vplayersToSave.put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
DiscUtil.write(file, Factions.gson.toJson(vplayersToSave));
|
||||
} catch (IOException e) {
|
||||
Factions.log("Failed to save the players to disk.");
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean load() {
|
||||
if ( ! file.exists()) {
|
||||
Factions.log("No players to load from disk. Creating new file.");
|
||||
save();
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
Type type = new TypeToken<Map<String, FPlayer>>(){}.getType();
|
||||
instances = Factions.gson.fromJson(DiscUtil.read(file), type);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
||||
fillPlayernames();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void fillPlayernames() {
|
||||
for(Entry<String, FPlayer> entry : instances.entrySet()) {
|
||||
entry.getValue().playername = entry.getKey();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,17 +1,26 @@
|
||||
package com.bukkit.mcteam.factions.entities;
|
||||
package com.bukkit.mcteam.factions;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.bukkit.mcteam.factions.Factions;
|
||||
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.factions.util.*;
|
||||
import com.bukkit.mcteam.util.ChatFixUtil;
|
||||
import com.bukkit.mcteam.gson.reflect.TypeToken;
|
||||
import com.bukkit.mcteam.util.DiscUtil;
|
||||
|
||||
public class Faction {
|
||||
public static transient Map<Integer, Faction> instances = new HashMap<Integer, Faction>();
|
||||
public static transient File file = new File(Factions.instance.getDataFolder(), "factions.json");
|
||||
public static transient int nextId;
|
||||
|
||||
public transient int id;
|
||||
protected Map<Integer, Relation> relationWish;
|
||||
@ -40,7 +49,7 @@ public class Faction {
|
||||
public String getTag(Faction otherFaction) {
|
||||
return this.getTag(otherFaction.getRelationColor(this).toString());
|
||||
}
|
||||
public String getTag(Follower otherFollower) {
|
||||
public String getTag(FPlayer otherFollower) {
|
||||
return this.getTag(otherFollower.getRelationColor(this).toString());
|
||||
}
|
||||
public void setTag(String str) {
|
||||
@ -74,7 +83,7 @@ public class Faction {
|
||||
//----------------------------------------------//
|
||||
public double getPower() {
|
||||
double ret = 0;
|
||||
for (Follower follower : this.getFollowersAll()) {
|
||||
for (FPlayer follower : this.getFollowersAll()) {
|
||||
ret += follower.getPower();
|
||||
}
|
||||
return ret;
|
||||
@ -82,7 +91,7 @@ public class Faction {
|
||||
|
||||
public double getPowerMax() {
|
||||
double ret = 0;
|
||||
for (Follower follower : this.getFollowersAll()) {
|
||||
for (FPlayer follower : this.getFollowersAll()) {
|
||||
ret += follower.getPowerMax();
|
||||
}
|
||||
return ret;
|
||||
@ -109,7 +118,7 @@ public class Faction {
|
||||
// -------------------------------
|
||||
|
||||
|
||||
public ArrayList<String> invite(Follower follower) { // TODO Move out
|
||||
public ArrayList<String> invite(FPlayer follower) { // TODO Move out
|
||||
ArrayList<String> errors = new ArrayList<String>();
|
||||
|
||||
if (follower.getFaction().equals(this)) { // error här?
|
||||
@ -125,7 +134,7 @@ public class Faction {
|
||||
return errors;
|
||||
}
|
||||
|
||||
public ArrayList<String> deinvite(Follower follower) { // TODO move out!
|
||||
public ArrayList<String> deinvite(FPlayer follower) { // TODO move out!
|
||||
ArrayList<String> errors = new ArrayList<String>();
|
||||
|
||||
if (follower.getFaction() == this) {
|
||||
@ -142,14 +151,14 @@ public class Faction {
|
||||
return errors;
|
||||
}
|
||||
|
||||
public ArrayList<String> kick(Follower follower) {
|
||||
public ArrayList<String> kick(FPlayer follower) {
|
||||
ArrayList<String> errors = new ArrayList<String>();
|
||||
removeFollower(follower);
|
||||
return errors;
|
||||
}
|
||||
|
||||
|
||||
public boolean isInvited(Follower follower) {
|
||||
public boolean isInvited(FPlayer follower) {
|
||||
return invites.contains(follower.id);
|
||||
}
|
||||
|
||||
@ -157,9 +166,9 @@ public class Faction {
|
||||
// Followers
|
||||
// -------------------------------
|
||||
|
||||
public ArrayList<Follower> getFollowersAll() {
|
||||
ArrayList<Follower> ret = new ArrayList<Follower>();
|
||||
for (Follower follower : Follower.getAll()) {
|
||||
public ArrayList<FPlayer> getFollowersAll() {
|
||||
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
|
||||
for (FPlayer follower : FPlayer.getAll()) {
|
||||
if (follower.factionId == this.id) {
|
||||
ret.add(follower);
|
||||
}
|
||||
@ -167,9 +176,9 @@ public class Faction {
|
||||
return ret;
|
||||
}
|
||||
|
||||
public ArrayList<Follower> getFollowersWhereOnline(boolean online) {
|
||||
ArrayList<Follower> ret = new ArrayList<Follower>();
|
||||
for (Follower follower : Follower.getAll()) {
|
||||
public ArrayList<FPlayer> getFollowersWhereOnline(boolean online) {
|
||||
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
|
||||
for (FPlayer follower : FPlayer.getAll()) {
|
||||
if (follower.factionId == this.id && follower.isOnline() == online) {
|
||||
ret.add(follower);
|
||||
}
|
||||
@ -177,10 +186,10 @@ public class Faction {
|
||||
return ret;
|
||||
}
|
||||
|
||||
public ArrayList<Follower> getFollowersWhereRole(Role role) {
|
||||
ArrayList<Follower> ret = new ArrayList<Follower>();
|
||||
public ArrayList<FPlayer> getFollowersWhereRole(Role role) {
|
||||
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
|
||||
|
||||
for (Follower follower : Follower.getAll()) {
|
||||
for (FPlayer follower : FPlayer.getAll()) {
|
||||
if (follower.factionId == this.id && follower.role.equals(role)) {
|
||||
ret.add(follower);
|
||||
}
|
||||
@ -189,7 +198,7 @@ public class Faction {
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void removeFollower(Follower follower) {
|
||||
public void removeFollower(FPlayer follower) {
|
||||
if (this.id != follower.factionId) {
|
||||
return; // safety check
|
||||
}
|
||||
@ -202,8 +211,8 @@ public class Faction {
|
||||
|
||||
public ArrayList<Player> getOnlinePlayers() {
|
||||
ArrayList<Player> ret = new ArrayList<Player>();
|
||||
for (Player player: Factions.factions.getServer().getOnlinePlayers()) {
|
||||
Follower follower = Follower.get(player);
|
||||
for (Player player: Factions.instance.getServer().getOnlinePlayers()) {
|
||||
FPlayer follower = FPlayer.get(player);
|
||||
if (follower.factionId == this.id) {
|
||||
ret.add(player);
|
||||
}
|
||||
@ -302,7 +311,7 @@ public class Faction {
|
||||
return this.getRelationWish(otherFaction);
|
||||
}
|
||||
|
||||
public Relation getRelation(Follower follower) {
|
||||
public Relation getRelation(FPlayer follower) {
|
||||
return getRelation(follower.getFaction());
|
||||
}
|
||||
|
||||
@ -310,7 +319,7 @@ public class Faction {
|
||||
return this.getRelation(otherFaction).getColor();
|
||||
}
|
||||
|
||||
public ChatColor getRelationColor(Follower follower) {
|
||||
public ChatColor getRelationColor(FPlayer follower) {
|
||||
return this.getRelation(follower).getColor();
|
||||
}
|
||||
|
||||
@ -318,6 +327,109 @@ public class Faction {
|
||||
// Persistance and entity management
|
||||
//----------------------------------------------//
|
||||
|
||||
public static boolean save() {
|
||||
Factions.log("Saving factions to disk");
|
||||
|
||||
try {
|
||||
DiscUtil.write(file, Factions.gson.toJson(instances));
|
||||
} catch (IOException e) {
|
||||
Factions.log("Failed to save the factions to disk.");
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean load() {
|
||||
if ( ! file.exists()) {
|
||||
Factions.log("No factions to load from disk. Creating new file.");
|
||||
save();
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
Type type = new TypeToken<Map<String, Faction>>(){}.getType();
|
||||
instances = Factions.gson.fromJson(DiscUtil.read(file), type);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
||||
fillIds();
|
||||
|
||||
// Make sure the default neutral faction exists
|
||||
if ( ! instances.containsKey(0)) {
|
||||
Faction faction = new Faction();
|
||||
faction.tag = "*No faction*";
|
||||
faction.description = "\"The faction for the factionless :P\"";
|
||||
faction.id = 0;
|
||||
instances.put(faction.id, faction);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void fillIds() {
|
||||
nextId = 1;
|
||||
for(Entry<Integer, Faction> entry : instances.entrySet()) {
|
||||
entry.getValue().id = entry.getKey();
|
||||
if (nextId < entry.getKey()) {
|
||||
nextId = entry.getKey();
|
||||
}
|
||||
}
|
||||
nextId += 1; // make it the next id and not the current highest.
|
||||
}
|
||||
|
||||
public static Faction get(Integer factionId) {
|
||||
if ( ! instances.containsKey(factionId)) {
|
||||
Factions.log(Level.WARNING, "Non existing factionId "+factionId+" requested! Issuing board cleaning!");
|
||||
Board.cleanAll();
|
||||
}
|
||||
return instances.get(factionId);
|
||||
}
|
||||
|
||||
public static boolean exists(Integer factionId) {
|
||||
return instances.containsKey(factionId);
|
||||
}
|
||||
|
||||
public static Collection<Faction> getAll() {
|
||||
return instances.values();
|
||||
}
|
||||
|
||||
//TODO ta parametrar här. All info som behövs ska matas in här och så sparar vi i denna method.
|
||||
public static Faction create() {
|
||||
Faction faction = new Faction();
|
||||
faction.id = nextId;
|
||||
nextId += 1;
|
||||
instances.put(faction.id, faction);
|
||||
Factions.log("created new faction "+faction.id);
|
||||
//faction.save();
|
||||
return faction;
|
||||
}
|
||||
|
||||
public static boolean delete(Integer id) {
|
||||
// NOTE that this does not do any security checks.
|
||||
// Follower might get orphaned foreign id's
|
||||
|
||||
// purge from all boards
|
||||
// Board.purgeFactionFromAllBoards(id);
|
||||
Board.cleanAll();
|
||||
|
||||
// Remove the file
|
||||
//File file = new File(folderFaction, id+ext);
|
||||
//file.delete();
|
||||
|
||||
// Remove the faction
|
||||
instances.remove(id);
|
||||
|
||||
// TODO REMOVE ALL MEMBERS!
|
||||
|
||||
// TODO SAVE files
|
||||
return true; // TODO
|
||||
}
|
||||
|
||||
/*
|
||||
public static Faction create() {
|
||||
return EM.factionCreate();
|
||||
}
|
||||
@ -333,5 +445,5 @@ public class Faction {
|
||||
public boolean save() {
|
||||
return EM.factionSave(this.id);
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
@ -1,37 +1,84 @@
|
||||
package com.bukkit.mcteam.factions;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.bukkit.mcteam.factions.entities.*;
|
||||
import com.bukkit.mcteam.factions.commands.FCommand;
|
||||
import com.bukkit.mcteam.factions.listeners.FactionsBlockListener;
|
||||
import com.bukkit.mcteam.factions.listeners.FactionsEntityListener;
|
||||
import com.bukkit.mcteam.factions.listeners.FactionsPlayerListener;
|
||||
import com.bukkit.mcteam.factions.util.Log;
|
||||
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;
|
||||
|
||||
import me.taylorkelly.help.Help;
|
||||
|
||||
public class Factions extends JavaPlugin {
|
||||
public static Factions factions;
|
||||
// -------------------------------------------- //
|
||||
// Fields
|
||||
// -------------------------------------------- //
|
||||
public static Factions instance;
|
||||
|
||||
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);
|
||||
private final FactionsEntityListener entityListener = new FactionsEntityListener(this);
|
||||
private final FactionsBlockListener blockListener = new FactionsBlockListener(this);
|
||||
|
||||
public static PermissionHandler Permissions;
|
||||
public static Help helpPlugin;
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
// Commands
|
||||
public List<FCommand> commands = new ArrayList<FCommand>();
|
||||
|
||||
public Factions() {
|
||||
Factions.instance = this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
Factions.factions = this;
|
||||
// Add the commands
|
||||
/*commands.add(new VCommandBlood());
|
||||
commands.add(new VCommandInfect());
|
||||
commands.add(new VCommandLoad());
|
||||
commands.add(new VCommandSave());
|
||||
commands.add(new VCommandTime());
|
||||
commands.add(new VCommandTurn());
|
||||
commands.add(new VCommandCure());
|
||||
commands.add(new VCommandList());
|
||||
commands.add(new VCommandVersion());*/
|
||||
|
||||
Log.info("=== INIT START ===");
|
||||
setupPermissions();
|
||||
setupHelp();
|
||||
|
||||
log("=== INIT START ===");
|
||||
long timeInitStart = System.currentTimeMillis();
|
||||
Log.info("You are running version: "+this.getDescription().getVersion());
|
||||
|
||||
EM.loadAll();
|
||||
FPlayer.load();
|
||||
Faction.load();
|
||||
Board.load();
|
||||
|
||||
// Register events
|
||||
PluginManager pm = this.getServer().getPluginManager();
|
||||
@ -48,8 +95,94 @@ public class Factions extends JavaPlugin {
|
||||
pm.registerEvent(Event.Type.BLOCK_PLACED, this.blockListener, Event.Priority.Normal, this);
|
||||
pm.registerEvent(Event.Type.BLOCK_INTERACT, this.blockListener, Event.Priority.Normal, this);
|
||||
|
||||
Log.info("=== INIT DONE (Took "+(System.currentTimeMillis()-timeInitStart)+"ms) ===");
|
||||
Log.threshold = Conf.logThreshold;
|
||||
log("=== INIT DONE (Took "+(System.currentTimeMillis()-timeInitStart)+"ms) ===");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Integration with other plugins
|
||||
// -------------------------------------------- //
|
||||
|
||||
private void setupPermissions() {
|
||||
Plugin test = this.getServer().getPluginManager().getPlugin("Permissions");
|
||||
|
||||
if (Permissions != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (test != null) {
|
||||
Permissions = ((Permissions)test).getHandler();
|
||||
Factions.log("Found and will use plugin "+((Permissions)test).getDescription().getFullName());
|
||||
} else {
|
||||
Factions.log("Permission system not detected, defaulting to OP");
|
||||
}
|
||||
}
|
||||
|
||||
private void setupHelp() {
|
||||
Plugin test = this.getServer().getPluginManager().getPlugin("Help");
|
||||
|
||||
if (helpPlugin != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (test != null) {
|
||||
helpPlugin = ((Help) test);
|
||||
Factions.log("Found and will use plugin "+helpPlugin.getDescription().getFullName());
|
||||
for(FCommand fcommand : commands) {
|
||||
fcommand.helpRegister();
|
||||
}
|
||||
helpPlugin.registerCommand("help vampire", "help for the vampire plugin.", helpPlugin, true);
|
||||
} else {
|
||||
Factions.log(Level.WARNING, "'Help' plugin isn't detected. No /help support.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Commands
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
|
||||
List<String> parameters = new ArrayList<String>(Arrays.asList(args));
|
||||
this.handleCommand(sender, parameters);
|
||||
return true;
|
||||
}
|
||||
|
||||
public void handleCommand(CommandSender sender, List<String> parameters) {
|
||||
if (parameters.size() == 0) {
|
||||
this.commands.get(0).execute(sender, parameters);
|
||||
return;
|
||||
}
|
||||
|
||||
String commandName = parameters.get(0).toLowerCase();
|
||||
parameters.remove(0);
|
||||
|
||||
for (FCommand fcommand : this.commands) {
|
||||
if (fcommand.getAliases().contains(commandName)) {
|
||||
fcommand.execute(sender, parameters);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sender.sendMessage(Conf.colorSystem+"Unknown faction command \""+commandName+"\". Try /help faction"); // TODO test help messages exists....
|
||||
//TODO should we use internal help system instead?
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Logging
|
||||
// -------------------------------------------- //
|
||||
public static void log(String msg) {
|
||||
log(Level.INFO, msg);
|
||||
}
|
||||
|
||||
public static void log(Level level, String msg) {
|
||||
Logger.getLogger("Minecraft").log(level, "["+instance.getDescription().getFullName()+"] "+msg);
|
||||
}
|
||||
|
||||
}
|
||||
|
142
src/com/bukkit/mcteam/factions/commands/FCommand.java
Normal file
142
src/com/bukkit/mcteam/factions/commands/FCommand.java
Normal file
@ -0,0 +1,142 @@
|
||||
package com.bukkit.mcteam.factions.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.bukkit.mcteam.factions.Conf;
|
||||
import com.bukkit.mcteam.factions.FPlayer;
|
||||
import com.bukkit.mcteam.factions.Factions;
|
||||
|
||||
public class FCommand {
|
||||
public List<String> requiredParameters;
|
||||
public List<String> optionalParameters;
|
||||
|
||||
public String permissions;
|
||||
|
||||
public String helpNameAndParams;
|
||||
public String helpDescription;
|
||||
|
||||
public CommandSender sender;
|
||||
public boolean senderMustBePlayer;
|
||||
public Player player;
|
||||
public FPlayer fplayer;
|
||||
|
||||
public List<String> parameters;
|
||||
|
||||
|
||||
public FCommand() {
|
||||
requiredParameters = new ArrayList<String>();
|
||||
optionalParameters = new ArrayList<String>();
|
||||
|
||||
permissions = "";
|
||||
|
||||
senderMustBePlayer = false;
|
||||
|
||||
helpNameAndParams = "fail!";
|
||||
helpDescription = "no description";
|
||||
}
|
||||
|
||||
public ArrayList<String> getAliases() {
|
||||
String name = this.getClass().getName().toLowerCase();
|
||||
if (name.lastIndexOf('.') > 0) {
|
||||
name = name.substring(name.lastIndexOf('.')+1);
|
||||
}
|
||||
|
||||
name = name.substring(8);
|
||||
|
||||
ArrayList<String> aliases = new ArrayList<String>();
|
||||
aliases.add(name);
|
||||
|
||||
return aliases;
|
||||
}
|
||||
|
||||
public String getBaseName() {
|
||||
// TODO fetch from the plugin.yaml or something...
|
||||
return "f";
|
||||
}
|
||||
|
||||
public void execute(CommandSender sender, List<String> parameters) {
|
||||
this.sender = sender;
|
||||
this.parameters = parameters;
|
||||
|
||||
if ( ! validateCall()) {
|
||||
sendMessage("try /help factions");
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.senderMustBePlayer) {
|
||||
this.player = (Player)sender;
|
||||
this.fplayer = FPlayer.get(this.player);
|
||||
}
|
||||
|
||||
perform();
|
||||
}
|
||||
|
||||
public void perform() {
|
||||
|
||||
}
|
||||
|
||||
public void helpRegister() {
|
||||
Factions.helpPlugin.registerCommand(this.getBaseName()+ " " +this.helpNameAndParams, this.helpDescription, Factions.instance, false, permissions);
|
||||
}
|
||||
|
||||
public void sendMessage(String message) {
|
||||
sender.sendMessage(Conf.colorSystem+message);
|
||||
}
|
||||
|
||||
public void sendMessage(List<String> messages) {
|
||||
for(String message : messages) {
|
||||
this.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
// Test if the number of params is correct.
|
||||
public boolean validateCall() {
|
||||
if( ! testPermission(sender)) {
|
||||
sendMessage("You do not have sufficient permissions to use this command.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( this.senderMustBePlayer && ! (sender instanceof Player)) {
|
||||
sendMessage("This command can only be used by ingame players.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (parameters.size() < requiredParameters.size()) {
|
||||
int missing = requiredParameters.size() - parameters.size();
|
||||
sendMessage("Missing parameters. You must enter "+missing+" more.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (parameters.size() > requiredParameters.size() + optionalParameters.size()) {
|
||||
sendMessage("To many parameters.");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean testPermission(CommandSender sender) {
|
||||
if (sender.isOp()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (this.permissions.length() == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( ! (sender instanceof Player)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Factions.Permissions == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Player player = (Player)sender;
|
||||
return Factions.Permissions.has(player, this.permissions);
|
||||
}
|
||||
}
|
45
src/com/bukkit/mcteam/factions/commands/FCommandLeave.java
Normal file
45
src/com/bukkit/mcteam/factions/commands/FCommandLeave.java
Normal file
@ -0,0 +1,45 @@
|
||||
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;
|
||||
|
||||
public class FCommandLeave extends FCommand {
|
||||
|
||||
public FCommandLeave() {
|
||||
requiredParameters = new ArrayList<String>();
|
||||
optionalParameters = new ArrayList<String>();
|
||||
|
||||
permissions = "";
|
||||
|
||||
senderMustBePlayer = true;
|
||||
|
||||
helpNameAndParams = "leave";
|
||||
helpDescription = "Leave your faction";
|
||||
}
|
||||
|
||||
public void perform() {
|
||||
Faction faction = fplayer.getFaction();
|
||||
|
||||
ArrayList<String> 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 (faction.getFollowersAll().size() == 0) {
|
||||
// Remove this faction
|
||||
for (FPlayer follower : FPlayer.getAll()) {
|
||||
follower.sendMessage(Conf.colorSystem+"The faction "+faction.getTag(follower)+Conf.colorSystem+" was disbanded.");
|
||||
}
|
||||
Faction.delete(faction.id);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -7,6 +7,10 @@ import java.util.*;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.bukkit.mcteam.factions.Board;
|
||||
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.util.*;
|
||||
import com.bukkit.mcteam.util.DiscUtil;
|
||||
@ -18,14 +22,14 @@ import com.bukkit.mcteam.gson.*;
|
||||
* The methods assume that all on disc is loaded into memory.
|
||||
*/
|
||||
public class EM {
|
||||
protected static Map<String, Follower> followers = new HashMap<String, Follower>(); // Where String is a lowercase playername
|
||||
protected static Map<String, FPlayer> followers = new HashMap<String, FPlayer>(); // 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<String, Board> boards = new HashMap<String, Board>(); // Where Long is the semi (sadly) unique world id.
|
||||
protected static int nextFactionId;
|
||||
|
||||
// hardcoded config
|
||||
protected final static String ext = ".json";
|
||||
protected final static File folderBase = Factions.factions.getDataFolder();
|
||||
protected final static File folderBase = Factions.instance.getDataFolder();
|
||||
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");
|
||||
@ -218,7 +222,7 @@ public class EM {
|
||||
String name = jsonFile.getName();
|
||||
name = name.substring(0, name.length() - ext.length());
|
||||
try {
|
||||
Follower follower = gson.fromJson(DiscUtil.read(jsonFile), Follower.class);
|
||||
FPlayer follower = gson.fromJson(DiscUtil.read(jsonFile), FPlayer.class);
|
||||
follower.id = name;
|
||||
followers.put(follower.id, follower);
|
||||
//Log.debug("loaded follower "+name);
|
||||
@ -229,7 +233,7 @@ public class EM {
|
||||
}
|
||||
}
|
||||
|
||||
public static Collection<Follower> followerGetAll() {
|
||||
public static Collection<FPlayer> followerGetAll() {
|
||||
return followers.values();
|
||||
}
|
||||
|
||||
@ -237,7 +241,7 @@ public class EM {
|
||||
* This method returns the follower object for a player
|
||||
* A new Follower will be created if the player did not have one
|
||||
*/
|
||||
public static Follower followerGet(Player player) {
|
||||
public static FPlayer followerGet(Player player) {
|
||||
String key = followerKey(player);
|
||||
|
||||
if (followers.containsKey(key)) {
|
||||
@ -272,9 +276,9 @@ public class EM {
|
||||
return player.getName();
|
||||
}
|
||||
|
||||
protected static Follower followerCreate(Player player) {
|
||||
protected static FPlayer followerCreate(Player player) {
|
||||
Log.debug("Creating new follower "+followerKey(player));
|
||||
Follower follower = new Follower();
|
||||
FPlayer follower = new FPlayer();
|
||||
follower.id = followerKey(player);
|
||||
followers.put(follower.id, follower);
|
||||
follower.save();
|
||||
|
@ -11,6 +11,11 @@ import org.bukkit.event.block.BlockInteractEvent;
|
||||
import org.bukkit.event.block.BlockListener;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
|
||||
import com.bukkit.mcteam.factions.Board;
|
||||
import com.bukkit.mcteam.factions.Conf;
|
||||
import com.bukkit.mcteam.factions.Coord;
|
||||
import com.bukkit.mcteam.factions.FPlayer;
|
||||
import com.bukkit.mcteam.factions.Faction;
|
||||
import com.bukkit.mcteam.factions.Factions;
|
||||
import com.bukkit.mcteam.factions.entities.*;
|
||||
import com.bukkit.mcteam.factions.util.*;
|
||||
@ -35,7 +40,7 @@ public class FactionsBlockListener extends BlockListener {
|
||||
}
|
||||
|
||||
//special cases, check for destruction of: torch, redstone torch (on & off), repeater (on & off), redstonewire, sapling, crops, sugar cane
|
||||
private static Set<Integer> specialBlocks = new HashSet(Arrays.asList(
|
||||
private static Set<Integer> specialBlocks = new HashSet<Integer>(Arrays.asList(
|
||||
new Integer[] {50, 75, 76, 93, 94, 55, 6, 59, 83}
|
||||
));
|
||||
|
||||
@ -62,7 +67,7 @@ public class FactionsBlockListener extends BlockListener {
|
||||
return true; // This is no faction territory. You may build or break stuff here.
|
||||
}
|
||||
|
||||
Follower me = Follower.get(player);
|
||||
FPlayer me = FPlayer.get(player);
|
||||
Faction myFaction = me.getFaction();
|
||||
|
||||
// Cancel if we are not in our own territory
|
||||
@ -105,7 +110,7 @@ public class FactionsBlockListener extends BlockListener {
|
||||
return true;
|
||||
}
|
||||
|
||||
Follower me = Follower.get(player);
|
||||
FPlayer me = FPlayer.get(player);
|
||||
Faction myFaction = me.getFaction();
|
||||
Coord blockCoord = Coord.from(block.getLocation());
|
||||
Faction otherFaction = Board.get(player.getWorld()).getFactionAt(blockCoord);
|
||||
|
@ -14,11 +14,11 @@ import org.bukkit.event.entity.EntityDeathEvent;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.entity.EntityListener;
|
||||
|
||||
import com.bukkit.mcteam.factions.Board;
|
||||
import com.bukkit.mcteam.factions.Conf;
|
||||
import com.bukkit.mcteam.factions.Coord;
|
||||
import com.bukkit.mcteam.factions.FPlayer;
|
||||
import com.bukkit.mcteam.factions.Factions;
|
||||
import com.bukkit.mcteam.factions.entities.Board;
|
||||
import com.bukkit.mcteam.factions.entities.Conf;
|
||||
import com.bukkit.mcteam.factions.entities.Coord;
|
||||
import com.bukkit.mcteam.factions.entities.Follower;
|
||||
import com.bukkit.mcteam.factions.struct.Relation;
|
||||
|
||||
public class FactionsEntityListener extends EntityListener {
|
||||
@ -35,7 +35,7 @@ public class FactionsEntityListener extends EntityListener {
|
||||
}
|
||||
|
||||
Player player = (Player) entity;
|
||||
Follower follower = Follower.get(player);
|
||||
FPlayer follower = FPlayer.get(player);
|
||||
follower.onDeath();
|
||||
follower.sendMessage(Conf.colorSystem+"Your power is now "+follower.getPowerRounded()+" / "+follower.getPowerMaxRounded());
|
||||
}
|
||||
@ -98,8 +98,8 @@ public class FactionsEntityListener extends EntityListener {
|
||||
return true;
|
||||
}
|
||||
|
||||
Follower defender = Follower.get((Player)damagee);
|
||||
Follower attacker = Follower.get((Player)damager);
|
||||
FPlayer defender = FPlayer.get((Player)damagee);
|
||||
FPlayer attacker = FPlayer.get((Player)damager);
|
||||
Relation relation = defender.getRelation(attacker);
|
||||
|
||||
//Log.debug(attacker.getName() + " attacked " + defender.getName());
|
||||
|
@ -11,7 +11,12 @@ import org.bukkit.event.player.PlayerItemEvent;
|
||||
import org.bukkit.event.player.PlayerListener;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
|
||||
import com.bukkit.mcteam.factions.Board;
|
||||
import com.bukkit.mcteam.factions.Commands;
|
||||
import com.bukkit.mcteam.factions.Conf;
|
||||
import com.bukkit.mcteam.factions.Coord;
|
||||
import com.bukkit.mcteam.factions.FPlayer;
|
||||
import com.bukkit.mcteam.factions.Faction;
|
||||
import com.bukkit.mcteam.factions.Factions;
|
||||
import com.bukkit.mcteam.factions.entities.*;
|
||||
import com.bukkit.mcteam.factions.util.TextUtil;
|
||||
@ -55,7 +60,7 @@ public class FactionsPlayerListener extends PlayerListener{
|
||||
}
|
||||
|
||||
// ... it was not a command. This means that it is a chat message!
|
||||
Follower me = Follower.get(talkingPlayer);
|
||||
FPlayer me = FPlayer.get(talkingPlayer);
|
||||
|
||||
// Is it a faction chat message?
|
||||
if (me.isFactionChatting()) {
|
||||
@ -83,8 +88,8 @@ public class FactionsPlayerListener extends PlayerListener{
|
||||
// Why? Because the relations will differ.
|
||||
event.setCancelled(true);
|
||||
|
||||
for (Player listeningPlayer : Factions.factions.getServer().getOnlinePlayers()) {
|
||||
Follower you = Follower.get(listeningPlayer);
|
||||
for (Player listeningPlayer : Factions.instance.getServer().getOnlinePlayers()) {
|
||||
FPlayer you = FPlayer.get(listeningPlayer);
|
||||
String yourFormat = formatStart + me.getChatTag(you) + formatEnd;
|
||||
listeningPlayer.sendMessage(String.format(yourFormat, talkingPlayer.getDisplayName(), msg));
|
||||
}
|
||||
@ -102,7 +107,7 @@ public class FactionsPlayerListener extends PlayerListener{
|
||||
ArrayList<String> tokens = TextUtil.split(msg.trim());
|
||||
if (Conf.aliasBase.contains(tokens.get(0))) {
|
||||
tokens.remove(0);
|
||||
Follower follower = Follower.get(player);
|
||||
FPlayer follower = FPlayer.get(player);
|
||||
Commands.base(follower, tokens);
|
||||
return true;
|
||||
}
|
||||
@ -116,14 +121,14 @@ public class FactionsPlayerListener extends PlayerListener{
|
||||
|
||||
@Override
|
||||
public void onPlayerQuit(PlayerEvent event) {
|
||||
Follower follower = Follower.get(event.getPlayer());
|
||||
FPlayer follower = FPlayer.get(event.getPlayer());
|
||||
Log.debug("Saved follower on player quit: "+follower.getName());
|
||||
follower.save(); // We save the followers on logout in order to save their non autosaved state like power.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerMove(PlayerMoveEvent event) {
|
||||
Follower me = Follower.get(event.getPlayer());
|
||||
FPlayer me = FPlayer.get(event.getPlayer());
|
||||
|
||||
// Did we change coord?
|
||||
Coord coordFrom = me.lastStoodInCoord;
|
||||
@ -168,7 +173,7 @@ public class FactionsPlayerListener extends PlayerListener{
|
||||
}
|
||||
|
||||
//currently checking placement/use of: redstone, sign, flint&steel, beds (not currently detected by Bukkit), buckets (empty, water, lava), repeater (not currently detected by Bukkit)
|
||||
private static Set<Integer> badItems = new HashSet(Arrays.asList(
|
||||
private static Set<Integer> badItems = new HashSet<Integer>(Arrays.asList(
|
||||
new Integer[] {331, 323, 259, 355, 325, 326, 327, 356}
|
||||
));
|
||||
|
||||
@ -185,7 +190,7 @@ public class FactionsPlayerListener extends PlayerListener{
|
||||
return true; // This is not faction territory. Use whatever you like here.
|
||||
}
|
||||
|
||||
Follower me = Follower.get(player);
|
||||
FPlayer me = FPlayer.get(player);
|
||||
Faction myFaction = me.getFaction();
|
||||
|
||||
// Cancel if we are not in our own territory
|
||||
|
@ -2,7 +2,7 @@ package com.bukkit.mcteam.factions.struct;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
import com.bukkit.mcteam.factions.entities.*;
|
||||
import com.bukkit.mcteam.factions.Conf;
|
||||
|
||||
public enum Relation {
|
||||
MEMBER(3, "member"),
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.bukkit.mcteam.factions.struct;
|
||||
|
||||
import com.bukkit.mcteam.factions.entities.Conf;
|
||||
import com.bukkit.mcteam.factions.Conf;
|
||||
|
||||
public enum Role {
|
||||
ADMIN(2, "admin"),
|
||||
|
@ -1,39 +0,0 @@
|
||||
package com.bukkit.mcteam.factions.util;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.bukkit.mcteam.factions.Factions;
|
||||
|
||||
public class Log {
|
||||
public static String prefix = Factions.factions.getDescription().getName();
|
||||
public static ArrayList<Player> debuggers = new ArrayList<Player>();
|
||||
public static int threshold = 10;
|
||||
|
||||
public static void log(int level, String prefix, String msg) {
|
||||
if (threshold <= level) {
|
||||
msg = Log.prefix+prefix+msg;
|
||||
System.out.println(msg);
|
||||
for(Player debugger : debuggers) {
|
||||
debugger.sendMessage(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void debug (String msg) {
|
||||
log(10, " debug: ", msg);
|
||||
}
|
||||
|
||||
public static void info (String msg) {
|
||||
log(20, " info: ", msg);
|
||||
}
|
||||
|
||||
public static void warn (String msg) {
|
||||
log(30, " warn: ", msg);
|
||||
}
|
||||
|
||||
public static void severe (String msg) {
|
||||
log(40, " severe: ", msg);
|
||||
}
|
||||
}
|
@ -3,7 +3,7 @@ import java.util.*;
|
||||
|
||||
import org.bukkit.Material;
|
||||
|
||||
import com.bukkit.mcteam.factions.entities.*;
|
||||
import com.bukkit.mcteam.factions.Conf;
|
||||
|
||||
public class TextUtil {
|
||||
public static String titleize(String str) {
|
||||
|
@ -1,230 +0,0 @@
|
||||
package com.bukkit.mcteam.util;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* The purpose of this tool is twofold:
|
||||
* 1: Avoid client crashes due to bad color formating.
|
||||
* 2: Make color continue on word wrapping
|
||||
*
|
||||
* In minecraft the degree sign is used as a prefix to another char to create a color.
|
||||
* For example the code for white is "\u00A7f".
|
||||
* The "\u00A7" is the unicode notation for the degree sign and the "f" means white.
|
||||
*
|
||||
* When does minecraft wrap the text? After how many chars?
|
||||
* Answer:
|
||||
* Because the font isn't monospace this differs depending on what you write.
|
||||
* However we can fit 53 "M" without wrapping and the 54th char would then wrap (be at the beginning of the next line instead)
|
||||
* As there is no broader char than "M" we can know for sure the minimum line length is 53.
|
||||
* Note that this means the number of DISPLAYED chars per row is 53.
|
||||
* A degree sign and the char after will NOT count, as they will not be displayed as chars.
|
||||
*
|
||||
* Good to know: Numbers have the same font width as an M.
|
||||
*
|
||||
* When does the client crash?
|
||||
* Answer:
|
||||
* When a row ends with a degree char and optionally another sign after.
|
||||
* Another way to say the same: When a line ends with either a broken or valid color notation.
|
||||
* AND
|
||||
* The client will ALWAYS crash if the sign after the last displayed char in a row is a degree char.
|
||||
* A goofy way to explatin it:
|
||||
* For a line with only "M" and numbers, the fiftyfourth "displayed char" musn't be a degree sign.
|
||||
*
|
||||
* WARNING:
|
||||
* Above is a hypothesis I have created based on what my experiments have shown.
|
||||
* I am fairly sure it is correct but please help me test it further.
|
||||
*/
|
||||
public class ChatFixUtil {
|
||||
public final static char deg = '\u00A7';
|
||||
public final static int lineLength = 53;
|
||||
|
||||
/**
|
||||
* This method wraps the msg for you at row lengths of 53,
|
||||
* avoids client crash scenarios and makes the previous color continue on
|
||||
* the next line.
|
||||
*
|
||||
* The upsides with filtering your messages through this method are:
|
||||
* - No client crashes.
|
||||
* - Line wrapping with preserved color.
|
||||
*
|
||||
* The downsides are:
|
||||
* - The width of the chat window will not be used to it's fullest.
|
||||
* For example you can fit more that 53 commas (,) in a chatwindow row
|
||||
* but the line would break after 53 displayed chars.
|
||||
*
|
||||
* Suggested usage:
|
||||
* NO NEED TO USE the fix method for static help pages in your plugin.
|
||||
* As the text is static you can make sure there is no client crash yourself
|
||||
* and be able to use the full line length.
|
||||
*
|
||||
* DO USE in cases like where you output colored messages with playernames in your
|
||||
* plugin. As the player names have different length there is potential for client crash.
|
||||
*/
|
||||
public static ArrayList<String> fix(String msg) {
|
||||
// Make sure the end of msg is good
|
||||
msg = cleanMsgEnding(msg);
|
||||
|
||||
ArrayList<String> ret = new ArrayList<String>();
|
||||
int displen = 0; // The number of displayed chars in row so far.
|
||||
String row = "";
|
||||
String latestColor = null;
|
||||
|
||||
for (int i = 0; i < msg.length(); i++) {
|
||||
if (displen == lineLength) {
|
||||
// it is time to start on the next row!
|
||||
ret.add(row);
|
||||
displen = 0;
|
||||
row = "";
|
||||
if (latestColor != null) {
|
||||
row += deg+latestColor;
|
||||
}
|
||||
}
|
||||
char c = msg.charAt(i);
|
||||
|
||||
if (c == deg) {
|
||||
latestColor = String.valueOf(msg.charAt(i+1));
|
||||
row += deg+latestColor;
|
||||
i++;
|
||||
} else {
|
||||
displen += 1;
|
||||
row += c;
|
||||
}
|
||||
}
|
||||
ret.add(row);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static ArrayList<String> fix(List<String> messages) {
|
||||
ArrayList<String> ret = new ArrayList<String>();
|
||||
for(String message : messages) {
|
||||
ret.addAll(fix(message));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Removes the ending chars as long as they are deg or deg+'anychar' or a space
|
||||
* As I see it we would never want those chars at the end of a msg.
|
||||
*/
|
||||
protected static String cleanMsgEnding (String msg) {
|
||||
|
||||
while (msg.length() > 0) {
|
||||
if (msg.endsWith(String.valueOf(deg)) || msg.endsWith(" ")) {
|
||||
msg = msg.substring(0, msg.length()-1);
|
||||
} else if (msg.length() >= 2 && msg.charAt(msg.length() - 2) == deg) {
|
||||
msg = msg.substring(0, msg.length()-2);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* This test util assumes line break after 53 displayed chars.
|
||||
* The fix method above breaks like that so this method should
|
||||
* be a valid way to test if a message row would crash a client.
|
||||
*/
|
||||
public static String thisMsgWouldCrashClient(String str) {
|
||||
// There would always be crash if we end with deg or deg+'anychar'
|
||||
if (str.length() >= 1 && str.charAt(str.length() - 1) == deg) {
|
||||
return "Crash: The str ends with deg.";
|
||||
} else if (str.length() >= 2 && str.charAt(str.length() - 2) == deg) {
|
||||
return "Crash: The str ends with deg+'anychar'.";
|
||||
}
|
||||
|
||||
int displayedChars = 0;
|
||||
|
||||
for (int i = 0; i < str.length(); i++) {
|
||||
char c = str.charAt(i);
|
||||
if (c == deg && displayedChars == lineLength) {
|
||||
return "Crash: Deg as fiftyforth \"displayed\" char";
|
||||
} else if (c == deg) {
|
||||
i++; // this and next: they are not displayed... skip them...
|
||||
} else {
|
||||
displayedChars += 1;
|
||||
}
|
||||
}
|
||||
return "all ok";
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Methods for effectively sending messages
|
||||
//----------------------------------------------//
|
||||
//----------------------------------------------//
|
||||
// One player
|
||||
//----------------------------------------------//
|
||||
public static void sendMessage(Player player, String message, boolean fix) {
|
||||
if (fix) {
|
||||
List<String> messages = ChatFixUtil.fix(message);
|
||||
sendMessage(player, messages, false);
|
||||
} else {
|
||||
if (player != null) {
|
||||
player.sendMessage(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void sendMessage(Player player, List<String> messages, boolean fix) {
|
||||
if (fix) {
|
||||
messages = ChatFixUtil.fix(messages);
|
||||
}
|
||||
for (String message : messages) {
|
||||
sendMessage(player, message, false);
|
||||
}
|
||||
}
|
||||
public static void sendMessage(Player player, String message) {
|
||||
sendMessage(player, message, true);
|
||||
}
|
||||
public static void sendMessage(Player player, List<String> messages) {
|
||||
sendMessage(player, messages, true);
|
||||
}
|
||||
//----------------------------------------------//
|
||||
// Many Players
|
||||
//----------------------------------------------//
|
||||
public static void sendMessage(Collection<Player> players, String message, boolean fix) {
|
||||
if (fix) {
|
||||
List<String> messages = ChatFixUtil.fix(message);
|
||||
sendMessage(players, messages, false);
|
||||
} else {
|
||||
for (Player player : players) {
|
||||
sendMessage(player, message, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void sendMessage(Collection<Player> players, List<String> messages, boolean fix) {
|
||||
if (fix) {
|
||||
messages = ChatFixUtil.fix(messages);
|
||||
}
|
||||
|
||||
for (String message : messages) {
|
||||
sendMessage(players, message, false);
|
||||
}
|
||||
}
|
||||
public static void sendMessage(Collection<Player> players, String message) {
|
||||
sendMessage(players, message, true);
|
||||
}
|
||||
public static void sendMessage(Collection<Player> players, List<String> messages) {
|
||||
sendMessage(players, messages, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user