예제 #1
0
 public static Dictionary<CPos, SpawnOccupant> GetSpawnOccupants(IEnumerable<GameInformation.Player> players, MapPreview preview)
 {
     var spawns = preview.SpawnPoints;
     return players
             .Where(c => (c.SpawnPoint - 1 >= 0) && (c.SpawnPoint - 1 < spawns.Length))
             .ToDictionary(c => spawns[c.SpawnPoint - 1], c => new SpawnOccupant(c));
 }
예제 #2
0
 public static Dictionary<CPos, SpawnOccupant> GetSpawnOccupants(Session lobbyInfo, MapPreview preview)
 {
     var spawns = preview.SpawnPoints;
     return lobbyInfo.Clients
         .Where(c => (c.SpawnPoint - 1 >= 0) && (c.SpawnPoint - 1 < spawns.Length))
         .ToDictionary(c => spawns[c.SpawnPoint - 1], c => new SpawnOccupant(c));
 }
예제 #3
0
		void SelectMap(Map map)
		{
			selectedMapPreview = Game.modData.MapCache[map.Uid];

			var text = map.Description != null ? map.Description.Replace("\\n", "\n") : "";
			text = WidgetUtils.WrapText(text, description.Bounds.Width, descriptionFont);
			description.Text = text;
			description.Bounds.Height = descriptionFont.Measure(text).Y;
			descriptionPanel.ScrollToTop();
			descriptionPanel.Layout.AdjustChildren();
		}
예제 #4
0
        public ServerCreationLogic(Widget widget, Action onExit, Action openLobby)
        {
            panel = widget;
            onCreate = openLobby;
            this.onExit = onExit;

            var settings = Game.Settings;
            preview = Game.ModData.MapCache[WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map)];

            panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); };
            panel.Get<ButtonWidget>("CREATE_BUTTON").OnClick = CreateAndJoin;

            var mapButton = panel.GetOrNull<ButtonWidget>("MAP_BUTTON");
            if (mapButton != null)
            {
                panel.Get<ButtonWidget>("MAP_BUTTON").OnClick = () =>
                {
                    Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs()
                    {
                        { "initialMap", preview.Uid },
                        { "initialTab", MapClassification.System },
                        { "onExit", () => { } },
                        { "onSelect", (Action<string>)(uid => preview = Game.ModData.MapCache[uid]) },
                        { "filter", MapVisibility.Lobby },
                        { "onStart", () => { } }
                    });
                };

                panel.Get<MapPreviewWidget>("MAP_PREVIEW").Preview = () => preview;
                panel.Get<LabelWidget>("MAP_NAME").GetText = () => preview.Title;
            }

            panel.Get<TextFieldWidget>("SERVER_NAME").Text = settings.Server.Name ?? "";
            panel.Get<TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString();
            advertiseOnline = Game.Settings.Server.AdvertiseOnline;

            var externalPort = panel.Get<TextFieldWidget>("EXTERNAL_PORT");
            externalPort.Text = settings.Server.ExternalPort.ToString();
            externalPort.IsDisabled = () => !advertiseOnline;

            var advertiseCheckbox = panel.Get<CheckboxWidget>("ADVERTISE_CHECKBOX");
            advertiseCheckbox.IsChecked = () => advertiseOnline;
            advertiseCheckbox.OnClick = () => advertiseOnline ^= true;

            allowPortForward = Game.Settings.Server.AllowPortForward;
            var checkboxUPnP = panel.Get<CheckboxWidget>("UPNP_CHECKBOX");
            checkboxUPnP.IsChecked = () => allowPortForward;
            checkboxUPnP.OnClick = () => allowPortForward ^= true;
            checkboxUPnP.IsDisabled = () => !Game.Settings.Server.NatDeviceAvailable;

            var passwordField = panel.GetOrNull<PasswordFieldWidget>("PASSWORD");
            if (passwordField != null)
                passwordField.Text = Game.Settings.Server.Password;
        }
예제 #5
0
        public static Dictionary <CPos, SpawnOccupant> GetSpawnOccupants(IEnumerable <GameInformation.Player> players, MapPreview preview)
        {
            var spawns = preview.SpawnPoints;

            return(players
                   .Where(c => c.SpawnPoint != 0)
                   .ToDictionary(c => spawns[c.SpawnPoint - 1], c => new SpawnOccupant(c)));
        }
예제 #6
0
        public static void SetupEditableReadyWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map)
        {
            var status = parent.Get <CheckboxWidget>("STATUS_CHECKBOX");

            status.IsChecked  = () => orderManager.LocalClient.IsReady || c.Bot != null;
            status.IsVisible  = () => true;
            status.IsDisabled = () => c.Bot != null || map.Status != MapStatus.Available || map.RuleStatus != MapRuleStatus.Cached;

            var state = orderManager.LocalClient.IsReady ? Session.ClientState.NotReady : Session.ClientState.Ready;

            status.OnClick = () => orderManager.IssueOrder(Order.Command("state {0}".F(state)));
        }
예제 #7
0
        public static void SetupEditableTeamWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map)
        {
            var dropdown = parent.Get <DropDownButtonWidget>("TEAM");

            dropdown.IsDisabled  = () => s.LockTeam || orderManager.LocalClient.IsReady;
            dropdown.OnMouseDown = _ => ShowTeamDropDown(dropdown, c, orderManager, map.PlayerCount);
            dropdown.GetText     = () => (c.Team == 0) ? "-" : c.Team.ToString();
        }
예제 #8
0
 void ICreatePlayersInfo.CreateServerPlayers(MapPreview map, Session lobbyInfo, List <GameInformation.Player> players, MersenneTwister playerRandom)
 {
     throw new NotImplementedException("EditorActorLayer must not be defined on the world actor");
 }
예제 #9
0
        void SelectMap(Map map)
        {
            StopVideo();

            selectedMapPreview = Game.modData.MapCache[map.Uid];

            // Cache the rules on a background thread to avoid jank
            new Thread(selectedMapPreview.CacheRules).Start();

            var video = selectedMapPreview.Map.PreviewVideo;
            var videoVisible = video != null;
            var videoDisabled = !(videoVisible && GlobalFileSystem.Exists(video));

            startVideoButton.IsVisible = () => videoVisible && !showVideoPlayer;
            startVideoButton.IsDisabled = () => videoDisabled;
            startVideoButton.OnClick = () =>
            {
                showVideoPlayer = true;
                videoPlayer.Load(video);
                videoPlayer.PlayThen(StopVideo);

                // Mute other distracting sounds
                cachedSoundVolume = Sound.SoundVolume;
                cachedMusicVolume = Sound.MusicVolume;
                Sound.SoundVolume = Sound.MusicVolume = 0;
            };

            var text = map.Description != null ? map.Description.Replace("\\n", "\n") : "";
            text = WidgetUtils.WrapText(text, description.Bounds.Width, descriptionFont);
            description.Text = text;
            description.Bounds.Height = descriptionFont.Measure(text).Y;
            descriptionPanel.ScrollToTop();
            descriptionPanel.Layout.AdjustChildren();
        }
예제 #10
0
 void LoadMapPreviewRules(MapPreview map)
 {
     // Force map rules to be loaded on this background thread
     new Task(map.PreloadRules).Start();
 }
예제 #11
0
 void SelectServer(GameServer server)
 {
     currentServer = server;
     currentMap = server != null ? modData.MapCache[server.Map] : null;
 }
