private Pickupable PerformTakeOperation(TechType techType)
        {
            QuickLogger.Debug("Perform Take Operation", true);
            foreach (DSSRackController baseUnit in BaseRacks)
            {
                if (baseUnit.HasItem(techType))
                {
                    var data = baseUnit.GetItemDataFromServer(techType, out RackSlot slot);
                    QuickLogger.Debug("Calling Take", true);

                    if (GivePlayerItem)
                    {
                        var result = baseUnit.GivePlayerItem(techType, data);
                        if (!result)
                        {
                            return(null);
                            //TODO Add Message
                        }
                    }
                    else
                    {
                        slot.Remove((ObjectData)data.data);
                        GivePlayerItem = true;
                    }

                    return(data.ToPickable(techType));
                }
            }

            if (!TakeFromConnectables)
            {
                TakeFromConnectables = true;
                return(null);
            }
            //Check connectables
            foreach (KeyValuePair <string, FCSConnectableDevice> fcsConnectable in FCSConnectables)
            {
                Vector2int itemSize = CraftData.GetItemSize(techType);
                if (fcsConnectable.Value.ContainsItem(techType) && fcsConnectable.Value.IsVisible && !fcsConnectable.Value.IsBase() &&
                    fcsConnectable.Value.IsOperational())
                {
                    var item = fcsConnectable.Value.RemoveItemFromContainer(techType, 1);

                    if (item == null)
                    {
                        continue;
                    }

                    if (GivePlayerItem)
                    {
                        DSSHelpers.GivePlayerItem(item);
                    }

                    GivePlayerItem = true;
                    Mod.OnBaseUpdate?.Invoke();
                    return(item);
                }
            }

            return(null);
        }
        public override IEnumerator GetGameObjectAsync(IOut<GameObject> gameObject)
        {
            // We're not using a separate PreparePrefab() method, because this object only exists in BelowZero.
            // In the event 

            CoroutineTask<GameObject> task;
            Oxygen oxy;
            if (Main.HighCapacityTankPrefab == null)
            {
                Log.LogDebug($"HighCapacityBooster.GetGameObjectAsync: getting HighCapacityTank prefab");
                task = CraftData.GetPrefabForTechTypeAsync(TechType.HighCapacityTank, verbose: true);
                yield return task;
                Main.HighCapacityTankPrefab = GameObject.Instantiate(task.GetResult()); // The "capacity expansion" code in Customise Your Oxygen can't run unless the thing is instantiated. The prefabs can't be altered.
                                                                                        // So unless we instantiate, we only get default capacities.
                ModPrefabCache.AddPrefab(Main.HighCapacityTankPrefab, false);
            }

            if (prefab == null)
            {
                Log.LogDebug($"HighCapacityBooster.GetGameObjectAsync: getting SuitBoosterTank prefab");
                task = CraftData.GetPrefabForTechTypeAsync(TechType.SuitBoosterTank, verbose: true);
                yield return task;

                prefab = GameObject.Instantiate(task.GetResult());
                ModPrefabCache.AddPrefab(prefab, false); // This doesn't actually do any caching, but it does disable the prefab without "disabling" it - the prefab doesn't show up in the world [as with SetActive(false)] but it can still be instantiated.

                //GameObject go = GameObject.Instantiate(prefab);
                Oxygen highCapOxygen = Main.HighCapacityTankPrefab.GetComponent<Oxygen>();
                //Oxygen highCapOxygen = task.GetResult().GetComponent<Oxygen>();
                if (highCapOxygen != null)
                {
                    oxy = prefab.EnsureComponent<Oxygen>();
                    if (oxy != null)
                    {
                        float oxygenCapacity = highCapOxygen.oxygenCapacity;
                        Log.LogDebug($"Found Oxygen component with capacity of {oxygenCapacity} for prefab HighCapacityTank and existing oxygen capacity of {oxy.oxygenCapacity} for prefab IonBoosterTank.");
                        oxy.oxygenCapacity = oxygenCapacity;
                    }
                    else
                    {
                        Log.LogError($"Could not get Oxygen component of SuitBoosterTank while generating IonBoosterTank");
                    }
                }
                else
                    Log.LogError($"Could not get Oxygen component of HighCapacityTank while generating IonBoosterTank");

                var booster = prefab.GetComponent<SuitBoosterTank>();
                if (booster != null)
                {
                    booster.boostOxygenUsePerSecond = boostOxygenUsePerSecond;
                }
                else
                {
                    Log.LogError($"Could not get SuitBoosterTank component of SuitBoosterTank prefab while generating IonBoosterTank");
                }
            }

            oxy = prefab.GetComponent<Oxygen>();
            float oxyCap = oxy != null ? oxy.oxygenCapacity : -1f;
            Log.LogDebug($"IonBoosterTank created with oxygenCapacity of {oxyCap}");
            var postBooster = prefab.GetComponent<SuitBoosterTank>();
            if (postBooster != null)
            {
                if (postBooster.boostOxygenUsePerSecond != boostOxygenUsePerSecond)
                {
                    Log.LogDebug($"Editing SuitBoosterTnk component");
                    postBooster.boostOxygenUsePerSecond = boostOxygenUsePerSecond;
                }
            }
            else
            {
                Log.LogError($"Could not get SuitBoosterTank component of SuitBoosterTank prefab while generating IonBoosterTank");
            }

            gameObject.Set(prefab);
        }
예제 #3
0
 public override GameObject GetGameObject()
 {
     return(GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.DepletedReactorRod)));
 }
예제 #4
0
        private Optional <VehicleMovementData> GetVehicleModel()
        {
            Vehicle vehicle = Player.main.GetVehicle();
            SubRoot sub     = Player.main.GetCurrentSub();

            string     guid;
            Vector3    position;
            Quaternion rotation;
            Vector3    velocity;
            Vector3    angularVelocity;
            TechType   techType;
            float      steeringWheelYaw = 0f, steeringWheelPitch = 0f;
            bool       appliedThrottle = false;

            if (vehicle != null)
            {
                guid     = GuidHelper.GetGuid(vehicle.gameObject);
                position = vehicle.gameObject.transform.position;
                rotation = vehicle.gameObject.transform.rotation;
                techType = CraftData.GetTechType(vehicle.gameObject);

                Rigidbody rigidbody = vehicle.gameObject.GetComponent <Rigidbody>();

                velocity        = rigidbody.velocity;
                angularVelocity = rigidbody.angularVelocity;

                // Required because vehicle is either a SeaMoth or an Exosuit, both types which can't see the fields either.
                steeringWheelYaw   = (float)vehicle.ReflectionGet <Vehicle, Vehicle>("steeringWheelYaw");
                steeringWheelPitch = (float)vehicle.ReflectionGet <Vehicle, Vehicle>("steeringWheelPitch");

                // Vehicles (or the SeaMoth at least) do not have special throttle animations. Instead, these animations are always playing because the player can't even see them (unlike the cyclops which has cameras).
                // So, we need to hack in and try to figure out when thrust needs to be applied.
                if (vehicle && AvatarInputHandler.main.IsEnabled())
                {
                    if (techType == TechType.Seamoth)
                    {
                        bool flag = vehicle.transform.position.y < Ocean.main.GetOceanLevel() && vehicle.transform.position.y < vehicle.worldForces.waterDepth && !vehicle.precursorOutOfWater;
                        appliedThrottle = flag && GameInput.GetMoveDirection().sqrMagnitude > .1f;
                    }
                    else if (techType == TechType.Exosuit)
                    {
                        Exosuit exosuit = vehicle as Exosuit;
                        if (exosuit)
                        {
                            appliedThrottle = (bool)exosuit.ReflectionGet("_jetsActive") && (float)exosuit.ReflectionGet("thrustPower") > 0f;
                        }
                    }
                }
            }
            else if (sub != null && Player.main.isPiloting)
            {
                guid     = GuidHelper.GetGuid(sub.gameObject);
                position = sub.gameObject.transform.position;
                rotation = sub.gameObject.transform.rotation;
                Rigidbody rigidbody = sub.GetComponent <Rigidbody>();
                velocity        = rigidbody.velocity;
                angularVelocity = rigidbody.angularVelocity;
                techType        = TechType.Cyclops;

                SubControl subControl = sub.GetComponent <SubControl>();
                steeringWheelYaw   = (float)subControl.ReflectionGet("steeringWheelYaw");
                steeringWheelPitch = (float)subControl.ReflectionGet("steeringWheelPitch");
                appliedThrottle    = subControl.appliedThrottle && (bool)subControl.ReflectionGet("canAccel");
            }
            else
            {
                return(Optional <VehicleMovementData> .Empty());
            }

            VehicleMovementData model = new VehicleMovementData(techType,
                                                                guid,
                                                                position,
                                                                rotation,
                                                                velocity,
                                                                angularVelocity,
                                                                steeringWheelYaw,
                                                                steeringWheelPitch,
                                                                appliedThrottle);

            return(Optional <VehicleMovementData> .Of(model));
        }
