using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using FeralCompany.Core;
using FeralCompany.Core.Locale;
using FeralCompany.Core.Setting;
using FeralCompany.Core.UI;
using FeralCompany.Modules;
using FeralCompany.Modules.Map;
using FeralCompany.Modules.Map.Pointers;
using FeralCompany.Modules.Map.Targets;
using FeralCompany.Modules.SettingsMenu.UI;
using FeralCompany.Utils;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCompanyInputUtils.Api;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json.Linq;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("FeralCompany")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.10.0")]
[assembly: AssemblyInformationalVersion("1.0.10+e801a48b85d983bedd2a9410350d52a5a053c230")]
[assembly: AssemblyProduct("FeralCompany")]
[assembly: AssemblyTitle("FeralCompany")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace FeralCompany
{
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("FeralCompany", "FeralCompany", "1.0.0")]
public class Feral : BaseUnityPlugin
{
[HarmonyPatch(typeof(PlayerControllerB))]
private static class AwaitGameStart
{
[HarmonyPostfix]
[HarmonyPatch("ConnectClientToPlayerObject")]
private static void Postfix_ConnectClientToPlayerObject(PlayerControllerB __instance)
{
if ((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)(object)__instance)
{
_instance.TriggerGame(GameNetworkManager.Instance.localPlayerController);
}
}
}
private static Feral _instance;
private Harmony _harmony;
private GameObject _binder;
internal static FeralSettings Settings { get; private set; }
internal static FeralOutput IO { get; private set; }
internal static FeralAssets Assets { get; private set; }
internal static FeralLocales Locales { get; private set; }
internal static FeralEvents Events { get; private set; }
internal static FeralBindings Bindings { get; private set; }
internal static HUDManager HUD => HUDManager.Instance;
internal static StartOfRound StartOfRound => StartOfRound.Instance;
internal static PlayerControllerB Player { get; private set; }
internal static CurrentRoundData CurrentRound { get; private set; }
internal static GlobalData Globals { get; private set; }
internal static FeralMap Map { get; private set; }
internal static FeralNightVision NightVision { get; private set; }
private void Awake()
{
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Expected O, but got Unknown
_instance = this;
IO = new FeralOutput(((BaseUnityPlugin)this).Logger);
Settings = new FeralSettings(((BaseUnityPlugin)this).Config);
Assets = new FeralAssets();
if (Assets.Load())
{
Locales = new FeralLocales();
if (Locales.Init())
{
Events = new FeralEvents();
Bindings = new FeralBindings();
Bindings.Disable();
_harmony = new Harmony("FeralCompany");
_harmony.PatchAll(typeof(AwaitGameStart));
Events.OnExitGame += Unload;
}
}
}
private void Unload()
{
_harmony.UnpatchSelf();
Object.Destroy((Object)(object)_binder);
Bindings.Disable();
_harmony.PatchAll(typeof(AwaitGameStart));
}
private void TriggerGame(PlayerControllerB player)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Expected O, but got Unknown
Bindings.Enable();
Player = player;
_binder = new GameObject("FeralGame");
CurrentRound = _binder.AddComponent<CurrentRoundData>();
Globals = _binder.AddComponent<GlobalData>();
Map = _binder.AddComponent<FeralMap>();
NightVision = _binder.AddComponent<FeralNightVision>();
_harmony.PatchAll();
}
private void OnDestroy()
{
if (Object.op_Implicit((Object)(object)_binder))
{
Object.Destroy((Object)(object)_binder);
}
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "FeralCompany";
public const string PLUGIN_NAME = "FeralCompany";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace FeralCompany.Utils
{
public class Cache<T>
{
[CompilerGenerated]
private Func<T> <supplier>P;
private T? _value;
internal T Value => GetOrLoad();
internal bool IsLoaded { get; private set; }
public Cache(Func<T> supplier)
{
<supplier>P = supplier;
base..ctor();
}
internal bool GetIfLoaded(out T? value)
{
if (IsLoaded)
{
value = _value;
return true;
}
value = default(T);
return false;
}
private T GetOrLoad()
{
if (IsLoaded)
{
return _value;
}
_value = <supplier>P();
IsLoaded = true;
return _value;
}
public static implicit operator T(Cache<T> cache)
{
return cache.Value;
}
}
public static class FieldSearcher
{
private const BindingFlags StaticAttributeFilter = BindingFlags.Static | BindingFlags.Public;
public static List<T> Search<T>(Type from)
{
List<T> fields = new List<T>();
SearchInternal(from, BindingFlags.Static | BindingFlags.Public, ref fields);
Type[] nestedTypes = from.GetNestedTypes(BindingFlags.Static | BindingFlags.Public);
for (int i = 0; i < nestedTypes.Length; i++)
{
SearchInternal(nestedTypes[i], BindingFlags.Static | BindingFlags.Public, ref fields);
}
return fields;
}
private static void SearchInternal<T>(IReflect from, BindingFlags filter, ref List<T> fields)
{
FieldInfo[] fields2 = from.GetFields(filter);
for (int i = 0; i < fields2.Length; i++)
{
if (fields2[i].GetValue(null) is T item)
{
fields.Add(item);
}
}
}
}
internal static class Files
{
private static readonly string RootPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
public static readonly string LocalePath = Path.Combine(RootPath, "Locales");
}
public static class Mask
{
internal const int Default = 1;
internal const int TransparentFX = 2;
internal const int IgnoreRaycast = 4;
internal const int Player = 8;
internal const int Water = 16;
internal const int UI = 32;
internal const int Props = 64;
internal const int HelmetVisor = 128;
internal const int Room = 256;
internal const int InteractableObject = 512;
internal const int Foliage = 1024;
internal const int Colliders = 2048;
internal const int PhysicsObject = 4096;
internal const int Triggers = 8192;
internal const int MapRadar = 16384;
internal const int NavigationSurface = 32768;
internal const int RoomLight = 65536;
internal const int Anomaly = 131072;
internal const int LineOfSight = 262144;
internal const int Enemies = 524288;
internal const int PlayerRagdoll = 1048576;
internal const int MapHazards = 2097152;
internal const int ScanNode = 4194304;
internal const int EnemiesNotRendered = 8388608;
internal const int MiscLevelGeometry = 16777216;
internal const int Terrain = 33554432;
internal const int PlaceableShipObjects = 67108864;
internal const int PlacementBlocker = 134217728;
internal const int Railing = 268435456;
internal const int DecalStickableSurface = 536870912;
internal const int Unused1 = 1073741824;
internal const int Unused2 = int.MinValue;
internal static readonly Dictionary<string, int> NameToMask = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
{
{ "Default", 1 },
{ "TransparentFX", 2 },
{ "IgnoreRaycast", 4 },
{ "Player", 8 },
{ "Water", 16 },
{ "UI", 32 },
{ "Props", 64 },
{ "HelmetVisor", 128 },
{ "Room", 256 },
{ "InteractableObject", 512 },
{ "Foliage", 1024 },
{ "Colliders", 2048 },
{ "PhysicsObject", 4096 },
{ "Triggers", 8192 },
{ "MapRadar", 16384 },
{ "NavigationSurface", 32768 },
{ "RoomLight", 65536 },
{ "Anomaly", 131072 },
{ "LineOfSight", 262144 },
{ "Enemies", 524288 },
{ "PlayerRagdoll", 1048576 },
{ "MapHazards", 2097152 },
{ "ScanNode", 4194304 },
{ "EnemiesNotRendered", 8388608 },
{ "MiscLevelGeometry", 16777216 },
{ "Terrain", 33554432 },
{ "PlaceableShipObjects", 67108864 },
{ "PlacementBlocker", 134217728 },
{ "Railing", 268435456 },
{ "DecalStickableSurface", 536870912 },
{ "Unused1", 1073741824 },
{
"Unused2",
int.MinValue
}
};
internal static string[] Names => NameToMask.Keys.ToArray();
internal static int AddMask(this int mask, int other)
{
return mask | other;
}
internal static int AddMask(this int mask, params int[] others)
{
return others.Aggregate(mask, AddMask);
}
internal static int SubtractMask(this int mask, int other)
{
return mask & ~other;
}
internal static int SubtractMask(int mask, params int[] others)
{
return others.Aggregate(mask, SubtractMask);
}
internal static bool Contains(int mask, int other)
{
return (mask & other) == other;
}
internal static bool ContainsAny(int mask, params int[] others)
{
return others.Any((int other) => Contains(mask, other));
}
internal static bool ContainsAll(int mask, params int[] others)
{
return others.All((int other) => Contains(mask, other));
}
internal static int Named(string input)
{
if (string.IsNullOrWhiteSpace(input))
{
throw new ArgumentException("Mask name cannot be blank.", "input");
}
if (NameToMask.TryGetValue(input, out var value))
{
return value;
}
throw new ArgumentException("Unknown or invalid mask name: " + input, "input");
}
internal static string[] Decompress(int mask)
{
List<string> list = new List<string>();
list.AddRange(NameToMask.Where<KeyValuePair<string, int>>(delegate(KeyValuePair<string, int> pair)
{
int mask2 = mask;
KeyValuePair<string, int> keyValuePair2 = pair;
return Contains(mask2, keyValuePair2.Value);
}).Select(delegate(KeyValuePair<string, int> pair)
{
KeyValuePair<string, int> keyValuePair = pair;
return keyValuePair.Key;
}));
return list.ToArray();
}
}
internal static class Reflection
{
internal static void Invoke<T>(T instance, string methodName, params object[] parameters)
{
typeof(T).GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).Invoke(instance, parameters);
}
internal static R Invoke<T, R>(T instance, string methodName, params object[] parameters)
{
object obj = typeof(T).GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).Invoke(instance, parameters);
if (obj is R)
{
return (R)obj;
}
throw new ArgumentOutOfRangeException();
}
}
}
namespace FeralCompany.Patches
{
[HarmonyPatch(typeof(GameNetworkManager))]
internal static class GameNetworkManagerPatch
{
private static bool _subscribed;
[HarmonyPostfix]
[HarmonyPatch("SubscribeToConnectionCallbacks")]
private static void PostFix_SubscribeToConnectionCallbacks()
{
if (_subscribed)
{
NetworkManager.Singleton.OnClientConnectedCallback += Feral.Events.InvokeClientConnect;
NetworkManager.Singleton.OnClientDisconnectCallback += Feral.Events.InvokeClientDisconnect;
_subscribed = true;
}
}
}
[HarmonyPatch(typeof(QuickMenuManager))]
public static class QuickMenuManagerPatch
{
[HarmonyPostfix]
[HarmonyPatch("LeaveGameConfirm")]
private static void PostFix_LeaveGameConfirm()
{
Feral.Events.InvokeExitGame();
}
}
[HarmonyPatch(typeof(RadarBoosterItem))]
internal static class RadarBoosterItemPatch
{
[HarmonyPostfix]
[HarmonyPatch("AddBoosterToRadar")]
private static void Postfix_AddBoosterToRadar(RadarBoosterItem __instance)
{
Feral.Events.InvokeAddRadarBooster(__instance);
}
[HarmonyPostfix]
[HarmonyPatch("RemoveBoosterFromRadar")]
private static void Postfix_RemoveBoosterFromRadar(RadarBoosterItem __instance)
{
Feral.Events.InvokeRemoveRadarBooster(__instance);
}
}
[HarmonyPatch(typeof(RoundManager))]
public static class RoundManagerPatch
{
[HarmonyPostfix]
[HarmonyPatch("RefreshEnemiesList")]
private static void PostFix_RefreshEnemiesList()
{
Feral.Events.InvokeEnterMoon();
}
}
[HarmonyPatch(typeof(StartOfRound))]
public static class StartOfRoundPatch
{
[HarmonyPostfix]
[HarmonyPatch("EndOfGame")]
private static void PostFix_EndOfGame()
{
Feral.Events.InvokeExitMoon();
}
}
}
namespace FeralCompany.Modules
{
public sealed class CurrentRoundData : MonoBehaviour
{
private readonly List<MapPointer> _pointers = new List<MapPointer>();
internal IReadOnlyList<MapPointer> Pointers => _pointers;
private void OnExitMoon()
{
foreach (MapPointer pointer in _pointers)
{
Object.Destroy((Object)(object)pointer.PointerObject);
}
_pointers.Clear();
}
private void OnEnterMoon()
{
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
GameObject val = GameObject.Find("CatwalkShip") ?? throw new NullReferenceException("CatwalkShip not available??");
CreatePointer(-1, val.transform.position, entrance: false);
EntranceTeleport[] array = Object.FindObjectsOfType<EntranceTeleport>();
foreach (EntranceTeleport val2 in array)
{
CreatePointer(val2.entranceId, val2.entrancePoint.position, val2.isEntranceToBuilding);
}
Feral.Events.InvokePointersCreated(_pointers.ToArray());
}
private void Awake()
{
Feral.Events.OnEnterMoon += OnEnterMoon;
Feral.Events.OnExitMoon += OnExitMoon;
}
private void OnDestroy()
{
Feral.Events.OnEnterMoon -= OnEnterMoon;
Feral.Events.OnExitMoon -= OnExitMoon;
}
private void CreatePointer(int entranceId, Vector3 destination, bool entrance)
{
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
GameObject val = Object.Instantiate<GameObject>(Feral.Assets.PrefabMapPointer);
((Object)val).name = string.Format("Pointer_{0}_{1}", entranceId, entrance ? "Entrance" : "Exit");
PointerController pointerController = val.AddComponent<PointerController>();
MapPointer mapPointer = entranceId switch
{
-1 => new ShipPointer(val, pointerController, destination, entranceId, entrance),
0 => new MainEntrancePointer(val, pointerController, destination, entranceId, entrance),
_ => new FireExitPointer(val, pointerController, destination, entranceId, entrance),
};
pointerController.Icon = mapPointer.GetIcon();
_pointers.Add(mapPointer);
}
}
public class FeralNightVision : MonoBehaviour
{
private Light _nearLight;
private Light _farLight;
private void Awake()
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
Transform transform = GameObject.Find("MapCamera").transform;
((Component)this).transform.SetParent(((Component)Feral.Player.gameplayCamera).transform);
_nearLight = new GameObject("NearLight").AddComponent<Light>();
((Component)_nearLight).transform.SetParent(((Component)this).transform);
((Component)_nearLight).transform.position = transform.position + Vector3.down * 80f;
_nearLight.range = 70f;
_nearLight.color = new Color(0.875f, 0.788f, 0.791f, 1f);
_farLight = new GameObject("FarLight").AddComponent<Light>();
((Component)_farLight).transform.SetParent(((Component)this).transform);
((Component)_farLight).transform.position = transform.position + Vector3.down * 30f;
_farLight.range = 500f;
}
private void Update()
{
if (Feral.Player.isInsideFactory)
{
_nearLight.intensity = (float)Feral.Settings.General.InternalNightVisionIntensity.Value * 100f;
_farLight.intensity = (float)Feral.Settings.General.InternalNightVisionIntensity.Value * 1100f;
}
else
{
_nearLight.intensity = (float)Feral.Settings.General.ExternalNightVisionIntensity.Value * 100f;
_farLight.intensity = (float)Feral.Settings.General.ExternalNightVisionIntensity.Value * 1100f;
}
}
private void Start()
{
RenderPipelineManager.beginCameraRendering += BeginCameraRendering;
RenderPipelineManager.endCameraRendering += EndCameraRendering;
}
private void OnDestroy()
{
RenderPipelineManager.beginCameraRendering -= BeginCameraRendering;
RenderPipelineManager.endCameraRendering -= EndCameraRendering;
}
private void BeginCameraRendering(ScriptableRenderContext _, Camera camera)
{
if (!((Object)(object)Feral.Player.gameplayCamera != (Object)(object)camera))
{
((Behaviour)_farLight).enabled = true;
((Behaviour)_nearLight).enabled = true;
}
}
private void EndCameraRendering(ScriptableRenderContext _, Camera camera)
{
((Behaviour)_farLight).enabled = false;
((Behaviour)_nearLight).enabled = false;
}
}
public sealed class GlobalData : MonoBehaviour
{
private readonly List<MapTarget> _mapTargets = new List<MapTarget>();
internal IReadOnlyList<MapTarget> MapTargets => _mapTargets;
private void Awake()
{
PlayerControllerB[] array = Resources.FindObjectsOfTypeAll<PlayerControllerB>();
PlayerTarget playerTarget = default(PlayerTarget);
foreach (PlayerControllerB val in array)
{
if (((Component)val).gameObject.TryGetComponent<PlayerTarget>(ref playerTarget))
{
if (!MapTargets.Contains(playerTarget))
{
CollectionExtensions.AddItem<MapTarget>((IEnumerable<MapTarget>)MapTargets, (MapTarget)playerTarget);
}
}
else
{
playerTarget = new PlayerTarget(val);
_mapTargets.Add(playerTarget);
}
}
Feral.Events.OnAddRadarBooster += AddRadarBooster;
Feral.Events.OnRemoveRadarBooster += RemoveRadarBooster;
}
private void OnDestroy()
{
Feral.Events.OnAddRadarBooster -= AddRadarBooster;
Feral.Events.OnRemoveRadarBooster -= RemoveRadarBooster;
}
private void AddRadarBooster(RadarBoosterItem item)
{
RadarTarget item2 = default(RadarTarget);
if (!((Component)item).gameObject.TryGetComponent<RadarTarget>(ref item2))
{
item2 = new RadarTarget(item);
}
if (!_mapTargets.Contains(item2))
{
_mapTargets.Add(item2);
_mapTargets.Sort();
}
}
private void RemoveRadarBooster(RadarBoosterItem item)
{
RadarTarget item2 = default(RadarTarget);
if (((Component)item).gameObject.TryGetComponent<RadarTarget>(ref item2))
{
_mapTargets.Remove(item2);
_mapTargets.Sort();
}
}
}
}
namespace FeralCompany.Modules.SettingsMenu
{
public class SettingsMenu : MonoBehaviour
{
internal SettingsMenuUI SettingsUI;
internal static SettingsMenu Create()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
return new GameObject("FeralSettingsMenu").AddComponent<SettingsMenu>();
}
private void Awake()
{
SettingsUI.Init();
}
}
}
namespace FeralCompany.Modules.SettingsMenu.UI
{
public class SettingsMenuUI : FeralUI
{
private TMP_Text _titleLabel;
private GameObject _tabList;
private GameObject _contentList;
protected override void AfterAwake()
{
_titleLabel = ((Component)base.Window.Find("Settings/Title/Text")).GetComponent<TMP_Text>();
_tabList = ((Component)base.Window.Find("Tabs")).gameObject;
_contentList = ((Component)base.Window.Find("Settings/Content")).gameObject;
}
protected override void OnInit()
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Expected O, but got Unknown
((UnityEvent)((Component)base.Window.Find("Settings/Title/Exit")).GetComponent<Button>().onClick).AddListener(new UnityAction(base.Close));
}
}
}
namespace FeralCompany.Modules.Map
{
public sealed class FeralMap : MonoBehaviour
{
private Light _light;
private MapUI _ui;
private int _targetIndex;
private const float NorthAtan2 = 1.570796f;
private static int TargetCount => Feral.Globals.MapTargets.Count;
internal MapTarget Target => Feral.Globals.MapTargets[_targetIndex];
internal Camera Camera { get; private set; }
private void Awake()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Expected O, but got Unknown
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject("Feral_MapCamera");
val.transform.SetParent(((Component)this).transform);
Camera = val.AddComponent<Camera>();
((Behaviour)Camera).enabled = false;
Camera.orthographic = true;
Camera.orthographicSize = Feral.Settings.Map.Zoom;
HDAdditionalCameraData obj = val.AddComponent<HDAdditionalCameraData>();
obj.customRenderingSettings = true;
((FrameSettings)(ref obj.renderingPathCustomFrameSettings)).SetEnabled((FrameSettingsField)28, false);
((BitArray128)(ref obj.renderingPathCustomFrameSettingsOverrideMask.mask))[28u] = true;
_light = new GameObject("Feral_MapLight").AddComponent<Light>();
((Component)_light).transform.SetParent(((Component)this).transform);
_light.range = 100f;
_light.type = (LightType)1;
_light.color = Color.white;
_light.colorTemperature = 6500f;
_light.useColorTemperature = true;
_ui = Object.Instantiate<GameObject>(Feral.Assets.PrefabFeralMap, ((Component)this).transform).AddComponent<MapUI>();
UpdateCullingMask(Feral.Settings.Map.CullingMask);
_ui.Init();
_ui.OpenEvent += OnOpenMap;
_ui.CloseEvent += OnCloseMap;
IngamePlayerSettings.Instance.playerInput.actions.FindAction("SwitchItem", false).performed += OnMouseScroll;
}
private void Start()
{
Feral.Bindings.ToggleMap.performed += delegate
{
Feral.Settings.Map.Enable.Value = !Feral.Settings.Map.Enable.Value;
if ((bool)Feral.Settings.Map.Enable)
{
_ui.Open();
}
else
{
_ui.Close();
}
};
Feral.Bindings.CycleMapTarget.performed += delegate
{
NextTarget();
};
RenderPipelineManager.beginCameraRendering += BeginCameraRendering;
RenderPipelineManager.endCameraRendering += EndCameraRendering;
Feral.Settings.Map.CullingMask.ChangeEvent += UpdateCullingMask;
Feral.Settings.Map.Zoom.ChangeEvent += UpdateZoom;
}
private static void OnMouseScroll(CallbackContext context)
{
if (Feral.Bindings.Shift.IsPressed() && Feral.Bindings.Alt.IsPressed())
{
float num = ((CallbackContext)(ref context)).ReadValue<float>();
float value = Feral.Settings.Map.Scale.Value;
float num2 = value / 100f;
float value2 = Mathf.Clamp(value - num * num2, 1f, 5f);
Feral.Settings.Map.Scale.Value = value2;
}
else if (Feral.Bindings.Alt.IsPressed())
{
float num3 = ((CallbackContext)(ref context)).ReadValue<float>();
float value3 = Feral.Settings.Map.Zoom.Value;
float num4 = value3 / 100f * 8f;
float value4 = Mathf.Clamp(value3 - num3 * num4, 1f, 100f);
Feral.Settings.Map.Zoom.Value = value4;
}
}
private void OnOpenMap()
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
Camera.rect = _ui.CameraRect;
((Behaviour)Camera).enabled = true;
}
private void OnCloseMap()
{
((Behaviour)Camera).enabled = false;
}
private void Update()
{
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: 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_00d8: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: 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)
ValidateTarget();
foreach (MapPointer pointer in Feral.CurrentRound.Pointers)
{
pointer.UpdateFor(Target);
}
_light.intensity = (Target.IsInFacility ? Feral.Settings.Map.InternalLight : Feral.Settings.Map.ExternalLight);
((Component)_light).transform.position = Target.Position + Vector3.up * 30f;
((Component)_light).transform.rotation = Quaternion.Euler(90f, 0f, 0f);
float num = 1.570796f - Mathf.Atan2(Target.Forward.x, Target.Forward.z);
num *= 57.29578f;
num = (num + 360f) % 360f;
_ui.CompassRotation = Quaternion.Euler(0f, 0f, 0f - num);
}
private void LateUpdate()
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
MapTarget target = Target;
_ui.TargetName = Target.Name;
((Component)Camera).transform.position = target.CameraPosition;
((Component)Camera).transform.eulerAngles = target.CameraRotation;
Camera.nearClipPlane = target.NearClipPlane;
}
private void OnDestroy()
{
RenderPipelineManager.beginCameraRendering -= BeginCameraRendering;
RenderPipelineManager.endCameraRendering -= EndCameraRendering;
Feral.Settings.Map.CullingMask.ChangeEvent -= UpdateCullingMask;
Feral.Settings.Map.Zoom.ChangeEvent -= UpdateZoom;
IngamePlayerSettings.Instance.playerInput.actions.FindAction("SwitchItem", false).performed -= OnMouseScroll;
}
private void BeginCameraRendering(ScriptableRenderContext _, Camera camera)
{
((Behaviour)_light).enabled = (Object)(object)Camera == (Object)(object)camera;
}
private void EndCameraRendering(ScriptableRenderContext _, Camera camera)
{
((Behaviour)_light).enabled = false;
}
private void UpdateCullingMask(int mask)
{
Camera.cullingMask = mask;
}
private void UpdateZoom(float zoom)
{
Camera.orthographicSize = zoom;
}
private void NextTarget()
{
_targetIndex++;
if (_targetIndex < 0 || _targetIndex >= TargetCount)
{
_targetIndex = 0;
}
}
private void ValidateTarget()
{
if (TargetCount == 0)
{
return;
}
if (_targetIndex < 0)
{
_targetIndex = 0;
}
if (_targetIndex >= TargetCount)
{
_targetIndex = TargetCount - 1;
}
int targetIndex = _targetIndex;
while (!Target.ValidateTarget())
{
_targetIndex++;
if (_targetIndex >= TargetCount)
{
_targetIndex = 0;
}
if (_targetIndex == targetIndex)
{
break;
}
}
}
}
public sealed class MapUI : FeralUI
{
private TMP_Text _targetNameText;
private RectTransform _compassTransform;
private Transform _pointers;
private List<MapPointer>? _currentPointers;
internal string TargetName
{
get
{
return _targetNameText.text;
}
set
{
_targetNameText.text = value;
}
}
internal Quaternion CompassRotation
{
get
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
return ((Component)_compassTransform).transform.rotation;
}
set
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
((Component)_compassTransform).transform.rotation = value;
}
}
internal Rect CameraRect { get; private set; }
protected override void AfterAwake()
{
_targetNameText = ((Component)base.Window.Find("Panel/Target")).GetComponent<TMP_Text>();
_compassTransform = ((Component)base.Window.Find("Compass")).GetComponent<RectTransform>();
_pointers = base.Window.Find("Pointers");
}
protected override void OnInit()
{
Feral.Events.OnPointersCreated += OnPointersCreated;
Feral.Settings.Map.Scale.ChangeEvent += base.UpdateScale;
UIScale = Feral.Settings.Map.Scale;
}
protected override void OnBaseDestroy()
{
Feral.Events.OnPointersCreated -= OnPointersCreated;
Feral.Settings.Map.Scale.ChangeEvent -= base.UpdateScale;
}
private void OnPointersCreated(IReadOnlyList<MapPointer> pointers)
{
foreach (MapPointer pointer in pointers)
{
pointer.PointerObject.transform.SetParent(_pointers, false);
}
_currentPointers = new List<MapPointer>(pointers);
_currentPointers.Sort();
((Component)_pointers).gameObject.SetActive(false);
for (int i = 0; i < _currentPointers.Count; i++)
{
_currentPointers[i].PointerObject.transform.SetSiblingIndex(i);
}
((Component)_pointers).gameObject.SetActive(Object.op_Implicit((Object)(object)((Component)this).transform));
}
protected override void HandleScaleUpdate(float width, float height)
{
//IL_0006: 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_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
Vector3 position = ((Transform)base.WindowRect).position;
CameraRect = new Rect((position.x - width) / (float)Screen.width, (position.y - height) / (float)Screen.height, width / (float)Screen.width, height / (float)Screen.height);
if (base.IsOpen)
{
Feral.Map.Camera.rect = CameraRect;
}
}
protected override bool CanOpen()
{
return Feral.Settings.Map.Enable;
}
}
}
namespace FeralCompany.Modules.Map.Targets
{
public abstract class MapTarget : IComparable<MapTarget>
{
private const float DefaultNearClipPlane = -2.47f;
private const float HangarNearClipPlane = -0.96f;
private const float CameraHoverY = 3.636f;
private static int _incrementer;
private readonly int _targetId = _incrementer++;
protected internal string Name { get; protected set; } = "Unnamed";
protected internal bool IsDead { get; protected set; }
protected internal bool IsInElevator { get; protected set; }
protected internal bool IsInShip { get; protected set; }
protected internal bool IsInFacility { get; protected set; }
protected internal bool IsOutsideShip => !IsInShip;
protected internal bool IsOutside
{
get
{
if (!IsInShip)
{
return !IsInElevator;
}
return false;
}
}
protected internal bool IsOutsideFacility => !IsInFacility;
protected internal Vector3 Position { get; protected set; }
protected internal Vector3 Forward { get; protected set; }
protected internal Quaternion Quaternion { get; protected set; }
protected internal Vector3 Rotation
{
get
{
//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_0009: Unknown result type (might be due to invalid IL or missing references)
Quaternion quaternion = Quaternion;
return ((Quaternion)(ref quaternion)).eulerAngles;
}
set
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
Quaternion = Quaternion.Euler(value);
}
}
internal float NearClipPlane
{
get
{
if (!IsInShip)
{
return -2.47f;
}
return -0.96f;
}
}
internal Vector3 CameraPosition => Position + Vector3.up * 3.636f;
protected internal Vector3 CameraRotation { get; protected set; }
internal abstract bool ValidateTarget();
public int CompareTo(MapTarget? other)
{
if (other == null)
{
return -1;
}
return _targetId.CompareTo(other._targetId);
}
}
public sealed class PlayerTarget : MapTarget
{
[CompilerGenerated]
private PlayerControllerB <player>P;
public PlayerTarget(PlayerControllerB player)
{
<player>P = player;
base..ctor();
}
internal override bool ValidateTarget()
{
//IL_00a6: 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_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
if (Object.op_Implicit((Object)(object)<player>P))
{
PlayerControllerB val = <player>P;
if (val == null || val.isPlayerControlled || val.isPlayerDead)
{
base.Name = <player>P.playerUsername;
base.IsDead = <player>P.isPlayerDead;
base.IsInElevator = <player>P.isInElevator;
base.IsInShip = <player>P.isInHangarShipRoom;
base.IsInFacility = <player>P.isInsideFactory;
Transform val2 = (base.IsDead ? ((Component)<player>P.deadBody).transform : ((Component)<player>P).transform);
base.Position = val2.position;
base.Forward = val2.forward;
base.Quaternion = val2.rotation;
base.CameraRotation = (base.IsDead ? new Vector3(90f, 90f, 0f) : new Vector3(90f, base.Rotation.y, 0f));
return true;
}
}
return false;
}
}
public sealed class RadarTarget : MapTarget
{
[CompilerGenerated]
private RadarBoosterItem <radar>P;
private const string NoRadarName = "NoRadarName";
public RadarTarget(RadarBoosterItem radar)
{
<radar>P = radar;
base..ctor();
}
internal override bool ValidateTarget()
{
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
if (!<radar>P.radarEnabled)
{
return false;
}
base.Name = (string.IsNullOrWhiteSpace(<radar>P.radarBoosterName) ? "NoRadarName" : <radar>P.radarBoosterName);
base.IsInElevator = ((GrabbableObject)<radar>P).isInElevator;
base.IsInShip = ((GrabbableObject)<radar>P).isInShipRoom;
base.Position = ((Component)<radar>P).transform.position;
base.Rotation = new Vector3(90f, 90f, 0f);
base.IsInFacility = ((GrabbableObject)<radar>P).isInFactory;
base.CameraRotation = base.Rotation;
return true;
}
}
}
namespace FeralCompany.Modules.Map.Pointers
{
public sealed class FireExitPointer : MapPointer
{
public FireExitPointer(GameObject pointerObject, PointerController controller, Vector3 destination, int entranceId, bool entrance)
: base(pointerObject, controller, destination, entranceId, entrance)
{
}//IL_0003: Unknown result type (might be due to invalid IL or missing references)
protected internal override Sprite GetIcon()
{
return Feral.Assets.SpriteExtinguisher;
}
protected override bool VisibleFor(MapTarget target)
{
if (base.IsEntrance)
{
if (target != null && target.IsOutsideFacility && target.IsOutsideShip)
{
return (target is RadarTarget) ? Feral.Settings.Map.PointerExternalFireRadar : Feral.Settings.Map.PointerExternalFire;
}
}
else if (target.IsInFacility)
{
return (target is RadarTarget) ? Feral.Settings.Map.PointerInternalFireRadar : Feral.Settings.Map.PointerInternalFire;
}
return false;
}
}
public sealed class MainEntrancePointer : MapPointer
{
public MainEntrancePointer(GameObject pointerObject, PointerController controller, Vector3 destination, int entranceId, bool entrance)
: base(pointerObject, controller, destination, entranceId, entrance)
{
}//IL_0003: Unknown result type (might be due to invalid IL or missing references)
protected internal override Sprite GetIcon()
{
return Feral.Assets.SpriteEntrance;
}
protected override bool VisibleFor(MapTarget target)
{
if (base.IsEntrance)
{
if (target != null && target.IsOutsideFacility && target.IsOutsideShip)
{
return (target is RadarTarget) ? Feral.Settings.Map.PointerExternalEntranceRadar : Feral.Settings.Map.PointerExternalEntrance;
}
}
else if (target.IsInFacility)
{
return (target is RadarTarget) ? Feral.Settings.Map.PointerInternalEntranceRadar : Feral.Settings.Map.PointerInternalEntrance;
}
return false;
}
}
public abstract class MapPointer : IComparable<MapPointer>
{
[CompilerGenerated]
private Vector3 <destination>P;
private readonly int _entranceId;
private float _lastDistance;
internal GameObject PointerObject { get; }
internal PointerController Controller { get; }
protected bool IsEntrance { get; }
protected MapPointer(GameObject pointerObject, PointerController controller, Vector3 destination, int entranceId, bool entrance)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
<destination>P = destination;
PointerObject = pointerObject;
Controller = controller;
IsEntrance = entrance;
_entranceId = entranceId;
base..ctor();
}
internal void UpdateFor(MapTarget target)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: 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)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: 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_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: 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)
_lastDistance = Vector3.Distance(target.Position, <destination>P);
Controller.Distance = _lastDistance;
Vector3 val = <destination>P - target.Position;
Vector3 normalized = ((Vector3)(ref val)).normalized;
float num = Mathf.Atan2(normalized.x, normalized.z) - Mathf.Atan2(target.Forward.x, target.Forward.z);
num *= 57.29578f;
num = (num + 360f) % 360f;
Controller.Pointer = 0f - num;
bool active = VisibleFor(target);
PointerObject.SetActive(active);
}
protected internal abstract Sprite GetIcon();
protected abstract bool VisibleFor(MapTarget target);
public int CompareTo(MapPointer? other)
{
if (other == null)
{
return -1;
}
if (this is ShipPointer || other is ShipPointer)
{
if (!(this is ShipPointer))
{
return 1;
}
return -1;
}
if (this is MainEntrancePointer && other is MainEntrancePointer)
{
if (!IsEntrance)
{
return 1;
}
return -1;
}
if (this is MainEntrancePointer || other is MainEntrancePointer)
{
if (!(this is MainEntrancePointer))
{
return 1;
}
return -1;
}
return _entranceId.CompareTo(other._entranceId);
}
}
public sealed class PointerController : MonoBehaviour
{
private TMP_Text _distance;
private RectTransform _pointer;
private Image _icon;
internal bool Active
{
get
{
return ((Component)((Component)this).transform).gameObject.activeSelf;
}
set
{
((Component)((Component)this).transform).gameObject.SetActive(value);
}
}
internal float Distance
{
get
{
return int.Parse(_distance.text);
}
set
{
_distance.text = $"{Mathf.RoundToInt(value)}";
}
}
internal float Pointer
{
get
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: 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)
Quaternion rotation = ((Component)_pointer).transform.rotation;
return ((Quaternion)(ref rotation)).eulerAngles.z;
}
set
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
((Component)_pointer).transform.rotation = Quaternion.Euler(0f, 0f, value);
}
}
internal Sprite Icon
{
get
{
return _icon.sprite;
}
set
{
_icon.sprite = value;
}
}
private void Awake()
{
_distance = ((Component)((Component)this).transform.Find("Distance")).GetComponent<TMP_Text>();
_pointer = ((Component)((Component)this).transform.Find("Pointer")).GetComponent<RectTransform>();
_icon = ((Component)((Component)this).transform.Find("Icon")).GetComponent<Image>();
}
}
public sealed class ShipPointer : MapPointer
{
public ShipPointer(GameObject pointerObject, PointerController controller, Vector3 destination, int entranceId, bool entrance)
: base(pointerObject, controller, destination, entranceId, entrance)
{
}//IL_0003: Unknown result type (might be due to invalid IL or missing references)
protected internal override Sprite GetIcon()
{
return Feral.Assets.SpriteHome;
}
protected override bool VisibleFor(MapTarget target)
{
if (target != null && target.IsOutsideFacility && target.IsOutside)
{
return (target is RadarTarget) ? Feral.Settings.Map.PointerShipRadar : Feral.Settings.Map.PointerShip;
}
return false;
}
}
}
namespace FeralCompany.Core
{
public class FeralAssets
{
private const string AssetBundleName = "feralcompany_assets";
internal GameObject PrefabFeralMap;
internal GameObject PrefabMapPointer;
internal Sprite SpriteHome;
internal Sprite SpriteExtinguisher;
internal Sprite SpriteEntrance;
private static string AssetPath => Path.Combine(Path.GetDirectoryName(typeof(FeralAssets).Assembly.Location), "feralcompany_assets");
internal bool Load()
{
AssetBundle val = AssetBundle.LoadFromFile(AssetPath);
if (!Object.op_Implicit((Object)(object)val))
{
Feral.IO.Error("Failed to load assets @ " + AssetPath + "!", "D:\\projects\\lethalcompany\\FeralCompany\\FeralCompany\\Core\\FeralAssets.cs", "Load", 25);
Feral.IO.Error("FeralCompany will shut down, now.", "D:\\projects\\lethalcompany\\FeralCompany\\FeralCompany\\Core\\FeralAssets.cs", "Load", 26);
return false;
}
if (LoadAllAssets(val))
{
return true;
}
Feral.IO.Error("One or more assets failed to load.", "D:\\projects\\lethalcompany\\FeralCompany\\FeralCompany\\Core\\FeralAssets.cs", "Load", 33);
Feral.IO.Error("FeralCompany will shut down, now.", "D:\\projects\\lethalcompany\\FeralCompany\\FeralCompany\\Core\\FeralAssets.cs", "Load", 34);
return false;
}
private bool LoadAllAssets(AssetBundle assets)
{
if (LoadAsset<GameObject>(assets, "Assets/Prefabs/FeralMap.prefab", out PrefabFeralMap) && LoadAsset<GameObject>(assets, "Assets/Prefabs/MapComp/MapPointer.prefab", out PrefabMapPointer) && LoadAsset<Sprite>(assets, "Assets/Sprites/Home.png", out SpriteHome) && LoadAsset<Sprite>(assets, "Assets/Sprites/Entrance.png", out SpriteEntrance))
{
return LoadAsset<Sprite>(assets, "Assets/Sprites/Extinguisher.png", out SpriteExtinguisher);
}
return false;
}
private static bool LoadAsset<T>(AssetBundle assets, string path, out T asset) where T : Object
{
asset = assets.LoadAsset<T>(path);
if (Object.op_Implicit((Object)(object)asset))
{
return true;
}
Feral.IO.Error("Failed to load asset @ " + AssetPath + " => " + path, "D:\\projects\\lethalcompany\\FeralCompany\\FeralCompany\\Core\\FeralAssets.cs", "LoadAsset", 57);
return false;
}
}
public class FeralBindings : LcInputActions
{
private readonly InputActionMap _immutableMap;
[InputAction("<keyboard>/m", Name = "ToggleMap")]
internal InputAction ToggleMap { get; set; }
[InputAction("<keyboard>/period", Name = "Cycle Map Target")]
internal InputAction CycleMapTarget { get; set; }
internal InputAction Alt => _immutableMap["Alt"];
internal InputAction Shift => _immutableMap["Shift"];
internal FeralBindings()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
_immutableMap = new InputActionMap();
InputActionSetupExtensions.AddAction(_immutableMap, "Alt", (InputActionType)0, "<keyboard>/alt", (string)null, (string)null, (string)null, (string)null);
InputActionSetupExtensions.AddAction(_immutableMap, "Shift", (InputActionType)0, "<keyboard>/shift", (string)null, (string)null, (string)null, (string)null);
_immutableMap.Enable();
}
public void Enable()
{
((LcInputActions)this).Enable();
_immutableMap.Enable();
}
public void Disable()
{
((LcInputActions)this).Disable();
_immutableMap.Disable();
}
}
public class FeralEvents
{
internal int PlayerCount { get; private set; }
internal bool IsInGame { get; private set; }
internal bool IsOnMoon { get; private set; }
internal event Action? OnClientConnect;
internal event Action? OnClientDisconnect;
internal event Action? OnEnterMoon;
internal event Action? OnExitMoon;
internal event Action? OnExitGame;
internal event Action<RadarBoosterItem>? OnAddRadarBooster;
internal event Action<RadarBoosterItem>? OnRemoveRadarBooster;
internal event Action<MapPointer[]> OnPointersCreated;
internal void InvokeClientConnect(ulong _)
{
PlayerCount++;
this.OnClientConnect?.Invoke();
}
internal void InvokeClientDisconnect(ulong _)
{
PlayerCount--;
this.OnClientDisconnect?.Invoke();
}
internal void InvokeEnterMoon()
{
IsOnMoon = true;
this.OnEnterMoon?.Invoke();
}
internal void InvokeExitMoon()
{
IsOnMoon = false;
this.OnExitMoon?.Invoke();
}
internal void InvokeExitGame()
{
IsInGame = false;
this.OnExitGame?.Invoke();
}
internal void InvokeAddRadarBooster(RadarBoosterItem radar)
{
this.OnAddRadarBooster?.Invoke(radar);
}
internal void InvokeRemoveRadarBooster(RadarBoosterItem radar)
{
this.OnRemoveRadarBooster?.Invoke(radar);
}
internal void InvokePointersCreated(MapPointer[] pointers)
{
this.OnPointersCreated?.Invoke(pointers);
}
}
public class FeralOutput
{
[CompilerGenerated]
private ManualLogSource <source>P;
private const string LogTemplate = "[{0}#{1}:L{2}] {3}";
public FeralOutput(ManualLogSource source)
{
<source>P = source;
base..ctor();
}
internal void Status(object msg)
{
Feral.HUD.DisplayStatusEffect(msg.ToString());
}
internal void Debug(object msg)
{
Feral.HUD.SetDebugText(msg.ToString());
}
internal void Info(object data, [CallerFilePath] string caller = "", [CallerMemberName] string callerMethod = "", [CallerLineNumber] int lineNumber = 0)
{
Log((LogLevel)16, data, caller, callerMethod, lineNumber);
}
internal void Warn(object data, [CallerFilePath] string caller = "", [CallerMemberName] string callerMethod = "", [CallerLineNumber] int lineNumber = 0)
{
Log((LogLevel)4, data, caller, callerMethod, lineNumber);
}
internal void Error(object data, [CallerFilePath] string caller = "", [CallerMemberName] string callerMethod = "", [CallerLineNumber] int lineNumber = 0)
{
Log((LogLevel)2, data, caller, callerMethod, lineNumber);
}
private void Log(LogLevel level, object data, string caller, string callerMethod, int lineNumber)
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
string fileName = Path.GetFileName(caller);
<source>P.Log(level, (object)$"[{fileName}#{callerMethod}:L{lineNumber}] {data}");
}
}
public class FeralSettings
{
internal class GeneralSettings
{
internal readonly SettingBase<FeralCompany.Core.Locale.Locale> Locale;
internal readonly Config<int> InternalNightVisionIntensity;
internal readonly Config<int> ExternalNightVisionIntensity;
internal GeneralSettings(ConfigFile config)
{
Setting<string> delegated = new Setting<string>("en_US");
Locale = new FuncSetting<string, FeralCompany.Core.Locale.Locale>(delegated, (string key) => Feral.Locales.Locales[key], (FeralCompany.Core.Locale.Locale locale) => locale.Key);
InternalNightVisionIntensity = new Config<int>(config, "NightVision", "Facility Intensity", 0, "The intensity of the night vision while inside the facility.", (AcceptableValueBase?)(object)new AcceptableValueRange<int>(0, 100));
ExternalNightVisionIntensity = new Config<int>(config, "NightVision", "Outside Intensity", 0, "The intensity of the night vision while outside the facility.", (AcceptableValueBase?)(object)new AcceptableValueRange<int>(0, 100));
}
}
internal class MapSettings
{
internal readonly Config<bool> Enable;
internal readonly Config<float> Scale;
internal readonly Config<float> Zoom;
internal readonly SettingBase<int> CullingMask;
internal readonly Config<float> InternalLight;
internal readonly Config<float> ExternalLight;
internal readonly Config<bool> PointerShip;
internal readonly Config<bool> PointerExternalEntrance;
internal readonly Config<bool> PointerInternalEntrance;
internal readonly Config<bool> PointerExternalFire;
internal readonly Config<bool> PointerInternalFire;
internal readonly Config<bool> PointerShipRadar;
internal readonly Config<bool> PointerExternalEntranceRadar;
internal readonly Config<bool> PointerInternalEntranceRadar;
internal readonly Config<bool> PointerExternalFireRadar;
internal readonly Config<bool> PointerInternalFireRadar;
internal MapSettings(ConfigFile config)
{
Enable = new Config<bool>(config, "Map", "Enable", defaultValue: true, "Whether or not to enable the map.");
Scale = new Config<float>(config, "Map", "Scale", 1f, "The size of the map.", (AcceptableValueBase?)(object)new AcceptableValueRange<float>(0.1f, 5f));
Zoom = new Config<float>(config, "Map", "Zoom", 19.7f, "How close the camera should follow the target.");
InternalLight = new Config<float>(config, "Map", "Facility Brightness", 15f, "The intensity of the backlight for the map while inside the facility.\r\nVanilla: 0; No lighting other than internal lights and sunlight.", (AcceptableValueBase?)(object)new AcceptableValueRange<float>(0f, 100f));
ExternalLight = new Config<float>(config, "Map", "Outside Brightness", 15f, "The intensity of the backlight for the map while outside the facility.\r\nVanilla: 0; No lighting other than internal lights and sunlight.", (AcceptableValueBase?)(object)new AcceptableValueRange<float>(0f, 100f));
PointerShip = new Config<bool>(config, "Map.Pointers", "Ship", defaultValue: true, "Whether or not to show pointers for the ship.");
PointerExternalEntrance = new Config<bool>(config, "Map.Pointers", "External Entrance", defaultValue: true, "Whether or not to show pointers for the external entrance.");
PointerInternalEntrance = new Config<bool>(config, "Map.Pointers", "Internal Entrance", defaultValue: true, "Whether or not to show pointers for the internal entrance.");
PointerExternalFire = new Config<bool>(config, "Map.Pointers", "External Fire", defaultValue: true, "Whether or not to show pointers for external fire exits.");
PointerInternalFire = new Config<bool>(config, "Map.Pointers", "Internal Fire", defaultValue: true, "Whether or not to show pointers for internal fire exits.");
PointerShipRadar = new Config<bool>(config, "Map.Pointers", "Ship (Radar)", defaultValue: true, "Whether or not to show pointers for the ship when viewing a radar.");
PointerExternalEntranceRadar = new Config<bool>(config, "Map.Pointers", "External Entrance (Radar)", defaultValue: true, "Whether or not to show pointers for the external entrance when viewing a radar.");
PointerInternalEntranceRadar = new Config<bool>(config, "Map.Pointers", "Internal Entrance (Radar)", defaultValue: true, "Whether or not to show pointers for the internal entrance when viewing a radar.");
PointerExternalFireRadar = new Config<bool>(config, "Map.Pointers", "External Fire (Radar)", defaultValue: true, "Whether or not to show pointers for external fire exits when viewing a radar.");
PointerInternalFireRadar = new Config<bool>(config, "Map.Pointers", "Internal Fire (Radar)", defaultValue: true, "Whether or not to show pointers for internal fire exits when viewing a radar.");
Config<string> delegated = new Config<string>(config, "Map", "Visible Layers", "Room,MapRadar", "The layers of the game visible to the minimap camera. Comma-separated list.\r\nValid layers:\r\n$" + string.Join(',', Mask.Names));
CullingMask = new FuncSetting<string, int>(delegated, (string input) => input.Split(",", StringSplitOptions.RemoveEmptyEntries).Aggregate(0, (int current, string str) => current.AddMask(Mask.Named(str))), (int input) => string.Join(',', Mask.Decompress(input)));
}
}
internal readonly GeneralSettings General = new GeneralSettings(config);
internal readonly MapSettings Map = new MapSettings(config);
public FeralSettings(ConfigFile config)
{
}
}
public class SettingInt : Setting<int>
{
public SettingInt(int defaultValue = 0)
: base(defaultValue)
{
}
internal int Increment(int add = 1)
{
Value += add;
return Value;
}
internal int Decrement(int subtract = 1)
{
Value -= subtract;
return Value;
}
}
}
namespace FeralCompany.Core.UI
{
public abstract class FeralUI : MonoBehaviour
{
protected float UIScale = 1f;
private Canvas _canvas;
private float _originalCanvasScale;
private float _currentCanvasScale;
protected Transform Window { get; private set; }
protected RectTransform WindowRect { get; private set; }
internal bool IsOpen { get; private set; }
internal event Action? OpenEvent;
internal event Action? CloseEvent;
private void Awake()
{
Window = ((Component)this).transform.Find("Container/Window");
if (Object.op_Implicit((Object)(object)Window))
{
((Component)Window).gameObject.SetActive(false);
WindowRect = ((Component)Window).gameObject.GetComponent<RectTransform>();
}
_canvas = ((Component)this).GetComponent<Canvas>();
_originalCanvasScale = _canvas.scaleFactor;
_currentCanvasScale = _originalCanvasScale;
AfterAwake();
}
internal void Init()
{
OnInit();
UpdateScale(UIScale);
}
protected void Update()
{
if (Feral.Player.quickMenuManager.isMenuOpen)
{
Close();
return;
}
if (CanOpen())
{
Open();
}
AfterUpdate();
}
internal void Open()
{
if (!IsOpen && Object.op_Implicit((Object)(object)Window))
{
IsOpen = true;
((Component)Window).gameObject.SetActive(true);
OnOpen();
this.OpenEvent?.Invoke();
}
}
internal void Close()
{
if (IsOpen && Object.op_Implicit((Object)(object)Window))
{
IsOpen = false;
((Component)Window).gameObject.SetActive(false);
OnClose();
this.CloseEvent?.Invoke();
}
}
private void OnDestroy()
{
OnBaseDestroy();
}
protected abstract void AfterAwake();
protected abstract void OnInit();
protected virtual void AfterUpdate()
{
}
protected virtual void OnOpen()
{
}
protected virtual void OnClose()
{
}
protected virtual void OnBaseDestroy()
{
}
protected virtual void HandleScaleUpdate(float width, float height)
{
}
protected virtual bool CanOpen()
{
return true;
}
internal void UpdateScale(float newScale)
{
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
UIScale = newScale;
_currentCanvasScale = _originalCanvasScale * newScale;
_canvas.scaleFactor = _currentCanvasScale;
float width = WindowRect.sizeDelta.x * _currentCanvasScale;
float height = WindowRect.sizeDelta.y * _currentCanvasScale;
HandleScaleUpdate(width, height);
}
}
}
namespace FeralCompany.Core.Setting
{
public class Config<T> : SettingBase<T>
{
private readonly ConfigEntry<T> _entry;
internal override T Value
{
get
{
return _entry.Value;
}
set
{
_entry.Value = value;
}
}
internal override T DefaultValue { get; }
internal Config(ConfigFile config, string section, string key, T defaultValue, string description, AcceptableValueBase? acceptableValues = null)
{
//IL_0012: 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_002c: Expected O, but got Unknown
//IL_002c: Expected O, but got Unknown
DefaultValue = defaultValue;
_entry = config.Bind<T>(new ConfigDefinition(section, key), defaultValue, new ConfigDescription(description, acceptableValues, Array.Empty<object>()));
_entry.SettingChanged += delegate
{
InvokeChangeEvent(_entry.Value);
};
}
}
public class FuncSetting<T, R> : SettingBase<R>
{
[CompilerGenerated]
private SettingBase<T> <delegated>P;
[CompilerGenerated]
private Func<T, R> <mapper>P;
[CompilerGenerated]
private Func<R, T> <demapper>P;
internal override R Value
{
get
{
return <mapper>P(<delegated>P.Value);
}
set
{
<delegated>P.Value = <demapper>P(value);
InvokeChangeEvent(value);
}
}
internal override R DefaultValue => <mapper>P(<delegated>P.Value);
public FuncSetting(SettingBase<T> delegated, Func<T, R> mapper, Func<R, T> demapper)
{
<delegated>P = delegated;
<mapper>P = mapper;
<demapper>P = demapper;
base..ctor();
}
}
public class Setting<T> : SettingBase<T>
{
private T _value;
internal override T Value
{
get
{
return _value;
}
set
{
_value = value;
InvokeChangeEvent(value);
}
}
internal override T DefaultValue { get; }
public Setting(T defaultValue)
{
DefaultValue = defaultValue;
_value = defaultValue;
base..ctor();
}
}
public abstract class SettingBase<T>
{
internal abstract T Value { get; set; }
internal abstract T DefaultValue { get; }
internal event Action<T>? ChangeEvent;
internal void Reset()
{
Value = DefaultValue;
}
protected void InvokeChangeEvent(T newValue)
{
this.ChangeEvent?.Invoke(newValue);
}
public static implicit operator T(SettingBase<T> settingBase)
{
return settingBase.Value;
}
}
public class SettingBool : Setting<bool>
{
public SettingBool(bool defaultValue = false)
: base(defaultValue)
{
}
internal void SetFalse()
{
Value = false;
}
internal void SetTrue()
{
Value = true;
}
}
}
namespace FeralCompany.Core.Locale
{
internal class FeralLocales
{
internal readonly Dictionary<string, Locale> Locales = new Dictionary<string, Locale>();
internal bool Init()
{
string[] files = Directory.GetFiles(Files.LocalePath, "*.json");
for (int i = 0; i < files.Length; i++)
{
Locale locale = LocaleParser.Parse(files[i]);
Locales.Add(locale.Key, locale);
}
Locale.Current = Feral.Settings.General.Locale;
return true;
}
}
public class Locale
{
internal static Locale Current { get; set; }
internal string Key { get; }
internal string Name { get; }
internal string? Fallback { get; }
internal Dictionary<string, string> Entries { get; }
public Locale(string key, string name, string? fallback, Dictionary<string, string> entries)
{
Key = key;
Name = name;
Fallback = fallback;
Entries = entries;
base..ctor();
}
internal string GetEntry(string key)
{
if (!TryGetEntry(key, out string entry))
{
Feral.IO.Warn("Locale '" + key + "' does not contain entry: " + key, "D:\\projects\\lethalcompany\\FeralCompany\\FeralCompany\\Core\\Locale\\Locale.cs", "GetEntry", 18);
}
return entry;
}
internal string GetEntry(string key, params object[] data)
{
if (!TryGetEntry(key, out string entry))
{
Feral.IO.Warn("Locale '" + key + "' does not contain entry: " + key, "D:\\projects\\lethalcompany\\FeralCompany\\FeralCompany\\Core\\Locale\\Locale.cs", "GetEntry", 26);
}
return string.Format(entry, data);
}
internal bool TryGetEntry(string key, out string entry)
{
if (Entries.TryGetValue(key, out entry))
{
return true;
}
if (Fallback != null && Feral.Locales.Locales.TryGetValue(Fallback, out Locale value))
{
return value.TryGetEntry(key, out entry);
}
entry = key;
return false;
}
internal bool TryGetEntry(string key, out string entry, params object[] data)
{
if (!TryGetEntry(key, out entry))
{
return false;
}
entry = string.Format(entry, data);
return true;
}
}
internal static class LocaleParser
{
internal static Locale Parse(string fileName)
{
string text;
using (StreamReader streamReader = new StreamReader(fileName))
{
text = streamReader.ReadToEnd();
}
JToken val = JToken.Parse(text);
string key = val.Value<string>((object)"key");
string name = val.Value<string>((object)"name");
string fallback = val.Value<string>((object)"fallback");
Dictionary<string, string> entries = new Dictionary<string, string>();
FlattenEntries(entries, val[(object)"entries"]);
return new Locale(key, name, fallback, entries);
}
private static void FlattenEntries(Dictionary<string, string> entries, JToken token, string prefix = "")
{
//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_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Expected I4, but got Unknown
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
JTokenType type = token.Type;
switch ((int)type)
{
case 1:
{
foreach (JProperty item in token.Children<JProperty>())
{
FlattenEntries(entries, item.Value, Join(prefix, item.Name));
}
break;
}
case 8:
entries.Add(prefix, ((object)token).ToString());
break;
default:
throw new ArgumentOutOfRangeException($"Unsupported JTokenType: {token.Type}");
}
}
private static string Join(string prefix, string key)
{
if (!string.IsNullOrEmpty(prefix))
{
return prefix + "." + key;
}
return key;
}
}
public class LocaleToken
{
[CompilerGenerated]
private string <key>P;
public LocaleToken(string key)
{
<key>P = key;
base..ctor();
}
internal string GetEntry()
{
return Locale.Current.GetEntry(<key>P);
}
internal string GetEntry(params object[] data)
{
return Locale.Current.GetEntry(<key>P, data);
}
internal bool TryGetEntry(out string entry)
{
return Locale.Current.TryGetEntry(<key>P, out entry);
}
internal bool TryGetEntry(out string entry, params object[] data)
{
return Locale.Current.TryGetEntry(<key>P, out entry, data);
}
public static implicit operator string(LocaleToken localeToken)
{
return localeToken.GetEntry();
}
}
}