예제 #12
0
        void SelectReplay(ReplayMetadata replay)
        {
            selectedReplay = replay;
            map            = selectedReplay != null ? selectedReplay.GameInfo.MapPreview : MapCache.UnknownMap;

            if (replay == null)
            {
                return;
            }

            try
            {
                if (map.Status != MapStatus.Available)
                {
                    if (map.Status == MapStatus.DownloadAvailable)
                    {
                        LoadMapPreviewRules(map);
                    }
                    else if (Game.Settings.Game.AllowDownloading)
                    {
                        modData.MapCache.QueryRemoteMapDetails(services.MapRepository, new[] { map.Uid }, LoadMapPreviewRules);
                    }
                }

                var players = replay.GameInfo.Players
                              .GroupBy(p => p.Team)
                              .OrderBy(g => g.Key);

                var teams   = new Dictionary <string, IEnumerable <GameInformation.Player> >();
                var noTeams = players.Count() == 1;
                foreach (var p in players)
                {
                    var label = noTeams ? "Players" : p.Key == 0 ? "No Team" : "Team {0}".F(p.Key);
                    teams.Add(label, p);
                }

                playerList.RemoveChildren();

                foreach (var kv in teams)
                {
                    var group = kv.Key;
                    if (group.Length > 0)
                    {
                        var header = ScrollItemWidget.Setup(playerHeader, () => true, () => { });
                        header.Get <LabelWidget>("LABEL").GetText = () => group;
                        playerList.AddChild(header);
                    }

                    foreach (var option in kv.Value)
                    {
                        var o = option;

                        var color = o.Color;

                        var item = ScrollItemWidget.Setup(playerTemplate, () => false, () => { });

                        var label = item.Get <LabelWidget>("LABEL");
                        var font  = Game.Renderer.Fonts[label.Font];
                        var name  = WidgetUtils.TruncateText(o.Name, label.Bounds.Width, font);
                        label.GetText  = () => name;
                        label.GetColor = () => color;

                        var flag = item.Get <ImageWidget>("FLAG");
                        flag.GetImageCollection = () => "flags";
                        var factionInfo = modData.DefaultRules.Actors["world"].TraitInfos <FactionInfo>();
                        flag.GetImageName = () => (factionInfo != null && factionInfo.Any(f => f.InternalName == o.FactionId)) ? o.FactionId : "Random";

                        playerList.AddChild(item);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Write("debug", "Exception while parsing replay: {0}", e);
                SelectReplay(null);
            }
        }
예제 #13
0
        public ReplayBrowserLogic(Widget widget, ModData modData, Action onExit, Action onStart)
        {
            map   = MapCache.UnknownMap;
            panel = widget;

            services              = modData.Manifest.Get <WebServices>();
            this.modData          = modData;
            this.onStart          = onStart;
            Game.BeforeGameStart += OnGameStart;

            playerList     = panel.Get <ScrollPanelWidget>("PLAYER_LIST");
            playerHeader   = playerList.Get <ScrollItemWidget>("HEADER");
            playerTemplate = playerList.Get <ScrollItemWidget>("TEMPLATE");
            playerList.RemoveChildren();

            panel.Get <ButtonWidget>("CANCEL_BUTTON").OnClick = () => { cancelLoadingReplays = true; Ui.CloseWindow(); onExit(); };

            replayList = panel.Get <ScrollPanelWidget>("REPLAY_LIST");
            var template = panel.Get <ScrollItemWidget>("REPLAY_TEMPLATE");

            var mod = modData.Manifest;
            var dir = Platform.ResolvePath(Platform.SupportDirPrefix, "Replays", mod.Id, mod.Metadata.Version);

            if (Directory.Exists(dir))
            {
                ThreadPool.QueueUserWorkItem(_ => LoadReplays(dir, template));
            }

            var watch = panel.Get <ButtonWidget>("WATCH_BUTTON");

            watch.IsDisabled = () => selectedReplay == null || map.Status != MapStatus.Available;
            watch.OnClick    = () => { WatchReplay(); };

            var mapPreviewRoot = panel.Get("MAP_PREVIEW_ROOT");

            mapPreviewRoot.IsVisible           = () => selectedReplay != null;
            panel.Get("REPLAY_INFO").IsVisible = () => selectedReplay != null;

            var spawnOccupants = new CachedTransform <ReplayMetadata, Dictionary <int, SpawnOccupant> >(r =>
            {
                // Avoid using .ToDictionary to improve robustness against replays defining duplicate spawn assignments
                var occupants = new Dictionary <int, SpawnOccupant>();
                foreach (var p in r.GameInfo.Players)
                {
                    if (p.SpawnPoint != 0)
                    {
                        occupants[p.SpawnPoint] = new SpawnOccupant(p);
                    }
                }

                return(occupants);
            });

            var noSpawns            = new HashSet <int>();
            var disabledSpawnPoints = new CachedTransform <ReplayMetadata, HashSet <int> >(r => r.GameInfo.DisabledSpawnPoints ?? noSpawns);

            Ui.LoadWidget("MAP_PREVIEW", mapPreviewRoot, new WidgetArgs
            {
                { "orderManager", null },
                { "getMap", (Func <MapPreview>)(() => map) },
                { "onMouseDown", (Action <MapPreviewWidget, MapPreview, MouseInput>)((preview, mapPreview, mi) => { }) },
                { "getSpawnOccupants", (Func <Dictionary <int, SpawnOccupant> >)(() => spawnOccupants.Update(selectedReplay)) },
                { "getDisabledSpawnPoints", (Func <HashSet <int> >)(() => disabledSpawnPoints.Update(selectedReplay)) },
                { "showUnoccupiedSpawnpoints", false },
            });

            var replayDuration = new CachedTransform <ReplayMetadata, string>(r =>
                                                                              "Duration: {0}".F(WidgetUtils.FormatTimeSeconds((int)selectedReplay.GameInfo.Duration.TotalSeconds)));

            panel.Get <LabelWidget>("DURATION").GetText = () => replayDuration.Update(selectedReplay);

            SetupFilters();
            SetupManagement();
        }
예제 #14
0
 void ILintServerMapPass.Run(Action <string> emitError, Action <string> emitWarning, ModData modData, MapPreview map, Ruleset mapRules)
 {
     Run(emitError, emitWarning, map.Players, map.Visibility, map.WorldActorInfo, map.SpawnPoints);
 }
예제 #15
0
 void SelectServer(GameServer server)
 {
     currentServer = server;
     currentMap    = server != null ? modData.MapCache[server.Map] : null;
 }
예제 #16
0
        public ServerCreationLogic(Widget widget, ModData modData, Action onExit, Action openLobby)
        {
            panel       = widget;
            onCreate    = openLobby;
            this.onExit = onExit;

            var settings = Game.Settings;

            preview = modData.MapCache[modData.MapCache.ChooseInitialMap(Game.Settings.Server.Map, Game.CosmeticRandom)];

            panel.Get <ButtonWidget>("BACK_BUTTON").OnClick   = () => { Ui.CloseWindow(); onExit(); };
            panel.Get <ButtonWidget>("CREATE_BUTTON").OnClick = CreateAndJoin;

            var mapButton = panel.GetOrNull <ButtonWidget>("MAP_BUTTON");

            if (mapButton != null)
            {
                panel.Get <ButtonWidget>("MAP_BUTTON").OnClick = () =>
                {
                    Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs()
                    {
                        { "initialMap", preview.Uid },
                        { "initialTab", MapClassification.System },
                        { "onExit", () => { } },
                        { "onSelect", (Action <string>)(uid => preview = modData.MapCache[uid]) },
                        { "filter", MapVisibility.Lobby },
                        { "onStart", () => { } }
                    });
                };

                panel.Get <MapPreviewWidget>("MAP_PREVIEW").Preview = () => preview;

                var titleLabel = panel.GetOrNull <LabelWithTooltipWidget>("MAP_TITLE");
                if (titleLabel != null)
                {
                    var font  = Game.Renderer.Fonts[titleLabel.Font];
                    var title = new CachedTransform <MapPreview, string>(m =>
                    {
                        var truncated = WidgetUtils.TruncateText(m.Title, titleLabel.Bounds.Width, font);

                        if (m.Title != truncated)
                        {
                            titleLabel.GetTooltipText = () => m.Title;
                        }
                        else
                        {
                            titleLabel.GetTooltipText = null;
                        }

                        return(truncated);
                    });
                    titleLabel.GetText = () => title.Update(preview);
                }

                var typeLabel = panel.GetOrNull <LabelWidget>("MAP_TYPE");
                if (typeLabel != null)
                {
                    var type = new CachedTransform <MapPreview, string>(m => m.Categories.FirstOrDefault() ?? "");
                    typeLabel.GetText = () => type.Update(preview);
                }

                var authorLabel = panel.GetOrNull <LabelWidget>("MAP_AUTHOR");
                if (authorLabel != null)
                {
                    var font   = Game.Renderer.Fonts[authorLabel.Font];
                    var author = new CachedTransform <MapPreview, string>(
                        m => WidgetUtils.TruncateText($"Created by {m.Author}", authorLabel.Bounds.Width, font));
                    authorLabel.GetText = () => author.Update(preview);
                }
            }

            var serverName = panel.Get <TextFieldWidget>("SERVER_NAME");

            serverName.Text        = Game.Settings.SanitizedServerName(settings.Server.Name);
            serverName.OnEnterKey  = _ => { serverName.YieldKeyboardFocus(); return(true); };
            serverName.OnLoseFocus = () =>
            {
                serverName.Text      = Game.Settings.SanitizedServerName(serverName.Text);
                settings.Server.Name = serverName.Text;
            };

            panel.Get <TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString();

            advertiseOnline = Game.Settings.Server.AdvertiseOnline;

            var advertiseCheckbox = panel.Get <CheckboxWidget>("ADVERTISE_CHECKBOX");

            advertiseCheckbox.IsChecked = () => advertiseOnline;
            advertiseCheckbox.OnClick   = () =>
            {
                advertiseOnline ^= true;
                BuildNotices();
            };

            var passwordField = panel.GetOrNull <PasswordFieldWidget>("PASSWORD");

            if (passwordField != null)
            {
                passwordField.Text = Game.Settings.Server.Password;
            }

            noticesLabelA = panel.GetOrNull <LabelWidget>("NOTICES_HEADER_A");
            noticesLabelB = panel.GetOrNull <LabelWidget>("NOTICES_HEADER_B");
            noticesLabelC = panel.GetOrNull <LabelWidget>("NOTICES_HEADER_C");

            var noticesNoUPnP = panel.GetOrNull("NOTICES_NO_UPNP");

            if (noticesNoUPnP != null)
            {
                noticesNoUPnP.IsVisible = () => advertiseOnline &&
                                          (Nat.Status == NatStatus.NotSupported || Nat.Status == NatStatus.Disabled);

                var settingsA = noticesNoUPnP.GetOrNull("SETTINGS_A");
                if (settingsA != null)
                {
                    settingsA.IsVisible = () => Nat.Status == NatStatus.Disabled;
                }

                var settingsB = noticesNoUPnP.GetOrNull("SETTINGS_B");
                if (settingsB != null)
                {
                    settingsB.IsVisible = () => Nat.Status == NatStatus.Disabled;
                }
            }

            var noticesUPnP = panel.GetOrNull("NOTICES_UPNP");

            if (noticesUPnP != null)
            {
                noticesUPnP.IsVisible = () => advertiseOnline && Nat.Status == NatStatus.Enabled;
            }

            var noticesLAN = panel.GetOrNull("NOTICES_LAN");

            if (noticesLAN != null)
            {
                noticesLAN.IsVisible = () => !advertiseOnline;
            }

            BuildNotices();
        }
예제 #17
0
        void SelectMap(MapPreview preview)
        {
            selectedMap = preview;

            // Cache the rules on a background thread to avoid jank
            var difficultyDisabled = true;
            var difficulties = new Dictionary<string, string>();

            var briefingVideo = "";
            var briefingVideoVisible = false;

            var infoVideo = "";
            var infoVideoVisible = false;

            new Thread(() =>
            {
                var mapDifficulty = preview.Rules.Actors["world"].TraitInfos<ScriptLobbyDropdownInfo>()
                    .FirstOrDefault(sld => sld.ID == "difficulty");

                if (mapDifficulty != null)
                {
                    difficulty = mapDifficulty.Default;
                    difficulties = mapDifficulty.Values;
                    difficultyDisabled = mapDifficulty.Locked;
                }

                var missionData = preview.Rules.Actors["world"].TraitInfoOrDefault<MissionDataInfo>();
                if (missionData != null)
                {
                    briefingVideo = missionData.BriefingVideo;
                    briefingVideoVisible = briefingVideo != null;

                    infoVideo = missionData.BackgroundVideo;
                    infoVideoVisible = infoVideo != null;

                    var briefing = WidgetUtils.WrapText(missionData.Briefing.Replace("\\n", "\n"), description.Bounds.Width, descriptionFont);
                    var height = descriptionFont.Measure(briefing).Y;
                    Game.RunAfterTick(() =>
                    {
                        if (preview == selectedMap)
                        {
                            description.Text = briefing;
                            description.Bounds.Height = height;
                            descriptionPanel.Layout.AdjustChildren();
                        }
                    });
                }
            }).Start();

            startBriefingVideoButton.IsVisible = () => briefingVideoVisible && playingVideo != PlayingVideo.Briefing;
            startBriefingVideoButton.OnClick = () => PlayVideo(videoPlayer, briefingVideo, PlayingVideo.Briefing);

            startInfoVideoButton.IsVisible = () => infoVideoVisible && playingVideo != PlayingVideo.Info;
            startInfoVideoButton.OnClick = () => PlayVideo(videoPlayer, infoVideo, PlayingVideo.Info);

            descriptionPanel.ScrollToTop();

            if (difficultyButton != null)
            {
                var difficultyName = new CachedTransform<string, string>(id => id == null || !difficulties.ContainsKey(id) ? "Normal" : difficulties[id]);
                difficultyButton.IsDisabled = () => difficultyDisabled;
                difficultyButton.GetText = () => difficultyName.Update(difficulty);
                difficultyButton.OnMouseDown = _ =>
                {
                    var options = difficulties.Select(kv => new DropDownOption
                    {
                        Title = kv.Value,
                        IsSelected = () => difficulty == kv.Key,
                        OnClick = () => difficulty = kv.Key
                    });

                    Func<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                    {
                        var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
                        item.Get<LabelWidget>("LABEL").GetText = () => option.Title;
                        return item;
                    };

                    difficultyButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
                };
            }

            if (gameSpeedButton != null)
            {
                var speeds = modData.Manifest.Get<GameSpeeds>().Speeds;
                gameSpeed = "default";

                gameSpeedButton.GetText = () => speeds[gameSpeed].Name;
                gameSpeedButton.OnMouseDown = _ =>
                {
                    var options = speeds.Select(s => new DropDownOption
                    {
                        Title = s.Value.Name,
                        IsSelected = () => gameSpeed == s.Key,
                        OnClick = () => gameSpeed = s.Key
                    });

                    Func<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                    {
                        var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
                        item.Get<LabelWidget>("LABEL").GetText = () => option.Title;
                        return item;
                    };

                    gameSpeedButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
                };
            }
        }
예제 #18
0
파일: LobbyLogic.cs 프로젝트: pchote/OpenRA
        void UpdateCurrentMap()
        {
            var uid = orderManager.LobbyInfo.GlobalSettings.Map;
            if (Map.Uid == uid)
                return;

            Map = modData.MapCache[uid];
            if (Map.Status == MapStatus.Available)
            {
                // Maps need to be validated and pre-loaded before they can be accessed
                var currentMap = Map;
                new Task(() =>
                {
                    // Force map rules to be loaded on this background thread
                    currentMap.PreloadRules();
                    Game.RunAfterTick(() =>
                    {
                        // Map may have changed in the meantime
                        if (currentMap != Map)
                            return;

                        // Tell the server that we have the map
                        if (!currentMap.InvalidCustomRules)
                            orderManager.IssueOrder(Order.Command("state {0}".F(Session.ClientState.NotReady)));

                        if (addBotOnMapLoad)
                        {
                            var slot = orderManager.LobbyInfo.FirstEmptyBotSlot();
                            var bot = currentMap.Rules.Actors["player"].TraitInfos<IBotInfo>().Select(t => t.Name).FirstOrDefault();
                            var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin);
                            if (slot != null && bot != null)
                                orderManager.IssueOrder(Order.Command("slot_bot {0} {1} {2}".F(slot, botController.Index, bot)));

                            addBotOnMapLoad = false;
                        }
                    });
                }).Start();
            }
            else if (Map.Status == MapStatus.DownloadAvailable)
                LoadMapPreviewRules(Map);
            else if (Game.Settings.Game.AllowDownloading)
                modData.MapCache.QueryRemoteMapDetails(new[] { uid }, LoadMapPreviewRules);
        }
