Exemplo n.º 1
0
        private static Profile ConvertProfiles(HumanoidCharacterProfile humanoid, int slot)
        {
            var appearance = (HumanoidCharacterAppearance)humanoid.CharacterAppearance;

            var entity = new Profile
            {
                CharacterName         = humanoid.Name,
                Age                   = humanoid.Age,
                Sex                   = humanoid.Sex.ToString(),
                HairName              = appearance.HairStyleName,
                HairColor             = appearance.HairColor.ToHex(),
                FacialHairName        = appearance.FacialHairStyleName,
                FacialHairColor       = appearance.FacialHairColor.ToHex(),
                EyeColor              = appearance.EyeColor.ToHex(),
                SkinColor             = appearance.SkinColor.ToHex(),
                Slot                  = slot,
                PreferenceUnavailable = (DbPreferenceUnavailableMode)humanoid.PreferenceUnavailable
            };

            entity.Jobs.AddRange(
                humanoid.JobPriorities
                .Where(j => j.Value != JobPriority.Never)
                .Select(j => new Job {
                JobName = j.Key, Priority = (DbJobPriority)j.Value
            })
                );
            entity.Antags.AddRange(
                humanoid.AntagPreferences
                .Select(a => new Antag {
                AntagName = a
            })
                );

            return(entity);
        }
 public ChangedHumanoidAppearanceEvent(HumanoidCharacterProfile profile)
 {
     Appearance = profile.Appearance;
     Sex        = profile.Sex;
     Gender     = profile.Gender;
     Species    = profile.Species;
 }
