public static void Postfix(AttackDirector __instance, MessageCenterMessage message) { Mod.Log.Debug("AD:OASE - entered."); AttackSequenceEndMessage attackSequenceEndMessage = (AttackSequenceEndMessage)message; int sequenceId = attackSequenceEndMessage.sequenceId; AttackDirector.AttackSequence attackSequence = __instance.GetAttackSequence(sequenceId); if (ModState.BreachAttackId != attackSequence.id) { Mod.Log.Error("INCOHERENT ATTACK SEQUENCE- SKIPPING!"); return; } if (attackSequence.chosenTarget is Mech targetMech) { Mod.Log.Debug($"Checking hull breaches for targetMech: {CombatantUtils.Label(targetMech)}"); ResolveMechHullBreaches(targetMech); } if (attackSequence.chosenTarget is Turret targetTurret) { Mod.Log.Debug($"Checking hull breaches for targetTurret: {CombatantUtils.Label(targetTurret)}"); ResolveTurretHullBreaches(targetTurret); } if (attackSequence.chosenTarget is Vehicle targetVehicle) { Mod.Log.Debug($"Checking hull breaches for targetVehicle: {CombatantUtils.Label(targetVehicle)}"); ResolveVehicleHullBreaches(targetVehicle); } // Reset state ModState.BreachAttackId = 0; ModState.BreachHitsMech.Clear(); ModState.BreachHitsTurret.Clear(); ModState.BreachHitsVehicle.Clear(); Mod.Log.Debug("AD:OASE - exiting."); }
public static void Postfix(AttackDirector __instance, MessageCenterMessage message) { Mod.Log.Debug?.Write("AD:OASE - entered."); // Nothing to do if (ModState.BreachAttackId == ModState.NO_ATTACK_SEQUENCE_ID) { return; } AttackSequenceEndMessage attackSequenceEndMessage = message as AttackSequenceEndMessage; if (__instance == null || attackSequenceEndMessage == null) { return; } int sequenceId = attackSequenceEndMessage.sequenceId; AttackDirector.AttackSequence attackSequence = __instance.GetAttackSequence(sequenceId); if (attackSequence == null) { Mod.Log.Info?.Write($"Could not find attack sequence with id: {sequenceId}. CAC may have killed it, or there's an error in processing. Skipping hull breach checks."); return; } // No chosen target, nothing to damage if (attackSequence.chosenTarget == null) { return; } if (ModState.BreachAttackId != attackSequence.id) { Mod.Log.Debug?.Write($"Attack sequence ID {attackSequence.id} does not match Hull Breach Attack Id - skipping hull breach resolution."); return; } float structureDamage = attackSequence.GetStructureDamageDealt(attackSequence.chosenTarget.GUID); Mod.Log.Debug?.Write($"Attack sequence {sequenceId} did {structureDamage} structure damage to target: {attackSequence.chosenTarget.GUID}"); if (structureDamage == 0f) { Mod.Log.Debug?.Write($"Attack did no structure damage, skipping."); return; } if (attackSequence.chosenTarget is Mech targetMech) { Mod.Log.Debug?.Write($"Checking hull breaches for targetMech: {CombatantUtils.Label(targetMech)}"); ResolveMechHullBreaches(targetMech); } if (attackSequence.chosenTarget is Turret targetTurret) { Mod.Log.Debug?.Write($"Checking hull breaches for targetTurret: {CombatantUtils.Label(targetTurret)}"); ResolveTurretHullBreaches(targetTurret); } if (attackSequence.chosenTarget is Vehicle targetVehicle) { Mod.Log.Debug?.Write($"Checking hull breaches for targetVehicle: {CombatantUtils.Label(targetVehicle)}"); ResolveVehicleHullBreaches(targetVehicle); } // Reset state ModState.BreachAttackId = ModState.NO_ATTACK_SEQUENCE_ID; ModState.BreachHitsMech.Clear(); ModState.BreachHitsTurret.Clear(); ModState.BreachHitsVehicle.Clear(); Mod.Log.Debug?.Write("AD:OASE - exiting."); }