Scoreboard flicker fixed!

This commit is contained in:
Mini-Chiss 2014-07-02 12:38:41 -07:00
parent 558f79fe34
commit 05e116ea0d
1 changed files with 104 additions and 27 deletions

View File

@ -1,6 +1,7 @@
package nautilus.game.arcade.scoreboard;
import java.util.ArrayList;
import java.util.HashSet;
import mineplex.core.common.Rank;
import mineplex.core.common.util.C;
@ -26,14 +27,14 @@ public class GameScoreboard
private Objective _sideObjective;
private ArrayList<ScoreboardElement> _elements = new ArrayList<ScoreboardElement>();
private String _space = " ";
private String[] _current = new String[15];
private String _title;
public GameScoreboard(Game game)
{
Game = game;
_title = " MINEPLEX ";
//Scoreboard
@ -43,7 +44,7 @@ public class GameScoreboard
_sideObjective.setDisplaySlot(DisplaySlot.SIDEBAR);
_sideObjective.setDisplayName(C.Bold + _title);
}
public Scoreboard GetScoreboard()
{
return _scoreboard;
@ -53,12 +54,12 @@ public class GameScoreboard
{
return _sideObjective;
}
public void UpdateTitle()
{
}
public String ParseTeamName(String name)
{
return name.substring(0, Math.min(16, name.length()));
@ -93,7 +94,7 @@ public class GameScoreboard
teamName = "";
String team = ParseTeamName(Game.Manager.GetClients().Get(player).GetRank().Name + teamName);
try
{
_scoreboard.getTeam(team).addPlayer(player);
@ -110,6 +111,7 @@ public class GameScoreboard
_scoreboard.resetScores(line);
}
/*
public void Reset()
{
for (ScoreboardElement elem : _elements)
@ -121,38 +123,39 @@ public class GameScoreboard
}
_elements.clear();
_space = " ";
}
*/
public String Clean(String line)
{
if (line.length() >= 16)
line = line.substring(0, 15);
return line;
}
public void Write(String line)
{
line = Clean(line);
_elements.add(new ScoreboardElementText(line));
}
public void WriteOrdered(String key, String line, int value, boolean prependScore)
{
if (prependScore)
line = value + " " + line;
line = Clean(line);
for (ScoreboardElement elem : _elements)
{
if (elem instanceof ScoreboardElementScores)
{
ScoreboardElementScores scores = (ScoreboardElementScores)elem;
if (scores.IsKey(key))
{
scores.AddScore(line, value);
@ -160,28 +163,102 @@ public class GameScoreboard
}
}
}
_elements.add(new ScoreboardElementScores(key, line, value, true));
}
public void WriteBlank()
{
_elements.add(new ScoreboardElementText(_space));
_space += " ";
_elements.add(new ScoreboardElementText(" "));
}
public void Draw()
{
int i = 15;
{
//System.out.println();
//System.out.println("/////////////////////////");
//Generate Lines
ArrayList<String> newLines = new ArrayList<String>();
for (ScoreboardElement elem : _elements)
{
for (String line : elem.GetLines())
{
GetObjectiveSide().getScore(line).setScore(i--);
//Ensure no duplicate lines
while (true)
{
boolean matched = false;
for (String otherLine : newLines)
{
if (line.equals(otherLine))
{
line += ChatColor.RESET;
matched = true;
}
}
if (!matched)
break;
}
newLines.add(line);
}
}
//Find Changes
HashSet<Integer> toUpdate = new HashSet<Integer>();
HashSet<Integer> toDelete = new HashSet<Integer>();
for (int i=0 ; i<15 ; i++)
{
//Delete Old Excess Row
if (i >= newLines.size())
{
if (_current[i] != null)
{
//System.out.println("Delete: " + i + " [" + _current[i] + "]");
toDelete.add(i);
}
continue;
}
//Update or Add Row
if (_current[i] == null || !_current[i].equals(newLines.get(i)))
{
//System.out.println("Update: " + i + " [" + newLines.get(i) + "]");
toUpdate.add(i);
}
}
//Add/Update Elements
for (int i : toUpdate)
{
//Remove Old Line at Index
if (_current[i] != null)
ResetScore(_current[i]);
//Insert New Line
String newLine = newLines.get(i);
GetObjectiveSide().getScore(newLine).setScore(15-i);
_current[i] = newLine;
}
//Delete Elements
for (int i : toDelete)
{
//Remove Old Line at Index
if (_current[i] != null)
{
ResetScore(_current[i]);
_current[i] = null;
}
if (i <= 0)
break;
}
}
public void Reset()
{
_elements.clear();
}
}