Scoreboard flicker fixed!
This commit is contained in:
parent
558f79fe34
commit
05e116ea0d
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue