public static void Postfix(AttackDirector __instance, MessageCenterMessage message) { CustomAmmoCategoriesLog.Log.LogWrite($"Try jamm weapon\n"); while (JammingEnabler.jammQueue.Count > 0) { AbstractActor actor = JammingEnabler.jammQueue.Dequeue(); CustomAmmoCategoriesLog.Log.LogWrite($"Try jamm weapon of " + actor.DisplayName + "\n"); foreach (Weapon weapon in actor.Weapons) { CustomAmmoCategoriesLog.Log.LogWrite($" weapon " + weapon.UIName + " rounds since last fire " + weapon.roundsSinceLastFire + "\n"); if (weapon.roundsSinceLastFire > 0) { continue; } float flatJammingChance = CustomAmmoCategories.getWeaponFlatJammingChance(weapon); CustomAmmoCategoriesLog.Log.LogWrite($" flatJammingChance " + flatJammingChance + "\n"); if (flatJammingChance > CustomAmmoCategories.Epsilon) { CustomAmmoCategoriesLog.Log.LogWrite($" Try jamm weapon " + weapon.UIName + "\n"); float Roll = Random.Range(0.0f, 1.0f); CustomAmmoCategoriesLog.Log.LogWrite($" Jamming chance " + flatJammingChance + " roll " + Roll + "\n"); if (Roll < flatJammingChance) { CustomAmmoCategoriesLog.Log.LogWrite($" Jammed!\n"); CustomAmmoCategories.AddJam(actor, weapon); } } if (CustomAmmoCategories.getWeaponCooldown(weapon) > 0) { CustomAmmoCategories.AddCooldown(actor, weapon); } } } }
public static void Postfix(AttackDirector __instance, MessageCenterMessage message) { Mod.Log.Debug?.Write("AD:OASB - entered."); AttackSequenceBeginMessage asbMessage = message as AttackSequenceBeginMessage; if (__instance == null || asbMessage == null) { return; } int sequenceId = asbMessage.sequenceId; AttackDirector.AttackSequence attackSequence = __instance.GetAttackSequence(sequenceId); if (attackSequence == null) { Mod.Log.Debug?.Write($"AttackSequence not found - created by a mod or CAC watchdog killed it. Skipping!"); ModState.BreachAttackId = ModState.NO_ATTACK_SEQUENCE_ID; } // No chosen target, nothing to damage if (attackSequence.chosenTarget == null) { return; } Mod.Log.Debug?.Write($"Recording attackSequence: {attackSequence.id} for possible hull breaches."); ModState.BreachAttackId = attackSequence.id; }
public static void Postfix(AttackDirector __instance, MessageCenterMessage message) { Mod.Log.Debug("AD:OASB - entered."); int sequenceId = ((AttackSequenceBeginMessage)message).sequenceId; AttackDirector.AttackSequence attackSequence = __instance.GetAttackSequence(sequenceId); ModState.BreachAttackId = attackSequence.id; }
public static bool Prefix(AttackDirector __instance, MessageCenterMessage message) { AttackCompleteMessage attackCompleteMessage = (AttackCompleteMessage)message; int sequenceId = attackCompleteMessage.sequenceId; AttackDirector.AttackSequence attackSequence = __instance.GetAttackSequence(sequenceId); if (attackSequence == null) { return(true); } CustomAmmoCategoriesLog.Log.LogWrite($"Try jamm weapon of " + attackSequence.attacker.DisplayName + "\n"); JammingEnabler.jammQueue.Enqueue(attackSequence.attacker); return(true); }
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 Prefix(AttackDirector __instance, AbstractActor attacker, ICombatant target) { try { if (attacker == null || target == null) { return; } if (attacker.team.IsLocalPlayer) { // opforUnit = target.GetPilot().ParentActor; if ((target.UnitType & UnitType.Building) != 0) { SpecManager.ManagerInstance.GatherAndApplyActiveBuildingSpecEffects(attacker, target); return; } foreach (var encounterObjectGameLogic in attacker.Combat.EncounterLayerData.encounterObjectGameLogicList) { if (encounterObjectGameLogic as DefendLanceWithEscapeChunkGameLogic != null) { var encounterAsChunk = encounterObjectGameLogic as DefendLanceWithEscapeChunkGameLogic; var encounterAsOGL = encounterAsChunk.ensureUnitsSurviveObjective.encounterObject; if (Traverse.Create(encounterAsOGL).Property("IsContractObjectivePrimary").GetValue <bool>()) { ModInit.modLog.LogMessage($"Checking for primary target unit."); if (encounterAsOGL.GetTargetUnits().Contains(target)) { ModInit.modLog.LogMessage($"Primary target found."); SpecManager.ManagerInstance.GatherAndApplyActivePrimarySpecEffects(attacker, target); return; } } } else if (encounterObjectGameLogic as DefendXUnitsChunkGameLogic != null) { var encounterAsChunk = encounterObjectGameLogic as DefendXUnitsChunkGameLogic; var encounterAsOGL = encounterAsChunk.defendXUnitsObjective.encounterObject; if (Traverse.Create(encounterAsOGL).Property("IsContractObjectivePrimary").GetValue <bool>()) { ModInit.modLog.LogMessage($"Checking for primary target unit."); if (encounterAsOGL.GetTargetUnits().Contains(target)) { ModInit.modLog.LogMessage($"Primary target found."); SpecManager.ManagerInstance.GatherAndApplyActivePrimarySpecEffects(attacker, target); return; } } } else if (encounterObjectGameLogic as DestroyXUnitsChunkGameLogic != null) { var encounterAsChunk = encounterObjectGameLogic as DestroyXUnitsChunkGameLogic; var encounterAsOGL = encounterAsChunk.destroyXUnitsObjective.encounterObject; if (Traverse.Create(encounterAsOGL).Property("IsContractObjectivePrimary").GetValue <bool>()) { ModInit.modLog.LogMessage($"Checking for primary target unit."); if (encounterAsOGL.GetTargetUnits().Contains(target)) { ModInit.modLog.LogMessage($"Primary target found."); SpecManager.ManagerInstance.GatherAndApplyActivePrimarySpecEffects(attacker, target); return; } } } var opforUnit = target.GetPilot().ParentActor; SpecManager.ManagerInstance.GatherAndApplyActiveSpecEffects(attacker, opforUnit); } } else if (target.team.IsLocalPlayer) { var playerUnit = target.GetPilot().ParentActor; SpecManager.ManagerInstance.GatherAndApplyGlobalEffects(attacker, target); // ModInit.modLog.LogMessage($"Attacker is opfor {attacker.DisplayName}, target is player unit {playerUnit.GetPilot().Callsign}."); SpecManager.ManagerInstance.GatherAndApplyActiveSpecEffects(playerUnit, attacker); } else { ModInit.modLog.LogMessage($"Should be menage a trois."); SpecManager.ManagerInstance.GatherAndApplyGlobalEffects(attacker, target); } //var HUD = Traverse.Create(__instance).Property("HUD").GetValue<CombatHUD>(); //Traverse.Create(HUD).Method("updateHUDElements", ___displayedActor); } catch (Exception ex) { Logger.LogException(ex); } }
public static void Postfix(AttackDirector __instance, MessageCenterMessage message) { __instance.Combat.commitDamage(); }
public static void Postfix(MessageCenterMessage message, AttackDirector __instance) { // we want to clear out our memoized shot damage after every attack sequence // because if we don't then we get one random number per weapon per game ^_^ Logger.Debug($"sequence is beginning: resetting memoized damage rolls!"); VariantWeapon.WeaponDamageMemo.Clear(); }
public static void Postfix(AttackDirector __instance, MessageCenterMessage message) { TurnDamageTracker.hintAttackComplete("AttackDirector:OnAttackComplete"); }
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."); }