This repository has been archived on 2023-09-13. You can view files and clone it, but cannot push or open issues or pull requests.
station_obscurum_unity/Assets/Packages/FishNet/CodeGenerating/Helpers/PhysicsHelper.cs
2023-06-01 11:21:49 -07:00

117 lines
4.2 KiB
C#

using FishNet.CodeGenerating.Extension;
using FishNet.CodeGenerating.Helping.Extension;
using FishNet.Connection;
using MonoFN.Cecil;
using MonoFN.Cecil.Cil;
using System.Collections.Generic;
using UnityEngine;
using SR = System.Reflection;
namespace FishNet.CodeGenerating.Helping
{
internal class PhysicsHelper : CodegenBase
{
#region Reflection references.
public MethodReference GetScene_MethodRef;
public MethodReference GetPhysicsScene2D_MethodRef;
public MethodReference GetPhysicsScene3D_MethodRef;
public MethodReference Physics3D_Simulate_MethodRef;
public MethodReference Physics2D_Simulate_MethodRef;
public MethodReference Physics3D_SyncTransforms_MethodRef;
public MethodReference Physics2D_SyncTransforms_MethodRef;
#endregion
public override bool ImportReferences()
{
SR.MethodInfo locMi;
//GetScene.
locMi = typeof(GameObject).GetMethod("get_scene");
GetScene_MethodRef = base.ImportReference(locMi);
//Physics.SyncTransform.
foreach (SR.MethodInfo mi in typeof(Physics).GetMethods())
{
if (mi.Name == nameof(Physics.SyncTransforms))
{
Physics3D_SyncTransforms_MethodRef = base.ImportReference(mi);
break;
}
}
foreach (SR.MethodInfo mi in typeof(Physics2D).GetMethods())
{
if (mi.Name == nameof(Physics2D.SyncTransforms))
{
Physics2D_SyncTransforms_MethodRef = base.ImportReference(mi);
break;
}
}
//PhysicsScene.Simulate.
foreach (SR.MethodInfo mi in typeof(PhysicsScene).GetMethods())
{
if (mi.Name == nameof(PhysicsScene.Simulate))
{
Physics3D_Simulate_MethodRef = base.ImportReference(mi);
break;
}
}
foreach (SR.MethodInfo mi in typeof(PhysicsScene2D).GetMethods())
{
if (mi.Name == nameof(PhysicsScene2D.Simulate))
{
Physics2D_Simulate_MethodRef = base.ImportReference(mi);
break;
}
}
//GetPhysicsScene.
foreach (SR.MethodInfo mi in typeof(PhysicsSceneExtensions).GetMethods())
{
if (mi.Name == nameof(PhysicsSceneExtensions.GetPhysicsScene))
{
GetPhysicsScene3D_MethodRef = base.ImportReference(mi);
break;
}
}
foreach (SR.MethodInfo mi in typeof(PhysicsSceneExtensions2D).GetMethods())
{
if (mi.Name == nameof(PhysicsSceneExtensions2D.GetPhysicsScene2D))
{
GetPhysicsScene2D_MethodRef = base.ImportReference(mi);
break;
}
}
return true;
}
/// <summary>
/// Returns instructions to get a physics scene from a gameObject.
/// </summary>
public List<Instruction> GetPhysicsScene(MethodDefinition md, VariableDefinition gameObjectVd, bool threeDimensional)
{
ILProcessor processor = md.Body.GetILProcessor();
return GetPhysicsScene(processor, gameObjectVd, threeDimensional);
}
/// <summary>
/// Returns instructions to get a physics scene from a gameObject.
/// </summary>
public List<Instruction> GetPhysicsScene(ILProcessor processor, VariableDefinition gameObjectVd, bool threeDimensional)
{
List<Instruction> insts = new List<Instruction>();
//gameObject.scene.GetPhysics...
insts.Add(processor.Create(OpCodes.Ldloc, gameObjectVd));
insts.Add(processor.Create(GetScene_MethodRef.GetCallOpCode(base.Session), GetScene_MethodRef));
if (threeDimensional)
insts.Add(processor.Create(OpCodes.Call, GetPhysicsScene3D_MethodRef));
else
insts.Add(processor.Create(OpCodes.Call, GetPhysicsScene2D_MethodRef));
return insts;
}
}
}