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

FREE TPClan : 20.0.2 20.0.2

Нет прав для скачивания
C#:
using Rust;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System.IO;
namespace Oxide.Plugins {
    [Info("TPClan", "pluginfuel.ru", "20.0.2")]
    public class TPClan : RustPlugin {
#region [Vars]
        [PluginReference]
        private Plugin ImageLibrary = null, TPTournament = null, TPCaptureZone = null, QuarryCapture = null, TPRTCapture = null;
        private const String Layer = "TPClan.Layer";
        private const Boolean LanguageEn = false;
        private readonly Regex Regex = new Regex(@"<avatarFull><!\[CDATA\[(.*)\]\]></avatarFull>");
        private readonly String[] _gatherHooks = {
            "OnDispenserGather", "OnDispenserBonus", "OnCollectiblePickup"
        }
        ;
        private readonly String[] _gatherItem = {
            "wood", "stones", "metal.ore", "sulfur.ore", "hq.metal.ore", "cloth", "leather", "fat.animal", "loot-barrel", "metal.refined", "metal.fragments", "sulfur", "charcoal"
        }
        ;
        private readonly String[] _wearItem = {
            "hoodie", "pants", "shoes.boots", "metal.facemask", "metal.plate.torso", "roadsign.kilt"
        }
        ;
        private readonly Dictionary<UInt64, BasePlayer> _lastHeli = new Dictionary<UInt64, BasePlayer>();
        private readonly Dictionary<String, Int32> _itemIds = new Dictionary<String, Int32>();
        private List<BuildingPrivlidge> _cupboardList = new List<BuildingPrivlidge>();
        private List<CodeLock> _codeLockList = new List<CodeLock>();
        private List<SamSite> _sameSiteList = new List<SamSite>();
        private Dictionary<UInt64, ClanData> _playerToClan = new Dictionary<UInt64, ClanData>();
        private List<UInt64> _lootEntity = new List<UInt64>();
        private Dictionary<UInt64, DateTime> _cooldownPlayer = new Dictionary<UInt64, DateTime>();
        private static TPClan _;
        private static StringBuilder sb;
#endregion
#region [ImageLibrary]
        private Boolean HasImage(String imageName, UInt64 imageId = 0) => ImageLibrary?.Call<Boolean>("HasImage", imageName, imageId) ?? false;
        private Boolean AddImage(String url, String shortname, UInt64 skin = 0) => ImageLibrary?.Call<Boolean>("AddImage", url, shortname, skin) ?? false;
        private String GetImage(String shortname, UInt64 skin = 0) => ImageLibrary?.Call<String>("GetImage", shortname, skin);
#endregion
#region [Clan-Data]
        private List<ClanData> _clansList = new List<ClanData>();
        private void LoadClans() {
            try {
                _clansList = Interface.Oxide.DataFileSystem.ReadObject<List<ClanData>>($"{Name}/ClansList");
                if (_clansList != null) {
                    foreach (var clan in _clansList) {
                        if (clan.Task == null) {
                            clan.Task = String.Empty;
                        }
                    }
                }
            }
            catch (Exception e) {
                PrintError(e.ToString());
            }
            if (_clansList == null) _clansList = new List<ClanData>();
        }
        private void SaveClans() {
            Interface.Oxide.DataFileSystem.WriteObject($"{Name}/ClansList", _clansList);
        }
        private class ClanData {
            public String ClanTag;
            public String Avatar;
            public UInt64 LeaderID;
            public String LeaderName;
            [JsonProperty("Task")]
            public String Task;
            public UInt64 TeamID;
            public Dictionary<String, GatherSettings> GatherClan = new Dictionary<String, GatherSettings>() {
                ["wood"]
                = new GatherSettings(), ["stones"] = new GatherSettings(), ["metal.ore"] = new GatherSettings(), ["sulfur.ore"] = new GatherSettings(), ["hq.metal.ore"] = new GatherSettings(), ["cloth"] = new GatherSettings(), ["leather"] = new GatherSettings(), ["fat.animal"] = new GatherSettings(), ["loot-barrel"] = new GatherSettings()
            }
            ;
            public Dictionary<String, UInt64> SkinList = new Dictionary<String, UInt64>() {
                ["hoodie"]
                = 0, ["pants"] = 0, ["shoes.boots"] = 0, ["metal.facemask"] = 0, ["metal.plate.torso"] = 0, ["roadsign.kilt"] = 0,
            }
            ;
            public Dictionary<UInt64, PlayerData> Members = new Dictionary<UInt64, PlayerData>();
            public List<UInt64> Moderators = new List<UInt64>();
            [JsonIgnore]
            private RelationshipManager.PlayerTeam Team => RelationshipManager.ServerInstance.FindTeam(TeamID) ?? FindOrCreateTeam();
            public class PlayerData {
                public Int32 Point = 0;
                public Int32 Kill = 0;
                public Int32 Death = 0;
                public Boolean FriendlyFire;
                public Int32 Online;
                public Dictionary<String, Int32> GatherMember = new Dictionary<String, Int32>() {
                    ["wood"]
                    = 0, ["stones"] = 0, ["metal.ore"] = 0, ["sulfur.ore"] = 0, ["hq.metal.ore"] = 0, ["cloth"] = 0, ["leather"] = 0, ["fat.animal"] = 0, ["loot-barrel"] = 0
                }
                ;
            }
            public class GatherSettings {
                public Int32 Farm;
                public Int32 Need;
            }
            public Boolean IsOwner(String userId) => IsOwner(UInt64.Parse(userId));
            public Boolean IsOwner(UInt64 userId) => LeaderID == userId;
            public Boolean IsModerator(String userId) => IsModerator(UInt64.Parse(userId));
            public Boolean IsModerator(UInt64 userId) => Moderators.Contains(userId) || IsOwner(userId);
            public Boolean IsMember(String userId) => IsMember(UInt64.Parse(userId));
            public Boolean IsMember(UInt64 userId) => Members.ContainsKey(userId);
            public RelationshipManager.PlayerTeam FindOrCreateTeam() {
                RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.FindTeam(TeamID) ?? RelationshipManager.ServerInstance.FindPlayersTeam(LeaderID);
                if (team != null) {
                    if (team.teamLeader == LeaderID) {
                        TeamID = team.teamID;
                        return team;
                    }
                    team.RemovePlayer(LeaderID);
                }
                return CreateTeam();
            }
            public RelationshipManager.PlayerTeam CreateTeam() {
                RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.CreateTeam();
                team.teamLeader = LeaderID;
                AddPlayer(LeaderID, team);
                TeamID = team.teamID;
                return team;
            }
            public RelationshipManager.PlayerTeam FindTeam() {
                RelationshipManager.PlayerTeam leaderTeam = RelationshipManager.ServerInstance.FindPlayersTeam(LeaderID);
                if (leaderTeam != null) {
                    TeamID = leaderTeam.teamID;
                    return leaderTeam;
                }
                return null;
            }
            public void SetTeam(UInt64 teamID) => TeamID = teamID;
            public void AddPlayer(UInt64 member, RelationshipManager.PlayerTeam team = null) {
                if (team == null) team = Team;
                if (!team.members.Contains(member)) team.members.Add(member);
                RelationshipManager.ServerInstance.playerToTeam[member] = team;
                BasePlayer player = RelationshipManager.FindByID(member);
                if (player != null) {
                    if (player.Team != null && player.Team.teamID != team.teamID) {
                        player.Team.RemovePlayer(player.userID);
                        player.ClearTeam();
                    }
                    player.currentTeam = team.teamID;
                    team.MarkDirty();
                    player.SendNetworkUpdate();
                }
            }
            public static ClanData CreateNewClan(String clanTag, BasePlayer player) {
                ClanData clan = new ClanData {
                    ClanTag = clanTag, Avatar = $"{_.Name}.Avatar{player.UserIDString}", LeaderID = player.userID, LeaderName = player.displayName, Task = String.Empty
                }
                ;
                clan.Members.Add(player.userID, new PlayerData());
                _._clansList.Add(clan);
                if (_config.TagInName) player.displayName = $"[{clanTag}] {player.IPlayer.Name}";
                if (_config.AutoTeamCreation) clan.FindOrCreateTeam();
                _._playerToClan[player.userID] = clan;
                ClanCreate(clanTag);
                return clan;
            }
            public void Disband() {
                List<String> memberUserIDs = Facepunch.Pool.GetList<string>();
                memberUserIDs.AddRange(Members.Keys.Select(x => x.ToString()));
                ClanDisbanded(memberUserIDs);
                ClanDisbanded(ClanTag, memberUserIDs);
                Facepunch.Pool.FreeList(ref memberUserIDs);
                Members.Keys.ToList().ForEach(member => Kick(member, true));
                foreach (KeyValuePair<String, UInt64> skin in SkinList) {
                    if (skin.Value == 0) continue;
                    if (_._skinsUsedList[skin.Key].Contains(skin.Value)) _._skinsUsedList[skin.Key].Remove(skin.Value);
                }
                ClanDestroy(ClanTag);
                if (_config.AutoTeamCreation) {
                    Team?.members.ToList().ForEach(member => {
                        Team.RemovePlayer(member);
                        BasePlayer player = RelationshipManager.FindByID(member);
                        if (player != null) player.ClearTeam();
                    }
                    );
                }
                _._clansList.Remove(this);
            }
            public void Join(BasePlayer player) {
                Members.Add(player.userID, new PlayerData());
                if (_config.TagInName) player.displayName = $"[{ClanTag}] {player.displayName}";
                if (_config.AutoTeamCreation) {
                    if (player.Team != Team) player.Team?.RemovePlayer(player.userID);
                    Team?.AddPlayer(player);
                }
                foreach (UInt64 member in Members.Keys.ToList()) {
                    AuthBuilding(member, player.userID);
                    AuthBuilding(player.userID, member);
                    AuthCodeLock(member, player.userID);
                    AuthCodeLock(player.userID, member);
                }
                if (_config.ChangeOwnerIDForLeader) ChangeOwnerIDForLeader(player.userID, LeaderID);
                _._playerToClan[player.userID] = this;
                ClanMemberJoined(player.UserIDString, ClanTag);
            }
            public void Kick(UInt64 target, Boolean disband = false) {
                String targetStringId = target.ToString();
                Members.Remove(target);
                Moderators.Remove(target);
                _._playerToClan.Remove(target);
                if (_config.TagInName) {
                    String name = _.covalence.Players.FindPlayerById(targetStringId)?.Name;
                    if (!String.IsNullOrWhiteSpace(name)) {
                        BasePlayer player = RelationshipManager.FindByID(target);
                        if (player != null) player.displayName = name;
                    }
                }
                if (!disband) {
                    if (_config.AutoTeamCreation && Team != null) Team.RemovePlayer(target);
                    if (Members.Count == 0) {
                        Disband();
                    }
                    else {
                        if (LeaderID == target) SetLeader((Moderators.Count > 0 ? Moderators : Members.Keys.ToList()).GetRandom());
                    }
                }
                foreach (UInt64 member in Members.Keys) {
                    DeAuthBuilding(member, target);
                    DeAuthBuilding(target, member);
                    DeAuthCodeLock(member, target);
                    DeAuthCodeLock(target, member);
                }
                ClanMemberGone(targetStringId, ClanTag);
            }
            public void SetLeader(UInt64 target) {
                if (!Members.ContainsKey(target)) return;
                if (Moderators.Contains(target)) Moderators.Remove(target);
                LeaderName = _.covalence.Players.FindPlayerById(target.ToString())?.Name;
                if (_config.ChangeOwnerIDForLeader) ChangeOwnerIDForLeader(LeaderID, target);
                LeaderID = target;
                Avatar = $"{_.Name}.Avatar{target}";
                if (_config.AutoTeamCreation) Team.SetTeamLeader(target);
            }
            public Int32 GetScore() => Members.Sum(member => member.Value.Point);
            public void UpdateLeaderName(String name) => LeaderName = name;
            public Int32 Online() => Members.Keys.Count(p => BasePlayer.Find(p.ToString()) != null);
            public String GetPercentClan() {
                Int32 need = GatherClan.Sum(x => x.Value.Need);
                Int32 current = GatherClan.Sum(x => x.Value.Farm);
                return $"{(Single)Math.Round(((Single)current * 100) / need, 2)}%";
            }
            public String GetPercentPlayer(UInt64 playerID) {
                Int32 need = GatherClan.Sum(x => x.Value.Need);
                Int32 current = Members[playerID].GatherMember.Sum(p => p.Value);
                return $"{(Single)Math.Round(((Single)current * 100) / need, 2)}%";
            }
        }
#endregion
#region [Skin-Data]
        private Dictionary<String, List<UInt64>> _skinsList = new Dictionary<String, List<UInt64>>();
        private void FillingSkinList() {
            Boolean needSave = false;
            foreach (String item in _wearItem) {
                if (_skinsList.ContainsKey(item) && _skinsList[item] != null && _skinsList[item].Count > 0) continue;
                List<UInt64> skins = ImageLibrary?.Call<List<UInt64>>("GetImageList", item) ?? new List<UInt64>();
                // Если скины не загружены из ImageLibrary, пытаемся загрузить из сохранённых данных
                if (skins.Count == 0 && _skinsList.ContainsKey(item)) {
                    skins = _skinsList[item];
                }
                _skinsList[item] = skins;
                if (!_skinsUsedList.ContainsKey(item)) {
                    _skinsUsedList[item] = new List<UInt64>();
                }
                needSave = true;
            }
            if (needSave) {
                SaveSkins();
                SaveUsedSkins();
            }
        }
        private void LoadSkins() {
            try {
                _skinsList = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<String, List<UInt64>>>($"{Name}/ClansSkin");
            }
            catch (Exception e) {
                PrintError(e.ToString());
            }
            if (_skinsList == null) _skinsList = new Dictionary<String, List<UInt64>>();
        }
        private void SaveSkins() => Interface.Oxide.DataFileSystem.WriteObject($"{Name}/ClansSkin", _skinsList);
#endregion
#region [SkinUseed-Data]
        private Dictionary<String, List<UInt64>> _skinsUsedList = new Dictionary<String, List<UInt64>>();
        private void LoadUsedSkins() {
            try {
                _skinsUsedList = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<String, List<UInt64>>>($"{Name}/ClansSkinUsed");
            }
            catch (Exception e) {
                PrintError(e.ToString());
            }
            if (_skinsUsedList == null) _skinsUsedList = new Dictionary<String, List<UInt64>>();
        }
        private void SaveUsedSkins() => Interface.Oxide.DataFileSystem.WriteObject($"{Name}/ClansSkinUsed", _skinsUsedList);
#endregion
#region [Oxide-Api]
        private void OnPluginLoaded(Plugin plugin) {
            // Если загружена ImageLibrary, перезагружаем скины
            if (plugin?.Name == "ImageLibrary") {
                ImageLibrary = plugin;
                FillingSkinList();
            }
            NextTick(() => {
                foreach (String hook in _gatherHooks) {
                    Unsubscribe(hook);
                    Subscribe(hook);
                }
            }
            );
        }
        private void OnServerSave() => SaveClans();
        private void Init() {
            _ = this;
            sb = new StringBuilder();
            LoadClans();
            LoadSkins();
            LoadUsedSkins();
            if (!_config.BlockCreateTeam) Unsubscribe(nameof(OnTeamCreate));
            AddCovalenceCommand(_config.ClanCommands.ToArray(), nameof(CmdClans));
            AddCovalenceCommand("aclan", nameof(AdminCmdClans));
        }
        private void OnServerInitialized() {
            FillingSkinList();
            _imageUI = new ImageUI();
            _imageUI.DownloadImage();
            FillingTeams();
            AddImage("https://i.postimg.cc/MpcXW1gf/cEBay4m.png", "loot-barrel");
            _cupboardList = BaseNetworkable.serverEntities.OfType<BuildingPrivlidge>().ToList();
            _codeLockList = BaseNetworkable.serverEntities.OfType<CodeLock>().ToList();
            if (_config.ChangeOwnerIDForLeader) _sameSiteList = BaseNetworkable.serverEntities.OfType<SamSite>().ToList();
            foreach (ClanData clan in _clansList) {
                foreach (UInt64 playerID in clan.Members.Keys) _playerToClan[playerID] = clan;
            }
            foreach (BasePlayer player in BasePlayer.activePlayerList) OnPlayerConnected(player);
            timer.Every(1f, TimeHandle);
        }
        private void Unload() {
            foreach (BasePlayer player in BasePlayer.activePlayerList) {
                CuiHelper.DestroyUi(player, Layer + ".Main");
                if (_config.TagInName) {
                    String Name = player.IPlayer.Name;
                    player.displayName = Name;
                }
            }
            if (_imageUI != null) {
                _imageUI.UnloadImages();
                _imageUI = null;
            }
            SaveClans();
            SaveSkins();
            SaveUsedSkins();
            _ = null;
            _config = null;
            sb = null;
        }
        private void OnNewSave(String filename) {
            try {
                if (_clansList == null || _clansList.Count == 0) LoadClans();
                if (_config.GameStoreSettings.Enable) RewardClans();
                _clansList.Clear();
                SaveClans();
            }
            catch (Exception e) {
                PrintError($"[OnNewSave] : {e.Message}");
            }
        }
#endregion
#region [Rust-Api]
        private void OnPlayerConnected(BasePlayer player) {
            if (player == null || !player.userID.IsSteamId()) return;
            GetAvatar(player.UserIDString, avatar => AddImage(avatar, $"{Name}.Avatar{player.UserIDString}"));
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return;
            if (_config.TagInName) player.displayName = $"[{clan.ClanTag}] {player.IPlayer.Name}";
            if (_config.AutoTeamCreation) clan.AddPlayer(player.userID);
            if (clan.IsOwner(player.userID)) clan.UpdateLeaderName(player.IPlayer.Name);
        }
        private void OnPlayerDisconnected(BasePlayer player) {
            if (player == null || !player.userID.IsSteamId()) return;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return;
            if (_config.TagInName) player.displayName = $"{player.IPlayer.Name}";
        }
        private void OnEntitySpawned(BuildingPrivlidge buildingPrivlidge) {
            if (buildingPrivlidge == null || !buildingPrivlidge.OwnerID.IsSteamId()) return;
            _cupboardList.Add(buildingPrivlidge);
            ClanData clan = FindClanByUser(buildingPrivlidge.OwnerID);
            if (clan == null) return;
            if (_config.ChangeOwnerIDForLeader) buildingPrivlidge.OwnerID = clan.LeaderID;
            foreach (UInt64 member in clan.Members.Keys) {
                buildingPrivlidge.authorizedPlayers.RemoveWhere((ulong x) => x == member);
                buildingPrivlidge.authorizedPlayers.Add(member);
            }
            buildingPrivlidge.UpdateMaxAuthCapacity();
            buildingPrivlidge.SendNetworkUpdate();
        }
        private void OnEntitySpawned(CodeLock codeLock) {
            if (codeLock == null || !codeLock.OwnerID.IsSteamId()) return;
            _codeLockList.Add(codeLock);
            ClanData clan = FindClanByUser(codeLock.OwnerID);
            if (clan == null) return;
            if (_config.ChangeOwnerIDForLeader) codeLock.OwnerID = clan.LeaderID;
            codeLock.code = $"{UnityEngine.Random.Range(0, 1000)}";
            Effect.server.Run(codeLock.effectLocked.resourcePath, codeLock, 0, Vector3.zero, Vector3.forward, null, false);
            codeLock.SetFlag(BaseEntity.Flags.Locked, true);
            foreach (UInt64 member in clan.Members.Keys) {
                if (!codeLock.whitelistPlayers.Contains(member)) codeLock.whitelistPlayers.Add(member);
            }
            codeLock.SendNetworkUpdate();
        }
        private void OnEntitySpawned(SamSite samSite) {
            if (!_config.ChangeOwnerIDForLeader || samSite == null || !samSite.OwnerID.IsSteamId()) return;
            _sameSiteList.Add(samSite);
            ClanData clan = FindClanByUser(samSite.OwnerID);
            if (clan == null) return;
            samSite.OwnerID = clan.LeaderID;
            samSite.SendNetworkUpdate();
        }
        private void OnEntitySpawned(AutoTurret autoTurret) {
            if (!_config.ChangeOwnerIDForLeader || autoTurret == null || !autoTurret.OwnerID.IsSteamId()) return;
            ClanData clan = FindClanByUser(autoTurret.OwnerID);
            if (clan == null) return;
            autoTurret.OwnerID = clan.LeaderID;
            autoTurret.SendNetworkUpdate();
        }
        private object CanUseLockedEntity(BasePlayer player, KeyLock keyLock) {
            if (player == null || keyLock == null || !keyLock.IsLocked()) return null;
            BaseEntity parentEntity = keyLock.GetParentEntity();
            UInt64 ownerID = keyLock.OwnerID.IsSteamId() ? keyLock.OwnerID : parentEntity != null ? parentEntity.OwnerID : 0;
            if (!ownerID.IsSteamId() || ownerID == player.userID) return null;
            if (IsTeammates(ownerID, player.userID)) return true;
            return null;
        }
        private void OnEntityKill(BuildingPrivlidge buildingPrivlidge) {
            if (buildingPrivlidge == null || !buildingPrivlidge.OwnerID.IsSteamId()) return;
            if (_cupboardList.Contains(buildingPrivlidge)) _cupboardList.Remove(buildingPrivlidge);
        }
        private void OnEntityKill(CodeLock codeLock) {
            if (codeLock == null || !codeLock.OwnerID.IsSteamId()) return;
            if (_codeLockList.Contains(codeLock)) _codeLockList.Remove(codeLock);
        }
        private void OnEntityKill(SamSite samSite) {
            if (!_config.ChangeOwnerIDForLeader || samSite == null || !samSite.OwnerID.IsSteamId()) return;
            if (_sameSiteList.Contains(samSite)) _sameSiteList.Remove(samSite);
        }
        private object OnTurretTarget(AutoTurret turret, BasePlayer target) {
            if (target == null || turret == null || target.limitNetworking || (turret is NPCAutoTurret && !target.userID.IsSteamId()) || target.userID == turret.OwnerID) return null;
            ClanData clan = FindClanByUser(turret.OwnerID);
            if (clan == null) return null;
            if (clan.IsMember(target.userID)) return false;
            return null;
        }
        private object OnSamSiteTarget(SamSite samSite, BaseVehicle vehicle) {
            if (samSite == null || !samSite.OwnerID.IsSteamId() || vehicle == null) return null;
            ClanData clan = FindClanByUser(samSite.OwnerID);
            if (clan == null) return null;
            if (vehicle.OwnerID == samSite.OwnerID || clan.IsMember(vehicle.OwnerID)) return true;
            foreach (var mounted in vehicle.allMountPoints .Where(allMountPoint => allMountPoint != null && allMountPoint.mountable != null) .Select(allMountPoint => allMountPoint.mountable.GetMounted()) .Where(mounted => mounted != null)) {
                if (mounted.userID == samSite.OwnerID || clan.IsMember(mounted.userID)) return true;
            }
            return null;
        }
        private void OnDispenserGather(ResourceDispenser dispenser, BasePlayer player, Item item) {
            if (player == null || item == null || !_gatherItem.Contains(item.info.shortname)) return;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return;
            String ShortName = item.info.shortname;
            if (ShortName.Contains("metal.fragments")) ShortName = "metal.ore";
            if (ShortName.Contains("sulfur")) ShortName = "sulfur.ore";
            if (ShortName.Contains("metal.refined")) ShortName = "hq.metal.ore";
            if (ShortName.Contains("charcoal")) ShortName = "wood";
            clan.GatherClan[ShortName].Farm += item.amount;
            clan.Members[player.userID].GatherMember[ShortName] += item.amount;
        }
        private void OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item) {
            if (player == null || item == null || !_gatherItem.Contains(item.info.shortname)) return;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return;
            String ShortName = item.info.shortname;
            if (ShortName.Contains("metal.fragments")) ShortName = "metal.ore";
            if (ShortName.Contains("sulfur")) ShortName = "sulfur.ore";
            if (ShortName.Contains("metal.refined")) ShortName = "hq.metal.ore";
            if (ShortName.Contains("charcoal")) ShortName = "wood";
            clan.GatherClan[ShortName].Farm += item.amount;
            clan.Members[player.userID].GatherMember[ShortName] += item.amount;
            clan.Members[player.userID].Point += GetPointConfig(ShortName);
        }
        private void OnCollectiblePickup(CollectibleEntity collectible, BasePlayer player) {
            if (player == null || collectible == null || collectible.itemList == null) return;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return;
            foreach (var itemAmount in collectible.itemList) {
                if (itemAmount.itemDef != null) {
                    if (!_gatherItem.Contains(itemAmount.itemDef.shortname)) continue;
                    String ShortName = itemAmount.itemDef.shortname;
                    if (ShortName.Contains("metal.fragments")) ShortName = "metal.ore";
                    if (ShortName.Contains("sulfur")) ShortName = "sulfur.ore";
                    if (ShortName.Contains("metal.refined")) ShortName = "hq.metal.ore";
                    if (ShortName.Contains("charcoal")) ShortName = "wood";
                    clan.GatherClan[ShortName].Farm += (Int32)itemAmount.amount;
                    clan.Members[player.userID].GatherMember[ShortName] += (Int32)itemAmount.amount;
                }
            }
        }
        private void OnItemAddedToContainer(ItemContainer container, Item item) {
            if (container == null || item == null || !_wearItem.Contains(item.info.shortname)) return;
            BasePlayer player = container.GetOwnerPlayer();
            if (player == null || !player.userID.IsSteamId()) return;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return;
            if (clan.SkinList.ContainsKey(item.info.shortname)) {
                UInt64 skin = clan.SkinList[item.info.shortname];
                if (skin != 0) {
                    if (item.info.category == ItemCategory.Attire) {
                        if (container == player.inventory.containerWear) ApplySkinToItem(item, skin);
                    }
                    else {
                        ApplySkinToItem(item, skin);
                    }
                }
            }
        }
        private void OnLootEntity(BasePlayer player, LootContainer entity) {
            if (player == null || entity == null || entity.OwnerID.IsSteamId() || entity.net == null || _lootEntity.Contains(entity.net.ID.Value)) return;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return;
            clan.GatherClan["loot-barrel"].Farm++;
            clan.Members[player.userID].GatherMember["loot-barrel"]++;
            clan.Members[player.userID].Point += GetPointConfig("loot-barrel");
            _lootEntity.Add(entity.net.ID.Value);
        }
        private void OnEntityTakeDamage(PatrolHelicopter helicopter, HitInfo info) {
            if (helicopter == null || helicopter.net == null || info == null || info.InitiatorPlayer == null) return;
            _lastHeli[helicopter.net.ID.Value] = info.InitiatorPlayer;
        }
        private void OnEntityTakeDamage(BasePlayer player, HitInfo info) {
            if (player == null || !player.userID.IsSteamId() || info == null) return;
            BasePlayer initiatorPlayer = info.InitiatorPlayer;
            if (initiatorPlayer == null || !initiatorPlayer.userID.IsSteamId() || player.userID == initiatorPlayer.userID) return;
            ClanData clan = FindClanByUser(initiatorPlayer.userID);
            if (clan == null) return;
            Boolean friendlyFire = clan.Members[initiatorPlayer.userID].FriendlyFire;
            if (!friendlyFire && clan.IsMember(player.userID)) {
                if (initiatorPlayer.SecondsSinceAttacked > 5) {
                    initiatorPlayer.ChatMessage(GetLang("DAMAGE_FF_OFF", player.UserIDString));
                    initiatorPlayer.lastAttackedTime = UnityEngine.Time.time;
                }
                info.damageTypes.ScaleAll(0);
                return;
            }
        }
        private void OnPlayerDeath(BasePlayer player, HitInfo info) {
            if (player == null || info == null || (player.ShortPrefabName == "player" && !player.userID.IsSteamId())) return;
            if (info.damageTypes.Has(DamageType.Suicide)) {
                ClanData clan = FindClanByUser(player.userID);
                if (clan == null) return;
                clan.Members[player.userID].Death++;
                clan.Members[player.userID].Point -= GetPointConfig("Suicide");
                return;
            }
            BasePlayer attacker = info.InitiatorPlayer;
            if (attacker == null || !attacker.userID.IsSteamId() || IsTeammates(player.userID, attacker.userID)) return;
            if (player.userID.IsSteamId()) {
                ClanData clan = FindClanByUser(player.userID);
                if (clan != null) {
                    clan.Members[player.userID].Death++;
                    clan.Members[player.userID].Point -= GetPointConfig("Death");
                }
                ClanData clanAttacker = FindClanByUser(attacker.userID);
                if (clanAttacker != null) {
                    clanAttacker.Members[attacker.userID].Kill++;
                    clanAttacker.Members[attacker.userID].Point += GetPointConfig("Kill");
                }
            }
        }
        private void OnEntityDeath(PatrolHelicopter entity, HitInfo info) {
            if (entity == null || entity.net == null || info == null) return;
            BasePlayer player;
            if (_lastHeli.TryGetValue(entity.net.ID.Value, out player) && player != null) {
                ClanData clan = FindClanByUser(player.userID);
                if (clan == null) return;
                clan.Members[player.userID].Point += GetPointConfig("PatrolHelicopter");
                foreach (BasePlayer onlinePlayer in BasePlayer.activePlayerList) onlinePlayer.ChatMessage(GetLang("PATROLHELICOPTER", onlinePlayer.UserIDString, clan.ClanTag));
            }
        }
        private void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
            if (entity == null || info == null) return;
            BasePlayer player = info.InitiatorPlayer;
            if (player == null) return;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return;
            if (entity is BradleyAPC) {
                clan.Members[player.userID].Point += GetPointConfig("BradleyAPC");
                foreach (BasePlayer onlinePlayer in BasePlayer.activePlayerList) onlinePlayer.ChatMessage(GetLang("BRADLEYAPC", onlinePlayer.UserIDString, clan.ClanTag));
            }
            else if (entity.name.Contains("barrel")) {
                clan.Members[player.userID].Point += GetPointConfig("loot-barrel");
                clan.GatherClan["loot-barrel"].Farm++;
                clan.Members[player.userID].GatherMember["loot-barrel"]++;
            }
            else if (entity.name.Contains("wall") && !entity.name.Contains("wall.external.high")) {
                BuildingBlock buildingBlock = entity as BuildingBlock;
                if (buildingBlock == null) return;
                Int32 tier = (Int32)buildingBlock.grade;
                if (tier <= 1) return;
                if (tier == 2) clan.Members[player.userID].Point += GetPointConfig("WallTier2");
                if (tier == 3) clan.Members[player.userID].Point += GetPointConfig("WallTier3");
                if (tier == 4) clan.Members[player.userID].Point += GetPointConfig("WallTier4");
            }
        }
        private object OnTeamCreate(BasePlayer player) {
            if (player == null) return null;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) {
                player.ChatMessage(GetLang("NO_CLAN", player.UserIDString));
                return false;
            }
            return null;
        }
        private object OnTeamLeave(RelationshipManager.PlayerTeam team, BasePlayer player) {
            if (team == null || player == null) return null;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return null;
            if (clan.IsOwner(player.userID)) {
                player.ChatMessage(GetLang("IS_LEADER", player.UserIDString));
                return true;
            }
            clan.Kick(player.userID);
            return null;
        }
        private object OnTeamKick(RelationshipManager.PlayerTeam team, BasePlayer player, UInt64 target) {
            if (team == null || player == null) return null;
            ClanData clan = FindClanByUser(player.userID);
            if (clan == null) return null;
            if (!clan.IsMember(target)) return false;
            clan.Kick(target);
            return null;
        }
        private object OnTeamInvite(BasePlayer inviter, BasePlayer target) {
            if (inviter == null || target == null || !target.userID.IsSteamId()) return null;
            if (_cooldownPlayer.ContainsKey(inviter.userID) && _cooldownPlayer[inviter.userID].Subtract(DateTime.Now).TotalSeconds >= 0) {
                inviter.ChatMessage(GetLang("NO_FLOOD", inviter.UserIDString));
                return false;
            }
            _cooldownPlayer[inviter.userID] = DateTime.Now.AddSeconds(2f);
            SendInvite(inviter, target.userID);
            return null;
        }
        private void OnTeamPromote(RelationshipManager.PlayerTeam team, BasePlayer newLeader) {
            if (team == null || newLeader == null) return;
            ClanData clan = FindClanByUser(team.teamLeader);
            if (clan == null) return;
            clan.SetLeader(newLeader.userID);
        }
        private object OnTeamAcceptInvite(RelationshipManager.PlayerTeam team, BasePlayer player) {
            if (team == null || player == null) return null;
            AcceptInvite(player);
            return null;
        }
        private void OnTeamRejectInvite(BasePlayer player, RelationshipManager.PlayerTeam team) {
            if (team == null || player == null) return;
            Invite invite = _invites.Find(x => x.Recevier.userID == player.userID);
            if (invite == null) {
                player.ChatMessage(GetLang("NO_INVITE", player.UserIDString));
                return;
            }
            player.ChatMessage(GetLang("CANCEL_INVITE", player.UserIDString));
            invite.Inviter.ChatMessage(GetLang("INVITER_CANCEL_INVITE", invite.Inviter.UserIDString, player.IPlayer.Name));
            _invites.Remove(invite);
        }
