Ejemplo n.º 1
0
        // On load
        public void OnProtoDeserializeObjectTree(ProtobufSerializer _)
        {
            if (SaveData.Load())
            {
                foreach (string slot in SlotNames)
                {
                    Armour.AddSlot(slot);

                    TechType slotItem = (TechType)SaveData.Data.GetOrDefault(slot, (int)TechType.None);

                    if (slotItem == TechType.None)
                    {
                        continue;
                    }

                    //Pickupable itemPickup = new Pickupable();
                    //itemPickup.SetTechTypeOverride(slotItem);
                    //InventoryItem item = new InventoryItem(itemPickup);

                    GameObject    itemObject     = CraftData.InstantiateFromPrefab(slotItem);
                    Pickupable    itemPickupable = itemObject.GetComponent <Pickupable>();
                    InventoryItem item           = new InventoryItem(itemPickupable);

                    Armour.AddItem(slot, item, true);
                    typeof(Pickupable).GetMethod("Deactivate", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(itemPickupable, null);
                }
            }
            else
            {
                SetSlots();
            }

            Logger.Log($"Successfully loaded items for {ID}");
        }
Ejemplo n.º 2
0
        protected IEnumerator AddInventoryAsync(TechType techType, IOut <GameObject> result = null)
        {
#if SUBNAUTICA_STABLE
            GameObject go = CraftData.InstantiateFromPrefab(techType, false);
#elif BELOWZERO
            TaskResult <GameObject> instResult = new TaskResult <GameObject>();
            yield return(CraftData.InstantiateFromPrefabAsync(techType, instResult, false));

            GameObject go = instResult.Get();
#endif
            Pickupable component = go?.GetComponent <Pickupable>();
            if (component != null)
            {
                Inventory.main.ForcePickup(component);
            }
            else
            {
                Log.LogError($"DiverPerimeterDefenceBehaviour.AddInventoryAsync(): Failed to instantiate inventory item for TechType {techType.AsString()}");
            }

            if (result != null)
            {
                result.Set(go);
            }
            yield break;
        }
Ejemplo n.º 3
0
        public void DumpToPlayer()
        {
            for (int i = _currentAmount - 1; i > -1; i--)
            {
#if SUBNAUTICA
                var itemSize = CraftData.GetItemSize(TechType.GasPod);
#elif BELOWZERO
                var itemSize = TechData.GetItemSize(techType);
#endif
                if (Inventory.main.HasRoomFor(itemSize.x, itemSize.y))
                {
                    if (_currentAmount > 0)
                    {
                        _currentAmount -= 1;
                        var pickup = CraftData.InstantiateFromPrefab(TechType.GasPod).GetComponent <Pickupable>();
                        Inventory.main.Pickup(pickup);
                    }
                }
                else
                {
                    break;
                }

                OnAmountChanged?.Invoke(_currentAmount);
            }
        }
Ejemplo n.º 4
0
        public static IEnumerator AddLifepodInventory(StorageContainer container, List <TechType> newTechTypes)
        {
            if (!Main.config.useDropPodInventory)
            {
                yield break;
            }

            if (AlreadyInitialised())
            {
                yield break;
            }

            foreach (TechType tt in newTechTypes)
            {
                Log.LogDebug($"Adding item {tt.AsString()} to drop pod locker");
#if SUBNAUTICA_STABLE
                GameObject    go             = CraftData.InstantiateFromPrefab(tt);
                InventoryItem inventoryItem2 = new InventoryItem(go.GetComponent <Pickupable>());
#elif BELOWZERO
                TaskResult <GameObject> result = new TaskResult <GameObject>();
                yield return(CraftData.InstantiateFromPrefabAsync(tt, result, false));

                InventoryItem inventoryItem2 = new InventoryItem(result.Get().GetComponent <Pickupable>());
#endif

                inventoryItem2.item.Initialize();
                container.container.UnsafeAdd(inventoryItem2);
            }
            yield break;
        }
Ejemplo n.º 5
0
        public void OnHandClick(GUIHand hand)
        {
            EnergyMixin mixin = shark.energyInterface.sources[0];

            if (mixin.HasItem() && mixin.charge == 0f)
            {
                InventoryItem item = mixin.batterySlot.storedItem;

                mixin.batterySlot.RemoveItem();

                Destroy(item.item.gameObject);

                Pickupable ionCube = CraftData.InstantiateFromPrefab(Shark.depletedIonCube).GetComponent <Pickupable>();
                ionCube.transform.position = transform.position + transform.up;

                if (Player.main.HasInventoryRoom(ionCube))
                {
                    Inventory.main.Pickup(ionCube);
                }
            }

            if (!mixin.HasItem())
            {
                if (Inventory.main.GetPickupCount(TechType.PrecursorIonCrystal) >= 1)
                {
                    Inventory.main.container.RemoveItem(TechType.PrecursorIonCrystal);

                    Pickupable battery = CraftData.InstantiateFromPrefab(Shark.internalBattery).GetComponent <Pickupable>();

                    InventoryItem item = mixin.batterySlot.AddItem(battery);
                    mixin.NotifyHasBattery(item);
                }
            }
        }
        public static void randomItem()
        {
            System.Random random    = new System.Random();
            TechType[]    resources = { TechType.AcidMushroom, TechType.SeaTreaderPoop, TechType.BloodOil, TechType.CoralChunk, TechType.CrashPowder, TechType.Copper, TechType.CreepvinePiece, TechType.CreepvineSeedCluster, TechType.Sulphur, TechType.WhiteMushroom, TechType.Diamond, TechType.TreeMushroomPiece, TechType.GasPod, TechType.JellyPlant, TechType.Gold, TechType.Kyanite, TechType.Lead, TechType.Lithium, TechType.Magnetite, TechType.ScrapMetal, TechType.Nickel, TechType.PinkMushroom, TechType.Quartz, TechType.AluminumOxide, TechType.Salt, TechType.Silver, TechType.SmallMelon, TechType.PurpleRattle, TechType.StalkerTooth, TechType.JeweledDiskPiece, TechType.Titanium, TechType.UraniniteCrystal };

            var pickupable = CraftData.InstantiateFromPrefab(resources[random.Next(resources.Length)]).GetComponent <Pickupable>();

            if (pickupable != null)
            {
                Inventory.main.ForcePickup(pickupable);
            }
        }
Ejemplo n.º 7
0
        public static void Prefix(Vehicle __instance)
        {
            List <InventoryItem> equipment = __instance.modules?.equipment?.Values?.Where((e) => e != null).ToList() ?? new List <InventoryItem>();

            foreach (InventoryItem item in equipment)
            {
                GameObject gameObject = CraftData.InstantiateFromPrefab(item.item.GetTechType());
                Vector3    position   = __instance.gameObject.transform.position;
                gameObject.transform.position = new Vector3(position.x + UnityEngine.Random.Range(-3, 3), position.y + UnityEngine.Random.Range(5, 8), position.z + UnityEngine.Random.Range(-3, 3));
                gameObject.SetActive(true);
            }
        }
        private void SpawnEntity(Entity entity)
        {
            if (entity.TechType != TechType.None)
            {
                GameObject gameObject = CraftData.InstantiateFromPrefab(entity.TechType);
                gameObject.transform.position = entity.Position;
                GuidHelper.SetNewGuid(gameObject, entity.Guid);
                gameObject.SetActive(true);

                Log.Debug("Received cell entity: " + entity.Guid + " at " + entity.Position + " of type " + entity.TechType);
            }

            alreadySpawnedGuids.Add(entity.Guid);
        }
        public override GameObject GetGameObject()
        {
            GameObjectClone = CraftData.InstantiateFromPrefab(FragmentTemplate);

            ResourceTracker resourceTracker = GameObjectClone.GetComponent <ResourceTracker>();

            resourceTracker.overrideTechType = TechType.Fragment;

            //GameObjectClone.EnsureComponent<FragmentTracker>();

            ModifyGameObject();

            return(GameObjectClone);
        }
Ejemplo n.º 10
0
 private void AddStartingItemsToPlayer(bool firstTimeConnecting)
 {
     if (firstTimeConnecting)
     {
         foreach (TechType techType in LootSpawner.main.GetEscapePodStorageTechTypes())
         {
             GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false);
             Pickupable pickupable = gameObject.GetComponent <Pickupable>();
             pickupable = pickupable.Initialize();
             itemContainers.AddItem(pickupable.gameObject, NitroxEntity.GetId(Player.main.transform.gameObject));
             itemContainers.BroadcastItemAdd(pickupable, Inventory.main.container.tr);
         }
     }
 }
