SetupClientWidget() публичный статический Метод

public static SetupClientWidget ( OpenRA.Widgets.Widget parent, Session c, OrderManager orderManager, bool visible ) : void
parent OpenRA.Widgets.Widget
c OpenRA.Network.Session
orderManager OpenRA.Network.OrderManager
visible bool
Результат void
Пример #1
0
        void UpdatePlayerList()
        {
            var idx = 0;

            foreach (var kv in orderManager.LobbyInfo.Slots)
            {
                var    key      = kv.Key;
                var    slot     = kv.Value;
                var    client   = orderManager.LobbyInfo.ClientInSlot(key);
                Widget template = null;

                // get template for possible reuse
                if (idx < players.Children.Count)
                {
                    template = players.Children[idx];
                }

                if (client == null)
                {
                    // Empty slot
                    if (template == null || template.Id != emptySlotTemplate.Id)
                    {
                        template = emptySlotTemplate.Clone();
                    }

                    if (Game.IsHost)
                    {
                        LobbyUtils.SetupEditableSlotWidget(template, slot, client, orderManager, modRules);
                    }
                    else
                    {
                        LobbyUtils.SetupSlotWidget(template, slot, client);
                    }

                    var join = template.Get <ButtonWidget>("JOIN");
                    join.IsVisible  = () => !slot.Closed;
                    join.IsDisabled = () => orderManager.LocalClient.IsReady;
                    join.OnClick    = () => orderManager.IssueOrder(Order.Command("slot " + key));
                }
                else if ((client.Index == orderManager.LocalClient.Index) ||
                         (client.Bot != null && Game.IsHost))
                {
                    // Editable player in slot
                    if (template == null || template.Id != editablePlayerTemplate.Id)
                    {
                        template = editablePlayerTemplate.Clone();
                    }

                    LobbyUtils.SetupClientWidget(template, slot, client, orderManager, client.Bot == null);

                    if (client.Bot != null)
                    {
                        LobbyUtils.SetupEditableSlotWidget(template, slot, client, orderManager, modRules);
                    }
                    else
                    {
                        LobbyUtils.SetupEditableNameWidget(template, slot, client, orderManager);
                    }

                    LobbyUtils.SetupEditableColorWidget(template, slot, client, orderManager, shellmapWorld, colorPreview);
                    LobbyUtils.SetupEditableFactionWidget(template, slot, client, orderManager, factions);
                    LobbyUtils.SetupEditableTeamWidget(template, slot, client, orderManager, Map);
                    LobbyUtils.SetupEditableSpawnWidget(template, slot, client, orderManager, Map);
                    LobbyUtils.SetupEditableReadyWidget(template, slot, client, orderManager, Map);
                }
                else
                {
                    // Non-editable player in slot
                    if (template == null || template.Id != nonEditablePlayerTemplate.Id)
                    {
                        template = nonEditablePlayerTemplate.Clone();
                    }

                    LobbyUtils.SetupClientWidget(template, slot, client, orderManager, client.Bot == null);
                    LobbyUtils.SetupNameWidget(template, slot, client);
                    LobbyUtils.SetupKickWidget(template, slot, client, orderManager, lobby,
                                               () => panel = PanelType.Kick, () => panel = PanelType.Players);
                    LobbyUtils.SetupColorWidget(template, slot, client);
                    LobbyUtils.SetupFactionWidget(template, slot, client, factions);
                    LobbyUtils.SetupTeamWidget(template, slot, client);
                    LobbyUtils.SetupSpawnWidget(template, slot, client);
                    LobbyUtils.SetupReadyWidget(template, slot, client);
                }

                template.IsVisible = () => true;

                if (idx >= players.Children.Count)
                {
                    players.AddChild(template);
                }
                else if (players.Children[idx].Id != template.Id)
                {
                    players.ReplaceChild(players.Children[idx], template);
                }

                idx++;
            }

            // Add spectators
            foreach (var client in orderManager.LobbyInfo.Clients.Where(client => client.Slot == null))
            {
                Widget template = null;
                var    c        = client;

                // get template for possible reuse
                if (idx < players.Children.Count)
                {
                    template = players.Children[idx];
                }

                // Editable spectator
                if (c.Index == orderManager.LocalClient.Index)
                {
                    if (template == null || template.Id != editableSpectatorTemplate.Id)
                    {
                        template = editableSpectatorTemplate.Clone();
                    }

                    LobbyUtils.SetupEditableNameWidget(template, null, c, orderManager);
                }
                else
                {
                    // Non-editable spectator
                    if (template == null || template.Id != nonEditableSpectatorTemplate.Id)
                    {
                        template = nonEditableSpectatorTemplate.Clone();
                    }

                    LobbyUtils.SetupNameWidget(template, null, client);
                    LobbyUtils.SetupKickWidget(template, null, client, orderManager, lobby,
                                               () => panel = PanelType.Kick, () => panel = PanelType.Players);
                }

                LobbyUtils.SetupClientWidget(template, null, c, orderManager, true);
                template.IsVisible = () => true;

                if (idx >= players.Children.Count)
                {
                    players.AddChild(template);
                }
                else if (players.Children[idx].Id != template.Id)
                {
                    players.ReplaceChild(players.Children[idx], template);
                }

                idx++;
            }

            // Spectate button
            if (orderManager.LocalClient.Slot != null)
            {
                Widget spec = null;
                if (idx < players.Children.Count)
                {
                    spec = players.Children[idx];
                }
                if (spec == null || spec.Id != newSpectatorTemplate.Id)
                {
                    spec = newSpectatorTemplate.Clone();
                }

                LobbyUtils.SetupKickSpectatorsWidget(spec, orderManager, lobby,
                                                     () => panel = PanelType.Kick, () => panel = PanelType.Players, skirmishMode);

                var btn = spec.Get <ButtonWidget>("SPECTATE");
                btn.OnClick    = () => orderManager.IssueOrder(Order.Command("spectate"));
                btn.IsDisabled = () => orderManager.LocalClient.IsReady;
                btn.IsVisible  = () => orderManager.LobbyInfo.GlobalSettings.AllowSpectators ||
                                 orderManager.LocalClient.IsAdmin;

                spec.IsVisible = () => true;

                if (idx >= players.Children.Count)
                {
                    players.AddChild(spec);
                }
                else if (players.Children[idx].Id != spec.Id)
                {
                    players.ReplaceChild(players.Children[idx], spec);
                }

                idx++;
            }

            while (players.Children.Count > idx)
            {
                players.RemoveChild(players.Children[idx]);
            }

            tabCompletion.Names = orderManager.LobbyInfo.Clients.Select(c => c.Name).Distinct().ToList();
        }
