using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Jotunn;
using Jotunn.Entities;
using Jotunn.Extensions;
using Jotunn.Managers;
using Jotunn.Utils;
using Splatform;
using TMPro;
using UWU.Behaviors;
using UWU.Commands;
using UWU.Common;
using UWU.Extensions;
using UWU.Features;
using UnityEngine;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("UWU")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("UWU")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")]
[assembly: AssemblyFileVersion("0.2.1")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.2.1.0")]
namespace UWU
{
[BepInPlugin("com.ulvrikironpaw.uwu", "Ulvrik's World Update", "0.2.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
internal class UWUMod : BaseUnityPlugin
{
[HarmonyPatch(typeof(ZNet), "Awake")]
public static class ZNet_Awake_Patch
{
private static void Postfix()
{
RPCManager.RegisterRPCs();
}
}
private static bool isConfigured = false;
private static FeatureBehaviour[] features = new FeatureBehaviour[0];
private static GameObject featureHost;
private void Awake()
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Expected O, but got Unknown
if (isConfigured)
{
return;
}
isConfigured = true;
Harmony.CreateAndPatchAll(typeof(ZNet_Awake_Patch), (string)null);
featureHost = new GameObject("Features_UWU");
Object.DontDestroyOnLoad((Object)(object)featureHost);
features = CreateFeatures();
FeatureBehaviour[] array = features;
foreach (FeatureBehaviour featureBehaviour in array)
{
try
{
featureBehaviour.Configure(((BaseUnityPlugin)this).Config);
}
catch (Exception ex)
{
Logger.LogError((object)ex);
}
}
}
private static FeatureBehaviour[] CreateFeatures()
{
return new FeatureBehaviour[12]
{
CreateFeature<BoatyMcBoatfaceFeature>(),
CreateFeature<ModerBoatingFeature>(),
CreateFeature<NotMyShipFeature>(),
CreateFeature<PaddleFasterFeature>(),
CreateFeature<SailFasterFeature>(),
CreateFeature<SailingGraceFeature>(),
CreateFeature<ShipBonkiesFeature>(),
CreateFeature<ShipNameplateFeature>(),
CreateFeature<ShipPinFeature>(),
CreateFeature<ShipRenameFeature>(),
CreateFeature<MoodifierFeature>(),
CreateFeature<SpeedometerFeature>()
};
}
private static T CreateFeature<T>() where T : FeatureBehaviour
{
return featureHost.AddComponent<T>();
}
}
}
namespace UWU.Features
{
internal class BoatyMcBoatfaceFeature : FeatureBehaviour
{
private static BoatyMcBoatfaceFeature instance;
private static readonly string[] Prefixes = new string[72]
{
"Amber", "Ash", "Axe", "Battle", "Bear", "Black", "Blaze", "Blood", "Bone", "Brave",
"Bright", "Cinder", "Cold", "Crow", "Dark", "Dawn", "Death", "Deep", "Drake", "Dusk",
"Eagle", "Ember", "Fire", "Flame", "Frost", "Ghost", "Giant", "Glory", "Gore", "Grim",
"Hard", "Hawk", "Ice", "Iron", "Ironfist", "Lone", "Long", "Mighty", "Mist", "Moon",
"Night", "Oak", "Odin", "Old", "One", "Pale", "Rage", "Raven", "Red", "Rock",
"Rune", "Sea", "Shadow", "Silent", "Skald", "Skull", "Snow", "Steel", "Stone", "Storm",
"Strong", "Sun", "Swift", "Thor", "Thunder", "True", "Valkyr", "Wild", "Wind", "Wolf",
"Wyrm", "Young"
};
private static readonly string[] Suffixes = new string[72]
{
"bane", "beard", "bearer", "binder", "biter", "blade", "blaze", "blood", "breaker", "burner",
"caller", "claw", "cleaver", "crusher", "dance", "doom", "drinker", "eater", "eye", "fang",
"fist", "flame", "flayer", "foe", "foot", "forger", "friend", "fury", "gaze", "glare",
"grim", "guard", "hand", "heart", "helm", "horn", "howler", "hunter", "lash", "maiden",
"mark", "mast", "mauler", "maw", "moon", "rage", "reader", "rider", "roamer", "roar",
"runner", "sail", "sailor", "scar", "seeker", "shade", "shaper", "shield", "singer", "slayer",
"smasher", "smith", "song", "soul", "spell", "storm", "voice", "walker", "warden", "warrior",
"watcher", "weaver"
};
protected override string Name => "BoatyMcBoatface";
protected override string Category => "Sailing";
protected override string Description => "Automatically give ships names on creation.";
protected override bool EnabledByDefault => true;
internal BoatyMcBoatfaceFeature()
{
instance = this;
}
protected override void OnPatch(Harmony harmony)
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Expected O, but got Unknown
MethodInfo methodInfo = AccessTools.Method(typeof(Ship), "Start", (Type[])null, (Type[])null);
MethodInfo methodInfo2 = AccessTools.Method(typeof(BoatyMcBoatfaceFeature), "Ship_Start_Patch", (Type[])null, (Type[])null);
harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
private static void Ship_Start_Patch(Ship __instance)
{
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
ZNetView component = ((Component)__instance).GetComponent<ZNetView>();
if (!((Object)(object)component == (Object)null) && component.IsValid() && component.IsOwner())
{
ZDO zDO = component.GetZDO();
if (zDO != null && Utility.IsNullOrWhiteSpace(NameCache.GetCustomLabelFromZDO(zDO)))
{
string label = GenerateStableName(zDO.m_uid);
RPCManager.RenameObject(zDO, label);
}
}
}
private static string GenerateStableName(ZDOID id)
{
long num = ((ZDOID)(ref id)).UserID ^ ((ZDOID)(ref id)).ID;
Random random = new Random((int)(num & 0xFFFFFFFFu) ^ (int)(num >> 32));
string text = Prefixes[random.Next(Prefixes.Length)];
string text2 = Suffixes[random.Next(Suffixes.Length)];
if (text.ToLower() == text2.ToLower())
{
return text + " " + StringExtensions.CapitalizeFirstLetter(text2);
}
return text + text2;
}
}
internal sealed class ModerBoatingFeature : FeatureBehaviour
{
private const float maxTime = 5f;
private float updateTimer = 5f;
private StatusEffect modifiedModerEffect;
protected override string Name => "ModerBoating";
protected override string Category => "Sailing";
protected override string Description => "Permanently applies the Moder buff";
protected override bool EnabledByDefault => false;
protected override void OnPatch(Harmony harmony)
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Expected O, but got Unknown
MethodInfo methodInfo = AccessTools.Method(typeof(StatusEffect), "Setup", (Type[])null, (Type[])null);
MethodInfo methodInfo2 = AccessTools.Method(typeof(ModerBoatingFeature), "StatusEffect_Setup_Prefix", (Type[])null, (Type[])null);
harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
protected override void OnUnpatch()
{
Player localPlayer = Player.m_localPlayer;
if (!((Object)(object)localPlayer == (Object)null))
{
SEMan sEMan = ((Character)localPlayer).GetSEMan();
if (sEMan != null)
{
sEMan.RemoveStatusEffect(modifiedModerEffect, false);
}
}
}
private void FixedUpdate()
{
updateTimer += Time.deltaTime;
if (updateTimer < 5f)
{
return;
}
updateTimer = 0f;
Player localPlayer = Player.m_localPlayer;
if ((Object)(object)localPlayer == (Object)null)
{
return;
}
SEMan sEMan = ((Character)localPlayer).GetSEMan();
if (sEMan != null)
{
StatusEffect statusEffect = ObjectDB.instance.GetStatusEffect("GP_Moder".GetHashCode());
if ((Object)(object)statusEffect != (Object)null && !sEMan.HaveStatusEffect("GP_Moder".GetHashCode()))
{
modifiedModerEffect = statusEffect.Clone();
modifiedModerEffect.m_ttl = 0f;
modifiedModerEffect.m_isNew = false;
sEMan.AddStatusEffect(modifiedModerEffect, false, 0, 0f);
}
}
}
private static bool StatusEffect_Setup_Prefix(StatusEffect __instance, Character character)
{
if (__instance.m_name == "$se_moder_name")
{
__instance.m_character = character;
return false;
}
return true;
}
}
internal class MoodifierFeature : FeatureBehaviour
{
private bool weatherConfigured;
protected override string Name => "Moodifier";
protected override string Category => "Weather";
protected override string Description => "Modifies weather patterns to set the mood";
protected override bool EnabledByDefault => false;
protected override void OnConfigure(ConfigFile config)
{
CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new StringCommand("UWUWeather", "Attempts to change the local weather to the specified weather name", adminOnly: true, isCheat: true, delegate
{
EnvMan instance = EnvMan.instance;
return ((instance == null) ? null : instance.GetCurrentEnvironment()?.m_name) ?? "???";
}, delegate(string envName)
{
EnvMan.instance?.SetEnvironment_UWU(envName);
}));
CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new VoidCommand("UWUListWeather", "Lists all known weather environments", adminOnly: true, isCheat: true, delegate
{
EnvMan.instance?.PrintEnvironments_UWU();
}));
}
private void FixedUpdate()
{
if (!weatherConfigured && !((Object)(object)EnvMan.instance == (Object)null))
{
weatherConfigured = true;
Environments.AddCustomEnvironments(EnvMan.instance);
ConfigureWeather(EnvMan.instance);
}
}
private static void ConfigureWeather(EnvMan instance)
{
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Expected O, but got Unknown
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
foreach (KeyValuePair<Biome, WeatherEntry[]> weatherOverride in GetWeatherOverrides())
{
Biome biome = weatherOverride.Key;
WeatherEntry[] value = weatherOverride.Value;
if (!value.Any())
{
Logger.LogWarning((object)$"No overrides for {biome}. Skipping");
continue;
}
BiomeEnvSetup val = instance.m_biomes.Find((BiomeEnvSetup it) => it.m_biome == biome);
if (val == null)
{
Logger.LogWarning((object)$"Could not find biome: {biome}");
continue;
}
List<EnvEntry> environments = val.m_environments;
WeatherEntry[] array = value;
foreach (WeatherEntry weatherEntry in array)
{
string envName = weatherEntry.Name;
EnvSetup env = instance.m_environments.Find((EnvSetup e) => e.m_name.Equals(envName, StringComparison.OrdinalIgnoreCase));
if (env == null)
{
Logger.LogWarning((object)("Environment '" + envName + "' not found!"));
continue;
}
EnvEntry val2 = environments.Find((EnvEntry it) => it.m_env == env);
if (val2 == null)
{
environments.Add(new EnvEntry
{
m_env = env,
m_weight = weatherEntry.Weight
});
}
else
{
val2.m_weight = weatherEntry.Weight;
}
Logger.LogInfo((object)$"Added '{envName}' to {biome} biome weather pool.");
}
}
}
private static IDictionary<Biome, WeatherEntry[]> GetWeatherOverrides()
{
Dictionary<Biome, WeatherEntry[]> dictionary = new Dictionary<Biome, WeatherEntry[]>();
dictionary.Add((Biome)1, new WeatherEntry[8]
{
new WeatherEntry
{
Name = "Clear",
Weight = 3.5f
},
new WeatherEntry
{
Name = "Heath clear",
Weight = 0.8f
},
new WeatherEntry
{
Name = "LightRain",
Weight = 0.8f
},
new WeatherEntry
{
Name = "Eikthyr",
Weight = 0.2f
},
new WeatherEntry
{
Name = "Misty",
Weight = 0.2f
},
new WeatherEntry
{
Name = "Overcast_UWU",
Weight = 0.5f
},
new WeatherEntry
{
Name = "Rain",
Weight = 0.4f
},
new WeatherEntry
{
Name = "ThunderStorm",
Weight = 0.2f
}
});
dictionary.Add((Biome)8, new WeatherEntry[9]
{
new WeatherEntry
{
Name = "DeepForest Mist",
Weight = 2.5f
},
new WeatherEntry
{
Name = "EtherealMist_UWU",
Weight = 0.4f
},
new WeatherEntry
{
Name = "LightRain",
Weight = 0.2f
},
new WeatherEntry
{
Name = "Mistlands_rain",
Weight = 0.1f
},
new WeatherEntry
{
Name = "Misty",
Weight = 0.2f
},
new WeatherEntry
{
Name = "Overcast_UWU",
Weight = 0.4f
},
new WeatherEntry
{
Name = "Rain",
Weight = 0.2f
},
new WeatherEntry
{
Name = "ThunderStorm",
Weight = 0.3f
},
new WeatherEntry
{
Name = "nofogts",
Weight = 0.3f
}
});
dictionary.Add((Biome)2, new WeatherEntry[10]
{
new WeatherEntry
{
Name = "DeepForest Mist",
Weight = 1f
},
new WeatherEntry
{
Name = "LightRain",
Weight = 0.6f
},
new WeatherEntry
{
Name = "Mistlands_rain",
Weight = 0.3f
},
new WeatherEntry
{
Name = "Misty",
Weight = 1.2f
},
new WeatherEntry
{
Name = "Overcast_UWU",
Weight = 1f
},
new WeatherEntry
{
Name = "Rain",
Weight = 0.4f
},
new WeatherEntry
{
Name = "Bonemass",
Weight = 0.8f
},
new WeatherEntry
{
Name = "SwampRain",
Weight = 0.4f
},
new WeatherEntry
{
Name = "ThunderStorm",
Weight = 0.4f
},
new WeatherEntry
{
Name = "nofogts",
Weight = 0.4f
}
});
dictionary.Add((Biome)4, new WeatherEntry[6]
{
new WeatherEntry
{
Name = "Clear",
Weight = 1f
},
new WeatherEntry
{
Name = "FrostFog_UWU",
Weight = 1f
},
new WeatherEntry
{
Name = "OvercastSnow_UWU",
Weight = 1.5f
},
new WeatherEntry
{
Name = "Snow",
Weight = 3f
},
new WeatherEntry
{
Name = "SnowStorm",
Weight = 1.2f
},
new WeatherEntry
{
Name = "Twilight_SnowStorm",
Weight = 0.6f
}
});
dictionary.Add((Biome)16, new WeatherEntry[8]
{
new WeatherEntry
{
Name = "DustStorm_UWU",
Weight = 0.2f
},
new WeatherEntry
{
Name = "GoldenDusk_UWU",
Weight = 0.6f
},
new WeatherEntry
{
Name = "Heath clear",
Weight = 3.5f
},
new WeatherEntry
{
Name = "LightRain",
Weight = 0.8f
},
new WeatherEntry
{
Name = "Eikthyr",
Weight = 0.2f
},
new WeatherEntry
{
Name = "Misty",
Weight = 0.4f
},
new WeatherEntry
{
Name = "Overcast_UWU",
Weight = 0.5f
},
new WeatherEntry
{
Name = "ThunderStorm",
Weight = 0.2f
}
});
dictionary.Add((Biome)256, new WeatherEntry[10]
{
new WeatherEntry
{
Name = "Clear",
Weight = 2.6f
},
new WeatherEntry
{
Name = "EtherealMist_UWU",
Weight = 0.3f
},
new WeatherEntry
{
Name = "LightRain",
Weight = 0.6f
},
new WeatherEntry
{
Name = "Misty",
Weight = 0.1f
},
new WeatherEntry
{
Name = "Mistlands_thunder",
Weight = 0.1f
},
new WeatherEntry
{
Name = "Overcast_UWU",
Weight = 1.2f
},
new WeatherEntry
{
Name = "Rain",
Weight = 0.4f
},
new WeatherEntry
{
Name = "SeaSquall_UWU",
Weight = 0.5f
},
new WeatherEntry
{
Name = "ThunderStorm",
Weight = 0.3f
},
new WeatherEntry
{
Name = "nofogts",
Weight = 0.3f
}
});
dictionary.Add((Biome)512, new WeatherEntry[8]
{
new WeatherEntry
{
Name = "Clear",
Weight = 1f
},
new WeatherEntry
{
Name = "EtherealMist_UWU",
Weight = 0.4f
},
new WeatherEntry
{
Name = "Eikthyr",
Weight = 0.2f
},
new WeatherEntry
{
Name = "Mistlands_clear",
Weight = 1f
},
new WeatherEntry
{
Name = "Mistlands_rain",
Weight = 0.15f
},
new WeatherEntry
{
Name = "Mistlands_thunder",
Weight = 0.2f
},
new WeatherEntry
{
Name = "Overcast_UWU",
Weight = 0.3f
},
new WeatherEntry
{
Name = "Rain",
Weight = 0.15f
}
});
return dictionary;
}
}
internal class WeatherEntry
{
internal string Name { get; set; }
internal float Weight { get; set; }
}
internal sealed class NotMyShipFeature : FeatureBehaviour
{
protected override string Name => "NotMyShip";
protected override string Category => "Sailing";
protected override string Description => "Aggression toward ships will be reduced while no player is aboard";
protected override void OnPatch(Harmony harmony)
{
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Expected O, but got Unknown
MethodInfo methodInfo = AccessTools.Method(typeof(BaseAI), "CanSenseTarget", new Type[1] { typeof(Character) }, (Type[])null);
MethodInfo methodInfo2 = AccessTools.Method(typeof(NotMyShipFeature), "BaseAI_CanSenseTarget_Postfix", (Type[])null, (Type[])null);
harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
private static void BaseAI_CanSenseTarget_Postfix(Character target, ref bool __result)
{
if (__result && !((Object)(object)target == (Object)null))
{
Ship component = ((Component)target).GetComponent<Ship>();
if (!((Object)(object)component == (Object)null))
{
__result = component.HasPlayerOnboard();
}
}
}
}
internal sealed class PaddleFasterFeature : FeatureBehaviour
{
private struct Ship_CustomFixedUpdate_State
{
internal float initialBackwardForce;
}
private static PaddleFasterFeature instance;
private float forceBackward = 1.1f;
private float forceForward = 1.2f;
protected override string Name => "PaddleFaster";
protected override string Category => "Sailing";
protected override string Description => "Makes paddling forward/backward about twice as fast";
internal PaddleFasterFeature()
{
instance = this;
}
protected override void OnConfigure(ConfigFile config)
{
CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new FloatCommand("UWUPaddleForce", "Changes the rate of paddling. Toggle PaddleFaster to reset.", adminOnly: true, isCheat: true, () => forceBackward, delegate(float value)
{
forceBackward = value;
forceForward = value;
}));
}
protected override void OnPatch(Harmony harmony)
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Expected O, but got Unknown
//IL_005b: Expected O, but got Unknown
MethodInfo methodInfo = AccessTools.Method(typeof(Ship), "CustomFixedUpdate", (Type[])null, (Type[])null);
MethodInfo methodInfo2 = AccessTools.Method(typeof(PaddleFasterFeature), "Ship_CustomFixedUpdate_Prefix", (Type[])null, (Type[])null);
MethodInfo methodInfo3 = AccessTools.Method(typeof(PaddleFasterFeature), "Ship_CustomFixedUpdate_Postfix", (Type[])null, (Type[])null);
harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), new HarmonyMethod(methodInfo3), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
private static void Ship_CustomFixedUpdate_Prefix(Ship __instance, out Ship_CustomFixedUpdate_State __state)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Invalid comparison between Unknown and I4
__state = new Ship_CustomFixedUpdate_State
{
initialBackwardForce = __instance.m_backwardForce
};
Speed speed_UWU = __instance.GetSpeed_UWU();
float num = __instance.m_backwardForce * 1.5f;
float num2 = (((int)speed_UWU != 1) ? instance.forceForward : instance.forceBackward);
__instance.m_backwardForce = num * num2;
}
private static void Ship_CustomFixedUpdate_Postfix(Ship __instance, Ship_CustomFixedUpdate_State __state)
{
__instance.m_backwardForce = __state.initialBackwardForce;
}
}
internal sealed class SailFasterFeature : FeatureBehaviour
{
private struct Ship_CustomFixedUpdate_State
{
internal float initialSailForceFactor;
}
private static SailFasterFeature instance;
private const float MAST_COEFFICIENT_DEFAULT = 1f;
private float MAST_COEFFICIENT_HALF = 1.1f;
private float MAST_COEFFICIENT_FULL = 1.2f;
protected override string Name => "SailFaster";
protected override string Category => "Sailing";
protected override string Description => "Makes ship sail speed about 75% faster.";
internal SailFasterFeature()
{
instance = this;
}
protected override void OnConfigure(ConfigFile config)
{
CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new FloatCommand("UWUMCHalf", "For debugging, The multiplier of sailforce when at half mast", adminOnly: true, isCheat: true, () => MAST_COEFFICIENT_HALF, delegate(float value)
{
MAST_COEFFICIENT_HALF = value;
}));
CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new FloatCommand("UWUMCFull", "For debugging, The multiplier of sailforce when at full mast", adminOnly: true, isCheat: true, () => MAST_COEFFICIENT_FULL, delegate(float value)
{
MAST_COEFFICIENT_FULL = value;
}));
}
protected override void OnPatch(Harmony harmony)
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Expected O, but got Unknown
//IL_005b: Expected O, but got Unknown
MethodInfo methodInfo = AccessTools.Method(typeof(Ship), "CustomFixedUpdate", (Type[])null, (Type[])null);
MethodInfo methodInfo2 = AccessTools.Method(typeof(SailFasterFeature), "Ship_CustomFixedUpdate_Prefix", (Type[])null, (Type[])null);
MethodInfo methodInfo3 = AccessTools.Method(typeof(SailFasterFeature), "Ship_CustomFixedUpdate_Postfix", (Type[])null, (Type[])null);
harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), new HarmonyMethod(methodInfo3), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
private static void Ship_CustomFixedUpdate_Prefix(Ship __instance, out Ship_CustomFixedUpdate_State __state)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Invalid comparison between Unknown and I4
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Invalid comparison between Unknown and I4
__state = new Ship_CustomFixedUpdate_State
{
initialSailForceFactor = __instance.m_sailForceFactor
};
Speed speed_UWU = __instance.GetSpeed_UWU();
float num = __instance.m_sailForceFactor * 1.8f;
float num2 = (((int)speed_UWU == 3) ? instance.MAST_COEFFICIENT_HALF : (((int)speed_UWU != 4) ? 1f : instance.MAST_COEFFICIENT_FULL));
__instance.m_sailForceFactor = num * num2;
}
private static void Ship_CustomFixedUpdate_Postfix(Ship __instance, Ship_CustomFixedUpdate_State __state)
{
__instance.m_sailForceFactor = __state.initialSailForceFactor;
}
}
internal sealed class SailingGraceFeature : FeatureBehaviour
{
private static SailingGraceFeature instance;
private float headwindReductionMin = 5.8f;
private float headwindReductionMax = 7.2f;
protected override string Name => "SailingGrace";
protected override string Category => "Sailing";
protected override string Description => "Significantly reduces the penalty for headwinds";
internal SailingGraceFeature()
{
instance = this;
}
protected override void OnConfigure(ConfigFile config)
{
CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new FloatCommand("UWUHWRMin", "For debugging, the factor to reduce speed when at the minimum headwind", adminOnly: true, isCheat: true, () => headwindReductionMin, delegate(float value)
{
headwindReductionMin = value;
}));
CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new FloatCommand("UWUHWRMax", "For debugging, the factor to reduce speed when at the maximum headwind", adminOnly: true, isCheat: true, () => headwindReductionMax, delegate(float value)
{
headwindReductionMax = value;
}));
}
protected override void OnPatch(Harmony harmony)
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Expected O, but got Unknown
MethodInfo methodInfo = AccessTools.Method(typeof(Ship), "GetSailForce", (Type[])null, (Type[])null);
MethodInfo methodInfo2 = AccessTools.Method(typeof(SailingGraceFeature), "Ship_GetSailForce_Prefix", (Type[])null, (Type[])null);
harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
private static bool Ship_GetSailForce_Prefix(Ship __instance, float sailSize, ref Vector3 __result)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
Vector3 windDir = EnvMan.instance.GetWindDir();
float num = Vector3.Angle(windDir, ((Component)__instance).transform.forward);
Vector3 val;
if (num > 135f && num < 225f)
{
float num2 = Mathf.Abs(num - 180f) / 45f;
float num3 = Mathf.Lerp(instance.headwindReductionMax, instance.headwindReductionMin, num2);
val = Vector3.Normalize(((Component)__instance).transform.forward) * (__instance.m_sailForceFactor * sailSize / num3);
}
else
{
float num4 = Mathf.Lerp(0.25f, 1f, EnvMan.instance.GetWindIntensity());
float num5 = __instance.GetWindAngleFactor() * num4;
val = Vector3.Normalize(windDir + ((Component)__instance).transform.forward) * (num5 * __instance.m_sailForceFactor * sailSize);
}
Traverse obj = Traverse.Create((object)__instance);
Traverse<Vector3> val2 = obj.Field<Vector3>("m_sailForce");
Traverse<Vector3> val3 = obj.Field<Vector3>("m_windChangeVelocity");
Vector3 value = val3.Value;
Vector3 val4 = Vector3.SmoothDamp(val2.Value, val, ref value, 1f, 99f);
val3.Value = value;
val2.Value = val4;
__result = val4;
return false;
}
}
internal sealed class ShipBonkiesFeature : FeatureBehaviour
{
protected override string Name => "ShipBonkies";
protected override string Category => "Sailing";
protected override string Description => "Hammer destructs ships for full refund when no player is aboard";
protected override void OnPatch(Harmony harmony)
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Expected O, but got Unknown
MethodInfo methodInfo = AccessTools.Method(typeof(Player), "RemovePiece", (Type[])null, (Type[])null);
MethodInfo methodInfo2 = AccessTools.Method(typeof(ShipBonkiesFeature), "Player_RemovePiece_Prefix", (Type[])null, (Type[])null);
harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
private static bool Player_RemovePiece_Prefix(ref bool __result)
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
if (__result)
{
return true;
}
if ((Object)(object)Player.m_localPlayer == (Object)null)
{
return true;
}
int num = 268451840;
RaycastHit val = default(RaycastHit);
if (!Physics.Raycast(((Component)GameCamera.instance).transform.position, ((Component)GameCamera.instance).transform.forward, ref val, 10f, num))
{
return true;
}
Ship componentInParent = ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<Ship>();
if ((Object)(object)componentInParent == (Object)null)
{
return true;
}
if (componentInParent.HasPlayerOnboard())
{
UserHud.Alert("Exit boat and try again");
__result = false;
return false;
}
WearNTear component = ((Component)componentInParent).GetComponent<WearNTear>();
if ((Object)(object)component == (Object)null)
{
__result = false;
return false;
}
component.Remove(false);
__result = true;
return false;
}
}
internal class ShipNameplateFeature : FeatureBehaviour
{
private const float scanInterval = 5f;
private float scanTimer = 5f;
protected override string Name => "ShipNameplates";
protected override string Category => "Sailing";
protected override string Description => "Adds nameplates to boats";
protected override bool EnabledByDefault => true;
private void FixedUpdate()
{
scanTimer += Time.deltaTime;
if (scanTimer < 5f)
{
return;
}
scanTimer = 0f;
foreach (Ship item in ObjectUtils.EmumerateInstanceOfType<Ship>())
{
Nameplate.DecorateIfNecessary((MonoBehaviour)(object)item);
}
}
protected override void OnUnpatch()
{
foreach (Ship item in ObjectUtils.EmumerateInstanceOfType<Ship>())
{
Nameplate.RemoveNameplates((MonoBehaviour)(object)item);
}
scanTimer = 5f;
}
}
internal sealed class ShipPinFeature : FeatureBehaviour
{
private class SailPinData
{
internal PinData PinData { get; set; }
internal bool IsIconSetup { get; set; } = true;
}
private const float ICON_SCALE = 1.35f;
private const float scanInterval = 5f;
private const float updateInterval = 0.17f;
private readonly Dictionary<ZDO, SailPinData> SailPins = new Dictionary<ZDO, SailPinData>();
private float scanTimer;
private float updateTimer;
protected override string Name => "ShipPin";
protected override string Category => "Sailing";
protected override string Description => "Tracks ships on the map";
private void FixedUpdate()
{
if (!((Object)(object)Minimap.instance == (Object)null))
{
scanTimer += Time.deltaTime;
if (scanTimer >= 5f)
{
scanTimer = 0f;
RescanShips();
}
updateTimer += Time.deltaTime;
if (updateTimer >= 0.17f)
{
updateTimer = 0f;
UpdateSailPins();
}
}
}
protected override void OnUnpatch()
{
RemoveSailPins();
}
private void RemoveSailPins()
{
foreach (SailPinData value in SailPins.Values)
{
Minimap.instance.RemovePin(value.PinData);
}
SailPins.Clear();
}
private void RescanShips()
{
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
List<ZDO> list = ObjectUtils.EnumerateZDOsOfTypeByPosition<Ship>().ToList();
foreach (ZDO item in list)
{
if (!SailPins.ContainsKey(item))
{
Sprite buildIconFromZDO = IconUtils.GetBuildIconFromZDO(item);
string labelFromZDO = NameCache.GetLabelFromZDO(item);
PinData val = Minimap.instance.AddPin(item.GetPosition(), (PinType)(((Object)(object)buildIconFromZDO == (Object)null) ? 3 : 8), labelFromZDO, false, false, 0L, default(PlatformUserID));
if ((Object)(object)buildIconFromZDO != (Object)null)
{
val.m_icon = buildIconFromZDO;
}
SailPins[item] = new SailPinData
{
PinData = val
};
}
}
foreach (KeyValuePair<ZDO, SailPinData> item2 in SailPins.ToList())
{
ZDO key = item2.Key;
if (!list.Contains(key))
{
SailPinData value = item2.Value;
Minimap.instance.RemovePin(value.PinData);
SailPins.Remove(key);
}
}
}
private void UpdateSailPins()
{
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: 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)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
foreach (KeyValuePair<ZDO, SailPinData> sailPin in SailPins)
{
ZDO key = sailPin.Key;
SailPinData value = sailPin.Value;
if (value.IsIconSetup)
{
Image val = value.PinData?.m_iconElement;
if ((Object)(object)val != (Object)null)
{
RectTransform rectTransform = ((Graphic)val).rectTransform;
Vector3 localScale = ((Transform)rectTransform).localScale;
localScale.x = 1.35f;
localScale.y = 1.35f;
((Transform)rectTransform).localScale = localScale;
value.IsIconSetup = true;
}
}
value.PinData.m_name = NameCache.GetLabelFromZDO(key);
value.PinData.m_pos = key.GetPosition();
}
}
}
internal class ShipRenameFeature : FeatureBehaviour
{
protected static ShipRenameFeature instance;
private ConfigEntry<KeyboardShortcut> RenameShortcut;
protected override string Name => "ShipRename";
protected override string Category => "Sailing";
protected override string Description => "Allows renaming ships";
protected override bool EnabledByDefault => true;
internal ShipRenameFeature()
{
instance = this;
}
protected override void OnConfigure(ConfigFile config)
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
RenameShortcut = config.Bind<KeyboardShortcut>("Sailing", "ShipRenameKey", new KeyboardShortcut((KeyCode)110, Array.Empty<KeyCode>()), "Key used for renaming ships");
}
protected override void OnPatch(Harmony harmony)
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Expected O, but got Unknown
MethodInfo methodInfo = AccessTools.Method(typeof(ShipControlls), "GetHoverText", (Type[])null, (Type[])null);
MethodInfo methodInfo2 = AccessTools.Method(typeof(ShipRenameFeature), "ShipControlls_GetHoverText_Postfix", (Type[])null, (Type[])null);
harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
private static void ShipControlls_GetHoverText_Postfix(ShipControlls __instance, ref string __result)
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
KeyboardShortcut value = instance.RenameShortcut.Value;
KeyCode mainKey = ((KeyboardShortcut)(ref value)).MainKey;
string text = ((object)(KeyCode)(ref mainKey)).ToString();
__result = NameCache.GetLabelFromObject((MonoBehaviour)(object)__instance.m_ship) + "\n\n" + __result + "\n[<color=yellow><b>" + text + "</b></color>] Rename";
value = instance.RenameShortcut.Value;
if (!((KeyboardShortcut)(ref value)).IsDown() || UserHud.IsDialogOpen())
{
return;
}
Ship ship = __instance.m_ship;
if ((Object)(object)ship == (Object)null)
{
return;
}
ZNetView zNetView = ObjectUtils.GetZNetView((MonoBehaviour)(object)ship);
if ((Object)(object)zNetView == (Object)null || !zNetView.IsValid())
{
return;
}
ZDO zdo = zNetView.GetZDO();
if (zdo != null)
{
string initialValue = NameCache.GetLabelFromZNetView(zNetView) ?? "";
UserHud.Confirm("Rename ship", initialValue, delegate(string newTitle)
{
RPCManager.RenameObject(zdo, newTitle);
UserHud.Alert("Ship renamed to " + newTitle);
});
}
}
}
internal sealed class SpeedometerFeature : FeatureBehaviour
{
private const float maxTime = 0.25f;
private float currentSpeed;
private float updateTimer;
protected override string Name => "Speedometer";
protected override string Category => "Sailing";
protected override string Description => "If enabled, a speedometer will appear on the screen";
protected override bool EnabledByDefault => false;
private void OnGUI()
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Expected O, but got Unknown
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
GUIStyle val = new GUIStyle
{
fontSize = 32,
alignment = (TextAnchor)4
};
val.normal.textColor = Color.white;
string text = $"{currentSpeed:F1} m/s";
Rect val2 = new Rect(10f, 10f, 144f, 40f);
GUI.backgroundColor = new Color(0f, 0f, 0f, 0.5f);
GUI.Box(val2, GUIContent.none);
GUI.Label(val2, text, val);
}
private void FixedUpdate()
{
//IL_003d: 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)
Player localPlayer = Player.m_localPlayer;
if (!((Object)(object)localPlayer == (Object)null))
{
updateTimer += Time.deltaTime;
if (!(updateTimer < 0.25f))
{
updateTimer = 0f;
Vector3 velocity = ((Character)localPlayer).GetVelocity();
currentSpeed = ((Vector3)(ref velocity)).magnitude;
}
}
}
}
}
namespace UWU.Extensions
{
internal static class EnvManExtensions
{
private static readonly Action<EnvMan, string> QueueEnvironmentDelegate;
static EnvManExtensions()
{
QueueEnvironmentDelegate = AccessTools.MethodDelegate<Action<EnvMan, string>>(typeof(EnvMan).GetMethod("QueueEnvironment", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[1] { typeof(string) }, null), (object)null, true);
}
internal static void QueueEnvironment_UWU(this EnvMan self, string envName)
{
QueueEnvironmentDelegate(self, envName);
}
internal static void PrintEnvironments_UWU(this EnvMan self)
{
List<EnvSetup> environments = self.m_environments;
if (environments == null || environments.Count == 0)
{
Console.instance.Print("[UWU] No environments found!");
return;
}
Console.instance.Print("[UWU] --- Known Weather Environments ---");
foreach (EnvSetup item in environments.OrderBy((EnvSetup it) => it.m_name))
{
string text = "";
if (item.m_isFreezing)
{
text += " ❄\ufe0f";
}
if (item.m_isCold && !item.m_isFreezing)
{
text += " \ud83e\uddca";
}
if (item.m_isWet)
{
text += " \ud83d\udca7";
}
Console.instance.Print("[UWU] • " + item.m_name + text);
}
}
internal static void PrintBiomeEnvironmentConfig(this EnvMan self)
{
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)self == (Object)null)
{
Logger.LogWarning((object)"[UWU] EnvMan not initialized yet!");
return;
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("=== UWU Biome Weather Overview ===");
foreach (BiomeEnvSetup biome in self.m_biomes)
{
if (biome == null || biome.m_environments == null || biome.m_environments.Count == 0)
{
continue;
}
float num = biome.m_environments.Sum((EnvEntry e) => e.m_weight);
stringBuilder.AppendLine($"\nBiome: {biome.m_biome}");
foreach (EnvEntry environment in biome.m_environments)
{
string arg = environment.m_env?.m_name ?? "(null)";
float num2 = environment.m_weight / num * 100f;
stringBuilder.AppendLine($" - {arg}: {environment.m_weight:F2} weight → {num2:F1}%");
}
}
Logger.LogInfo((object)stringBuilder.ToString());
}
internal static void SetEnvironment_UWU(this EnvMan envMan, string envName)
{
string nameToLower = envName.ToLowerInvariant();
List<EnvSetup> list = envMan.m_environments.FindAll((EnvSetup e) => e.m_name.ToLowerInvariant().Contains(nameToLower));
if (list.Count < 1)
{
Console.instance.Print("No environment named '" + envName + "' found!");
return;
}
if (list.Count == 1)
{
string name = list[0].m_name;
envMan.QueueEnvironment_UWU(name);
Console.instance.Print("UWU: Weather set to '" + name + "' \ud83d\udca8");
return;
}
EnvSetup val = ((IEnumerable<EnvSetup>)list).FirstOrDefault((Func<EnvSetup, bool>)((EnvSetup it) => it.m_name.ToLowerInvariant() == nameToLower));
if (val != null)
{
envMan.QueueEnvironment_UWU(val.m_name);
Console.instance.Print("UWU: Weather set to '" + val.m_name + "' \ud83d\udca8");
return;
}
foreach (EnvSetup item in list.OrderBy((EnvSetup it) => it.m_name))
{
Console.instance.Print("[UWU] • " + item.m_name);
}
Console.instance.Print("Too many matching environments. Be specific");
}
}
internal static class ShipExtensions
{
private static readonly Func<Ship, bool> HaveControllingPlayerDelegate;
private static readonly FieldRef<Ship, Speed> m_speedRef;
static ShipExtensions()
{
m_speedRef = AccessTools.FieldRefAccess<Ship, Speed>("m_speed");
HaveControllingPlayerDelegate = AccessTools.MethodDelegate<Func<Ship, bool>>(typeof(Ship).GetMethod("HaveControllingPlayer", BindingFlags.Instance | BindingFlags.NonPublic), (object)null, true);
}
internal static bool GetControllingPlayer_UWU(this Ship ship)
{
return HaveControllingPlayerDelegate(ship);
}
internal static Speed GetSpeed_UWU(this Ship ship)
{
return m_speedRef.Invoke(ship);
}
}
internal static class ZDOManExtensions
{
private static readonly FieldRef<ZDOMan, Dictionary<ZDOID, ZDO>> ObjectsByIdRef = AccessTools.FieldRefAccess<ZDOMan, Dictionary<ZDOID, ZDO>>("m_objectsByID");
private static readonly FieldRef<ZDOMan, List<ZDOID>> DestroySendListRef = AccessTools.FieldRefAccess<ZDOMan, List<ZDOID>>("m_destroySendList");
public static Dictionary<ZDOID, ZDO> GetObjectsById_UWU(this ZDOMan zdoMan)
{
return ObjectsByIdRef.Invoke(zdoMan);
}
public static List<ZDOID> GetDestroyedSendList_UWU(this ZDOMan zdoMan)
{
return DestroySendListRef.Invoke(zdoMan);
}
}
internal static class ZNetSceneExtensions
{
private static readonly FieldRef<ZNetScene, Dictionary<ZDO, ZNetView>> Instances = AccessTools.FieldRefAccess<ZNetScene, Dictionary<ZDO, ZNetView>>("m_instances");
public static Dictionary<ZDO, ZNetView> GetInstances_UWU(this ZNetScene zNetScene)
{
return Instances.Invoke(zNetScene);
}
}
}
namespace UWU.Common
{
internal class CustomProperties
{
internal const string CUSTOM_LABEL_PROPERTY = "uwulabel";
}
internal class EnvId
{
internal const string AshlandsAshrain = "Ashlands_ashrain";
internal const string AshlandsMisty = "Ashlands_misty";
internal const string AshlandsCinderRain = "Ashlands_CinderRain";
internal const string AshlandsStorm = "Ashlands_Storm";
internal const string AshlandsSeaStorm = "Ashlands_SeaStorm";
internal const string BlackForestMist = "DeepForest Mist";
internal const string Clear = "Clear";
internal const string Crypt = "Crypt";
internal const string LightRain = "LightRain";
internal const string MeadowsBoss = "Eikthyr";
internal const string MistlandsClear = "Mistlands_clear";
internal const string MistlandsRain = "Mistlands_rain";
internal const string MistlandsThunder = "Mistlands_thunder";
internal const string Misty = "Misty";
internal const string PlainsClear = "Heath clear";
internal const string Rain = "Rain";
internal const string Snow = "Snow";
internal const string SnowStorm = "SnowStorm";
internal const string SwampBoss = "Bonemass";
internal const string SwampRain = "SwampRain";
internal const string BlackForestBoss = "GDKing";
internal const string Ghosts = "Ghosts";
internal const string PlainsBoss = "GoblinKing";
internal const string MistlandsCrypt = "InfectedMine";
internal const string MistlandsBoss = "Queen";
internal const string Thunderstorm = "ThunderStorm";
internal const string ThunderStormNoFog = "nofogts";
internal const string TwilightClear = "Twilight_Clear";
internal const string TwilightSnow = "Twilight_Snow";
internal const string TwilightSnowStorm = "Twilight_SnowStorm";
internal const string Overcast = "Overcast_UWU";
internal const string OvercastSnow = "OvercastSnow_UWU";
internal const string FrostFog = "FrostFog_UWU";
internal const string GoldenDusk = "GoldenDusk_UWU";
internal const string DustStorm = "DustStorm_UWU";
internal const string SeaSquall = "SeaSquall_UWU";
internal const string EtherealMist = "EtherealMist_UWU";
}
internal class IconUtils
{
private static readonly Dictionary<string, Sprite> iconCache = new Dictionary<string, Sprite>();
internal static Sprite GetBuildIconFromString(string pieceName)
{
if (iconCache.TryGetValue(pieceName, out var value))
{
return value;
}
GameObject val = ((IEnumerable<GameObject>)PieceManager.Instance.GetPieceTable("Hammer")?.m_pieces).FirstOrDefault((Func<GameObject, bool>)((GameObject p) => ((Object)p).name.Contains(pieceName)));
if (!Object.op_Implicit((Object)(object)val))
{
Logger.LogError((object)("Could not find piece with name containing '" + pieceName + "'"));
return null;
}
value = val.GetComponent<Piece>()?.m_icon;
iconCache[pieceName] = value;
return value;
}
internal static Sprite GetBuildIconFromZDO(ZDO zdo)
{
string nameFromZDO = NameCache.GetNameFromZDO(zdo);
if (string.IsNullOrWhiteSpace(nameFromZDO))
{
return null;
}
nameFromZDO = nameFromZDO.Replace("(Clone)", "").Trim();
return GetBuildIconFromString(nameFromZDO);
}
}
internal class Manifest
{
public const string PluginGUID = "com.ulvrikironpaw.uwu";
public const string PluginName = "Ulvrik's World Update";
public const string PluginVersion = "0.2.1";
}
internal class NameCache
{
private static readonly Dictionary<int, string> nameCache;
static NameCache()
{
nameCache = new Dictionary<int, string>();
PrefabManager.OnPrefabsRegistered += delegate
{
nameCache.Clear();
};
}
internal static string GetPrefabName(int prefabHash)
{
if (nameCache.TryGetValue(prefabHash, out var value))
{
return value;
}
ZNetScene instance = ZNetScene.instance;
object obj;
if (instance == null)
{
obj = null;
}
else
{
GameObject prefab = instance.GetPrefab(prefabHash);
obj = ((prefab != null) ? ((Object)prefab).name : null);
}
if (obj == null)
{
obj = "";
}
value = (string)obj;
if (value == "")
{
return "(unknown prefab)";
}
nameCache.Add(prefabHash, value);
return value;
}
internal static string GetLabel(int prefabHash)
{
return ApplyNameOverrides(GetPrefabName(prefabHash));
}
internal static string GetLabelFromObject(MonoBehaviour behavior)
{
ZNetView zNetView = ObjectUtils.GetZNetView(behavior);
if ((Object)(object)zNetView == (Object)null)
{
return "(unknown ZNetView)";
}
return GetLabelFromZNetView(zNetView);
}
internal static string GetLabelFromZNetView(ZNetView netView)
{
ZDO zDO = netView.GetZDO();
if (zDO == null)
{
return "(unknown ZDO)";
}
return GetLabelFromZDO(zDO);
}
internal static string GetLabelFromZDO(ZDO zdo)
{
string customLabelFromZDO = GetCustomLabelFromZDO(zdo);
if (!string.IsNullOrWhiteSpace(customLabelFromZDO))
{
return customLabelFromZDO;
}
int prefab = zdo.GetPrefab();
if (prefab == 0)
{
return "(unknown Prefab)";
}
return GetLabel(prefab);
}
internal static string GetNameFromZDO(ZDO zdo)
{
return GetPrefabName(zdo.GetPrefab());
}
internal static string GetCustomLabelFromZDO(ZDO zdo)
{
return zdo.GetString("uwulabel", "") ?? "";
}
private static string ApplyNameOverrides(string prefabName)
{
if (string.IsNullOrWhiteSpace(prefabName))
{
return "(unknown object name)";
}
string text = prefabName.ToLowerInvariant();
if (!(text == "vikingship"))
{
if (text == "vikingship_ashlands")
{
return "Drakkar";
}
return prefabName;
}
return "Longship";
}
}
internal class ObjectUtils
{
[CompilerGenerated]
private sealed class <EmumerateInstanceOfType>d__3<T> : IEnumerable<T>, IEnumerable, IEnumerator<T>, IDisposable, IEnumerator where T : MonoBehaviour
{
private int <>1__state;
private T <>2__current;
private int <>l__initialThreadId;
private Dictionary<ZDO, ZNetView>.ValueCollection.Enumerator <>7__wrap1;
T IEnumerator<T>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <EmumerateInstanceOfType>d__3(int <>1__state)
{
this.<>1__state = <>1__state;
<>l__initialThreadId = Environment.CurrentManagedThreadId;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
int num = <>1__state;
if (num == -3 || num == 1)
{
try
{
}
finally
{
<>m__Finally1();
}
}
<>7__wrap1 = default(Dictionary<ZDO, ZNetView>.ValueCollection.Enumerator);
<>1__state = -2;
}
private bool MoveNext()
{
try
{
switch (<>1__state)
{
default:
return false;
case 0:
{
<>1__state = -1;
PrefabCache<T>.Build();
ZNetScene instance = ZNetScene.instance;
if ((Object)(object)instance == (Object)null)
{
return false;
}
Dictionary<ZDO, ZNetView> instances_UWU = instance.GetInstances_UWU();
<>7__wrap1 = instances_UWU.Values.GetEnumerator();
<>1__state = -3;
break;
}
case 1:
<>1__state = -3;
break;
}
while (<>7__wrap1.MoveNext())
{
ZNetView current = <>7__wrap1.Current;
if ((Object)(object)current == (Object)null)
{
continue;
}
ZDO zDO = current.GetZDO();
if (zDO != null && PrefabCache<T>.Contains(zDO.GetPrefab()))
{
T component = ((Component)current).GetComponent<T>();
if ((Object)(object)component != (Object)null)
{
<>2__current = component;
<>1__state = 1;
return true;
}
}
}
<>m__Finally1();
<>7__wrap1 = default(Dictionary<ZDO, ZNetView>.ValueCollection.Enumerator);
return false;
}
catch
{
//try-fault
((IDisposable)this).Dispose();
throw;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
private void <>m__Finally1()
{
<>1__state = -1;
((IDisposable)<>7__wrap1).Dispose();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
[DebuggerHidden]
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
{
<>1__state = 0;
return this;
}
return new <EmumerateInstanceOfType>d__3<T>(0);
}
[DebuggerHidden]
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<T>)this).GetEnumerator();
}
}
[CompilerGenerated]
private sealed class <EnumerateLoadedZDOsOfType>d__2<T> : IEnumerable<ZDO>, IEnumerable, IEnumerator<ZDO>, IDisposable, IEnumerator where T : MonoBehaviour
{
private int <>1__state;
private ZDO <>2__current;
private int <>l__initialThreadId;
private Dictionary<ZDO, ZNetView>.ValueCollection.Enumerator <>7__wrap1;
ZDO IEnumerator<ZDO>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <EnumerateLoadedZDOsOfType>d__2(int <>1__state)
{
this.<>1__state = <>1__state;
<>l__initialThreadId = Environment.CurrentManagedThreadId;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
int num = <>1__state;
if (num == -3 || num == 1)
{
try
{
}
finally
{
<>m__Finally1();
}
}
<>7__wrap1 = default(Dictionary<ZDO, ZNetView>.ValueCollection.Enumerator);
<>1__state = -2;
}
private bool MoveNext()
{
try
{
switch (<>1__state)
{
default:
return false;
case 0:
{
<>1__state = -1;
PrefabCache<T>.Build();
ZNetScene instance = ZNetScene.instance;
if ((Object)(object)instance == (Object)null)
{
return false;
}
Dictionary<ZDO, ZNetView> instances_UWU = instance.GetInstances_UWU();
<>7__wrap1 = instances_UWU.Values.GetEnumerator();
<>1__state = -3;
break;
}
case 1:
<>1__state = -3;
break;
}
while (<>7__wrap1.MoveNext())
{
ZNetView current = <>7__wrap1.Current;
if (!((Object)(object)current == (Object)null))
{
ZDO zDO = current.GetZDO();
if (zDO != null && PrefabCache<T>.Contains(zDO.GetPrefab()))
{
<>2__current = zDO;
<>1__state = 1;
return true;
}
}
}
<>m__Finally1();
<>7__wrap1 = default(Dictionary<ZDO, ZNetView>.ValueCollection.Enumerator);
return false;
}
catch
{
//try-fault
((IDisposable)this).Dispose();
throw;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
private void <>m__Finally1()
{
<>1__state = -1;
((IDisposable)<>7__wrap1).Dispose();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
[DebuggerHidden]
IEnumerator<ZDO> IEnumerable<ZDO>.GetEnumerator()
{
if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
{
<>1__state = 0;
return this;
}
return new <EnumerateLoadedZDOsOfType>d__2<T>(0);
}
[DebuggerHidden]
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<ZDO>)this).GetEnumerator();
}
}
[CompilerGenerated]
private sealed class <EnumerateZDOsOfType>d__0<T> : IEnumerable<ZDO>, IEnumerable, IEnumerator<ZDO>, IDisposable, IEnumerator where T : MonoBehaviour
{
private int <>1__state;
private ZDO <>2__current;
private int <>l__initialThreadId;
private HashSet<ZDOID> <destroyedSet>5__2;
private Dictionary<ZDOID, ZDO>.ValueCollection.Enumerator <>7__wrap2;
ZDO IEnumerator<ZDO>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <EnumerateZDOsOfType>d__0(int <>1__state)
{
this.<>1__state = <>1__state;
<>l__initialThreadId = Environment.CurrentManagedThreadId;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
int num = <>1__state;
if (num == -3 || num == 1)
{
try
{
}
finally
{
<>m__Finally1();
}
}
<destroyedSet>5__2 = null;
<>7__wrap2 = default(Dictionary<ZDOID, ZDO>.ValueCollection.Enumerator);
<>1__state = -2;
}
private bool MoveNext()
{
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
try
{
switch (<>1__state)
{
default:
return false;
case 0:
{
<>1__state = -1;
PrefabCache<T>.Build();
ZDOMan instance = ZDOMan.instance;
if (instance == null)
{
return false;
}
Dictionary<ZDOID, ZDO> objectsById_UWU = instance.GetObjectsById_UWU();
if (objectsById_UWU == null || objectsById_UWU.Count == 0)
{
return false;
}
List<ZDOID> destroyedSendList_UWU = instance.GetDestroyedSendList_UWU();
<destroyedSet>5__2 = ((destroyedSendList_UWU == null || destroyedSendList_UWU.Count == 0) ? null : new HashSet<ZDOID>(destroyedSendList_UWU));
<>7__wrap2 = objectsById_UWU.Values.GetEnumerator();
<>1__state = -3;
break;
}
case 1:
<>1__state = -3;
break;
}
while (<>7__wrap2.MoveNext())
{
ZDO current = <>7__wrap2.Current;
int prefab = current.GetPrefab();
if (prefab != 0 && PrefabCache<T>.Contains(prefab) && (<destroyedSet>5__2 == null || !<destroyedSet>5__2.Contains(current.m_uid)))
{
<>2__current = current;
<>1__state = 1;
return true;
}
}
<>m__Finally1();
<>7__wrap2 = default(Dictionary<ZDOID, ZDO>.ValueCollection.Enumerator);
return false;
}
catch
{
//try-fault
((IDisposable)this).Dispose();
throw;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
private void <>m__Finally1()
{
<>1__state = -1;
((IDisposable)<>7__wrap2).Dispose();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
[DebuggerHidden]
IEnumerator<ZDO> IEnumerable<ZDO>.GetEnumerator()
{
if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
{
<>1__state = 0;
return this;
}
return new <EnumerateZDOsOfType>d__0<T>(0);
}
[DebuggerHidden]
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<ZDO>)this).GetEnumerator();
}
}
[IteratorStateMachine(typeof(<EnumerateZDOsOfType>d__0<>))]
internal static IEnumerable<ZDO> EnumerateZDOsOfType<T>() where T : MonoBehaviour
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <EnumerateZDOsOfType>d__0<T>(-2);
}
internal static IEnumerable<ZDO> EnumerateZDOsOfTypeByPosition<T>() where T : MonoBehaviour
{
return from zdo in EnumerateZDOsOfType<T>()
orderby zdo.GetPosition().z descending, zdo.GetPosition().x
select zdo;
}
[IteratorStateMachine(typeof(<EnumerateLoadedZDOsOfType>d__2<>))]
internal static IEnumerable<ZDO> EnumerateLoadedZDOsOfType<T>() where T : MonoBehaviour
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <EnumerateLoadedZDOsOfType>d__2<T>(-2);
}
[IteratorStateMachine(typeof(<EmumerateInstanceOfType>d__3<>))]
internal static IEnumerable<T> EmumerateInstanceOfType<T>() where T : MonoBehaviour
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <EmumerateInstanceOfType>d__3<T>(-2);
}
internal static ZNetView GetZNetView(MonoBehaviour behavior)
{
return ((Component)behavior).gameObject.GetComponent<ZNetView>();
}
}
internal static class PhysicsUtils
{
internal static Vector3 GetTopCenterPoint(Transform attachTransform)
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: 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_005c: Unknown result type (might be due to invalid IL or missing references)
Renderer[] componentsInChildren = ((Component)attachTransform).GetComponentsInChildren<Renderer>();
if (componentsInChildren.Length == 0)
{
return attachTransform.position;
}
Bounds bounds = componentsInChildren[0].bounds;
for (int i = 1; i < componentsInChildren.Length; i++)
{
((Bounds)(ref bounds)).Encapsulate(componentsInChildren[i].bounds);
}
return new Vector3(((Bounds)(ref bounds)).center.x, ((Bounds)(ref bounds)).max.y, ((Bounds)(ref bounds)).center.z);
}
}
internal static class PrefabCache<T>
{
private static HashSet<int> hashcodeCache;
private static bool isBuilt;
static PrefabCache()
{
hashcodeCache = new HashSet<int>();
isBuilt = false;
PrefabManager.OnPrefabsRegistered += delegate
{
Build(forceRebuild: true);
};
}
internal static bool Build(bool forceRebuild = false)
{
if (isBuilt && !forceRebuild)
{
return true;
}
ZNetScene instance = ZNetScene.instance;
if ((Object)(object)instance == (Object)null)
{
return false;
}
HashSet<int> hashSet = new HashSet<int>();
Dictionary<int, string> dictionary = new Dictionary<int, string>();
new Dictionary<int, string>();
foreach (GameObject prefab in instance.m_prefabs)
{
if (!((Object)(object)prefab == (Object)null) && prefab.GetComponent<T>() != null)
{
int stableHashCode = StringExtensionMethods.GetStableHashCode(((Object)prefab).name);
hashSet.Add(stableHashCode);
dictionary[stableHashCode] = ((Object)prefab).name;
}
}
isBuilt = true;
hashcodeCache = hashSet;
return true;
}
internal static bool Contains(int prefabHash)
{
if (!isBuilt)
{
Build();
}
return hashcodeCache.Contains(prefabHash);
}
}
internal static class RPCManager
{
private const string SET_OBJECT_LABEL_NAME = "UWU_PerformRename";
private static bool isRegistered;
internal static void RegisterRPCs()
{
if (!isRegistered)
{
Logger.LogDebug((object)"Registering RPCs");
ZRoutedRpc.instance.Register<ZPackage>("UWU_PerformRename", (Action<long, ZPackage>)RPC_ServerReceiveRename);
isRegistered = true;
}
}
internal static void RenameObject(MonoBehaviour target, string label)
{
RenameObject(((Component)target).GetComponent<ZNetView>(), label);
}
internal static void RenameObject(ZNetView zNetView, string label)
{
if (!((Object)(object)zNetView == (Object)null))
{
ZDO zDO = zNetView.GetZDO();
if (zDO != null)
{
RenameObject(zDO, label);
}
}
}
internal static void RenameObject(ZDO target, string label)
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Expected O, but got Unknown
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
if (target != null)
{
MutateZDO(target, "uwulabel", label, ZNet.instance.IsServer());
long serverPeerID = ZRoutedRpc.instance.GetServerPeerID();
if (serverPeerID == 0L)
{
Logger.LogWarning((object)"No server peer");
return;
}
ZPackage val = new ZPackage();
val.Write(target.m_uid);
val.Write(label);
Logger.LogInfo((object)"Sending RPC: UWU_PerformRename");
ZRoutedRpc.instance.InvokeRoutedRPC(serverPeerID, "UWU_PerformRename", new object[1] { val });
}
}
private static void RPC_ServerReceiveRename(long sender, ZPackage package)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
ZDOID val = package.ReadZDOID();
string value = package.ReadString();
ZDO zDO = ZDOMan.instance.GetZDO(val);
if (zDO != null)
{
Logger.LogInfo((object)$"Received RPC to {((ZDOID)(ref zDO.m_uid)).UserID} {((ZDOID)(ref zDO.m_uid)).ID}");
MutateZDO(zDO, "uwulabel", value, forceSync: false);
}
}
private static void MutateZDO(ZDO target, string property, string value, bool forceSync)
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
target.Set(property, value);
if (forceSync)
{
ZDOMan.instance.ForceSendZDO(target.m_uid);
}
}
}
internal class UserHud
{
internal static void Alert(string message)
{
MessageHud instance = MessageHud.instance;
if (instance != null)
{
instance.ShowMessage((MessageType)2, message, 0, (Sprite)null, false);
}
}
internal static bool IsDialogOpen()
{
return TextInput.IsVisible();
}
internal static void Confirm(string title, string initialValue, Action<string> onComplete)
{
TextDialogMediator textDialogMediator = new TextDialogMediator();
textDialogMediator.SetText(initialValue);
textDialogMediator.OnComplete = onComplete;
TextInput.instance.RequestText((TextReceiver)(object)textDialogMediator, title, 24);
}
}
internal class TextDialogMediator : TextReceiver
{
private string text = "";
internal Action<string> OnComplete { get; set; }
public string GetText()
{
return text;
}
public void SetText(string text)
{
this.text = text;
OnComplete?.Invoke(text);
}
}
internal enum ValheimLayer
{
Default = 0,
TransparentFX = 1,
IgnoreRaycast = 2,
Water = 4,
UI = 5,
Effect = 8,
Character = 9,
Piece = 10,
Terrain = 11,
Item = 12,
Ghost = 13,
CharacterTrigger = 14,
StaticSolid = 15,
PieceNonsolid = 16,
CharacterGhost = 17,
Hitbox = 18,
Skybox = 19,
DefaultSmall = 20,
WaterVolume = 21,
Weapon = 22,
Blocker = 23,
Pathblocker = 24,
Viewblock = 25,
CharacterNet = 26,
CharacterNoenv = 27,
Vehicle = 28,
Smoke = 31
}
}
namespace UWU.Commands
{
internal class BoolCommand : ConsoleCommand
{
private readonly Func<bool> getValue;
private readonly Action<bool> setValue;
private readonly bool adminOnly;
private readonly string name;
private readonly string help;
private readonly bool isCheat;
public override string Name => name;
public override string Help => help;
public override bool IsCheat => isCheat;
internal BoolCommand(string name, string help, bool adminOnly, bool isCheat, Func<bool> getValue, Action<bool> setValue)
{
this.name = name;
this.help = help;
this.adminOnly = adminOnly;
this.isCheat = isCheat;
this.getValue = getValue;
this.setValue = setValue;
}
public override List<string> CommandOptionList()
{
return new List<string>();
}
public override void Run(string[] args)
{
if (adminOnly && !SynchronizationManager.Instance.PlayerIsAdmin)
{
Console.instance.Print(((ConsoleCommand)this).Name + " can only be set by an Admin");
return;
}
if (args.Length == 0)
{
Console.instance.Print($"{((ConsoleCommand)this).Name} is {getValue()}");
return;
}
string text = args[0].ToLower();
if (!(text == "true"))
{
if (text == "false")
{
setValue(obj: false);
Console.instance.Print($"{((ConsoleCommand)this).Name} set to {false}");
}
else
{
Console.instance.Print(((ConsoleCommand)this).Name + " not set. Invalid value");
}
}
else
{
setValue(obj: true);
Console.instance.Print($"{((ConsoleCommand)this).Name} set to {true}");
}
}
}
internal class FloatCommand : ConsoleCommand
{
private readonly Func<float> getValue;
private readonly Action<float> setValue;
private readonly bool adminOnly;
private readonly string name;
private readonly string help;
private readonly bool isCheat;
public override string Name => name;
public override string Help => help;
public override bool IsCheat => isCheat;
internal FloatCommand(string name, string help, bool adminOnly, bool isCheat, Func<float> getValue, Action<float> setValue)
{
this.name = name;
this.help = help;
this.adminOnly = adminOnly;
this.isCheat = isCheat;
this.getValue = getValue;
this.setValue = setValue;
}
public override List<string> CommandOptionList()
{
return new List<string>();
}
public override void Run(string[] args)
{
if (adminOnly && !SynchronizationManager.Instance.PlayerIsAdmin)
{
Console.instance.Print(((ConsoleCommand)this).Name + " can only be set by an Admin");
return;
}
if (args.Length == 0)
{
Console.instance.Print($"{((ConsoleCommand)this).Name} is {getValue()}");
return;
}
try
{
float num = float.Parse(args[0]);
setValue(num);
Console.instance.Print($"{((ConsoleCommand)this).Name} set to {num}");
}
catch
{
Console.instance.Print(((ConsoleCommand)this).Name + " not set. Invalid value");
}
}
}
internal class StringCommand : ConsoleCommand
{
private readonly Func<string> getValue;
private readonly Action<string> setValue;
private readonly bool adminOnly;
private readonly string name;
private readonly string help;
private readonly bool isCheat;
public override string Name => name;
public override string Help => help;
public override bool IsCheat => isCheat;
internal StringCommand(string name, string help, bool adminOnly, bool isCheat, Func<string> getValue, Action<string> setValue)
{
this.name = name;
this.help = help;
this.adminOnly = adminOnly;
this.isCheat = isCheat;
this.getValue = getValue;
this.setValue = setValue;
}
public override List<string> CommandOptionList()
{
return new List<string>();
}
public override void Run(string[] args)
{
if (adminOnly && !SynchronizationManager.Instance.PlayerIsAdmin)
{
Console.instance.Print(((ConsoleCommand)this).Name + " can only be set by an Admin");
return;
}
if (args.Length == 0)
{
Console.instance.Print(((ConsoleCommand)this).Name + " is " + getValue());
return;
}
string text = args[0];
setValue(text);
Console.instance.Print(((ConsoleCommand)this).Name + " set to " + text);
}
}
internal class VoidCommand : ConsoleCommand
{
private readonly Action<string[]> action;
private readonly bool adminOnly;
private readonly string name;
private readonly string help;
private readonly bool isCheat;
public override string Name => name;
public override string Help => help;
public override bool IsCheat => isCheat;
internal VoidCommand(string name, string help, bool adminOnly, bool isCheat, Action<string[]> action)
{
this.name = name;
this.help = help;
this.adminOnly = adminOnly;
this.isCheat = isCheat;
this.action = action;
}
public override List<string> CommandOptionList()
{
return new List<string>();
}
public override void Run(string[] args)
{
if (adminOnly && !SynchronizationManager.Instance.PlayerIsAdmin)
{
Console.instance.Print(((ConsoleCommand)this).Name + " can only be run by an Admin");
}
else
{
action(args);
}
}
}
}
namespace UWU.Behaviors
{
internal class Environments
{
[CompilerGenerated]
private sealed class <GetUnregistedEnvironments>d__1 : IEnumerable<EnvSetup>, IEnumerable, IEnumerator<EnvSetup>, IDisposable, IEnumerator
{
private int <>1__state;
private EnvSetup <>2__current;
private int <>l__initialThreadId;
private EnvMan instance;
public EnvMan <>3__instance;
EnvSetup IEnumerator<EnvSetup>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <GetUnregistedEnvironments>d__1(int <>1__state)
{
this.<>1__state = <>1__state;
<>l__initialThreadId = Environment.CurrentManagedThreadId;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = CreateOvercastEnvironment(instance);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<>2__current = CreateOvercastSnowEnvironment(instance);
<>1__state = 2;
return true;
case 2:
<>1__state = -1;
<>2__current = CreateFrostFogEnvironment(instance);
<>1__state = 3;
return true;
case 3:
<>1__state = -1;
<>2__current = CreateGoldenDuskEnvironment(instance);
<>1__state = 4;
return true;
case 4:
<>1__state = -1;
<>2__current = CreateDustStormEnvironment(instance);
<>1__state = 5;
return true;
case 5:
<>1__state = -1;
<>2__current = CreateSeaSquallEnvironment(instance);
<>1__state = 6;
return true;
case 6:
<>1__state = -1;
<>2__current = CreateEtherealMistEnvironment(instance);
<>1__state = 7;
return true;
case 7:
<>1__state = -1;
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
[DebuggerHidden]
IEnumerator<EnvSetup> IEnumerable<EnvSetup>.GetEnumerator()
{
<GetUnregistedEnvironments>d__1 <GetUnregistedEnvironments>d__;
if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
{
<>1__state = 0;
<GetUnregistedEnvironments>d__ = this;
}
else
{
<GetUnregistedEnvironments>d__ = new <GetUnregistedEnvironments>d__1(0);
}
<GetUnregistedEnvironments>d__.instance = <>3__instance;
return <GetUnregistedEnvironments>d__;
}
[DebuggerHidden]
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<EnvSetup>)this).GetEnumerator();
}
}
internal static void AddCustomEnvironments(EnvMan instance)
{
foreach (EnvSetup unregistedEnvironment in GetUnregistedEnvironments(instance))
{
if (unregistedEnvironment != null)
{
instance.m_environments.Add(unregistedEnvironment);
Logger.LogInfo((object)("Added new environment: " + unregistedEnvironment.m_name));
}
}
}
[IteratorStateMachine(typeof(<GetUnregistedEnvironments>d__1))]
private static IEnumerable<EnvSetup> GetUnregistedEnvironments(EnvMan instance)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <GetUnregistedEnvironments>d__1(-2)
{
<>3__instance = instance
};
}
private static EnvSetup CreateOvercastEnvironment(EnvMan instance)
{
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
if (instance.m_environments.Any((EnvSetup it) => it.m_name == "Overcast_UWU"))
{
return null;
}
EnvSetup val = instance.m_environments.Find((EnvSetup e) => e.m_name == "Rain");
if (val == null)
{
Logger.LogWarning((object)"Could not find base environment 'Rain'!");
return null;
}
EnvSetup val2 = instance.m_environments.Find((EnvSetup e) => e.m_name == "Clear");
if (val2 == null)
{
Logger.LogWarning((object)"Could not find base environment 'Clear'!");
return null;
}
EnvSetup obj = val.Clone();
obj.m_name = "Overcast_UWU";
obj.m_rainCloudAlpha = 0.5f;
obj.m_fogDensityDay = 0.002f;
obj.m_fogDensityNight = 0.005f;
obj.m_windMin = 0.1f;
obj.m_windMax = 0.25f;
obj.m_rainCloudAlpha = 0.35f;
obj.m_isWet = false;
obj.m_alwaysDark = false;
obj.m_fogColorDay = new Color(0.65f, 0.65f, 0.68f, 1f);
obj.m_fogColorEvening = new Color(0.55f, 0.55f, 0.6f, 1f);
obj.m_fogColorNight = new Color(0.4f, 0.4f, 0.45f, 1f);
obj.m_fogColorSunDay = new Color(0.8f, 0.8f, 0.85f, 1f);
obj.m_ambientLoop = val2.m_ambientLoop;
obj.m_psystems = (GameObject[])(((object)val2.m_psystems?.ToArray()) ?? ((object)new GameObject[0]));
return obj;
}
private static EnvSetup CreateOvercastSnowEnvironment(EnvMan instance)
{
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
if (instance.m_environments.Any((EnvSetup it) => it.m_name == "OvercastSnow_UWU"))
{
return null;
}
EnvSetup val = instance.m_environments.Find((EnvSetup e) => e.m_name == "Snow") ?? instance.m_environments.Find((EnvSetup e) => e.m_name == "SnowStorm");
if (val == null)
{
Logger.LogWarning((object)"Could not find base environment 'Snow' or 'SnowStorm'!");
return null;
}
EnvSetup obj = val.Clone();
obj.m_name = "OvercastSnow_UWU";
obj.m_rainCloudAlpha = 0.4f;
obj.m_fogDensityDay = 0.003f;
obj.m_fogDensityNight = 0.006f;
obj.m_windMin = 0.05f;
obj.m_windMax = 0.2f;
obj.m_isWet = false;
obj.m_isFreezing = true;
obj.m_fogColorDay = new Color(0.75f, 0.75f, 0.8f, 1f);
obj.m_fogColorEvening = new Color(0.65f, 0.65f, 0.7f, 1f);
obj.m_fogColorNight = new Color(0.5f, 0.5f, 0.55f, 1f);
obj.m_fogColorSunDay = new Color(0.8f, 0.8f, 0.85f, 1f);
obj.m_sunColorDay = new Color(0.9f, 0.9f, 1f, 1f);
return obj;
}
private static EnvSetup CreateFrostFogEnvironment(EnvMan instance)
{
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0140: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
if (instance.m_environments.Any((EnvSetup it) => it.m_name == "FrostFog_UWU"))
{
return null;
}
EnvSetup val = instance.m_environments.Find((EnvSetup e) => e.m_name == "Snow");
if (val == null)
{
Logger.LogWarning((object)"Could not find base environment 'Snow'!");
return null;
}
EnvSetup obj = val.Clone();
obj.m_name = "FrostFog_UWU";
obj.m_rainCloudAlpha = 0.2f;
obj.m_fogDensityDay = 0.006f;
obj.m_fogDensityNight = 0.012f;
obj.m_windMin = 0f;
obj.m_windMax = 0.1f;
obj.m_isWet = false;
obj.m_isFreezing = true;
obj.m_psystems = Array.Empty<GameObject>();
obj.m_fogColorDay = new Color(0.7f, 0.8f, 0.9f, 1f);
obj.m_fogColorEvening = new Color(0.6f, 0.7f, 0.8f, 1f);
obj.m_fogColorNight = new Color(0.45f, 0.5f, 0.55f, 1f);
obj.m_fogColorSunDay = new Color(0.9f, 0.95f, 1f, 1f);
obj.m_sunColorDay = new Color(0.8f, 0.85f, 1f, 1f);
return obj;
}
private static EnvSetup CreateGoldenDuskEnvironment(EnvMan instance)
{
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
if (instance.m_environments.Any((EnvSetup it) => it.m_name == "GoldenDusk_UWU"))
{
return null;
}
EnvSetup val = instance.m_environments.Find((EnvSetup e) => e.m_name == "Heath clear");
if (val == null)
{
Logger.LogWarning((object)"Could not find base environment 'Heath clear'!");
return null;
}
EnvSetup obj = val.Clone();
obj.m_name = "GoldenDusk_UWU";
obj.m_fogColorDay = new Color(1f, 0.85f, 0.6f, 1f);
obj.m_fogColorEvening = new Color(1f, 0.7f, 0.4f, 1f);
obj.m_fogColorNight = new Color(0.4f, 0.3f, 0.25f, 1f);
obj.m_fogColorSunDay = new Color(1.1f, 0.9f, 0.7f, 1f);
obj.m_fogDensityDay = 0.0015f;
obj.m_fogDensityNight = 0.0025f;
obj.m_lightIntensityDay = 1.1f;
obj.m_lightIntensityNight = 0.8f;
obj.m_windMin = 0.05f;
obj.m_windMax = 0.2f;
obj.m_rainCloudAlpha = 0.15f;
obj.m_isWet = false;
obj.m_isColdAtNight = true;
return obj;
}
private static EnvSetup CreateSeaSquallEnvironment(EnvMan instance)
{
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
if (instance.m_environments.Any((EnvSetup it) => it.m_name == "SeaSquall_UWU"))
{
return null;
}
EnvSetup val = instance.m_environments.Find((EnvSetup e) => e.m_name == "ThunderStorm");
if (val == null)
{
Logger.LogWarning((object)"Could not find base environment 'ThunderStorm'!");
return null;
}
EnvSetup obj = val.Clone();
obj.m_name = "SeaSquall_UWU";
obj.m_rainCloudAlpha = 0.85f;
obj.m_fogDensityDay = 0.03f;
obj.m_fogDensityNight = 0.045f;
obj.m_fogColorDay = new Color(0.25f, 0.3f, 0.35f, 1f);
obj.m_fogColorNight = new Color(0.1f, 0.12f, 0.15f, 1f);
obj.m_ambColorDay = new Color(0.35f, 0.35f, 0.4f, 1f);
obj.m_ambColorNight = new Color(0.15f, 0.18f, 0.22f, 1f);
obj.m_windMin = 0.8f;
obj.m_windMax = 1.4f;
obj.m_rainCloudAlpha = 0.8f;
obj.m_isWet = true;
obj.m_isCold = true;
obj.m_alwaysDark = true;
return obj;
}
private static EnvSetup CreateDustStormEnvironment(EnvMan instance)
{
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
if (instance.m_environments.Any((EnvSetup it) => it.m_name == "DustStorm_UWU"))
{
return null;
}
EnvSetup val = instance.m_environments.Find((EnvSetup e) => e.m_name == "ThunderStorm");
if (val == null)
{
Logger.LogWarning((object)"Could not find base environment 'ThunderStorm'!");
return null;
}
EnvSetup obj = val.Clone();
obj.m_name = "DustStorm_UWU";
obj.m_fogColorDay = new Color(0.8f, 0.7f, 0.5f, 1f);
obj.m_fogColorEvening = new Color(0.7f, 0.55f, 0.35f, 1f);
obj.m_fogColorNight = new Color(0.4f, 0.3f, 0.2f, 1f);
obj.m_fogColorSunDay = new Color(1f, 0.85f, 0.55f, 1f);
obj.m_fogDensityDay = 0.01f;
obj.m_fogDensityNight = 0.012f;
obj.m_windMin = 0.4f;
obj.m_windMax = 0.7f;
obj.m_isWet = false;
obj.m_rainCloudAlpha = 0.4f;
obj.m_psystems = (GameObject[])(object)new GameObject[0];
obj.m_lightIntensityDay = 0.7f;
obj.m_lightIntensityNight = 0.6f;
return obj;
}
private static EnvSetup CreateEtherealMistEnvironment(EnvMan instance)
{
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
if (instance.m_environments.Any((EnvSetup it) => it.m_name == "EtherealMist_UWU"))
{
return null;
}
EnvSetup val = instance.m_environments.Find((EnvSetup e) => e.m_name == "Mistlands_clear");
if (val == null)
{
Logger.LogWarning((object)"Base environment 'Mistlands_clear' not found!");
return null;
}
EnvSetup obj = val.Clone();
obj.m_name = "EtherealMist_UWU";
obj.m_fogDensityDay = 0.015f;
obj.m_fogDensityNight = 0.02f;
obj.m_fogColorDay = new Color(0.65f, 0.7f, 0.8f, 1f);
obj.m_fogColorNight = new Color(0.45f, 0.5f, 0.6f, 1f);
obj.m_fogColorSunDay = new Color(0.8f, 0.85f, 0.9f, 1f);
obj.m_windMin = 0.05f;
obj.m_windMax = 0.15f;
return obj;
}
}
internal abstract class FeatureBehaviour : MonoBehaviour
{
private readonly Harmony harmony;
protected ConfigEntry<bool> FeatureEnabled { get; set; }
protected abstract string Name { get; }
protected abstract string Category { get; }
protected abstract string Description { get; }
protected virtual bool EnabledByDefault => true;
protected virtual bool Synced => true;
protected FeatureBehaviour()
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Expected O, but got Unknown
harmony = new Harmony("com.ulvrikironpaw.uwu." + Name.ToLower());
}
protected virtual void OnConfigure(ConfigFile config)
{
}
protected virtual void OnPatch(Harmony harmony)
{
}
protected virtual void OnUnpatch()
{
}
internal void Configure(ConfigFile config)
{
FeatureEnabled = ConfigFileExtensions.BindConfig<bool>(config, Category, Name, EnabledByDefault, Description, Synced, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null);
((Behaviour)this).enabled = FeatureEnabled.Value;
CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new BoolCommand("UWU" + Name, "Enables or disables the UWU" + Name + " option", Synced, isCheat: true, () => FeatureEnabled.Value, delegate(bool value)
{
FeatureEnabled.Value = value;
}));
FeatureEnabled.SettingChanged += delegate
{
Logger.LogInfo((object)(harmony.Id + " settings has changed to " + FeatureEnabled.Value));
if (FeatureEnabled.Value)
{
Patch();
}
else
{
Unpatch();
}
((Behaviour)this).enabled = FeatureEnabled.Value;
};
OnConfigure(config);
if (FeatureEnabled.Value)
{
Patch();
}
}
private void Patch()
{
OnPatch(harmony);
Logger.LogInfo((object)(harmony.Id + " is applied"));
}
private void Unpatch()
{
harmony.UnpatchSelf();
OnUnpatch();
Logger.LogInfo((object)(harmony.Id + " is unapplied"));
}
}
internal class Nameplate : MonoBehaviour
{
[CompilerGenerated]
private sealed class <Start>d__3 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Nameplate <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <Start>d__3(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Expected O, but got Unknown
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Expected O, but got Unknown
//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0203: Unknown result type (might be due to invalid IL or missing references)
//IL_0205: Unknown result type (might be due to invalid IL or missing references)
//IL_020f: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
int num = <>1__state;
Nameplate nameplate = <>4__this;
switch (num)
{
default:
return false;
case 0:
{
<>1__state = -1;
nameplate.textMeshPro = ((Component)nameplate).gameObject.AddComponent<TextMeshPro>();
((TMP_Text)nameplate.textMeshPro).font = ((IEnumerable<TMP_FontAsset>)Resources.FindObjectsOfTypeAll<TMP_FontAsset>()).FirstOrDefault((Func<TMP_FontAsset, bool>)((TMP_FontAsset f) => ((Object)f).name == "Valheim-Norse"));
((TMP_Text)nameplate.textMeshPro).fontStyle = (FontStyles)1;
((TMP_Text)nameplate.textMeshPro).fontSize = 9f;
((Graphic)nameplate.textMeshPro).color = new Color(1f, 1f, 1f);
((TMP_Text)nameplate.textMeshPro).alignment = (TextAlignmentOptions)514;
((TMP_Text)nameplate.textMeshPro).enableAutoSizing = false;
Material val3 = new Material(((TMP_Asset)((TMP_Text)nameplate.textMeshPro).font).material);
val3.EnableKeyword("OUTLINE_ON");
val3.SetColor("_OutlineColor", new Color(0f, 0f, 0.3f, 1f));
val3.SetFloat("_OutlineWidth", 0.085f);
((TMP_Text)nameplate.textMeshPro).fontMaterial = val3;
<>2__current = (object)new WaitForSeconds(2f);
<>1__state = 1;
return true;
}
case 1:
{
<>1__state = -1;
Transform val;
if (nameplate.target is Ship)
{
Transform transform = ((Component)nameplate.target).transform;
object obj = ((transform != null) ? transform.Find("ship/visual/mast/pillar") : null);
if (obj == null)
{
Transform transform2 = ((Component)nameplate.target).transform;
obj = ((transform2 != null) ? transform2.Find("ship/visual/Mast/mast") : null);
if (obj == null)
{
Transform transform3 = ((Component)nameplate.target).transform;
obj = ((transform3 != null) ? transform3.Find("ship/mast") : null);
}
}
val = (Transform)obj;
}
else
{
val = null;
}
Transform val2 = val;
if ((Object)(object)val2 == (Object)null)
{
Logger.LogInfo((object)("Unable to find nameplate anchor for " + NameCache.GetLabelFromObject(nameplate.target) + ", falling back to transform"));
val2 = ((Component)nameplate.target).transform;
}
if ((Object)(object)val2 == (Object)null)
{
return false;
}
Vector3 topCenterPoint = PhysicsUtils.GetTopCenterPoint(val2);
nameplate.parentObject.transform.position = topCenterPoint + Vector3.up * 0.5f;
nameplate.parentObject.transform.SetParent(((Component)nameplate.target).transform, true);
return false;
}
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
internal MonoBehaviour target;
internal GameObject parentObject;
private TextMeshPro textMeshPro;
[IteratorStateMachine(typeof(<Start>d__3))]
private IEnumerator Start()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <Start>d__3(0)
{
<>4__this = this
};
}
private void LateUpdate()
{
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)Camera.main == (Object)null || (Object)(object)target == (Object)null || (Object)(object)textMeshPro == (Object)null)
{
return;
}
Player localPlayer = Player.m_localPlayer;
if ((Object)(object)localPlayer == (Object)null)
{
return;
}
MonoBehaviour obj = target;
Ship val = (Ship)(object)((obj is Ship) ? obj : null);
if (val != null)
{
bool num = (Object)(object)localPlayer.GetControlledShip() == (Object)(object)val || (Object)(object)((Character)localPlayer).GetStandingOnShip() == (Object)(object)val;
bool controllingPlayer_UWU = val.GetControllingPlayer_UWU();
bool flag = !num || !controllingPlayer_UWU;
((Behaviour)textMeshPro).enabled = flag;
if (!flag)
{
return;
}
}
Vector3 val2 = ((Component)this).transform.position - ((Component)Camera.main).transform.position;
val2.y = 0f;
if (((Vector3)(ref val2)).sqrMagnitude > 0.001f)
{
((Component)this).transform.rotation = Quaternion.LookRotation(val2);
}
string labelFromObject = NameCache.GetLabelFromObject(target);
((TMP_Text)textMeshPro).text = (string.IsNullOrWhiteSpace(labelFromObject) ? "" : labelFromObject.Trim());
}
internal static void RemoveNameplates(MonoBehaviour target)
{
Nameplate component = ((Component)target).gameObject.GetComponent<Nameplate>();
if ((Object)(object)component != (Object)null)
{
Object.Destroy((Object)(object)component);
}
}
internal static void DecorateIfNecessary(MonoBehaviour target)
{
if ((Object)(object)((Component)target).GetComponentInChildren<Nameplate>() == (Object)null)
{
Decorate(target);
}
}
internal static void Decorate(MonoBehaviour target)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Expected O, but got Unknown
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject();
val.transform.localScale = Vector3.one;
Nameplate nameplate = val.AddComponent<Nameplate>();
nameplate.target = target;
nameplate.parentObject = val;
}
}
}