Beispiel #1
0
        private void RefreshContextForPartyMembers(ICharacter character)
        {
            if (!this.IsSharedWithPartyAndFactionMembers)
            {
                return;
            }

            var partyMembers = PartySystem.ServerGetPartyMembersReadOnly(character);

            if (partyMembers.Count <= 1)
            {
                // no party or single-player party
                return;
            }

            var currentCharacterName = character.Name;

            foreach (var partyMemberName in partyMembers)
            {
                if (partyMemberName == currentCharacterName)
                {
                    continue;
                }

                var partyMember = Api.Server.Characters
                                  .GetPlayerCharacter(partyMemberName);

                if (partyMember is not null)
                {
                    var context = this.GetActiveContext(partyMember, out _);
                    context?.Refresh();
                }
            }
        }
Beispiel #2
0
        public override IEnumerable <ICharacter> ServerEnumerateMessageRecepients(ICharacter forPlayer)
        {
            var members = PartySystem.ServerGetPartyMembersReadOnly(this.Party);

            foreach (var member in members)
            {
                var character = CharactersServerService.GetPlayerCharacter(member);
                if (character != null)
                {
                    yield return(character);
                }
            }
        }
        private void ServerPartyClanTagChanged(ILogicObject party)
        {
            var serverCharacters = Server.Characters;

            foreach (var playerCharacterName in PartySystem.ServerGetPartyMembersReadOnly(party))
            {
                var playerCharacter = serverCharacters.GetPlayerCharacter(playerCharacterName);
                if (playerCharacter != null)
                {
                    this.ServerForceRefreshPlayerEntry(playerCharacter);
                }
            }
        }
        protected override bool ServerIsCompleted(ICharacter character, PlayerTaskStateWithCount state)
        {
            if (base.ServerIsCompleted(character, state))
            {
                return(true);
            }

            if (!this.IsSharedWithPartyMembers ||
                !(this.TaskTarget is IProtoQuest))
            {
                return(false);
            }

            // check whether any of the other party members has this requirement satisfied
            var partyMembers = PartySystem.ServerGetPartyMembersReadOnly(character);

            if (partyMembers.Count <= 1)
            {
                // no party or single-player party
                return(false);
            }

            var currentCharacterName = character.Name;

            foreach (var partyMemberName in partyMembers)
            {
                if (partyMemberName == currentCharacterName)
                {
                    continue;
                }

                var partyMember = Api.Server.Characters
                                  .GetPlayerCharacter(partyMemberName);

                if (partyMember == null)
                {
                    continue;
                }

                if (partyMember.SharedGetQuests()
                    .SharedHasCompletedTask(this))
                {
                    // party member has satisfied this requirement
                    return(true);
                }
            }

            return(false);
        }
        private void ServerPartyClanTagChanged(ILogicObject party)
        {
            // notify other players that have this player in the online players list
            var serverCharacters = Server.Characters;

            foreach (var playerCharacterName in PartySystem.ServerGetPartyMembersReadOnly(party))
            {
                var playerCharacter = serverCharacters.GetPlayerCharacter(playerCharacterName);
                if (playerCharacter is null ||
                    !playerCharacter.ServerIsOnline)
                {
                    continue;
                }

                var onlineStatusChangeReceivers = ServerGetOnlineStatusChangeReceivers(playerCharacter);
                this.CallClient(onlineStatusChangeReceivers,
                                _ => _.ClientRemote_OnlinePlayerClanTagChanged(
                                    new Entry(playerCharacter.Name,
                                              ServerGetClanTag(playerCharacter))));
            }
        }
