Exemplo n.º 1
0
 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;
        }
Exemplo n.º 4
0
        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.");
        }
Exemplo n.º 6
0
            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();
 }
Exemplo n.º 8
0
 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();
 }
Exemplo n.º 9
0
 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.");
        }