static void Postfix(MechMeleeSequence __instance, Mech mech, ICombatant meleeTarget, List <Weapon> requestedWeapons, Vector3 desiredMeleePosition) { try { // Find the selectedAttack we should use for this sequence MeleeAttack selectedAttack = ModState.GetSelectedAttack(mech); if (selectedAttack == null) { Mod.MeleeLog.Warn?.Write($"Melee sequence {__instance.SequenceGUID} has no pre-selected attack state, will have to autoselected. Let Frost know as this should not happen!"); MeleeState meleeState = ModState.AddorUpdateMeleeState(mech, desiredMeleePosition, meleeTarget as AbstractActor); if (meleeState == null) { Mod.Log.Error?.Write($"Could not build melee state for selected melee attack - this should NEVER happen!"); return; } selectedAttack = meleeState.GetHighestDamageAttackForUI(); } if (selectedAttack == null || !selectedAttack.IsValid) { Mod.Log.Error?.Write($"Could not select a valid attack for the selected sequence - this should NEVER happen!"); return; } // Check to see if we have an imaginary weapon to use; if not create it (Weapon meleeWeapon, Weapon dfaWeapon)weapons = ModState.GetFakedWeapons(mech); // Create the weapon + representation ModState.AddOrUpdateMeleeSequenceState(__instance.SequenceGUID, selectedAttack, weapons.meleeWeapon); StringBuilder sb = new StringBuilder(); foreach (Weapon weapon in requestedWeapons) { sb.Append(weapon.UIName); sb.Append(","); } Mod.MeleeLog.Info?.Write($" -- Initial requested weapons: {sb}"); isValid = true; } catch (Exception e) { Mod.Log.Error?.Write(e, $"Failed to initialize Melee sequence {__instance.SequenceGUID}!"); } }
public static void Prefix(MechFallSequence __instance) { Mod.Log.Trace?.Write("MFS:OnComplete - entered."); int damagePointsTT = (int)Math.Ceiling(__instance.OwningMech.tonnage / 10f); Mod.Log.Debug?.Write($"Actor: {CombatantUtils.Label(__instance.OwningMech)} will suffer {damagePointsTT} TT damage points."); // Check for any pilot skill damage reduction float damageReduction = 1.0f - __instance.OwningMech.PilotCheckMod(Mod.Config.Piloting.DFAReductionMulti); float reducedDamage = (float)Math.Max(0f, Math.Floor(damageReduction * damagePointsTT)); Mod.Log.Debug?.Write($" Reducing TT fall damage from: {damagePointsTT} by {damageReduction:P1} to {reducedDamage}"); List <float> locationDamage = new List <float>(); while (damagePointsTT >= 5) { locationDamage.Add(5 * Mod.Config.Piloting.FallingDamagePerTenTons); damagePointsTT -= 5; } if (damagePointsTT > 0) { locationDamage.Add(damagePointsTT * Mod.Config.Piloting.FallingDamagePerTenTons); } Mod.Log.Info?.Write($"FALLING DAMAGE: TT damage: {damagePointsTT} => {damagePointsTT * Mod.Config.Piloting.FallingDamagePerTenTons} falling damage to actor: {CombatantUtils.Label(__instance.OwningMech)}"); try { (Weapon melee, Weapon dfa)fakeWeapons = ModState.GetFakedWeapons(__instance.OwningMech); AttackHelper.CreateImaginaryAttack(__instance.OwningMech, fakeWeapons.melee, __instance.OwningMech, __instance.SequenceGUID, locationDamage.ToArray(), DamageType.KnockdownSelf, MeleeAttackType.NotSet); } catch (Exception e) { Mod.Log.Error?.Write(e, "FAILED TO APPLY FALL DAMAGE"); } }