diff --git a/MCGalaxy/Commands/Information/CmdWhois.cs b/MCGalaxy/Commands/Information/CmdWhois.cs
index ab9bc8c84..5b08dfd92 100644
--- a/MCGalaxy/Commands/Information/CmdWhois.cs
+++ b/MCGalaxy/Commands/Information/CmdWhois.cs
@@ -28,7 +28,7 @@ namespace MCGalaxy.Commands.Info {
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Banned; } }
public override CommandPerm[] ExtraPerms {
- get { return new[] { new CommandPerm(LevelPermission.AdvBuilder, "+ can see IPs and if a player is whitelisted") }; }
+ get { return new[] { new CommandPerm(LevelPermission.AdvBuilder, "+ can see player's IP and if on whitelist") }; }
}
public override CommandAlias[] Aliases {
get { return new[] { new CommandAlias("info"), new CommandAlias("i") }; }
@@ -37,81 +37,22 @@ namespace MCGalaxy.Commands.Info {
public override void Use(Player p, string message) {
if (message == "") message = p.name;
int matches;
- Player pl = PlayerInfo.FindMatches(p, message, out matches);
- PlayerData target = null;
+ Player who = PlayerInfo.FindMatches(p, message, out matches);
if (matches > 1) return;
- WhoInfo info;
- if (matches == 1) {
- info = FromOnline(pl);
- } else {
+ if (matches == 0) {
if (!Formatter.ValidName(p, message, "player")) return;
Player.Message(p, "Searching database for the player..");
- target = PlayerInfo.FindOfflineMatches(p, message);
+ PlayerData target = PlayerInfo.FindOfflineMatches(p, message);
if (target == null) return;
- info = FromOffline(target, message);
- }
- WhoInfo.Output(p, info, CheckExtraPerm(p));
-
- Player.Message(p, "-------------");
- if (pl != null) {
- foreach (OnlineStatPrinter printer in OnlineStat.Stats) {
- printer(p, pl);
- }
- } else {
+
foreach (OfflineStatPrinter printer in OfflineStat.Stats) {
printer(p, target);
}
- }
- }
-
- WhoInfo FromOnline(Player who) {
- WhoInfo info = new WhoInfo();
- string prefix = who.title == "" ? "" : who.color + "[" + who.titlecolor + who.title + who.color + "] ";
- info.FullName = prefix + who.ColoredName;
- info.Name = who.name;
- info.Group = who.group;
-
- info.RoundsTotal = who.Game.TotalRoundsSurvived;
- info.RoundsMax = who.Game.MaxRoundsSurvived;
- info.InfectedTotal = who.Game.TotalInfected;
- info.InfectedMax = who.Game.MaxInfected;
- return info;
- }
-
- WhoInfo FromOffline(PlayerData data, string message) {
- Group group = Group.findPlayerGroup(data.Name);
- string color = data.Color == "" ? group.color : data.Color;
- string prefix = data.Title == "" ? "" : color + "[" + data.TitleColor + data.Title + color + "] ";
-
- WhoInfo info = new WhoInfo();
- info.FullName = prefix + color + data.Name.RemoveLastPlus();
- info.Name = data.Name;
- info.Group = group;
-
- if (Server.zombie.Running) {
- ZombieStats stats = Server.zombie.LoadZombieStats(data.Name);
- info.RoundsTotal = stats.TotalRounds; info.InfectedTotal = stats.TotalInfected;
- info.RoundsMax = stats.MaxRounds; info.InfectedMax = stats.MaxInfected;
- }
- return info;
- }
-
- class WhoInfo {
- public string FullName, Name;
- public Group Group;
- public int RoundsTotal, RoundsMax;
- public int InfectedTotal, InfectedMax;
-
- public static void Output(Player p, WhoInfo who, bool canSeeIP) {
- Player.Message(p, who.FullName + " %S(" + who.Name + ") has:");
- Player.Message(p, " Rank of " + who.Group.ColoredName);
-
- if (!Server.zombie.Running) return;
- Player.Message(p, " Survived &a{0} %Srounds (max &e{1}%S)",
- who.RoundsTotal, who.RoundsMax);
- Player.Message(p, " Infected &a{0} %Splayers (max &e{1}%S)",
- who.InfectedTotal, who.InfectedMax);
+ } else {
+ foreach (OnlineStatPrinter printer in OnlineStat.Stats) {
+ printer(p, who);
+ }
}
}
diff --git a/MCGalaxy/Database/Stats/OfflineStat.cs b/MCGalaxy/Database/Stats/OfflineStat.cs
index 1daaa47f6..dcaf74074 100644
--- a/MCGalaxy/Database/Stats/OfflineStat.cs
+++ b/MCGalaxy/Database/Stats/OfflineStat.cs
@@ -27,17 +27,26 @@ namespace MCGalaxy.DB {
/// List of stats that can be output to /whois.
public static List Stats = new List() {
+ OfflineCoreLine,
(p, who) => OnlineStat.MiscLine(p, who.Name, who.Deaths, who.Money),
BlocksModifiedLine,
(p, who) => OnlineStat.BlockStatsLine(p, who.TotalPlaced, who.TotalDeleted, who.TotalDrawn),
TimeSpentLine,
LoginLine,
(p, who) => OnlineStat.LoginsLine(p, who.Logins, who.Kicks),
- (p, who) => OnlineStat.BanLine(p, who.Name, Group.findPlayerGroup(who.Name)),
+ (p, who) => OnlineStat.BanLine(p, who.Name),
(p, who) => OnlineStat.SpecialGroupLine(p, who.Name),
(p, who) => OnlineStat.IPLine(p, who.Name, who.IP),
};
+ static void OfflineCoreLine(Player p, PlayerData data) {
+ Group group = Group.findPlayerGroup(data.Name);
+ string color = data.Color == "" ? group.color : data.Color;
+ string prefix = data.Title == "" ? "" : color + "[" + data.TitleColor + data.Title + color + "] ";
+ string fullName = prefix + color + data.Name.RemoveLastPlus();
+ OnlineStat.CoreLine(p, fullName, data.Name, group);
+ }
+
static void BlocksModifiedLine(Player p, PlayerData who) {
Player.Message(p, " Modified &a{0} %Sblocks", who.TotalModified);
}
diff --git a/MCGalaxy/Database/Stats/OnlineStat.cs b/MCGalaxy/Database/Stats/OnlineStat.cs
index 1ce530235..3514aed93 100644
--- a/MCGalaxy/Database/Stats/OnlineStat.cs
+++ b/MCGalaxy/Database/Stats/OnlineStat.cs
@@ -29,18 +29,30 @@ namespace MCGalaxy.DB {
/// List of stats that can be output to /whois.
public static List Stats = new List() {
+ OnlineCoreLine,
(p, who) => MiscLine(p, who.name, who.overallDeath, who.money),
BlocksModifiedLine,
(p, who) => BlockStatsLine(p, who.TotalPlaced, who.TotalDeleted, who.TotalDrawn),
TimeSpentLine,
LoginLine,
(p, who) => LoginsLine(p, who.totalLogins, who.totalKicked),
- (p, who) => BanLine(p, who.name, who.group),
+ (p, who) => BanLine(p, who.name),
(p, who) => SpecialGroupLine(p, who.name),
(p, who) => IPLine(p, who.name, who.ip),
IdleLine,
};
+ static void OnlineCoreLine(Player p, Player who) {
+ string prefix = who.title == "" ? "" : who.color + "[" + who.titlecolor + who.title + who.color + "] ";
+ string fullName = prefix + who.ColoredName;
+ CoreLine(p, fullName, who.name, who.group);
+ }
+
+ internal static void CoreLine(Player p, string fullName, string name, Group grp) {
+ Player.Message(p, fullName + " %S(" + name + ") has:");
+ Player.Message(p, " Rank of " + grp.ColoredName);
+ }
+
internal static void MiscLine(Player p, string name, int deaths, int money) {
if (Economy.Enabled) {
Player.Message(p, " &a{0} &cdeaths%S, &a{2} %S{3}, {1} %Sawards",
@@ -75,8 +87,8 @@ namespace MCGalaxy.DB {
Player.Message(p, " Logged in &a{0} %Stimes, &c{1} %Sof which ended in a kick", logins, kicks);
}
- internal static void BanLine(Player p, string name, Group grp) {
- if (grp.Permission != LevelPermission.Banned) return;
+ internal static void BanLine(Player p, string name) {
+ if (!Group.BannedRank.playerList.Contains(name)) return;
string[] data = Ban.GetBanData(name);
if (data != null) {
diff --git a/MCGalaxy/Games/ZombieSurvival/ZombieGame.cs b/MCGalaxy/Games/ZombieSurvival/ZombieGame.cs
index b41e8bf6b..430e55b89 100644
--- a/MCGalaxy/Games/ZombieSurvival/ZombieGame.cs
+++ b/MCGalaxy/Games/ZombieSurvival/ZombieGame.cs
@@ -41,7 +41,7 @@ namespace MCGalaxy.Games {
RoundsDone = 0;
if (!SetStartLevel(level)) return;
- HookTopStats();
+ HookStats();
Thread t = new Thread(MainLoop);
t.Name = "MCG_ZombieGame";
t.Start();
@@ -209,7 +209,7 @@ namespace MCGalaxy.Games {
LastLevelName = "";
CurLevelName = "";
CurLevel = null;
- UnhookTopStats();
+ UnhookStats();
}
public BountyData FindBounty(string target) {
@@ -305,17 +305,24 @@ namespace MCGalaxy.Games {
}
TopStat statMostInfected, statMaxInfected, statMostSurvived, statMaxSurvived;
- void HookTopStats() {
+ OfflineStatPrinter offlineZSStats;
+ OnlineStatPrinter onlineZSStats;
+ void HookStats() {
if (TopStat.Stats.Contains(statMostInfected)) return; // don't duplicate
statMostInfected = new TopStat("Infected", "ZombieStats", "TotalInfected",
() => "Most players infected", TopStat.FormatInteger);
statMaxInfected = new TopStat("Survived", "ZombieStats", "TotalRounds",
- () => "Most rounds survived", TopStat.FormatInteger);
+ () => "Most rounds survived", TopStat.FormatInteger);
statMostSurvived = new TopStat("ConsecutiveInfected", "ZombieStats", "MaxInfected",
() => "Most consecutive infections", TopStat.FormatInteger);
statMaxSurvived = new TopStat("ConsecutiveSurvived", "ZombieStats", "MaxRounds",
- () => "Most consecutive rounds survived", TopStat.FormatInteger);
+ () => "Most consecutive rounds survived", TopStat.FormatInteger);
+
+ offlineZSStats = PrintOfflineZSStats;
+ onlineZSStats = PrintOnlineZSStats;
+ OfflineStat.Stats.Add(offlineZSStats);
+ OnlineStat.Stats.Add(onlineZSStats);
TopStat.Stats.Add(statMostInfected);
TopStat.Stats.Add(statMostSurvived);
@@ -323,12 +330,31 @@ namespace MCGalaxy.Games {
TopStat.Stats.Add(statMaxSurvived);
}
- void UnhookTopStats() {
+ void UnhookStats() {
+ OfflineStat.Stats.Remove(offlineZSStats);
+ OnlineStat.Stats.Remove(onlineZSStats);
+
TopStat.Stats.Remove(statMostInfected);
TopStat.Stats.Remove(statMostSurvived);
TopStat.Stats.Remove(statMaxInfected);
TopStat.Stats.Remove(statMaxSurvived);
}
+
+ static void PrintOnlineZSStats(Player p, Player who) {
+ PrintZSStats(p, who.Game.TotalRoundsSurvived, who.Game.TotalInfected,
+ who.Game.MaxRoundsSurvived, who.Game.MaxInfected);
+ }
+
+ static void PrintOfflineZSStats(Player p, PlayerData who) {
+ ZombieStats stats = Server.zombie.LoadZombieStats(who.Name);
+ PrintZSStats(p, stats.TotalRounds, stats.TotalInfected,
+ stats.MaxRounds, stats.MaxInfected);
+ }
+
+ static void PrintZSStats(Player p, int rounds, int infected, int roundsMax, int infectedMax) {
+ Player.Message(p, " Survived &a{0} %Srounds (max &e{1}%S)", rounds, roundsMax);
+ Player.Message(p, " Infected &a{0} %Splayers (max &e{1}%S)", infected, infectedMax);
+ }
#endregion
}
}