コード例 #1
0
 public static bool OverrideMultiTargetBackout(SelectionStateFireMulti __instance, ref ICombatant ___targetedCombatant)
 {
     try {
         SelectionStateFireMulti me         = __instance;
         List <ICombatant>       allTargets = me.AllTargetedCombatants;
         int count = allTargets.Count;
         if (count > 0)
         {
             // Change target to second newest to reset keyboard focus and thus dim cancelled target's LOS
             ICombatant newTarget = count > 1 ? allTargets[count - 2] : null;
             HUD.SelectionHandler.TrySelectTarget(newTarget);
             // Try one of the reflection ways to set new target
             if (newTarget == null && ClearTargetedActor != null)
             {
                 ClearTargetedActor.Invoke(me, null); // Hide fire button
             }
             else if (___targetedCombatant != null)
             {
                 ___targetedCombatant = newTarget; // Skip soft lock sound
             }
             else
             {
                 me.SetTargetedCombatant(newTarget);
             }
             // The only line that is same as old!
             RemoveTargetedCombatant.Invoke(me, RemoveTargetParams);
             // Amend selection state later
             ReAddStateData = true;
             return(false);
         }
         return(true);
     }                 catch (Exception ex) { return(Error(ex)); }
 }
コード例 #2
0
        public static bool OverrideRemoveTargetedCombatant(SelectionStateFireMulti __instance, ICombatant target, bool clearedForFiring)
        {
            try {
                List <ICombatant> allTargets = __instance.AllTargetedCombatants;
                int index = target == null ? allTargets.Count - 1 : allTargets.IndexOf(target);
                if (index < 0)
                {
                    return(false);
                }

                // Fix weaponTargetIndices
                Dictionary <Weapon, int> indice = (Dictionary <Weapon, int>)weaponTargetIndices.GetValue(__instance, null);
                foreach (Weapon weapon in indice.Keys.ToArray())
                {
                    if (indice[weapon] > index)
                    {
                        indice[weapon] -= -1;
                    }
                    else if (indice[weapon] == index)
                    {
                        indice[weapon] = -1;
                    }
                }
                // End Fix

                allTargets.RemoveAt(index);
                Combat.MessageCenter.PublishMessage(new ActorMultiTargetClearedMessage(index.ToString(), clearedForFiring));
                return(false);
            }                 catch (Exception ex) { return(Error(ex)); }
        }
コード例 #3
0
 public static bool OverrideMultiTargetCanBackout(SelectionStateFireMulti __instance, ref bool __result)
 {
     try {
         __result = __instance.Orders == null && __instance.AllTargetedCombatantsCount > 0;
         return(false);
     }                 catch (Exception ex) { return(Error(ex)); }
 }
コード例 #4
0
        private static int FindToogleTargetIndex(SelectionStateFireMulti state, Weapon weapon)
        {
            ICombatant current = state.GetSelectedTarget(weapon);

            if (current != null)
            {
                MultiTargetDisabledWeaponTarget[weapon] = current;
                return(-1);
            }
            List <ICombatant> targets = state.AllTargetedCombatants;

            MultiTargetDisabledWeaponTarget.TryGetValue(weapon, out ICombatant lastTarget);
            int newIndex = lastTarget == null ? -1 : targets.IndexOf(lastTarget);

            if (newIndex < 0)
            {
                if (Settings.AggressiveMultiTargetAssignment)
                {
                    newIndex = FindBestTargetForWeapon(weapon, targets);
                }
                if (newIndex < 0)
                {
                    newIndex = 0;
                }
            }
            while (newIndex < targets.Count && !weapon.WillFireAtTarget(targets[newIndex]))     // Find a target we can fire at.
            {
                ++newIndex;
            }
            return(newIndex >= targets.Count ? -1 : newIndex);
        }
コード例 #5
0
        private static int FindReverseTargetIndex(SelectionStateFireMulti state, Weapon weapon)
        {
            ICombatant        current = state.GetSelectedTarget(weapon);
            List <ICombatant> targets = state.AllTargetedCombatants;
            int index = targets.IndexOf(current), newIndex = index < 0 ? targets.Count - 1 : index - 1;

            while (newIndex >= 0 && !weapon.WillFireAtTarget(targets[newIndex]))     // Find a target we can fire at.
            {
                --newIndex;
            }
            return(newIndex);
        }
コード例 #6
0
 public static bool OverrideMultiTargetCycle(SelectionStateFireMulti __instance, ref int __result, Weapon weapon)
 {
     try {
         int newIndex = -2;
         if (Settings.CtrlClickDisableWeapon && IsToggleKeyPressed())
         {
             newIndex = FindToogleTargetIndex(__instance, weapon);
         }
         else if (Settings.ShiftKeyReverseSelection && IsReverseKeyPressed())
         {
             newIndex = FindReverseTargetIndex(__instance, weapon);
         }
         if (newIndex > -2)
         {
             ((Dictionary <Weapon, int>)WeaponTargetIndicesProp.GetValue(__instance, null))[weapon] = newIndex;
             __result = newIndex;
             return(false);
         }
         return(true);
     }                 catch (Exception ex) { return(Error(ex)); }
 }
コード例 #7
0
 public static bool OverrideMultiTargetAssignment(CombatHUDWeaponPanel __instance, List <CombatHUDWeaponSlot> ___WeaponSlots)
 {
     try {
         SelectionStateFireMulti multi   = ActiveState as SelectionStateFireMulti;
         List <ICombatant>       targets = multi?.AllTargetedCombatants;
         if (targets.IsNullOrEmpty())
         {
             return(true);
         }
         foreach (CombatHUDWeaponSlot slot in ___WeaponSlots)
         {
             Weapon w      = slot?.DisplayedWeapon;
             int    target = FindBestTargetForWeapon(w, targets);
             if (target >= 0)
             {
                 SlotSetTargetIndexMethod.Invoke(slot, new object[] { multi.AssignWeaponToTarget(w, targets[target]), false });
             }
         }
         __instance.RefreshDisplayedWeapons();
         return(false);
     }                 catch (Exception ex) { return(Error(ex)); }
 }