Beispiel #1
0
        private void ServerRemote_LeaderSetOfficerRoleTitle(
            FactionMemberRole role,
            FactionOfficerRoleTitle roleTitle)
        {
            var leaderCharacter = ServerRemoteContext.Character;

            ServerValidateHasAccessRights(leaderCharacter,
                                          FactionMemberAccessRights.Leader,
                                          out var faction);
            SharedValidateIsOfficerRole(role);

            var binding = Faction.GetPrivateState(faction).OfficerRoleTitleBinding;

            if (binding.TryGetValue(role, out var currentRoleTitle) &&
                currentRoleTitle == roleTitle)
            {
                return;
            }

            binding[role] = roleTitle;
            ServerAddLogEntry(faction,
                              new FactionLogEntryRoleRenamed(byOfficer: leaderCharacter,
                                                             previousRoleTitle: currentRoleTitle,
                                                             newRoleTitle: roleTitle));

            Logger.Important($"Officer role title changed: {role} -> {roleTitle}");
        }
        public string Execute([CurrentCharacterIfNull] ICharacter player, FactionMemberRole role)
        {
            var faction = FactionSystem.ServerGetFaction(player);

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

            if (!Api.IsEditor)
            {
                var currentRole = FactionSystem.ServerGetRole(player);
                if (currentRole == FactionMemberRole.Leader)
                {
                    return("Cannot change the role of the faction leader");
                }

                if (role == FactionMemberRole.Leader)
                {
                    return("Cannot assign a leader role to anyone");
                }
            }

            FactionSystem.ServerSetMemberRoleNoChecks(player.Name, faction, role);
            return("Role changed to " + role);
        }
Beispiel #3
0
 private static void SharedValidateIsOfficerRole(FactionMemberRole role)
 {
     if (role < FactionMemberRole.Officer1 ||
         role > FactionMemberRole.Officer3)
     {
         throw new Exception("Not an officer role: ");
     }
 }
Beispiel #4
0
 public FactionLogEntryMemberRoleChanged(
     ICharacter member,
     ICharacter byOfficer,
     FactionMemberRole newRole,
     FactionOfficerRoleTitle?newRoleTitle)
     : base(byOfficer)
 {
     this.MemberName   = member.Name;
     this.NewRole      = newRole;
     this.NewRoleTitle = newRoleTitle;
 }
Beispiel #5
0
        public ViewModelFactionRoleTitleEditor(
            FactionMemberRole factionMemberRole,
            FactionOfficerRoleTitle selectedTitle,
            Action selectedTitleChanged)
        {
            this.AllTitles = EnumHelper.EnumValuesToViewModel <FactionOfficerRoleTitle>()
                             .OrderBy(e => e.Description, StringComparer.OrdinalIgnoreCase)
                             .ToArray();

            this.FactionMemberRole    = factionMemberRole;
            this.selectedTitle        = selectedTitle;
            this.selectedTitleChanged = selectedTitleChanged;
        }
Beispiel #6
0
        private void ServerRemote_LeaderSetRoleAccessRights(
            FactionMemberRole role,
            FactionMemberAccessRights accessRights)
        {
            if (role == FactionMemberRole.Member ||
                role == FactionMemberRole.Leader ||
                !SharedIsValidRole(role))
            {
                throw new Exception("Invalid role: " + role);
            }

            var officer = ServerRemoteContext.Character;

            ServerValidateHasAccessRights(officer,
                                          FactionMemberAccessRights.Leader,
                                          out var faction);

            ServerValidateRoleAccessRights(accessRights);

            var currentAccessRights = SharedGetRoleAccessRights(faction, role);

            if (currentAccessRights == accessRights)
            {
                // no change required
                return;
            }

            var accessRightsBinding = Faction.GetPrivateState(faction).AccessRightsBinding;

            accessRightsBinding[role] = accessRights;
            Logger.Important($"Changed faction role access rights - {role}: {accessRights}");

            var roleTitle = ServerGetOfficerRoleTitle(faction, role)
                            ?? FactionOfficerRoleTitle.Deputy; // the null should be impossible but still

            ServerAddLogEntry(faction,
                              new FactionLogEntryRoleAccessRightsChanged(byOfficer: officer,
                                                                         roleTitle,
                                                                         accessRights));

            // process all faction members of this role
            foreach (var entry in ServerGetFactionMembersReadOnly(faction))
            {
                if (entry.Role == role)
                {
                    ServerOnFactionMemberAccessRightsChanged(faction,
                                                             entry.Name,
                                                             SharedGetRoleAccessRights(faction, role));
                }
            }
        }
