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)); } }
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)); } }
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)); } }
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); }
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); }
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)); } }
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)); } }