mirror of
https://github.com/DorkSquadRR/DorkNet.git
synced 2026-10-25 15:08:47 -07:00
data: add 66 color variants from runtime catalog dump (566 to 632)
Runtime AvatarCatalogDumpMelon dump surfaced item->swatch pairings the static bundle scan's (slot,name) matcher missed. Kept only the 66 that map a swatch 1:1 to a single color combination (unambiguous store tile key); the remaining shared-swatch/multi-color items need a richer variant model and are deferred. Purely additive.
This commit is contained in:
@@ -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<string, Type> 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<string>();
|
|
||||||
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<DebugConsole>();
|
|
||||||
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<DebugConsole>();
|
|
||||||
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 ===");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<HomeScreenFlow>();
|
|
||||||
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<Button3D>(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<TextMeshProUGUI>(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<TextMeshProUGUI>(true);
|
|
||||||
if (tmp != null) tmp.text = label;
|
|
||||||
|
|
||||||
var command = cmd; // capture per-button
|
|
||||||
clone.OnClick.RemoveAllListeners();
|
|
||||||
clone.OnClick.AddListener(DelegateSupport.ConvertDelegate<UnityAction>((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<DebugConsoleCommandConfig>());
|
|
||||||
DevMenuMod.Log.Msg($"[devcmds] {cfgs.Length} DebugConsoleCommandConfig asset(s) loaded");
|
|
||||||
for (int c = 0; c < cfgs.Length; c++)
|
|
||||||
{
|
|
||||||
var cfg = cfgs[c].TryCast<DebugConsoleCommandConfig>();
|
|
||||||
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<Button3D> _clones = new();
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<LangVersion>latest</LangVersion>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<RootNamespace>DorkNet.DevMenu</RootNamespace>
|
|
||||||
<AssemblyName>DorkNet.DevMenu</AssemblyName>
|
|
||||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
|
||||||
<CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
|
|
||||||
<NoWarn>$(NoWarn);CS8602;CS8604;CS0436</NoWarn>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<MelonLoaderVersion Condition="'$(MelonLoaderVersion)' == ''">v0.6.6</MelonLoaderVersion>
|
|
||||||
<MelonLoaderCacheRoot>$(MSBuildThisFileDirectory)..\DorkNet.ClientMod\build\melonloader</MelonLoaderCacheRoot>
|
|
||||||
<MelonLoaderZip>$(MelonLoaderCacheRoot)\MelonLoader.x64.$(MelonLoaderVersion).zip</MelonLoaderZip>
|
|
||||||
<MelonLoaderDir Condition="'$(MelonLoaderDir)' == ''">$(MelonLoaderCacheRoot)\MelonLoader</MelonLoaderDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<Target Name="EnsureMelonLoaderReferences"
|
|
||||||
BeforeTargets="ResolveAssemblyReferences"
|
|
||||||
Condition="!Exists('$(MelonLoaderDir)\net6\MelonLoader.dll')">
|
|
||||||
<MakeDir Directories="$(MelonLoaderCacheRoot)" />
|
|
||||||
<DownloadFile
|
|
||||||
SourceUrl="https://github.com/LavaGang/MelonLoader/releases/download/$(MelonLoaderVersion)/MelonLoader.x64.zip"
|
|
||||||
DestinationFolder="$(MelonLoaderCacheRoot)"
|
|
||||||
DestinationFileName="MelonLoader.x64.$(MelonLoaderVersion).zip"
|
|
||||||
SkipUnchangedFiles="true" />
|
|
||||||
<Unzip SourceFiles="$(MelonLoaderZip)"
|
|
||||||
DestinationFolder="$(MelonLoaderCacheRoot)"
|
|
||||||
OverwriteReadOnlyFiles="true" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="MelonLoader">
|
|
||||||
<HintPath>$(MelonLoaderDir)\net6\MelonLoader.dll</HintPath>
|
|
||||||
<Private>false</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="0Harmony">
|
|
||||||
<HintPath>$(MelonLoaderDir)\net6\0Harmony.dll</HintPath>
|
|
||||||
<Private>false</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Il2CppInterop.Runtime">
|
|
||||||
<HintPath>$(MelonLoaderDir)\net6\Il2CppInterop.Runtime.dll</HintPath>
|
|
||||||
<Private>false</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Il2CppInterop.Common">
|
|
||||||
<HintPath>$(MelonLoaderDir)\net6\Il2CppInterop.Common.dll</HintPath>
|
|
||||||
<Private>false</Private>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<Il2CppAsmDir Condition="'$(Il2CppAsmDir)' == ''">C:\Users\Alexa\Downloads\DorkRoom-2020.12\MelonLoader\Il2CppAssemblies</Il2CppAsmDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup Condition="Exists('$(Il2CppAsmDir)')">
|
|
||||||
<Reference Include="Assembly-CSharp"><HintPath>$(Il2CppAsmDir)\Assembly-CSharp.dll</HintPath><Private>false</Private></Reference>
|
|
||||||
<Reference Include="Il2Cppmscorlib"><HintPath>$(Il2CppAsmDir)\Il2Cppmscorlib.dll</HintPath><Private>false</Private></Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule"><HintPath>$(Il2CppAsmDir)\UnityEngine.CoreModule.dll</HintPath><Private>false</Private></Reference>
|
|
||||||
<Reference Include="UnityEngine.UI"><HintPath>$(Il2CppAsmDir)\UnityEngine.UI.dll</HintPath><Private>false</Private></Reference>
|
|
||||||
<Reference Include="UnityEngine.InputLegacyModule"><HintPath>$(Il2CppAsmDir)\UnityEngine.InputLegacyModule.dll</HintPath><Private>false</Private></Reference>
|
|
||||||
<Reference Include="Unity.TextMeshPro"><HintPath>$(Il2CppAsmDir)\Unity.TextMeshPro.dll</HintPath><Private>false</Private></Reference>
|
|
||||||
<Reference Include="Il2CppRecRoom.Promises.Runtime"><HintPath>$(Il2CppAsmDir)\Il2CppRecRoom.Promises.Runtime.dll</HintPath><Private>false</Private></Reference>
|
|
||||||
<Reference Include="Il2CppRecRoom.Datastructures.Runtime"><HintPath>$(Il2CppAsmDir)\Il2CppRecRoom.Datastructures.Runtime.dll</HintPath><Private>false</Private></Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"EnableDebugConsole": false,
|
|
||||||
"DebugConsoleToggleKey": "BackQuote",
|
|
||||||
"DiagnoseDevMenu": false,
|
|
||||||
"EnableDevWatchButton": false,
|
|
||||||
"DevCommands": [
|
|
||||||
"Help=help",
|
|
||||||
"Fly=fly",
|
|
||||||
"NoClip=noclip"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -5093,6 +5093,600 @@
|
|||||||
"item_guid": "75-HXZBOAEiDBqclnOn8YQ",
|
"item_guid": "75-HXZBOAEiDBqclnOn8YQ",
|
||||||
"item_outfit_type": 102,
|
"item_outfit_type": 102,
|
||||||
"mask_guid": ""
|
"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": [
|
"unmatched": [
|
||||||
|
|||||||
Reference in New Issue
Block a user