Ejemplo n.º 11
0
 public static bool OnConsoleCommand_item_Prefix(NotificationCenter.Notification n)
 {
     if (n != null && n.data != null && n.data.Count > 0)
     {
         string text = (string)n.data[0];
         if (UWE.Utils.TryParseEnum <TechType>(text, out TechType techType) && techType != TechType.None)
         {
             if (CraftData.IsAllowed(techType))
             {
                 foreach (IDecorationItem item in DecorationsMod.DecorationItems)
                 {
                     // If item being spawned is one of our decoration items.
                     if (techType == item.TechType)
                     {
                         // If item being spawned is one of our new flora.
                         if (!string.IsNullOrEmpty(item.ClassID) && CustomFlora.AllPlants.Contains(item.ClassID))
                         {
                             int num = 1;
                             if (n.data.Count > 1 && int.TryParse((string)n.data[1], out int num2))
                             {
                                 num = num2;
                             }
                             for (int i = 0; i < num; i++)
                             {
                                 GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false);
                                 if (gameObject != null)
                                 {
                                     gameObject.transform.position = MainCamera.camera.transform.position + MainCamera.camera.transform.forward * 3f;
                                     CrafterLogic.NotifyCraftEnd(gameObject, techType);
                                     Pickupable component = gameObject.GetComponent <Pickupable>();
                                     if (component != null && !Inventory.main.Pickup(component, false))
                                     {
                                         ErrorMessage.AddError(Language.main.Get("InventoryFull"));
                                         // Hide plant, show seed and enable pickupable
                                         PrefabsHelper.HidePlantAndShowSeed(gameObject.transform, item.ClassID);
                                     }
                                 }
                             }
                             // Dont call original function if item being spawned is one of our new flora.
                             return(false);
                         }
                         break;
                     }
                 }
             }
         }
     }
     // Give back execution to original function.
     return(true);
 }
Ejemplo n.º 12
0
        private static Pickupable CheckIfEggAnExtractPickable(TechType techType)
        {
            Pickupable pickup;

            if (EggHandler.GetDiscoveredEgg(techType, out TechType value))
            {
                pickup = CraftData.InstantiateFromPrefab(value).EnsureComponent <Pickupable>();
            }
            else
            {
                pickup = CraftData.InstantiateFromPrefab(techType).EnsureComponent <Pickupable>();
            }

            return(pickup);
        }
Ejemplo n.º 13
0
        private void GiveReward(TechType techType)
        {
            GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false);

            if (gameObject != null)
            {
                gameObject.transform.position = MainCamera.camera.transform.position + MainCamera.camera.transform.forward * 2f;
                CrafterLogic.NotifyCraftEnd(gameObject, techType);
                Pickupable component = gameObject.GetComponent <Pickupable>();
                if (component != null && !Inventory.main.Pickup(component, false))
                {
                    ErrorMessage.AddError(Language.main.Get("InventoryFull"));
                }
            }
        }
Ejemplo n.º 14
0
        public static void Postfix(WaterPark __instance, WaterParkCreature creature)
        {
            if (!__instance.items.Contains(creature) || __instance.HasFreeSpace())
            {
                return;
            }

            List <BaseBioReactor> baseBioReactors = __instance.gameObject.GetComponentInParent <SubRoot>().gameObject.GetComponentsInChildren <BaseBioReactor>().ToList();
            bool hasBred = false;

            foreach (WaterParkItem waterParkItem in __instance.items)
            {
                WaterParkCreature parkCreature = waterParkItem as WaterParkCreature;
                if (parkCreature != null && parkCreature != creature && parkCreature.GetCanBreed() && parkCreature.pickupable.GetTechType() == creature.pickupable.GetTechType() && !parkCreature.pickupable.GetTechType().ToString().Contains("Egg"))
                {
                    foreach (BaseBioReactor baseBioReactor in baseBioReactors)
                    {
                        if (baseBioReactor.container.HasRoomFor(parkCreature.pickupable))
                        {
                            creature.ResetBreedTime();
                            parkCreature.ResetBreedTime();
                            GameObject gameObject = CraftData.InstantiateFromPrefab(CraftData.GetTechType(parkCreature.data.eggOrChildPrefab), false);
                            gameObject.SetActive(false);
                            baseBioReactor.container.AddItem(gameObject.EnsureComponent <Pickupable>());
                            hasBred = true;
                            break;
                        }
                    }
                    if (!hasBred && Config.OverFlowIntoOcean && parkCreature.data.isPickupableOutside)
                    {
                        creature.ResetBreedTime();
                        parkCreature.ResetBreedTime();
                        if (count > Config.WaterParkSize)
                        {
                            GameObject gameObject = CraftData.InstantiateFromPrefab(CraftData.GetTechType(parkCreature.gameObject), false);
                            gameObject.transform.position = __instance.gameObject.GetComponentInParent <SubRoot>().transform.position + new Vector3(Random.Range(-30, 30), Random.Range(-2, 30), Random.Range(-30, 30));
                            gameObject.SetActive(true);
                            count = 0;
                        }
                        else
                        {
                            count++;
                        }
                    }
                    break;
                }
            }
        }
