With Spout, the territory indicator now also has an ownership indicator below it (but only if the current territory has any owners set), and a larger centered territory notice below which goes away after a couple of seconds.

These effectively replace the related chat notices if enabled.
Also, updated libs.
This commit is contained in:
Brettflan 2011-10-13 14:09:47 -05:00
parent 0888e027ad
commit 1a38007d64
9 changed files with 260 additions and 79 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -182,13 +182,19 @@ public class Conf
public static transient Set<CreatureType> safeZoneNerfedCreatureTypes = EnumSet.noneOf(CreatureType.class);
// Spout features
public static boolean spoutFactionTagsOverNames = true;
public static boolean spoutFactionTitlesOverNames = true;
public static boolean spoutFactionAdminCapes = true; // TODO: What are these for?
public static boolean spoutFactionModeratorCapes = true;
public static int spoutTerritoryDisplayPosition = 3;
public static float spoutTerritoryDisplaySize = 1.0f;
public static boolean spoutTerritoryDisplayShowDescription = true;
public static boolean spoutFactionTagsOverNames = true; // show faction tags over names over player heads
public static boolean spoutFactionTitlesOverNames = true; // whether to include player's title in that
public static boolean spoutFactionAdminCapes = true; // Show capes on faction admins, colored based on the viewer's relation to the target player
public static boolean spoutFactionModeratorCapes = true; // same, but for faction moderators
public static int spoutTerritoryDisplayPosition = 3; // permanent territory display, instead of by chat; 0 = disabled, 1 = top left, 2 = top center, 3+ = top right
public static float spoutTerritoryDisplaySize = 1.0f; // text scale (size) for territory display
public static boolean spoutTerritoryDisplayShowDescription = true; // whether to show the faction description, not just the faction tag
public static boolean spoutTerritoryOwnersShow = true; // show territory owner list as well
public static boolean spoutTerritoryNoticeShow = true; // show additional brief territory notice near center of screen, to be sure player notices transition
public static int spoutTerritoryNoticeTop = 40; // how far down the screen to place the additional notice
public static boolean spoutTerritoryNoticeShowDescription = false; // whether to show the faction description in the notice, not just the faction tag
public static float spoutTerritoryNoticeSize = 1.5f; // text scale (size) for notice
public static float spoutTerritoryNoticeLeaveAfterSeconds = 2.00f; // how many seconds before the notice goes away
public static String capeAlly = "https://github.com/MassiveCraft/Factions/raw/master/capes/ally.png";
public static String capeEnemy = "https://github.com/MassiveCraft/Factions/raw/master/capes/enemy.png";
public static String capeMember = "https://github.com/MassiveCraft/Factions/raw/master/capes/member.png";

View File