예제 #5
0
        public static bool BatteryCheck(Pickupable pickupable)
        {
            EnergyMixin energyMixin = pickupable.gameObject.GetComponentInChildren <EnergyMixin>();

            if (energyMixin != null)
            {
                GameObject gameObject   = energyMixin.GetBattery();
                bool       defaultCheck = false;
                if (gameObject != null)
                {
                    defaultCheck = energyMixin.defaultBattery == CraftData.GetTechType(gameObject);
                }

                if (gameObject == null && QModServices.Main.ModPresent("NoBattery"))
                {
                    return(true);
                }
                if (gameObject != null && (defaultCheck || QModServices.Main.ModPresent("NoBattery")))
                {
                    IBattery battery = gameObject.GetComponent <IBattery>();
#if SUBNAUTICA
                    TechData techData = CraftDataHandler.GetTechData(pickupable.GetTechType());
#elif BELOWZERO
                    RecipeData techData = CraftDataHandler.GetRecipeData(pickupable.GetTechType());
#endif
                    bool recipeCheck = techData.Ingredients.FindAll((ingredient) => ingredient.techType == TechType.Battery || ingredient.techType == TechType.PrecursorIonBattery || ingredient.techType == TechType.LithiumIonBattery || ingredient.techType == TechType.PowerCell || ingredient.techType == TechType.PrecursorIonPowerCell).Count == 0;
                    if (battery != null && QModServices.Main.ModPresent("NoBattery") && recipeCheck)
                    {
                        ErrorMessage.AddMessage($"{pickupable.GetTechType().ToString()} has a battery in it. Cannot Recycle.");
                        return(false);
                    }
                    else if (battery != null && defaultCheck && battery.charge > (battery.capacity * 0.99))
                    {
                        return(true);
                    }
                    else
                    {
                        if (gameObject != null && !defaultCheck)
                        {
                            ErrorMessage.AddMessage($"{CraftData.GetTechType(gameObject).ToString()} is not the default battery for {pickupable.GetTechType().ToString()}.");
                        }
                        else
                        {
                            ErrorMessage.AddMessage($"{pickupable.GetTechType().ToString()} is not fully charged and cannot be recycled.");
                        }

                        return(false);
                    }
                }
                else
                {
                    if (gameObject != null)
                    {
                        ErrorMessage.AddMessage($"{CraftData.GetTechType(gameObject).ToString()} is not the default battery for {pickupable.GetTechType().ToString()}.");
                    }
                    else
                    {
                        ErrorMessage.AddMessage($"{pickupable.GetTechType().ToString()} has no battery.");
                    }

                    return(false);
                }
            }

            IBattery b2 = pickupable.GetComponent <IBattery>();
            if (b2 != null)
            {
                if (b2.charge > (b2.capacity * 0.99))
                {
                    return(true);
                }
                else
                {
                    ErrorMessage.AddMessage($"{pickupable.GetTechType().ToString()} is not fully charged and cannot be recycled.");
                    return(false);
                }
            }
            return(true);
        }
예제 #6
0
        public static bool Prefix(Constructable __instance)
        {
            if (Player.main.GetVehicle() != null && GameModeUtils.RequiresIngredients())
            {
                Type            ConstructableType          = typeof(Constructable);
                List <TechType> resourceMapField           = (List <TechType>)AccessTools.Field(ConstructableType, "resourceMap").GetValue(__instance);
                MethodInfo      getResourceIDMethod        = AccessTools.Method(ConstructableType, "GetResourceID");
                MethodInfo      GetConstructIntervalMethod = AccessTools.Method(ConstructableType, "GetConstructInterval");
                MethodInfo      updateMaterialMethod       = AccessTools.Method(ConstructableType, "UpdateMaterial");

                Vehicle thisVehicle = Player.main.GetVehicle();
                if (__instance._constructed)
                {
                    return(true);
                }
                int count = resourceMapField.Count;

                int   resourceID = (int)getResourceIDMethod.Invoke(__instance, null);
                float backupConstructedAmount = __instance.constructedAmount;
                __instance.constructedAmount -= Time.deltaTime / (count * (float)GetConstructIntervalMethod.Invoke(__instance, null));
                __instance.constructedAmount  = Mathf.Clamp01(__instance.constructedAmount);
                int resourceID2 = (int)getResourceIDMethod.Invoke(__instance, null);
                if (resourceID2 != resourceID)
                {
                    TechType   techType   = resourceMapField[resourceID2];
                    GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false);
                    Pickupable component  = gameObject.GetComponent <Pickupable>();

                    if (thisVehicle.GetType().Equals(typeof(Exosuit)))
                    {
                        StorageContainer storageContainer = ((Exosuit)thisVehicle).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();
                        }
                        else
                        {
                            __instance.constructedAmount = backupConstructedAmount;
                            return(true);
                        }
                    }
                    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)
                        {
                            __instance.constructedAmount = backupConstructedAmount;
                            return(true);
                        }
                    }
                }
                updateMaterialMethod.Invoke(__instance, null);
                return(__instance.constructedAmount <= 0f);
            }
            else
            {
                return(true);
            }
        }
예제 #7
0
        private TechType GetTechType()
        {
            var techType = CraftData.GetTechType(gameObject);

            return(techType);
        }
        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
            if (Player.main.isPiloting)
            {
#if SUBNAUTICA_STABLE
                //GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false);
                GameObject prefabForTechType = CraftData.GetPrefabForTechType(techType, true);
                GameObject gameObject        = (prefabForTechType != null) ? global::Utils.SpawnFromPrefab(prefabForTechType, null) : global::Utils.CreateGenericLoot(techType);
#elif BELOWZERO
                GameObject gameObject = CraftData.InstantiateFromPrefab(null, techType, false); // Coming back to this months later, I didn't think this worked in BZ, because it's not async. But apparently it does...
#endif
                Pickupable pickup = gameObject.GetComponent <Pickupable>();
                if (pickup != null)
                {
                    pickup.Initialize();

                    // This is kind of messy but it's an easy way to get the cross-game code running. In SN1 modules will always == null so the block won't run; but it'll still compile.
#if SUBNAUTICA_STABLE
                    Equipment modules = null;
#elif BELOWZERO
                    SeaTruckUpgrades upgrades = Player.main.GetComponentInParent <SeaTruckUpgrades>();
                    Equipment        modules  = upgrades?.modules;
#endif
                    if (modules != null && TechTypeHandler.TryGetModdedTechType("SeaTruckStorage", out TechType storageType))
                    {
                        //HashSet<string> TruckSlotIDs = modules.equipment.Keys.ToSet<string>();
                        List <string> TruckSlotIDs = null;
                        modules.GetSlots(EquipmentType.SeaTruckModule, TruckSlotIDs);
                        foreach (string slot in TruckSlotIDs)
                        {
                            InventoryItem item = modules.GetItemInSlot(slot);
                            if (item.item.GetTechType() == storageType)
                            {
                                //InventoryItem item = modules.GetItemInSlot(slot);

                                if (item.item.TryGetComponent(out SeamothStorageContainer seamothStorageContainer))
                                {
                                    InventoryItem newItem = new InventoryItem(pickup);
                                    if (seamothStorageContainer.container.AddItem(newItem) != null)
                                    {
                                        string name = Language.main.Get(pickup.GetTechName());
                                        ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name));

                                        //uGUI_IconNotifier.main.Play(pickup.GetTechType(), uGUI_IconNotifier.AnimationType.From, null);
                                        uGUI_IconNotifier.main.Play(techType, uGUI_IconNotifier.AnimationType.From, null);
                                        pickup.PlayPickupSound();
#if !RELEASE
                                        Logger.Log(Logger.Level.Debug, $"Adding tech {techType} to Seatruck storage");
#endif
                                        return;
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        Vehicle thisVehicle = Player.main.GetVehicle();
                        if (thisVehicle != null)
                        {
                            if (thisVehicle is Exosuit exo)
                            {
                                StorageContainer storageContainer = exo.storageContainer;

                                if (storageContainer != null)
                                {
                                    int lastCount = storageContainer.container.GetCount(techType);
                                    storageContainer.container.AddItem(pickup);
                                    int techCount = storageContainer.container.GetCount(techType);
#if !RELEASE
                                    Logger.Log(Logger.Level.Debug, $"Adding tech {techType.AsString().PadLeft(15)} to Exosuit storage; previous count {lastCount}, new count {techCount}");
#endif
                                    if (techCount - lastCount == 1)
                                    {
                                        string name = Language.main.Get(pickup.GetTechName());
                                        ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name));

                                        uGUI_IconNotifier.main.Play(pickup.GetTechType(), uGUI_IconNotifier.AnimationType.From, null);
                                        pickup.PlayPickupSound();
                                        return;
                                    }
                                }
                            }

                            else if (thisVehicle is SeaMoth seamoth)
                            {
                                //bool storageCheck = false;
                                List <IItemsContainer> containers = new List <IItemsContainer>();
                                seamoth.GetAllStorages(containers);
                                //for (int i = 0; i < 12; i++)
                                InventoryItem newItem = new InventoryItem(pickup);
                                foreach (IItemsContainer storage in containers)
                                {
                                    try
                                    {
                                        //ItemsContainer storage = seamoth.GetStorageInSlot(i, TechType.VehicleStorageModule);
                                        if (storage is ItemsContainer iContainer)
                                        {
                                            int lastCount = iContainer.GetCount(techType);
                                            iContainer.AddItem(pickup);
                                            int techCount = iContainer.GetCount(techType);
#if !RELEASE
                                            Logger.Log(Logger.Level.Debug, $"Adding tech {techType.AsString().PadLeft(15)} to Seamoth storage; previous count {lastCount}, new count {techCount}");
#endif
                                            if (techCount - lastCount == 1)
                                            {
                                                string name = Language.main.Get(pickup.GetTechName());
                                                ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name));
                                                uGUI_IconNotifier.main.Play(pickup.GetTechType(), uGUI_IconNotifier.AnimationType.From, null);

                                                pickup.PlayPickupSound();
                                                //storageCheck = true;
                                                return;
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
#if !RELEASE
                                        Logger.Log(Logger.Level.Debug, $"Exception adding tech {techType} to Seamoth storage: {e.ToString()}");
#endif
                                        continue;
                                    }
                                }

                                /*if (storageCheck)
                                 * {
                                 *  return;
                                 * }*/
                            }
                        }
                    }
                }
            }