Пример #2
0
        public GameInfoStatsLogic(Widget widget, World world, OrderManager orderManager)
        {
            var player      = world.RenderPlayer ?? world.LocalPlayer;
            var playerPanel = widget.Get <ScrollPanelWidget>("PLAYER_LIST");

            if (player != null && !player.NonCombatant)
            {
                var checkbox    = widget.Get <CheckboxWidget>("STATS_CHECKBOX");
                var statusLabel = widget.Get <LabelWidget>("STATS_STATUS");

                checkbox.IsChecked    = () => player.WinState != WinState.Undefined;
                checkbox.GetCheckType = () => player.WinState == WinState.Won ?
                                        "checked" : "crossed";

                if (player.HasObjectives)
                {
                    var mo = player.PlayerActor.Trait <MissionObjectives>();
                    checkbox.GetText = () => mo.Objectives.First().Description;
                }

                statusLabel.GetText = () => player.WinState == WinState.Won ? "Accomplished" :
                                      player.WinState == WinState.Lost ? "Failed" : "In progress";
                statusLabel.GetColor = () => player.WinState == WinState.Won ? Color.LimeGreen :
                                       player.WinState == WinState.Lost ? Color.Red : Color.White;
            }
            else
            {
                // Expand the stats window to cover the hidden objectives
                var objectiveGroup = widget.Get("OBJECTIVE");
                var statsHeader    = widget.Get("STATS_HEADERS");

                objectiveGroup.Visible     = false;
                statsHeader.Bounds.Y      -= objectiveGroup.Bounds.Height;
                playerPanel.Bounds.Y      -= objectiveGroup.Bounds.Height;
                playerPanel.Bounds.Height += objectiveGroup.Bounds.Height;
            }

            var teamTemplate   = playerPanel.Get <ScrollItemWidget>("TEAM_TEMPLATE");
            var playerTemplate = playerPanel.Get("PLAYER_TEMPLATE");

            playerPanel.RemoveChildren();

            var teams = world.Players.Where(p => !p.NonCombatant && p.Playable)
                        .Select(p => new Pair <Player, PlayerStatistics>(p, p.PlayerActor.TraitOrDefault <PlayerStatistics>()))
                        .OrderByDescending(p => p.Second != null ? p.Second.Experience : 0)
                        .GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.First.ClientIndex) ?? new Session.Client()).Team)
                        .OrderByDescending(g => g.Sum(gg => gg.Second != null ? gg.Second.Experience : 0));

            foreach (var t in teams)
            {
                if (teams.Count() > 1)
                {
                    var teamHeader = ScrollItemWidget.Setup(teamTemplate, () => true, () => { });
                    teamHeader.Get <LabelWidget>("TEAM").GetText = () => t.Key == 0 ? "No Team" : "Team {0}".F(t.Key);
                    var teamRating = teamHeader.Get <LabelWidget>("TEAM_SCORE");
                    teamRating.GetText = () => t.Sum(gg => gg.Second != null ? gg.Second.Experience : 0).ToString();

                    playerPanel.AddChild(teamHeader);
                }

                foreach (var p in t.ToList())
                {
                    var pp     = p.First;
                    var client = world.LobbyInfo.ClientWithIndex(pp.ClientIndex);
                    var item   = playerTemplate.Clone();
                    LobbyUtils.SetupClientWidget(item, client, orderManager, client != null && client.Bot == null);
                    var nameLabel = item.Get <LabelWidget>("NAME");
                    var nameFont  = Game.Renderer.Fonts[nameLabel.Font];

                    var suffixLength = new CachedTransform <string, int>(s => nameFont.Measure(s).X);
                    var name         = new CachedTransform <Pair <string, int>, string>(c =>
                                                                                        WidgetUtils.TruncateText(c.First, nameLabel.Bounds.Width - c.Second, nameFont));

                    nameLabel.GetText = () =>
                    {
                        var suffix = pp.WinState == WinState.Undefined ? "" : " (" + pp.WinState + ")";
                        if (client != null && client.State == Session.ClientState.Disconnected)
                        {
                            suffix = " (Gone)";
                        }

                        var sl = suffixLength.Update(suffix);
                        return(name.Update(Pair.New(pp.PlayerName, sl)) + suffix);
                    };
                    nameLabel.GetColor = () => pp.Color.RGB;

                    var flag = item.Get <ImageWidget>("FACTIONFLAG");
                    flag.GetImageCollection = () => "flags";
                    if (player == null || player.Stances[pp] == Stance.Ally || player.WinState != WinState.Undefined)
                    {
                        flag.GetImageName = () => pp.Faction.InternalName;
                        item.Get <LabelWidget>("FACTION").GetText = () => pp.Faction.Name;
                    }
                    else
                    {
                        flag.GetImageName = () => pp.DisplayFaction.InternalName;
                        item.Get <LabelWidget>("FACTION").GetText = () => pp.DisplayFaction.Name;
                    }

                    var experience = p.Second != null ? p.Second.Experience : 0;
                    item.Get <LabelWidget>("SCORE").GetText = () => experience.ToString();

                    playerPanel.AddChild(item);
                }
            }

            var spectators = orderManager.LobbyInfo.Clients.Where(c => c.IsObserver).ToList();

            if (spectators.Any())
            {
                var spectatorHeader = ScrollItemWidget.Setup(teamTemplate, () => true, () => { });
                spectatorHeader.Get <LabelWidget>("TEAM").GetText = () => "Spectators";

                playerPanel.AddChild(spectatorHeader);

                foreach (var client in spectators)
                {
                    var item = playerTemplate.Clone();
                    LobbyUtils.SetupClientWidget(item, client, orderManager, client != null && client.Bot == null);
                    var nameLabel = item.Get <LabelWidget>("NAME");
                    var nameFont  = Game.Renderer.Fonts[nameLabel.Font];

                    var suffixLength = new CachedTransform <string, int>(s => nameFont.Measure(s).X);
                    var name         = new CachedTransform <Pair <string, int>, string>(c =>
                                                                                        WidgetUtils.TruncateText(c.First, nameLabel.Bounds.Width - c.Second, nameFont));

                    nameLabel.GetText = () =>
                    {
                        var suffix = client.State == Session.ClientState.Disconnected ? " (Gone)" : "";
                        var sl     = suffixLength.Update(suffix);
                        return(name.Update(Pair.New(client.Name, sl)) + suffix);
                    };

                    item.Get <ImageWidget>("FACTIONFLAG").IsVisible = () => false;
                    playerPanel.AddChild(item);
                }
            }
        }
