Skip to content

Commit

Permalink
Make scoreboard viewers persist through saving, reloading and restart…
Browse files Browse the repository at this point in the history
…ing regardless of whether they are online or not.
  • Loading branch information
davidcernat committed Oct 17, 2013
1 parent fd1d590 commit fc1b8e8
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 34 deletions.
Expand Up @@ -236,14 +236,27 @@ else if (viewers == null) {

if (viewers != null) {
for (dPlayer viewer : viewers) {
if (viewer.isOnline()) {
// Add viewers to this scoreboard
if (act.equals(Action.ADD))
// Add viewers for this scoreboard
if (act.equals(Action.ADD)) {
// If this isn't the main scoreboard, add this viewer
// to the map of viewers saved by Denizen
if (!id.asString().equalsIgnoreCase("main"))
ScoreboardHelper.viewerMap.put(viewer.getName(), id.asString());

// Make this player view the scoreboard if he/she
// is already online
if (viewer.isOnline())
viewer.getPlayerEntity().setScoreboard(board);
// Remove viewers from this scoreboard by giving them
// a blank scoreboard (in lieu of better methods provided
// by Bukkit)
else if (act.equals(Action.REMOVE))
}
// Remove viewers for this scoreboard
else if (act.equals(Action.REMOVE)) {
// Take this player out of the map of viewers
ScoreboardHelper.viewerMap.remove(viewer.getName());

// Make the player view a blank scoreboard if he/she
// is online (in lieu of a scoreboard-removing method
// provided by Bukkit)
if (viewer.isOnline())
viewer.getPlayerEntity().setScoreboard(ScoreboardHelper.createScoreboard());
}
}
Expand Down
Expand Up @@ -36,6 +36,7 @@
import net.aufdemrand.denizen.tags.TagManager;
import net.aufdemrand.denizen.utilities.Conversion;
import net.aufdemrand.denizen.utilities.DenizenAPI;
import net.aufdemrand.denizen.utilities.ScoreboardHelper;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.aufdemrand.denizen.utilities.entity.Position;

Expand Down Expand Up @@ -3528,18 +3529,26 @@ public void playerItemConsume(PlayerItemConsumeEvent event) {
@EventHandler
public void playerJoinEvent(PlayerJoinEvent event) {

Player player = event.getPlayer();
Map<String, dObject> context = new HashMap<String, dObject>();
context.put("message", new Element(event.getJoinMessage()));

String determination = doEvents(Arrays.asList
("player joins",
"player join"),
null, event.getPlayer(), context);
null, player, context);

// Handle message
if (!determination.equals("none")) {
event.setJoinMessage(determination);
}

// As a tie-in with ScoreboardHelper, make this player view
// the scoreboard he/she is supposed to view
if (ScoreboardHelper.viewerMap.containsKey(player.getName())) {
player.setScoreboard(ScoreboardHelper
.getScoreboard(ScoreboardHelper.viewerMap.get(player.getName())));
}
}

// <--[event]
Expand Down
Expand Up @@ -11,7 +11,6 @@
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Score;
Expand All @@ -27,20 +26,35 @@
public class ScoreboardHelper {

public static ScoreboardManager manager = Bukkit.getScoreboardManager();
public static Map<String, Scoreboard> scoreboards = new HashMap<String, Scoreboard>();

// A map with scoreboard IDs as keys and scoreboards as values
public static Map<String, Scoreboard> scoreboardMap = new HashMap<String, Scoreboard>();
// A map with viewer names as keys and scoreboard IDs as values
public static Map<String, String> viewerMap = new HashMap<String, String>();

/*
* Called on server startup or /denizen reload saves
*/
public static void _recallScoreboards() {

// Clear every existing ingame scoreboard
for (Map.Entry<String, Scoreboard> entry : scoreboards.entrySet()) {
for (Map.Entry<String, Scoreboard> entry : scoreboardMap.entrySet()) {
clearScoreboard(entry.getValue());
}

// Delete the contents of the scoreboards map
scoreboards.clear();
Scoreboard emptyBoard = createScoreboard();

// Clear every viewer's set scoreboard
for (Map.Entry<String, String> entry : viewerMap.entrySet()) {
OfflinePlayer player = Bukkit.getOfflinePlayer(entry.getKey());
if (player.isOnline()) {
player.getPlayer().setScoreboard(emptyBoard);
}
}

// Delete the contents of the scoreboardMap and viewerMap
scoreboardMap.clear();
viewerMap.clear();

ConfigurationSection rootSection = DenizenAPI.getCurrentInstance()
.getScoreboards().getConfigurationSection("Scoreboards");
Expand All @@ -56,13 +70,14 @@ public static void _recallScoreboards() {
board = createScoreboard(id);

// Get the list of viewers
List<String> viewers = rootSection.getStringList(id + ".Viewers");
List<String> viewerList = rootSection.getStringList(id + ".Viewers");

// Iterate through viewers and make them see this scoreboard
// if they are online
for (String viewer : viewers) {
// Iterate through viewers, store them in the viewerMap,
// and make them see this scoreboard if they are online
for (String viewer : viewerList) {
if (dPlayer.matches(viewer)) {
dPlayer player = dPlayer.valueOf(viewer);
viewerMap.put(player.getName(), id);

if (player.isOnline())
player.getPlayerEntity().setScoreboard(board);
Expand Down Expand Up @@ -121,26 +136,25 @@ public static void _saveScoreboards() {
.set("Scoreboards", null);

// Iterate through scoreboards map
for (Map.Entry<String, Scoreboard> entry : scoreboards.entrySet()) {
for (Map.Entry<String, Scoreboard> scoreboardEntry : scoreboardMap.entrySet()) {

String id = entry.getKey();
List<String> viewers = new ArrayList<String>();
String id = scoreboardEntry.getKey();
List<String> viewerList = new ArrayList<String>();

// There is no method to get the viewers of a scoreboard,
// so iterate through all of the players and check if
// they can see this scoreboard
for (Player player : Bukkit.getOnlinePlayers()) {
if (player.getScoreboard() == entry.getValue()) {
viewers.add(player.getName());
// Find all of the viewers that are viewing this scoreboard
// and put them on a list
for (Map.Entry<String, String> viewerEntry : viewerMap.entrySet()) {
if (id.equalsIgnoreCase(viewerEntry.getValue())) {
viewerList.add(viewerEntry.getKey());
}
}

// Save viewer list
DenizenAPI.getCurrentInstance().getScoreboards()
.set("Scoreboards." + id + ".Viewers", viewers);
.set("Scoreboards." + id + ".Viewers", viewerList);

// Iterate through objectives
for (Objective obj : entry.getValue().getObjectives()) {
for (Objective obj : scoreboardEntry.getValue().getObjectives()) {
String objPath = "Scoreboards." + id + ".Objectives."
+ obj.getName();

Expand All @@ -163,7 +177,7 @@ public static void _saveScoreboards() {
// scores, so iterate through all of the scoreboard's
// players, check if they have a score for this
// objective, and save it if they do
for (OfflinePlayer player : entry.getValue().getPlayers()) {
for (OfflinePlayer player : scoreboardEntry.getValue().getPlayers()) {

int score = obj.getScore(player).getScore();

Expand Down Expand Up @@ -280,7 +294,7 @@ public static Scoreboard createScoreboard() {
*/
public static Scoreboard createScoreboard(String id) {
Scoreboard board = manager.getNewScoreboard();
scoreboards.put(id.toUpperCase(), board);
scoreboardMap.put(id.toUpperCase(), board);
return board;
}

Expand All @@ -297,7 +311,7 @@ public static void deleteScoreboard(String id) {
clearScoreboard(getMain());
else {
clearScoreboard(getScoreboard(id));
scoreboards.remove(id.toUpperCase());
scoreboardMap.remove(id.toUpperCase());
}
}

Expand All @@ -321,7 +335,7 @@ public static Scoreboard getMain() {
*
*/
public static Scoreboard getScoreboard(String id) {
return scoreboards.get(id.toUpperCase());
return scoreboardMap.get(id.toUpperCase());
}

/**
Expand All @@ -333,7 +347,7 @@ public static Scoreboard getScoreboard(String id) {
*
*/
public static boolean hasScoreboard(String id) {
if (scoreboards.containsKey(id.toUpperCase())) return true;
if (scoreboardMap.containsKey(id.toUpperCase())) return true;
else return false;
}

Expand All @@ -346,6 +360,6 @@ public static boolean hasScoreboard(String id) {
*
*/
public static void removePlayer(String id, OfflinePlayer player) {
scoreboards.get(id.toUpperCase()).resetScores(player);
scoreboardMap.get(id.toUpperCase()).resetScores(player);
}
}

0 comments on commit fc1b8e8

Please sign in to comment.