#if !RELEASE
            Logger.Log(Logger.Level.Debug, $"Adding tech {techType} to player inventory");
#endif
            CraftData.AddToInventory(techType, count, bNoMessage, bSpawnIfCantAdd);
        }
        public override GameObject GetGameObject()
        {
            GameObject    prefab;
            Constructable constructible = null;
            GhostCrafter  crafter;

            switch (FabricatorDetails.Model)
            {
            case ModelTypes.Fabricator:
                prefab  = GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.Fabricator));
                crafter = prefab.GetComponent <Fabricator>();
                break;

            case ModelTypes.Workbench:
                prefab  = GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.Workbench));
                crafter = prefab.GetComponent <Workbench>();
                break;

            case ModelTypes.MoonPool:
                prefab  = GameObject.Instantiate(Resources.Load <GameObject>("Submarine/Build/CyclopsFabricator"));
                crafter = prefab.GetComponent <Fabricator>();

                // Add prefab ID because CyclopsFabricator normaly doesn't have one
                PrefabIdentifier prefabId = prefab.AddComponent <PrefabIdentifier>();
                prefabId.ClassId = FabricatorDetails.ItemID;
                prefabId.name    = FabricatorDetails.DisplayName;

                // Add tech tag because CyclopsFabricator normaly doesn't have one
                TechTag techTag = prefab.AddComponent <TechTag>();
                techTag.type = this.TechType;

                // Retrieve sub game objects
                GameObject cyclopsFabLight = prefab.FindChild("fabricatorLight");
                GameObject cyclopsFabModel = prefab.FindChild("submarine_fabricator_03");
                // Translate CyclopsFabricator model and light
                prefab.transform.localPosition = new Vector3(cyclopsFabModel.transform.localPosition.x,        // Same X position
                                                             cyclopsFabModel.transform.localPosition.y - 0.8f, // Push towards the wall slightly
                                                             cyclopsFabModel.transform.localPosition.z);       // Same Z position
                prefab.transform.localPosition = new Vector3(cyclopsFabLight.transform.localPosition.x,        // Same X position
                                                             cyclopsFabLight.transform.localPosition.y - 0.8f, // Push towards the wall slightly
                                                             cyclopsFabLight.transform.localPosition.z);       // Same Z position
                // Add constructable - This prefab normally isn't constructed.
                constructible       = prefab.AddComponent <Constructable>();
                constructible.model = cyclopsFabModel;
                break;

            default:
                throw new InvalidOperationException("ModelType in CustomFabricator does not correspond to a valid fabricator type");
            }

            crafter.craftTree    = FabricatorDetails.TreeTypeID;
            crafter.handOverText = $"Use {FabricatorDetails.DisplayName}";

            if (constructible is null)
            {
                constructible = prefab.GetComponent <Constructable>();
            }

            constructible.allowedInBase           = FabricatorDetails.AllowedInBase;
            constructible.allowedInSub            = FabricatorDetails.AllowedInCyclops;
            constructible.allowedOutside          = false;
            constructible.allowedOnCeiling        = false;
            constructible.allowedOnGround         = FabricatorDetails.Model == ModelTypes.Workbench;
            constructible.allowedOnWall           = FabricatorDetails.Model != ModelTypes.Workbench;
            constructible.allowedOnConstructables = false;
            constructible.controlModelState       = true;
            constructible.rotationEnabled         = false;
            constructible.techType = this.TechType; // This was necessary to correctly associate the recipe at building time

            SkyApplier skyApplier = prefab.GetComponent <SkyApplier>();

            skyApplier.renderers = prefab.GetComponentsInChildren <Renderer>();
            skyApplier.anchorSky = Skies.Auto;

            if (FabricatorDetails.HasColorValue)
            {
                SkinnedMeshRenderer skinnedMeshRenderer = prefab.GetComponentInChildren <SkinnedMeshRenderer>();
                skinnedMeshRenderer.material.color = FabricatorDetails.ColorTint; // Tint option available
            }

            // Associate power relay
            var powerRelay = new PowerRelay();

            // This is actually a dirty hack
            // The problem is that the parent SubRoot isn't correctly associated at this time.
            // The power relay should be getting set in the GhostCrafter Start() method.
            // But the parent components are coming up null.
            crafter.powerRelay = powerRelay;

            return(prefab);
        }
예제 #10
0
        public static bool AddOrSwap_Prefix(ref bool __result, InventoryItem itemA, Equipment equipmentB, string slotB)
        {
            if (itemA == null || !itemA.CanDrag(true) || equipmentB == null)
            {
                return(true);
            }
            Pickupable item = itemA.item;

            if (item == null)
            {
                return(true);
            }
            TechType techType = item.GetTechType();

            if (techType == TechType.Battery || techType == TechType.PrecursorIonBattery ||
                techType == TechType.PowerCell || techType == TechType.PrecursorIonPowerCell)
            {
                IItemsContainer container = itemA.container;
                if (container == null)
                {
                    return(true);
                }
                Equipment equipment = container as Equipment;
                bool      flag      = equipment != null;
                string    empty     = string.Empty;
                if (flag && !equipment.GetItemSlot(item, ref empty))
                {
                    return(true);
                }
#if BELOWZERO
                EquipmentType equipmentType = TechData.GetEquipmentType(techType);
#else
                EquipmentType equipmentType = CraftData.GetEquipmentType(techType);
#endif
                if (string.IsNullOrEmpty(slotB))
                {
                    equipmentB.GetCompatibleSlot(equipmentType, out slotB);
                }
                if (string.IsNullOrEmpty(slotB))
                {
                    return(true);
                }
                if (container == equipmentB && empty == slotB)
                {
                    return(true);
                }
                EquipmentType slotBType = Equipment.GetSlotType(slotB);
                if (slotBType != EquipmentType.BatteryCharger && slotBType != EquipmentType.PowerCellCharger)
                {
                    return(true);
                }
                else // Else, we're trying to plug a battery or powercell to its charger
                {
                    InventoryItem inventoryItem = equipmentB.RemoveItem(slotB, false, true);
                    if (inventoryItem == null)
                    {
                        if (equipmentB.AddItem(slotB, itemA, false))
                        {
                            __result = true;
                            return(false);
                        }
                    }
                    else if (equipmentB.AddItem(slotB, itemA, false))
                    {
                        if ((flag && equipment.AddItem(empty, inventoryItem, false)) || (!flag && container.AddItem(inventoryItem)))
                        {
                            __result = true;
                            return(false);
                        }
                        if (flag)
                        {
                            equipment.AddItem(empty, itemA, true);
                        }
                        else
                        {
                            container.AddItem(itemA);
                        }
                        equipmentB.AddItem(slotB, inventoryItem, true);
                    }
                    else
                    {
                        equipmentB.AddItem(slotB, inventoryItem, true);
                    }
                    __result = false;
                    return(false);
                }
            }
            return(true);
        }