Ejemplo n.º 15
0
 public static void Prefix(SeaTruckSegment __instance)
 {
     //ErrorMessage.AddMessage($"{__instance} {__instance.GetInstanceID()}");
     if (__instance.IsFront() && __instance != lastDestroyed)
     {
         lastDestroyed = __instance;
         List <InventoryItem> equipment = __instance.motor?.upgrades?.modules?.equipment.Values?.Where((e) => e != null).ToList() ?? new List <InventoryItem>();
         foreach (InventoryItem item in equipment)
         {
             GameObject gameObject = CraftData.InstantiateFromPrefab(item.item.GetTechType());
             Vector3    position   = __instance.gameObject.transform.position;
             gameObject.transform.position = new Vector3(position.x + UnityEngine.Random.Range(-3, 3), position.y + UnityEngine.Random.Range(5, 8), position.z + UnityEngine.Random.Range(-3, 3));
             gameObject.SetActive(true);
         }
     }
 }
Ejemplo n.º 16
0
        private static void CreatureStart_Postfix(Creature __instance)
        {
            if (usedCreatures.Contains(__instance) || FishHandler.fishTechTypes.Count == 0)
            {
                return;
            }

            TechTag tag = __instance.GetComponent <TechTag>();

            if (tag && FishHandler.fishTechTypes.Contains(tag.type))
            {
                return;
            }

            if (Random.value < 0.1f)
            {
                int      randomIndex = Random.Range(0, FishHandler.fishTechTypes.Count);
                TechType randomFish  = FishHandler.fishTechTypes[randomIndex];
#if SUBNAUTICA_EXP
                GameObject fish = null;
#else
                GameObject fish = CraftData.InstantiateFromPrefab(randomFish);
#endif
                // Deletes the fish if it is a ground creature spawned in water
                if (fish.GetComponent <WalkOnGround>() && !__instance.GetComponent <WalkOnGround>())
                {
                    GameObject.Destroy(fish);
                    return;
                }

                // Deletes the fish if it is a water creature spawned on ground
                if (!fish.GetComponent <WalkOnGround>() && __instance.GetComponent <WalkOnGround>())
                {
                    GameObject.Destroy(fish);
                    return;
                }

                fish.transform.position = __instance.transform.position;

                usedCreatures.Add(__instance);
            }
        }
Ejemplo n.º 17
0
        internal void RemoveGaspod()
        {
#if SUBNAUTICA
            var itemSize = CraftData.GetItemSize(TechType.GasPod);
#elif BELOWZERO
            var itemSize = TechData.GetItemSize(TechType.GasPod);
#endif
            if (Inventory.main.HasRoomFor(itemSize.x, itemSize.y))
            {
                if (_currentAmount > 0)
                {
                    _currentAmount -= 1;
                    var pickup = CraftData.InstantiateFromPrefab(TechType.GasPod).GetComponent <Pickupable>();
                    Inventory.main.Pickup(pickup);
                }
            }


            OnAmountChanged?.Invoke(_currentAmount);
        }
Ejemplo n.º 18
0
        public override void Awake()
        {
            GameObject pseudoStorage = new GameObject("PseudoStorage");

            pseudoStorage.transform.SetParent(transform);

            height       = 6;
            width        = 8;
            storageLabel = "MP3 PLAYER";
            storageRoot  = pseudoStorage.AddComponent <ChildObjectIdentifier>();

            base.Awake();

            container.containerType = (ItemsContainerType)581;
            container.Clear();

            Pickupable _1_Previous        = CraftData.InstantiateFromPrefab(ControlItems._1_Previous).GetComponentInChildren <Pickupable>();
            Pickupable _2_1_Play          = CraftData.InstantiateFromPrefab(ControlItems._2_1_Play).GetComponentInChildren <Pickupable>();
            Pickupable _3_Next            = CraftData.InstantiateFromPrefab(ControlItems._3_Next).GetComponentInChildren <Pickupable>();
            Pickupable _4_1_EnableRepeat  = CraftData.InstantiateFromPrefab(ControlItems._4_1_EnableRepeat).GetComponentInChildren <Pickupable>();
            Pickupable _5_1_EnableShuffle = CraftData.InstantiateFromPrefab(ControlItems._5_1_EnableShuffle).GetComponentInChildren <Pickupable>();
            Pickupable _6_ExitInterface   = CraftData.InstantiateFromPrefab(ControlItems._6_ExitInterface).GetComponentInChildren <Pickupable>();

            ControlItems.CorrespondingAudioPlayers.Add(_1_Previous, player);
            ControlItems.CorrespondingAudioPlayers.Add(_2_1_Play, player);
            ControlItems.CorrespondingAudioPlayers.Add(_3_Next, player);
            ControlItems.CorrespondingAudioPlayers.Add(_4_1_EnableRepeat, player);
            ControlItems.CorrespondingAudioPlayers.Add(_5_1_EnableShuffle, player);
            ControlItems.CorrespondingAudioPlayers.Add(_6_ExitInterface, player);

            container.AddItem(_1_Previous);
            container.AddItem(_2_1_Play);
            container.AddItem(_3_Next);
            container.AddItem(_4_1_EnableRepeat);
            container.AddItem(_5_1_EnableShuffle);
            container.AddItem(_6_ExitInterface);

            container.isAllowedToAdd    = new IsAllowedToAdd((p, b) => false);
            container.isAllowedToRemove = new IsAllowedToRemove((p, b) => false);
        }
Ejemplo n.º 19
0
        public static void Postfix(Creature __instance)
        {
            if (usedCreatures.Contains(__instance) || fishTechTypes.Count == 0)
            {
                return;
            }
            TechTag tag = __instance.GetComponent <TechTag>();

            if (tag)
            {
                if (fishTechTypes.Contains(tag.type))
                {
                    return;
                }
            }
            if (Random.value < 0.1f)
            {
                Console.WriteLine($"[FishFramework] Selecting fish out of {fishTechTypes.Count} total types");
                int      randomIndex = Random.Range(0, fishTechTypes.Count);
                TechType randomFish  = fishTechTypes[randomIndex];

                GameObject fish = CraftData.InstantiateFromPrefab(randomFish);
                // Deletes the fish if it is a ground creature spawned in water
                if (fish.GetComponent <WalkOnGround>() && !__instance.GetComponent <WalkOnGround>())
                {
                    GameObject.Destroy(fish);
                    return;
                }
                // Deletes the fish if it is a water creature spawned on ground
                if (!fish.GetComponent <WalkOnGround>() && __instance.GetComponent <WalkOnGround>())
                {
                    GameObject.Destroy(fish);
                    return;
                }
                fish.transform.position = __instance.transform.position;

                usedCreatures.Add(__instance);
            }
        }
