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

FREE NTeleportation : 1.9.1 1.9.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
//#define DEBUG
using Facepunch;
using Network;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust;
using Oxide.Game.Rust.Cui;
using Oxide.Plugins.NTeleportationExtensionMethods;
using Rust;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Reflection;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("NTeleportation", "nivex", "1.9.1")]
    [Description("Multiple teleportation systems for admin and players")]
    class NTeleportation : RustPlugin {
        [PluginReference]
        private Plugin Clans, Economics, IQEconomic, ServerRewards, Friends, CompoundTeleport, ZoneManager, NoEscape, RaidBlock, PopupNotifications, BlockUsers;
        private Dictionary<string, BasePlayer> _codeToPlayer = new();
        private Dictionary<string, string> _playerToCode = new();
        private bool newSave;
        private const string NewLine = "\n";
        private const string TPA = "tpa";
        private readonly string[] emptyArg = Array.Empty<string>();
        private const string PermAdmin = "nteleportation.admin";
        private const string PermRestrictions = "nteleportation.norestrictions";
        private const string ConfigDefaultPermVip = "nteleportation.vip";
        private const string PermHome = "nteleportation.home";
        private const string PermWipeHomes = "nteleportation.wipehomes";
        private const string PermCraftHome = "nteleportation.crafthome";
        private const string PermCaveHome = "nteleportation.cavehome";
        private const string PermDeleteHome = "nteleportation.deletehome";
        private const string PermHomeHomes = "nteleportation.homehomes";
        private const string PermImportHomes = "nteleportation.importhomes";
        private const string PermRadiusHome = "nteleportation.radiushome";
        private const string PermCraftTpR = "nteleportation.crafttpr";
        private const string PermCaveTpR = "nteleportation.cavetpr";
        private const string PermTpR = "nteleportation.tpr";
        private const string PermTpA = "nteleportation.tpa";
        private const string PermTp = "nteleportation.tp";
        private const string PermDisallowTpToMe = "nteleportation.disallowtptome";
        private const string PermTpT = "nteleportation.tpt";
        private const string PermTpB = "nteleportation.tpb";
        private const string PermTpN = "nteleportation.tpn";
        private const string PermTpL = "nteleportation.tpl";
        private const string PermTpConsole = "nteleportation.tpconsole";
        private const string PermTpRemove = "nteleportation.tpremove";
        private const string PermTpSave = "nteleportation.tpsave";
        private const string PermExempt = "nteleportation.exemptfrominterruptcountdown";
        private const string PermFoundationCheck = "nteleportation.bypassfoundationcheck";
        private const string PermTpMarker = "nteleportation.tpmarker";
        private DynamicConfigFile dataConvert;
        private DynamicConfigFile dataDisabled;
        private DynamicConfigFile dataAdmin;
        private DynamicConfigFile dataHome;
        private DynamicConfigFile dataTPR;
        private DynamicConfigFile dataTPT;
        private Dictionary<ulong, AdminData> _Admin;
        private Dictionary<ulong, HomeData> _Home;
        private Dictionary<ulong, TeleportData> _TPR;
        private Dictionary<string, List<string>> TPT = new();
        private bool changedAdmin;
        private bool changedHome;
        private bool changedTPR;
        private bool changedTPT;
        private float boundary;
        private readonly Dictionary<ulong, float> TeleportCooldowns = new();
        private readonly Dictionary<ulong, BasePlayer> PlayersRequests = new();
        private readonly Dictionary<int, string> ReverseBlockedItems = new();
        private readonly Dictionary<ulong, Vector3> teleporting = new();
        private SortedDictionary<string, Vector3> caves = new();
        private readonly List<TeleportTimer> TeleportTimers = new();
        private readonly List<PendingRequest> PendingRequests = new();
        private List<PrefabInfo> monuments = new();
        private bool outpostEnabled;
        private bool banditEnabled;
        private class PrefabInfo {
            public Quaternion rotation;
            public Vector2 positionXZ;
            public Vector3 position;
            public Vector3 extents;
            public string name;
            public string prefab;
            public bool sphere;
            public PrefabInfo() {
            }
            public PrefabInfo(Vector3 position, Quaternion rotation, Vector3 extents, float extra, string name, string prefab, bool sphere) {
                this.sphere = sphere;
                this.position = position;
                this.rotation = rotation;
                this.name = name;
                this.prefab = prefab;
                this.extents = extents + new Vector3(extra, extra, extra);
                positionXZ = position.XZ2D();
            }
            public bool IsInBounds(Vector3 a) {
                if (sphere) {
                    if (a.y > position.y + (extents.y * 1.75f)) {
                        return false;
                    }
                    return Vector3Ex.Distance2D(a, position) <= extents.Max();
                }
                Vector3 v = Quaternion.Inverse(rotation) * (a - position);
                return v.x <= extents.x && v.x > -extents.x && v.y <= extents.y && v.y > -extents.y && v.z <= extents.z && v.z > -extents.z;
            }
        }
#region Configuration
        private static Configuration config;
        public class InterruptSettings {
            [JsonProperty(PropertyName = "Interrupt Teleport At Specific Monuments", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> Monuments = new List<string>();
            [JsonProperty(PropertyName = "Above Water")]
            public bool AboveWater = true;
            [JsonProperty(PropertyName = "Under Water")]
            public bool UnderWater;
            [JsonProperty(PropertyName = "Balloon")]
            public bool Balloon = true;
            [JsonProperty(PropertyName = "Boats")]
            public bool Boats;
            [JsonProperty(PropertyName = "Cargo Ship")]
            public bool Cargo = true;
            [JsonProperty(PropertyName = "Cold")]
            public bool Cold = false;
            [JsonProperty(PropertyName = "Excavator")]
            public bool Excavator = false;
            [JsonProperty(PropertyName = "Hot")]
            public bool Hot = false;
            [JsonProperty(PropertyName = "Hostile")]
            public bool Hostile = false;
            [JsonProperty(PropertyName = "Hostile Includes Towns")]
            public bool IncludeHostileTown = true;
            [JsonProperty(PropertyName = "Hurt")]
            public bool Hurt = true;
            [JsonProperty(PropertyName = "Junkpiles")]
            public bool Junkpiles;
            [JsonProperty(PropertyName = "Lift")]
            public bool Lift = true;
            [JsonProperty(PropertyName = "Monument")]
            public bool Monument = false;
            [JsonProperty(PropertyName = "Ignore Monument Marker Prefab")]
            public bool BypassMonumentMarker = false;
            [JsonProperty(PropertyName = "Mounted")]
            public bool Mounted = true;
            [JsonProperty(PropertyName = "Oil Rig")]
            public bool Oilrig = false;
            [JsonProperty(PropertyName = "Safe Zone")]
            public bool Safe = true;
            [JsonProperty(PropertyName = "Swimming")]
            public bool Swimming = false;
            [JsonProperty(PropertyName = "Fall")]
            public bool Fall = true;
            internal bool OnEntityTakeDamage => Hurt || Cold || Hot || Fall;
        }
        private void OnPlayerSleep(BasePlayer player) {
            DelayedTeleportHome(player);
        }
        private List<(Vector3 position, float sqrDistance)> safeZones = new();
        private bool IsSafeZone(Vector3 a, float extra = 0f)  // SetUserTargetHitPos
        {
            if (safeZones.Count == 0) {
                foreach (var triggerSafeZone in TriggerSafeZone.allSafeZones) {
                    float radius = (triggerSafeZone.triggerCollider == null ? 25f : ColliderEx.GetRadius(triggerSafeZone.triggerCollider, triggerSafeZone.transform.localScale)) + extra;
                    Vector3 center = triggerSafeZone.triggerCollider?.bounds.center ?? triggerSafeZone.transform.position;
                    safeZones.Add((center, radius * radius));
                }
            }
            return safeZones.Exists(zone => (zone.position - a).sqrMagnitude <= zone.sqrDistance);
        }
        public bool IsAuthed(BasePlayer player, BuildingPrivlidge priv) => (priv.OwnerID == player.userID && config.Home.UsableIntoBuildingBlocked) || config.Home.UsableIntoBuildingBlocked || priv.IsAuthed(player);
        private List<ulong> delayedTeleports = new();
        public void DelayedTeleportHome(BasePlayer player) {
            if (player == null) {
                return;
            }
            ulong userid = player.userID;
            if (delayedTeleports.Contains(userid)) {
                return;
            }
            delayedTeleports.Add(userid);
            timer.Once(0.2f, () => {
                if (player.IsKilled() || player.IsDead() || player.IsConnected || !IsSafeZone(player.transform.position)) {
                    delayedTeleports.Remove(userid);
                    return;
                }
                timer.Once(config.Settings.TeleportHomeSafeZone, () => {
                    if (player.IsKilled() || player.IsDead() || player.IsConnected || !IsSafeZone(player.transform.position) || !delayedTeleports.Remove(userid)) {
                        return;
                    }
                    var homes = new List<(Vector3 position, BuildingManager.Building building, string home)>();
                    foreach (var (home, position) in GetPlayerHomes(player)) {
                        var priv = player.GetBuildingPrivilege(new OBB(position, player.transform.rotation, player.bounds));
                        if (priv.IsKilled() || !IsAuthed(player, priv)) {
                            continue;
                        }
                        var building = priv.GetBuilding();
                        if (building == null || !building.HasDecayEntities()) {
                            continue;
                        }
                        homes.Add((position, building, home));
                    }
                    if (homes.Count == 0) {
                        using var beds = SleepingBag.FindForPlayer(userid, true);
                        foreach (var bed in beds) {
                            var building = bed.GetBuilding();
                            if (building == null || !building.HasDecayEntities()) {
                                continue;
                            }
                            homes.Add((bed.transform.position, building, bed.niceName));
                        }
                    }
                    if (homes.Count > 0) {
                        homes.Sort((x, y) => x.building.decayEntities.Count.CompareTo(y.building.decayEntities.Count));
                        Puts($"Teleporting {player.displayName} ({player.userID}) in safe zone from {player.transform.position} to home ({homes[0].home}) at {homes[0].position}");
                        Teleport(player, homes[0].position, "home", 0uL, false, false, true, true, true);
                    }
                }
                );
            }
            );
        }
        private object OnPlayerRespawn(BasePlayer player) {
            if (player == null) return null;
            var settings = GetSettings("outpost");
            if (settings == null || settings.Location == Vector3.zero) return null;
            if (Interface.Oxide.CallHook("CanTeleport", player, settings.Location) != null) return null;
            RemoveHostility(player);
            return new BasePlayer.SpawnPoint {
                pos = settings.Location, rot = Quaternion.identity
            }
            ;
        }
        private static void RemoveHostility(BasePlayer player) {
            if (player.State.unHostileTimestamp > TimeEx.currentTimestamp) {
                player.State.unHostileTimestamp = TimeEx.currentTimestamp;
                player.DirtyPlayerState();
                player.ClientRPC(RpcTarget.Player("SetHostileLength", player), 0f);
            }
            if (player.unHostileTime > Time.realtimeSinceStartup) {
                player.unHostileTime = Time.realtimeSinceStartup;
            }
        }
        public class PluginSettings {
            [JsonProperty(PropertyName = "Delay Saving Data On Server Save")]
            public double SaveDelay = 4.0;
            [JsonProperty("TPB")]
            public TPBSettings TPB = new();
            [JsonProperty(PropertyName = "Interrupt TP")]
            public InterruptSettings Interrupt = new();
            [JsonProperty(PropertyName = "Auto Wake Up After Teleport")]
            public bool AutoWakeUp;
            [JsonProperty(PropertyName = "Seconds Until Teleporting Home Offline Players Within SafeZones")]
            public float TeleportHomeSafeZone;
            [JsonProperty(PropertyName = "Respawn Players At Outpost")]
            public bool RespawnOutpost;
            [JsonProperty(PropertyName = "Block Teleport (NoEscape)")]
            public bool BlockNoEscape;
            [JsonProperty(PropertyName = "Block Teleport (RaidBlock)")]
            public bool RaidBlock;
            [JsonProperty(PropertyName = "Block Teleport (ZoneManager)")]
            public bool BlockZoneFlag;
            [JsonProperty(PropertyName = "Block Map Marker Teleport (AbandonedBases)")]
            public bool BlockAbandoned;
            [JsonProperty(PropertyName = "Block Map Marker Teleport (RaidableBases)")]
            public bool BlockRaidable;
            [JsonProperty(PropertyName = "Chat Name")]
            public string ChatName = "<color=red>Teleportation</color> \n\n";
            [JsonProperty(PropertyName = "Chat Steam64ID")]
            public ulong ChatID = 76561199056025689;
            [JsonProperty(PropertyName = "Check Boundaries On Teleport X Y Z")]
            public bool CheckBoundaries = true;
            [JsonProperty(PropertyName = "Check Boundaries Min Height")]
            public float BoundaryMin = -100f;
            [JsonProperty(PropertyName = "Check Boundaries Max Height")]
            public float BoundaryMax = 2000f;
            [JsonProperty(PropertyName = "Check If Inside Rock")]
            public bool Rock = true;
            [JsonProperty(PropertyName = "Height To Prevent Teleporting To/From (0 = disabled)")]
            public float ForcedBoundary;
            [JsonProperty(PropertyName = "Data File Directory (Blank = Default)")]
            public string DataFileFolder = string.Empty;
            [JsonProperty(PropertyName = "Draw Sphere On Set Home")]
            public bool DrawHomeSphere = true;
            [JsonProperty(PropertyName = "Homes Enabled")]
            public bool HomesEnabled = true;
            [JsonProperty(PropertyName = "TPR Enabled")]
            public bool TPREnabled = true;
            [JsonProperty(PropertyName = "Strict Foundation Check")]
            public bool StrictFoundationCheck = false;
            [JsonProperty(PropertyName = "Minimum Temp")]
            public float MinimumTemp = 0f;
            [JsonProperty(PropertyName = "Maximum Temp")]
            public float MaximumTemp = 40f;
            [JsonProperty(PropertyName = "Blocked Items", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, string> BlockedItems = new(StringComparer.OrdinalIgnoreCase);
            //{
            //    ["explosive.timed"] = "You cannot teleport with C4!",
            //    ["gunpowder"] = "You cannot teleport with gun powder!",
            //    ["explosives"] = "You cannot teleport with explosives!",
            //};
            [JsonProperty(PropertyName = "Blocked Town Prefabs", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> BlockedPrefabs = new();
            [JsonProperty(PropertyName = "Bypass CMD")]
            public string BypassCMD = "pay";
            [JsonProperty(PropertyName = "Use Economics")]
            public bool UseEconomics = false;
            [JsonProperty(PropertyName = "Use Server Rewards")]
            public bool UseServerRewards = false;
            [JsonProperty(PropertyName = "Additional monuments to exclude (experimental)", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> MonumentsToExclude = new() {
                "lake", "canyon", "oasis", "jungle swamp", "jungle ruin"
            }
            ;
            [JsonProperty(PropertyName = "Wipe On Upgrade Or Change")]
            public bool WipeOnUpgradeOrChange = true;
            [JsonProperty(PropertyName = "Auto Generate Outpost Location")]
            public bool AutoGenOutpost = true;
            [JsonProperty(PropertyName = "Outpost Map Prefab", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> Outpost = new() {
                "outpost", "compound"
            }
            ;
            [JsonProperty(PropertyName = "Auto Generate Bandit Location")]
            public bool AutoGenBandit = true;
            [JsonProperty(PropertyName = "Bandit Map Prefab", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> Bandit = new() {
                "bandit_town"
            }
            ;
            [JsonProperty(PropertyName = "Show Time As Seconds Instead")]
            public bool UseSeconds = false;
            [JsonProperty(PropertyName = "Use Quick Teleport")]
            public bool Quick = true;
            [JsonProperty(PropertyName = "Chat Command Color")]
            public string ChatCommandColor = "#FFFF00";
            [JsonProperty(PropertyName = "Chat Command Argument Color")]
            public string ChatCommandArgumentColor = "#FFA500";
            [JsonProperty("Enable Popup Support")]
            public bool UsePopup = false;
            [JsonProperty("Send Messages To Player")]
            public bool SendMessages = true;
            [JsonProperty("Block All Teleporting From Inside Authorized Base")]
            public bool BlockAuthorizedTeleporting = false;
            [JsonProperty("Global Teleport Cooldown")]
            public float Global = 0f;
            [JsonProperty("Global VIP Teleport Cooldown")]
            public float GlobalVIP = 0f;
            [JsonProperty("Play Sounds Before Teleport")]
            public bool PlaySoundsBeforeTeleport = true;
            [JsonProperty("Sound Effects Before Teleport", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> DisappearEffects = new() {
                "assets/prefabs/missions/portal/proceduraldungeon/effects/disappear.prefab"
            }
            ;
            [JsonProperty("Play Sounds After Teleport")]
            public bool PlaySoundsAfterTeleport = true;
            [JsonProperty("Sound Effects After Teleport", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> ReappearEffects = new() {
                "assets/prefabs/missions/portal/proceduraldungeon/effects/appear.prefab"
            }
            ;
        }
        public class TPBSettings {
            [JsonProperty(PropertyName = "VIP Countdowns", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> Countdowns = new() {
                {
                    ConfigDefaultPermVip, 0
                }
            }
            ;
            [JsonProperty("Countdown")]
            public int Countdown = 0;
            [JsonProperty("Available After X Seconds")]
            public int Time = 0;
        }
        public class AdminSettings {
            [JsonProperty(PropertyName = "Announce Teleport To Target")]
            public bool AnnounceTeleportToTarget = false;
            [JsonProperty(PropertyName = "Usable By Admins")]
            public bool UseableByAdmins = true;
            [JsonProperty(PropertyName = "Usable By Moderators")]
            public bool UseableByModerators = true;
            [JsonProperty(PropertyName = "Location Radius")]
            public int LocationRadius = 25;
            [JsonProperty(PropertyName = "Teleport Near Default Distance")]
            public int TeleportNearDefaultDistance = 30;
            [JsonProperty(PropertyName = "Extra Distance To Block Monument Teleporting")]
            public int ExtraMonumentDistance;
        }
        public class HomesSettings {
            [JsonProperty(PropertyName = "Homes Limit")]
            public int HomesLimit = 2;
            [JsonProperty(PropertyName = "VIP Homes Limits", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPHomesLimits = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "Allow Sethome At Specific Monuments", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> AllowedMonuments = new() {
                "HQM Quarry", "Stone Quarry", "Sulfur Quarry", "Ice Lake", "Wild Swamp"
            }
            ;
            [JsonProperty(PropertyName = "Allow Sethome At All Monuments")]
            public bool AllowAtAllMonuments = false;
            [JsonProperty(PropertyName = "Allow Sethome On Tugboats")]
            public bool AllowTugboats = true;
            [JsonProperty(PropertyName = "Allow TPB")]
            public bool AllowTPB = true;
            [JsonProperty(PropertyName = "Cooldown")]
            public int Cooldown = 600;
            [JsonProperty(PropertyName = "Countdown")]
            public int Countdown = 15;
            [JsonProperty(PropertyName = "Daily Limit")]
            public int DailyLimit = 5;
            [JsonProperty(PropertyName = "VIP Daily Limits", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPDailyLimits = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "VIP Cooldowns", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPCooldowns = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "VIP Countdowns", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPCountdowns = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "Location Radius")]
            public int LocationRadius = 25;
            [JsonProperty(PropertyName = "Force On Top Of Foundation")]
            public bool ForceOnTopOfFoundation = true;
            [JsonProperty(PropertyName = "Check Foundation For Owner")]
            public bool CheckFoundationForOwner = true;
            [JsonProperty(PropertyName = "Use Friends")]
            public bool UseFriends = true;
            [JsonProperty(PropertyName = "Use Clans")]
            public bool UseClans = true;
            [JsonProperty(PropertyName = "Use Teams")]
            public bool UseTeams = true;
            [JsonProperty(PropertyName = "Usable Out Of Building Blocked")]
            public bool UsableOutOfBuildingBlocked;
            [JsonProperty(PropertyName = "Usable Into Building Blocked")]
            public bool UsableIntoBuildingBlocked;
            [JsonProperty(PropertyName = "Usable From Safe Zone Only")]
            public bool UsableFromSafeZoneOnly;
            [JsonProperty(PropertyName = "Bypass Cooldown From Within Safe Zone")]
            public bool BypassCooldownFromWithinSafeZone;
            [JsonProperty(PropertyName = "Allow Cupboard Owner When Building Blocked")]
            public bool CupOwnerAllowOnBuildingBlocked = true;
            [JsonProperty(PropertyName = "Block For No Cupboard")]
            public bool BlockForNoCupboard;
            [JsonProperty(PropertyName = "Allow Iceberg")]
            public bool AllowIceberg = false;
            [JsonProperty(PropertyName = "Allow Cave")]
            public bool AllowCave;
            [JsonProperty(PropertyName = "Allow Crafting")]
            public bool AllowCraft = false;
            [JsonProperty(PropertyName = "Allow Above Foundation")]
            public bool AllowAboveFoundation = true;
            [JsonProperty(PropertyName = "Check If Home Is Valid On Listhomes")]
            public bool CheckValidOnList = false;
            [JsonProperty(PropertyName = "Pay")]
            public int Pay = 0;
            [JsonProperty(PropertyName = "Bypass")]
            public int Bypass = 0;
            [JsonProperty(PropertyName = "Hours Before Useable After Wipe")]
            public double Hours = 0;
            [JsonProperty(PropertyName = "Remove Hostility")]
            public bool RemoveHostility;
        }
        public class TPTSettings {
            [JsonProperty(PropertyName = "Use Friends")]
            public bool UseFriends;
            [JsonProperty(PropertyName = "Use Clans")]
            public bool UseClans;
            [JsonProperty(PropertyName = "Use Teams")]
            public bool UseTeams;
            [JsonProperty(PropertyName = "Allow Cave")]
            public bool AllowCave;
            [JsonProperty(PropertyName = "Enabled Color")]
            public string EnabledColor = "green";
            [JsonProperty(PropertyName = "Disabled Color")]
            public string DisabledColor = "red";
        }
        // Added `TPR => Play Sounds To Request Target` (false)
        // Added `TPR => Play Sounds When Target Accepts` (false)
        public class DiscordSettings {
            [JsonProperty(PropertyName = "Webhook URL")]
            public string Webhook = "https://support.discordapp.com/hc/en-us/articles/228383668-Intro-to-Webhooks";
            [JsonProperty(PropertyName = "Log When TPA To Non-Ally Players More Than X Times")]
            public int TPA = 3;
        }
        public class TPRSettings {
            [JsonProperty(PropertyName = "Discord")]
            public DiscordSettings Discord = new();
            [JsonProperty("Play Sounds To Request Target")]
            public bool PlaySoundsToRequestTarget;
            [JsonProperty("Teleport Request Sound Effects", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> TeleportRequestEffects = new() {
                "assets/prefabs/missions/portal/proceduraldungeon/effects/disappear.prefab"
            }
            ;
            [JsonProperty("Play Sounds When Target Accepts")]
            public bool PlaySoundsWhenTargetAccepts;
            [JsonProperty("Teleport Accept Sound Effects", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<string> TeleportAcceptEffects = new() {
                "assets/prefabs/missions/portal/proceduraldungeon/effects/appear.prefab"
            }
            ;
            [JsonProperty(PropertyName = "Require Player To Be Friend, Clan Mate, Or Team Mate")]
            public bool UseClans_Friends_Teams;
            [JsonProperty(PropertyName = "Require nteleportation.tpa to accept TPR requests")]
            public bool RequireTPAPermission;
            [JsonProperty(PropertyName = "Allow Cave")]
            public bool AllowCave;
            [JsonProperty(PropertyName = "Allow TPB")]
            public bool AllowTPB = true;
            [JsonProperty(PropertyName = "Use Blocked Users")]
            public bool UseBlockedUsers;
            [JsonProperty(PropertyName = "Cooldown")]
            public int Cooldown = 600;
            [JsonProperty(PropertyName = "Countdown")]
            public int Countdown = 15;
            [JsonProperty(PropertyName = "Daily Limit")]
            public int DailyLimit = 5;
            [JsonProperty(PropertyName = "VIP Daily Limits", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPDailyLimits = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "VIP Cooldowns", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPCooldowns = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "VIP Countdowns", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPCountdowns = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "Enable Request UI")]
            public bool UI;
            [JsonProperty(PropertyName = "Request Duration")]
            public int RequestDuration = 30;
            [JsonProperty(PropertyName = "Block TPA On Ceiling")]
            public bool BlockTPAOnCeiling = true;
            [JsonProperty(PropertyName = "Usable Out Of Building Blocked")]
            public bool UsableOutOfBuildingBlocked;
            [JsonProperty(PropertyName = "Usable Into Building Blocked")]
            public bool UsableIntoBuildingBlocked;
            [JsonProperty(PropertyName = "Allow Cupboard Owner When Building Blocked")]
            public bool CupOwnerAllowOnBuildingBlocked = true;
            [JsonProperty(PropertyName = "Block For No Cupboard")]
            public bool BlockForNoCupboard;
            [JsonProperty(PropertyName = "Allow Crafting")]
            public bool AllowCraft;
            [JsonProperty(PropertyName = "Pay")]
            public int Pay = 0;
            [JsonProperty(PropertyName = "Bypass")]
            public int Bypass = 0;
            [JsonProperty(PropertyName = "Hours Before Useable After Wipe")]
            public double Hours = 0;
            [JsonProperty(PropertyName = "Remove Hostility")]
            public bool RemoveHostility;
        }
        public class TownSettings {
            [JsonProperty(PropertyName = "Command Enabled")]
            public bool Enabled = true;
            [JsonProperty(PropertyName = "Set Position From Monument Marker Name")]
            public string MonumentMarkerName = "";
            [JsonProperty(PropertyName = "Set Position From Monument Marker Name Offset")]
            public string MonumentMarkerNameOffset = "0 0 0";
            [JsonProperty(PropertyName = "Allow TPB")]
            public bool AllowTPB = true;
            [JsonProperty(PropertyName = "Allow Cave")]
            public bool AllowCave;
            [JsonProperty(PropertyName = "Cooldown")]
            public int Cooldown = 600;
            [JsonProperty(PropertyName = "Countdown")]
            public int Countdown = 15;
            [JsonProperty(PropertyName = "Daily Limit")]
            public int DailyLimit = 5;
            [JsonProperty(PropertyName = "VIP Daily Limits", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPDailyLimits = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "VIP Cooldowns", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPCooldowns = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "VIP Countdowns", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, int> VIPCountdowns = new() {
                {
                    ConfigDefaultPermVip, 5
                }
            }
            ;
            [JsonProperty(PropertyName = "Location")]
            public Vector3 Location = Vector3.zero;
            [JsonProperty(PropertyName = "Locations", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<Vector3> Locations = new List<Vector3>();
            [JsonProperty(PropertyName = "Teleport To Random Location")]
            public bool Random = true;
            [JsonProperty(PropertyName = "Usable Out Of Building Blocked")]
            public bool UsableOutOfBuildingBlocked = false;
            [JsonProperty(PropertyName = "Allow Crafting")]
            public bool AllowCraft = false;
            [JsonProperty(PropertyName = "Pay")]
            public int Pay = 0;
            [JsonProperty(PropertyName = "Bypass")]
            public int Bypass = 0;
            [JsonProperty(PropertyName = "Hours Before Useable After Wipe")]
            public double Hours = 0;
            [JsonProperty(PropertyName = "Remove Hostility")]
            public bool RemoveHostility;
            public bool CanCraft(BasePlayer player, string command) {
                return AllowCraft || player.IPlayer.HasPermission($"nteleportation.craft{command.ToLower()}");
            }
            public bool CanCave(BasePlayer player, string command) {
                return AllowCave || player.IPlayer.HasPermission($"nteleportation.cave{command.ToLower()}");
            }
            [JsonIgnore]
            public StoredData Teleports = new StoredData();
            [JsonIgnore]
            public string Command;
        }
        private class Configuration {
            [JsonProperty(PropertyName = "Settings")]
            public PluginSettings Settings = new();
            [JsonProperty(PropertyName = "Admin")]
            public AdminSettings Admin = new();
            [JsonProperty(PropertyName = "Home")]
            public HomesSettings Home = new();
            [JsonProperty(PropertyName = "TPT")]
            public TPTSettings TPT = new();
            [JsonProperty(PropertyName = "TPR")]
            public TPRSettings TPR = new();
            [JsonProperty(PropertyName = "Dynamic Commands", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<string, TownSettings> DynamicCommands = DefaultCommands;
        }
        private static Dictionary<string, TownSettings> DefaultCommands = new() {
            ["Town"]
            = new() {
                Random = false
            }
            , ["Island"] = new() {
                AllowTPB = false
            }
            , ["Outpost"] = new(), ["Bandit"] = new(),
        }
        ;
        public void InitializeDynamicCommands() {
            foreach (var entry in config.DynamicCommands) {
                if (!entry.Value.Enabled) {
                    continue;
                }
                else if (entry.Key.Equals("bandit", StringComparison.OrdinalIgnoreCase)) {
                    if (CompoundTeleport == null || Convert.ToBoolean(CompoundTeleport?.Call("umodversion"))) {
                        banditEnabled = true;
                    }
                    else continue;
                }
                else if (entry.Key.Equals("outpost", StringComparison.OrdinalIgnoreCase)) {
                    if (CompoundTeleport == null || Convert.ToBoolean(CompoundTeleport?.Call("umodversion"))) {
                        outpostEnabled = true;
                    }
                    else continue;
                }
                entry.Value.Command = entry.Key;
                RegisterCommand(entry.Key, nameof(CommandCustom));
            }
            RegisterCommand("ntp", nameof(CommandDynamic));
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            canSaveConfig = false;
            try {
                Config.Settings.Converters = new JsonConverter[] {
                    new UnityVector3Converter()
                }
                ;
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
                canSaveConfig = true;
                SaveConfig();
            }
            catch (JsonException ex) {
                Puts(ex.ToString());
                LoadDefaultConfig();
            }
            config.Settings.ReappearEffects.Remove("");
            config.Settings.DisappearEffects.Remove("");
            config.TPR.TeleportRequestEffects.Remove("");
            config.TPR.TeleportAcceptEffects.Remove("");
        }
        private bool canSaveConfig = true;
        protected override void SaveConfig() {
            if (canSaveConfig) {
                Config.WriteObject(config);
            }
        }
        protected override void LoadDefaultConfig() {
            config = new();
            Puts("Loaded default configuration.");
        }
#endregion
        private class DisabledData {
            [JsonProperty("List of disabled commands")]
            public List<string> DisabledCommands = new();
            public DisabledData() {
            }
        }
        private DisabledData DisabledCommandData = new();
        private class AdminData {
            [JsonProperty("t")]
            public bool Town;
            [JsonProperty("u")]
            public ulong UserID;
            [JsonProperty("d")]
            public string Home;
            [JsonProperty("pl")]
            public Vector3 PreviousLocation;
            [JsonProperty("b")]
            public bool BuildingBlocked;
            [JsonProperty("c")]
            public bool AllowCrafting;
            [JsonProperty("cv")]
            public bool AllowCave;
            [JsonProperty(PropertyName = "rh")]
            public bool RemoveHostility;
            [JsonProperty("l")]
            public Dictionary<string, Vector3> Locations = new(StringComparer.OrdinalIgnoreCase);
        }
        private class HomeData {
            public class Entry {
                public Vector3 Position;
                public BaseNetworkable Entity;
                public bool isEntity => !Entity.IsKilled();
                public bool wasEntity;
                public Entry() {
                }
                public Entry(Vector3 Position) {
                    this.Position = Position;
                }
                public Vector3 Get() {
                    if (isEntity) {
                        return Entity.transform.position + Position;
                    }
                    return Position;
                }
            }
            public class Boat {
                public ulong Value;
                public Vector3 Offset;
                public Boat() {
                }
                public Boat(Entry entry) {
                    Offset = entry.Position;
                    Value = entry.Entity.net.ID.Value;
                }
            }
            [JsonProperty("l")]
            public Dictionary<string, Vector3> buildings = new(StringComparer.OrdinalIgnoreCase);
            [JsonProperty("b")]
            public Dictionary<string, Boat> boats = new(StringComparer.OrdinalIgnoreCase);
            [JsonProperty("t")]
            public TeleportData Teleports = new();
            [JsonIgnore]
            private Dictionary<string, Entry> Cache = new();
            [JsonIgnore]
            public Dictionary<string, Entry> Locations {
                get {
                    if (Cache.Count == 0) {
                        InitializeBuildings();
                        InitializeBoats();
                    }
                    return Cache;
                }
            }
            private void InitializeBuildings() {
                foreach (var pair in buildings) {
                    Cache[pair.Key] = new(pair.Value);
                }
            }
            private void InitializeBoats() {
                foreach (var (key, boat) in boats.ToList()) {
                    var entity = BaseNetworkable.serverEntities.Find(new(boat.Value));
                    if (entity.IsKilled()) continue;
                    Cache[key] = new() {
                        Position = boat.Offset, wasEntity = true, Entity = entity
                    }
                    ;
                }
            }
            public bool TryGetValue(string key, out Entry homeEntry) {
                return Locations.TryGetValue(key, out homeEntry);
            }
            public void Set(string key, Entry homeEntry) {
                Locations[key] = homeEntry;
                if (homeEntry.isEntity) {
                    boats[key] = new(homeEntry);
                }
                else buildings[key] = homeEntry.Get();
            }
            public bool Remove(string key) {
                bool removed = boats.Remove(key) || buildings.Remove(key);
                return Locations.Remove(key) || removed;
            }
        }
        public class TeleportData {
            [JsonProperty("a")]
            public int Amount;
            [JsonProperty("d")]
            public string Date;
            [JsonProperty("t")]
            public int Timestamp;
        }
        private class TeleportTimer : Pool.IPooled {
            public string Town = "";
            public ulong UserID;
            public string Home = "";
            public Action action;
            public float time;
            public BasePlayer OriginPlayer;
            public BasePlayer TargetPlayer;
            public bool RemoveHostility;
            public void EnterPool() {
                Invalidate();
                Reset();
            }
            public void LeavePool() {
                Invalidate();
                Reset();
            }
            internal void Invalidate() {
                time = float.MinValue;
                action = null;
            }
            internal void Reset() {
                Town = "";
                UserID = 0uL;
                Home = "";
                OriginPlayer = null;
                TargetPlayer = null;
                RemoveHostility = false;
            }
        }
        private class PendingRequest : Pool.IPooled {
            public ulong UserID;
            public float time;
            public Action action;
            public void EnterPool() {
                Invalidate();
            }
            public void LeavePool() {
                Invalidate();
            }
            internal void Invalidate() {
                time = float.MinValue;
                action = null;
                UserID = 0uL;
            }
        }
        private List<string> GetMonumentMessages() {
            return new List<string> {
                "Abandoned Cabins", "Abandoned Supermarket", "Abandoned Military Base", "Airfield", "Arctic Research Base", "Bandit Camp", "Barn", "Crow's Nest", "Ferry Terminal", "Fishing Village", "Gas Station", "Giant Excavator Pit", "Harbor", "HQM Quarry", "Ice Lake", "Junkyard", "Large Barn", "Large Fishing Village", "Launch Site", "Lighthouse", "Military Tunnel", "Mining Outpost", "Missile Silo", "Mountain", "Oil Rig", "Large Oil Rig", "Outpost", "Oxum's Gas Station", "Power Plant", "Ranch", "Radtown", "Satellite Dish", "Sewer Branch", "Stone Quarry", "Substation", "Sulfur Quarry", "The Supermarket", "The Dome", "Train Tunnel", "Train Yard", "Underwater Lab", "Water Treatment Plant", "Water Well", "Wild Swamp",
            }
            ;
        }
        protected override void LoadDefaultMessages() {
            if (!_cmcCompleted) {
                timer.Once(1f, LoadDefaultMessages);
                return;
            }
            var monumentMessages = GetMonumentMessages();
            var en = new Dictionary<string, string> {
                {
                    "ErrorTPR", "Teleporting to {0} is blocked ({1})"
                }
                , {
                    "AdminTP", "You teleported to {0}!"
                }
                , {
                    "AdminTPTarget", "{0} teleported to you!"
                }
                , {
                    "AdminTPPlayers", "You teleported {0} to {1}!"
                }
                , {
                    "AdminTPPlayer", "{0} teleported you to {1}!"
                }
                , {
                    "AdminTPPlayerTarget", "{0} teleported {1} to you!"
                }
                , {
                    "AdminTPCoordinates", "You teleported to {0}!"
                }
                , {
                    "AdminTPTargetCoordinates", "You teleported {0} to {1}!"
                }
                , {
                    "AdminTPOutOfBounds", "You tried to teleport to a set of coordinates outside the map boundaries!"
                }
                , {
                    "AdminTPBoundaries", "X and Z values need to be between -{0} and {0} while the Y value needs to be between -100 and 2000!"
                }
                , {
                    "AdminTPLocation", "You teleported to {0}!"
                }
                , {
                    "AdminTPLocationSave", "You have saved the current location!"
                }
                , {
                    "AdminTPLocationRemove", "You have removed the location {0}!"
                }
                , {
                    "AdminLocationList", "The following locations are available:"
                }
                , {
                    "AdminLocationListEmpty", "You haven't saved any locations!"
                }
                , {
                    "AdminTPBack", "You've teleported back to your previous location!"
                }
                , {
                    "AdminTPBackSave", "Your previous location has been saved, use /tpb to teleport back!"
                }
                , {
                    "AdminTPTargetCoordinatesTarget", "{0} teleported you to {1}!"
                }
                , {
                    "AdminTPConsoleTP", "You were teleported to {0}"
                }
                , {
                    "AdminTPConsoleTPPlayer", "You were teleported to {0}"
                }
                , {
                    "AdminTPConsoleTPPlayerTarget", "{0} was teleported to you!"
                }
                , {
                    "HomeTP", "You teleported to your home '{0}'!"
                }
        
// ... [Code preview truncated due to length. Full source in attached file] ...

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