예제 #11
0
파일: Vehicles.cs 프로젝트: yawaraka/Nitrox
        private void OnVehiclePrefabLoaded(TechType techType, GameObject prefab, string guid, Vector3 spawnPosition, Quaternion spawnRotation, Optional <List <InteractiveChildObjectIdentifier> > interactiveChildIdentifiers, Optional <string> dockingBayGuid, string name, Vector3[] hsb, Vector3[] colours)
        {
            // Partially copied from SubConsoleCommand.OnSubPrefabLoaded
            GameObject gameObject = Utils.SpawnPrefabAt(prefab, null, spawnPosition);

            gameObject.transform.rotation = spawnRotation;
            gameObject.SetActive(true);
            gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver);
            CrafterLogic.NotifyCraftEnd(gameObject, CraftData.GetTechType(gameObject));
            Rigidbody rigidBody = gameObject.GetComponent <Rigidbody>();

            rigidBody.isKinematic = false;
            GuidHelper.SetNewGuid(gameObject, guid);

            // Updates names and colours with persisted data .....yeah.....
            if (techType == TechType.Seamoth || techType == TechType.Exosuit)
            { // Seamoth & Prawn suit
                Vehicle vehicle = gameObject.GetComponent <Vehicle>();
                if (dockingBayGuid.IsPresent())
                {
                    GameObject        dockingBayBase = GuidHelper.RequireObjectFrom(dockingBayGuid.Get());
                    VehicleDockingBay dockingBay     = dockingBayBase.GetComponentInChildren <VehicleDockingBay>();
                    dockingBay.DockVehicle(vehicle);
                }

                if (!string.IsNullOrEmpty(name))
                {
                    vehicle.vehicleName = name;
                    vehicle.subName.DeserializeName(vehicle.vehicleName);
                }

                if (colours != null)
                {
                    Vector3[] colour = new Vector3[5];

                    for (int i = 0; i < hsb.Length; i++)
                    {
                        colour[i] = hsb[i];
                    }
                    vehicle.vehicleColors = colour;
                    vehicle.subName.DeserializeColors(vehicle.vehicleColors);
                }
            }
            else if (techType == TechType.Cyclops) // Cyclops
            {
                GameObject   target        = GuidHelper.RequireObjectFrom(guid);
                SubNameInput subNameInput  = target.RequireComponentInChildren <SubNameInput>();
                SubName      subNameTarget = (SubName)subNameInput.ReflectionGet("target");
                subNameInput.OnNameChange(name);
                for (int i = 0; i < hsb.Length; i++)
                {
                    subNameInput.SetSelected(i);
                    Color tmpColour = new Vector4(colours[i].x, colours[i].y, colours[i].z);
                    subNameTarget.SetColor(i, hsb[i], tmpColour);
                    subNameTarget.DeserializeColors(hsb);
                }
            }

            if (interactiveChildIdentifiers.IsPresent())
            {
                VehicleChildObjectIdentifierHelper.SetInteractiveChildrenGuids(gameObject, interactiveChildIdentifiers.Get()); //Copy From ConstructorBeginCraftingProcessor
            }
        }
예제 #12
0
        private void DrawHostilesMenu()
        {
            if (reaper == null)
            {
                if (GUILayout.Button("Spawn Reaper"))
                {
                    GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.ReaperLeviathan, true);
                    GameObject gameObject        = Utils.CreatePrefab(prefabForTechType);
                    LargeWorldEntity.Register(gameObject);
                    CrafterLogic.NotifyCraftEnd(gameObject, TechType.ReaperLeviathan);
                    gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver);
                    reaper = gameObject.GetComponentInChildren <ReaperLeviathan>();
                    gameObject.transform.position += 50f * gameObject.transform.forward;
                }
            }
            else
            {
                GUILayout.Space(10);

                if (GUILayout.Button("Reaper Components"))
                {
                    foreach (Component c in reaper.GetComponentsInChildren(typeof(Component)))
                    {
                        Log.Print("Component: " + c + " on go: " + c.gameObject.name);
                    }
                }

                if (GUILayout.Button("Delete Reaper"))
                {
                    Destroy(reaper.gameObject);
                }

                GUILayout.Space(10);
            }

            if (crabsquid == null)
            {
                if (GUILayout.Button("Spawn Crabsquid"))
                {
                    GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.CrabSquid, true);
                    GameObject gameObject        = Utils.CreatePrefab(prefabForTechType);
                    LargeWorldEntity.Register(gameObject);
                    CrafterLogic.NotifyCraftEnd(gameObject, TechType.CrabSquid);
                    gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver);
                    crabsquid = gameObject.GetComponentInChildren <CrabSquid>();
                    gameObject.transform.position += 50f * gameObject.transform.forward;
                }
            }
            else
            {
                GUILayout.Space(10);

                if (GUILayout.Button("Crabsquid Components"))
                {
                    foreach (Component c in crabsquid.GetComponentsInChildren(typeof(Component)))
                    {
                        Log.Print("Component: " + c + " on go: " + c.gameObject.name);
                    }
                }

                if (GUILayout.Button("Delete Crabsquid"))
                {
                    Destroy(crabsquid.gameObject);
                }

                GUILayout.Space(10);
            }

            if (ghostlevi == null)
            {
                if (GUILayout.Button("Spawn Ghost Levi"))
                {
                    GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.GhostLeviathan, true);
                    GameObject gameObject        = Utils.CreatePrefab(prefabForTechType);
                    LargeWorldEntity.Register(gameObject);
                    CrafterLogic.NotifyCraftEnd(gameObject, TechType.GhostLeviathan);
                    gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver);
                    ghostlevi = gameObject.GetComponentInChildren <GhostLeviathan>();
                    gameObject.transform.position += 50f * gameObject.transform.forward;
                }
            }
            else
            {
                GUILayout.Space(10);

                if (GUILayout.Button("Ghost Levi Components"))
                {
                    foreach (Component c in ghostlevi.GetComponentsInChildren(typeof(Component)))
                    {
                        Log.Print("Component: " + c + " on go: " + c.gameObject.name);
                    }
                }

                if (GUILayout.Button("Delete Ghost Levi"))
                {
                    Destroy(ghostlevi.gameObject);
                }

                GUILayout.Space(10);
            }

            if (seaDragon == null)
            {
                if (GUILayout.Button("Spawn Seadragon"))
                {
                    GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.SeaDragon, true);
                    GameObject gameObject        = Utils.CreatePrefab(prefabForTechType);
                    LargeWorldEntity.Register(gameObject);
                    CrafterLogic.NotifyCraftEnd(gameObject, TechType.SeaDragon);
                    gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver);
                    seaDragon = gameObject.GetComponentInChildren <SeaDragon>();
                    gameObject.transform.position += 50f * gameObject.transform.forward;
                }
            }
            else
            {
                GUILayout.Space(10);

                if (GUILayout.Button("Seadragon Components"))
                {
                    foreach (Component c in seaDragon.GetComponentsInChildren(typeof(Component)))
                    {
                        Log.Print("Component: " + c + " on go: " + c.gameObject.name);
                    }
                }

                if (GUILayout.Button("Delete Seadragon"))
                {
                    Destroy(seaDragon.gameObject);
                }

                GUILayout.Space(10);
            }

            if (warper == null)
            {
                if (GUILayout.Button("Spawn warper"))
                {
                    GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.Warper, true);
                    GameObject gameObject        = Utils.CreatePrefab(prefabForTechType);
                    LargeWorldEntity.Register(gameObject);
                    CrafterLogic.NotifyCraftEnd(gameObject, TechType.Warper);
                    gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver);
                    warper = gameObject.GetComponentInChildren <Warper>();
                    gameObject.transform.position += 50f * gameObject.transform.forward;
                }
            }
            else
            {
                GUILayout.Space(10);

                if (GUILayout.Button("Warper Components"))
                {
                    foreach (Component c in warper.GetComponentsInChildren(typeof(Component)))
                    {
                        Log.Print("Component: " + c + " on go: " + c.gameObject.name);
                    }
                }

                if (GUILayout.Button("Delete Warper"))
                {
                    Destroy(warper.gameObject);
                }

                GUILayout.Space(10);
            }
        }