예제 #19
0
    public void OnCreateTreesForPreviewChunk()
    {
        if (Application.isPlaying)
        {
            return;
        }
        // Find MapPreview
        if (mapPreview == null)
        {
            mapPreview = FindObjectOfType <MapPreview>();
        }
        if (mapPreview == null)
        {
            return;
        }

        Bounds terrainBounds = new Bounds(new Vector2(mapPreview.meshFilter.transform.position.x, mapPreview.meshFilter.transform.position.z), Vector2.one * mapPreview.meshSettings.meshWorldSize);

        float newSizeX = terrainBounds.size.x / regionSize.x;
        float newSizeY = terrainBounds.size.y / regionSize.y;

        // Delete Old Objects
        foreach (Transform trans in mapPreview.meshFilter.transform)
        {
            GameObject.DestroyImmediate(trans.gameObject);
        }

        // Create new objects
        foreach (Vector2 point in points)
        {
            RaycastHit raycastHit;
            // Fire a ray going down
            // multiply by 0.45f to allow some buffer space between chunks
            if (Physics.Raycast((mapPreview.meshFilter.transform.position + new Vector3(offset.x * newSizeX, 0, offset.y * newSizeY)
                                 + (new Vector3(point.x * newSizeX, mapPreview.meshFilter.transform.position.y + 300, point.y * newSizeY) - new Vector3(terrainBounds.size.x / 2, 0, terrainBounds.size.y / 2)) * fillPercent), new Vector3(0, -1, 0), out raycastHit))
            {
                //Debug.DrawRay(new Vector3(chunk.chunkPosition.x + point.x, 200, chunk.chunkPosition.y + point.y), new Vector3(0, -1, 0));

                // If it collides with the example terrain mesh
                if (raycastHit.transform.name.Contains("ExampleMesh"))
                {
                    GameObject spawnObjectPrefab = null;

                    Material spawnMaterial = lowMaterial;

                    if (raycastHit.point.y < mapPreview.heightMapSettings.maxHeight * treeLowHeight)
                    {
                        spawnObjectPrefab = lowTrees[UnityEngine.Random.Range(0, lowTrees.Count - 1)];
                        spawnMaterial     = lowMaterial;
                    }
                    else if (raycastHit.point.y < mapPreview.heightMapSettings.maxHeight * treeMidHeight)
                    {
                        spawnObjectPrefab = midTrees[UnityEngine.Random.Range(0, midTrees.Count - 1)];
                        spawnMaterial     = midMaterial;
                    }
                    else
                    {
                        spawnObjectPrefab = highTrees[UnityEngine.Random.Range(0, highTrees.Count - 1)];
                        spawnMaterial     = highMaterial;
                    }

                    foreach (Renderer renderer in spawnObjectPrefab.GetComponentsInChildren <Renderer>())
                    {
                        renderer.material = spawnMaterial;
                    }

                    GameObject.Instantiate(spawnObjectPrefab, raycastHit.point, Quaternion.identity, raycastHit.collider.transform);
                }
            }
        }
    }
예제 #20
0
		public ServerCreationLogic(Widget widget, Action onExit, Action openLobby)
		{
			panel = widget;
			onCreate = openLobby;
			this.onExit = onExit;

			var settings = Game.Settings;
			preview = Game.ModData.MapCache[WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map)];

			panel.Get<ButtonWidget>("CREATE_BUTTON").OnClick = CreateAndJoin;

			var mapButton = panel.GetOrNull<ButtonWidget>("MAP_BUTTON");
			if (mapButton != null)
			{
				panel.Get<ButtonWidget>("MAP_BUTTON").OnClick = () =>
				{
					Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs()
					{
						{ "initialMap", preview.Uid },
						{ "initialTab", MapClassification.System },
						{ "onExit", () => { } },
						{ "onSelect", (Action<string>)(uid => preview = Game.ModData.MapCache[uid]) },
						{ "filter", MapVisibility.Lobby },
						{ "onStart", () => { } }
					});
				};

				panel.Get<MapPreviewWidget>("MAP_PREVIEW").Preview = () => preview;

				var mapTitle = panel.Get<LabelWidget>("MAP_NAME");
				if (mapTitle != null)
				{
					var font = Game.Renderer.Fonts[mapTitle.Font];
					var title = new CachedTransform<MapPreview, string>(m => WidgetUtils.TruncateText(m.Title, mapTitle.Bounds.Width, font));
					mapTitle.GetText = () => title.Update(preview);
				}
			}

			var serverName = panel.Get<TextFieldWidget>("SERVER_NAME");
			serverName.Text = Settings.SanitizedServerName(settings.Server.Name);
			serverName.OnEnterKey = () => { serverName.YieldKeyboardFocus(); return true; };
			serverName.OnLoseFocus = () =>
			{
				serverName.Text = Settings.SanitizedServerName(serverName.Text);
				settings.Server.Name = serverName.Text;
			};

			panel.Get<TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString();

			advertiseOnline = Game.Settings.Server.AdvertiseOnline;

			var externalPort = panel.Get<TextFieldWidget>("EXTERNAL_PORT");
			externalPort.Text = settings.Server.ExternalPort.ToString();
			externalPort.IsDisabled = () => !advertiseOnline;

			var advertiseCheckbox = panel.Get<CheckboxWidget>("ADVERTISE_CHECKBOX");
			advertiseCheckbox.IsChecked = () => advertiseOnline;
			advertiseCheckbox.OnClick = () => advertiseOnline ^= true;

			allowPortForward = Game.Settings.Server.AllowPortForward;
			var checkboxUPnP = panel.Get<CheckboxWidget>("UPNP_CHECKBOX");
			checkboxUPnP.IsChecked = () => allowPortForward;
			checkboxUPnP.OnClick = () => allowPortForward ^= true;
			checkboxUPnP.IsDisabled = () => !Game.Settings.Server.NatDeviceAvailable;

			var passwordField = panel.GetOrNull<PasswordFieldWidget>("PASSWORD");
			if (passwordField != null)
				passwordField.Text = Game.Settings.Server.Password;
		}
