コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: Core.cs プロジェクト: gnivler/BetterHeadlights
        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);
            }
        }