예제 #13
0
 public override GameObject GetGameObject() => GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.VehicleArmorPlating));
예제 #14
0
 public override GameObject GetGameObject()
 {
     return(CraftData.GetPrefabForTechType(TechType.MapRoomUpgradeScanRange));
 }
        public void SlotArmUp()
        {
#if OUTSIDE_TEST_ENABLED
#else
            if (!Player.main.inSeamoth || !AvatarInputHandler.main.IsEnabled())
            {
                return;
            }
#endif
            if (currentSelectedArm == SeamothArm.Left)
            {
                leftButtonDownProcessed = false;

                QuickSlotType quickSlotType = CraftData.GetQuickSlotType(currentLeftArmType);

                if (quickSlotType == QuickSlotType.Selectable)
                {
                    leftArm.OnUseUp(out float coolDown);
                }
                else if (quickSlotType == QuickSlotType.SelectableChargeable)
                {
                    if (!seamoth.IsPowered())
                    {
                        return;
                    }

                    if (seamoth.GetSlotProgress(LeftArmSlotID) != 1f)
                    {
                        return;
                    }

                    if (leftArm.OnUseUp(out float coolDown))
                    {
                        quickSlotTimeUsed[LeftArmSlotID] = Time.time;
                        quickSlotCooldown[LeftArmSlotID] = coolDown;
                    }

                    quickSlotCharge[LeftArmSlotID] = 0f;
                }
            }
            else if (currentSelectedArm == SeamothArm.Right)
            {
                rightButtonDownProcessed = false;

                QuickSlotType quickSlotType = CraftData.GetQuickSlotType(currentRightArmType);

                if (quickSlotType == QuickSlotType.Selectable)
                {
                    rightArm.OnUseUp(out float coolDown);
                }
                else if (quickSlotType == QuickSlotType.SelectableChargeable)
                {
                    if (!seamoth.IsPowered())
                    {
                        return;
                    }

                    if (seamoth.GetSlotProgress(RightArmSlotID) != 1f)
                    {
                        return;
                    }

                    if (rightArm.OnUseUp(out float coolDown))
                    {
                        quickSlotTimeUsed[RightArmSlotID] = Time.time;
                        quickSlotCooldown[RightArmSlotID] = coolDown;
                    }

                    quickSlotCharge[LeftArmSlotID] = 0f;
                }
            }
        }
예제 #16
0
        static void setCauseOfDeath(DamageType damageType)
        {
            try
            {
                switch (damageType)
                {
                case DamageType.Acid:
                    DeathRun.setCause("Acid");
                    break;

                case DamageType.Collide:
                    DeathRun.setCause("Collision");
                    break;

                case DamageType.Electrical:
                    DeathRun.setCause("Electrocution");
                    break;

                case DamageType.Explosive:
                    DeathRun.setCause("Explosion");
                    break;

                case DamageType.Fire:
                    DeathRun.setCause("Burned to Death");
                    break;

                case DamageType.Heat:
                    DeathRun.setCause("Extreme Heat");
                    break;

                case DamageType.Poison:
                    DeathRun.setCause("Poison");
                    break;

                case DamageType.Pressure:
                    DeathRun.setCause("Pressure");
                    break;

                case DamageType.Puncture:
                    DeathRun.setCause("Puncture Wounds");
                    break;

                case DamageType.Radiation:
                    DeathRun.setCause("Radiation");
                    break;

                case DamageType.Smoke:
                    DeathRun.setCause("Smoke Asphyxiation");
                    break;

                //case DamageType.Starve:
                //case DamageType.Normal:
                default:
                    if (DeathRun.CAUSE_UNKNOWN_CREATURE.Equals(DeathRun.cause))
                    {
                        if (DeathRun.causeObject != null)
                        {
                            GameObject go;
                            TechType   t = CraftData.GetTechType(DeathRun.causeObject, out go);

                            if (t != TechType.None)
                            {
                                DeathRun.setCause(Language.main.Get(t.AsString(false)));

                                CattleLogger.Message("Cause of Death: " + DeathRun.cause);
                            }
                            else
                            {
                                CattleLogger.Message("(Couldn't find creature that caused player death) - ");
                            }
                        }
                    }
                    break;
                }
            }
            catch (Exception ex)
            {
                CattleLogger.GenericError("Getting cause of death", ex);
            }
        }
        private static IEnumerator GetPrefabForList(TechType breakable, TechType techType, float chance)
        {
            var task = CraftData.GetPrefabForTechTypeAsync(techType, false);

#if SUBNAUTICA_STABLE
            if (BreakableResource_ChooseRandomResource.prefabs.ContainsKey(breakable))
            {
                var existingPrefab = BreakableResource_ChooseRandomResource.prefabs[breakable].Find((x) => CraftData.GetTechType(x.prefab) == techType);
                if (existingPrefab != null)
                {
                    existingPrefab.chance = chance;
                }
                else
                {
                    yield return(task);

                    var gameObject = task.GetResult();
                    if (gameObject != null)
                    {
                        BreakableResource_ChooseRandomResource.prefabs[breakable].Add(new BreakableResource.RandomPrefab()
                        {
                            prefab = gameObject, chance = chance
                        });
                    }
                }
            }
            else
            {
                BreakableResource_ChooseRandomResource.prefabs[breakable] = new List <BreakableResource.RandomPrefab>();
                yield return(task);

                var gameObject = task.GetResult();
                if (gameObject != null)
                {
                    BreakableResource_ChooseRandomResource.prefabs[breakable].Add(new BreakableResource.RandomPrefab()
                    {
                        prefab = gameObject, chance = chance
                    });
                }
            }
#else
            if (!BreakableResource_ChooseRandomResource.prefabs.ContainsKey(breakable))
            {
                BreakableResource_ChooseRandomResource.prefabs[breakable] = new List <BreakableResource.RandomPrefab>();
            }

            var existingPrefab = BreakableResource_ChooseRandomResource.prefabs[breakable].Find((x) => x.prefabTechType == techType);
            if (existingPrefab != null)
            {
                existingPrefab.chance = chance;
                yield break;
            }

            yield return(task);

            var gameObject = task.GetResult();
            if (gameObject != null && PrefabDatabase.TryGetPrefabFilename(gameObject.GetComponent <PrefabIdentifier>().ClassId, out var filename))
            {
                BreakableResource_ChooseRandomResource.prefabs[breakable].Add(new BreakableResource.RandomPrefab()
                {
                    prefabTechType = techType, prefabReference = new AssetReferenceGameObject(filename), chance = chance
                });
            }
#endif
        }
