Adding match mode for id search to MassiveCraftCore and improving the faction argument readers.
This commit is contained in:
parent
e6d45a6aa2
commit
5bf38ab0aa
@ -66,19 +66,4 @@ public class FPlayers extends PlayerEntityCollection<FPlayer>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO: Intressant.... denna skulle jag kanske behöva undersöka lite mer... lägga till i core?
|
|
||||||
// En form av match player name...
|
|
||||||
public FPlayer find(String playername)
|
|
||||||
{
|
|
||||||
for (FPlayer fplayer : this.get())
|
|
||||||
{
|
|
||||||
if (fplayer.getId().equalsIgnoreCase(playername) || fplayer.getId().toLowerCase().startsWith(playername.toLowerCase()))
|
|
||||||
{
|
|
||||||
return fplayer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import org.bukkit.ChatColor;
|
|||||||
import com.google.gson.reflect.TypeToken;
|
import com.google.gson.reflect.TypeToken;
|
||||||
import com.massivecraft.factions.util.MiscUtil;
|
import com.massivecraft.factions.util.MiscUtil;
|
||||||
import com.massivecraft.factions.zcore.persist.EntityCollection;
|
import com.massivecraft.factions.zcore.persist.EntityCollection;
|
||||||
|
import com.massivecraft.factions.zcore.util.TextUtil;
|
||||||
|
|
||||||
public class Factions extends EntityCollection<Faction>
|
public class Factions extends EntityCollection<Faction>
|
||||||
{
|
{
|
||||||
@ -132,7 +133,7 @@ public class Factions extends EntityCollection<Faction>
|
|||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Faction findByTag(String str)
|
public Faction getByTag(String str)
|
||||||
{
|
{
|
||||||
String compStr = MiscUtil.getComparisonString(str);
|
String compStr = MiscUtil.getComparisonString(str);
|
||||||
for (Faction faction : this.get())
|
for (Faction faction : this.get())
|
||||||
@ -145,9 +146,24 @@ public class Factions extends EntityCollection<Faction>
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Faction getBestTagMatch(String pattern)
|
||||||
|
{
|
||||||
|
Map<String, Faction> tag2faction = new HashMap<String, Faction>();
|
||||||
|
|
||||||
|
// TODO: Slow index building
|
||||||
|
for (Faction faction : this.get())
|
||||||
|
{
|
||||||
|
tag2faction.put(faction.getTag(), faction);
|
||||||
|
}
|
||||||
|
|
||||||
|
String tag = TextUtil.getWhereLongestCommonStartCI(tag2faction.keySet(), pattern);
|
||||||
|
if (tag == null) return null;
|
||||||
|
return tag2faction.get(tag);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isTagTaken(String str)
|
public boolean isTagTaken(String str)
|
||||||
{
|
{
|
||||||
return this.findByTag(str) != null;
|
return this.getByTag(str) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ public class P extends MPlugin
|
|||||||
public Set<String> getPlayersInFaction(String factionTag)
|
public Set<String> getPlayersInFaction(String factionTag)
|
||||||
{
|
{
|
||||||
Set<String> players = new HashSet<String>();
|
Set<String> players = new HashSet<String>();
|
||||||
Faction faction = Factions.i.findByTag(factionTag);
|
Faction faction = Factions.i.getByTag(factionTag);
|
||||||
if (faction != null)
|
if (faction != null)
|
||||||
{
|
{
|
||||||
for (FPlayer fplayer : faction.getFPlayers())
|
for (FPlayer fplayer : faction.getFPlayers())
|
||||||
@ -326,7 +326,7 @@ public class P extends MPlugin
|
|||||||
public Set<String> getOnlinePlayersInFaction(String factionTag)
|
public Set<String> getOnlinePlayersInFaction(String factionTag)
|
||||||
{
|
{
|
||||||
Set<String> players = new HashSet<String>();
|
Set<String> players = new HashSet<String>();
|
||||||
Faction faction = Factions.i.findByTag(factionTag);
|
Faction faction = Factions.i.getByTag(factionTag);
|
||||||
if (faction != null)
|
if (faction != null)
|
||||||
{
|
{
|
||||||
for (FPlayer fplayer : faction.getFPlayersWhereOnline(true))
|
for (FPlayer fplayer : faction.getFPlayersWhereOnline(true))
|
||||||
|
@ -148,15 +148,14 @@ public abstract class FCommand extends MCommand<P>
|
|||||||
// Argument Readers
|
// Argument Readers
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
// ARG AS FPLAYER
|
// FPLAYER ======================
|
||||||
public FPlayer argAsFPlayer(int idx, FPlayer def, boolean msg)
|
public FPlayer strAsFPlayer(String name, FPlayer def, boolean msg)
|
||||||
{
|
{
|
||||||
FPlayer ret = def;
|
FPlayer ret = def;
|
||||||
|
|
||||||
String name = this.argAsString(idx);
|
|
||||||
if (name != null)
|
if (name != null)
|
||||||
{
|
{
|
||||||
FPlayer fplayer = FPlayers.i.get(name);
|
FPlayer fplayer = FPlayers.i.get(name);
|
||||||
if (fplayer != null)
|
if (fplayer != null)
|
||||||
{
|
{
|
||||||
ret = fplayer;
|
ret = fplayer;
|
||||||
@ -165,11 +164,15 @@ public abstract class FCommand extends MCommand<P>
|
|||||||
|
|
||||||
if (msg && ret == null)
|
if (msg && ret == null)
|
||||||
{
|
{
|
||||||
this.sendMessage(p.txt.parse("<b>The player \"<p>%s<b>\" could not be found.", name));
|
this.msg("<b>No player \"<p>%s<b>\" could not be found.", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
public FPlayer argAsFPlayer(int idx, FPlayer def, boolean msg)
|
||||||
|
{
|
||||||
|
return this.strAsFPlayer(this.argAsString(idx), def, msg);
|
||||||
|
}
|
||||||
public FPlayer argAsFPlayer(int idx, FPlayer def)
|
public FPlayer argAsFPlayer(int idx, FPlayer def)
|
||||||
{
|
{
|
||||||
return this.argAsFPlayer(idx, def, true);
|
return this.argAsFPlayer(idx, def, true);
|
||||||
@ -179,15 +182,14 @@ public abstract class FCommand extends MCommand<P>
|
|||||||
return this.argAsFPlayer(idx, null);
|
return this.argAsFPlayer(idx, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ARG AS BEST FPLAYER MATCH
|
// BEST FPLAYER MATCH ======================
|
||||||
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def, boolean msg)
|
public FPlayer strAsBestFPlayerMatch(String name, FPlayer def, boolean msg)
|
||||||
{
|
{
|
||||||
FPlayer ret = def;
|
FPlayer ret = def;
|
||||||
|
|
||||||
String name = this.argAsString(idx);
|
|
||||||
if (name != null)
|
if (name != null)
|
||||||
{
|
{
|
||||||
FPlayer fplayer = FPlayers.i.find(name);
|
FPlayer fplayer = FPlayers.i.getBestIdMatch(name);
|
||||||
if (fplayer != null)
|
if (fplayer != null)
|
||||||
{
|
{
|
||||||
ret = fplayer;
|
ret = fplayer;
|
||||||
@ -196,11 +198,15 @@ public abstract class FCommand extends MCommand<P>
|
|||||||
|
|
||||||
if (msg && ret == null)
|
if (msg && ret == null)
|
||||||
{
|
{
|
||||||
this.sendMessage(p.txt.parse("<b>The player \"<p>%s<b>\" could not be found.", name));
|
this.msg("<b>No player match found for \"<p>%s<b>\".", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def, boolean msg)
|
||||||
|
{
|
||||||
|
return this.strAsBestFPlayerMatch(this.argAsString(idx), def, msg);
|
||||||
|
}
|
||||||
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def)
|
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def)
|
||||||
{
|
{
|
||||||
return this.argAsBestFPlayerMatch(idx, def, true);
|
return this.argAsBestFPlayerMatch(idx, def, true);
|
||||||
@ -210,37 +216,43 @@ public abstract class FCommand extends MCommand<P>
|
|||||||
return this.argAsBestFPlayerMatch(idx, null);
|
return this.argAsBestFPlayerMatch(idx, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ARG AS FACTION
|
// FACTION ======================
|
||||||
public Faction argAsFaction(int idx, Faction def, boolean msg)
|
public Faction strAsFaction(String name, Faction def, boolean msg)
|
||||||
{
|
{
|
||||||
Faction ret = def;
|
Faction ret = def;
|
||||||
|
|
||||||
String name = this.argAsString(idx);
|
|
||||||
if (name != null)
|
if (name != null)
|
||||||
{
|
{
|
||||||
// First we search faction names
|
// First we match faction tags
|
||||||
Faction faction = Factions.i.findByTag(name);
|
Faction faction = Factions.i.getBestTagMatch(name);
|
||||||
|
|
||||||
|
// Next we match player names
|
||||||
|
if (faction == null)
|
||||||
|
{
|
||||||
|
FPlayer fplayer = FPlayers.i.getBestIdMatch(name);
|
||||||
|
if (fplayer != null)
|
||||||
|
{
|
||||||
|
faction = fplayer.getFaction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (faction != null)
|
if (faction != null)
|
||||||
{
|
{
|
||||||
ret = faction;
|
ret = faction;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next we search player names
|
|
||||||
FPlayer fplayer = FPlayers.i.find(name);
|
|
||||||
if (fplayer != null)
|
|
||||||
{
|
|
||||||
ret = fplayer.getFaction();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg && ret == null)
|
if (msg && ret == null)
|
||||||
{
|
{
|
||||||
this.sendMessage(p.txt.parse("<b>The faction or player \"<p>%s<b>\" could not be found.", name));
|
this.msg("<b>The faction or player \"<p>%s<b>\" could not be found.", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
public Faction argAsFaction(int idx, Faction def, boolean msg)
|
||||||
|
{
|
||||||
|
return this.strAsFaction(this.argAsString(idx), def, msg);
|
||||||
|
}
|
||||||
public Faction argAsFaction(int idx, Faction def)
|
public Faction argAsFaction(int idx, Faction def)
|
||||||
{
|
{
|
||||||
return this.argAsFaction(idx, def, true);
|
return this.argAsFaction(idx, def, true);
|
||||||
|
@ -7,6 +7,7 @@ import java.util.Map.Entry;
|
|||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.massivecraft.factions.zcore.util.DiscUtil;
|
import com.massivecraft.factions.zcore.util.DiscUtil;
|
||||||
|
import com.massivecraft.factions.zcore.util.TextUtil;
|
||||||
|
|
||||||
public abstract class EntityCollection<E extends Entity>
|
public abstract class EntityCollection<E extends Entity>
|
||||||
{
|
{
|
||||||
@ -16,7 +17,7 @@ public abstract class EntityCollection<E extends Entity>
|
|||||||
|
|
||||||
// These must be instantiated in order to allow for different configuration (orders, comparators etc)
|
// These must be instantiated in order to allow for different configuration (orders, comparators etc)
|
||||||
private Collection<E> entities;
|
private Collection<E> entities;
|
||||||
private Map<String, E> id2entity;
|
protected Map<String, E> id2entity;
|
||||||
|
|
||||||
// If the entities are creative they will create a new instance if a non existent id was requested
|
// If the entities are creative they will create a new instance if a non existent id was requested
|
||||||
private boolean creative;
|
private boolean creative;
|
||||||
@ -94,6 +95,13 @@ public abstract class EntityCollection<E extends Entity>
|
|||||||
return id2entity.get(id) != null;
|
return id2entity.get(id) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public E getBestIdMatch(String pattern)
|
||||||
|
{
|
||||||
|
String id = TextUtil.getWhereLongestCommonStartCI(this.id2entity.keySet(), pattern);
|
||||||
|
if (id == null) return null;
|
||||||
|
return this.id2entity.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// CREATE
|
// CREATE
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
@ -42,5 +42,4 @@ public abstract class PlayerEntityCollection<E extends Entity> extends EntityCol
|
|||||||
}
|
}
|
||||||
return entities;
|
return entities;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -280,4 +280,36 @@ public class TextUtil
|
|||||||
|
|
||||||
return ""+num+" "+unit+" "+agofromnow;
|
return ""+num+" "+unit+" "+agofromnow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// String comparison
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public static int commonStartLength(String a, String b)
|
||||||
|
{
|
||||||
|
int len = a.length() > b.length() ? a.length() : b.length();
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
if (a.charAt(i) != b.charAt(i)) break;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getWhereLongestCommonStartCI(Collection<String> candidates, String pattern)
|
||||||
|
{
|
||||||
|
String ret = null;
|
||||||
|
int best = 0;
|
||||||
|
pattern = pattern.toLowerCase();
|
||||||
|
for (String candidate : candidates)
|
||||||
|
{
|
||||||
|
int csl = commonStartLength(pattern, candidate.toLowerCase());
|
||||||
|
if (csl > best)
|
||||||
|
{
|
||||||
|
best = csl;
|
||||||
|
ret = candidate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user