Exemplo n.º 3
0
        private async void HandleUpdateCharacterMessage(MsgUpdateCharacter message)
        {
            var slot    = message.Slot;
            var profile = message.Profile;
            var userId  = message.MsgChannel.UserId;

            if (!_cachedPlayerPrefs.TryGetValue(userId, out var prefsData) || !prefsData.PrefsLoaded.IsCompleted)
            {
                Logger.WarningS("prefs", $"User {userId} tried to modify preferences before they loaded.");
                return;
            }

            if (slot < 0 || slot >= MaxCharacterSlots)
            {
                return;
            }

            var curPrefs = prefsData.Prefs !;

            var arr = new ICharacterProfile[MaxCharacterSlots];

            curPrefs.Characters.ToList().CopyTo(arr, 0);

            arr[slot] = HumanoidCharacterProfile.EnsureValid((HumanoidCharacterProfile)profile, _protos);

            prefsData.Prefs = new PlayerPreferences(arr, slot);

            if (ShouldStorePrefs(message.MsgChannel.AuthType))
            {
                await _db.SaveCharacterSlotAsync(message.MsgChannel.UserId, message.Profile, message.Slot);
            }
        }
 private void RandomizeEverything()
 {
     Profile = HumanoidCharacterProfile.Random();
     UpdateSexControls();
     UpdateAgeEdit();
     UpdateNameEdit();
     UpdateHairPickers();
 }
    public static Dictionary <NetUserId, HumanoidCharacterProfile> AddJob(
        this Dictionary <NetUserId, HumanoidCharacterProfile> inp, string jobId, JobPriority prio = JobPriority.Medium,
        int amount = 1)
    {
        for (var i = 0; i < amount; i++)
        {
            inp.Add(new NetUserId(Guid.NewGuid()), HumanoidCharacterProfile.Random().WithJobPriority(jobId, prio));
        }

        return(inp);
    }
        private async Task <PlayerPreferences> GetOrCreatePreferencesAsync(NetUserId userId)
        {
            var prefs = await _db.GetPlayerPreferencesAsync(userId);

            if (prefs is null)
            {
                return(await _db.InitPrefsAsync(userId, HumanoidCharacterProfile.Default()));
            }

            return(prefs);
        }
        private void RandomizeEverything()
        {
            Profile = HumanoidCharacterProfile.Random();
            UpdateSexControls();
            UpdateGenderControls();
            UpdateClothingControls();
            UpdateAgeEdit();
            UpdateNameEdit();
            UpdateHairPickers();
            UpdateEyePickers();

            _skinColor.Value = _random.Next(0, 100);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Retrieves preferences for the given username from storage.
        /// Creates and saves default preferences if they are not found, then returns them.
        /// </summary>
        public PlayerPreferences GetPreferences(string username)
        {
            var prefs = GetFromSql(username);

            if (prefs is null)
            {
                _preferencesDb.SaveSelectedCharacterIndex(username, 0);
                _preferencesDb.SaveCharacterSlot(username, HumanoidCharacterProfile.Default(), 0);
                prefs = GetFromSql(username);
            }

            return(prefs);
        }
    private void OnMapInit(EntityUid uid, RandomHumanoidAppearanceComponent component, MapInitEvent args)
    {
        if (TryComp <HumanoidAppearanceComponent>(uid, out var appearance))
        {
            var profile = HumanoidCharacterProfile.Random();
            _humanoidAppearance.UpdateFromProfile(uid, profile, appearance);

            if (component.RandomizeName)
            {
                var meta = MetaData(uid);
                meta.EntityName = profile.Name;
            }
        }
    }
        /// <summary>
        /// Retrieves preferences for the given username from storage.
        /// Creates and saves default preferences if they are not found, then returns them.
        /// </summary>
        public async Task <PlayerPreferences> GetPreferencesAsync(string username)
        {
            var prefs = await GetFromSql(username);

            if (prefs is null)
            {
                await _preferencesDb.SaveSelectedCharacterIndexAsync(username, 0);

                await _preferencesDb.SaveCharacterSlotAsync(username, HumanoidCharacterProfile.Default(), 0);

                prefs = await GetFromSql(username);
            }

            return(prefs);
        }
Exemplo n.º 11
0
        private static Profile ConvertProfiles(HumanoidCharacterProfile humanoid, int slot)
        {
            var           appearance     = (HumanoidCharacterAppearance)humanoid.CharacterAppearance;
            List <string> markingStrings = new();

            foreach (var marking in appearance.Markings)
            {
                markingStrings.Add(marking.ToString());
            }
            var markings = JsonSerializer.SerializeToDocument(markingStrings);

            var entity = new Profile
            {
                CharacterName         = humanoid.Name,
                FlavorText            = humanoid.FlavorText,
                Species               = humanoid.Species,
                Age                   = humanoid.Age,
                Sex                   = humanoid.Sex.ToString(),
                Gender                = humanoid.Gender.ToString(),
                HairName              = appearance.HairStyleId,
                HairColor             = appearance.HairColor.ToHex(),
                FacialHairName        = appearance.FacialHairStyleId,
                FacialHairColor       = appearance.FacialHairColor.ToHex(),
                EyeColor              = appearance.EyeColor.ToHex(),
                SkinColor             = appearance.SkinColor.ToHex(),
                Clothing              = humanoid.Clothing.ToString(),
                Backpack              = humanoid.Backpack.ToString(),
                Markings              = markings,
                Slot                  = slot,
                PreferenceUnavailable = (DbPreferenceUnavailableMode)humanoid.PreferenceUnavailable
            };

            entity.Jobs.AddRange(
                humanoid.JobPriorities
                .Where(j => j.Value != JobPriority.Never)
                .Select(j => new Job {
                JobName = j.Key, Priority = (DbJobPriority)j.Value
            })
                );
            entity.Antags.AddRange(
                humanoid.AntagPreferences
                .Select(a => new Antag {
                AntagName = a
            })
                );

            return(entity);
        }
        public async Task TestDeleteCharacter()
        {
            var db       = GetDb();
            var username = new NetUserId(new Guid("640bd619-fc8d-4fe2-bf3c-4a5fb17d6ddd"));
            await db.InitPrefsAsync(username, HumanoidCharacterProfile.Default());

            await db.SaveCharacterSlotAsync(username, CharlieCharlieson(), 1);

            await db.SaveSelectedCharacterIndexAsync(username, 1);

            await db.SaveCharacterSlotAsync(username, null, 1);

            var prefs = await db.GetPlayerPreferencesAsync(username);

            Assert.That(!prefs.Characters.Any(p => p.Key != 0));
        }
Exemplo n.º 13
0
        public CharacterSetupGui(
            IEntityManager entityManager,
            IResourceCache resourceCache,
            IClientPreferencesManager preferencesManager,
            IPrototypeManager prototypeManager,
            IConfigurationManager configurationManager)
        {
            RobustXamlLoader.Load(this);
            _entityManager        = entityManager;
            _prototypeManager     = prototypeManager;
            _preferencesManager   = preferencesManager;
            _configurationManager = configurationManager;

            var panelTex = resourceCache.GetTexture("/Textures/Interface/Nano/button.svg.96dpi.png");
            var back     = new StyleBoxTexture
            {
                Texture  = panelTex,
                Modulate = new Color(37, 37, 42)
            };

            back.SetPatchMargin(StyleBox.Margin.All, 10);

            BackgroundPanel.PanelOverride = back;

            _createNewCharacterButton = new Button
            {
                Text = Loc.GetString("character-setup-gui-create-new-character-button"),
            };
            _createNewCharacterButton.OnPressed += args =>
            {
                preferencesManager.CreateCharacter(HumanoidCharacterProfile.Random());
                UpdateUI();
                args.Event.Handle();
            };

            _humanoidProfileEditor = new HumanoidProfileEditor(preferencesManager, prototypeManager, entityManager, configurationManager);
            _humanoidProfileEditor.OnProfileChanged += ProfileChanged;
            CharEditor.AddChild(_humanoidProfileEditor);

            UpdateUI();

            RulesButton.OnPressed += _ => new RulesAndInfoWindow().Open();
            preferencesManager.OnServerDataLoaded += UpdateUI;
        }
        public async Task TestDeleteCharacter()
        {
            var db       = GetDb();
            var username = new NetUserId(new Guid("640bd619-fc8d-4fe2-bf3c-4a5fb17d6ddd"));

            IoCManager.Resolve <ISerializationManager>().Initialize();
            IoCManager.Resolve <IPrototypeManager>().LoadFromStream(new StringReader(Prototypes));
            await db.InitPrefsAsync(username, HumanoidCharacterProfile.Default());

            await db.SaveCharacterSlotAsync(username, CharlieCharlieson(), 1);

            await db.SaveSelectedCharacterIndexAsync(username, 1);

            await db.SaveCharacterSlotAsync(username, null, 1);

            var prefs = await db.GetPlayerPreferencesAsync(username);

            Assert.That(!prefs.Characters.Any(p => p.Key != 0));
        }
Exemplo n.º 15
0
        private string PickBestAvailableJob(HumanoidCharacterProfile profile)
        {
            var available = GetAvailablePositions();

            bool TryPick(JobPriority priority, out string jobId)
            {
                var filtered = profile.JobPriorities
                               .Where(p => p.Value == priority)
                               .Select(p => p.Key)
                               .ToList();

                while (filtered.Count != 0)
                {
                    jobId = _robustRandom.Pick(filtered);
                    if (available.GetValueOrDefault(jobId, 0) > 0)
                    {
                        return(true);
                    }

                    filtered.Remove(jobId);
                }

                jobId = default;
                return(false);
            }

            if (TryPick(JobPriority.High, out var picked))
            {
                return(picked);
            }

            if (TryPick(JobPriority.Medium, out picked))
            {
                return(picked);
            }

            if (TryPick(JobPriority.Low, out picked))
            {
                return(picked);
            }

            return(OverflowJob);
        }
        public async void OnClientConnected(IPlayerSession session)
        {
            if (!ShouldStorePrefs(session.ConnectedClient.AuthType))
            {
                // Don't store data for guests.
                var prefsData = new PlayerPrefData
                {
                    PrefsLoaded = Task.CompletedTask,
                    Prefs       = new PlayerPreferences(
                        new[] { new KeyValuePair <int, ICharacterProfile>(0, HumanoidCharacterProfile.Default()) },
                        0)
                };

                _cachedPlayerPrefs[session.UserId] = prefsData;
            }
            else
            {
                var prefsData = new PlayerPrefData();
                var loadTask  = LoadPrefs();
                prefsData.PrefsLoaded = loadTask;
                _cachedPlayerPrefs[session.UserId] = prefsData;

                await loadTask;

                async Task LoadPrefs()
                {
                    var prefs = await GetOrCreatePreferencesAsync(session.UserId);

                    prefsData.Prefs = prefs;

                    var msg = _netManager.CreateNetMessage <MsgPreferencesAndSettings>();

                    msg.Preferences = prefs;
                    msg.Settings    = new GameSettings
                    {
                        MaxCharacterSlots = MaxCharacterSlots
                    };
                    _netManager.ServerSendMessage(msg, session.ConnectedClient);
                }
            }
        }
        private async void HandleUpdateCharacterMessage(MsgUpdateCharacter message)
        {
            var slot    = message.Slot;
            var profile = message.Profile;
            var userId  = message.MsgChannel.UserId;

            if (profile == null)
            {
                Logger.WarningS("prefs",
                                $"User {userId} sent a {nameof(MsgUpdateCharacter)} with a null profile in slot {slot}.");
                return;
            }

            if (!_cachedPlayerPrefs.TryGetValue(userId, out var prefsData) || !prefsData.PrefsLoaded.IsCompleted)
            {
                Logger.WarningS("prefs", $"User {userId} tried to modify preferences before they loaded.");
                return;
            }

            if (slot < 0 || slot >= MaxCharacterSlots)
            {
                return;
            }

            var curPrefs = prefsData.Prefs !;

            var profiles = new Dictionary <int, ICharacterProfile>(curPrefs.Characters)
            {
                [slot] = HumanoidCharacterProfile.EnsureValid((HumanoidCharacterProfile)profile, _protos)
            };

            prefsData.Prefs = new PlayerPreferences(profiles, slot);

            if (ShouldStorePrefs(message.MsgChannel.AuthType))
            {
                await _db.SaveCharacterSlotAsync(message.MsgChannel.UserId, message.Profile, message.Slot);
            }
        }
        public HumanoidProfileEditor(IClientPreferencesManager preferencesManager, IPrototypeManager prototypeManager)
        {
            _random = IoCManager.Resolve <IRobustRandom>();

            _preferencesManager = preferencesManager;

            var margin = new MarginContainer
            {
                MarginTopOverride    = 10,
                MarginBottomOverride = 10,
                MarginLeftOverride   = 10,
                MarginRightOverride  = 10
            };

            AddChild(margin);

            var vBox = new VBoxContainer();

            margin.AddChild(vBox);

            var middleContainer = new HBoxContainer
            {
                SeparationOverride = 10
            };

            vBox.AddChild(middleContainer);

            var leftColumn = new VBoxContainer();

            middleContainer.AddChild(leftColumn);

            #region Randomize

            {
                var panel = HighlightedContainer();
                var randomizeEverythingButton = new Button
                {
                    Text = Loc.GetString("Randomize everything")
                };
                randomizeEverythingButton.OnPressed += args => { RandomizeEverything(); };
                panel.AddChild(randomizeEverythingButton);
                leftColumn.AddChild(panel);
            }

            #endregion Randomize

            #region Name

            {
                var panel = HighlightedContainer();
                var hBox  = new HBoxContainer
                {
                    SizeFlagsVertical = SizeFlags.FillExpand
                };
                var nameLabel = new Label {
                    Text = Loc.GetString("Name:")
                };
                _nameEdit = new LineEdit
                {
                    CustomMinimumSize = (270, 0),
                    SizeFlagsVertical = SizeFlags.ShrinkCenter
                };
                _nameEdit.OnTextChanged += args => { SetName(args.Text); };
                var nameRandomButton = new Button
                {
                    Text = Loc.GetString("Randomize"),
                };
                nameRandomButton.OnPressed += args => RandomizeName();
                hBox.AddChild(nameLabel);
                hBox.AddChild(_nameEdit);
                hBox.AddChild(nameRandomButton);
                panel.AddChild(hBox);
                leftColumn.AddChild(panel);
            }

            #endregion Name

            var tabContainer = new TabContainer {
                SizeFlagsVertical = SizeFlags.FillExpand
            };
            vBox.AddChild(tabContainer);

            #region Appearance

            {
                var appearanceVBox = new VBoxContainer();
                tabContainer.AddChild(appearanceVBox);
                tabContainer.SetTabTitle(0, Loc.GetString("Appearance"));

                var sexAndAgeRow = new HBoxContainer
                {
                    SeparationOverride = 10
                };

                appearanceVBox.AddChild(sexAndAgeRow);

                #region Sex

                {
                    var panel    = HighlightedContainer();
                    var hBox     = new HBoxContainer();
                    var sexLabel = new Label {
                        Text = Loc.GetString("Sex:")
                    };

                    var sexButtonGroup = new ButtonGroup();

                    _sexMaleButton = new Button
                    {
                        Text  = Loc.GetString("Male"),
                        Group = sexButtonGroup
                    };
                    _sexMaleButton.OnPressed += args => { SetSex(Sex.Male); };
                    _sexFemaleButton          = new Button
                    {
                        Text  = Loc.GetString("Female"),
                        Group = sexButtonGroup
                    };
                    _sexFemaleButton.OnPressed += args => { SetSex(Sex.Female); };
                    hBox.AddChild(sexLabel);
                    hBox.AddChild(_sexMaleButton);
                    hBox.AddChild(_sexFemaleButton);
                    panel.AddChild(hBox);
                    sexAndAgeRow.AddChild(panel);
                }

                #endregion Sex

                #region Age

                {
                    var panel    = HighlightedContainer();
                    var hBox     = new HBoxContainer();
                    var ageLabel = new Label {
                        Text = Loc.GetString("Age:")
                    };
                    _ageEdit = new LineEdit {
                        CustomMinimumSize = (40, 0)
                    };
                    _ageEdit.OnTextChanged += args =>
                    {
                        if (!int.TryParse(args.Text, out var newAge))
                        {
                            return;
                        }
                        SetAge(newAge);
                    };
                    hBox.AddChild(ageLabel);
                    hBox.AddChild(_ageEdit);
                    panel.AddChild(hBox);
                    sexAndAgeRow.AddChild(panel);
                }

                #endregion Age

                #region Hair

                {
                    var panel = HighlightedContainer();
                    panel.SizeFlagsHorizontal = SizeFlags.None;
                    var hairHBox = new HBoxContainer();

                    _hairPicker = new HairStylePicker();
                    _hairPicker.Populate();

                    _hairPicker.OnHairStylePicked += newStyle =>
                    {
                        if (Profile is null)
                        {
                            return;
                        }
                        Profile = Profile.WithCharacterAppearance(
                            Profile.Appearance.WithHairStyleName(newStyle));
                        IsDirty = true;
                    };

                    _hairPicker.OnHairColorPicked += newColor =>
                    {
                        if (Profile is null)
                        {
                            return;
                        }
                        Profile = Profile.WithCharacterAppearance(
                            Profile.Appearance.WithHairColor(newColor));
                        IsDirty = true;
                    };

                    _facialHairPicker = new FacialHairStylePicker();
                    _facialHairPicker.Populate();

                    _facialHairPicker.OnHairStylePicked += newStyle =>
                    {
                        if (Profile is null)
                        {
                            return;
                        }
                        Profile = Profile.WithCharacterAppearance(
                            Profile.Appearance.WithFacialHairStyleName(newStyle));
                        IsDirty = true;
                    };

                    _facialHairPicker.OnHairColorPicked += newColor =>
                    {
                        if (Profile is null)
                        {
                            return;
                        }
                        Profile = Profile.WithCharacterAppearance(
                            Profile.Appearance.WithFacialHairColor(newColor));
                        IsDirty = true;
                    };

                    hairHBox.AddChild(_hairPicker);
                    hairHBox.AddChild(_facialHairPicker);

                    panel.AddChild(hairHBox);
                    appearanceVBox.AddChild(panel);
                }

                #endregion Hair
            }

            #endregion

            #region Jobs

            {
                var jobList = new VBoxContainer();

                var jobVBox = new VBoxContainer
                {
                    Children =
                    {
                        (_preferenceUnavailableButton = new OptionButton()),
                        new ScrollContainer
                        {
                            SizeFlagsVertical = SizeFlags.FillExpand,
                            Children          =
                            {
                                jobList
                            }
                        }
                    }
                };

                tabContainer.AddChild(jobVBox);

                tabContainer.SetTabTitle(1, Loc.GetString("Jobs"));

                _preferenceUnavailableButton.AddItem(
                    Loc.GetString("Stay in lobby if preference unavailable."),
                    (int)PreferenceUnavailableMode.StayInLobby);
                _preferenceUnavailableButton.AddItem(
                    Loc.GetString("Be an {0} if preference unavailable.",
                                  Loc.GetString(SharedGameTicker.OverflowJobName)),
                    (int)PreferenceUnavailableMode.SpawnAsOverflow);

                _preferenceUnavailableButton.OnItemSelected += args =>
                {
                    _preferenceUnavailableButton.SelectId(args.Id);

                    Profile = Profile.WithPreferenceUnavailable((PreferenceUnavailableMode)args.Id);
                    IsDirty = true;
                };

                _jobPriorities = new List <JobPrioritySelector>();

                foreach (var job in prototypeManager.EnumeratePrototypes <JobPrototype>().OrderBy(j => j.Name))
                {
                    var selector = new JobPrioritySelector(job);
                    jobList.AddChild(selector);
                    _jobPriorities.Add(selector);

                    selector.PriorityChanged += priority =>
                    {
                        Profile = Profile.WithJobPriority(job.ID, priority);
                        IsDirty = true;

                        if (priority == JobPriority.High)
                        {
                            // Lower any other high priorities to medium.
                            foreach (var jobSelector in _jobPriorities)
                            {
                                if (jobSelector != selector && jobSelector.Priority == JobPriority.High)
                                {
                                    jobSelector.Priority = JobPriority.Medium;
                                    Profile = Profile.WithJobPriority(jobSelector.Job.ID, JobPriority.Medium);
                                }
                            }
                        }
                    };
                }
            }

            #endregion

            #region Antags

            {
                var antagList = new VBoxContainer();

                var antagVBox = new VBoxContainer
                {
                    Children =
                    {
                        new ScrollContainer
                        {
                            SizeFlagsVertical = SizeFlags.FillExpand,
                            Children          =
                            {
                                antagList
                            }
                        }
                    }
                };

                tabContainer.AddChild(antagVBox);

                tabContainer.SetTabTitle(2, Loc.GetString("Antags"));

                _antagPreferences = new List <AntagPreferenceSelector>();

                foreach (var antag in prototypeManager.EnumeratePrototypes <AntagPrototype>().OrderBy(a => a.Name))
                {
                    if (!antag.SetPreference)
                    {
                        continue;
                    }
                    var selector = new AntagPreferenceSelector(antag);
                    antagList.AddChild(selector);
                    _antagPreferences.Add(selector);

                    selector.PreferenceChanged += preference =>
                    {
                        Profile = Profile.WithAntagPreference(antag.ID, preference);
                        IsDirty = true;
                    };
                }
            }

            #endregion

            var rightColumn = new VBoxContainer();
            middleContainer.AddChild(rightColumn);

            #region Import/Export

            {
                var panelContainer = HighlightedContainer();
                var hBox           = new HBoxContainer();
                var importButton   = new Button
                {
                    Text     = Loc.GetString("Import"),
                    Disabled = true,
                    ToolTip  = "Not yet implemented!"
                };
                var exportButton = new Button
                {
                    Text     = Loc.GetString("Export"),
                    Disabled = true,
                    ToolTip  = "Not yet implemented!"
                };
                hBox.AddChild(importButton);
                hBox.AddChild(exportButton);
                panelContainer.AddChild(hBox);
                rightColumn.AddChild(panelContainer);
            }

            #endregion Import/Export

            #region Save

            {
                var panel = HighlightedContainer();
                _saveButton = new Button
                {
                    Text = Loc.GetString("Save"),
                    SizeFlagsHorizontal = SizeFlags.ShrinkCenter
                };
                _saveButton.OnPressed += args => { Save(); };
                panel.AddChild(_saveButton);
                rightColumn.AddChild(panel);
            }

            #endregion Save

            if (preferencesManager.ServerDataLoaded)
            {
                LoadServerData();
            }

            preferencesManager.OnServerDataLoaded += LoadServerData;

            IsDirty = false;
        }
 private void SetName(string newName)
 {
     Profile = Profile?.WithName(newName);
     IsDirty = true;
 }
 private void SetSex(Sex newSex)
 {
     Profile = Profile?.WithSex(newSex);
     IsDirty = true;
 }
 private void SetAge(int newAge)
 {
     Profile = Profile?.WithAge(newAge);
     IsDirty = true;
 }
 private void LoadServerData()
 {
     Profile       = (HumanoidCharacterProfile)_preferencesManager.Preferences.SelectedCharacter;
     CharacterSlot = _preferencesManager.Preferences.SelectedCharacterIndex;
     UpdateControls();
 }
Exemplo n.º 23
0
        public async Task CreateDeleteCreateTest()
        {
            var serverOptions = new ServerContentIntegrationOption
            {
                CVarOverrides =
                {
                    [CCVars.GameDummyTicker.Name]  = "false",
                    [CCVars.GameLobbyEnabled.Name] = "true",
                    [CVars.NetPVS.Name]            = "false"
                }
            };

            var(client, server) = await StartConnectedServerClientPair(serverOptions : serverOptions);

            var clientNetManager   = client.ResolveDependency <IClientNetManager>();
            var clientStateManager = client.ResolveDependency <IStateManager>();
            var clientPrefManager  = client.ResolveDependency <IClientPreferencesManager>();

            var serverConfig      = server.ResolveDependency <IConfigurationManager>();
            var serverTicker      = server.ResolveDependency <IEntitySystemManager>().GetEntitySystem <GameTicker>();
            var serverPrefManager = server.ResolveDependency <IServerPreferencesManager>();

            await server.WaitIdleAsync();

            await client.WaitIdleAsync();

            await server.WaitAssertion(() =>
            {
                serverConfig.SetCVar(CCVars.GameDummyTicker, false);
                serverConfig.SetCVar(CCVars.GameLobbyEnabled, true);
                serverTicker.RestartRound();

                Assert.That(serverTicker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby));
            });

            // Need to run them in sync to receive the messages.
            await RunTicksSync(client, server, 1);

            await WaitUntil(client, () => clientStateManager.CurrentState is LobbyState, 600);

            Assert.NotNull(clientNetManager.ServerChannel);

            var clientNetId = clientNetManager.ServerChannel.UserId;
            HumanoidCharacterProfile profile = null;

            await client.WaitAssertion(() =>
            {
                clientPrefManager.SelectCharacter(0);

                var clientCharacters = clientPrefManager.Preferences?.Characters;
                Assert.That(clientCharacters, Is.Not.Null);
                Assert.That(clientCharacters.Count, Is.EqualTo(1));

                Assert.That(clientStateManager.CurrentState, Is.TypeOf <LobbyState>());

                profile = HumanoidCharacterProfile.Random();
                clientPrefManager.CreateCharacter(profile);

                clientCharacters = clientPrefManager.Preferences?.Characters;

                Assert.That(clientCharacters, Is.Not.Null);
                Assert.That(clientCharacters.Count, Is.EqualTo(2));
                Assert.That(clientCharacters[1].MemberwiseEquals(profile));
            });

            await WaitUntil(server, () => serverPrefManager.GetPreferences(clientNetId).Characters.Count == 2, maxTicks : 60);

            await server.WaitAssertion(() =>
            {
                var serverCharacters = serverPrefManager.GetPreferences(clientNetId).Characters;

                Assert.That(serverCharacters.Count, Is.EqualTo(2));
                Assert.That(serverCharacters[1].MemberwiseEquals(profile));
            });

            await client.WaitAssertion(() =>
            {
                clientPrefManager.DeleteCharacter(1);

                var clientCharacters = clientPrefManager.Preferences?.Characters.Count;
                Assert.That(clientCharacters, Is.EqualTo(1));
            });

            await WaitUntil(server, () => serverPrefManager.GetPreferences(clientNetId).Characters.Count == 1, maxTicks : 60);

            await server.WaitAssertion(() =>
            {
                var serverCharacters = serverPrefManager.GetPreferences(clientNetId).Characters.Count;
                Assert.That(serverCharacters, Is.EqualTo(1));
            });

            await client.WaitIdleAsync();

            await client.WaitAssertion(() =>
            {
                profile = HumanoidCharacterProfile.Random();

                clientPrefManager.CreateCharacter(profile);

                var clientCharacters = clientPrefManager.Preferences?.Characters;

                Assert.That(clientCharacters, Is.Not.Null);
                Assert.That(clientCharacters.Count, Is.EqualTo(2));
                Assert.That(clientCharacters[1].MemberwiseEquals(profile));
            });

            await WaitUntil(server, () => serverPrefManager.GetPreferences(clientNetId).Characters.Count == 2, maxTicks : 60);

            await server.WaitAssertion(() =>
            {
                var serverCharacters = serverPrefManager.GetPreferences(clientNetId).Characters;

                Assert.That(serverCharacters.Count, Is.EqualTo(2));
                Assert.That(serverCharacters[1].MemberwiseEquals(profile));
            });
        }
