From 26728be761ed7ca556c9403ccfb7364d619dfb63 Mon Sep 17 00:00:00 2001 From: Andreas Pardeike Date: Sun, 21 Jun 2020 16:01:28 +0200 Subject: [PATCH] v2.0.2 fixes Issue #12 --- About/Manifest.xml | 2 +- About/ModSync.xml | 2 +- Source/Main.cs | 125 ++++-------------------------- Source/Properties/AssemblyInfo.cs | 4 +- Source/Tools.cs | 5 +- v1.1/Assemblies/CameraPlus.dll | Bin 59904 -> 59392 bytes 6 files changed, 23 insertions(+), 115 deletions(-) diff --git a/About/Manifest.xml b/About/Manifest.xml index f722525..533229c 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@  net.pardeike.rimworld.mod.cameraplus - 2.0.1.10 + 2.0.2.0
  • 1.0.0
  • 1.1.0
  • diff --git a/About/ModSync.xml b/About/ModSync.xml index f6ac95d..550090c 100644 --- a/About/ModSync.xml +++ b/About/ModSync.xml @@ -2,7 +2,7 @@ d47b5c8c-3f08-4ab6-8d0a-bc67e509d15c Camera+ - 2.0.1.10 + 2.0.2.0 False pardeike diff --git a/Source/Main.cs b/Source/Main.cs index 592accf..2f38959 100644 --- a/Source/Main.cs +++ b/Source/Main.cs @@ -15,6 +15,9 @@ public class CameraPlusMain : Mod public static CameraPlusSettings Settings; public static float orthographicSize = -1f; + // for other mods: set temporarily to true to skip any hiding + public static bool renderEverything = false; + public CameraPlusMain(ModContentPack content) : base(content) { Settings = GetSettings(); @@ -92,13 +95,6 @@ static IEnumerable Transpiler(IEnumerable inst if (found == false) Log.Error("Cannot find field Stdfld rootSize in CameraDriver.Update"); } - - /*static void Postfix(CameraDriver __instance) - { - if (CameraPlusMain.Settings.stickyMiddleMouse) - if (Refs.desiredDollyRaw(__instance) != Vector2.zero) - Refs.velocity(__instance) = Vector3.zero; - }*/ } [HarmonyPatch(typeof(TimeControls))] @@ -122,92 +118,6 @@ static void Postfix(ref Vector2 __result) } } - /* - [HarmonyPatch(typeof(CameraDriver))] - [HarmonyPatch("CameraDriverOnGUI")] - static class CameraDriver_CameraDriverOnGUI_Patch - { - static Vector2 dummy; - static readonly MethodInfo m_Patch = SymbolExtensions.GetMethodInfo(() => Patch(null, ref dummy, ref dummy)); - - static void Patch(CameraDriver cameraDriver, ref Vector2 desiredDollyRaw, ref Vector2 desiredDolly) - { - if (desiredDollyRaw != Vector2.zero) - { - var factor = CameraDriver.HitchReduceFactor; - if (desiredDollyRaw != Vector2.zero) - factor = 1 / RealTime.deltaTime / 60f; - - desiredDollyRaw *= factor; - desiredDollyRaw.x *= -1f; - desiredDolly += desiredDollyRaw * cameraDriver.config.dollyRateScreenEdge; - - // done in postfix for CameraDriver.Update() - // desiredDollyRaw = Vector2.zero; - } - } - - static IEnumerable Transpiler(IEnumerable instructions) - { - var list = instructions.ToList(); - list.InsertRange(0, new CodeInstruction[] - { - new CodeInstruction(OpCodes.Ldarg_0), - new CodeInstruction(OpCodes.Call, Refs.p_get_zero), - new CodeInstruction(OpCodes.Stfld, Refs.f_desiredDollyRaw) - } - ); - - var found = false; - for (var i = 0; i < list.Count - 4; i++) - { - if (list[i].opcode != OpCodes.Ldarg_0) - continue; - var start = i; - if (list[i + 1].LoadsField(Refs.f_desiredDollyRaw) == false) - continue; - if (list[i + 2].Calls(Refs.p_get_zero) == false) - continue; - if (list[i + 3].Calls(Refs.m_op_Inequality) == false) - continue; - - i += 4; - while (list[i].opcode != OpCodes.Brfalse && list[i].opcode != OpCodes.Brfalse_S && i < list.Count - 1) - i++; - if (list[i].opcode != OpCodes.Brfalse && list[i].opcode != OpCodes.Brfalse_S) - continue; - var jumpLabel = (Label)list[i].operand; - - var j = list.FindIndex(start, instr => instr.labels.Contains(jumpLabel)); - if (j == -1) - continue; - _ = list[j].labels.Remove(jumpLabel); - var labels = list[start].labels; - var blocks = list[start].blocks; - list.RemoveRange(start, j - start); - - var callPatchInstructions = new CodeInstruction[] - { - new CodeInstruction(OpCodes.Ldarg_0) { labels = labels, blocks = blocks }, - new CodeInstruction(OpCodes.Ldarg_0), - new CodeInstruction(OpCodes.Ldflda, Refs.f_desiredDollyRaw), - new CodeInstruction(OpCodes.Ldarg_0), - new CodeInstruction(OpCodes.Ldflda, Refs.f_desiredDolly), - new CodeInstruction(OpCodes.Call, m_Patch) - }; - list.InsertRange(start, callPatchInstructions); - - found = true; - break; - } - if (found == false) - Log.Error("Cannot find and replace last if() in CameraDriver.OnGUI"); - - return list.AsEnumerable(); - } - } - */ - [HarmonyPatch(typeof(MoteMaker))] [HarmonyPatch("ThrowText")] [HarmonyPatch(new Type[] { typeof(Vector3), typeof(Map), typeof(string), typeof(Color), typeof(float) })] @@ -215,6 +125,9 @@ static class MoteMaker_ThrowText_Patch { static bool Prefix(Vector3 loc) { + if (CameraPlusMain.renderEverything) + return true; + if (CameraPlusMain.Settings.hideNamesWhenZoomedOut == false) return true; @@ -237,6 +150,9 @@ static class PawnRenderer_RenderPawnAt_Patch [HarmonyPriority(10000)] static bool Prefix(Pawn ___pawn) { + if (CameraPlusMain.renderEverything) + return true; + var cameraDelegate = Tools.GetCachedCameraDelegate(___pawn); if (cameraDelegate.GetCameraColors == null) { @@ -271,6 +187,9 @@ static class GenMapUI_DrawPawnLabel_Patch [HarmonyPriority(10000)] public static bool Prefix(Pawn pawn, float truncateToWidth) { + if (CameraPlusMain.renderEverything) + return true; + if (truncateToWidth != 9999f) return true; // use label @@ -336,6 +255,9 @@ static GameFont GetAdaptedGameFont(float rootSize) [HarmonyPriority(10000)] public static bool Prefix(Vector2 screenPos) { + if (CameraPlusMain.renderEverything) + return true; + Tools.ShouldShowLabel(screenPos, false, out var showLabel, out _); return showLabel; } @@ -424,23 +346,6 @@ static IEnumerable Transpiler(IEnumerable inst } } - /* increase clipping distance - // - [HarmonyPatch(typeof(CameraDriver))] - [HarmonyPatch("Awake")] - static class CameraDriver_Awake_Patch - { - static IEnumerable Transpiler(IEnumerable instructions) - { - foreach (var instruction in instructions) - { - if (instruction.opcode == OpCodes.Ldc_R4) - instruction.operand = CameraPlusSettings.farOutHeight + 5; - yield return instruction; - } - } - }*/ - // here, we basically add a "var lerpedRootSize = Main.LerpRootSize(this.rootSize);" to // the beginning of this method and replace every "this.rootSize" witn "lerpedRootSize" // diff --git a/Source/Properties/AssemblyInfo.cs b/Source/Properties/AssemblyInfo.cs index 4094565..66ac486 100644 --- a/Source/Properties/AssemblyInfo.cs +++ b/Source/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: Guid("b0d46bb5-08ff-4e04-9efd-3e32e38a9cc2")] -[assembly: AssemblyVersion("2.0.1.10")] -[assembly: AssemblyFileVersion("2.0.1.10")] +[assembly: AssemblyVersion("2.0.2.0")] +[assembly: AssemblyFileVersion("2.0.2.0")] diff --git a/Source/Tools.cs b/Source/Tools.cs index 5c8db29..3233058 100644 --- a/Source/Tools.cs +++ b/Source/Tools.cs @@ -438,7 +438,9 @@ public static void HandleHotkeys() return; var map = Find.CurrentMap; - var cameraDriver = Find.CameraDriver; + if (map == null) + return; + var savedViews = map.GetComponent(); m1 = settings.cameraSettingsLoad[0]; @@ -459,6 +461,7 @@ public static void HandleHotkeys() if (m1 == KeyCode.None || Input.GetKey(m1)) if (m2 == KeyCode.None || Input.GetKey(m2)) { + var cameraDriver = Find.CameraDriver; savedViews.views[numKey - 1] = new RememberedCameraPos(map) { rootPos = Refs.rootPos(cameraDriver), diff --git a/v1.1/Assemblies/CameraPlus.dll b/v1.1/Assemblies/CameraPlus.dll index 9d01979a6eea286dea93a4c6828b5a392af141e7..312f32fcbb2ecc6aed41244b26e39f1c10a2b978 100644 GIT binary patch delta 17653 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 delta 17485 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 q{UU@PRdqJH7>K-=zla)j-XZ17Z