Ejemplo n.º 20
0
        internal void RemoveItemFromContainer(TechType item)
        {
            QuickLogger.Debug("Taking From Container", true);
            if (Items.ContainsKey(item))
            {
#if SUBNAUTICA
                var itemSize = CraftData.GetItemSize(item);
#elif BELOWZERO
                var itemSize = TechData.GetItemSize(item);
#endif
                if (!Inventory.main.HasRoomFor(itemSize.x, itemSize.y) || Items[item] < 1)
                {
                    return;
                }

                Items[item] -= 1;
                var pickup = CraftData.InstantiateFromPrefab(item).GetComponent <Pickupable>();
                Inventory.main.Pickup(pickup);
                OnContainerUpdate?.Invoke(GetTotal(), StorageLimit);
                _mono?.Producer?.TryStartingNextClone();
            }
        }
Ejemplo n.º 21
0
        public static void ConstructorCraft(ConstructorInput input, TechType tech)
        {
            if (!CrafterLogic.ConsumeResources(tech))
            {
                return;
            }

            uGUI.main.craftingMenu.Close(input);
            input.cinematicController.DisengageConstructor();

            Transform spawn    = input.constructor.GetItemSpawnPoint(tech);
            var       position = spawn.position;
            var       rotation = spawn.rotation;

            GameObject gameObject;

            if (tech == TechType.Cyclops)
            {
                SubConsoleCommand.main.SpawnSub("cyclops", position, rotation);
                gameObject = SubConsoleCommand.main.GetLastCreatedSub();
            }
            else
            {
                gameObject = CraftData.InstantiateFromPrefab(tech, false);
                Transform component = gameObject.GetComponent <Transform>();
                component.position = position;
                component.rotation = rotation;
            }

            LargeWorldEntity.Register(gameObject);
            gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver);
            CrafterLogic.NotifyCraftEnd(gameObject, CraftData.GetTechType(gameObject));
            Story.ItemGoalTracker.OnConstruct(tech);

            Commands.SendSpawn(gameObject, tech);
        }
        internal void BuildNeptuneLaunchPlatform()
        {
            GameObject neptuneLaunchPlatform = CraftData.InstantiateFromPrefab(TechType.RocketBase);

            neptuneLaunchPlatform.transform.position = MainCamera.camera.transform.position;
        }
Ejemplo n.º 23
0
        private static void AddInventory(TechType techType, int count = 1, bool bNoMessage = false, bool bSpawnIfCantAdd = true)
        {
            // Ripped<cough>based upon MrPurple6411's method Deconstruct_Patch from the BuilderModule mod
            Vehicle thisVehicle = Player.main.GetVehicle();

            if (thisVehicle != null)
            {
                GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false);
                Pickupable component  = gameObject.GetComponent <Pickupable>();

                if (thisVehicle is Exosuit exosuit)
                {
                    StorageContainer storageContainer = exosuit.storageContainer;

                    if (storageContainer.container.HasRoomFor(component))
                    {
                        string name = Language.main.Get(component.GetTechName());
                        ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name));

                        uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null);
#if SUBNAUTICA
                        component = component.Initialize();
#elif BELOWZERO
                        component.Initialize();
#endif
                        var item = new InventoryItem(component);
                        storageContainer.container.UnsafeAdd(item);
                        component.PlayPickupSound();
                        return;
                    }
                }
                else
                {
                    var  seamoth      = (SeaMoth)thisVehicle;
                    bool storageCheck = false;
                    for (int i = 0; i < 12; i++)
                    {
                        try
                        {
                            ItemsContainer storage = seamoth.GetStorageInSlot(i, TechType.VehicleStorageModule);
                            if (storage != null && storage.HasRoomFor(component))
                            {
                                string name = Language.main.Get(component.GetTechName());
                                ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name));

                                uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null);

#if SUBNAUTICA
                                component = component.Initialize();
#elif BELOWZERO
                                component.Initialize();
#endif
                                var item = new InventoryItem(component);
                                storage.UnsafeAdd(item);
                                component.PlayPickupSound();
                                storageCheck = true;
                                break;
                            }
                        }
                        catch (Exception)
                        {
                            continue;
                        }
                    }
                    if (storageCheck)
                    {
                        return;
                    }
                }
            }
            CraftData.AddToInventory(techType, count, bNoMessage, bSpawnIfCantAdd);
        }
Ejemplo n.º 24
0
        internal static Pickupable ConvertToPickupable(ItemData itemData)
        {
            QuickLogger.Debug("ConvertToPickupable", true);

            if (itemData == null)
            {
                QuickLogger.Debug("Item Data is null", true);
                return(null);
            }

            QuickLogger.Debug("1");
            if (EggHandler.GetDiscoveredEgg(itemData.TechType, out TechType value))
            {
                return(CraftData.InstantiateFromPrefab(value).GetComponent <Pickupable>());
            }

            QuickLogger.Debug("2");

            var gameObject = CraftData.GetPrefabForTechType(itemData.TechType);

            QuickLogger.Debug("3");


            if (gameObject == null)
            {
                QuickLogger.Error($"Couldn't get the prefab for the tech-type {itemData.TechType}");
                return(null);
            }

            QuickLogger.Debug("4");

            var go = GameObject.Instantiate(gameObject);

            QuickLogger.Debug("5");

            if (go == null)
            {
                QuickLogger.Debug("GameObject is null in convert to pickupable", true);
                QuickLogger.Debug($"TechType = {itemData.Type}", true);
                return(null);
            }

            switch (itemData.Type)
            {
            case ItemType.Battery:
                go.GetComponent <Battery>()._charge = itemData.BatteryData.Charge;
                break;

            case ItemType.Food:
                var eatable = go.GetComponent <Eatable>();
                eatable.foodValue  = itemData.FoodData.FoodValue;
                eatable.waterValue = itemData.FoodData.WaterValue;
                break;

            case ItemType.Fuel:
                go.GetComponent <FireExtinguisher>().fuel = itemData.FuelData.Fuel;
                break;

            case ItemType.PlayerTool:
                if (itemData.PlayerToolData.HasBattery)
                {
                    var batteryTechType = itemData.PlayerToolData.BatteryInfo.TechType;
                    var tempBattery     = CraftData.GetPrefabForTechType(batteryTechType);
                    var capacity        = tempBattery?.gameObject.GetComponent <IBattery>()?.capacity;

                    if (itemData.PlayerToolData.HasBattery && capacity != null && capacity > 0)
                    {
                        //var pickup = CraftData.InstantiateFromPrefab(itemData.TechType).GetComponent<Pickupable>();
                        var energyMixin      = go.gameObject.GetComponent <EnergyMixin>();
                        var normalizedCharge = itemData.PlayerToolData.BatteryInfo.BatteryCharge / capacity;
                        if (energyMixin.GetBattery() != null)
                        {
                            QuickLogger.Debug("Battery was already in device destroying");
                        }

                        if (!energyMixin.compatibleBatteries.Contains(batteryTechType))
                        {
                            energyMixin.compatibleBatteries.Add(batteryTechType);
                        }

                        energyMixin.SetBattery(itemData.PlayerToolData.BatteryInfo.TechType,
                                               (float)normalizedCharge);
                        QuickLogger.Info($"Gave Player Player tool {itemData.PlayerToolData.TechType} with battery {batteryTechType}");
                    }
                    else
                    {
                        QuickLogger.Error("While trying to get the batter capacity of the battery it returned null or 0.");
                    }
                }
                break;

            case ItemType.FCSFilteredStorage:
                var storage = go.GetComponent <FCSFilteredStorage>();
                storage.Items   = itemData.FcsFilteredStorage;
                storage.Filters = itemData.FcsFilters;
                storage.ForceUpdateDisplay();
                break;
            }

            QuickLogger.Debug("6");

            return(go.GetComponent <Pickupable>());
        }
