Code cleanup

This commit is contained in:
Magnus Ulf
2019-05-03 09:25:18 +02:00
parent 0d48819641
commit 61bea411f5
44 changed files with 288 additions and 666 deletions

View File

@@ -7,12 +7,11 @@ import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.predicate.Predicate;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.util.ChunkUtil;
import java.util.Set;
import java.util.function.Predicate;
public class CmdFactionsAccessSetFill extends CmdFactionsAccessSetXSimple
{

View File

@@ -37,8 +37,7 @@ public class CmdFactionsAccessSetOne extends CmdFactionsAccessSetXSimple
public Set<PS> getChunks()
{
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
final Set<PS> chunks = Collections.singleton(chunk);
return chunks;
return Collections.singleton(chunk);
}
}

View File

@@ -39,25 +39,20 @@ public class CmdFactionsFaction extends FactionsCommand
final Faction faction = this.readArg(msenderFaction);
final CommandSender sender = this.sender;
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Event
EventFactionsFactionShowAsync event = new EventFactionsFactionShowAsync(sender, faction);
event.run();
if (event.isCancelled()) return;
// Title
MixinMessage.get().messageOne(sender, Txt.titleize("Faction " + faction.getName(msender)));
// Lines
TreeSet<PriorityLines> priorityLiness = new TreeSet<>(event.getIdPriorityLiness().values());
for (PriorityLines priorityLines : priorityLiness)
{
// Event
EventFactionsFactionShowAsync event = new EventFactionsFactionShowAsync(sender, faction);
event.run();
if (event.isCancelled()) return;
// Title
MixinMessage.get().messageOne(sender, Txt.titleize("Faction " + faction.getName(msender)));
// Lines
TreeSet<PriorityLines> priorityLiness = new TreeSet<>(event.getIdPriorityLiness().values());
for (PriorityLines priorityLines : priorityLiness)
{
MixinMessage.get().messageOne(sender, priorityLines.getLines());
}
MixinMessage.get().messageOne(sender, priorityLines.getLines());
}
});

View File

@@ -1,9 +1,5 @@
package com.massivecraft.factions.cmd;
import java.util.List;
import org.bukkit.Bukkit;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.entity.MFlag;
import com.massivecraft.factions.entity.MFlagColl;
@@ -12,7 +8,9 @@ import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.Parameter;
import com.massivecraft.massivecore.pager.Pager;
import com.massivecraft.massivecore.pager.Stringifier;
import com.massivecraft.massivecore.predicate.Predicate;
import org.bukkit.Bukkit;
import java.util.List;
public class CmdFactionsFlagList extends FactionsCommand
{
@@ -39,36 +37,17 @@ public class CmdFactionsFlagList extends FactionsCommand
// Pager create
String title = "Flag List for " + msenderFaction.describeTo(mplayer);
final Pager<MFlag> pager = new Pager<>(this, title, page, new Stringifier<MFlag>()
{
@Override
public String toString(MFlag mflag, int index)
{
return mflag.getStateDesc(false, false, true, true, true, false);
}
});
final Pager<MFlag> pager = new Pager<>(this, title, page, (Stringifier<MFlag>) (mflag, index) -> mflag.getStateDesc(false, false, true, true, true, false));
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
{
// Get items
List<MFlag> items = MFlagColl.get().getAll(mplayer.isOverriding() ? null : new Predicate<MFlag>()
{
@Override
public boolean apply(MFlag mflag)
{
return mflag.isVisible();
}
});
// Pager items
pager.setItems(items);
// Pager message
pager.message();
}
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Get items
List<MFlag> items = MFlagColl.get().getAll(mplayer.isOverriding() ? null : MFlag::isVisible);
// Pager items
pager.setItems(items);
// Pager message
pager.message();
});
}

View File

