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

FREE UberTool : 1.4.33 1.4.33

Нет прав для скачивания
C#:
using Facepunch;
using Network;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Oxide.Game.Rust.Libraries.Covalence;
using ProtoBuf;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using UnityEngine;
using BTN = BUTTON;
namespace Oxide.Plugins {
    [Info("UberTool", "FuJiCuRa", "1.4.33", ResourceId = 78)]
    [Description("The ultimative build'n'place solution without any borders or other known limits")]
    internal class UberTool : RustPlugin {
        [PluginReference]
        private Plugin Clans, ImageLibrary;
        private StrdDt playerPrefs = new StrdDt();
        private class StrdDt {
            public Dictionary<ulong, Plyrnf> playerData = new Dictionary<ulong, Plyrnf>();
            public StrdDt() {
            }
        }
        private class Plyrnf {
            public float SF;
            public int DBG;
            public ulong DBS;
            public Plyrnf() {
            }
        }
        private const string WIRE_EFFECT = "assets/prefabs/tools/wire/effects/plugeffect.prefab";
        private object CanUseWires(BasePlayer player) {
            EPlanner planner = player.GetComponent<EPlanner>();
            if (planner != null && planner.isWireTool) {
                return player.serverInput.IsDown(BTN.FIRE_SECONDARY);
            }
            return null;
        }
        private void PpltBldngSkns() {
            bldngSkns.Clear();
            uint id = StringPool.Get("assets/prefabs/building core/foundation/foundation.prefab");
            Construction c = PrefabAttribute.server.Find<Construction>(id);
            foreach (ConstructionGrade grade in c.grades) {
                if (grade.gradeBase.skin > 999999) continue;
                bldngSkns.Add(new BldSkn {
                    Grd = grade.gradeBase.type, Nm = grade.gradeBase.skin == 0 ? grade.gradeBase.type.ToString() : grade.gradeBase.upgradeMenu.name.english.Remove(0, 11), Skn = grade.gradeBase.skin
                }
                );
            }
            bldngSkns.Sort((BldSkn a, BldSkn b) => {
                return a.Grd.CompareTo(b.Grd);
            }
            );
        }
        public static List<BldSkn> bldngSkns = new List<BldSkn>();
        public class BldSkn {
            public BuildingGrade.Enum Grd;
            public ulong Skn;
            public string Nm;
        }
        private static int FndIdxSkn(BuildingGrade.Enum grade, ulong skinId) {
            for (int i = 0; i < bldngSkns.Count; i++) {
                BldSkn skin = bldngSkns[i];
                if (skin.Grd == grade && skin.Skn == skinId) return i;
            }
            return 0;
        }
        public class EPlanner : MonoBehaviour {
            private BasePlayer player;
            private InputState serverInput;
            private ItemId ctvtm;
            private Construction.Target target;
            private Construction.Target mvTrgt;
            private BaseEntity mvTrgtSnp;
            private Construction construction;
            private Construction mvCnstrctn;
            private Construction rayDefinition;
            private Vector3 rttnOffst;
            private Vector3 mvOffst;
            private string lstCrsshr;
            private string lstWrnng;
            private Planner plnnr;
            private bool isPlanner;
            private bool isHammering;
            internal bool isWireTool;
            internal bool isLightDeployer;
            private HeldEntity heldItem;
            private bool sRmvr;
            private bool isAnotherHeld;
            private Item ctvtmLnk;
            private bool sTpDplybl;
            private int grdIdx;
            private uint lstPrfb;
            private bool initialized;
            private bool ctvTrgt;
            private bool isPlacing;
            private float tkDist;
            private RaycastHit rayHit;
            private BaseEntity rayEntity;
            private IPlayer rayEntityOwner;
            private string rayEntityName;
            private Vector3 lastAimAngles;
            private Socket_Base lastSocketBase;
            private Vector3 lastSocketPos;
            private BaseEntity lastSocketEntity;
            private Construction.Placement lastPlacement;
            private Ray lastRay;
            private bool plannerInfoStatus;
            private bool removerInfoStatus;
            private bool hammerInfoStatus;
            private bool lastSocketForce;
            private int cuiFontSize = 14;
            private string cuiFontColor = "1 1 1 1";
            private string fontType = r("EbobgbPbaqrafrq-Erthyne.ggs");
            private float lastPosRotUpdate = 0f;
            private void Awake() {
                player = GetComponent<BasePlayer>();
                serverInput = player.serverInput;
                Unequip();
                int grade = Instance.playerPrefs.playerData[player.userID].DBG;
                ulong skinId = Instance.playerPrefs.playerData[player.userID].DBS;
                for (int index = 0; index < bldngSkns.Count; index++) {
                    BldSkn skin = bldngSkns[index];
                    if ((int)skin.Grd == grade && skin.Skn == skinId) {
                        grdIdx = index;
                        break;
                    }
                }
                lstPrfb = 72949757u;
                ctvtm = default(ItemId);
                construction = new Construction();
                rayDefinition = new Construction();
                construction.canBypassBuildingPermission = true;
                lastAimAngles = player.lastReceivedTick.inputState.aimAngles;
                lastSocketBase = default(Socket_Base);
                lastSocketPos = Vector3.zero;
                lastSocketEntity = default(BaseEntity);
                lastPlacement = default(Construction.Placement);
                rayEntity = default(BaseEntity);
                rttnOffst = Vector3.zero;
                mvOffst = Vector3.zero;
            }
            private void Start() {
                if (Instance.hideTips) player.SendConsoleCommand(r("tnzrgvc.uvqrtnzrgvc"));
                initialized = true;
            }
            private void Unequip() {
                foreach (Item item in player.inventory.containerBelt.itemList.Where(x => x.IsValid() && x.GetHeldEntity()).ToList()) {
                    int slot = item.position;
                    if (item.info.shortname == "rock" && item.skin == 0uL || item.info.shortname == "torch") {
                        item.Remove(0f);
                        continue;
                    }
                    else {
                        item.RemoveFromContainer();
                    }
                    player.inventory.UpdateContainer(0f, PlayerInventory.Type.Belt, player.inventory.containerBelt, false, 0f);
                    Instance.timer.Once(0.15f, () => {
                        if (item == null) return;
                        item.MoveToContainer(player.inventory.containerBelt, slot, true);
                        item.MarkDirty();
                    }
                    );
                    ItemManager.DoRemoves();
                }
                if (player.inventory.containerWear.itemList.Count == 0) {
                    Item hz = ItemManager.CreateByName("hazmatsuit_scientist", 1);
                    player.inventory.GiveItem(hz, player.inventory.containerWear);
                }
                Instance.timer.Once(0.3f, CrtTls);
            }
            private void GetTool(object[] tool) {
                ItemDefinition itemDef = ItemManager.FindItemDefinition((string)tool[1]);
                if (!itemDef) return;
                Item p1 = player.inventory.FindItemID(itemDef.itemid);
                ulong skin = Convert.ToUInt64(tool[2]);
                if (p1 != null) {
                    p1.skin = skin;
                    p1.GetHeldEntity().skinID = skin;
                    p1.name = (string)tool[0];
                    if (p1.CanMoveTo(player.inventory.containerBelt, -1)) {
                        p1.MoveToContainer(player.inventory.containerBelt, -1, true);
                        p1.MarkDirty();
                    }
                }
                else {
                    Item p2 = ItemManager.CreateByItemID(itemDef.itemid, 1, skin);
                    if (p2 != null) {
                        p2.name = (string)tool[0];
                        player.inventory.GiveItem(p2, player.inventory.containerBelt);
                        p2.MarkDirty();
                    }
                }
            }
            private void CrtTls() {
                if (Instance.checkExistingPlanner) GetTool(Instance.playerTools[0]);
                if (Instance.checkExistingRemover) GetTool(Instance.playerTools[1]);
                if (Instance.checkExistingHammer) GetTool(Instance.playerTools[2]);
            }
            private bool GetCurrentTool() {
                isPlanner = false;
                sRmvr = false;
                isHammering = false;
                isWireTool = false;
                isAnotherHeld = false;
                isLightDeployer = false;
                DestroyInfo();
                if (heldItem is Planner) {
                    plnnr = heldItem as Planner;
                    isPlanner = true;
                    sTpDplybl = plnnr.isTypeDeployable;
                    DoPlannerInfo();
                    return true;
                }
                else if (heldItem is BaseProjectile && ctvtmLnk.skin == Convert.ToUInt64(Instance.playerTools[1][2])) {
                    sRmvr = true;
                    return true;
                }
                else if (heldItem is Hammer && ctvtmLnk.skin == Convert.ToUInt64(Instance.playerTools[2][2])) {
                    isHammering = true;
                    DoHammerInfo();
                    return true;
                }
                else if (heldItem is AttackEntity) {
                    isAnotherHeld = true;
                    return true;
                }
                else if (heldItem is WireTool) {
                    isWireTool = true;
                    return true;
                }
                else if (heldItem is PoweredLightsDeployer) {
                    isLightDeployer = true;
                    return true;
                }
                if (!isWireTool && (source != null || isWiring)) {
                    if (sourceSlot != null) sourceSlot.linePoints = new Vector3[0];
                    source = null;
                    sourceSlot = null;
                    isWiring = false;
                }
                return false;
            }
            private void CheckRemover() {
                bool hsLsr = false;
                if (ctvtmLnk.info.shortname != (string)Instance.playerTools[1][1]) {
                    sRmvr = false;
                    heldItem = null;
                    return;
                }
                ctvtmLnk.contents.flags = (ItemContainer.Flag)64;
                ctvtmLnk.contents.MarkDirty();
                if (ctvtmLnk.contents != null && ctvtmLnk.contents.itemList.Count > 0) foreach (Item mod in ctvtmLnk.contents.itemList) if (mod.info.shortname == r("jrncba.zbq.ynfrefvtug")) {
                    hsLsr = true;
                    break;
                }
                if (!hsLsr) {
                    Item lMod = ItemManager.CreateByName(r("jrncba.zbq.ynfrefvtug"), 1);
                    if (lMod != null) if (lMod.MoveToContainer(ctvtmLnk.contents, -1, true)) {
                        hsLsr = true;
                    }
                    else {
                        sRmvr = false;
                        heldItem = null;
                        return;
                    }
                }
                (heldItem as BaseProjectile).UnloadAmmo(ctvtmLnk, player);
                heldItem.SetLightsOn(true);
                DoRemoverInfo();
            }
            public void SetHeldItem(ItemId uid) {
                if (!initialized || uid == ctvtm) return;
                if (uid == default(ItemId)) {
                    ctvtm = default(ItemId);
                    isPlanner = false;
                    sRmvr = false;
                    isHammering = false;
                    isWireTool = false;
                    sTpDplybl = false;
                    construction = null;
                    isLightDeployer = false;
                    DestroyInfo();
                    return;
                }
                if (uid != ctvtm) {
                    ctvtmLnk = player.inventory.containerBelt.FindItemByUID(uid);
                    if (ctvtmLnk == null) return;
                    ctvtm = uid;
                    heldItem = ctvtmLnk.GetHeldEntity() as HeldEntity;
                    if (heldItem == null) return;
                    if (!GetCurrentTool()) return;
                    if (sRmvr) {
                        CuiHelper.DestroyUi(player, r("HgPebffUnveHV"));
                        CuiHelper.DestroyUi(player, "ut.ioslotchooser");
                        CheckRemover();
                    }
                    else if (isPlanner || isHammering) {
                        uint prefabId = lstPrfb;
                        if (isPlanner && sTpDplybl) {
                            if (plnnr.GetDeployable() != null) prefabId = plnnr.GetDeployable().prefabID;
                            else {
                                ItemModDeployable itemDef = plnnr.GetOwnerItemDefinition().GetComponent<ItemModDeployable>();
                                if (itemDef != null) prefabId = itemDef.entityPrefab.resourceID;
                            }
                        }
                        construction = PrefabAttribute.server.Find<Construction>(prefabId);
                        rttnOffst = Vector3.zero;
                        if (isPlanner) {
                            if (sTpDplybl) DoPlannerUpdate(PType.Mode, ctvtmLnk.info.displayName.english);
                            else DoPlannerUpdate(PType.Mode, $"{construction.info.name.english} ({bldngSkns[grdIdx].Nm})");
                        }
                        else {
                            DoPlannerUpdate(PType.Mode);
                        }
                    }
                }
            }
            private bool isWiring = false;
            public void TickUpdate(PlayerTick tick) {
                if (!initialized) return;
                bool changedInput = tick.inputState.aimAngles != lastAimAngles || tick.inputState.buttons != serverInput.previous.buttons || lastSocketForce;
                if (lastSocketForce) lastSocketForce = false;
                if (changedInput && !ctvTrgt) {
                    rayHit = default(RaycastHit);
                    lastAimAngles = tick.inputState.aimAngles;
                    int layer = sRmvr && Instance.removeToolObjects ? 1143155457 : 2163457;
                    float range = 24f;
                    if (sRmvr) range = Instance.removeToolRange;
                    else if (isHammering) range = Instance.hammerToolRange;
                    lastRay = player.eyes.HeadRay();
                    // new Ray(tick.position + new Vector3(0f, 1.5f, 0f), Quaternion.Euler(tick.inputState.aimAngles) * Vector3.forward);
                    if (Physics.Raycast(lastRay, out rayHit, range, layer, QueryTriggerInteraction.Ignore)) {
                        BaseEntity ent = rayHit.GetEntity();
                        bool isParented = ent && ent.GetParentEntity() is Tugboat;
                        if (ent != null && ent != rayEntity && !isParented) {
                            rayEntity = ent;
                            rayDefinition = PrefabAttribute.server.Find<Construction>(rayEntity.prefabID);
                            if (rayEntity.OwnerID > 0uL) rayEntityOwner = Instance.covalence.Players.FindPlayerById(rayEntity.OwnerID.ToString());
                            else rayEntityOwner = null;
                            rayEntityName = "";
                            if (rayDefinition) rayEntityName = rayDefinition.info.name.english;
                            if (rayEntityName.Length == 0) {
                                if (rayEntity is BaseCombatEntity) {
                                    rayEntityName = (rayEntity as BaseCombatEntity).repair.itemTarget?.displayName.english;
                                    if (rayEntityName == null || rayEntityName.Length == 0) rayEntityName = rayEntity.ShortPrefabName;
                                }
                                else {
                                    rayEntityName = rayEntity.ShortPrefabName;
                                }
                            }
                            if (rayDefinition == null && (rayEntity.PrefabName.EndsWith("static.prefab") || rayEntity.PrefabName.Contains("/deployable/"))) {
                                rayDefinition = new Construction();
                                rayDefinition.rotationAmount = new Vector3(0, 90f, 0);
                                rayDefinition.fullName = rayEntity.PrefabName;
                                rayDefinition.maxplaceDistance = 8f;
                            }
                        }
                        else if (ent == null) {
                            rayEntity = null;
                            rayDefinition = null;
                            rayEntityOwner = null;
                            rayEntityName = "";
                        }
                    }
                    else {
                        rayEntity = null;
                        rayDefinition = null;
                        rayEntityOwner = null;
                        rayEntityName = "";
                    }
                    if (isPlanner) {
                        if (lstWrnng != string.Empty) DoWarning(string.Empty, true);
                        target = default(Construction.Target);
                        target.player = player;
                        target.ray = lastRay;
                        CheckPlacement(ref target, construction);
                        if (target.socket != null && (target.socket != lastSocketBase || target.entity != lastSocketEntity || lastSocketForce)) {
                            if (lastSocketForce) lastSocketForce = false;
                            bool chEnt = false;
                            if (Instance.effectFoundationPlacement && construction.hierachyName.Contains("foundation") && lastSocketEntity != target.entity) {
                                chEnt = true;
                                SendEffectTo(3951505782, target.entity, player);
                            }
                            lastSocketEntity = target.entity;
                            string name = target.entity.ShortPrefabName;
                            if (target.entity is BuildingBlock) DoPlannerUpdate(PType.ConnectTo, $"{rayEntityName} [{target.entity.net.ID}] ({(target.entity as BuildingBlock).currentGrade.gradeBase.type.ToString()})");
                            else DoPlannerUpdate(PType.ConnectTo, $"{rayEntityName} [{target.entity.net.ID}]");
                            if (Instance.effectFoundationPlacement && !chEnt && construction.hierachyName.Contains("foundation") && lastSocketBase != target.socket) SendEffectTo(3389733993, target.entity, player);
                            lastSocketBase = target.socket;
                            lastSocketPos = lastSocketEntity.transform.localToWorldMatrix.MultiplyPoint3x4(lastSocketBase.position);
                            string s1 = lastSocketBase.socketName.Replace($"{target.entity.ShortPrefabName}/sockets/", "").TrimEnd('/', '1', '2', '3', '4').Replace("-", " ").Replace("–", " ");
                            DoPlannerUpdate(PType.ToSocket, $"{Oxide.Core.ExtensionMethods.TitleCase(s1)}");
                            lastPlacement = CheckPlacement(target, construction);
                            if (lastPlacement != null) DoPlannerUpdate(PType.PosRot, $"{lastPlacement.position.ToString("N1")} | {lastPlacement.rotation.eulerAngles.y.ToString("N1")}°");
                            else DoPlannerUpdate(PType.PosRot);
                        }
                        if (sTpDplybl) {
                            lastPlacement = CheckPlacement(target, construction);
                            if (lastPlacement != null) {
                                DoPlannerUpdate(PType.PosRot, $"{lastPlacement.position.ToString("N1")} | {lastPlacement.rotation.eulerAngles.ToString("N1")}");
                                DoPlannerUpdate(PType.ToSocket, "Terrain");
                                if (rayEntity) DoPlannerUpdate(PType.ConnectTo, $"{rayEntityName} [{rayEntity.net.ID}]");
                            }
                            else {
                                DoPlannerUpdate(PType.ToSocket);
                                DoPlannerUpdate(PType.ConnectTo);
                                DoPlannerUpdate(PType.PosRot);
                            }
                        }
                        if (!sTpDplybl && !target.socket) {
                            lastSocketBase = default(Socket_Base);
                            lastSocketEntity = default(BaseEntity);
                            DoPlannerUpdate(PType.ConnectTo);
                            DoPlannerUpdate(PType.PosRot);
                            DoPlannerUpdate(PType.ToSocket);
                        }
                    }
                    else if (isHammering) {
                        if (lstWrnng != string.Empty) DoWarning(string.Empty, true);
                        if (!ctvTrgt) {
                            if (rayEntity && rayHit.distance <= Instance.hammerToolRange) {
                                if (rayDefinition && rayEntity is BuildingBlock) {
                                    BuildingBlock block = rayEntity as BuildingBlock;
                                    BldSkn bldSkn = bldngSkns[FndIdxSkn(block.currentGrade.gradeBase.type, block.skinID)];
                                    DoHammerUpdate(HType.Target, $"{rayEntityName} [{rayEntity.net.ID}] ({bldSkn.Nm})");
                                    DoCrosshair("0 1 0 0.75");
                                }
                                else if (rayDefinition) {
                                    if (rayDefinition.fullName == StringPool.Get(3424003500)) DoHammerUpdate(HType.Target, $"{rayEntityName} [{rayEntity.net.ID}] (Type: {(rayEntity as MiningQuarry).staticType})");
                                    else DoHammerUpdate(HType.Target, $"{rayEntityName} [{rayEntity.net.ID}]");
                                    DoCrosshair("1 0.921568632 0.0156862754 0.75");
                                }
                                else {
                                    DoHammerUpdate(HType.Target, $"{rayEntityName} [{rayEntity.net.ID}]");
                                }
                                DoHammerUpdate(HType.Mode, "Modify");
                                DoHammerUpdate(HType.Building, rayEntity is DecayEntity ? $"ID {(rayEntity as DecayEntity).buildingID}" : "None");
                                if (rayDefinition) {
                                    float currentTime = Time.realtimeSinceStartup;
                                    if (currentTime - lastPosRotUpdate >= 0.25f) {
                                        if (rayEntity is BuildingBlock) DoHammerUpdate(HType.PosRot, $"{rayEntity.transform.position.ToString("N1")} | {rayEntity.transform.rotation.eulerAngles.y.ToString("N1")}°");
                                        else DoHammerUpdate(HType.PosRot, $"{rayEntity.transform.position.ToString("N1")} | {rayEntity.transform.rotation.eulerAngles.ToString("N1")}");
                                        lastPosRotUpdate = currentTime;
                                    }
                                    if (rayEntityOwner != null) DoHammerUpdate(HType.Owner, $"{rayEntityOwner.Name}");
                                    else DoHammerUpdate(HType.Owner, $"{rayEntity.OwnerID}");
                                    DoHammerUpdate(HType.SteamID, $"{rayEntity.OwnerID}");
                                }
                            }
                            else {
                                DoHammerUpdate(HType.Target);
                                DoHammerUpdate(HType.Building);
                                DoHammerUpdate(HType.Mode, r("Zbqvsl"));
                                DoHammerUpdate(HType.PosRot);
                                DoHammerUpdate(HType.Owner);
                                DoCrosshair("1 1 1 0.75");
                            }
                        }
                        else {
                            DoHammerUpdate(HType.PosRot, $"{mvTrgt.entity.transform.position.ToString("N1")} | {mvTrgt.entity.transform.rotation.eulerAngles.ToString("N1")}");
                            DoCrosshair(string.Empty);
                        }
                    }
                    else if (sRmvr) {
                        DoCrosshair(string.Empty);
                        if (rayEntity != null && rayHit.distance <= Instance.removeToolRange && (rayDefinition || !rayDefinition && Instance.removeToolObjects)) {
                            DoRemoverUpdate(RType.Remove, $"{rayEntityName} [{rayEntity.net.ID}]");
                            if (rayEntityOwner != null) DoRemoverUpdate(RType.Owner, $"{rayEntityOwner.Name}");
                            else DoRemoverUpdate(RType.Owner, $"{rayEntity.OwnerID}");
                        }
                        else {
                            DoRemoverUpdate(RType.Remove);
                            DoRemoverUpdate(RType.Owner);
                        }
                        if (Instance.enableFullRemove && serverInput.IsDown(controlButtons[CmdType.RemoverHoldForAll]) && rayEntity is BuildingBlock) {
                            DoWarning("1 0 0 0.75");
                            DoRemoverUpdate(RType.Mode, "<color=#ffff00>Building</color>");
                        }
                        else {
                            DoRemoverUpdate(RType.Mode, r("Fvatyr"));
                            DoWarning(string.Empty);
                        }
                    }
                    else if (isAnotherHeld) {
                        if (heldItem is BaseLiquidVessel && (serverInput.WasJustReleased((BTN) 1024) || serverInput.WasDown((BTN) 2048))) {
                            BaseLiquidVessel vessel = heldItem as BaseLiquidVessel;
                            if (vessel.AmountHeld() < 1) vessel.AddLiquid(ItemManager.FindItemDefinition("water"), vessel.MaxHoldable());
                        }
                        else if (heldItem is BaseProjectile && serverInput.WasJustPressed((BTN) 8192)) {
                            BaseProjectile weapon = heldItem as BaseProjectile;
                            if (!weapon.primaryMagazine.CanReload(player) && weapon.primaryMagazine.contents < weapon.primaryMagazine.capacity) {
                                try {
                                    player.inventory.GiveItem(ItemManager.Create(weapon.primaryMagazine.ammoType, weapon.primaryMagazine.capacity - weapon.primaryMagazine.contents));
                                }
                                catch {
                                }
                                ItemManager.DoRemoves();
                            }
                        }
                        else if (heldItem is FlameThrower && (serverInput.WasJustPressed((BTN) 8192) || serverInput.IsDown((BTN) 1024))) {
                            FlameThrower flame = heldItem as FlameThrower;
                            if (serverInput.IsDown((BTN) 1024) && flame.ammo < 2 || serverInput.WasJustPressed((BTN) 8192) && flame.ammo < flame.maxAmmo) {
                                flame.ammo = flame.maxAmmo;
                                flame.SendNetworkUpdateImmediate(false);
                                ItemManager.DoRemoves();
                                player.inventory.ServerUpdate(0f);
                            }
                        }
                        else if (heldItem is Chainsaw && (serverInput.WasJustPressed((BTN) 8192) || serverInput.IsDown((BTN) 1024) || serverInput.WasJustPressed((BTN) 2048))) {
                            Chainsaw saw = heldItem as Chainsaw;
                            if (serverInput.WasJustPressed((BTN) 2048) && !saw.EngineOn()) {
                                saw.SetEngineStatus(true);
                                heldItem.SendNetworkUpdateImmediate(false);
                            }
                            else if (serverInput.IsDown((BTN) 1024) && saw.ammo < 2 || serverInput.WasJustPressed((BTN) 8192) && saw.ammo < saw.maxAmmo) {
                                saw.ammo = saw.maxAmmo;
                                saw.SendNetworkUpdateImmediate(false);
                                ItemManager.DoRemoves();
                                player.inventory.ServerUpdate(0f);
                            }
                        }
                    }
                    else if (isLightDeployer) {
                        PoweredLightsDeployer lightsDeployer = heldItem as PoweredLightsDeployer;
                        if (lightsDeployer == null) return;
                        if (player.serverInput.WasJustPressed(BTN.FIRE_SECONDARY)) {
                            lightsDeployer.DoFinish();
                            return;
                        }
                        if (player.serverInput.WasJustPressed(BTN.FIRE_PRIMARY)) {
                            RaycastHit raycastHit;
                            if (Physics.Raycast(player.eyes.HeadRay(), out raycastHit, 5f)) {
                                if (heldItem.GetItem() == null) {
                                    return;
                                }
                                if (heldItem.GetItem().amount < 1) {
                                    return;
                                }
                                if (!heldItem.IsVisible(raycastHit.point, Single.PositiveInfinity)) {
                                    return;
                                }
                                if (Vector3.Distance(raycastHit.point, player.eyes.position) > 5f) {
                                    player.ChatMessage("Too far away!");
                                    return;
                                }
                                int amountToUse = 1;
                                if (lightsDeployer.active != null) {
                                    if (lightsDeployer.active.IsFinalized()) return;
                                    float length = 0f;
                                    Vector3 position = lightsDeployer.active.transform.position;
                                    if (lightsDeployer.active.points.Count > 0) {
                                        position = lightsDeployer.active.points[lightsDeployer.active.points.Count - 1].point;
                                        length = Vector3.Distance(raycastHit.point, position);
                                    }
                                    length = Mathf.Max(length, lightsDeployer.lengthPerAmount);
                                    float item1 = (float) heldItem.GetItem().amount * lightsDeployer.lengthPerAmount;
                                    if (length > item1) {
                                        length = item1;
                                        raycastHit.point = position + (Vector3Ex.Direction(raycastHit.point, position) * length);
                                    }
                                    length = Mathf.Min(item1, length);
                                    amountToUse = Mathf.CeilToInt(length / lightsDeployer.lengthPerAmount);
                                }
                                else {
                                    AdvancedChristmasLights component = GameManager.server.CreateEntity(lightsDeployer.poweredLightsPrefab.resourcePath, raycastHit.point, Quaternion.LookRotation(raycastHit.normal, player.eyes.HeadUp()), true).GetComponent<AdvancedChristmasLights>();
                                    component.Spawn();
                                    lightsDeployer.active = component;
                                    amountToUse = 1;
                                }
                                lightsDeployer.active.AddPoint(raycastHit.point, raycastHit.normal);
                                lightsDeployer.SetFlag(BaseEntity.Flags.Reserved8, lightsDeployer.active != null, false, true);
                                lightsDeployer.active.AddLengthUsed(amountToUse);
                                lightsDeployer.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
                            }
                        }
                    }
                    else if (isWireTool) {
                        if (player.serverInput.WasJustPressed(BTN.FIRE_SECONDARY)) {
                            source = null;
                            sourceSlot = null;
                            if (isWiring) {
                                isWiring = false;
                                player.ChatMessage("Cancelled current IO connection");
                            }
                            return;
                        }
                        if (player.serverInput.WasJustPressed(BTN.FIRE_PRIMARY)) {
                            RaycastHit raycastHit;
                            Ray ray = player.eyes.HeadRay();
                            if (Physics.Raycast(ray, out raycastHit, 5f)) {
                                IOEntity ioEntity = raycastHit.GetEntity() as IOEntity;
                                if (!ioEntity) {
                                    player.ChatMessage("You are not looking at an IO entity");
                                    return;
                                }
                                IOEntity.IOSlot[] slots = isWiring ? ioEntity.inputs : ioEntity.outputs;
                                int slotCount = slots.Where(x => x.type == IOEntity.IOType.Electric && !x.connectedTo.ioEnt).Count();
                                if (slotCount == 0) {
                                    player.ChatMessage("The IO entity you are looking at has no free electric slots");
                                    return;
                                }
                                const string PANEL = "ut.ioslotchooser";
                                float top = 0.5f + (0.035f * ((float) slotCount * 0.5f));
                                CuiElementContainer mainContainer = new CuiElementContainer() {
                                    {
                                        new CuiPanel {
                                            Image = {
                                                Color = "0 0 0 0"
                                            }
                                            , RectTransform = {
                                                AnchorMin = $"0.45 {top - 0.035f}", AnchorMax = $"0.55 {top}"
                                            }
                                            , CursorEnabled = true
                                        }
                                        , new CuiElement().Parent = "Overlay", PANEL
                                    }
                                }
                                ;
                                mainContainer.Add(new CuiPanel {
                                    Image = {
                                        Color = "0 0 0 0.85", Material = "assets/content/ui/uibackgroundblur.mat"
                                    }
                                    , RectTransform = {
                                        AnchorMin = "0 1.05", AnchorMax = "1 1.95"
                                    }
                                }
                                , PANEL);
                                mainContainer.Add(new CuiElement {
                                    Name = CuiHelper.GetGuid(), Parent = PANEL, Components = {
                                        new CuiTextComponent {
                                            Color = cuiFontColor, Text = isWiring ? "Choose an input slot" : "Choose an output slot", Font = fontType, FontSize = 12, Align = TextAnchor.MiddleCenter
                                        }
                                        , new CuiRectTransformComponent {
                                            AnchorMin = "0 1.05", AnchorMax = "1 1.95"
                                        }
                                    }
                                }
                                );
                                mainContainer.Add(new CuiButton {
                                    Button = {
                                        Command = $"ut.io -1", Color = "0 0 0 0.85", Material = "assets/content/ui/uibackgroundblur.mat"
                                    }
                                    , RectTransform = {
                                        AnchorMin = "0 0.05", AnchorMax = "1 0.95"
                                    }
                                    , Text = {
                                        Text = "Cancel", FontSize = 12, Align = TextAnchor.MiddleCenter
                                    }
                                }
                                , PANEL);
                                int count = 0;
                                for (int i = 0; i < slots.Length; i++) {
                                    IOEntity.IOSlot ioSlot = slots[i];
                                    if (ioSlot.type != IOEntity.IOType.Electric || ioSlot.connectedTo.ioEnt) continue;
                                    mainContainer.Add(new CuiButton {
                                        Button = {
                                            Command = $"ut.io {i}", Color = "0 0 0 0.85", Material = "assets/content/ui/uibackgroundblur.mat"
                                        }
                                        , RectTransform = {
                                            AnchorMin = $"0 {(-(count + 1)) + 0.05f}", AnchorMax = $"1 {(-count) - 0.05f}"
                                        }
                                        , Text = {
                                            Text = ioSlot.niceName, FontSize = 12, Align = TextAnchor.MiddleCenter
                                        }
                                    }
                                    , PANEL);
                                    count++;
                                }
                                CuiHelper.DestroyUi(player, PANEL);
                                CuiHelper.AddUi(player, mainContainer);
                            }
                        }
                    }
                }
                else if (changedInput && ctvTrgt) {
                    DoHammerUpdate(HType.PosRot, $"{mvTrgt.entity.transform.position.ToString("N1")} | {mvTrgt.entity.transform.rotation.eulerAngles.ToString("N1")}");
                    DoCrosshair(string.Empty, true);
                }
                if (isPlanner && !sTpDplybl) {
                    if (lastSocketBase != null && lastPlacement != null && lastSocketEntity) {
                        OBB oBB = new OBB(lastPlacement.position, Vector3.one, lastPlacement.rotation, construction.bounds);
                        Vector3 obb_pos = construction.hierachyName.Contains(r("sbhaqngvba")) ? oBB.position + oBB.extents.y * Vector3.up : oBB.position;
                        Vector3 sock_pos = construction.hierachyName.Contains(r("sbhaqngvba")) ? new Vector3(lastSocketPos.x, lastSocketEntity.transform.position.y, lastSocketPos.z) : lastSocketPos;
                        player.SendConsoleCommand("ddraw.box", 0.05f, Color.green, obb_pos, 0.15f);
                        player.SendConsoleCommand("ddraw.box", 0.05f, Color.green, sock_pos, 0.25f);
                        player.SendConsoleCommand("ddraw.line", 0.05f, Color.green, obb_pos, sock_pos);
                    }
                }
            }
            public void OnIO(int index) {
                CuiHelper.DestroyUi(player, "ut.ioslotchooser");
                if (index == -1) {
                    isWiring = false;
                    player.ChatMessage("Cancelled current IO connection");
                    return;
                }
                RaycastHit raycastHit;
                Ray ray = player.eyes.HeadRay();
                if (Physics.Raycast(ray, out raycastHit, 5f)) {
                    IOEntity ioEntity = raycastHit.GetEntity() as IOEntity;
                    if (!isWiring) {
                        if (ioEntity != null) {
                            IOEntity.IOSlot target = ioEntity.outputs[index];
                            if (target != null) {
                                source = ioEntity;
                                sourceSlot = target;
                                isWiring = true;
                                player.ChatMessage($"Begin Wiring - From {source.ShortPrefabName} (Slot {sourceSlot.niceName})");
                                player.SendConsoleCommand("ddraw.sphere", 30f, Color.green, source.transform.TransformPoint(sourceSlot.handlePosition), 0.025f);
                                Effect.server.Run(WIRE_EFFECT, ioEntity.transform.position);
                            }
                            else player.ChatMessage("No valid IO Entity found");
                        }
                    }
                    else {
                        if (ioEntity == null) player.ChatMessage("Select another IO slot to make a connection");
                        else {
                            if (ioEntity == source) {
                                player.ChatMessage("You can not connect a IO entity to itself");
                                return;
                            }
                            IOEntity.IOSlot target = ioEntity.inputs[index];
                            if (target != null) {
                                player.SendConsoleCommand("ddraw.sphere", 30f, Color.green, ioEntity.transform.TransformPoint(target.handlePosition), 0.025f);
                                sourceSlot.connectedTo = new IOEntity.IORef();
                                sourceSlot.connectedTo.ioEnt = ioEntity;
                                sourceSlot.connectedTo.Set(ioEntity);
                                sourceSlot.connectedToSlot = index;
                                sourceSlot.linePoints = new Vector3[] {
                                    ioEntity.transform.TransformPoint(target.handlePosition), source.transform.TransformPoint(sourceSlot.handlePosition)
                                }
                                ;
                                target.connectedTo = new IOEntity.IORef();
                                target.connectedTo.ioEnt = source;
                                target.connectedTo.Set(source);
                                source.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
                                ioEntity.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
                                source.MarkDirtyForceUpdateOutputs();
                                ioEntity.MarkDirtyForceUpdateOutputs();
                                player.ChatMessage($"Connected IO from {source.ShortPrefabName} (Slot {sourceSlot.niceName}) -> {ioEntity.ShortPrefabName} (Slot {target.niceName})");
                                Effect.server.Run(WIRE_EFFECT, ioEntity.transform.position);
                                source = null;
                                sourceSlot = null;
                                isWiring = false;
                            }
                            else player.ChatMessage("Failed to make a connection");
                        }
                    }
                }
            }
            private IOEntity source;
            private IOEntity.IOSlot sourceSlot;
            private void Update() {
                if (!ctvTrgt) return;
                if (!isPlacing && isHammering) {
                    if (mvTrgt.entity == null) {
                        DoCrosshair("1 1 1 0.75");
                        mvTrgt = default(Construction.Target);
                        isPlacing = false;
                        ctvTrgt = false;
                        return;
                    }
                    bool flag = mvTrgt.entity is SimpleBuildingBlock || mvCnstrctn.allSockets == null;
                    mvTrgt.ray = player.eyes.BodyRay();
                    FndTrrnPlcmnt(ref mvTrgt, mvCnstrctn, tkDist, flag);
                    Vector3 position = mvTrgt.entity.transform.position;
                    Quaternion rotation = mvTrgt.entity.transform.rotation;
                    Vector3 toPos = mvTrgt.position;
                    Quaternion toRot = Quaternion.LookRotation(mvTrgt.entity.transform.up) * Quaternion.Euler(mvOffst);
                    if (flag) {
                        Vector3 direction = mvTrgt.ray.direction;
                        direction.y = 0f;
                        direction.Normalize();
                        toRot = Quaternion.Euler(mvOffst) * Quaternion.LookRotation(direction, Vector3.up);
                    }
                    Construction.Placement check = CheckPlacement(mvTrgt, mvCnstrctn);
                    if (check != null) {
                        toPos = check.position;
                        toRot = check.rotation * Quaternion.Euler(mvOffst);
                    }
                    mvTrgt.entity.transform.position = Vector3.Lerp(position, toPos, Time.deltaTime * 5f);
                    mvTrgt.entity.transform.rotation = Quaternion.Lerp(rotation, toRot, Time.deltaTime * 10f);
                    DMvmntSnc(mvTrgt.entity);
                    return;
                }
                else if (isPlacing) {
                    if (mvTrgt.entity == null) {
                        DoCrosshair("1 1 1 0.75");
                        mvTrgt = default(Construction.Target);
                        isPlacing = false;
                        ctvTrgt = false;
                        return;
                    }
                    if (Vector3.Distance(mvTrgt.entity.transform.position, mvTrgt.position) <= 0.005f) {
                        if (mvTrgtSnp && !(mvTrgtSnp is BuildingBlock)) {
                            mvTrgt.entity.transform.position = mvTrgtSnp.transform.InverseTransformPoint(mvTrgt.position);
                            mvTrgt.entity.transform.rotation = Quaternion.Inverse(mvTrgtSnp.transform.rotation) * Quaternion.Euler(mvTrgt.rotation);
                            mvTrgt.entity.SetParent(mvTrgtSnp, 0u);
                        }
                        if (mvTr
// ... [Code preview truncated due to length. Full source in attached file] ...

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

Другие ресурсы пользователя 15FPS

Сверху