Ejemplo n.º 25
0
        public static bool Prefix(Trashcan __instance)
        {
            if (__instance.biohazard)
            {
                return(true);
            }

            __instance.storageContainer.hoverText        = "Recycling Bin";
            __instance.storageContainer.storageLabel     = "Recycling Bin";
            __instance.storageContainer.container._label = "Recycling Bin";

            inventoryItems   = new List <InventoryItem>();
            forcePickupItems = new List <Pickupable>();

            foreach (Trashcan.Waste waste in __instance.wasteList)
            {
                InventoryItem item = waste.inventoryItem;

                if (item is null)
                {
                    continue;
                }

                TechType techType = item.item.GetTechType();

                ITechData techData = CraftData.Get(techType);

                bool inputcheck = GameInput.GetButtonHeld(GameInput.Button.Deconstruct);

                if (!inputcheck && techType != TechType.Titanium && Main.BatteryCheck(item.item) && techData != null)
                {
                    if (CheckRequirements(__instance, item.item, techData))
                    {
                        for (int i = 0; i < techData.ingredientCount; i++)
                        {
                            IIngredient ingredient = techData.GetIngredient(i);

                            for (int j = 0; j < ingredient.amount; j++)
                            {
                                GameObject gameObject = CraftData.InstantiateFromPrefab(ingredient.techType, false);
                                if (gameObject.GetComponent <LiveMixin>() != null)
                                {
                                    GameObject.Destroy(gameObject);
                                    break;
                                }

                                gameObject.SetActive(true);
                                Pickupable pickupable = gameObject.GetComponent <Pickupable>();
                                pickupable.Pickup(false);
                                forcePickupItems.Add(pickupable);
                            }
                        }
                        break;
                    }
                }
                else
                {
                    if (inputcheck)
                    {
                        inventoryItems.Add(item);
                    }
                    else
                    {
                        forcePickupItems.Add(item.item);
                    }

                    break;
                }
            }
            forcePickupItems.ForEach((rejectedItem) => Inventory.main.ForcePickup(rejectedItem));
            inventoryItems.ForEach((item) => UnityEngine.Object.Destroy(item.item.gameObject));

            return(false);
        }
Ejemplo n.º 26
0
        static bool Prefix(Constructable __instance)
        {
            if (Player.main.GetVehicle() != null || Player.main.GetComponentInParent <SeaTruckSegment>() != null)
            {
                var thisVehicle  = Player.main.GetVehicle();
                var thisSeatruck = Player.main.GetComponentInParent <SeaTruckSegment>();
                if (__instance._constructed)
                {
                    return(true);
                }
                int count      = __instance.resourceMap.Count;
                int resourceID = __instance.GetResourceID();
                var backupConstructedAmount = __instance.constructedAmount;
                __instance.constructedAmount -= Time.deltaTime / ((float)count * Constructable.GetConstructInterval());
                __instance.constructedAmount  = Mathf.Clamp01(__instance.constructedAmount);
                int resourceID2 = __instance.GetResourceID();
                if (resourceID2 != resourceID && GameModeUtils.RequiresIngredients())
                {
                    bool       storageCheck = false;
                    TechType   techType     = __instance.resourceMap[resourceID2];
                    GameObject gameObject   = CraftData.InstantiateFromPrefab(techType, false);
                    Pickupable component    = gameObject.GetComponent <Pickupable>();

                    if (thisVehicle != null)
                    {
                        if (thisVehicle.GetType().Equals(typeof(Exosuit)))
                        {
                            StorageContainer storageContainer = ((Exosuit)thisVehicle).storageContainer;

                            if (storageContainer.container.HasRoomFor(component) && GameModeUtils.RequiresIngredients())
                            {
                                var name = Language.main.Get(component.GetTechName());
                                ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name));

                                uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null);

                                component.Initialize();

                                var item = new InventoryItem(component);
                                storageContainer.container.UnsafeAdd(item);
                                component.PlayPickupSound();
                                storageCheck = true;
                            }
                        }
                    }
                    else
                    {
                        SeaTruckSegment[]         seaTruckSegments = thisSeatruck.GetComponents <SeaTruckSegment>();
                        List <StorageContainer[]> containers       = new List <StorageContainer[]>();
                        foreach (SeaTruckSegment seaTruckSegment in seaTruckSegments)
                        {
                            containers.Add(seaTruckSegment.GetComponentsInChildren <StorageContainer>());
                        }
                        foreach (StorageContainer[] storageContainers in containers)
                        {
                            foreach (StorageContainer storageContainer in storageContainers)
                            {
                                if (storageContainer.container.HasRoomFor(component) && GameModeUtils.RequiresIngredients())
                                {
                                    var name = Language.main.Get(component.GetTechName());
                                    ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name));

                                    uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null);

                                    component.Initialize();

                                    var item = new InventoryItem(component);
                                    storageContainer.container.UnsafeAdd(item);
                                    component.PlayPickupSound();
                                    storageCheck = true;
                                    break;
                                }
                            }
                        }
                        if (!storageCheck)
                        {
                            __instance.constructedAmount = backupConstructedAmount;
                            return(true);
                        }
                    }
                }
                __instance.UpdateMaterial();
                if (__instance.constructedAmount <= 0f)
                {
                    return(true);
                }

                return(false);
            }
            else
            {
                return(true);
            }
        }
