using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("NamePlateResize")] [assembly: AssemblyDescription("Shrinks the world-space name/guild nameplates above characters in Erenshor")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("NamePlateResize")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7c4e1a2b-9d3f-4a61-b58c-2e0f6d7a9c14")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace NamePlateResize; [BepInPlugin("com.erenshor.nameplateresize", "NamePlate Resize", "1.0.0")] public class NamePlateResizePlugin : BaseUnityPlugin { public const string PluginGuid = "com.erenshor.nameplateresize"; public const string PluginName = "NamePlate Resize"; public const string PluginVersion = "1.0.0"; private const int KindSim = 0; private const int KindNpc = 1; private const int KindPlayer = 2; private const int KindCount = 3; private static readonly string[] KindNames = new string[3] { "sim", "NPC", "player" }; private static readonly string[] KindSections = new string[3] { "Sims", "NPCs", "Yourself" }; private static ManualLogSource _log; private static readonly ConfigEntry[] _cfgPlateScale = new ConfigEntry[3]; private static readonly ConfigEntry[] _cfgHeightOffset = new ConfigEntry[3]; private static bool _baselineCaptured; private static bool _parRtIsPlateRoot; private static readonly float[] _appliedPlateScale = new float[3] { 1f, 1f, 1f }; private static readonly float[] _appliedHeightOffset = new float[3]; private static bool _failureLogged; private static readonly bool[] _kindAnnounced = new bool[3]; private void Awake() { _log = ((BaseUnityPlugin)this).Logger; BindKind(0, 1f, "sims -- the green names above other players"); BindKind(1, 1f, "NPCs and mobs, including vendors and mining nodes"); BindKind(2, 1f, "your own character"); for (int i = 0; i < 3; i++) { _appliedPlateScale[i] = _cfgPlateScale[i].Value; _appliedHeightOffset[i] = _cfgHeightOffset[i].Value; } Harmony.CreateAndPatchAll(typeof(NamePlateResizePlugin), (string)null); _log.LogInfo((object)("Active. " + DescribeSettings())); _log.LogInfo((object)"Prefab baseline will be logged when the first nameplate spawns."); } private void BindKind(int kind, float defaultScale, string who) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Expected O, but got Unknown string text = KindSections[kind]; _cfgPlateScale[kind] = ((BaseUnityPlugin)this).Config.Bind(text, "NameplateScale", defaultScale, new ConfigDescription("The size of the floating nameplate above " + who + ".\n1.0 is the size the game draws it, so nothing changes until you\nlower this.", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 3f), Array.Empty())); _cfgHeightOffset[kind] = ((BaseUnityPlugin)this).Config.Bind(text, "HeightOffset", 0f, new ConfigDescription("Moves that nameplate up or down, in metres.\nA smaller plate leaves a wider gap above the head, so around -0.15\noften sits better. 0 keeps the game's own placement.", (AcceptableValueBase)(object)new AcceptableValueRange(-2f, 2f), Array.Empty())); } private static int ClassifyPlate(NamePlate plate) { Character myself = plate.Myself; if ((Object)(object)myself == (Object)null) { return 2; } NPC myNPC = myself.MyNPC; if ((Object)(object)myNPC == (Object)null) { return 1; } return (!myNPC.SimPlayer) ? 1 : 0; } private static void ApplyToPlate(NamePlate plate, int kind, float scaleFactor, float heightDelta) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)plate == (Object)null)) { if (!_baselineCaptured) { CaptureBaseline(plate); } Transform transform = ((Component)plate).transform; if (scaleFactor != 1f) { transform.localScale *= scaleFactor; } if (heightDelta != 0f) { transform.position += new Vector3(0f, heightDelta, 0f); } } } private static void CaptureBaseline(NamePlate plate) { _baselineCaptured = true; Transform transform = ((Component)plate).transform; Transform myParRT = (Transform)(object)plate.MyParRT; _parRtIsPlateRoot = (Object)(object)myParRT != (Object)null && (Object)(object)myParRT == (Object)(object)transform; if (_parRtIsPlateRoot) { _log.LogWarning((object)"This build's NamePlate.MyParRT IS the plate root, so the game rewrites that scale every frame on any plate showing a lifebar. Mob nameplates may not stay resized. Sims and your own plate are unaffected."); } } private static void NamePlateStarted(NamePlate plate) { int num = ClassifyPlate(plate); ApplyToPlate(plate, num, _appliedPlateScale[num], _appliedHeightOffset[num]); if (!_kindAnnounced[num]) { _kindAnnounced[num] = true; string text = (((Object)(object)plate.MyStats != (Object)null) ? plate.MyStats.MyName : "(you)"); _log.LogInfo((object)$"First {KindNames[num]} nameplate classified: \"{text}\" -- NameplateScale {_cfgPlateScale[num].Value}, HeightOffset {_cfgHeightOffset[num].Value}."); } } private static string DescribeSettings() { string text = ""; for (int i = 0; i < 3; i++) { if (i > 0) { text += " | "; } text += $"{KindSections[i]}: scale={_cfgPlateScale[i].Value} height={_cfgHeightOffset[i].Value}"; } return text; } [HarmonyPatch(typeof(NamePlate), "Start")] [HarmonyPostfix] public static void NamePlate_Start_Postfix(NamePlate __instance) { try { NamePlateStarted(__instance); } catch (Exception ex) { if (!_failureLogged) { _failureLogged = true; _log.LogError((object)("Could not resize a nameplate; leaving all plates at vanilla size. This is reported once only. " + ex)); } } } }