@@ -37,14 +37,7 @@ public class CmdFactionsFlagShow extends FactionsCommand
// Pager create
String title = "Flags for " + faction.describeTo(msender);
Pager<MFlag> pager = new Pager<>(this, title, page, MFlag.getAll(), new Stringifier<MFlag>()
{
@Override
public String toString(MFlag mflag, int index)
{
return mflag.getStateDesc(faction.getFlag(mflag), true, true, true, true, true);
}
});
Pager<MFlag> pager = new Pager<>(this, title, page, MFlag.getAll(), (Stringifier<MFlag>) (mflag, index) -> mflag.getStateDesc(faction.getFlag(mflag), true, true, true, true, true));
// Pager args
List<String> pagerArgs = new MassiveList<>(

View File

@@ -16,8 +16,6 @@ import com.massivecraft.massivecore.util.TimeDiffUtil;
import com.massivecraft.massivecore.util.TimeUnit;
import com.massivecraft.massivecore.util.Txt;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
@@ -55,38 +53,27 @@ public class CmdFactionsInviteList extends FactionsCommand
// Pager Create
final List<Entry<String, Invitation>> invitations = new MassiveList<>(faction.getInvitations().entrySet());
Collections.sort(invitations, new Comparator<Entry<String, Invitation>>()
{
@Override
public int compare(Entry<String, Invitation> i1, Entry<String, Invitation> i2)
{
return ComparatorSmart.get().compare(i2.getValue().getCreationMillis(), i1.getValue().getCreationMillis());
}
});
invitations.sort((i1, i2) -> ComparatorSmart.get().compare(i2.getValue().getCreationMillis(), i1.getValue().getCreationMillis()));
final long now = System.currentTimeMillis();
final Pager<Entry<String, Invitation>> pager = new Pager<>(this, "Invited Players List", page, invitations, new Stringifier<Entry<String, Invitation>>()
{
public String toString(Entry<String, Invitation> entry, int index)
{
String inviteeId = entry.getKey();
String inviterId = entry.getValue().getInviterId();
String inviteeDisplayName = MixinDisplayName.get().getDisplayName(inviteeId, sender);
String inviterDisplayName = inviterId != null ? MixinDisplayName.get().getDisplayName(inviterId, sender) : Txt.parse("<silver>unknown");
String ageDesc = "";
if (entry.getValue().getCreationMillis() != null)
{
long millis = now - entry.getValue().getCreationMillis();
LinkedHashMap<TimeUnit, Long> ageUnitcounts = TimeDiffUtil.limit(TimeDiffUtil.unitcounts(millis, TimeUnit.getAllButMillis()), 2);
ageDesc = TimeDiffUtil.formatedMinimal(ageUnitcounts, "<i>");
ageDesc = " " + ageDesc + Txt.parse(" ago");
}
final Pager<Entry<String, Invitation>> pager = new Pager<>(this, "Invited Players List", page, invitations, (Stringifier<Entry<String, Invitation>>) (entry, index) -> {
String inviteeId = entry.getKey();
String inviterId = entry.getValue().getInviterId();
return Txt.parse("%s<i> was invited by %s<reset>%s<i>.", inviteeDisplayName, inviterDisplayName, ageDesc);
String inviteeDisplayName = MixinDisplayName.get().getDisplayName(inviteeId, sender);
String inviterDisplayName = inviterId != null ? MixinDisplayName.get().getDisplayName(inviterId, sender) : Txt.parse("<silver>unknown");
String ageDesc = "";
if (entry.getValue().getCreationMillis() != null)
{
long millis = now - entry.getValue().getCreationMillis();
LinkedHashMap<TimeUnit, Long> ageUnitcounts = TimeDiffUtil.limit(TimeDiffUtil.unitcounts(millis, TimeUnit.getAllButMillis()), 2);
ageDesc = TimeDiffUtil.formatedMinimal(ageUnitcounts, "<i>");
ageDesc = " " + ageDesc + Txt.parse(" ago");
}
return Txt.parse("%s<i> was invited by %s<reset>%s<i>.", inviteeDisplayName, inviterDisplayName, ageDesc);
});
// Pager Message

View File

@@ -43,40 +43,31 @@ public class CmdFactionsList extends FactionsCommand
// We run it asynchronously to spare the primary server thread.
// Pager Create
final Pager<Faction> pager = new Pager<>(this, "Faction List", page, new Stringifier<Faction>() {
@Override
public String toString(Faction faction, int index)
final Pager<Faction> pager = new Pager<>(this, "Faction List", page, (Stringifier<Faction>) (faction, index) -> {
if (faction.isNone())
{
if (faction.isNone())
{
return Txt.parse("<i>Factionless<i> %d online", FactionColl.get().getNone().getMPlayersWhereOnlineTo(sender).size());
}
else
{
return Txt.parse("%s<i> %d/%d online, %d/%d/%d",
faction.getName(msender),
faction.getMPlayersWhereOnlineTo(sender).size(),
faction.getMPlayers().size(),
faction.getLandCount(),
faction.getPowerRounded(),
faction.getPowerMaxRounded()
);
}
return Txt.parse("<i>Factionless<i> %d online", FactionColl.get().getNone().getMPlayersWhereOnlineTo(sender).size());
}
else
{
return Txt.parse("%s<i> %d/%d online, %d/%d/%d",
faction.getName(msender),
faction.getMPlayersWhereOnlineTo(sender).size(),
faction.getMPlayers().size(),
faction.getLandCount(),
faction.getPowerRounded(),
faction.getPowerMaxRounded()
);
}
});
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
{
// Pager Items
final List<Faction> factions = FactionColl.get().getAll(ComparatorFactionList.get(sender));
pager.setItems(factions);
// Pager Message
pager.message();
}
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Pager Items
final List<Faction> factions = FactionColl.get().getAll(ComparatorFactionList.get(sender));
pager.setItems(factions);
// Pager Message
pager.message();
});
}

View File

@@ -4,6 +4,7 @@ import com.massivecraft.factions.util.AsciiMap;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanYes;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.util.Txt;
public class CmdFactionsMap extends FactionsCommand
@@ -37,7 +38,7 @@ public class CmdFactionsMap extends FactionsCommand
if (!showMap) return;
// Show Map
AsciiMap map = new AsciiMap(msender, me, !argSet);
AsciiMap map = new AsciiMap(msender, PS.valueOf(me), !argSet);
message(map.render());
}

View File

@@ -39,20 +39,15 @@ public class CmdFactionsPermList extends FactionsCommand
final Pager<MPerm> pager = new Pager<>(this, title, page, (Stringifier<MPerm>) (mp, i) -> mp.getDesc(true, true));
final Predicate<MPerm> predicate = msender.isOverriding() ? null : MPerm::isVisible;
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
{
// Get items
List<MPerm> items = MPermColl.get().getAll(predicate);
// Pager items
pager.setItems(items);
// Pager message
pager.message();
}
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Get items
List<MPerm> items = MPermColl.get().getAll(predicate);
// Pager items
pager.setItems(items);
// Pager message
pager.message();
});
}