Ejemplo n.º 27
0
        static bool Prefix(Constructable __instance)
        {
            if (Player.main.GetVehicle() != null)
            {
                var thisVehicle = Player.main.GetVehicle();
                if (__instance._constructed)
                {
                    return(true);
                }
                int count      = __instance.resourceMap.Count;
                int resourceID = __instance.GetResourceID();
                var backupConstructedAmount = __instance.constructedAmount;
                __instance.constructedAmount -= Time.deltaTime / ((float)count * Constructable.GetConstructInterval());
                __instance.constructedAmount  = Mathf.Clamp01(__instance.constructedAmount);
                int resourceID2 = __instance.GetResourceID();
                if (resourceID2 != resourceID && GameModeUtils.RequiresIngredients())
                {
                    TechType   techType   = __instance.resourceMap[resourceID2];
                    GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false);
                    Pickupable component  = gameObject.GetComponent <Pickupable>();

                    if (thisVehicle.GetType().Equals(typeof(Exosuit)))
                    {
                        var storageContainer = ((Exosuit)thisVehicle).storageContainer;

                        if (storageContainer.container.HasRoomFor(component) && GameModeUtils.RequiresIngredients())
                        {
                            var name = Language.main.Get(component.GetTechName());
                            ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name));

                            uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null);

                            component = component.Initialize();

                            var item = new InventoryItem(component);
                            storageContainer.container.UnsafeAdd(item);
                            component.PlayPickupSound();
                        }
                        else
                        {
                            __instance.constructedAmount = backupConstructedAmount;
                            return(true);
                        }
                    }
                    else
                    {
                        var  seamoth      = (SeaMoth)thisVehicle;
                        bool storageCheck = false;
                        for (int i = 0; i < 12; i++)
                        {
                            try
                            {
                                var storage = seamoth.GetStorageInSlot(i, TechType.VehicleStorageModule);
                                if (storage != null && storage.HasRoomFor(component) && GameModeUtils.RequiresIngredients())
                                {
                                    var name = Language.main.Get(component.GetTechName());
                                    ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name));

                                    uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null);

                                    component = component.Initialize();

                                    var item = new InventoryItem(component);
                                    storage.UnsafeAdd(item);
                                    component.PlayPickupSound();
                                    storageCheck = true;
                                    break;
                                }
                            }
                            catch (Exception)
                            {
                                continue;
                            }
                        }
                        if (!storageCheck)
                        {
                            __instance.constructedAmount = backupConstructedAmount;
                            return(true);
                        }
                    }
                }
                __instance.UpdateMaterial();
                if (__instance.constructedAmount <= 0f)
                {
                    return(true);
                }
                return(false);
            }
            else
            {
                return(true);
            }
        }
Ejemplo n.º 28
0
        // ReSharper disable once InconsistentNaming
        private static bool Prefix(WaterPark __instance, WaterParkCreature creature)
        {
            FishOverflowDistributor.Logger.LogTrace("WaterPark.TryBreed(WaterParkCreature) called.");

            //We only distribute when the WaterPark doesn't have any space left for bred creatures.
            //This is the only place in this method where we allow the original unpatched method to execute,
            //because the original method is never executed when there is no space left in the WaterPark.

            FishOverflowDistributor.Logger.LogTrace(
                $"__instance.HasFreeSpace() returns '{__instance.HasFreeSpace()}'.");

            if (__instance.HasFreeSpace())
            {
                return(true);
            }

            //using Harmony's Traverse class for reflection. Harmony caches MethodInfo, FieldInfo, etc. for further use and thus increases performance.
            var items = Traverse
                        .Create(__instance)
                        .Field("items")
                        .GetValue <List <WaterParkItem> >();

            if (items == null)
            {
                FishOverflowDistributor.Logger.LogError(
                    "FieldInfo or value for field 'items' in class 'WaterParkItem' with type 'List<WaterParkItem>' was null -> Should not happen, investigate!.");

                return(false);
            }


            FishOverflowDistributor.Logger.LogTrace("Checking if creature is contained in items");

            //Don't know why this check is needed. Maybe TryBreed gets called on fish which arent contained in this WaterPark instance.
            if (!items.Contains(creature))
            {
                return(false);
            }

            TechType creatureTechType = creature.pickupable.GetTechType();

            FishOverflowDistributor.Logger.LogTrace($"Creature Tech Type = {creatureTechType.ToString()}.");

            FishOverflowDistributor.Logger.LogTrace(
                "Checking whether creatureEggs.containsKey(creatureTechType)");

            //we don't want to distribute creature eggs
            if (WaterParkCreature.creatureEggs.ContainsKey(creatureTechType))
            {
                return(false);
            }

            FishOverflowDistributor.Logger.LogTrace(
                $"Waterpark '{__instance.gameObject.name}' contains creature '{creature.gameObject.name}' and has enough space for another one.");

            var secondCreature = items.Find(item =>
                                            item != creature &&
                                            item is WaterParkCreature &&

                                            // ReSharper disable once TryCastAlwaysSucceeds
                                            (item as WaterParkCreature).GetCanBreed() &&
                                            item.pickupable != null &&
                                            item.pickupable.GetTechType() == creatureTechType) as
                                 WaterParkCreature;

            if (secondCreature == null)
            {
                return(false);
            }

            FishOverflowDistributor.Logger.LogTrace(
                $"Waterpark contains two creatures '{creature.gameObject.name}' of TechType '{creatureTechType.ToString()}' which can breed with each other.");

            BaseBioReactor suitableReactor;

            try
            {
                //Get a reactor which has space for the item in the same base
                suitableReactor = SubnauticaSceneTraversalUtils
                                  .GetComponentsInSameBase <BaseBioReactor>(__instance.gameObject)
                                  .First(
                    reactor =>
                {
                    var itemsContainer = Traverse
                                         .Create(reactor)
                                         .Property("container")
                                         .GetValue <ItemsContainer>();

                    if (itemsContainer != null)
                    {
                        return(itemsContainer.HasRoomFor(
                                   creature.pickupable));
                    }

                    FishOverflowDistributor.Logger.LogTrace(
                        $"PropertyInfo or value for property 'container' in class 'BaseBioReactor' with type 'ItemsContainer' was null -> Should not happen, investigate!.");

                    return(false);
                });
            }
            catch (Exception)
            {
                return(false);
            }
            if (suitableReactor == null)
            {
                FishOverflowDistributor.Logger.LogTrace("Could not find suitable reactor");
                return(false);
            }

            //Reset breed time of the second creature so it can't be used to immediately breed again.
            secondCreature.ResetBreedTime();

            FishOverflowDistributor.Logger.LogTrace(
                $"Found suitable reactor '{suitableReactor.gameObject.name}'.");

            //Now we create a pickupable from the WaterParkCreature which we can add to the reactor's inventory.
            //Because the creature can't be taken out from the reactor inventory, we don't need to add WaterparkCreature component
            //to it. This would be needed so the game knows when you drop it outside, that it came from a waterpark.


            GameObject newCreature = CraftData.InstantiateFromPrefab(creatureTechType, false);

            newCreature.SetActive(false);
            newCreature.transform.position = creature.transform.position + Vector3.down;
            var pickupable = newCreature.EnsureComponent <Pickupable>();

            /*WaterParkCreatureParameters creatureParameters =
             *  WaterParkCreature.GetParameters(creatureTechType);
             *
             * newCreature.transform.localScale = creatureParameters.initialSize * Vector3.one;
             * var newCreatureComponent = newCreature.AddComponent<WaterParkCreature>();
             * newCreatureComponent.age = 0f;
             *
             * Traverse
             *  .Create(newCreatureComponent)
             *  .Field("parameters")
             *  .SetValue(creatureParameters);
             *
             * Pickupable pickupable = creatureParameters.isPickupableOutside
             *  ? newCreature.EnsureComponent<Pickupable>()
             *  : newCreature.GetComponent<Pickupable>();
             *
             * newCreature.setActive();*/

            pickupable = pickupable.Pickup(false);

            // pickupable.GetComponent<WaterParkItem>()?.SetWaterPark(null);

            var itemToAdd = new InventoryItem(pickupable);

            var reactorItemsContainer = Traverse
                                        .Create(suitableReactor)
                                        .Property("container")
                                        .GetValue <ItemsContainer>();

            if (reactorItemsContainer == null)
            {
                FishOverflowDistributor.Logger.LogError(
                    $"PropertyInfo or value for property 'container' in class 'BaseBioReactor' with type 'ItemsContainer' was null -> Should not happen, investigate!.");

                return(false);
            }

            reactorItemsContainer.AddItem(pickupable);

            return(false);
        }
