Skip to content

Commit 4002276

Browse files
committed
Suppress harmony warnings when checking for optional methods and types
1 parent 64ecc68 commit 4002276

File tree

3 files changed

+49
-8
lines changed

3 files changed

+49
-8
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using HarmonyLib;
2+
using System;
3+
using Tobey.UnityAudio.Utilities;
4+
5+
namespace Tobey.UnityAudio.ExtensionMethods;
6+
internal static class TraverseExtensions
7+
{
8+
public static Traverse OptionalMethod(this Traverse traverse, string name, params object[] arguments) =>
9+
TraverseHelper.SuppressHarmonyWarnings(() => traverse.Method(name, arguments));
10+
11+
public static Traverse OptionalMethod(this Traverse traverse, string name, Type[] paramTypes, params object[] arguments) =>
12+
TraverseHelper.SuppressHarmonyWarnings(() => traverse.Method(name, paramTypes, arguments));
13+
}

Plugin/Plugin.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
using System.IO;
77
using System.Linq;
88
using System.Reflection;
9+
using Tobey.UnityAudio.ExtensionMethods;
10+
using Tobey.UnityAudio.Utilities;
911
using UnityEngine;
1012

1113
namespace Tobey.UnityAudio;
@@ -110,7 +112,6 @@ void logFailure(string missingMemberName, string missingMemberType) =>
110112
}
111113

112114
Logger.LogMessage("Attempting to determine the runtime state of Unity Audio...");
113-
Logger.LogInfo("You may see warnings from AccessTools about being unable to find methods or types etc. during this operation.");
114115

115116
var path = Path.GetFullPath(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, audioFilePath.Value));
116117
if (!File.Exists(path))
@@ -120,45 +121,48 @@ void logFailure(string missingMemberName, string missingMemberType) =>
120121

121122
// in newer versions of Unity, UnityWebRequest.GetAudioClip is deprecated in favour of UnityWebRequestMultimedia.GetAudioClip,
122123
// so use the newer method where available
123-
var unityWebRequestMultimedia = new[] { "UnityWebRequestMultimedia", "UnityWebRequest" }.Select(Traverse.CreateWithType).FirstOrDefault(t => t.TypeExists());
124+
var unityWebRequestMultimedia = new[] { "UnityWebRequestMultimedia", "UnityWebRequest" }
125+
.Select(TraverseHelper.CreateWithOptionalType)
126+
.FirstOrDefault(t => t.TypeExists());
127+
124128
if (unityWebRequestMultimedia is null)
125129
{
126130
logFailure("UnityEngine.Networking.UnityWebRequest", "type");
127131
yield break;
128132
}
129133

130134
// we need the type of UnityWebRequest on all versions, as this is the type that will be passed to DownloadHandlerAudioClip.GetContent
131-
var unityWebRequest = Traverse.CreateWithType("UnityWebRequest");
135+
var unityWebRequest = TraverseHelper.CreateWithOptionalType("UnityWebRequest");
132136
if (!unityWebRequest.TypeExists())
133137
{
134138
logFailure("UnityEngine.Networking.UnityWebRequest", "type");
135139
yield break;
136140
}
137141
Type unityWebRequestType = unityWebRequest.GetValue<Type>();
138142

139-
var audioType = Traverse.CreateWithType("AudioType");
143+
var audioType = TraverseHelper.CreateWithOptionalType("AudioType");
140144
if (!audioType.TypeExists())
141145
{
142146
logFailure("UnityEngine.AudioType", "type");
143147
yield break;
144148
}
145149
Type audioTypeType = audioType.GetValue<Type>();
146150

147-
var downloadHandlerAudioClip = Traverse.CreateWithType("DownloadHandlerAudioClip");
151+
var downloadHandlerAudioClip = TraverseHelper.CreateWithOptionalType("DownloadHandlerAudioClip");
148152
if (!downloadHandlerAudioClip.TypeExists())
149153
{
150154
logFailure("UnityEngine.Networking.DownloadHandlerAudioClip", "type");
151155
yield break;
152156
}
153157

154-
var getContent = downloadHandlerAudioClip.Method("GetContent", new[] { unityWebRequestType });
158+
var getContent = downloadHandlerAudioClip.OptionalMethod("GetContent", new[] { unityWebRequestType });
155159
if (!getContent.MethodExists())
156160
{
157161
logFailure($"{downloadHandlerAudioClip}:GetContent", "static method");
158162
yield break;
159163
}
160164

161-
var getAudioClip = unityWebRequestMultimedia.Method("GetAudioClip", new[] { typeof(string), audioTypeType });
165+
var getAudioClip = unityWebRequestMultimedia.OptionalMethod("GetAudioClip", new[] { typeof(string), audioTypeType });
162166
if (!getAudioClip.MethodExists())
163167
{
164168
logFailure($"{unityWebRequestMultimedia}:GetAudioClip", "static method");
@@ -167,7 +171,7 @@ void logFailure(string missingMemberName, string missingMemberType) =>
167171

168172
using var disposableRequest = getAudioClip.GetValue<IDisposable>($"file:///{path}", 20); // AudioType.WAV = 20
169173
var request = Traverse.Create(disposableRequest);
170-
var sendWebRequest = new[] { "SendWebRequest", "Send" }.Select(name => request.Method(name)).FirstOrDefault(m => m.MethodExists());
174+
var sendWebRequest = new[] { "SendWebRequest", "Send" }.Select(name => request.OptionalMethod(name)).FirstOrDefault(m => m.MethodExists());
171175
if (sendWebRequest is null)
172176
{
173177
logFailure($"{unityWebRequestMultimedia}:SendWebRequest", "instance method");

Plugin/Utilities/TraverseHelper.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using HarmonyLib;
2+
using HarmonyLib.Tools;
3+
using System;
4+
5+
namespace Tobey.UnityAudio.Utilities;
6+
internal static class TraverseHelper
7+
{
8+
public static T SuppressHarmonyWarnings<T>(Func<T> fn)
9+
{
10+
var initialFilter = Logger.ChannelFilter;
11+
Logger.ChannelFilter &= ~Logger.LogChannel.Warn;
12+
try
13+
{
14+
return fn();
15+
}
16+
finally
17+
{
18+
Logger.ChannelFilter = initialFilter;
19+
}
20+
}
21+
22+
public static Traverse CreateWithOptionalType(string name) =>
23+
SuppressHarmonyWarnings(() => Traverse.CreateWithType(name));
24+
}

0 commit comments

Comments
 (0)