예제 #21
0
        internal LobbyLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, OrderManager orderManager,
                            Action onExit, Action onStart, bool skirmishMode)
        {
            Map               = MapCache.UnknownMap;
            lobby             = widget;
            this.modData      = modData;
            this.orderManager = orderManager;
            this.onStart      = onStart;
            this.onExit       = onExit;
            this.skirmishMode = skirmishMode;

            // TODO: This needs to be reworked to support per-map tech levels, bots, etc.
            this.modRules = modData.DefaultRules;
            shellmapWorld = worldRenderer.World;

            orderManager.AddChatLine    += AddChatLine;
            Game.LobbyInfoChanged       += UpdateCurrentMap;
            Game.LobbyInfoChanged       += UpdatePlayerList;
            Game.BeforeGameStart        += OnGameStart;
            Game.ConnectionStateChanged += ConnectionStateChanged;

            var name = lobby.GetOrNull <LabelWidget>("SERVER_NAME");

            if (name != null)
            {
                name.GetText = () => orderManager.LobbyInfo.GlobalSettings.ServerName;
            }

            Ui.LoadWidget("LOBBY_MAP_PREVIEW", lobby.Get("MAP_PREVIEW_ROOT"), new WidgetArgs
            {
                { "orderManager", orderManager },
                { "lobby", this }
            });

            UpdateCurrentMap();

            var playerBin = Ui.LoadWidget("LOBBY_PLAYER_BIN", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs());

            playerBin.IsVisible = () => panel == PanelType.Players;

            players = playerBin.Get <ScrollPanelWidget>("LOBBY_PLAYERS");
            editablePlayerTemplate       = players.Get("TEMPLATE_EDITABLE_PLAYER");
            nonEditablePlayerTemplate    = players.Get("TEMPLATE_NONEDITABLE_PLAYER");
            emptySlotTemplate            = players.Get("TEMPLATE_EMPTY");
            editableSpectatorTemplate    = players.Get("TEMPLATE_EDITABLE_SPECTATOR");
            nonEditableSpectatorTemplate = players.Get("TEMPLATE_NONEDITABLE_SPECTATOR");
            newSpectatorTemplate         = players.Get("TEMPLATE_NEW_SPECTATOR");
            colorPreview       = lobby.Get <ColorPreviewManagerWidget>("COLOR_MANAGER");
            colorPreview.Color = Game.Settings.Player.Color;

            foreach (var f in modRules.Actors["world"].TraitInfos <FactionInfo>())
            {
                factions.Add(f.InternalName, new LobbyFaction {
                    Selectable = f.Selectable, Name = f.Name, Side = f.Side, Description = f.Description
                });
            }

            var         gameStarting          = false;
            Func <bool> configurationDisabled = () => !Game.IsHost || gameStarting ||
                                                panel == PanelType.Kick || panel == PanelType.ForceStart ||
                                                !Map.RulesLoaded || Map.InvalidCustomRules ||
                                                orderManager.LocalClient == null || orderManager.LocalClient.IsReady;

            var mapButton = lobby.GetOrNull <ButtonWidget>("CHANGEMAP_BUTTON");

            if (mapButton != null)
            {
                mapButton.IsDisabled = () => gameStarting || panel == PanelType.Kick || panel == PanelType.ForceStart ||
                                       orderManager.LocalClient == null || orderManager.LocalClient.IsReady;
                mapButton.OnClick = () =>
                {
                    var onSelect = new Action <string>(uid =>
                    {
                        // Don't select the same map again
                        if (uid == Map.Uid)
                        {
                            return;
                        }

                        orderManager.IssueOrder(Order.Command("map " + uid));
                        Game.Settings.Server.Map = uid;
                        Game.Settings.Save();
                    });

                    Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs()
                    {
                        { "initialMap", Map.Uid },
                        { "initialTab", MapClassification.System },
                        { "onExit", DoNothing },
                        { "onSelect", Game.IsHost ? onSelect : null },
                        { "filter", MapVisibility.Lobby },
                    });
                };
            }

            var slotsButton = lobby.GetOrNull <DropDownButtonWidget>("SLOTS_DROPDOWNBUTTON");

            if (slotsButton != null)
            {
                slotsButton.IsDisabled = () => configurationDisabled() || panel != PanelType.Players ||
                                         (orderManager.LobbyInfo.Slots.Values.All(s => !s.AllowBots) &&
                                          orderManager.LobbyInfo.Slots.Count(s => !s.Value.LockTeam && orderManager.LobbyInfo.ClientInSlot(s.Key) != null) == 0);

                slotsButton.OnMouseDown = _ =>
                {
                    var botNames = Map.Rules.Actors["player"].TraitInfos <IBotInfo>().Select(t => t.Name);
                    var options  = new Dictionary <string, IEnumerable <DropDownOption> >();

                    var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin);
                    if (orderManager.LobbyInfo.Slots.Values.Any(s => s.AllowBots))
                    {
                        var botOptions = new List <DropDownOption>()
                        {
                            new DropDownOption()
                            {
                                Title      = "Add",
                                IsSelected = () => false,
                                OnClick    = () =>
                                {
                                    foreach (var slot in orderManager.LobbyInfo.Slots)
                                    {
                                        var bot = botNames.Random(Game.CosmeticRandom);
                                        var c   = orderManager.LobbyInfo.ClientInSlot(slot.Key);
                                        if (slot.Value.AllowBots == true && (c == null || c.Bot != null))
                                        {
                                            orderManager.IssueOrder(Order.Command("slot_bot {0} {1} {2}".F(slot.Key, botController.Index, bot)));
                                        }
                                    }
                                }
                            }
                        };

                        if (orderManager.LobbyInfo.Clients.Any(c => c.Bot != null))
                        {
                            botOptions.Add(new DropDownOption()
                            {
                                Title      = "Remove",
                                IsSelected = () => false,
                                OnClick    = () =>
                                {
                                    foreach (var slot in orderManager.LobbyInfo.Slots)
                                    {
                                        var c = orderManager.LobbyInfo.ClientInSlot(slot.Key);
                                        if (c != null && c.Bot != null)
                                        {
                                            orderManager.IssueOrder(Order.Command("slot_open " + slot.Value.PlayerReference));
                                        }
                                    }
                                }
                            });
                        }

                        options.Add("Configure Bots", botOptions);
                    }

                    var teamCount = (orderManager.LobbyInfo.Slots.Count(s => !s.Value.LockTeam && orderManager.LobbyInfo.ClientInSlot(s.Key) != null) + 1) / 2;
                    if (teamCount >= 1)
                    {
                        var teamOptions = Enumerable.Range(2, teamCount - 1).Reverse().Select(d => new DropDownOption
                        {
                            Title      = "{0} Teams".F(d),
                            IsSelected = () => false,
                            OnClick    = () => orderManager.IssueOrder(Order.Command("assignteams {0}".F(d.ToString())))
                        }).ToList();

                        if (orderManager.LobbyInfo.Slots.Any(s => s.Value.AllowBots))
                        {
                            teamOptions.Add(new DropDownOption
                            {
                                Title      = "Humans vs Bots",
                                IsSelected = () => false,
                                OnClick    = () => orderManager.IssueOrder(Order.Command("assignteams 1"))
                            });
                        }

                        teamOptions.Add(new DropDownOption
                        {
                            Title      = "Free for all",
                            IsSelected = () => false,
                            OnClick    = () => orderManager.IssueOrder(Order.Command("assignteams 0"))
                        });

                        options.Add("Configure Teams", teamOptions);
                    }

                    Func <DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                    {
                        var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
                        item.Get <LabelWidget>("LABEL").GetText = () => option.Title;
                        return(item);
                    };
                    slotsButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 175, options, setupItem);
                };
            }

            var optionsBin = Ui.LoadWidget("LOBBY_OPTIONS_BIN", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs());

            optionsBin.IsVisible = () => panel == PanelType.Options;

            var musicBin = Ui.LoadWidget("LOBBY_MUSIC_BIN", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs
            {
                { "onExit", DoNothing },
                { "world", worldRenderer.World }
            });

            musicBin.IsVisible = () => panel == PanelType.Music;

            var optionsTab = lobby.Get <ButtonWidget>("OPTIONS_TAB");

            optionsTab.IsHighlighted = () => panel == PanelType.Options;
            optionsTab.IsDisabled    = () => !Map.RulesLoaded || Map.InvalidCustomRules || panel == PanelType.Kick || panel == PanelType.ForceStart;
            optionsTab.OnClick       = () => panel = PanelType.Options;

            var playersTab = lobby.Get <ButtonWidget>("PLAYERS_TAB");

            playersTab.IsHighlighted = () => panel == PanelType.Players;
            playersTab.IsDisabled    = () => panel == PanelType.Kick || panel == PanelType.ForceStart;
            playersTab.OnClick       = () => panel = PanelType.Players;

            var musicTab = lobby.Get <ButtonWidget>("MUSIC_TAB");

            musicTab.IsHighlighted = () => panel == PanelType.Music;
            musicTab.IsDisabled    = () => panel == PanelType.Kick || panel == PanelType.ForceStart;
            musicTab.OnClick       = () => panel = PanelType.Music;

            // Force start panel
            Action startGame = () =>
            {
                gameStarting = true;
                orderManager.IssueOrder(Order.Command("startgame"));
            };

            var startGameButton = lobby.GetOrNull <ButtonWidget>("START_GAME_BUTTON");

            if (startGameButton != null)
            {
                startGameButton.IsDisabled = () => configurationDisabled() || Map.Status != MapStatus.Available ||
                                             orderManager.LobbyInfo.Slots.Any(sl => sl.Value.Required && orderManager.LobbyInfo.ClientInSlot(sl.Key) == null) ||
                                             (!orderManager.LobbyInfo.GlobalSettings.EnableSingleplayer && orderManager.LobbyInfo.IsSinglePlayer);

                startGameButton.OnClick = () =>
                {
                    // Bots and admins don't count
                    if (orderManager.LobbyInfo.Clients.Any(c => c.Slot != null && !c.IsAdmin && c.Bot == null && !c.IsReady))
                    {
                        panel = PanelType.ForceStart;
                    }
                    else
                    {
                        startGame();
                    }
                };
            }

            var forceStartBin = Ui.LoadWidget("FORCE_START_DIALOG", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs());

            forceStartBin.IsVisible = () => panel == PanelType.ForceStart;
            forceStartBin.Get("KICK_WARNING").IsVisible               = () => orderManager.LobbyInfo.Clients.Any(c => c.IsInvalid);
            forceStartBin.Get <ButtonWidget>("OK_BUTTON").OnClick     = startGame;
            forceStartBin.Get <ButtonWidget>("CANCEL_BUTTON").OnClick = () => panel = PanelType.Players;

            // Options panel
            var optionCheckboxes = new Dictionary <string, string>()
            {
                { "EXPLORED_MAP_CHECKBOX", "explored" },
                { "CRATES_CHECKBOX", "crates" },
                { "SHORTGAME_CHECKBOX", "shortgame" },
                { "FOG_CHECKBOX", "fog" },
                { "ALLYBUILDRADIUS_CHECKBOX", "allybuild" },
                { "ALLOWCHEATS_CHECKBOX", "cheats" },
                { "CREEPS_CHECKBOX", "creeps" },
            };

            foreach (var kv in optionCheckboxes)
            {
                var checkbox = optionsBin.GetOrNull <CheckboxWidget>(kv.Key);
                if (checkbox != null)
                {
                    var option = new CachedTransform <Session.Global, Session.LobbyOptionState>(
                        gs => gs.LobbyOptions[kv.Value]);

                    var visible = new CachedTransform <Session.Global, bool>(
                        gs => gs.LobbyOptions.ContainsKey(kv.Value));

                    checkbox.IsVisible  = () => visible.Update(orderManager.LobbyInfo.GlobalSettings);
                    checkbox.IsChecked  = () => option.Update(orderManager.LobbyInfo.GlobalSettings).Enabled;
                    checkbox.IsDisabled = () => configurationDisabled() ||
                                          option.Update(orderManager.LobbyInfo.GlobalSettings).Locked;
                    checkbox.OnClick = () => orderManager.IssueOrder(Order.Command(
                                                                         "option {0} {1}".F(kv.Value, !option.Update(orderManager.LobbyInfo.GlobalSettings).Enabled)));
                }
            }

            var optionDropdowns = new Dictionary <string, string>()
            {
                { "TECHLEVEL", "techlevel" },
                { "STARTINGUNITS", "startingunits" },
                { "STARTINGCASH", "startingcash" },
                { "DIFFICULTY", "difficulty" },
                { "GAMESPEED", "gamespeed" }
            };

            var allOptions = new CachedTransform <MapPreview, LobbyOption[]>(
                map => map.Rules.Actors["player"].TraitInfos <ILobbyOptions>()
                .Concat(map.Rules.Actors["world"].TraitInfos <ILobbyOptions>())
                .SelectMany(t => t.LobbyOptions(map.Rules))
                .ToArray());

            foreach (var kv in optionDropdowns)
            {
                var dropdown = optionsBin.GetOrNull <DropDownButtonWidget>(kv.Key + "_DROPDOWNBUTTON");
                if (dropdown != null)
                {
                    var optionValue = new CachedTransform <Session.Global, Session.LobbyOptionState>(
                        gs => gs.LobbyOptions[kv.Value]);

                    var option = new CachedTransform <MapPreview, LobbyOption>(
                        map => allOptions.Update(map).FirstOrDefault(o => o.Id == kv.Value));

                    var getOptionLabel = new CachedTransform <string, string>(id =>
                    {
                        string value;
                        if (id == null || !option.Update(Map).Values.TryGetValue(id, out value))
                        {
                            return("Not Available");
                        }

                        return(value);
                    });

                    dropdown.GetText    = () => getOptionLabel.Update(optionValue.Update(orderManager.LobbyInfo.GlobalSettings).Value);
                    dropdown.IsVisible  = () => option.Update(Map) != null;
                    dropdown.IsDisabled = () => configurationDisabled() ||
                                          optionValue.Update(orderManager.LobbyInfo.GlobalSettings).Locked;

                    dropdown.OnMouseDown = _ =>
                    {
                        Func <KeyValuePair <string, string>, ScrollItemWidget, ScrollItemWidget> setupItem = (c, template) =>
                        {
                            Func <bool> isSelected = () => optionValue.Update(orderManager.LobbyInfo.GlobalSettings).Value == c.Key;
                            Action      onClick    = () => orderManager.IssueOrder(Order.Command("option {0} {1}".F(kv.Value, c.Key)));

                            var item = ScrollItemWidget.Setup(template, isSelected, onClick);
                            item.Get <LabelWidget>("LABEL").GetText = () => c.Value;
                            return(item);
                        };

                        var options = option.Update(Map).Values;
                        dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
                    };

                    var label = optionsBin.GetOrNull(kv.Key + "_DESC");
                    if (label != null)
                    {
                        label.IsVisible = () => option.Update(Map) != null;
                    }
                }
            }

            var disconnectButton = lobby.Get <ButtonWidget>("DISCONNECT_BUTTON");

            disconnectButton.OnClick = () => { Ui.CloseWindow(); onExit(); };

            if (skirmishMode)
            {
                disconnectButton.Text = "Back";
            }

            var globalChat      = Game.LoadWidget(null, "LOBBY_GLOBALCHAT_PANEL", lobby.Get("GLOBALCHAT_ROOT"), new WidgetArgs());
            var globalChatInput = globalChat.Get <TextFieldWidget>("CHAT_TEXTFIELD");

            globalChat.IsVisible = () => chatPanel == ChatPanelType.Global;

            var globalChatTab = lobby.Get <ButtonWidget>("GLOBALCHAT_TAB");

            globalChatTab.IsHighlighted = () => chatPanel == ChatPanelType.Global;
            globalChatTab.OnClick       = () =>
            {
                chatPanel = ChatPanelType.Global;
                globalChatInput.TakeKeyboardFocus();
            };

            var globalChatLabel = globalChatTab.Text;

            globalChatTab.GetText = () =>
            {
                if (globalChatUnreadMessages == 0 || chatPanel == ChatPanelType.Global)
                {
                    return(globalChatLabel);
                }

                return(globalChatLabel + " ({0})".F(globalChatUnreadMessages));
            };

            globalChatLastReadMessages = Game.GlobalChat.History.Count(m => m.Type == ChatMessageType.Message);

            var lobbyChat = lobby.Get("LOBBYCHAT");

            lobbyChat.IsVisible = () => chatPanel == ChatPanelType.Lobby;

            chatLabel = lobby.Get <LabelWidget>("LABEL_CHATTYPE");
            var chatTextField = lobby.Get <TextFieldWidget>("CHAT_TEXTFIELD");

            chatTextField.TakeKeyboardFocus();
            chatTextField.OnEnterKey = () =>
            {
                if (chatTextField.Text.Length == 0)
                {
                    return(true);
                }

                // Always scroll to bottom when we've typed something
                lobbyChatPanel.ScrollToBottom();

                orderManager.IssueOrder(Order.Chat(teamChat, chatTextField.Text));
                chatTextField.Text = "";
                return(true);
            };

            chatTextField.OnTabKey = () =>
            {
                var previousText = chatTextField.Text;
                chatTextField.Text           = tabCompletion.Complete(chatTextField.Text);
                chatTextField.CursorPosition = chatTextField.Text.Length;

                if (chatTextField.Text == previousText)
                {
                    return(SwitchTeamChat());
                }
                else
                {
                    return(true);
                }
            };

            chatTextField.OnEscKey = () => { chatTextField.Text = ""; return(true); };

            var lobbyChatTab = lobby.Get <ButtonWidget>("LOBBYCHAT_TAB");

            lobbyChatTab.IsHighlighted = () => chatPanel == ChatPanelType.Lobby;
            lobbyChatTab.OnClick       = () =>
            {
                chatPanel = ChatPanelType.Lobby;
                chatTextField.TakeKeyboardFocus();
            };

            var lobbyChatLabel = lobbyChatTab.Text;

            lobbyChatTab.GetText = () =>
            {
                if (lobbyChatUnreadMessages == 0 || chatPanel == ChatPanelType.Lobby)
                {
                    return(lobbyChatLabel);
                }

                return(lobbyChatLabel + " ({0})".F(lobbyChatUnreadMessages));
            };

            lobbyChatPanel = lobby.Get <ScrollPanelWidget>("CHAT_DISPLAY");
            chatTemplate   = lobbyChatPanel.Get("CHAT_TEMPLATE");
            lobbyChatPanel.RemoveChildren();

            var settingsButton = lobby.GetOrNull <ButtonWidget>("SETTINGS_BUTTON");

            if (settingsButton != null)
            {
                settingsButton.OnClick = () => Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs
                {
                    { "onExit", DoNothing },
                    { "worldRenderer", worldRenderer }
                });
            }

            // Add a bot on the first lobbyinfo update
            if (skirmishMode)
            {
                addBotOnMapLoad = true;
            }
        }
