private static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot) { Pilot pilot = attacker.GetPilot(); try { Pilot TargetPilot = target.GetPilot(); if (TargetPilot.pilotDef.PilotTags.Contains("pilot_reckless")) { __result = __result + (float)settings.pilot_reckless_ToBeHitBonus; } if (TargetPilot.pilotDef.PilotTags.Contains("pilot_cautious")) { __result = __result + (float)settings.pilot_reckless_ToBeHitBonus; } if (TargetPilot.pilotDef.PilotTags.Contains("pilot_jinxed")) { __result = __result + (float)settings.pilot_jinxed_ToBeHitBonus; } if (TargetPilot.pilotDef.PilotTags.Contains("pilot_jinxed")) { __result = __result + (float)settings.pilot_reckless_ToBeHitBonus; } } catch (Exception) { } if (pilot.pilotDef.PilotTags.Contains("pilot_reckless")) { __result = __result + (float)settings.pilot_reckless_ToHitBonus; } if (pilot.pilotDef.PilotTags.Contains("pilot_cautious")) { __result = __result + (float)settings.pilot_reckless_ToHitBonus; } if (pilot.pilotDef.PilotTags.Contains("pilot_drunk") && pilot.pilotDef.TimeoutRemaining > 0) { __result = __result + (float)settings.pilot_drunk_ToHitBonus; } if (pilot.pilotDef.PilotTags.Contains("pilot_lostech") && weapon.componentDef.ComponentTags.Contains("component_type_lostech")) { __result = __result + (float)settings.pilot_lostech_ToHitBonus; } }
private static string TeamAndCallsign(ICombatant who) { if (who == null) { return("null" + Separator + "null" + Separator + "null" + Separator); } Team team = who.team; string teamName; if (team == null) { teamName = "null"; } else if (team.IsLocalPlayer) { teamName = "Player"; } else if (team.IsEnemy(Combat.LocalPlayerTeam)) { teamName = "OpFor"; } else if (team.IsFriendly(Combat.LocalPlayerTeam)) { teamName = "Allies"; } else { teamName = "NPC"; } teamName += Separator; if (who is Building) { teamName += "Building"; } else { teamName += who.GetPilot()?.Callsign ?? (who as AbstractActor)?.Nickname ?? who.DisplayName; } teamName += Separator; return(teamName + who.DisplayName + Separator); }
public static void Postfix(EffectManager __instance, EffectData effectData, ICombatant creator, ICombatant target) { var p = creator.GetPilot(); // var effectsList = Traverse.Create(__instance).Field("effects").GetValue<List<Effect>>(); // var effectsList = __instance.GetAllEffectsCreatedBy(creator.GUID); ////////////////////no double dipping if (ModInit.modSettings.reUseRestrictedbonusEffects_XP.ContainsKey(effectData?.Description?.Id ?? "UNUSED") && !reUseRestricted) { var effectXP = ModInit.modSettings.reUseRestrictedbonusEffects_XP[effectData?.Description?.Id]; var stat = p.StatCollection.GetStatistic("effectXP"); p.StatCollection.Int_Add(stat, effectXP); ModInit.modLog.LogMessage($"No existing effect {effectData?.Description?.Id} from {creator.GetPilot()?.Description?.Callsign} targeting {target?.Description?.UIName}. Adding {effectXP} to {creator.GetPilot()?.Description?.Callsign}'s 'effectXP' pilot stat. No double-dipping until effect expires."); return; } if (effectData?.effectType == EffectType.StatisticEffect && ModInit.modSettings.reUseRestrictedbonusEffects_XP.ContainsKey(effectData.statisticData?.statName ?? "UNUSED") && !reUseRestricted) { var effectXP = ModInit.modSettings.reUseRestrictedbonusEffects_XP[effectData.statisticData?.statName]; var stat = p.StatCollection.GetStatistic("effectXP"); p.StatCollection.Int_Add(stat, effectXP); ModInit.modLog.LogMessage($"No existing effect {effectData.statisticData?.statName} from {creator.GetPilot()?.Description?.Callsign} targeting {target?.Description?.UIName}. Adding {effectXP} to {creator.GetPilot()?.Description?.Callsign}'s 'effectXP' pilot stat. No double-dipping until effect expires."); return; } ////////////////////////////degraded double dipping if (ModInit.modSettings.degradingbonusEffects_XP.ContainsKey(effectData?.Description?.Id ?? "UNUSED")) { var effectXP = ModInit.modSettings.degradingbonusEffects_XP[effectData?.Description?.Id]; var degradationFactor = 1; //use degFactor to apply sloppy seconds to XP bonus if (reUseDegrades) { degradationFactor = new int[] { appliedEffect.Duration.numActivationsRemaining, appliedEffect.Duration.numMovementsRemaining, appliedEffect.Duration.numPhasesRemaining, appliedEffect.Duration.numRoundsRemaining }.Max() + 1; } ModInit.modLog.LogMessage($"Matching effect found: {effectData?.Description?.Id} from {creator.GetPilot().Description.Callsign} targeting {target?.Description?.UIName}. Adding {effectXP}/{degradationFactor} = {effectXP / degradationFactor} to {creator.GetPilot().Description.Callsign}'s 'effectXP' pilot stat. Degraded double-dip: more XP closer to effect expiration."); effectXP /= degradationFactor; var stat = p.StatCollection.GetStatistic("effectXP"); p.StatCollection.Int_Add(stat, effectXP); return; } if (effectData?.effectType == EffectType.StatisticEffect && ModInit.modSettings.degradingbonusEffects_XP.ContainsKey(effectData.statisticData?.statName ?? "UNUSED")) { var effectXP = ModInit.modSettings.degradingbonusEffects_XP[effectData.statisticData?.statName]; var degradationFactor = 1; //use degFactor to apply sloppy seconds to XP bonus if (reUseDegrades) { degradationFactor = new int[] { appliedEffect.Duration.numActivationsRemaining, appliedEffect.Duration.numMovementsRemaining, appliedEffect.Duration.numPhasesRemaining, appliedEffect.Duration.numRoundsRemaining }.Max() + 1; } ModInit.modLog.LogMessage($"Matching effect found: {effectData.statisticData?.statName} from {creator.GetPilot().Description.Callsign} targeting {target?.Description?.UIName}. Adding {effectXP}/{degradationFactor} = {effectXP / degradationFactor} to {creator.GetPilot().Description.Callsign}'s 'effectXP' pilot stat. Degraded double-dip: more XP closer to effect expiration."); effectXP /= degradationFactor; var stat = p.StatCollection.GetStatistic("effectXP"); p.StatCollection.Int_Add(stat, effectXP); return; } ////////////////////////when i dip you dip we dip else { if (ModInit.modSettings.bonusEffects_XP.ContainsKey(effectData?.Description?.Id ?? "UNUSED")) { var effectXP = ModInit.modSettings.bonusEffects_XP[effectData?.Description?.Id]; ModInit.modLog.LogMessage($"Adding {effectXP} to {creator.GetPilot().Description.Callsign}'s 'effectXP' pilot stat for applying {effectData?.Description?.Id} to {target?.Description?.UIName}. No restrictions on double-dipping."); var stat = p.StatCollection.GetStatistic("effectXP"); p.StatCollection.Int_Add(stat, effectXP); return; } if (effectData?.effectType != EffectType.StatisticEffect || !ModInit.modSettings.bonusEffects_XP.ContainsKey(effectData.statisticData?.statName)) { return; } { var effectXP = ModInit.modSettings.bonusEffects_XP[effectData.statisticData?.statName]; ModInit.modLog.LogMessage($"Adding {effectXP} to {creator.GetPilot().Description.Callsign}'s 'effectXP' pilot stat for applying {effectData.statisticData?.statName} to {target?.Description?.UIName}. No restrictions on double-dipping."); var stat = p.StatCollection.GetStatistic("effectXP"); p.StatCollection.Int_Add(stat, effectXP); } } }
public static void Prefix(EffectManager __instance, EffectData effectData, ICombatant creator, ICombatant target) { { effectsList = __instance.GetAllEffectsCreatedBy(creator.GUID); if (effectsList.Count > 0) { appliedEffect = effectsList.FirstOrDefault(x => x.EffectData == effectData && x.Target == target); if (ModInit.modSettings.reUseRestrictedbonusEffects_XP.ContainsKey(effectData?.Description?.Id ?? "UNUSED") || ModInit.modSettings.reUseRestrictedbonusEffects_XP.ContainsKey( effectData?.statisticData?.statName ?? "UNUSED")) { reUseRestricted = effectsList.Any(x => x.EffectData == effectData && x.Target == target); ModInit.modLog.LogMessage( $"Matching effect found: {effectData?.Description?.Id} from {creator.GetPilot()?.Description?.Callsign} targeting {target?.Description?.UIName}. No double-dipping!"); } else if (ModInit.modSettings.degradingbonusEffects_XP.ContainsKey(effectData?.Description?.Id ?? "UNUSED") || ModInit.modSettings.degradingbonusEffects_XP.ContainsKey( effectData?.statisticData?.statName ?? "UNUSED")) { reUseDegrades = effectsList.Any(x => x?.EffectData == effectData && x?.Target == target); ModInit.modLog.LogMessage( $"Matching effect found: {effectData?.Description?.Id} from {creator.GetPilot()?.Description?.Callsign} targeting {target?.Description?.UIName}. Applying degraded double-dipping!"); } } } }
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); } }