Exemple #1
0
 private static void ServerFactionMemberAccessRightsChangedHandler(
     ILogicObject faction,
     string characterName,
     FactionMemberAccessRights accessRights)
 {
     ServerRefreshFactionClaimAccess(faction);
 }
Exemple #2
0
 public FactionLogEntryRoleAccessRightsChanged(
     ICharacter byOfficer,
     FactionOfficerRoleTitle roleTitle,
     FactionMemberAccessRights newAccessRights)
     : base(byOfficer)
 {
     this.RoleTitle       = roleTitle;
     this.NewAccessRights = newAccessRights;
 }
Exemple #3
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));
                }
            }
        }
Exemple #4
0
        private static bool SharedHasFactionAccessRights(
            ICharacter who,
            FactionMemberAccessRights accessRights,
            string clanTag)
        {
            Api.Assert(!string.IsNullOrEmpty(clanTag), "Clan tag is null or empty");

            if (clanTag != FactionSystem.SharedGetClanTag(who))
            {
                // player has no faction or a member of a different faction
                return(false);
            }

            return(FactionSystem.SharedHasAccessRight(who, accessRights));
        }
Exemple #5
0
        private static void ServerValidateRoleAccessRights(FactionMemberAccessRights originalAccessRights)
        {
            var allEnumValues = EnumExtensions.GetValues <FactionMemberAccessRights>();

            var t = originalAccessRights;

            foreach (var value in allEnumValues)
            {
                if (value != FactionMemberAccessRights.Leader)
                {
                    t &= ~value;
                }
            }

            if (t != FactionMemberAccessRights.None)
            {
                // there are some unknown flags defined in the provided access rights
                throw new Exception("Incorrect role access rights: " + originalAccessRights);
            }
        }
Exemple #6
0
        public ViewModelWorldObjectFactionAccessEditorControl(IWorldObject worldObject)
        {
            this.worldObject = worldObject;
            this.accessRight = WorldObjectAccessModeSystem.SharedGetFactionAccessRightRequirementForObject(worldObject);

            if (worldObject.ProtoGameObject is not IProtoObjectWithAccessMode protoObjectWithAccessMode)
            {
                throw new Exception("This world object doesn't have an access mode");
            }

            this.isClosedModeAvailable   = protoObjectWithAccessMode.IsClosedAccessModeAvailable;
            this.isEveryoneModeAvailable = protoObjectWithAccessMode.IsEveryoneAccessModeAvailable;

            this.privateState = worldObject.GetPrivateState <IObjectWithAccessModePrivateState>();
            this.privateState.ClientSubscribe(_ => _.FactionAccessMode,
                                              _ => this.RefreshCheckboxes(),
                                              this);

            FactionSystem.ClientCurrentFactionAccessRightsChanged += this.CurrentFactionAccessRightsChanged;

            this.RecreateViewModelAccessModes();
        }
Exemple #7
0
        private static void ServerOnFactionMemberAccessRightsChanged(
            ILogicObject faction,
            string memberName,
            FactionMemberAccessRights accessRights)
        {
            var member = Server.Characters.GetPlayerCharacter(memberName);

            if (member is null ||
                !member.ServerIsOnline)
            {
                return;
            }

            // ensure the server will re-sync the faction-related data
            // after changing the character's access rights
            ServerPlayerOnlineStateChangedHandler(member, isOnline: false);
            ServerPlayerOnlineStateChangedHandler(member, isOnline: true);

            Api.SafeInvoke(
                () => ServerFactionMemberAccessRightsChanged?.Invoke(faction,
                                                                     memberName,
                                                                     accessRights));
        }
Exemple #8
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));
        }