예제 #22
0
 public static void SetupEditableTeamWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map)
 {
     var dropdown = parent.Get<DropDownButtonWidget>("TEAM");
     dropdown.IsDisabled = () => s.LockTeam || orderManager.LocalClient.IsReady;
     dropdown.OnMouseDown = _ => ShowTeamDropDown(dropdown, c, orderManager, map.PlayerCount);
     dropdown.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString();
 }
예제 #23
0
        internal LobbyLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, OrderManager orderManager,
                            Action onExit, Action onStart, bool skirmishMode)
        {
            map                = MapCache.UnknownMap;
            lobby              = widget;
            this.modData       = modData;
            this.orderManager  = orderManager;
            this.worldRenderer = worldRenderer;
            this.onStart       = onStart;
            this.onExit        = onExit;
            this.skirmishMode  = skirmishMode;

            // TODO: This needs to be reworked to support per-map tech levels, bots, etc.
            this.modRules = modData.DefaultRules;
            shellmapWorld = worldRenderer.World;

            services = modData.Manifest.Get <WebServices>();

            orderManager.AddChatLine    += AddChatLine;
            Game.LobbyInfoChanged       += UpdateCurrentMap;
            Game.LobbyInfoChanged       += UpdatePlayerList;
            Game.BeforeGameStart        += OnGameStart;
            Game.ConnectionStateChanged += ConnectionStateChanged;

            var name = lobby.GetOrNull <LabelWidget>("SERVER_NAME");

            if (name != null)
            {
                name.GetText = () => orderManager.LobbyInfo.GlobalSettings.ServerName;
            }

            var mapContainer = Ui.LoadWidget("MAP_PREVIEW", lobby.Get("MAP_PREVIEW_ROOT"), new WidgetArgs
            {
                { "orderManager", orderManager },
                { "getMap", (Func <MapPreview>)(() => map) },
                { "onMouseDown", (Action <MapPreviewWidget, MapPreview, MouseInput>)((preview, mapPreview, mi) =>
                                                                                     LobbyUtils.SelectSpawnPoint(orderManager, preview, mapPreview, mi)) },
                { "getSpawnOccupants", (Func <MapPreview, Dictionary <CPos, SpawnOccupant> >)(mapPreview => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, mapPreview)) },
                { "showUnoccupiedSpawnpoints", true },
            });

            mapContainer.IsVisible = () => panel != PanelType.Servers;

            UpdateCurrentMap();

            var playerBin = Ui.LoadWidget("LOBBY_PLAYER_BIN", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs());

            playerBin.IsVisible = () => panel == PanelType.Players;

            players = playerBin.Get <ScrollPanelWidget>("LOBBY_PLAYERS");
            editablePlayerTemplate       = players.Get("TEMPLATE_EDITABLE_PLAYER");
            nonEditablePlayerTemplate    = players.Get("TEMPLATE_NONEDITABLE_PLAYER");
            emptySlotTemplate            = players.Get("TEMPLATE_EMPTY");
            editableSpectatorTemplate    = players.Get("TEMPLATE_EDITABLE_SPECTATOR");
            nonEditableSpectatorTemplate = players.Get("TEMPLATE_NONEDITABLE_SPECTATOR");
            newSpectatorTemplate         = players.Get("TEMPLATE_NEW_SPECTATOR");
            colorPreview       = lobby.Get <ColorPreviewManagerWidget>("COLOR_MANAGER");
            colorPreview.Color = Game.Settings.Player.Color;

            foreach (var f in modRules.Actors["world"].TraitInfos <FactionInfo>())
            {
                factions.Add(f.InternalName, new LobbyFaction {
                    Selectable = f.Selectable, Name = f.Name, Side = f.Side, Description = f.Description
                });
            }

            var         gameStarting          = false;
            Func <bool> configurationDisabled = () => !Game.IsHost || gameStarting ||
                                                panel == PanelType.Kick || panel == PanelType.ForceStart ||
                                                !map.RulesLoaded || map.InvalidCustomRules ||
                                                orderManager.LocalClient == null || orderManager.LocalClient.IsReady;

            var mapButton = lobby.GetOrNull <ButtonWidget>("CHANGEMAP_BUTTON");

            if (mapButton != null)
            {
                mapButton.IsVisible  = () => panel != PanelType.Servers;
                mapButton.IsDisabled = () => gameStarting || panel == PanelType.Kick || panel == PanelType.ForceStart ||
                                       orderManager.LocalClient == null || orderManager.LocalClient.IsReady;
                mapButton.OnClick = () =>
                {
                    var onSelect = new Action <string>(uid =>
                    {
                        // Don't select the same map again
                        if (uid == map.Uid)
                        {
                            return;
                        }

                        orderManager.IssueOrder(Order.Command("map " + uid));
                        Game.Settings.Server.Map = uid;
                        Game.Settings.Save();
                    });

                    Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs()
                    {
                        { "initialMap", map.Uid },
                        { "initialTab", MapClassification.System },
                        { "onExit", DoNothing },
                        { "onSelect", Game.IsHost ? onSelect : null },
                        { "filter", MapVisibility.Lobby },
                    });
                };
            }

            var slotsButton = lobby.GetOrNull <DropDownButtonWidget>("SLOTS_DROPDOWNBUTTON");

            if (slotsButton != null)
            {
                slotsButton.IsVisible  = () => panel != PanelType.Servers;
                slotsButton.IsDisabled = () => configurationDisabled() || panel != PanelType.Players ||
                                         (orderManager.LobbyInfo.Slots.Values.All(s => !s.AllowBots) &&
                                          orderManager.LobbyInfo.Slots.Count(s => !s.Value.LockTeam && orderManager.LobbyInfo.ClientInSlot(s.Key) != null) == 0);

                slotsButton.OnMouseDown = _ =>
                {
                    var botTypes = map.Rules.Actors["player"].TraitInfos <IBotInfo>().Select(t => t.Type);
                    var options  = new Dictionary <string, IEnumerable <DropDownOption> >();

                    var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin);
                    if (orderManager.LobbyInfo.Slots.Values.Any(s => s.AllowBots))
                    {
                        var botOptions = new List <DropDownOption>()
                        {
                            new DropDownOption()
                            {
                                Title      = "Add",
                                IsSelected = () => false,
                                OnClick    = () =>
                                {
                                    foreach (var slot in orderManager.LobbyInfo.Slots)
                                    {
                                        var bot = botTypes.Random(Game.CosmeticRandom);
                                        var c   = orderManager.LobbyInfo.ClientInSlot(slot.Key);
                                        if (slot.Value.AllowBots == true && (c == null || c.Bot != null))
                                        {
                                            orderManager.IssueOrder(Order.Command("slot_bot {0} {1} {2}".F(slot.Key, botController.Index, bot)));
                                        }
                                    }
                                }
                            }
                        };

                        if (orderManager.LobbyInfo.Clients.Any(c => c.Bot != null))
                        {
                            botOptions.Add(new DropDownOption()
                            {
                                Title      = "Remove",
                                IsSelected = () => false,
                                OnClick    = () =>
                                {
                                    foreach (var slot in orderManager.LobbyInfo.Slots)
                                    {
                                        var c = orderManager.LobbyInfo.ClientInSlot(slot.Key);
                                        if (c != null && c.Bot != null)
                                        {
                                            orderManager.IssueOrder(Order.Command("slot_open " + slot.Value.PlayerReference));
                                        }
                                    }
                                }
                            });
                        }

                        options.Add("Configure Bots", botOptions);
                    }

                    var teamCount = (orderManager.LobbyInfo.Slots.Count(s => !s.Value.LockTeam && orderManager.LobbyInfo.ClientInSlot(s.Key) != null) + 1) / 2;
                    if (teamCount >= 1)
                    {
                        var teamOptions = Enumerable.Range(2, teamCount - 1).Reverse().Select(d => new DropDownOption
                        {
                            Title      = "{0} Teams".F(d),
                            IsSelected = () => false,
                            OnClick    = () => orderManager.IssueOrder(Order.Command("assignteams {0}".F(d.ToString())))
                        }).ToList();

                        if (orderManager.LobbyInfo.Slots.Any(s => s.Value.AllowBots))
                        {
                            teamOptions.Add(new DropDownOption
                            {
                                Title      = "Humans vs Bots",
                                IsSelected = () => false,
                                OnClick    = () => orderManager.IssueOrder(Order.Command("assignteams 1"))
                            });
                        }

                        teamOptions.Add(new DropDownOption
                        {
                            Title      = "Free for all",
                            IsSelected = () => false,
                            OnClick    = () => orderManager.IssueOrder(Order.Command("assignteams 0"))
                        });

                        options.Add("Configure Teams", teamOptions);
                    }

                    Func <DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                    {
                        var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
                        item.Get <LabelWidget>("LABEL").GetText = () => option.Title;
                        return(item);
                    };
                    slotsButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 175, options, setupItem);
                };
            }

            var optionsBin = Ui.LoadWidget("LOBBY_OPTIONS_BIN", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs()
            {
                { "orderManager", orderManager },
                { "getMap", (Func <MapPreview>)(() => map) },
                { "configurationDisabled", configurationDisabled }
            });

            optionsBin.IsVisible = () => panel == PanelType.Options;

            var musicBin = Ui.LoadWidget("LOBBY_MUSIC_BIN", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs
            {
                { "onExit", DoNothing },
                { "world", worldRenderer.World }
            });

            musicBin.IsVisible = () => panel == PanelType.Music;

            ServerListLogic serverListLogic = null;

            if (!skirmishMode)
            {
                Action <GameServer> doNothingWithServer = _ => { };

                var serversBin = Ui.LoadWidget("LOBBY_SERVERS_BIN", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs
                {
                    { "onJoin", doNothingWithServer },
                });

                serverListLogic      = serversBin.LogicObjects.Select(l => l as ServerListLogic).FirstOrDefault(l => l != null);
                serversBin.IsVisible = () => panel == PanelType.Servers;
            }

            var tabContainer = skirmishMode ? lobby.Get("SKIRMISH_TABS") : lobby.Get("MULTIPLAYER_TABS");

            tabContainer.IsVisible = () => true;

            var optionsTab = tabContainer.Get <ButtonWidget>("OPTIONS_TAB");

            optionsTab.IsHighlighted = () => panel == PanelType.Options;
            optionsTab.IsDisabled    = OptionsTabDisabled;
            optionsTab.OnClick       = () => panel = PanelType.Options;
            optionsTab.GetText       = () => !map.RulesLoaded ? "Loading..." : optionsTab.Text;

            var playersTab = tabContainer.Get <ButtonWidget>("PLAYERS_TAB");

            playersTab.IsHighlighted = () => panel == PanelType.Players;
            playersTab.IsDisabled    = () => panel == PanelType.Kick || panel == PanelType.ForceStart;
            playersTab.OnClick       = () => panel = PanelType.Players;

            var musicTab = tabContainer.Get <ButtonWidget>("MUSIC_TAB");

            musicTab.IsHighlighted = () => panel == PanelType.Music;
            musicTab.IsDisabled    = () => panel == PanelType.Kick || panel == PanelType.ForceStart;
            musicTab.OnClick       = () => panel = PanelType.Music;

            var serversTab = tabContainer.GetOrNull <ButtonWidget>("SERVERS_TAB");

            if (serversTab != null)
            {
                serversTab.IsHighlighted = () => panel == PanelType.Servers;
                serversTab.IsDisabled    = () => panel == PanelType.Kick || panel == PanelType.ForceStart;
                serversTab.OnClick       = () =>
                {
                    // Refresh the list when switching to the servers tab
                    if (serverListLogic != null && panel != PanelType.Servers)
                    {
                        serverListLogic.RefreshServerList();
                    }

                    panel = PanelType.Servers;
                };
            }

            // Force start panel
            Action startGame = () =>
            {
                gameStarting = true;
                orderManager.IssueOrder(Order.Command("startgame"));
            };

            var startGameButton = lobby.GetOrNull <ButtonWidget>("START_GAME_BUTTON");

            if (startGameButton != null)
            {
                startGameButton.IsDisabled = () => configurationDisabled() || map.Status != MapStatus.Available ||
                                             orderManager.LobbyInfo.Slots.Any(sl => sl.Value.Required && orderManager.LobbyInfo.ClientInSlot(sl.Key) == null) ||
                                             (!orderManager.LobbyInfo.GlobalSettings.EnableSingleplayer && orderManager.LobbyInfo.NonBotPlayers.Count() < 2);

                startGameButton.OnClick = () =>
                {
                    // Bots and admins don't count
                    if (orderManager.LobbyInfo.Clients.Any(c => c.Slot != null && !c.IsAdmin && c.Bot == null && !c.IsReady))
                    {
                        panel = PanelType.ForceStart;
                    }
                    else
                    {
                        startGame();
                    }
                };
            }

            var forceStartBin = Ui.LoadWidget("FORCE_START_DIALOG", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs());

            forceStartBin.IsVisible = () => panel == PanelType.ForceStart;
            forceStartBin.Get("KICK_WARNING").IsVisible               = () => orderManager.LobbyInfo.Clients.Any(c => c.IsInvalid);
            forceStartBin.Get <ButtonWidget>("OK_BUTTON").OnClick     = startGame;
            forceStartBin.Get <ButtonWidget>("CANCEL_BUTTON").OnClick = () => panel = PanelType.Players;

            var disconnectButton = lobby.Get <ButtonWidget>("DISCONNECT_BUTTON");

            disconnectButton.OnClick = () => { Ui.CloseWindow(); onExit(); };

            if (skirmishMode)
            {
                disconnectButton.Text = "Back";
            }

            chatLabel = lobby.Get <LabelWidget>("LABEL_CHATTYPE");
            var chatTextField = lobby.Get <TextFieldWidget>("CHAT_TEXTFIELD");

            chatTextField.MaxLength = UnitOrders.ChatMessageMaxLength;

            chatTextField.TakeKeyboardFocus();
            chatTextField.OnEnterKey = () =>
            {
                if (chatTextField.Text.Length == 0)
                {
                    return(true);
                }

                // Always scroll to bottom when we've typed something
                lobbyChatPanel.ScrollToBottom();

                orderManager.IssueOrder(Order.Chat(teamChat, chatTextField.Text));
                chatTextField.Text = "";
                return(true);
            };

            chatTextField.OnTabKey = () =>
            {
                var previousText = chatTextField.Text;
                chatTextField.Text           = tabCompletion.Complete(chatTextField.Text);
                chatTextField.CursorPosition = chatTextField.Text.Length;

                if (chatTextField.Text == previousText)
                {
                    return(SwitchTeamChat());
                }
                else
                {
                    return(true);
                }
            };

            chatTextField.OnEscKey = () => { chatTextField.Text = ""; return(true); };

            lobbyChatPanel = lobby.Get <ScrollPanelWidget>("CHAT_DISPLAY");
            chatTemplate   = lobbyChatPanel.Get("CHAT_TEMPLATE");
            lobbyChatPanel.RemoveChildren();

            var settingsButton = lobby.GetOrNull <ButtonWidget>("SETTINGS_BUTTON");

            if (settingsButton != null)
            {
                settingsButton.OnClick = () => Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs
                {
                    { "onExit", DoNothing },
                    { "worldRenderer", worldRenderer }
                });
            }

            // Add a bot on the first lobbyinfo update
            if (skirmishMode)
            {
                addBotOnMapLoad = true;
            }
        }