Пример #3
0
        public GameInfoStatsLogic(Widget widget, World world, OrderManager orderManager)
        {
            var player      = world.RenderPlayer ?? world.LocalPlayer;
            var playerPanel = widget.Get <ScrollPanelWidget>("PLAYER_LIST");

            if (player != null && !player.NonCombatant)
            {
                var checkbox    = widget.Get <CheckboxWidget>("STATS_CHECKBOX");
                var statusLabel = widget.Get <LabelWidget>("STATS_STATUS");

                checkbox.IsChecked    = () => player.WinState != WinState.Undefined;
                checkbox.GetCheckType = () => player.WinState == WinState.Won ?
                                        "checked" : "crossed";

                if (player.HasObjectives)
                {
                    var mo = player.PlayerActor.Trait <MissionObjectives>();
                    checkbox.GetText = () => mo.Objectives.First().Description;
                }

                statusLabel.GetText = () => player.WinState == WinState.Won ? "Accomplished" :
                                      player.WinState == WinState.Lost ? "Failed" : "In progress";
                statusLabel.GetColor = () => player.WinState == WinState.Won ? Color.LimeGreen :
                                       player.WinState == WinState.Lost ? Color.Red : Color.White;
            }
            else
            {
                // Expand the stats window to cover the hidden objectives
                var objectiveGroup = widget.Get("OBJECTIVE");
                var statsHeader    = widget.Get("STATS_HEADERS");

                objectiveGroup.Visible     = false;
                statsHeader.Bounds.Y      -= objectiveGroup.Bounds.Height;
                playerPanel.Bounds.Y      -= objectiveGroup.Bounds.Height;
                playerPanel.Bounds.Height += objectiveGroup.Bounds.Height;
            }

            var playerTemplate = playerPanel.Get("PLAYER_TEMPLATE");

            playerPanel.RemoveChildren();

            foreach (var p in world.Players.Where(a => !a.NonCombatant))
            {
                var pp     = p;
                var client = world.LobbyInfo.ClientWithIndex(pp.ClientIndex);
                var item   = playerTemplate.Clone();
                LobbyUtils.SetupClientWidget(item, client, orderManager, client != null && client.Bot == null);
                var nameLabel = item.Get <LabelWidget>("NAME");
                var nameFont  = Game.Renderer.Fonts[nameLabel.Font];

                var suffixLength = new CachedTransform <string, int>(s => nameFont.Measure(s).X);
                var name         = new CachedTransform <Pair <string, int>, string>(c =>
                                                                                    WidgetUtils.TruncateText(c.First, nameLabel.Bounds.Width - c.Second, nameFont));

                nameLabel.GetText = () =>
                {
                    var suffix = pp.WinState == WinState.Undefined ? "" : " (" + pp.WinState + ")";
                    if (client != null && client.State == Session.ClientState.Disconnected)
                    {
                        suffix = " (Gone)";
                    }

                    var sl = suffixLength.Update(suffix);
                    return(name.Update(Pair.New(pp.PlayerName, sl)) + suffix);
                };
                nameLabel.GetColor = () => pp.Color.RGB;

                var flag = item.Get <ImageWidget>("FACTIONFLAG");
                flag.GetImageCollection = () => "flags";
                if (player == null || player.Stances[pp] == Stance.Ally || player.WinState != WinState.Undefined)
                {
                    flag.GetImageName = () => pp.Faction.InternalName;
                    item.Get <LabelWidget>("FACTION").GetText = () => pp.Faction.Name;
                }
                else
                {
                    flag.GetImageName = () => pp.DisplayFaction.InternalName;
                    item.Get <LabelWidget>("FACTION").GetText = () => pp.DisplayFaction.Name;
                }

                var team       = item.Get <LabelWidget>("TEAM");
                var teamNumber = pp.PlayerReference.Playable ? ((client == null) ? 0 : client.Team) : pp.PlayerReference.Team;
                team.GetText = () => (teamNumber == 0) ? "-" : teamNumber.ToString();
                playerPanel.AddChild(item);

                var stats = pp.PlayerActor.TraitOrDefault <PlayerStatistics>();
                if (stats == null)
                {
                    break;
                }
                var totalKills  = stats.UnitsKilled + stats.BuildingsKilled;
                var totalDeaths = stats.UnitsDead + stats.BuildingsDead;
                item.Get <LabelWidget>("KILLS").GetText  = () => totalKills.ToString();
                item.Get <LabelWidget>("DEATHS").GetText = () => totalDeaths.ToString();
            }
        }