示例#1
0
        public static void SelectSpawnPoint(OrderManager orderManager, MapPreviewWidget mapPreview, Map map, MouseInput mi)
        {
            if (map == null)
            {
                return;
            }
            if (mi.Button != MouseButton.Left)
            {
                return;
            }
            if (!orderManager.LocalClient.IsObserver && orderManager.LocalClient.State == Session.ClientState.Ready)
            {
                return;
            }

            var selectedSpawn = map.GetSpawnPoints()
                                .Select((sp, i) => Pair.New(mapPreview.ConvertToPreview(sp), i))
                                .Where(a => (a.First - mi.Location).LengthSquared < 64)
                                .Select(a => a.Second + 1)
                                .FirstOrDefault();

            var owned = orderManager.LobbyInfo.Clients.Any(c => c.SpawnPoint == selectedSpawn);

            if (selectedSpawn == 0 || !owned)
            {
                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));
                orderManager.IssueOrder(Order.Command("spawn {0} {1}".F((playerToMove ?? orderManager.LocalClient).Index, selectedSpawn)));
            }
        }
示例#2
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)));
            }
        }
示例#3
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);
        }
示例#4
0
        static int DetermineSelectedSpawnPoint(MapPreviewWidget mapPreview, MapPreview preview, MouseInput mi)
        {
            var spawnSize     = ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").Size.XY;
            var selectedSpawn = preview.SpawnPoints
                                .Select((sp, i) => (SpawnLocation: mapPreview.ConvertToPreview(sp, preview.GridType), Index: i))
                                .Where(a => ((a.SpawnLocation - mi.Location).ToFloat2() / spawnSize * 2).LengthSquared <= 1)
                                .Select(a => a.Index + 1)
                                .FirstOrDefault();

            return(selectedSpawn);
        }
示例#5
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);
            }
        }
示例#6
0
        protected MapPreviewWidget(MapPreviewWidget other)
            : base(other)
        {
            Preview = other.Preview;

            IgnoreMouseInput = other.IgnoreMouseInput;
            ShowSpawnPoints = other.ShowSpawnPoints;
            TooltipTemplate = other.TooltipTemplate;
            TooltipContainer = other.TooltipContainer;
            SpawnOccupants = other.SpawnOccupants;

            tooltipContainer = Exts.Lazy(() => Ui.Root.Get<TooltipContainerWidget>(TooltipContainer));

            spawnClaimed = ChromeProvider.GetImage("lobby-bits", "spawn-claimed");
            spawnUnclaimed = ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed");
            spawnFont = Game.Renderer.Fonts[ChromeMetrics.Get<string>("SpawnFont")];
            spawnColor = ChromeMetrics.Get<Color>("SpawnColor");
            spawnContrastColor = ChromeMetrics.Get<Color>("SpawnContrastColor");
            spawnLabelOffset = ChromeMetrics.Get<int2>("SpawnLabelOffset");
        }
示例#7
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);
        }
        public SpawnSelectorTooltipLogic(Widget widget, TooltipContainerWidget tooltipContainer, MapPreviewWidget preview)
        {
            widget.IsVisible = () => preview.TooltipSpawnIndex != -1;
            var label        = widget.Get <LabelWidget>("LABEL");
            var flag         = widget.Get <ImageWidget>("FLAG");
            var team         = widget.Get <LabelWidget>("TEAM");
            var singleHeight = widget.Get("SINGLE_HEIGHT").Bounds.Height;
            var doubleHeight = widget.Get("DOUBLE_HEIGHT").Bounds.Height;
            var ownerFont    = Game.Renderer.Fonts[label.Font];
            var teamFont     = Game.Renderer.Fonts[team.Font];

            // Width specified in YAML is used as the margin between flag / label and label / border
            var labelMargin = widget.Bounds.Width;

            var    cachedWidth   = 0;
            var    labelText     = "";
            string playerFaction = null;
            var    playerTeam    = -1;

            tooltipContainer.BeforeRender = () =>
            {
                var occupant = preview.SpawnOccupants().Values.FirstOrDefault(c => c.SpawnPoint == preview.TooltipSpawnIndex);

                var teamWidth = 0;
                if (occupant == null)
                {
                    labelText            = "Available spawn";
                    playerFaction        = null;
                    playerTeam           = 0;
                    widget.Bounds.Height = singleHeight;
                }
                else
                {
                    labelText            = occupant.PlayerName;
                    playerFaction        = occupant.Faction;
                    playerTeam           = occupant.Team;
                    widget.Bounds.Height = playerTeam > 0 ? doubleHeight : singleHeight;
                    teamWidth            = teamFont.Measure(team.GetText()).X;
                }

                label.Bounds.X = playerFaction != null ? flag.Bounds.Right + labelMargin : labelMargin;

                var textWidth = ownerFont.Measure(labelText).X;
                if (textWidth != cachedWidth)
                {
                    label.Bounds.Width  = textWidth;
                    widget.Bounds.Width = 2 * label.Bounds.X + textWidth;
                }

                widget.Bounds.Width = Math.Max(teamWidth + 2 * labelMargin, label.Bounds.Right + labelMargin);
                team.Bounds.Width   = widget.Bounds.Width;
            };

            label.GetText           = () => labelText;
            flag.IsVisible          = () => playerFaction != null;
            flag.GetImageCollection = () => "flags";
            flag.GetImageName       = () => playerFaction;
            team.GetText            = () => "Team {0}".F(playerTeam);
            team.IsVisible          = () => playerTeam > 0;
        }