View File

@@ -44,7 +44,7 @@ public class CmdFactionsPermShow extends FactionsCommand
for (String permitted : permittedIds)
{
permables.add(idToMPermable(permitted));
permables.add(MPerm.idToMPermable(permitted));
}
String removeString = Txt.parse(" of ") + faction.getDisplayName(msender);

View File

@@ -37,7 +37,7 @@ public class CmdFactionsRankList extends FactionsCommand
List<Rank> ranks = faction.getRanks().getAll(Comparator.comparingInt(Rank::getPriority).reversed());
String title = "Rank list for " + faction.describeTo(msender);
Pager<Rank> pager = new Pager(this, title, page, ranks, (Stringifier<Rank>) (r, i) -> r.getVisual());
Pager<Rank> pager = new Pager<>(this, title, page, ranks, (Stringifier<Rank>) (r, i) -> r.getVisual());
pager.message();
}

View File

@@ -15,6 +15,7 @@ import com.massivecraft.factions.event.EventFactionsMembershipChange;
import com.massivecraft.factions.event.EventFactionsMembershipChange.MembershipChangeReason;
import com.massivecraft.factions.event.EventFactionsRankChange;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.collections.MassiveSet;
import com.massivecraft.massivecore.util.Txt;
import java.util.HashSet;
@@ -317,8 +318,7 @@ public class CmdFactionsRankSet extends FactionsCommand
}
// Create recipients
Set<MPlayer> recipients = new HashSet<>();
recipients.addAll(targetFaction.getMPlayers());
Set<MPlayer> recipients = new MassiveSet<>(targetFaction.getMPlayers());
recipients.add(msender);
// Were they demoted or promoted?

