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