Beispiel #7
0
        public static void ClientOfficerSetMemberRole(string memberName, FactionMemberRole role)
        {
            if (!ClientIsFactionMember(memberName))
            {
                throw new Exception("Faction member is not found: " + memberName);
            }

            if (memberName == ClientCurrentCharacterHelper.Character.Name)
            {
                // cannot change self role
                return;
            }

            ClientValidateHasAccessRights(FactionMemberAccessRights.SetMemberRole);
            Instance.CallServer(
                _ => _.ServerRemote_OfficerSetMemberRole(memberName, role));
        }
Beispiel #8
0
        public static void ClientLeaderSetOfficerRoleTitle(
            FactionMemberRole role,
            FactionOfficerRoleTitle roleTitle)
        {
            ClientValidateHasAccessRights(FactionMemberAccessRights.Leader);
            SharedValidateIsOfficerRole(role);

            var binding = Faction.GetPrivateState(ClientCurrentFaction).OfficerRoleTitleBinding;

            if (binding.TryGetValue(role, out var currentRoleTitle) &&
                currentRoleTitle == roleTitle)
            {
                return;
            }

            Instance.CallServer(
                _ => _.ServerRemote_LeaderSetOfficerRoleTitle(role, roleTitle));
            Logger.Important($"Officer role title changed: {role} -> {roleTitle}");
        }
Beispiel #9
0
        /// <summary>
        /// Important: the validity of this action must be checked first
        /// as this method will only change (only) the role.
        /// (E.g. if checks are not made it's possible there will be more than a single leader
        /// or an officer may strip the leader of its role)
        /// </summary>
        public static void ServerSetMemberRoleNoChecks(
            string memberName,
            ILogicObject faction,
            FactionMemberRole role)
        {
            if (!SharedIsValidRole(role))
            {
                throw new Exception("Invalid role: " + role);
            }

            var members = ServerGetFactionMembersEditable(faction);

            for (var index = 0; index < members.Count; index++)
            {
                var entry = members[index];
                if (!string.Equals(entry.Name, memberName, StringComparison.Ordinal))
                {
                    continue;
                }

                // member found
                if (entry.Role == role)
                {
                    // already has the role
                    continue;
                }

                members[index] = new FactionMemberEntry(memberName, role);
                Logger.Important(
                    string.Format("Faction member role changed: {0} in {1} - role: {2}",
                                  memberName,
                                  faction,
                                  role));

                ServerOnFactionMemberAccessRightsChanged(faction,
                                                         memberName,
                                                         SharedGetRoleAccessRights(faction, role));
                return;
            }

            Logger.Warning($"Faction member is not found: {memberName} in {faction}");
        }
Beispiel #10
0
        private void ServerRemote_OfficerSetMemberRole(string memberName, FactionMemberRole role)
        {
            var officer = ServerRemoteContext.Character;

            ServerValidateHasAccessRights(officer,
                                          FactionMemberAccessRights.SetMemberRole,
                                          out var faction);

            if (memberName == officer.Name)
            {
                throw new Exception($"Cannot change self role: {memberName} in {faction}");
            }

            var memberEntry = SharedGetMemberEntry(memberName, faction);

            if (memberEntry is null)
            {
                throw new Exception($"Faction member is not found: {memberName} in {faction}");
            }

            if (memberEntry.Value.Role == FactionMemberRole.Leader)
            {
                throw new Exception("Cannot change the role of the faction leader");
            }

            var member = Server.Characters.GetPlayerCharacter(memberName)
                         ?? throw new Exception("Character not found");

            ServerSetMemberRoleNoChecks(memberName, faction, role);

            var newRoleTitle = ServerGetOfficerRoleTitle(faction, role);

            ServerAddLogEntry(faction,
                              new FactionLogEntryMemberRoleChanged(member,
                                                                   officer,
                                                                   newRole: role,
                                                                   newRoleTitle: newRoleTitle));
        }