Beispiel #6
0
        public string Execute(ICharacter player)
        {
            var party = PartySystem.ServerGetParty(player);

            if (party is null)
            {
                return($"Player \"{player.Name}\" has no party");
            }

            var memberNames = PartySystem.ServerGetPartyMembersReadOnly(party);
            var sb          = new StringBuilder("Player \"")
                              .Append(player.Name)
                              .AppendLine("\" - party info:")
                              .AppendLine("Members list: ");

            foreach (var memberName in memberNames)
            {
                sb.Append(" * ").AppendLine(memberName);
            }

            return(sb.ToString());
        }
        private void ServerCharacterJoinedOrLeftPartyHandler(
            ICharacter playerCharacter,
            ILogicObject party,
            bool isJoined)
        {
            if (!playerCharacter.ServerIsOnline)
            {
                // it's not in online players list so no notifications necessary
                return;
            }

            var onlineStatusChangeReceivers = ServerGetOnlineStatusChangeReceivers(playerCharacter);

            this.CallClient(onlineStatusChangeReceivers,
                            _ => _.ClientRemote_OnlinePlayerClanTagChanged(
                                new Entry(playerCharacter.Name,
                                          ServerGetClanTag(playerCharacter))));

            if (!ServerIsListHidden)
            {
                return;
            }

            // refresh online lists completely for the party members
            var serverCharacters = Api.Server.Characters;

            foreach (var characterName in PartySystem.ServerGetPartyMembersReadOnly(party))
            {
                var character = serverCharacters.GetPlayerCharacter(characterName);
                if (character is not null &&
                    character.ServerIsOnline)
                {
                    this.ServerSendOnlineListAndOtherInfo(character);
                }
            }
        }
Beispiel #8
0
        public void ServerOnSkillExperienceAdded(
            ICharacter character,
            double experienceAdded,
            byte currentLevel)
        {
            var multiplier = this.ExperienceToLearningPointsConversionMultiplier
                             * TechConstants.ServerSkillExperienceToLearningPointsConversionMultiplier;

            // apply reversed experience gain multiplier so faster/slower skill exp gain speed will not affect LP gain speed
            multiplier /= TechConstants.ServerSkillExperienceGainMultiplier;

            if (multiplier <= 0 ||
                double.IsNaN(multiplier))
            {
                return;
            }

            // reduce LP gain proportionally to the skill level
            var lpRateMultiplier = MathHelper.Lerp(1,
                                                   TechConstants.SkillLearningPointMultiplierAtMaximumLevel,
                                                   currentLevel / (double)this.MaxLevel);

            multiplier *= lpRateMultiplier;

            if (multiplier <= 0)
            {
                return;
            }

            var learningPointsToAdd = experienceAdded * multiplier;

            var partyMembersNames = this.IsSharingLearningPointsWithPartyMembers
                                        ? PartySystem.ServerGetPartyMembersReadOnly(character)
                                        : Array.Empty <string>();

            if (partyMembersNames.Count <= 1)
            {
                // no experience share, no party or a single member party - add all LP to the current character
                character.SharedGetTechnologies()
                .ServerAddLearningPoints(learningPointsToAdd);
                return;
            }

            using var onlinePartyMembers = Api.Shared.GetTempList <ICharacter>();
            foreach (var partyMemberName in partyMembersNames)
            {
                var partyMember = Server.Characters.GetPlayerCharacter(partyMemberName);
                if (partyMember is null)
                {
                    continue;
                }

                if (ReferenceEquals(partyMember, character) ||
                    (partyMember.ServerIsOnline &&
                     !CharacterIdleSystem.ServerIsIdlePlayer(partyMember)))
                {
                    onlinePartyMembers.Add(partyMember);
                }
            }

            if (onlinePartyMembers.Count <= 1 ||
                PartyConstants.PartyLearningPointsSharePercent == 0)
            {
                // no party, or a single member party, or no party share %
                // - add all LP to the current character
                character.SharedGetTechnologies()
                .ServerAddLearningPoints(learningPointsToAdd);
                return;
            }

            // player has a party
            // add only a share of LP to current character
            var currentCharacterLearningPointsShare = learningPointsToAdd * (1 - PartyConstants.PartyLearningPointsSharePercent);

            character.SharedGetTechnologies()
            .ServerAddLearningPoints(currentCharacterLearningPointsShare);

            // distribute the rest equally to the other party members
            var learningPointsShare = learningPointsToAdd
                                      * PartyConstants.PartyLearningPointsSharePercent
                                      / (onlinePartyMembers.Count - 1);

            foreach (var partyMember in onlinePartyMembers.AsList())
            {
                if (!ReferenceEquals(partyMember, character))
                {
                    partyMember.SharedGetTechnologies()
                    .ServerAddLearningPoints(learningPointsShare);
                }
            }
        }
