Moved Faction entity to useage of MStore as well.
This commit is contained in:
parent
76f3f044ca
commit
3036b0a157
@ -164,7 +164,8 @@ public class Board extends Entity<Board, String> implements BoardInterface
|
||||
for (Entry<PS, TerritoryAccess> entry : this.map.entrySet())
|
||||
{
|
||||
TerritoryAccess territoryAccess = entry.getValue();
|
||||
if (FactionColl.i.exists(territoryAccess.getHostFactionId())) continue;
|
||||
|
||||
if (FactionColl.get().containsId(territoryAccess.getHostFactionId())) continue;
|
||||
|
||||
PS ps = entry.getKey();
|
||||
this.removeAt(ps);
|
||||
|
@ -17,14 +17,17 @@ public class Const
|
||||
public static final String COLLECTION_BASENAME_PLAYER = COLLECTION_BASENAME_+"player";
|
||||
public static final String COLLECTION_BASENAME_FACTION = COLLECTION_BASENAME_+"faction";
|
||||
|
||||
// ASCII Map
|
||||
// Defautlt faction ids
|
||||
public static final String FACTIONID_NONE = "0";
|
||||
public static final String FACTIONID_SAFEZONE = "-1";
|
||||
public static final String FACTIONID_WARZONE = "-2";
|
||||
|
||||
// ASCII Map
|
||||
public static final int MAP_HEIGHT = 8;
|
||||
public static final int MAP_WIDTH = 39;
|
||||
public static final char[] MAP_KEY_CHARS = "\\/#?$%=&^ABCDEFGHJKLMNOPQRSTUVWXYZ1234567890abcdeghjmnopqrsuvwxyz".toCharArray();
|
||||
|
||||
// Enumerations
|
||||
|
||||
public static final Set<Material> MATERIALS_EDIT_ON_INTERACT = MUtil.set(
|
||||
Material.DIODE_BLOCK_OFF,
|
||||
Material.DIODE_BLOCK_ON,
|
||||
|
@ -66,7 +66,7 @@ public class FPlayer extends SenderEntity<FPlayer> implements EconomyParticipato
|
||||
|
||||
// FIELD: factionId
|
||||
private String factionId;
|
||||
public Faction getFaction() { if(this.factionId == null) {return null;} return FactionColl.i.get(this.factionId); }
|
||||
public Faction getFaction() { if(this.factionId == null) {return null;} return FactionColl.get().get(this.factionId); }
|
||||
public String getFactionId() { return this.factionId; }
|
||||
public boolean hasFaction() { return this.factionId != null && ! factionId.equals("0"); }
|
||||
public void setFaction(Faction faction)
|
||||
@ -149,7 +149,7 @@ public class FPlayer extends SenderEntity<FPlayer> implements EconomyParticipato
|
||||
this.loginPvpDisabled = (ConfServer.noPVPDamageToOthersForXSecondsAfterLogin > 0) ? true : false;
|
||||
this.powerBoost = 0.0;
|
||||
|
||||
if ( ! ConfServer.newPlayerStartingFactionID.equals("0") && FactionColl.i.exists(ConfServer.newPlayerStartingFactionID))
|
||||
if ( ! ConfServer.newPlayerStartingFactionID.equals("0") && FactionColl.get().containsId(ConfServer.newPlayerStartingFactionID))
|
||||
{
|
||||
this.factionId = ConfServer.newPlayerStartingFactionID;
|
||||
}
|
||||
@ -157,7 +157,7 @@ public class FPlayer extends SenderEntity<FPlayer> implements EconomyParticipato
|
||||
|
||||
public final void resetFactionData(boolean doSpoutUpdate)
|
||||
{
|
||||
if (this.factionId != null && FactionColl.i.exists(this.factionId)) // Avoid infinite loop! TODO: I think that this is needed is a sign we need to refactor.
|
||||
if (this.factionId != null && FactionColl.get().containsId(this.factionId)) // Avoid infinite loop! TODO: I think that this is needed is a sign we need to refactor.
|
||||
{
|
||||
Faction currentFaction = this.getFaction();
|
||||
if (currentFaction != null)
|
||||
|
@ -24,7 +24,7 @@ public class FPlayerColl extends SenderColl<FPlayer>
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// OVERRIDE: COLL
|
||||
// -------------------------------------------- //
|
||||
|
||||
// TODO: Init and migration routine!
|
||||
@ -70,11 +70,10 @@ public class FPlayerColl extends SenderColl<FPlayer>
|
||||
{
|
||||
for (FPlayer fplayer : this.getAll())
|
||||
{
|
||||
if ( ! FactionColl.i.exists(fplayer.getFactionId()))
|
||||
{
|
||||
Factions.get().log("Reset faction data (invalid faction) for player "+fplayer.getName());
|
||||
fplayer.resetFactionData(false);
|
||||
}
|
||||
if (FactionColl.get().containsId(fplayer.getFactionId())) continue;
|
||||
|
||||
Factions.get().log("Reset faction data (invalid faction) for player "+fplayer.getName());
|
||||
fplayer.resetFactionData(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11,28 +11,28 @@ import com.massivecraft.factions.iface.RelationParticipator;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
import com.massivecraft.factions.util.*;
|
||||
import com.massivecraft.factions.zcore.persist.Entity;
|
||||
import com.massivecraft.mcore.ps.PS;
|
||||
import com.massivecraft.mcore.store.Entity;
|
||||
import com.massivecraft.mcore.util.Txt;
|
||||
import com.massivecraft.mcore.xlib.gson.annotations.SerializedName;
|
||||
|
||||
|
||||
public class Faction extends Entity implements EconomyParticipator
|
||||
public class Faction extends Entity<Faction, String> implements EconomyParticipator
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// META
|
||||
// -------------------------------------------- //
|
||||
|
||||
/*public static Faction get(Object oid)
|
||||
public static Faction get(Object oid)
|
||||
{
|
||||
return FactionColl.get().get(oid);
|
||||
}*/
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE: ENTITY
|
||||
// -------------------------------------------- //
|
||||
|
||||
/*@Override
|
||||
@Override
|
||||
public Faction load(Faction that)
|
||||
{
|
||||
this.relationWish = that.relationWish;
|
||||
@ -47,26 +47,6 @@ public class Faction extends Entity implements EconomyParticipator
|
||||
this.permOverrides = that.permOverrides;
|
||||
|
||||
return this;
|
||||
}*/
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Persistance and entity management
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public void postDetach()
|
||||
{
|
||||
if (Econ.shouldBeUsed())
|
||||
{
|
||||
Econ.setBalance(getAccountId(), 0);
|
||||
}
|
||||
|
||||
// Clean the board
|
||||
// TODO: Use events for this instead
|
||||
BoardColl.get().clean();
|
||||
|
||||
// Clean the fplayers
|
||||
FPlayerColl.get().clean();
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
@ -411,7 +391,7 @@ public class Faction extends Entity implements EconomyParticipator
|
||||
{
|
||||
ret.put(rel, new ArrayList<String>());
|
||||
}
|
||||
for (Faction faction : FactionColl.i.get())
|
||||
for (Faction faction : FactionColl.get().getAll())
|
||||
{
|
||||
Rel relation = faction.getRelationTo(this);
|
||||
if (onlyNonNeutral && relation == Rel.NEUTRAL) continue;
|
||||
|
@ -3,29 +3,129 @@ package com.massivecraft.factions;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.logging.Level;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
import com.massivecraft.mcore.store.Coll;
|
||||
import com.massivecraft.mcore.store.MStore;
|
||||
import com.massivecraft.mcore.util.DiscUtil;
|
||||
import com.massivecraft.mcore.util.Txt;
|
||||
import com.massivecraft.mcore.xlib.gson.reflect.TypeToken;
|
||||
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.util.MiscUtil;
|
||||
import com.massivecraft.factions.zcore.persist.EntityCollection;
|
||||
|
||||
public class FactionColl extends EntityCollection<Faction>
|
||||
public class FactionColl extends Coll<Faction, String>
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// INSTANCE & CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public static FactionColl i = new FactionColl();
|
||||
// public static FactionColl get() { return i; }
|
||||
// TODO: Crap, does not work because of the instance method colliding.
|
||||
private static FactionColl i = new FactionColl();
|
||||
public static FactionColl get() { return i; }
|
||||
private FactionColl()
|
||||
{
|
||||
super(MStore.getDb(ConfServer.dburi), Factions.get(), "ai", Const.COLLECTION_BASENAME_FACTION, Faction.class, String.class, false);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE: COLL
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public void init()
|
||||
{
|
||||
super.init();
|
||||
|
||||
this.migrate();
|
||||
|
||||
this.createDefaultFactions();
|
||||
|
||||
// TODO: Refactor and fix with the member-index.
|
||||
// populate all faction player lists
|
||||
// or as you also could describe it: Reindex of Members
|
||||
for (Faction faction : this.getAll())
|
||||
{
|
||||
faction.refreshFPlayers();
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: REMEMBER: Deciding on the next AI value is part of the migration routine.
|
||||
public void migrate()
|
||||
{
|
||||
// Create file objects
|
||||
File oldFile = new File(Factions.get().getDataFolder(), "factions.json");
|
||||
File newFile = new File(Factions.get().getDataFolder(), "factions.json.migrated");
|
||||
|
||||
// Already migrated?
|
||||
if ( ! oldFile.exists()) return;
|
||||
|
||||
// Read the file content through GSON.
|
||||
Type type = new TypeToken<Map<String, Faction>>(){}.getType();
|
||||
Map<String, Faction> id2faction = Factions.get().gson.fromJson(DiscUtil.readCatch(oldFile), type);
|
||||
|
||||
// Set the data
|
||||
for (Entry<String, Faction> entry : id2faction.entrySet())
|
||||
{
|
||||
String factionId = entry.getKey();
|
||||
Faction faction = entry.getValue();
|
||||
FactionColl.get().create(factionId).load(faction);
|
||||
}
|
||||
|
||||
// Mark as migrated
|
||||
oldFile.renameTo(newFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Faction detachId(Object oid)
|
||||
{
|
||||
String accountId = this.get(oid).getAccountId();
|
||||
|
||||
Faction ret = super.detachId(oid);
|
||||
|
||||
if (Econ.shouldBeUsed())
|
||||
{
|
||||
Econ.setBalance(accountId, 0);
|
||||
}
|
||||
|
||||
// Clean the board
|
||||
// TODO: Use events for this instead?
|
||||
BoardColl.get().clean();
|
||||
|
||||
// Clean the fplayers
|
||||
FPlayerColl.get().clean();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// GET
|
||||
// -------------------------------------------- //
|
||||
|
||||
// TODO: I hope this one is not crucial anymore.
|
||||
// If it turns out to be I will just have to recreate the feature in the proper place.
|
||||
/*
|
||||
@Override
|
||||
public Faction get(String id)
|
||||
{
|
||||
if ( ! this.exists(id))
|
||||
{
|
||||
Factions.get().log(Level.WARNING, "Non existing factionId "+id+" requested! Issuing cleaning!");
|
||||
BoardColl.get().clean();
|
||||
FPlayerColl.get().clean();
|
||||
}
|
||||
|
||||
return super.get(id);
|
||||
}
|
||||
*/
|
||||
|
||||
public Faction getNone()
|
||||
{
|
||||
return this.get(Const.FACTIONID_NONE);
|
||||
}
|
||||
|
||||
/*
|
||||
private FactionColl()
|
||||
{
|
||||
super
|
||||
@ -44,165 +144,12 @@ public class FactionColl extends EntityCollection<Faction>
|
||||
return new TypeToken<Map<String, Faction>>(){}.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean loadFromDisc()
|
||||
{
|
||||
if ( ! super.loadFromDisc()) return false;
|
||||
*/
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Create Default Special Factions
|
||||
// -------------------------------------------- //
|
||||
if ( ! this.exists("0"))
|
||||
{
|
||||
Faction faction = this.create("0");
|
||||
faction.setTag(ChatColor.DARK_GREEN+"Wilderness");
|
||||
faction.setDescription("");
|
||||
|
||||
setFlagsForWilderness(faction);
|
||||
}
|
||||
if ( ! this.exists("-1"))
|
||||
{
|
||||
Faction faction = this.create("-1");
|
||||
faction.setTag("SafeZone");
|
||||
faction.setDescription("Free from PVP and monsters");
|
||||
|
||||
setFlagsForSafeZone(faction);
|
||||
}
|
||||
if ( ! this.exists("-2"))
|
||||
{
|
||||
Faction faction = this.create("-2");
|
||||
faction.setTag("WarZone");
|
||||
faction.setDescription("Not the safest place to be");
|
||||
|
||||
setFlagsForWarZone(faction);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Fix From Old Formats
|
||||
// -------------------------------------------- //
|
||||
Faction wild = this.get("0");
|
||||
Faction safeZone = this.get("-1");
|
||||
Faction warZone = this.get("-2");
|
||||
|
||||
// Remove troublesome " " from old pre-1.6.0 names
|
||||
if (safeZone != null && safeZone.getTag().contains(" "))
|
||||
safeZone.setTag("SafeZone");
|
||||
if (warZone != null && warZone.getTag().contains(" "))
|
||||
warZone.setTag("WarZone");
|
||||
|
||||
// Set Flags if they are not set already.
|
||||
if (wild != null && ! wild.getFlag(FFlag.PERMANENT))
|
||||
setFlagsForWilderness(wild);
|
||||
if (safeZone != null && ! safeZone.getFlag(FFlag.PERMANENT))
|
||||
setFlagsForSafeZone(safeZone);
|
||||
if (warZone != null && ! warZone.getFlag(FFlag.PERMANENT))
|
||||
setFlagsForWarZone(warZone);
|
||||
|
||||
// populate all faction player lists
|
||||
for (Faction faction : i.get())
|
||||
{
|
||||
faction.refreshFPlayers();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// FLAG SETTERS
|
||||
// -------------------------------------------- //
|
||||
public static void setFlagsForWilderness(Faction faction)
|
||||
{
|
||||
faction.setOpen(false);
|
||||
|
||||
faction.setFlag(FFlag.PERMANENT, true);
|
||||
faction.setFlag(FFlag.PEACEFUL, false);
|
||||
faction.setFlag(FFlag.INFPOWER, true);
|
||||
faction.setFlag(FFlag.POWERLOSS, true);
|
||||
faction.setFlag(FFlag.PVP, true);
|
||||
faction.setFlag(FFlag.FRIENDLYFIRE, false);
|
||||
faction.setFlag(FFlag.MONSTERS, true);
|
||||
faction.setFlag(FFlag.EXPLOSIONS, true);
|
||||
faction.setFlag(FFlag.FIRESPREAD, true);
|
||||
//faction.setFlag(FFlag.LIGHTNING, true);
|
||||
faction.setFlag(FFlag.ENDERGRIEF, true);
|
||||
|
||||
faction.setPermittedRelations(FPerm.BUILD, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.DOOR, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.CONTAINER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.BUTTON, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.LEVER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
}
|
||||
|
||||
public static void setFlagsForSafeZone(Faction faction)
|
||||
{
|
||||
faction.setOpen(false);
|
||||
|
||||
faction.setFlag(FFlag.PERMANENT, true);
|
||||
faction.setFlag(FFlag.PEACEFUL, true);
|
||||
faction.setFlag(FFlag.INFPOWER, true);
|
||||
faction.setFlag(FFlag.POWERLOSS, false);
|
||||
faction.setFlag(FFlag.PVP, false);
|
||||
faction.setFlag(FFlag.FRIENDLYFIRE, false);
|
||||
faction.setFlag(FFlag.MONSTERS, false);
|
||||
faction.setFlag(FFlag.EXPLOSIONS, false);
|
||||
faction.setFlag(FFlag.FIRESPREAD, false);
|
||||
//faction.setFlag(FFlag.LIGHTNING, false);
|
||||
faction.setFlag(FFlag.ENDERGRIEF, false);
|
||||
|
||||
faction.setPermittedRelations(FPerm.DOOR, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.CONTAINER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.BUTTON, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.LEVER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.TERRITORY, Rel.LEADER, Rel.OFFICER, Rel.MEMBER);
|
||||
}
|
||||
|
||||
public static void setFlagsForWarZone(Faction faction)
|
||||
{
|
||||
faction.setOpen(false);
|
||||
|
||||
faction.setFlag(FFlag.PERMANENT, true);
|
||||
faction.setFlag(FFlag.PEACEFUL, true);
|
||||
faction.setFlag(FFlag.INFPOWER, true);
|
||||
faction.setFlag(FFlag.POWERLOSS, true);
|
||||
faction.setFlag(FFlag.PVP, true);
|
||||
faction.setFlag(FFlag.FRIENDLYFIRE, true);
|
||||
faction.setFlag(FFlag.MONSTERS, true);
|
||||
faction.setFlag(FFlag.EXPLOSIONS, true);
|
||||
faction.setFlag(FFlag.FIRESPREAD, true);
|
||||
//faction.setFlag(FFlag.LIGHTNING, true);
|
||||
faction.setFlag(FFlag.ENDERGRIEF, true);
|
||||
|
||||
faction.setPermittedRelations(FPerm.DOOR, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.CONTAINER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.BUTTON, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.LEVER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.TERRITORY, Rel.LEADER, Rel.OFFICER, Rel.MEMBER);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// GET
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public Faction get(String id)
|
||||
{
|
||||
if ( ! this.exists(id))
|
||||
{
|
||||
Factions.get().log(Level.WARNING, "Non existing factionId "+id+" requested! Issuing cleaning!");
|
||||
BoardColl.get().clean();
|
||||
FPlayerColl.get().clean();
|
||||
}
|
||||
|
||||
return super.get(id);
|
||||
}
|
||||
|
||||
public Faction getNone()
|
||||
{
|
||||
return this.get("0");
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Faction tag
|
||||
// FACTION TAG
|
||||
// -------------------------------------------- //
|
||||
|
||||
public static ArrayList<String> validateTag(String str)
|
||||
@ -233,7 +180,7 @@ public class FactionColl extends EntityCollection<Faction>
|
||||
public Faction getByTag(String str)
|
||||
{
|
||||
String compStr = MiscUtil.getComparisonString(str);
|
||||
for (Faction faction : this.get())
|
||||
for (Faction faction : this.getAll())
|
||||
{
|
||||
if (faction.getComparisonTag().equals(compStr))
|
||||
{
|
||||
@ -248,7 +195,7 @@ public class FactionColl extends EntityCollection<Faction>
|
||||
Map<String, Faction> tag2faction = new HashMap<String, Faction>();
|
||||
|
||||
// TODO: Slow index building
|
||||
for (Faction faction : this.get())
|
||||
for (Faction faction : this.getAll())
|
||||
{
|
||||
tag2faction.put(ChatColor.stripColor(faction.getTag()), faction);
|
||||
}
|
||||
@ -268,7 +215,7 @@ public class FactionColl extends EntityCollection<Faction>
|
||||
if ( ! Econ.shouldBeUsed()) return;
|
||||
|
||||
Factions.get().log("Running econLandRewardRoutine...");
|
||||
for (Faction faction : this.get())
|
||||
for (Faction faction : this.getAll())
|
||||
{
|
||||
int landCount = faction.getLandRounded();
|
||||
if (!faction.getFlag(FFlag.PEACEFUL) && landCount > 0)
|
||||
@ -284,4 +231,102 @@ public class FactionColl extends EntityCollection<Faction>
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CREATE DEFAULT FACTIONS
|
||||
// -------------------------------------------- //
|
||||
|
||||
public void createDefaultFactions()
|
||||
{
|
||||
this.createNoneFaction();
|
||||
this.createSafeZoneFaction();
|
||||
this.createWarZoneFaction();
|
||||
}
|
||||
|
||||
public void createNoneFaction()
|
||||
{
|
||||
if (this.containsId(Const.FACTIONID_NONE)) return;
|
||||
|
||||
Faction faction = this.create(Const.FACTIONID_NONE);
|
||||
|
||||
faction.setTag(ChatColor.DARK_GREEN+"Wilderness");
|
||||
faction.setDescription("");
|
||||
faction.setOpen(false);
|
||||
|
||||
faction.setFlag(FFlag.PERMANENT, true);
|
||||
faction.setFlag(FFlag.PEACEFUL, false);
|
||||
faction.setFlag(FFlag.INFPOWER, true);
|
||||
faction.setFlag(FFlag.POWERLOSS, true);
|
||||
faction.setFlag(FFlag.PVP, true);
|
||||
faction.setFlag(FFlag.FRIENDLYFIRE, false);
|
||||
faction.setFlag(FFlag.MONSTERS, true);
|
||||
faction.setFlag(FFlag.EXPLOSIONS, true);
|
||||
faction.setFlag(FFlag.FIRESPREAD, true);
|
||||
//faction.setFlag(FFlag.LIGHTNING, true);
|
||||
faction.setFlag(FFlag.ENDERGRIEF, true);
|
||||
|
||||
faction.setPermittedRelations(FPerm.BUILD, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.DOOR, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.CONTAINER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.BUTTON, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.LEVER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
}
|
||||
|
||||
public void createSafeZoneFaction()
|
||||
{
|
||||
if (this.containsId(Const.FACTIONID_SAFEZONE)) return;
|
||||
|
||||
Faction faction = this.create(Const.FACTIONID_SAFEZONE);
|
||||
|
||||
faction.setTag("SafeZone");
|
||||
faction.setDescription("Free from PVP and monsters");
|
||||
faction.setOpen(false);
|
||||
|
||||
faction.setFlag(FFlag.PERMANENT, true);
|
||||
faction.setFlag(FFlag.PEACEFUL, true);
|
||||
faction.setFlag(FFlag.INFPOWER, true);
|
||||
faction.setFlag(FFlag.POWERLOSS, false);
|
||||
faction.setFlag(FFlag.PVP, false);
|
||||
faction.setFlag(FFlag.FRIENDLYFIRE, false);
|
||||
faction.setFlag(FFlag.MONSTERS, false);
|
||||
faction.setFlag(FFlag.EXPLOSIONS, false);
|
||||
faction.setFlag(FFlag.FIRESPREAD, false);
|
||||
//faction.setFlag(FFlag.LIGHTNING, false);
|
||||
faction.setFlag(FFlag.ENDERGRIEF, false);
|
||||
|
||||
faction.setPermittedRelations(FPerm.DOOR, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.CONTAINER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.BUTTON, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.LEVER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.TERRITORY, Rel.LEADER, Rel.OFFICER, Rel.MEMBER);
|
||||
}
|
||||
|
||||
public void createWarZoneFaction()
|
||||
{
|
||||
if (this.containsId(Const.FACTIONID_WARZONE)) return;
|
||||
|
||||
Faction faction = this.create(Const.FACTIONID_WARZONE);
|
||||
|
||||
faction.setTag("WarZone");
|
||||
faction.setDescription("Not the safest place to be");
|
||||
faction.setOpen(false);
|
||||
|
||||
faction.setFlag(FFlag.PERMANENT, true);
|
||||
faction.setFlag(FFlag.PEACEFUL, true);
|
||||
faction.setFlag(FFlag.INFPOWER, true);
|
||||
faction.setFlag(FFlag.POWERLOSS, true);
|
||||
faction.setFlag(FFlag.PVP, true);
|
||||
faction.setFlag(FFlag.FRIENDLYFIRE, true);
|
||||
faction.setFlag(FFlag.MONSTERS, true);
|
||||
faction.setFlag(FFlag.EXPLOSIONS, true);
|
||||
faction.setFlag(FFlag.FIRESPREAD, true);
|
||||
//faction.setFlag(FFlag.LIGHTNING, true);
|
||||
faction.setFlag(FFlag.ENDERGRIEF, true);
|
||||
|
||||
faction.setPermittedRelations(FPerm.DOOR, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.CONTAINER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.BUTTON, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.LEVER, Rel.LEADER, Rel.OFFICER, Rel.MEMBER, Rel.RECRUIT, Rel.ALLY, Rel.TRUCE, Rel.NEUTRAL, Rel.ENEMY);
|
||||
faction.setPermittedRelations(FPerm.TERRITORY, Rel.LEADER, Rel.OFFICER, Rel.MEMBER);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -80,7 +80,7 @@ public class Factions extends MPlugin
|
||||
|
||||
// Load Conf from disk
|
||||
FPlayerColl.get().init();
|
||||
FactionColl.i.loadFromDisc();
|
||||
FactionColl.get().init();
|
||||
BoardColl.get().init();
|
||||
|
||||
// Add Base Commands
|
||||
|
@ -13,7 +13,7 @@ public class TerritoryAccess
|
||||
|
||||
private String hostFactionId;
|
||||
public String getHostFactionId() { return this.hostFactionId; }
|
||||
public Faction getHostFaction() { return FactionColl.i.get(this.hostFactionId); }
|
||||
public Faction getHostFaction() { return FactionColl.get().get(this.hostFactionId); }
|
||||
public void setHostFactionId(String hostFactionId) { this.hostFactionId = hostFactionId; }
|
||||
|
||||
private boolean hostFactionAllowed = true;
|
||||
@ -132,7 +132,7 @@ public class TerritoryAccess
|
||||
{
|
||||
if (list.length() > 0)
|
||||
list.append(", ");
|
||||
list.append(FactionColl.i.get(factionID).getTag());
|
||||
list.append(FactionColl.get().get(factionID).getTag());
|
||||
}
|
||||
return list.toString();
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ public class CmdFactionsCreate extends FCommand
|
||||
return;
|
||||
}
|
||||
|
||||
if (FactionColl.i.isTagTaken(tag))
|
||||
if (FactionColl.get().isTagTaken(tag))
|
||||
{
|
||||
msg("<b>That tag is already in use.");
|
||||
return;
|
||||
@ -61,14 +61,16 @@ public class CmdFactionsCreate extends FCommand
|
||||
if ( ! canAffordCommand(ConfServer.econCostCreate, "to create a new faction")) return;
|
||||
|
||||
// trigger the faction creation event (cancellable)
|
||||
FactionCreateEvent createEvent = new FactionCreateEvent(me, tag);
|
||||
String factionId = FactionColl.get().getIdStrategy().generate(FactionColl.get());
|
||||
|
||||
FactionCreateEvent createEvent = new FactionCreateEvent(me, tag, factionId);
|
||||
Bukkit.getServer().getPluginManager().callEvent(createEvent);
|
||||
if(createEvent.isCancelled()) return;
|
||||
|
||||
// then make 'em pay (if applicable)
|
||||
if ( ! payForCommand(ConfServer.econCostCreate, "to create a new faction", "for creating a new faction")) return;
|
||||
|
||||
Faction faction = FactionColl.i.create();
|
||||
Faction faction = FactionColl.get().create(factionId);
|
||||
|
||||
// TODO: Why would this even happen??? Auto increment clash??
|
||||
if (faction == null)
|
||||
|
@ -37,9 +37,9 @@ public class CmdFactionsList extends FCommand
|
||||
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
|
||||
if ( ! payForCommand(ConfServer.econCostList, "to list the factions", "for listing the factions")) return;
|
||||
|
||||
ArrayList<Faction> factionList = new ArrayList<Faction>(FactionColl.i.get());
|
||||
ArrayList<Faction> factionList = new ArrayList<Faction>(FactionColl.get().getAll());
|
||||
|
||||
factionList.remove(FactionColl.i.getNone());
|
||||
factionList.remove(FactionColl.get().getNone());
|
||||
// TODO: Add flag SECRET To factions instead.
|
||||
//factionList.remove(Factions.i.getSafeZone());
|
||||
//factionList.remove(Factions.i.getWarZone());
|
||||
@ -91,7 +91,7 @@ public class CmdFactionsList extends FCommand
|
||||
sendMessage(Txt.getPage(lines, this.argAsInt(0, 1), "Faction List"));
|
||||
*/
|
||||
|
||||
factionList.add(0, FactionColl.i.getNone());
|
||||
factionList.add(0, FactionColl.get().getNone());
|
||||
|
||||
final int pageheight = 9;
|
||||
int pagenumber = this.argAsInt(0, 1);
|
||||
@ -111,7 +111,7 @@ public class CmdFactionsList extends FCommand
|
||||
{
|
||||
if (faction.isNone())
|
||||
{
|
||||
lines.add(Txt.parse("<i>Factionless<i> %d online", FactionColl.i.getNone().getFPlayersWhereOnline(true).size()));
|
||||
lines.add(Txt.parse("<i>Factionless<i> %d online", FactionColl.get().getNone().getFPlayersWhereOnline(true).size()));
|
||||
continue;
|
||||
}
|
||||
lines.add(Txt.parse("%s<i> %d/%d online, %d/%d/%d",
|
||||
|
@ -35,7 +35,7 @@ public class CmdFactionsOpen extends FCommand
|
||||
|
||||
// Inform
|
||||
myFaction.msg("%s<i> changed the faction to <h>%s<i>.", fme.describeTo(myFaction, true), open);
|
||||
for (Faction faction : FactionColl.i.get())
|
||||
for (Faction faction : FactionColl.get().getAll())
|
||||
{
|
||||
if (faction == myFaction)
|
||||
{
|
||||
|
@ -36,7 +36,7 @@ public class CmdFactionsTag extends FCommand
|
||||
String tag = this.argAsString(0);
|
||||
|
||||
// TODO does not first test cover selfcase?
|
||||
if (FactionColl.i.isTagTaken(tag) && ! MiscUtil.getComparisonString(tag).equals(myFaction.getComparisonTag()))
|
||||
if (FactionColl.get().isTagTaken(tag) && ! MiscUtil.getComparisonString(tag).equals(myFaction.getComparisonTag()))
|
||||
{
|
||||
msg("<b>That tag is already taken");
|
||||
return;
|
||||
@ -66,7 +66,7 @@ public class CmdFactionsTag extends FCommand
|
||||
|
||||
// Inform
|
||||
myFaction.msg("%s<i> changed your faction tag to %s", fme.describeTo(myFaction, true), myFaction.getTag(myFaction));
|
||||
for (Faction faction : FactionColl.i.get())
|
||||
for (Faction faction : FactionColl.get().getAll())
|
||||
{
|
||||
if (faction == myFaction)
|
||||
{
|
||||
|
@ -229,13 +229,13 @@ public abstract class FCommand extends MCommand<Factions>
|
||||
// First we try an exact match
|
||||
if (faction == null)
|
||||
{
|
||||
faction = FactionColl.i.getByTag(name);
|
||||
faction = FactionColl.get().getByTag(name);
|
||||
}
|
||||
|
||||
// Next we match faction tags
|
||||
if (faction == null)
|
||||
{
|
||||
faction = FactionColl.i.getBestTagMatch(name);
|
||||
faction = FactionColl.get().getBestTagMatch(name);
|
||||
}
|
||||
|
||||
// Next we match player names
|
||||
|
@ -1,13 +1,10 @@
|
||||
package com.massivecraft.factions.event;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.FactionColl;
|
||||
|
||||
public class FactionCreateEvent extends Event implements Cancellable
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
@ -22,36 +19,30 @@ public class FactionCreateEvent extends Event implements Cancellable
|
||||
// FIELDS
|
||||
// -------------------------------------------- //
|
||||
|
||||
private boolean cancelled;
|
||||
private boolean cancelled = false;
|
||||
@Override public boolean isCancelled() { return this.cancelled; }
|
||||
@Override public void setCancelled(boolean cancelled) { this.cancelled = cancelled; }
|
||||
|
||||
// TODO: Could the fields be reorganized to achieve symmetry?
|
||||
private final CommandSender sender;
|
||||
public CommandSender getSender() { return this.sender; }
|
||||
|
||||
// TODO: How do we know what universe? Should we perhaps actually create the faction?
|
||||
|
||||
private String factionTag;
|
||||
public String getFactionTag() { return this.factionTag; }
|
||||
|
||||
private Player sender;
|
||||
|
||||
public FPlayer getFPlayer()
|
||||
{
|
||||
return FPlayer.get(this.sender);
|
||||
}
|
||||
|
||||
public String getFactionId()
|
||||
{
|
||||
return FactionColl.i.getNextId();
|
||||
}
|
||||
private String factionId;
|
||||
public String getFactionId() { return this.factionId; }
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public FactionCreateEvent(Player sender, String tag)
|
||||
public FactionCreateEvent(CommandSender sender, String factionTag, String factionId)
|
||||
{
|
||||
this.cancelled = false;
|
||||
this.factionTag = tag;
|
||||
this.sender = sender;
|
||||
this.factionTag = factionTag;
|
||||
this.factionId = factionId;
|
||||
}
|
||||
|
||||
}
|
@ -34,7 +34,7 @@ public class FactionDisbandEvent extends Event implements Cancellable
|
||||
|
||||
public Faction getFaction()
|
||||
{
|
||||
return FactionColl.i.get(id);
|
||||
return FactionColl.get().get(id);
|
||||
}
|
||||
|
||||
public FPlayer getFPlayer()
|
||||
|
@ -16,7 +16,7 @@ public class EconLandRewardTask implements Runnable
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
FactionColl.i.econLandRewardRoutine();
|
||||
FactionColl.get().econLandRewardRoutine();
|
||||
|
||||
// TODO: This technique is TPS dependent and wrong.
|
||||
// Instead of restarting a TPS dependent task the task should poll every once in a while for the system millis.
|
||||
|
@ -6,8 +6,6 @@ import java.util.logging.Level;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.massivecraft.factions.zcore.persist.EM;
|
||||
import com.massivecraft.factions.zcore.persist.SaveTask;
|
||||
import com.massivecraft.mcore.util.Txt;
|
||||
import com.massivecraft.mcore.xlib.gson.Gson;
|
||||
import com.massivecraft.mcore.xlib.gson.GsonBuilder;
|
||||
@ -17,14 +15,6 @@ public abstract class MPlugin extends JavaPlugin
|
||||
{
|
||||
// Persist related
|
||||
public Gson gson;
|
||||
private Integer saveTask = null;
|
||||
private boolean autoSave = true;
|
||||
protected boolean loadSuccessful = false;
|
||||
public boolean getAutoSave() {return this.autoSave;}
|
||||
public void setAutoSave(boolean val) {this.autoSave = val;}
|
||||
|
||||
// Listeners
|
||||
public MPluginSecretPlayerListener mPluginSecretPlayerListener;
|
||||
|
||||
// -------------------------------------------- //
|
||||
// ENABLE
|
||||
@ -40,17 +30,6 @@ public abstract class MPlugin extends JavaPlugin
|
||||
|
||||
this.gson = this.getGsonBuilder().create();
|
||||
|
||||
// Create and register listeners
|
||||
this.mPluginSecretPlayerListener = new MPluginSecretPlayerListener(this);
|
||||
|
||||
// Register recurring tasks
|
||||
long saveTicks = 20 * 60 * 30; // Approximately every 30 min
|
||||
if (saveTask == null)
|
||||
{
|
||||
saveTask = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new SaveTask(this), saveTicks, saveTicks);
|
||||
}
|
||||
|
||||
loadSuccessful = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -61,14 +40,6 @@ public abstract class MPlugin extends JavaPlugin
|
||||
|
||||
public void onDisable()
|
||||
{
|
||||
if (saveTask != null)
|
||||
{
|
||||
this.getServer().getScheduler().cancelTask(saveTask);
|
||||
saveTask = null;
|
||||
}
|
||||
// only save data if plugin actually loaded successfully
|
||||
if (loadSuccessful)
|
||||
EM.saveAllToDisc();
|
||||
log("Disabled");
|
||||
}
|
||||
|
||||
@ -93,56 +64,6 @@ public abstract class MPlugin extends JavaPlugin
|
||||
.excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.VOLATILE);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// LANG AND TAGS
|
||||
// -------------------------------------------- //
|
||||
/*
|
||||
// These are not supposed to be used directly.
|
||||
// They are loaded and used through the TextUtil instance for the plugin.
|
||||
public Map<String, String> rawTags = new LinkedHashMap<String, String>();
|
||||
|
||||
public void addRawTags()
|
||||
{
|
||||
this.rawTags.put("l", "<green>"); // logo
|
||||
this.rawTags.put("a", "<gold>"); // art
|
||||
this.rawTags.put("n", "<silver>"); // notice
|
||||
this.rawTags.put("i", "<yellow>"); // info
|
||||
this.rawTags.put("g", "<lime>"); // good
|
||||
this.rawTags.put("b", "<rose>"); // bad
|
||||
this.rawTags.put("h", "<pink>"); // highligh
|
||||
this.rawTags.put("c", "<aqua>"); // command
|
||||
this.rawTags.put("p", "<teal>"); // parameter
|
||||
}
|
||||
|
||||
public void initTXT()
|
||||
{
|
||||
this.addRawTags();
|
||||
|
||||
Type type = new TypeToken<Map<String, String>>(){}.getType();
|
||||
|
||||
Map<String, String> tagsFromFile = this.persist.load(type, "tags");
|
||||
if (tagsFromFile != null) this.rawTags.putAll(tagsFromFile);
|
||||
this.persist.save(this.rawTags, "tags");
|
||||
|
||||
for (Entry<String, String> rawTag : this.rawTags.entrySet())
|
||||
{
|
||||
this.txt.tags.put(rawTag.getKey(), TextUtil.parseColor(rawTag.getValue()));
|
||||
}
|
||||
}*/
|
||||
|
||||
// -------------------------------------------- //
|
||||
// HOOKS
|
||||
// -------------------------------------------- //
|
||||
public void preAutoSave()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void postAutoSave()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// LOGGING
|
||||
// -------------------------------------------- //
|
||||
|
@ -1,34 +0,0 @@
|
||||
package com.massivecraft.factions.zcore;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
|
||||
import com.massivecraft.factions.zcore.persist.EM;
|
||||
import com.massivecraft.factions.zcore.persist.Entity;
|
||||
import com.massivecraft.factions.zcore.persist.EntityCollection;
|
||||
import com.massivecraft.factions.zcore.persist.PlayerEntityCollection;
|
||||
|
||||
public class MPluginSecretPlayerListener implements Listener
|
||||
{
|
||||
public MPlugin p;
|
||||
public MPluginSecretPlayerListener(MPlugin p)
|
||||
{
|
||||
this.p = p;
|
||||
Bukkit.getPluginManager().registerEvents(this, this.p);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onPlayerPreLogin(PlayerLoginEvent event)
|
||||
{
|
||||
for (EntityCollection<? extends Entity> ecoll : EM.class2Entities.values())
|
||||
{
|
||||
if (ecoll instanceof PlayerEntityCollection)
|
||||
{
|
||||
ecoll.get(event.getPlayer().getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,74 +0,0 @@
|
||||
package com.massivecraft.factions.zcore.persist;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import com.massivecraft.factions.zcore.persist.Entity;
|
||||
import com.massivecraft.factions.zcore.persist.EntityCollection;
|
||||
|
||||
public class EM
|
||||
{
|
||||
public static Map<Class<? extends Entity>, EntityCollection<? extends Entity>> class2Entities = new LinkedHashMap<Class<? extends Entity>, EntityCollection<? extends Entity>>();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends Entity> EntityCollection<T> getEntitiesCollectionForEntityClass(Class<T> entityClass)
|
||||
{
|
||||
return (EntityCollection<T>) class2Entities.get(entityClass);
|
||||
}
|
||||
|
||||
public static void setEntitiesCollectionForEntityClass(Class<? extends Entity> entityClass, EntityCollection<? extends Entity> entities)
|
||||
{
|
||||
class2Entities.put(entityClass, entities);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// ATTACH AND DETACH
|
||||
// -------------------------------------------- //
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends Entity> void attach(T entity)
|
||||
{
|
||||
EntityCollection<T> ec = (EntityCollection<T>) getEntitiesCollectionForEntityClass(entity.getClass());
|
||||
ec.attach(entity);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends Entity> void detach(T entity)
|
||||
{
|
||||
EntityCollection<T> ec = (EntityCollection<T>) getEntitiesCollectionForEntityClass(entity.getClass());
|
||||
ec.detach(entity);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends Entity> boolean attached(T entity)
|
||||
{
|
||||
EntityCollection<T> ec = (EntityCollection<T>) getEntitiesCollectionForEntityClass(entity.getClass());
|
||||
return ec.attached(entity);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends Entity> boolean detached(T entity)
|
||||
{
|
||||
EntityCollection<T> ec = (EntityCollection<T>) getEntitiesCollectionForEntityClass(entity.getClass());
|
||||
return ec.detached(entity);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// DISC
|
||||
// -------------------------------------------- //
|
||||
|
||||
public static void saveAllToDisc()
|
||||
{
|
||||
for (EntityCollection<? extends Entity> ec : class2Entities.values())
|
||||
{
|
||||
ec.saveToDisc();
|
||||
}
|
||||
}
|
||||
|
||||
public static void loadAllFromDisc()
|
||||
{
|
||||
for (EntityCollection<? extends Entity> ec : class2Entities.values())
|
||||
{
|
||||
ec.loadFromDisc();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,65 +0,0 @@
|
||||
package com.massivecraft.factions.zcore.persist;
|
||||
|
||||
public abstract class Entity
|
||||
{
|
||||
public Entity()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected transient String id = null;
|
||||
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
protected void setId(String id)
|
||||
{
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public boolean shouldBeSaved()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// ATTACH AND DETACH
|
||||
// -------------------------------------------- //
|
||||
|
||||
public void attach()
|
||||
{
|
||||
EM.attach(this);
|
||||
}
|
||||
|
||||
public void detach()
|
||||
{
|
||||
EM.detach(this);
|
||||
}
|
||||
|
||||
public boolean attached()
|
||||
{
|
||||
return EM.attached(this);
|
||||
}
|
||||
|
||||
public boolean detached()
|
||||
{
|
||||
return EM.detached(this);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// EVENTS
|
||||
// -------------------------------------------- //
|
||||
|
||||
public void preDetach()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void postDetach()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,292 +0,0 @@
|
||||
package com.massivecraft.factions.zcore.persist;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import com.massivecraft.mcore.util.DiscUtil;
|
||||
import com.massivecraft.mcore.util.Txt;
|
||||
import com.massivecraft.mcore.xlib.gson.Gson;
|
||||
import com.massivecraft.mcore.xlib.gson.JsonSyntaxException;
|
||||
|
||||
public abstract class EntityCollection<E extends Entity>
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// FIELDS
|
||||
// -------------------------------------------- //
|
||||
|
||||
// These must be instantiated in order to allow for different configuration (orders, comparators etc)
|
||||
private Collection<E> entities;
|
||||
protected Map<String, E> id2entity;
|
||||
|
||||
// If the entities are creative they will create a new instance if a non existent id was requested
|
||||
private boolean creative;
|
||||
public boolean isCreative() { return creative; }
|
||||
public void setCreative(boolean creative) { this.creative = creative; }
|
||||
|
||||
// This is the auto increment for the primary key "id"
|
||||
private int nextId;
|
||||
|
||||
// This ugly crap is necessary due to java type erasure
|
||||
private Class<E> entityClass;
|
||||
public abstract Type getMapType(); // This is special stuff for GSON.
|
||||
|
||||
// Info on how to persist
|
||||
private Gson gson;
|
||||
public Gson getGson() { return gson; }
|
||||
public void setGson(Gson gson) { this.gson = gson; }
|
||||
|
||||
private File file;
|
||||
public File getFile() { return file; }
|
||||
public void setFile(File file) { this.file = file; }
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCTORS
|
||||
// -------------------------------------------- //
|
||||
|
||||
public EntityCollection(Class<E> entityClass, Collection<E> entities, Map<String, E> id2entity, File file, Gson gson, boolean creative)
|
||||
{
|
||||
this.entityClass = entityClass;
|
||||
this.entities = entities;
|
||||
this.id2entity = id2entity;
|
||||
this.file = file;
|
||||
this.gson = gson;
|
||||
this.creative = creative;
|
||||
this.nextId = 1;
|
||||
|
||||
EM.setEntitiesCollectionForEntityClass(this.entityClass, this);
|
||||
}
|
||||
|
||||
public EntityCollection(Class<E> entityClass, Collection<E> entities, Map<String, E> id2entity, File file, Gson gson)
|
||||
{
|
||||
this(entityClass, entities, id2entity, file, gson, false);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// GET
|
||||
// -------------------------------------------- //
|
||||
|
||||
public Collection<E> get()
|
||||
{
|
||||
return entities;
|
||||
}
|
||||
|
||||
public Map<String, E> getMap()
|
||||
{
|
||||
return this.id2entity;
|
||||
}
|
||||
|
||||
public E get(String id)
|
||||
{
|
||||
if (this.creative) return this.getCreative(id);
|
||||
return id2entity.get(id);
|
||||
}
|
||||
|
||||
public E getCreative(String id)
|
||||
{
|
||||
E e = id2entity.get(id);
|
||||
if (e != null) return e;
|
||||
return this.create(id);
|
||||
}
|
||||
|
||||
public boolean exists(String id)
|
||||
{
|
||||
if (id == null) return false;
|
||||
return id2entity.get(id) != null;
|
||||
}
|
||||
|
||||
public E getBestIdMatch(String pattern)
|
||||
{
|
||||
String id = Txt.getBestCIStart(this.id2entity.keySet(), pattern);
|
||||
|
||||
if (id == null) return null;
|
||||
return this.id2entity.get(id);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CREATE
|
||||
// -------------------------------------------- //
|
||||
|
||||
public synchronized E create()
|
||||
{
|
||||
return this.create(this.getNextId());
|
||||
}
|
||||
|
||||
public synchronized E create(String id)
|
||||
{
|
||||
if ( ! this.isIdFree(id)) return null;
|
||||
|
||||
E e = null;
|
||||
try
|
||||
{
|
||||
e = this.entityClass.newInstance();
|
||||
} catch (Exception ignored) {
|
||||
ignored.printStackTrace();
|
||||
}
|
||||
|
||||
e.setId(id);
|
||||
this.entities.add(e);
|
||||
this.id2entity.put(e.getId(), e);
|
||||
this.updateNextIdForId(id);
|
||||
return e;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// ATTACH AND DETACH
|
||||
// -------------------------------------------- //
|
||||
|
||||
public void attach(E entity)
|
||||
{
|
||||
if (entity.getId() != null) return;
|
||||
entity.setId(this.getNextId());
|
||||
this.entities.add(entity);
|
||||
this.id2entity.put(entity.getId(), entity);
|
||||
}
|
||||
|
||||
public void detach(E entity)
|
||||
{
|
||||
entity.preDetach();
|
||||
this.entities.remove(entity);
|
||||
this.id2entity.remove(entity.getId());
|
||||
entity.postDetach();
|
||||
}
|
||||
|
||||
public void detach(String id)
|
||||
{
|
||||
E entity = this.id2entity.get(id);
|
||||
if (entity == null) return;
|
||||
this.detach(entity);
|
||||
}
|
||||
|
||||
public boolean attached(E entity)
|
||||
{
|
||||
return this.entities.contains(entity);
|
||||
}
|
||||
|
||||
public boolean detached(E entity)
|
||||
{
|
||||
return ! this.attached(entity);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// DISC
|
||||
// -------------------------------------------- //
|
||||
|
||||
public boolean saveToDisc()
|
||||
{
|
||||
Map<String, E> entitiesThatShouldBeSaved = new HashMap<String, E>();
|
||||
for (E entity : this.entities)
|
||||
{
|
||||
if (entity.shouldBeSaved())
|
||||
{
|
||||
entitiesThatShouldBeSaved.put(entity.getId(), entity);
|
||||
}
|
||||
}
|
||||
|
||||
return this.saveCore(entitiesThatShouldBeSaved);
|
||||
}
|
||||
|
||||
private boolean saveCore(Map<String, E> entities)
|
||||
{
|
||||
return DiscUtil.writeCatch(this.file, this.gson.toJson(entities));
|
||||
}
|
||||
|
||||
public boolean loadFromDisc()
|
||||
{
|
||||
Map<String, E> id2entity = this.loadCore();
|
||||
if (id2entity == null) return false;
|
||||
this.entities.clear();
|
||||
this.entities.addAll(id2entity.values());
|
||||
this.id2entity.clear();
|
||||
this.id2entity.putAll(id2entity);
|
||||
this.fillIds();
|
||||
return true;
|
||||
}
|
||||
|
||||
private Map<String, E> loadCore()
|
||||
{
|
||||
if ( ! this.file.exists())
|
||||
{
|
||||
return new HashMap<String, E>();
|
||||
}
|
||||
|
||||
String content = DiscUtil.readCatch(this.file);
|
||||
if (content == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
Type type = this.getMapType();
|
||||
try
|
||||
{
|
||||
return this.gson.fromJson(content, type);
|
||||
}
|
||||
catch(JsonSyntaxException ex)
|
||||
{
|
||||
Bukkit.getLogger().log(Level.WARNING, "JSON error encountered loading \"" + file + "\": " + ex.getLocalizedMessage());
|
||||
|
||||
// backup bad file, so user can attempt to recover something from it
|
||||
File backup = new File(file.getPath()+"_bad");
|
||||
if (backup.exists()) backup.delete();
|
||||
Bukkit.getLogger().log(Level.WARNING, "Backing up copy of bad file to: "+backup);
|
||||
file.renameTo(backup);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// ID MANAGEMENT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public String getNextId()
|
||||
{
|
||||
while ( ! isIdFree(this.nextId) )
|
||||
{
|
||||
this.nextId += 1;
|
||||
}
|
||||
return Integer.toString(this.nextId);
|
||||
}
|
||||
|
||||
public boolean isIdFree(String id)
|
||||
{
|
||||
return ! this.id2entity.containsKey(id);
|
||||
}
|
||||
public boolean isIdFree(int id)
|
||||
{
|
||||
return this.isIdFree(Integer.toString(id));
|
||||
}
|
||||
|
||||
protected synchronized void fillIds()
|
||||
{
|
||||
this.nextId = 1;
|
||||
for(Entry<String, E> entry : this.id2entity.entrySet())
|
||||
{
|
||||
String id = entry.getKey();
|
||||
E entity = entry.getValue();
|
||||
entity.id = id;
|
||||
this.updateNextIdForId(id);
|
||||
}
|
||||
}
|
||||
|
||||
protected synchronized void updateNextIdForId(int id)
|
||||
{
|
||||
if (this.nextId < id)
|
||||
{
|
||||
this.nextId = id + 1;
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateNextIdForId(String id)
|
||||
{
|
||||
try
|
||||
{
|
||||
int idAsInt = Integer.parseInt(id);
|
||||
this.updateNextIdForId(idAsInt);
|
||||
}
|
||||
catch (Exception ignored) { }
|
||||
}
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
package com.massivecraft.factions.zcore.persist;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PlayerEntity extends Entity
|
||||
{
|
||||
public Player getPlayer()
|
||||
{
|
||||
return Bukkit.getPlayerExact(this.getId());
|
||||
}
|
||||
|
||||
public boolean isOnline()
|
||||
{
|
||||
return this.getPlayer() != null;
|
||||
}
|
||||
|
||||
// make sure target player should be able to detect that this player is online
|
||||
public boolean isOnlineAndVisibleTo(Player player)
|
||||
{
|
||||
Player target = this.getPlayer();
|
||||
return target != null && player.canSee(target);
|
||||
}
|
||||
|
||||
public boolean isOffline()
|
||||
{
|
||||
return ! isOnline();
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Message Sending Helpers
|
||||
// -------------------------------------------- //
|
||||
|
||||
public void sendMessage(String msg)
|
||||
{
|
||||
Player player = this.getPlayer();
|
||||
if (player == null) return;
|
||||
player.sendMessage(msg);
|
||||
}
|
||||
|
||||
public void sendMessage(List<String> msgs)
|
||||
{
|
||||
for(String msg : msgs)
|
||||
{
|
||||
this.sendMessage(msg);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
package com.massivecraft.factions.zcore.persist;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.massivecraft.mcore.xlib.gson.Gson;
|
||||
|
||||
/**
|
||||
* The PlayerEntityCollection is an EntityCollection with the extra features
|
||||
* a player skin usually requires.
|
||||
*
|
||||
* This entity collection is not only creative. It even creates the instance for the player
|
||||
* when the player logs in to the server.
|
||||
*
|
||||
* This way we can be sure that PlayerEntityCollection.get() will contain
|
||||
* all entities in PlayerEntityCollection.getOnline()
|
||||
*/
|
||||
public abstract class PlayerEntityCollection<E extends Entity> extends EntityCollection<E>
|
||||
{
|
||||
public PlayerEntityCollection(Class<E> entityClass, Collection<E> entities, Map<String, E> id2entity, File file, Gson gson)
|
||||
{
|
||||
super(entityClass, entities, id2entity, file, gson, true);
|
||||
}
|
||||
|
||||
public E get(Player player)
|
||||
{
|
||||
return this.get(player.getName());
|
||||
}
|
||||
|
||||
public Set<E> getOnline()
|
||||
{
|
||||
Set<E> entities = new HashSet<E>();
|
||||
for (Player player : Bukkit.getServer().getOnlinePlayers())
|
||||
{
|
||||
entities.add(this.get(player));
|
||||
}
|
||||
return entities;
|
||||
}
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
package com.massivecraft.factions.zcore.persist;
|
||||
|
||||
import com.massivecraft.factions.zcore.MPlugin;
|
||||
|
||||
public class SaveTask implements Runnable
|
||||
{
|
||||
MPlugin p;
|
||||
public SaveTask(MPlugin p)
|
||||
{
|
||||
this.p = p;
|
||||
}
|
||||
|
||||
public void run()
|
||||
{
|
||||
if ( ! p.getAutoSave()) return;
|
||||
p.preAutoSave();
|
||||
EM.saveAllToDisc();
|
||||
p.postAutoSave();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user