internal static void Configure(ModComponent modComponent) { ModRepairableComponent modRepairableComponent = modComponent.GetComponent <ModRepairableComponent>(); if (modRepairableComponent == null) { return; } Repairable repairable = ModUtils.GetOrCreateComponent <Repairable>(modRepairableComponent); repairable.m_RepairAudio = modRepairableComponent.Audio; repairable.m_DurationMinutes = modRepairableComponent.Minutes; repairable.m_ConditionIncrease = modRepairableComponent.Condition; if (modRepairableComponent.MaterialNames.Length != modRepairableComponent.MaterialCounts.Length) { throw new ArgumentException("MaterialNames and MaterialCounts do not have the same length on gear item '" + modRepairableComponent.name + "'."); } repairable.m_RequiredGear = ModUtils.GetItems <GearItem>(modRepairableComponent.MaterialNames, modRepairableComponent.name); repairable.m_RequiredGearUnits = modRepairableComponent.MaterialCounts; repairable.m_RepairToolChoices = ModUtils.GetItems <ToolsItem>(modRepairableComponent.RequiredTools, modRepairableComponent.name); repairable.m_RequiresToolToRepair = repairable.m_RepairToolChoices.Length > 0; }
internal static void Configure(ModComponent modComponent) { ModToolComponent modToolComponent = modComponent as ModToolComponent; if (modToolComponent == null) { return; } ToolsItem toolsItem = ModUtils.GetOrCreateComponent <ToolsItem>(modToolComponent); toolsItem.m_ToolType = ModUtils.TranslateEnumValue <ToolsItem.ToolType, Usage>(modToolComponent.Usage); toolsItem.m_CuttingToolType = ModUtils.TranslateEnumValue <ToolsItem.CuttingToolType, ToolType>(modToolComponent.ToolType); toolsItem.m_CraftingAndRepairSkillModifier = modToolComponent.SkillBonus; toolsItem.m_CraftingAndRepairTimeModifier = modToolComponent.CraftingTimeMultiplier; toolsItem.m_DegradePerHourCrafting = modToolComponent.DegradePerHourCrafting; toolsItem.m_CanOnlyCraftAndRepairClothes = true; toolsItem.m_AppearInStoryOnly = false; ConfigureBodyHarvest(modToolComponent); ConfigureBreakDown(modToolComponent); ConfigureDegradeOnUse(modToolComponent); ConfigureForceLock(modToolComponent); ConfigureIceFishingHole(modToolComponent); ConfigureStruggleBonus(modToolComponent); }
internal static void Prefix(GearItem __instance) { if (__instance.m_CookingPotItem) { ModUtils.GetOrCreateComponent <OverrideCookingState>(__instance); } }
internal static void Configure(ModComponent modComponent) { ModBedComponent modBedComponent = modComponent as ModBedComponent; if (modBedComponent == null) { return; } Bed bed = ModUtils.GetOrCreateComponent <Bed>(modBedComponent); bed.m_ConditionPercentGainPerHour = modBedComponent.ConditionGainPerHour; bed.m_UinterruptedRestPercentGainPerHour = modBedComponent.AdditionalConditionGainPerHour; bed.m_WarmthBonusCelsius = modBedComponent.WarmthBonusCelsius; bed.m_PercentChanceReduceBearAttackWhenSleeping = modBedComponent.BearAttackModifier; bed.m_PercentChanceReduceWolfAttackWhenSleeping = modBedComponent.WolfAttackModifier; bed.m_OpenAudio = ModUtils.DefaultIfEmpty(modBedComponent.OpenAudio, "PLAY_SNDGENSLEEPINGBAGCLOSE"); bed.m_CloseAudio = ModUtils.DefaultIfEmpty(modBedComponent.CloseAudio, "PLAY_SNDGENSLEEPINGBAGOPEN"); bed.m_BedRollMesh = modBedComponent.PackedMesh ?? modBedComponent.gameObject; bed.m_BedRollMesh.layer = vp_Layer.Gear; bed.m_BedRollPlacedMesh = modBedComponent.UsableMesh ?? modBedComponent.gameObject; bed.m_BedRollPlacedMesh.layer = vp_Layer.Gear; bed.SetState(BedRollState.Rolled); DegradeOnUse degradeOnUse = ModUtils.GetOrCreateComponent <DegradeOnUse>(modBedComponent); degradeOnUse.m_DegradeHP = Mathf.Max(degradeOnUse.m_DegradeHP, modBedComponent.DegradePerHour); PlaceableItem placeableItem = ModUtils.GetOrCreateComponent <PlaceableItem>(modBedComponent); placeableItem.m_Range = 4; }
internal static void Postfix(GearItem __instance) { float waterRequired = __instance?.m_Cookable?.m_PotableWaterRequiredLiters ?? 0; if (waterRequired > 0) { ModUtils.GetOrCreateComponent <CookingModifier>(__instance); } }
private IEnumerator StartPlaying() { try { this.starting = true; LockControls(); string songsDirectory = this.GetSongsDirectory(); PrepareSongJob prepareSongJob = new PrepareSongJob(songsDirectory); prepareSongJob.Start(); yield return(this.EquippableModComponent.StartCoroutine(prepareSongJob.WaitFor())); if (prepareSongJob.SelectedSong == null) { HUDMessage.AddMessage("[Instrument-Pack]: No songs in directory '" + songsDirectory + "'"); yield break; } Debug.Log("[Instrument-Pack]: Selected song " + prepareSongJob.SelectedSong); this.reader = prepareSongJob.Reader; if (this.reader == null) { HUDMessage.AddMessage("[Instrument-Pack]: Cannot play song '" + prepareSongJob.SelectedSong + "'.", 10, true); yield break; } this.reader.Volume = TARGET_VOLUME * InterfaceManager.m_Panel_OptionsMenu.m_State.m_MasterVolume / prepareSongJob.MaxSample; this.pitchShifter = new SmbPitchShiftingSampleProvider(reader); this.waveOutEvent = new WaveOutEvent(); this.waveOutEvent.PlaybackStopped += this.OnPlaybackStopped; this.waveOutEvent.Init(pitchShifter); this.waveOutEvent.Play(); if (this.EquippableModComponent.EquippedModel != null) { Playing playing = ModUtils.GetOrCreateComponent <Playing>(this.EquippableModComponent.EquippedModel); playing.Instrument = this; playing.MistakeAudio = this.MistakeAudio; playing.RefreshSkillEffect(); } else { // the equipped model is gone -> stop playing StopPlaying(); } } finally { this.starting = false; } }
private static void ConfigureWolfIntimidation(ModClothingComponent modClothingItem) { if (modClothingItem.DecreaseAttackChance == 0 && modClothingItem.IncreaseFleeChance == 0) { return; } WolfIntimidationBuff wolfIntimidationBuff = ModUtils.GetOrCreateComponent <WolfIntimidationBuff>(modClothingItem); wolfIntimidationBuff.m_DecreaseAttackChancePercentagePoints = modClothingItem.DecreaseAttackChance; wolfIntimidationBuff.m_IncreaseFleePercentagePoints = modClothingItem.IncreaseFleeChance; }
private static void ConfigureBreakDown(ModToolComponent modToolComponent) { BreakDownItem breakDownItem = ModUtils.GetOrCreateComponent <BreakDownItem>(modToolComponent); breakDownItem.m_BreakDownTimeModifier = modToolComponent.BreakDownTimeMultiplier; string templateName = GetTemplateToolName(modToolComponent); if (templateName != null) { AddAlternativeTool(modToolComponent, templateName); } }
private static void ConfigureIceFishingHole(ModToolComponent modToolComponent) { if (!modToolComponent.IceFishingHole) { return; } IceFishingHoleClearItem iceFishingHoleClearItem = ModUtils.GetOrCreateComponent <IceFishingHoleClearItem>(modToolComponent); iceFishingHoleClearItem.m_BreakIceAudio = ModUtils.DefaultIfEmpty(modToolComponent.IceFishingHoleAudio, "Play_IceBreakingChopping"); iceFishingHoleClearItem.m_HPDecreaseToClear = modToolComponent.IceFishingHoleDegradeOnUse; iceFishingHoleClearItem.m_NumGameMinutesToClear = modToolComponent.IceFishingHoleMinutes; }
internal static void Configure(ModComponent modComponent) { ModScentComponent modScentComponent = ModUtils.GetComponent <ModScentComponent>(modComponent); if (modScentComponent == null) { return; } Scent scent = ModUtils.GetOrCreateComponent <Scent>(modScentComponent); scent.m_ScentCategory = ModUtils.TranslateEnumValue <ScentRangeCategory, ScentCategory>(modScentComponent.scentCategory); }
internal static void Configure(ModComponent modComponent) { ModCookableComponent modCookableComponent = modComponent as ModCookableComponent; if (modCookableComponent == null || !modCookableComponent.Cooking) { return; } Cookable cookable = ModUtils.GetOrCreateComponent <Cookable>(modCookableComponent); cookable.m_CookableType = ModUtils.TranslateEnumValue <Cookable.CookableType, CookableType>(modCookableComponent.type); cookable.m_CookTimeMinutes = modCookableComponent.CookingMinutes; cookable.m_ReadyTimeMinutes = modCookableComponent.BurntMinutes; cookable.m_NumUnitsRequired = modCookableComponent.CookingUnitsRequired; cookable.m_PotableWaterRequiredLiters = modCookableComponent.CookingWaterRequired; cookable.m_WarmUpNearFireRange = 1.5f; cookable.m_CookAudio = ModUtils.DefaultIfEmpty(modCookableComponent.CookingAudio, GetDefaultCookAudio(modCookableComponent)); cookable.m_PutInPotAudio = ModUtils.DefaultIfEmpty(modCookableComponent.StartCookingAudio, GetDefaultStartCookingAudio(modCookableComponent)); Cookable template = ModUtils.GetComponent <Cookable>(Resources.Load <GameObject>("GEAR_PinnacleCanPeaches")); cookable.m_MeshPotStyle = template?.m_MeshPotStyle; cookable.m_MeshCanStyle = template?.m_MeshCanStyle; cookable.m_LiquidMeshRenderer = template?.m_LiquidMeshRenderer; // either just heat or convert, but not both if (modCookableComponent.CookingResult == null) { // no conversion, just heating FoodItem foodItem = ModUtils.GetComponent <FoodItem>(modCookableComponent); if (foodItem != null) { foodItem.m_HeatedWhenCooked = true; } } else { // no heating, but instead convert the item when cooking completes GearItem cookedGearItem = modCookableComponent.CookingResult.GetComponent <GearItem>(); if (cookedGearItem == null) { // not mapped yet, do it now Mapper.Map(modCookableComponent.CookingResult); cookedGearItem = modCookableComponent.CookingResult.GetComponent <GearItem>(); } cookable.m_CookedPrefab = cookedGearItem ?? throw new ArgumentException("CookingResult does not map to GearItem for prefab " + modCookableComponent.name); } }
private static void ConfigureBodyHarvest(ModToolComponent modToolComponent) { if (!modToolComponent.CarcassHarvesting) { return; } BodyHarvestItem bodyHarvestItem = ModUtils.GetOrCreateComponent <BodyHarvestItem>(modToolComponent); bodyHarvestItem.m_HarvestMeatMinutesPerKG = modToolComponent.MinutesPerKgMeat; bodyHarvestItem.m_HarvestFrozenMeatMinutesPerKG = modToolComponent.MinutesPerKgFrozenMeat; bodyHarvestItem.m_HarvestGutMinutesPerUnit = modToolComponent.MinutesPerGut; bodyHarvestItem.m_HarvestHideMinutesPerUnit = modToolComponent.MinutesPerHide; bodyHarvestItem.m_HPDecreasePerHourUse = modToolComponent.DegradePerHourHarvesting; }
private static void ConfigureStruggleBonus(ModToolComponent modToolComponent) { if (!modToolComponent.StruggleBonus) { return; } StruggleBonus struggleBonus = ModUtils.GetOrCreateComponent <StruggleBonus>(modToolComponent); struggleBonus.m_BleedoutMinutesScale = modToolComponent.BleedoutMultiplier; struggleBonus.m_CanPuncture = modToolComponent.CanPuncture; struggleBonus.m_DamageScalePercent = modToolComponent.DamageMultiplier; struggleBonus.m_FleeChanceScale = modToolComponent.FleeChanceMultiplier; struggleBonus.m_TapIncrementScale = modToolComponent.TapMultiplier; struggleBonus.m_StruggleWeaponType = GetStruggleWeaponType(modToolComponent); }
internal static void Configure(ModComponent modComponent) { ModEvolveComponent modEvolveComponent = ModUtils.GetComponent <ModEvolveComponent>(modComponent); if (modEvolveComponent == null) { return; } EvolveItem evolveItem = ModUtils.GetOrCreateComponent <EvolveItem>(modEvolveComponent); evolveItem.m_ForceNoAutoEvolve = false; evolveItem.m_GearItemToBecome = GetTargetItem(modEvolveComponent.TargetItemName, modEvolveComponent.name); evolveItem.m_RequireIndoors = modEvolveComponent.IndoorsOnly; evolveItem.m_StartEvolvePercent = 0; evolveItem.m_TimeToEvolveGameDays = Mathf.Clamp(modEvolveComponent.EvolveHours / 24f, 0.01f, 1000); }
public static void Execute() { Panel_Cooking panel_Cooking = InterfaceManager.m_Panel_Cooking; GearItem cookedItem = Traverse.Create(panel_Cooking).Method("GetSelectedFood").GetValue <GearItem>(); CookingPotItem cookingPotItem = Traverse.Create(panel_Cooking).Field("m_CookingPotInteractedWith").GetValue <CookingPotItem>(); GearItem result = cookedItem.Drop(1, false, true); CookingModifier cookingModifier = ModUtils.GetOrCreateComponent <CookingModifier>(result); cookingModifier.additionalMinutes = result.m_Cookable.m_PotableWaterRequiredLiters * panel_Cooking.m_MinutesToMeltSnowPerLiter; cookingModifier.Apply(); GameAudioManager.Play3DSound(result.m_Cookable.m_PutInPotAudio, cookingPotItem.gameObject); cookingPotItem.StartCooking(result); panel_Cooking.ExitCookingInterface(); }
private static void ConfigureForceLock(ModToolComponent modToolComponent) { if (!modToolComponent.ForceLocks) { return; } ForceLockItem forceLockItem = ModUtils.GetOrCreateComponent <ForceLockItem>(modToolComponent); forceLockItem.m_ForceLockAudio = ModUtils.DefaultIfEmpty(modToolComponent.ForceLockAudio, "PLAY_LOCKERPRYOPEN1"); forceLockItem.m_LocalizedProgressText = new LocalizedString() { m_LocalizationID = "GAMEPLAY_Forcing" }; AddAlternativeTool(modToolComponent, "GEAR_Prybar"); }
public static void Configure(ModComponent modComponent) { ModSharpenableComponent modSharpenableComponent = ModUtils.GetComponent <ModSharpenableComponent>(modComponent); if (modSharpenableComponent == null) { return; } Sharpenable sharpenable = ModUtils.GetOrCreateComponent <Sharpenable>(modSharpenableComponent); sharpenable.m_ConditionIncreaseMax = modSharpenableComponent.ConditionMax; sharpenable.m_ConditionIncreaseMin = modSharpenableComponent.ConditionMin; sharpenable.m_DurationMinutesMax = modSharpenableComponent.MinutesMax; sharpenable.m_DurationMinutesMin = modSharpenableComponent.MinutesMin; sharpenable.m_SharpenToolChoices = ModUtils.GetItems <ToolsItem>(modSharpenableComponent.Tools, modComponent.name + ": Tools"); sharpenable.m_RequiresToolToSharpen = sharpenable.m_SharpenToolChoices.Count() > 0; }
private static void AddAlternativeTool(ModToolComponent modToolComponent, string templateName) { GameObject original = Resources.Load(templateName) as GameObject; if (original == null) { return; } AlternateTools alternateTools = ModUtils.GetOrCreateComponent <AlternateTools>(original); List <GameObject> list = new List <GameObject>(); if (alternateTools.m_AlternateToolsList != null) { list.AddRange(alternateTools.m_AlternateToolsList); } list.Add(modToolComponent.gameObject); alternateTools.m_AlternateToolsList = list.ToArray(); }
internal static void Postfix(CookingPotItem __instance) { if (__instance.AttachedFireIsBurning()) { return; } if ((__instance.m_ParticlesWaterBoiling.activeInHierarchy || __instance.m_ParticlesWaterReady.activeInHierarchy) && WaterUtils.IsCooledDown(__instance)) { Utils.SetActive(__instance.m_ParticlesWaterReady, false); Utils.SetActive(__instance.m_ParticlesWaterBoiling, false); if (__instance.GetCookingState() == CookingPotItem.CookingState.Ready) { ModUtils.GetOrCreateComponent <OverrideCookingState>(__instance).ForceReady = true; WaterUtils.SetElapsedCookingTimeForWater(__instance, WaterUtils.GetWaterAmount(__instance)); } } }
internal static void Configure(ModComponent modComponent) { ModFireStarterComponent modFireStarterComponent = ModUtils.GetComponent <ModFireStarterComponent>(modComponent); if (modFireStarterComponent == null) { return; } FireStarterItem fireStarterItem = ModUtils.GetOrCreateComponent <FireStarterItem>(modFireStarterComponent); fireStarterItem.m_SecondsToIgniteTinder = modFireStarterComponent.SecondsToIgniteTinder; fireStarterItem.m_SecondsToIgniteTorch = modFireStarterComponent.SecondsToIgniteTorch; fireStarterItem.m_FireStartSkillModifier = modFireStarterComponent.SuccessModifier; fireStarterItem.m_ConditionDegradeOnUse = Mapper.GetDecayPerStep(modFireStarterComponent.NumberOfUses, modComponent.MaxHP); fireStarterItem.m_ConsumeOnUse = modFireStarterComponent.DestroyedOnUse; fireStarterItem.m_RequiresSunLight = modFireStarterComponent.RequiresSunLight; fireStarterItem.m_OnUseSoundEvent = modFireStarterComponent.OnUseSoundEvent; }
internal static void Configure(ModComponent modComponent) { ModFirstAidComponent modFirstAidComponent = ModUtils.GetComponent <ModFirstAidComponent>(modComponent); if (modFirstAidComponent == null) { return; } FirstAidItem firstAidItem = ModUtils.GetOrCreateComponent <FirstAidItem>(modFirstAidComponent); // not used firstAidItem.m_AppliesSutures = false; firstAidItem.m_StabalizesSprains = false; switch (modFirstAidComponent.FirstAidType) { case FirstAidType.Antibiotics: firstAidItem.m_ProvidesAntibiotics = true; break; case FirstAidType.Bandage: firstAidItem.m_AppliesBandage = true; break; case FirstAidType.Disinfectant: firstAidItem.m_AppliesBandage = true; break; case FirstAidType.PainKiller: firstAidItem.m_KillsPain = true; break; } firstAidItem.m_HPIncrease = modFirstAidComponent.InstantHealing; firstAidItem.m_TimeToUseSeconds = modFirstAidComponent.TimeToUseSeconds; firstAidItem.m_UnitsPerUse = modFirstAidComponent.UnitsPerUse; firstAidItem.m_UseAudio = modFirstAidComponent.UseAudio; }
internal static void Configure(ModComponent modComponent) { ModHarvestableComponent modHarvestableComponent = ModUtils.GetComponent <ModHarvestableComponent>(modComponent); if (modHarvestableComponent == null) { return; } Harvest harvest = ModUtils.GetOrCreateComponent <Harvest>(modHarvestableComponent); harvest.m_Audio = modHarvestableComponent.Audio; harvest.m_DurationMinutes = modHarvestableComponent.Minutes; if (modHarvestableComponent.YieldNames.Length != modHarvestableComponent.YieldCounts.Length) { throw new ArgumentException("YieldNames and YieldCounts do not have the same length on gear item '" + modHarvestableComponent.name + "'."); } harvest.m_YieldGear = ModUtils.GetItems <GearItem>(modHarvestableComponent.YieldNames, modHarvestableComponent.name); harvest.m_YieldGearUnits = modHarvestableComponent.YieldCounts; }
internal static void Configure(ModComponent modComponent) { if (!modComponent.InspectOnPickup) { return; } Inspect inspect = ModUtils.GetOrCreateComponent <Inspect>(modComponent); inspect.m_DistanceFromCamera = modComponent.InspectDistance; inspect.m_Scale = modComponent.InspectScale; inspect.m_Angles = modComponent.InspectAngles; inspect.m_Offset = modComponent.InspectOffset; if (modComponent.InspectModel != null && modComponent.NormalModel != null) { inspect.m_NormalMesh = modComponent.NormalModel; inspect.m_NormalMesh.SetActive(true); inspect.m_InspectModeMesh = modComponent.InspectModel; inspect.m_InspectModeMesh.SetActive(false); } }
internal static void ConfigureClothing(ModComponent modComponent) { ModClothingComponent modClothingItem = modComponent as ModClothingComponent; if (modClothingItem == null) { return; } ClothingItem clothingItem = ModUtils.GetOrCreateComponent <ClothingItem>(modClothingItem); clothingItem.m_DailyHPDecayWhenWornInside = Mapper.GetDecayPerStep(modClothingItem.DaysToDecayWornInside, modClothingItem.MaxHP); clothingItem.m_DailyHPDecayWhenWornOutside = Mapper.GetDecayPerStep(modClothingItem.DaysToDecayWornOutside, modClothingItem.MaxHP); clothingItem.m_DryBonusWhenNotWorn = 1.5f; clothingItem.m_DryPercentPerHour = 100f / modClothingItem.HoursToDryNearFire; clothingItem.m_DryPercentPerHourNoFire = 100f / modClothingItem.HoursToDryWithoutFire; clothingItem.m_FreezePercentPerHour = 100f / modClothingItem.HoursToFreeze; clothingItem.m_Region = ModUtils.TranslateEnumValue <ClothingRegion, Region>(modClothingItem.Region); clothingItem.m_MaxLayer = ModUtils.TranslateEnumValue <ClothingLayer, Layer>(modClothingItem.MaxLayer); clothingItem.m_MinLayer = ModUtils.TranslateEnumValue <ClothingLayer, Layer>(modClothingItem.MinLayer); clothingItem.m_FootwearType = ModUtils.TranslateEnumValue <FootwearType, Footwear>(modClothingItem.Footwear); clothingItem.m_WornMovementSoundCategory = ModUtils.TranslateEnumValue <ClothingMovementSound, MovementSound>(modClothingItem.MovementSound); clothingItem.m_PaperDollTextureName = modClothingItem.MainTexture; clothingItem.m_PaperDollBlendmapName = modClothingItem.BlendTexture; clothingItem.m_Warmth = modClothingItem.Warmth; clothingItem.m_WarmthWhenWet = modClothingItem.WarmthWhenWet; clothingItem.m_Waterproofness = modClothingItem.Waterproofness / 100f; clothingItem.m_Windproof = modClothingItem.Windproof; clothingItem.m_SprintBarReductionPercent = modClothingItem.SprintBarReduction; clothingItem.m_Toughness = modClothingItem.Toughness; ConfigureWolfIntimidation(modClothingItem); }
private static void ConfigureDegradeOnUse(ModToolComponent modToolComponent) { DegradeOnUse degradeOnUse = ModUtils.GetOrCreateComponent <DegradeOnUse>(modToolComponent); degradeOnUse.m_DegradeHP = Mathf.Max(degradeOnUse.m_DegradeHP, modToolComponent.DegradeOnUse); }
internal static void Postfix(CookingPotItem __instance) { ModUtils.GetOrCreateComponent <OverrideCookingState>(__instance).ForceReady = false; }
internal static void Postfix(CookingPotItem __instance) { Water.AdjustWaterToWaterSupply(); ModUtils.GetOrCreateComponent <OverrideCookingState>(__instance).ForceReady = false; }