internal void AttemptToTakeItem(TechType techType)
        {
            var amount = _container.container.GetCount(techType);

            QuickLogger.Debug($"Container returned {amount} item/s for TechType {techType}");
#if SUBNAUTICA
            var itemSize = CraftData.GetItemSize(techType);
#elif BELOWZERO
            var itemSize = TechData.GetItemSize(techType);
#endif
            if (Inventory.main.HasRoomFor(itemSize.x, itemSize.y))
            {
                if (amount > 0)
                {
                    QuickLogger.Debug($"Attempting to take {_multiplier} item/s");

                    for (int i = 0; i < _multiplier; i++)
                    {
                        Pickupable pickup = _container.container.RemoveItem(techType);

                        if (pickup == null)
                        {
                            QuickLogger.Debug($"There are 0 {techType} in the container while using first or default Current Amount of {techType} is: {_container.container.GetCount(techType)}", true);
                            return;
                        }

                        Inventory.main.Pickup(pickup);
                    }
                }
                else
                {
                    QuickLogger.Debug($"There are 0 {techType} in the container.", true);
                }
            }
        }
Example #2
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);
            }
        }
Example #3
0
        public static int getItemSize(TechType techType)
        {
#if GAME_SN
            var size = CraftData.GetItemSize(techType);
#elif GAME_BZ
            var size = TechData.GetItemSize(techType);
#endif
            return(size.x * size.y);
        }
        public static string Getfullstate(StorageContainer _storageContainer)
        {
            Logger.Log(Logger.Level.Debug, "call Getfullstate");

            var items      = _storageContainer.container.GetItemTypes();
            int itemscount = _storageContainer.container.count;

            Logger.Log(Logger.Level.Debug, $"Itemcount all Items = {itemscount.ToString()}");
            int origSize = _storageContainer.container.sizeX * _storageContainer.container.sizeY;

            Logger.Log(Logger.Level.Debug, $"Original Max Size = {origSize.ToString()}");
            int usedSize = 0;

            foreach (var i in items)
            {
                var size = TechData.GetItemSize(i);
                int numberofsingletechtype = (_storageContainer.container.GetItems(i)).Count;
                Logger.Log(Logger.Level.Debug, $"Techtype = {i.ToString()}");
                Logger.Log(Logger.Level.Debug, $"Number of items in this Techtype = {numberofsingletechtype.ToString()}");
                usedSize += size.x * size.y * numberofsingletechtype;
                Logger.Log(Logger.Level.Debug, $"Used Space of this Techtype = {(size.x * size.y * numberofsingletechtype).ToString()}");
            }
            var sizeLeft = origSize - usedSize;

            Logger.Log(Logger.Level.Debug, $"Used Space off all Techtypes = {usedSize.ToString()}");

            StringBuilder stringBuilder = new StringBuilder();

            if (!_storageContainer.container.HasRoomFor(1, 1))
            {
                Logger.Log(Logger.Level.Debug, "Container is Full - way");
                stringBuilder.AppendLine("Full - " + itemscount + " Items stored");
                stringBuilder.AppendLine($"{sizeLeft} of {origSize} free");
            }
            else if (_storageContainer.IsEmpty())
            {
                Logger.Log(Logger.Level.Debug, "Container is empty - way");
                stringBuilder.AppendLine("Empty");
                stringBuilder.AppendLine($"{sizeLeft} of {origSize} free");
            }
            else
            {
                Logger.Log(Logger.Level.Debug, "Container Contains X Item - way");
                stringBuilder.AppendLine(itemscount + " Items - " + usedSize + " used");
                stringBuilder.AppendLine($"{sizeLeft} of {origSize} free");
            }
            return(stringBuilder.ToString());
        }
        internal int GetUsedSpace()
        {
            var items  = _container.ToList();
            int amount = 0;

            foreach (InventoryItem item in items)
            {
#if SUBNAUTICA
                var itemSize = CraftData.GetItemSize(item.item.GetTechType());
#elif BELOWZERO
                var itemSize = TechData.GetItemSize(item.item.GetTechType());
#endif
                amount += itemSize.x * itemSize.y;
            }

            return(amount);
        }