예제 #24
0
 void ILintServerMapPass.Run(Action <string> emitError, Action <string> emitWarning, ModData modData, MapPreview map, Ruleset mapRules)
 {
     foreach (var actorInfo in mapRules.Actors)
     {
         foreach (var traitInfo in actorInfo.Value.TraitInfos <TraitInfo>())
         {
             CheckTrait(emitError, actorInfo.Value, traitInfo, mapRules);
         }
     }
 }
예제 #25
0
        public ServerCreationLogic(Widget widget, Action onExit, Action openLobby)
        {
            panel       = widget;
            onCreate    = openLobby;
            this.onExit = onExit;

            var settings = Game.Settings;

            preview = Game.ModData.MapCache[WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map)];

            panel.Get <ButtonWidget>("CREATE_BUTTON").OnClick = CreateAndJoin;

            var mapButton = panel.GetOrNull <ButtonWidget>("MAP_BUTTON");

            if (mapButton != null)
            {
                panel.Get <ButtonWidget>("MAP_BUTTON").OnClick = () =>
                {
                    Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs()
                    {
                        { "initialMap", preview.Uid },
                        { "initialTab", MapClassification.System },
                        { "onExit", () => { } },
                        { "onSelect", (Action <string>)(uid => preview = Game.ModData.MapCache[uid]) },
                        { "filter", MapVisibility.Lobby },
                        { "onStart", () => { } }
                    });
                };

                panel.Get <MapPreviewWidget>("MAP_PREVIEW").Preview = () => preview;

                var mapTitle = panel.Get <LabelWidget>("MAP_NAME");
                if (mapTitle != null)
                {
                    var font  = Game.Renderer.Fonts[mapTitle.Font];
                    var title = new CachedTransform <MapPreview, string>(m => WidgetUtils.TruncateText(m.Title, mapTitle.Bounds.Width, font));
                    mapTitle.GetText = () => title.Update(preview);
                }
            }

            var serverName = panel.Get <TextFieldWidget>("SERVER_NAME");

            serverName.Text        = Settings.SanitizedServerName(settings.Server.Name);
            serverName.OnEnterKey  = () => { serverName.YieldKeyboardFocus(); return(true); };
            serverName.OnLoseFocus = () =>
            {
                serverName.Text      = Settings.SanitizedServerName(serverName.Text);
                settings.Server.Name = serverName.Text;
            };

            panel.Get <TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString();

            advertiseOnline = Game.Settings.Server.AdvertiseOnline;

            var externalPort = panel.Get <TextFieldWidget>("EXTERNAL_PORT");

            externalPort.Text       = settings.Server.ExternalPort.ToString();
            externalPort.IsDisabled = () => !advertiseOnline;

            var advertiseCheckbox = panel.Get <CheckboxWidget>("ADVERTISE_CHECKBOX");

            advertiseCheckbox.IsChecked = () => advertiseOnline;
            advertiseCheckbox.OnClick   = () => advertiseOnline ^= true;

            allowPortForward = Game.Settings.Server.AllowPortForward;
            var checkboxUPnP = panel.Get <CheckboxWidget>("UPNP_CHECKBOX");

            checkboxUPnP.IsChecked  = () => allowPortForward;
            checkboxUPnP.OnClick    = () => allowPortForward ^= true;
            checkboxUPnP.IsDisabled = () => !Game.Settings.Server.NatDeviceAvailable;

            var passwordField = panel.GetOrNull <PasswordFieldWidget>("PASSWORD");

            if (passwordField != null)
            {
                passwordField.Text = Game.Settings.Server.Password;
            }
        }
예제 #26
0
        void SelectServer(GameServer server)
        {
            currentServer = server;
            currentMap    = server != null ? modData.MapCache[server.Map] : null;

            // Can only show factions if the server is running the same mod
            if (server != null && mapPreview != null)
            {
                var spawns    = currentMap.SpawnPoints;
                var occupants = server.Clients
                                .Where(c => (c.SpawnPoint - 1 >= 0) && (c.SpawnPoint - 1 < spawns.Length))
                                .ToDictionary(c => spawns[c.SpawnPoint - 1], c => new SpawnOccupant(c, server.Mod != modData.Manifest.Id));

                mapPreview.SpawnOccupants = () => occupants;
            }

            if (server == null || !server.Clients.Any())
            {
                if (joinButton != null)
                {
                    joinButton.Bounds.Y = joinButtonY;
                }

                return;
            }

            if (joinButton != null)
            {
                joinButton.Bounds.Y = clientContainer.Bounds.Bottom;
            }

            if (clientList == null)
            {
                return;
            }

            clientList.RemoveChildren();

            var players = server.Clients
                          .Where(c => !c.IsSpectator)
                          .GroupBy(p => p.Team)
                          .OrderBy(g => g.Key);

            var teams   = new Dictionary <string, IEnumerable <GameClient> >();
            var noTeams = players.Count() == 1;

            foreach (var p in players)
            {
                var label = noTeams ? "Players" : p.Key == 0 ? "No Team" : "Team {0}".F(p.Key);
                teams.Add(label, p);
            }

            if (server.Clients.Any(c => c.IsSpectator))
            {
                teams.Add("Spectators", server.Clients.Where(c => c.IsSpectator));
            }

            var factionInfo = modData.DefaultRules.Actors["world"].TraitInfos <FactionInfo>();

            foreach (var kv in teams)
            {
                var group = kv.Key;
                if (group.Length > 0)
                {
                    var header = ScrollItemWidget.Setup(clientHeader, () => true, () => { });
                    header.Get <LabelWidget>("LABEL").GetText = () => group;
                    clientList.AddChild(header);
                }

                foreach (var option in kv.Value)
                {
                    var o = option;

                    var item = ScrollItemWidget.Setup(clientTemplate, () => false, () => { });
                    if (!o.IsSpectator && server.Mod == modData.Manifest.Id)
                    {
                        var label = item.Get <LabelWidget>("LABEL");
                        var font  = Game.Renderer.Fonts[label.Font];
                        var name  = WidgetUtils.TruncateText(o.Name, label.Bounds.Width, font);
                        label.GetText  = () => name;
                        label.GetColor = () => o.Color;

                        var flag = item.Get <ImageWidget>("FLAG");
                        flag.IsVisible          = () => true;
                        flag.GetImageCollection = () => "flags";
                        flag.GetImageName       = () => (factionInfo != null && factionInfo.Any(f => f.InternalName == o.Faction)) ? o.Faction : "Random";
                    }
                    else
                    {
                        var label = item.Get <LabelWidget>("NOFLAG_LABEL");
                        var font  = Game.Renderer.Fonts[label.Font];
                        var name  = WidgetUtils.TruncateText(o.Name, label.Bounds.Width, font);

                        // Force spectator color to prevent spoofing by the server
                        var color = o.IsSpectator ? Color.White : o.Color;
                        label.GetText  = () => name;
                        label.GetColor = () => color;
                    }

                    clientList.AddChild(item);
                }
            }
        }
