static void Postfix( Vehicle vehicle, Transform parentTransform, bool isParented, VehicleRepresentation __instance) { Logger.Debug("vehicle size initialization "); var identifier = vehicle.VehicleDef.ChassisID; var sizeMultiplier = SizeMultiplier.Get(vehicle.VehicleDef); Logger.Debug($"{identifier}: {sizeMultiplier}"); var originalLOSSourcePositions = Traverse.Create(vehicle).Field("originalLOSSourcePositions").GetValue <Vector3[]>(); var originalLOSTargetPositions = Traverse.Create(vehicle).Field("originalLOSTargetPositions").GetValue <Vector3[]>(); var newSourcePositions = ModSettings.LOSSourcePositions(identifier, originalLOSSourcePositions, sizeMultiplier); var newTargetPositions = ModSettings.LOSTargetPositions(identifier, originalLOSTargetPositions, sizeMultiplier); Traverse.Create(vehicle).Field("originalLOSSourcePositions").SetValue(newSourcePositions); Traverse.Create(vehicle).Field("originalLOSTargetPositions").SetValue(newTargetPositions); Traverse.Create(__instance.thisTransform).Property("localScale").SetValue(sizeMultiplier); }
public static void Postfix(VehicleRepresentation __instance) { try { if (!settings.BlipLights) { return; } // only want to patch blips var localPlayerTeam = UnityGameInstance.BattleTechGame.Combat.LocalPlayerTeam; var visibilityLevel = localPlayerTeam.VisibilityToTarget(__instance.parentActor); if (visibilityLevel == VisibilityLevel.None) { return; } Transform transform; // there is one parent transform which is not active // only try to find the transform if not memoized var vehicleGUID = __instance.parentVehicle.GUID; if (!lightTracker.ContainsKey(vehicleGUID)) { Log($"Adding vehicle {__instance.parentVehicle.Nickname} with {__instance.VisibleLights.Length} lights"); foreach (var light in __instance.VisibleLights) { transform = light.GetComponentsInParent <Transform>(true) .FirstOrDefault(x => !x.gameObject.activeSelf); if (transform != null) { // add single inactive transform lightTracker.Add(__instance.parentVehicle.GUID, new List <Transform> { transform }); break; } } // it doesn't have any inactive transforms so we don't care about it really // missiles seem to run this method. add it so it doesn't check every frame if (!lightTracker.ContainsKey(vehicleGUID)) { lightTracker.Add(__instance.parentVehicle.GUID, new List <Transform> { __instance.transform.parent }); } } // grab the inactive transform, activate it but disable the mesh transform = lightTracker[__instance.parentVehicle.GUID].FirstOrDefault(); if (transform != null) { transform.gameObject.SetActive(true); var mesh = transform.GetComponentInChildren <SkinnedMeshRenderer>(); foreach (var child in transform.GetComponentsInChildren <Component>()) { if (child is SkinnedMeshRenderer) { mesh.enabled = visibilityLevel == VisibilityLevel.LOSFull; } if (child is BTLight btLight) { btLight.enabled = visibilityLevel >= VisibilityLevel.Blip0Minimum; } } } } catch (NullReferenceException) { // do nothing (harmless NREs at game load) } catch (Exception ex) { Log(ex); } }