#endregion
#region [Functional]
        private void TimeHandle() {
            foreach (BasePlayer player in BasePlayer.activePlayerList) {
                ClanData clan = FindClanByUser(player.userID);
                if (clan == null) continue;
                clan.Members[player.userID].Online++;
            }
        }
        private void RemoveInvite(String ClanTag, UInt64 playerID) {
            Invite invite = _invites.Find(p => p.ClanTag == ClanTag && p.Recevier.userID == playerID);
            if (invite == null) return;
            invite.Recevier.ChatMessage(GetLang("NO_TIME", invite.Recevier.UserIDString));
            invite.Recevier.ClearPendingInvite();
            invite.Inviter.ChatMessage(GetLang("INVITER_NO_TIME", invite.Inviter.UserIDString, invite.Recevier.IPlayer.Name));
            _invites.Remove(invite);
        }
        private void ApplySkinToItem(Item item, UInt64 Skin) {
            item.skin = Skin;
            item.MarkDirty();
            BaseEntity heldEntity = item.GetHeldEntity();
            if (heldEntity == null) return;
            heldEntity.skinID = Skin;
            heldEntity.SendNetworkUpdate();
        }
        private static void AuthCodeLock(UInt64 playerID, UInt64 friendID) {
            foreach (CodeLock codeLock in _._codeLockList) {
                if (playerID != codeLock.OwnerID || codeLock.whitelistPlayers.Contains(friendID)) continue;
                codeLock.whitelistPlayers.Add(friendID);
                codeLock.SendNetworkUpdate();
            }
        }
        private static void DeAuthCodeLock(UInt64 playerID, UInt64 friendID) {
            foreach (CodeLock codeLock in _._codeLockList) {
                if (playerID != codeLock.OwnerID || !codeLock.whitelistPlayers.Contains(friendID)) continue;
                codeLock.whitelistPlayers.Remove(friendID);
                codeLock.SendNetworkUpdate();
            }
        }
        private static void AuthBuilding(UInt64 playerID, UInt64 friendID) {
            foreach (BuildingPrivlidge buildingPrivlidge in _._cupboardList) {
                if (playerID != buildingPrivlidge.OwnerID) continue;
                buildingPrivlidge.authorizedPlayers.RemoveWhere((ulong x) => x == friendID);
                buildingPrivlidge.authorizedPlayers.Add(friendID);
                buildingPrivlidge.SendNetworkUpdate();
            }
        }
        private static void DeAuthBuilding(UInt64 playerID, UInt64 friendID) {
            foreach (BuildingPrivlidge buildingPrivlidge in _._cupboardList) {
                if (playerID != buildingPrivlidge.OwnerID) continue;
                buildingPrivlidge.authorizedPlayers.RemoveWhere((ulong x) => x == friendID);
                buildingPrivlidge.SendNetworkUpdate();
            }
        }
        private static void ChangeOwnerIDForLeader(UInt64 playerID, UInt64 leaderID) {
            foreach (BuildingPrivlidge buildingPrivlidge in _._cupboardList.Where(p => p.OwnerID == playerID)) {
                buildingPrivlidge.OwnerID = leaderID;
                buildingPrivlidge.SendNetworkUpdate();
            }
            foreach (CodeLock codeLock in _._codeLockList.Where(p => p.OwnerID == playerID)) {
                codeLock.OwnerID = leaderID;
                codeLock.SendNetworkUpdate();
            }
            foreach (SamSite samSite in _._sameSiteList.Where(p => p.OwnerID == playerID)) {
                samSite.OwnerID = leaderID;
                samSite.SendNetworkUpdate();
            }
        }
        private Int32 GetPointConfig(String Name) {
            if (_config.ScoreTable.ContainsKey(Name)) return _config.ScoreTable[Name];
            return 0;
        }
        private Boolean IsTeammates(UInt64 player, UInt64 friend) {
            return player == friend || RelationshipManager.ServerInstance.FindPlayersTeam(player)?.members?.Contains(friend) == true || FindClanByUser(player)?.IsMember(friend) == true;
        }
        Int32 GetClanIndex(String ClanTag) {
            Int32 Top = 1;
            IEnumerable<ClanData> clansList = _clansList.OrderByDescending(p => p.GetScore());
            foreach (ClanData clan in clansList) {
                if (clan.ClanTag == ClanTag) break;
                Top++;
            }
            return Top;
        }
        public String FormatShortTime(TimeSpan time, String UserIDString) {
            String result = String.Empty;
            Boolean GetLanguage = lang.GetLanguage(UserIDString) == "ru";
            if (time == new TimeSpan()) return "0 сек.";
            if (time.Days != 0) result += $"{time.Days} {(GetLanguage ? "д." : "d.")} ";
            if (time.Hours != 0) result += $"{time.Hours} {(GetLanguage ? "час." : "hour.")} ";
            if (time.Minutes != 0) result += $"{time.Minutes} {(GetLanguage ? "мин." : "min.")} ";
            if (time.Seconds != 0) result += $"{time.Seconds} {(GetLanguage ? "сек." : "sec.")} ";
            return result;
        }
        private Int32 FindItemID(String shortName) {
            Int32 val;
            if (_itemIds.TryGetValue(shortName, out val)) return val;
            ItemDefinition definition = ItemManager.FindItemDefinition(shortName);
            if (definition == null) return 0;
            val = definition.itemid;
            _itemIds[shortName] = val;
            return val;
        }
        private void GetAvatar(String userId, Action<String> callback) {
            if (callback == null) return;
            try {
                webrequest.Enqueue($"http://steamcommunity.com/profiles/{userId}?xml=1", null, (code, response) => {
                    if (code != 200 || response == null) return;
                    String avatar = Regex.Match(response).Groups[1].ToString();
                    if (String.IsNullOrEmpty(avatar)) return;
                    callback.Invoke(avatar);
                }
                , this);
            }
            catch (Exception e) {
                PrintError($"{e.Message}");
            }
        }
        private void RewardClans() {
            if (String.IsNullOrEmpty(_config.GameStoreSettings.ShopID) || String.IsNullOrEmpty(_config.GameStoreSettings.SecretKey) || String.IsNullOrEmpty(_config.GameStoreSettings.ServerID)) return;
            StringBuilder text = new StringBuilder();
            IEnumerable<ClanData> _clansReward = _clansList.OrderByDescending(x => x.GetScore());
            Int32 i = 1;
            foreach (ClanData clan in _clansReward) {
                if (!_config.GameStoreSettings.RewardList.ContainsKey(i) || clan.GetScore() <= _config.GameStoreSettings.MinPoint) break;
                Int32 Bonus = _config.GameStoreSettings.RewardList[i];
                Double BonusPlayer = _config.GameStoreSettings.Prize ? Bonus / (Double)clan.Members.Count : Bonus;
                text.Append(_config.GameStoreSettings.Prize ? $"{i}. {clan.ClanTag} received a {BonusPlayer} usd each." : $"{i}. {clan.ClanTag} получили по {BonusPlayer} руб.");
                foreach (KeyValuePair<UInt64, ClanData.PlayerData> member in clan.Members) {
                    if (member.Value.Point <= _config.GameStoreSettings.MinPointPlayer) continue;
                    webrequest.Enqueue($"https://gamestores.app/api?shop_id={_config.GameStoreSettings.ShopID}&secret={_config.GameStoreSettings.SecretKey}&server={_config.GameStoreSettings.ServerID}&action=moneys&type=plus&steam_id={member.Key}&amount={BonusPlayer}&mess=Награда за клановый топ.", "", (code, response) => {
                        Puts(LanguageEn ? $"Player {member.Key} received: {BonusPlayer} units for the store" : $"Игроку {member.Key} получил: {BonusPlayer} единиц на магазин");
                    }
                    , this, Core.Libraries.RequestMethod.GET);
                }
                i++;
            }
            if (_config.DiscordSetting.DiscordNotificationEnable) {
                DiscordMessage message = new DiscordMessage();
                Embed embed = new Embed();
                embed.AddTitle(LanguageEn ? "List of top clans by past wipe" : "Список топа кланов по прошедшему вайпу");
                embed.AddDescription(text.ToString());
                embed.AddColor("#de8732");
                message.AddEmbed(embed);
                SendDiscordMessage(_config.DiscordSetting.DiscordWebHook, message);
            }
        }
        private void FillingTeams() {
            if (_config.AutoTeamCreation) {
                RelationshipManager.maxTeamSize = _config.LimitSettings.MemberLimit;
                _clansList.ForEach(clan => {
                    clan.FindOrCreateTeam();
                    clan.Members.Keys.ToList().ForEach(member => clan.AddPlayer(member));
                }
                );
            }
        }
#endregion
#region [Interface]
        [ChatCommand("ctop")]
        void MainUi(BasePlayer player) {
            CuiHelper.DestroyUi(player, Layer);
            CuiElementContainer container = new CuiElementContainer();
            container.Add(new CuiElement {
                Name = Layer, Parent = ".Mains", Components = {
                    new CuiRawImageComponent {
                        Png = _imageUI.GetImage("FON_CLAN_TOP")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "-0.315 -0.27", AnchorMax = "1.3 1.275", OffsetMax = "0 0"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.8 0.804", AnchorMax = "0.817 0.832"
                }
                , Button = {
                    Close = Layer, Command = "clan.closeui", Color = "0 0 0 0"
                }
                , Text = {
                    Text = ""
                }
            }
            , Layer);
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.326 0.74", AnchorMax = "0.4 0.778"
                }
                , Button = {
                    Command = "
// ... [Code preview truncated due to length. Full source in attached file] ...

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