Add project files.
This commit is contained in:
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user