@ -151,7 +151,7 @@ public class FPlayer extends PlayerEntity implements EconomyParticipator
}
}
public void resetFactionData(boolean doSpotUpdate)
public final void resetFactionData(boolean doSpotUpdate)
{
// clean up any territory ownership in old faction, if there is one
if (Factions.i.exists(this.getFactionId()))

View File

@ -123,6 +123,22 @@ public class CmdConfig extends FCommand
}
}
// float
else if (target.getType() == float.class)
{
try
{
float floatVal = Float.parseFloat(value);
target.setFloat(null, floatVal);
success = "\""+fieldName+"\" option set to "+floatVal+".";
}
catch(NumberFormatException ex)
{
sendMessage("Cannot set \""+fieldName+"\": float (numeric) value required.");
return;
}
}
// String
else if (target.getType() == String.class)
{

View File

@ -53,13 +53,7 @@ public class SpoutFeatures
// If any Spout feature is enabled in conf.json, and we're successfully hooked into it
public static boolean enabled()
{
return spoutMe && (
Conf.spoutFactionTagsOverNames
|| Conf.spoutFactionTitlesOverNames
|| Conf.spoutFactionAdminCapes
|| Conf.spoutFactionModeratorCapes
|| Conf.spoutTerritoryDisplayPosition > 0
);
return spoutMe;
}
@ -67,21 +61,26 @@ public class SpoutFeatures
public static boolean updateTerritoryDisplay(FPlayer player)
{
if (!enabled())
{
return false;
}
return mainListener.updateTerritoryDisplay(player);
}
// update owner list for specified player
public static void updateOwnerList(FPlayer player)
{
if (!enabled())
return;
mainListener.updateOwnerList(player);
}
public static void playerDisconnect(FPlayer player)
{
if (!enabled())
{
return;
}
mainListener.removeTerritoryLabel(player.getName());
mainListener.removeTerritoryLabels(player.getName());
}
@ -267,26 +266,30 @@ public class SpoutFeatures
{
if (inColor == null)
{
return new Color(191, 191, 191, alpha);
return SpoutFixedColor(191, 191, 191, alpha);
}
switch (inColor.getCode())
{
case 0x1: return new Color(0, 0, 191, alpha);
case 0x2: return new Color(0, 191, 0, alpha);
case 0x3: return new Color(0, 191, 191, alpha);
case 0x4: return new Color(191, 0, 0, alpha);
case 0x5: return new Color(191, 0, 191, alpha);
case 0x6: return new Color(191, 191, 0, alpha);
case 0x7: return new Color(191, 191, 191, alpha);
case 0x8: return new Color(64, 64, 64, alpha);
case 0x9: return new Color(64, 64, 255, alpha);
case 0xA: return new Color(64, 255, 64, alpha);
case 0xB: return new Color(64, 255, 255, alpha);
case 0xC: return new Color(255, 64, 64, alpha);
case 0xD: return new Color(255, 64, 255, alpha);
case 0xE: return new Color(255, 255, 64, alpha);
case 0xF: return new Color(255, 255, 255, alpha);
default: return new Color(0, 0, 0, alpha);
case 0x1: return SpoutFixedColor(0, 0, 191, alpha);
case 0x2: return SpoutFixedColor(0, 191, 0, alpha);
case 0x3: return SpoutFixedColor(0, 191, 191, alpha);
case 0x4: return SpoutFixedColor(191, 0, 0, alpha);
case 0x5: return SpoutFixedColor(191, 0, 191, alpha);
case 0x6: return SpoutFixedColor(191, 191, 0, alpha);
case 0x7: return SpoutFixedColor(191, 191, 191, alpha);
case 0x8: return SpoutFixedColor(64, 64, 64, alpha);
case 0x9: return SpoutFixedColor(64, 64, 255, alpha);
case 0xA: return SpoutFixedColor(64, 255, 64, alpha);
case 0xB: return SpoutFixedColor(64, 255, 255, alpha);
case 0xC: return SpoutFixedColor(255, 64, 64, alpha);
case 0xD: return SpoutFixedColor(255, 64, 255, alpha);
case 0xE: return SpoutFixedColor(255, 255, 64, alpha);
case 0xF: return SpoutFixedColor(255, 255, 255, alpha);
default: return SpoutFixedColor(0, 0, 0, alpha);
}
}
private static Color SpoutFixedColor(int r, int g, int b, int a)
{
return new Color(r/255.0f, g/255.0f, b/255.0f, a/255.0f);
}
}

View File

