Esempio n. 1
0
        internal static Pickupable ToPickable(this ObjectDataTransferData itemData, TechType techType)
        {
            var pickup = CheckIfEggAnExtractPickable(techType);

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

                    if (data != null)
                    {
                        DetectDataObjectTypeAndPerformConversion(data, pickup);
                    }
                }
                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);
                }
            }

            return(pickup);
        }
Esempio n. 2
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);
        }
Esempio n. 3
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);
        }