Example #6
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);
        }
Example #7
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();
            }
        }
Example #8
0
        internal void AttemptToTakeItem(TechType techType)
        {
            var amount = GetItemCount(techType);

            QuickLogger.Debug($"Container returned {amount} item/s for TechType {techType}");
#if SUBNAUTICA
            var itemSize = CraftData.GetItemSize(techType);
#elif BELOWZERO
            var itemSize = TechData.GetItemSize(techType);
#endif
            if (Inventory.main.HasRoomFor(itemSize.x, itemSize.y))
            {
                if (amount > 0)
                {
                    QuickLogger.Debug($"Attempting to take {_multiplier} item/s");

                    for (int i = 0; i < _multiplier; i++)
                    {
                        var        itemData = ContainerItems.FirstOrDefault(x => x.TechType == techType);
                        Pickupable pickup   = InventoryHelpers.ConvertToPickupable(itemData);

                        if (pickup == null)
                        {
                            QuickLogger.Debug($"There are 0 {techType} in the container while using first or default Current Amount of {techType} is: {GetItemCount(techType)}", true);
                            return;
                        }

                        Inventory.main.Pickup(pickup);
                        ContainerItems.Remove(itemData);
                        //OnContainerUpdate?.Invoke(GetTotalCount(),_maxItems);
                    }
                }
                else
                {
                    QuickLogger.Debug($"There are 0 {techType} in the container.", true);
                }
            }
        }
Example #9
0
        public static bool TryOverflowIntoBioreactors(SubRoot subRoot, TechType fishType, ref int breedCount)
        {
            var bioReactors = subRoot != null?subRoot.gameObject.GetComponentsInChildren <BaseBioReactor>() ?? new BaseBioReactor[0] : new BaseBioReactor[0];

            if (bioReactors.Length == 0)
            {
                return(breedCount > 0);
            }

            var sizePerFish =
#if SN1
                CraftData.GetItemSize(fishType);
#else
                TechData.GetItemSize(fishType);
#endif
            var failCount = 0;
            while (failCount < bioReactors.Length && breedCount > 0)
            {
                foreach (var reactor in bioReactors)
                {
                    if (breedCount > 0 && reactor.container.HasRoomFor(sizePerFish.x, sizePerFish.y))
                    {
                        CoroutineHost.StartCoroutine(AddToReactor(subRoot, fishType, sizePerFish, reactor));
                        breedCount--;
                    }
                    else
                    {
                        failCount++;
                    }
                }
                if (failCount < bioReactors.Length)
                {
                    failCount = 0;
                }
            }
            return(breedCount > 0);
        }
Example #10
0
        public static bool Prefix(Constructable __instance)
        {
#endif
            if (Player.main.GetVehicle() != null && GameModeUtils.RequiresIngredients())
            {
                Vehicle thisVehicle = Player.main.GetVehicle();
                if (__instance._constructed)
                {
                    return(true);
                }
                int count = __instance.resourceMap.Count;

                int   resourceID = __instance.GetResourceID();
                float backupConstructedAmount = __instance.constructedAmount;
                __instance.constructedAmount -= Time.deltaTime / (count * Constructable.GetConstructInterval());
                __instance.constructedAmount  = Mathf.Clamp01(__instance.constructedAmount);
                int resourceID2 = __instance.GetResourceID();
                if (resourceID2 != resourceID)
                {
                    TechType techType = __instance.resourceMap[resourceID2];

                    Vector2int size =
#if SN1
                        CraftData.GetItemSize(techType);
#elif BZ
                        TechData.GetItemSize(techType);
#endif

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

                        if (storageContainer.container.HasRoomFor(size.x, size.y))
                        {
                            CoroutineHost.StartCoroutine(AddToVehicle(techType, storageContainer.container));
                        }
                        else
                        {
                            __instance.constructedAmount = backupConstructedAmount;
                            return(true);
                        }
                    }
#if SN1
                    else
                    {
                        SeaMoth 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(size.x, size.y))
                                {
                                    CoroutineHost.StartCoroutine(AddToVehicle(techType, storage));
                                    storageCheck = true;
                                    break;
                                }
                            }
                            catch (Exception)
                            {
                                continue;
                            }
                        }
                        if (!storageCheck)
                        {
                            __instance.constructedAmount = backupConstructedAmount;
                            return(true);
                        }
                    }
