1
0
mirror of https://github.com/soarqin/DSP_Mods.git synced 2025-12-08 22:13:30 +08:00

work in progress

This commit is contained in:
2025-11-30 18:08:13 +08:00
parent 3f7c384284
commit 29ee32b11b
8 changed files with 168 additions and 3 deletions

View File

@@ -1,8 +1,10 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection.Emit;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Networking;
using UXAssist.Common;
namespace UXAssist.Patches;
@@ -170,4 +172,157 @@ public class PersistPatch : PatchImpl<PersistPatch>
{
return false;
}
#region Cluster Upload Result
const int ClusterUploadResultKeepCount = 100;
private static readonly ClusterUploadResult[] _clusterUploadResults = new ClusterUploadResult[ClusterUploadResultKeepCount];
private static readonly object _clusterUploadResultsLock = new();
private static int _clusterUploadResultsHead = 0;
private static int _clusterUploadResultsCount = 0;
private static ClusterPlayerData[] _topTenPlayerData = null;
private struct ClusterUploadResult
{
public DateTime UploadTime;
public int Result;
public float RequestTime;
}
private static void AddClusterUploadResult(int result, float requestTime)
{
lock (_clusterUploadResultsLock)
{
if (_clusterUploadResultsCount >= ClusterUploadResultKeepCount)
{
_clusterUploadResults[_clusterUploadResultsHead] = new ClusterUploadResult { UploadTime = DateTime.Now, Result = result, RequestTime = requestTime };
_clusterUploadResultsHead = (_clusterUploadResultsHead + 1) % ClusterUploadResultKeepCount;
}
else
{
_clusterUploadResults[(_clusterUploadResultsHead + _clusterUploadResultsCount) % ClusterUploadResultKeepCount] = new ClusterUploadResult { UploadTime = DateTime.Now, Result = result, RequestTime = requestTime };
_clusterUploadResultsCount++;
}
}
}
public static void ExportClusterUploadResults(BinaryWriter w)
{
lock (_clusterUploadResultsLock)
{
w.Write(_clusterUploadResultsCount);
w.Write(_clusterUploadResultsHead);
for (var i = 0; i < _clusterUploadResultsCount; i++)
{
ref var result = ref _clusterUploadResults[(i + _clusterUploadResultsHead) % ClusterUploadResultKeepCount];
w.Write(result.UploadTime.ToBinary());
w.Write(result.Result);
w.Write(result.RequestTime);
}
}
}
public static void ImportClusterUploadResults(BinaryReader r)
{
lock (_clusterUploadResultsLock)
{
_clusterUploadResultsCount = r.ReadInt32();
_clusterUploadResultsHead = r.ReadInt32();
for (var i = 0; i < _clusterUploadResultsCount; i++)
{
ref var result = ref _clusterUploadResults[(i + _clusterUploadResultsHead) % ClusterUploadResultKeepCount];
result.UploadTime = DateTime.FromBinary(r.ReadInt64());
result.Result = r.ReadInt32();
result.RequestTime = r.ReadSingle();
}
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(MilkyWayWebClient), nameof(MilkyWayWebClient.OnUploadLoginErrored))]
private static void MilkyWayWebClient_OnUploadLoginErrored_Postfix(MilkyWayWebClient __instance, DSPWeb.HTTP_ERROR_TYPE errorType, string errorInfo, int errorCode)
{
switch (errorType)
{
case DSPWeb.HTTP_ERROR_TYPE.NETWORK_ERROR:
AddClusterUploadResult(-10001, (float)__instance.uploadRequest.reqTime);
break;
case DSPWeb.HTTP_ERROR_TYPE.HTTP_ERROR:
AddClusterUploadResult(-10010 - errorCode, (float)__instance.uploadRequest.reqTime);
break;
case DSPWeb.HTTP_ERROR_TYPE.USER_ABORT:
AddClusterUploadResult(-10003, (float)__instance.uploadRequest.reqTime);
break;
case DSPWeb.HTTP_ERROR_TYPE.UNEXPECTED_ERROR:
AddClusterUploadResult(-10004, (float)__instance.uploadRequest.reqTime);
break;
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(MilkyWayWebClient), nameof(MilkyWayWebClient.OnUploadErrored))]
private static void MilkyWayWebClient_OnUploadErrored_Postfix(MilkyWayWebClient __instance, DSPWeb.HTTP_ERROR_TYPE errorType, string errorInfo, int errorCode)
{
switch (errorType)
{
case DSPWeb.HTTP_ERROR_TYPE.NETWORK_ERROR:
AddClusterUploadResult(-101, (float)__instance.uploadRequest.reqTime);
break;
case DSPWeb.HTTP_ERROR_TYPE.HTTP_ERROR:
AddClusterUploadResult(-110 - errorCode, (float)__instance.uploadRequest.reqTime);
break;
case DSPWeb.HTTP_ERROR_TYPE.USER_ABORT:
AddClusterUploadResult(-103, (float)__instance.uploadRequest.reqTime);
break;
case DSPWeb.HTTP_ERROR_TYPE.UNEXPECTED_ERROR:
AddClusterUploadResult(-104, (float)__instance.uploadRequest.reqTime);
break;
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(MilkyWayWebClient), nameof(MilkyWayWebClient.OnUploadSucceed))]
private static void MilkyWayWebClient_OnUploadSucceed_Postfix(MilkyWayWebClient __instance, DownloadHandler handler)
{
if (!int.TryParse(handler.text, out var rcode))
rcode = -1;
AddClusterUploadResult(rcode, (float)__instance.uploadRequest.reqTime);
}
[HarmonyTranspiler]
[HarmonyPatch(typeof(MilkyWayCache), nameof(MilkyWayCache.LoadTopTenPlayerData))]
private static IEnumerable<CodeInstruction> MilkyWayCache_LoadTopTenPlayerData_Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
{
var matcher = new CodeMatcher(instructions, generator);
matcher.MatchForward(false,
new CodeMatch(OpCodes.Ldarg_1),
new CodeMatch(OpCodes.Callvirt, AccessTools.PropertyGetter(typeof(BinaryReader), nameof(BinaryReader.ReadInt32)))
).Advance(2).InsertAndAdvance(
new CodeInstruction(OpCodes.Dup),
Transpilers.EmitDelegate((int count) => _topTenPlayerData = new ClusterPlayerData[count])
);
matcher.MatchForward(false,
new CodeMatch(OpCodes.Ldloca_S),
new CodeMatch(OpCodes.Ldarg_1),
new CodeMatch(OpCodes.Callvirt),
new CodeMatch(OpCodes.Stfld, AccessTools.Field(typeof(ClusterPlayerData), nameof(ClusterPlayerData.isAnon)))
);
var objloc = matcher.Operand;
matcher.Advance(4);
var iinstr = matcher.Instruction.Clone();
matcher.InsertAndAdvance(
iinstr,
new CodeInstruction(OpCodes.Ldloca_S, objloc),
Transpilers.EmitDelegate((int index, ref ClusterPlayerData playerData) =>
{
if (index < _topTenPlayerData.Length) _topTenPlayerData[index] = playerData;
})
);
return matcher.InstructionEnumeration();
}
#endregion
}

View File

@@ -5,6 +5,7 @@ using HarmonyLib;
using UXAssist.Common;
namespace UXAssist.Patches;
public static class PlanetPatch
{
public static ConfigEntry<bool> PlayerActionsInGlobeViewEnabled;