예제 #18
0
파일: Eat.cs 프로젝트: gurrenm3/Stats-Core
        /// <summary>
        /// This is a copy paste of the original <see cref="Survival.Eat(GameObject)"/> because there are too many things to transpile
        /// </summary>
        /// <param name="__instance"></param>
        /// <param name="useObj"></param>
        private void NewPrefixPatch(Survival __instance, GameObject useObj)
        {
            flag = false;
            if (useObj != null)
            {
                Eatable component = useObj.GetComponent <Eatable>();
                if (component != null)
                {
                    if (component.GetFoodValue() != 0f)
                    {
                        float miniFoodOverfill = __instance.GetStomachSize() - 1;
                        if (__instance.food <= miniFoodOverfill)
                        {
                            __instance.food = Mathf.Clamp(__instance.food + component.GetFoodValue(), 0f, __instance.GetStomachOverfillSize());
                        }
                        __instance.onEat.Trigger(component.GetFoodValue());
                        if (component.GetFoodValue() > 0f)
                        {
                            GoalManager.main.OnCustomGoalEvent("Eat_Something");
                        }
                        flag = true;
                    }

                    if (component.GetWaterValue() != 0f)
                    {
                        float minWaterOverfill = __instance.GetWaterCapacity() - 1;
                        if (__instance.water <= minWaterOverfill)
                        {
                            __instance.water = Mathf.Clamp(__instance.water + component.GetWaterValue(), 0f, __instance.GetWaterOverfillSize());
                        }
                        __instance.onDrink.Trigger(component.GetWaterValue());
                        if (component.GetWaterValue() > 0f)
                        {
                            GoalManager.main.OnCustomGoalEvent("Drink_Something");
                        }
                        flag = true;
                    }

                    var lowFoodThreshold  = __instance.GetLowFoodThreshold();
                    var lowWaterThreshold = __instance.GetLowWaterThreshold();

                    bool foodOkay  = (__instance.food > lowFoodThreshold && __instance.food - component.GetFoodValue() < lowFoodThreshold);
                    bool waterOkay = (__instance.water > lowWaterThreshold && __instance.water - component.GetWaterValue() < lowWaterThreshold);
                    if (foodOkay || waterOkay)
                    {
                        __instance.vitalsOkNotification.Play();
                    }
                }


                if (flag)
                {
                    TechType techType = CraftData.GetTechType(useObj);
                    if (techType == TechType.None)
                    {
                        Pickupable component2 = useObj.GetComponent <Pickupable>();
                        if (component2)
                        {
                            techType = component2.GetTechType();
                        }
                    }
                    FMODUWE.PlayOneShot(CraftData.GetUseEatSound(techType), Player.main.transform.position, 1f);
                    if (techType == TechType.Bladderfish)
                    {
                        Player.main.GetComponent <OxygenManager>().AddOxygen(__instance.GetO2FromBlatterfish());
                    }
                }
            }
        }
        public void CreateCannonLeft()
        {
            cannon_base_left = new GameObject("cannon_base_left");
            cannon_base_left.transform.SetParent(gameObject.transform);
            cannon_base_left.transform.localPosition = new Vector3(3.55f, -7.19f, 0.81f);
            cannon_base_left.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);

            GameObject cannon_left_circuit_box = CraftData.InstantiateFromPrefab(TechType.StarshipCircuitBox);

            cannon_left_circuit_box.transform.SetParent(cannon_base_left.transform, false);

            cannon_left_circuit_box.CleanObject();
            cannon_left_circuit_box.name = "cannon_left_circuit_box";
            cannon_left_circuit_box.transform.localPosition = new Vector3(0.56f, 0.48f, -0.66f);
            cannon_left_circuit_box.transform.localScale    = new Vector3(0.72f, 0.72f, 0.72f);
            cannon_left_circuit_box.transform.localRotation = Quaternion.Euler(72f, 90f, 0f);

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

            cannon_pylon_left.transform.SetParent(cannon_base_left.transform, false);
            Utils.ZeroTransform(cannon_pylon_left.transform);

            GameObject laserBeam = Instantiate(cannon_pylon_left.GetComponent <PowerFX>().vfxPrefab, cannon_base_left.transform, false);

            laserBeam.SetActive(false);

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

            lineRenderer.startWidth     = 0.2f;
            lineRenderer.endWidth       = 0.2f;
            lineRenderer.positionCount  = 2;
            lineRenderer.material.color = beamcolor;

            Destroy(cannon_pylon_left.FindChild("powerFX_AttachPoint"));
            Destroy(cannon_pylon_left.FindChild("builder trigger"));
            cannon_pylon_left.CleanObject();
            cannon_pylon_left.name = "cannon_pylon_left";
            cannon_pylon_left.transform.localPosition = new Vector3(0.00f, 0.44f, 0f);
            cannon_pylon_left.transform.localRotation = Quaternion.Euler(0f, 180f, 180f);

            cannon_left_rotation_point = new GameObject("cannon_left_rotation_point");
            cannon_left_rotation_point.transform.SetParent(cannon_pylon_left.transform, false);
            cannon_left_rotation_point.transform.localPosition = new Vector3(0.00f, 0.98f, 0.00f);
            cannon_left_rotation_point.transform.localRotation = Quaternion.Euler(25f, 180f, 0f);

            GameObject cannon_left = CraftData.InstantiateFromPrefab(TechType.ExosuitTorpedoArmModule);

            cannon_left.transform.SetParent(cannon_left_rotation_point.transform, false);

            Destroy(cannon_left.FindChild("GameObject"));
            cannon_left.transform.Find("model/exosuit_rig_armLeft:exosuit_torpedoLauncher_geo").name = "cannon_model";

            cannon_left.CleanObject();
            cannon_left.name = "cannon_left";
            cannon_left.transform.localPosition = new Vector3(0.00f, 0.14f, -0.66f);
            cannon_left.transform.localRotation = Quaternion.Euler(0f, 270f, 180f);

            SetMeshMaterial(cannon_left.transform.Find("model/cannon_model").gameObject, Main.cannon_material, 1);

            cannon_left_tube_right      = Instantiate(laserBeam, cannon_left.transform, Vector3.zero, Quaternion.identity, false);
            cannon_left_tube_right.name = "cannon_left_tube_right";
            cannon_left_tube_right.transform.localPosition = new Vector3(0.68f, 0.0f, -0.17f);
            cannon_left_tube_right.transform.localRotation = Quaternion.Euler(0f, 90f, 0f);
            left_right = cannon_left_tube_right.GetComponent <LineRenderer>();

            cannon_left_tube_left      = Instantiate(laserBeam, cannon_left.transform, Vector3.zero, Quaternion.identity, false);
            cannon_left_tube_left.name = "cannon_left_tube_left";
            cannon_left_tube_left.transform.localPosition = new Vector3(0.68f, 0.0f, 0.17f);
            cannon_left_tube_left.transform.localRotation = Quaternion.Euler(0f, 90f, 0f);
            left_left = cannon_left_tube_left.GetComponent <LineRenderer>();

            Destroy(laserBeam);
        }
예제 #20
0
    // Token: 0x06000016 RID: 22 RVA: 0x00003018 File Offset: 0x00001218
    public void OnConsoleCommand_waterparkspawn(NotificationCenter.Notification n)
    {
        bool flag = !Player.main.currentWaterPark;

        if (flag)
        {
            ErrorMessage.AddDebug("Not currently inside a waterpark!");
        }
        else
        {
            bool flag2 = n != null && n.data != null && n.data.Count > 0;
            if (flag2)
            {
                string   text = (string)n.data[0];
                TechType techType;
                bool     flag3 = UWE.Utils.TryParseEnum <TechType>(text, out techType);
                if (flag3)
                {
                    bool flag4 = CraftData.IsAllowed(techType);
                    if (flag4)
                    {
                        GameObject prefabForTechType = CraftData.GetPrefabForTechType(techType, true);
                        bool       flag5             = prefabForTechType != null;
                        if (flag5)
                        {
                            bool flag6 = prefabForTechType.GetComponent <Creature>();
                            if (flag6)
                            {
                                int  num = 1;
                                int  num2;
                                bool flag7 = n.data.Count > 1 && int.TryParse((string)n.data[1], out num2);
                                if (flag7)
                                {
                                    num = num2;
                                }
                                bool flag8 = n.data.Count > 2;
                                if (flag8)
                                {
                                    float num3 = float.Parse((string)n.data[2]);
                                }
                                Debug.Log(string.Format("Spawning {0} {1}", num, techType));
                                for (int i = 0; i < num; i++)
                                {
                                    WaterParkCreature.Born(techType, Player.main.currentWaterPark, Player.main.transform.position);
                                }
                            }
                            else
                            {
                                ErrorMessage.AddDebug("Not valid creature!");
                            }
                        }
                        else
                        {
                            ErrorMessage.AddDebug("Could not find prefab for TechType = " + techType);
                        }
                    }
                }
                else
                {
                    ErrorMessage.AddDebug("Could not parse " + text + " as TechType");
                }
            }
        }
    }
예제 #21
0
        public static void playToothSound()
        {
            System.Random random = new System.Random();

            FMODUWE.PlayOneShot(CraftData.GetPrefabForTechType(TechType.Stalker).GetComponent <Stalker>().loseToothSound, new Vector3(Player.main.transform.position.x - random.Next(-8, 8), Player.main.transform.position.y - random.Next(-8, 7), Player.main.transform.position.z - random.Next(-7, 8)), 1f);
        }
 public static void Postfix()
 {
     if (!uGUI_BuilderMenu.IsOpen() && Input.GetMouseButton(2) && !Builder.isPlacing)
     {
         if (Targeting.GetTarget(Player.main.gameObject, 200f, out GameObject result, out _))
         {
             if (Targeting.GetRoot(result, out TechType techType, out GameObject gameObject) && CraftData.IsBuildableTech(techType))
             {
                 if (Builder.Begin(gameObject))
                 {
                     ErrorMessage.AddMessage($"Placing new {techType}");
                 }
                 else
                 {
                     Builder.End();
                 }
             }
         }
     }
 }
