Иконка ресурса

FREE ClanTeamSync : 1.0.0 1.0.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
// Requires: Clans

using Newtonsoft.Json.Linq;
using Oxide.Core.Plugins;
using System.Collections.Generic;
using Oxide.Core.Libraries.Covalence;


namespace Oxide.Plugins
{
    [Info("Clan Team Sync", "AnotherPanda", "1.0.0")]
    [Description("Syncs clan members with in-game teams automatically.")]
    class ClanTeamSync : CovalencePlugin
    {
        #region Definitions

        [PluginReference]
        private Plugin Clans;

        private readonly Dictionary<string, List<ulong>> clans = new Dictionary<string, List<ulong>>();

        #endregion Definitions

        #region Functions

        private void GenerateClanTeam(string clanTag)
        {
            if (string.IsNullOrEmpty(clanTag))
                return;

            List<ulong> memberIds = ClanPlayersTag(clanTag);
            if (memberIds.Count == 0)
                return;

            if (clans.ContainsKey(clanTag))
                clans.Remove(clanTag);

            clans[clanTag] = new List<ulong>();
            RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.CreateTeam();

            foreach (ulong memberId in memberIds)
            {
                BasePlayer player = BasePlayer.FindByID(memberId);
                if (player != null)
                {
                    if (player.currentTeam != 0UL)
                    {
                        RelationshipManager.PlayerTeam current = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
                        current?.RemovePlayer(player.userID);
                    }
                    team.AddPlayer(player);
                    clans[clanTag].Add(player.userID);

                    if (IsAnOwner(player))
                        team.SetTeamLeader(player.userID);
                }
            }
        }

        private bool IsAnOwner(BasePlayer player)
        {
            string clanTag = Clans?.Call<string>("GetClanOf", player.UserIDString);
            if (string.IsNullOrEmpty(clanTag))
                return false;

            JObject clanInfo = Clans?.Call<JObject>("GetClan", clanTag);
            if (clanInfo == null)
                return false;

            return (string)clanInfo["owner"] == player.UserIDString;
        }

        private List<ulong> ClanPlayersTag(string tag)
        {
            JObject clanInfo = Clans?.Call<JObject>("GetClan", tag);
            if (clanInfo == null || clanInfo["members"] == null)
                return new List<ulong>();

            return clanInfo["members"].ToObject<List<ulong>>();
        }

        private void RemovePlayerFromTeam(ulong playerId)
        {
            BasePlayer player = BasePlayer.FindByID(playerId);
            if (player != null && player.currentTeam != 0UL)
            {
                RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
                team?.RemovePlayer(player.userID);
            }
        }

        #endregion Functions

        #region Hooks

        private void OnClanCreate(string tag) => timer.Once(1f, () => GenerateClanTeam(tag));

        private void OnClanUpdate(string tag) => GenerateClanTeam(tag);

        private void OnClanDisbanded(string tag)
        {
            if (string.IsNullOrEmpty(tag) || !clans.TryGetValue(tag, out List<ulong> members) || members.Count == 0)
                return;

            RelationshipManager.PlayerTeam team = null;

            foreach (ulong memberId in members)
            {
                BasePlayer player = BasePlayer.FindByID(memberId);
                if (player != null && player.currentTeam != 0UL)
                {
                    if (team == null)
                        team = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);

                    team?.RemovePlayer(player.userID);
                }
            }

            team?.Disband();
            clans.Remove(tag);
        }

        private void OnClanMemberJoined(ulong playerId, string tag) => GenerateClanTeam(tag);

        private void OnClanMemberGone(ulong playerId, string tag)
        {
            RemovePlayerFromTeam(playerId);
            GenerateClanTeam(tag);
        }

        private void OnPlayerSleepEnded(BasePlayer player)
        {
            if (player == null)
                return;

            string clanTag = Clans?.Call<string>("GetClanOf", player.UserIDString);
            if (string.IsNullOrEmpty(clanTag))
            {
                RemovePlayerFromTeam(player.userID);
                return;
            }

            if (player.currentTeam != 0UL)
            {
                RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
                if (team != null)
                {
                    List<ulong> clanPlayers = ClanPlayersTag(clanTag);
                    if (clanPlayers.TrueForAll(id => team.members.Contains(id)))
                        return;
                }
            }

            GenerateClanTeam(clanTag);
        }

        private void OnTeamLeave(RelationshipManager.PlayerTeam team, BasePlayer player)
        {
            if (player == null)
                return;

            timer.Once(0.1f, () =>
            {
                string clanTag = Clans?.Call<string>("GetClanOf", player.UserIDString);
                if (string.IsNullOrEmpty(clanTag))
                    return;

                Clans?.Call("LeaveClan", player.IPlayer);
            });
        }

        private void OnTeamAcceptInvite(RelationshipManager.PlayerTeam team, BasePlayer player)
        {
            if (player == null || team == null)
                return;

            BasePlayer leader = BasePlayer.FindByID(team.teamLeader);
            if (leader == null)
                return;

            string clanTag = Clans?.Call<string>("GetClanOf", leader.UserIDString);
            if (string.IsNullOrEmpty(clanTag))
                return;

            string targetClan = Clans?.Call<string>("GetClanOf", player.UserIDString);
            if (!string.IsNullOrEmpty(targetClan))
                return;

            IPlayer leaderIPlayer = leader.IPlayer;
            IPlayer targetIPlayer = player.IPlayer;

            bool invited = Clans?.Call<bool>("InvitePlayer", leaderIPlayer, targetIPlayer) ?? false;
            if (!invited)
                return;

            Clans?.Call("JoinClan", targetIPlayer, clanTag);
        }

        #endregion Hooks
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху