1
0
Fork 0
forked from aly/qstbak

muffin v6.28

This commit is contained in:
alydev 2025-10-19 17:39:44 +10:00
parent 44d33a0b56
commit 35a2f8bc36
3 changed files with 357 additions and 78 deletions

View file

@ -35,6 +35,12 @@ internal sealed class CombatController : IDisposable
public required DateTime LastDistanceCheck { get; set; }
public bool HasAttemptedFateSync { get; set; }
public Dictionary<int, int> KillCountsByComplexDataIndex { get; } = new Dictionary<int, int>();
public int TotalKillCount { get; set; }
public HashSet<ulong> CountedEnemies { get; } = new HashSet<ulong>();
}
public sealed class CombatData
@ -158,6 +164,7 @@ internal sealed class CombatController : IDisposable
{
if (gameObject.IsDead)
{
TrackKillIfNeeded(gameObject);
ElementId elementId = _currentFight.Data.ElementId;
QuestProgressInfo questProgressInfo = ((elementId != null) ? _questFunctions.GetQuestProgressInfo(elementId) : null);
if (questProgressInfo != null && questProgressInfo.Sequence == _currentFight.Data.Sequence && QuestWorkUtils.HasCompletionFlags(_currentFight.Data.CompletionQuestVariablesFlags) && QuestWorkUtils.MatchesQuestWork(_currentFight.Data.CompletionQuestVariablesFlags, questProgressInfo))
@ -230,6 +237,34 @@ internal sealed class CombatController : IDisposable
return EStatus.InCombat;
}
private void TrackKillIfNeeded(IGameObject deadEnemy)
{
if (_currentFight == null || !(deadEnemy is IBattleNpc battleNpc) || !_currentFight.CountedEnemies.Add(deadEnemy.GameObjectId))
{
return;
}
List<ComplexCombatData> complexCombatDatas = _currentFight.Data.ComplexCombatDatas;
for (int i = 0; i < complexCombatDatas.Count; i++)
{
ComplexCombatData complexCombatData = complexCombatDatas[i];
if (complexCombatData.DataId == battleNpc.BaseId && (!complexCombatData.NameId.HasValue || complexCombatData.NameId == battleNpc.NameId) && complexCombatData.MinimumKillCount.HasValue)
{
if (!_currentFight.KillCountsByComplexDataIndex.ContainsKey(i))
{
_currentFight.KillCountsByComplexDataIndex[i] = 0;
}
_currentFight.KillCountsByComplexDataIndex[i]++;
_logger.LogInformation("Tracked kill for ComplexCombatData[{Index}] ({DataId}): {Count}/{Required}", i, complexCombatData.DataId, _currentFight.KillCountsByComplexDataIndex[i], complexCombatData.MinimumKillCount.Value);
return;
}
}
if (complexCombatDatas.Count == 0 && _currentFight.Data.KillEnemyDataIds.Contains(battleNpc.BaseId))
{
_currentFight.TotalKillCount++;
_logger.LogInformation("Tracked kill for KillEnemyDataIds ({DataId}): Total count = {Count}", battleNpc.BaseId, _currentFight.TotalKillCount);
}
}
private unsafe IGameObject? FindNextTarget()
{
if (_currentFight == null)
@ -246,6 +281,16 @@ internal sealed class CombatController : IDisposable
continue;
}
ComplexCombatData complexCombatData = complexCombatDatas[i];
if (complexCombatData.MinimumKillCount.HasValue)
{
int valueOrDefault = _currentFight.KillCountsByComplexDataIndex.GetValueOrDefault(i, 0);
if (valueOrDefault >= complexCombatData.MinimumKillCount.Value)
{
_logger.LogInformation("Complex combat condition fulfilled: killCount({DataId}) = {Count}/{Required}", complexCombatData.DataId, valueOrDefault, complexCombatData.MinimumKillCount.Value);
_currentFight.Data.CompletedComplexDatas.Add(i);
continue;
}
}
if (complexCombatData.RewardItemId.HasValue && complexCombatData.RewardItemCount.HasValue && InventoryManager.Instance()->GetInventoryItemCount(complexCombatData.RewardItemId.Value, isHq: false, checkEquipped: true, checkArmory: true, 0) >= complexCombatData.RewardItemCount.Value)
{
_logger.LogInformation("Complex combat condition fulfilled: itemCount({ItemId}) >= {ItemCount}", complexCombatData.RewardItemId, complexCombatData.RewardItemCount);