From b05a20981c22e1db5ecd9b74b4262813c15b9d99 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 27 Jun 2017 22:17:06 +1000 Subject: [PATCH] Now /mi has pretty much some behaviour, regardless of whether map is loaded or not. --- MCGalaxy/Commands/Information/CmdMapInfo.cs | 170 ++++++-------------- MCGalaxy/Levels/AccessController.cs | 20 +-- MCGalaxy/Levels/Level.Fields.cs | 1 + MCGalaxy/Levels/Level.cs | 4 +- 4 files changed, 61 insertions(+), 134 deletions(-) diff --git a/MCGalaxy/Commands/Information/CmdMapInfo.cs b/MCGalaxy/Commands/Information/CmdMapInfo.cs index f29604992..235a7b530 100644 --- a/MCGalaxy/Commands/Information/CmdMapInfo.cs +++ b/MCGalaxy/Commands/Information/CmdMapInfo.cs @@ -25,7 +25,7 @@ using MCGalaxy.Levels.IO; using MCGalaxy.Maths; namespace MCGalaxy.Commands.Info { - public sealed class CmdMapInfo : Command { + public sealed class CmdMapInfo : Command { public override string name { get { return "mapinfo"; } } public override string shortcut { get { return "mi"; } } public override string type { get { return CommandTypes.Information; } } @@ -102,17 +102,8 @@ namespace MCGalaxy.Commands.Info { } void ShowPermissions(Player p, MapInfoData data) { - List vWhitelist = data.VisitWhitelist, vBlacklist = data.VisitBlacklist; - List bWhitelist = data.BuildWhitelist, bBlacklist = data.BuildBlacklist; - GetBlacklistedPlayers(data.Name, vBlacklist); - - StringBuilder visitPerms = new StringBuilder(" Visitable by "); - PrintRanks(p, data.visit, data.visitmax, vWhitelist, vBlacklist, visitPerms); - Player.Message(p, visitPerms.ToString()); - - StringBuilder buildPerms = new StringBuilder(" Modifiable by "); - PrintRanks(p, data.build, data.buildmax, bWhitelist, bBlacklist, buildPerms); - Player.Message(p, buildPerms.ToString()); + PrintRanks(p, data.Visit, " Visitable by "); + PrintRanks(p, data.Build, " Modifiable by "); if (String.IsNullOrEmpty(data.RealmOwner)) data.RealmOwner = GetRealmMapOwner(data.Name); @@ -123,22 +114,25 @@ namespace MCGalaxy.Commands.Info { owners.Join(n => PlayerInfo.GetColoredName(p, n))); } - // Can't pass a LevelAccess instance here - static void PrintRanks(Player p, LevelPermission min, LevelPermission max, - List whitelist, List blacklist, StringBuilder builder) { - builder.Append(Group.GetColoredName(min) + "%S+"); - if (max != LevelPermission.Nobody) - builder.Append(" up to " + Group.GetColoredName(max)); - foreach (string name in whitelist) - builder.Append(", " + PlayerInfo.GetColoredName(p, name)); - - if (blacklist.Count == 0) return; + static void PrintRanks(Player p, LevelAccessController access, string initial) { + StringBuilder perms = new StringBuilder(initial); + perms.Append(Group.GetColoredName(access.Min) + "%S+"); + if (access.Max != LevelPermission.Nobody) + perms.Append(" up to " + Group.GetColoredName(access.Max)); - builder.Append( " %S(except "); + List whitelist = access.Whitelisted; + foreach (string name in whitelist) + perms.Append(", " + PlayerInfo.GetColoredName(p, name)); + + List blacklist = access.Blacklisted; + if (blacklist.Count == 0) { Player.Message(p, perms.ToString()); return; } + + perms.Append( " %S(except "); foreach (string name in blacklist) - builder.Append(PlayerInfo.GetColoredName(p, name) + ", "); - builder.Remove(builder.Length - 2, 2); - builder.Append("%S)"); + perms.Append(PlayerInfo.GetColoredName(p, name) + ", "); + perms.Remove(perms.Length - 2, 2); + perms.Append("%S)"); + Player.Message(p, perms.ToString()); } void ShowZombieSurvival(Player p, MapInfoData data) { @@ -169,17 +163,6 @@ namespace MCGalaxy.Commands.Info { return PlayerInfo.FindName(lvlName); } - void GetBlacklistedPlayers(string l, List blacklist) { - string path = "levels/blacklists/" + l + ".txt"; - if (!File.Exists(path)) return; - - string[] lines = File.ReadAllLines(path); - foreach (string line in lines) { - if (line.IndexOf(' ') < 0) continue; - blacklist.Add(line.SplitSpaces()[1]); - } - } - void ShowEnv(Player p, MapInfoData data) { if (data.TerrainUrl != "") Player.Message(p, "Texture: %b" + data.TerrainUrl); @@ -222,11 +205,7 @@ namespace MCGalaxy.Commands.Info { public bool ExpFog; // Permissions data - public LevelPermission visit, build, visitmax, buildmax; - public List VisitWhitelist = new List(); - public List VisitBlacklist = new List(); - public List BuildWhitelist = new List(); - public List BuildBlacklist = new List(); + public LevelAccessController Visit, Build; // Zombie data public string Authors; @@ -236,33 +215,10 @@ namespace MCGalaxy.Commands.Info { public void FromOnlineLevel(Level lvl) { Name = lvl.name; Width = lvl.Width; Height = lvl.Height; Length = lvl.Length; - Physics = lvl.physics; Guns = lvl.Config.Guns; BlockDB = lvl.Config.UseBlockDB; - RealmOwner = lvl.Config.RealmOwner; BlockDBEntries = lvl.BlockDB.TotalEntries(); + LoadConfig(lvl.Config); - visit = lvl.VisitAccess.Min; visitmax = lvl.VisitAccess.Max; - build = lvl.BuildAccess.Min; buildmax = lvl.BuildAccess.Max; - VisitWhitelist = new List(lvl.VisitAccess.Whitelisted); - VisitBlacklist = new List(lvl.VisitAccess.Blacklisted); - BuildWhitelist = new List(lvl.BuildAccess.Whitelisted); - BuildBlacklist = new List(lvl.BuildAccess.Blacklisted); - - Fog = lvl.Config.FogColor; Sky = lvl.Config.SkyColor; Clouds = lvl.Config.CloudColor; - Light = lvl.Config.LightColor; Shadow = lvl.Config.ShadowColor; - EdgeLevel = lvl.Config.EdgeLevel; SidesOffset = lvl.Config.SidesOffset; CloudsHeight = lvl.Config.CloudsHeight; - MaxFog = lvl.Config.MaxFogDistance; ExpFog = lvl.Config.ExpFog; - CloudsSpeed = lvl.Config.CloudsSpeed; WeatherSpeed = lvl.Config.WeatherSpeed; - EdgeBlock = (byte)lvl.Config.EdgeBlock; HorizonBlock = (byte)lvl.Config.HorizonBlock; - WeatherFade = lvl.Config.WeatherFade; - - TerrainUrl = lvl.Config.Terrain != "" ? - lvl.Config.Terrain : ServerConfig.DefaultTerrain; - TextureUrl = lvl.Config.TexturePack != "" ? - lvl.Config.TexturePack : ServerConfig.DefaultTexture; - - Authors = lvl.Config.Authors; - TotalRounds = lvl.Config.RoundsPlayed; HumanRounds = lvl.Config.RoundsHumanWon; - Likes = lvl.Config.Likes; Dislikes = lvl.Config.Dislikes; + Visit = lvl.VisitAccess; Build = lvl.BuildAccess; } public void FromOfflineLevel(string name) { @@ -275,64 +231,32 @@ namespace MCGalaxy.Commands.Info { BlockDBEntries = BlockDBFile.CountEntries(name); path = LevelInfo.FindPropertiesFile(name); - if (path != null) - PropertiesFile.Read(path, ParseProperty, '='); - if (Authors == null) Authors = ""; - if (SidesOffset == int.MinValue) SidesOffset = EdgeLevel - 2; + LevelConfig cfg = new LevelConfig(); + LevelConfig.Load(path, cfg); + LoadConfig(cfg); + + Visit = new LevelAccessController(null, cfg, true); + Build = new LevelAccessController(null, cfg, false); } - void ParseProperty(string key, string value) { - switch (key.ToLower()) { - case "physics": Physics = int.Parse(value); break; - case "guns": Guns = bool.Parse(value); break; - case "useblockdb": BlockDB = bool.Parse(value); break; - case "realmowner": RealmOwner = value; break; - - case "perbuild": build = GetPerm(value); break; - case "pervisit": visit = GetPerm(value); break; - case "perbuildmax": buildmax = GetPerm(value); break; - case "pervisitmax": visitmax = GetPerm(value); break; - case "visitwhitelist": VisitWhitelist = Parse(value); break; - case "visitblacklist": VisitBlacklist = Parse(value); break; - case "buildwhitelist": BuildWhitelist = Parse(value); break; - case "buildblacklist": BuildBlacklist = Parse(value); break; - - case "authors": Authors = value; break; - case "roundsplayed": TotalRounds = int.Parse(value); break; - case "roundshumanwon": HumanRounds = int.Parse(value); break; - case "likes": Likes = int.Parse(value); break; - case "dislikes": Dislikes = int.Parse(value); break; - - case "cloudcolor": Clouds = value; break; - case "fogcolor": Fog = value; break; - case "skycolor": Sky = value; break; - case "shadowcolor": Shadow = value; break; - case "lightcolor": Light = value; break; - - case "edgeblock": EdgeBlock = byte.Parse(value); break; - case "edgelevel": EdgeLevel = short.Parse(value); break; - case "sidesoffset": SidesOffset = short.Parse(value); break; - case "horizonblock": HorizonBlock = byte.Parse(value); break; - case "cloudsheight": CloudsHeight = short.Parse(value); break; - case "maxfog": MaxFog = short.Parse(value); break; - case "expfog": ExpFog = bool.Parse(value); break; - - case "texture": TerrainUrl = value; break; - case "texturepack": TextureUrl = value; break; - case "clouds-speed": CloudsSpeed = int.Parse(value); break; - case "weather-speed": WeatherSpeed = int.Parse(value); break; - case "weather-fade": WeatherFade = int.Parse(value); break; - } - } - - static List Parse(string value) { - if (value == "") return new List(); - return new List(value.Split(',')); - } - - static LevelPermission GetPerm(string value) { - LevelPermission perm = Group.ParsePermOrName(value); - return perm != LevelPermission.Null ? perm : LevelPermission.Guest; + void LoadConfig(LevelConfig cfg) { + Physics = cfg.Physics; Guns = cfg.Guns; BlockDB = cfg.UseBlockDB; + RealmOwner = cfg.RealmOwner; + + Fog = cfg.FogColor; Sky = cfg.SkyColor; Clouds = cfg.CloudColor; + Light = cfg.LightColor; Shadow = cfg.ShadowColor; + EdgeLevel = cfg.EdgeLevel; SidesOffset = cfg.SidesOffset; CloudsHeight = cfg.CloudsHeight; + MaxFog = cfg.MaxFogDistance; ExpFog = cfg.ExpFog; + CloudsSpeed = cfg.CloudsSpeed; WeatherSpeed = cfg.WeatherSpeed; + EdgeBlock = (byte)cfg.EdgeBlock; HorizonBlock = (byte)cfg.HorizonBlock; + WeatherFade = cfg.WeatherFade; + + TerrainUrl = cfg.Terrain != "" ? cfg.Terrain : ServerConfig.DefaultTerrain; + TextureUrl = cfg.TexturePack != "" ? cfg.TexturePack : ServerConfig.DefaultTexture; + + Authors = cfg.Authors; + TotalRounds = cfg.RoundsPlayed; HumanRounds = cfg.RoundsHumanWon; + Likes = cfg.Likes; Dislikes = cfg.Dislikes; } } diff --git a/MCGalaxy/Levels/AccessController.cs b/MCGalaxy/Levels/AccessController.cs index a1e4477bc..5e798a225 100644 --- a/MCGalaxy/Levels/AccessController.cs +++ b/MCGalaxy/Levels/AccessController.cs @@ -182,38 +182,40 @@ namespace MCGalaxy { /// visit (true) or build (false) permission for the level. public readonly bool IsVisit; readonly Level lvl; + readonly LevelConfig cfg; - public LevelAccessController(Level lvl, bool isVisit) { + public LevelAccessController(Level lvl, LevelConfig cfg, bool isVisit) { this.lvl = lvl; + this.cfg = cfg; IsVisit = isVisit; } /// Lowest allowed rank. public override LevelPermission Min { - get { return IsVisit ? lvl.Config.VisitMin : lvl.Config.BuildMin; } + get { return IsVisit ? cfg.VisitMin : cfg.BuildMin; } set { - if (IsVisit) lvl.Config.VisitMin = value; - else lvl.Config.BuildMin = value; + if (IsVisit) cfg.VisitMin = value; + else cfg.BuildMin = value; } } /// Highest allowed rank. public override LevelPermission Max { - get { return IsVisit ? lvl.Config.VisitMax : lvl.Config.BuildMax; } + get { return IsVisit ? cfg.VisitMax : cfg.BuildMax; } set { - if (IsVisit) lvl.Config.VisitMax = value; - else lvl.Config.BuildMax = value; + if (IsVisit) cfg.VisitMax = value; + else cfg.BuildMax = value; } } /// List of always allowed players, overrides rank allowances. public override List Whitelisted { - get { return IsVisit ? lvl.Config.VisitWhitelist : lvl.Config.BuildWhitelist; } + get { return IsVisit ? cfg.VisitWhitelist : cfg.BuildWhitelist; } } /// List of never allowed players, ignores rank allowances. public override List Blacklisted { - get { return IsVisit ? lvl.Config.VisitBlacklist : lvl.Config.BuildBlacklist; } + get { return IsVisit ? cfg.VisitBlacklist : cfg.BuildBlacklist; } } protected override string ColoredName { get { return lvl.ColoredName; } } diff --git a/MCGalaxy/Levels/Level.Fields.cs b/MCGalaxy/Levels/Level.Fields.cs index 447986c09..60ec60ec2 100644 --- a/MCGalaxy/Levels/Level.Fields.cs +++ b/MCGalaxy/Levels/Level.Fields.cs @@ -99,6 +99,7 @@ namespace MCGalaxy { set { if (value > 0 && Physicsint == 0) StartPhysics(); Physicsint = value; + Config.Physics = value; } } int Physicsint; diff --git a/MCGalaxy/Levels/Level.cs b/MCGalaxy/Levels/Level.cs index 0b7c9669b..442fb7843 100644 --- a/MCGalaxy/Levels/Level.cs +++ b/MCGalaxy/Levels/Level.cs @@ -79,8 +79,8 @@ namespace MCGalaxy { rotx = 0; roty = 0; ZoneList = new List(); - VisitAccess = new LevelAccessController(this, true); - BuildAccess = new LevelAccessController(this, false); + VisitAccess = new LevelAccessController(this, Config, true); + BuildAccess = new LevelAccessController(this, Config, false); listCheckExists = new SparseBitSet(Width, Height, Length); listUpdateExists = new SparseBitSet(Width, Height, Length); }