示例#9
0
        public ServerListLogic(Widget widget, ModData modData, Action <GameServer> onJoin)
        {
            this.modData = modData;
            this.onJoin  = onJoin;

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

            incompatibleVersionColor       = ChromeMetrics.Get <Color>("IncompatibleVersionColor");
            incompatibleGameColor          = ChromeMetrics.Get <Color>("IncompatibleGameColor");
            incompatibleProtectedGameColor = ChromeMetrics.Get <Color>("IncompatibleProtectedGameColor");
            protectedGameColor             = ChromeMetrics.Get <Color>("ProtectedGameColor");
            waitingGameColor             = ChromeMetrics.Get <Color>("WaitingGameColor");
            incompatibleWaitingGameColor = ChromeMetrics.Get <Color>("IncompatibleWaitingGameColor");
            gameStartedColor             = ChromeMetrics.Get <Color>("GameStartedColor");
            incompatibleGameStartedColor = ChromeMetrics.Get <Color>("IncompatibleGameStartedColor");

            serverList     = widget.Get <ScrollPanelWidget>("SERVER_LIST");
            headerTemplate = serverList.Get <ScrollItemWidget>("HEADER_TEMPLATE");
            serverTemplate = serverList.Get <ScrollItemWidget>("SERVER_TEMPLATE");

            noticeContainer = widget.GetOrNull("NOTICE_CONTAINER");
            if (noticeContainer != null)
            {
                noticeContainer.IsVisible = () => showNotices;
                noticeContainer.Get("OUTDATED_VERSION_LABEL").IsVisible   = () => services.ModVersionStatus == ModVersionStatus.Outdated;
                noticeContainer.Get("UNKNOWN_VERSION_LABEL").IsVisible    = () => services.ModVersionStatus == ModVersionStatus.Unknown;
                noticeContainer.Get("PLAYTEST_AVAILABLE_LABEL").IsVisible = () => services.ModVersionStatus == ModVersionStatus.PlaytestAvailable;
            }

            var noticeWatcher = widget.Get <LogicTickerWidget>("NOTICE_WATCHER");

            if (noticeWatcher != null && noticeContainer != null)
            {
                var containerHeight = noticeContainer.Bounds.Height;
                noticeWatcher.OnTick = () =>
                {
                    var show = services.ModVersionStatus != ModVersionStatus.NotChecked && services.ModVersionStatus != ModVersionStatus.Latest;
                    if (show != showNotices)
                    {
                        var dir = show ? 1 : -1;
                        serverList.Bounds.Y      += dir * containerHeight;
                        serverList.Bounds.Height -= dir * containerHeight;
                        showNotices = show;
                    }
                };
            }

            joinButton = widget.GetOrNull <ButtonWidget>("JOIN_BUTTON");
            if (joinButton != null)
            {
                joinButton.IsVisible  = () => currentServer != null;
                joinButton.IsDisabled = () => !currentServer.IsJoinable;
                joinButton.OnClick    = () => onJoin(currentServer);
                joinButtonY           = joinButton.Bounds.Y;
            }

            // Display the progress label over the server list
            // The text is only visible when the list is empty
            var progressText = widget.Get <LabelWidget>("PROGRESS_LABEL");

            progressText.IsVisible = () => searchStatus != SearchStatus.Hidden;
            progressText.GetText   = ProgressLabelText;

            var gs = Game.Settings.Game;
            Action <MPGameFilters> toggleFilterFlag = f =>
            {
                gs.MPGameFilters ^= f;
                Game.Settings.Save();
                RefreshServerList();
            };

            var filtersButton = widget.GetOrNull <DropDownButtonWidget>("FILTERS_DROPDOWNBUTTON");

            if (filtersButton != null)
            {
                // HACK: MULTIPLAYER_FILTER_PANEL doesn't follow our normal procedure for dropdown creation
                // but we still need to be able to set the dropdown width based on the parent
                // The yaml should use PARENT_RIGHT instead of DROPDOWN_WIDTH
                var filtersPanel = Ui.LoadWidget("MULTIPLAYER_FILTER_PANEL", filtersButton, new WidgetArgs());
                filtersButton.Children.Remove(filtersPanel);

                var showWaitingCheckbox = filtersPanel.GetOrNull <CheckboxWidget>("WAITING_FOR_PLAYERS");
                if (showWaitingCheckbox != null)
                {
                    showWaitingCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Waiting);
                    showWaitingCheckbox.OnClick   = () => toggleFilterFlag(MPGameFilters.Waiting);
                }

                var showEmptyCheckbox = filtersPanel.GetOrNull <CheckboxWidget>("EMPTY");
                if (showEmptyCheckbox != null)
                {
                    showEmptyCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Empty);
                    showEmptyCheckbox.OnClick   = () => toggleFilterFlag(MPGameFilters.Empty);
                }

                var showAlreadyStartedCheckbox = filtersPanel.GetOrNull <CheckboxWidget>("ALREADY_STARTED");
                if (showAlreadyStartedCheckbox != null)
                {
                    showAlreadyStartedCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Started);
                    showAlreadyStartedCheckbox.OnClick   = () => toggleFilterFlag(MPGameFilters.Started);
                }

                var showProtectedCheckbox = filtersPanel.GetOrNull <CheckboxWidget>("PASSWORD_PROTECTED");
                if (showProtectedCheckbox != null)
                {
                    showProtectedCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Protected);
                    showProtectedCheckbox.OnClick   = () => toggleFilterFlag(MPGameFilters.Protected);
                }

                var showIncompatibleCheckbox = filtersPanel.GetOrNull <CheckboxWidget>("INCOMPATIBLE_VERSION");
                if (showIncompatibleCheckbox != null)
                {
                    showIncompatibleCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Incompatible);
                    showIncompatibleCheckbox.OnClick   = () => toggleFilterFlag(MPGameFilters.Incompatible);
                }

                filtersButton.IsDisabled  = () => searchStatus == SearchStatus.Fetching;
                filtersButton.OnMouseDown = _ =>
                {
                    filtersButton.RemovePanel();
                    filtersButton.AttachPanel(filtersPanel);
                };
            }

            var reloadButton = widget.GetOrNull <ButtonWidget>("RELOAD_BUTTON");

            if (reloadButton != null)
            {
                reloadButton.IsDisabled = () => searchStatus == SearchStatus.Fetching;
                reloadButton.OnClick    = RefreshServerList;

                var reloadIcon = reloadButton.GetOrNull <ImageWidget>("IMAGE_RELOAD");
                if (reloadIcon != null)
                {
                    var disabledFrame = 0;
                    var disabledImage = "disabled-" + disabledFrame.ToString();
                    reloadIcon.GetImageName = () => searchStatus == SearchStatus.Fetching ? disabledImage : reloadIcon.ImageName;

                    var reloadTicker = reloadIcon.Get <LogicTickerWidget>("ANIMATION");
                    if (reloadTicker != null)
                    {
                        reloadTicker.OnTick = () =>
                        {
                            disabledFrame = searchStatus == SearchStatus.Fetching ? (disabledFrame + 1) % 12 : 0;
                            disabledImage = "disabled-" + disabledFrame.ToString();
                        };
                    }
                }
            }

            var playersLabel = widget.GetOrNull <LabelWidget>("PLAYER_COUNT");

            if (playersLabel != null)
            {
                var playersText = new CachedTransform <int, string>(c => c == 1 ? "1 Player Online" : c.ToString() + " Players Online");
                playersLabel.IsVisible = () => playerCount != 0;
                playersLabel.GetText   = () => playersText.Update(playerCount);
            }

            mapPreview = widget.GetOrNull <MapPreviewWidget>("SELECTED_MAP_PREVIEW");
            if (mapPreview != null)
            {
                mapPreview.Preview = () => currentMap;
            }

            var mapTitle = widget.GetOrNull <LabelWidget>("SELECTED_MAP");

            if (mapTitle != null)
            {
                var font  = Game.Renderer.Fonts[mapTitle.Font];
                var title = new CachedTransform <MapPreview, string>(m => m == null ? "No Server Selected" :
                                                                     WidgetUtils.TruncateText(m.Title, mapTitle.Bounds.Width, font));
                mapTitle.GetText = () => title.Update(currentMap);
            }

            var ip = widget.GetOrNull <LabelWidget>("SELECTED_IP");

            if (ip != null)
            {
                ip.IsVisible = () => currentServer != null;
                ip.GetText   = () => currentServer.Address;
            }

            var status = widget.GetOrNull <LabelWidget>("SELECTED_STATUS");

            if (status != null)
            {
                status.IsVisible = () => currentServer != null;
                status.GetText   = () => GetStateLabel(currentServer);
                status.GetColor  = () => GetStateColor(currentServer, status);
            }

            var modVersion = widget.GetOrNull <LabelWidget>("SELECTED_MOD_VERSION");

            if (modVersion != null)
            {
                modVersion.IsVisible = () => currentServer != null;
                modVersion.GetColor  = () => currentServer.IsCompatible ? modVersion.TextColor : incompatibleVersionColor;

                var font    = Game.Renderer.Fonts[modVersion.Font];
                var version = new CachedTransform <GameServer, string>(s => WidgetUtils.TruncateText(s.ModLabel, modVersion.Bounds.Width, font));
                modVersion.GetText = () => version.Update(currentServer);
            }

            var players = widget.GetOrNull <LabelWidget>("SELECTED_PLAYERS");

            if (players != null)
            {
                players.IsVisible = () => currentServer != null && (clientContainer == null || !currentServer.Clients.Any());
                players.GetText   = () => PlayersLabel(currentServer);
            }

            clientContainer = widget.GetOrNull("CLIENT_LIST_CONTAINER");
            if (clientContainer != null)
            {
                clientList           = Ui.LoadWidget("MULTIPLAYER_CLIENT_LIST", clientContainer, new WidgetArgs()) as ScrollPanelWidget;
                clientList.IsVisible = () => currentServer != null && currentServer.Clients.Any();
                clientHeader         = clientList.Get <ScrollItemWidget>("HEADER");
                clientTemplate       = clientList.Get <ScrollItemWidget>("TEMPLATE");
                clientList.RemoveChildren();
            }

            lanGameLocations = new List <BeaconLocation>();
            try
            {
                lanGameProbe = new Probe("OpenRALANGame");
                lanGameProbe.BeaconsUpdated += locations => lanGameLocations = locations;
                lanGameProbe.Start();
            }
            catch (Exception ex)
            {
                Log.Write("debug", "BeaconLib.Probe: " + ex.Message);
            }

            RefreshServerList();
        }
