Add project files.
This commit is contained in:
35
Config.cs
Normal file
35
Config.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
using BepInEx.Configuration;
|
||||
|
||||
namespace undead_universal_patch_il2cpp
|
||||
{
|
||||
public static class GenericConfig
|
||||
{
|
||||
public static ConfigEntry<bool> LogAllRequests;
|
||||
}
|
||||
public static class GenericConfigDefaults
|
||||
{
|
||||
public static bool LogAllRequests = false;
|
||||
}
|
||||
public static class NameserverConfig
|
||||
{
|
||||
public static ConfigEntry<bool> Rewrite;
|
||||
public static ConfigEntry<string> NewUrl;
|
||||
}
|
||||
public static class NameserverConfigDefaults
|
||||
{
|
||||
public static bool Rewrite = false;
|
||||
public static string NewUrl = "https://example.com/nameserver";
|
||||
}
|
||||
public static class PhotonConfig
|
||||
{
|
||||
public static ConfigEntry<bool> PatchPhotonIds;
|
||||
public static ConfigEntry<string> AppID;
|
||||
public static ConfigEntry<string> VoiceAppID;
|
||||
}
|
||||
public static class PhotonConfigDefaults
|
||||
{
|
||||
public static bool PatchPhotonIds = false;
|
||||
public static string AppID = "replace-me-please";
|
||||
public static string VoiceAppID = "replace-me-please";
|
||||
}
|
||||
}
|
||||
66
Patches/BestHTTP.cs
Normal file
66
Patches/BestHTTP.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using HarmonyLib;
|
||||
|
||||
namespace undead_universal_patch_il2cpp.Patches
|
||||
{
|
||||
[HarmonyPatch]
|
||||
public class BestHTTP_Unob
|
||||
{
|
||||
static string TargetTypeName = "BestHTTP.HTTPManager";
|
||||
static string TargetMethodName = "SendRequest";
|
||||
static string Description = "Unobfuscated BestHTTP request URL rewrite patch";
|
||||
static readonly Type targetType = AccessTools.TypeByName(TargetTypeName);
|
||||
static readonly Type requestType = AccessTools.TypeByName("BestHTTP.HTTPRequest");
|
||||
static readonly MethodInfo targetMethod = AccessTools.Method(targetType, TargetMethodName, [requestType]);
|
||||
|
||||
static bool Prepare()
|
||||
{
|
||||
if (targetType == null)
|
||||
{
|
||||
Plugin.Log.LogWarning($"'{Description}' disabled. The type for this patch was not found.");
|
||||
return false;
|
||||
}
|
||||
if (targetMethod == null)
|
||||
{
|
||||
Plugin.Log.LogWarning($"'{Description}' disabled. The method for this patch was not found.");
|
||||
return false;
|
||||
}
|
||||
|
||||
Plugin.Log.LogInfo($"'{Description}' succeeded validation.");
|
||||
return true;
|
||||
}
|
||||
|
||||
static MethodBase TargetMethod()
|
||||
{
|
||||
return targetMethod;
|
||||
}
|
||||
|
||||
[HarmonyPrefix]
|
||||
static bool Prefix(ref object request)
|
||||
{
|
||||
PropertyInfo uriProperty = AccessTools.Property(requestType, "Uri");
|
||||
if (uriProperty == null)
|
||||
{
|
||||
Plugin.Log.LogFatal("BestHTTP_Unob failed: uriProperty was null.");
|
||||
return false;
|
||||
}
|
||||
|
||||
var uriInstance = (Uri)uriProperty.GetValue(request, null);
|
||||
if (uriInstance == null)
|
||||
{
|
||||
Plugin.Log.LogFatal("BestHTTP_Unob failed: uriInstance was null.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (GenericConfig.LogAllRequests.Value) Plugin.Log.LogInfo($"BestHTTP_Unob request (Before) URL: {uriInstance.ToString()}");
|
||||
|
||||
Uri newUri = new(NameserverConfig.NewUrl.Value);
|
||||
|
||||
if (GenericConfig.LogAllRequests.Value) Plugin.Log.LogInfo($"BestHTTP_Unob request (After) URL: {newUri.ToString()}");
|
||||
|
||||
uriProperty.SetValue(request, NameserverConfig., null);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
94
Patches/Photon.cs
Normal file
94
Patches/Photon.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using HarmonyLib;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using UnityEngine;
|
||||
|
||||
namespace undead_universal_patch_il2cpp.Patches
|
||||
{
|
||||
public class PhotonPatchEvent
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class Photon
|
||||
{
|
||||
public static object Patch()
|
||||
{
|
||||
Plugin.Log.LogInfo("Attempting Photon patch.");
|
||||
Type serverSettingsType = AccessTools.TypeByName("ServerSettings");
|
||||
|
||||
Type hostingOptionType = AccessTools.Inner(serverSettingsType, "HostingOption");
|
||||
if (serverSettingsType == null)
|
||||
{
|
||||
Plugin.Log.LogFatal("Photon patch failed early, this Photon client is unsupported!");
|
||||
return null;
|
||||
}
|
||||
|
||||
ScriptableObject settingsInstance = ScriptableObject.CreateInstance(serverSettingsType);
|
||||
|
||||
object realPhotonServerSettings = Resources.Load("PhotonServerSettings", serverSettingsType);
|
||||
|
||||
try
|
||||
{
|
||||
var rpcListField = AccessTools.Field(serverSettingsType, "RpcList");
|
||||
if (rpcListField == null)
|
||||
{
|
||||
Plugin.Log.LogFatal("Photon patch failed (serverSettingsType did not have an RpcList), this Photon client is unsupported!");
|
||||
return null;
|
||||
}
|
||||
if (realPhotonServerSettings == null)
|
||||
{
|
||||
Plugin.Log.LogFatal("Photon patch failed (existing photon settings was null, is the patch event set to 'Awake'?), this Photon client is unsupported!");
|
||||
return null;
|
||||
}
|
||||
var existingRpcList = (List<string>)rpcListField.GetValue(realPhotonServerSettings);
|
||||
rpcListField.SetValue(settingsInstance, existingRpcList);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Plugin.Log.LogFatal("Photon patch failed (RpcList), this Photon client is unsupported!");
|
||||
Plugin.Log.LogDebug(e);
|
||||
return null;
|
||||
}
|
||||
|
||||
var appIdField = AccessTools.Field(serverSettingsType, "AppID");
|
||||
appIdField.SetValue(settingsInstance, PhotonConfig.AppID.Value);
|
||||
var voiceAppIdField = AccessTools.Field(serverSettingsType, "VoiceAppID");
|
||||
voiceAppIdField.SetValue(settingsInstance, PhotonConfig.VoiceAppID.Value);
|
||||
|
||||
var hostTypeField = AccessTools.Field(serverSettingsType, "HostType");
|
||||
if (hostTypeField != null && hostingOptionType != null && hostingOptionType.IsEnum)
|
||||
{
|
||||
try
|
||||
{
|
||||
object enumValue = Enum.Parse(hostingOptionType, "PhotonCloud");
|
||||
hostTypeField.SetValue(settingsInstance, enumValue);
|
||||
}
|
||||
catch (ArgumentException ex)
|
||||
{
|
||||
Plugin.Log.LogFatal($"Photon patch failed, cannot set HostingOption: {ex.Message}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Save to property
|
||||
Type photonNetworkType = AccessTools.TypeByName("PhotonNetwork");
|
||||
if (photonNetworkType == null)
|
||||
{
|
||||
Plugin.Log.LogFatal("Photon patch will not work (class not found). Is this build supported?");
|
||||
return null;
|
||||
}
|
||||
FieldInfo photonServerSettingsField = photonNetworkType.GetField("PhotonServerSettings");
|
||||
if (photonServerSettingsField == null)
|
||||
{
|
||||
Plugin.Log.LogFatal("Photon patch will not work (property not found). Is this build supported?");
|
||||
return null;
|
||||
}
|
||||
photonServerSettingsField.SetValue(serverSettingsType, settingsInstance);
|
||||
|
||||
Plugin.Log.LogInfo("Photon patch was successful.");
|
||||
return settingsInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
40
Plugin.cs
Normal file
40
Plugin.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using BepInEx;
|
||||
using BepInEx.Logging;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using HarmonyLib;
|
||||
|
||||
namespace undead_universal_patch_il2cpp;
|
||||
|
||||
[BepInPlugin("dev.proxnet.recroom.universalpatch.noneac.il2cpp", "Undead Universal Patch", "1.0.0")]
|
||||
public class Plugin : BasePlugin
|
||||
{
|
||||
public static new readonly ManualLogSource Log = Logger.CreateLogSource("UUPatch");
|
||||
|
||||
public static Harmony _hi = new("dev.proxnet.recroom.universalpatch.noneac.il2cpp");
|
||||
|
||||
public override bool Unload()
|
||||
{
|
||||
Log.LogInfo("Destroying.");
|
||||
_hi.UnpatchSelf();
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void Load()
|
||||
{
|
||||
GenericConfig.LogAllRequests = Config.Bind("Generic", "LogAllRequests", GenericConfigDefaults.LogAllRequests,
|
||||
"Log all HTTP requests sent by the game.");
|
||||
PhotonConfig.PatchPhotonIds = Config.Bind("Photon", "PatchPhotonIds", PhotonConfigDefaults.PatchPhotonIds,
|
||||
"Enable/disable changing the target IDs in PhotonServerSettings." +
|
||||
"\nCustom server settings are not yet supported.");
|
||||
PhotonConfig.AppID = Config.Bind("Photon", "AppID", PhotonConfigDefaults.AppID,
|
||||
"The new target (PUN) App ID from the Photon dashboard.");
|
||||
PhotonConfig.VoiceAppID = Config.Bind("Photon", "VoiceAppID", PhotonConfigDefaults.VoiceAppID,
|
||||
"The new target Voice App ID from the Photon dashboard.");
|
||||
NameserverConfig.Rewrite = Config.Bind("Nameserver", "Rewrite", NameserverConfigDefaults.Rewrite,
|
||||
"Enable/disable rewriting the URL for nameserver requests.");
|
||||
NameserverConfig.NewUrl = Config.Bind("Nameserver", "NewUrl", NameserverConfigDefaults.NewUrl,
|
||||
"The new full URL to use when sending a nameserver request.");
|
||||
|
||||
_hi.PatchAll();
|
||||
}
|
||||
}
|
||||
37
undead-universal-patch-il2cpp.csproj
Normal file
37
undead-universal-patch-il2cpp.csproj
Normal file
@@ -0,0 +1,37 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<AssemblyName>undead_universal_patch_il2cpp</AssemblyName>
|
||||
<Description>My first plugin</Description>
|
||||
<Version>1.0.0</Version>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<RestoreAdditionalProjectSources>
|
||||
https://api.nuget.org/v3/index.json;
|
||||
https://nuget.bepinex.dev/v3/index.json;
|
||||
https://nuget.samboy.dev/v3/index.json
|
||||
</RestoreAdditionalProjectSources>
|
||||
<RootNamespace>undead_universal_patch_il2cpp</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.*" IncludeAssets="compile" />
|
||||
<PackageReference Include="BepInEx.PluginInfoProps" Version="2.*" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>G:\rr\2019-10-25 (5120486837419374208)\BepInEx\interop\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppmscorlib">
|
||||
<HintPath>G:\rr\2019-10-25 (5120486837419374208)\BepInEx\interop\Il2Cppmscorlib.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine">
|
||||
<HintPath>G:\rr\2019-10-25 (5120486837419374208)\cpp2il_out\UnityEngine.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.CoreModule">
|
||||
<HintPath>G:\rr\2019-10-25 (5120486837419374208)\cpp2il_out\UnityEngine.CoreModule.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
25
undead-universal-patch-il2cpp.sln
Normal file
25
undead-universal-patch-il2cpp.sln
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.9.34728.123
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "undead-universal-patch-il2cpp", "undead-universal-patch-il2cpp.csproj", "{EA77CD32-EB68-4D7D-96B2-644785D96DEA}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{EA77CD32-EB68-4D7D-96B2-644785D96DEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EA77CD32-EB68-4D7D-96B2-644785D96DEA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EA77CD32-EB68-4D7D-96B2-644785D96DEA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EA77CD32-EB68-4D7D-96B2-644785D96DEA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {0BAB65B6-7962-4D94-92F2-9BD2B35DAAA9}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
Reference in New Issue
Block a user