// On load public void OnProtoDeserializeObjectTree(ProtobufSerializer _) { if (SaveData.Load()) { foreach (string slot in SlotNames) { Armour.AddSlot(slot); TechType slotItem = (TechType)SaveData.Data.GetOrDefault(slot, (int)TechType.None); if (slotItem == TechType.None) { continue; } //Pickupable itemPickup = new Pickupable(); //itemPickup.SetTechTypeOverride(slotItem); //InventoryItem item = new InventoryItem(itemPickup); GameObject itemObject = CraftData.InstantiateFromPrefab(slotItem); Pickupable itemPickupable = itemObject.GetComponent <Pickupable>(); InventoryItem item = new InventoryItem(itemPickupable); Armour.AddItem(slot, item, true); typeof(Pickupable).GetMethod("Deactivate", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(itemPickupable, null); } } else { SetSlots(); } Logger.Log($"Successfully loaded items for {ID}"); }
protected IEnumerator AddInventoryAsync(TechType techType, IOut <GameObject> result = null) { #if SUBNAUTICA_STABLE GameObject go = CraftData.InstantiateFromPrefab(techType, false); #elif BELOWZERO TaskResult <GameObject> instResult = new TaskResult <GameObject>(); yield return(CraftData.InstantiateFromPrefabAsync(techType, instResult, false)); GameObject go = instResult.Get(); #endif Pickupable component = go?.GetComponent <Pickupable>(); if (component != null) { Inventory.main.ForcePickup(component); } else { Log.LogError($"DiverPerimeterDefenceBehaviour.AddInventoryAsync(): Failed to instantiate inventory item for TechType {techType.AsString()}"); } if (result != null) { result.Set(go); } yield break; }
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 IEnumerator AddLifepodInventory(StorageContainer container, List <TechType> newTechTypes) { if (!Main.config.useDropPodInventory) { yield break; } if (AlreadyInitialised()) { yield break; } foreach (TechType tt in newTechTypes) { Log.LogDebug($"Adding item {tt.AsString()} to drop pod locker"); #if SUBNAUTICA_STABLE GameObject go = CraftData.InstantiateFromPrefab(tt); InventoryItem inventoryItem2 = new InventoryItem(go.GetComponent <Pickupable>()); #elif BELOWZERO TaskResult <GameObject> result = new TaskResult <GameObject>(); yield return(CraftData.InstantiateFromPrefabAsync(tt, result, false)); InventoryItem inventoryItem2 = new InventoryItem(result.Get().GetComponent <Pickupable>()); #endif inventoryItem2.item.Initialize(); container.container.UnsafeAdd(inventoryItem2); } yield break; }
public void OnHandClick(GUIHand hand) { EnergyMixin mixin = shark.energyInterface.sources[0]; if (mixin.HasItem() && mixin.charge == 0f) { InventoryItem item = mixin.batterySlot.storedItem; mixin.batterySlot.RemoveItem(); Destroy(item.item.gameObject); Pickupable ionCube = CraftData.InstantiateFromPrefab(Shark.depletedIonCube).GetComponent <Pickupable>(); ionCube.transform.position = transform.position + transform.up; if (Player.main.HasInventoryRoom(ionCube)) { Inventory.main.Pickup(ionCube); } } if (!mixin.HasItem()) { if (Inventory.main.GetPickupCount(TechType.PrecursorIonCrystal) >= 1) { Inventory.main.container.RemoveItem(TechType.PrecursorIonCrystal); Pickupable battery = CraftData.InstantiateFromPrefab(Shark.internalBattery).GetComponent <Pickupable>(); InventoryItem item = mixin.batterySlot.AddItem(battery); mixin.NotifyHasBattery(item); } } }
public static void randomItem() { System.Random random = new System.Random(); TechType[] resources = { TechType.AcidMushroom, TechType.SeaTreaderPoop, TechType.BloodOil, TechType.CoralChunk, TechType.CrashPowder, TechType.Copper, TechType.CreepvinePiece, TechType.CreepvineSeedCluster, TechType.Sulphur, TechType.WhiteMushroom, TechType.Diamond, TechType.TreeMushroomPiece, TechType.GasPod, TechType.JellyPlant, TechType.Gold, TechType.Kyanite, TechType.Lead, TechType.Lithium, TechType.Magnetite, TechType.ScrapMetal, TechType.Nickel, TechType.PinkMushroom, TechType.Quartz, TechType.AluminumOxide, TechType.Salt, TechType.Silver, TechType.SmallMelon, TechType.PurpleRattle, TechType.StalkerTooth, TechType.JeweledDiskPiece, TechType.Titanium, TechType.UraniniteCrystal }; var pickupable = CraftData.InstantiateFromPrefab(resources[random.Next(resources.Length)]).GetComponent <Pickupable>(); if (pickupable != null) { Inventory.main.ForcePickup(pickupable); } }
public static void Prefix(Vehicle __instance) { List <InventoryItem> equipment = __instance.modules?.equipment?.Values?.Where((e) => e != null).ToList() ?? new List <InventoryItem>(); foreach (InventoryItem item in equipment) { GameObject gameObject = CraftData.InstantiateFromPrefab(item.item.GetTechType()); Vector3 position = __instance.gameObject.transform.position; gameObject.transform.position = new Vector3(position.x + UnityEngine.Random.Range(-3, 3), position.y + UnityEngine.Random.Range(5, 8), position.z + UnityEngine.Random.Range(-3, 3)); gameObject.SetActive(true); } }
private void SpawnEntity(Entity entity) { if (entity.TechType != TechType.None) { GameObject gameObject = CraftData.InstantiateFromPrefab(entity.TechType); gameObject.transform.position = entity.Position; GuidHelper.SetNewGuid(gameObject, entity.Guid); gameObject.SetActive(true); Log.Debug("Received cell entity: " + entity.Guid + " at " + entity.Position + " of type " + entity.TechType); } alreadySpawnedGuids.Add(entity.Guid); }
public override GameObject GetGameObject() { GameObjectClone = CraftData.InstantiateFromPrefab(FragmentTemplate); ResourceTracker resourceTracker = GameObjectClone.GetComponent <ResourceTracker>(); resourceTracker.overrideTechType = TechType.Fragment; //GameObjectClone.EnsureComponent<FragmentTracker>(); ModifyGameObject(); return(GameObjectClone); }
private void AddStartingItemsToPlayer(bool firstTimeConnecting) { if (firstTimeConnecting) { foreach (TechType techType in LootSpawner.main.GetEscapePodStorageTechTypes()) { GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false); Pickupable pickupable = gameObject.GetComponent <Pickupable>(); pickupable = pickupable.Initialize(); itemContainers.AddItem(pickupable.gameObject, NitroxEntity.GetId(Player.main.transform.gameObject)); itemContainers.BroadcastItemAdd(pickupable, Inventory.main.container.tr); } } }
public static bool OnConsoleCommand_item_Prefix(NotificationCenter.Notification n) { if (n != null && n.data != null && n.data.Count > 0) { string text = (string)n.data[0]; if (UWE.Utils.TryParseEnum <TechType>(text, out TechType techType) && techType != TechType.None) { if (CraftData.IsAllowed(techType)) { foreach (IDecorationItem item in DecorationsMod.DecorationItems) { // If item being spawned is one of our decoration items. if (techType == item.TechType) { // If item being spawned is one of our new flora. if (!string.IsNullOrEmpty(item.ClassID) && CustomFlora.AllPlants.Contains(item.ClassID)) { int num = 1; if (n.data.Count > 1 && int.TryParse((string)n.data[1], out int num2)) { num = num2; } for (int i = 0; i < num; i++) { GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false); if (gameObject != null) { gameObject.transform.position = MainCamera.camera.transform.position + MainCamera.camera.transform.forward * 3f; CrafterLogic.NotifyCraftEnd(gameObject, techType); Pickupable component = gameObject.GetComponent <Pickupable>(); if (component != null && !Inventory.main.Pickup(component, false)) { ErrorMessage.AddError(Language.main.Get("InventoryFull")); // Hide plant, show seed and enable pickupable PrefabsHelper.HidePlantAndShowSeed(gameObject.transform, item.ClassID); } } } // Dont call original function if item being spawned is one of our new flora. return(false); } break; } } } } } // Give back execution to original function. return(true); }
private static Pickupable CheckIfEggAnExtractPickable(TechType techType) { Pickupable pickup; if (EggHandler.GetDiscoveredEgg(techType, out TechType value)) { pickup = CraftData.InstantiateFromPrefab(value).EnsureComponent <Pickupable>(); } else { pickup = CraftData.InstantiateFromPrefab(techType).EnsureComponent <Pickupable>(); } return(pickup); }
private void GiveReward(TechType techType) { GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false); if (gameObject != null) { gameObject.transform.position = MainCamera.camera.transform.position + MainCamera.camera.transform.forward * 2f; CrafterLogic.NotifyCraftEnd(gameObject, techType); Pickupable component = gameObject.GetComponent <Pickupable>(); if (component != null && !Inventory.main.Pickup(component, false)) { ErrorMessage.AddError(Language.main.Get("InventoryFull")); } } }
public static void Postfix(WaterPark __instance, WaterParkCreature creature) { if (!__instance.items.Contains(creature) || __instance.HasFreeSpace()) { return; } List <BaseBioReactor> baseBioReactors = __instance.gameObject.GetComponentInParent <SubRoot>().gameObject.GetComponentsInChildren <BaseBioReactor>().ToList(); bool hasBred = false; foreach (WaterParkItem waterParkItem in __instance.items) { WaterParkCreature parkCreature = waterParkItem as WaterParkCreature; if (parkCreature != null && parkCreature != creature && parkCreature.GetCanBreed() && parkCreature.pickupable.GetTechType() == creature.pickupable.GetTechType() && !parkCreature.pickupable.GetTechType().ToString().Contains("Egg")) { foreach (BaseBioReactor baseBioReactor in baseBioReactors) { if (baseBioReactor.container.HasRoomFor(parkCreature.pickupable)) { creature.ResetBreedTime(); parkCreature.ResetBreedTime(); GameObject gameObject = CraftData.InstantiateFromPrefab(CraftData.GetTechType(parkCreature.data.eggOrChildPrefab), false); gameObject.SetActive(false); baseBioReactor.container.AddItem(gameObject.EnsureComponent <Pickupable>()); hasBred = true; break; } } if (!hasBred && Config.OverFlowIntoOcean && parkCreature.data.isPickupableOutside) { creature.ResetBreedTime(); parkCreature.ResetBreedTime(); if (count > Config.WaterParkSize) { GameObject gameObject = CraftData.InstantiateFromPrefab(CraftData.GetTechType(parkCreature.gameObject), false); gameObject.transform.position = __instance.gameObject.GetComponentInParent <SubRoot>().transform.position + new Vector3(Random.Range(-30, 30), Random.Range(-2, 30), Random.Range(-30, 30)); gameObject.SetActive(true); count = 0; } else { count++; } } break; } } }
public static void Prefix(SeaTruckSegment __instance) { //ErrorMessage.AddMessage($"{__instance} {__instance.GetInstanceID()}"); if (__instance.IsFront() && __instance != lastDestroyed) { lastDestroyed = __instance; List <InventoryItem> equipment = __instance.motor?.upgrades?.modules?.equipment.Values?.Where((e) => e != null).ToList() ?? new List <InventoryItem>(); foreach (InventoryItem item in equipment) { GameObject gameObject = CraftData.InstantiateFromPrefab(item.item.GetTechType()); Vector3 position = __instance.gameObject.transform.position; gameObject.transform.position = new Vector3(position.x + UnityEngine.Random.Range(-3, 3), position.y + UnityEngine.Random.Range(5, 8), position.z + UnityEngine.Random.Range(-3, 3)); gameObject.SetActive(true); } } }
private static void CreatureStart_Postfix(Creature __instance) { if (usedCreatures.Contains(__instance) || FishHandler.fishTechTypes.Count == 0) { return; } TechTag tag = __instance.GetComponent <TechTag>(); if (tag && FishHandler.fishTechTypes.Contains(tag.type)) { return; } if (Random.value < 0.1f) { int randomIndex = Random.Range(0, FishHandler.fishTechTypes.Count); TechType randomFish = FishHandler.fishTechTypes[randomIndex]; #if SUBNAUTICA_EXP GameObject fish = null; #else GameObject fish = CraftData.InstantiateFromPrefab(randomFish); #endif // Deletes the fish if it is a ground creature spawned in water if (fish.GetComponent <WalkOnGround>() && !__instance.GetComponent <WalkOnGround>()) { GameObject.Destroy(fish); return; } // Deletes the fish if it is a water creature spawned on ground if (!fish.GetComponent <WalkOnGround>() && __instance.GetComponent <WalkOnGround>()) { GameObject.Destroy(fish); return; } fish.transform.position = __instance.transform.position; usedCreatures.Add(__instance); } }
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); }
public override void Awake() { GameObject pseudoStorage = new GameObject("PseudoStorage"); pseudoStorage.transform.SetParent(transform); height = 6; width = 8; storageLabel = "MP3 PLAYER"; storageRoot = pseudoStorage.AddComponent <ChildObjectIdentifier>(); base.Awake(); container.containerType = (ItemsContainerType)581; container.Clear(); Pickupable _1_Previous = CraftData.InstantiateFromPrefab(ControlItems._1_Previous).GetComponentInChildren <Pickupable>(); Pickupable _2_1_Play = CraftData.InstantiateFromPrefab(ControlItems._2_1_Play).GetComponentInChildren <Pickupable>(); Pickupable _3_Next = CraftData.InstantiateFromPrefab(ControlItems._3_Next).GetComponentInChildren <Pickupable>(); Pickupable _4_1_EnableRepeat = CraftData.InstantiateFromPrefab(ControlItems._4_1_EnableRepeat).GetComponentInChildren <Pickupable>(); Pickupable _5_1_EnableShuffle = CraftData.InstantiateFromPrefab(ControlItems._5_1_EnableShuffle).GetComponentInChildren <Pickupable>(); Pickupable _6_ExitInterface = CraftData.InstantiateFromPrefab(ControlItems._6_ExitInterface).GetComponentInChildren <Pickupable>(); ControlItems.CorrespondingAudioPlayers.Add(_1_Previous, player); ControlItems.CorrespondingAudioPlayers.Add(_2_1_Play, player); ControlItems.CorrespondingAudioPlayers.Add(_3_Next, player); ControlItems.CorrespondingAudioPlayers.Add(_4_1_EnableRepeat, player); ControlItems.CorrespondingAudioPlayers.Add(_5_1_EnableShuffle, player); ControlItems.CorrespondingAudioPlayers.Add(_6_ExitInterface, player); container.AddItem(_1_Previous); container.AddItem(_2_1_Play); container.AddItem(_3_Next); container.AddItem(_4_1_EnableRepeat); container.AddItem(_5_1_EnableShuffle); container.AddItem(_6_ExitInterface); container.isAllowedToAdd = new IsAllowedToAdd((p, b) => false); container.isAllowedToRemove = new IsAllowedToRemove((p, b) => false); }
public static void Postfix(Creature __instance) { if (usedCreatures.Contains(__instance) || fishTechTypes.Count == 0) { return; } TechTag tag = __instance.GetComponent <TechTag>(); if (tag) { if (fishTechTypes.Contains(tag.type)) { return; } } if (Random.value < 0.1f) { Console.WriteLine($"[FishFramework] Selecting fish out of {fishTechTypes.Count} total types"); int randomIndex = Random.Range(0, fishTechTypes.Count); TechType randomFish = fishTechTypes[randomIndex]; GameObject fish = CraftData.InstantiateFromPrefab(randomFish); // Deletes the fish if it is a ground creature spawned in water if (fish.GetComponent <WalkOnGround>() && !__instance.GetComponent <WalkOnGround>()) { GameObject.Destroy(fish); return; } // Deletes the fish if it is a water creature spawned on ground if (!fish.GetComponent <WalkOnGround>() && __instance.GetComponent <WalkOnGround>()) { GameObject.Destroy(fish); return; } fish.transform.position = __instance.transform.position; usedCreatures.Add(__instance); } }
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(); } }
public static void ConstructorCraft(ConstructorInput input, TechType tech) { if (!CrafterLogic.ConsumeResources(tech)) { return; } uGUI.main.craftingMenu.Close(input); input.cinematicController.DisengageConstructor(); Transform spawn = input.constructor.GetItemSpawnPoint(tech); var position = spawn.position; var rotation = spawn.rotation; GameObject gameObject; if (tech == TechType.Cyclops) { SubConsoleCommand.main.SpawnSub("cyclops", position, rotation); gameObject = SubConsoleCommand.main.GetLastCreatedSub(); } else { gameObject = CraftData.InstantiateFromPrefab(tech, false); Transform component = gameObject.GetComponent <Transform>(); component.position = position; component.rotation = rotation; } LargeWorldEntity.Register(gameObject); gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver); CrafterLogic.NotifyCraftEnd(gameObject, CraftData.GetTechType(gameObject)); Story.ItemGoalTracker.OnConstruct(tech); Commands.SendSpawn(gameObject, tech); }
internal void BuildNeptuneLaunchPlatform() { GameObject neptuneLaunchPlatform = CraftData.InstantiateFromPrefab(TechType.RocketBase); neptuneLaunchPlatform.transform.position = MainCamera.camera.transform.position; }
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 mod Vehicle thisVehicle = Player.main.GetVehicle(); if (thisVehicle != null) { GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false); Pickupable component = gameObject.GetComponent <Pickupable>(); if (thisVehicle is Exosuit exosuit) { StorageContainer storageContainer = exosuit.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(); return; } } 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) { return; } } } CraftData.AddToInventory(techType, count, bNoMessage, bSpawnIfCantAdd); }
internal static Pickupable ConvertToPickupable(ItemData itemData) { QuickLogger.Debug("ConvertToPickupable", true); if (itemData == null) { QuickLogger.Debug("Item Data is null", true); return(null); } QuickLogger.Debug("1"); if (EggHandler.GetDiscoveredEgg(itemData.TechType, out TechType value)) { return(CraftData.InstantiateFromPrefab(value).GetComponent <Pickupable>()); } QuickLogger.Debug("2"); var gameObject = CraftData.GetPrefabForTechType(itemData.TechType); QuickLogger.Debug("3"); if (gameObject == null) { QuickLogger.Error($"Couldn't get the prefab for the tech-type {itemData.TechType}"); return(null); } QuickLogger.Debug("4"); var go = GameObject.Instantiate(gameObject); QuickLogger.Debug("5"); if (go == null) { QuickLogger.Debug("GameObject is null in convert to pickupable", true); QuickLogger.Debug($"TechType = {itemData.Type}", true); return(null); } switch (itemData.Type) { case ItemType.Battery: go.GetComponent <Battery>()._charge = itemData.BatteryData.Charge; break; case ItemType.Food: var eatable = go.GetComponent <Eatable>(); eatable.foodValue = itemData.FoodData.FoodValue; eatable.waterValue = itemData.FoodData.WaterValue; break; case ItemType.Fuel: go.GetComponent <FireExtinguisher>().fuel = itemData.FuelData.Fuel; break; case ItemType.PlayerTool: if (itemData.PlayerToolData.HasBattery) { var batteryTechType = itemData.PlayerToolData.BatteryInfo.TechType; var tempBattery = CraftData.GetPrefabForTechType(batteryTechType); var capacity = tempBattery?.gameObject.GetComponent <IBattery>()?.capacity; if (itemData.PlayerToolData.HasBattery && capacity != null && capacity > 0) { //var pickup = CraftData.InstantiateFromPrefab(itemData.TechType).GetComponent<Pickupable>(); var energyMixin = go.gameObject.GetComponent <EnergyMixin>(); var normalizedCharge = itemData.PlayerToolData.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(itemData.PlayerToolData.BatteryInfo.TechType, (float)normalizedCharge); QuickLogger.Info($"Gave Player Player tool {itemData.PlayerToolData.TechType} with battery {batteryTechType}"); } else { QuickLogger.Error("While trying to get the batter capacity of the battery it returned null or 0."); } } break; case ItemType.FCSFilteredStorage: var storage = go.GetComponent <FCSFilteredStorage>(); storage.Items = itemData.FcsFilteredStorage; storage.Filters = itemData.FcsFilters; storage.ForceUpdateDisplay(); break; } QuickLogger.Debug("6"); return(go.GetComponent <Pickupable>()); }
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(); ITechData techData = CraftData.Get(techType); bool inputcheck = GameInput.GetButtonHeld(GameInput.Button.Deconstruct); if (!inputcheck && techType != TechType.Titanium && Main.BatteryCheck(item.item) && techData != null) { if (CheckRequirements(__instance, item.item, techData)) { for (int i = 0; i < techData.ingredientCount; i++) { IIngredient ingredient = techData.GetIngredient(i); for (int j = 0; j < ingredient.amount; j++) { GameObject gameObject = CraftData.InstantiateFromPrefab(ingredient.techType, false); if (gameObject.GetComponent <LiveMixin>() != null) { GameObject.Destroy(gameObject); break; } gameObject.SetActive(true); Pickupable pickupable = gameObject.GetComponent <Pickupable>(); pickupable.Pickup(false); forcePickupItems.Add(pickupable); } } break; } } else { if (inputcheck) { 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); }
static bool Prefix(Constructable __instance) { if (Player.main.GetVehicle() != null || Player.main.GetComponentInParent <SeaTruckSegment>() != null) { var thisVehicle = Player.main.GetVehicle(); var thisSeatruck = Player.main.GetComponentInParent <SeaTruckSegment>(); if (__instance._constructed) { return(true); } int count = __instance.resourceMap.Count; int resourceID = __instance.GetResourceID(); var backupConstructedAmount = __instance.constructedAmount; __instance.constructedAmount -= Time.deltaTime / ((float)count * Constructable.GetConstructInterval()); __instance.constructedAmount = Mathf.Clamp01(__instance.constructedAmount); int resourceID2 = __instance.GetResourceID(); if (resourceID2 != resourceID && GameModeUtils.RequiresIngredients()) { bool storageCheck = false; TechType techType = __instance.resourceMap[resourceID2]; GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false); Pickupable component = gameObject.GetComponent <Pickupable>(); if (thisVehicle != null) { if (thisVehicle.GetType().Equals(typeof(Exosuit))) { StorageContainer storageContainer = ((Exosuit)thisVehicle).storageContainer; if (storageContainer.container.HasRoomFor(component) && GameModeUtils.RequiresIngredients()) { var name = Language.main.Get(component.GetTechName()); ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name)); uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null); component.Initialize(); var item = new InventoryItem(component); storageContainer.container.UnsafeAdd(item); component.PlayPickupSound(); storageCheck = true; } } } else { SeaTruckSegment[] seaTruckSegments = thisSeatruck.GetComponents <SeaTruckSegment>(); List <StorageContainer[]> containers = new List <StorageContainer[]>(); foreach (SeaTruckSegment seaTruckSegment in seaTruckSegments) { containers.Add(seaTruckSegment.GetComponentsInChildren <StorageContainer>()); } foreach (StorageContainer[] storageContainers in containers) { foreach (StorageContainer storageContainer in storageContainers) { if (storageContainer.container.HasRoomFor(component) && GameModeUtils.RequiresIngredients()) { var name = Language.main.Get(component.GetTechName()); ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name)); uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null); component.Initialize(); var item = new InventoryItem(component); storageContainer.container.UnsafeAdd(item); component.PlayPickupSound(); storageCheck = true; break; } } } if (!storageCheck) { __instance.constructedAmount = backupConstructedAmount; return(true); } } } __instance.UpdateMaterial(); if (__instance.constructedAmount <= 0f) { return(true); } return(false); } else { return(true); } }
static bool Prefix(Constructable __instance) { if (Player.main.GetVehicle() != null) { var thisVehicle = Player.main.GetVehicle(); if (__instance._constructed) { return(true); } int count = __instance.resourceMap.Count; int resourceID = __instance.GetResourceID(); var backupConstructedAmount = __instance.constructedAmount; __instance.constructedAmount -= Time.deltaTime / ((float)count * Constructable.GetConstructInterval()); __instance.constructedAmount = Mathf.Clamp01(__instance.constructedAmount); int resourceID2 = __instance.GetResourceID(); if (resourceID2 != resourceID && GameModeUtils.RequiresIngredients()) { TechType techType = __instance.resourceMap[resourceID2]; GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false); Pickupable component = gameObject.GetComponent <Pickupable>(); if (thisVehicle.GetType().Equals(typeof(Exosuit))) { var storageContainer = ((Exosuit)thisVehicle).storageContainer; if (storageContainer.container.HasRoomFor(component) && GameModeUtils.RequiresIngredients()) { var name = Language.main.Get(component.GetTechName()); ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name)); uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null); component = component.Initialize(); 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 { var storage = seamoth.GetStorageInSlot(i, TechType.VehicleStorageModule); if (storage != null && storage.HasRoomFor(component) && GameModeUtils.RequiresIngredients()) { var name = Language.main.Get(component.GetTechName()); ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name)); uGUI_IconNotifier.main.Play(component.GetTechType(), uGUI_IconNotifier.AnimationType.From, null); component = component.Initialize(); var item = new InventoryItem(component); storage.UnsafeAdd(item); component.PlayPickupSound(); storageCheck = true; break; } } catch (Exception) { continue; } } if (!storageCheck) { __instance.constructedAmount = backupConstructedAmount; return(true); } } } __instance.UpdateMaterial(); if (__instance.constructedAmount <= 0f) { return(true); } return(false); } else { return(true); } }
// ReSharper disable once InconsistentNaming private static bool Prefix(WaterPark __instance, WaterParkCreature creature) { FishOverflowDistributor.Logger.LogTrace("WaterPark.TryBreed(WaterParkCreature) called."); //We only distribute when the WaterPark doesn't have any space left for bred creatures. //This is the only place in this method where we allow the original unpatched method to execute, //because the original method is never executed when there is no space left in the WaterPark. FishOverflowDistributor.Logger.LogTrace( $"__instance.HasFreeSpace() returns '{__instance.HasFreeSpace()}'."); if (__instance.HasFreeSpace()) { return(true); } //using Harmony's Traverse class for reflection. Harmony caches MethodInfo, FieldInfo, etc. for further use and thus increases performance. var items = Traverse .Create(__instance) .Field("items") .GetValue <List <WaterParkItem> >(); if (items == null) { FishOverflowDistributor.Logger.LogError( "FieldInfo or value for field 'items' in class 'WaterParkItem' with type 'List<WaterParkItem>' was null -> Should not happen, investigate!."); return(false); } FishOverflowDistributor.Logger.LogTrace("Checking if creature is contained in items"); //Don't know why this check is needed. Maybe TryBreed gets called on fish which arent contained in this WaterPark instance. if (!items.Contains(creature)) { return(false); } TechType creatureTechType = creature.pickupable.GetTechType(); FishOverflowDistributor.Logger.LogTrace($"Creature Tech Type = {creatureTechType.ToString()}."); FishOverflowDistributor.Logger.LogTrace( "Checking whether creatureEggs.containsKey(creatureTechType)"); //we don't want to distribute creature eggs if (WaterParkCreature.creatureEggs.ContainsKey(creatureTechType)) { return(false); } FishOverflowDistributor.Logger.LogTrace( $"Waterpark '{__instance.gameObject.name}' contains creature '{creature.gameObject.name}' and has enough space for another one."); var secondCreature = items.Find(item => item != creature && item is WaterParkCreature && // ReSharper disable once TryCastAlwaysSucceeds (item as WaterParkCreature).GetCanBreed() && item.pickupable != null && item.pickupable.GetTechType() == creatureTechType) as WaterParkCreature; if (secondCreature == null) { return(false); } FishOverflowDistributor.Logger.LogTrace( $"Waterpark contains two creatures '{creature.gameObject.name}' of TechType '{creatureTechType.ToString()}' which can breed with each other."); BaseBioReactor suitableReactor; try { //Get a reactor which has space for the item in the same base suitableReactor = SubnauticaSceneTraversalUtils .GetComponentsInSameBase <BaseBioReactor>(__instance.gameObject) .First( reactor => { var itemsContainer = Traverse .Create(reactor) .Property("container") .GetValue <ItemsContainer>(); if (itemsContainer != null) { return(itemsContainer.HasRoomFor( creature.pickupable)); } FishOverflowDistributor.Logger.LogTrace( $"PropertyInfo or value for property 'container' in class 'BaseBioReactor' with type 'ItemsContainer' was null -> Should not happen, investigate!."); return(false); }); } catch (Exception) { return(false); } if (suitableReactor == null) { FishOverflowDistributor.Logger.LogTrace("Could not find suitable reactor"); return(false); } //Reset breed time of the second creature so it can't be used to immediately breed again. secondCreature.ResetBreedTime(); FishOverflowDistributor.Logger.LogTrace( $"Found suitable reactor '{suitableReactor.gameObject.name}'."); //Now we create a pickupable from the WaterParkCreature which we can add to the reactor's inventory. //Because the creature can't be taken out from the reactor inventory, we don't need to add WaterparkCreature component //to it. This would be needed so the game knows when you drop it outside, that it came from a waterpark. GameObject newCreature = CraftData.InstantiateFromPrefab(creatureTechType, false); newCreature.SetActive(false); newCreature.transform.position = creature.transform.position + Vector3.down; var pickupable = newCreature.EnsureComponent <Pickupable>(); /*WaterParkCreatureParameters creatureParameters = * WaterParkCreature.GetParameters(creatureTechType); * * newCreature.transform.localScale = creatureParameters.initialSize * Vector3.one; * var newCreatureComponent = newCreature.AddComponent<WaterParkCreature>(); * newCreatureComponent.age = 0f; * * Traverse * .Create(newCreatureComponent) * .Field("parameters") * .SetValue(creatureParameters); * * Pickupable pickupable = creatureParameters.isPickupableOutside * ? newCreature.EnsureComponent<Pickupable>() * : newCreature.GetComponent<Pickupable>(); * * newCreature.setActive();*/ pickupable = pickupable.Pickup(false); // pickupable.GetComponent<WaterParkItem>()?.SetWaterPark(null); var itemToAdd = new InventoryItem(pickupable); var reactorItemsContainer = Traverse .Create(suitableReactor) .Property("container") .GetValue <ItemsContainer>(); if (reactorItemsContainer == null) { FishOverflowDistributor.Logger.LogError( $"PropertyInfo or value for property 'container' in class 'BaseBioReactor' with type 'ItemsContainer' was null -> Should not happen, investigate!."); return(false); } reactorItemsContainer.AddItem(pickupable); return(false); }
public override GameObject GetGameObject() { Console.WriteLine("[AlienRifle] Loading Prefab"); GameObject gobj = AlienRifleMod.bund.LoadAsset <GameObject>("AlienRifle.prefab"); try { BoxCollider box = gobj.AddOrGetComponent <BoxCollider>(); box.size = new Vector3(0.1f, 0.3f, 1f); Console.WriteLine("[AlienRifle] Modifying MeshRenderers of Object"); foreach (Renderer render in gobj.GetComponentsInChildren <Renderer>()) { render.material.shader = Shader.Find("MarmosetUBER"); } MeshRenderer rend = gobj.transform.Find("Main/MainBody").GetComponent <MeshRenderer>(); rend.material = gobj.transform.Find("Main/EnergyGlow").GetComponent <MeshRenderer>().material; rend.material.SetColor("_Emission", new Color(0.2f, 0.2f, 0.2f)); Console.WriteLine("[AlienRifle] Modifying Transform offset and rotation"); Vector3 offset = new Vector3(0, 0.05f, 0.1f); gobj.transform.GetChild(0).localPosition += offset; //gobj.transform.GetChild(1).localPosition = offset; Console.WriteLine("[AlienRifle] Adding Essential components"); gobj.AddOrGetComponent <PrefabIdentifier>().ClassId = ClassID; gobj.AddOrGetComponent <LargeWorldEntity>().cellLevel = LargeWorldEntity.CellLevel.Near; Console.WriteLine("[AlienRifle] Adding SkyApplier"); SkyApplier sky = gobj.AddOrGetComponent <SkyApplier>(); sky.renderers = gobj.GetComponentsInChildren <MeshRenderer>(); sky.anchorSky = Skies.Auto; Console.WriteLine("[AlienRifle] Adding WorldForces"); WorldForces forces = gobj.AddOrGetComponent <WorldForces>(); Console.WriteLine("[AlienRifle] Adding Rigidbody"); Rigidbody rb = gobj.AddOrGetComponent <Rigidbody>(); forces.underwaterGravity = 0; forces.useRigidbody = rb; Pickupable pick = gobj.AddOrGetComponent <Pickupable>(); pick.isPickupable = true; gobj.AddOrGetComponent <TechTag>().type = TechType; Fixer fixer = gobj.AddOrGetComponent <Fixer>(); fixer.ClassId = ClassID; fixer.techType = TechType; Console.WriteLine("[AlienRifle] Adding VFX Component"); VFXFabricating vfxfabricating = gobj.transform.Find("Main").gameObject.AddOrGetComponent <VFXFabricating>(); vfxfabricating.localMinY = -0.4f; vfxfabricating.localMaxY = 0.2f; vfxfabricating.posOffset = new Vector3(-0.054f, 0f, -0.06f); vfxfabricating.eulerOffset = new Vector3(0f, 0f, 90f); vfxfabricating.scaleFactor = 1f; Console.WriteLine("[AlienRifle] Adding EnergyMixin Component"); EnergyMixin AREnergy = gobj.AddOrGetComponent <EnergyMixin>(); AREnergy.storageRoot = gobj.transform.Find("Main").gameObject.AddOrGetComponent <ChildObjectIdentifier>(); AREnergy.compatibleBatteries = new List <TechType> { TechType.PrecursorIonBattery }; AREnergy.allowBatteryReplacement = true; AREnergy.batteryModels = new EnergyMixin.BatteryModels[] { new EnergyMixin.BatteryModels { techType = TechType.PrecursorIonBattery, model = gobj.transform.Find("Main/EnergyGlow").gameObject } }; Material mat = new Material(Shader.Find("MarmosetUBER")); Console.WriteLine("[AlienRifle] Adding AlienRifle Component"); AlienRifle rifle = gobj.AddOrGetComponent <AlienRifle>(); GameObject power = CraftData.InstantiateFromPrefab(TechType.PowerTransmitter); rifle.beamPrefab = power.GetComponent <PowerFX>().vfxPrefab; rifle.beamPrefab.GetComponent <LineRenderer>().material.color = Color.green; Object.Destroy(power); StasisRifle stasisrifle = CraftData.InstantiateFromPrefab(TechType.StasisRifle).GetComponent <StasisRifle>(); RepulsionCannon cannon = CraftData.InstantiateFromPrefab(TechType.RepulsionCannon).GetComponent <RepulsionCannon>(); rifle.shootSound = cannon.shootSound; rifle.drawSound = stasisrifle.drawSound; rifle.reloadSound = stasisrifle.reloadSound; rifle.muzzleFlash = gobj.transform.Find("Main/Particles/Fire").GetComponent <ParticleSystem>(); rifle.chargeSparks = gobj.transform.Find("Main/Particles/Charging").GetComponent <ParticleSystem>(); Object.Destroy(stasisrifle); Object.Destroy(cannon); rifle.mainCollider = gobj.GetComponent <BoxCollider>(); rifle.ikAimRightArm = true; rifle.ikAimLeftArm = true; rifle.useLeftAimTargetOnPlayer = true; Console.WriteLine("[AlienRifle] Prefab loaded successfully!"); return(gobj); } catch (Exception e) { Console.WriteLine("[AlienRifle] Rifle Object couldn't be loaded!\n" + e.Message + e.StackTrace); return(gobj); } }
public void SetUpArm(GameObject clonedArm, SetupHelper graphicsHelper) { GameObject elbow = ArmServices.main.objectHelper.FindDeepChild(clonedArm, "elbow"); GameObject plasmaCannon = elbow.FindChild("torpedoLauncher"); plasmaCannon.name = "plasmaCannon"; Object.DestroyImmediate(plasmaCannon.FindChild("reload")); Object.DestroyImmediate(plasmaCannon.FindChild("torpedo_innr1")); Object.DestroyImmediate(plasmaCannon.FindChild("torpedo_innr2")); Object.DestroyImmediate(plasmaCannon.FindChild("torpedo_outr1")); Object.DestroyImmediate(plasmaCannon.FindChild("torpedo_outr2")); Object.DestroyImmediate(plasmaCannon.FindChild("TorpedoFirst")); Object.DestroyImmediate(plasmaCannon.FindChild("TorpedoSecond")); Object.DestroyImmediate(plasmaCannon.FindChild("TorpedoReload")); Object.DestroyImmediate(plasmaCannon.FindChild("collider")); GameObject PlasmaTubeRight = plasmaCannon.FindChild("TorpedoSiloFirst"); PlasmaTubeRight.name = "PlasmaTubeRight"; PlasmaTubeRight.transform.localPosition = new Vector3(-1.27f, 0.02f, 0.18f); GameObject PlasmaTubeLeft = plasmaCannon.FindChild("TorpedoSiloSecond"); PlasmaTubeLeft.name = "PlasmaTubeLeft"; PlasmaTubeLeft.transform.localPosition = new Vector3(-1.27f, 0.02f, -0.18f); GameObject ArmRig = ArmServices.main.objectHelper.FindDeepChild(clonedArm, "ArmRig");; GameObject exosuit_arm_plasmaCannon_geo = ArmRig.FindChild("ArmModel"); graphicsHelper.DisableLowerArmMesh(); GameObject PlasmaArm = Object.Instantiate(Main.assetBundle.LoadAsset <GameObject>("PlasmaArm"), plasmaCannon.transform); PlasmaArm.name = "PlasmaArm"; GameObject precursorColumnMaze = Resources.Load("WorldEntities/Environment/Precursor/Gun/Precursor_Gun_ControlRoom_CentralColumn") as GameObject; GameObject precursorColumn = precursorColumnMaze.transform.Find("precursor_column_maze_08_06_08_hlpr/precursor_column_maze_08_06_08_ctrl/precursor_column_maze_08_06_08/precursor_column_maze_08_06_08_glass_02_hlpr/precursor_column_maze_08_06_08_glass_02_ctrl/precursor_column_maze_08_06_08_glass_02").gameObject; Transform GlowTubeLeft = PlasmaArm.transform.Find("GlowTubeLeft"); Transform GlowTubeRight = PlasmaArm.transform.Find("GlowTubeRight"); GameObject glowLeft = Object.Instantiate(precursorColumn, GlowTubeLeft); glowLeft.name = "glowLeft"; glowLeft.transform.localPosition = Vector3.zero; glowLeft.transform.localScale = new Vector3(1.28f, 1.43f, 7.09f); glowLeft.transform.localRotation = Quaternion.Euler(0, 0, 0); MeshRenderer glowLeftRenderer = glowLeft.GetComponent <MeshRenderer>(); foreach (Material material in glowLeftRenderer.materials) { material.DisableKeyword("FX_ADDFOG"); } GameObject glowRight = Object.Instantiate(glowLeft, GlowTubeRight); glowRight.name = "glowRight"; glowRight.transform.localPosition = Vector3.zero; glowRight.transform.localScale = new Vector3(1.28f, 1.43f, 7.09f); glowRight.transform.localRotation = Quaternion.Euler(0, 0, 0); Texture2D _MainTex = Main.assetBundle.LoadAsset <Texture2D>("PlasmaArm_MainTex"); Texture2D _Illum = Main.assetBundle.LoadAsset <Texture2D>("PlasmaArm_Illum"); Texture2D _BumpMap = Main.assetBundle.LoadAsset <Texture2D>("PlasmaArm_BumpMap"); MeshRenderer laserRenderer = PlasmaArm.GetComponent <MeshRenderer>(); Shader marmoShader = Shader.Find("MarmosetUBER"); foreach (Material material in laserRenderer.materials) { material.shader = marmoShader; material.EnableKeyword("MARMO_EMISSION"); material.EnableKeyword("_ZWRITE_ON"); material.SetTexture(Shader.PropertyToID("_MainTex"), _MainTex); material.SetTexture(Shader.PropertyToID("_BumpMap"), _BumpMap); material.SetTexture(Shader.PropertyToID("_Illum"), _Illum); } PlasmaArm.transform.localScale = new Vector3(0.13f, 0.13f, 0.13f); PlasmaArm.transform.localPosition = new Vector3(-0.33f, 0.20f, -0.20f); PlasmaArm.transform.localRotation = Quaternion.Euler(0, 270, 180); Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_innr1_geo")); Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_innr2_geo")); Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_outr1_geo")); Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_outr2_geo")); Object.DestroyImmediate(exosuit_arm_plasmaCannon_geo.FindChild("torpedo_reload_geo")); GameObject powerTransmitter = CraftData.InstantiateFromPrefab(TechType.PowerTransmitter); GameObject laserBeam = Object.Instantiate(powerTransmitter.GetComponent <PowerFX>().vfxPrefab, null, false); LineRenderer lineRenderer = laserBeam.GetComponent <LineRenderer>(); Main.plasma_Material = Object.Instantiate(lineRenderer.material) as Material; Object.DestroyImmediate(powerTransmitter); Object.DestroyImmediate(laserBeam); }