Performance overhaul sponsored by rockxz3, using his large server's data for reference to help with testing and tuning. Timing numbers below are based on this data set on my test server.
* PlayerMoveEvent performance boost (from 0.047ms to 0.015ms in testing, ~313% as fast): now more thrifty in determining whether player has actually moved between chunks before doing anything else; important since this event triggers extremely quickly * PlayerInteractEvent performance boost (from 0.068ms to 0.034ms in testing, ~200% as fast): now ignores left-clicks for interaction checks, since in CraftBukkit 1.4 left-clicks no longer open doors or activate buttons/levers/etc.; not as important as above, but still triggers quite often as people are digging or interacting with blocks * "/f list" command performance boost (from 234ms to 30ms in testing, ~780% as fast): code was getting information for all factions, narrowed it down to only getting info for displayed page range * "/f show" command performance boost (from 132ms to 28ms in testing, ~470% as fast): tweaked the ally & enemy listing code used
This commit is contained in:
parent
d31741fb34
commit
3e0a68fd6e
@ -451,7 +451,7 @@ public class FPlayer extends PlayerEntity implements EconomyParticipator
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Faction factionHere = Board.getFactionAt(new FLocation(this));
|
Faction factionHere = Board.getFactionAt(this.getLastStoodAt());
|
||||||
String msg = P.p.txt.parse("<i>")+" ~ "+factionHere.getTag(this);
|
String msg = P.p.txt.parse("<i>")+" ~ "+factionHere.getTag(this);
|
||||||
if (factionHere.getDescription().length() > 0)
|
if (factionHere.getDescription().length() > 0)
|
||||||
{
|
{
|
||||||
|
@ -277,6 +277,12 @@ public class Faction extends Entity implements EconomyParticipator
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Map<Rel, List<String>> getFactionTagsPerRelation(RelationParticipator rp)
|
public Map<Rel, List<String>> getFactionTagsPerRelation(RelationParticipator rp)
|
||||||
|
{
|
||||||
|
return getFactionTagsPerRelation(rp, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// onlyNonNeutral option provides substantial performance boost on large servers for listing only non-neutral factions
|
||||||
|
public Map<Rel, List<String>> getFactionTagsPerRelation(RelationParticipator rp, boolean onlyNonNeutral)
|
||||||
{
|
{
|
||||||
Map<Rel, List<String>> ret = new HashMap<Rel, List<String>>();
|
Map<Rel, List<String>> ret = new HashMap<Rel, List<String>>();
|
||||||
for (Rel rel : Rel.values())
|
for (Rel rel : Rel.values())
|
||||||
@ -286,6 +292,7 @@ public class Faction extends Entity implements EconomyParticipator
|
|||||||
for (Faction faction : Factions.i.get())
|
for (Faction faction : Factions.i.get())
|
||||||
{
|
{
|
||||||
Rel relation = faction.getRelationTo(this);
|
Rel relation = faction.getRelationTo(this);
|
||||||
|
if (onlyNonNeutral && relation == Rel.NEUTRAL) continue;
|
||||||
ret.get(relation).add(faction.getTag(rp));
|
ret.get(relation).add(faction.getTag(rp));
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -73,6 +73,8 @@ public class CmdList extends FCommand
|
|||||||
});
|
});
|
||||||
|
|
||||||
ArrayList<String> lines = new ArrayList<String>();
|
ArrayList<String> lines = new ArrayList<String>();
|
||||||
|
|
||||||
|
/* // 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("<i>Factionless<i> %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size()));
|
lines.add(p.txt.parse("<i>Factionless<i> %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size()));
|
||||||
for (Faction faction : factionList)
|
for (Faction faction : factionList)
|
||||||
{
|
{
|
||||||
@ -87,6 +89,37 @@ public class CmdList extends FCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
sendMessage(p.txt.getPage(lines, this.argAsInt(0, 1), "Faction List"));
|
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("<i>Factionless<i> %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size()));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lines.add(p.txt.parse("%s<i> %d/%d online, %d/%d/%d",
|
||||||
|
faction.getTag(fme),
|
||||||
|
faction.getFPlayersWhereOnline(true).size(),
|
||||||
|
faction.getFPlayers().size(),
|
||||||
|
faction.getLandRounded(),
|
||||||
|
faction.getPowerRounded(),
|
||||||
|
faction.getPowerMaxRounded())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
sendMessage(lines);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ public class CmdShow extends FCommand
|
|||||||
String sepparator = p.txt.parse("<i>")+", ";
|
String sepparator = p.txt.parse("<i>")+", ";
|
||||||
|
|
||||||
// List the relations to other factions
|
// List the relations to other factions
|
||||||
Map<Rel, List<String>> relationTags = faction.getFactionTagsPerRelation(fme);
|
Map<Rel, List<String>> relationTags = faction.getFactionTagsPerRelation(fme, true);
|
||||||
|
|
||||||
if (faction.getFlag(FFlag.PEACEFUL))
|
if (faction.getFlag(FFlag.PEACEFUL))
|
||||||
{
|
{
|
||||||
|
@ -72,7 +72,7 @@ public class SpoutMainListener implements Listener
|
|||||||
if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && ! Conf.spoutTerritoryNoticeShow))
|
if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && ! Conf.spoutTerritoryNoticeShow))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
FLocation here = new FLocation(player);
|
FLocation here = player.getLastStoodAt();
|
||||||
|
|
||||||
doAccessInfo(player, sPlayer, here);
|
doAccessInfo(player, sPlayer, here);
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ public class SpoutMainListener implements Listener
|
|||||||
|
|
||||||
private void doLabels(FPlayer player, SpoutPlayer sPlayer, boolean notify)
|
private void doLabels(FPlayer player, SpoutPlayer sPlayer, boolean notify)
|
||||||
{
|
{
|
||||||
FLocation here = new FLocation(player);
|
FLocation here = player.getLastStoodAt();
|
||||||
Faction factionHere = Board.getFactionAt(here);
|
Faction factionHere = Board.getFactionAt(here);
|
||||||
String tag = factionHere.getColorTo(player).toString() + factionHere.getTag();
|
String tag = factionHere.getColorTo(player).toString() + factionHere.getTag();
|
||||||
|
|
||||||
|
@ -52,6 +52,11 @@ public class FactionsPlayerListener implements Listener
|
|||||||
|
|
||||||
// Update the lastLoginTime for this fplayer
|
// Update the lastLoginTime for this fplayer
|
||||||
me.setLastLoginTime(System.currentTimeMillis());
|
me.setLastLoginTime(System.currentTimeMillis());
|
||||||
|
|
||||||
|
// Store player's current FLocation and notify them where they are
|
||||||
|
me.setLastStoodAt(new FLocation(event.getPlayer().getLocation()));
|
||||||
|
if ( ! SpoutFeatures.updateTerritoryDisplay(me))
|
||||||
|
me.sendFactionHereMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL)
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
@ -67,15 +72,28 @@ public class FactionsPlayerListener implements Listener
|
|||||||
SpoutFeatures.playerDisconnect(me);
|
SpoutFeatures.playerDisconnect(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void onPlayerMove(PlayerMoveEvent event)
|
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();
|
Player player = event.getPlayer();
|
||||||
FPlayer me = FPlayers.i.get(player);
|
FPlayer me = FPlayers.i.get(player);
|
||||||
|
|
||||||
// Did we change coord?
|
// Did we change coord?
|
||||||
FLocation from = me.getLastStoodAt();
|
FLocation from = me.getLastStoodAt();
|
||||||
FLocation to = new FLocation(player.getLocation());
|
FLocation to = new FLocation(event.getTo());
|
||||||
|
|
||||||
if (from.equals(to)) return;
|
if (from.equals(to)) return;
|
||||||
|
|
||||||
@ -110,7 +128,7 @@ public class FactionsPlayerListener implements Listener
|
|||||||
|
|
||||||
if (me.getAutoClaimFor() != null)
|
if (me.getAutoClaimFor() != null)
|
||||||
{
|
{
|
||||||
me.attemptClaim(me.getAutoClaimFor(), player.getLocation(), true);
|
me.attemptClaim(me.getAutoClaimFor(), event.getTo(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,14 +136,12 @@ public class FactionsPlayerListener implements Listener
|
|||||||
public void onPlayerInteract(PlayerInteractEvent event)
|
public void onPlayerInteract(PlayerInteractEvent event)
|
||||||
{
|
{
|
||||||
if (event.isCancelled()) return;
|
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();
|
Block block = event.getClickedBlock();
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
if (block == null)
|
if (block == null) return; // clicked in air, apparently
|
||||||
{
|
|
||||||
return; // clicked in air, apparently
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! canPlayerUseBlock(player, block, false))
|
if ( ! canPlayerUseBlock(player, block, false))
|
||||||
{
|
{
|
||||||
@ -150,11 +166,6 @@ public class FactionsPlayerListener implements Listener
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
|
||||||
{
|
|
||||||
return; // only interested on right-clicks for below
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! playerCanUseItemHere(player, block.getLocation(), event.getMaterial(), false))
|
if ( ! playerCanUseItemHere(player, block.getLocation(), event.getMaterial(), false))
|
||||||
{
|
{
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
Loading…
Reference in New Issue
Block a user