#endif
                }
                __instance.UpdateMaterial();
#if SUBNAUTICA_EXP || BZ
                result.Set(__instance.constructedAmount <= 0f);
                return(false);
#elif SUBNAUTICA_STABLE
                return(__instance.constructedAmount <= 0f);
#endif
            }
            return(true);
        }
Example #11
0
        public static bool Prefix(Constructable __instance)
        {
#endif
            var player = Player.main;
            if (player.isPiloting && GameModeUtils.RequiresIngredients())
            {
                if (__instance._constructed)
                {
                    return(true);
                }
#if BZ
                if (player.GetComponentInParent <Hoverbike>() is not null)
                {
                    return(true);
                }
#endif
                var count = __instance.resourceMap.Count;

                var resourceID = __instance.GetResourceID();
                var backupConstructedAmount = __instance.constructedAmount;
                __instance.constructedAmount -= Time.deltaTime / (count * Constructable.GetConstructInterval());
                __instance.constructedAmount  = Mathf.Clamp01(__instance.constructedAmount);
                var resourceID2 = __instance.GetResourceID();
                if (resourceID2 != resourceID)
                {
                    var techType = __instance.resourceMap[resourceID2];

                    var size =
#if SN1
                        CraftData.GetItemSize(techType);
#elif BZ
                        TechData.GetItemSize(techType);
#endif

                    var storageCheck = false;
                    var thisVehicle  = Player.main.GetVehicle();
                    if (thisVehicle != null)
                    {
                        switch (thisVehicle)
                        {
                        case Exosuit exosuit:
                        {
                            var storageContainer = exosuit.storageContainer;

                            if (storageContainer.container.HasRoomFor(size.x, size.y))
                            {
                                CoroutineHost.StartCoroutine(AddToVehicle(techType, storageContainer.container));
                                storageCheck = true;
                            }
                            break;
                        }

                        case SeaMoth seaMoth:
                        {
                            for (var i = 0; i < 12; i++)
                            {
                                try
                                {
                                    var storage = seaMoth.GetStorageInSlot(i, TechType.VehicleStorageModule);
                                    if (storage == null || !storage.HasRoomFor(size.x, size.y))
                                    {
                                        continue;
                                    }
                                    CoroutineHost.StartCoroutine(AddToVehicle(techType, storage));
                                    storageCheck = true;
                                    break;
                                }
                                catch
                                {
                                    // ignored
                                }
                            }

                            break;
                        }
                        }
                    }
#if BZ
                    var seaTruck = player.GetComponentInParent <SeaTruckUpgrades>();
                    if (seaTruck != null)
                    {
                        foreach (var storageContainer in seaTruck.GetComponentsInChildren <StorageContainer>() ?? new StorageContainer[0])
                        {
                            try
                            {
                                var storage = storageContainer.container;
                                if (storage == null || !storage.HasRoomFor(size.x, size.y))
                                {
                                    continue;
                                }
                                CoroutineHost.StartCoroutine(AddToVehicle(techType, storage));
                                storageCheck = true;
                                break;
                            }
                            catch
                            {
                                // ignored
                            }
                        }
                    }
#endif

                    if (!storageCheck)
                    {
                        __instance.constructedAmount = backupConstructedAmount;
                        return(true);
                    }
                }
                __instance.UpdateMaterial();
#if SUBNAUTICA_EXP || BZ
                result.Set(__instance.constructedAmount <= 0f);
                return(false);
#elif SUBNAUTICA_STABLE
                return(__instance.constructedAmount <= 0f);
#endif
            }
            return(true);
        }