Beispiel #11
0
        public static void ClientLeaderSetMemberRoleAccessRight(
            FactionMemberRole role,
            FactionMemberAccessRights accessRights,
            bool isAssigned)
        {
            ClientValidateHasAccessRights(FactionMemberAccessRights.Leader);
            var currentAccessRights = SharedGetRoleAccessRights(ClientCurrentFaction, role);
            FactionMemberAccessRights newAccessRights;

            if (isAssigned)
            {
                if (currentAccessRights.HasFlag(accessRights))
                {
                    return;
                }

                newAccessRights = currentAccessRights | accessRights;
            }
            else // remove
            {
                if (!currentAccessRights.HasFlag(accessRights))
                {
                    return;
                }

                newAccessRights = currentAccessRights & ~accessRights;
            }

            Instance.CallServer(
                _ => _.ServerRemote_LeaderSetRoleAccessRights(role, newAccessRights));
            Logger.Important(string.Format("Changed member role access right: {0} {1} {2}{3}New rights: {4}",
                                           role,
                                           isAssigned ? "assigned" : "removed",
                                           accessRights,
                                           Environment.NewLine,
                                           newAccessRights));
        }
Beispiel #12
0
 private static bool SharedIsValidRole(FactionMemberRole role)
 {
     return(Enum.IsDefined(typeof(FactionMemberRole), role));
 }
Beispiel #13
0
        private static void ServerAddMember(
            ICharacter character,
            ILogicObject faction,
            FactionMemberRole role)
        {
            Api.Assert(!character.IsNpc, "NPC cannot join a faction");

            if (!SharedIsValidRole(role))
            {
                throw new Exception("Invalid role: " + role);
            }

            var currentFaction = ServerGetFaction(character);

            if (currentFaction == faction)
            {
                // already in faction
                return;
            }

            if (currentFaction is not null)
            {
                throw new Exception($"Player already has a faction: {character} in {faction}");
            }

            // faction members cannot have a newbie protection
            NewbieProtectionSystem.ServerDisableNewbieProtection(character);

            var members            = ServerGetFactionMembersEditable(faction);
            var factionPublicState = Faction.GetPublicState(faction);
            var maxMembers         = FactionConstants.SharedGetFactionMembersMax(factionPublicState.Kind);

            if (members.Count >= maxMembers)
            {
                throw new Exception("Faction size exceeded - max " + maxMembers);
            }

            if (role == FactionMemberRole.Leader)
            {
                foreach (var otherMember in members)
                {
                    if (otherMember.Role == FactionMemberRole.Leader)
                    {
                        throw new Exception("Faction can have only a single leader");
                    }
                }
            }

            members.Add(new FactionMemberEntry(character.Name, role));
            ServerCharacterFactionDictionary[character]       = faction;
            PlayerCharacter.GetPublicState(character).ClanTag = factionPublicState.ClanTag;
            factionPublicState.PlayersNumberCurrent++;

            Logger.Important($"Player joined faction: {character} in {faction} - role: {role}",
                             character);

            ServerInvitations.RemoveAllInvitationsFor(character);

            Api.SafeInvoke(
                () => ServerCharacterJoinedOrLeftFaction?.Invoke(character,
                                                                 faction,
                                                                 isJoined: true));

            // add this with some delay to prevent from the bug when the player name listed twice due to the late delta-replication
            ServerTimersSystem.AddAction(delaySeconds: 0.1,
                                         () => ServerSendCurrentFaction(character));
        }
Beispiel #14
0
 public FactionMemberEntry(string name, FactionMemberRole role)
 {
     this.Name = name;
     this.Role = role;
 }
Beispiel #15
0
 public FactionRoleTitleEditor(FactionMemberRole role, FactionOfficerRoleTitle title)
 {
     this.role  = role;
     this.title = title;
 }