예제 #23
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();
#if SUBNAUTICA
                TechData techData = CraftDataHandler.GetTechData(techType);
#elif BELOWZERO
                RecipeData techData = CraftDataHandler.GetRecipeData(techType);
#endif

                if (!GameInput.GetButtonHeld(GameInput.Button.Deconstruct) && techType != TechType.Titanium && techData != null && techData.ingredientCount > 0 && Main.BatteryCheck(item.item))
                {
                    if (CheckRequirements(__instance, item.item, techData))
                    {
                        foreach (Ingredient ingredient in techData.Ingredients)
                        {
                            for (int i = ingredient.amount; i > 0; i--)
                            {
                                GameObject gameObject = CraftData.InstantiateFromPrefab(ingredient.techType, false);
                                gameObject.SetActive(true);
                                Pickupable pickupable = gameObject.GetComponent <Pickupable>();
                                pickupable.Pickup(false);
                                if ((item.item.GetComponent <IBattery>() == null && pickupable.GetComponent <IBattery>() != null && QModServices.Main.ModPresent("NoBattery")) || pickupable.GetComponent <LiveMixin>() != null)
                                {
                                    UnityEngine.Object.Destroy(pickupable.gameObject);
                                }
                                else
                                {
                                    forcePickupItems.Add(pickupable);
                                }
                            }
                        }
                        break;
                    }
                }
                else
                {
                    if (GameInput.GetButtonHeld(GameInput.Button.Deconstruct))
                    {
                        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);
        }
        public override GameObject GetGameObject()
        {
            var glass = GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.Glass));

            return(glass);
        }
