using NewHorizons.Builder.Props; using NewHorizons.External.Modules; using NewHorizons.Utility.OWUtilities; using OWML.Common; using OWML.Utils; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.Volumes { public static class HazardVolumeBuilder { public static HazardVolume Make(GameObject planetGO, Sector sector, OWRigidbody owrb, VolumesModule.HazardVolumeInfo info, IModBehaviour mod) { var go = GeneralPropBuilder.MakeNew("HazardVolume", planetGO, sector, info); go.layer = Layer.BasicEffectVolume; var shape = go.AddComponent(); shape.radius = info.radius; var owTriggerVolume = go.AddComponent(); owTriggerVolume._shape = shape; HazardVolume hazardVolume = null; if (info.type == VolumesModule.HazardVolumeInfo.HazardType.RIVERHEAT) { hazardVolume = go.AddComponent(); } else if (info.type == VolumesModule.HazardVolumeInfo.HazardType.HEAT) { hazardVolume = go.AddComponent(); } else if (info.type == VolumesModule.HazardVolumeInfo.HazardType.DARKMATTER) { hazardVolume = go.AddComponent(); var visorFrostEffectVolume = go.AddComponent(); visorFrostEffectVolume._frostRate = 0.5f; visorFrostEffectVolume._maxFrost = 0.91f; var water = planetGO.GetComponentsInChildren().FirstOrDefault(x => x._fluidType == FluidVolume.Type.WATER); if (water != null) { var submerge = go.AddComponent(); submerge._sector = sector; submerge._effectVolumes = new EffectVolume[] { hazardVolume, visorFrostEffectVolume }; // THERE ARE NO RENDERERS??? RUH ROH!!! var detectorGO = new GameObject("ConstantFluidDetector"); detectorGO.transform.parent = go.transform; detectorGO.transform.localPosition = Vector3.zero; detectorGO.layer = Layer.BasicDetector; var detector = detectorGO.AddComponent(); detector._onlyDetectableFluid = water; detector._buoyancy.boundingRadius = 1; detector._buoyancy.checkAgainstWaves = true; detector._dontApplyForces = true; submerge._fluidDetector = detector; } } else if (info.type == VolumesModule.HazardVolumeInfo.HazardType.ELECTRICITY) { var electricityVolume = go.AddComponent(); electricityVolume._shockAudioPool = new OWAudioSource[0]; hazardVolume = electricityVolume; } else { var simpleHazardVolume = go.AddComponent(); simpleHazardVolume._type = EnumUtils.Parse(info.type.ToString(), HazardVolume.HazardType.GENERAL); hazardVolume = simpleHazardVolume; } hazardVolume._attachedBody = owrb; hazardVolume._damagePerSecond = info.damagePerSecond; hazardVolume._firstContactDamageType = EnumUtils.Parse(info.firstContactDamageType.ToString(), InstantDamageType.Impact); hazardVolume._firstContactDamage = info.firstContactDamage; go.SetActive(true); return hazardVolume; } } }