using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Rendering;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace DSPSwarmDrawFix;
[BepInPlugin("me.gp.dspswarmdrawfix", "DSPSwarmDrawFix", "1.1.0")]
public class SwarmDrawFixPlugin : BaseUnityPlugin
{
internal static ManualLogSource Log;
internal static readonly FieldInfo SwarmBufferField = AccessTools.Field(typeof(DysonSwarm), "swarmBuffer");
internal static readonly FieldInfo SwarmInfoBufferField = AccessTools.Field(typeof(DysonSwarm), "swarmInfoBuffer");
internal static readonly FieldInfo OrbitColorsBufferField = AccessTools.Field(typeof(DysonSwarm), "sailOrbitColorsBuffer");
internal static readonly FieldInfo BulletBufferField = AccessTools.Field(typeof(DysonSwarm), "bulletBuffer");
internal static readonly FieldInfo SizeInMatField = AccessTools.Field(typeof(DysonSwarm), "sizeInMat");
private void Awake()
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
Log = ((BaseUnityPlugin)this).Logger;
Harmony val = new Harmony("me.gp.dspswarmdrawfix");
val.PatchAll(typeof(SwarmDrawPatch));
val.PatchAll(typeof(NearDrawPatch));
Log.LogInfo((object)"DSPSwarmDrawFix активен: дальние паруса — индексированные треугольники, ближние — instanced без indirect");
}
}
internal static class SwarmDrawPatch
{
private const int ChunkSails = 5460;
private static GraphicsBuffer quadIndexBuffer;
private static bool failedOnce;
private static GraphicsBuffer GetIndexBuffer()
{
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Expected O, but got Unknown
if (quadIndexBuffer != null && quadIndexBuffer.IsValid())
{
return quadIndexBuffer;
}
int num = 16380;
int[] array = new int[num * 6];
for (int i = 0; i < num; i++)
{
int num2 = i * 4;
int num3 = i * 6;
array[num3] = num2;
array[num3 + 1] = num2 + 1;
array[num3 + 2] = num2 + 2;
array[num3 + 3] = num2;
array[num3 + 4] = num2 + 2;
array[num3 + 5] = num2 + 3;
}
quadIndexBuffer = new GraphicsBuffer((Target)2, array.Length, 4);
quadIndexBuffer.SetData((Array)array);
return quadIndexBuffer;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(DysonSwarm), "DrawPost")]
private static bool DrawPostPrefix(DysonSwarm __instance)
{
try
{
ReplacementDrawPost(__instance);
return false;
}
catch (Exception arg)
{
if (!failedOnce)
{
failedOnce = true;
SwarmDrawFixPlugin.Log.LogError((object)$"замена DrawPost упала, откат на оригинал: {arg}");
}
return true;
}
}
private static void ReplacementDrawPost(DysonSwarm sw)
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Invalid comparison between Unknown and I4
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Invalid comparison between Unknown and I4
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
//IL_01fa: Expected O, but got Unknown
//IL_0205: Unknown result type (might be due to invalid IL or missing references)
//IL_020c: Expected O, but got Unknown
//IL_0217: Unknown result type (might be due to invalid IL or missing references)
//IL_021e: Expected O, but got Unknown
//IL_0229: Unknown result type (might be due to invalid IL or missing references)
//IL_0230: Expected O, but got Unknown
//IL_0289: Unknown result type (might be due to invalid IL or missing references)
//IL_028a: Unknown result type (might be due to invalid IL or missing references)
//IL_029a: Unknown result type (might be due to invalid IL or missing references)
//IL_029b: Unknown result type (might be due to invalid IL or missing references)
//IL_02ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Invalid comparison between Unknown and I4
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Unknown result type (might be due to invalid IL or missing references)
uint num = (uint)(GameMain.gameTick & 0xFFFFFFFFu);
Vector3 val = Vector3.zero;
Vector4 val2 = default(Vector4);
((Vector4)(ref val2))..ctor(0f, 0f, 0f, 1f);
Vector3 val3 = Vector3.zero;
if (sw.starData != null && sw.gameData != null)
{
PlanetData localPlanet = sw.gameData.localPlanet;
Player mainPlayer = sw.gameData.mainPlayer;
VectorLF3 uPosition = sw.starData.uPosition;
if (localPlanet != null)
{
uPosition -= mainPlayer.uPosition;
uPosition = Maths.QInvRotateLF(localPlanet.runtimeRotation, uPosition);
uPosition += VectorLF3.op_Implicit(mainPlayer.position);
((Vector4)(ref val2))..ctor(localPlanet.runtimeRotation.x, localPlanet.runtimeRotation.y, localPlanet.runtimeRotation.z, localPlanet.runtimeRotation.w);
}
else
{
uPosition -= mainPlayer.uPosition;
}
val = VectorLF3.op_Implicit(uPosition);
if ((int)DysonSphere.renderPlace == 1)
{
val3 = VectorLF3.op_Implicit((sw.starData.uPosition - UIStarmap.viewTargetStatic) * 0.00025);
}
}
Camera val4 = Camera.main;
if ((int)DysonSphere.renderPlace == 1)
{
UIStarmap starmap = UIRoot.instance.uiGame.starmap;
if ((Object)(object)starmap != (Object)null)
{
val4 = starmap.screenCamera;
}
}
else if ((int)DysonSphere.renderPlace == 2)
{
UIDysonEditor dysonEditor = UIRoot.instance.uiGame.dysonEditor;
if ((Object)(object)dysonEditor != (Object)null)
{
val4 = dysonEditor.screenCamera;
}
}
if ((Object)(object)val4 != (Object)null)
{
float num2 = (float)SwarmDrawFixPlugin.SizeInMatField.GetValue(sw) * (float)Screen.height * 0.4f;
float num3 = 1f / Mathf.Tan(val4.fieldOfView * ((float)Math.PI / 180f) * 0.5f) * num2;
sw.sailFarMaterial.SetFloat("_DistScalePoint", num3);
}
ComputeBuffer val5 = (ComputeBuffer)SwarmDrawFixPlugin.SwarmBufferField.GetValue(sw);
ComputeBuffer val6 = (ComputeBuffer)SwarmDrawFixPlugin.SwarmInfoBufferField.GetValue(sw);
ComputeBuffer val7 = (ComputeBuffer)SwarmDrawFixPlugin.OrbitColorsBufferField.GetValue(sw);
ComputeBuffer val8 = (ComputeBuffer)SwarmDrawFixPlugin.BulletBufferField.GetValue(sw);
Material sailFarMaterial = sw.sailFarMaterial;
sailFarMaterial.SetInt("_Stride", 5460);
sailFarMaterial.SetBuffer("_SwarmBuffer", val5);
sailFarMaterial.SetBuffer("_SwarmInfoBuffer", val6);
sailFarMaterial.SetBuffer("_NodeBuffer", sw.dysonSphere.nrdBuffer);
sailFarMaterial.SetBuffer("_OrbitColor", val7);
sailFarMaterial.SetVector("_SunPosition", Vector4.op_Implicit(val));
sailFarMaterial.SetVector("_SunPosition_Map", Vector4.op_Implicit(val3));
sailFarMaterial.SetVector("_LocalRot", val2);
sailFarMaterial.SetInt("_GameTick", (int)num);
sailFarMaterial.SetPass(0);
if (sw.sailCursor > 0 && val5 != null)
{
int num4 = (sw.sailCursor + 5460 - 1) / 5460;
Graphics.DrawProceduralNow((MeshTopology)0, GetIndexBuffer(), 98280, num4);
}
if (val8 != null)
{
sw.bulletMaterial.SetBuffer("_BulletBuffer", val8);
sw.bulletMaterial.SetPass(0);
Graphics.DrawProceduralNow((MeshTopology)2, sw.bulletCursor * 8, 1);
}
}
}
internal static class NearDrawPatch
{
private static ComputeBuffer identityBuffer;
private static bool failedOnce;
private static ComputeBuffer GetIdentityBuffer(int minCount)
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Expected O, but got Unknown
if (identityBuffer != null && identityBuffer.IsValid() && identityBuffer.count >= minCount)
{
return identityBuffer;
}
int num = Mathf.NextPowerOfTwo(Mathf.Max(minCount, 65536));
ComputeBuffer obj = identityBuffer;
if (obj != null)
{
obj.Release();
}
identityBuffer = new ComputeBuffer(num, 4, (ComputeBufferType)0);
int[] array = new int[num];
for (int i = 0; i < num; i++)
{
array[i] = i;
}
identityBuffer.SetData((Array)array);
return identityBuffer;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(DysonSwarm), "DrawModel")]
private static bool DrawModelPrefix(DysonSwarm __instance, ERenderPlace place, int editorMask, int gameMask)
{
try
{
ReplacementDrawModel(__instance, editorMask, gameMask);
return false;
}
catch (Exception arg)
{
if (!failedOnce)
{
failedOnce = true;
SwarmDrawFixPlugin.Log.LogError((object)$"замена DrawModel упала, откат на оригинал: {arg}");
}
return true;
}
}
private static void ReplacementDrawModel(DysonSwarm sw, int editorMask, int gameMask)
{
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Invalid comparison between Unknown and I4
//IL_0159: Unknown result type (might be due to invalid IL or missing references)
//IL_0160: Expected O, but got Unknown
//IL_016b: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Expected O, but got Unknown
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_0184: Expected O, but got Unknown
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
//IL_0202: Unknown result type (might be due to invalid IL or missing references)
//IL_0203: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_022e: Unknown result type (might be due to invalid IL or missing references)
//IL_0238: Expected I4, but got Unknown
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
//IL_025c: Invalid comparison between Unknown and I4
//IL_0264: Unknown result type (might be due to invalid IL or missing references)
//IL_026a: Invalid comparison between Unknown and I4
//IL_027d: Unknown result type (might be due to invalid IL or missing references)
//IL_0291: Unknown result type (might be due to invalid IL or missing references)
//IL_0296: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)Configs.builtin.solarSailMesh == (Object)null || sw.starData == null || sw.gameData == null || (Object)(object)Camera.main == (Object)null || sw.sailCursor <= 1)
{
return;
}
uint num = (uint)(GameMain.gameTick & 0xFFFFFFFFu);
Vector3 zero = Vector3.zero;
Vector4 val = default(Vector4);
((Vector4)(ref val))..ctor(0f, 0f, 0f, 1f);
Vector3 val2 = Vector3.zero;
PlanetData localPlanet = sw.gameData.localPlanet;
Player mainPlayer = sw.gameData.mainPlayer;
VectorLF3 uPosition = sw.starData.uPosition;
if (localPlanet != null)
{
uPosition -= mainPlayer.uPosition;
uPosition = Maths.QInvRotateLF(localPlanet.runtimeRotation, uPosition);
uPosition += VectorLF3.op_Implicit(mainPlayer.position);
((Vector4)(ref val))..ctor(localPlanet.runtimeRotation.x, localPlanet.runtimeRotation.y, localPlanet.runtimeRotation.z, localPlanet.runtimeRotation.w);
}
else
{
uPosition -= mainPlayer.uPosition;
}
zero = VectorLF3.op_Implicit(uPosition);
if ((int)DysonSphere.renderPlace == 1)
{
val2 = VectorLF3.op_Implicit((sw.starData.uPosition - UIStarmap.viewTargetStatic) * 0.00025);
}
ComputeBuffer val3 = (ComputeBuffer)SwarmDrawFixPlugin.SwarmBufferField.GetValue(sw);
ComputeBuffer val4 = (ComputeBuffer)SwarmDrawFixPlugin.SwarmInfoBufferField.GetValue(sw);
ComputeBuffer val5 = (ComputeBuffer)SwarmDrawFixPlugin.OrbitColorsBufferField.GetValue(sw);
if (val3 != null)
{
Material sailNearMaterial = sw.sailNearMaterial;
sailNearMaterial.SetBuffer("_NearIdBuffer", GetIdentityBuffer(sw.sailCursor));
sailNearMaterial.SetBuffer("_SwarmBuffer", val3);
sailNearMaterial.SetBuffer("_SwarmInfoBuffer", val4);
sailNearMaterial.SetBuffer("_NodeBuffer", sw.dysonSphere.nrdBuffer);
sailNearMaterial.SetBuffer("_OrbitColor", val5);
sailNearMaterial.SetVector("_SunPosition", Vector4.op_Implicit(zero));
sailNearMaterial.SetVector("_SunPosition_Map", Vector4.op_Implicit(val2));
sailNearMaterial.SetVector("_LocalRot", val);
sailNearMaterial.SetInt("_GameTick", (int)num);
sailNearMaterial.SetInt("_Global_DS_RenderPlace", (int)DysonSphere.renderPlace);
sailNearMaterial.SetInt("_Global_DS_EditorMaskS", editorMask);
sailNearMaterial.SetInt("_Global_DS_GameMaskS", gameMask);
int num2 = 16;
if ((int)DysonSphere.renderPlace == 1)
{
num2 = 20;
}
else if ((int)DysonSphere.renderPlace == 2)
{
num2 = 21;
}
Graphics.DrawMeshInstancedProcedural(Configs.builtin.solarSailMesh, 0, sailNearMaterial, new Bounds(Vector3.zero, new Vector3(100000f, 100000f, 100000f)), sw.sailCursor, (MaterialPropertyBlock)null, (ShadowCastingMode)0, false, num2, (Camera)null, (LightProbeUsage)1, (LightProbeProxyVolume)null);
}
}
}