public void Awake() { hoverbike = GetComponent <Hoverbike>(); modules = hoverbike.modules; BZLogger.Debug("WaterRideManager", "Adding slot listener handlers..."); modules.onEquip += OnEquip; modules.onUnequip += OnUnEquip; }
internal static void KEYBINDINGS_ToConfig() { BZLogger.Debug("Method call: SEConfig.KEYBINDINGS_ToConfig()"); foreach (string key in SECTION_HOTKEYS) { Hotkeys_Config[key] = InputHelper.KeyCodeToString(KEYBINDINGS[key]); } Config_Write(); }
internal static bool Prefix(string key, Transform parent, Vector3 position, Quaternion rotation, bool awake, ref CoroutineTask <GameObject> __result) { if (key.Equals(Main.fragment.VirtualPrefabFilename)) { BZLogger.Debug($"InstantiateAsync_Patch(Scanner), key: {key}"); __result = Main.fragment.SpawnFragmentAsync(parent, position, rotation, awake); return(false); } return(true); }
internal static bool Prefix(string key, Transform parent, Vector3 position, Quaternion rotation, bool awake, ref CoroutineTask <GameObject> __result) { if (Main.ArmFragmentPrefabs.TryGetValue(key, out SeaTruckArmFragment fragment)) { BZLogger.Debug($"InstantiateAsync_Patch(Arms), key: {key}"); __result = fragment.SpawnFragmentAsync(parent, position, rotation, awake); return(false); } return(true); }
internal static void Config_Write() { BZLogger.Debug("Method call: SEzConfig.WriteConfig()"); ParserHelper.SetAllKeyValuesInSection(FILENAME, "Hotkeys", Hotkeys_Config); ParserHelper.SetKeyValue(FILENAME, "Settings", SECTION_SETTINGS[0], MAXSLOTS.ToString()); ParserHelper.SetKeyValue(FILENAME, "Settings", SECTION_SETTINGS[1], ColorHelper.GetColorName(TEXTCOLOR)); ParserHelper.SetKeyValue(FILENAME, "Settings", SECTION_SETTINGS[2], SLOT_LAYOUT.ToString()); BZLogger.Log("Configuration saved."); }
/* * public static IEnumerable<string> SessionNewSeatruckSlotIDs * { * get * { * foreach (SlotData slotData in SessionSeatruckSlots) * { * if (slotData.SlotType != SlotType.OriginalNormal) * { * yield return slotData.SlotID; * } * } * } * } */ /* * public static IEnumerable<string> SessionNewExosuitSlotIDs * { * get * { * foreach (SlotData slotData in SessionExosuitSlots) * { * if (slotData.SlotType == SlotType.CloneNormal) * { * yield return slotData.SlotID; * } * } * } * } */ /* * public static IEnumerable<string> SessionNewChipSlotIDs * { * get * { * foreach (SlotData slotData in NewChipSlots) * { * yield return slotData.SlotID; * } * } * } */ public static void InitSlotIDs() { BZLogger.Debug("Method call: SlotHelper.InitSlotIDs()"); for (int i = 0; i < SEzConfig.EXTRASLOTS; i++) { SessionSeatruckSlots.Add(NewSeatruckSlots[i]); SessionExosuitSlots.Add(NewExosuitSlots[i]); } if (SEzConfig.isSeatruckArmsExists) { foreach (SlotData slotData in NewSeatruckSlots) { SlotType slotType = slotData.SlotType; if (slotType == SlotType.CloneArmLeft || slotType == SlotType.CloneArmRight) { SessionSeatruckSlots.Add(slotData); } } } NewChipSlotIDs = new string[NewChipSlots.Count]; for (int i = 0; i < NewChipSlotIDs.Length; i++) { NewChipSlotIDs[i] = NewChipSlots[i].SlotID; } NewHoverbikeSlotIDs = new string[NewHoverbikeSlots.Count]; for (int i = 0; i < NewHoverbikeSlotIDs.Length; i++) { NewHoverbikeSlotIDs[i] = NewHoverbikeSlots[i].SlotID; } SessionExosuitSlotIDs = new string[SessionExosuitSlots.Count]; for (int i = 0; i < SessionExosuitSlotIDs.Length; i++) { SessionExosuitSlotIDs[i] = SessionExosuitSlots[i].SlotID; } SessionSeatruckSlotIDs = new string[SessionSeatruckSlots.Count]; for (int i = 0; i < SessionSeatruckSlotIDs.Length; i++) { SessionSeatruckSlotIDs[i] = SessionSeatruckSlots[i].SlotID; } BZLogger.Log("Session slotID's created."); }
internal static void Config_Init() { BZLogger.Debug("Method call: SEzConfig.Config_Init()"); SLOTKEYBINDINGS_Update(); KEYBINDINGS_Set(); SLOTKEYBINDINGS_SyncToAll(); BZLogger.Log("Configuration initialized."); }
private IEnumerator LoadExosuitResourcesAsync() { IPrefabRequest request = PrefabDatabase.GetPrefabForFilenameAsync("WorldEntities/Tools/Exosuit.prefab"); yield return(request); if (!request.TryGetPrefab(out GameObject prefab)) { BZLogger.Debug("Cannot load Exosuit prefab!"); yield break; } BZLogger.Debug("Exosuit prefab loaded!"); GameObject exosuitResource = UWE.Utils.InstantiateDeactivated(prefab, transform, Vector3.zero, Quaternion.identity); exosuitResource.GetComponent <Exosuit>().enabled = false; exosuitResource.GetComponent <Rigidbody>().isKinematic = true; exosuitResource.GetComponent <WorldForces>().enabled = false; UWE.Utils.ZeroTransform(exosuitResource.transform); GameObject exoStorage = objectHelper.FindDeepChild(exosuitResource.transform, "Exosuit_01_storage"); objectHelper.GetPrefabClone(ref exoStorage, StorageLeft.transform, true, "model", out GameObject leftStorageModel); leftStorageModel.SetActive(false); objectHelper.GetPrefabClone(ref leftStorageModel, StorageRight.transform, true, "model", out GameObject rightStorageModel); rightStorageModel.SetActive(false); BoxCollider colliderLeft = StorageLeft.AddComponent <BoxCollider>(); colliderLeft.enabled = false; colliderLeft.size = new Vector3(1.0f, 0.4f, 0.8f); BoxCollider colliderRight = StorageRight.AddComponent <BoxCollider>(); colliderRight.enabled = false; colliderRight.size = new Vector3(1.0f, 0.4f, 0.8f); ColorizationHelper.AddRendererToSkyApplier(gameObject, leftStorageModel, Skies.Auto); ColorizationHelper.AddRendererToColorCustomizer(gameObject, leftStorageModel, false, new int[] { 0 }); ColorizationHelper.AddRendererToColorCustomizer(gameObject, rightStorageModel, false, new int[] { 0 }); ColorizationHelper.AddRendererToSkyApplier(gameObject, rightStorageModel, Skies.Auto); Destroy(exosuitResource); isGraphicsReady = true; yield break; }
internal static void Prefix(Exosuit __instance) { if (Main.ExosuitCtorPatched) { BZLogger.Debug("Exosuit constructor already patched. Exit method."); return; } __instance.SetPrivateField("_slotIDs", SlotHelper.SessionExosuitSlotIDs, BindingFlags.Static); BZLogger.Debug($"Exosuit constructor patched. ID: {__instance.GetInstanceID()}"); Main.ExosuitCtorPatched = true; }
internal static void Prefix(SeaTruckUpgrades __instance) { if (Main.SeatruckUpgradesCtorPatched) { BZLogger.Debug("SeaTruck constructor already patched. Exit method."); return; } __instance.SetPrivateField("slotIDs", SlotHelper.SessionSeatruckSlotIDs, BindingFlags.Static); BZLogger.Debug($"SeaTruck constructor patched. ID: {__instance.GetInstanceID()}"); Main.SeatruckUpgradesCtorPatched = true; }
private static void DebugAllSlots() { BZLogger.Debug("Listing Dictionary: ALLSLOTS..."); foreach (KeyValuePair <string, SlotData> kvp in ALLSLOTS) { BZLogger.Debug( $"SlotID: {kvp.Value.SlotID}" + $", InternalSlotID: {kvp.Value.SlotConfigIDName}" + $", SlotPOS: {kvp.Value.SlotPos}" + $", SlotType: {kvp.Value.SlotType}" + $", KeyCodeName: {kvp.Value.KeyCodeName}"); } }
public static void ExpandSlotMapping() { BZLogger.Debug("Method call: SlotHelper.ExpandSlotMapping()"); foreach (SlotData slotData in NewChipSlots) { Equipment.slotMapping.Add(slotData.SlotID, EquipmentType.Chip); } foreach (SlotData slotData in ScannerModuleBatterySlots) { Equipment.slotMapping.Add(slotData.SlotID, EquipmentType.BatteryCharger); } foreach (SlotData slotData in NewHoverbikeSlots) { if (slotData.SlotType == SlotType.CloneNormal) { Equipment.slotMapping.Add(slotData.SlotID, EquipmentType.HoverbikeModule); } } foreach (SlotData slotData in SessionExosuitSlots) { if (slotData.SlotType == SlotType.CloneNormal) { Equipment.slotMapping.Add(slotData.SlotID, EquipmentType.ExosuitModule); } } foreach (SlotData slotData in SessionSeatruckSlots) { switch (slotData.SlotType) { case SlotType.CloneNormal: Equipment.slotMapping.Add(slotData.SlotID, EquipmentType.SeaTruckModule); break; case SlotType.CloneArmLeft: case SlotType.CloneArmRight: Equipment.slotMapping.Add(slotData.SlotID, (EquipmentType)ModdedEquipmentType.SeatruckArm); break; } } BZLogger.Log("Equipment slot mapping Patched!"); }
public void OnLandingFailed() { BZLogger.Debug("[OnLanding] Landiing failed!"); if (SeatruckState == TruckState.Landing) { StartCoroutine(OnTakeOff()); } /* * rigidbody.AddForce(jump, ForceMode.Impulse); * * if (!isFlying.value) * { * isFlying.Update(true); * } */ }
public void WakeUp() { BZLogger.Debug("Received SlotExtenderZero 'WakeUp' message."); isSeaTruckArmSlotsReady = true; helper.onActiveSlotChanged += OnActiveSlotChanged; helper.onDockedChanged += OnDockedChanged; Player.main.playerModeChanged.AddHandler(this, new Event <Player.Mode> .HandleFunction(OnPlayerModeChanged)); helper.TruckQuickSlots.onToggle += OnToggleSlot; helper.TruckEquipment.onEquip += OnEquip; helper.TruckEquipment.onUnequip += OnUnequip; CheckArmSlots(); }
private IEnumerator LoadBiodomeRobotArmResourcesAsync() { IPrefabRequest request = PrefabDatabase.GetPrefabForFilenameAsync("WorldEntities/Alterra/Base/biodome_Robot_Arm.prefab"); yield return(request); if (!request.TryGetPrefab(out robotArmResource)) { BZLogger.Warn("Cannot load [biodome_robot_arm] prefab!"); yield break; } BZLogger.Debug("Resource loaded: [biodome_robot_arm]"); Utils.ZeroTransform(robotArmResource.transform); yield break; }
public static bool Prefix(DamageSystem __instance, ref float damage, DamageType type, GameObject target, GameObject dealer = null) { if (target.GetComponent <SeaTruckSegment>() != null) { if (target.TryGetComponent(out SeaTruckArmorManager armorManager)) { armorManager.originalDamage = damage; damage = damage * armorManager.DamageReductionMultiplier; } else { BZLogger.Debug("Manager not found in Seatruck gameobject!"); } } return(true); }
/* * public static IEnumerator WaitForUGUI() * { * while (!uGUI.isInitialized) * { * yield return new WaitForSeconds(1); * } * * if (uGUI.main.transform.Find("RHZeroRoot") == null) * { * GameObject RHZeroRoot = new GameObject("RHZeroRoot"); * * RHZeroRoot.transform.SetParent(uGUI.main.transform, false); * * RHZeroRoot.AddComponent<RHZCommand>(); * } * //new RHZCommand(); * * if (RuntimeHelperZero_Config.AUTOSTART) * { * new RuntimeHelperZero(); * } * * yield break; * } */ private static void OnSceneLoaded(Scene scene, LoadSceneMode mode) { BZLogger.Debug($"Scene: [{scene.name}] loaded"); if (scene.name == "XMenu") { new RHZCommand(); if (RuntimeHelperZero_Config.AUTOSTART) { new RuntimeHelperZero(); } } if (scene.name == "Main") { new RHZCommand(); } }
public static bool IsExtendedSlot(string slotName) { BZLogger.Debug($"Method call: SlotHelper.IsExtendedSlot({slotName})"); if (ALLSLOTS.TryGetValue(slotName, out SlotData slotData)) { switch (slotData.SlotType) { case SlotType.CloneBattery: case SlotType.CloneChip: case SlotType.CloneArmLeft: case SlotType.CloneArmRight: case SlotType.CloneNormal: return(true); } } return(false); }
internal static void SLOTKEYBINDINGS_SyncToAll() { BZLogger.Debug("Method call: SEConfig.SLOTKEYBINDINGS_SyncToAll()"); foreach (KeyValuePair <SlotConfigID, string> kvp in SLOTKEYBINDINGS) { BZLogger.Debug($"key: {kvp.Key.ToString()}, Value: {kvp.Value}"); string key = kvp.Key.ToString(); if (Hotkeys_Config.ContainsKey(key)) { Hotkeys_Config[key] = kvp.Value; } KEYBINDINGS[key] = InputHelper.StringToKeyCode(kvp.Value); } Config_Write(); }
private static MethodBase GetConstructorMethodBase(Type type, string ctorName) { List <ConstructorInfo> ctor_Infos = new List <ConstructorInfo>(); ctor_Infos = AccessTools.GetDeclaredConstructors(type); foreach (ConstructorInfo ctor_info in ctor_Infos) { BZLogger.Debug($"found constructor [{ctorName}] in class [{type}]"); if (ctor_info.Name == ctorName) { return(ctor_info as MethodBase); } } BZLogger.Debug($"the required constructor [{ctorName}] in class [{type}] has not found!"); return(null); }
internal static void Config_CreateDefault() { BZLogger.Debug("Method call: SEzConfig.Config_CreateDefault()"); BZLogger.Warn("Configuration file is missing or wrong version. Trying to create a new one."); try { ParserHelper.CreateDefaultConfigFile(FILENAME, "SlotExtenderZero", PROGRAM_VERSION, DEFAULT_CONFIG); ParserHelper.AddInfoText(FILENAME, "MaxSlots possible values", "5 to 12"); ParserHelper.AddInfoText(FILENAME, "TextColor possible values", "Red, Green, Blue, Yellow, White, Magenta, Cyan, Orange, Lime, Amethyst"); ParserHelper.AddInfoText(FILENAME, "SlotLayout possible values", "Grid, Circle"); BZLogger.Log("The new configuration file was successfully created."); } catch { BZLogger.Error("An error occured while creating the new configuration file!"); } }
private IEnumerator OnTakeOff() { BZLogger.Debug("[OnTakeOff] Take off started"); if (SeatruckState == TruckState.TakeOff) { yield break; } prevSurfacePos = mainCab.transform.position.y; rigidbody.isKinematic = false; while (distanceFromSurface < 20 || mainCab.transform.position.y < prevSurfacePos + 20) { SeatruckState = TruckState.TakeOff; rigidbody.velocity = Vector3.Lerp(rigidbody.velocity, takeOffVelocity, timer); BZLogger.Debug($"[OnTakeOff] timer: {timer}, velocity: {rigidbody.velocity.y}, distanceFromSurface: {distanceFromSurface}, prevDistance: {prevSurfacePos}, mainCab.position.y: {mainCab.transform.position.y}"); timer += 0.001f; if (mainCab.transform.position.y > 150) { rigidbody.velocity = Vector3.zero; BZLogger.Debug("[OnTakeOff] Take off Breaked by position.y!"); OnTakeOffFinished(); yield break; } yield return(null); } OnTakeOffFinished(); yield break; }
public static void InitSessionAllSlots() { BZLogger.Debug($"Method call: SlotHelper.InitSessionAllSlots()"); ALLSLOTS.Clear(); foreach (SlotData slotData in SessionSeatruckSlots) { SEzConfig.SLOTKEYBINDINGS.TryGetValue(slotData.SlotConfigID, out string result); slotData.KeyCodeName = result; ALLSLOTS.Add(slotData.SlotID, slotData); } foreach (SlotData slotData in SessionExosuitSlots) { SEzConfig.SLOTKEYBINDINGS.TryGetValue(slotData.SlotConfigID, out string result); slotData.KeyCodeName = result; ALLSLOTS.Add(slotData.SlotID, slotData); } DebugAllSlots(); }
private IEnumerator PatchAsync() { while (!SpriteManager.hasInitialized) { BZLogger.Debug($"{TechTypeName} : Spritemanager is not ready!"); yield return(null); } BZLogger.Debug($"{TechTypeName} : Async patch started."); UnlockSprite = GetUnlockSprite(); SpriteHandler.Main.RegisterSprite(TechType, UnlockSprite); PrefabHandler.Main.RegisterPrefab(this); LootDistributionData.SrcData srcData = new LootDistributionData.SrcData() { prefabPath = VirtualPrefabFilename, distribution = GetBiomeDatas() }; LootDistributionHandler.Main.AddLootDistributionData(ClassID, srcData); WorldEntityInfo EntityInfo = new WorldEntityInfo() { classId = ClassID, techType = TechType, slotType = SlotType, prefabZUp = PrefabZUp, cellLevel = CellLevel, localScale = LocalScale }; WorldEntityDatabaseHandler.Main.AddCustomInfo(ClassID, EntityInfo); }
public static void Postfix(SeaTruckUpgrades __instance) { __instance.gameObject.EnsureComponent <SeaTruckStorageManager>(); BZLogger.Debug($"Storage Manager added in SeaTruckUpgrades.Start -> Postfix Patch. ID: {__instance.gameObject.GetInstanceID()}"); }
/* * public override IEnumerator GetGameObjectAsync(IOut<GameObject> gameObject) * { * AsyncOperationHandle<GameObject> seatruckFabricatorModuleRequest = AddressablesUtility.LoadAsync<GameObject>("WorldEntities/Tools/SeaTruckFabricatorModule.prefab"); * yield return seatruckFabricatorModuleRequest; * GameObject seatruckFabricatorModulePrefab = seatruckFabricatorModuleRequest.Result; * * _GameObject = UWE.Utils.InstantiateDeactivated(seatruckFabricatorModulePrefab); * * _GameObject.SetActive(true); * * gameObject.Set(_GameObject); * } */ public override IEnumerator GetGameObjectAsync(IOut <GameObject> gameObject) { AsyncOperationHandle <GameObject> loadRequest_01 = AddressablesUtility.LoadAsync <GameObject>("WorldEntities/Tools/SeaTruckFabricatorModule.prefab"); yield return(loadRequest_01); if (loadRequest_01.Status == AsyncOperationStatus.Failed) { BZLogger.Error("Cannot find GameObject in Resources folder at path 'WorldEntities/Tools/SeaTruckFabricatorModule.prefab'"); yield break; } GameObject seatruckFabricatorModulePrefab = loadRequest_01.Result; GameObjectClone = UWE.Utils.InstantiateDeactivated(seatruckFabricatorModulePrefab, null, Vector3.zero, Quaternion.identity); SetupScannerModule(); /* * IAssetBundleWrapperCreateRequest bundleRequest = AssetBundleManager.LoadBundleAsync("basegeneratorpieces"); * yield return bundleRequest; * IAssetBundleWrapper bundle = bundleRequest.assetBundle; * IAssetBundleWrapperRequest loadRequest_02 = bundle.LoadAssetAsync<GameObject>("Assets/Prefabs/Base/GeneratorPieces/BaseMapRoom.prefab"); * yield return loadRequest_02; * GameObject maproom = loadRequest_02.asset as GameObject; */ AsyncOperationHandle <GameObject> loadRequest_02 = AddressablesUtility.LoadAsync <GameObject>("Assets/Prefabs/Base/GeneratorPieces/BaseMapRoom.prefab"); yield return(loadRequest_02); if (loadRequest_02.Status == AsyncOperationStatus.Failed) { BZLogger.Error("Cannot find Prefab at path 'Assets/Prefabs/Base/GeneratorPieces/BaseMapRoom.prefab'"); yield break; } GameObject maproom = loadRequest_02.Result; if (!maproom) { BZLogger.Debug("Failed to load MapRoom prefab!"); yield break; } antenna = UWE.Utils.InstantiateDeactivated(maproom.transform.Find("Map_room_antenna").gameObject, GameObjectClone.transform, Vector3.zero, Quaternion.identity); AsyncOperationHandle <GameObject> loadRequest_03 = AddressablesUtility.LoadAsync <GameObject>("Submarine/Build/BatteryCharger.prefab"); yield return(loadRequest_03); GameObject batteryChargerPrefab = loadRequest_03.Result; GameObject powerSystemRoot = new GameObject("powerSystemRoot"); powerSystemRoot.transform.SetParent(GameObjectClone.transform); powerSystemRoot.transform.localPosition = new Vector3(-1.06f, -0.20f, 1.66f); powerSystemRoot.transform.localRotation = Quaternion.Euler(0, 270, 180); powerSystemRoot.transform.localScale = new Vector3(1.78f, 1.78f, 1.0f); powerSystem = UWE.Utils.InstantiateDeactivated(batteryChargerPrefab, powerSystemRoot.transform, Vector3.zero, Quaternion.identity); AsyncOperationHandle <GameObject> loadRequest_04 = AddressablesUtility.LoadAsync <GameObject>("Submarine/Build/MapRoomFunctionality.prefab"); yield return(loadRequest_04); GameObject mapRoomFunctionalityPrefab = loadRequest_04.Result; scannerUIRoot = new GameObject("scannerRoot"); scannerUIRoot.transform.SetParent(GameObjectClone.transform, false); scannerUIRoot.transform.localScale = new Vector3(1.14f, 1.14f, 1.14f); scannerUIRoot.transform.localPosition = new Vector3(1.37f, 0.07f, 1.60f); scannerUIRoot.transform.localRotation = Quaternion.Euler(0, 90, 0); scannerUI = UWE.Utils.InstantiateDeactivated(mapRoomFunctionalityPrefab.transform.Find("screen/scannerUI").gameObject, scannerUIRoot.transform, Vector3.zero, Quaternion.identity); SetupAntenna(); SetupScannerUI(); SetupPowerSystem(); GameObjectClone.AddComponent <SeaTruckSegmentListener>(); gameObject.Set(GameObjectClone); yield break; }
internal void AddQuickSlotText(uGUI_QuickSlots instance) { if (instance == null) { BZLogger.Debug("uGUI_QuickSlots instance is null!"); return; } BZLogger.Debug("uGUI_QuickSlots instance is ready."); icons = (uGUI_ItemIcon[])instance.GetPrivateField("icons"); if (icons == null) { BZLogger.Debug("Cannot get uGUI_ItemIcons array!"); return; } BZLogger.Debug($"Found [{icons.Length}] uGUI_ItemIcon in array."); if (HandReticle.main == null) { BZLogger.Debug("HandReticle.main is null!"); return; } BZLogger.Debug("HandReticle.main is ready."); for (int i = 0; i < icons.Length; i++) { if (Main.isExists_SlotExtenderZero) { if (Player.main.GetPDA().state != PDA.State.Opening) { if (Player.main.inSeamoth) { AddTextToSlot(icons[i].transform, SLOTEXTENDERZERO_SLOTKEYSLIST[i]); } else if (Player.main.inExosuit) { if (i < 2) { continue; } else { AddTextToSlot(icons[i].transform, SLOTEXTENDERZERO_SLOTKEYSLIST[i - 2]); } } else if (Player.main.IsPilotingSeatruck()) { AddTextToSlot(icons[i].transform, SLOTEXTENDERZERO_SLOTKEYSLIST[i]); } else { AddTextToSlot(icons[i].transform, QSEzConfig.SLOTKEYSLIST[i]); } } } else if (Player.main.inExosuit && Player.main.GetPDA().state != PDA.State.Opening) { if (i < 2) { continue; } else { AddTextToSlot(icons[i].transform, QSEzConfig.SLOTKEYSLIST[i - 2]); } } else { AddTextToSlot(icons[i].transform, QSEzConfig.SLOTKEYSLIST[i]); } } islabelsAdded = true; }
public void WakeUp() { BZLogger.Debug("Received SlotExtenderZero 'WakeUp' message."); CheckSlotsForSpeedUpgrades(); }
internal static void Postfix(SeaTruckUpgrades __instance) { __instance.gameObject.EnsureComponent <SlotExtenderZero>(); BZLogger.Debug($"SlotExtenderZero added in SeaTruckUpgrades.Start -> Postfix Patch. ID: {__instance.gameObject.GetInstanceID()}"); }
internal static void Prefix(Hoverbike __instance) { __instance.SetPrivateField("slotIDs", SlotHelper.NewHoverbikeSlotIDs); BZLogger.Debug($"Hoverbike slotIDs patched. ID: {__instance.GetInstanceID()}"); }