Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 public static void Postfix(CombatHUDFloatieStack __instance, FloatieMessage message)
 {
     if (modSettings.ColorizeFloaties)
     {
         ColorFloaties.Colorize(__instance);
     }
 }
Esempio n. 3
0
        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 = $"&lt;{senderColor}&gt;{sender}&lt;/color&gt;";
                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);
            }
        }
Esempio n. 4
0
 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); }
 }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
        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);
            }
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
            }
        }
Esempio n. 11
0
        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);
            }
        }
Esempio n. 12
0
        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 = $"&lt;{senderColor}&gt;{sender}&lt;/color&gt;";
                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);
            }
        }
Esempio n. 13
0
        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);
            }
        }