Ejemplo n.º 29
0
        public override GameObject GetGameObject()
        {
            Console.WriteLine("[AlienRifle] Loading Prefab");
            GameObject gobj = AlienRifleMod.bund.LoadAsset <GameObject>("AlienRifle.prefab");

            try
            {
                BoxCollider box = gobj.AddOrGetComponent <BoxCollider>();
                box.size = new Vector3(0.1f, 0.3f, 1f);

                Console.WriteLine("[AlienRifle] Modifying MeshRenderers of Object");
                foreach (Renderer render in gobj.GetComponentsInChildren <Renderer>())
                {
                    render.material.shader = Shader.Find("MarmosetUBER");
                }

                MeshRenderer rend = gobj.transform.Find("Main/MainBody").GetComponent <MeshRenderer>();
                rend.material = gobj.transform.Find("Main/EnergyGlow").GetComponent <MeshRenderer>().material;
                rend.material.SetColor("_Emission", new Color(0.2f, 0.2f, 0.2f));

                Console.WriteLine("[AlienRifle] Modifying Transform offset and rotation");
                Vector3 offset = new Vector3(0, 0.05f, 0.1f);
                gobj.transform.GetChild(0).localPosition += offset;
                //gobj.transform.GetChild(1).localPosition = offset;

                Console.WriteLine("[AlienRifle] Adding Essential components");
                gobj.AddOrGetComponent <PrefabIdentifier>().ClassId   = ClassID;
                gobj.AddOrGetComponent <LargeWorldEntity>().cellLevel = LargeWorldEntity.CellLevel.Near;
                Console.WriteLine("[AlienRifle] Adding SkyApplier");
                SkyApplier sky = gobj.AddOrGetComponent <SkyApplier>();
                sky.renderers = gobj.GetComponentsInChildren <MeshRenderer>();
                sky.anchorSky = Skies.Auto;

                Console.WriteLine("[AlienRifle] Adding WorldForces");
                WorldForces forces = gobj.AddOrGetComponent <WorldForces>();

                Console.WriteLine("[AlienRifle] Adding Rigidbody");
                Rigidbody rb = gobj.AddOrGetComponent <Rigidbody>();
                forces.underwaterGravity = 0;
                forces.useRigidbody      = rb;

                Pickupable pick = gobj.AddOrGetComponent <Pickupable>();
                pick.isPickupable = true;

                gobj.AddOrGetComponent <TechTag>().type = TechType;

                Fixer fixer = gobj.AddOrGetComponent <Fixer>();
                fixer.ClassId  = ClassID;
                fixer.techType = TechType;

                Console.WriteLine("[AlienRifle] Adding VFX Component");
                VFXFabricating vfxfabricating = gobj.transform.Find("Main").gameObject.AddOrGetComponent <VFXFabricating>();
                vfxfabricating.localMinY   = -0.4f;
                vfxfabricating.localMaxY   = 0.2f;
                vfxfabricating.posOffset   = new Vector3(-0.054f, 0f, -0.06f);
                vfxfabricating.eulerOffset = new Vector3(0f, 0f, 90f);
                vfxfabricating.scaleFactor = 1f;

                Console.WriteLine("[AlienRifle] Adding EnergyMixin Component");
                EnergyMixin AREnergy = gobj.AddOrGetComponent <EnergyMixin>();
                AREnergy.storageRoot         = gobj.transform.Find("Main").gameObject.AddOrGetComponent <ChildObjectIdentifier>();
                AREnergy.compatibleBatteries = new List <TechType>
                {
                    TechType.PrecursorIonBattery
                };
                AREnergy.allowBatteryReplacement = true;
                AREnergy.batteryModels           = new EnergyMixin.BatteryModels[]
                {
                    new EnergyMixin.BatteryModels
                    {
                        techType = TechType.PrecursorIonBattery,
                        model    = gobj.transform.Find("Main/EnergyGlow").gameObject
                    }
                };

                Material mat = new Material(Shader.Find("MarmosetUBER"));

                Console.WriteLine("[AlienRifle] Adding AlienRifle Component");
                AlienRifle rifle = gobj.AddOrGetComponent <AlienRifle>();

                GameObject power = CraftData.InstantiateFromPrefab(TechType.PowerTransmitter);
                rifle.beamPrefab = power.GetComponent <PowerFX>().vfxPrefab;
                rifle.beamPrefab.GetComponent <LineRenderer>().material.color = Color.green;
                Object.Destroy(power);

                StasisRifle     stasisrifle = CraftData.InstantiateFromPrefab(TechType.StasisRifle).GetComponent <StasisRifle>();
                RepulsionCannon cannon      = CraftData.InstantiateFromPrefab(TechType.RepulsionCannon).GetComponent <RepulsionCannon>();

                rifle.shootSound  = cannon.shootSound;
                rifle.drawSound   = stasisrifle.drawSound;
                rifle.reloadSound = stasisrifle.reloadSound;

                rifle.muzzleFlash  = gobj.transform.Find("Main/Particles/Fire").GetComponent <ParticleSystem>();
                rifle.chargeSparks = gobj.transform.Find("Main/Particles/Charging").GetComponent <ParticleSystem>();
                Object.Destroy(stasisrifle);
                Object.Destroy(cannon);

                rifle.mainCollider             = gobj.GetComponent <BoxCollider>();
                rifle.ikAimRightArm            = true;
                rifle.ikAimLeftArm             = true;
                rifle.useLeftAimTargetOnPlayer = true;

                Console.WriteLine("[AlienRifle] Prefab loaded successfully!");
                return(gobj);
            }
            catch (Exception e) {
                Console.WriteLine("[AlienRifle] Rifle Object couldn't be loaded!\n" + e.Message + e.StackTrace);
                return(gobj);
            }
        }
        public void SetUpArm(GameObject clonedArm, SetupHelper graphicsHelper)
        {
            GameObject elbow = ArmServices.main.objectHelper.FindDeepChild(clonedArm, "elbow");

            GameObject plasmaCannon = elbow.FindChild("torpedoLauncher");

            plasmaCannon.name = "plasmaCannon";

            Object.DestroyImmediate(plasmaCannon.FindChild("reload"));
            Object.DestroyImmediate(plasmaCannon.FindChild("torpedo_innr1"));
            Object.DestroyImmediate(plasmaCannon.FindChild("torpedo_innr2"));
            Object.DestroyImmediate(plasmaCannon.FindChild("torpedo_outr1"));
            Object.DestroyImmediate(plasmaCannon.FindChild("torpedo_outr2"));
            Object.DestroyImmediate(plasmaCannon.FindChild("TorpedoFirst"));
            Object.DestroyImmediate(plasmaCannon.FindChild("TorpedoSecond"));
            Object.DestroyImmediate(plasmaCannon.FindChild("TorpedoReload"));
            Object.DestroyImmediate(plasmaCannon.FindChild("collider"));

            GameObject PlasmaTubeRight = plasmaCannon.FindChild("TorpedoSiloFirst");

            PlasmaTubeRight.name = "PlasmaTubeRight";
            PlasmaTubeRight.transform.localPosition = new Vector3(-1.27f, 0.02f, 0.18f);

            GameObject PlasmaTubeLeft = plasmaCannon.FindChild("TorpedoSiloSecond");

            PlasmaTubeLeft.name = "PlasmaTubeLeft";
            PlasmaTubeLeft.transform.localPosition = new Vector3(-1.27f, 0.02f, -0.18f);

            GameObject ArmRig = ArmServices.main.objectHelper.FindDeepChild(clonedArm, "ArmRig");;

            GameObject exosuit_arm_plasmaCannon_geo = ArmRig.FindChild("ArmModel");

            graphicsHelper.DisableLowerArmMesh();

            GameObject PlasmaArm = Object.Instantiate(Main.assetBundle.LoadAsset <GameObject>("PlasmaArm"), plasmaCannon.transform);

            PlasmaArm.name = "PlasmaArm";
            GameObject precursorColumnMaze = Resources.Load("WorldEntities/Environment/Precursor/Gun/Precursor_Gun_ControlRoom_CentralColumn") as GameObject;

            GameObject precursorColumn = precursorColumnMaze.transform.Find("precursor_column_maze_08_06_08_hlpr/precursor_column_maze_08_06_08_ctrl/precursor_column_maze_08_06_08/precursor_column_maze_08_06_08_glass_02_hlpr/precursor_column_maze_08_06_08_glass_02_ctrl/precursor_column_maze_08_06_08_glass_02").gameObject;

            Transform GlowTubeLeft  = PlasmaArm.transform.Find("GlowTubeLeft");
            Transform GlowTubeRight = PlasmaArm.transform.Find("GlowTubeRight");

            GameObject glowLeft = Object.Instantiate(precursorColumn, GlowTubeLeft);

            glowLeft.name = "glowLeft";
            glowLeft.transform.localPosition = Vector3.zero;
            glowLeft.transform.localScale    = new Vector3(1.28f, 1.43f, 7.09f);
            glowLeft.transform.localRotation = Quaternion.Euler(0, 0, 0);

            MeshRenderer glowLeftRenderer = glowLeft.GetComponent <MeshRenderer>();

            foreach (Material material in glowLeftRenderer.materials)
            {
                material.DisableKeyword("FX_ADDFOG");
            }

            GameObject glowRight = Object.Instantiate(glowLeft, GlowTubeRight);

            glowRight.name = "glowRight";
            glowRight.transform.localPosition = Vector3.zero;
            glowRight.transform.localScale    = new Vector3(1.28f, 1.43f, 7.09f);
            glowRight.transform.localRotation = Quaternion.Euler(0, 0, 0);

            Texture2D _MainTex = Main.assetBundle.LoadAsset <Texture2D>("PlasmaArm_MainTex");
            Texture2D _Illum   = Main.assetBundle.LoadAsset <Texture2D>("PlasmaArm_Illum");
            Texture2D _BumpMap = Main.assetBundle.LoadAsset <Texture2D>("PlasmaArm_BumpMap");

            MeshRenderer laserRenderer = PlasmaArm.GetComponent <MeshRenderer>();

            Shader marmoShader = Shader.Find("MarmosetUBER");

            foreach (Material material in laserRenderer.materials)
            {
                material.shader = marmoShader;
                material.EnableKeyword("MARMO_EMISSION");
                material.EnableKeyword("_ZWRITE_ON");
                material.SetTexture(Shader.PropertyToID("_MainTex"), _MainTex);
                material.SetTexture(Shader.PropertyToID("_BumpMap"), _BumpMap);
                material.SetTexture(Shader.PropertyToID("_Illum"), _Illum);
            }

            PlasmaArm.transform.localScale    = new Vector3(0.13f, 0.13f, 0.13f);
            PlasmaArm.transform.localPosition = new Vector3(-0.33f, 0.20f, -0.20f);
            PlasmaArm.transform.localRotation = Quaternion.Euler(0, 270, 180);

            Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_innr1_geo"));
            Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_innr2_geo"));
            Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_outr1_geo"));
            Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_outr2_geo"));
            Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_reload_geo"));

            GameObject powerTransmitter = CraftData.InstantiateFromPrefab(TechType.PowerTransmitter);

            GameObject laserBeam = Object.Instantiate(powerTransmitter.GetComponent <PowerFX>().vfxPrefab, null, false);

            LineRenderer lineRenderer = laserBeam.GetComponent <LineRenderer>();

            Main.plasma_Material = Object.Instantiate(lineRenderer.material) as Material;

            Object.DestroyImmediate(powerTransmitter);

            Object.DestroyImmediate(laserBeam);
        }