Exemplo n.º 24
0
 public void EquipStartingGear(IEntity entity, StartingGearPrototype startingGear, HumanoidCharacterProfile profile)
 {
 }
Exemplo n.º 25
0
 public ClonerDNAEntry(Mind.Mind m, HumanoidCharacterProfile hcp)
 {
     Mind    = m;
     Profile = hcp;
 }
Exemplo n.º 26
0
        public async Task CreateDeleteCreateTest()
        {
            var(client, server) = await StartConnectedServerClientPair();

            var clientNetManager   = client.ResolveDependency <IClientNetManager>();
            var clientStateManager = client.ResolveDependency <IStateManager>();
            var clientPrefManager  = client.ResolveDependency <IClientPreferencesManager>();

            var serverConfig      = server.ResolveDependency <IConfigurationManager>();
            var serverTicker      = server.ResolveDependency <IGameTicker>();
            var serverPrefManager = server.ResolveDependency <IServerPreferencesManager>();

            await server.WaitIdleAsync();

            await client.WaitIdleAsync();

            await server.WaitAssertion(() =>
            {
                serverConfig.SetCVar(CCVars.GameLobbyEnabled, true);
                serverTicker.RestartRound();
            });

            Assert.That(serverTicker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby));

            await WaitUntil(client, () => clientStateManager.CurrentState is LobbyState, maxTicks : 60);

            Assert.NotNull(clientNetManager.ServerChannel);

            var clientNetId = clientNetManager.ServerChannel.UserId;
            HumanoidCharacterProfile profile = null;

            await client.WaitAssertion(() =>
            {
                clientPrefManager.SelectCharacter(0);

                var clientCharacters = clientPrefManager.Preferences.Characters;
                Assert.That(clientCharacters.Count, Is.EqualTo(1));

                Assert.That(clientStateManager.CurrentState, Is.TypeOf <LobbyState>());

                profile = HumanoidCharacterProfile.Random();
                clientPrefManager.CreateCharacter(profile);

                clientCharacters = clientPrefManager.Preferences.Characters;

                Assert.That(clientCharacters.Count, Is.EqualTo(2));
                Assert.That(clientCharacters[1].MemberwiseEquals(profile));
            });

            await WaitUntil(server, () => serverPrefManager.GetPreferences(clientNetId).Characters.Count == 2, maxTicks : 60);

            await server.WaitAssertion(() =>
            {
                var serverCharacters = serverPrefManager.GetPreferences(clientNetId).Characters;

                Assert.That(serverCharacters.Count, Is.EqualTo(2));
                Assert.That(serverCharacters[1].MemberwiseEquals(profile));
            });

            await client.WaitAssertion(() =>
            {
                clientPrefManager.DeleteCharacter(1);

                var clientCharacters = clientPrefManager.Preferences.Characters.Count;
                Assert.That(clientCharacters, Is.EqualTo(1));
            });

            await WaitUntil(server, () => serverPrefManager.GetPreferences(clientNetId).Characters.Count == 1, maxTicks : 60);

            await server.WaitAssertion(() =>
            {
                var serverCharacters = serverPrefManager.GetPreferences(clientNetId).Characters.Count;
                Assert.That(serverCharacters, Is.EqualTo(1));
            });

            await client.WaitIdleAsync();

            await client.WaitAssertion(() =>
            {
                profile = HumanoidCharacterProfile.Random();

                clientPrefManager.CreateCharacter(profile);

                var clientCharacters = clientPrefManager.Preferences.Characters;

                Assert.That(clientCharacters.Count, Is.EqualTo(2));
                Assert.That(clientCharacters[1].MemberwiseEquals(profile));
            });

            await WaitUntil(server, () => serverPrefManager.GetPreferences(clientNetId).Characters.Count == 2, maxTicks : 60);

            await server.WaitAssertion(() =>
            {
                var serverCharacters = serverPrefManager.GetPreferences(clientNetId).Characters;

                Assert.That(serverCharacters.Count, Is.EqualTo(2));
                Assert.That(serverCharacters[1].MemberwiseEquals(profile));
            });
        }
 private void NameChanged(string newName)
 {
     Profile = Profile?.WithName(newName);
     IsDirty = true;
 }
        public async Task CreateDeleteCreateTest()
        {
            await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings { InLobby = true });

            var server = pairTracker.Pair.Server;
            var client = pairTracker.Pair.Client;

            var clientNetManager   = client.ResolveDependency <IClientNetManager>();
            var clientStateManager = client.ResolveDependency <IStateManager>();
            var clientPrefManager  = client.ResolveDependency <IClientPreferencesManager>();

            var serverPrefManager = server.ResolveDependency <IServerPreferencesManager>();


            // Need to run them in sync to receive the messages.
            await PoolManager.RunTicksSync(pairTracker.Pair, 1);

            await PoolManager.WaitUntil(client, () => clientStateManager.CurrentState is LobbyState, 600);

            Assert.NotNull(clientNetManager.ServerChannel);

            var clientNetId = clientNetManager.ServerChannel.UserId;
            HumanoidCharacterProfile profile = null;

            await client.WaitAssertion(() =>
            {
                clientPrefManager.SelectCharacter(0);

                var clientCharacters = clientPrefManager.Preferences?.Characters;
                Assert.That(clientCharacters, Is.Not.Null);
                Assert.That(clientCharacters.Count, Is.EqualTo(1));

                Assert.That(clientStateManager.CurrentState, Is.TypeOf <LobbyState>());

                profile = HumanoidCharacterProfile.Random();
                clientPrefManager.CreateCharacter(profile);

                clientCharacters = clientPrefManager.Preferences?.Characters;

                Assert.That(clientCharacters, Is.Not.Null);
                Assert.That(clientCharacters.Count, Is.EqualTo(2));
                Assert.That(clientCharacters[1].MemberwiseEquals(profile));
            });

            await PoolManager.WaitUntil(server, () => serverPrefManager.GetPreferences(clientNetId).Characters.Count == 2, maxTicks : 60);

            await server.WaitAssertion(() =>
            {
                var serverCharacters = serverPrefManager.GetPreferences(clientNetId).Characters;

                Assert.That(serverCharacters.Count, Is.EqualTo(2));
                Assert.That(serverCharacters[1].MemberwiseEquals(profile));
            });

            await client.WaitAssertion(() =>
            {
                clientPrefManager.DeleteCharacter(1);

                var clientCharacters = clientPrefManager.Preferences?.Characters.Count;
                Assert.That(clientCharacters, Is.EqualTo(1));
            });

            await PoolManager.WaitUntil(server, () => serverPrefManager.GetPreferences(clientNetId).Characters.Count == 1, maxTicks : 60);

            await server.WaitAssertion(() =>
            {
                var serverCharacters = serverPrefManager.GetPreferences(clientNetId).Characters.Count;
                Assert.That(serverCharacters, Is.EqualTo(1));
            });

            await client.WaitIdleAsync();

            await client.WaitAssertion(() =>
            {
                profile = HumanoidCharacterProfile.Random();

                clientPrefManager.CreateCharacter(profile);

                var clientCharacters = clientPrefManager.Preferences?.Characters;

                Assert.That(clientCharacters, Is.Not.Null);
                Assert.That(clientCharacters.Count, Is.EqualTo(2));
                Assert.That(clientCharacters[1].MemberwiseEquals(profile));
            });

            await PoolManager.WaitUntil(server, () => serverPrefManager.GetPreferences(clientNetId).Characters.Count == 2, maxTicks : 60);

            await server.WaitAssertion(() =>
            {
                var serverCharacters = serverPrefManager.GetPreferences(clientNetId).Characters;

                Assert.That(serverCharacters.Count, Is.EqualTo(2));
                Assert.That(serverCharacters[1].MemberwiseEquals(profile));
            });

            await pairTracker.CleanReturnAsync();
        }