装备系统完结,修复并加入很多
This commit is contained in:
@@ -146,6 +146,15 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
private int _lastManaFullCastFrame = -1;
|
||||
private bool _pendingManaFullCastRetry = false;
|
||||
|
||||
// Last event payloads used by custom equipment skill handlers.
|
||||
public int lastHealOverflowAmount { get; private set; }
|
||||
public int lastHealActualAmount { get; private set; }
|
||||
public int lastDamageTakenAmount { get; private set; }
|
||||
public int lastAdjacentAllyDamageTakenAmount { get; private set; }
|
||||
public int lastMaxHPIncreaseAmount { get; private set; }
|
||||
public int lastManaSpentAmount { get; private set; }
|
||||
public bool lastManaSpendWasFullBar { get; private set; }
|
||||
|
||||
// Reusable buffers to reduce allocations during skill evaluation
|
||||
private readonly List<SkillDefinition> _tmpSkillDefs = new List<SkillDefinition>(16);
|
||||
private readonly Dictionary<string, float> _formulaVarsBuffer = new Dictionary<string, float>(16);
|
||||
@@ -1001,20 +1010,22 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
var eff = GetEffectiveLevelForExp(a, slotExp);
|
||||
if (eff != null)
|
||||
{
|
||||
maxHP = eff.maxHP;
|
||||
maxMana = eff.maxMana;
|
||||
damageResistance = eff.damageResistance;
|
||||
scoreEfficiency = eff.scoreEfficiency;
|
||||
SetAttack(eff.attack);
|
||||
var resolved = a.GetEffectiveLevelInfoWithEquipment(eff);
|
||||
maxHP = resolved.maxHP;
|
||||
maxMana = resolved.maxMana;
|
||||
damageResistance = resolved.damageResistance;
|
||||
scoreEfficiency = resolved.scoreEfficiency;
|
||||
SetAttack(resolved.attack);
|
||||
}
|
||||
else
|
||||
{
|
||||
var lvl = a.levelStats[0];
|
||||
maxHP = lvl.maxHP;
|
||||
maxMana = lvl.maxMana;
|
||||
damageResistance = lvl.damageResistance;
|
||||
scoreEfficiency = lvl.scoreEfficiency;
|
||||
SetAttack(lvl.attack);
|
||||
var resolved = a.GetEffectiveLevelInfoWithEquipment(lvl);
|
||||
maxHP = resolved.maxHP;
|
||||
maxMana = resolved.maxMana;
|
||||
damageResistance = resolved.damageResistance;
|
||||
scoreEfficiency = resolved.scoreEfficiency;
|
||||
SetAttack(resolved.attack);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1263,6 +1274,12 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
|
||||
UpdateUIImmediate();
|
||||
|
||||
lastMaxHPIncreaseAmount = Mathf.Max(0, maxHP - oldMax);
|
||||
if (lastMaxHPIncreaseAmount > 0)
|
||||
{
|
||||
TryTriggerSkillsOnEvent(SkillDefinition.SkillTrigger.OnMaxHPIncreased);
|
||||
}
|
||||
|
||||
// Max HP change affects percentage triggers
|
||||
EvaluateHPPercentageTriggers(oldHP);
|
||||
}
|
||||
@@ -1309,6 +1326,8 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
}
|
||||
else if (delta < 0)
|
||||
{
|
||||
lastManaSpentAmount = -delta;
|
||||
lastManaSpendWasFullBar = old >= maxMana && currentMana <= 0;
|
||||
if (_isTriggeringManaLost) return;
|
||||
_isTriggeringManaLost = true;
|
||||
try
|
||||
@@ -1320,6 +1339,11 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
_isTriggeringManaLost = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lastManaSpentAmount = 0;
|
||||
lastManaSpendWasFullBar = false;
|
||||
}
|
||||
|
||||
int finalMana = currentMana;
|
||||
if (requestedMana != old || incomingOverflowGainAtFull)
|
||||
@@ -1648,6 +1672,7 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
ModifyHP(-delta, true, true);
|
||||
|
||||
int actual = oldHP - currentHP;
|
||||
lastDamageTakenAmount = actual;
|
||||
GameplaySkillLogger.RecordAllyResourceEvent(
|
||||
allyName,
|
||||
slotIndex,
|
||||
@@ -1671,6 +1696,12 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
iNumberPrefabController.SpawnForAllyStatic(slotIndex, iNumberPrefabController.InstantNumberType.Damage, -actual);
|
||||
}
|
||||
}
|
||||
|
||||
if (actual > 0)
|
||||
{
|
||||
TryTriggerSkillsOnEvent(SkillDefinition.SkillTrigger.OnDamageTaken);
|
||||
NotifyAdjacentAlliesDamaged(actual);
|
||||
}
|
||||
}
|
||||
|
||||
public void ReceiveHeal(float amount, GameObject source, bool deferPopup = false)
|
||||
@@ -1679,8 +1710,11 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
int oldHP = currentHP;
|
||||
float mult = GetTotalHealReceivedMultiplier();
|
||||
int delta = Mathf.CeilToInt(amount * mult);
|
||||
int rawTargetHp = oldHP + delta;
|
||||
ModifyHP(delta, true, true);
|
||||
int actual = currentHP - oldHP;
|
||||
lastHealActualAmount = actual;
|
||||
lastHealOverflowAmount = Mathf.Max(0, rawTargetHp - maxHP);
|
||||
GameplaySkillLogger.RecordAllyResourceEvent(
|
||||
allyName,
|
||||
slotIndex,
|
||||
@@ -1706,6 +1740,26 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
}
|
||||
}
|
||||
|
||||
private void NotifyAdjacentAlliesDamaged(int actualDamage)
|
||||
{
|
||||
if (actualDamage <= 0) return;
|
||||
var ui = teamUIController.Instance;
|
||||
if (ui == null) return;
|
||||
|
||||
int[] adjacent = ui.GetAdjacentAllyIndices(slotIndex);
|
||||
if (adjacent == null || adjacent.Length == 0) return;
|
||||
|
||||
for (int i = 0; i < adjacent.Length; i++)
|
||||
{
|
||||
var allyObj = ui.GetAllyObjectBySlot(adjacent[i]);
|
||||
if (allyObj == null) continue;
|
||||
var ally = allyObj.GetComponent<AllyCombatant>();
|
||||
if (ally == null || ally == this || ally.IsDead) continue;
|
||||
ally.lastAdjacentAllyDamageTakenAmount = actualDamage;
|
||||
ally.TryTriggerSkillsOnEvent(SkillDefinition.SkillTrigger.OnAdjacentAllyDamaged);
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyBuff(Buff buff, GameObject source)
|
||||
{
|
||||
ApplyBuffInternal(buff, source, true);
|
||||
@@ -1764,17 +1818,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
if (so == null) return;
|
||||
|
||||
// If equipped groups exist, iterate them first
|
||||
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
|
||||
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
|
||||
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
|
||||
{
|
||||
foreach (var gid in so.equippedSkillGroupIDs)
|
||||
foreach (int gid in runtimeGroupIds)
|
||||
{
|
||||
if (gid == 0) continue;
|
||||
SkillGroup group = null;
|
||||
for (int k = 0; k < so.skillGroups.Length; k++)
|
||||
{
|
||||
var g = so.skillGroups[k];
|
||||
if (g != null && g.skillGroupID == gid) { group = g; break; }
|
||||
}
|
||||
SkillGroup group = so.GetSkillGroupByID(gid);
|
||||
if (group == null) continue;
|
||||
foreach (var def in group.skills)
|
||||
{
|
||||
@@ -1874,13 +1924,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
bool anyTriggered = false;
|
||||
|
||||
// First: equipped groups
|
||||
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
|
||||
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
|
||||
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
|
||||
{
|
||||
foreach (int gid in so.equippedSkillGroupIDs)
|
||||
foreach (int gid in runtimeGroupIds)
|
||||
{
|
||||
if (gid == 0) continue;
|
||||
SkillGroup group = null;
|
||||
for (int k = 0; k < so.skillGroups.Length; k++) { var g = so.skillGroups[k]; if (g != null && g.skillGroupID == gid) { group = g; break; } }
|
||||
SkillGroup group = so.GetSkillGroupByID(gid);
|
||||
if (group == null) continue;
|
||||
foreach (var skill in group.skills)
|
||||
{
|
||||
@@ -2029,17 +2079,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
// Collect candidate skills (same priority order as other triggers)
|
||||
var defs = _tmpSkillDefs;
|
||||
defs.Clear();
|
||||
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
|
||||
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
|
||||
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
|
||||
{
|
||||
foreach (var gid in so.equippedSkillGroupIDs)
|
||||
foreach (int gid in runtimeGroupIds)
|
||||
{
|
||||
if (gid == 0) continue;
|
||||
SkillGroup group = null;
|
||||
for (int k = 0; k < so.skillGroups.Length; k++)
|
||||
{
|
||||
var g = so.skillGroups[k];
|
||||
if (g != null && g.skillGroupID == gid) { group = g; break; }
|
||||
}
|
||||
SkillGroup group = so.GetSkillGroupByID(gid);
|
||||
if (group == null || group.skills == null) continue;
|
||||
for (int i = 0; i < group.skills.Length; i++)
|
||||
{
|
||||
@@ -2193,17 +2239,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
|
||||
var defs = _tmpSkillDefs;
|
||||
defs.Clear();
|
||||
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
|
||||
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
|
||||
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
|
||||
{
|
||||
foreach (var gid in so.equippedSkillGroupIDs)
|
||||
foreach (int gid in runtimeGroupIds)
|
||||
{
|
||||
if (gid == 0) continue;
|
||||
SkillGroup group = null;
|
||||
for (int k = 0; k < so.skillGroups.Length; k++)
|
||||
{
|
||||
var g = so.skillGroups[k];
|
||||
if (g != null && g.skillGroupID == gid) { group = g; break; }
|
||||
}
|
||||
SkillGroup group = so.GetSkillGroupByID(gid);
|
||||
if (group == null || group.skills == null) continue;
|
||||
for (int i = 0; i < group.skills.Length; i++)
|
||||
{
|
||||
@@ -2299,17 +2341,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
|
||||
var defs = _tmpSkillDefs;
|
||||
defs.Clear();
|
||||
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
|
||||
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
|
||||
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
|
||||
{
|
||||
foreach (var gid in so.equippedSkillGroupIDs)
|
||||
foreach (int gid in runtimeGroupIds)
|
||||
{
|
||||
if (gid == 0) continue;
|
||||
SkillGroup group = null;
|
||||
for (int k = 0; k < so.skillGroups.Length; k++)
|
||||
{
|
||||
var g = so.skillGroups[k];
|
||||
if (g != null && g.skillGroupID == gid) { group = g; break; }
|
||||
}
|
||||
SkillGroup group = so.GetSkillGroupByID(gid);
|
||||
if (group == null || group.skills == null) continue;
|
||||
for (int i = 0; i < group.skills.Length; i++)
|
||||
{
|
||||
@@ -2424,17 +2462,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
|
||||
|
||||
var defs = _tmpSkillDefs;
|
||||
defs.Clear();
|
||||
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
|
||||
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
|
||||
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
|
||||
{
|
||||
foreach (var gid in so.equippedSkillGroupIDs)
|
||||
foreach (int gid in runtimeGroupIds)
|
||||
{
|
||||
if (gid == 0) continue;
|
||||
SkillGroup group = null;
|
||||
for (int k = 0; k < so.skillGroups.Length; k++)
|
||||
{
|
||||
var g = so.skillGroups[k];
|
||||
if (g != null && g.skillGroupID == gid) { group = g; break; }
|
||||
}
|
||||
SkillGroup group = so.GetSkillGroupByID(gid);
|
||||
if (group == null || group.skills == null) continue;
|
||||
for (int i = 0; i < group.skills.Length; i++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user