예제 #25
0
        public static void Patch()
        {
            bundle = AssetBundle.LoadFromFile(Path.Combine(Environment.CurrentDirectory, "QMods/5H-4RK Submersible/shark"));

            sharkTech = TechTypeHandler.AddTechType("Shark", "5H-4RK Submersible", "An ancient alien vessel designed to mimic local fauna");
            SpriteHandler.RegisterSprite(sharkTech, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/Shark_Icon.png");

            SharkPrefab prefab = new SharkPrefab("Shark", "WorldEntities/Vehicles/Shark", sharkTech);

            PrefabHandler.RegisterPrefab(prefab);

            TechType ingotTech;

            if (!TechTypeHandler.TryGetModdedTechType("PrecursorIngot", out ingotTech))
            {
                throw new Exception("SHARK TRIED LOADING BUT PRECURSOR FABRICATOR NOT FOUND");
            }

            TechData data = new TechData();

            data.craftAmount = 1;
            data.Ingredients = new List <Ingredient>()
            {
                new Ingredient(TechType.AdvancedWiringKit, 1),
                new Ingredient(TechType.Magnetite, 3),
                new Ingredient(TechType.PrecursorKey_Purple, 1),
                new Ingredient(TechType.PrecursorIonCrystal, 1),
                new Ingredient(ingotTech, 3)
            };

            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Constructor, sharkTech, "Vehicles");
            CraftDataHandler.SetTechData(sharkTech, data);
            CraftData.GetCraftTime(TechType.Seamoth, out float time);
            CraftDataHandler.SetCraftingTime(sharkTech, time);

            SpriteHandler.RegisterSprite(SpriteManager.Group.Pings, "SharkPing",
                                         Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/SharkPing_Icon.png");

            HarmonyInstance harm = HarmonyInstance.Create("Kylinator25.SharkSub");

            harm.PatchAll(Assembly.GetExecutingAssembly());

            Shark.laserTechType = TechTypeHandler.AddTechType("SharkLaserCannon", "5H-4RK Ranged Combat Module", "Equips the vessel with mid to long range combat capabilities.");
            CraftDataHandler.SetEquipmentType(Shark.laserTechType, (EquipmentType)sharkTech);
            CraftDataHandler.SetQuickSlotType(Shark.laserTechType, QuickSlotType.Passive);
            PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkLaserCannon", "WorldEntities/Upgrades/SharkLaserCannon", Shark.laserTechType));

            Shark.ramTechType = TechTypeHandler.AddTechType("SharkBatteringRam", "5H-4RK Momentum-Based Combat Module", "Equips the vessel with hardlight blades to lacerate prey at high velocity");
            CraftDataHandler.SetEquipmentType(Shark.ramTechType, (EquipmentType)sharkTech);
            CraftDataHandler.SetQuickSlotType(Shark.ramTechType, QuickSlotType.Passive);
            PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkBatteringRam", "WorldEntities/Upgrades/SharkBatteringRam", Shark.ramTechType));

            Shark.visionTechType = TechTypeHandler.AddTechType("SharkVision", "5H-4RK Precursor Vision Module", "Allows the vessel's pilot to visualise potential targets through obstructive media");
            CraftDataHandler.SetEquipmentType(Shark.visionTechType, (EquipmentType)sharkTech);
            CraftDataHandler.SetQuickSlotType(Shark.visionTechType, QuickSlotType.Selectable);
            SpriteHandler.RegisterSprite(Shark.visionTechType, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/SharkVision_Icon.png");
            PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkVision", "WorldEntities/Upgrades/SharkVision", Shark.visionTechType));

            Shark.shieldTechType = TechTypeHandler.AddTechType("SharkShield", "5H-4RK External Defense Module", "Projects a light energy shield around the submersible, which must recharge once depleted");
            CraftDataHandler.SetEquipmentType(Shark.shieldTechType, (EquipmentType)sharkTech);
            CraftDataHandler.SetQuickSlotType(Shark.shieldTechType, QuickSlotType.Selectable);
            PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkShield", "WorldEntities/Upgrades/SharkShield", Shark.shieldTechType));

            Shark.blinkTechType = TechTypeHandler.AddTechType("SharkBlink", "5H-4RK Warp Evasion Module", "Uses warper technology to rapidly move the submersible in any direction");
            CraftDataHandler.SetEquipmentType(Shark.blinkTechType, (EquipmentType)sharkTech);
            CraftDataHandler.SetQuickSlotType(Shark.blinkTechType, QuickSlotType.Selectable);
            SpriteHandler.RegisterSprite(Shark.blinkTechType, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/SharkBlink_Icon.png");
            PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkBlink", "WorldEntities/Upgrades/SharkBlink", Shark.blinkTechType));

            Shark.drillTechType = TechTypeHandler.AddTechType("SharkDrill", "5H-4RK Resource Acquisition Module", "Uses a steady beam of focused light to collect resources");
            CraftDataHandler.SetEquipmentType(Shark.drillTechType, (EquipmentType)sharkTech);
            CraftDataHandler.SetQuickSlotType(Shark.drillTechType, QuickSlotType.Selectable);
            SpriteHandler.RegisterSprite(Shark.drillTechType, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/SharkDrill_Icon.png");
            PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkDrill", "WorldEntities/Upgrades/SharkDrill", Shark.drillTechType));

            Shark.internalBattery = TechTypeHandler.AddTechType("SharkBattery_Internal", "battery baybee", "you shouldn't be holding this item");
            PrefabHandler.RegisterPrefab(new SharkBatteryPrefab("SharkBattery_Internal", "WorldEntities/Batteris/SharkBattery", Shark.internalBattery));

            Shark.depletedIonCube = TechTypeHandler.AddTechType("IonCubeEmpty", "Depleted Ion Cube", "This Ion Cube has gone dark, depleted of energy");
            SpriteHandler.RegisterSprite(Shark.depletedIonCube, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/DepletedCrystal_Icon.png");
            PrefabHandler.RegisterPrefab(new DepletedCrystalPrefab("IonCubeEmpty", "WorldEntites/Doodads/EmptyIonCube", Shark.depletedIonCube));

            Shark.ionFragment = TechTypeHandler.AddTechType("IonFragment", "Ion Cube Fragment", "A chunk of a depleted ion cube, suitable for advanced electronics fabrication");

            TechData fragmentData = new TechData();

            fragmentData.craftAmount = 3;
            fragmentData.Ingredients = new List <Ingredient>()
            {
                new Ingredient(Shark.depletedIonCube, 1),
            };

            CraftDataHandler.SetTechData(Shark.ionFragment, fragmentData);

            Shark.sharkEngine   = TechTypeHandler.AddTechType("SharkEngine", "5H-4RK Engine", "This converter is specially designed to convert energy from Ion Cubes directly into underwater thrust");
            Shark.sharkComputer = TechTypeHandler.AddTechType("SharkComputer", "5H-4RK Internal Computer Systems", "This alien processor seems to be built to " +
                                                              "manage several submersible-related subroutines");
            Shark.sharkHull = TechTypeHandler.AddTechType("SharkHull", "5H-4RK Hull Plating", "Alien metal that is designed to be very slightly flexible and " +
                                                          "lightweight, to allow for maneuverability while maintaining integrity under extreme pressure");

            seeThroughMat = bundle.LoadAsset <Material>("Assets/Materials/Shark/wallvision.mat");
        }
예제 #26
0
 public static string getPrefabClassId(TechType techType) => CraftData.GetClassIdForTechType(techType);
예제 #27
0
        private Optional <VehicleMovementData> GetVehicleMovement()
        {
            Vehicle vehicle = Player.main.GetVehicle();
            SubRoot sub     = Player.main.GetCurrentSub();

            NitroxId   id;
            Vector3    position;
            Quaternion rotation;
            Vector3    velocity;
            Vector3    angularVelocity;
            TechType   techType;
            float      steeringWheelYaw = 0f, steeringWheelPitch = 0f;
            bool       appliedThrottle  = false;
            Vector3    leftArmPosition  = new Vector3(0, 0, 0);
            Vector3    rightArmPosition = new Vector3(0, 0, 0);

            if (vehicle != null)
            {
                id       = NitroxEntity.GetId(vehicle.gameObject);
                position = vehicle.gameObject.transform.position;
                rotation = vehicle.gameObject.transform.rotation;
                techType = CraftData.GetTechType(vehicle.gameObject);

                Rigidbody rigidbody = vehicle.gameObject.GetComponent <Rigidbody>();

                velocity        = rigidbody.velocity;
                angularVelocity = rigidbody.angularVelocity;

                // Required because vehicle is either a SeaMoth or an Exosuit, both types which can't see the fields either.
                steeringWheelYaw   = vehicle.steeringWheelYaw;
                steeringWheelPitch = vehicle.steeringWheelPitch;

                // Vehicles (or the SeaMoth at least) do not have special throttle animations. Instead, these animations are always playing because the player can't even see them (unlike the cyclops which has cameras).
                // So, we need to hack in and try to figure out when thrust needs to be applied.
                if (vehicle && AvatarInputHandler.main.IsEnabled())
                {
                    if (techType == TechType.Seamoth)
                    {
                        bool flag = vehicle.transform.position.y < Ocean.main.GetOceanLevel() && vehicle.transform.position.y < vehicle.worldForces.waterDepth && !vehicle.precursorOutOfWater;
                        appliedThrottle = flag && GameInput.GetMoveDirection().sqrMagnitude > .1f;
                    }
                    else if (techType == TechType.Exosuit)
                    {
                        Exosuit exosuit = vehicle as Exosuit;
                        if (exosuit)
                        {
                            appliedThrottle = exosuit._jetsActive && exosuit.thrustPower > 0f;

                            Transform leftAim  = exosuit.aimTargetLeft;
                            Transform rightAim = exosuit.aimTargetRight;

                            Vector3 eulerAngles = exosuit.transform.eulerAngles;
                            eulerAngles.x = MainCamera.camera.transform.eulerAngles.x;
                            Quaternion quaternion = Quaternion.Euler(eulerAngles.x, eulerAngles.y, eulerAngles.z);

                            leftArmPosition  = leftAim.transform.position = MainCamera.camera.transform.position + quaternion * Vector3.forward * 100f;
                            rightArmPosition = rightAim.transform.position = MainCamera.camera.transform.position + quaternion * Vector3.forward * 100f;
                        }
                    }
                }
            }
            else if (sub != null && Player.main.isPiloting)
            {
                id       = NitroxEntity.GetId(sub.gameObject);
                position = sub.gameObject.transform.position;
                rotation = sub.gameObject.transform.rotation;
                Rigidbody rigidbody = sub.GetComponent <Rigidbody>();
                velocity        = rigidbody.velocity;
                angularVelocity = rigidbody.angularVelocity;
                techType        = TechType.Cyclops;

                SubControl subControl = sub.GetComponent <SubControl>();
                steeringWheelYaw   = subControl.steeringWheelYaw;
                steeringWheelPitch = subControl.steeringWheelPitch;
                appliedThrottle    = subControl.appliedThrottle && subControl.canAccel;
            }
            else
            {
                return(Optional.Empty);
            }

            VehicleMovementData model = VehicleMovementFactory.GetVehicleMovementData(techType,
                                                                                      id,
                                                                                      position,
                                                                                      rotation,
                                                                                      velocity,
                                                                                      angularVelocity,
                                                                                      steeringWheelYaw,
                                                                                      steeringWheelPitch,
                                                                                      appliedThrottle,
                                                                                      leftArmPosition,
                                                                                      rightArmPosition);

            return(Optional.Of(model));
        }
예제 #28
0
#pragma warning restore CS0618
#endif

        public static CoroutineTask <GameObject> getPrefabAsync(TechType techType)
        {
            $"PrefabUtils: getPrefabAsync(TechType.{techType})".logDbg();
            return(CraftData.GetPrefabForTechTypeAsync(techType));
        }
예제 #29
0
        public static void Postfix(Eatable __instance, ref float __result)
        {
            if (Config.FOOD_OMNIVORE.Equals(DeathRun.config.foodChallenge))
            {
                return;
            }

            TechType t = CraftData.GetTechType(__instance.gameObject);

            if (Config.FOOD_VEGAN.Equals(DeathRun.config.foodChallenge) || Config.FOOD_PESCATARIAN.Equals(DeathRun.config.foodChallenge))
            {
                if (t == TechType.NutrientBlock)
                {
                    __result = -25f;
                    return;
                }

                if (t == TechType.Snack1)
                {
                    __result = -25f;
                    return;
                }

                if (Config.FOOD_PESCATARIAN.Equals(DeathRun.config.foodChallenge))
                {
                    if ((t == TechType.Snack2) || (t == TechType.Snack3))
                    {
                        __result = -25f;
                        return;
                    }
                }
            }

            if ((t == TechType.CookedPeeper) || (t == TechType.Peeper) || (t == TechType.CuredPeeper) ||
                (t == TechType.CookedHoleFish) || (t == TechType.HoleFish) || (t == TechType.CuredHoleFish) ||
                (t == TechType.CookedGarryFish) || (t == TechType.GarryFish) || (t == TechType.CuredGarryFish) ||
                (t == TechType.CookedReginald) || (t == TechType.Reginald) || (t == TechType.CuredReginald) ||
                (t == TechType.CookedBladderfish) || (t == TechType.Bladderfish) || (t == TechType.CuredBladderfish) ||
                (t == TechType.CookedHoverfish) || (t == TechType.Hoverfish) || (t == TechType.CuredHoverfish) ||
                (t == TechType.CookedSpadefish) || (t == TechType.Spadefish) || (t == TechType.CuredSpadefish) ||
                (t == TechType.CookedBoomerang) || (t == TechType.Boomerang) || (t == TechType.CuredBoomerang) ||
                (t == TechType.CookedLavaBoomerang) || (t == TechType.LavaBoomerang) || (t == TechType.CuredLavaBoomerang) ||
                (t == TechType.CookedEyeye) || (t == TechType.Eyeye) || (t == TechType.CuredEyeye) ||
                (t == TechType.CookedLavaEyeye) || (t == TechType.LavaEyeye) || (t == TechType.CuredLavaEyeye) ||
                (t == TechType.CookedOculus) || (t == TechType.Oculus) || (t == TechType.CuredOculus) ||
                (t == TechType.CookedHoopfish) || (t == TechType.Hoopfish) || (t == TechType.CuredHoopfish) ||
                (t == TechType.CookedSpinefish) || (t == TechType.Spinefish) || (t == TechType.CuredSpinefish))
            {
                if (!Config.FOOD_PESCATARIAN.Equals(DeathRun.config.foodChallenge))
                {
                    __result = -25f;
                }
            }
            else
            {
                if (Config.FOOD_PESCATARIAN.Equals(DeathRun.config.foodChallenge) && (__result > 0))
                {
                    __result = -25f;
                }
            }
        }
예제 #30
0
        public override GameObject GetGameObject()
        {
            var prefab = CraftData.GetPrefabForTechType(TechType.ReinforcedGloves);

            return(ModifyAndInstantiateGameObject(prefab));
        }