Add {world: worldName} placeholder.

This commit is contained in:
filoghost 2014-08-11 22:57:44 +02:00
parent 9ba424e749
commit 10bfead9e4
7 changed files with 83 additions and 6 deletions

View File

@ -1,6 +1,6 @@
name: HolographicDisplays name: HolographicDisplays
main: com.gmail.filoghost.holograms.HolographicDisplays main: com.gmail.filoghost.holograms.HolographicDisplays
version: 1.8.5 version: 1.8.6
softdepend: [Multiverse-Core, MultiWorld, My Worlds, My_Worlds, ProtocolLib] softdepend: [Multiverse-Core, MultiWorld, My Worlds, My_Worlds, ProtocolLib]

View File

@ -26,7 +26,8 @@ import com.gmail.filoghost.holograms.placeholders.AnimationManager;
import com.gmail.filoghost.holograms.placeholders.PlaceholderManager; import com.gmail.filoghost.holograms.placeholders.PlaceholderManager;
import com.gmail.filoghost.holograms.placeholders.StaticPlaceholders; import com.gmail.filoghost.holograms.placeholders.StaticPlaceholders;
import com.gmail.filoghost.holograms.protocol.ProtocolLibHook; import com.gmail.filoghost.holograms.protocol.ProtocolLibHook;
import com.gmail.filoghost.holograms.utils.BungeeCleanupTask; import com.gmail.filoghost.holograms.tasks.BungeeCleanupTask;
import com.gmail.filoghost.holograms.tasks.WorldPlayerCounterTask;
import com.gmail.filoghost.holograms.utils.StringUtils; import com.gmail.filoghost.holograms.utils.StringUtils;
import com.gmail.filoghost.holograms.utils.VersionUtils; import com.gmail.filoghost.holograms.utils.VersionUtils;
import com.gmail.filoghost.holograms.utils.ConfigNode; import com.gmail.filoghost.holograms.utils.ConfigNode;
@ -195,6 +196,7 @@ public class HolographicDisplays extends JavaPlugin {
ServerInfoTimer.setRefreshSeconds(Configuration.bungeeRefreshSeconds); ServerInfoTimer.setRefreshSeconds(Configuration.bungeeRefreshSeconds);
ServerInfoTimer.startTask(); ServerInfoTimer.startTask();
BungeeCleanupTask.start(); BungeeCleanupTask.start();
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new WorldPlayerCounterTask(), 3 * 20L, 3 * 20L);
Set<String> savedHolograms = HologramDatabase.getHolograms(); Set<String> savedHolograms = HologramDatabase.getHolograms();
if (savedHolograms != null && savedHolograms.size() > 0) { if (savedHolograms != null && savedHolograms.size() > 0) {

View File

@ -73,6 +73,7 @@ public class BungeeChannel implements PluginMessageListener {
out.writeUTF(server); out.writeUTF(server);
} catch (IOException e) { } catch (IOException e) {
// It should not happen. // It should not happen.
e.printStackTrace();
HolographicDisplays.getInstance().getLogger().warning("I/O Exception while asking for player count on server '" + server + "'."); HolographicDisplays.getInstance().getLogger().warning("I/O Exception while asking for player count on server '" + server + "'.");
} }

View File

@ -14,6 +14,7 @@ public class HologramLineData {
private String[] bungeeOnlinePlayers; private String[] bungeeOnlinePlayers;
private String[] bungeeStatuses; private String[] bungeeStatuses;
private String[] worldsPlayerCount;
public HologramLineData(HologramHorse horse, String originalName) { public HologramLineData(HologramHorse horse, String originalName) {
this.horse = horse; this.horse = horse;
@ -35,6 +36,11 @@ public class HologramLineData {
bungeeStatuses = list.toArray(bungeeStatuses); bungeeStatuses = list.toArray(bungeeStatuses);
} }
public void setWorldsCountToCheck(List<String> list) {
worldsPlayerCount = new String[list.size()];
worldsPlayerCount = list.toArray(worldsPlayerCount);
}
public HologramHorse getHorse() { public HologramHorse getHorse() {
return horse; return horse;
} }
@ -55,6 +61,10 @@ public class HologramLineData {
return bungeeStatuses != null; return bungeeStatuses != null;
} }
public boolean hasWorldsCountToCheck() {
return worldsPlayerCount != null;
}
/** /**
* Can be null. * Can be null.
*/ */
@ -75,4 +85,11 @@ public class HologramLineData {
public String[] getBungeeStatusesToCheck() { public String[] getBungeeStatusesToCheck() {
return bungeeStatuses; return bungeeStatuses;
} }
/**
* Can be null.
*/
public String[] getWorldsPlayersCountToCheck() {
return worldsPlayerCount;
}
} }

View File

@ -13,6 +13,7 @@ import com.gmail.filoghost.holograms.HolographicDisplays;
import com.gmail.filoghost.holograms.bungee.ServerInfoTimer; import com.gmail.filoghost.holograms.bungee.ServerInfoTimer;
import com.gmail.filoghost.holograms.nms.interfaces.HologramHorse; import com.gmail.filoghost.holograms.nms.interfaces.HologramHorse;
import com.gmail.filoghost.holograms.object.HologramLineData; import com.gmail.filoghost.holograms.object.HologramLineData;
import com.gmail.filoghost.holograms.tasks.WorldPlayerCounterTask;
public class PlaceholderManager { public class PlaceholderManager {
@ -23,6 +24,7 @@ public class PlaceholderManager {
private static final Pattern BUNGEE_ONLINE_PATTERN = Pattern.compile("(\\{online:)([^}]+)(\\})"); private static final Pattern BUNGEE_ONLINE_PATTERN = Pattern.compile("(\\{online:)([^}]+)(\\})");
private static final Pattern BUNGEE_STATUS_PATTERN = Pattern.compile("(\\{status:)([^}]+)(\\})"); private static final Pattern BUNGEE_STATUS_PATTERN = Pattern.compile("(\\{status:)([^}]+)(\\})");
private static final Pattern ANIMATION_PATTERN = Pattern.compile("(\\{animation:)([^}]+)(\\})"); private static final Pattern ANIMATION_PATTERN = Pattern.compile("(\\{animation:)([^}]+)(\\})");
private static final Pattern WORLD_PATTERN = Pattern.compile("(\\{world:)([^}]+)(\\})");
public PlaceholderManager() { public PlaceholderManager() {
horsesToRefresh = new ArrayList<HologramLineData>(); horsesToRefresh = new ArrayList<HologramLineData>();
@ -48,6 +50,7 @@ public class PlaceholderManager {
List<Placeholder> containedPlaceholders = null; List<Placeholder> containedPlaceholders = null;
List<String> bungeeServersOnlinePlayers = null; List<String> bungeeServersOnlinePlayers = null;
List<String> bungeeServersStatuses = null; List<String> bungeeServersStatuses = null;
List<String> worldsPlayerCount = null;
Matcher matcher; Matcher matcher;
for (Placeholder placeholder : PlaceholdersList.getDefaults()) { for (Placeholder placeholder : PlaceholdersList.getDefaults()) {
@ -68,6 +71,25 @@ public class PlaceholderManager {
} }
// Players in a world count pattern.
matcher = WORLD_PATTERN.matcher(customName);
while (matcher.find()) {
if (worldsPlayerCount == null) {
worldsPlayerCount = new ArrayList<String>();
}
String worldName = matcher.group(2).trim().toLowerCase();
// Shorter placeholder without spaces.
customName = customName.replace(matcher.group(), "{world:" + worldName + "}");
// Add it to tracked worlds.
worldsPlayerCount.add(worldName);
}
// BungeeCord online pattern. // BungeeCord online pattern.
matcher = BUNGEE_ONLINE_PATTERN.matcher(customName); matcher = BUNGEE_ONLINE_PATTERN.matcher(customName);
while (matcher.find()) { while (matcher.find()) {
@ -105,8 +127,6 @@ public class PlaceholderManager {
} }
// Animation pattern. // Animation pattern.
matcher = ANIMATION_PATTERN.matcher(customName); matcher = ANIMATION_PATTERN.matcher(customName);
boolean updateName = false; boolean updateName = false;
@ -132,7 +152,7 @@ public class PlaceholderManager {
} }
} }
if (containedPlaceholders != null || bungeeServersOnlinePlayers != null || bungeeServersStatuses != null) { if (containedPlaceholders != null || bungeeServersOnlinePlayers != null || bungeeServersStatuses != null || worldsPlayerCount != null) {
HologramLineData data = new HologramLineData(horse, customName); HologramLineData data = new HologramLineData(horse, customName);
if (containedPlaceholders != null) { if (containedPlaceholders != null) {
@ -147,6 +167,10 @@ public class PlaceholderManager {
data.setBungeeStatusesToCheck(bungeeServersStatuses); data.setBungeeStatusesToCheck(bungeeServersStatuses);
} }
if (worldsPlayerCount != null) {
data.setWorldsCountToCheck(worldsPlayerCount);
}
horsesToRefresh.add(data); horsesToRefresh.add(data);
updatePlaceholders(data); updatePlaceholders(data);
} else { } else {
@ -223,6 +247,12 @@ public class PlaceholderManager {
} }
} }
if (data.hasWorldsCountToCheck()) {
for (String world : data.getWorldsPlayersCountToCheck()) {
newCustomName = newCustomName.replace("{world:" + world + "}", WorldPlayerCounterTask.getCount(world));
}
}
// Update only if needed, don't send useless packets. // Update only if needed, don't send useless packets.
if (!oldCustomName.equals(newCustomName)) { if (!oldCustomName.equals(newCustomName)) {
data.getHorse().forceSetCustomName(newCustomName); data.getHorse().forceSetCustomName(newCustomName);

View File

@ -1,4 +1,4 @@
package com.gmail.filoghost.holograms.utils; package com.gmail.filoghost.holograms.tasks;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map.Entry; import java.util.Map.Entry;

View File

@ -0,0 +1,27 @@
package com.gmail.filoghost.holograms.tasks;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.World;
import com.google.common.collect.Maps;
public class WorldPlayerCounterTask implements Runnable {
private static Map<String, Integer> worlds = Maps.newHashMap();
@Override
public void run() {
worlds.clear();
for (World world : Bukkit.getWorlds()) {
worlds.put(world.getName().toLowerCase(), world.getPlayers().size());
}
}
public static String getCount(String world) {
Integer count = worlds.get(world);
return count != null ? count.toString() : "world not found";
}
}