public static float GetVisualScanRange(AbstractActor source) { // FIXME: Dirty hack here. Assuming that night vision mode only comes on during a unit's turn / selection, then goes away float visRange = ModState.IsNightVisionMode ? ModState.GetMapConfig().nightVisionVisualIDRange : ModState.GetMapConfig().visualIDRange; return(GetVisualRange(visRange, source)); }
public static void Prefix(AbstractActor __instance, int stackItemID) { if (stackItemID == -1 || __instance == null || __instance.HasBegunActivation) { // For some bloody reason DoneWithActor() invokes OnActivationBegin, EVEN THOUGH IT DOES NOTHING. GAH! return; } // Draw stealth if applicable EWState actorState = new EWState(__instance); if (actorState.HasStealth()) { Mod.Log.Debug?.Write($"-- Sending message to update stealth"); StealthChangedMessage message = new StealthChangedMessage(__instance.GUID); __instance.Combat.MessageCenter.PublishMessage(message); } // If friendly, reset the map visibility if (__instance.TeamId != __instance.Combat.LocalPlayerTeamGuid && __instance.Combat.HostilityMatrix.IsLocalPlayerFriendly(__instance.TeamId)) { Mod.Log.Info?.Write($"{CombatantUtils.Label(__instance)} IS FRIENDLY, REBUILDING FOG OF WAR"); if (actorState.HasNightVision() && ModState.GetMapConfig().isDark) { Mod.Log.Info?.Write($"Enabling night vision mode."); VfxHelper.EnableNightVisionEffect(__instance); } else { // TODO: This is likely never triggered due to the patch below... remove? if (ModState.IsNightVisionMode) { VfxHelper.DisableNightVisionEffect(); } } VfxHelper.RedrawFogOfWar(__instance); } }
// Records actor selected events to allow id of the last player unit a player selected public static void OnActorSelectedMessage(MessageCenterMessage message) { ActorSelectedMessage actorSelectedMessage = message as ActorSelectedMessage; AbstractActor actor = Combat.FindActorByGUID(actorSelectedMessage.affectedObjectGuid); if (actor.team.IsLocalPlayer) { Mod.Log.Info?.Write($"Updating last activated actor to: ({CombatantUtils.Label(actor)})"); ModState.LastPlayerActorActivated = actor; EWState actorState = new EWState(actor); if (actorState.HasNightVision() && ModState.GetMapConfig().isDark) { Mod.Log.Info?.Write($"Enabling night vision mode."); VfxHelper.EnableNightVisionEffect(actor); } else { if (ModState.IsNightVisionMode) { VfxHelper.DisableNightVisionEffect(); } } // Refresh the unit's vision VfxHelper.RedrawFogOfWar(actor); actor.VisibilityCache.RebuildCache(actor.Combat.GetAllImporantCombatants()); CombatHUDHelper.ForceNameRefresh(actor.Combat); // Hack - turn on Vision indicator? VisRangeIndicator visRangeIndicator = VisRangeIndicator.Instance; visRangeIndicator.SetState(VisRangeIndicator.VisRangeIndicatorState.On); // Refresh any CombatHUDMarkDisplays foreach (CombatHUDMarkDisplay chudMD in ModState.MarkContainerRefs.Keys) { chudMD.RefreshInfo(); } } }
private static string BuildToolTip(AbstractActor actor) { //Mod.Log.Debug?.Write($"EW State for actor:{CombatantUtils.Label(actor)} = {ewState}"); List <string> details = new List <string>(); // Visuals check float visualLockRange = VisualLockHelper.GetVisualLockRange(actor); float visualScanRange = VisualLockHelper.GetVisualScanRange(actor); details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_VISUALS], new object[] { visualLockRange, visualScanRange, ModState.GetMapConfig().UILabel() }) .ToString() ); // Sensors check EWState ewState = new EWState(actor); int totalDetails = ewState.GetCurrentEWCheck() + ewState.AdvancedSensorsMod(); SensorScanType checkLevel = SensorScanTypeHelper.DetectionLevelForCheck(totalDetails); float rawRangeMulti = SensorLockHelper.GetAllSensorRangeMultipliers(actor); float rangeMulti = rawRangeMulti + ewState.GetSensorsRangeMulti(); float sensorsRange = SensorLockHelper.GetSensorsRange(actor); string sensorColor = ewState.GetCurrentEWCheck() >= 0 ? "00FF00" : "FF0000"; details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_SENSORS], new object[] { sensorColor, sensorsRange, sensorColor, rangeMulti, checkLevel.Label() }) .ToString() ); // Details //{ LT_PANEL_DETAILS, " Total: <color=#{0}>{1:+0;-#}</color><size=90%> Roll: <color=#{2}>{3:+0;-#}</color> Tactics: <color=#00FF00>{4:+0;-#}</color> AdvSen: <color=#{5}>{6:+0;-#}</color>\n" string totalColor = totalDetails >= 0 ? "00FF00" : "FF0000"; string checkColor = ewState.GetRawCheck() >= 0 ? "00FF00" : "FF0000"; string advSenColor = ewState.AdvancedSensorsMod() >= 0 ? "00FF00" : "FF0000"; details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_DETAILS], new object[] { totalColor, totalDetails, checkColor, ewState.GetRawCheck(), ewState.GetRawTactics(), advSenColor, ewState.AdvancedSensorsMod() }) .ToString() ); // Heat Vision if (ewState.GetRawHeatVision() != null) { // { LT_PANEL_HEAT, "<b>Thermals</b><size=90%> Mod:<color=#{0}>{1:+0;-#}</color> / {2} heat Range:{3}m\n" }, HeatVision heatVis = ewState.GetRawHeatVision(); // Positive is bad, negative is good string modColor = heatVis.AttackMod >= 0 ? "FF0000" : "00FF00"; details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_HEAT], new object[] { modColor, heatVis.AttackMod, heatVis.HeatDivisor, heatVis.MaximumRange }) .ToString() ); } // Zoom Vision if (ewState.GetRawZoomVision() != null) { // { LT_PANEL_ZOOM, "<b>Zoom</b><size=90%> Mod:<color=#{0}>{1:+0;-#}</color? Cap:<color=#{2}>{3:+0;-#}</color> Range:{4}m\n" }, ZoomVision zoomVis = ewState.GetRawZoomVision(); // Positive is bad, negative is good string modColor = zoomVis.AttackMod >= 0 ? "FF0000" : "00FF00"; string capColor = zoomVis.AttackCap >= 0 ? "FF0000" : "00FF00"; details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_ZOOM], new object[] { modColor, zoomVis.AttackMod, capColor, zoomVis.AttackCap, zoomVis.MaximumRange }) .ToString() ); } string tooltipText = String.Join("", details.ToArray()); return(tooltipText); }