diff --git a/DorkNet.DevMenu/DevMenuMod.cs b/DorkNet.DevMenu/DevMenuMod.cs deleted file mode 100644 index c1619ad..0000000 --- a/DorkNet.DevMenu/DevMenuMod.cs +++ /dev/null @@ -1,290 +0,0 @@ -using HarmonyLib; -using Il2CppRecRoom.Debugging; -using MelonLoader; -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Text.Json; -using UnityEngine; -using UObject = UnityEngine.Object; - -[assembly: MelonInfo(typeof(DorkNet.DevMenu.DevMenuMod), "DorkNet DevMenu", "1.0.0", "Dork Squad")] -[assembly: MelonGame(null, null)] - -namespace DorkNet.DevMenu; - -public class DevMenuMod : MelonMod -{ - internal static MelonLogger.Instance Log => Instance!.LoggerInstance; - internal static DevMenuMod? Instance; - internal HarmonyLib.Harmony PatchHarmony => HarmonyInstance; - private static readonly Dictionary ResolvedTypeCache = new(); - - public static class Cfg - { - public static bool EnableDebugConsole = false; - public static string DebugConsoleToggleKey = "BackQuote"; - public static bool DiagnoseDevMenu = false; - public static bool EnableDevWatchButton = false; - public static string[] DevCommands = { "Help=help", "Fly=fly", "NoClip=noclip" }; - } - - public override void OnInitializeMelon() - { - Instance = this; - Log.Msg("=== DorkNet DevMenu loading ==="); - LoadConfig(); - - if (Cfg.EnableDebugConsole) - { - foreach (var m in new[] { "OnTimeCheatDetected", "OnObscuredTypeCheatDetected", "OnHeightCheatDetected", "OnAdvancedMovementCheatDetected" }) - TryPatchByName("CheatManager", m, prefix: nameof(DebugConsolePatches.SuppressCheatDetected_Prefix)); - Log.Msg($"[debugconsole] enabled; press '{Cfg.DebugConsoleToggleKey}' to toggle the console."); - } - } - - public override void OnUpdate() - { - if (Cfg.EnableDebugConsole) DebugConsolePatches.PollToggleKey(); - if (Cfg.DiagnoseDevMenu) DevMenuProbe.Tick(); - if (Cfg.EnableDevWatchButton) DevWatchButton.Tick(); - } - - private static void LoadConfig() - { - try - { - var modDll = Assembly.GetExecutingAssembly().Location; - var modsDir = Path.GetDirectoryName(modDll) ?? string.Empty; - var gameDir = Path.GetDirectoryName(modsDir) ?? string.Empty; - var userData = Path.Combine(gameDir, "MelonLoader", "UserData"); - Directory.CreateDirectory(userData); - - var devPath = Path.Combine(userData, "dorknet-devmenu.json"); - var legacyPath = Path.Combine(userData, "dorknet-clientmod.json"); - var path = File.Exists(devPath) ? devPath : legacyPath; - if (!File.Exists(path)) - { - Log.Msg($"[config] no dev config found; all dev menu features disabled"); - return; - } - - var doc = JsonDocument.Parse(File.ReadAllText(path)); - var r = doc.RootElement; - if (r.TryGetProperty("EnableDebugConsole", out var v)) Cfg.EnableDebugConsole = v.GetBoolean(); - if (r.TryGetProperty("DebugConsoleToggleKey", out v)) Cfg.DebugConsoleToggleKey = v.GetString() ?? Cfg.DebugConsoleToggleKey; - if (r.TryGetProperty("DiagnoseDevMenu", out v)) Cfg.DiagnoseDevMenu = v.GetBoolean(); - if (r.TryGetProperty("EnableDevWatchButton", out v)) Cfg.EnableDevWatchButton = v.GetBoolean(); - if (r.TryGetProperty("DevCommands", out v) && v.ValueKind == JsonValueKind.Array) - { - var list = new List(); - foreach (var e in v.EnumerateArray()) - { - var s = e.GetString(); - if (!string.IsNullOrWhiteSpace(s)) list.Add(s!); - } - if (list.Count > 0) Cfg.DevCommands = list.ToArray(); - } - - Log.Msg($"[config] loaded {Path.GetFileName(path)}: debugConsole={Cfg.EnableDebugConsole}, devWatchButton={Cfg.EnableDevWatchButton}, diagnose={Cfg.DiagnoseDevMenu}"); - } - catch (Exception ex) - { - Log.Warning($"[config] load failed, using disabled defaults: {ex.Message}"); - } - } - - private bool TryPatchByName(string typeName, string methodName, Type[]? args = null, string? prefix = null, string? postfix = null) - { - try - { - var type = ResolveType(typeName); - if (type is null) - { - Log.Warning($"[patch-miss] {typeName}.{methodName}: type not found"); - return false; - } - - var method = args is null - ? AccessTools.Method(type, methodName) - : AccessTools.Method(type, methodName, args); - if (method is null) - { - Log.Warning($"[patch-miss] {typeName}.{methodName}: method not found"); - return false; - } - - HarmonyMethod? pre = prefix is null ? null : new HarmonyMethod(GetPatchMethod(prefix)); - HarmonyMethod? post = postfix is null ? null : new HarmonyMethod(GetPatchMethod(postfix)); - Instance!.PatchHarmony.Patch(method, pre, post); - Log.Msg($"[patch-ok] {typeName}.{methodName}"); - return true; - } - catch (Exception ex) - { - Log.Warning($"[patch-fail] {typeName}.{methodName}: {ex.GetType().Name}: {ex.Message}"); - return false; - } - } - - private static MethodInfo GetPatchMethod(string name) - { - foreach (var holder in new[] { typeof(DebugConsolePatches) }) - { - var m = holder.GetMethod(name, BindingFlags.Public | BindingFlags.Static); - if (m is not null) return m; - } - throw new MissingMethodException($"patch method '{name}' not found"); - } - - internal static Type? ResolveType(string requested) - { - if (ResolvedTypeCache.TryGetValue(requested, out var cached)) return cached; - foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) - { - Type? found = null; - try - { - found = asm.GetType(requested, throwOnError: false) - ?? asm.GetType("Il2Cpp" + requested, throwOnError: false); - if (found is null) - { - foreach (var t in asm.GetTypes()) - { - if (t.FullName == requested || - t.Name == requested || - t.FullName?.EndsWith("." + requested, StringComparison.Ordinal) == true || - t.FullName?.EndsWith(".Il2Cpp" + requested, StringComparison.Ordinal) == true) - { - found = t; - break; - } - } - } - } - catch { } - - if (found is null) continue; - ResolvedTypeCache[requested] = found; - return found; - } - return null; - } -} - -internal static class DebugConsolePatches -{ - private static bool _consoleVisible; - private static bool _warned; - private static KeyCode _toggleKey = KeyCode.BackQuote; - private static bool _keyParsed; - private static MethodInfo? _toggleMethod; - - public static bool SuppressCheatDetected_Prefix() => false; - - public static void PollToggleKey() - { - try - { - if (!_keyParsed) - { - _keyParsed = true; - if (!Enum.TryParse(DevMenuMod.Cfg.DebugConsoleToggleKey, ignoreCase: true, out _toggleKey)) - { - _toggleKey = KeyCode.BackQuote; - DevMenuMod.Log.Warning($"[debugconsole] invalid key '{DevMenuMod.Cfg.DebugConsoleToggleKey}', defaulting to BackQuote"); - } - } - - if (Input.GetKeyDown(_toggleKey)) - { - Toggle(); - } - } - catch (Exception ex) - { - if (!_warned) - { - _warned = true; - DevMenuMod.Log.Warning($"[debugconsole] poll failed: {ex.Message}"); - } - } - } - - private static void Toggle() - { - try - { - var console = UObject.FindObjectOfType(); - if (console == null) - { - DevMenuMod.Log.Warning("[debugconsole] no live DebugConsole in scene"); - return; - } - - _toggleMethod ??= AccessTools.Method(typeof(DebugConsole), "ShowInputField", new[] { typeof(bool) }) - ?? AccessTools.Method(typeof(DebugConsole), "MCNBJFECHLJ", new[] { typeof(bool) }) - ?? FindToggleByShape(typeof(DebugConsole)); - if (_toggleMethod is null) - { - DevMenuMod.Log.Warning("[debugconsole] show/hide method not found"); - return; - } - - _consoleVisible = !_consoleVisible; - _toggleMethod.Invoke(console, new object[] { _consoleVisible }); - DevMenuMod.Log.Msg($"[debugconsole] {(_consoleVisible ? "opened" : "closed")}"); - } - catch (Exception ex) - { - DevMenuMod.Log.Warning($"[debugconsole] toggle failed: {ex.Message}"); - } - } - - private static MethodInfo? FindToggleByShape(Type t) - { - MethodInfo? found = null; - foreach (var m in t.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)) - { - if (m.ReturnType != typeof(void)) continue; - var ps = m.GetParameters(); - if (ps.Length != 1 || ps[0].ParameterType != typeof(bool)) continue; - if (m.Name.StartsWith("set_", StringComparison.Ordinal)) continue; - if (m.IsDefined(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), false)) continue; - if (found is not null) return null; - found = m; - } - return found; - } -} - -internal static class DevMenuProbe -{ - private static int _frame; - private static bool _done; - - public static void Tick() - { - if (_done) return; - _frame++; - if (_frame < 180) return; - _done = true; - - var homeType = DevMenuMod.ResolveType("AGUI.StackedUI.HomeScreenFlow") ?? DevMenuMod.ResolveType("HomeScreenFlow"); - var consoleType = DevMenuMod.ResolveType("RecRoom.Debugging.DebugConsole") ?? typeof(DebugConsole); - DevMenuMod.Log.Msg("=== [devmenu-probe] runtime dev-menu state ==="); - DevMenuMod.Log.Msg($"[devmenu-probe] HomeScreenFlow type: {(homeType is null ? "NOT FOUND" : homeType.FullName)}"); - DevMenuMod.Log.Msg($"[devmenu-probe] DebugConsole type: {(consoleType is null ? "NOT FOUND" : consoleType.FullName)}"); - try - { - var console = UObject.FindObjectOfType(); - DevMenuMod.Log.Msg($"[devmenu-probe] DebugConsole live instance: {(console == null ? "null" : "FOUND")}"); - } - catch (Exception ex) - { - DevMenuMod.Log.Warning($"[devmenu-probe] console instance probe failed: {ex.Message}"); - } - DevMenuMod.Log.Msg("=== [devmenu-probe] done ==="); - } -} diff --git a/DorkNet.DevMenu/DevWatchButton.cs b/DorkNet.DevMenu/DevWatchButton.cs deleted file mode 100644 index c899427..0000000 --- a/DorkNet.DevMenu/DevWatchButton.cs +++ /dev/null @@ -1,124 +0,0 @@ -// Native watch "Dev Console" injection — typed against the per-install Il2Cpp -// interop assemblies (referenced in the csproj, dev-tools only, never shipped). -// Pure reflection couldn't drive this build's watch UI (FindObjectOfType / -// property-get / GetComponentsInChildren all failed under Il2CppInterop), so -// we use real types here: clone an existing watch Button3D, relabel it, and -// wire its OnClick to run console commands via DebugConsole.Execute (which -// works headless even though the console UI isn't in the scene). It's the -// game's own Button3D, so it's interactable with the VR laser AND the -// Screen-Mode mouse. Gated behind Cfg.EnableDevWatchButton. -using System; -using Il2CppInterop.Runtime; -using Il2CppAGUI.StackedUI; -using Il2CppRecRoom.Debugging; -using Il2CppTMPro; -using UnityEngine.Events; -using UObject = UnityEngine.Object; - -namespace DorkNet.DevMenu; - -internal static class DevWatchButton -{ - private static int _frame; - private static bool _done; - - // Polled from Mod.OnUpdate while Cfg.EnableDevWatchButton is set. Waits for - // the watch's HomeScreenFlow to exist, then injects once. - public static void Tick() - { - if (_done) return; - _frame++; - if (_frame < 120 || (_frame % 30) != 0) return; // settle, then ~2/s - var home = UObject.FindObjectOfType(); - if (home == null && _frame < 3600) return; // wait for the watch - _done = true; - if (home == null) { DevMenuMod.Log.Warning("[devbtn] HomeScreenFlow never appeared"); return; } - try { Inject(home); } - catch (Exception ex) { DevMenuMod.Log.Warning($"[devbtn] inject failed: {ex}"); } - } - - private static void Inject(HomeScreenFlow home) - { - var buttons = home.GetComponentsInChildren(true); - if (buttons == null || buttons.Length == 0) - { - DevMenuMod.Log.Warning("[devbtn] no Button3D found under HomeScreenFlow"); - return; - } - - // Prefer a source button that HAS a TMP label, so our clones can be - // relabeled (HomeButton etc. are icon-only — no text child). - Button3D? src = null; - for (int i = 0; i < buttons.Length; i++) - if (buttons[i].GetComponentInChildren(true) != null) { src = buttons[i]; break; } - bool labeled = src != null; - if (src == null) src = buttons[0]; // fall back: inject anyway, just no text - DevMenuMod.Log.Msg($"[devbtn] {buttons.Length} watch buttons; clone source='{src.name}' labeled={labeled}"); - - int n = 0; - foreach (var (label, cmd) in ParsePresets()) - { - var clone = UObject.Instantiate(src, src.transform.parent); - clone.name = $"DorkNetDev_{label}"; - clone.gameObject.SetActive(true); - clone.transform.localScale = src.transform.localScale; - - var tmp = clone.GetComponentInChildren(true); - if (tmp != null) tmp.text = label; - - var command = cmd; // capture per-button - clone.OnClick.RemoveAllListeners(); - clone.OnClick.AddListener(DelegateSupport.ConvertDelegate((Action)(() => Run(label, command)))); - _clones.Add(clone); - n++; - } - DevMenuMod.Log.Msg($"[devbtn] injected {n} dev command button(s) into the watch bar — open the watch to use them"); - DumpCommands(); - } - - // Log the real console command names from DebugConsoleCommandConfig.Metas - // so we can set DevCommands correctly (the asset loads even though the - // console component isn't in the scene). - private static void DumpCommands() - { - try - { - var cfgs = UObject.FindObjectsOfTypeAll(Il2CppType.Of()); - DevMenuMod.Log.Msg($"[devcmds] {cfgs.Length} DebugConsoleCommandConfig asset(s) loaded"); - for (int c = 0; c < cfgs.Length; c++) - { - var cfg = cfgs[c].TryCast(); - var metas = cfg?.Metas; - if (metas == null) continue; - DevMenuMod.Log.Msg($"[devcmds] {metas.Count} command(s):"); - for (int i = 0; i < metas.Count; i++) - { - var m = metas[i]; - DevMenuMod.Log.Msg($" {m.MethodName} ({m.DeclaringType})"); - } - } - } - catch (Exception ex) { DevMenuMod.Log.Warning($"[devcmds] failed: {ex.Message}"); } - } - - private static void Run(string label, string command) - { - DevMenuMod.Log.Msg($"[devbtn] '{label}' -> DebugConsole.Execute(\"{command}\")"); - try { DebugConsole.Execute(command); } - catch (Exception ex) { DevMenuMod.Log.Warning($"[devbtn] Execute('{command}') failed: {ex.Message}"); } - } - - // Presets come from Cfg.DevCommands as "Label=command" strings. - private static System.Collections.Generic.IEnumerable<(string label, string cmd)> ParsePresets() - { - foreach (var entry in DevMenuMod.Cfg.DevCommands) - { - if (string.IsNullOrWhiteSpace(entry)) continue; - var eq = entry.IndexOf('='); - if (eq > 0) yield return (entry.Substring(0, eq).Trim(), entry.Substring(eq + 1).Trim()); - else yield return (entry.Trim(), entry.Trim()); - } - } - - private static readonly System.Collections.Generic.List _clones = new(); -} diff --git a/DorkNet.DevMenu/DorkNet.DevMenu.csproj b/DorkNet.DevMenu/DorkNet.DevMenu.csproj deleted file mode 100644 index dd3d467..0000000 --- a/DorkNet.DevMenu/DorkNet.DevMenu.csproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - net6.0 - latest - enable - DorkNet.DevMenu - DorkNet.DevMenu - false - false - $(NoWarn);CS8602;CS8604;CS0436 - - - - v0.6.6 - $(MSBuildThisFileDirectory)..\DorkNet.ClientMod\build\melonloader - $(MelonLoaderCacheRoot)\MelonLoader.x64.$(MelonLoaderVersion).zip - $(MelonLoaderCacheRoot)\MelonLoader - - - - - - - - - - - $(MelonLoaderDir)\net6\MelonLoader.dll - false - - - $(MelonLoaderDir)\net6\0Harmony.dll - false - - - $(MelonLoaderDir)\net6\Il2CppInterop.Runtime.dll - false - - - $(MelonLoaderDir)\net6\Il2CppInterop.Common.dll - false - - - - - C:\Users\Alexa\Downloads\DorkRoom-2020.12\MelonLoader\Il2CppAssemblies - - - $(Il2CppAsmDir)\Assembly-CSharp.dllfalse - $(Il2CppAsmDir)\Il2Cppmscorlib.dllfalse - $(Il2CppAsmDir)\UnityEngine.CoreModule.dllfalse - $(Il2CppAsmDir)\UnityEngine.UI.dllfalse - $(Il2CppAsmDir)\UnityEngine.InputLegacyModule.dllfalse - $(Il2CppAsmDir)\Unity.TextMeshPro.dllfalse - $(Il2CppAsmDir)\Il2CppRecRoom.Promises.Runtime.dllfalse - $(Il2CppAsmDir)\Il2CppRecRoom.Datastructures.Runtime.dllfalse - - - diff --git a/DorkNet.DevMenu/dorknet-devmenu.json.template b/DorkNet.DevMenu/dorknet-devmenu.json.template deleted file mode 100644 index 4e7a05d..0000000 --- a/DorkNet.DevMenu/dorknet-devmenu.json.template +++ /dev/null @@ -1,11 +0,0 @@ -{ - "EnableDebugConsole": false, - "DebugConsoleToggleKey": "BackQuote", - "DiagnoseDevMenu": false, - "EnableDevWatchButton": false, - "DevCommands": [ - "Help=help", - "Fly=fly", - "NoClip=noclip" - ] -} diff --git a/DorkNet.Server/Data/color_variants.json b/DorkNet.Server/Data/color_variants.json index d2de622..2d97a26 100644 --- a/DorkNet.Server/Data/color_variants.json +++ b/DorkNet.Server/Data/color_variants.json @@ -5093,6 +5093,600 @@ "item_guid": "75-HXZBOAEiDBqclnOn8YQ", "item_outfit_type": 102, "mask_guid": "" + }, + { + "swatch_name": "Astronaut_Shirt_Orange_Swatch", + "swatch_guid": "YSrGwXybGEqaqHNCS64qOA", + "color": "Astronaut_Shirt_Orange", + "item_name": "(AstronautTorso)", + "item_guid": "ec5255d5-edaf-4888-9fe1-e89ac0e0d300", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "PoolFloatie_Belt_BirdHead_Dino_Swatch", + "swatch_guid": "GtoHkTpyA0iGIHsxphwivg", + "color": "BirdHead_Dino", + "item_name": "(Belt_PoolFloatie_BirdHead)", + "item_guid": "EJFGAW-TnUCaeD59parEHg", + "item_outfit_type": 102, + "mask_guid": "" + }, + { + "swatch_name": "PoolFloatie_Belt_BirdHead_Parrot_Swatch", + "swatch_guid": "qZzkrGXpPkGq_nnGLZorwA", + "color": "BirdHead_Parrot", + "item_name": "(Belt_PoolFloatie_BirdHead)", + "item_guid": "EJFGAW-TnUCaeD59parEHg", + "item_outfit_type": 102, + "mask_guid": "" + }, + { + "swatch_name": "PoolFloatie_Belt_BirdHead_RubberDucky_Swatch", + "swatch_guid": "Uyn3QOl1zkGR2_OUOhNWjQ", + "color": "BirdHead_RubberDucky", + "item_name": "(Belt_PoolFloatie_BirdHead)", + "item_guid": "EJFGAW-TnUCaeD59parEHg", + "item_outfit_type": 102, + "mask_guid": "" + }, + { + "swatch_name": "BikeJersey_Shirt_Black_Swatch", + "swatch_guid": "1695608b-e9cc-4a03-b56d-0f09d2804379", + "color": "BikeJersey_Shirt_Black", + "item_name": "(BikeJacket)", + "item_guid": "843e3364-a743-4dfc-a990-0436e47b8c10", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "CheerDress_Shirt_FloralGreen_Swatch", + "swatch_guid": "F9vYkdcuGUOSGEg0wpQt2Q", + "color": "CheerDress_Shirt_FloralGreen", + "item_name": "(BlackCheerDress)", + "item_guid": "b02053b3-013f-42b0-8881-85f5be2b8cda", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "SolidColor_Black_Swatch", + "swatch_guid": "0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd", + "color": "SolidColor_Black", + "item_name": "(Bowtie)", + "item_guid": "83be5ba4-525a-4781-a5f6-839c22e4d1d3", + "item_outfit_type": 103, + "mask_guid": "" + }, + { + "swatch_name": "Plaid_Red_Swatch", + "swatch_guid": "cf119781-5bd9-4b85-9a0b-12e82e988c23", + "color": "Plaid_Red", + "item_name": "(CowboyScarf)", + "item_guid": "5accb7dc-90a3-46ee-bad2-8fd1861d50f1", + "item_outfit_type": 103, + "mask_guid": "" + }, + { + "swatch_name": "FormalDress_Shirt_Black_Swatch", + "swatch_guid": "JmFzNL5v_0q1p0bgoOlBpQ", + "color": "Shirt_Black", + "item_name": "(Dress_FormalDress)", + "item_guid": "30380607-8b54-4b63-81d3-cb3f08e452c1", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "FormalDress_Shirt_Patchwork_Swatch", + "swatch_guid": "EqNosRGf5U-5P1nKIRV3fw", + "color": "Shirt_Patchwork", + "item_name": "(Dress_FormalDress)", + "item_guid": "30380607-8b54-4b63-81d3-cb3f08e452c1", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "MoonandStarsDress_Shirt_Snowflakes_Swatch", + "swatch_guid": "Gruqp7EGM0WJbAM_F8hWbQ", + "color": "Shirt_Snowflakes", + "item_name": "(Dress_MoonandStarsDress)", + "item_guid": "936d7126-a3b7-48a2-bceb-6cad9221b267", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "SuperheroDress_Shirt_Green_Swatch", + "swatch_guid": "a3I7EyRNVUilLfE6hriYtw", + "color": "Shirt_Green", + "item_name": "(Dress_SuperheroDress)", + "item_guid": "1988692c-aae3-450b-acd6-e9015b831f5c", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "Recpods_Ear_White_Swatch", + "swatch_guid": "3CLmVNB_p0Gd5N8dN74TBw", + "color": "White", + "item_name": "(Ear_RecpodEarringHead)", + "item_guid": "9656a307-0c79-4b8f-910f-e67c454faefb", + "item_outfit_type": 3, + "mask_guid": "" + }, + { + "swatch_name": "MardiGras_Eye_DarkBlue_Swatch", + "swatch_guid": "UQe6v62i6ESImdpc7gB_8w", + "color": "DarkBlue", + "item_name": "(Eye_MardiGrasEyes)", + "item_guid": "eb830b12-c1b5-4796-b9cf-ccf0f0e1d4f1", + "item_outfit_type": 10, + "mask_guid": "" + }, + { + "swatch_name": "MardiGras2_Eye_Teal_Swatch", + "swatch_guid": "Ulie-RkcJEmblLyoucx-JA", + "color": "Teal", + "item_name": "(Eye_MardiGrasEyes2)", + "item_guid": "43354e59-4938-44bc-81e0-4fba47d0ac12", + "item_outfit_type": 10, + "mask_guid": "" + }, + { + "swatch_name": "Scallywag_Eye_SRank_Swatch", + "swatch_guid": "DE1C-RJkuEWIvpR0q1i42g", + "color": "SRank", + "item_name": "(Eye_Pirate_Eyepatch)", + "item_guid": "e1a13235-e3b3-4b39-8e6f-e6449d4321b7", + "item_outfit_type": 10, + "mask_guid": "" + }, + { + "swatch_name": "SciFiVisor_Eye_Orange_Swatch", + "swatch_guid": "uB4gFxfrh0W5OtkmZdFN1Q", + "color": "Orange", + "item_name": "(Eye_SciFiVisor_Contest)", + "item_guid": "KNZ1DvCLC0WHyH4opYAXtw", + "item_outfit_type": 10, + "mask_guid": "" + }, + { + "swatch_name": "SnowyOwlMask_Eye_RavenBlue_Swatch", + "swatch_guid": "UAeSz-XeZUaZsk9FNlPX5w", + "color": "RavenBlue", + "item_name": "(Eye_SnowyOwlHead)", + "item_guid": "771863b6-70d1-4f48-9c64-c621ce0fea46", + "item_outfit_type": 10, + "mask_guid": "" + }, + { + "swatch_name": "SnowyOwlMask_Eye_Red_Swatch", + "swatch_guid": "Cq8BOWcHb0GTDLvXl1iIcg", + "color": "Red", + "item_name": "(Eye_SnowyOwlHead)", + "item_guid": "771863b6-70d1-4f48-9c64-c621ce0fea46", + "item_outfit_type": 10, + "mask_guid": "" + }, + { + "swatch_name": "FirefighterShirt_Shirt_Tan_Swatch", + "swatch_guid": "vYAcZMymO0m6bCNQIsI8rQ", + "color": "FirefighterShirt_Shirt_Tan", + "item_name": "(FirefighterTorso)", + "item_guid": "1b37d6cd-0a89-4604-a046-e5cff55b0cf6", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "Baseball_Hat_LogoBucketeers_Swatch", + "swatch_guid": "SroEVC6vBkG42ILwCtKB9w", + "color": "LogoBucketeers", + "item_name": "(Hat_BaseBall_FlatBill)", + "item_guid": "474db08a-d4dc-4625-9f5a-1a6ae0b70827", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "Baseball_Hat_LogoGoblins_Swatch", + "swatch_guid": "_yznwUwL80ejrS3vki0IKg", + "color": "LogoGoblins", + "item_name": "(Hat_BaseBall_FlatBill)", + "item_guid": "474db08a-d4dc-4625-9f5a-1a6ae0b70827", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "Baseball_Hat_LogoRamen_Swatch", + "swatch_guid": "Mrf17aidXEeCF-fFURUUcQ", + "color": "LogoRamen", + "item_name": "(Hat_BaseBall_FlatBill)", + "item_guid": "474db08a-d4dc-4625-9f5a-1a6ae0b70827", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "BogMonster_Hat_Contest_Swatch", + "swatch_guid": "bCuW1YadE06p6v1dBHsx4w", + "color": "Contest", + "item_name": "(Hat_BogMonsterHat)", + "item_guid": "20b424a9-861a-4d39-a583-22d7b7348c14", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "IceQueenCrown_Hat_Lilac_Swatch", + "swatch_guid": "zMXDVNsKn0GhVd2Tjho0-g", + "color": "Lilac", + "item_name": "(Hat_IceQueen)", + "item_guid": "W7AJ4UYlVkWF5nLbmpmRBg", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "Raincoat_Hat_Contest_Swatch", + "swatch_guid": "qC66Hu6yKEu2Res2o2z1Kw", + "color": "Contest", + "item_name": "(Hat_Rainhat)", + "item_guid": "2bd53190-46f8-4956-9388-87c5a04efc4f", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "Baseball_Hat_BotFace_Swatch", + "swatch_guid": "-apO3Y7om0GKhC4V_hVYdQ", + "color": "BotFace", + "item_name": "(Hat_Ref_BotFace)", + "item_guid": "ee9a7c8a-7383-4a09-b44c-474b66f9008a", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "TruckerCap_Hat_Red_Swatch", + "swatch_guid": "uiAwVt3HK0mRVtWp9B-gTg", + "color": "Red", + "item_name": "(Hat_TruckerHat)", + "item_guid": "ReqOfohe6UamzaiHG1x3Ow", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "Plaid_LightBlue_Swatch", + "swatch_guid": "cf119781-5bd9-4b85-9a0b-12e82e988c23", + "color": "Plaid_LightBlue", + "item_name": "(LongScarf)", + "item_guid": "6b9e022c-0b68-48fd-8eca-da8573c18900", + "item_outfit_type": 103, + "mask_guid": "" + }, + { + "swatch_name": "Luchador_Shirt_GreenGold_Swatch", + "swatch_guid": "-IgxYllxkEyr7V1gosWXUA", + "color": "Luchador_Shirt_GreenGold", + "item_name": "(LuchadorTorso)", + "item_guid": "9c34c2c1-07d7-4180-94a2-be8c9caaae84", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "Luchador_Shirt_Tiger_Swatch", + "swatch_guid": "-_ViYCHHRUip7oN_AnH0Og", + "color": "Luchador_Shirt_Tiger", + "item_name": "(LuchadorTorso)", + "item_guid": "9c34c2c1-07d7-4180-94a2-be8c9caaae84", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "PoolFloatie_Belt_Turtle_Penguin_Swatch", + "swatch_guid": "QppxPdf550-jT7dK7XrTzw", + "color": "PoolFloatie_Belt_Turtle_Penguin", + "item_name": "(Neck_Belt_PoolFloatie_Turtle)", + "item_guid": "7a98503f-0460-4d25-a0d5-72a32db8f4c2", + "item_outfit_type": 102, + "mask_guid": "" + }, + { + "swatch_name": "BowtieSequin_Neck_Tileable_Red_Swatch", + "swatch_guid": "0R3Mh96tS0631EZYs03dmw", + "color": "Tileable_Red", + "item_name": "(Neck_Bowtie_Gold_Sequin)", + "item_guid": "6dd261d8-9806-4dac-81c4-a58f6d6a7f9a", + "item_outfit_type": 103, + "mask_guid": "" + }, + { + "swatch_name": "ButterflyWings_Shoulder_Agrias_Swatch", + "swatch_guid": "yViVKOLHc0qLiPw9Oy1Obg", + "color": "ButterflyWings_Shoulder_Agrias", + "item_name": "(Neck_ButterflyWings_Monarch)", + "item_guid": "c506feae-be73-437b-b18a-1152bb9906e9", + "item_outfit_type": 100, + "mask_guid": "" + }, + { + "swatch_name": "ButterflyWings_Shoulder_CairnsBirdwing_Swatch", + "swatch_guid": "GlB_scM-5kuc4A5TmGe6Yw", + "color": "ButterflyWings_Shoulder_CairnsBirdwing", + "item_name": "(Neck_ButterflyWings_Monarch)", + "item_guid": "c506feae-be73-437b-b18a-1152bb9906e9", + "item_outfit_type": 100, + "mask_guid": "" + }, + { + "swatch_name": "ButterflyWings_Shoulder_Midnight_Swatch", + "swatch_guid": "Do__oD53x0-dNtVeHsr4yA", + "color": "ButterflyWings_Shoulder_Midnight", + "item_name": "(Neck_ButterflyWings_Monarch)", + "item_guid": "c506feae-be73-437b-b18a-1152bb9906e9", + "item_outfit_type": 100, + "mask_guid": "" + }, + { + "swatch_name": "Scuba_Shoulder_Blue_Swatch", + "swatch_guid": "Uvarm_CwTUWWQYZvzI8OaQ", + "color": "Shoulder_Blue", + "item_name": "(Neck_Scuba)", + "item_guid": "5b3dc472-773e-4714-a9d0-7e7bbf6bc695", + "item_outfit_type": 100, + "mask_guid": "" + }, + { + "swatch_name": "Scuba_Shoulder_Contest_Swatch", + "swatch_guid": "4zPm9miF5UOouEWFpOxYZg", + "color": "Shoulder_Contest", + "item_name": "(Neck_Scuba)", + "item_guid": "5b3dc472-773e-4714-a9d0-7e7bbf6bc695", + "item_outfit_type": 100, + "mask_guid": "" + }, + { + "swatch_name": "SteamPunk_Shoulder_BlackandSilver_Swatch", + "swatch_guid": "ISycihytUUyoypVb-kXN_Q", + "color": "Shoulder_BlackandSilver", + "item_name": "(Neck_SteamPunk)", + "item_guid": "sOREgAGs-06CeGGsG-WIkw", + "item_outfit_type": 100, + "mask_guid": "" + }, + { + "swatch_name": "TutorialGown_Shoulder_2_Orange_Swatch", + "swatch_guid": "Q7hqvEo7DUyD9AqIOunWWA", + "color": "TutorialGown_Shoulder_2_Orange", + "item_name": "(Neck_TutorialSash_2)", + "item_guid": "vP9EKTMXP0yni8U7uCz2-g", + "item_outfit_type": 100, + "mask_guid": "" + }, + { + "swatch_name": "TutorialGown_Shoulder_3_Black_Swatch", + "swatch_guid": "YQQamy-tQkCkpZPXKepUrQ", + "color": "TutorialGown_Shoulder_3_Black", + "item_name": "(Neck_TutorialSash_3)", + "item_guid": "O8VqC11xNkSKpDh6Omp_0w", + "item_outfit_type": 100, + "mask_guid": "" + }, + { + "swatch_name": "WinterScarf_Neck_Red_Swatch", + "swatch_guid": "dUu7b-JFOky9c2lIVCNmcg", + "color": "Red", + "item_name": "(Neck_Winter)", + "item_guid": "e15b13a7-9e9a-4b32-ba2c-0cb31ed55a8c", + "item_outfit_type": 103, + "mask_guid": "" + }, + { + "swatch_name": "WinterScarf_Neck_UglySweater_Swatch", + "swatch_guid": "AKWH3_SDqkG8SRm5sauROQ", + "color": "UglySweater", + "item_name": "(Neck_Winter)", + "item_guid": "e15b13a7-9e9a-4b32-ba2c-0cb31ed55a8c", + "item_outfit_type": 103, + "mask_guid": "" + }, + { + "swatch_name": "RecTrooper_Hat_Green_Swatch", + "swatch_guid": "m-fk_L_e4EiOMUZ_UUjMjg", + "color": "RecTrooper_Hat_Green", + "item_name": "(RecTrooper_Helmet)", + "item_guid": "f833d1a7-d667-4baf-b1ff-ac82ea87eb7d", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "SantaHat_Hat_Red_Swatch", + "swatch_guid": "7KDavHUPDUKTJI0fFzJHpQ", + "color": "SantaHat_Hat_Red", + "item_name": "(SantaHat_Hat)", + "item_guid": "e005f9ab-47bc-4c5b-8c45-b0cc6c55ab1c", + "item_outfit_type": 0, + "mask_guid": "" + }, + { + "swatch_name": "50sDress_Shirt_CandyCane_Swatch", + "swatch_guid": "I_OF1c0YWESMwxJr9sXYOA", + "color": "CandyCane", + "item_name": "(Shirt_50sDressValentine)", + "item_guid": "FHKZvPFMLkO8iAIPPQzu1A", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "50sDress_Shirt_Shamrock_Swatch", + "swatch_guid": "3drRcfyKkku0qGwCy16m9Q", + "color": "Shamrock", + "item_name": "(Shirt_50sDressValentine)", + "item_guid": "FHKZvPFMLkO8iAIPPQzu1A", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "BogMonster_Shirt_Contest_Swatch", + "swatch_guid": "HQnd9m0Wi0upaXRNsE5HPQ", + "color": "Contest", + "item_name": "(Shirt_BogMonsterShirt)", + "item_guid": "dedd2e98-2721-4de6-92f2-9d399f34e8fe", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "SuspiciousGoblin_Shirt_Swatch", + "swatch_guid": "11ZEZTFhy0ONpoXb3kiewQ", + "color": "Default", + "item_name": "(Shirt_IHeartRRShirt)", + "item_guid": "97253092-90ba-4ff2-b137-6324ab244d11", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "HorizontalStripe3_Stripe3_Swatch", + "swatch_guid": "9c03f381-7357-4d0f-8cda-8737d4c43d25", + "color": "HorizontalStripe3_Stripe3", + "item_name": "(Shirt_Jersey)", + "item_guid": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "SolidColor_Blue_Swatch", + "swatch_guid": "0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd", + "color": "SolidColor_Blue", + "item_name": "(Shirt_Jersey)", + "item_guid": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "Knight_Shirt_Red_Swatch", + "swatch_guid": "51a1809d-becd-42e0-8dfb-188d6f07ba1c", + "color": "Red", + "item_name": "(Shirt_KnightTorso)", + "item_guid": "739fd42a-8a8c-44a5-afa3-e0974802c6ae", + "item_outfit_type": 101, + "mask_guid": "f5270130-6634-4052-aa3e-9849ddf5314e" + }, + { + "swatch_name": "MaleTShirt_Shirt_EarlyAccess_Swatch", + "swatch_guid": "gW2zFv0sFEmiodfw8p9P-Q", + "color": "EarlyAccess", + "item_name": "(Shirt_MaleTee_NoDecal)", + "item_guid": "b3949221-9416-4afe-8777-440f01ec4c1c", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "MaleTShirt_Shirt_RecCon_ForbiddenOne_Swatch", + "swatch_guid": "UwQiLub0-kqf4dNvQc-R0A", + "color": "RecCon_ForbiddenOne", + "item_name": "(Shirt_MaleTee_NoDecal)", + "item_guid": "b3949221-9416-4afe-8777-440f01ec4c1c", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "TruckerJacket_Shirt_Olive_Swatch", + "swatch_guid": "sxWOOK1RwUOp5YqZ7a36xg", + "color": "Olive", + "item_name": "(Shirt_SleevelessDenimJacket)", + "item_guid": "3e3f5ed5-d810-4054-b648-d93167b90033", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "TruckerJacket_Shirt_RebelRose_Swatch", + "swatch_guid": "WeyKw_WS70Cx3NZdOaxGeA", + "color": "RebelRose", + "item_name": "(Shirt_SleevelessDenimJacket)", + "item_guid": "3e3f5ed5-d810-4054-b648-d93167b90033", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "TutorialGown_Shirt_1_Purple_Swatch", + "swatch_guid": "6nmHu9zj8k-tEz0tBHblnQ", + "color": "1_Purple", + "item_name": "(Shirt_TutorialGown_1)", + "item_guid": "ASHnWS0h9kOJhbOUwxWKFQ", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "TutorialGown_Shirt_2_Orange_Swatch", + "swatch_guid": "lSDrKR69rkSFULy9GA__1w", + "color": "2_Orange", + "item_name": "(Shirt_TutorialGown_2)", + "item_guid": "MJQiQ3LATEOymxCC8wfSjw", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "Plaid_Red_Swatch", + "swatch_guid": "cf119781-5bd9-4b85-9a0b-12e82e988c23", + "color": "Plaid_Red", + "item_name": "(TiedScarf)", + "item_guid": "5d1c42a0-7e36-431a-8e78-a8b74046d153", + "item_outfit_type": 103, + "mask_guid": "" + }, + { + "swatch_name": "TuckedTee_Shirt_ClassOf2021_Swatch", + "swatch_guid": "VtepaI2fvUWhcvNmpQ8r6Q", + "color": "TuckedTee_Shirt_ClassOf2021", + "item_name": "(TuckedTee_Shirt)", + "item_guid": "618b979e-c6e6-434e-98e5-9b51e117fb69", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "TuckedTee_Shirt_Latinity_Swatch", + "swatch_guid": "2IFVtBYV8EqQXs8XHqeqdg", + "color": "TuckedTee_Shirt_Latinity", + "item_name": "(TuckedTee_Shirt)", + "item_guid": "618b979e-c6e6-434e-98e5-9b51e117fb69", + "item_outfit_type": 101, + "mask_guid": "" + }, + { + "swatch_name": "Harness_Wrist_Yellow_Swatch", + "swatch_guid": "rgzG7sfrlkqd9EO13LNmpQ", + "color": "Yellow", + "item_name": "(Wrist_HarnessGloves)", + "item_guid": "1beaf288-b5a5-475c-8149-c8f3d1146083", + "item_outfit_type": 200, + "mask_guid": "" + }, + { + "swatch_name": "IceQueenGlove_Wrist_Lilac_Swatch", + "swatch_guid": "U7jMLMX4_kKIy1K9IcHOXA", + "color": "Lilac", + "item_name": "(Wrist_IceQueen)", + "item_guid": "ilDgmey2ZUWlFiuEAN7YoQ", + "item_outfit_type": 200, + "mask_guid": "" + }, + { + "swatch_name": "WinterGlove_Wrist_UglySweater_Swatch", + "swatch_guid": "Nc6jwNeK_kyajH5xKzCNVw", + "color": "UglySweater", + "item_name": "(Wrist_Winter)", + "item_guid": "3a790be3-2937-44d4-be01-b5d65353bd3d", + "item_outfit_type": 200, + "mask_guid": "" + }, + { + "swatch_name": "SolidColor_Cream_Swatch", + "swatch_guid": "0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd", + "color": "SolidColor_Cream", + "item_name": "(Wrist_WristTape)", + "item_guid": "71921831-ba6f-408b-a00e-2fd97663636f", + "item_outfit_type": 200, + "mask_guid": "" + }, + { + "swatch_name": "RoyalCape_Shoulder_Gold_Swatch", + "swatch_guid": "PIV6RtD7Pk-UTcUp2wF1ww", + "color": "Shoulder_Gold", + "item_name": "(neck_royalCape)", + "item_guid": "a44766dc-19ad-4476-849c-5113a5faabd0", + "item_outfit_type": 100, + "mask_guid": "" } ], "unmatched": [