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

FREE IQParachute : 1.2.6 1.2.6

Нет прав для скачивания
C#:
using Newtonsoft.Json;
using System.Linq;
using UnityEngine.Networking;
using System.Text;
using System.Collections;
using UnityEngine;
using static SamSite;
using VLB;
using Oxide.Core.Plugins;
using System.Collections.Generic;
using System;
using Oxide.Game.Rust.Cui;
using Oxide.Core;
namespace Oxide.Plugins {
    [Info("IQParachute", "Sempai#3239", "1.2.6")]
    [Description("A real paratrooper damn")]
    // Обновление 1.2.6
    /// - Добавлена мультиязычность в конфигурации
    /// - Исправлен NRE в GetLang
    /// - Исправлена проблема с блокировкой инвентаря если парашют открылся неуспешно
    /// - Добавлена возможность открыть парашют спрыгнув с любой высоты (настраивается в конфигурации)
    ///
    class IQParachute : RustPlugin {
        [ConsoleCommand("chute.give")]
        private void Console_ChuteAdd(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player != null) return;
            if (arg.Args == null || arg.Args.Length < 1) {
                if (player == null) Puts("Wrong syntax! Usage: chute.give <SteamID:Name:IP>");
                else player.ConsoleMessage("Wrong syntax! Usage: chute.give <SteamID:Name:IP>");
                return;
            }
            String playerid = arg.Args[0];
            BasePlayer basePlayer = BasePlayer.Find(playerid);
            if (basePlayer == null) {
                if (player == null) Puts("Error! Player not found!");
                else player.ConsoleMessage("Error! Player not found!");
                return;
            }
            basePlayer.GiveItem(_config.ChuteSettings.Chute.ToItem());
            if (player == null) Puts("Success! Item added to inventory!");
            else player.ConsoleMessage("Success! Item added to inventory!");
        }
        private Boolean IsPVE() => TruePVE != null || NextGenPVE != null || Imperium != null;
        private static MonumentInfo BanditTown;
        public void InitializeNPC(Vector3 pos, Quaternion rot) {
            InvisibleVendingMachine vending = GameManager.server.CreateEntity("assets/prefabs/deployable/vendingmachine/npcvendingmachines/shopkeeper_vm_invis.prefab", pos, rot) as InvisibleVendingMachine;
            vending.Spawn();
            vending.OwnerID = 435322777;
            vending.skinID = 435322777;
            vending.shopName = _config.ShopChuteSetting.ShopName;
            vending.CancelInvoke(vending.InstallFromVendingOrders);
            vending.ClearSellOrders();
            NPCPlayer npc = GameManager.server.CreateEntity("assets/prefabs/npc/bandit/shopkeepers/boat_shopkeeper.prefab", pos, rot) as NPCPlayer;
            if (npc == null) {
                Interface.Oxide.LogError($"Initializing NPCShopKeeper failed! NPC Component == null #3");
                return;
            }
            npc.SetFlag(BaseEntity.Flags.Busy, true);
            npc.userID = _config.ShopChuteSetting.NPCShopSetting.userID;
            npc.OwnerID = 435322777;
            npc.name = _config.ShopChuteSetting.NPCShopSetting.Name;
            npc.displayName = npc.name;
            npc.Spawn();
            npc.eyes.rotation = Quaternion.LookRotation(vending.transform.rotation * Vector3.forward, Vector3.up);
            npc.OverrideViewAngles(vending.transform.eulerAngles);
            npc.ServerRotation = npc.eyes.rotation;
            npc.SendNetworkUpdate();
            ItemDefinition itemDefinition = ItemManager.FindItemDefinition(_config.ChuteSettings.Chute.ShortName);
            if (itemDefinition == null) {
                PrintError($"ItemDefinition from BuyItem ShortName {_config.ChuteSettings.Chute.ShortName} not found.");
                return;
            }
            ItemDefinition x = ItemManager.FindItemDefinition(_config.ShopChuteSetting.VendorShopSetting.Shortname);
            if (x == null) {
                PrintError($"ItemDefinition from PayItem ShortName {_config.ShopChuteSetting.VendorShopSetting.Shortname} not found.");
                return;
            }
            AddItemForSale(vending, itemDefinition.itemid, 1, x.itemid, _config.ShopChuteSetting.VendorShopSetting.Amount, vending.GetBPState(false, false), 300, _config.ChuteSettings.Chute.SkinId);
            MonumentEntities.Add(npc);
            MonumentEntities.Add(vending);
            if (_config.ShopChuteSetting.NPCShopSetting.Wear.Count > 0) {
                npc.inventory.Strip();
                for (int i = 0; i < _config.ShopChuteSetting.NPCShopSetting.Wear.Count; i++) ItemManager.Create(ItemManager.FindItemDefinition(_config.ShopChuteSetting.NPCShopSetting.Wear[i].ShortName), 1, _config.ShopChuteSetting.NPCShopSetting.Wear[i].SkinId).MoveToContainer(npc.inventory.containerWear);
            }
        }
        private void ClearEnt(MonumentInfo monument, Vector3 Pos) {
            List<BaseEntity> obj = new List<BaseEntity>();
            Int32 Mask = LayerMask.GetMask("AI", "Player (Server)", "Construction", "Deployable", "Deployed", "Ragdoll", "Transparent");
            Vis.Entities(Pos, 1000f, obj, Mask);
            foreach (BaseEntity item in obj.Where(x => x.OwnerID == 435322777 || x.skinID == 435322777)) {
                if (item == null) continue;
                item.Kill(BaseNetworkable.DestroyMode.None);
            }
        }
        private new void LoadDefaultMessages() {
            lang.RegisterMessages(new Dictionary<string, string> {
                ["PARACHUTE_DONT_OPEN"]
                = "Oh shit, the parachute is faulty! He couldn't open up!!!", ["PARACHUTE_OPEN_INFO"] = "OPEN PARACHUTE - PRESS <color=#68d3f9>[R]</color>",
            }
            , this);
            lang.RegisterMessages(new Dictionary<string, string> {
                ["PARACHUTE_DONT_OPEN"]
                = "Оу черт, парашют неисрпавен! Он не смог раскрыться!!!", ["PARACHUTE_OPEN_INFO"] = "ОТКРЫТЬ ПАРАШЮТ - НАЖМИТЕ <color=#68d3f9>[R]</color>",
            }
            , this, "ru");
        }
        public class TriggerJump : FacepunchBehaviour //
        {
            private BaseEntity entity;
            private Single Radius;
            private List<BasePlayer> PlayerTriggers = new List<BasePlayer>();
            private void Awake() {
                gameObject.layer = (Int32)Rust.Layer.Reserved1;
                gameObject.name = "TRIGGER_JUMPING";
            }
            public void Init(BaseEntity entity, Single Radius) {
                this.entity = entity;
                this.Radius = Radius;
                UpdateCollider();
                gameObject.SetActive(true);
                enabled = true;
            }
            private void OnTriggerEnter(Collider other) {
                BasePlayer player = other.GetComponentInParent<BasePlayer>();
                if (player == null || player.IsNpc || !player.userID.IsSteamId()) return;
                if (!PlayerTriggers.Contains(player)) PlayerTriggers.Add(player);
            }
            private void OnTriggerExit(Collider other) {
                BasePlayer player = other.GetComponentInParent<BasePlayer>();
                if (player == null || player.IsNpc || !player.userID.IsSteamId()) return;
                if (!PlayerTriggers.Contains(player)) return;
                if (player.isMounted) return;
                if (Vector3.Distance(player.transform.position, entity.transform.position) < 10f) return;
                _.OnEntityDismounted(null, player);
                PlayerTriggers.Remove(player);
            }
            private void OnDestroy() {
                UnityEngine.GameObject.Destroy(this.gameObject);
            }
            private void UpdateCollider() {
                var sphereCollider = gameObject.GetComponent<SphereCollider>();
                {
                    if (sphereCollider == null) {
                        sphereCollider = gameObject.AddComponent<SphereCollider>();
                        sphereCollider.isTrigger = true;
                    }
                    sphereCollider.radius = Radius;
                }
            }
        }
        private void SpawnPreset(MonumentInfo monument, List<Point> PointList) {
            ClearEnt(monument, monument.transform.TransformPoint(PointList[0].Pos));
            timer.Once(5f, () => {
                foreach (Point point in PointList) {
                    Vector3 Position = monument.transform.TransformPoint(point.Pos);
                    Quaternion Rotation = GetMonumentRotation(point.Y, monument, point.X);
                    switch (point.Name) {
                        case "NPC.POINT" : {
                            InitializeNPC(Position, Rotation);
                            break;
                        }
                        case "TABLES.POINT" : {
                            SpawnTables(Position, Rotation, point.LinkImage);
                            break;
                        }
                    }
                }
            }
            );
        }
        private class SAMTargetComponent : FacepunchBehaviour, ISamSiteTarget {
            public static List<SAMTargetComponent> SAMTargetComponents = new List<SAMTargetComponent>();
            public static void AddComp(BaseCombatEntity ENT) => ENT.GetOrAddComponent<SAMTargetComponent>();
            public static void RemoveComp(BaseCombatEntity ENT) {
                SAMTargetComponent samComponent = ENT.GetComponent<SAMTargetComponent>();
                if (samComponent != null) DestroyImmediate(samComponent);
            }
            private GameObject _child;
            private void Awake() {
                SAMTargetComponents.Add(this);
                baseEntity = GetComponent<BaseEntity>();
                if (baseEntity is BaseHelicopter) {
                    _child = baseEntity.gameObject.CreateChild();
                    _child.gameObject.layer = (int)Rust.Layer.Vehicle_World;
                    _child.AddComponent<SphereCollider>();
                }
            }
            public BaseEntity baseEntity;
            private void OnDestroy() {
                if (_child != null) DestroyImmediate(_child);
                if (SAMTargetComponents.Contains(this)) SAMTargetComponents.Remove(this);
            }
            public bool IsValidSAMTarget() => true;
            public Vector3 Position => baseEntity.transform.position;
            public SamTargetType SAMTargetType => SamSite.targetTypeVehicle;
            public bool isClient => false;
            public bool IsValidSAMTarget(bool isStaticSamSite) => true;
            public Vector3 CenterPoint() => baseEntity.CenterPoint();
            public Vector3 GetWorldVelocity() => baseEntity.GetWorldVelocity();
            public bool IsVisible(Vector3 position, float distance) => baseEntity.IsVisible(position, distance);
        }
        private PluginConfig GetDefaultConfig() {
            return new PluginConfig {
                ChuteSettings = new PluginConfig.Chutes {
                    UseChuteAllOpen = false, UseAutoOpen = true, UseSamSite = true, Chute = new CustomItem("Parachute", "sunglasses", 2663677167), Turned = new PluginConfig.Chutes.TurnedFuncion {
                        EffectSetting = new PluginConfig.Chutes.TurnedFuncion.Effect {
                            UseEffect = true, PathEffect = "assets/bundled/prefabs/fx/smoke_signal_full.prefab",
                        }
                        , OpenChutes = new PluginConfig.Chutes.TurnedFuncion.OpenChute {
                            UseRareOpen = true, RareOpen = 80,
                        }
                    }
                    , FlyControlling = new PluginConfig.Chutes.FlyController {
                        maxDropSpeed = -10f, upForce = 7f, forwardStrength = 4f, backwardStrength = 4f, rotationStrength = 0.4f, forwardResistance = 0.3f, rotationResistance = 0.5f, glidedevider = 3.0f, decendmultiplyer = 1.5f, angularModifier = 30f,
                    }
                    ,
                }
                , ShopChuteSetting = new PluginConfig.ShopChute {
                    ShopName = "SKYDIVING SHOP", TurnedShop = new PluginConfig.ShopChute.TurnedShopSpawn {
                        UseAirfield = true, UseBanditTown = true, UseCompound = true,
                    }
                    , VendorShopSetting = new PluginConfig.ShopChute.VendorShop {
                        Shortname = "scrap", Amount = 100, SkinID = 0,
                    }
                    , NPCShopSetting = new PluginConfig.ShopChute.NPCShop {
                        Name = "SKYDIVER", userID = 1321, Wear = new List<PluginConfig.ShopChute.NPCShop.ItemsNpc> {
                            new PluginConfig.ShopChute.NPCShop.ItemsNpc {
                                ShortName = "shoes.boots", SkinId = 1526996873,
                            }
                            , new PluginConfig.ShopChute.NPCShop.ItemsNpc {
                                ShortName = "pants", SkinId = 963524525,
                            }
                            , new PluginConfig.ShopChute.NPCShop.ItemsNpc {
                                ShortName = "tshirt", SkinId = 860007266,
                            }
                            , new PluginConfig.ShopChute.NPCShop.ItemsNpc {
                                ShortName = "metal.facemask", SkinId = 1720716475,
                            }
                            , new PluginConfig.ShopChute.NPCShop.ItemsNpc {
                                ShortName = "metal.plate.torso", SkinId = 1720718368,
                            }
                        }
                    }
                    ,
                }
                , ReferenceSetting = new PluginConfig.ReferencePlugin {
                    IQChatSetting = new PluginConfig.ReferencePlugin.IQChatReference {
                        CustomAvatar = "", CustomPrefix = "[IQParachute]", UIAlertUse = false,
                    }
                }
            }
            ;
        }
        class FlyFinder : FacepunchBehaviour {
            BasePlayer player;
            public FlyFinder() {
                enabled = false;
            }
            public void SetPlayer(BasePlayer player) {
                this.player = player;
                enabled = true;
                if (_config.ChuteSettings.UseAutoOpen) InvokeRepeating(CheckPreOpening, 0f, 1f);
            }
            private void CheckPreOpening() {
                if (_.JumpingPlayer.Contains(player)) if (Physics.Raycast(new Ray(player.transform.position, Vector3.down), 50f, LAND_LAYERS) && !player.IsOnGround()) {
                    _.OpenChute(player);
                    CancelInvoke(CheckPreOpening);
                }
            }
            public void OnDestroy() => KillParent();
            public void KillParent() {
                enabled = false;
                UnityEngine.GameObject.Destroy(this);
            }
        }
        public string GetLang(string LangKey, string userID = null, params object[] args) {
            if (sb == null) sb = new StringBuilder();
            sb.Clear();
            if (args != null) {
                sb.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
                return sb.ToString();
            }
            return lang.GetMessage(LangKey, this, userID);
        }
        private const Int32 LAND_LAYERS = 1 << 4 | 1 << 8 | 1 << 16 | 1 << 21 | 1 << 23;
        void OnServerInitialized() {
            foreach(BasePlayer p in BasePlayer.activePlayerList.Where(x => x.inventory.containerWear.IsLocked())) p.inventory.containerWear.SetLocked(false);
            _ = this;
            BanditTown = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("bandit_town"));
            Compound = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("compound"));
            Airfield = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("airfield"));
            if (!_config.ChuteSettings.UseChuteAllOpen) {
                Unsubscribe("CanWearItem");
                Unsubscribe("OnItemAddedToContainer");
                Unsubscribe("OnItemDropped");
                Unsubscribe("CanAcceptItem");
            }
            if (!IsInitializeNPCShop()) {
                Unsubscribe("OnVendingTransaction");
                Unsubscribe("OnEntityTakeDamage");
                Unsubscribe("CanBradleyApcTarget");
                Unsubscribe("OnNpcTarget");
            }
            else {
                if (IsCompound()) SpawnPreset(Compound, PointsList["COMPOUND"]);
                if (IsBanitTown()) SpawnPreset(BanditTown, PointsList["BANDIT_TOWN"]);
                if (IsAirfield()) SpawnPreset(Airfield, PointsList["AIRFIELD"]);
            }
            if(IsPVE()) Unsubscribe("OnEntityTakeDamage");
            if (!_config.ChuteSettings.UseSamSite) {
                Unsubscribe("OnSamSiteTargetScan");
                Unsubscribe("CanSamSiteShoot");
            }
        }
        public struct CustomItem {
            public CustomItem(String displayName, String shortName, UInt64 skinId) {
                DisplayName = displayName;
                ShortName = shortName;
                SkinId = skinId;
            }
            public String DisplayName;
            public String ShortName;
            public UInt64 SkinId;
            public Item ToItem(int amount = 1) {
                Item item = ItemManager.CreateByName(ShortName, amount, SkinId);
                if (item != null && String.IsNullOrEmpty(DisplayName) == false) item.name = DisplayName;
                return item;
            }
            public bool CompareTo(Item item) {
                return this.SkinId == item?.skin && this.ShortName == item?.info.shortname;
            }
        }
        object OnNpcTarget(BaseAnimalNPC animal, BasePlayer target) {
            if (animal == null || target == null) return null;
            if (target.OwnerID == 435322777) return false;
            return null;
        }
        private Dictionary<BasePlayer, FlyFinder> FlyFinderList = new Dictionary<BasePlayer, FlyFinder>();
        private void OnSamSiteTargetScan(SamSite samSite, List<ISamSiteTarget> targetList) {
            if (SAMTargetComponent.SAMTargetComponents.Count == 0) return;
            foreach (var SAMtargetcomp in SAMTargetComponent.SAMTargetComponents) targetList.Add(SAMtargetcomp);
        }
        private void ValidateConfig() {
            if (Interface.Oxide.CallHook("OnConfigValidate") != null) {
                PrintWarning("Using default configuration...");
                _config = GetDefaultConfig();
            }
        }
        private List<ChuteConroller> ChuteConrollerList = new List<ChuteConroller>();
        void OnServerShutdown() => Unload();
        protected override void LoadDefaultConfig() {
            _config = GetDefaultConfig();
        }
        public void AddItemForSale(VendingMachine vending, int itemID, int amountToSell, int currencyID, int currencyPerTransaction, byte bpState, int maxByStack, ulong SkinID) {
            vending.AddSellOrder(itemID, amountToSell, currencyID, currencyPerTransaction, bpState);
            vending.transactionActive = true;
            if (bpState == 1 || bpState == 3) {
                for (int i = 0; i < maxByStack; i++) {
                    global : : Item item = ItemManager.CreateByItemID(vending.blueprintBaseDef.itemid, 1, _config.ShopChuteSetting.VendorShopSetting.SkinID);
                    item.blueprintTarget = itemID;
                    vending.inventory.Insert(item);
                }
            }
            else {
                vending.inventory.AddItem(ItemManager.FindItemDefinition(itemID), amountToSell * maxByStack, SkinID);
            }
            vending.transactionActive = false;
            vending.RefreshSellOrderStockLevel(null);
        }
        private static MonumentInfo Compound;
        private Boolean IsBanitTown() => (Boolean)(_config.ShopChuteSetting.TurnedShop.UseBanditTown && BanditTown != null);
        private static IEnumerator DownloadImage(string url, Signage sign, string name) {
            UnityWebRequest www = UnityWebRequest.Get(url);
            yield return www.SendWebRequest();
            if (_ == null) yield break;
            if (www.isNetworkError || www.isHttpError) {
                _.PrintWarning(string.Format("Image download error! Error: {0}, Image name: {1}", www.error, name));
                www.Dispose();
                yield break;
            }
            Texture2D texture = new Texture2D(2, 2);
            texture.LoadImage(www.downloadHandler.data);
            if (texture != null) {
                byte[] bytes = texture.EncodeToPNG();
                var image = FileStorage.server.Store(bytes, FileStorage.Type.png, CommunityEntity.ServerInstance.net.ID).ToString();
                var size = Math.Max(sign.paintableSources.Length, 1);
                if (sign.textureIDs == null || sign.textureIDs.Length != size) {
                    Array.Resize(ref sign.textureIDs, size);
                }
                if (sign.textureIDs[0] > 0) {
                    FileStorage.server.RemoveExact(sign.textureIDs[0], FileStorage.Type.png, sign.net.ID, 0U);
                }
                uint idinstorage = FileStorage.server.Store(bytes, FileStorage.Type.png, sign.net.ID);
                sign.textureIDs[0] = idinstorage;
                sign.SendNetworkUpdate();
                UnityEngine.Object.DestroyImmediate(texture);
            }
            www.Dispose();
            yield break;
        }
        class ChuteConroller : FacepunchBehaviour {
            Rigidbody rigidbodyBP;
            BaseEntity backpack;
            Rigidbody rigidbody;
            BaseEntity worldItem;
            public BaseEntity chair;
            BaseEntity parachute;
            BasePlayer player;
            public ChuteConroller() {
                worldItem = GetComponent<BaseEntity>();
                parachute = GameManager.server.CreateEntity("assets/prefabs/misc/parachute/parachute.prefab", new Vector3(), new Quaternion(), true);
                parachute.enableSaving = false;
                parachute.transform.localPosition = new Vector3(0f, -7f, 0f);
                parachute?.Spawn();
                if (_config.ChuteSettings.Turned.EffectSetting.UseEffect) Effect.server.Run(_config.ChuteSettings.Turned.EffectSetting.PathEffect, parachute, 0, Vector3.zero, Vector3.zero, null, true);
                String chairprefab = "assets/prefabs/vehicle/seats/standingdriver.prefab";
                chair = GameManager.server.CreateEntity(chairprefab, new Vector3(), new Quaternion(), true);
                chair.enableSaving = false;
                chair.Spawn();
                chair.skinID = 99999995;
                chair.transform.localPosition = new Vector3(0.0f, -1.2f, 0.3f);
                BaseMountable HasMount = chair.GetComponent<BaseMountable>();
                HasMount.dismountPositions = new[] {
                    parachute.transform
                }
                ;
                chair.GetComponent<MeshCollider>().convex = true;
                chair.SetParent(parachute, 0, false, false);
                chair.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
                chair.UpdateNetworkGroup();
                if (_config.ChuteSettings.UseSamSite) SAMTargetComponent.AddComp(chair as BaseCombatEntity);
                parachute.SetParent(worldItem, 0, false, false);
                rigidbody = worldItem.GetComponent<Rigidbody>();
                rigidbody.isKinematic = false;
                enabled = false;
            }
            private void SetBackpack() {
                backpack = GameManager.server.CreateEntity("assets/prefabs/misc/item drop/item_drop_backpack.prefab", player.transform.position + new Vector3(0f, 1f, 0f), new Quaternion());
                rigidbodyBP = backpack.GetComponent<Rigidbody>();
                rigidbodyBP.useGravity = false;
                rigidbodyBP.isKinematic = true;
                rigidbodyBP.drag = 0;
                rigidbodyBP.interpolation = RigidbodyInterpolation.Extrapolate;
                backpack.Spawn();
                backpack.SetFlag(BaseEntity.Flags.Locked, true);
                backpack.SetFlag(BaseEntity.Flags.Busy, true);
                backpack.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
                backpack.UpdateNetworkGroup();
                backpack.transform.localPosition = new Vector3(-0.05f, 0.06f, 0f);
                backpack.transform.localRotation = new Quaternion(-3f, 0f, 3f, 0f);
                backpack.SetParent(player, "spine2");
            }
            public void SetPlayer(BasePlayer player) {
                this.player = player;
                CheckPlayer();
                chair.GetComponent<BaseMountable>().MountPlayer(player);
                SetBackpack();
                enabled = true;
            }
            public void CheckPlayer() {
                if (chair == null) {
                    OnDestroy();
                    return;
                }
                if (Physics.Raycast(new Ray(chair.transform.position, Vector3.down), 1.5f, LAND_LAYERS)) {
                    OnDestroy();
                    return;
                }
                if (!player.IsAlive() || player.IsSleeping()) {
                    player.EnsureDismounted();
                    OnDestroy();
                    return;
                }
                foreach (Collider col in Physics.OverlapSphere(chair.transform.position, 2.0f, LAND_LAYERS)) {
                    BaseEntity baseEntity = col.gameObject.ToBaseEntity();
                    if (baseEntity != null && (baseEntity == chair || baseEntity == player.GetComponent<BaseEntity>())) continue;
                    else {
                        OnDestroy();
                        return;
                    }
                }
                if (TerrainMeta.HeightMap.GetHeight(chair.transform.position) >= chair.transform.position.y) {
                    Vector3 newPos = chair.transform.position;
                    newPos.y = TerrainMeta.HeightMap.GetHeight(chair.transform.position);
                    OnDestroy();
                    player.Teleport(newPos);
                    return;
                }
            }
            public void OnDestroy() => KillParent();
            public void KillParent() {
                enabled = false;
                if (chair != null && chair.GetComponent<BaseMountable>().IsMounted()) chair.GetComponent<BaseMountable>().DismountPlayer(player, false);
                if (player != null) {
                    if (_.JumpingPlayer.Contains(player)) _.JumpingPlayer.Remove(player);
                    if (player.isMounted) player.DismountObject();
                }
                if (!chair.IsDestroyed) {
                    if (_config.ChuteSettings.UseSamSite) SAMTargetComponent.RemoveComp(chair as BaseCombatEntity);
                    chair.Kill();
                }
                if (!parachute.IsDestroyed) parachute.Kill();
                if (!backpack.IsDestroyed) backpack.Kill();
                if (!worldItem.IsDestroyed) worldItem.Kill();
                Item Chute = _.GetChute(player);
                if (Chute != null) {
                    Chute.Remove();
                    Chute.GetRootContainer().SetLocked(false);
                    player.inventory.SendUpdatedInventory(PlayerInventory.Type.Wear, player.inventory.containerWear);
                }
                UnityEngine.GameObject.Destroy(this.gameObject);
            }
            private void FixedUpdate() {
                CheckPlayer();
                if (player.serverInput.IsDown(BUTTON.SPRINT)) rigidbody.AddForce(Vector3.up * ((_config.ChuteSettings.FlyControlling.maxDropSpeed / _config.ChuteSettings.FlyControlling.glidedevider) - rigidbody.velocity.y), ForceMode.Impulse);
                if (player.serverInput.IsDown(BUTTON.DUCK) && !player.serverInput.IsDown(BUTTON.SPRINT)) rigidbody.AddForce(Vector3.up * ((_config.ChuteSettings.FlyControlling.maxDropSpeed * _config.ChuteSettings.FlyControlling.decendmultiplyer) - rigidbody.velocity.y), ForceMode.Impulse);
                if (rigidbody.velocity.y < _config.ChuteSettings.FlyControlling.maxDropSpeed) rigidbody.AddForce(Vector3.up * (_config.ChuteSettings.FlyControlling.maxDropSpeed - rigidbody.velocity.y), ForceMode.Impulse);
                rigidbody.AddForce(Vector3.up * _config.ChuteSettings.FlyControlling.upForce, ForceMode.Acceleration);
                if (rigidbody.velocity.x < 0f || rigidbody.velocity.x > 0f || rigidbody.velocity.z < 0f || rigidbody.velocity.z > 0f) rigidbody.AddForce(new Vector3(-rigidbody.velocity.x, 0f, -rigidbody.velocity.z) * _config.ChuteSettings.FlyControlling.forwardResistance, ForceMode.Acceleration);
                if (rigidbody.angularVelocity.y > 0f || rigidbody.angularVelocity.y > 0f) rigidbody.AddTorque(new Vector3(0f, -rigidbody.angularVelocity.y, 0f) * _config.ChuteSettings.FlyControlling.rotationResistance, ForceMode.Acceleration);
                if (player.serverInput.IsDown(BUTTON.FORWARD)) rigidbody.AddForce(rigidbody.transform.forward * _config.ChuteSettings.FlyControlling.forwardStrength, ForceMode.Acceleration);
                if (player.serverInput.IsDown(BUTTON.BACKWARD)) rigidbody.AddForce(-rigidbody.transform.forward * _config.ChuteSettings.FlyControlling.backwardStrength, ForceMode.Acceleration);
                if (player.serverInput.IsDown(BUTTON.RIGHT)) rigidbody.AddTorque(Vector3.up * _config.ChuteSettings.FlyControlling.rotationStrength, ForceMode.Acceleration);
                if (player.serverInput.IsDown(BUTTON.LEFT)) rigidbody.AddTorque(Vector3.up * - _config.ChuteSettings.FlyControlling.rotationStrength, ForceMode.Acceleration);
                if (rigidbody.angularVelocity.y > 0f || rigidbody.angularVelocity.y < 0f) worldItem.transform.rotation = Quaternion.Euler(worldItem.transform.rotation.eulerAngles.x, worldItem.transform.rotation.eulerAngles.y, -rigidbody.angularVelocity.y * _config.ChuteSettings.FlyControlling.angularModifier);
            }
        }
        protected override void SaveConfig() {
            Config.WriteObject(_config);
        }
        private object CanBradleyApcTarget(BradleyAPC apc, BaseEntity entity) {
            if (apc == null || entity == null) return null;
            foreach (var Targets in apc.targetList.Where(ent => ent.entity != null && ent.entity.OwnerID == 435322777)) NextTick(() => {
                apc.targetList.Remove(Targets);
            }
            );
            return null;
        }
        [PluginReference]
        Plugin IQChat, TruePVE, NextGenPVE, Imperium, Convoy;
        private static LayerMask layerMask;
        private List<BasePlayer> JumpingPlayer = new List<BasePlayer>();
        private void DestroyOBJ(UnityEngine.Object obj) => UnityEngine.Object.DestroyImmediate(obj);
        object OnVendingTransaction(VendingMachine machine, BasePlayer player, int sellOrderId, int numberOfTransactions) {
            if (machine.OwnerID == 435322777) {
                ProtoBuf.VendingMachine.SellOrder sellOrder = machine.sellOrders.sellOrders[sellOrderId];
                Item item = machine.inventory.itemList.Where(x => x.info.itemid == sellOrder.itemToSellID).First();
                Item sell = player.inventory.FindItemIDs(sellOrder.currencyID).First();
                List<global : : Item> list = Facepunch.Pool.GetList<global : : Item>();
                List<global : : Item> list2 = player.inventory.FindItemIDs(sellOrder.currencyID);
                if (sellOrder.currencyIsBP) {
                    list2 = (from x in player.inventory.FindItemIDs(machine.blueprintBaseDef.itemid) where x.blueprintTarget == sellOrder.currencyID select x).ToList<global : : Item>();
                }
                list2 = (from x in list2 where !x.hasCondition || (x.conditionNormalized >= 0.5f && x.maxConditionNormalized > 0.5f) select x).ToList<global : : Item>();
                if (list2.Count == 0) {
                    Facepunch.Pool.FreeList<global : : Item>(ref list);
                    return false;
                }
                int num3 = list2.Sum((global : : Item x) => x.amount);
                int num4 = sellOrder.currencyAmountPerItem * numberOfTransactions;
                if (num3 < num4) {
                    Facepunch.Pool.FreeList<global : : Item>(ref list);
                    return false;
                }
                machine.transactionActive = true;
                int num5 = 0;
                foreach (global : : Item itemss in list2) {
                    int num6 = Mathf.Min(num4 - num5, itemss.amount);
                    global : : Item item2;
                    if (itemss.amount <= num6) {
                        item2 = itemss;
                    }
                    else {
                        item2 = itemss.SplitItem(num6);
                    }
                    machine.TakeCurrencyItem(item2);
                    num5 += num6;
                    if (num5 >= num4) {
                        break;
                    }
                }
                Item itemToGive = ItemManager.CreateByName(item.info.shortname, sellOrder.itemToSellAmount * numberOfTransactions, _config.ChuteSettings.Chute.SkinId);
                itemToGive.name = _config.ChuteSettings.Chute.DisplayName;
                if (itemToGive.info.shortname == "smallwaterbottle") {
                    var item1 = ItemManager.CreateByPartialName("water", 50);
                    item1.MoveToContainer(itemToGive.contents);
                }
                player.GiveItem(itemToGive, BaseEntity.GiveItemReason.PickedUp);
                Facepunch.Pool.FreeList<global : : Item>(ref list);
                machine.UpdateEmptyFlag();
                machine.transactionActive = false;
                return false;
            }
            return null;
        }
        void Init() {
            layerMask = (1 << 29);
            layerMask |= (1 << 18);
            layerMask = ~layerMask;
        }
        private static IQParachute _;
        private void CanSamSiteShoot(SamSite samSite) {
            if (samSite == null) return;
            BaseEntity target = null;
            foreach (var SAMtargetcomp in SAMTargetComponent.SAMTargetComponents) {
                if (target == null || Vector3.Distance(SAMtargetcomp.baseEntity.transform.position, samSite.transform.position) > 50f || Vector3.Distance(SAMtargetcomp.baseEntity.transform.position, samSite.transform.position) < Vector3.Distance(target.transform.position, samSite.transform.position)) target = SAMtargetcomp.baseEntity;
            }
            if (target == null) return;
            if (target is BaseVehicleSeat && target.skinID == 99999995) {
                Vector3 targetVelocity = (target.transform.position.normalized * 20f) * 1.25f;
                Vector3 estimatedPoint = PredictedPos(target, samSite, targetVelocity) - new Vector3(0f, 30f, 0f);
                samSite.currentAimDir = (estimatedPoint - samSite.eyePoint.transform.position).normalized;
                return;
            }
        }
        private void OnEntitySpawned(HotAirBalloon entity) {
            if (entity == null) return;
            TriggerJump Trigger = entity.gameObject.AddComponent<TriggerJump>();
            Trigger.Init(entity, 10f);
        }
        private List<BaseEntity> MonumentEntities = new List<BaseEntity>();
        private object OnSamSiteTarget(SamSite entity, SAMTargetComponent target) {
            if (target == null || entity == null) return null;
            BaseVehicleSeat chair = target.baseEntity as BaseVehicleSeat;
            if (chair == null) return null;
            BasePlayer player = chair.GetMounted();
            if (player == null) return null;
            if (player.userID == entity.OwnerID) return false;
            return null;
        }
        private Dictionary<String, List<Point>> PointsList = new Dictionary<String, List<Point>> {
            ["COMPOUND"]
            = new List<Point> {
                new Point {
                    Name = "NPC.POINT", Y = 40f, X = 0f, Pos = new Vector3(-4.3f, 0.3f, -1.4f), LinkImage = String.Empty,
                }
                , new Point {
                    Name = "TABLES.POINT", Y = 0f, X = 0f, Pos = new Vector3(-8f, 2.5f, -1.8f), LinkImage = SignImgLeft,
                }
                , new Point {
                    Name = "TABLES.POINT", Y = 0, X = 0f, Pos = new Vector3(3.7f, 0.6f, 16.2f), LinkImage = SignImgRight,
                }
                ,
            }
            , ["BANDIT_TOWN"] = new List<Point> {
                new Point {
                    Name = "NPC.POINT", Y = -65f, X = 0f, Pos = new Vector3(-54f, 2f, 28f), LinkImage = String.Empty,
                }
                , new Point {
                    Name = "TABLES.POINT", Y = -142f, X = 50f, Pos = new Vector3(-52.45f, 2f, 32f), LinkImage = SignImgLeft,
                }
                ,
            }
            , ["AIRFIELD"] = new List<Point> {
                new Point {
                    Name = "NPC.POINT", Y = 20f, X = 0f, Pos = new Vector3(-22.1f, 1.8f, -75.4f), LinkImage = String.Empty,
                }
                , new Point {
                    Name = "TABLES.POINT", Y = 0f, X = 0f, Pos = new Vector3(-24.5f, 2.8f, -75.8f), LinkImage = SignImgLeft,
                }
                , new Point {
                    Name = "TABLES.POINT", Y = -30f, X = 30f, Pos = new Vector3(-60.3f, 2.1f, -74.5f), LinkImage = SignImgLeft,
                }
                , new Point {
                    Name = "TABLES.POINT", Y = 180f, X = 13f, Pos = new Vector3(-158f, 0.22f, -76.8f), LinkImage = SignImgRight,
                }
                , new Point {
                    Name = "TABLES.POINT", Y = 10f, X = 20f, Pos = new Vector3(45.8f, 0.25f, -64.9f), LinkImage = SignImgRight,
                }
                ,
            }
            ,
        }
        ;
        public void SendChat(string Message, BasePlayer player, ConVar.Chat.ChatChannel channel = ConVar.Chat.ChatChannel.Global) {
            if (IQChat) if (_config.ReferenceSetting.IQChatSetting.UIAlertUse) IQChat?.Call("API_ALERT_PLAYER_UI", player, Message);
            else IQChat?.Call("API_ALERT_PLAYER", player, Message, _config.ReferenceSetting.IQChatSetting.CustomPrefix, _config.ReferenceSetting.IQChatSetting.CustomAvatar);
            else player.SendConsoleCommand("chat.add", channel, 0, Message);
        }
        private const String SignImgLeft = "https://i.imgur.com/xcflG7e.png";
        private void SpawnTables(Vector3 Position, Quaternion Rotation, String Image) {
            String Prefab = "assets/prefabs/deployable/signs/sign.large.wood.prefab";
            Signage Tables = GameManager.server.CreateEntity(Prefab, Position, Rotation) as Signage;
            Tables.Spawn();
            UnityEngine.Object.DestroyImmediate(Tables.GetComponent<DestroyOnGroundMissing>());
            UnityEngine.Object.DestroyImmediate(Tables.GetComponent<GroundWatch>());
            Tables.OwnerID = 435322777;
            ServerMgr.Instance.StartCoroutine(DownloadImage(Image, Tables, "sign.wooden.large"));
            Tables.SetFlag(BaseEntity.Flags.Busy, true);
            Tables.SetFlag(BaseEntity.Flags.Locked, true);
            MonumentEntities.Add(Tables);
        }
        Quaternion GetMonumentRotation(float y, MonumentInfo monument, Single x) {
            Quaternion monumentQT = Quaternion.Euler(monument.transform.rotation.eulerAngles.x - x, monument.transform.rotation.eulerAngles.y - y, 0f);
            return monumentQT;
        }
        private Vector3 PredictedPos(BaseEntity target, SamSite samSite, Vector3 targetVelocity) {
            Vector3 targetpos = target.transform.TransformPoint(target.transform.GetBounds().center);
            Vector3 displacement = targetpos - samSite.eyePoint.transform.position;
            float projectileSpeed = samSite.projectileTest.Get().GetComponent<ServerProjectile>().speed;
            float targetMoveAngle = Vector3.Angle(-displacement, targetVelocity) * Mathf.Deg2Rad;
            if (targetVelocity.magnitude == 0 || targetVelocity.magnitude > projectileSpeed && Mathf.Sin(targetMoveAngle) / projectileSpeed > Mathf.Cos(targetMoveAngle) / targetVelocity.magnitude) {
                return targetpos;
            }
            float shootAngle = Mathf.Asin(Mathf.Sin(targetMoveAngle) * targetVelocity.magnitude / projectileSpeed);
            return targetpos + targetVelocity * displacement.magnitude / Mathf.Sin(Mathf.PI - targetMoveAngle - shootAngle) * Mathf.Sin(shootAngle) / targetVelocity.magnitude;
        }
        object CanWearItem(PlayerInventory inventory, Item item, int targetSlot) {
            if (inventory == null || item == null) return null;
            BasePlayer player = inventory.gameObject.ToBaseEntity() as BasePlayer;
            if (player != null && item.skin == _config.ChuteSettings.Chute.SkinId && item.info.shortname == _config.ChuteSettings.Chute.ShortName) {
                NextTick(() => {
                    if (GetChute(player) == null) return;
                    //addcomponents
                    FlyDetected Detected = player.gameObject.AddComponent<FlyDetected>();
                    Detected.SetPlayer(player);
                    if (!FlyDetectedList.ContainsKey(player)) FlyDetectedList.Add(player, Detected);
                    else FlyDetectedList[player] = Detected;
                }
                );
            }
            return null;
        }
        object OnEntityTakeDamage(BaseEntity entity, HitInfo info) {
            if (info == null || entity == null) return null;
            if (entity.OwnerID == 435322777) return false;
            return null;
        }
        class FlyDetected : FacepunchBehaviour {
            BasePlayer player;
            public FlyDetected() {
                enabled = false;
            }
            public void SetPlayer(BasePlayer player) {
                this.player = player;
                enabled = true;
                InvokeRepeating(CheckFly, 0f, 1f);
            }
            private void CheckFly() {
                if (!player.IsOnGround() && !player.isMounted) if (!Physics.CheckSphere(player.transform.position, 2f, LAND_LAYERS)) {
                    _.OnEntityDismounted(null, player);
                    return;
                }
            }
            public void OnDestroy() => KillParent();
            public void KillParent() {
                CancelInvoke(CheckFly);
                enabled = false;
                UnityEngine.GameObject.Destroy(this);
            }
        }
        private void ShowInfo(BasePlayer player) {
            if (player == null) return;
            CuiHelper.DestroyUi(player, "UI_LABEL");
            var container = new CuiElementContainer();
            container.Add(new CuiElement {
                FadeOut = 0.3f, Name = "UI_LABEL", Parent = "Overlay", Components = {
                    new CuiTextComponent {
                        FadeIn = 0.3f, Text = GetLang("PARACHUTE_OPEN_INFO", player.UserIDString), Font = "robotocondensed-regular.ttf", FontSize = 20, Align = TextAnchor.MiddleCenter, Color = "1 1 1 1"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-244.2060 89.65697", OffsetMax = "227.806 123.390"
                    }
                }
            }
            );
            CuiHelper.AddUi(player, container);
            player.Invoke(() => {
                CuiHelper.DestroyUi(player, "UI_LABEL");
            }
            , 3f);
        }
        object CanAcceptItem(ItemContainer container, Item item) {
            if (container == null || item == null) return null;
            BasePlayer player = container.playerOwner;
            if (player == null) return null;
            if (player is ScientistNPC || player is HumanNPC || player is NPCPlayer) return null;
            if (item.skin == _config.ChuteSettings.Chute.SkinId && item.info.shortname == _config.ChuteSettings.Chute.ShortName) {
                // NextTick(() => {
                if (GetChute(player) == null) {
                    if (FlyDetectedList.ContainsKey(player)) if (FlyDetectedList[player] != null) if (FlyDetectedList[player] != null) DestroyOBJ(FlyDetectedList[player]);
                    ///removecomponents
                }
                //});
            }
            return null;
        }
        private class Point {
            public Vector3 Pos;
            public String LinkImage;
            public Single X;
            public Single Y;
            public String Name;
        }
        private static MonumentInfo Airfield;
        void OnEntityDismounted(BaseMountable entity, BasePlayer player) {
            if (entity is BaseBoat || entity is RidableHorse) return;
            Item Chute = _.GetChute(player);
            if (Chute == null) return;
            if (Physics.Raycast(new Ray(player.transform.position, Vector3.down), 3f, LAND_LAYERS)) return;
            if (!JumpingPlayer.Contains(player)) JumpingPlayer.Add(player);
            player.Invoke(() => PlayerInput(player), 0.01f);
            if (_config.ChuteSettings.UseAutoOpen) {
                FlyFinder Finder = player.gameObject.AddComponent<FlyFinder>();
                Finder.SetPlayer(player);
                if (!FlyFinderList.ContainsKey(player)) FlyFinderList.Add(player, Finder);
            }
            ShowInfo(player);
        }
        private object OnPlayerViolation(BasePlayer player, AntiHackType type, float amount) {
            if (type != AntiHackType.FlyHack) return null;
            if (player == null) return null;
            if (JumpingPlayer.Contains(player)) return true;
            return null;
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            try {
                _config = Config.ReadObject<PluginConfig>();
                if (_config == null) {
                    LoadDefaultConfig();
                }
            }
            catch {
                for (var i = 0; i < 3; i++) {
                    PrintError("Configuration file is corrupt! Check your config file at https:jsonlint.com/");
                }
                LoadDefaultConfig();
                return;
            }
            NextTick(SaveConfig);
            ValidateConfig();
        }
        private void OnEntitySpawned(ScrapTransportHelicopter entity) {
            if (entity == null) return;
            TriggerJump Trigger = entity.gameObject.AddComponent<TriggerJump>();
            Trigger.Init(entity, 20f);
        }
        public void OpenChute(BasePlayer player) {
            Item Chute = _.GetChute(player);
            if (Chute == null) return;
            if (_config.ChuteSettings.UseChuteAllOpen) if (FlyDetectedList.ContainsKey(player)) {
                DestroyOBJ(FlyDetectedList[player]);
   
// ... [Code preview truncated due to length. Full source in attached file] ...

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