示例#10
0
        public SpawnSelectorTooltipLogic(Widget widget, TooltipContainerWidget tooltipContainer, MapPreviewWidget preview, bool showUnoccupiedSpawnpoints)
        {
            bool showTooltip = true;

            widget.IsVisible = () => preview.TooltipSpawnIndex != -1 && showTooltip;
            var label        = widget.Get <LabelWidget>("LABEL");
            var flag         = widget.Get <ImageWidget>("FLAG");
            var team         = widget.Get <LabelWidget>("TEAM");
            var singleHeight = widget.Get("SINGLE_HEIGHT").Bounds.Height;
            var doubleHeight = widget.Get("DOUBLE_HEIGHT").Bounds.Height;
            var ownerFont    = Game.Renderer.Fonts[label.Font];
            var teamFont     = Game.Renderer.Fonts[team.Font];

            // Width specified in YAML is used as the margin between flag / label and label / border
            var labelMargin = widget.Bounds.Width;

            var    labelText     = "";
            string playerFaction = null;
            var    playerTeam    = -1;

            tooltipContainer.BeforeRender = () =>
            {
                showTooltip = true;

                var teamWidth = 0;
                if (preview.SpawnOccupants().TryGetValue(preview.TooltipSpawnIndex, out var occupant))
                {
                    labelText            = occupant.PlayerName;
                    playerFaction        = occupant.Faction;
                    playerTeam           = occupant.Team;
                    widget.Bounds.Height = playerTeam > 0 ? doubleHeight : singleHeight;
                    teamWidth            = teamFont.Measure(team.GetText()).X;
                }
                else
                {
                    if (!showUnoccupiedSpawnpoints)
                    {
                        showTooltip = false;
                        return;
                    }

                    labelText            = "Available spawn";
                    playerFaction        = null;
                    playerTeam           = 0;
                    widget.Bounds.Height = singleHeight;
                }

                label.Bounds.X     = playerFaction != null ? flag.Bounds.Right + labelMargin : labelMargin;
                label.Bounds.Width = ownerFont.Measure(labelText).X;

                widget.Bounds.Width = Math.Max(teamWidth + 2 * labelMargin, label.Bounds.Right + labelMargin);
                team.Bounds.Width   = widget.Bounds.Width;
            };

            label.GetText           = () => labelText;
            flag.IsVisible          = () => playerFaction != null;
            flag.GetImageCollection = () => "flags";
            flag.GetImageName       = () => playerFaction;
            team.GetText            = () => "Team {0}".F(playerTeam);
            team.IsVisible          = () => playerTeam > 0;
        }
示例#11
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), 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);
        }