Ejemplo n.º 1
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));
        }
Ejemplo n.º 2
0
        private static void ServerRemoveMemberNoChecks(string characterName, ILogicObject faction)
        {
            var factionPrivateState = Faction.GetPrivateState(faction);
            var members             = factionPrivateState.Members;

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

                if (entry.Role == FactionMemberRole.Leader)
                {
                }

                // member found
                members.RemoveAt(index);
                Faction.GetPublicState(faction).PlayersNumberCurrent--;
                Logger.Important($"Faction member removed: {characterName} from {faction}");

                var character = Server.Characters.GetPlayerCharacter(characterName);
                if (character is not null)
                {
                    // record the time when player has left or was removed from the faction
                    factionPrivateState.ServerPlayerLeaveDateDictionary[character.Id]
                        = Server.Game.FrameTime;

                    ServerCharacterFactionDictionary.Remove(character);

                    PlayerCharacter.GetPublicState(character).ClanTag = null;
                    PlayerCharacter.GetPrivateState(character).LastFactionLeaveTime = Server.Game.FrameTime;

                    // remove all requests by this character
                    ServerInvitations.RemoveAllInvitationsBy(character, faction);

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

                    Api.SafeInvoke(
                        () => ServerFactionMemberAccessRightsChanged?.Invoke(faction,
                                                                             characterName,
                                                                             FactionMemberAccessRights.None));

                    Server.World.ForceExitScope(character, faction);
                    // send "no faction" for this player
                    ServerSendCurrentFaction(character);
                    ChatSystem.ServerRemoveChatRoomFromPlayerScope(character, ServerGetFactionChat(faction));
                }

                if (members.Count == 0)
                {
                    ServerRemoveFaction(faction);
                }

                return;
            }

            Logger.Warning($"Faction member is not found: {characterName} in {faction}");
        }