Beispiel #9
0
        protected override bool ServerIsCompleted(ICharacter character, PlayerTaskStateWithCount state)
        {
            if (base.ServerIsCompleted(character, state))
            {
                return(true);
            }

            if (!this.IsSharedWithPartyAndFactionMembers ||
                this.TaskTarget is not IProtoQuest)
            {
                return(false);
            }

            // check whether any of the other party members has this requirement satisfied
            var currentCharacterName = character.Name;
            var partyMembers         = PartySystem.ServerGetPartyMembersReadOnly(character);

            if (partyMembers.Count > 1)
            {
                foreach (var partyMemberName in partyMembers)
                {
                    if (partyMemberName == currentCharacterName)
                    {
                        continue;
                    }

                    var partyMember = Api.Server.Characters
                                      .GetPlayerCharacter(partyMemberName);

                    if (partyMember is null)
                    {
                        continue;
                    }

                    if (partyMember.SharedGetQuests()
                        .SharedHasCompletedTask(this))
                    {
                        // party member has satisfied this requirement
                        return(true);
                    }
                }
            }

            // check whether any of the other faction members has this requirement satisfied
            if (FactionSystem.ServerGetFaction(character) is { } faction &&
                FactionSystem.SharedGetFactionKind(faction) != FactionKind.Public)
            {
                var factionMembers = FactionSystem.ServerGetFactionMembersReadOnly(faction);
                if (factionMembers.Count > 1)
                {
                    foreach (var factionMemberEntry in factionMembers)
                    {
                        var factionMemberName = factionMemberEntry.Name;
                        if (factionMemberName == currentCharacterName)
                        {
                            continue;
                        }

                        var factionMember = Api.Server.Characters
                                            .GetPlayerCharacter(factionMemberName);

                        if (factionMember is null)
                        {
                            continue;
                        }

                        if (factionMember.SharedGetQuests()
                            .SharedHasCompletedTask(this))
                        {
                            // faction member has satisfied this requirement
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
Beispiel #10
0
        public void ServerOnSkillExperienceAdded(
            ICharacter character,
            double experienceAdded,
            byte currentLevel)
        {
            var multiplier = this.ExperienceToLearningPointsConversionMultiplier
                             * TechConstants.SkillExperienceToLearningPointsConversionMultiplier;

            if (multiplier <= 0)
            {
                return;
            }

            // reduce LP gain proportionally to the skill level
            var lpRateMultiplier = MathHelper.Lerp(1,
                                                   TechConstants.SkillLearningPointMultiplierAtMaximumLevel,
                                                   currentLevel / (double)this.MaxLevel);

            multiplier *= lpRateMultiplier;
            if (multiplier <= 0)
            {
                return;
            }

            var learningPointsToAdd = experienceAdded * multiplier;

            var partyMembersNames = this.IsSharingLearningPointsWithPartyMembers
                                        ? PartySystem.ServerGetPartyMembersReadOnly(character)
                                        : Array.Empty <string>();

            if (partyMembersNames.Count <= 1)
            {
                // no experience share, no party or a single member party - add all LP to the current character
                character.SharedGetTechnologies()
                .ServerAddLearningPoints(learningPointsToAdd);
                return;
            }

            using (var onlinePartyMembers = Api.Shared.GetTempList <ICharacter>())
            {
                foreach (var partyMemberName in partyMembersNames)
                {
                    var partyMember = Server.Characters.GetPlayerCharacter(partyMemberName);
                    if (partyMember != null &&
                        (partyMember == character ||
                         partyMember.IsOnline))
                    {
                        onlinePartyMembers.Add(partyMember);
                    }
                }

                if (onlinePartyMembers.Count <= 1)
                {
                    // no party or a single member party - add all LP to the current character
                    character.SharedGetTechnologies()
                    .ServerAddLearningPoints(learningPointsToAdd);
                    return;
                }

                // player has a party
                // add only a share of LP to current character
                var learningPointsSharePercent          = MathHelper.Clamp(PartyConstants.PartyLearningPointsSharePercent, 0, 1);
                var currentCharacterLearningPointsShare = learningPointsToAdd * (1 - learningPointsSharePercent);
                character.SharedGetTechnologies()
                .ServerAddLearningPoints(currentCharacterLearningPointsShare);

                // distribute the rest equally to the other party members
                var learningPointsShare = learningPointsToAdd
                                          * learningPointsSharePercent
                                          / (onlinePartyMembers.Count - 1);

                foreach (var partyMember in onlinePartyMembers)
                {
                    if (partyMember != character)
                    {
                        partyMember.SharedGetTechnologies()
                        .ServerAddLearningPoints(learningPointsShare);
                    }
                }
            }
        }