View File

@@ -54,42 +54,30 @@ public class CmdFactionsRelationList extends FactionsCommand
final Set<Rel> relations = this.readArg(RELEVANT_RELATIONS);
// Pager Create
final Pager<String> pager = new Pager<>(this, "", page, new Stringifier<String>()
{
@Override
public String toString(String item, int index)
{
return item;
}
});
final Pager<String> pager = new Pager<>(this, "", page, (Stringifier<String>) (item, index) -> item);
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Prepare Items
List<String> relNames = new MassiveList<>();
for (Entry<Rel, List<String>> entry : FactionColl.get().getRelationNames(faction, relations).entrySet())
{
// Prepare Items
List<String> relNames = new MassiveList<>();
for (Entry<Rel, List<String>> entry : FactionColl.get().getRelationNames(faction, relations).entrySet())
Rel relation = entry.getKey();
String coloredName = relation.getColor().toString() + relation.getName();
for (String name : entry.getValue())
{
Rel relation = entry.getKey();
String coloredName = relation.getColor().toString() + relation.getName();
for (String name : entry.getValue())
{
relNames.add(coloredName + SEPERATOR + name);
}
relNames.add(coloredName + SEPERATOR + name);
}
// Pager Title
pager.setTitle(Txt.parse("<white>%s's <green>Relations <a>(%d)", faction.getName(), relNames.size()));
// Pager Items
pager.setItems(relNames);
// Pager Message
pager.message();
}
// Pager Title
pager.setTitle(Txt.parse("<white>%s's <green>Relations <a>(%d)", faction.getName(), relNames.size()));
// Pager Items
pager.setItems(relNames);
// Pager Message
pager.message();
});
}

View File

@@ -42,44 +42,34 @@ public class CmdFactionsRelationWishes extends FactionsCommand
final Faction faction = this.readArg(msenderFaction);
// Pager Create
final Pager<Entry<Faction, Rel>> pager = new Pager<>(this, "", page, new Stringifier<Entry<Faction, Rel>>()
{
@Override
public String toString(Entry<Faction, Rel> item, int index)
{
Rel rel = item.getValue();
Faction fac = item.getKey();
return rel.getColor().toString() + rel.getName() + CmdFactionsRelationList.SEPERATOR + fac.describeTo(faction, true);
}
final Pager<Entry<Faction, Rel>> pager = new Pager<>(this, "", page, (Stringifier<Entry<Faction, Rel>>) (item, index) -> {
Rel rel = item.getValue();
Faction fac = item.getKey();
return rel.getColor().toString() + rel.getName() + CmdFactionsRelationList.SEPERATOR + fac.describeTo(faction, true);
});
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
Map<Faction, Rel> realWishes = new MassiveMap<>();
for (Entry<String, Rel> entry : faction.getRelationWishes().entrySet())
{
Map<Faction, Rel> realWishes = new MassiveMap<>();
Rel rel = entry.getValue();
Faction fac = FactionColl.get().getFixed(entry.getKey());
if (fac == null) continue;
for (Entry<String, Rel> entry : faction.getRelationWishes().entrySet())
{
Rel rel = entry.getValue();
Faction fac = FactionColl.get().getFixed(entry.getKey());
if (fac == null) continue;
// A wish is not a wish anymore if both factions have atleast equal "wishes"
if (fac.getRelationTo(faction).isAtLeast(rel)) continue;
realWishes.put(fac, rel);
}
// Pager Title
pager.setTitle(Txt.parse("<white>%s's <green>Relation wishes <a>(%d)", faction.getName(), realWishes.size()));
// Pager Items
pager.setItems(MUtil.entriesSortedByValues(realWishes));
// Pager Message
pager.message();
// A wish is not a wish anymore if both factions have atleast equal "wishes"
if (fac.getRelationTo(faction).isAtLeast(rel)) continue;
realWishes.put(fac, rel);
}
// Pager Title
pager.setTitle(Txt.parse("<white>%s's <green>Relation wishes <a>(%d)", faction.getName(), realWishes.size()));
// Pager Items
pager.setItems(MUtil.entriesSortedByValues(realWishes));
// Pager Message
pager.message();
});
}
}

