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); }
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); }
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); }