This commit is contained in:
2025-12-14 00:30:59 +01:00
parent e0b1b736c3
commit 3ee6fc4dc6

98
Main.cs
View File

@@ -155,7 +155,14 @@ namespace KCM
{ {
FieldInfo loadTickDelayField = instance.GetType().GetField("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo loadTickDelayField = instance.GetType().GetField("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic);
if (loadTickDelayField != null) if (loadTickDelayField != null)
{
loadTickDelayField.SetValue(instance, ticks); loadTickDelayField.SetValue(instance, ticks);
return;
}
PropertyInfo loadTickDelayProp = instance.GetType().GetProperty("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
if (loadTickDelayProp != null && loadTickDelayProp.CanWrite && loadTickDelayProp.PropertyType == typeof(int))
loadTickDelayProp.SetValue(instance, ticks, null);
} }
catch catch
{ {
@@ -170,12 +177,20 @@ namespace KCM
try try
{ {
FieldInfo loadTickDelayField = instance.GetType().GetField("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo loadTickDelayField = instance.GetType().GetField("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic);
if (loadTickDelayField == null) if (loadTickDelayField != null)
return -1; {
object v = loadTickDelayField.GetValue(instance);
if (v is int)
return (int)v;
}
object v = loadTickDelayField.GetValue(instance); PropertyInfo loadTickDelayProp = instance.GetType().GetProperty("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
if (v is int) if (loadTickDelayProp != null && loadTickDelayProp.CanRead && loadTickDelayProp.PropertyType == typeof(int))
return (int)v; {
object pv = loadTickDelayProp.GetValue(instance, null);
if (pv is int)
return (int)pv;
}
} }
catch catch
{ {
@@ -339,6 +354,11 @@ namespace KCM
#endregion #endregion
public static int FixedUpdateInterval = 0; public static int FixedUpdateInterval = 0;
private static long lastVillagerMoveMs = 0;
private static long lastVillagerProbeMs = 0;
private static long lastVillagerStallLogMs = 0;
private static Guid probedVillagerGuid = Guid.Empty;
private static Vector3 probedVillagerLastPos = Vector3.zero;
private void FixedUpdate() private void FixedUpdate()
{ {
@@ -369,6 +389,74 @@ namespace KCM
{ {
} }
try
{
if (KCClient.client != null &&
KCClient.client.IsConnected &&
World.inst != null &&
Time.timeScale > 0f &&
Villager.villagers != null &&
Villager.villagers.Count > 0)
{
long now = DateTimeOffset.Now.ToUnixTimeMilliseconds();
if ((now - lastVillagerProbeMs) >= 2000)
{
lastVillagerProbeMs = now;
Villager v = null;
try
{
if (probedVillagerGuid != Guid.Empty)
v = Villager.villagers.data.FirstOrDefault(x => x != null && x.guid == probedVillagerGuid);
}
catch
{
}
if (v == null)
{
v = Villager.villagers.data.FirstOrDefault(x => x != null);
if (v != null)
{
probedVillagerGuid = v.guid;
probedVillagerLastPos = v.Pos;
lastVillagerMoveMs = now;
}
}
if (v != null)
{
float movedSqr = (v.Pos - probedVillagerLastPos).sqrMagnitude;
if (movedSqr > 0.01f)
{
probedVillagerLastPos = v.Pos;
lastVillagerMoveMs = now;
}
if ((now - lastVillagerMoveMs) >= 15000 && (now - lastVillagerStallLogMs) >= 15000)
{
lastVillagerStallLogMs = now;
Main.helper.Log(
"VillagerStallDetect: no movement for " + (now - lastVillagerMoveMs) +
"ms timeScale=" + Time.timeScale +
" villagers=" + Villager.villagers.Count +
" sampleGuid=" + probedVillagerGuid +
" samplePos=" + v.Pos);
Main.helper.Log(
"VillagerStallDetect: loadTickDelay(Player/Unit/Job/Villager)=" +
GetLoadTickDelayOrMinusOne(Player.inst) + "/" +
GetLoadTickDelayOrMinusOne(UnitSystem.inst) + "/" +
GetLoadTickDelayOrMinusOne(JobSystem.inst) + "/" +
GetLoadTickDelayOrMinusOne(VillagerSystem.inst));
}
}
}
}
}
catch
{
}
// send batched building placement info // send batched building placement info
/*if (PlaceHook.QueuedBuildings.Count > 0 && (FixedUpdateInterval % 25 == 0)) /*if (PlaceHook.QueuedBuildings.Count > 0 && (FixedUpdateInterval % 25 == 0))
{ {