@ -36,6 +36,8 @@ public class SpoutMainListener extends SpoutListener
//-----------------------------------------------------------------------------------------//
private transient static Map<String, GenericLabel> territoryLabels = new HashMap<String, GenericLabel>();
private transient static Map<String, NoticeLabel> territoryChangeLabels = new HashMap<String, NoticeLabel>();
private transient static Map<String, GenericLabel> ownerLabels = new HashMap<String, GenericLabel>();
private final static int SCREEN_WIDTH = 427;
// private final static int SCREEN_HEIGHT = 240;
@ -43,47 +45,149 @@ public class SpoutMainListener extends SpoutListener
public boolean updateTerritoryDisplay(FPlayer player)
{
SpoutPlayer sPlayer = SpoutManager.getPlayer(player.getPlayer());
if (!sPlayer.isSpoutCraftEnabled() || Conf.spoutTerritoryDisplaySize <= 0)
{
if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && ! Conf.spoutTerritoryNoticeShow))
return false;
}
GenericLabel label;
if (territoryLabels.containsKey(player.getName()))
{
label = territoryLabels.get(player.getName());
} else {
label = new GenericLabel();
label.setScale(Conf.spoutTerritoryDisplaySize);
/* // this should work once the Spout team fix it to account for text scaling; we can then get rid of alignLabel method added below
switch (Conf.spoutTerritoryDisplayPosition) {
case 1: label.setAlign(WidgetAnchor.TOP_LEFT).setAnchor(WidgetAnchor.TOP_LEFT); break;
case 2: label.setAlign(WidgetAnchor.TOP_CENTER).setAnchor(WidgetAnchor.TOP_CENTER); break;
default: label.setAlign(WidgetAnchor.TOP_RIGHT).setAnchor(WidgetAnchor.TOP_RIGHT);
}
*/
sPlayer.getMainScreen().attachWidget(P.p, label);
territoryLabels.put(player.getName(), label);
}
doLabels(player, sPlayer);
Faction factionHere = Board.getFactionAt(new FLocation(player));
String msg = factionHere.getTag();
if (Conf.spoutTerritoryDisplayShowDescription && factionHere.getDescription().length() > 0)
{
msg += " - "+factionHere.getDescription();
}
label.setTextColor(SpoutFeatures.getSpoutColor(player.getRelationColor(factionHere), 0));
label.setText(msg);
alignLabel(label, msg);
label.setDirty(true);
return true;
}
public void updateOwnerList(FPlayer player)
{
SpoutPlayer sPlayer = SpoutManager.getPlayer(player.getPlayer());
if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && ! Conf.spoutTerritoryNoticeShow))
return;
FLocation here = new FLocation(player);
Faction factionHere = Board.getFactionAt(here);
doOwnerList(player, sPlayer, here, factionHere);
return;
}
public void removeTerritoryLabels(String playerName)
{
territoryLabels.remove(playerName);
territoryChangeLabels.remove(playerName);
ownerLabels.remove(playerName);
}
private void doLabels(FPlayer player, SpoutPlayer sPlayer)
{
FLocation here = new FLocation(player);
Faction factionHere = Board.getFactionAt(here);
String tag = factionHere.getTag(player);
// ----------------------
// Main territory display
// ----------------------
if (Conf.spoutTerritoryDisplayPosition > 0 && Conf.spoutTerritoryDisplaySize > 0)
{
GenericLabel label;
if (territoryLabels.containsKey(player.getName()))
label = territoryLabels.get(player.getName());
else
{
label = new GenericLabel();
label.setScale(Conf.spoutTerritoryDisplaySize);
/* // this should work once the Spout team fix it to account for text scaling; we can then get rid of alignLabel method added below
switch (Conf.spoutTerritoryDisplayPosition) {
case 1: label.setAlign(WidgetAnchor.TOP_LEFT).setAnchor(WidgetAnchor.TOP_LEFT); break;
case 2: label.setAlign(WidgetAnchor.TOP_CENTER).setAnchor(WidgetAnchor.TOP_CENTER); break;
default: label.setAlign(WidgetAnchor.TOP_RIGHT).setAnchor(WidgetAnchor.TOP_RIGHT);
}
*/
sPlayer.getMainScreen().attachWidget(P.p, label);
territoryLabels.put(player.getName(), label);
}
String msg = tag;
if (Conf.spoutTerritoryDisplayShowDescription && !factionHere.getDescription().isEmpty())
msg += " - " + factionHere.getDescription();
label.setText(msg);
alignLabel(label, msg);
label.setDirty(true);
}
// -----------------------
// Fading territory notice
// -----------------------
if (Conf.spoutTerritoryNoticeShow && Conf.spoutTerritoryNoticeSize > 0)
{
NoticeLabel label;
if (territoryChangeLabels.containsKey(player.getName()))
label = territoryChangeLabels.get(player.getName());
else
{
label = new NoticeLabel(Conf.spoutTerritoryNoticeLeaveAfterSeconds);
label.setScale(Conf.spoutTerritoryNoticeSize);
label.setY(Conf.spoutTerritoryNoticeTop);
sPlayer.getMainScreen().attachWidget(P.p, label);
territoryChangeLabels.put(player.getName(), label);
}
String msg = tag;
if (Conf.spoutTerritoryNoticeShowDescription && !factionHere.getDescription().isEmpty())
msg += " - " + factionHere.getDescription();
label.setText(msg);
alignLabel(label, msg, 2);
label.resetNotice();
label.setDirty(true);
}
// and owner list, of course
doOwnerList(player, sPlayer, here, factionHere);
}
private void doOwnerList(FPlayer player, SpoutPlayer sPlayer, FLocation here, Faction factionHere)
{
// ----------
// Owner list
// ----------
if (Conf.spoutTerritoryDisplayPosition > 0 && Conf.spoutTerritoryDisplaySize > 0 && Conf.spoutTerritoryOwnersShow && Conf.ownedAreasEnabled)
{
GenericLabel label;
if (ownerLabels.containsKey(player.getName()))
label = ownerLabels.get(player.getName());
else
{
label = new GenericLabel();
label.setScale(Conf.spoutTerritoryDisplaySize);
label.setY((int)(10 * Conf.spoutTerritoryDisplaySize));
sPlayer.getMainScreen().attachWidget(P.p, label);
ownerLabels.put(player.getName(), label);
}
String msg = "";
if (player.getFaction() == factionHere)
{
msg = factionHere.getOwnerListString(here);
if (!msg.isEmpty())
msg = Conf.ownedLandMessage + msg;
}
label.setText(msg);
alignLabel(label, msg);
label.setDirty(true);
}
}
// this is only necessary because Spout text size scaling is currently bugged and breaks their built-in alignment methods
public void alignLabel(GenericLabel label, String text)
{
alignLabel(label, text, Conf.spoutTerritoryDisplayPosition);
}
public void alignLabel(GenericLabel label, String text, int alignment)
{
int labelWidth = (int)((float)GenericLabel.getStringWidth(text) * Conf.spoutTerritoryDisplaySize);
if (labelWidth > SCREEN_WIDTH)
@ -92,7 +196,7 @@ public class SpoutMainListener extends SpoutListener
return;
}
switch (Conf.spoutTerritoryDisplayPosition)
switch (alignment)
{
case 1: // left aligned
label.setX(0);
@ -105,8 +209,36 @@ public class SpoutMainListener extends SpoutListener
}
}
public void removeTerritoryLabel(String playerName)
private static class NoticeLabel extends GenericLabel
{
territoryLabels.remove(playerName);
private int initial;
private int countdown; // current delay countdown
public NoticeLabel(float secondsOfLife)
{
initial = (int)(secondsOfLife * 20);
resetNotice();
}
public final void resetNotice()
{
countdown = initial;
}
@Override
public void onTick()
{
if (countdown <= 0)
return;
this.countdown -= 1;
if (this.countdown <= 0)
{
this.setText("");
this.setDirty(true);
}
}
}
}

