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;
|
2011-02-06 13:36:11 +01:00
|
|
|
import java.util.*;
|
2011-03-18 17:33:23 +01:00
|
|
|
import java.util.Map.Entry;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
|
|
|
import org.bukkit.ChatColor;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
import com.bukkit.mcteam.factions.struct.Relation;
|
|
|
|
import com.bukkit.mcteam.factions.struct.Role;
|
2011-03-18 17:33:23 +01:00
|
|
|
import com.bukkit.mcteam.gson.reflect.TypeToken;
|
|
|
|
import com.bukkit.mcteam.util.DiscUtil;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-22 15:45:41 +01:00
|
|
|
/**
|
|
|
|
* Logged in players always have exactly one FPlayer instance.
|
|
|
|
* Logged out players may or may not have an FPlayer instance. They will always have one if they are part of a faction.
|
|
|
|
* This is because only players with a faction are saved to disk (in order to not waste disk space).
|
|
|
|
*
|
|
|
|
* The FPlayer is linked to a minecraft player using the player name in lowercase form.
|
|
|
|
* Lowercase is enforced while loading from disk TODO
|
|
|
|
*
|
|
|
|
* The same instance is always returned for the same player.
|
|
|
|
* This means you can use the == operator. No .equals method necessary.
|
|
|
|
*/
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
public class FPlayer {
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Fields
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
private static transient Map<String, FPlayer> instances = new HashMap<String, FPlayer>();
|
|
|
|
private static transient File file = new File(Factions.instance.getDataFolder(), "players.json");
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
private transient String playerName;
|
|
|
|
private transient FLocation lastStoodAt = new FLocation(); // Where did this player stand the last time we checked?
|
|
|
|
|
|
|
|
private int factionId;
|
|
|
|
private Role role;
|
2011-02-06 13:36:11 +01:00
|
|
|
private String title;
|
|
|
|
private double power;
|
|
|
|
private long lastPowerUpdateTime;
|
2011-03-22 15:45:41 +01:00
|
|
|
private transient boolean mapAutoUpdating;
|
2011-02-13 09:08:20 +01:00
|
|
|
private boolean factionChatting;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Construct
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
public FPlayer(Player player) {
|
2011-03-22 15:45:41 +01:00
|
|
|
this.playerName = player.getName().toLowerCase();
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
2011-03-22 15:45:41 +01:00
|
|
|
public FPlayer(String playerName) {
|
|
|
|
this.playerName = playerName.toLowerCase();
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// GSON need this noarg constructor.
|
|
|
|
public FPlayer() {
|
2011-03-19 13:00:03 +01:00
|
|
|
this.resetFactionData();
|
|
|
|
this.power = this.getPowerMax();
|
|
|
|
this.lastPowerUpdateTime = System.currentTimeMillis();
|
|
|
|
this.mapAutoUpdating = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void resetFactionData() {
|
|
|
|
this.factionId = 0; // The default neutral faction
|
|
|
|
this.factionChatting = false;
|
|
|
|
this.role = Role.NORMAL;
|
|
|
|
this.title = "";
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Minecraft Player
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
public Player getPlayer() {
|
2011-03-22 15:45:41 +01:00
|
|
|
return Factions.instance.getServer().getPlayer(playerName);
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
|
|
|
|
// TODO lowercase vs mixedcase for logged in chars...
|
2011-03-18 17:33:23 +01:00
|
|
|
public String getPlayerName() {
|
2011-03-22 15:45:41 +01:00
|
|
|
return this.playerName;
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isOnline() {
|
2011-03-22 15:45:41 +01:00
|
|
|
return Factions.instance.getServer().getPlayer(playerName) != null;
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isOffline() {
|
|
|
|
return ! isOnline();
|
|
|
|
}
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Getters And Setters
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
public Faction getFaction() {
|
|
|
|
return Faction.get(factionId);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setFaction(Faction faction) {
|
|
|
|
this.factionId = faction.getId();
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean hasFaction() {
|
|
|
|
return factionId != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Role getRole() {
|
|
|
|
return this.role;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setRole(Role role) {
|
|
|
|
this.role = role;
|
|
|
|
}
|
|
|
|
|
2011-02-13 09:08:20 +01:00
|
|
|
public boolean isFactionChatting() {
|
|
|
|
if (this.factionId == 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return factionChatting;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setFactionChatting(boolean factionChatting) {
|
|
|
|
this.factionChatting = factionChatting;
|
|
|
|
}
|
2011-02-06 13:36:11 +01:00
|
|
|
|
|
|
|
public boolean isMapAutoUpdating() {
|
|
|
|
return mapAutoUpdating;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setMapAutoUpdating(boolean mapAutoUpdating) {
|
|
|
|
this.mapAutoUpdating = mapAutoUpdating;
|
|
|
|
}
|
2011-02-12 18:05:05 +01:00
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
public FLocation getLastStoodAt() {
|
|
|
|
return this.lastStoodAt;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setLastStoodAt(FLocation flocation) {
|
|
|
|
this.lastStoodAt = flocation;
|
|
|
|
}
|
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
//----------------------------------------------//
|
|
|
|
// Title, Name, Faction Tag and Chat
|
|
|
|
//----------------------------------------------//
|
|
|
|
|
|
|
|
// Base:
|
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
public String getTitle() {
|
|
|
|
return title;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setTitle(String title) {
|
|
|
|
this.title = title;
|
2011-03-19 13:00:03 +01:00
|
|
|
save();
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
public String getName() {
|
2011-03-22 15:45:41 +01:00
|
|
|
return this.playerName;
|
2011-02-12 18:05:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public String getTag() {
|
2011-03-19 13:00:03 +01:00
|
|
|
if ( ! this.hasFaction()) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return "";
|
|
|
|
}
|
|
|
|
return this.getFaction().getTag();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Base concatenations:
|
|
|
|
|
|
|
|
public String getNameAndSomething(String something) {
|
|
|
|
String ret = this.role.getPrefix();
|
|
|
|
if (something.length() > 0) {
|
|
|
|
ret += something+" ";
|
|
|
|
}
|
|
|
|
ret += this.getName();
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getNameAndTitle() {
|
|
|
|
return this.getNameAndSomething(this.getTitle());
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getNameAndTag() {
|
|
|
|
return this.getNameAndSomething(this.getTag());
|
|
|
|
}
|
|
|
|
|
|
|
|
// Colored concatenations:
|
|
|
|
// These are used in information messages
|
|
|
|
|
|
|
|
public String getNameAndTitle(Faction faction) {
|
|
|
|
return this.getRelationColor(faction)+this.getNameAndTitle();
|
|
|
|
}
|
2011-03-18 17:33:23 +01:00
|
|
|
public String getNameAndTitle(FPlayer follower) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return this.getRelationColor(follower)+this.getNameAndTitle();
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getNameAndTag(Faction faction) {
|
|
|
|
return this.getRelationColor(faction)+this.getNameAndTag();
|
|
|
|
}
|
2011-03-18 17:33:23 +01:00
|
|
|
public String getNameAndTag(FPlayer follower) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return this.getRelationColor(follower)+this.getNameAndTag();
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getNameAndRelevant(Faction faction) {
|
|
|
|
// Which relation?
|
|
|
|
Relation rel = this.getRelation(faction);
|
|
|
|
|
|
|
|
// For member we show title
|
|
|
|
if (rel == Relation.MEMBER) {
|
|
|
|
return rel.getColor() + this.getNameAndTitle();
|
|
|
|
}
|
|
|
|
|
|
|
|
// For non members we show tag
|
|
|
|
return rel.getColor() + this.getNameAndTag();
|
|
|
|
}
|
2011-03-18 17:33:23 +01:00
|
|
|
public String getNameAndRelevant(FPlayer follower) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return getNameAndRelevant(follower.getFaction());
|
|
|
|
}
|
|
|
|
|
|
|
|
// Chat Tag:
|
|
|
|
// These are injected into the format of global chat messages.
|
|
|
|
|
|
|
|
public String getChatTag() {
|
2011-03-19 13:00:03 +01:00
|
|
|
if ( ! this.hasFaction()) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
return String.format(Conf.chatTagFormat, this.role.getPrefix()+this.getTag());
|
|
|
|
}
|
|
|
|
|
|
|
|
// Colored Chat Tag
|
|
|
|
public String getChatTag(Faction faction) {
|
2011-03-19 13:00:03 +01:00
|
|
|
if ( ! this.hasFaction()) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.getRelation(faction).getColor()+getChatTag();
|
|
|
|
}
|
2011-03-18 17:33:23 +01:00
|
|
|
public String getChatTag(FPlayer follower) {
|
2011-03-19 13:00:03 +01:00
|
|
|
if ( ! this.hasFaction()) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.getRelation(follower).getColor()+getChatTag();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------
|
|
|
|
// Relation and relation colors
|
|
|
|
// -------------------------------
|
|
|
|
|
|
|
|
public Relation getRelation(Faction faction) {
|
|
|
|
return faction.getRelation(this);
|
|
|
|
}
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
public Relation getRelation(FPlayer follower) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return this.getFaction().getRelation(follower);
|
|
|
|
}
|
|
|
|
|
|
|
|
public ChatColor getRelationColor(Faction faction) {
|
|
|
|
return faction.getRelationColor(this);
|
|
|
|
}
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
public ChatColor getRelationColor(FPlayer follower) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return this.getRelation(follower).getColor();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
//----------------------------------------------//
|
|
|
|
// Health
|
|
|
|
//----------------------------------------------//
|
|
|
|
public void heal(int amnt) {
|
|
|
|
Player player = this.getPlayer();
|
|
|
|
if (player == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
player.setHealth(player.getHealth() + amnt);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------//
|
|
|
|
// Power
|
|
|
|
//----------------------------------------------//
|
|
|
|
public double getPower() {
|
|
|
|
this.updatePower();
|
|
|
|
return this.power;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void alterPower(double delta) {
|
|
|
|
this.power += delta;
|
|
|
|
if (this.power > this.getPowerMax()) {
|
|
|
|
this.power = this.getPowerMax();
|
|
|
|
} else if (this.power < this.getPowerMin()) {
|
|
|
|
this.power = this.getPowerMin();
|
|
|
|
}
|
2011-02-13 17:02:51 +01:00
|
|
|
//Log.debug("Power of "+this.getName()+" is now: "+this.power);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public double getPowerMax() {
|
2011-02-12 18:05:05 +01:00
|
|
|
return Conf.powerPlayerMax;
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public double getPowerMin() {
|
2011-02-12 18:05:05 +01:00
|
|
|
return Conf.powerPlayerMin;
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public int getPowerRounded() {
|
|
|
|
return (int) Math.round(this.getPower());
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getPowerMaxRounded() {
|
|
|
|
return (int) Math.round(this.getPowerMax());
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getPowerMinRounded() {
|
|
|
|
return (int) Math.round(this.getPowerMin());
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void updatePower() {
|
|
|
|
long now = System.currentTimeMillis();
|
|
|
|
long millisPassed = now - this.lastPowerUpdateTime;
|
|
|
|
this.lastPowerUpdateTime = now;
|
|
|
|
|
|
|
|
int millisPerMinute = 60*1000;
|
|
|
|
this.alterPower(millisPassed * Conf.powerPerMinute / millisPerMinute);
|
|
|
|
//this.save(); // This would save to often. So we save this on player quit instead.
|
|
|
|
}
|
|
|
|
|
|
|
|
public void onDeath() {
|
|
|
|
this.updatePower();
|
|
|
|
this.alterPower(-Conf.powerPerDeath);
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------//
|
|
|
|
// Territory
|
|
|
|
//----------------------------------------------//
|
|
|
|
public boolean isInOwnTerritory() {
|
2011-03-22 17:20:21 +01:00
|
|
|
return Board.getFactionAt(new FLocation(this)) == this.getFaction();
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isInOthersTerritory() {
|
2011-03-19 13:00:03 +01:00
|
|
|
int idHere = Board.getIdAt(new FLocation(this));
|
|
|
|
return idHere != 0 && idHere != this.factionId;
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public void sendFactionHereMessage() {
|
2011-03-19 13:00:03 +01:00
|
|
|
Faction factionHere = Board.getFactionAt(new FLocation(this));
|
2011-02-12 18:05:05 +01:00
|
|
|
String msg = Conf.colorSystem+" ~ "+factionHere.getTag(this);
|
2011-03-22 17:20:21 +01:00
|
|
|
if (factionHere.getId() != 0) {
|
2011-02-12 18:05:05 +01:00
|
|
|
msg += " - "+factionHere.getDescription();
|
|
|
|
}
|
2011-02-06 13:36:11 +01:00
|
|
|
this.sendMessage(msg);
|
|
|
|
}
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Messages
|
|
|
|
// -------------------------------------------- //
|
|
|
|
public void sendMessage(String message) {
|
|
|
|
this.getPlayer().sendMessage(Conf.colorSystem + message);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
public void sendMessage(List<String> messages) {
|
|
|
|
for(String message : messages) {
|
|
|
|
this.sendMessage(message);
|
|
|
|
}
|
2011-02-12 18:05:05 +01:00
|
|
|
}
|
2011-03-22 17:20:21 +01:00
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
// -------------------------------------------- //
|
2011-03-19 13:00:03 +01:00
|
|
|
// Get and search
|
2011-03-18 17:33:23 +01:00
|
|
|
// -------------------------------------------- //
|
2011-03-22 15:45:41 +01:00
|
|
|
public static FPlayer get(String playerName) {
|
|
|
|
playerName = playerName.toLowerCase();
|
|
|
|
if (instances.containsKey(playerName)) {
|
|
|
|
return instances.get(playerName);
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
|
2011-03-22 15:45:41 +01:00
|
|
|
FPlayer vplayer = new FPlayer(playerName);
|
|
|
|
instances.put(playerName, vplayer);
|
2011-03-18 17:33:23 +01:00
|
|
|
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());
|
|
|
|
}
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public static Set<FPlayer> getAllOnline() {
|
|
|
|
Set<FPlayer> fplayers = new HashSet<FPlayer>();
|
|
|
|
for (Player player : Factions.instance.getServer().getOnlinePlayers()) {
|
|
|
|
fplayers.add(FPlayer.get(player));
|
|
|
|
}
|
|
|
|
return fplayers;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Collection<FPlayer> getAll() {
|
|
|
|
return instances.values();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static FPlayer find(String playername) {
|
|
|
|
for (Entry<String, FPlayer> entry : instances.entrySet()) {
|
|
|
|
if (entry.getKey().equalsIgnoreCase(playername)) {
|
|
|
|
return entry.getValue();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// 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();
|
2011-03-22 15:45:41 +01:00
|
|
|
Map<String, FPlayer> instancesFromFile = Factions.gson.fromJson(DiscUtil.read(file), type);
|
|
|
|
|
|
|
|
instances = new HashMap<String, FPlayer>();
|
|
|
|
for (Entry<String, FPlayer> instanceFromFile : instancesFromFile.entrySet()) {
|
|
|
|
instances.put(instanceFromFile.getKey().toLowerCase(), instanceFromFile.getValue());
|
|
|
|
}
|
2011-03-18 17:33:23 +01:00
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
fillPlayernames();
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void fillPlayernames() {
|
|
|
|
for(Entry<String, FPlayer> entry : instances.entrySet()) {
|
2011-03-22 15:45:41 +01:00
|
|
|
entry.getValue().playerName = entry.getKey();
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|