Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of CustomPaintingsCopyright v1.2.5
UnderratedJunk-CustomPaintings(Copyright)/CustomPaintings.dll
Decompiled a year agousing 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.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using ExitGames.Client.Photon; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using Photon.Realtime; using UnityEngine; using UnityEngine.SceneManagement; [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("CustomPaintings")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+f1989f898e2eafb0a46ef0fdffeea9e6ae271875")] [assembly: AssemblyProduct("CustomPaintings")] [assembly: AssemblyTitle("CustomPaintings")] [assembly: AssemblyVersion("1.0.0.0")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace CustomPaintings { [BepInPlugin("UnderratedJunk.CustomPaintings", "CustomPaintings", "1.1.4")] public class CustomPaintings : BaseUnityPlugin { [HarmonyPatch(typeof(LoadingUI), "LevelAnimationComplete")] public class PaintingSwapPatch { private static void Postfix() { Task.Run(async delegate { int waited = 0; int interval = 50; while (!receivedSeed.HasValue && waited < maxWaitTimeMs) { await Task.Delay(interval); waited += interval; } if (receivedSeed.HasValue) { logger.LogInfo($"[Postfix] Client using received seed: {receivedSeed.Value}"); CustomPaintingsSwap.ReceivedSeed = receivedSeed.Value; receivedSeed = null; } swapper.ReplacePaintings(); }); } private static void Prefix() { if (swapper.GetModState() == CustomPaintingsSwap.ModState.Client) { PhotonNetwork.AddCallbackTarget((object)sync); } if (swapper.GetModState() == CustomPaintingsSwap.ModState.Host) { CustomPaintingsSwap.HostSeed = Random.Range(0, int.MaxValue); logger.LogInfo($"Generated Hostseed: {CustomPaintingsSwap.HostSeed}"); PhotonNetwork.AddCallbackTarget((object)sync); sync.SendSeed(CustomPaintingsSwap.HostSeed); if (CustomPaintingsConfig.SeperateImages.Value) { sync.SendSeperateState("on"); } else if (!CustomPaintingsConfig.SeperateImages.Value) { sync.SendSeperateState("off"); } } loader.UpdateGrungeMaterialParameters(); } } [HarmonyPatch(typeof(NetworkConnect), "TryJoiningRoom")] public class JoinLobbyPatch { private static void Prefix() { if (swapper.GetModState() != 0) { swapper.SetState(CustomPaintingsSwap.ModState.Client); } } } [HarmonyPatch(typeof(SteamManager), "HostLobby")] public class HostLobbyPatch { private static bool Prefix() { swapper.SetState(CustomPaintingsSwap.ModState.Host); return true; } } [HarmonyPatch(typeof(SteamManager), "LeaveLobby")] public class LeaveLobbyPatch { private static void Postfix() { PhotonNetwork.RemoveCallbackTarget((object)sync); swapper.SetState(CustomPaintingsSwap.ModState.SinglePlayer); CustomPaintingsSwap.SeperateState = "Singleplayer"; } } private static Logger logger; private static CustomPaintingsLoader loader; private static CustomPaintingsSwap swapper; private static CustomPaintingsSync sync; private static CustomPaintingsGroupList grouper; private static CustomPaintingsConfig configfile; public static int? receivedSeed = null; public static readonly int maxWaitTimeMs = 1000; private readonly Harmony harmony = new Harmony("UnderratedJunk.CustomPaintings"); private void Awake() { logger = new Logger("CustomPaintings"); logger.LogInfo("CustomPaintings mod initialized."); CustomPaintingsConfig.Init(((BaseUnityPlugin)this).Config); loader = new CustomPaintingsLoader(logger); loader.LoadImagesFromAllPlugins(); configfile = new CustomPaintingsConfig(); grouper = new CustomPaintingsGroupList(logger); swapper = new CustomPaintingsSwap(logger, loader, grouper); sync = new CustomPaintingsSync(logger); harmony.PatchAll(); } } public class CustomPaintingsConfig { internal static class Grunge { internal static ConfigEntry<bool> State; internal static ConfigEntry<float> Intensity; internal static ConfigEntry<Color> _BaseColor; internal static ConfigEntry<Color> _MainColor; internal static ConfigEntry<Color> _CracksColor; internal static ConfigEntry<Color> _OutlineColor; } internal static class Graphics { internal static ConfigEntry<bool> PointFiltering; } public static ConfigEntry<bool> HostControl; public static ConfigEntry<bool> SeperateImages; public static ConfigEntry<bool> ChaosMode; internal static void Init(ConfigFile config) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Expected O, but got Unknown //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Expected O, but got Unknown //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Expected O, but got Unknown //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Expected O, but got Unknown //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Expected O, but got Unknown HostControl = config.Bind<bool>("Image Settings", "Host Control", true, new ConfigDescription("choose if host controls seperate state", (AcceptableValueBase)null, Array.Empty<object>())); SeperateImages = config.Bind<bool>("Image Settings", "Seperate paintings", false, new ConfigDescription("seperate square, landscape and portrait images on swap", (AcceptableValueBase)null, Array.Empty<object>())); ChaosMode = config.Bind<bool>("Image Settings", "Chaos Mode", false, new ConfigDescription("adds a bunch of materials that shouldn't be changed to the pool", (AcceptableValueBase)null, Array.Empty<object>())); Grunge.State = config.Bind<bool>("Grunge", "Grunge state", true, new ConfigDescription("Whether the grunge effect is enabled", (AcceptableValueBase)null, Array.Empty<object>())); Grunge.Intensity = config.Bind<float>("Grunge", "Grunge intensity", 0.5f, new ConfigDescription("change how intense the grunge is applied", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 2f), Array.Empty<object>())); Grunge._BaseColor = config.Bind<Color>("Grunge", "_GrungeBaseColor", new Color(0f, 0f, 0f, 1f), new ConfigDescription("The base color of the grunge", (AcceptableValueBase)null, Array.Empty<object>())); Grunge._MainColor = config.Bind<Color>("Grunge", "_GrungeMainColor", new Color(0f, 0f, 0f, 0.5f), new ConfigDescription("The color of the main overlay of grunge", (AcceptableValueBase)null, Array.Empty<object>())); Grunge._CracksColor = config.Bind<Color>("Grunge", "_GrungeCracksColor", new Color(0.25f, 0.25f, 0.25f, 1f), new ConfigDescription("The color of the cracks in the grunge", (AcceptableValueBase)null, Array.Empty<object>())); Grunge._OutlineColor = config.Bind<Color>("Grunge", "_GrungeOutlineColor", new Color(0f, 0f, 0f, 1f), new ConfigDescription("The color of the grunge outlining the painting", (AcceptableValueBase)null, Array.Empty<object>())); Graphics.PointFiltering = config.Bind<bool>("Graphics", "PointFiltering", true, new ConfigDescription("Point filtering will match the pixelated effect the game has", (AcceptableValueBase)null, Array.Empty<object>())); } } public class CustomPaintingsGroupList { private readonly Logger logger; public static readonly Dictionary<string, List<string>> MaterialNameToGroup = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase) { { "Painting_H_Landscape", new List<string> { "Landscape", "Normal", "Chaos" } }, { "Painting_H_crow", new List<string> { "Landscape", "Normal", "Chaos" } }, { "Painting_H_crow_0", new List<string> { "Landscape", "Normal", "Chaos" } }, { "PaintingMedium", new List<string> { "Landscape", "Normal", "Chaos" } }, { "Painting_Danish_Flag", new List<string> { "Landscape", "Normal", "Chaos" } }, { "Painting_Board", new List<string> { "Landscape", "Normal", "Chaos" } }, { "Painting Danish Flag", new List<string> { "Landscape", "Normal", "Chaos" } }, { "Painting Board", new List<string> { "Landscape", "Normal", "Chaos" } }, { "Shop Outside Billboard Ad", new List<string> { "Landscape", "Normal", "Chaos" } }, { "Painting_S_Creep", new List<string> { "Square", "Normal", "Chaos" } }, { "Painting_S_Creep 2_0", new List<string> { "Square", "Normal", "Chaos" } }, { "Painting_S_Creep 2", new List<string> { "Square", "Normal", "Chaos" } }, { "Painting Wizard Class", new List<string> { "Square", "Normal", "Chaos" } }, { "Picture Frame - Picture 01", new List<string> { "Square", "Normal", "Chaos" } }, { "Painting_Aurora", new List<string> { "Square", "Normal", "Chaos" } }, { "Painting_McJannek", new List<string> { "Square", "Normal", "Chaos" } }, { "Painting Aurora", new List<string> { "Square", "Normal", "Chaos" } }, { "Painting McJannek", new List<string> { "Square", "Normal", "Chaos" } }, { "Painting_V_jannk", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Painting_V_Furman", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Painting_V_surrealistic", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Painting_V_surrealistic_0", new List<string> { "Portrait", "Normal", "Chaos" } }, { "painting teacher01", new List<string> { "Portrait", "Normal", "Chaos" } }, { "painting teacher02", new List<string> { "Portrait", "Normal", "Chaos" } }, { "painting teacher03", new List<string> { "Portrait", "Normal", "Chaos" } }, { "painting teacher04", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Painting_S_Tree", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Painting Calendar", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Magazine01", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Magazine02", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Magazine03", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Magazine04", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Magazine05", new List<string> { "Portrait", "Normal", "Chaos" } }, { "Valuable_Painting", new List<string> { "Portrait", "Normal", "Chaos" } }, { "regular material 01", new List<string> { "Chaos", "Square" } }, { "Arctic Sign Accounting", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Bathroom", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Botanical Research", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Brige 4B", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Brige 8N", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Cafeteria", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Cargo processing", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Catwalk L5", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Cooling Center", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Epsilon Station", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Exotic Materials Division", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Infirmary", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Kitchen", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Living Quarters", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Loading Dock", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Maintenance2", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Observation Platform", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Recreation", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Research Lab", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Storage Yard", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Testing Lab", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Vehicle Maintenance", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Ventilation Chamber", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign Warehouse", new List<string> { "Chaos", "Landscape" } }, { "Arctic Sign", new List<string> { "Chaos", "Landscape" } }, { "Lobby Sign - Closed Road", new List<string> { "Chaos", "Square" } }, { "Lobby Sign - No stopping", new List<string> { "Chaos", "Square" } }, { "Robot Company Sign 2", new List<string> { "Chaos", "Square" } }, { "Robot Company Sign 3", new List<string> { "Chaos", "Landscape" } }, { "Robot Company Sign 4", new List<string> { "Chaos", "Portrait" } }, { "Robot Company Sign 5", new List<string> { "Chaos", "Landscape" } }, { "Robot Company Sign 6", new List<string> { "Chaos", "Portrait" } }, { "Robot Company Sign 7", new List<string> { "Chaos", "Square" } }, { "Robot Company Sign", new List<string> { "Chaos", "Square" } }, { "Wizard Sign Cauldron Storage", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Common Room", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Courtyard", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Dark Arts", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Deathpit Corridor", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Dining Hall", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Dormatory", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Dungeon", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign East Wing Lobby", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Enchanted Lava Room", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Gnome Alley", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Headmasters Study", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Lecture Hall", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Magic Plant School", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Potions And Spells", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Relaxation Room", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Sludge Pits of Joy", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Sludge Pits", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Sorcery Class", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Storage Room", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign The Great Library", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign Thinking Chamber", new List<string> { "Chaos", "Landscape" } }, { "Wizard Sign West Wing Garden", new List<string> { "Chaos", "Landscape" } }, { "Rug", new List<string> { "Chaos", "Square" } }, { "Rug Plain Red", new List<string> { "Chaos", "Landscape" } }, { "shop rug", new List<string> { "Chaos", "Square" } }, { "Bathroom Rug", new List<string> { "Chaos", "Square" } }, { "Wizard Wall Flag", new List<string> { "Chaos", "Portrait" } }, { "upgrade_throw", new List<string> { "Chaos", "Landscape" } }, { "upgrade_strength", new List<string> { "Chaos", "Landscape" } }, { "upgrade_speed", new List<string> { "Chaos", "Landscape" } }, { "upgrade_health", new List<string> { "Chaos", "Landscape" } }, { "upgrade_grab range", new List<string> { "Chaos", "Landscape" } }, { "upgrade_energy", new List<string> { "Chaos", "Landscape" } }, { "upgrade_tumble_launch", new List<string> { "Chaos", "Landscape" } }, { "upgrade_map_player_count", new List<string> { "Chaos", "Landscape" } }, { "upgrade_extra_jump", new List<string> { "Chaos", "Landscape" } }, { "Welcome_Flag_Front", new List<string> { "Chaos", "Landscape" } }, { "Welcome_Flag_Back", new List<string> { "Chaos", "Landscape" } }, { "Wizard Door Double", new List<string> { "Chaos", "Portrait" } }, { "Wizard Door Double Blocked", new List<string> { "Chaos", "Portrait" } }, { "Wizard Door Double Blocked Lock", new List<string> { "Chaos", "Portrait" } }, { "Door Wizard", new List<string> { "Chaos", "Portrait" } }, { "Shop Door", new List<string> { "Chaos", "Portrait" } }, { "Door Shop WC", new List<string> { "Chaos", "Portrait" } }, { "Garage Door", new List<string> { "Chaos", "Landscape" } }, { "Arctic Door", new List<string> { "Chaos", "Portrait" } }, { "Arctic Door Blocked", new List<string> { "Chaos", "Portrait" } }, { "Museum Door", new List<string> { "Chaos", "Portrait" } }, { "door base", new List<string> { "Chaos", "Portrait" } } }; public CustomPaintingsGroupList(Logger logger) { this.logger = logger; } } public class CustomPaintingsLoader { private const string IMAGE_FOLDER_NAME = "CustomPaintings"; private readonly Logger logger; public Dictionary<string, List<Material>> MaterialGroups = new Dictionary<string, List<Material>>(); private const string GRUNGE_ASSET_BUNDLE = "GrungeAssets"; private const string MATERIAL_LANDSCAPE_ASSET_NAME = "GrungeHorizontalMaterial"; private const string MATERIAL_PORTRAIT_ASSET_NAME = "GrungeVerticalMaterial"; private static Material _LandscapeMaterial; private static Material _PortraitMaterial; public List<Material> LoadedMaterials { get; } = new List<Material>(); public CustomPaintingsLoader(Logger logger) { this.logger = logger; } public void LoadImagesFromAllPlugins() { string text = Path.Combine(Paths.PluginPath); if (!Directory.Exists(text)) { logger.LogWarning("Plugins directory not found: " + text); return; } string[] directories = Directory.GetDirectories(text, "CustomPaintings", SearchOption.AllDirectories); LoadGrungeMaterials(); BindConfigUpdates(); if (directories.Length == 0) { logger.LogWarning("No 'CustomPaintings' folders found in plugins."); return; } string[] array = directories; foreach (string text2 in array) { logger.LogInfo("Loading images from: " + text2); LoadImagesFromDirectory(text2); } } private void LoadImagesFromDirectory(string directoryPath) { if (!Directory.Exists(directoryPath)) { logger.LogWarning("Directory does not exist: " + directoryPath); return; } string[] validExtensions = new string[4] { ".png", ".jpg", ".jpeg", ".bmp" }; string[] array = (from file in Directory.EnumerateFiles(directoryPath, "*.*", SearchOption.AllDirectories) where validExtensions.Contains(Path.GetExtension(file).ToLower()) select file).ToArray(); if (array.Length == 0) { logger.LogWarning("No images found in " + directoryPath); return; } for (int i = 0; i < array.Length; i++) { string text = array[i]; Texture2D val = LoadTextureFromFile(text); if ((Object)(object)val == (Object)null) { logger.LogWarning($"Failed to load image #{i + 1}: {text}"); continue; } float num = (float)((Texture)val).width / (float)((Texture)val).height; if (num > 1.3f) { AddGrungeMaterial("Landscape", _LandscapeMaterial, val); } else if (num < 0.769f) { AddGrungeMaterial("Portrait", _PortraitMaterial, val); } else { AddGrungeMaterial("Square", _LandscapeMaterial, val); } logger.LogInfo($"Loaded image #{i + 1}: {Path.GetFileName(text)}"); } foreach (KeyValuePair<string, List<Material>> materialGroup in MaterialGroups) { LoadedMaterials.AddRange(materialGroup.Value); } logger.LogInfo($"Total images loaded: {LoadedMaterials.Count}"); } private Material AddGrungeMaterial(Material grungeMaterial, Texture2D texture) { //IL_002a: 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_0037: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown if ((Object)(object)grungeMaterial == (Object)null) { logger.LogWarning("Falling back to default shader"); return new Material(Shader.Find("Standard")); } return new Material(grungeMaterial) { mainTexture = (Texture)(object)texture }; } private void AddGrungeMaterial(string paintingType, Material grungeMaterial, Texture2D texture) { if (!MaterialGroups.ContainsKey(paintingType)) { MaterialGroups[paintingType] = new List<Material>(); } Material item = AddGrungeMaterial(grungeMaterial, texture); MaterialGroups[paintingType].Add(item); } private Texture2D LoadTextureFromFile(string filePath) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown byte[] array = File.ReadAllBytes(filePath); Texture2D val = new Texture2D(2, 2); if (ImageConversion.LoadImage(val, array)) { SetFilterMode((Texture)(object)val); val.Apply(); return val; } return null; } private void LoadGrungeMaterials() { string? directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string text = "GrungeAssets"; string text2 = Path.Combine(directoryName, text); logger.LogInfo("Loading [" + text2 + "]"); if (File.Exists(text2)) { logger.LogInfo("Grunge Asset Bundle exists."); } else { logger.LogWarning("Grunge Asset Bundle doesn't exist!"); } AssetBundle val = AssetBundle.LoadFromFile(text2); if ((Object)(object)val == (Object)null) { logger.LogError("Failed to load [" + text + "]!"); } else { _LandscapeMaterial = val.LoadAsset<Material>("GrungeHorizontalMaterial"); if ((Object)(object)_LandscapeMaterial == (Object)null) { logger.LogError("Could not load landscape painting material [GrungeHorizontalMaterial]!"); } _PortraitMaterial = val.LoadAsset<Material>("GrungeVerticalMaterial"); if ((Object)(object)_PortraitMaterial == (Object)null) { logger.LogError("Could not load portrait painting material [GrungeVerticalMaterial]!"); } } if ((Object)(object)_LandscapeMaterial != (Object)null && (Object)(object)_PortraitMaterial != (Object)null) { logger.LogInfo("Grunge materials successfully loaded!"); } } internal void BindConfigUpdates() { CustomPaintingsConfig.Grunge.State.SettingChanged += OnGrungeConfigOptionChanged; CustomPaintingsConfig.Grunge.Intensity.SettingChanged += OnGrungeConfigOptionChanged; CustomPaintingsConfig.Grunge._BaseColor.SettingChanged += OnGrungeConfigOptionChanged; CustomPaintingsConfig.Grunge._BaseColor.SettingChanged += OnGrungeConfigOptionChanged; CustomPaintingsConfig.Grunge._MainColor.SettingChanged += OnGrungeConfigOptionChanged; CustomPaintingsConfig.Grunge._CracksColor.SettingChanged += OnGrungeConfigOptionChanged; CustomPaintingsConfig.Grunge._OutlineColor.SettingChanged += OnGrungeConfigOptionChanged; CustomPaintingsConfig.Graphics.PointFiltering.SettingChanged += OnPointFilteringConfigOptionChange; } internal void OnPointFilteringConfigOptionChange(object sender, EventArgs e) { foreach (Material loadedMaterial in LoadedMaterials) { SetFilterMode(loadedMaterial.mainTexture); } } internal void SetFilterMode(Texture texture) { if (CustomPaintingsConfig.Graphics.PointFiltering.Value) { texture.filterMode = (FilterMode)0; } else { texture.filterMode = (FilterMode)2; } } internal void OnGrungeConfigOptionChanged(object sender, EventArgs e) { UpdateGrungeMaterialParameters(); } internal void UpdateGrungeMaterialParameters() { //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: 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_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0133: 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_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0159: 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_015f: Unknown result type (might be due to invalid IL or missing references) logger.LogDebug("Updating Grunge Material Parameters..."); bool value = CustomPaintingsConfig.Grunge.State.Value; float value2 = CustomPaintingsConfig.Grunge.Intensity.Value; Color val = default(Color); ((Color)(ref val))..ctor(1f, 1f, 1f, value2); logger.LogDebug($"Grunge state is [{value}]!"); logger.LogDebug($"Grunge intensity is [{value2}]!"); logger.LogDebug($"Number of loaded painting materials = [{LoadedMaterials.Count}]"); foreach (Material loadedMaterial in LoadedMaterials) { if ((Object)(object)loadedMaterial == (Object)null) { logger.LogWarning("No material found!"); } else if (value) { loadedMaterial.SetColor(((ConfigEntryBase)CustomPaintingsConfig.Grunge._BaseColor).Definition.Key, CustomPaintingsConfig.Grunge._BaseColor.Value); loadedMaterial.SetColor(((ConfigEntryBase)CustomPaintingsConfig.Grunge._MainColor).Definition.Key, CustomPaintingsConfig.Grunge._MainColor.Value * val); loadedMaterial.SetColor(((ConfigEntryBase)CustomPaintingsConfig.Grunge._CracksColor).Definition.Key, CustomPaintingsConfig.Grunge._CracksColor.Value * val); loadedMaterial.SetColor(((ConfigEntryBase)CustomPaintingsConfig.Grunge._OutlineColor).Definition.Key, CustomPaintingsConfig.Grunge._OutlineColor.Value * val); } else { loadedMaterial.SetColor(((ConfigEntryBase)CustomPaintingsConfig.Grunge._BaseColor).Definition.Key, Color.clear); loadedMaterial.SetColor(((ConfigEntryBase)CustomPaintingsConfig.Grunge._MainColor).Definition.Key, Color.clear); loadedMaterial.SetColor(((ConfigEntryBase)CustomPaintingsConfig.Grunge._CracksColor).Definition.Key, Color.clear); loadedMaterial.SetColor(((ConfigEntryBase)CustomPaintingsConfig.Grunge._OutlineColor).Definition.Key, Color.clear); } } } } public class CustomPaintingsSwap { public enum ModState { Host, Client, SinglePlayer } private readonly Logger logger; private readonly CustomPaintingsLoader loader; private readonly CustomPaintingsGroupList grouper; private static CustomPaintingsConfig configfile; private static int randomSeed = 0; public static int HostSeed = 0; public static int ReceivedSeed = 0; public static int Seed = 0; public static string SeperateState = "Singleplayer"; public static string ImageMode = "Normal"; private int paintingsChangedCount; private int LandscapeChangedCount; private int SquareChangedCount; private int PortraitChangedCount; private static ModState currentState = ModState.SinglePlayer; public ModState GetModState() { return currentState; } public CustomPaintingsSwap(Logger logger, CustomPaintingsLoader loader, CustomPaintingsGroupList grouper) { this.logger = logger; this.loader = loader; this.grouper = grouper; logger.LogInfo($"Initial ModState: {currentState}"); if (randomSeed == 0) { randomSeed = Random.Range(0, int.MaxValue); logger.LogInfo($"Generated initial random seed: {randomSeed}"); } } public void ReplacePaintings() { //IL_0063: 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_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02a7: Unknown result type (might be due to invalid IL or missing references) if (currentState == ModState.SinglePlayer) { Seed = randomSeed; } if (currentState == ModState.Host) { Seed = HostSeed; } if (currentState == ModState.Client) { Seed = ReceivedSeed; } if (CustomPaintingsConfig.ChaosMode.Value) { ImageMode = "Chaos"; } else if (!CustomPaintingsConfig.ChaosMode.Value) { ImageMode = "Normal"; } Scene activeScene = SceneManager.GetActiveScene(); logger.LogInfo($"Applying seed {Seed} for painting swaps in scene: {((Scene)(ref activeScene)).name}"); logger.LogInfo("Replacing all paintings with custom images..."); paintingsChangedCount = 0; int num = 0; Scene activeScene2; if ((!CustomPaintingsConfig.SeperateImages.Value && SeperateState == "Singleplayer") || (SeperateState == "off" && CustomPaintingsConfig.HostControl.Value) || (!CustomPaintingsConfig.HostControl.Value && !CustomPaintingsConfig.SeperateImages.Value)) { activeScene2 = SceneManager.GetActiveScene(); GameObject[] rootGameObjects = ((Scene)(ref activeScene2)).GetRootGameObjects(); for (int i = 0; i < rootGameObjects.Length; i++) { MeshRenderer[] componentsInChildren = rootGameObjects[i].GetComponentsInChildren<MeshRenderer>(); foreach (MeshRenderer val in componentsInChildren) { Material[] sharedMaterials = ((Renderer)val).sharedMaterials; for (int k = 0; k < sharedMaterials.Length; k++) { num++; string key = ((Object)sharedMaterials[k]).name.Trim(); if (CustomPaintingsGroupList.MaterialNameToGroup.TryGetValue(key, out var value) && (Object)(object)sharedMaterials[k] != (Object)null && value.Contains(ImageMode) && !((Object)sharedMaterials[k]).name.Contains("Painting Frame Vertical Gold") && !((Object)sharedMaterials[k]).name.Contains("Painting Frame Horizontal Gold") && loader.LoadedMaterials.Count > 0) { int index = Mathf.Abs((Seed + paintingsChangedCount) % loader.LoadedMaterials.Count); sharedMaterials[k] = loader.LoadedMaterials[index]; paintingsChangedCount++; } } ((Renderer)val).sharedMaterials = sharedMaterials; } } } else { if ((!CustomPaintingsConfig.SeperateImages.Value || !(SeperateState == "Singleplayer")) && (!(SeperateState == "on") || !CustomPaintingsConfig.HostControl.Value) && (CustomPaintingsConfig.HostControl.Value || !CustomPaintingsConfig.SeperateImages.Value)) { return; } activeScene2 = SceneManager.GetActiveScene(); GameObject[] rootGameObjects = ((Scene)(ref activeScene2)).GetRootGameObjects(); for (int i = 0; i < rootGameObjects.Length; i++) { MeshRenderer[] componentsInChildren = rootGameObjects[i].GetComponentsInChildren<MeshRenderer>(); foreach (MeshRenderer val2 in componentsInChildren) { Material[] sharedMaterials2 = ((Renderer)val2).sharedMaterials; for (int l = 0; l < sharedMaterials2.Length; l++) { num++; string key2 = ((Object)sharedMaterials2[l]).name.Trim(); if (CustomPaintingsGroupList.MaterialNameToGroup.TryGetValue(key2, out var value2) && (Object)(object)sharedMaterials2[l] != (Object)null && value2.Contains(ImageMode)) { if (((Object)sharedMaterials2[l]).name.Contains("Painting Frame Vertical Gold") || ((Object)sharedMaterials2[l]).name.Contains("Painting Frame Horizontal Gold")) { continue; } if (value2.Contains("Landscape")) { int index2 = Mathf.Abs((Seed + LandscapeChangedCount) % loader.MaterialGroups["Landscape"].Count); sharedMaterials2[l] = loader.MaterialGroups["Landscape"][index2]; LandscapeChangedCount++; } else if (value2.Contains("Square")) { int index3 = Mathf.Abs((Seed + SquareChangedCount) % loader.MaterialGroups["Square"].Count); sharedMaterials2[l] = loader.MaterialGroups["Square"][index3]; SquareChangedCount++; } else if (value2.Contains("Portrait")) { int index4 = Mathf.Abs((Seed + PortraitChangedCount) % loader.MaterialGroups["Portrait"].Count); sharedMaterials2[l] = loader.MaterialGroups["Portrait"][index4]; PortraitChangedCount++; } } ((Renderer)val2).sharedMaterials = sharedMaterials2; } } } logger.LogInfo($"Total materials checked: {num}"); logger.LogInfo($"Total paintings changed in this scene: {LandscapeChangedCount + SquareChangedCount + PortraitChangedCount}"); } } public void SetState(ModState newState) { currentState = newState; logger.LogInfo($"Mod state set to: {currentState}"); } } public class CustomPaintingsSync : MonoBehaviourPunCallbacks, IOnEventCallback { private readonly Logger logger; public const byte SeedEventCode = 1; public const byte SeperateStateCode = 2; public CustomPaintingsSync(Logger logger) { this.logger = logger; } public void SendSeed(int seed) { //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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) object[] array = new object[1] { seed }; logger.LogInfo("sharing seed with other clients"); RaiseEventOptions val = new RaiseEventOptions { Receivers = (ReceiverGroup)1, CachingOption = (EventCaching)4 }; PhotonNetwork.RaiseEvent((byte)1, (object)array, val, SendOptions.SendReliable); } public void SendSeperateState(string toggle) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: 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_0027: 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: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) object[] array = new object[1] { toggle }; logger.LogInfo("sharing seperation setting"); RaiseEventOptions val = new RaiseEventOptions { Receivers = (ReceiverGroup)1, CachingOption = (EventCaching)4 }; PhotonNetwork.RaiseEvent((byte)2, (object)array, val, SendOptions.SendReliable); } public void OnEvent(EventData photonEvent) { if (photonEvent.Code == 1) { int num = (int)((object[])photonEvent.CustomData)[0]; logger.LogInfo($"Received seed: {num}"); CustomPaintingsSwap.ReceivedSeed = num; } if (photonEvent.Code == 2) { string text = (string)((object[])photonEvent.CustomData)[0]; logger.LogInfo("Received seperate state: " + text); CustomPaintingsSwap.SeperateState = text; } } } public class Logger { private readonly string logFilePath; private readonly ManualLogSource logSource; public Logger(string modName) { string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); logFilePath = Path.Combine(directoryName, modName + "_log.txt"); if (File.Exists(logFilePath)) { File.Delete(logFilePath); } logSource = Logger.CreateLogSource(modName); } public void LogDebug(string message) { WriteLog("DEBUG", message); logSource.LogDebug((object)message); } public void LogInfo(string message) { WriteLog("INFO", message); logSource.LogInfo((object)message); } public void LogWarning(string message) { WriteLog("WARNING", message); logSource.LogWarning((object)message); } public void LogError(string message) { WriteLog("ERROR", message); logSource.LogError((object)message); } private void WriteLog(string level, string message) { string text = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} [{level}] {message}"; File.AppendAllText(logFilePath, text + Environment.NewLine); } public void LogMaterial(Material material) { if ((Object)(object)material != (Object)null && ((Object)material).name.ToLower().Contains("painting")) { LogInfo("Material containing 'painting': " + ((Object)material).name); } } public void ClearLog() { if (File.Exists(logFilePath)) { File.Delete(logFilePath); } } } }