예제 #27
0
        public static void SelectSpawnPoint(OrderManager orderManager, MapPreviewWidget mapPreview, MapPreview preview, MouseInput mi)
        {
            if (orderManager.LocalClient.State == Session.ClientState.Ready)
            {
                return;
            }

            if (mi.Button == MouseButton.Left)
            {
                SelectPlayerSpawnPoint(orderManager, mapPreview, preview, mi);
            }

            if (mi.Button == MouseButton.Right)
            {
                ClearPlayerSpawnPoint(orderManager, mapPreview, preview, mi);
            }
        }
예제 #28
0
        public static void SetupEditableSpawnWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map)
        {
            var dropdown = parent.Get <DropDownButtonWidget>("SPAWN");

            dropdown.IsDisabled  = () => s.LockSpawn || orderManager.LocalClient.IsReady;
            dropdown.OnMouseDown = _ =>
            {
                var spawnPoints = Enumerable.Range(0, map.SpawnPoints.Length + 1).Except(
                    orderManager.LobbyInfo.Clients.Where(
                        client => client != c && client.SpawnPoint != 0).Select(client => client.SpawnPoint));
                ShowSpawnDropDown(dropdown, c, orderManager, spawnPoints);
            };
            dropdown.GetText = () => (c.SpawnPoint == 0) ? "-" : Convert.ToChar('A' - 1 + c.SpawnPoint).ToString();
        }
예제 #29
0
        static void SelectPlayerSpawnPoint(OrderManager orderManager, MapPreviewWidget mapPreview, MapPreview preview, MouseInput mi)
        {
            var selectedSpawn = DetermineSelectedSpawnPoint(mapPreview, preview, mi);

            var locals       = orderManager.LobbyInfo.Clients.Where(c => c.Index == orderManager.LocalClient.Index || (Game.IsHost && c.Bot != null));
            var playerToMove = locals.FirstOrDefault(c => ((selectedSpawn == 0) ^ (c.SpawnPoint == 0) && !c.IsObserver));

            SetSpawnPoint(orderManager, playerToMove, selectedSpawn);
        }
예제 #30
0
        public static Dictionary <CPos, SpawnOccupant> GetSpawnOccupants(Session lobbyInfo, MapPreview preview)
        {
            var spawns = preview.SpawnPoints;

            return(lobbyInfo.Clients
                   .Where(c => c.SpawnPoint != 0)
                   .ToDictionary(c => spawns[c.SpawnPoint - 1], c => new SpawnOccupant(c)));
        }
예제 #31
0
        static void ClearPlayerSpawnPoint(OrderManager orderManager, MapPreviewWidget mapPreview, MapPreview preview, MouseInput mi)
        {
            var selectedSpawn = DetermineSelectedSpawnPoint(mapPreview, preview, mi);

            if (Game.IsHost || orderManager.LobbyInfo.Clients.FirstOrDefault(cc => cc.SpawnPoint == selectedSpawn) == orderManager.LocalClient)
            {
                orderManager.IssueOrder(Order.Command("clear_spawn {0}".F(selectedSpawn)));
            }
        }
예제 #32
0
        public static void SelectSpawnPoint(OrderManager orderManager, MapPreviewWidget mapPreview, MapPreview preview, MouseInput mi)
        {
            if (mi.Button != MouseButton.Left)
            {
                return;
            }

            if (!orderManager.LocalClient.IsObserver && orderManager.LocalClient.State == Session.ClientState.Ready)
            {
                return;
            }

            var selectedSpawn = preview.SpawnPoints
                                .Select((sp, i) => Pair.New(mapPreview.ConvertToPreview(sp), i))
                                .Where(a => ((a.First - mi.Location).ToFloat2() / new float2(ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").bounds.Width / 2, ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").bounds.Height / 2)).LengthSquared <= 1)
                                .Select(a => a.Second + 1)
                                .FirstOrDefault();

            var locals       = orderManager.LobbyInfo.Clients.Where(c => c.Index == orderManager.LocalClient.Index || (Game.IsHost && c.Bot != null));
            var playerToMove = locals.FirstOrDefault(c => ((selectedSpawn == 0) ^ (c.SpawnPoint == 0) && !c.IsObserver));

            SetSpawnPoint(orderManager, playerToMove, selectedSpawn);
        }
예제 #33
0
        public static void SetupEditableHandicapWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map)
        {
            var dropdown = parent.Get <DropDownButtonWidget>("HANDICAP_DROPDOWN");

            dropdown.IsVisible   = () => true;
            dropdown.IsDisabled  = () => s.LockTeam || orderManager.LocalClient.IsReady;
            dropdown.OnMouseDown = _ => ShowHandicapDropDown(dropdown, c, orderManager);

            var handicapLabel = new CachedTransform <int, string>(h => "{0}%".F(h));

            dropdown.GetText = () => handicapLabel.Update(c.Handicap);

            HideChildWidget(parent, "HANDICAP");
        }
예제 #34
0
파일: LobbyLogic.cs 프로젝트: pchote/OpenRA
 void LoadMapPreviewRules(MapPreview map)
 {
     new Task(() =>
     {
         // Force map rules to be loaded on this background thread
         map.PreloadRules();
     }).Start();
 }
예제 #35
0
        public static void SetupEditableSlotWidget(Widget parent, Session.Slot s, Session.Client c,
                                                   OrderManager orderManager, WorldRenderer worldRenderer, MapPreview map)
        {
            var slot = parent.Get <DropDownButtonWidget>("SLOT_OPTIONS");

            slot.IsVisible   = () => true;
            slot.IsDisabled  = () => orderManager.LocalClient.IsReady;
            slot.GetText     = () => c != null ? c.Name : s.Closed ? "Closed" : "Open";
            slot.OnMouseDown = _ => ShowSlotDropDown(slot, s, c, orderManager, map);

            // Ensure Name selector (if present) is hidden
            HideChildWidget(parent, "NAME");
        }
예제 #36
0
 void ILintServerMapPass.Run(Action <string> emitError, Action <string> emitWarning, ModData modData, MapPreview map, Ruleset mapRules)
 {
     CheckMapYaml(emitError, modData, map, map.RuleDefinitions);
 }
예제 #37
0
		void SelectMap(Map map)
		{
			selectedMapPreview = Game.ModData.MapCache[map.Uid];

			// Cache the rules on a background thread to avoid jank
			new Thread(selectedMapPreview.CacheRules).Start();

			var briefingVideo = selectedMapPreview.Map.Videos.Briefing;
			var briefingVideoVisible = briefingVideo != null;
			var briefingVideoDisabled = !(briefingVideoVisible && GlobalFileSystem.Exists(briefingVideo));

			var infoVideo = selectedMapPreview.Map.Videos.BackgroundInfo;
			var infoVideoVisible = infoVideo != null;
			var infoVideoDisabled = !(infoVideoVisible && GlobalFileSystem.Exists(infoVideo));

			startBriefingVideoButton.IsVisible = () => briefingVideoVisible && playingVideo != PlayingVideo.Briefing;
			startBriefingVideoButton.IsDisabled = () => briefingVideoDisabled || playingVideo != PlayingVideo.None;
			startBriefingVideoButton.OnClick = () => PlayVideo(videoPlayer, briefingVideo, PlayingVideo.Briefing, () => StopVideo(videoPlayer));

			startInfoVideoButton.IsVisible = () => infoVideoVisible && playingVideo != PlayingVideo.Info;
			startInfoVideoButton.IsDisabled = () => infoVideoDisabled || playingVideo != PlayingVideo.None;
			startInfoVideoButton.OnClick = () => PlayVideo(videoPlayer, infoVideo, PlayingVideo.Info, () => StopVideo(videoPlayer));

			var text = map.Description != null ? map.Description.Replace("\\n", "\n") : "";
			text = WidgetUtils.WrapText(text, description.Bounds.Width, descriptionFont);
			description.Text = text;
			description.Bounds.Height = descriptionFont.Measure(text).Y;
			descriptionPanel.ScrollToTop();
			descriptionPanel.Layout.AdjustChildren();

			if (difficultyButton != null)
			{
				difficultyButton.IsDisabled = () => !map.Options.Difficulties.Any();

				difficulty = map.Options.Difficulties.FirstOrDefault();
				difficultyButton.GetText = () => difficulty ?? "Normal";
				difficultyButton.OnMouseDown = _ =>
				{
					var options = map.Options.Difficulties.Select(d => new DropDownOption
					{
						Title = d,
						IsSelected = () => difficulty == d,
						OnClick = () => difficulty = d
					});

					Func<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
					{
						var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
						item.Get<LabelWidget>("LABEL").GetText = () => option.Title;
						return item;
					};

					difficultyButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
				};
			}

			if (gameSpeedButton != null)
			{
				var speeds = Game.ModData.Manifest.Get<GameSpeeds>().Speeds;
				gameSpeed = "default";

				gameSpeedButton.GetText = () => speeds[gameSpeed].Name;
				gameSpeedButton.OnMouseDown = _ =>
				{
					var options = speeds.Select(s => new DropDownOption
					{
						Title = s.Value.Name,
						IsSelected = () => gameSpeed == s.Key,
						OnClick = () => gameSpeed = s.Key
					});

					Func<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
					{
						var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
						item.Get<LabelWidget>("LABEL").GetText = () => option.Title;
						return item;
					};

					gameSpeedButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
				};
			}
		}
예제 #38
0
        void UpdateCurrentMap()
        {
            var uid = orderManager.LobbyInfo.GlobalSettings.Map;
            if (Map.Uid == uid)
                return;

            Map = Game.modData.MapCache[uid];
            if (Map.Status == MapStatus.Available)
            {
                // Maps need to be validated and pre-loaded before they can be accessed
                new Thread(_ =>
                {
                    var map = Map;
                    map.CacheRules();
                    Game.RunAfterTick(() =>
                    {
                        // Map may have changed in the meantime
                        if (map != Map)
                            return;

                        if (map.RuleStatus != MapRuleStatus.Invalid)
                        {
                            // Tell the server that we have the map
                            orderManager.IssueOrder(Order.Command("state {0}".F(Session.ClientState.NotReady)));

                            // Restore default starting cash if the last map set it to something invalid
                            var pri = modRules.Actors["player"].Traits.Get<PlayerResourcesInfo>();
                            if (!Map.Map.Options.StartingCash.HasValue && !pri.SelectableCash.Contains(orderManager.LobbyInfo.GlobalSettings.StartingCash))
                                orderManager.IssueOrder(Order.Command("startingcash {0}".F(pri.DefaultCash)));
                        }
                    });
                }).Start();
            }
            else if (Game.Settings.Game.AllowDownloading)
                Game.modData.MapCache.QueryRemoteMapDetails(new [] { uid });
        }
예제 #39
0
        public static void SetupEditableReadyWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map, bool forceDisable)
        {
            var status = parent.Get<CheckboxWidget>("STATUS_CHECKBOX");
            status.IsChecked = () => orderManager.LocalClient.IsReady || c.Bot != null;
            status.IsVisible = () => true;
            status.IsDisabled = () => c.Bot != null || map.Status != MapStatus.Available || forceDisable;

            var state = orderManager.LocalClient.IsReady ? Session.ClientState.NotReady : Session.ClientState.Ready;
            status.OnClick = () => orderManager.IssueOrder(Order.Command("state {0}".F(state)));
        }
