Fix cooldown ticker ending at the wrong time
This commit is contained in:
parent
84dec875b9
commit
00589d1c28
1 changed files with 15 additions and 16 deletions
|
@ -86,7 +86,7 @@ namespace CLre.Fixes
|
||||||
//API.Utility.Logging.MetaLog($"Cooling down? {isInCooldown} for {cooldownLeft}s");
|
//API.Utility.Logging.MetaLog($"Cooling down? {isInCooldown} for {cooldownLeft}s");
|
||||||
// build functions for querying all Game.Handhelds.WeaponCooldownEntityView objects
|
// build functions for querying all Game.Handhelds.WeaponCooldownEntityView objects
|
||||||
Type protoRaw =
|
Type protoRaw =
|
||||||
typeof(Reflection.QueryEntityViews<IEntityViewStruct>).GetGenericTypeDefinition()
|
typeof(Reflection.QueryEntityViews<>)
|
||||||
.MakeGenericType(
|
.MakeGenericType(
|
||||||
AccessTools.TypeByName("Game.Handhelds.WeaponCooldownEntityView"));
|
AccessTools.TypeByName("Game.Handhelds.WeaponCooldownEntityView"));
|
||||||
Delegate queryAllWCEV =
|
Delegate queryAllWCEV =
|
||||||
|
@ -100,10 +100,16 @@ namespace CLre.Fixes
|
||||||
object collectionStruct =
|
object collectionStruct =
|
||||||
queryAllWCEV.DynamicInvoke((int) baseGroup);
|
queryAllWCEV.DynamicInvoke((int) baseGroup);
|
||||||
int count = Traverse.Create(collectionStruct).Field<int>("_count").Value;
|
int count = Traverse.Create(collectionStruct).Field<int>("_count").Value;
|
||||||
PropertyInfo indexer = typeof(Svelto.DataStructures.ReadOnlyCollectionStruct<IEntityStruct>).GetGenericTypeDefinition()
|
PropertyInfo indexer = typeof(Svelto.DataStructures.ReadOnlyCollectionStruct<>)
|
||||||
.MakeGenericType(AccessTools.TypeByName("Game.Handhelds.WeaponCooldownEntityView"))
|
.MakeGenericType(AccessTools.TypeByName("Game.Handhelds.WeaponCooldownEntityView"))
|
||||||
.GetIndexer();
|
.GetIndexer();
|
||||||
object[] indexParams = {0};
|
|
||||||
|
if (!isRunningTick)
|
||||||
|
{
|
||||||
|
isRunningTick = true;
|
||||||
|
cooldownTickEverything(characterId, cwcevExists, queryCWCEV, queryWCEV, queryAllWCEV, indexer, baseGroup).Run();
|
||||||
|
}
|
||||||
|
/*object[] indexParams = {0};
|
||||||
for (int index = 0; index < count; index++)
|
for (int index = 0; index < count; index++)
|
||||||
{
|
{
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
@ -119,12 +125,7 @@ namespace CLre.Fixes
|
||||||
Traverse.Create(wcev)
|
Traverse.Create(wcev)
|
||||||
.Field("weaponCooldownComponent")
|
.Field("weaponCooldownComponent")
|
||||||
.Property<bool>("isInCooldown").Value = isInCooldown;
|
.Property<bool>("isInCooldown").Value = isInCooldown;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (!isRunningTick)
|
|
||||||
{
|
|
||||||
cooldownTickEverything(characterId, entitiesDB, cwcevExists, queryCWCEV, queryWCEV, queryAllWCEV, indexer, baseGroup).Run();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HarmonyTargetMethod]
|
[HarmonyTargetMethod]
|
||||||
|
@ -134,14 +135,10 @@ namespace CLre.Fixes
|
||||||
new[] {typeof(int), typeof(bool)});
|
new[] {typeof(int), typeof(bool)});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerator cooldownTickEverything(int characterId, IEntitiesDB entitiesDb, Reflection.ExistsV2 cwcevExists, Reflection.QueryEntityViewV2<object> cwcevQuery, Reflection.QueryEntityViewV2<object> wcevQuery, Delegate wcevQueryAll, PropertyInfo indexer, ExclusiveGroup baseGroup)
|
private static IEnumerator cooldownTickEverything(int characterId, Reflection.ExistsV2 cwcevExists, Reflection.QueryEntityViewV2<object> cwcevQuery, Reflection.QueryEntityViewV2<object> wcevQuery, Delegate wcevQueryAll, PropertyInfo indexer, ExclusiveGroup baseGroup)
|
||||||
{
|
{
|
||||||
isRunningTick = true;
|
|
||||||
while (cwcevExists(characterId, (int) DEPRECATED_SveltoExtensions.DEPRECATED_GROUP))
|
while (cwcevExists(characterId, (int) DEPRECATED_SveltoExtensions.DEPRECATED_GROUP))
|
||||||
{
|
{
|
||||||
#if DEBUG
|
|
||||||
API.Utility.Logging.MetaLog("Doing cooldown tick for all weapons");
|
|
||||||
#endif
|
|
||||||
// get equipped handheld info
|
// get equipped handheld info
|
||||||
object cwcevOriginal = cwcevQuery(characterId,
|
object cwcevOriginal = cwcevQuery(characterId,
|
||||||
(ExclusiveGroup.ExclusiveGroupStruct) DEPRECATED_SveltoExtensions.DEPRECATED_GROUP);
|
(ExclusiveGroup.ExclusiveGroupStruct) DEPRECATED_SveltoExtensions.DEPRECATED_GROUP);
|
||||||
|
@ -157,9 +154,9 @@ namespace CLre.Fixes
|
||||||
Traverse.Create(wcevOriginal).Field("weaponCooldownComponent").Property<float>("cooldownLeft").Value;
|
Traverse.Create(wcevOriginal).Field("weaponCooldownComponent").Property<float>("cooldownLeft").Value;
|
||||||
bool isInCooldown =
|
bool isInCooldown =
|
||||||
Traverse.Create(wcevOriginal).Field("weaponCooldownComponent").Property<bool>("isInCooldown").Value;
|
Traverse.Create(wcevOriginal).Field("weaponCooldownComponent").Property<bool>("isInCooldown").Value;
|
||||||
if (!isInCooldown) break;
|
|
||||||
object[] indexParams = {0};
|
object[] indexParams = {0};
|
||||||
// iterate over other handhelds and sync their cooldowns to the held item
|
// iterate over other handhelds and sync their cooldowns to the held item
|
||||||
|
API.Utility.Logging.MetaDebugLog($"Syncing {count} weapon cooldowns with the held item {toolId}");
|
||||||
for (int index = 0; index < count; index++)
|
for (int index = 0; index < count; index++)
|
||||||
{
|
{
|
||||||
indexParams[0] = index;
|
indexParams[0] = index;
|
||||||
|
@ -173,10 +170,12 @@ namespace CLre.Fixes
|
||||||
.Field("weaponCooldownComponent")
|
.Field("weaponCooldownComponent")
|
||||||
.Property<bool>("isInCooldown").Value = isInCooldown;
|
.Property<bool>("isInCooldown").Value = isInCooldown;
|
||||||
}
|
}
|
||||||
|
// stop running this task after one final sync to set every handheld to non-cooldown state
|
||||||
|
if (!isInCooldown && cooldownLeft <= 0) break;
|
||||||
yield return null;
|
yield return null;
|
||||||
}
|
}
|
||||||
// cleanup
|
// cleanup
|
||||||
|
API.Utility.Logging.MetaDebugLog("Custom cooldown ticks complete");
|
||||||
isRunningTick = false;
|
isRunningTick = false;
|
||||||
yield return null;
|
yield return null;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue