public static bool CombatHUDInWorldElementMgr_AddFloatieMessage_Prefix(CombatHUDInWorldElementMgr __instance, MessageCenterMessage message, CombatGameState ___combat) { Traverse showFloatieT = Traverse.Create(__instance).Method("ShowFloatie", new Type[] { typeof(FloatieMessage) }); FloatieMessage floatieMessage = message as FloatieMessage; switch (floatieMessage.nature) { case MessageNature.ArmorDamage: case MessageNature.StructureDamage: case MessageNature.Buff: case MessageNature.Debuff: showFloatieT.GetValue(new object[] { floatieMessage }); break; case MessageNature.Miss: case MessageNature.MeleeMiss: case MessageNature.Dodge: //__instance.ShowFloatie(floatieMessage); break; default: //__instance.ShowStackedFloatie(floatieMessage); break; } return(false); }
public static void Postfix(CombatHUDFloatieStack __instance, FloatieMessage message) { if (modSettings.ColorizeFloaties) { ColorFloaties.Colorize(__instance); } }
private static void OnFloatie(MessageCenterMessage message) { FloatieMessage floatieMessage = (FloatieMessage)message; AbstractActor target = combat.FindActorByGUID(floatieMessage.affectedObjectGuid); if (target == null) { return; } if (floatieMessage.text == null) { return; } try { string senderColor; if (combat.HostilityMatrix.IsLocalPlayerEnemy(target.TeamId)) { senderColor = "#" + ColorUtility.ToHtmlStringRGBA(LazySingletonBehavior <UIManager> .Instance.UIColorRefs.redHalf); } else if (combat.HostilityMatrix.IsLocalPlayerNeutral(target.TeamId)) { senderColor = "#" + ColorUtility.ToHtmlStringRGBA(LazySingletonBehavior <UIManager> .Instance.UIColorRefs.blueHalf); } else { senderColor = "#" + ColorUtility.ToHtmlStringRGBA(LazySingletonBehavior <UIManager> .Instance.UIColorRefs.greenHalf); } string sender = (target.IsPilotable && target.GetPilot() != null) ? $"{target.DisplayName}-{target.GetPilot().Name}" : $"{target.DisplayName}"; string senderWithColor = $"<{senderColor}>{sender}</color>"; Mod.Log.Debug($"ChatMessage senderWithColor: '{senderWithColor}'"); string logMessage = floatieMessage.text.ToString(); switch (floatieMessage.nature) { case FloatieMessage.MessageNature.ArmorDamage: logMessage = $"{logMessage} armor damage"; break; case FloatieMessage.MessageNature.StructureDamage: logMessage = $"{logMessage} structure damage"; break; default: break; } messageCenter.PublishMessage(new ChatMessage(senderWithColor, logMessage, false)); } catch (Exception e) { Mod.Log.Error($"Failed to send floatieMessage: {floatieMessage}"); Mod.Log.Error(e); } }
public static void ShowMissChance(FloatieMessage __instance, FloatieMessage.MessageNature nature) { try { if (currentImpact == 0 || (nature != FloatieMessage.MessageNature.Miss && nature != FloatieMessage.MessageNature.MeleeMiss)) { return; } if (!hitChance.TryGetValue(currentImpact, out float chance)) { return; } __instance.SetText(new Localize.Text("Miss {0:0}%", new object[] { (currentRoll - chance) * 100 })); } catch (Exception ex) { Error(ex); } }
private static void ShowDamageFloatie(Vehicle vehicle, VehicleChassisLocations location, float damage, string sourceGUID) { if (vehicle != null && vehicle.GameRep != null) { Vector3 vector = vehicle.GameRep.GetHitPosition((int)location) + UnityEngine.Random.insideUnitSphere * 5f; FloatieMessage.MessageNature nature = vehicle.GetCurrentArmor(location) > 0f ? FloatieMessage.MessageNature.ArmorDamage : FloatieMessage.MessageNature.StructureDamage; FloatieMessage message = new FloatieMessage(sourceGUID, vehicle.GUID, $"{damage}", SharedState.Combat.Constants.CombatUIConstants.floatieSizeMedium, nature, vector.x, vector.y, vector.z); SharedState.Combat.MessageCenter.PublishMessage(message); } }
private static void ShowDamageFloatie(Turret turret, float damage, string sourceGUID) { if (turret != null && turret.GameRep != null) { Vector3 vector = turret.GameRep.GetHitPosition((int)BuildingLocation.Structure) + UnityEngine.Random.insideUnitSphere * 5f; FloatieMessage.MessageNature nature = turret.GetCurrentArmor(BuildingLocation.Structure) > 0f ? FloatieMessage.MessageNature.ArmorDamage : FloatieMessage.MessageNature.StructureDamage; FloatieMessage message = new FloatieMessage(sourceGUID, turret.GUID, $"{damage}", SharedState.Combat.Constants.CombatUIConstants.floatieSizeMedium, nature, vector.x, vector.y, vector.z); SharedState.Combat.MessageCenter.PublishMessage(message); } }
public static bool CompressFloatieMessages(FloatieMessage incoming, Queue <FloatieMessage> queue) { var incomingString = incoming.text.ToString(); Control.mod.Logger.LogDebug($"Floatie {incomingString}"); if (Control.settings.DebugDestroyedFloaties && !string.IsNullOrEmpty(incomingString) && incomingString.EndsWith("DESTROYED")) { Control.mod.Logger.LogDebug("DEBUG DESTROYED FLOATIE " + new System.Diagnostics.StackTrace()); } foreach (var message in queue) { // quick preliminary check if (!message.text.ToString().StartsWith(incomingString)) { continue; } var times = 1; // parse and remove multiplier from the end of the message var lastPart = message.text.m_parts.Last(); var m = MultiplierRegex.Match(lastPart.text); if (m.Success) { times = int.Parse(m.Groups[1].Value); var parts = message.text.m_parts; parts.RemoveAt(parts.Count - 1); } // actual check if the message contents are the same, so we can combine messages if (message.text.ToString() != incomingString) { if (m.Success) { message.text.m_parts.Add(lastPart); // undo multiplier removal } continue; } // adding new multiplier message.text.Append(" x " + ++times); return(true); } return(false); }
public static bool CompressFloatieMessages(FloatieMessage incoming, Queue <FloatieMessage> queue) { var incomingString = incoming.text.ToString(); //Control.mod.Logger.LogDebug($"Floatie {incomingString}"); foreach (var message in queue) { // quick preliminary check if (!message.text.ToString().StartsWith(incomingString)) { continue; } var times = 1; // parse and remove multiplier from the end of the message var lastPart = message.text.m_parts.Last(); var m = MultiplierRegex.Match(lastPart.text); if (m.Success) { times = int.Parse(m.Groups[1].Value); var parts = message.text.m_parts; parts.RemoveAt(parts.Count - 1); } // actual check if the message contents are the same, so we can combine messages if (message.text.ToString() != incomingString) { if (m.Success) { message.text.m_parts.Add(lastPart); // undo multiplier removal } continue; } // adding new multiplier message.text.Append(" x " + ++times); return(true); } return(false); }
public static bool Prefix( CombatHUDFloatieStack __instance, FloatieMessage message, Queue <FloatieMessage> ___msgQueue ) { try { if (CompressFloatieMessagesFeature.CompressFloatieMessages(message, ___msgQueue)) { return(false); } } catch (Exception e) { Control.Logger.Error.Log(e); } return(true); }
static bool Prefix(TurretRepresentation __instance, DeathMethod deathMethod) { // We're a linked turret, replace the kill floatie with a custom one. if (ModState.KillingLinkedUnitsSource != null) { if (__instance.parentActor.WasDespawned) { return(false); } string localText = new Text(Mod.Config.LocalizedText[ModConfig.FT_Turret_Death], new object[] { __instance.parentActor.DisplayName }).ToString(); FloatieMessage message = new FloatieMessage(__instance.parentCombatant.GUID, __instance.parentCombatant.GUID, localText, FloatieMessage.MessageNature.Death); __instance.parentCombatant.Combat.MessageCenter.PublishMessage(message); return(false); } else { return(true); } }
public static bool Prefix(CombatHUDInWorldElementMgr __instance, MessageCenterMessage message) { try { FloatieMessage floatieMessage = message as FloatieMessage; if (floatieMessage.nature == FloatieMessage.MessageNature.Suppression) { Traverse ShowFloatie = Traverse.Create(__instance).Method("ShowFloatie", floatieMessage); ShowFloatie.GetValue(); return(false); } return(true); } catch (Exception e) { Logger.Error(e); return(true); } }
private static void OnFloatie(MessageCenterMessage message) { FloatieMessage floatieMessage = (FloatieMessage)message; AbstractActor target = combat.FindActorByGUID(floatieMessage.affectedObjectGuid); if (target == null) { return; } if (floatieMessage.text == null) { return; } try { string senderColor; if (combat.HostilityMatrix.IsLocalPlayerEnemy(target.TeamId)) { senderColor = "#" + ColorUtility.ToHtmlStringRGBA(LazySingletonBehavior <UIManager> .Instance.UIColorRefs.redHalf); } else if (combat.HostilityMatrix.IsLocalPlayerNeutral(target.TeamId)) { senderColor = "#" + ColorUtility.ToHtmlStringRGBA(LazySingletonBehavior <UIManager> .Instance.UIColorRefs.blueHalf); } else { senderColor = "#" + ColorUtility.ToHtmlStringRGBA(LazySingletonBehavior <UIManager> .Instance.UIColorRefs.greenHalf); } string sender = (target.IsPilotable && target.GetPilot() != null) ? $"{target.GetPilot().Name}" : $"{target.DisplayName}"; string senderWithColor = $"<{senderColor}>{sender}</color>"; Mod.Log.Debug($"ChatMessage senderWithColor: '{senderWithColor}'"); string logMessage = floatieMessage.text.ToString(); switch (floatieMessage.nature) { case FloatieMessage.MessageNature.ArmorDamage: logMessage = $"{logMessage} armor damage"; break; case FloatieMessage.MessageNature.StructureDamage: logMessage = $"{logMessage} structure damage"; break; default: break; } ChatMessage chatMessage = new ChatMessage(senderWithColor, logMessage, false); Mod.Log.Debug($"Chat message is: '{chatMessage.Message}'"); try { int i = clog_count++; ChatListViewItem view = _views.GetOrCreateView(i); view.gameObject.transform.SetAsLastSibling(); view.ItemIndex = i; ChatListViewItem_SetData(view, chatMessage, (LocalizableText)lt_field_info.GetValue(view)); if (i > max_messages) { int p = i - max_messages; _views.Pool(p); } if (!CanvasUpdateRegistry.IsRebuildingLayout()) { _activeChatList.gameObject.GetComponentsInChildren <RectTransform>(false, layoutcomponents); foreach (RectTransform componentsInChild in layoutcomponents) { LayoutRebuilder.MarkLayoutForRebuild(componentsInChild); } layoutcomponents.Clear(); } _activeChatList.ScrollToBottom(); } catch (Exception e) { Mod.Log.Error($"Failed to send a message:{e.Message}"); Mod.Log.Error($"{e.StackTrace}"); } } catch (Exception e) { Mod.Log.Error($"Failed to send floatieMessage: {floatieMessage}"); Mod.Log.Error(e); } }
public static bool Prefix(AttackDirector.AttackSequence __instance, MessageCenterMessage message, List <List <Weapon> > ___sortedWeapons, ref int[][] ___numberOfShots, ref WeaponHitInfo?[][] ___weaponHitInfo) { try { AttackSequenceFireMessage attackSequenceFireMessage = (AttackSequenceFireMessage)message; if (attackSequenceFireMessage.sequenceId != __instance.id) { return(false); } int groupIdx = attackSequenceFireMessage.groupIdx; int weaponIdx = attackSequenceFireMessage.weaponIdx; Weapon weapon = ___sortedWeapons[groupIdx][weaponIdx]; Logger.Debug($"---"); Logger.Debug($"[AttackDirector.AttackSequence_OnAttackSequenceFire_PREFIX] ({weapon.parent.DisplayName}) STARTED AttackSequence: {__instance.id}, WeaponGroup: {groupIdx}, Weapon: {weapon.Name}({weaponIdx})"); //if(weapon.weaponDef.ComponentTags.Contains("component_type_srmstreak")) if (weapon.Type == WeaponType.SRM && weapon.AmmoCategoryValue.Name == "SRMStreak") { WeaponHitInfo weaponHitInfo = ___weaponHitInfo[groupIdx][weaponIdx].Value; bool streakWillHit = weaponHitInfo.DidShotHitChosenTarget(0); // If first missile hits/misses, all will hit/miss Logger.Info($"[AttackDirector.AttackSequence_OnAttackSequenceFire_PREFIX] ({weapon.Name}) streakWillHit: {streakWillHit}"); // Fire targeting laser Vector3 floatieVector = new Vector3(); Utilities.CreateAndFireStreakTargetingLaser(__instance, weapon, out floatieVector, streakWillHit); if (streakWillHit) { // Only floaties, everything else is prepared at this point // Big Floatie //__instance.Director.Combat.MessageCenter.PublishMessage(new FloatieMessage(__instance.chosenTarget.GUID, __instance.chosenTarget.GUID, "STREAK LOCKED-ON", FloatieMessage.MessageNature.CriticalHit)); // Small Floatie FloatieMessage hitFloatie = new FloatieMessage(__instance.attacker.GUID, __instance.chosenTarget.GUID, "STREAK LOCKED-ON", __instance.Director.Combat.Constants.CombatUIConstants.floatieSizeMedium, FloatieMessage.MessageNature.Suppression, floatieVector.x, floatieVector.y, floatieVector.z); __instance.Director.Combat.MessageCenter.PublishMessage(hitFloatie); return(true); } else { // Cancel firing, see code of original method... // Mark Streak SRMs as having fired nevertheless because a failed lock on should be handled like "fired" new Traverse(weapon).Property("HasFired").SetValue(true); weapon.CompleteFiring(); Logger.Info($"[AttackDirector.AttackSequence_OnAttackSequenceFire_PREFIX] ({weapon.Name}) HasFired: {weapon.HasFired}, RoundsSinceLastFire: {weapon.roundsSinceLastFire}"); // If weapon already prefired we would need to reincrement ammo (Note that Weapon.OffsetAmmo() is a custom extension method) if (weapon.HasPreFired) { weapon.OffsetAmmo(); } // Send out all necessary messages to keep the current AttackSequence in sync AttackSequenceWeaponPreFireCompleteMessage weaponPreFireCompleteMessage = new AttackSequenceWeaponPreFireCompleteMessage(__instance.stackItemUID, __instance.id, groupIdx, weaponIdx); __instance.Director.Combat.MessageCenter.PublishMessage(weaponPreFireCompleteMessage); int numberOfShots = ___numberOfShots[groupIdx][weaponIdx]; for (int j = 0; j < numberOfShots; j++) { float hitDamage = weapon.DamagePerShotAdjusted(weapon.parent.occupiedDesignMask); float structureDamage = weapon.StructureDamagePerShotAdjusted(weapon.parent.occupiedDesignMask); AttackSequenceImpactMessage impactMessage = new AttackSequenceImpactMessage(weaponHitInfo, j, hitDamage, structureDamage); __instance.Director.Combat.MessageCenter.PublishMessage(impactMessage); } AttackSequenceResolveDamageMessage resolveDamageMessage = new AttackSequenceResolveDamageMessage(weaponHitInfo); __instance.Director.Combat.MessageCenter.PublishMessage(resolveDamageMessage); AttackSequenceWeaponCompleteMessage weaponCompleteMessage = new AttackSequenceWeaponCompleteMessage(__instance.stackItemUID, __instance.id, groupIdx, weaponIdx); __instance.Director.Combat.MessageCenter.PublishMessage(weaponCompleteMessage); // Big Floaties //__instance.Director.Combat.MessageCenter.PublishMessage(new FloatieMessage(weapon.parent.GUID, weapon.parent.GUID, "STREAK LOCK-ON FAILED", FloatieMessage.MessageNature.Debuff)); //__instance.Director.Combat.MessageCenter.PublishMessage(new FloatieMessage(__instance.chosenTarget.GUID, __instance.chosenTarget.GUID, "STREAK LOCK-ON AVOIDED", FloatieMessage.MessageNature.Buff)); // Small Floatie FloatieMessage missFloatie = new FloatieMessage(__instance.attacker.GUID, __instance.chosenTarget.GUID, "STREAK LOCK-ON FAILED", __instance.Director.Combat.Constants.CombatUIConstants.floatieSizeMedium, FloatieMessage.MessageNature.Dodge, floatieVector.x, floatieVector.y, floatieVector.z); __instance.Director.Combat.MessageCenter.PublishMessage(missFloatie); // Skip original method! return(false); } } return(true); } catch (Exception e) { Logger.Error(e); return(true); } }