예제 #40
0
        public static void ShowSlotDropDown(DropDownButtonWidget dropdown, Session.Slot slot,
                                            Session.Client client, OrderManager orderManager, MapPreview map)
        {
            var options = new Dictionary <string, IEnumerable <SlotDropDownOption> >
            {
                {
                    "Slot", new List <SlotDropDownOption>
                    {
                        new SlotDropDownOption("Open", "slot_open " + slot.PlayerReference, () => (!slot.Closed && client == null)),
                        new SlotDropDownOption("Closed", "slot_close " + slot.PlayerReference, () => slot.Closed)
                    }
                }
            };

            var bots = new List <SlotDropDownOption>();

            if (slot.AllowBots)
            {
                foreach (var b in map.Rules.Actors["player"].TraitInfos <IBotInfo>())
                {
                    var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin);
                    bots.Add(new SlotDropDownOption(b.Name,
                                                    "slot_bot {0} {1} {2}".F(slot.PlayerReference, botController.Index, b.Type),
                                                    () => client != null && client.Bot == b.Type));
                }
            }

            options.Add(bots.Any() ? "Bots" : "Bots Disabled", bots);

            Func <SlotDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (o, itemTemplate) =>
            {
                var item = ScrollItemWidget.Setup(itemTemplate,
                                                  o.Selected,
                                                  () => orderManager.IssueOrder(Order.Command(o.Order)));
                item.Get <LabelWidget>("LABEL").GetText = () => o.Title;
                return(item);
            };

            dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 180, options, setupItem);
        }
예제 #41
0
        public ServerCreationLogic(Widget widget, Action onExit, Action openLobby)
        {
            panel       = widget;
            onCreate    = openLobby;
            this.onExit = onExit;

            var settings = Game.Settings;

            preview = Game.ModData.MapCache[WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map)];

            panel.Get <ButtonWidget>("BACK_BUTTON").OnClick   = () => { Ui.CloseWindow(); onExit(); };
            panel.Get <ButtonWidget>("CREATE_BUTTON").OnClick = CreateAndJoin;

            var mapButton = panel.GetOrNull <ButtonWidget>("MAP_BUTTON");

            if (mapButton != null)
            {
                panel.Get <ButtonWidget>("MAP_BUTTON").OnClick = () =>
                {
                    Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs()
                    {
                        { "initialMap", preview.Uid },
                        { "initialTab", MapClassification.System },
                        { "onExit", () => { } },
                        { "onSelect", (Action <string>)(uid => preview = Game.ModData.MapCache[uid]) },
                        { "filter", MapVisibility.Lobby },
                        { "onStart", () => { } }
                    });
                };

                panel.Get <MapPreviewWidget>("MAP_PREVIEW").Preview = () => preview;
                panel.Get <LabelWidget>("MAP_NAME").GetText         = () => preview.Title;
            }

            panel.Get <TextFieldWidget>("SERVER_NAME").Text = settings.Server.Name ?? "";
            panel.Get <TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString();
            advertiseOnline = Game.Settings.Server.AdvertiseOnline;

            var externalPort = panel.Get <TextFieldWidget>("EXTERNAL_PORT");

            externalPort.Text       = settings.Server.ExternalPort.ToString();
            externalPort.IsDisabled = () => !advertiseOnline;

            var advertiseCheckbox = panel.Get <CheckboxWidget>("ADVERTISE_CHECKBOX");

            advertiseCheckbox.IsChecked = () => advertiseOnline;
            advertiseCheckbox.OnClick   = () => advertiseOnline ^= true;

            allowPortForward = Game.Settings.Server.AllowPortForward;
            var checkboxUPnP = panel.Get <CheckboxWidget>("UPNP_CHECKBOX");

            checkboxUPnP.IsChecked  = () => allowPortForward;
            checkboxUPnP.OnClick    = () => allowPortForward ^= true;
            checkboxUPnP.IsDisabled = () => !Game.Settings.Server.NatDeviceAvailable;

            var passwordField = panel.GetOrNull <PasswordFieldWidget>("PASSWORD");

            if (passwordField != null)
            {
                passwordField.Text = Game.Settings.Server.Password;
            }
        }
예제 #42
0
        public static void SelectSpawnPoint(OrderManager orderManager, MapPreviewWidget mapPreview, MapPreview preview, MouseInput mi)
        {
            if (mi.Button != MouseButton.Left)
                return;

            if (!orderManager.LocalClient.IsObserver && orderManager.LocalClient.State == Session.ClientState.Ready)
                return;

            var spawnSize = new float2(ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").Bounds.Size);
            var selectedSpawn = preview.SpawnPoints
                .Select((sp, i) => Pair.New(mapPreview.ConvertToPreview(sp, preview.GridType), i))
                .Where(a => ((a.First - mi.Location).ToFloat2() / spawnSize * 2).LengthSquared <= 1)
                .Select(a => a.Second + 1)
                .FirstOrDefault();

            var locals = orderManager.LobbyInfo.Clients.Where(c => c.Index == orderManager.LocalClient.Index || (Game.IsHost && c.Bot != null));
            var playerToMove = locals.FirstOrDefault(c => ((selectedSpawn == 0) ^ (c.SpawnPoint == 0) && !c.IsObserver));
            SetSpawnPoint(orderManager, playerToMove, selectedSpawn);
        }
예제 #43
0
        public static void SetupEditableSlotWidget(Widget parent, Session.Slot s, Session.Client c,
                                                   OrderManager orderManager, WorldRenderer worldRenderer, MapPreview map)
        {
            var slot = parent.Get <DropDownButtonWidget>("SLOT_OPTIONS");

            slot.IsVisible  = () => true;
            slot.IsDisabled = () => orderManager.LocalClient.IsReady;

            var truncated = new CachedTransform <string, string>(name =>
                                                                 WidgetUtils.TruncateText(name, slot.Bounds.Width - slot.Bounds.Height - slot.LeftMargin - slot.RightMargin,
                                                                                          Game.Renderer.Fonts[slot.Font]));

            slot.GetText     = () => truncated.Update(c != null ? c.Name : s.Closed ? "Closed" : "Open");
            slot.OnMouseDown = _ => ShowSlotDropDown(slot, s, c, orderManager, map);

            // Ensure Name selector (if present) is hidden
            HideChildWidget(parent, "NAME");
        }
예제 #44
0
 public static void SetupEditableSpawnWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map)
 {
     var dropdown = parent.Get<DropDownButtonWidget>("SPAWN");
     dropdown.IsDisabled = () => s.LockSpawn || orderManager.LocalClient.IsReady;
     dropdown.OnMouseDown = _ =>
     {
         var spawnPoints = Enumerable.Range(0, map.SpawnPoints.Length + 1).Except(
             orderManager.LobbyInfo.Clients.Where(
             client => client != c && client.SpawnPoint != 0).Select(client => client.SpawnPoint));
         ShowSpawnDropDown(dropdown, c, orderManager, spawnPoints);
     };
     dropdown.GetText = () => (c.SpawnPoint == 0) ? "-" : Convert.ToChar('A' - 1 + c.SpawnPoint).ToString();
 }
예제 #45
0
 IEnumerable <LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
 {
     yield return(new LobbyBooleanOption("flyers", CheckboxLabel, CheckboxDescription, CheckboxVisible, CheckboxDisplayOrder, CheckboxEnabled, CheckboxLocked));
 }
예제 #46
0
 void ILintServerMapPass.Run(Action <string> emitError, Action <string> emitWarning, ModData modData, MapPreview map, Ruleset mapRules)
 {
     Run(emitError, mapRules);
 }
예제 #47
0
        void SelectMap(MapPreview preview)
        {
            selectedMap = preview;

            // Cache the rules on a background thread to avoid jank
            var difficultyDisabled = true;
            var difficulties = new string[0];

            var briefingVideo = "";
            var briefingVideoVisible = false;
            var briefingVideoDisabled = true;

            var infoVideo = "";
            var infoVideoVisible = false;
            var infoVideoDisabled = true;

            new Thread(() =>
            {
                var mapOptions = preview.Rules.Actors["world"].TraitInfo<MapOptionsInfo>();

                difficulty = mapOptions.Difficulty ?? mapOptions.Difficulties.FirstOrDefault();
                difficulties = mapOptions.Difficulties;
                difficultyDisabled = mapOptions.DifficultyLocked || mapOptions.Difficulties.Length <= 1;

                var missionData = preview.Rules.Actors["world"].TraitInfoOrDefault<MissionDataInfo>();
                if (missionData != null)
                {
                    briefingVideo = missionData.BriefingVideo;
                    briefingVideoVisible = briefingVideo != null;
                    briefingVideoDisabled = !(briefingVideoVisible && modData.DefaultFileSystem.Exists(briefingVideo));

                    infoVideo = missionData.BackgroundVideo;
                    infoVideoVisible = infoVideo != null;
                    infoVideoDisabled = !(infoVideoVisible && modData.DefaultFileSystem.Exists(infoVideo));

                    var briefing = WidgetUtils.WrapText(missionData.Briefing.Replace("\\n", "\n"), description.Bounds.Width, descriptionFont);
                    var height = descriptionFont.Measure(briefing).Y;
                    Game.RunAfterTick(() =>
                    {
                        if (preview == selectedMap)
                        {
                            description.Text = briefing;
                            description.Bounds.Height = height;
                            descriptionPanel.Layout.AdjustChildren();
                        }
                    });
                }
            }).Start();

            startBriefingVideoButton.IsVisible = () => briefingVideoVisible && playingVideo != PlayingVideo.Briefing;
            startBriefingVideoButton.IsDisabled = () => briefingVideoDisabled || playingVideo != PlayingVideo.None;
            startBriefingVideoButton.OnClick = () => PlayVideo(videoPlayer, briefingVideo, PlayingVideo.Briefing, () => StopVideo(videoPlayer));

            startInfoVideoButton.IsVisible = () => infoVideoVisible && playingVideo != PlayingVideo.Info;
            startInfoVideoButton.IsDisabled = () => infoVideoDisabled || playingVideo != PlayingVideo.None;
            startInfoVideoButton.OnClick = () => PlayVideo(videoPlayer, infoVideo, PlayingVideo.Info, () => StopVideo(videoPlayer));

            descriptionPanel.ScrollToTop();

            if (difficultyButton != null)
            {
                difficultyButton.IsDisabled = () => difficultyDisabled;
                difficultyButton.GetText = () => difficulty ?? "Normal";
                difficultyButton.OnMouseDown = _ =>
                {
                    var options = difficulties.Select(d => new DropDownOption
                    {
                        Title = d,
                        IsSelected = () => difficulty == d,
                        OnClick = () => difficulty = d
                    });

                    Func<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                    {
                        var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
                        item.Get<LabelWidget>("LABEL").GetText = () => option.Title;
                        return item;
                    };

                    difficultyButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
                };
            }

            if (gameSpeedButton != null)
            {
                var speeds = modData.Manifest.Get<GameSpeeds>().Speeds;
                gameSpeed = "default";

                gameSpeedButton.GetText = () => speeds[gameSpeed].Name;
                gameSpeedButton.OnMouseDown = _ =>
                {
                    var options = speeds.Select(s => new DropDownOption
                    {
                        Title = s.Value.Name,
                        IsSelected = () => gameSpeed == s.Key,
                        OnClick = () => gameSpeed = s.Key
                    });

                    Func<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                    {
                        var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
                        item.Get<LabelWidget>("LABEL").GetText = () => option.Title;
                        return item;
                    };

                    gameSpeedButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
                };
            }
        }