diff --git a/src/com/massivecraft/factions/FPlayer.java b/src/com/massivecraft/factions/FPlayer.java index 64e170b9..9c229568 100644 --- a/src/com/massivecraft/factions/FPlayer.java +++ b/src/com/massivecraft/factions/FPlayer.java @@ -572,7 +572,7 @@ public class FPlayer extends PlayerEntity implements EconomyParticipator { return; } - Faction factionHere = Board.getFactionAt(new FLocation(this)); + Faction factionHere = Board.getFactionAt(this.getLastStoodAt()); String msg = P.p.txt.parse("")+" ~ "+factionHere.getTag(this); if (factionHere.getDescription().length() > 0) { diff --git a/src/com/massivecraft/factions/cmd/CmdList.java b/src/com/massivecraft/factions/cmd/CmdList.java index 4251db9a..5819ee1e 100644 --- a/src/com/massivecraft/factions/cmd/CmdList.java +++ b/src/com/massivecraft/factions/cmd/CmdList.java @@ -71,6 +71,8 @@ public class CmdList extends FCommand }); ArrayList lines = new ArrayList(); + +/* // this code was really slow on large servers, getting full info for every faction and then only showing 9 of them; rewritten below lines.add(p.txt.parse("Factionless %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size())); for (Faction faction : factionList) { @@ -85,6 +87,37 @@ public class CmdList extends FCommand } sendMessage(p.txt.getPage(lines, this.argAsInt(0, 1), "Faction List")); + */ + + factionList.add(0, Factions.i.getNone()); + + final int pageheight = 9; + int pagenumber = this.argAsInt(0, 1); + int pagecount = (factionList.size() / pageheight) + 1; + int start = (pagenumber - 1) * pageheight; + int end = start + pageheight; + if (end > factionList.size()) + end = factionList.size(); + + lines.add(p.txt.titleize("Faction List "+pagenumber+"/"+pagecount)); + + for (Faction faction : factionList.subList(start, end)) + { + if (faction.isNone()) + { + lines.add(p.txt.parse("Factionless %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size())); + continue; + } + lines.add(p.txt.parse("%s %d/%d online, %d/%d/%d", + faction.getTag(fme), + faction.getFPlayersWhereOnline(true).size(), + faction.getFPlayers().size(), + faction.getLandRounded(), + faction.getPowerRounded(), + faction.getPowerMaxRounded()) + ); + } + + sendMessage(lines); } - } diff --git a/src/com/massivecraft/factions/cmd/CmdShow.java b/src/com/massivecraft/factions/cmd/CmdShow.java index d96cbcad..2cfaeab7 100644 --- a/src/com/massivecraft/factions/cmd/CmdShow.java +++ b/src/com/massivecraft/factions/cmd/CmdShow.java @@ -9,6 +9,7 @@ import com.massivecraft.factions.Faction; import com.massivecraft.factions.Factions; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.struct.Relation; public class CmdShow extends FCommand { @@ -96,28 +97,21 @@ public class CmdShow extends FCommand String enemyList = p.txt.parse("Enemies: "); for (Faction otherFaction : Factions.i.get()) { - if (otherFaction == faction) - { - continue; - } + if (otherFaction == faction) continue; + + Relation rel = otherFaction.getRelationTo(faction); + if ( ! rel.isAlly() && ! rel.isEnemy()) continue; // if not ally or enemy, drop out now so we're not wasting time on it; good performance boost + listpart = otherFaction.getTag(fme)+p.txt.parse("")+", "; - if (otherFaction.getRelationTo(faction).isAlly()) - { + if (rel.isAlly()) allyList += listpart; - } - else if (otherFaction.getRelationTo(faction).isEnemy()) - { + else if (rel.isEnemy()) enemyList += listpart; - } } if (allyList.endsWith(", ")) - { allyList = allyList.substring(0, allyList.length()-2); - } if (enemyList.endsWith(", ")) - { enemyList = enemyList.substring(0, enemyList.length()-2); - } sendMessage(allyList); sendMessage(enemyList); diff --git a/src/com/massivecraft/factions/integration/SpoutMainListener.java b/src/com/massivecraft/factions/integration/SpoutMainListener.java index 6db81503..b7843724 100644 --- a/src/com/massivecraft/factions/integration/SpoutMainListener.java +++ b/src/com/massivecraft/factions/integration/SpoutMainListener.java @@ -65,7 +65,7 @@ public class SpoutMainListener implements Listener if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && ! Conf.spoutTerritoryNoticeShow)) return; - FLocation here = new FLocation(player); + FLocation here = player.getLastStoodAt(); Faction factionHere = Board.getFactionAt(here); doOwnerList(player, sPlayer, here, factionHere); @@ -83,7 +83,7 @@ public class SpoutMainListener implements Listener private void doLabels(FPlayer player, SpoutPlayer sPlayer, boolean notify) { - FLocation here = new FLocation(player); + FLocation here = player.getLastStoodAt(); Faction factionHere = Board.getFactionAt(here); String tag = factionHere.getColorTo(player).toString() + factionHere.getTag(); diff --git a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java index f793793c..7437c215 100644 --- a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -54,11 +54,10 @@ public class FactionsPlayerListener implements Listener // Update the lastLoginTime for this fplayer me.setLastLoginTime(System.currentTimeMillis()); -/* This is now done in a separate task which runs every few minutes - // Run the member auto kick routine. Twice to get to the admins... - FPlayers.i.autoLeaveOnInactivityRoutine(); - FPlayers.i.autoLeaveOnInactivityRoutine(); - */ + // Store player's current FLocation and notify them where they are + me.setLastStoodAt(new FLocation(event.getPlayer().getLocation())); + if ( ! SpoutFeatures.updateTerritoryDisplay(me)) + me.sendFactionHereMessage(); SpoutFeatures.updateAppearancesShortly(event.getPlayer()); } @@ -81,15 +80,28 @@ public class FactionsPlayerListener implements Listener SpoutFeatures.playerDisconnect(me); } - @EventHandler(priority = EventPriority.NORMAL) + @EventHandler(priority = EventPriority.MONITOR) public void onPlayerMove(PlayerMoveEvent event) { + if (event.isCancelled()) return; + + // quick check to make sure player is moving between chunks; good performance boost + if + ( + event.getFrom().getBlockX() >> 4 == event.getTo().getBlockX() >> 4 + && + event.getFrom().getBlockZ() >> 4 == event.getTo().getBlockZ() >> 4 + && + event.getFrom().getWorld() == event.getTo().getWorld() + ) + return; + Player player = event.getPlayer(); FPlayer me = FPlayers.i.get(player); // Did we change coord? FLocation from = me.getLastStoodAt(); - FLocation to = new FLocation(player.getLocation()); + FLocation to = new FLocation(event.getTo()); if (from.equals(to)) { @@ -172,7 +184,7 @@ public class FactionsPlayerListener implements Listener if (me.getAutoClaimFor() != null) { - me.attemptClaim(me.getAutoClaimFor(), player.getLocation(), true); + me.attemptClaim(me.getAutoClaimFor(), event.getTo(), true); } else if (me.isAutoSafeClaimEnabled()) { @@ -182,11 +194,9 @@ public class FactionsPlayerListener implements Listener } else { - FLocation playerFlocation = new FLocation(me); - - if (!Board.getFactionAt(playerFlocation).isSafeZone()) + if (!Board.getFactionAt(to).isSafeZone()) { - Board.setFactionAt(Factions.i.getSafeZone(), playerFlocation); + Board.setFactionAt(Factions.i.getSafeZone(), to); me.msg("This land is now a safe zone."); } } @@ -199,11 +209,9 @@ public class FactionsPlayerListener implements Listener } else { - FLocation playerFlocation = new FLocation(me); - - if (!Board.getFactionAt(playerFlocation).isWarZone()) + if (!Board.getFactionAt(to).isWarZone()) { - Board.setFactionAt(Factions.i.getWarZone(), playerFlocation); + Board.setFactionAt(Factions.i.getWarZone(), to); me.msg("This land is now a war zone."); } } @@ -214,14 +222,12 @@ public class FactionsPlayerListener implements Listener public void onPlayerInteract(PlayerInteractEvent event) { if (event.isCancelled()) return; + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; // only interested in right-clicks as of MC 1.4+; good performance boost Block block = event.getClickedBlock(); Player player = event.getPlayer(); - if (block == null) - { - return; // clicked in air, apparently - } + if (block == null) return; // clicked in air, apparently if ( ! canPlayerUseBlock(player, block, false)) { @@ -246,11 +252,6 @@ public class FactionsPlayerListener implements Listener return; } - if (event.getAction() != Action.RIGHT_CLICK_BLOCK) - { - return; // only interested on right-clicks for below - } - if ( ! playerCanUseItemHere(player, block.getLocation(), event.getMaterial(), false)) { event.setCancelled(true);