public static void LoadMapSettings(S server, Session.Global gs, Ruleset rules) { lock (server.LobbyInfo) { var options = rules.Actors["player"].TraitInfos <ILobbyOptions>() .Concat(rules.Actors["world"].TraitInfos <ILobbyOptions>()) .SelectMany(t => t.LobbyOptions(rules)); foreach (var o in options) { var value = o.DefaultValue; var preferredValue = o.DefaultValue; if (gs.LobbyOptions.TryGetValue(o.Id, out var state)) { // Propagate old state on map change if (!o.IsLocked) { if (o.Values.Keys.Contains(state.PreferredValue)) { value = state.PreferredValue; } else if (o.Values.Keys.Contains(state.Value)) { value = state.Value; } } preferredValue = state.PreferredValue; } else { state = new Session.LobbyOptionState(); } state.IsLocked = o.IsLocked; state.Value = value; state.PreferredValue = preferredValue; gs.LobbyOptions[o.Id] = state; if (o.Id == "gamespeed") { var speed = server.ModData.Manifest.Get <GameSpeeds>().Speeds[value]; gs.Timestep = speed.Timestep; gs.OrderLatency = speed.OrderLatency; } } } }
public static void LoadMapSettings(S server, Session.Global gs, MapPreview map) { lock (server.LobbyInfo) { var options = map.PlayerActorInfo.TraitInfos <ILobbyOptions>() .Concat(map.WorldActorInfo.TraitInfos <ILobbyOptions>()) .SelectMany(t => t.LobbyOptions(map)); foreach (var o in options) { var value = o.DefaultValue; var preferredValue = o.DefaultValue; if (gs.LobbyOptions.TryGetValue(o.Id, out var state)) { // Propagate old state on map change if (!o.IsLocked) { if (o.Values.Keys.Contains(state.PreferredValue)) { value = state.PreferredValue; } else if (o.Values.Keys.Contains(state.Value)) { value = state.Value; } } preferredValue = state.PreferredValue; } else { state = new Session.LobbyOptionState(); } state.IsLocked = o.IsLocked; state.Value = value; state.PreferredValue = preferredValue; gs.LobbyOptions[o.Id] = state; } } }