Example #12
0
        internal static bool GivePlayerItem(TechType techType, ObjectDataTransferData itemData,
                                            Func <ObjectData, RackSlot> getServerWithObjectData)
        {
            QuickLogger.Debug($"Give Player Item: {techType}", true);

            bool isSuccessful = false;

#if SUBNAUTICA
            var itemSize = CraftData.GetItemSize(techType);
#elif BELOWZERO
            var itemSize = TechData.GetItemSize(techType);
#endif
            if (Inventory.main.HasRoomFor(itemSize.x, itemSize.y))
            {
                //TODO handle null playerToolData
                if (itemData.Vehicle == null)
                {
                    var pickup = CheckIfEggAnExtractPickable(techType);

                    if (!itemData.IsServer)
                    {
                        var data = (ObjectData)itemData.data;

                        if (data != null)
                        {
                            DetectDataObjectTypeAndPerformConversion(data, pickup);

                            var result = getServerWithObjectData?.Invoke(data);
                            result?.Remove(data);
                            isSuccessful = true;
                        }
                    }
                    else
                    {
                        var data       = (HashSet <ObjectData>)itemData.data;
                        var controller = pickup.gameObject.GetComponent <DSSServerController>();
                        controller.Initialize();
                        controller.FCSFilteredStorage.Items   = new HashSet <ObjectData>(data);
                        controller.FCSFilteredStorage.Filters = new List <Filter>(itemData.Filters);
                        controller.DisplayManager.UpdateDisplay();
                        isSuccessful = true;
                    }

                    Inventory.main.Pickup(pickup);
                }
                else if (itemData.Vehicle != null)
                {
                    QuickLogger.Debug("Is Vehicle Item");

                    var vehicleContainers = itemData.Vehicle.gameObject.GetComponentsInChildren <StorageContainer>()
                                            .Select((x) => x.container).ToList();
                    vehicleContainers.AddRange(GetSeamothStorage(itemData.Vehicle));

                    for (var index = 0; index < vehicleContainers.Count; index++)
                    {
                        for (var i = 0; i < vehicleContainers[index].ToList().Count; i++)
                        {
                            var item = vehicleContainers[index].ToList()[i];

                            if (item.item.GetTechType() == techType)
                            {
                                var passedItem = vehicleContainers[index].RemoveItem(item.item);
                                if (passedItem)
                                {
                                    if (Inventory.main.Pickup(item.item))
                                    {
                                        CrafterLogic.NotifyCraftEnd(Player.main.gameObject, item.item.GetTechType());

                                        goto _end;
                                    }
                                }
                            }
                        }
                    }

_end:
                    isSuccessful = true;
                }
            }

            Mod.OnBaseUpdate?.Invoke();
            return(isSuccessful);
        }