View File

@@ -60,8 +60,7 @@ public class CmdFactionsSeeChunkOld extends FactionsCommand
// Inform
msg("<i>Visualized %s", chunk.toString(PSFormatHumanSpace.get()));
}
@SuppressWarnings("deprecation")
public static void showPillar(Player player, World world, int blockX, int blockZ)
{
for (int blockY = 0; blockY < world.getMaxHeight(); blockY++)

View File

@@ -37,8 +37,7 @@ public class CmdFactionsSetOne extends CmdFactionsSetXSimple
public Set<PS> getChunks()
{
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
final Set<PS> chunks = Collections.singleton(chunk);
return chunks;
return Collections.singleton(chunk);
}
}

View File

@@ -46,53 +46,48 @@ public class CmdFactionsStatus extends FactionsCommand
// Sort list
final List<MPlayer> mplayers = faction.getMPlayers();
Collections.sort(mplayers, sortedBy);
mplayers.sort(sortedBy);
// Pager Create
String title = Txt.parse("<i>Status of %s<i>.", faction.describeTo(msender, true));
final Pager<MPlayer> pager = new Pager<>(this, title, page, mplayers, new Stringifier<MPlayer>()
{
@Override
public String toString(MPlayer mplayer, int index)
final Pager<MPlayer> pager = new Pager<>(this, title, page, mplayers, (Stringifier<MPlayer>) (mplayer, index) -> {
// Name
String displayName = mplayer.getNameAndSomething(msender.getColorTo(mplayer).toString(), "");
int length = 15 - displayName.length();
length = length <= 0 ? 1 : length;
String whiteSpace = Txt.repeat(" ", length);
// Power
double currentPower = mplayer.getPower();
double maxPower = mplayer.getPowerMax();
String color;
double percent = currentPower / maxPower;
if (percent > 0.75)
{
// Name
String displayName = mplayer.getNameAndSomething(msender.getColorTo(mplayer).toString(), "");
int length = 15 - displayName.length();
length = length <= 0 ? 1 : length;
String whiteSpace = Txt.repeat(" ", length);
// Power
double currentPower = mplayer.getPower();
double maxPower = mplayer.getPowerMax();
String color;
double percent = currentPower / maxPower;
if (percent > 0.75)
{
color = "<green>";
}
else if (percent > 0.5)
{
color = "<yellow>";
}
else if (percent > 0.25)
{
color = "<rose>";
}
else
{
color = "<red>";
}
String power = Txt.parse("<art>Power: %s%.0f<gray>/<green>%.0f", Txt.parse(color), currentPower, maxPower);
// Time
long lastActiveMillis = mplayer.getLastActivityMillis() - System.currentTimeMillis();
LinkedHashMap<TimeUnit, Long> activeTimes = TimeDiffUtil.limit(TimeDiffUtil.unitcounts(lastActiveMillis, TimeUnit.getAllButMillis()), 3);
String lastActive = mplayer.isOnline(msender) ? Txt.parse("<lime>Online right now.") : Txt.parse("<i>Last active: " + TimeDiffUtil.formatedMinimal(activeTimes, "<i>"));
return Txt.parse("%s%s %s %s", displayName, whiteSpace, power, lastActive);
color = "<green>";
}
else if (percent > 0.5)
{
color = "<yellow>";
}
else if (percent > 0.25)
{
color = "<rose>";
}
else
{
color = "<red>";
}
String power = Txt.parse("<art>Power: %s%.0f<gray>/<green>%.0f", Txt.parse(color), currentPower, maxPower);
// Time
long lastActiveMillis = mplayer.getLastActivityMillis() - System.currentTimeMillis();
LinkedHashMap<TimeUnit, Long> activeTimes = TimeDiffUtil.limit(TimeDiffUtil.unitcounts(lastActiveMillis, TimeUnit.getAllButMillis()), 3);
String lastActive = mplayer.isOnline(msender) ? Txt.parse("<lime>Online right now.") : Txt.parse("<i>Last active: " + TimeDiffUtil.formatedMinimal(activeTimes, "<i>"));
return Txt.parse("%s%s %s %s", displayName, whiteSpace, power, lastActive);
});

View File

@@ -57,18 +57,13 @@ public class CmdFactionsTop extends FactionsCommand
// NOTE: The faction list is quite slow and mostly thread safe.
// We run it asynchronously to spare the primary server thread.
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
{
// Pager Items
List<Faction> factions = FactionColl.get().getAll((f1, f2) -> (int) (getNumber(category, f2) - getNumber(category, f1)));
pager.setItems(factions);
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Pager Items
List<Faction> factions = FactionColl.get().getAll((f1, f2) -> (int) (getNumber(category, f2) - getNumber(category, f1)));
pager.setItems(factions);
// Pager Message
pager.message();
}
// Pager Message
pager.message();
});
}

