private Pickupable PerformTakeOperation(TechType techType) { QuickLogger.Debug("Perform Take Operation", true); foreach (DSSRackController baseUnit in BaseRacks) { if (baseUnit.HasItem(techType)) { var data = baseUnit.GetItemDataFromServer(techType, out RackSlot slot); QuickLogger.Debug("Calling Take", true); if (GivePlayerItem) { var result = baseUnit.GivePlayerItem(techType, data); if (!result) { return(null); //TODO Add Message } } else { slot.Remove((ObjectData)data.data); GivePlayerItem = true; } return(data.ToPickable(techType)); } } if (!TakeFromConnectables) { TakeFromConnectables = true; return(null); } //Check connectables foreach (KeyValuePair <string, FCSConnectableDevice> fcsConnectable in FCSConnectables) { Vector2int itemSize = CraftData.GetItemSize(techType); if (fcsConnectable.Value.ContainsItem(techType) && fcsConnectable.Value.IsVisible && !fcsConnectable.Value.IsBase() && fcsConnectable.Value.IsOperational()) { var item = fcsConnectable.Value.RemoveItemFromContainer(techType, 1); if (item == null) { continue; } if (GivePlayerItem) { DSSHelpers.GivePlayerItem(item); } GivePlayerItem = true; Mod.OnBaseUpdate?.Invoke(); return(item); } } return(null); }
public override IEnumerator GetGameObjectAsync(IOut<GameObject> gameObject) { // We're not using a separate PreparePrefab() method, because this object only exists in BelowZero. // In the event CoroutineTask<GameObject> task; Oxygen oxy; if (Main.HighCapacityTankPrefab == null) { Log.LogDebug($"HighCapacityBooster.GetGameObjectAsync: getting HighCapacityTank prefab"); task = CraftData.GetPrefabForTechTypeAsync(TechType.HighCapacityTank, verbose: true); yield return task; Main.HighCapacityTankPrefab = GameObject.Instantiate(task.GetResult()); // The "capacity expansion" code in Customise Your Oxygen can't run unless the thing is instantiated. The prefabs can't be altered. // So unless we instantiate, we only get default capacities. ModPrefabCache.AddPrefab(Main.HighCapacityTankPrefab, false); } if (prefab == null) { Log.LogDebug($"HighCapacityBooster.GetGameObjectAsync: getting SuitBoosterTank prefab"); task = CraftData.GetPrefabForTechTypeAsync(TechType.SuitBoosterTank, verbose: true); yield return task; prefab = GameObject.Instantiate(task.GetResult()); ModPrefabCache.AddPrefab(prefab, false); // This doesn't actually do any caching, but it does disable the prefab without "disabling" it - the prefab doesn't show up in the world [as with SetActive(false)] but it can still be instantiated. //GameObject go = GameObject.Instantiate(prefab); Oxygen highCapOxygen = Main.HighCapacityTankPrefab.GetComponent<Oxygen>(); //Oxygen highCapOxygen = task.GetResult().GetComponent<Oxygen>(); if (highCapOxygen != null) { oxy = prefab.EnsureComponent<Oxygen>(); if (oxy != null) { float oxygenCapacity = highCapOxygen.oxygenCapacity; Log.LogDebug($"Found Oxygen component with capacity of {oxygenCapacity} for prefab HighCapacityTank and existing oxygen capacity of {oxy.oxygenCapacity} for prefab IonBoosterTank."); oxy.oxygenCapacity = oxygenCapacity; } else { Log.LogError($"Could not get Oxygen component of SuitBoosterTank while generating IonBoosterTank"); } } else Log.LogError($"Could not get Oxygen component of HighCapacityTank while generating IonBoosterTank"); var booster = prefab.GetComponent<SuitBoosterTank>(); if (booster != null) { booster.boostOxygenUsePerSecond = boostOxygenUsePerSecond; } else { Log.LogError($"Could not get SuitBoosterTank component of SuitBoosterTank prefab while generating IonBoosterTank"); } } oxy = prefab.GetComponent<Oxygen>(); float oxyCap = oxy != null ? oxy.oxygenCapacity : -1f; Log.LogDebug($"IonBoosterTank created with oxygenCapacity of {oxyCap}"); var postBooster = prefab.GetComponent<SuitBoosterTank>(); if (postBooster != null) { if (postBooster.boostOxygenUsePerSecond != boostOxygenUsePerSecond) { Log.LogDebug($"Editing SuitBoosterTnk component"); postBooster.boostOxygenUsePerSecond = boostOxygenUsePerSecond; } } else { Log.LogError($"Could not get SuitBoosterTank component of SuitBoosterTank prefab while generating IonBoosterTank"); } gameObject.Set(prefab); }
public override GameObject GetGameObject() { return(GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.DepletedReactorRod))); }
private Optional <VehicleMovementData> GetVehicleModel() { Vehicle vehicle = Player.main.GetVehicle(); SubRoot sub = Player.main.GetCurrentSub(); string guid; Vector3 position; Quaternion rotation; Vector3 velocity; Vector3 angularVelocity; TechType techType; float steeringWheelYaw = 0f, steeringWheelPitch = 0f; bool appliedThrottle = false; if (vehicle != null) { guid = GuidHelper.GetGuid(vehicle.gameObject); position = vehicle.gameObject.transform.position; rotation = vehicle.gameObject.transform.rotation; techType = CraftData.GetTechType(vehicle.gameObject); Rigidbody rigidbody = vehicle.gameObject.GetComponent <Rigidbody>(); velocity = rigidbody.velocity; angularVelocity = rigidbody.angularVelocity; // Required because vehicle is either a SeaMoth or an Exosuit, both types which can't see the fields either. steeringWheelYaw = (float)vehicle.ReflectionGet <Vehicle, Vehicle>("steeringWheelYaw"); steeringWheelPitch = (float)vehicle.ReflectionGet <Vehicle, Vehicle>("steeringWheelPitch"); // Vehicles (or the SeaMoth at least) do not have special throttle animations. Instead, these animations are always playing because the player can't even see them (unlike the cyclops which has cameras). // So, we need to hack in and try to figure out when thrust needs to be applied. if (vehicle && AvatarInputHandler.main.IsEnabled()) { if (techType == TechType.Seamoth) { bool flag = vehicle.transform.position.y < Ocean.main.GetOceanLevel() && vehicle.transform.position.y < vehicle.worldForces.waterDepth && !vehicle.precursorOutOfWater; appliedThrottle = flag && GameInput.GetMoveDirection().sqrMagnitude > .1f; } else if (techType == TechType.Exosuit) { Exosuit exosuit = vehicle as Exosuit; if (exosuit) { appliedThrottle = (bool)exosuit.ReflectionGet("_jetsActive") && (float)exosuit.ReflectionGet("thrustPower") > 0f; } } } } else if (sub != null && Player.main.isPiloting) { guid = GuidHelper.GetGuid(sub.gameObject); position = sub.gameObject.transform.position; rotation = sub.gameObject.transform.rotation; Rigidbody rigidbody = sub.GetComponent <Rigidbody>(); velocity = rigidbody.velocity; angularVelocity = rigidbody.angularVelocity; techType = TechType.Cyclops; SubControl subControl = sub.GetComponent <SubControl>(); steeringWheelYaw = (float)subControl.ReflectionGet("steeringWheelYaw"); steeringWheelPitch = (float)subControl.ReflectionGet("steeringWheelPitch"); appliedThrottle = subControl.appliedThrottle && (bool)subControl.ReflectionGet("canAccel"); } else { return(Optional <VehicleMovementData> .Empty()); } VehicleMovementData model = new VehicleMovementData(techType, guid, position, rotation, velocity, angularVelocity, steeringWheelYaw, steeringWheelPitch, appliedThrottle); return(Optional <VehicleMovementData> .Of(model)); }
public static bool BatteryCheck(Pickupable pickupable) { EnergyMixin energyMixin = pickupable.gameObject.GetComponentInChildren <EnergyMixin>(); if (energyMixin != null) { GameObject gameObject = energyMixin.GetBattery(); bool defaultCheck = false; if (gameObject != null) { defaultCheck = energyMixin.defaultBattery == CraftData.GetTechType(gameObject); } if (gameObject == null && QModServices.Main.ModPresent("NoBattery")) { return(true); } if (gameObject != null && (defaultCheck || QModServices.Main.ModPresent("NoBattery"))) { IBattery battery = gameObject.GetComponent <IBattery>(); #if SUBNAUTICA TechData techData = CraftDataHandler.GetTechData(pickupable.GetTechType()); #elif BELOWZERO RecipeData techData = CraftDataHandler.GetRecipeData(pickupable.GetTechType()); #endif bool recipeCheck = techData.Ingredients.FindAll((ingredient) => ingredient.techType == TechType.Battery || ingredient.techType == TechType.PrecursorIonBattery || ingredient.techType == TechType.LithiumIonBattery || ingredient.techType == TechType.PowerCell || ingredient.techType == TechType.PrecursorIonPowerCell).Count == 0; if (battery != null && QModServices.Main.ModPresent("NoBattery") && recipeCheck) { ErrorMessage.AddMessage($"{pickupable.GetTechType().ToString()} has a battery in it. Cannot Recycle."); return(false); } else if (battery != null && defaultCheck && battery.charge > (battery.capacity * 0.99)) { return(true); } else { if (gameObject != null && !defaultCheck) { ErrorMessage.AddMessage($"{CraftData.GetTechType(gameObject).ToString()} is not the default battery for {pickupable.GetTechType().ToString()}."); } else { ErrorMessage.AddMessage($"{pickupable.GetTechType().ToString()} is not fully charged and cannot be recycled."); } return(false); } } else { if (gameObject != null) { ErrorMessage.AddMessage($"{CraftData.GetTechType(gameObject).ToString()} is not the default battery for {pickupable.GetTechType().ToString()}."); } else { ErrorMessage.AddMessage($"{pickupable.GetTechType().ToString()} has no battery."); } return(false); } } IBattery b2 = pickupable.GetComponent <IBattery>(); if (b2 != null) { if (b2.charge > (b2.capacity * 0.99)) { return(true); } else { ErrorMessage.AddMessage($"{pickupable.GetTechType().ToString()} is not fully charged and cannot be recycled."); return(false); } } return(true); }
public static bool Prefix(Constructable __instance) { if (Player.main.GetVehicle() != null && GameModeUtils.RequiresIngredients()) { Type ConstructableType = typeof(Constructable); List <TechType> resourceMapField = (List <TechType>)AccessTools.Field(ConstructableType, "resourceMap").GetValue(__instance); MethodInfo getResourceIDMethod = AccessTools.Method(ConstructableType, "GetResourceID"); MethodInfo GetConstructIntervalMethod = AccessTools.Method(ConstructableType, "GetConstructInterval"); MethodInfo updateMaterialMethod = AccessTools.Method(ConstructableType, "UpdateMaterial"); Vehicle thisVehicle = Player.main.GetVehicle(); if (__instance._constructed) { return(true); } int count = resourceMapField.Count; int resourceID = (int)getResourceIDMethod.Invoke(__instance, null); float backupConstructedAmount = __instance.constructedAmount; __instance.constructedAmount -= Time.deltaTime / (count * (float)GetConstructIntervalMethod.Invoke(__instance, null)); __instance.constructedAmount = Mathf.Clamp01(__instance.constructedAmount); int resourceID2 = (int)getResourceIDMethod.Invoke(__instance, null); if (resourceID2 != resourceID) { TechType techType = resourceMapField[resourceID2]; GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false); Pickupable component = gameObject.GetComponent <Pickupable>(); if (thisVehicle.GetType().Equals(typeof(Exosuit))) { StorageContainer storageContainer = ((Exosuit)thisVehicle).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(); } else { __instance.constructedAmount = backupConstructedAmount; return(true); } } 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) { __instance.constructedAmount = backupConstructedAmount; return(true); } } } updateMaterialMethod.Invoke(__instance, null); return(__instance.constructedAmount <= 0f); } else { return(true); } }
private TechType GetTechType() { var techType = CraftData.GetTechType(gameObject); return(techType); }
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 if (Player.main.isPiloting) { #if SUBNAUTICA_STABLE //GameObject gameObject = CraftData.InstantiateFromPrefab(techType, false); GameObject prefabForTechType = CraftData.GetPrefabForTechType(techType, true); GameObject gameObject = (prefabForTechType != null) ? global::Utils.SpawnFromPrefab(prefabForTechType, null) : global::Utils.CreateGenericLoot(techType); #elif BELOWZERO GameObject gameObject = CraftData.InstantiateFromPrefab(null, techType, false); // Coming back to this months later, I didn't think this worked in BZ, because it's not async. But apparently it does... #endif Pickupable pickup = gameObject.GetComponent <Pickupable>(); if (pickup != null) { pickup.Initialize(); // This is kind of messy but it's an easy way to get the cross-game code running. In SN1 modules will always == null so the block won't run; but it'll still compile. #if SUBNAUTICA_STABLE Equipment modules = null; #elif BELOWZERO SeaTruckUpgrades upgrades = Player.main.GetComponentInParent <SeaTruckUpgrades>(); Equipment modules = upgrades?.modules; #endif if (modules != null && TechTypeHandler.TryGetModdedTechType("SeaTruckStorage", out TechType storageType)) { //HashSet<string> TruckSlotIDs = modules.equipment.Keys.ToSet<string>(); List <string> TruckSlotIDs = null; modules.GetSlots(EquipmentType.SeaTruckModule, TruckSlotIDs); foreach (string slot in TruckSlotIDs) { InventoryItem item = modules.GetItemInSlot(slot); if (item.item.GetTechType() == storageType) { //InventoryItem item = modules.GetItemInSlot(slot); if (item.item.TryGetComponent(out SeamothStorageContainer seamothStorageContainer)) { InventoryItem newItem = new InventoryItem(pickup); if (seamothStorageContainer.container.AddItem(newItem) != null) { string name = Language.main.Get(pickup.GetTechName()); ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name)); //uGUI_IconNotifier.main.Play(pickup.GetTechType(), uGUI_IconNotifier.AnimationType.From, null); uGUI_IconNotifier.main.Play(techType, uGUI_IconNotifier.AnimationType.From, null); pickup.PlayPickupSound(); #if !RELEASE Logger.Log(Logger.Level.Debug, $"Adding tech {techType} to Seatruck storage"); #endif return; } } } } } else { Vehicle thisVehicle = Player.main.GetVehicle(); if (thisVehicle != null) { if (thisVehicle is Exosuit exo) { StorageContainer storageContainer = exo.storageContainer; if (storageContainer != null) { int lastCount = storageContainer.container.GetCount(techType); storageContainer.container.AddItem(pickup); int techCount = storageContainer.container.GetCount(techType); #if !RELEASE Logger.Log(Logger.Level.Debug, $"Adding tech {techType.AsString().PadLeft(15)} to Exosuit storage; previous count {lastCount}, new count {techCount}"); #endif if (techCount - lastCount == 1) { string name = Language.main.Get(pickup.GetTechName()); ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name)); uGUI_IconNotifier.main.Play(pickup.GetTechType(), uGUI_IconNotifier.AnimationType.From, null); pickup.PlayPickupSound(); return; } } } else if (thisVehicle is SeaMoth seamoth) { //bool storageCheck = false; List <IItemsContainer> containers = new List <IItemsContainer>(); seamoth.GetAllStorages(containers); //for (int i = 0; i < 12; i++) InventoryItem newItem = new InventoryItem(pickup); foreach (IItemsContainer storage in containers) { try { //ItemsContainer storage = seamoth.GetStorageInSlot(i, TechType.VehicleStorageModule); if (storage is ItemsContainer iContainer) { int lastCount = iContainer.GetCount(techType); iContainer.AddItem(pickup); int techCount = iContainer.GetCount(techType); #if !RELEASE Logger.Log(Logger.Level.Debug, $"Adding tech {techType.AsString().PadLeft(15)} to Seamoth storage; previous count {lastCount}, new count {techCount}"); #endif if (techCount - lastCount == 1) { string name = Language.main.Get(pickup.GetTechName()); ErrorMessage.AddMessage(Language.main.GetFormat("VehicleAddedToStorage", name)); uGUI_IconNotifier.main.Play(pickup.GetTechType(), uGUI_IconNotifier.AnimationType.From, null); pickup.PlayPickupSound(); //storageCheck = true; return; } } } catch (Exception e) { #if !RELEASE Logger.Log(Logger.Level.Debug, $"Exception adding tech {techType} to Seamoth storage: {e.ToString()}"); #endif continue; } } /*if (storageCheck) * { * return; * }*/ } } } } } #if !RELEASE Logger.Log(Logger.Level.Debug, $"Adding tech {techType} to player inventory"); #endif CraftData.AddToInventory(techType, count, bNoMessage, bSpawnIfCantAdd); }
public override GameObject GetGameObject() { GameObject prefab; Constructable constructible = null; GhostCrafter crafter; switch (FabricatorDetails.Model) { case ModelTypes.Fabricator: prefab = GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.Fabricator)); crafter = prefab.GetComponent <Fabricator>(); break; case ModelTypes.Workbench: prefab = GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.Workbench)); crafter = prefab.GetComponent <Workbench>(); break; case ModelTypes.MoonPool: prefab = GameObject.Instantiate(Resources.Load <GameObject>("Submarine/Build/CyclopsFabricator")); crafter = prefab.GetComponent <Fabricator>(); // Add prefab ID because CyclopsFabricator normaly doesn't have one PrefabIdentifier prefabId = prefab.AddComponent <PrefabIdentifier>(); prefabId.ClassId = FabricatorDetails.ItemID; prefabId.name = FabricatorDetails.DisplayName; // Add tech tag because CyclopsFabricator normaly doesn't have one TechTag techTag = prefab.AddComponent <TechTag>(); techTag.type = this.TechType; // Retrieve sub game objects GameObject cyclopsFabLight = prefab.FindChild("fabricatorLight"); GameObject cyclopsFabModel = prefab.FindChild("submarine_fabricator_03"); // Translate CyclopsFabricator model and light prefab.transform.localPosition = new Vector3(cyclopsFabModel.transform.localPosition.x, // Same X position cyclopsFabModel.transform.localPosition.y - 0.8f, // Push towards the wall slightly cyclopsFabModel.transform.localPosition.z); // Same Z position prefab.transform.localPosition = new Vector3(cyclopsFabLight.transform.localPosition.x, // Same X position cyclopsFabLight.transform.localPosition.y - 0.8f, // Push towards the wall slightly cyclopsFabLight.transform.localPosition.z); // Same Z position // Add constructable - This prefab normally isn't constructed. constructible = prefab.AddComponent <Constructable>(); constructible.model = cyclopsFabModel; break; default: throw new InvalidOperationException("ModelType in CustomFabricator does not correspond to a valid fabricator type"); } crafter.craftTree = FabricatorDetails.TreeTypeID; crafter.handOverText = $"Use {FabricatorDetails.DisplayName}"; if (constructible is null) { constructible = prefab.GetComponent <Constructable>(); } constructible.allowedInBase = FabricatorDetails.AllowedInBase; constructible.allowedInSub = FabricatorDetails.AllowedInCyclops; constructible.allowedOutside = false; constructible.allowedOnCeiling = false; constructible.allowedOnGround = FabricatorDetails.Model == ModelTypes.Workbench; constructible.allowedOnWall = FabricatorDetails.Model != ModelTypes.Workbench; constructible.allowedOnConstructables = false; constructible.controlModelState = true; constructible.rotationEnabled = false; constructible.techType = this.TechType; // This was necessary to correctly associate the recipe at building time SkyApplier skyApplier = prefab.GetComponent <SkyApplier>(); skyApplier.renderers = prefab.GetComponentsInChildren <Renderer>(); skyApplier.anchorSky = Skies.Auto; if (FabricatorDetails.HasColorValue) { SkinnedMeshRenderer skinnedMeshRenderer = prefab.GetComponentInChildren <SkinnedMeshRenderer>(); skinnedMeshRenderer.material.color = FabricatorDetails.ColorTint; // Tint option available } // Associate power relay var powerRelay = new PowerRelay(); // This is actually a dirty hack // The problem is that the parent SubRoot isn't correctly associated at this time. // The power relay should be getting set in the GhostCrafter Start() method. // But the parent components are coming up null. crafter.powerRelay = powerRelay; return(prefab); }
public static bool AddOrSwap_Prefix(ref bool __result, InventoryItem itemA, Equipment equipmentB, string slotB) { if (itemA == null || !itemA.CanDrag(true) || equipmentB == null) { return(true); } Pickupable item = itemA.item; if (item == null) { return(true); } TechType techType = item.GetTechType(); if (techType == TechType.Battery || techType == TechType.PrecursorIonBattery || techType == TechType.PowerCell || techType == TechType.PrecursorIonPowerCell) { IItemsContainer container = itemA.container; if (container == null) { return(true); } Equipment equipment = container as Equipment; bool flag = equipment != null; string empty = string.Empty; if (flag && !equipment.GetItemSlot(item, ref empty)) { return(true); } #if BELOWZERO EquipmentType equipmentType = TechData.GetEquipmentType(techType); #else EquipmentType equipmentType = CraftData.GetEquipmentType(techType); #endif if (string.IsNullOrEmpty(slotB)) { equipmentB.GetCompatibleSlot(equipmentType, out slotB); } if (string.IsNullOrEmpty(slotB)) { return(true); } if (container == equipmentB && empty == slotB) { return(true); } EquipmentType slotBType = Equipment.GetSlotType(slotB); if (slotBType != EquipmentType.BatteryCharger && slotBType != EquipmentType.PowerCellCharger) { return(true); } else // Else, we're trying to plug a battery or powercell to its charger { InventoryItem inventoryItem = equipmentB.RemoveItem(slotB, false, true); if (inventoryItem == null) { if (equipmentB.AddItem(slotB, itemA, false)) { __result = true; return(false); } } else if (equipmentB.AddItem(slotB, itemA, false)) { if ((flag && equipment.AddItem(empty, inventoryItem, false)) || (!flag && container.AddItem(inventoryItem))) { __result = true; return(false); } if (flag) { equipment.AddItem(empty, itemA, true); } else { container.AddItem(itemA); } equipmentB.AddItem(slotB, inventoryItem, true); } else { equipmentB.AddItem(slotB, inventoryItem, true); } __result = false; return(false); } } return(true); }
private void OnVehiclePrefabLoaded(TechType techType, GameObject prefab, string guid, Vector3 spawnPosition, Quaternion spawnRotation, Optional <List <InteractiveChildObjectIdentifier> > interactiveChildIdentifiers, Optional <string> dockingBayGuid, string name, Vector3[] hsb, Vector3[] colours) { // Partially copied from SubConsoleCommand.OnSubPrefabLoaded GameObject gameObject = Utils.SpawnPrefabAt(prefab, null, spawnPosition); gameObject.transform.rotation = spawnRotation; gameObject.SetActive(true); gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver); CrafterLogic.NotifyCraftEnd(gameObject, CraftData.GetTechType(gameObject)); Rigidbody rigidBody = gameObject.GetComponent <Rigidbody>(); rigidBody.isKinematic = false; GuidHelper.SetNewGuid(gameObject, guid); // Updates names and colours with persisted data .....yeah..... if (techType == TechType.Seamoth || techType == TechType.Exosuit) { // Seamoth & Prawn suit Vehicle vehicle = gameObject.GetComponent <Vehicle>(); if (dockingBayGuid.IsPresent()) { GameObject dockingBayBase = GuidHelper.RequireObjectFrom(dockingBayGuid.Get()); VehicleDockingBay dockingBay = dockingBayBase.GetComponentInChildren <VehicleDockingBay>(); dockingBay.DockVehicle(vehicle); } if (!string.IsNullOrEmpty(name)) { vehicle.vehicleName = name; vehicle.subName.DeserializeName(vehicle.vehicleName); } if (colours != null) { Vector3[] colour = new Vector3[5]; for (int i = 0; i < hsb.Length; i++) { colour[i] = hsb[i]; } vehicle.vehicleColors = colour; vehicle.subName.DeserializeColors(vehicle.vehicleColors); } } else if (techType == TechType.Cyclops) // Cyclops { GameObject target = GuidHelper.RequireObjectFrom(guid); SubNameInput subNameInput = target.RequireComponentInChildren <SubNameInput>(); SubName subNameTarget = (SubName)subNameInput.ReflectionGet("target"); subNameInput.OnNameChange(name); for (int i = 0; i < hsb.Length; i++) { subNameInput.SetSelected(i); Color tmpColour = new Vector4(colours[i].x, colours[i].y, colours[i].z); subNameTarget.SetColor(i, hsb[i], tmpColour); subNameTarget.DeserializeColors(hsb); } } if (interactiveChildIdentifiers.IsPresent()) { VehicleChildObjectIdentifierHelper.SetInteractiveChildrenGuids(gameObject, interactiveChildIdentifiers.Get()); //Copy From ConstructorBeginCraftingProcessor } }
private void DrawHostilesMenu() { if (reaper == null) { if (GUILayout.Button("Spawn Reaper")) { GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.ReaperLeviathan, true); GameObject gameObject = Utils.CreatePrefab(prefabForTechType); LargeWorldEntity.Register(gameObject); CrafterLogic.NotifyCraftEnd(gameObject, TechType.ReaperLeviathan); gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver); reaper = gameObject.GetComponentInChildren <ReaperLeviathan>(); gameObject.transform.position += 50f * gameObject.transform.forward; } } else { GUILayout.Space(10); if (GUILayout.Button("Reaper Components")) { foreach (Component c in reaper.GetComponentsInChildren(typeof(Component))) { Log.Print("Component: " + c + " on go: " + c.gameObject.name); } } if (GUILayout.Button("Delete Reaper")) { Destroy(reaper.gameObject); } GUILayout.Space(10); } if (crabsquid == null) { if (GUILayout.Button("Spawn Crabsquid")) { GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.CrabSquid, true); GameObject gameObject = Utils.CreatePrefab(prefabForTechType); LargeWorldEntity.Register(gameObject); CrafterLogic.NotifyCraftEnd(gameObject, TechType.CrabSquid); gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver); crabsquid = gameObject.GetComponentInChildren <CrabSquid>(); gameObject.transform.position += 50f * gameObject.transform.forward; } } else { GUILayout.Space(10); if (GUILayout.Button("Crabsquid Components")) { foreach (Component c in crabsquid.GetComponentsInChildren(typeof(Component))) { Log.Print("Component: " + c + " on go: " + c.gameObject.name); } } if (GUILayout.Button("Delete Crabsquid")) { Destroy(crabsquid.gameObject); } GUILayout.Space(10); } if (ghostlevi == null) { if (GUILayout.Button("Spawn Ghost Levi")) { GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.GhostLeviathan, true); GameObject gameObject = Utils.CreatePrefab(prefabForTechType); LargeWorldEntity.Register(gameObject); CrafterLogic.NotifyCraftEnd(gameObject, TechType.GhostLeviathan); gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver); ghostlevi = gameObject.GetComponentInChildren <GhostLeviathan>(); gameObject.transform.position += 50f * gameObject.transform.forward; } } else { GUILayout.Space(10); if (GUILayout.Button("Ghost Levi Components")) { foreach (Component c in ghostlevi.GetComponentsInChildren(typeof(Component))) { Log.Print("Component: " + c + " on go: " + c.gameObject.name); } } if (GUILayout.Button("Delete Ghost Levi")) { Destroy(ghostlevi.gameObject); } GUILayout.Space(10); } if (seaDragon == null) { if (GUILayout.Button("Spawn Seadragon")) { GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.SeaDragon, true); GameObject gameObject = Utils.CreatePrefab(prefabForTechType); LargeWorldEntity.Register(gameObject); CrafterLogic.NotifyCraftEnd(gameObject, TechType.SeaDragon); gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver); seaDragon = gameObject.GetComponentInChildren <SeaDragon>(); gameObject.transform.position += 50f * gameObject.transform.forward; } } else { GUILayout.Space(10); if (GUILayout.Button("Seadragon Components")) { foreach (Component c in seaDragon.GetComponentsInChildren(typeof(Component))) { Log.Print("Component: " + c + " on go: " + c.gameObject.name); } } if (GUILayout.Button("Delete Seadragon")) { Destroy(seaDragon.gameObject); } GUILayout.Space(10); } if (warper == null) { if (GUILayout.Button("Spawn warper")) { GameObject prefabForTechType = CraftData.GetPrefabForTechType(TechType.Warper, true); GameObject gameObject = Utils.CreatePrefab(prefabForTechType); LargeWorldEntity.Register(gameObject); CrafterLogic.NotifyCraftEnd(gameObject, TechType.Warper); gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver); warper = gameObject.GetComponentInChildren <Warper>(); gameObject.transform.position += 50f * gameObject.transform.forward; } } else { GUILayout.Space(10); if (GUILayout.Button("Warper Components")) { foreach (Component c in warper.GetComponentsInChildren(typeof(Component))) { Log.Print("Component: " + c + " on go: " + c.gameObject.name); } } if (GUILayout.Button("Delete Warper")) { Destroy(warper.gameObject); } GUILayout.Space(10); } }
public override GameObject GetGameObject() => GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.VehicleArmorPlating));
public override GameObject GetGameObject() { return(CraftData.GetPrefabForTechType(TechType.MapRoomUpgradeScanRange)); }
public void SlotArmUp() { #if OUTSIDE_TEST_ENABLED #else if (!Player.main.inSeamoth || !AvatarInputHandler.main.IsEnabled()) { return; } #endif if (currentSelectedArm == SeamothArm.Left) { leftButtonDownProcessed = false; QuickSlotType quickSlotType = CraftData.GetQuickSlotType(currentLeftArmType); if (quickSlotType == QuickSlotType.Selectable) { leftArm.OnUseUp(out float coolDown); } else if (quickSlotType == QuickSlotType.SelectableChargeable) { if (!seamoth.IsPowered()) { return; } if (seamoth.GetSlotProgress(LeftArmSlotID) != 1f) { return; } if (leftArm.OnUseUp(out float coolDown)) { quickSlotTimeUsed[LeftArmSlotID] = Time.time; quickSlotCooldown[LeftArmSlotID] = coolDown; } quickSlotCharge[LeftArmSlotID] = 0f; } } else if (currentSelectedArm == SeamothArm.Right) { rightButtonDownProcessed = false; QuickSlotType quickSlotType = CraftData.GetQuickSlotType(currentRightArmType); if (quickSlotType == QuickSlotType.Selectable) { rightArm.OnUseUp(out float coolDown); } else if (quickSlotType == QuickSlotType.SelectableChargeable) { if (!seamoth.IsPowered()) { return; } if (seamoth.GetSlotProgress(RightArmSlotID) != 1f) { return; } if (rightArm.OnUseUp(out float coolDown)) { quickSlotTimeUsed[RightArmSlotID] = Time.time; quickSlotCooldown[RightArmSlotID] = coolDown; } quickSlotCharge[LeftArmSlotID] = 0f; } } }
static void setCauseOfDeath(DamageType damageType) { try { switch (damageType) { case DamageType.Acid: DeathRun.setCause("Acid"); break; case DamageType.Collide: DeathRun.setCause("Collision"); break; case DamageType.Electrical: DeathRun.setCause("Electrocution"); break; case DamageType.Explosive: DeathRun.setCause("Explosion"); break; case DamageType.Fire: DeathRun.setCause("Burned to Death"); break; case DamageType.Heat: DeathRun.setCause("Extreme Heat"); break; case DamageType.Poison: DeathRun.setCause("Poison"); break; case DamageType.Pressure: DeathRun.setCause("Pressure"); break; case DamageType.Puncture: DeathRun.setCause("Puncture Wounds"); break; case DamageType.Radiation: DeathRun.setCause("Radiation"); break; case DamageType.Smoke: DeathRun.setCause("Smoke Asphyxiation"); break; //case DamageType.Starve: //case DamageType.Normal: default: if (DeathRun.CAUSE_UNKNOWN_CREATURE.Equals(DeathRun.cause)) { if (DeathRun.causeObject != null) { GameObject go; TechType t = CraftData.GetTechType(DeathRun.causeObject, out go); if (t != TechType.None) { DeathRun.setCause(Language.main.Get(t.AsString(false))); CattleLogger.Message("Cause of Death: " + DeathRun.cause); } else { CattleLogger.Message("(Couldn't find creature that caused player death) - "); } } } break; } } catch (Exception ex) { CattleLogger.GenericError("Getting cause of death", ex); } }
private static IEnumerator GetPrefabForList(TechType breakable, TechType techType, float chance) { var task = CraftData.GetPrefabForTechTypeAsync(techType, false); #if SUBNAUTICA_STABLE if (BreakableResource_ChooseRandomResource.prefabs.ContainsKey(breakable)) { var existingPrefab = BreakableResource_ChooseRandomResource.prefabs[breakable].Find((x) => CraftData.GetTechType(x.prefab) == techType); if (existingPrefab != null) { existingPrefab.chance = chance; } else { yield return(task); var gameObject = task.GetResult(); if (gameObject != null) { BreakableResource_ChooseRandomResource.prefabs[breakable].Add(new BreakableResource.RandomPrefab() { prefab = gameObject, chance = chance }); } } } else { BreakableResource_ChooseRandomResource.prefabs[breakable] = new List <BreakableResource.RandomPrefab>(); yield return(task); var gameObject = task.GetResult(); if (gameObject != null) { BreakableResource_ChooseRandomResource.prefabs[breakable].Add(new BreakableResource.RandomPrefab() { prefab = gameObject, chance = chance }); } } #else if (!BreakableResource_ChooseRandomResource.prefabs.ContainsKey(breakable)) { BreakableResource_ChooseRandomResource.prefabs[breakable] = new List <BreakableResource.RandomPrefab>(); } var existingPrefab = BreakableResource_ChooseRandomResource.prefabs[breakable].Find((x) => x.prefabTechType == techType); if (existingPrefab != null) { existingPrefab.chance = chance; yield break; } yield return(task); var gameObject = task.GetResult(); if (gameObject != null && PrefabDatabase.TryGetPrefabFilename(gameObject.GetComponent <PrefabIdentifier>().ClassId, out var filename)) { BreakableResource_ChooseRandomResource.prefabs[breakable].Add(new BreakableResource.RandomPrefab() { prefabTechType = techType, prefabReference = new AssetReferenceGameObject(filename), chance = chance }); } #endif }
/// <summary> /// This is a copy paste of the original <see cref="Survival.Eat(GameObject)"/> because there are too many things to transpile /// </summary> /// <param name="__instance"></param> /// <param name="useObj"></param> private void NewPrefixPatch(Survival __instance, GameObject useObj) { flag = false; if (useObj != null) { Eatable component = useObj.GetComponent <Eatable>(); if (component != null) { if (component.GetFoodValue() != 0f) { float miniFoodOverfill = __instance.GetStomachSize() - 1; if (__instance.food <= miniFoodOverfill) { __instance.food = Mathf.Clamp(__instance.food + component.GetFoodValue(), 0f, __instance.GetStomachOverfillSize()); } __instance.onEat.Trigger(component.GetFoodValue()); if (component.GetFoodValue() > 0f) { GoalManager.main.OnCustomGoalEvent("Eat_Something"); } flag = true; } if (component.GetWaterValue() != 0f) { float minWaterOverfill = __instance.GetWaterCapacity() - 1; if (__instance.water <= minWaterOverfill) { __instance.water = Mathf.Clamp(__instance.water + component.GetWaterValue(), 0f, __instance.GetWaterOverfillSize()); } __instance.onDrink.Trigger(component.GetWaterValue()); if (component.GetWaterValue() > 0f) { GoalManager.main.OnCustomGoalEvent("Drink_Something"); } flag = true; } var lowFoodThreshold = __instance.GetLowFoodThreshold(); var lowWaterThreshold = __instance.GetLowWaterThreshold(); bool foodOkay = (__instance.food > lowFoodThreshold && __instance.food - component.GetFoodValue() < lowFoodThreshold); bool waterOkay = (__instance.water > lowWaterThreshold && __instance.water - component.GetWaterValue() < lowWaterThreshold); if (foodOkay || waterOkay) { __instance.vitalsOkNotification.Play(); } } if (flag) { TechType techType = CraftData.GetTechType(useObj); if (techType == TechType.None) { Pickupable component2 = useObj.GetComponent <Pickupable>(); if (component2) { techType = component2.GetTechType(); } } FMODUWE.PlayOneShot(CraftData.GetUseEatSound(techType), Player.main.transform.position, 1f); if (techType == TechType.Bladderfish) { Player.main.GetComponent <OxygenManager>().AddOxygen(__instance.GetO2FromBlatterfish()); } } } }
public void CreateCannonLeft() { cannon_base_left = new GameObject("cannon_base_left"); cannon_base_left.transform.SetParent(gameObject.transform); cannon_base_left.transform.localPosition = new Vector3(3.55f, -7.19f, 0.81f); cannon_base_left.transform.localRotation = Quaternion.Euler(0f, 0f, 0f); GameObject cannon_left_circuit_box = CraftData.InstantiateFromPrefab(TechType.StarshipCircuitBox); cannon_left_circuit_box.transform.SetParent(cannon_base_left.transform, false); cannon_left_circuit_box.CleanObject(); cannon_left_circuit_box.name = "cannon_left_circuit_box"; cannon_left_circuit_box.transform.localPosition = new Vector3(0.56f, 0.48f, -0.66f); cannon_left_circuit_box.transform.localScale = new Vector3(0.72f, 0.72f, 0.72f); cannon_left_circuit_box.transform.localRotation = Quaternion.Euler(72f, 90f, 0f); GameObject cannon_pylon_left = CraftData.InstantiateFromPrefab(TechType.PowerTransmitter); cannon_pylon_left.transform.SetParent(cannon_base_left.transform, false); Utils.ZeroTransform(cannon_pylon_left.transform); GameObject laserBeam = Instantiate(cannon_pylon_left.GetComponent <PowerFX>().vfxPrefab, cannon_base_left.transform, false); laserBeam.SetActive(false); LineRenderer lineRenderer = laserBeam.GetComponent <LineRenderer>(); lineRenderer.startWidth = 0.2f; lineRenderer.endWidth = 0.2f; lineRenderer.positionCount = 2; lineRenderer.material.color = beamcolor; Destroy(cannon_pylon_left.FindChild("powerFX_AttachPoint")); Destroy(cannon_pylon_left.FindChild("builder trigger")); cannon_pylon_left.CleanObject(); cannon_pylon_left.name = "cannon_pylon_left"; cannon_pylon_left.transform.localPosition = new Vector3(0.00f, 0.44f, 0f); cannon_pylon_left.transform.localRotation = Quaternion.Euler(0f, 180f, 180f); cannon_left_rotation_point = new GameObject("cannon_left_rotation_point"); cannon_left_rotation_point.transform.SetParent(cannon_pylon_left.transform, false); cannon_left_rotation_point.transform.localPosition = new Vector3(0.00f, 0.98f, 0.00f); cannon_left_rotation_point.transform.localRotation = Quaternion.Euler(25f, 180f, 0f); GameObject cannon_left = CraftData.InstantiateFromPrefab(TechType.ExosuitTorpedoArmModule); cannon_left.transform.SetParent(cannon_left_rotation_point.transform, false); Destroy(cannon_left.FindChild("GameObject")); cannon_left.transform.Find("model/exosuit_rig_armLeft:exosuit_torpedoLauncher_geo").name = "cannon_model"; cannon_left.CleanObject(); cannon_left.name = "cannon_left"; cannon_left.transform.localPosition = new Vector3(0.00f, 0.14f, -0.66f); cannon_left.transform.localRotation = Quaternion.Euler(0f, 270f, 180f); SetMeshMaterial(cannon_left.transform.Find("model/cannon_model").gameObject, Main.cannon_material, 1); cannon_left_tube_right = Instantiate(laserBeam, cannon_left.transform, Vector3.zero, Quaternion.identity, false); cannon_left_tube_right.name = "cannon_left_tube_right"; cannon_left_tube_right.transform.localPosition = new Vector3(0.68f, 0.0f, -0.17f); cannon_left_tube_right.transform.localRotation = Quaternion.Euler(0f, 90f, 0f); left_right = cannon_left_tube_right.GetComponent <LineRenderer>(); cannon_left_tube_left = Instantiate(laserBeam, cannon_left.transform, Vector3.zero, Quaternion.identity, false); cannon_left_tube_left.name = "cannon_left_tube_left"; cannon_left_tube_left.transform.localPosition = new Vector3(0.68f, 0.0f, 0.17f); cannon_left_tube_left.transform.localRotation = Quaternion.Euler(0f, 90f, 0f); left_left = cannon_left_tube_left.GetComponent <LineRenderer>(); Destroy(laserBeam); }
// Token: 0x06000016 RID: 22 RVA: 0x00003018 File Offset: 0x00001218 public void OnConsoleCommand_waterparkspawn(NotificationCenter.Notification n) { bool flag = !Player.main.currentWaterPark; if (flag) { ErrorMessage.AddDebug("Not currently inside a waterpark!"); } else { bool flag2 = n != null && n.data != null && n.data.Count > 0; if (flag2) { string text = (string)n.data[0]; TechType techType; bool flag3 = UWE.Utils.TryParseEnum <TechType>(text, out techType); if (flag3) { bool flag4 = CraftData.IsAllowed(techType); if (flag4) { GameObject prefabForTechType = CraftData.GetPrefabForTechType(techType, true); bool flag5 = prefabForTechType != null; if (flag5) { bool flag6 = prefabForTechType.GetComponent <Creature>(); if (flag6) { int num = 1; int num2; bool flag7 = n.data.Count > 1 && int.TryParse((string)n.data[1], out num2); if (flag7) { num = num2; } bool flag8 = n.data.Count > 2; if (flag8) { float num3 = float.Parse((string)n.data[2]); } Debug.Log(string.Format("Spawning {0} {1}", num, techType)); for (int i = 0; i < num; i++) { WaterParkCreature.Born(techType, Player.main.currentWaterPark, Player.main.transform.position); } } else { ErrorMessage.AddDebug("Not valid creature!"); } } else { ErrorMessage.AddDebug("Could not find prefab for TechType = " + techType); } } } else { ErrorMessage.AddDebug("Could not parse " + text + " as TechType"); } } } }
public static void playToothSound() { System.Random random = new System.Random(); FMODUWE.PlayOneShot(CraftData.GetPrefabForTechType(TechType.Stalker).GetComponent <Stalker>().loseToothSound, new Vector3(Player.main.transform.position.x - random.Next(-8, 8), Player.main.transform.position.y - random.Next(-8, 7), Player.main.transform.position.z - random.Next(-7, 8)), 1f); }
public static void Postfix() { if (!uGUI_BuilderMenu.IsOpen() && Input.GetMouseButton(2) && !Builder.isPlacing) { if (Targeting.GetTarget(Player.main.gameObject, 200f, out GameObject result, out _)) { if (Targeting.GetRoot(result, out TechType techType, out GameObject gameObject) && CraftData.IsBuildableTech(techType)) { if (Builder.Begin(gameObject)) { ErrorMessage.AddMessage($"Placing new {techType}"); } else { Builder.End(); } } } } }
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(); #if SUBNAUTICA TechData techData = CraftDataHandler.GetTechData(techType); #elif BELOWZERO RecipeData techData = CraftDataHandler.GetRecipeData(techType); #endif if (!GameInput.GetButtonHeld(GameInput.Button.Deconstruct) && techType != TechType.Titanium && techData != null && techData.ingredientCount > 0 && Main.BatteryCheck(item.item)) { if (CheckRequirements(__instance, item.item, techData)) { foreach (Ingredient ingredient in techData.Ingredients) { for (int i = ingredient.amount; i > 0; i--) { GameObject gameObject = CraftData.InstantiateFromPrefab(ingredient.techType, false); gameObject.SetActive(true); Pickupable pickupable = gameObject.GetComponent <Pickupable>(); pickupable.Pickup(false); if ((item.item.GetComponent <IBattery>() == null && pickupable.GetComponent <IBattery>() != null && QModServices.Main.ModPresent("NoBattery")) || pickupable.GetComponent <LiveMixin>() != null) { UnityEngine.Object.Destroy(pickupable.gameObject); } else { forcePickupItems.Add(pickupable); } } } break; } } else { if (GameInput.GetButtonHeld(GameInput.Button.Deconstruct)) { 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); }
public override GameObject GetGameObject() { var glass = GameObject.Instantiate(CraftData.GetPrefabForTechType(TechType.Glass)); return(glass); }
public static void Patch() { bundle = AssetBundle.LoadFromFile(Path.Combine(Environment.CurrentDirectory, "QMods/5H-4RK Submersible/shark")); sharkTech = TechTypeHandler.AddTechType("Shark", "5H-4RK Submersible", "An ancient alien vessel designed to mimic local fauna"); SpriteHandler.RegisterSprite(sharkTech, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/Shark_Icon.png"); SharkPrefab prefab = new SharkPrefab("Shark", "WorldEntities/Vehicles/Shark", sharkTech); PrefabHandler.RegisterPrefab(prefab); TechType ingotTech; if (!TechTypeHandler.TryGetModdedTechType("PrecursorIngot", out ingotTech)) { throw new Exception("SHARK TRIED LOADING BUT PRECURSOR FABRICATOR NOT FOUND"); } TechData data = new TechData(); data.craftAmount = 1; data.Ingredients = new List <Ingredient>() { new Ingredient(TechType.AdvancedWiringKit, 1), new Ingredient(TechType.Magnetite, 3), new Ingredient(TechType.PrecursorKey_Purple, 1), new Ingredient(TechType.PrecursorIonCrystal, 1), new Ingredient(ingotTech, 3) }; CraftTreeHandler.AddCraftingNode(CraftTree.Type.Constructor, sharkTech, "Vehicles"); CraftDataHandler.SetTechData(sharkTech, data); CraftData.GetCraftTime(TechType.Seamoth, out float time); CraftDataHandler.SetCraftingTime(sharkTech, time); SpriteHandler.RegisterSprite(SpriteManager.Group.Pings, "SharkPing", Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/SharkPing_Icon.png"); HarmonyInstance harm = HarmonyInstance.Create("Kylinator25.SharkSub"); harm.PatchAll(Assembly.GetExecutingAssembly()); Shark.laserTechType = TechTypeHandler.AddTechType("SharkLaserCannon", "5H-4RK Ranged Combat Module", "Equips the vessel with mid to long range combat capabilities."); CraftDataHandler.SetEquipmentType(Shark.laserTechType, (EquipmentType)sharkTech); CraftDataHandler.SetQuickSlotType(Shark.laserTechType, QuickSlotType.Passive); PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkLaserCannon", "WorldEntities/Upgrades/SharkLaserCannon", Shark.laserTechType)); Shark.ramTechType = TechTypeHandler.AddTechType("SharkBatteringRam", "5H-4RK Momentum-Based Combat Module", "Equips the vessel with hardlight blades to lacerate prey at high velocity"); CraftDataHandler.SetEquipmentType(Shark.ramTechType, (EquipmentType)sharkTech); CraftDataHandler.SetQuickSlotType(Shark.ramTechType, QuickSlotType.Passive); PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkBatteringRam", "WorldEntities/Upgrades/SharkBatteringRam", Shark.ramTechType)); Shark.visionTechType = TechTypeHandler.AddTechType("SharkVision", "5H-4RK Precursor Vision Module", "Allows the vessel's pilot to visualise potential targets through obstructive media"); CraftDataHandler.SetEquipmentType(Shark.visionTechType, (EquipmentType)sharkTech); CraftDataHandler.SetQuickSlotType(Shark.visionTechType, QuickSlotType.Selectable); SpriteHandler.RegisterSprite(Shark.visionTechType, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/SharkVision_Icon.png"); PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkVision", "WorldEntities/Upgrades/SharkVision", Shark.visionTechType)); Shark.shieldTechType = TechTypeHandler.AddTechType("SharkShield", "5H-4RK External Defense Module", "Projects a light energy shield around the submersible, which must recharge once depleted"); CraftDataHandler.SetEquipmentType(Shark.shieldTechType, (EquipmentType)sharkTech); CraftDataHandler.SetQuickSlotType(Shark.shieldTechType, QuickSlotType.Selectable); PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkShield", "WorldEntities/Upgrades/SharkShield", Shark.shieldTechType)); Shark.blinkTechType = TechTypeHandler.AddTechType("SharkBlink", "5H-4RK Warp Evasion Module", "Uses warper technology to rapidly move the submersible in any direction"); CraftDataHandler.SetEquipmentType(Shark.blinkTechType, (EquipmentType)sharkTech); CraftDataHandler.SetQuickSlotType(Shark.blinkTechType, QuickSlotType.Selectable); SpriteHandler.RegisterSprite(Shark.blinkTechType, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/SharkBlink_Icon.png"); PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkBlink", "WorldEntities/Upgrades/SharkBlink", Shark.blinkTechType)); Shark.drillTechType = TechTypeHandler.AddTechType("SharkDrill", "5H-4RK Resource Acquisition Module", "Uses a steady beam of focused light to collect resources"); CraftDataHandler.SetEquipmentType(Shark.drillTechType, (EquipmentType)sharkTech); CraftDataHandler.SetQuickSlotType(Shark.drillTechType, QuickSlotType.Selectable); SpriteHandler.RegisterSprite(Shark.drillTechType, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/SharkDrill_Icon.png"); PrefabHandler.RegisterPrefab(new SharkUpgradePrefab("SharkDrill", "WorldEntities/Upgrades/SharkDrill", Shark.drillTechType)); Shark.internalBattery = TechTypeHandler.AddTechType("SharkBattery_Internal", "battery baybee", "you shouldn't be holding this item"); PrefabHandler.RegisterPrefab(new SharkBatteryPrefab("SharkBattery_Internal", "WorldEntities/Batteris/SharkBattery", Shark.internalBattery)); Shark.depletedIonCube = TechTypeHandler.AddTechType("IonCubeEmpty", "Depleted Ion Cube", "This Ion Cube has gone dark, depleted of energy"); SpriteHandler.RegisterSprite(Shark.depletedIonCube, Environment.CurrentDirectory + "/QMods/5H-4RK Submersible/Assets/DepletedCrystal_Icon.png"); PrefabHandler.RegisterPrefab(new DepletedCrystalPrefab("IonCubeEmpty", "WorldEntites/Doodads/EmptyIonCube", Shark.depletedIonCube)); Shark.ionFragment = TechTypeHandler.AddTechType("IonFragment", "Ion Cube Fragment", "A chunk of a depleted ion cube, suitable for advanced electronics fabrication"); TechData fragmentData = new TechData(); fragmentData.craftAmount = 3; fragmentData.Ingredients = new List <Ingredient>() { new Ingredient(Shark.depletedIonCube, 1), }; CraftDataHandler.SetTechData(Shark.ionFragment, fragmentData); Shark.sharkEngine = TechTypeHandler.AddTechType("SharkEngine", "5H-4RK Engine", "This converter is specially designed to convert energy from Ion Cubes directly into underwater thrust"); Shark.sharkComputer = TechTypeHandler.AddTechType("SharkComputer", "5H-4RK Internal Computer Systems", "This alien processor seems to be built to " + "manage several submersible-related subroutines"); Shark.sharkHull = TechTypeHandler.AddTechType("SharkHull", "5H-4RK Hull Plating", "Alien metal that is designed to be very slightly flexible and " + "lightweight, to allow for maneuverability while maintaining integrity under extreme pressure"); seeThroughMat = bundle.LoadAsset <Material>("Assets/Materials/Shark/wallvision.mat"); }
public static string getPrefabClassId(TechType techType) => CraftData.GetClassIdForTechType(techType);
private Optional <VehicleMovementData> GetVehicleMovement() { Vehicle vehicle = Player.main.GetVehicle(); SubRoot sub = Player.main.GetCurrentSub(); NitroxId id; Vector3 position; Quaternion rotation; Vector3 velocity; Vector3 angularVelocity; TechType techType; float steeringWheelYaw = 0f, steeringWheelPitch = 0f; bool appliedThrottle = false; Vector3 leftArmPosition = new Vector3(0, 0, 0); Vector3 rightArmPosition = new Vector3(0, 0, 0); if (vehicle != null) { id = NitroxEntity.GetId(vehicle.gameObject); position = vehicle.gameObject.transform.position; rotation = vehicle.gameObject.transform.rotation; techType = CraftData.GetTechType(vehicle.gameObject); Rigidbody rigidbody = vehicle.gameObject.GetComponent <Rigidbody>(); velocity = rigidbody.velocity; angularVelocity = rigidbody.angularVelocity; // Required because vehicle is either a SeaMoth or an Exosuit, both types which can't see the fields either. steeringWheelYaw = vehicle.steeringWheelYaw; steeringWheelPitch = vehicle.steeringWheelPitch; // Vehicles (or the SeaMoth at least) do not have special throttle animations. Instead, these animations are always playing because the player can't even see them (unlike the cyclops which has cameras). // So, we need to hack in and try to figure out when thrust needs to be applied. if (vehicle && AvatarInputHandler.main.IsEnabled()) { if (techType == TechType.Seamoth) { bool flag = vehicle.transform.position.y < Ocean.main.GetOceanLevel() && vehicle.transform.position.y < vehicle.worldForces.waterDepth && !vehicle.precursorOutOfWater; appliedThrottle = flag && GameInput.GetMoveDirection().sqrMagnitude > .1f; } else if (techType == TechType.Exosuit) { Exosuit exosuit = vehicle as Exosuit; if (exosuit) { appliedThrottle = exosuit._jetsActive && exosuit.thrustPower > 0f; Transform leftAim = exosuit.aimTargetLeft; Transform rightAim = exosuit.aimTargetRight; Vector3 eulerAngles = exosuit.transform.eulerAngles; eulerAngles.x = MainCamera.camera.transform.eulerAngles.x; Quaternion quaternion = Quaternion.Euler(eulerAngles.x, eulerAngles.y, eulerAngles.z); leftArmPosition = leftAim.transform.position = MainCamera.camera.transform.position + quaternion * Vector3.forward * 100f; rightArmPosition = rightAim.transform.position = MainCamera.camera.transform.position + quaternion * Vector3.forward * 100f; } } } } else if (sub != null && Player.main.isPiloting) { id = NitroxEntity.GetId(sub.gameObject); position = sub.gameObject.transform.position; rotation = sub.gameObject.transform.rotation; Rigidbody rigidbody = sub.GetComponent <Rigidbody>(); velocity = rigidbody.velocity; angularVelocity = rigidbody.angularVelocity; techType = TechType.Cyclops; SubControl subControl = sub.GetComponent <SubControl>(); steeringWheelYaw = subControl.steeringWheelYaw; steeringWheelPitch = subControl.steeringWheelPitch; appliedThrottle = subControl.appliedThrottle && subControl.canAccel; } else { return(Optional.Empty); } VehicleMovementData model = VehicleMovementFactory.GetVehicleMovementData(techType, id, position, rotation, velocity, angularVelocity, steeringWheelYaw, steeringWheelPitch, appliedThrottle, leftArmPosition, rightArmPosition); return(Optional.Of(model)); }
#pragma warning restore CS0618 #endif public static CoroutineTask <GameObject> getPrefabAsync(TechType techType) { $"PrefabUtils: getPrefabAsync(TechType.{techType})".logDbg(); return(CraftData.GetPrefabForTechTypeAsync(techType)); }
public static void Postfix(Eatable __instance, ref float __result) { if (Config.FOOD_OMNIVORE.Equals(DeathRun.config.foodChallenge)) { return; } TechType t = CraftData.GetTechType(__instance.gameObject); if (Config.FOOD_VEGAN.Equals(DeathRun.config.foodChallenge) || Config.FOOD_PESCATARIAN.Equals(DeathRun.config.foodChallenge)) { if (t == TechType.NutrientBlock) { __result = -25f; return; } if (t == TechType.Snack1) { __result = -25f; return; } if (Config.FOOD_PESCATARIAN.Equals(DeathRun.config.foodChallenge)) { if ((t == TechType.Snack2) || (t == TechType.Snack3)) { __result = -25f; return; } } } if ((t == TechType.CookedPeeper) || (t == TechType.Peeper) || (t == TechType.CuredPeeper) || (t == TechType.CookedHoleFish) || (t == TechType.HoleFish) || (t == TechType.CuredHoleFish) || (t == TechType.CookedGarryFish) || (t == TechType.GarryFish) || (t == TechType.CuredGarryFish) || (t == TechType.CookedReginald) || (t == TechType.Reginald) || (t == TechType.CuredReginald) || (t == TechType.CookedBladderfish) || (t == TechType.Bladderfish) || (t == TechType.CuredBladderfish) || (t == TechType.CookedHoverfish) || (t == TechType.Hoverfish) || (t == TechType.CuredHoverfish) || (t == TechType.CookedSpadefish) || (t == TechType.Spadefish) || (t == TechType.CuredSpadefish) || (t == TechType.CookedBoomerang) || (t == TechType.Boomerang) || (t == TechType.CuredBoomerang) || (t == TechType.CookedLavaBoomerang) || (t == TechType.LavaBoomerang) || (t == TechType.CuredLavaBoomerang) || (t == TechType.CookedEyeye) || (t == TechType.Eyeye) || (t == TechType.CuredEyeye) || (t == TechType.CookedLavaEyeye) || (t == TechType.LavaEyeye) || (t == TechType.CuredLavaEyeye) || (t == TechType.CookedOculus) || (t == TechType.Oculus) || (t == TechType.CuredOculus) || (t == TechType.CookedHoopfish) || (t == TechType.Hoopfish) || (t == TechType.CuredHoopfish) || (t == TechType.CookedSpinefish) || (t == TechType.Spinefish) || (t == TechType.CuredSpinefish)) { if (!Config.FOOD_PESCATARIAN.Equals(DeathRun.config.foodChallenge)) { __result = -25f; } } else { if (Config.FOOD_PESCATARIAN.Equals(DeathRun.config.foodChallenge) && (__result > 0)) { __result = -25f; } } }
public override GameObject GetGameObject() { var prefab = CraftData.GetPrefabForTechType(TechType.ReinforcedGloves); return(ModifyAndInstantiateGameObject(prefab)); }