├── CVROSC
├── AssemblyInfo.cs
├── Extensions
│ ├── OSCConfig.cs
│ └── VRLayer.cs
├── Properties
│ └── AssemblyInfo.cs
├── CVROSC.cs
└── CVROSC.csproj
├── .gitignore
├── README.MD
├── LICENSE.TXT
└── CVROSC.sln
/CVROSC/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using MelonLoader;
2 | using CVROSC;
3 | using System.Reflection;
4 |
5 | [assembly: MelonInfo(typeof(CVROSCMod), "CVROSC", "1.6", "bribi#5940")]
6 | [assembly: MelonGame("Alpha Blend Interactive", "ChilloutVR")]
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.suo
2 | *.tmp
3 | /.vs
4 | /*.dll
5 | /*.exe
6 | /*.opensdf
7 | /*.sdf
8 | /*.suo
9 | /*.user
10 | /*.vcxproj.user
11 | /CVROSC/*.config
12 | /CVROSC/*.xml
13 | /CVROSC/*.xsd
14 | /CVROSC/bin/
15 | /CVROSC/obj/
16 | /packages/
--------------------------------------------------------------------------------
/README.MD:
--------------------------------------------------------------------------------
1 | # CVROSC
2 | Melon mod that implements Open Sound Control in ChilloutVR!
3 |
4 | https://user-images.githubusercontent.com/11065274/181604773-c77f6103-e69a-4881-8e92-abe516b521e2.mp4
5 |
6 | ### Why?
7 | Why not! Could be useful for people moving away from VRChat.
8 |
9 | I use OSC myself to display the weather on my wrist. *(And to show it to others lol!)*
10 |
11 | ### Required references
12 | - Assembly-CSharp *(from ChilloutVR's directory)*
13 | - UnityEngine.AnimationModule *(from ChilloutVR's directory)*
14 | - UnityEngine.CoreModule *(from ChilloutVR's directory)*
15 | - MelonLoader *(come on)*
16 | - Bespoke.OSC *(https://bitbucket.org/pvarcholik/bespoke.osc)*
17 | - Newtonsoft.Json *(https://www.newtonsoft.com/json)*
18 |
19 | ### Required NuGet packages
20 | - Costura for Fody *(https://github.com/Fody/Costura)*
21 |
22 | ### Developer note
23 | This mod is not supported by ABI and nor me nor the mod are in any way affiliated to the company.
24 |
25 | If you're spooked easily from mods, then don't use it! lol
--------------------------------------------------------------------------------
/LICENSE.TXT:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Riccardo Loi
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/CVROSC.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.2.32630.192
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CVROSC", "CVROSC\CVROSC.csproj", "{BA347446-0301-4160-9D74-BA117344F489}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {BA347446-0301-4160-9D74-BA117344F489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {BA347446-0301-4160-9D74-BA117344F489}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {BA347446-0301-4160-9D74-BA117344F489}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {BA347446-0301-4160-9D74-BA117344F489}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {EDAFFFB3-E7F7-4066-9370-0394728056FD}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/CVROSC/Extensions/OSCConfig.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace CVROSC
9 | {
10 | public class OSCAddress
11 | {
12 | [JsonProperty("address")]
13 | public string ParameterAddress { get; set; }
14 |
15 | [JsonProperty("type")]
16 | public string ParameterType { get; set; }
17 | }
18 |
19 | public class OSCParameter
20 | {
21 | [JsonProperty("name")]
22 | public string ParameterName { get; set; }
23 |
24 | [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "input")]
25 | public OSCAddress Input { get; set; }
26 |
27 | [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "output")]
28 | public OSCAddress Output { get; set; }
29 | }
30 |
31 | public class OSCConfig
32 | {
33 | [JsonProperty("id")]
34 | public string AvatarGUID { get; set; }
35 |
36 | [JsonProperty("name")]
37 | public string AvatarName { get; set; }
38 |
39 | [JsonProperty("parameters")]
40 | public List AvatarParameters { get; set; }
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/CVROSC/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("CVROSC")]
9 | [assembly: AssemblyDescription("OSC implementation for ChilloutVR")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("bribi")]
12 | [assembly: AssemblyProduct("CVROSC")]
13 | [assembly: AssemblyCopyright("")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("ba347446-0301-4160-9d74-ba117344f489")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/CVROSC/Extensions/VRLayer.cs:
--------------------------------------------------------------------------------
1 | using Bespoke.Osc;
2 | using System.Net;
3 | using System.Net.NetworkInformation;
4 | using System.Net.Sockets;
5 | using System.Timers;
6 | using MelonLoader;
7 | using System;
8 | using System.Collections.Generic;
9 |
10 | namespace CVROSC
11 | {
12 | public class VRLayer
13 | {
14 | // The endpoint is the target passed to the OSC message/bundle
15 | // The VRServer endpoint is the OSC server hosted by ChilloutVR
16 | // The VRClient endpoint is the OSC server hosted by this application
17 |
18 | // VR app target
19 | public IPEndPoint VRServer;
20 |
21 | // OSC app server
22 | public IPEndPoint VRClient;
23 | private OscServer VRMaster;
24 |
25 | private int InPort = 9000, OutPort = 9001;
26 |
27 | public void Init(EventHandler Message, EventHandler Bundle)
28 | {
29 | // Dummy UDP client for OSC packets
30 | OscPacket.UdpClient = new UdpClient();
31 |
32 | VRClient = new IPEndPoint(IPAddress.Loopback, OutPort);
33 | VRServer = new IPEndPoint(IPAddress.Loopback, InPort);
34 | VRMaster = new OscServer(Bespoke.Common.Net.TransportType.Udp, IPAddress.Loopback, InPort);
35 |
36 | // We need to receive all the methods
37 | VRMaster.FilterRegisteredMethods = false;
38 |
39 | // Attach the event handlers to the OSC server, then start it
40 | VRMaster.MessageReceived += Message;
41 | VRMaster.BundleReceived += Bundle;
42 | VRMaster.Start();
43 | }
44 |
45 | public void SetPorts(int? I, int? O)
46 | {
47 | if (I != null) InPort = (int)I;
48 | if (O != null) OutPort = (int)O;
49 | }
50 |
51 | // Since messages can have multiple variables in one, we had to do this fuckery...
52 | // And hey, it works, so whatever!
53 | private OscMessage BuildMsg(string Target, IPEndPoint NetTarget, params object[] Parameters)
54 | {
55 | OscMessage Message = new OscMessage(NetTarget, Target);
56 |
57 | try
58 | {
59 | foreach (object Param in Parameters)
60 | {
61 | switch (Param)
62 | {
63 | case int[] iArray:
64 | foreach (int i in iArray)
65 | Message.Append(i);
66 | break;
67 |
68 | case bool[] boArray:
69 | foreach (bool bo in boArray)
70 | Message.Append(bo);
71 | break;
72 |
73 | case float[] fArray:
74 | foreach (float f in fArray)
75 | Message.Append(f);
76 | break;
77 |
78 | case byte[] byArray:
79 | foreach (byte by in byArray)
80 | Message.Append(by);
81 | break;
82 |
83 | case string[] sArray:
84 | foreach (string s in sArray)
85 | Message.Append(s);
86 | break;
87 |
88 | case int i:
89 | case bool bo:
90 | case float f:
91 | case byte by:
92 | case string s:
93 | Message.Append(Param);
94 | break;
95 |
96 | default:
97 | MelonLogger.Msg("Unsupported parameter passed to BuildMsg.", Param.GetType());
98 | break;
99 | }
100 | }
101 | }
102 | catch (Exception ex)
103 | {
104 | MelonLogger.Error("An error has occured.", ex.ToString());
105 | }
106 |
107 | return Message;
108 | }
109 |
110 | // Send a message to the target OSC client
111 | public void SendMsg(string Target, IPEndPoint NetTarget, object Value = null, bool? Silent = false)
112 | {
113 | OscMessage Message = BuildMsg(Target, NetTarget, Value);
114 | Message.Send(NetTarget);
115 |
116 | if (Silent == false) MelonLogger.Msg("OSC message sent.", Message.Address, NetTarget.Address.ToString(), NetTarget.Port.ToString());
117 | }
118 |
119 | // Send a bundle to the target OSC client
120 | public void SendBndl(IPEndPoint NetTarget, List MsgVector = null, bool? Silent = false)
121 | {
122 | OscBundle Bundle = new OscBundle(NetTarget);
123 |
124 | foreach (OscMessage Msg in MsgVector)
125 | Bundle.Append(Msg);
126 |
127 | Bundle.Send(NetTarget);
128 | if (Silent == false) MelonLogger.Msg("OSC bundle sent.", NetTarget.Address.ToString(), NetTarget.Port.ToString());
129 | }
130 | }
131 | }
132 |
--------------------------------------------------------------------------------
/CVROSC/CVROSC.cs:
--------------------------------------------------------------------------------
1 | using ABI.CCK.Scripts;
2 | using ABI_RC.Core;
3 | using ABI_RC.Core.InteractionSystem;
4 | using ABI_RC.Core.Player;
5 | using ABI_RC.Core.Savior;
6 | using Bespoke.Osc;
7 | using MelonLoader;
8 | using System;
9 | using System.Collections.Generic;
10 | using System.Net;
11 | using System.Runtime.InteropServices;
12 | using System.Threading.Tasks;
13 | using Newtonsoft.Json;
14 |
15 | namespace CVROSC
16 | {
17 | public sealed class CVROSCMod : MelonMod
18 | {
19 | [DllImport("shell32.dll")]
20 | static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath);
21 |
22 | static VRLayer OSCServer = null;
23 |
24 | // Bases
25 | const string AvatarParamBase = "/avatar/parameters";
26 |
27 | // OSC config
28 | static bool Wait = true;
29 | static Guid LocalLowFolder = new Guid("A520A1A4-1780-4FF6-BD18-167343C5AF16");
30 | static string SavedAvatarGUID = "00000000-0000-0000-0000-000000000000";
31 | static ViewManager MenuInstance = null;
32 | static CVRAnimatorManager AnimatorManager = null;
33 | static List Parameters = null;
34 |
35 | public override void OnUpdate()
36 | {
37 | if (OSCServer == null)
38 | {
39 | OSCServer = new VRLayer();
40 | OSCServer.Init(new EventHandler(MessageF), new EventHandler(BundleF));
41 |
42 | MelonLogger.Msg("Started Open Sound Control server. Receiving on {0} and sending on {1}.", OSCServer.VRServer.Port, OSCServer.VRClient.Port);
43 | }
44 |
45 | try
46 | {
47 | string CurrentAvatarGUID = MetaPort.Instance.currentAvatarGuid;
48 |
49 | if (!SavedAvatarGUID.Equals(CurrentAvatarGUID) || AnimatorManager == null)
50 | {
51 | SavedAvatarGUID = CurrentAvatarGUID;
52 |
53 | Wait = true;
54 |
55 | if (!SavedAvatarGUID.Equals(CurrentAvatarGUID) && AnimatorManager == null)
56 | {
57 | MelonLogger.Msg(String.Format("Avatar change detected, loading animation manager... ({0})", CurrentAvatarGUID));
58 | MelonLogger.Msg(String.Format("OLD: {0}, NEW: {1}", SavedAvatarGUID, CurrentAvatarGUID));
59 | }
60 |
61 | if (PlayerSetup.Instance.animatorManager == null)
62 | // Wait for the game to initialize the animator manager
63 | return;
64 |
65 | if (AnimatorManager == null)
66 | AnimatorManager = PlayerSetup.Instance.animatorManager;
67 |
68 | if (MenuInstance == null)
69 | MenuInstance = ViewManager.Instance;
70 |
71 | Parameters = AnimatorManager.GetAdditionalSettingsCurrent();
72 |
73 | MelonLogger.Msg(String.Format("Animation manager found and cached for {0}, {1} parameters found!", SavedAvatarGUID, Parameters.Count));
74 |
75 | OSCConfig Config = new OSCConfig();
76 |
77 | Config.AvatarParameters = new List();
78 | Config.AvatarName = "unknown";
79 | Config.AvatarGUID = SavedAvatarGUID;
80 |
81 | if (Parameters.Count > 0)
82 | {
83 | MelonLogger.Msg(String.Format("Scanning parameters for {0}...", Config.AvatarGUID));
84 |
85 | for (int i = 0; i < Parameters.Count; i++)
86 | {
87 | OSCParameter AP = null;
88 |
89 | switch (Parameters[i].value)
90 | {
91 | case float f:
92 | AP = new OSCParameter();
93 | AP.Input = new OSCAddress();
94 | AP.Output = new OSCAddress();
95 |
96 | AP.ParameterName = Parameters[i].name;
97 |
98 | AP.Input.ParameterAddress = AP.Output.ParameterAddress = String.Format("{0}/{1}", AvatarParamBase, Parameters[i].name);
99 | AP.Input.ParameterType = AP.Output.ParameterType = "Float";
100 |
101 | break;
102 |
103 | //case bool b:
104 | // AP.Input.ParameterType = AP.Output.ParameterType = "Bool";
105 | // break;
106 |
107 | //case int i:
108 | // AP.Input.ParameterType = AP.Output.ParameterType = "Int";
109 | // break;
110 | }
111 |
112 | if (AP != null)
113 | {
114 | Config.AvatarParameters.Add(AP);
115 | MelonLogger.Msg(String.Format("Parameter {0} ({1}): {2}", AP.Input.ParameterAddress, AP.Input.ParameterType, Parameters[i].value));
116 | }
117 | }
118 |
119 | try
120 | {
121 | string TargetDir = String.Format("{0}\\Alpha Blend Interactive\\ChilloutVR\\OSC\\usr_{1}", GetKnownFolderPath(LocalLowFolder), MetaPort.Instance.ownerId);
122 | if (!System.IO.Directory.Exists(TargetDir))
123 | System.IO.Directory.CreateDirectory(TargetDir);
124 |
125 | String Path = String.Format("{0}\\avtr_{1}.json", TargetDir, Config.AvatarGUID);
126 | String JSONData = JsonConvert.SerializeObject(Config, Formatting.Indented);
127 |
128 | System.IO.File.WriteAllText(Path, JSONData);
129 |
130 | MelonLogger.Msg(String.Format("JSON written to \"{0}\"", Path));
131 | }
132 | catch (Exception ex)
133 | {
134 | MelonLogger.Error(ex.ToString());
135 | }
136 |
137 | MelonLogger.Msg("The new animation manager is now ready to be controlled through Open Sound Control.");
138 | }
139 |
140 | OSCServer.SendMsg("/avatar/change", OSCServer.VRClient, Config.AvatarGUID, true);
141 |
142 | Wait = false;
143 | }
144 | }
145 | catch
146 | {
147 | MenuInstance = null;
148 | AnimatorManager = null;
149 | Parameters = null;
150 |
151 | Wait = true;
152 | }
153 |
154 | Task.Run(() => GetParameters());
155 | }
156 |
157 | static void GetParameters()
158 | {
159 | if (Wait)
160 | return;
161 |
162 | try
163 | {
164 | if (AnimatorManager != null && Parameters != null)
165 | {
166 | for (int j = 0; j < Parameters.Count; j++)
167 | {
168 | float? f = AnimatorManager.GetAnimatorParameterFloat(Parameters[j].name);
169 | if (f != null)
170 | {
171 | if (f != Parameters[j].value)
172 | {
173 | Parameters[j].value = (float)f;
174 | OSCServer.SendMsg(String.Format("{0}/{1}", AvatarParamBase, Parameters[j].name), OSCServer.VRClient, Parameters[j].value, true);
175 | }
176 | }
177 |
178 | int? i = AnimatorManager.GetAnimatorParameterInt(Parameters[j].name);
179 | if (i != null)
180 | {
181 | if (i != (int)Parameters[j].value)
182 | {
183 | Parameters[j].value = (float)i;
184 | OSCServer.SendMsg(String.Format("{0}/{1}", AvatarParamBase, Parameters[j].name), OSCServer.VRClient, Parameters[j].value, true);
185 | }
186 | }
187 |
188 | bool? b = AnimatorManager.GetAnimatorParameterBool(Parameters[j].name);
189 | if (b != null)
190 | {
191 | if (b != (Parameters[j].value == 1f))
192 | {
193 | Parameters[j].value = Convert.ToSingle(b);
194 | OSCServer.SendMsg(String.Format("{0}/{1}", AvatarParamBase, Parameters[j].name), OSCServer.VRClient, Parameters[j].value, true);
195 | }
196 | }
197 | }
198 | }
199 | }
200 | catch (Exception ex)
201 | {
202 | MelonLogger.Error(ex.ToString());
203 |
204 | MenuInstance = null;
205 | AnimatorManager = null;
206 | Parameters = null;
207 |
208 | System.Threading.Thread.Sleep(1000);
209 | }
210 | }
211 |
212 | static void SetParameter(string Address, object Data)
213 | {
214 | switch (Data)
215 | {
216 | case bool b:
217 | case int i:
218 | case float f:
219 | if (Address.StartsWith(AvatarParamBase))
220 | {
221 | string Variable = Address.Replace(AvatarParamBase, "");
222 | // MelonLogger.Msg("Received message {0} with data {1}! ({2})", Variable, Data[0], Address);
223 |
224 | for (int j = 0; j < Parameters.Count; j++)
225 | {
226 | if (Parameters[j].name.Equals(Variable))
227 | {
228 | Parameters[j].value = Convert.ToSingle(Data);
229 | AnimatorManager.SetAnimatorParameter(Parameters[j].name, Parameters[j].value);
230 | // MenuInstance.gameMenuView.View.TriggerEvent("CVRAppActionLoadAvatarSettings");
231 | return;
232 | }
233 | }
234 | }
235 |
236 | break;
237 |
238 | default:
239 | MelonLogger.Error("Received unsupported message at address {0} of type {1}, with value {2}.",
240 | Address, Data.GetType().Name, Data);
241 | return;
242 | }
243 | }
244 |
245 | static void AnalyzeData(object sender, IPEndPoint Source, string Address, object Data)
246 | {
247 | if (sender == null) return;
248 |
249 | switch (Data)
250 | {
251 | case OscBundle OSCB:
252 | foreach (OscMessage bOSCM in OSCB.Messages)
253 | SetParameter(Address, bOSCM.Data[0]);
254 |
255 | foreach (OscBundle bOSCB in OSCB.Bundles)
256 | AnalyzeData(sender, Source, Address, bOSCB);
257 |
258 | break;
259 |
260 | case OscMessage OSCM:
261 | SetParameter(Address, OSCM.Data[0]);
262 | break;
263 |
264 | default:
265 | MelonLogger.Error("Received unsupported packet at address {0}!", Address);
266 | return;
267 | }
268 | }
269 |
270 | static void BundleF(object sender, OscBundleReceivedEventArgs Var)
271 | {
272 | AnalyzeData(sender, Var.Bundle.SourceEndPoint, Var.Bundle.Address, Var.Bundle);
273 | }
274 |
275 | static void MessageF(object sender, OscMessageReceivedEventArgs Var)
276 | {
277 | AnalyzeData(sender, Var.Message.SourceEndPoint, Var.Message.Address, Var.Message);
278 | }
279 |
280 | static string GetKnownFolderPath(Guid KnownFolderID)
281 | {
282 | IntPtr pszPath = IntPtr.Zero;
283 | try
284 | {
285 | int HResult = SHGetKnownFolderPath(KnownFolderID, 0, IntPtr.Zero, out pszPath);
286 |
287 | if (HResult >= 0)
288 | return Marshal.PtrToStringAuto(pszPath);
289 |
290 | throw Marshal.GetExceptionForHR(HResult);
291 | }
292 | finally
293 | {
294 | if (pszPath != IntPtr.Zero)
295 | Marshal.FreeCoTaskMem(pszPath);
296 | }
297 | }
298 | }
299 | }
--------------------------------------------------------------------------------
/CVROSC/CVROSC.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Debug
7 | AnyCPU
8 | {BA347446-0301-4160-9D74-BA117344F489}
9 | Library
10 | Properties
11 | CVROSC
12 | CVROSC
13 | v4.7.2
14 | 512
15 | true
16 |
17 |
18 |
19 |
20 | true
21 | full
22 | false
23 | bin\Debug\
24 | DEBUG;TRACE
25 | prompt
26 | 4
27 |
28 |
29 | none
30 | true
31 | bin\Release\
32 | TRACE
33 | prompt
34 | 4
35 |
36 |
37 |
38 | G:\SteamLibrary\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Assembly-CSharp.dll
39 |
40 |
41 | E:\GitHub\OpenWeatherOSC\OpenWeatherOSC\ref\Bespoke.Common.dll
42 |
43 |
44 | E:\GitHub\OpenWeatherOSC\OpenWeatherOSC\ref\Bespoke.Osc.dll
45 |
46 |
47 | False
48 | G:\SteamLibrary\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\cohtml.Net.dll
49 |
50 |
51 | False
52 | G:\SteamLibrary\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Cohtml.Runtime.dll
53 |
54 |
55 | ..\packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll
56 |
57 |
58 | G:\SteamLibrary\steamapps\common\VRChat\MelonLoader\MelonLoader.dll
59 |
60 |
61 | ..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll
62 | True
63 | True
64 |
65 |
66 | ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll
67 |
68 |
69 |
70 | ..\packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll
71 | True
72 | True
73 |
74 |
75 |
76 | ..\packages\System.Console.4.3.0\lib\net46\System.Console.dll
77 | True
78 | True
79 |
80 |
81 |
82 | ..\packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll
83 |
84 |
85 | ..\packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll
86 | True
87 | True
88 |
89 |
90 | ..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll
91 | True
92 | True
93 |
94 |
95 | ..\packages\System.IO.4.3.0\lib\net462\System.IO.dll
96 | True
97 | True
98 |
99 |
100 | ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll
101 | True
102 | True
103 |
104 |
105 |
106 | ..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll
107 | True
108 | True
109 |
110 |
111 | ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll
112 | True
113 | True
114 |
115 |
116 | ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll
117 | True
118 | True
119 |
120 |
121 | ..\packages\System.Linq.4.3.0\lib\net463\System.Linq.dll
122 | True
123 | True
124 |
125 |
126 | ..\packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll
127 | True
128 | True
129 |
130 |
131 | ..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll
132 | True
133 | True
134 |
135 |
136 | ..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll
137 | True
138 | True
139 |
140 |
141 |
142 | ..\packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll
143 | True
144 | True
145 |
146 |
147 | ..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll
148 | True
149 | True
150 |
151 |
152 | ..\packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll
153 | True
154 | True
155 |
156 |
157 | ..\packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll
158 | True
159 | True
160 |
161 |
162 | ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
163 | True
164 | True
165 |
166 |
167 | ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll
168 | True
169 | True
170 |
171 |
172 | ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll
173 | True
174 | True
175 |
176 |
177 | ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll
178 | True
179 | True
180 |
181 |
182 | ..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll
183 | True
184 | True
185 |
186 |
187 | ..\packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll
188 | True
189 | True
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 | ..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll
198 | True
199 | True
200 |
201 |
202 | G:\SteamLibrary\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.AnimationModule.dll
203 |
204 |
205 | G:\SteamLibrary\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.CoreModule.dll
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
226 |
227 |
228 |
229 |
230 |
231 |
232 |
--------------------------------------------------------------------------------