View File

@@ -81,8 +81,7 @@ public class TypeMPermable extends TypeAbstract<MPerm.MPermable>
TypeRank typeRank = new TypeRank(this.getFaction());
try
{
Rank rank = typeRank.read(arg, sender);
return rank;
return typeRank.read(arg, sender);
}
catch (MassiveException ex)
{
@@ -91,8 +90,7 @@ public class TypeMPermable extends TypeAbstract<MPerm.MPermable>
try
{
Rel rel = TypeRelation.get().read(arg, sender);
return rel;
return TypeRelation.get().read(arg, sender);
}
catch (MassiveException ex)
{
@@ -101,8 +99,7 @@ public class TypeMPermable extends TypeAbstract<MPerm.MPermable>
try
{
MPlayer mplayer = TypeMPlayer.get().read(arg, sender);
return mplayer;
return TypeMPlayer.get().read(arg, sender);
}
catch (MassiveException ex)
{
@@ -111,8 +108,7 @@ public class TypeMPermable extends TypeAbstract<MPerm.MPermable>
try
{
Faction faction = TypeFaction.get().read(arg, sender);
return faction;
return TypeFaction.get().read(arg, sender);
}
catch (MassiveException ex)
{
@@ -126,8 +122,7 @@ public class TypeMPermable extends TypeAbstract<MPerm.MPermable>
String rankName = arg.substring(idx+1);
Faction faction = TypeFaction.get().read(factionName, sender);
Rank rank = TypeRank.get(faction).read(rankName, sender);
return rank;
return TypeRank.get(faction).read(rankName, sender);
}
throw new MassiveException().addMsg("<b>No rank, relation, player or faction matches: <h>%s<b>.", arg);