Example #13
0
        internal static bool GivePlayerItem(TechType techType, ObjectDataTransferData itemData,
                                            Func <ObjectData, RackSlot> getServerWithObjectData)
        {
            QuickLogger.Debug($"Give Player Item: {techType}", true);

            bool isSuccessful = false;

#if SUBNAUTICA
            var itemSize = CraftData.GetItemSize(techType);
#elif BELOWZERO
            var itemSize = TechData.GetItemSize(techType);
#endif
            if (Inventory.main.HasRoomFor(itemSize.x, itemSize.y))
            {
                //TODO handle null playerToolData
                Pickupable pickup;
                if (itemData.Vehicle == null)
                {
                    if (EggHandler.GetDiscoveredEgg(techType, out TechType value))
                    {
                        pickup = CraftData.InstantiateFromPrefab(value).EnsureComponent <Pickupable>();
                    }
                    else
                    {
                        pickup = CraftData.InstantiateFromPrefab(techType).EnsureComponent <Pickupable>();
                    }
                    if (!itemData.IsServer)
                    {
                        var data = (ObjectData)itemData.data;

                        if (data != null)
                        {
                            switch (data.DataObjectType)
                            {
                            case SaveDataObjectType.PlayerTool:

                                if (data.PlayToolData.HasBattery)
                                {
                                    var batteryTechType = data.PlayToolData.BatteryInfo.TechType;
                                    var tempBattery     = CraftData.GetPrefabForTechType(batteryTechType);
                                    var capacity        = tempBattery?.gameObject.GetComponent <IBattery>()?.capacity;

                                    if (data.PlayToolData.HasBattery && capacity != null && capacity > 0)
                                    {
                                        var energyMixin      = pickup.gameObject.GetComponent <EnergyMixin>();
                                        var normalizedCharge = data.PlayToolData.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(data.PlayToolData.BatteryInfo.TechType,
                                                               (float)normalizedCharge);
                                        QuickLogger.Info(
                                            $"Gave Player Player tool {data.PlayToolData.TechType} with battery {batteryTechType}");
                                    }
                                    else
                                    {
                                        QuickLogger.Error <DSSServerController>(
                                            "While trying to get the batter capacity of the battery it returned null or 0.");
                                    }
                                }

                                break;



                            case SaveDataObjectType.Eatable:
                                //We are not handling decaying items so I dont need to set anything
                                break;

                            case SaveDataObjectType.Server:
                                var server = pickup.gameObject.GetComponent <DSSServerController>();
                                server.FCSFilteredStorage.Items = new HashSet <ObjectData>(data.ServerData);
                                server.Initialize();
                                server.DisplayManager.UpdateDisplay();
                                break;

                            case SaveDataObjectType.Battery:
                                var battery = pickup.gameObject.GetComponent <Battery>();
                                battery.charge = data.PlayToolData.BatteryInfo.BatteryCharge;
                                break;
                            }
                        }

                        var result = getServerWithObjectData?.Invoke(data);
                        result?.Remove(data);
                        isSuccessful = true;
                    }
                    else
                    {
                        var data       = (HashSet <ObjectData>)itemData.data;
                        var controller = pickup.gameObject.GetComponent <DSSServerController>();
                        controller.Initialize();
                        controller.FCSFilteredStorage.Items   = new HashSet <ObjectData>(data);
                        controller.FCSFilteredStorage.Filters = new List <Filter>(itemData.Filters);
                        controller.DisplayManager.UpdateDisplay();
                        isSuccessful = true;
                    }

                    Inventory.main.Pickup(pickup);
                }
                else if (itemData.Vehicle != null)
                {
                    QuickLogger.Debug("Is Vehicle Item");

                    var vehicleContainers = itemData.Vehicle.gameObject.GetComponentsInChildren <StorageContainer>()
                                            .Select((x) => x.container).ToList();
                    vehicleContainers.AddRange(GetSeamothStorage(itemData.Vehicle));

                    for (var index = 0; index < vehicleContainers.Count; index++)
                    {
                        for (var i = 0; i < vehicleContainers[index].ToList().Count; i++)
                        {
                            var item = vehicleContainers[index].ToList()[i];

                            if (item.item.GetTechType() == techType)
                            {
                                var passedItem = vehicleContainers[index].RemoveItem(item.item);
                                if (passedItem)
                                {
                                    if (Inventory.main.Pickup(item.item))
                                    {
                                        CrafterLogic.NotifyCraftEnd(Player.main.gameObject, item.item.GetTechType());

                                        goto _end;
                                    }
                                }
                            }
                        }
                    }

_end:
                    isSuccessful = true;
                }
            }

            Mod.OnBaseUpdate?.Invoke();
            return(isSuccessful);
        }