View File

@ -204,24 +204,48 @@ public class FactionsPlayerListener extends PlayerListener
if (factionFrom != factionTo)
{
me.sendFactionHereMessage();
if (Conf.ownedAreasEnabled && Conf.ownedMessageOnBorder && myFaction == factionTo && !ownersTo.isEmpty())
if
(
Conf.ownedAreasEnabled
&&
Conf.ownedMessageOnBorder
&&
(
!SpoutFeatures.enabled()
||
!Conf.spoutTerritoryOwnersShow
)
&&
myFaction == factionTo
&&
!ownersTo.isEmpty()
)
{
me.sendMessage(Conf.ownedLandMessage+ownersTo);
}
}
else if (Conf.ownedAreasEnabled && Conf.ownedMessageInsideTerritory && factionFrom == factionTo && myFaction == factionTo)
else if (SpoutFeatures.enabled() && Conf.spoutTerritoryOwnersShow)
{
SpoutFeatures.updateOwnerList(me);
}
else if
(
Conf.ownedAreasEnabled
&&
Conf.ownedMessageInsideTerritory
&&
factionFrom == factionTo
&&
myFaction == factionTo
)
{
String ownersFrom = myFaction.getOwnerListString(from);
if (Conf.ownedMessageByChunk || !ownersFrom.equals(ownersTo))
{
if (!ownersTo.isEmpty())
{
me.sendMessage(Conf.ownedLandMessage+ownersTo);
}
else if (!Conf.publicLandMessage.isEmpty())
{
me.sendMessage(Conf.publicLandMessage);
}
}
}
}